commit b4b6c08f4f3ca7ba1f647a449788d0c54ae7f1aa Author: N-Nachtigal Date: Sun May 4 16:01:41 2025 +0200 write something there diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..deebcb59 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +*.xcf export-ignore +*.blend export-ignore +*.py export-ignore +*.sh export-ignore +mods/**/screenshot.png export-ignore +biome_graph.ggb export-ignore +.github/** export-ignore +.github export-ignore +mods/**/.github/** export-ignore +mods/**/.github export-ignore +mods/signs_lib/util/** +mods/signs_lib/util \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ef02689c --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +## Files related to minetest development cycle +/*.patch +# GNU Patch reject file +*.rej + +## Editors and Development environments +*~ +*.swp +*.bak* +*.orig +# Vim +*.vim +# Kate +.*.kate-swp +.swp.* +# Eclipse (LDT) +.project +.settings/ +.buildpath +.metadata +# Idea IDE +.idea/* diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..fd6babd3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,192 @@ +[submodule "abdecor"] + path = mods/abdecor + url = https://github.com/asuna-mt/abdecor + branch = asuna +[submodule "animalia"] + path = mods/animalia + url = https://github.com/asuna-mt/animalia + branch = asuna +[submodule "asuna_game_mods"] + path = mods/asuna + url = https://github.com/asuna-mt/asuna_game_mods + branch = asuna +[submodule "awards"] + path = mods/awards + url = https://github.com/asuna-mt/awards + branch = asuna +[submodule "bakedclay"] + path = mods/bakedclay + url = https://github.com/asuna-mt/bakedclay + branch = asuna +[submodule "beautiflowers"] + path = mods/beautiflowers + url = https://github.com/asuna-mt/beautiflowers + branch = asuna +[submodule "biomes"] + path = mods/biomes + url = https://github.com/asuna-mt/biomes + branch = asuna +[submodule "bonemeal"] + path = mods/bonemeal + url = https://github.com/asuna-mt/bonemeal + branch = asuna +[submodule "bottles"] + path = mods/bottles + url = https://github.com/asuna-mt/bottles + branch = asuna +[submodule "builtin_item"] + path = mods/builtin_item + url = https://github.com/asuna-mt/builtin_item + branch = asuna +[submodule "caverealms"] + path = mods/caverealms + url = https://github.com/asuna-mt/caverealms_lite + branch = asuna +[submodule "colorful_beds"] + path = mods/colorful_beds + url = https://github.com/asuna-mt/colorful_beds + branch = asuna +[submodule "creatura"] + path = mods/creatura + url = https://github.com/asuna-mt/creatura + branch = asuna +[submodule "ethereal"] + path = mods/ethereal + url = https://github.com/asuna-mt/ethereal + branch = asuna +[submodule "everness"] + path = mods/everness + url = https://github.com/asuna-mt/everness + branch = asuna +[submodule "farming"] + path = mods/farming + url = https://github.com/asuna-mt/farming + branch = asuna +[submodule "flowerpot"] + path = mods/flowerpot + url = https://github.com/asuna-mt/flowerpot + branch = asuna +[submodule "geodes"] + path = mods/geodes + url = https://github.com/asuna-mt/geodes + branch = asuna +[submodule "herbs"] + path = mods/herbs + url = https://github.com/asuna-mt/herbs + branch = asuna +[submodule "item_drop"] + path = mods/item_drop + url = https://github.com/asuna-mt/item_drop + branch = asuna +[submodule "leafstride"] + path = mods/leafstride + url = https://github.com/asuna-mt/leafstride + branch = asuna +[submodule "livingjungle"] + path = mods/livingjungle + url = https://github.com/asuna-mt/livingjungle + branch = asuna +[submodule "livingslimes"] + path = mods/livingslimes + url = https://github.com/asuna-mt/livingslimes + branch = asuna +[submodule "lootchests_modpack"] + path = mods/lootchests_modpack + url = https://github.com/asuna-mt/lootchests_modpack + branch = asuna +[submodule "marinara"] + path = mods/marinara + url = https://github.com/asuna-mt/marinara + branch = asuna +[submodule "minetest_game"] + path = mods/minetest_game + url = https://github.com/asuna-mt/minetest_game + branch = asuna +[submodule "sfinv_buttons"] + path = mods/sfinv_buttons + url = https://github.com/asuna-mt/minetest_sfinv_buttons + branch = asuna +[submodule "show_wielded_item"] + path = mods/show_wielded_item + url = https://github.com/asuna-mt/minetest_show_wielded_item + branch = asuna +[submodule "soup"] + path = mods/soup + url = https://github.com/asuna-mt/minetest-soup + branch = asuna +[submodule "tt"] + path = mods/tt + url = https://github.com/asuna-mt/minetest_tt + branch = asuna +[submodule "tt_base"] + path = mods/tt_base + url = https://github.com/asuna-mt/minetest_tt_base + branch = asuna +[submodule "music_modpack"] + path = mods/music_modpack + url = https://github.com/asuna-mt/music_modpack + branch = asuna +[submodule "naturalbiomes"] + path = mods/naturalbiomes + url = https://github.com/asuna-mt/naturalbiomes + branch = asuna +[submodule "plantlife_modpack"] + path = mods/plantlife_modpack + url = https://github.com/asuna-mt/plantlife_modpack + branch = asuna +[submodule "player_monoids"] + path = mods/player_monoids + url = https://github.com/asuna-mt/player_monoids + branch = asuna +[submodule "signs_lib"] + path = mods/signs_lib + url = https://github.com/asuna-mt/signs_lib + branch = asuna +[submodule "skinsdb"] + path = mods/skinsdb + url = https://github.com/asuna-mt/skinsdb + branch = asuna +[submodule "stamina"] + path = mods/stamina + url = https://github.com/asuna-mt/stamina + branch = asuna +[submodule "telemosaic"] + path = mods/telemosaic + url = https://github.com/asuna-mt/telemosaic + branch = asuna +[submodule "too_many_stones"] + path = mods/too_many_stones + url = https://github.com/asuna-mt/too_many_stones + branch = asuna +[submodule "wielded_light"] + path = mods/wielded_light + url = https://github.com/asuna-mt/wielded_light + branch = asuna +[submodule "worldgate"] + path = mods/worldgate + url = https://github.com/asuna-mt/worldgate + branch = asuna +[submodule "x_farming"] + path = mods/x_farming + url = https://github.com/asuna-mt/x_farming + branch = asuna +[submodule "3d_armor"] + path = mods/3d_armor + url = https://github.com/asuna-mt/3d_armor + branch = asuna +[submodule "researcher"] + path = mods/researcher + url = https://github.com/asuna-mt/researcher + branch = asuna +[submodule "findbiome"] + path = mods/findbiome + url = https://github.com/asuna-mt/minetest_findbiome + branch = asuna +[submodule "effervescence"] + path = mods/effervescence + url = https://github.com/asuna-mt/effervescence + branch = asuna +[submodule "carpets"] + path = mods/carpets + url = https://github.com/asuna-mt/carpets + branch = asuna diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 00000000..089e7f48 --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,232 @@ +-- Global configuration +----------------------- + +std = "luajit+minetest+supported_mods" + +max_line_length = false + +-- Ignore warnings that are not necessarily problematic, +-- as fixing those will only make it diffifult to update from upstream. +-- Ideally this should be fixed upstream and the warnings enabled again. +ignore = { + "211", -- unused variable + "212", -- unused argument + "213", -- unused loop variable + -- whitespace + "611", -- line contains only whitespace + "612", -- trailing whitespace + "614", -- trailing whitespace in comment + "621", -- inconsistent indentation +} + +stds.minetest = { + read_globals = { + -- tables + "minetest", + "vector", + -- utility functions + "dump", + "dump2", + math = { fields = { "hypot", "sign", "factorial", "round" } }, + string = { fields = { "split", "trim" } }, + table = { fields = { "copy", "indexof" } }, + -- constructors + "ItemStack", + "PcgRandom", + "PseudoRandom", + "VoxelArea", + "VoxelManip", + -- legacy + "core", -- alias of minetest + "nodeupdate", + }, +} + +-- Mods that are potentially supported but not included in Asuna. +-- The relevant code must be gated by `if minetest.get_modpath("...")` or similar. +-- Could be extracted from optional_depends, but in practice not all mods declare it. +-- Could also be extracted from ifs like the one above. +-- In practice only a few of these are not covered by other rules, and often mod +-- names differ from global names they define, so this list was filled manually. +stds.supported_mods = { + read_globals = { + "abstract_dryplants", -- from dryplants + "armor", -- From 3d_armor + "df_primordial_items", + "df_trees", + "geodes_lib", + "hb", -- From hudbars + "hunger_ng", + "lucky_block", + "mapgen_helper", -- From dfcaverns + "mcl_player", + "mcl_sounds", + "mobs", + "moretrees", + "signs_bot", + "stairsplus", + "techage", + "technic", + "technic_cnc", + "toolranks", + }, +} + +-- Mods included in Asuna. +-- List generated with: +-- git grep --recurse-submodules -ho "^name =.*" | awk '{ sub("\r",""); print " \"" $3 "\"," }' | sort +local mod_names = { + "abdecor", + "animalia", + "asuna_awards", + "asuna_core", + "asuna_textures", + "awards", + "badland", + "bakedclay", + "beautiflowers", + "beds", + "binoculars", + "biomes", + "biomes_leafdecay", + "boats", + "bonemeal", + "bones", + "bottles", + "bucket", + "builtin_item", + "butterflies", + "carts", + "caverealms", + "colorful_beds", + "creative", + "creatura", + "default", + "doors", + "dorwinion", + "dungeon_loot", + "dye", + "env_sounds", + "ethereal", + "everness", + "farming", + "farming", + "ferns", + "fire", + "fireflies", + "flowerpot", + "flowers", + "frost_land", + "game_commands", + "geodes", + "give_initial_stuff", + "herbs", + "item_drop", + "japaneseforest", + "keys", + "leafstride", + "livingjungle", + "livingslimes", + "lootchests", + "lootchests_default", + "map", + "marinara", + "mtg_craftguide", + "music_api", + "naturalbiomes", + "nightshade", + "player_api", + "player_monoids", + "pl_seaweed", + "prairie", + "screwdriver", + "sethome", + "sfinv", + "sfinv_buttons", + "show_wielded_item", + "signs_lib", + "skinsdb", + "soup", + "spawn", + "stairs", + "stamina", + "telemosaic", + "tnt", + "too_many_stones", + "tt", + "tt_base", + "vessels", + "walls", + "weather", + "wielded_light", + "wool", + "worldgate", + "x_farming", + "xpanes", +} + +-- Globals defined by Asuna. +-- Ideally this should be equal to mod_names + "asuna", but some mods define +-- additional globals, so we add them here. +globals = { + "asuna", + "abstract_bushes", -- from bushes + "abstract_ferns", -- from ferns + "abstract_youngtrees", -- from youngtrees + "music", -- from music_api + "skins", -- from skinsdb + table.unpack(mod_names) +} + +exclude_files = { + -- Assets + "mods/livingjungle/schematics", + -- Legacy stuff + "mods/animalia/api/legacy_convert.lua", + "mods/minetest_game/default/legacy.lua", +} + +-- Mod-specific configuration +----------------------------- + +-- Import existing .luacheckrc files +-- List generated with: +-- find mods -name .luacheckrc -exec dirname {} \; | xargs -L1 basename | awk '{ sub("\r",""); print " \"" $1 "\"," }' | sort +local mods_with_luacheckrc = { + "animalia", + "awards", + "creatura", + "everness", + "flowerpot", + "item_drop", + "plantlife_modpack", + "player_monoids", + "signs_lib", + "skinsdb", + "stamina", + "telemosaic", + "x_farming", +} +for _,modname in ipairs(mods_with_luacheckrc) do + local modpath = "mods/" .. modname + files[modpath] = {} + -- store globals defined in the mod's .luacheckrc in the corresponding files table + assert(pcall(assert(loadfile(modpath.."/.luacheckrc", nil, files[modpath])))) + if files[modpath].exclude_files then + for i,path in ipairs(files[modpath].exclude_files) do + -- exclude_files only works in the global scope, not in files[] + table.insert(exclude_files, modpath.."/"..path) + end + end +end + +-- Used variable "_foo" with unused hint. +-- Creatura and animalia use a _ prefix to avoid shadowing self/this/min/max. +files["mods/animalia"] = { ignore = { "214" } } +files["mods/creatura"] = { ignore = { "214" } } + +-- We tightly control mods that can override the engine. +files["mods/asuna/asuna_core"] = { globals = { minetest = { fields = { "register_biome", "register_decoration" } } } } +files["mods/minetest_game/creative"] = { globals = { minetest = { fields = { "creative" } } } } +files["mods/minetest_game/player_api"] = { globals = { minetest = { fields = { "calculate_knockback" } } } } +files["mods/ethereal/crystal.lua"] = { globals = { minetest = { fields = { "handle_node_drops" } } } } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..5d3284cc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,65 @@ +# Asuna Changelog + +This file documents the major changes made in each version of Asuna. + +## v1.0.7 + +- Effervescence: Use `blend = "clip"` for particles only if it's supported + +## v1.0.6 + +- Disable torch damage +- Remove log message that appears when using a bug net + +## v1.0.5 + +- Fix a crash caused by the Net Worth award +- Researcher: Fix broken research table particle graphics +- Effervescence: Set `blend = "clip"` for most particle effects +- Add `time_speed = 72` to Asuna's minetest.conf file for proper day/night cycles in case the default value changes + +## v1.0.4 + +- Add missing Dorwinion and Nightshade tree saplings +- Make saplings from Biomes modpack more compatible with bonemeal +- Adjust Show Wielded Item text to be bold and to not overlap with the food saturation bar +- Enable raspberries from Farming Redo and add raspberries to mapgen +- Adjust low-yield wild crops to be more mature and thus more likely to drop crops/seeds + +## v1.0.3 + +- Use alternate texture for wool instead of overriding X Farming wool alias tiles +- Add [Carpets](https://content.luanti.org/packages/bell07/carpets/) mod + +## v1.0.2 + +- Removed hemp -> cotton recipe +- X Farming water bottle aliased to Filled Bottles water bottle +- X Farming soup bowl aliased to Farming Redo wooden bowl +- Everness basic farming soils aliased to Farming Redo soils +- Added depth_riverbed to registered biomes which ensures proper riverbeds +- Grass/litter nodes based on nodes other than dirt now decay into the proper node +- Expanded Heath biome to the shoreline +- Generate schematics before ground cover in Natural Biomes mapgen + +## v1.0.1 + +- Added a mod override warning that warns players if they have mods enabled that are already bundled with Asuna +- Removed directional placement of Ethereal planks +- Removed marram grass from sandstone desert shores +- Updated Minetest Game from upstream + +## v1.0.0 + +- Asuna is no longer a work-in-progress! Asuna will continue to see updates; this simply means that Asuna is no longer considered to be in a new/experimental state +- New built-in mods: Researcher, 3D Armor, Find Biome, Effervescence; if you have any of these mods enabled for your existing Asuna worlds, it is recommended to disable them in favor of Asuna's built-in mods +- Gameplay updates are now structured as *content packs* which are configurable via settings -- **CHECK YOUR GAME SETTINGS** to reconfigure any previous changes that you might have made +- Revamped Jumble biome: now features more distinct trees and biome features + fixed missing cave definition to give it proper fungal/mushroom caves +- Set height limit to max for biomes that were unnecessarily limited to lower elevations (Grassland, Plains, Prairie, Birch Forest, Sakura, Jumble, Mushroom, Grove) +- Eight new ambient music tracks by [Sascha Ende](https://filmmusic.io/) (and removed two less fitting nighttime tracks) +- Updated textures based on newer versions of [Baunilha](https://content.luanti.org/packages/Mirtilo/baunilha/) plus some custom textures for crosshairs, giant mushrooms, and select other nodes/items +- New awards +- Upstream updates to all bundled mods that had available updates +- Globally-aligned textures for Minetest Game stairs and slabs +- New overall goal tracker for Awards UI and more consistent award listing +- Lots of bug fixes: possible crash and behavior issues with slimes, beds previously not passing the night, mapgen quirks, missing groups for certain flowers, and so much more! \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..a521daf1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,824 @@ +ASUNA LICENSES +============== + +In accordance with GPL requirements of works included in this project, this +game as a whole is released under GPLv3. Additionally, specific works within +the game are provided under various other licenses. These works and their +licenses are listed below. The text of the GPLv3 license that covers this whole +work follows the other listed works. + +In accordance with GPL requirements to indicate changes to works, all changes +made to the below listed works are officially made on or after 25 January 2023. + +- Main menu graphics + - Locations: ./menu/ ./screenshot.xcf ./screenshot.png + - License file: ./menu/LICENSE +- 3D Armor + - Location: ./mods/3d_armor/ + - License file: ./mods/3d_armor/LICENSE.md +- Advanced Biome Decoration API + - Location: ./mods/abdecor/ + - License file: ./mods/abdecor/LICENSE +- Animalia + - Location: ./mods/animalia/ + - License file: ./mods/animalia/LICENSE + - Changes were made to this work +- Asuna Awards + - Location: ./mods/asuna/asuna_awards/ + - License file: ./mods/asuna/asuna_awards/LICENSE +- Asuna Core + - Location: ./mods/asuna/asuna_core + - License file: ./mods/asuna/asuna_core/LICENSE + - Additional credits: ./mods/asuna/asuna_core/sounds/music/CREDITS.md +- Asuna Textures + - Location: ./mods/asuna/asuna_textures/ + - License file: ./mods/asuna/asuna_textures/textures/baunilha/LICENSE.txt + - License file: ./mods/asuna/asuna_textures/textures/butterflies/LICENSE + - License file: ./mods/asuna/asuna_textures/textures/ethereal/LICENSE + - License file: ./mods/asuna/asuna_textures/textures/x_farming/LICENSE + - Additional credits: ./mods/asuna/asuna_textures/CREDITS.md + - Additional credits: ./mods/asuna/asuna_textures/textures/custom/CREDITS.md +- Awards + - Location: ./mods/awards/ + - License file: ./mods/awards/LICENSE.txt + - Changes were made to this work +- Baked Clay + - Location: ./mods/bakedclay/ + - License file: ./mods/bakedclay/license.txt + - Changes were made to this work +- Beautiful Flowers + - Location: ./mods/beautiflowers + - License file: ./mods/beautiflowers/LICENSE + - Changes were made to this work +- Biomes + - Location: ./mods/biomes/ + - License file: ./mods/biomes/license.txt + - Additional credits: ./mods/biomes/CREDITS.md + - Changes were made to this work +- Carpets + - Location: ./mods/carpets/ + - License file: ./mods/carpets/LICENSE +- Filled Bottles + - Location: ./mods/bottles/ + - License file: ./mods/bottles/LICENSE + - Additional credits: ./mods/bottles/CREDITS.md +- Builtin Item + - Location: ./mods/builtin_item/ + - License file: ./mods/builtin_item/license.txt + - Changes were made to this work +- Caverealms Lite + - Location: ./mods/caverealms/ + - License file: ./mods/caverealms/LICENSE.txt + - Changes were made to this work +- Colorful Beds + - Location: ./mods/colorful_beds/ + - License file: ./mods/colorful_beds/license.txt + - Changes were made to this work +- Creatura + - Location: ./mods/creatura/ + - License file: ./mods/creatura/LICENSE +- Effervescence + - Location: ./mods/effervescence/ + - License file: ./mods/effervescence/LICENSE + - Changes were made to this work +- Ethereal + - Location: ./mods/ethereal/ + - License file: ./mods/ethereal/license.txt + - License file: ./mods/ethereal/textures/alt/license.txt + - Changes were made to this work +- Everness + - Location: ./mods/everness/ + - License file: ./mods/everness/LICENSE.txt + - Changes were made to this work +- Farming Redo + - Location: ./mods/farming/ + - License file: ./mods/farming/license.txt + - Changes were made to this work +- Find Biome + - Location: ./mods/findbiome/ + - License file: ./mods/findbiome/license.txt +- Flowerpot + - Location: ./mods/flowerpot/ + - License file: ./mods/flowerpot/LICENSE +- Geodes + - Location: ./mods/geodes/ + - License file: ./mods/geodes/LICENSE.txt + - Changes were made to this work +- Herbs + - Location: ./mods/herbs/ + - License file: ./mods/herbs/LICENSE + - Changes were made to this work +- Item Drop + - Location: ./mods/item_drop/ + - License file: ./mods/item_drop/LICENSE +- Leafstride + - Location: ./mods/leafstride/ + - License file: ./mods/leafstride/LICENSE +- Wilhelmines Living Jungle + - Location: ./mods/livingjungle/ + - License file: ./mods/livingjungle/LICENSE + - Changes were made to this work +- Living Slimes + - Location: ./mods/livingslimes/ + - License file: ./mods/livingslimes/LICENSE.txt + - Additional credits: ./mods/livingslimes/sounds/CREDITS.md + - Changes were made to this work +- LootChests + - Location: ./mods/lootchests/ + - License file: ./mods/lootchests/README.md +- Wilhelmines Marinara + - Location: ./mods/marinara/ + - License file: ./mods/marinara/LICENSE + - Changes were made to this work +- Minetest Game + - Location: ./mods/minetest_game/ + - License files: ./mods/minetest_game/**/license.txt + - Changes were made to this work +- Music Modpack + - Location: ./mods/music_modpack/ + - License file: ./mods/music_modpack/README.md + - Changes were made to this work +- Wilhelmines Natural Biomes + - Location: ./mods/naturalbiomes/ + - License file: ./mods/naturalbiomes/LICENSE + - Changes were made to this work +- Plantlife + - Location: ./mods/plantlife_modpack/ + - License file: ./mods/plantlife_modpack/LICENSE + - Changes were made to this work +- Player Monoids + - Location: ./mods/player_monoids/ + - License file: ./mods/player_monoids/COPYING +- Researcher + - Location: ./mods/researcher/ + - License file: ./mods/researcher/LICENSE + - Additional credits: ./mods/researcher/CREDITS.md + - Changes were made to this work +- Simple Fast Inventory Buttons + - Location: ./mods/sfinv_buttons/ + - License file: ./mods/sfinv_buttons/README.md +- Show Wielded Item + - Location: ./mods/show_wielded_item/ + - License file: ./mods/show_wielded_item/README.md + - Changes were made to this work +- SkinsDB + - Location: ./mods/skinsdb/ + - License file: ./mods/skinsdb/README.md + - Additional credits: ./mods/skinsdb/CREDITS.md + - Changes were made to this work +- Soup + - Location: ./mods/soup/ + - License file: ./mods/soup/LICENSE.md + - Changes were made to this work +- Stamina + - Location: ./mods/stamina/ + - License file: ./mods/stamina/README.txt + - Changes were made to this work +- Telemosaic + - Location: ./mods/telemosaic/ + - License file: ./mods/telemosaic/LICENSE + - Changes were made to this work +- Too Many Stones + - Location: ./mods/too_many_stones/ + - License file: ./mods/too_many_stones/LICENSE.txt + - Changes were made to this work +- Extended Tooltips + - Location: ./mods/tt/ + - License file: ./mods/tt/LICENSE.txt +- Extended Tooltips: Base + - Location: ./mods/tt_base/ + - License file: ./mods/tt_base/LICENSE.txt +- Wielded Light + - Location: ./mods/wielded_light/ + - License file: ./mods/wielded_light/LICENSE + - Changes were made to this work +- Worldgate + - Location: ./mods/worldgate/ + - License file: ./mods/worldgate/LICENSE + - Changes were made to this work +- X Farming + - Location: ./mods/x_farming + - License file: ./mods/x_farming/LICENSE.txt + - Changes were made to this work + +--- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..0a90ebb6 --- /dev/null +++ b/README.md @@ -0,0 +1,91 @@ +Asuna +===== + +Welcome to the vast and vibrant world of Asuna! Journey through a potpourri of natural wonders as you traverse beautiful and breathtaking landscapes. Forests, meadows, jungles, tundras, deserts, swamps, and more await you at every horizon. + +This passion project brings together some of the very best biome and world decoration mods that the Minetest community has published to date. Much of Asuna's beauty is owed to the mod authors who have openly shared the fruits of their hard work and imagination. Asuna stands to honor these authors and their works. + +Features +-------- + +Asuna provides a wealth of biomes, flora, fauna, and a few other extras. Primary features are highlighted below with the mods they are primarily derived from: + +- 60+ biomes to explore ([Everness](https://content.minetest.net/packages/SaKeL/everness/), [Biomes](https://content.minetest.net/packages/Atlante/biomes/), [Ethereal](https://content.minetest.net/packages/TenPlus1/ethereal/), [Wilhelmines Natural Biomes](https://content.minetest.net/packages/Liil/naturalbiomes/), [Wilhelmines Living Jungle](https://content.minetest.net/packages/Liil/livingjungle/), [Wilhelmines Marinara](https://content.minetest.net/packages/Liil/marinara/), [Caverealms Lite](https://content.minetest.net/packages/Shara/caverealms/)) +- 100+ flowers, plants, and mushrooms to discover ([Beautiful Flowers](https://content.minetest.net/packages/1faco/beautiflowers/), [Herbs](https://content.minetest.net/packages/Clyde/herbs/), [Plantlife](https://content.minetest.net/packages/mt-mods/plantlife_modpack/), [Baked Clay](https://content.minetest.net/packages/TenPlus1/bakedclay/), [Minetest Game](https://content.minetest.net/packages/Minetest/minetest_game/), and more from the biome mods) +- 30+ farming crops to grow and harvest ([X Farming](https://content.minetest.net/packages/SaKeL/x_farming/), [Farming Redo](https://content.minetest.net/packages/TenPlus1/farming/)) +- 27 different animals and creatures to be found in their natural habitats ([Animalia](https://content.minetest.net/packages/ElCeejo/animalia/), [Living Slimes](https://content.luanti.org/packages/EmptyStar/livingslimes/)) +- 80+ decorative stones to unearth ([Too Many Stones](https://content.minetest.net/packages/JoeEnderman/too_many_stones/), [Baked Clay](https://content.minetest.net/packages/TenPlus1/bakedclay/), plus more from biome mods) +- 47 unique achievements to unlock ([Awards](https://content.minetest.net/packages/rubenwardy/awards/), [Asuna Awards](https://github.com/asuna-mt/asuna_game_mods/tree/asuna/asuna_awards)) +- 31 atmospheric background music tracks (curated specifically for Asuna in [asuna_core](https://github.com/asuna-mt/asuna_game_mods/tree/asuna/asuna_core) and played via [Music Modpack](https://content.minetest.net/packages/mt-mods/music_modpack/)) + +Content +------- + +Asuna's features provide a beautiful setting for your own adventures and creations and a colorful palette with which to create. It's largely up to you to write your own story, to build your own marvels, and to find your own purpose. + +That said, Asuna provides a number of built-in gameplay features which are split up into *content packs*. Each content pack represents a certain category of gameplay features that can be enabled, disabled, and configured individually. This allows you to greatly customize your gameplay experience! + +All content packs are optional and configurable via `Settings > All Settings > Content: Games > Asuna`. + +### Nutrition + +Nutrition grants benefits to players who stay well fed. A derivative of the "hunger" concept, Asuna revamps this familiar gameplay mechanic to be strictly beneficial to players in a way that aids in exploration and survival. Players will enjoy the following effects when they have eaten: + +- Increased movement speed (up to +25% when full) +- The ability to sprint (+100% movement speed while holding the `aux1` key) +- Health regeneration (chance to recover health every five seconds) +- Resistance to poisonous foods (chance to lose nutrition instead of health) + +These effects are most pronounced when a player is fully satiated and will diminish gradually as a player becomes hungry. Hunger will only diminish these effects and cannot hurt players unless starvation is explicitly enabled via game settings (disabled by default). + +This functionality is implemented using a modified version of the popular [Stamina](https://content.minetest.net/packages/sofar/stamina/) mod. + +### Wayfarer + +From hidden treasures to teleportation gates, Wayfarer adds a number of features to Asuna that make exploration more interesting and worthwhile. + +#### Awards + +Awards are a set of accomplishments to strive for as you traverse the world. From simple tasks to feats of exemplary dedication, awards give you more to do in your world. Awards can also help guide you to features of Asuna that might not otherwise be obvious or intuitive. + +Awards are implemented using a modified version of the popular [Awards](https://content.luanti.org/packages/rubenwardy/awards/) mod by Rubenwardy. + +#### Loot Chests + +You can find caches of useful items hidden throughout the caves and landscapes of Asuna. Loot chests, their contents, and their distribution are dependent on the environment in which they are found. + +- **Baskets**: Found next to hills, trees, bushes, and in shallow caves, baskets contain items such as food, grasses, wood, seeds, flowers, and leaves. +- **Urns**: These stone vessels are found at a limited depth in caves and can contain tools, rope, stones, gems, crystals, ores, and some limited food items. +- **Ancient Chests**: These old stone chests are found rarely in caves and contain high quality tools, rare gems, mese crystals, and many exotic items that are otherwise rare in the world. +- **Ocean Chests**: These chests are found in deep ocean amidst dense kelp and near shipwrecks, and they contain a variety of useful items in addition to aquatic decorations. + +These chests are implemented by a modified version of [LootChests modpack](https://content.minetest.net/packages/mt-mods/lootchest_modpack/). + +#### Worldgates + +Discover the Worldgates, an ancient teleportation network that can carry you to distant lands in an instant. Despite their long abandonment, the Worldgates are still highly functional. They can be found throughout the world, some more intact than others, and each adorned in stone by the elder hands that wrought them. + +True to its name, this native teleportation network is implemented via the [Worldgate](https://content.luanti.org/packages/EmptyStar/worldgate/) mod. + +### Menagerie + +Nothing makes a world feel more alive than the creatures that inhabit it. Menagerie adds a variety of animals and creatures to Asuna. + +#### Animals + +Asuna is home to a number of wild animals which can be found roaming about their natural habitats. These animals are highly interactive and can be fed, bred, tamed, and hunted. These animals are implemented via the [Animalia](https://content.minetest.net/packages/ElCeejo/animalia/) mod which describes the animals in greater detail. + +#### Slimes + +Many species of living slimes are native to Asuna. Some of these slimes are docile foragers while others are more territorial. These slimes can be found in many places under the sun, deep underground, and even in oceans and waterways. See the [Living Slimes](https://content.minetest.net/packages/EmptyStar/livingslimes/) mod for information about the various slimes and their behaviors. + +### Research + +The Research content pack adds an *earned creative* mode to Asuna. Research allows you to unlock infinite duplication of the items in your world, but you must discover and/or create the items necessary for research. This is a more interesting alternative to Asuna's true creative mode and it's most useful when applied to survival worlds. + +This feature is implemented via the [Researcher](https://content.luanti.org/packages/EmptyStar/researcher/) mod which thoroughly describes the research process. + +Mods +---- + +For even more gameplay options, check out [ContentDB](https://content.minetest.net/) to find mods that can fulfill all of your wildest dreams. Asuna aims to maintain compatibility with mods that are compatible with Minetest Game. \ No newline at end of file diff --git a/game.conf b/game.conf new file mode 100644 index 00000000..3c753cf8 --- /dev/null +++ b/game.conf @@ -0,0 +1,6 @@ +title = Asuna2 +author = EmptyStar +description = A vibrant world of natural wonders +disallowed_mapgens = v6 + +release = 30050 diff --git a/menu/LICENSE b/menu/LICENSE new file mode 100644 index 00000000..eed6b435 --- /dev/null +++ b/menu/LICENSE @@ -0,0 +1,17 @@ +Creative Commons Attribution 4.0 International (CC-BY 4.0) + +© EmptyStar 2023 + +You are free to: + + Share — copy and redistribute the material in any medium or format + Adapt — remix, transform, and build upon the material + for any purpose, even commercially. + + The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + + Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + + No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. \ No newline at end of file diff --git a/menu/background.1.png b/menu/background.1.png new file mode 100644 index 00000000..46ce5259 Binary files /dev/null and b/menu/background.1.png differ diff --git a/menu/background.10.png b/menu/background.10.png new file mode 100644 index 00000000..bd72047a Binary files /dev/null and b/menu/background.10.png differ diff --git a/menu/background.2.png b/menu/background.2.png new file mode 100644 index 00000000..8007ca50 Binary files /dev/null and b/menu/background.2.png differ diff --git a/menu/background.3.png b/menu/background.3.png new file mode 100644 index 00000000..19ada7ee Binary files /dev/null and b/menu/background.3.png differ diff --git a/menu/background.4.png b/menu/background.4.png new file mode 100644 index 00000000..8e95b27c Binary files /dev/null and b/menu/background.4.png differ diff --git a/menu/background.5.png b/menu/background.5.png new file mode 100644 index 00000000..9e673833 Binary files /dev/null and b/menu/background.5.png differ diff --git a/menu/background.6.png b/menu/background.6.png new file mode 100644 index 00000000..0e4ba30f Binary files /dev/null and b/menu/background.6.png differ diff --git a/menu/background.7.png b/menu/background.7.png new file mode 100644 index 00000000..9feb1add Binary files /dev/null and b/menu/background.7.png differ diff --git a/menu/background.8.png b/menu/background.8.png new file mode 100644 index 00000000..f95b7901 Binary files /dev/null and b/menu/background.8.png differ diff --git a/menu/background.9.png b/menu/background.9.png new file mode 100644 index 00000000..5181eb7d Binary files /dev/null and b/menu/background.9.png differ diff --git a/menu/background.png b/menu/background.png new file mode 100644 index 00000000..7bceef75 Binary files /dev/null and b/menu/background.png differ diff --git a/menu/header.png b/menu/header.png new file mode 100644 index 00000000..f1e5523a Binary files /dev/null and b/menu/header.png differ diff --git a/menu/icon.png b/menu/icon.png new file mode 100644 index 00000000..a0f3b8bd Binary files /dev/null and b/menu/icon.png differ diff --git a/minetest.conf b/minetest.conf new file mode 100644 index 00000000..7264956a --- /dev/null +++ b/minetest.conf @@ -0,0 +1 @@ +time_speed = 72 \ No newline at end of file diff --git a/mods/3d_armor/3d_armor/README.md b/mods/3d_armor/3d_armor/README.md new file mode 100644 index 00000000..b023784a --- /dev/null +++ b/mods/3d_armor/3d_armor/README.md @@ -0,0 +1,525 @@ +# [mod] Visible Player Armor [3d_armor] + +| | | | | +|--|--|--|--| +|-[Overview](#overview) |||-[API](#api) +|-[Armor Configuration](#armor-configuration) |||- - [3d_Armor Item Storage](#3d_armor-item-storage) +|- - [disable_specific_materials](#to-disable-individual-armor-materials) |||- - [Armor Registration](#armor-registration) +|- - [armor_init_delay](#initialization-glitches-when-a-player-first-joins) |||- - [Registering Armor Groups](#registering-armor-groups) +|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor) +|- - [armor_bones_delay](#armor-not-in-bones-due-to-server-lag) |||- - - [Elements](#elements) +|- - [armor_update_time](#how-often-player-armor-items-are-updated) |||- - - [Attributes](#attributes) +|- - [armor_drop](#drop-armor-when-a-player-dies) |||- - - [Physics](#physics) +|- - [armor_destroy](#destroy-armor-when-a-player-dies) |||- - - [Durability](#durability) +|- - [armor_level_multiplier](#armor-level-multiplyer) |||- - - [Armor Material](#armor-material) +|- - [armor_heal_multiplier](#armor-healing-multiplyer) |||- - [Armour Functions](#armor-functions) +|- - [armor_set_elements](#allows-the-customisation-of-armor-set) |||- - - [armor:set_player_armor](#armor-set_player_armor) +|- - [armor_set_bonus](#armor-set-bonus-multiplier) |||- - - [armor:punch](#armor-punch) +|- - [armor_water_protect](#enable-water-protection) |||- - - [armor:damage](#armor-damage) +|- - [armor_fire_protect](#enable-fire-protection) |||- - - [armor:remove_all](#armor-remove_all) +|- - [armor_punch_damage](#enable-punch-damage-effects) |||- - - [armor:equip](#armor-equip) +|- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories) |||- - - [armor:unequip](#armor-unequip) +| |||- - - [armor:update_skin](#armor-update_skin) +|-[Credits](#credits) |||- - [Callbacks](#Callbacks) +| |||- - - [Item callbacks](#item-callbacks) +| |||- - - [Global callbacks](#global-callbacks) + +# Overview + +**Depends:** default + +**Recommends:** sfinv, unified_inventory or smart_inventory (use only one to avoid conflicts) + +**Supports:** player_monoids, armor_monoid and POVA + +Adds craftable armor that is visible to other players. Each armor item worn contributes to +a player's armor group level making them less vulnerable to weapons. + +Armor takes damage when a player is hurt but also offers a percentage chance of healing. +Overall level is boosted by 10% when wearing a full matching set. + +# Armor Configuration + +Change the following default settings by going to Main Menu>>Settings(Tab)>>All Settings(Button)>>Mods>>minetest-3d_Armor>>3d_Armor + +### To disable individual armor materials + **set the below to false** + + armor_material_wood = true + armor_material_cactus = true + armor_material_steel = true + armor_material_bronze = true + armor_material_diamond = true + armor_material_gold = true + armor_material_mithril = true + armor_material_crystal = true + armor_material_nether = true + +### Initialization glitches when a player first joins + **Increase to prevent glitches** + + armor_init_delay = 2 + +### Armor not in bones due to server lag + **Increase to help resolve** + + armor_bones_delay = 1 + +### How often player armor items are updated +**Number represents how often per second update is performed, higher value means less performance hit for servers but armor items maybe delayed in updating when switching.Fractional seconds also supported eg 0.1** + + armor_update_time = 1 + +### Drop armor when a player dies + **Uses bones mod if present, otherwise items are dropped around the player when false.** + + armor_drop = true + +### Destroy armor when a player dies + **overrides armor_drop.** + + armor_destroy = false + +### Armor level multiplyer + **Increase to make armor more effective and decrease to make armor less effective** + **eg: level_multiplier = 0.5 will reduce armor level by half.** + + armor_level_multiplier = 1 + +### Armor healing multiplyer + **Increase to make armor healing more effective and decrease to make healing less effective** + **eg: armor_heal_multiplier = 0 will disable healing altogether.** + + armor_heal_multiplier = 1 + +### Allows the customisation of armor set + **Shields already configured as need to be worn to complete an armor set** + **These names come from [Element names](#groups-used-by-3d_armor), the second half of the element name only is used eg armor_head is head** + + armor_set_elements = head torso legs feet shield + +### Armor set bonus multiplier + **Set to 1 to disable set bonus** + + armor_set_multiplier = 1.1 + +### Enable water protection + **periodically restores breath when activated** + + armor_water_protect = true + +### Enable fire protection +**defaults to true if using ethereal mod** + + armor_fire_protect = false + +### Fire protection enabled, disable torch fire damage +**when fire protection is enabled allows you to disable fire damage from torches** +**defaults to true if using ethereal mod** + + armor_fire_protect_torch = false + +### Enable punch damage effects + + armor_punch_damage = true + +### Migration of old armor inventories + + armor_migrate_old_inventory = true + +### How often player wield items are updated +**Number represents how often per second update is performed, higher value means less performance hit for servers but wield items maybe delayed in updating when switching. Fractional seconds also supported eg 0.1** +***Note this is MT engine functionality but included for completness*** + + wieldview_update_time = 1 + +# API + +## 3d_Armor item storage +3d_Armor stores each armor piece a player currently has equiped in a ***detached*** inventory. The easiest way to access this inventory if needed is using this line of code + + local _, armor_inv = armor:get_valid_player(player, "3d_armor") + +**Example** + + armor:register_on_equip(function(player, index, stack) + local _, armor_inv = armor:get_valid_player(player, "3d_armor") + for i = 1, 6 do + local stack = armor_inv:get_stack("armor", i) + if stack:get_name() == "3d_armor:chestplate_gold" then + minetest.chat_send_player(player:get_player_name(),"Got to love the Bling!!!") + end + end + end) + +## Armor Registration + + armor:register_armor(name, def) + +Wrapper function for `minetest.register_tool`, which enables the easy registration of new armor items. While registering armor as a tool item is still supported, this may be deprecated in future so all armor items should be registered using *armor:register_armor(name,def)*. + +### Additional fields supported by 3d_armor + + texture = + preview = + armor_groups = + damage_groups =
+ reciprocate_damage = + on_equip = + on_unequip = + on_destroy = + on_damage = + on_punched = + +***Reciprocal tool*** damage will apply damage back onto the attacking tool/weapon, however this will only be done by the first armor inventory item with `reciprocate_damage = true`, damage does not stack. + +**Example Simple:** + + armor:register_armor("mod_name:chestplate_leather", { + description = "Leather Chestplate", + inventory_image = "mod_name_inv_chestplate_leather.png", + texture = "mod_name_leather_chestplate.png", + preview = "mod_name_leather_chestplate_preview.png", + groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1} + }) +*See ***armor.lua*** under **3d_armor>>3d_armor** for further examples* + +**Extended functionality** +The values for ***texture*** and ***preview*** do not need to be included when registering armor if they follow the naming convention in the textures mod folder of: +***texture:*** *mod_name_leather_chestplate.png* +***preview:*** *mod_name_leather_chestplate_preview.png* + +## Registering Armor Groups +3d armor has a built in armor group which is ***fleshy*** all players base vulnerability to being fleshy is ***100***. + 3d armour allows for the easy registration/addition of new armor groups:: + + armor:register_armor_group(group, base) + +***group:*** Is the name of the new armor group +***base*** Is the starting vulnerability that all players have to that new group. This dosent need to be 100. + +**Example** + + armor:register_armor_group("radiation", 100) + +New armor group is registered called *radiation* and all players start off with a base vulnerability of *100* to radiation. + +**Example** *Showing armor reg, new group usage and custom function* + + armor:register_armor("mod_name:speed_boots", { + description = "Speed Boots", + inventory_image = "mod_name_speed_boots_inv.png", + texture = "mod_name_speed_boots.png", + preview = "mod_name_speed_boots_preview.png", + groups = {armor_feet=1, armor_use=500, physics_speed=1.2, flammable=1}, + armor_groups = {fleshy=10, radiation=10}, + damage_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}, + reciprocate_damage = true, + on_destroy = function(player, index, stack) + local pos = player:get_pos() + if pos then + minetest.sound_play({ + name = "mod_name_break_sound", + pos = pos, + gain = 0.5, + }) + end + end, + }) + +### Tools/weapons and new armor groups +The above allows armor to block/prevent new damage types but you also need to assign the new damage group to a tool/weapon or even a node (see technic mod) to make wearing the armor item meaningful. Simply add the ***armor_groups*** name to the tool items ***damage_groups***. + +**Example** + + minetest.register_tool("mod_name:glowing_sword", { + description = "Glowing Sword", + inventory_image = "mod_name_tool_glowingsword.png", + tool_capabilities = {full_punch_interval = 1.2,max_drop_level=0, + groupcaps={ + cracky = {times={[3]=1.60}, uses=10, maxlevel=1},}, + damage_groups = {fleshy=10,radiation=20}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1, flammable = 2} + }) + +## Groups used by 3d_Armor +3d_armor has many default groups already registered, these are categorized under 4 main headings + - **Elements:** armor_head, armor_torso, armor_legs, armor_feet + - **Attributes:** armor_heal, armor_fire, armor_water, armor_feather + - **Physics:** physics_jump, physics_speed, physics_gravity + - **Durability:** armor_use, flammable + +***Note: for calculation purposes "Attributes" and "Physics" values stack*** + +### Elements +Additional armor elements can be added by dependant mods, for example shields adds the group armor_shield which has by default a limit that only 1 shield can be worn at a time. + +Adding Elements is more complex but the below code can be used to add new elements; + + if minetest.global_exists("armor") and armor.elements then + table.insert(armor.elements, "hands") + end +**1st line** not strictly needed but checks that the global table "armor" and subtable "elements" exists +**2nd line** adds a new value to the armor.elements table called "hands" + +See ***init.lua*** under **3d_armor>>shields** for a further example + +The new armor item can now be registered using the new element +**Example** + + armor:register_armor("mod_name:gloves_wood", { + description = "Wood Gauntlets", + inventory_image = "mod_name_inv_gloves_wood.png", + texture = "mod_name_gloves_wood.png", + preview = "mod_name_gloves_wood_preview.png", + groups = {armor_hands=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + +### Attributes +Three attributes are avaliable in 3d_armor these are armor_heal, armor_fire and armor_water. Although possible to add additional attributes they would do nothing as code needs to be provide to specifiy the behaviour this could be done in a dependant mod + +#### Armor_heal +This isn't how much the armor will heal but relates to the chance the armor will completely block the damage. For each point of ***armor_heal*** there is a 1% chance that damage will be completely blocked, this value will stack between all armor pieces + +**Example** +The below Diamond chestplate has a 12% chance to completely block all damage (armor_heal=12), however so do boots, helmet and trousers so if the player was wearing all 4 pieces they would have a 48% chance of blocking all damage each attack. + + armor:register_armor("3d_armor:chestplate_diamond", { + description = S("Diamond Chestplate"), + inventory_image = "3d_armor_inv_chestplate_diamond.png", + groups = {armor_torso=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + +#### Armor_fire +***"Armor_fire"*** provides 5 levels of fire protection + - level 1 protects against torches + - level 2 protects against crystal spike (Ethereal mod) + - level 3 protects against fire + - level 4 unused + - level 5 protects against lava + +**Example** + + armor:register_armor("mod_name:fire_proof_jacket", { + description = "Fire Proof Jacket", + inventory_image = "mod_name_inv_fire_proof_jacket.png", + groups = {armor_torso=1, armor_fire=3, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + +#### Armor_water +***"Armor_water"*** will periodically restore a players breath when underwater. This only has one level or state, which is armor_water=1 + +**Example** + + armor:register_armor("mod_name:helmet_underwater_breath", { + description = "Helmet of Underwater Breathing", + inventory_image = "mod_name_inv_helmet_underwater_breath.png", + groups = {armor_head=1, armor_water=1, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + +#### Armor_feather +***"Armor_feather"*** will slow a player when falling. This only has one level or state, which is armor_feather=1 + +### Physics +The physics attributes supported by 3d_armor are ***physics_jump, physics_speed and physics_gravity***. Although 3d_armor supports the use of this with no other mods it is recommended that the mod [player_monoids](https://forum.minetest.net/viewtopic.php?t=14895) is used to help with intermod compatability. + +***physics_jump*** - Will increase/decrease the jump strength of the player so they can jump more/less. The base number is "1" and any value is added or subtracted, supports fractional so "physics_jump=1" will increase jump strength by 100%. "physics_jump= -0.5" will decrease jump by 50%. + +***physics_speed*** - Will increase/decrease the walk speed of the player so they walk faster/slower. The base number is "1" and any value is added or subtracted, supports fractional so "physics_speed=1.5" will increase speed by 150%, "physics_speed= -0.5" will decrease speed by 50%. + +***physics_gravity*** - Will increase/decrease gravity the player experiences so it's higher/lower. The base number is "1" and any value is added or subtracted, supports fractional so "physics_gravity=2" will increase gravity by 200%, "physics_gravity= -1" will decrease gravity by 100%. + +*Note: The player physics modifications won't be applied via `set_physics_override` if `player_physics_locked` is set to 1 in the respective player's meta.* + +### Durability +Durability is determined by the value assigned to the group ***armor_use***. The higher the ***armor_use*** value the faster/more quickly it is damaged/degrades. This is calculated using the formula: + + Total uses = approx(65535/armor_use) + + **Example** + All wood armor items have an ***armor_use=2000***; + + 65535/2000 = 32.76 (32) + After 32 uses(hits) the armor item will break. + + All diamond armor items have an ***armor_use=200***; + + 65535/2000 = 327.6 (327) + After 327 uses(hits) the armor item will break. + +### Armor Material +The material the armor is made from is defined by adding the material to the end of registered armor item name. It is very important the material is the last item in the registered item name and it is preceeded by an "_" eg "_materialname". +The material name is what 3d_armor uses to determine if a player is wearing a set of armor. To recieve the set bonus all items worn must be made of the same material. +So to get a set bonus under the default set settings the players armor items listed below must be made of the same material: +* head - Helmet +* torso - Chestplate +* legs - Leggings +* feet - Boots +* shield - Shields + +If all of the above were made of material "wood" the player would recieve an ***armor_set_bonus*** of armor_level * 1.1, essentially +10% + + **Example One** + + armor:register_armor("3d_armor:helmet_bronze", { + description = S("Bronze Helmet"), + inventory_image = "3d_armor_inv_helmet_bronze.png", + groups = {armor_head=1, armor_heal=6, armor_use=400, physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + + **Example Two** + + armor:register_armor("new_mod:helmet_spartan_bronze", { + description = S("Spartan Helmet"), + inventory_image = "new_mod_inv_helmet_spartan_bronze.png", + groups = {armor_head=1, armor_heal=6, armor_use=350, physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=12}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + +***Note: At the moment an armor item can only be made of one material*** + +## Armor Functions + +See also: [API Reference](https://minetest-mods.github.io/3d_armor/reference/) + +### armor set_player_armor + + armor:set_player_armor(player) + +Primarily an internal function but can be called externally to apply any +changes that might not otherwise get handled. + +### armor punch + + armor:punch(player, hitter, time_from_last_punch, tool_capabilities) + +Used to apply damage to all equipped armor based on the damage groups of +each individual item.`hitter`, `time_from_last_punch` and `tool_capabilities` +are optional but should be valid if included. + +### armor damage + + armor:damage(player, index, stack, use) + +Adds wear to a single armor itemstack, triggers `on_damage` callbacks and +updates the necessary inventories. Also handles item destruction callbacks +and so should NOT be called from `on_unequip` to avoid an infinite loop. + +### armor remove_all + + armor:remove_all(player) + +Removes all armors from the player's inventory without triggering any callback. + +### armor equip + + armor:equip(player, armor_name) + +Equip the armor, removing the itemstack from the main inventory if there's one. + +### armor unequip + + armor:unequip(player, armor_name) + +Unequip the armor, adding the itemstack to the main inventory. + +### armor update_skin + + armor:update_skin(player_name) + +Triggers a skin update with the same action as if a field with `skins_set` was submitted. + +## Callbacks + +### Item Callbacks + +In all of the below when armor is destroyed `stack` will contain a copy of the previous stack. + +*unsure what this note means may apply to all item callbacks or just on_punched* +Return `false` to override armor damage effects. + +#### on_equip + + on_equip = func(player, index, stack) + +#### on_unequip + + on_unequip = func(player, index, stack) + +#### on_destroy + + on_destroy = func(player, index, stack) + +#### on_damage + + on_damage = func(player, index, stack) + +#### on_punched + + on_punched = func(player, hitter, time_from_last_punch, tool_capabilities) + +`on_punched` is called every time a player is punched or takes damage, `hitter`, `time_from_last_punch` and `tool_capabilities` can be `nil` and will be in the case of fall damage. +When fire protection is enabled, hitter == "fire" in the event of fire damage. + + +### Global Callbacks + +#### armor register_on_update + + armor:register_on_update(function(player)) + +#### armor register_on_equip + + armor:register_on_equip(function(player, index, stack)) + +#### armor register_on_unequip + + armor:register_on_unequip(function(player, index, stack)) + +#### armor register_on_destroy +armor:register_on_destroy(function(player, index, stack)) + + **Example** + + armor:register_on_update(function(player) + print(player:get_player_name().." armor updated!") + end) + + +# Credits + +### The below have added too, tested or in other ways contributed to the development and ongoing support of 3d_Armor + +|Stu |Stujones11 |Stu |Github Ghosts | +|:---------------:|:---------------:|:---------------:|:---------------:| +|Pavel_S |BlockMen |Tenplus1 |donat-b | +|JPRuehmann |BrandonReese |Megaf |Zeg9 | +|poet.nohit |Echoes91 |Adimgar |Khonkhortisan | +|VanessaE |CraigyDavi |proller |Thomasrudin | +|Byakuren |kilbith (jp) |afflatus |G1ov4 | +|Thomas-S |Dragonop |Napiophelios |Emojigit | +|rubenwardy |daviddoesminetest|bell07 |OgelGames | +|tobyplowy |crazyginger72 |fireglow |bhree | +|Lone_Wolf(HT) |Wuzzy(2) |numberZero |Monte48 | +|AntumDeluge |Terumoc |runsy |Dacmot | +|codexp |davidthecreator |SmallJoker |orbea | +|BuckarooBanzay |daret |Exeterdad |Calinou | +|Pilcrow182 |indriApollo |HybridDog |CraigyDavi | +|Paly-2 |Diogogomes | | | + +*Note: Names gathered from 3d_armor forum thread and github, I may have missed some people, apologises if I have - S01* diff --git a/mods/3d_armor/3d_armor/api.lua b/mods/3d_armor/3d_armor/api.lua new file mode 100644 index 00000000..f79a2744 --- /dev/null +++ b/mods/3d_armor/3d_armor/api.lua @@ -0,0 +1,982 @@ + +--- 3D Armor API +-- +-- @topic api + + +local transparent_armor = minetest.settings:get_bool("armor_transparent", false) + + +--- Tables +-- +-- @section tables + +--- Armor definition table used for registering armor. +-- +-- @table ArmorDef +-- @tfield string description Human-readable name/description. +-- @tfield string inventory_image Image filename used for icon. +-- @tfield table groups See: `ArmorDef.groups` +-- @tfield table armor_groups See: `ArmorDef.armor_groups` +-- @tfield table damage_groups See: `ArmorDef.damage_groups` +-- @see ItemDef +-- @usage local def = { +-- description = "Wood Helmet", +-- inventory_image = "3d_armor_inv_helmet_wood.png", +-- groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, +-- armor_groups = {fleshy=5}, +-- damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, +-- } + +--- Groups table. +-- +-- General groups defining item behavior. +-- +-- Some commonly used groups: ***armor\_<type>***, ***armor\_heal***, ***armor\_use*** +-- +-- @table ArmorDef.groups +-- @tfield int armor_type The armor type. "head", "torso", "hands", "shield", etc. +-- (**Note:** replace "type" with actual type). +-- @tfield int armor_heal Healing value of armor when equipped. +-- @tfield int armor_use Amount of uses/damage before armor "breaks". +-- @see groups +-- @usage groups = { +-- armor_head = 1, +-- armor_heal = 5, +-- armor_use = 2000, +-- flammable = 1, +-- } + +--- Armor groups table. +-- +-- Groups that this item is effective against when taking damage. +-- +-- Some commonly used groups: ***fleshy*** +-- +-- @table ArmorDef.armor_groups +-- @usage armor_groups = { +-- fleshy = 5, +-- } + +--- Damage groups table. +-- +-- Groups that this item is effective on when used as a weapon/tool. +-- +-- Some commonly used groups: ***cracky***, ***snappy***, ***choppy***, ***crumbly***, ***level*** +-- +-- @table ArmorDef.damage_groups +-- @see entity_damage_mechanism +-- @usage damage_groups = { +-- cracky = 3, +-- snappy = 2, +-- choppy = 3, +-- crumbly = 2, +-- level = 1, +-- } + +--- @section end + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +local skin_previews = {} +local use_player_monoids = minetest.global_exists("player_monoids") +local use_armor_monoid = minetest.global_exists("armor_monoid") +local use_pova_mod = minetest.get_modpath("pova") +local armor_def = setmetatable({}, { + __index = function() + return setmetatable({ + groups = setmetatable({}, { + __index = function() + return 0 + end}) + }, { + __index = function() + return 0 + end + }) + end, +}) +local armor_textures = setmetatable({}, { + __index = function() + return setmetatable({}, { + __index = function() + return "blank.png" + end + }) + end +}) + +armor = { + timer = 0, + elements = {"head", "torso", "legs", "feet"}, + physics = {"jump", "speed", "gravity"}, + attributes = {"heal", "fire", "water", "feather"}, + formspec = "image[2.5,0;2,4;armor_preview]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + default.get_hotbar_bg(0, 4.7).. + "list[current_player;main;0,4.7;8,1;]".. + "list[current_player;main;0,5.85;8,3;8]", + def = armor_def, + textures = armor_textures, + default_skin = "character", + materials = { + wood = "group:wood", + cactus = "default:cactus", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + diamond = "default:diamond", + gold = "default:gold_ingot", + mithril = "moreores:mithril_ingot", + crystal = "ethereal:crystal_ingot", + nether = "nether:nether_ingot", + }, + fire_nodes = { + {"nether:lava_source", 5, 8}, + {"default:lava_source", 5, 8}, + {"default:lava_flowing", 5, 8}, + {"fire:basic_flame", 3, 4}, + {"fire:permanent_flame", 3, 4}, + {"ethereal:crystal_spike", 2, 1}, + {"ethereal:fire_flower", 2, 1}, + {"nether:lava_crust", 2, 1}, + {"default:torch", 1, 1}, + {"default:torch_ceiling", 1, 1}, + {"default:torch_wall", 1, 1}, + }, + registered_groups = {["fleshy"]=100}, + registered_callbacks = { + on_update = {}, + on_equip = {}, + on_unequip = {}, + on_damage = {}, + on_destroy = {}, + }, + migrate_old_inventory = true, + version = "0.4.13", + get_translator = S +} + +armor.config = { + init_delay = 2, + bones_delay = 1, + update_time = 1, + drop = minetest.get_modpath("bones") ~= nil, + destroy = false, + level_multiplier = 1, + heal_multiplier = 1, + material_wood = true, + material_cactus = true, + material_steel = true, + material_bronze = true, + material_diamond = true, + material_gold = true, + material_mithril = true, + material_crystal = true, + material_nether = true, + set_elements = "head torso legs feet shield", + set_multiplier = 1.1, + water_protect = true, + fire_protect = true, + fire_protect_torch = false, + feather_fall = true, + punch_damage = true, +} + + +--- Methods +-- +-- @section methods + +--- Registers a new armor item. +-- +-- @function armor:register_armor +-- @tparam string name Armor item technical name (ex: "3d\_armor:helmet\_gold"). +-- @tparam ArmorDef def Armor definition table. +-- @usage armor:register_armor("3d_armor:helmet_wood", { +-- description = "Wood Helmet", +-- inventory_image = "3d_armor_inv_helmet_wood.png", +-- groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, +-- armor_groups = {fleshy=5}, +-- damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, +-- }) +armor.register_armor = function(self, name, def) + def.on_secondary_use = function(itemstack, player) + return armor:equip(player, itemstack) + end + def.on_place = function(itemstack, player, pointed_thing) + if pointed_thing.type == "node" and player and not player:get_player_control().sneak then + local node = minetest.get_node(pointed_thing.under) + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.on_rightclick then + return ndef.on_rightclick(pointed_thing.under, node, player, itemstack, pointed_thing) + end + end + return armor:equip(player, itemstack) + end + -- The below is a very basic check to try and see if a material name exists as part + -- of the item name. However this check is very simple and just checks theres "_something" + -- at the end of the item name and logging an error to debug if not. + local check_mat_exists = string.match(name, "%:.+_(.+)$") + if check_mat_exists == nil then + minetest.log("warning:[3d_armor] Registered armor "..name.. + " does not have \"_material\" specified at the end of the item registration name") + end + minetest.register_tool(name, def) +end + +--- Registers a new armor group. +-- +-- @function armor:register_armor_group +-- @tparam string group Group ID. +-- @tparam int base Base armor value. +armor.register_armor_group = function(self, group, base) + base = base or 100 + self.registered_groups[group] = base + if use_armor_monoid then + armor_monoid.register_armor_group(group, base) + end +end + +--- Armor Callbacks Registration +-- +-- @section callbacks + +--- Registers a callback for when player visuals are update. +-- +-- @function armor:register_on_update +-- @tparam function func Function to be executed. +-- @see armor:update_player_visuals +-- @usage armor:register_on_update(function(player, index, stack) +-- -- code to execute +-- end) +armor.register_on_update = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_update, func) + end +end + +--- Registers a callback for when armor is equipped. +-- +-- @function armor:register_on_equip +-- @tparam function func Function to be executed. +-- @usage armor:register_on_equip(function(player, index, stack) +-- -- code to execute +-- end) +armor.register_on_equip = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_equip, func) + end +end + +--- Registers a callback for when armor is unequipped. +-- +-- @function armor:register_on_unequip +-- @tparam function func Function to be executed. +-- @usage armor:register_on_unequip(function(player, index, stack) +-- -- code to execute +-- end) +armor.register_on_unequip = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_unequip, func) + end +end + +--- Registers a callback for when armor is damaged. +-- +-- @function armor:register_on_damage +-- @tparam function func Function to be executed. +-- @see armor:damage +-- @usage armor:register_on_damage(function(player, index, stack) +-- -- code to execute +-- end) +armor.register_on_damage = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_damage, func) + end +end + +--- Registers a callback for when armor is destroyed. +-- +-- @function armor:register_on_destroy +-- @tparam function func Function to be executed. +-- @see armor:damage +-- @usage armor:register_on_destroy(function(player, index, stack) +-- -- code to execute +-- end) +armor.register_on_destroy = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_destroy, func) + end +end + +--- @section end + + +--- Methods +-- +-- @section methods + +--- Runs callbacks. +-- +-- @function armor:run_callbacks +-- @tparam function callback Function to execute. +-- @tparam ObjectRef player First parameter passed to callback. +-- @tparam int index Second parameter passed to callback. +-- @tparam ItemStack stack Callback owner. +armor.run_callbacks = function(self, callback, player, index, stack) + if stack then + local def = stack:get_definition() or {} + if type(def[callback]) == "function" then + def[callback](player, index, stack) + end + end + local callbacks = self.registered_callbacks[callback] + if callbacks then + for _, func in pairs(callbacks) do + func(player, index, stack) + end + end +end + +--- Updates visuals. +-- +-- @function armor:update_player_visuals +-- @tparam ObjectRef player +armor.update_player_visuals = function(self, player) + if not player then + return + end + local name = player:get_player_name() + if self.textures[name] then + player_api.set_textures(player, { + self.textures[name].skin, + self.textures[name].armor, + self.textures[name].wielditem, + }) + end + self:run_callbacks("on_update", player) +end + +--- Sets player's armor attributes. +-- +-- @function armor:set_player_armor +-- @tparam ObjectRef player +armor.set_player_armor = function(self, player) + local name, armor_inv = self:get_valid_player(player, "[set_player_armor]") + if not name then + return + end + local state = 0 + local count = 0 + local preview = armor:get_preview(name) + local texture = "blank.png" + local physics = {} + local attributes = {} + local levels = {} + local groups = {} + local change = {} + local set_worn = {} + local armor_multi = 0 + local worn_armor = armor:get_weared_armor_elements(player) + for _, phys in pairs(self.physics) do + physics[phys] = 1 + end + for _, attr in pairs(self.attributes) do + attributes[attr] = 0 + end + for group, _ in pairs(self.registered_groups) do + change[group] = 1 + levels[group] = 0 + end + local list = armor_inv:get_list("armor") + if type(list) ~= "table" then + return + end + for i, stack in pairs(list) do + if stack:get_count() == 1 then + local def = stack:get_definition() + for _, element in pairs(self.elements) do + if def.groups["armor_"..element] then + if def.armor_groups then + for group, level in pairs(def.armor_groups) do + if levels[group] then + levels[group] = levels[group] + level + end + end + else + local level = def.groups["armor_"..element] + levels["fleshy"] = levels["fleshy"] + level + end + break + end + -- DEPRECATED, use armor_groups instead + if def.groups["armor_radiation"] and levels["radiation"] then + levels["radiation"] = levels["radiation"] + def.groups["armor_radiation"] + end + end + local item = stack:get_name() + local tex = def.texture or item:gsub("%:", "_") + tex = tex:gsub(".png$", "") + local prev = def.preview or tex.."_preview" + prev = prev:gsub(".png$", "") + if not transparent_armor then + texture = texture.."^"..tex..".png" + end + preview = preview.."^"..prev..".png" + state = state + stack:get_wear() + count = count + 1 + for _, phys in pairs(self.physics) do + local value = def.groups["physics_"..phys] or 0 + physics[phys] = physics[phys] + value + end + for _, attr in pairs(self.attributes) do + local value = def.groups["armor_"..attr] or 0 + attributes[attr] = attributes[attr] + value + end + end + end + -- The following code compares player worn armor items against requirements + -- of which armor pieces are needed to be worn to meet set bonus requirements + for loc,item in pairs(worn_armor) do + local item_mat = string.match(item, "%:.+_(.+)$") + local worn_key = item_mat or "unknown" + + -- Perform location checks to ensure the armor is worn correctly + for k,set_loc in pairs(armor.config.set_elements)do + if set_loc == loc then + if set_worn[worn_key] == nil then + set_worn[worn_key] = 0 + set_worn[worn_key] = set_worn[worn_key] + 1 + else + set_worn[worn_key] = set_worn[worn_key] + 1 + end + end + end + end + + -- Apply the armor multiplier only if the player is wearing a full set of armor + for mat_name,arm_piece_num in pairs(set_worn) do + if arm_piece_num == #armor.config.set_elements then + armor_multi = armor.config.set_multiplier + end + end + for group, level in pairs(levels) do + if level > 0 then + level = level * armor.config.level_multiplier + if armor_multi ~= 0 then + level = level * armor.config.set_multiplier + end + end + local base = self.registered_groups[group] + self.def[name].groups[group] = level + if level > base then + level = base + end + groups[group] = base - level + change[group] = groups[group] / base + end + for _, attr in pairs(self.attributes) do + local mult = attr == "heal" and self.config.heal_multiplier or 1 + self.def[name][attr] = attributes[attr] * mult + end + for _, phys in pairs(self.physics) do + self.def[name][phys] = physics[phys] + end + if use_armor_monoid then + armor_monoid.monoid:add_change(player, change, "3d_armor:armor") + else + -- Preserve immortal group (damage disabled for player) + local player_groups = player:get_armor_groups() + local immortal = player_groups.immortal + if immortal and immortal ~= 0 then + groups.immortal = 1 + end + -- Preserve fall_damage_add_percent group (fall damage modifier) + groups.fall_damage_add_percent = player_groups.fall_damage_add_percent + player:set_armor_groups(groups) + end + if use_player_monoids then + player_monoids.speed:add_change(player, physics.speed, + "3d_armor:physics") + player_monoids.jump:add_change(player, physics.jump, + "3d_armor:physics") + player_monoids.gravity:add_change(player, physics.gravity, + "3d_armor:physics") + elseif use_pova_mod then + -- only add the changes, not the default 1.0 for each physics setting + pova.add_override(name, "3d_armor", { + speed = physics.speed - 1, + jump = physics.jump - 1, + gravity = physics.gravity - 1, + }) + pova.do_override(player) + else + local player_physics_locked = player:get_meta():get_int("player_physics_locked") + if player_physics_locked == nil or player_physics_locked == 0 then + player:set_physics_override(physics) + end + end + self.textures[name].armor = texture + self.textures[name].preview = preview + self.def[name].level = self.def[name].groups.fleshy or 0 + self.def[name].state = state + self.def[name].count = count + self:update_player_visuals(player) +end + +--- Action when armor is punched. +-- +-- @function armor:punch +-- @tparam ObjectRef player Player wearing the armor. +-- @tparam ObjectRef hitter Entity attacking player. +-- @tparam[opt] int time_from_last_punch Time in seconds since last punch action. +-- @tparam[opt] table tool_capabilities See `entity_damage_mechanism`. +armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities) + local name, armor_inv = self:get_valid_player(player, "[punch]") + if not name then + return + end + local set_state + local set_count + local state = 0 + local count = 0 + local recip = true + local default_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1} + local list = armor_inv:get_list("armor") + for i, stack in pairs(list) do + if stack:get_count() == 1 then + local itemname = stack:get_name() + local use = minetest.get_item_group(itemname, "armor_use") or 0 + local damage = use > 0 + local def = stack:get_definition() or {} + if type(def.on_punched) == "function" then + damage = def.on_punched(player, hitter, time_from_last_punch, + tool_capabilities) ~= false and damage == true + end + if damage == true and tool_capabilities then + local damage_groups = def.damage_groups or default_groups + local level = damage_groups.level or 0 + local groupcaps = tool_capabilities.groupcaps or {} + local uses = 0 + damage = false + if next(groupcaps) == nil then + damage = true + end + for group, caps in pairs(groupcaps) do + local maxlevel = caps.maxlevel or 0 + local diff = maxlevel - level + if diff == 0 then + diff = 1 + end + if diff > 0 and caps.times then + local group_level = damage_groups[group] + if group_level then + local time = caps.times[group_level] + if time then + local dt = time_from_last_punch or 0 + if dt > time / diff then + if caps.uses then + uses = caps.uses * math.pow(3, diff) + end + damage = true + break + end + end + end + end + end + if damage == true and recip == true and hitter and + def.reciprocate_damage == true and uses > 0 then + local item = hitter:get_wielded_item() + if item and item:get_name() ~= "" then + item:add_wear(65535 / uses) + hitter:set_wielded_item(item) + end + -- reciprocate tool damage only once + recip = false + end + end + if damage == true and hitter == "fire" then + damage = minetest.get_item_group(itemname, "flammable") > 0 + end + if damage == true then + self:damage(player, i, stack, use) + set_state = self.def[name].state + set_count = self.def[name].count + end + state = state + stack:get_wear() + count = count + 1 + end + end + if set_count and set_count ~= count then + state = set_state or state + count = set_count or count + end + self.def[name].state = state + self.def[name].count = count +end + +--- Action when armor is damaged. +-- +-- @function armor:damage +-- @tparam ObjectRef player +-- @tparam int index Inventory index where armor is equipped. +-- @tparam ItemStack stack Armor item receiving damaged. +-- @tparam int use Amount of wear to add to armor item. +armor.damage = function(self, player, index, stack, use) + local old_stack = ItemStack(stack) + local worn_armor = armor:get_weared_armor_elements(player) + if not worn_armor then + return + end + local armor_worn_cnt = 0 + for k,v in pairs(worn_armor) do + armor_worn_cnt = armor_worn_cnt + 1 + end + use = math.ceil(use/armor_worn_cnt) + stack:add_wear(use) + self:run_callbacks("on_damage", player, index, stack) + self:set_inventory_stack(player, index, stack) + if stack:get_count() == 0 then + self:run_callbacks("on_unequip", player, index, old_stack) + self:run_callbacks("on_destroy", player, index, old_stack) + self:set_player_armor(player) + end +end + +--- Get elements of equipped armor. +-- +-- @function armor:get_weared_armor_elements +-- @tparam ObjectRef player +-- @treturn table List of equipped armors. +armor.get_weared_armor_elements = function(self, player) + local name, inv = self:get_valid_player(player, "[get_weared_armor]") + local weared_armor = {} + if not name then + return + end + for i=1, inv:get_size("armor") do + local item_name = inv:get_stack("armor", i):get_name() + local element = self:get_element(item_name) + if element ~= nil then + weared_armor[element] = item_name + end + end + return weared_armor +end + +--- Equips a piece of armor to a player. +-- +-- @function armor:equip +-- @tparam ObjectRef player Player to whom item is equipped. +-- @tparam ItemStack itemstack Armor item to be equipped. +-- @treturn ItemStack Leftover item stack. +armor.equip = function(self, player, itemstack) + local name, armor_inv = self:get_valid_player(player, "[equip]") + local armor_element = self:get_element(itemstack:get_name()) + if name and armor_element then + local index + for i=1, armor_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + if self:get_element(stack:get_name()) == armor_element then + --prevents equiping an armor that would unequip a cursed armor. + if minetest.get_item_group(stack:get_name(), "cursed") ~= 0 then + return itemstack + end + index = i + self:unequip(player, armor_element) + break + elseif not index and stack:is_empty() then + index = i + end + end + local stack = itemstack:take_item() + armor_inv:set_stack("armor", index, stack) + self:run_callbacks("on_equip", player, index, stack) + self:set_player_armor(player) + self:save_armor_inventory(player) + end + return itemstack +end + +--- Unequips a piece of armor from a player. +-- +-- @function armor:unequip +-- @tparam ObjectRef player Player from whom item is removed. +-- @tparam string armor_element Armor type identifier associated with the item +-- to be removed ("head", "torso", "hands", "shield", "legs", "feet", etc.). +armor.unequip = function(self, player, armor_element) + local name, armor_inv = self:get_valid_player(player, "[unequip]") + if not name then + return + end + for i=1, armor_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + if self:get_element(stack:get_name()) == armor_element then + armor_inv:set_stack("armor", i, "") + minetest.after(0, function() + local pplayer = minetest.get_player_by_name(name) + if pplayer then -- player is still online + local inv = pplayer:get_inventory() + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + minetest.add_item(pplayer:get_pos(), stack) + end + end + end) + self:run_callbacks("on_unequip", player, i, stack) + self:set_player_armor(player) + self:save_armor_inventory(player) + return + end + end +end + +--- Removes all armor worn by player. +-- +-- @function armor:remove_all +-- @tparam ObjectRef player +armor.remove_all = function(self, player) + local name, inv = self:get_valid_player(player, "[remove_all]") + if not name then + return + end + inv:set_list("armor", {}) + self:set_player_armor(player) + self:save_armor_inventory(player) +end + +local skin_mod + +--- Retrieves player's current skin. +-- +-- @function armor:get_player_skin +-- @tparam string name Player name. +-- @treturn string Skin filename. +armor.get_player_skin = function(self, name) + if (skin_mod == "skins" or skin_mod == "simple_skins") and skins.skins[name] then + return skins.skins[name]..".png" + elseif skin_mod == "u_skins" and u_skins.u_skins[name] then + return u_skins.u_skins[name]..".png" + elseif skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then + return wardrobe.playerSkins[name] + end + return armor.default_skin..".png" +end + +--- Updates skin. +-- +-- @function armor:update_skin +-- @tparam string name Player name. +armor.update_skin = function(self, name) + minetest.after(0, function() + local pplayer = minetest.get_player_by_name(name) + if pplayer then + self.textures[name].skin = self:get_player_skin(name) + self:set_player_armor(pplayer) + end + end) +end + +--- Adds preview for armor inventory. +-- +-- @function armor:add_preview +-- @tparam string preview Preview image filename. +armor.add_preview = function(self, preview) + skin_previews[preview] = true +end + +--- Retrieves preview for armor inventory. +-- +-- @function armor:get_preview +-- @tparam string name Player name. +-- @treturn string Preview image filename. +armor.get_preview = function(self, name) + local preview = string.gsub(armor:get_player_skin(name), ".png", "_preview.png") + if skin_previews[preview] then + return preview + end + return "character_preview.png" +end + +--- Retrieves armor formspec. +-- +-- @function armor:get_armor_formspec +-- @tparam string name Player name. +-- @tparam[opt] bool listring Use `listring` formspec element (default: `false`). +-- @treturn string Formspec formatted string. +armor.get_armor_formspec = function(self, name, listring) + local formspec = armor.formspec.. + "list[detached:"..name.."_armor;armor;0,0.5;2,3;]" + if listring == true then + formspec = formspec.."listring[current_player;main]".. + "listring[detached:"..name.."_armor;armor]" + end + formspec = formspec:gsub("armor_preview", armor.textures[name].preview) + formspec = formspec:gsub("armor_level", armor.def[name].level) + for _, attr in pairs(self.attributes) do + formspec = formspec:gsub("armor_attr_"..attr, armor.def[name][attr]) + end + for group, _ in pairs(self.registered_groups) do + formspec = formspec:gsub("armor_group_"..group, + armor.def[name].groups[group]) + end + return formspec +end + +--- Retrieves element. +-- +-- @function armor:get_element +-- @tparam string item_name +-- @return Armor element. +armor.get_element = function(self, item_name) + for _, element in pairs(armor.elements) do + if minetest.get_item_group(item_name, "armor_"..element) > 0 then + return element + end + end +end + +--- Serializes armor inventory. +-- +-- @function armor:serialize_inventory_list +-- @tparam table list Inventory contents. +-- @treturn string +armor.serialize_inventory_list = function(self, list) + local list_table = {} + for _, stack in ipairs(list) do + table.insert(list_table, stack:to_string()) + end + return minetest.serialize(list_table) +end + +--- Deserializes armor inventory. +-- +-- @function armor:deserialize_inventory_list +-- @tparam string list_string Serialized inventory contents. +-- @treturn table +armor.deserialize_inventory_list = function(self, list_string) + local list_table = minetest.deserialize(list_string) + local list = {} + for _, stack in ipairs(list_table or {}) do + table.insert(list, ItemStack(stack)) + end + return list +end + +--- Loads armor inventory. +-- +-- @function armor:load_armor_inventory +-- @tparam ObjectRef player +-- @treturn bool +armor.load_armor_inventory = function(self, player) + local _, inv = self:get_valid_player(player, "[load_armor_inventory]") + if inv then + local meta = player:get_meta() + local armor_list_string = meta:get_string("3d_armor_inventory") + if armor_list_string then + inv:set_list("armor", + self:deserialize_inventory_list(armor_list_string)) + return true + end + end +end + +--- Saves armor inventory. +-- +-- Inventory is stored in `PlayerMetaRef` string "3d\_armor\_inventory". +-- +-- @function armor:save_armor_inventory +-- @tparam ObjectRef player +armor.save_armor_inventory = function(self, player) + local _, inv = self:get_valid_player(player, "[save_armor_inventory]") + if inv then + local meta = player:get_meta() + meta:set_string("3d_armor_inventory", + self:serialize_inventory_list(inv:get_list("armor"))) + end +end + +--- Updates inventory. +-- +-- DEPRECATED: Legacy inventory support. +-- +-- @function armor:update_inventory +-- @param player +armor.update_inventory = function(self, player) + -- DEPRECATED: Legacy inventory support +end + +--- Sets inventory stack. +-- +-- @function armor:set_inventory_stack +-- @tparam ObjectRef player +-- @tparam int i Armor inventory index. +-- @tparam ItemStack stack Armor item. +armor.set_inventory_stack = function(self, player, i, stack) + local _, inv = self:get_valid_player(player, "[set_inventory_stack]") + if inv then + inv:set_stack("armor", i, stack) + self:save_armor_inventory(player) + end +end + +--- Checks for a player that can use armor. +-- +-- @function armor:get_valid_player +-- @tparam ObjectRef player +-- @tparam string msg Additional info for log messages. +-- @treturn list Player name & armor inventory. +-- @usage local name, inv = armor:get_valid_player(player, "[equip]") +armor.get_valid_player = function(self, player, msg) + msg = msg or "" + if not player then + minetest.log("warning", ("3d_armor%s: Player reference is nil"):format(msg)) + return + end + if type(player) ~= "userdata" then + -- Fake player, fail silently + return + end + local name = player:get_player_name() + if not name then + minetest.log("warning", ("3d_armor%s: Player name is nil"):format(msg)) + return + end + local inv = minetest.get_inventory({type="detached", name=name.."_armor"}) + if not inv then + -- This check may fail when called inside `on_joinplayer` + -- in that case, the armor will be initialized/updated later on + minetest.log("warning", ("3d_armor%s: Detached armor inventory is nil"):format(msg)) + return + end + return name, inv +end + +--- Drops armor item at given position. +-- +-- @tparam vector pos +-- @tparam ItemStack stack Armor item to be dropped. +armor.drop_armor = function(pos, stack) + local node = minetest.get_node_or_nil(pos) + if node then + local obj = minetest.add_item(pos, stack) + if obj then + obj:set_velocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) + end + end +end + +--- Allows skin mod to be set manually. +-- +-- Useful for skin mod forks that do not use the same name. +-- +-- @tparam string mod Name of skin mod. Recognized names are "simple\_skins", "u\_skins", & "wardrobe". +armor.set_skin_mod = function(mod) + skin_mod = mod +end diff --git a/mods/3d_armor/3d_armor/armor.conf.example b/mods/3d_armor/3d_armor/armor.conf.example new file mode 100644 index 00000000..ee63812a --- /dev/null +++ b/mods/3d_armor/3d_armor/armor.conf.example @@ -0,0 +1,62 @@ +-- DEPRECATED, will not be supported in future versions + +-- See README.txt for new configuration options. + +-- Armor Configuration (defaults) + +-- You can remove any unwanted armor materials from this table. +-- Note that existing armor that is removed will show up as an unknown item. +ARMOR_MATERIALS = { + wood = "group:wood", + cactus = "default:cactus", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + diamond = "default:diamond", + gold = "default:gold_ingot", + mithril = "moreores:mithril_ingot", + crystal = "ethereal:crystal_ingot", + nether = "nether:nether_ingot", +} + +-- Enable fire protection (defaults true if using ethereal mod) +ARMOR_FIRE_PROTECT = false + +-- Fire protection nodes, (name, protection level, damage) +ARMOR_FIRE_NODES = { + {"default:lava_source", 5, 4}, + {"default:lava_flowing", 5, 4}, + {"fire:basic_flame", 3, 4}, + {"fire:permanent_flame", 3, 4}, + {"ethereal:crystal_spike", 2, 1}, + {"ethereal:fire_flower", 2, 1}, + {"default:torch", 1, 1}, +} + +-- Increase this if you get initialization glitches when a player first joins. +ARMOR_INIT_DELAY = 1 + +-- Increase this if armor is not getting into bones due to server lag. +ARMOR_BONES_DELAY = 1 + +-- How often player armor/wield items are updated. +ARMOR_UPDATE_TIME = 1 + +-- Drop armor when a player dies. +-- Uses bones mod if present, otherwise items are dropped around the player. +ARMOR_DROP = true + +-- Pulverise armor when a player dies, overrides ARMOR_DROP. +ARMOR_DESTROY = false + +-- You can use this to increase or decrease overall armor effectiveness, +-- eg: ARMOR_LEVEL_MULTIPLIER = 0.5 will reduce armor level by half. +ARMOR_LEVEL_MULTIPLIER = 1 + +-- You can use this to increase or decrease overall armor healing, +-- eg: ARMOR_HEAL_MULTIPLIER = 0 will disable healing altogether. +ARMOR_HEAL_MULTIPLIER = 1 + +-- You can use this to increase or decrease overall armor radiation protection, +-- eg: ARMOR_RADIATION_MULTIPLIER = 0 will completely disable radiation protection. +-- Note: patched technic mod is required +ARMOR_RADIATION_MULTIPLIER = 1 diff --git a/mods/3d_armor/3d_armor/crafting_guide.txt b/mods/3d_armor/3d_armor/crafting_guide.txt new file mode 100644 index 00000000..1a121d87 --- /dev/null +++ b/mods/3d_armor/3d_armor/crafting_guide.txt @@ -0,0 +1,84 @@ +3d_armor -- Crafting Guide +-------------------------- + +Helmets: + ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | | X | ++---+---+---+ +| | | | ++---+---+---+ + +[3d_armor:helmet_wood] X = [default:wood] +[3d_armor:helmet_cactus] X = [default:cactus] +[3d_armor:helmet_steel] X = [default:steel_ingot] +[3d_armor:helmet_bronze] X = [default:bronze_ingot] +[3d_armor:helmet_diamond] X = [default:diamond] +[3d_armor:helmet_gold] X = [default:gold_ingot] +[3d_armor:helmet_mithril] X = [moreores:mithril_ingot] * +[3d_armor:helmet_crystal] X = [ethereal:crystal_ingot] ** +[3d_armor:helmet_nether] X = [ethereal:nether_ingot] ** + +Chestplates: + ++---+---+---+ +| X | | X | ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | X | X | ++---+---+---+ + +[3d_armor:chestplate_wood] X = [default:wood] +[3d_armor:chestplate_cactus] X = [default:cactus] +[3d_armor:chestplate_steel] X = [default:steel_ingot] +[3d_armor:chestplate_bronze] X = [default:bronze_ingot] +[3d_armor:chestplate_diamond] X = [default:diamond] +[3d_armor:chestplate_gold] X = [default:gold_ingot] +[3d_armor:chestplate_mithril] X = [moreores:mithril_ingot] * +[3d_armor:chestplate_crystal] X = [ethereal:crystal_ingot] ** +[3d_armor:chestplate_nether] X = [ethereal:nether_ingot] ** + +Leggings: + ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | | X | ++---+---+---+ +| X | | X | ++---+---+---+ + +[3d_armor:leggings_wood] X = [default:wood] +[3d_armor:leggings_cactus] X = [default:cactus] +[3d_armor:leggings_steel] X = [default:steel_ingot] +[3d_armor:leggings_bronze] X = [default:bronze_ingot] +[3d_armor:leggings_diamond] X = [default:diamond] +[3d_armor:leggings_gold] X = [default:gold_ingot] +[3d_armor:leggings_mithril] X = [moreores:mithril_ingot] * +[3d_armor:leggings_crystal] X = [ethereal:crystal_ingot] ** +[3d_armor:leggings_nether] X = [ethereal:nether_ingot] ** + +Boots: + ++---+---+---+ +| X | | X | ++---+---+---+ +| X | | X | ++---+---+---+ + +[3d_armor:boots_wood] X = [default:wood] +[3d_armor:boots_cactus] X = [default:cactus] +[3d_armor:boots_steel] X = [default:steel_ingot] +[3d_armor:boots_bronze] X = [default:bronze_ingot +[3d_armor:boots_diamond] X = [default:diamond] +[3d_armor:boots_gold] X = [default:gold_ingot] +[3d_armor:boots_mithril] X = [moreores:mithril_ingot] * +[3d_armor:boots_crystal] X = [ethereal:crystal_ingot] ** +[3d_armor:boots_nether] X = [ethereal:nether_ingot] ** + + * Requires moreores mod by Calinou - https://forum.minetest.net/viewtopic.php?id=549 +** Requires ethereal mod by Chinchow & TenPlus1 - https://github.com/tenplus1/ethereal +** Requires nether mod - https://github.com/minetest-mods/nether.git diff --git a/mods/3d_armor/3d_armor/init.lua b/mods/3d_armor/3d_armor/init.lua new file mode 100644 index 00000000..c8c383ae --- /dev/null +++ b/mods/3d_armor/3d_armor/init.lua @@ -0,0 +1,502 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local worldpath = minetest.get_worldpath() +local last_punch_time = {} +local timer = 0 + +dofile(modpath.."/api.lua") + +-- local functions +local F = minetest.formspec_escape +local S = armor.get_translator + +-- integration test +if minetest.settings:get_bool("enable_3d_armor_integration_test") then + dofile(modpath.."/integration_test.lua") +end + + +-- Legacy Config Support + +local input = io.open(modpath.."/armor.conf", "r") +if input then + dofile(modpath.."/armor.conf") + input:close() +end +input = io.open(worldpath.."/armor.conf", "r") +if input then + dofile(worldpath.."/armor.conf") + input:close() +end +for name, _ in pairs(armor.config) do + local global = "ARMOR_"..name:upper() + if minetest.global_exists(global) then + armor.config[name] = _G[global] + end +end +if minetest.global_exists("ARMOR_MATERIALS") then + armor.materials = table.copy(ARMOR_MATERIALS) +end +if minetest.global_exists("ARMOR_FIRE_NODES") then + armor.fire_nodes = table.copy(ARMOR_FIRE_NODES) +end + +-- Load Configuration + +for name, config in pairs(armor.config) do + local setting = minetest.settings:get("armor_"..name) + if type(config) == "number" then + setting = tonumber(setting) + elseif type(config) == "string" then + setting = tostring(setting) + elseif type(config) == "boolean" then + setting = minetest.settings:get_bool("armor_"..name) + end + if setting ~= nil then + armor.config[name] = setting + end +end +for material, _ in pairs(armor.materials) do + local key = "material_"..material + if armor.config[key] == false then + armor.materials[material] = nil + end +end + +-- Convert set_elements to a Lua table splitting on blank spaces +local t_set_elements = armor.config.set_elements +armor.config.set_elements = string.split(t_set_elements, " ") + +-- Remove torch damage if fire_protect_torch == false +if armor.config.fire_protect_torch == false and armor.config.fire_protect == true then + for k,v in pairs(armor.fire_nodes) do + for k2,v2 in pairs(v) do + if string.find (v2,"torch") then + armor.fire_nodes[k] = nil + end + end + end +end + +-- Mod Compatibility + +if minetest.get_modpath("technic") then + armor.formspec = armor.formspec.. + "label[5,2.5;"..F(S("Radiation"))..": armor_group_radiation]" + armor:register_armor_group("radiation") +end +local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"} +for _, mod in pairs(skin_mods) do + local path = minetest.get_modpath(mod) + if path then + local dir_list = minetest.get_dir_list(path.."/textures") + for _, fn in pairs(dir_list) do + if fn:find("_preview.png$") then + armor:add_preview(fn) + end + end + armor.set_skin_mod(mod) + end +end + + +-- Armor Initialization + +armor.formspec = armor.formspec.. + "label[5,1;"..F(S("Level"))..": armor_level]".. + "label[5,1.5;"..F(S("Heal"))..": armor_attr_heal]" +if armor.config.fire_protect then + armor.formspec = armor.formspec.."label[5,2;"..F(S("Fire"))..": armor_attr_fire]" +end +armor:register_on_damage(function(player, index, stack) + local name = player:get_player_name() + local def = stack:get_definition() + if name and def and def.description and stack:get_wear() > 60100 then + minetest.chat_send_player(name, S("Your @1 is almost broken!", def.description)) + minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0}) + end +end) +armor:register_on_destroy(function(player, index, stack) + local name = player:get_player_name() + local def = stack:get_definition() + if name and def and def.description then + minetest.chat_send_player(name, S("Your @1 got destroyed!", def.description)) + minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0}) + end +end) + +local function validate_armor_inventory(player) + -- Workaround for detached inventory swap exploit + local _, inv = armor:get_valid_player(player, "[validate_armor_inventory]") + local pos = player:get_pos() + if not inv then + return + end + local armor_prev = {} + local attribute_meta = player:get_meta() -- I know, the function's name is weird but let it be like that. ;) + local armor_list_string = attribute_meta:get_string("3d_armor_inventory") + if armor_list_string then + local armor_list = armor:deserialize_inventory_list(armor_list_string) + for i, stack in ipairs(armor_list) do + if stack:get_count() > 0 then + armor_prev[stack:get_name()] = i + end + end + end + local elements = {} + local player_inv = player:get_inventory() + for i = 1, 6 do + local stack = inv:get_stack("armor", i) + if stack:get_count() > 0 then + local item = stack:get_name() + local element = armor:get_element(item) + if element and not elements[element] then + if armor_prev[item] then + armor_prev[item] = nil + else + -- Item was not in previous inventory + armor:run_callbacks("on_equip", player, i, stack) + end + elements[element] = true; + else + inv:remove_item("armor", stack) + minetest.item_drop(stack, player, pos) + -- The following code returns invalid items to the player's main + -- inventory but could open up the possibity for a hacked client + -- to receive items back they never really had. I am not certain + -- so remove the is_singleplayer check at your own risk :] + if minetest.is_singleplayer() and player_inv and + player_inv:room_for_item("main", stack) then + player_inv:add_item("main", stack) + end + end + end + end + for item, i in pairs(armor_prev) do + local stack = ItemStack(item) + -- Previous item is not in current inventory + armor:run_callbacks("on_unequip", player, i, stack) + end +end + +local function init_player_armor(initplayer) + local name = assert(initplayer:get_player_name()) + local armor_inv = minetest.create_detached_inventory(name.."_armor", { + on_put = function(inv, listname, index, stack, player) + validate_armor_inventory(player) + armor:save_armor_inventory(player) + armor:set_player_armor(player) + end, + on_take = function(inv, listname, index, stack, player) + validate_armor_inventory(player) + armor:save_armor_inventory(player) + armor:set_player_armor(player) + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + validate_armor_inventory(player) + armor:save_armor_inventory(player) + armor:set_player_armor(player) + end, + allow_put = function(inv, listname, index, put_stack, player) + if player:get_player_name() ~= name then + return 0 + end + local element = armor:get_element(put_stack:get_name()) + if not element then + return 0 + end + for i = 1, 6 do + local stack = inv:get_stack("armor", i) + local def = stack:get_definition() or {} + if def.groups and def.groups["armor_"..element] + and i ~= index then + return 0 + end + end + return 1 + end, + allow_take = function(inv, listname, index, stack, player) + if player:get_player_name() ~= name then + return 0 + end + --cursed items cannot be unequiped by the player + local is_cursed = minetest.get_item_group(stack:get_name(), "cursed") ~= 0 + if not minetest.is_creative_enabled(player) and is_cursed then + return 0 + end + return stack:get_count() + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if player:get_player_name() ~= name then + return 0 + end + return count + end, + }, name) + armor_inv:set_size("armor", 6) + if not armor:load_armor_inventory(initplayer) and armor.migrate_old_inventory then + local player_inv = initplayer:get_inventory() + player_inv:set_size("armor", 6) + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + armor_inv:set_stack("armor", i, stack) + end + armor:save_armor_inventory(initplayer) + player_inv:set_size("armor", 0) + end + for i=1, 6 do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + armor:run_callbacks("on_equip", initplayer, i, stack) + end + end + armor.def[name] = { + level = 0, + state = 0, + count = 0, + groups = {}, + } + for _, phys in pairs(armor.physics) do + armor.def[name][phys] = 1 + end + for _, attr in pairs(armor.attributes) do + armor.def[name][attr] = 0 + end + for group, _ in pairs(armor.registered_groups) do + armor.def[name].groups[group] = 0 + end + local skin = armor:get_player_skin(name) + armor.textures[name] = { + skin = skin, + armor = "blank.png", + wielditem = "blank.png", + preview = armor.default_skin.."_preview.png", + } + local texture_path = minetest.get_modpath("player_textures") + if texture_path then + local dir_list = minetest.get_dir_list(texture_path.."/textures") + for _, fn in pairs(dir_list) do + if fn == "player_"..name..".png" then + armor.textures[name].skin = fn + break + end + end + end + armor:set_player_armor(initplayer) +end + +-- Armor Player Model + +player_api.register_model("3d_armor_character.b3d", { + animation_speed = 30, + textures = { + armor.default_skin..".png", + "blank.png", + "blank.png", + }, + animations = { + stand = {x=0, y=79}, + lay = {x=162, y=166, eye_height = 0.3, override_local = true, + collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}}, + walk = {x=168, y=187}, + mine = {x=189, y=198}, + walk_mine = {x=200, y=219}, + sit = {x=81, y=160, eye_height = 0.8, override_local = true, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}}, + -- compatibility w/ the emote mod + wave = {x = 192, y = 196, override_local = true}, + point = {x = 196, y = 196, override_local = true}, + freeze = {x = 205, y = 205, override_local = true}, + }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + -- stepheight: use default + eye_height = 1.47, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = armor:get_valid_player(player, "[on_player_receive_fields]") + if not name then + return + end + local player_name = player:get_player_name() + for field, _ in pairs(fields) do + if string.find(field, "skins_set") then + armor:update_skin(player_name) + end + end +end) + +minetest.register_on_joinplayer(function(player) + player_api.set_model(player, "3d_armor_character.b3d") + init_player_armor(player) +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + if name then + armor.def[name] = nil + armor.textures[name] = nil + end +end) + +if armor.config.drop == true or armor.config.destroy == true then + minetest.register_on_dieplayer(function(player) + local name, armor_inv = armor:get_valid_player(player, "[on_dieplayer]") + if not name then + return + end + local drop = {} + for i=1, armor_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + --soulbound armors remain equipped after death + if minetest.get_item_group(stack:get_name(), "soulbound") == 0 then + table.insert(drop, stack) + armor:run_callbacks("on_unequip", player, i, stack) + armor_inv:set_stack("armor", i, nil) + end + end + end + armor:save_armor_inventory(player) + armor:set_player_armor(player) + local pos = player:get_pos() + if pos and armor.config.destroy == false then + minetest.after(armor.config.bones_delay, function() + local meta = nil + local maxp = vector.add(pos, 16) + local minp = vector.subtract(pos, 16) + local bones = minetest.find_nodes_in_area(minp, maxp, {"bones:bones"}) + for _, p in pairs(bones) do + local m = minetest.get_meta(p) + if m:get_string("owner") == name then + meta = m + break + end + end + if meta then + local inv = meta:get_inventory() + for _,stack in ipairs(drop) do + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + armor.drop_armor(pos, stack) + end + end + else + for _,stack in ipairs(drop) do + armor.drop_armor(pos, stack) + end + end + end) + end + end) + minetest.register_on_respawnplayer(function(player) + -- reset un-dropped armor and it's effects + armor:set_player_armor(player) + end) +end + +if armor.config.punch_damage == true then + minetest.register_on_punchplayer(function(player, hitter, + time_from_last_punch, tool_capabilities) + local name = player:get_player_name() + if hitter then + local hit_ip = hitter:is_player() + if name and hit_ip and minetest.is_protected(player:get_pos(), "") then + return + end + end + + if name then + armor:punch(player, hitter, time_from_last_punch, tool_capabilities) + last_punch_time[name] = minetest.get_gametime() + end + end) +end + +minetest.register_on_player_hpchange(function(player, hp_change, reason) + if not minetest.is_player(player) then + return hp_change + end + + if reason.type == "drown" or reason.hunger or hp_change >= 0 then + return hp_change + end + + local name = player:get_player_name() + local properties = player:get_properties() + local hp = player:get_hp() + if hp + hp_change < properties.hp_max then + local heal = armor.def[name].heal + if heal >= math.random(100) then + hp_change = 0 + end + -- check if armor damage was handled by fire or on_punchplayer + local time = last_punch_time[name] or 0 + if time == 0 or time + 1 < minetest.get_gametime() then + armor:punch(player) + end + end + + return hp_change +end, true) + +minetest.register_globalstep(function(dtime) + timer = timer + dtime + + if armor.config.feather_fall == true then + for _,player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if armor.def[name].feather > 0 then + local vel_y = player:get_velocity().y + if vel_y < -0.5 then + vel_y = -(vel_y * 0.05) + player:add_velocity({x = 0, y = vel_y, z = 0}) + end + end + end + end + + if timer <= armor.config.init_delay then + return + end + timer = 0 + + -- water breathing protection, added by TenPlus1 + if armor.config.water_protect == true then + for _,player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if armor.def[name].water > 0 and + player:get_breath() < 10 then + player:set_breath(10) + end + end + end +end) + +if armor.config.fire_protect == true then + + -- don't make torches hurt :D + --minetest.override_item("default:torch", {damage_per_second = 1}) + --minetest.override_item("default:torch_wall", {damage_per_second = 1}) + --minetest.override_item("default:torch_ceiling", {damage_per_second = 1}) + + -- check player damage for any hot nodes we may be protected against + minetest.register_on_player_hpchange(function(player, hp_change, reason) + + if reason.type == "node_damage" and reason.node then + -- fire protection + if armor.config.fire_protect == true and hp_change < 0 then + local name = player:get_player_name() + for _,igniter in pairs(armor.fire_nodes) do + if reason.node == igniter[1] then + if armor.def[name].fire >= igniter[2] then + hp_change = 0 + end + end + end + end + end + return hp_change + end, true) +end diff --git a/mods/3d_armor/3d_armor/integration_test.lua b/mods/3d_armor/3d_armor/integration_test.lua new file mode 100644 index 00000000..65e9dfd1 --- /dev/null +++ b/mods/3d_armor/3d_armor/integration_test.lua @@ -0,0 +1,25 @@ + +minetest.log("warning", "[TEST] integration-test enabled!") + +minetest.register_on_mods_loaded(function() + minetest.after(1, function() + + local data = minetest.write_json({ success = true }, true); + local file = io.open(minetest.get_worldpath().."/integration_test.json", "w" ); + if file then + file:write(data) + file:close() + end + + file = io.open(minetest.get_worldpath().."/registered_nodes.txt", "w" ); + if file then + for name in pairs(minetest.registered_nodes) do + file:write(name .. '\n') + end + file:close() + end + + minetest.log("warning", "[TEST] integration tests done!") + minetest.request_shutdown("success") + end) +end) diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.de.tr b/mods/3d_armor/3d_armor/locale/3d_armor.de.tr new file mode 100644 index 00000000..f5190774 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.de.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Strahlung +Level=Stufe +Heal=Heilung +Fire=Feuer +Your @1 is almost broken!=@1 ist fast kaputt! +Your @1 got destroyed!=@1 wurde zerstört! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr b/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr new file mode 100644 index 00000000..e3e1a2df --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiado +Level=Nivelo +Heal=BlokÅanco +Fire=Fajro +Your @1 is almost broken!=Via @1 estas preskaÅ­ rompita! +Your @1 got destroyed!=Via @1 detruiÄis! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.es.tr b/mods/3d_armor/3d_armor/locale/3d_armor.es.tr new file mode 100644 index 00000000..cf79d05e --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.es.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiación +Level=Nivel +Heal=Salud +Fire=Fuego +Your @1 is almost broken!=¡Tu @1 esta a punto de romperse! +Your @1 got destroyed!=¡Tu @1 fue destruído! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr b/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr new file mode 100644 index 00000000..5d2a4fa0 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiation +Level=Niveau +Heal=Soins +Fire=Fire +Your @1 is almost broken!=Une partie de votre armure est presque détruite : @1 ! +Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.it.tr b/mods/3d_armor/3d_armor/locale/3d_armor.it.tr new file mode 100644 index 00000000..8d1184d9 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.it.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiazione +Level=Livello +Heal=Guarigione +Fire=Fuoco +Your @1 is almost broken!=@1 quasi in frantumi! +Your @1 got destroyed!=@1 in frantumi! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr b/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr new file mode 100644 index 00000000..8d55a24f --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiasi +Level=Tahap +Heal=Pulih +Fire=Api +Your @1 is almost broken!= +Your @1 got destroyed!=@1 anda telah musnah! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr new file mode 100644 index 00000000..2e3815b2 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Promieniowanie +Level=Poziom +Heal=Uzdrawianie +Fire=OgieÅ„ +Your @1 is almost broken!=Twój @1 jest prawie zepsuty! +Your @1 got destroyed!=Twój @1 zostaÅ‚ zniszczony! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr new file mode 100644 index 00000000..4ccba88e --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiação +Level=Nível +Heal=Saúde +Fire=Fogo +Your @1 is almost broken!= +Your @1 got destroyed!=@1 foi destruído(a)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr new file mode 100644 index 00000000..4ccba88e --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiação +Level=Nível +Heal=Saúde +Fire=Fogo +Your @1 is almost broken!= +Your @1 got destroyed!=@1 foi destruído(a)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr b/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr new file mode 100644 index 00000000..afbc441a --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=излучение +Level=уровень +Heal=иÑцеление +Fire=огонь +Your @1 is almost broken!= +Your @1 got destroyed!=твой(и) @1 был(и) разрушен(Ñ‹)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr b/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr new file mode 100644 index 00000000..08b7ee1e --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=StrÃ¥lning +Level=NivÃ¥ +Heal=Läkning +Fire=Eld +Your @1 is almost broken!=Din @1 är nästan förstörd! +Your @1 got destroyed!=Din @1 blev förstörd! diff --git a/mods/3d_armor/3d_armor/locale/template.txt b/mods/3d_armor/3d_armor/locale/template.txt new file mode 100644 index 00000000..5e4e65c1 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation= +Level= +Heal= +Fire= +Your @1 is almost broken!= +Your @1 got destroyed!= diff --git a/mods/3d_armor/3d_armor/mod.conf b/mods/3d_armor/3d_armor/mod.conf new file mode 100644 index 00000000..167c2a18 --- /dev/null +++ b/mods/3d_armor/3d_armor/mod.conf @@ -0,0 +1,5 @@ +name = 3d_armor +depends = default, player_api +optional_depends = player_monoids, armor_monoid, pova, moreores +description = Adds craftable armor that is visible to other players. +min_minetest_version = 5.0 diff --git a/mods/3d_armor/3d_armor/models/3d_armor_character.b3d b/mods/3d_armor/3d_armor/models/3d_armor_character.b3d new file mode 100644 index 00000000..c4d45b50 Binary files /dev/null and b/mods/3d_armor/3d_armor/models/3d_armor_character.b3d differ diff --git a/mods/3d_armor/3d_armor/textures/character_preview.png b/mods/3d_armor/3d_armor/textures/character_preview.png new file mode 100644 index 00000000..82a0ae45 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/character_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png b/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png new file mode 100644 index 00000000..7f7d63e5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png differ diff --git a/mods/3d_armor/3d_armor/tools/README.md b/mods/3d_armor/3d_armor/tools/README.md new file mode 100644 index 00000000..6aa7ffed --- /dev/null +++ b/mods/3d_armor/3d_armor/tools/README.md @@ -0,0 +1,7 @@ +# Intllib tool + +please consider using the intllib tool to update locale files: + +```../../intllib/tools/xgettext.sh ../**/*.lua``` + +make sure you are in `3d_armor` derectory before running this command diff --git a/mods/3d_armor/3d_armor_ip/init.lua b/mods/3d_armor/3d_armor_ip/init.lua new file mode 100644 index 00000000..d01365d2 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/init.lua @@ -0,0 +1,38 @@ +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape + +if not minetest.global_exists("inventory_plus") then + minetest.log("warning", "3d_armor_ip: Mod loaded but unused.") + return +end + +armor.formspec = "size[8,8.5]button[6,0;2,0.5;main;"..F(S("Back")).."]"..armor.formspec +armor:register_on_update(function(player) + local name = player:get_player_name() + local formspec = armor:get_armor_formspec(name, true) + local page = player:get_inventory_formspec() + if page:find("detached:"..name.."_armor") then + inventory_plus.set_inventory_formspec(player, formspec) + end +end) + +if minetest.get_modpath("crafting") then + inventory_plus.get_formspec = function(player, page) + end +end + +minetest.register_on_joinplayer(function(player) + inventory_plus.register_button(player,"armor", S("Armor")) +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.armor then + local name = armor:get_valid_player(player, "[on_player_receive_fields]") + if not name then + return + end + local formspec = armor:get_armor_formspec(name, true) + inventory_plus.set_inventory_formspec(player, formspec) + end +end) diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr new file mode 100644 index 00000000..f15fd317 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Zurück +Armor=Rüstung diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr new file mode 100644 index 00000000..f84e706c --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Dorso +Armor=Armaĵo diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr new file mode 100644 index 00000000..8a6595f6 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Retour +Armor=Armure diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr new file mode 100644 index 00000000..4a8f8203 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Voltar +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr new file mode 100644 index 00000000..e2d778bc --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Tillbaka +Armor=Rustning diff --git a/mods/3d_armor/3d_armor_ip/locale/template.txt b/mods/3d_armor/3d_armor_ip/locale/template.txt new file mode 100644 index 00000000..c21c6aaa --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back= +Armor= diff --git a/mods/3d_armor/3d_armor_ip/mod.conf b/mods/3d_armor/3d_armor_ip/mod.conf new file mode 100644 index 00000000..0fe7f4e3 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/mod.conf @@ -0,0 +1,4 @@ +name = 3d_armor_ip +depends = 3d_armor +optional_depends = inventory_plus +description = Adds 3d_armor page to the inventory plus. diff --git a/mods/3d_armor/3d_armor_sfinv/init.lua b/mods/3d_armor/3d_armor_sfinv/init.lua new file mode 100644 index 00000000..f99c2440 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/init.lua @@ -0,0 +1,21 @@ +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +if not minetest.global_exists("sfinv") then + minetest.log("warning", "3d_armor_sfinv: Mod loaded but unused.") + return +end + +sfinv.register_page("3d_armor:armor", { + title = S("Armor"), + get = function(self, player, context) + local name = player:get_player_name() + local formspec = armor:get_armor_formspec(name, true) + return sfinv.make_formspec(player, context, formspec, false) + end +}) +armor:register_on_update(function(player) + if sfinv.enabled then + sfinv.set_player_inventory_formspec(player) + end +end) diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr new file mode 100644 index 00000000..b597332b --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Rüstung diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr new file mode 100644 index 00000000..7cc47ce8 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armaĵoj diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr new file mode 100644 index 00000000..dd0a0026 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr new file mode 100644 index 00000000..bdaf2a0a --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armure diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr new file mode 100644 index 00000000..dd0a0026 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr new file mode 100644 index 00000000..14972b78 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Rustning diff --git a/mods/3d_armor/3d_armor_sfinv/locale/template.txt b/mods/3d_armor/3d_armor_sfinv/locale/template.txt new file mode 100644 index 00000000..954dcf32 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor= diff --git a/mods/3d_armor/3d_armor_sfinv/mod.conf b/mods/3d_armor/3d_armor_sfinv/mod.conf new file mode 100644 index 00000000..bc0eb898 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/mod.conf @@ -0,0 +1,4 @@ +name = 3d_armor_sfinv +depends = 3d_armor +optional_depends = sfinv +description = Adds 3d_armor page to the sfinv inventory. diff --git a/mods/3d_armor/3d_armor_stand/README.txt b/mods/3d_armor/3d_armor_stand/README.txt new file mode 100644 index 00000000..6a98ab99 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/README.txt @@ -0,0 +1,21 @@ +[mod] 3d Armor Stand [3d_armor_stand] +===================================== + +Depends: 3d_armor + +Adds a chest-like armor stand for armor storage and display. + +Crafting +-------- + +F = Wooden Fence [default:fence_wood] +S = Steel Ingot [default:steel_ingot] + ++---+---+---+ +| | F | | ++---+---+---+ +| | F | | ++---+---+---+ +| S | S | S | ++---+---+---+ + diff --git a/mods/3d_armor/3d_armor_stand/init.lua b/mods/3d_armor/3d_armor_stand/init.lua new file mode 100644 index 00000000..83c29d03 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/init.lua @@ -0,0 +1,445 @@ +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +local armor_stand_formspec = "size[8,7]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + default.get_hotbar_bg(0,3) .. + "list[current_name;armor_head;3,0.5;1,1;]" .. + "list[current_name;armor_torso;4,0.5;1,1;]" .. + "list[current_name;armor_legs;3,1.5;1,1;]" .. + "list[current_name;armor_feet;4,1.5;1,1;]" .. + "image[3,0.5;1,1;3d_armor_stand_head.png]" .. + "image[4,0.5;1,1;3d_armor_stand_torso.png]" .. + "image[3,1.5;1,1;3d_armor_stand_legs.png]" .. + "image[4,1.5;1,1;3d_armor_stand_feet.png]" .. + "list[current_player;main;0,3;8,1;]" .. + "list[current_player;main;0,4.25;8,3;8]" + +local elements = {"head", "torso", "legs", "feet"} + +local function drop_armor(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + local stack = inv:get_stack("armor_"..element, 1) + if stack and stack:get_count() > 0 then + armor.drop_armor(pos, stack) + inv:set_stack("armor_"..element, 1, nil) + end + end +end + +local function get_stand_object(pos) + local object = nil + local objects = minetest.get_objects_inside_radius(pos, 0.5) or {} + for _, obj in pairs(objects) do + local ent = obj:get_luaentity() + if ent then + if ent.name == "3d_armor_stand:armor_entity" then + -- Remove duplicates + if object then + obj:remove() + else + object = obj + end + end + end + end + return object +end + +local function update_entity(pos) + local node = minetest.get_node(pos) + local object = get_stand_object(pos) + if object then + if not string.find(node.name, "3d_armor_stand:") then + object:remove() + return + end + else + object = minetest.add_entity(pos, "3d_armor_stand:armor_entity") + end + if object then + local texture = "blank.png" + local textures = {} + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local yaw = 0 + if inv then + for _, element in pairs(elements) do + local stack = inv:get_stack("armor_"..element, 1) + if stack:get_count() == 1 then + local item = stack:get_name() or "" + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups["armor_"..element] then + if def.texture then + table.insert(textures, def.texture) + else + table.insert(textures, item:gsub("%:", "_")..".png") + end + end + end + end + end + if #textures > 0 then + texture = table.concat(textures, "^") + end + if node.param2 then + local rot = node.param2 % 4 + if rot == 1 then + yaw = 3 * math.pi / 2 + elseif rot == 2 then + yaw = math.pi + elseif rot == 3 then + yaw = math.pi / 2 + end + end + object:set_yaw(yaw) + object:set_properties({textures={texture}}) + end +end + +local function has_locked_armor_stand_privilege(meta, player) + local name = "" + if player then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + name = player:get_player_name() + end + if name ~= meta:get_string("owner") then + return false + end + return true +end + +local function add_hidden_node(pos, player) + local p = {x=pos.x, y=pos.y + 1, z=pos.z} + local name = player:get_player_name() + local node = minetest.get_node(p) + if node.name == "air" and not minetest.is_protected(pos, name) then + minetest.set_node(p, {name="3d_armor_stand:top"}) + end +end + +local function remove_hidden_node(pos) + local p = {x=pos.x, y=pos.y + 1, z=pos.z} + local node = minetest.get_node(p) + if node.name == "3d_armor_stand:top" then + minetest.remove_node(p) + end +end + +minetest.register_node("3d_armor_stand:top", { + description = S("Armor Stand Top"), + paramtype = "light", + drawtype = "plantlike", + sunlight_propagates = true, + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, + on_blast = function() end, + tiles = {"blank.png"}, +}) + +minetest.register_node("3d_armor_stand:armor_stand", { + description = S("Armor Stand"), + drawtype = "mesh", + mesh = "3d_armor_stand.obj", + tiles = {"3d_armor_stand.png"}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, + groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", armor_stand_formspec) + meta:set_string("infotext", S("Armor Stand")) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + inv:set_size("armor_"..element, 1) + end + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + if not inv:is_empty("armor_"..element) then + return false + end + end + return true + end, + after_place_node = function(pos, placer) + minetest.add_entity(pos, "3d_armor_stand:armor_entity") + add_hidden_node(pos, placer) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack) + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups[listname] then + return 1 + end + return 0 + end, + allow_metadata_inventory_move = function(pos) + return 0 + end, + on_metadata_inventory_put = function(pos) + update_entity(pos) + end, + on_metadata_inventory_take = function(pos) + update_entity(pos) + end, + after_destruct = function(pos) + update_entity(pos) + remove_hidden_node(pos) + end, + on_blast = function(pos) + drop_armor(pos) + armor.drop_armor(pos, "3d_armor_stand:armor_stand") + minetest.remove_node(pos) + end, +}) + +minetest.register_node("3d_armor_stand:locked_armor_stand", { + description = S("Locked Armor Stand"), + drawtype = "mesh", + mesh = "3d_armor_stand.obj", + tiles = {"3d_armor_stand_locked.png"}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, + groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", armor_stand_formspec) + meta:set_string("infotext", S("Armor Stand")) + meta:set_string("owner", "") + local inv = meta:get_inventory() + for _, element in pairs(elements) do + inv:set_size("armor_"..element, 1) + end + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + if not inv:is_empty("armor_"..element) then + return false + end + end + return true + end, + after_place_node = function(pos, placer) + minetest.add_entity(pos, "3d_armor_stand:armor_entity") + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", S("Armor Stand (owned by @1)", meta:get_string("owner"))) + add_hidden_node(pos, placer) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_armor_stand_privilege(meta, player) then + return 0 + end + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups[listname] then + return 1 + end + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_armor_stand_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos) + return 0 + end, + on_metadata_inventory_put = function(pos) + update_entity(pos) + end, + on_metadata_inventory_take = function(pos) + update_entity(pos) + end, + after_destruct = function(pos) + update_entity(pos) + remove_hidden_node(pos) + end, + on_blast = function(pos) + -- Not affected by TNT + end, +}) + +minetest.register_node("3d_armor_stand:shared_armor_stand", { + description = S("Shared Armor Stand"), + drawtype = "mesh", + mesh = "3d_armor_stand.obj", + tiles = {"3d_armor_stand_shared.png"}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, + groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", armor_stand_formspec) + meta:set_string("infotext", S("Shared Armor Stand")) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + inv:set_size("armor_"..element, 1) + end + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + if not inv:is_empty("armor_"..element) then + return false + end + end + return true + end, + after_place_node = function(pos, placer) + minetest.add_entity(pos, "3d_armor_stand:armor_entity") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Shared Armor Stand")) + add_hidden_node(pos, placer) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups[listname] then + return 1 + end + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos) + return 0 + end, + on_metadata_inventory_put = function(pos) + update_entity(pos) + end, + on_metadata_inventory_take = function(pos) + update_entity(pos) + end, + after_destruct = function(pos) + update_entity(pos) + remove_hidden_node(pos) + end, + on_blast = function(pos) + -- Not affected by TNT + end, +}) + +minetest.register_entity("3d_armor_stand:armor_entity", { + initial_properties = { + physical = true, + visual = "mesh", + mesh = "3d_armor_entity.obj", + visual_size = {x=1, y=1}, + collisionbox = {0,0,0,0,0,0}, + textures = {"blank.png"}, + }, + _pos = nil, + on_activate = function(self) + local pos = self.object:get_pos() + if pos then + self._pos = vector.round(pos) + update_entity(pos) + end + end, + on_blast = function(self, damage) + local drops = {} + local node = minetest.get_node(self._pos) + if node.name == "3d_armor_stand:armor_stand" then + drop_armor(self._pos) + self.object:remove() + end + return false, false, drops + end, +}) + +minetest.register_abm({ + nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:shared_armor_stand", "3d_armor_stand:armor_stand"}, + interval = 15, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local num + num = #minetest.get_objects_inside_radius(pos, 0.5) + if num > 0 then return end + update_entity(pos) + end +}) + +minetest.register_craft({ + output = "3d_armor_stand:armor_stand", + recipe = { + {"", "group:fence", ""}, + {"", "group:fence", ""}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "3d_armor_stand:locked_armor_stand", + recipe = { + {"3d_armor_stand:armor_stand", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "3d_armor_stand:shared_armor_stand", + recipe = { + {"3d_armor_stand:armor_stand", "default:copper_ingot"}, + } +}) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr new file mode 100644 index 00000000..ece548a6 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Rüstungsständeroberseite +Armor Stand=Rüstungsständer +Locked Armor Stand=Abgeschlossener Rüstungsständer +Armor Stand (owned by @1)=Rüstungsständer (Eigentum von @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr new file mode 100644 index 00000000..47a17aba --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Armaĵtenila Supro +Armor Stand=Armaĵtenilo +Locked Armor Stand=Åœlosita Armaĵtenilo +Armor Stand (owned by @1)=Åœlosita Armaĵtenilo (posedata de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr new file mode 100644 index 00000000..32b87078 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr @@ -0,0 +1,6 @@ +# textdomain: 3d_armor_stand +Armor Stand Top= +Armor Stand=Soporte de armadura +Locked Armor Stand=Soporte de armadura privado +Shared Armor Stand=Soporte de armadura compartido +Armor Stand (owned by @1)=Soporte de armadura (de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr new file mode 100644 index 00000000..f92d3778 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Haut de support d'armure +Armor Stand=Support d'armure +Locked Armor Stand=Support d'armure verrouillé +Armor Stand (owned by @1)=Support d'armure (propriété de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr new file mode 100644 index 00000000..0a8fb297 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Topo do suporte de armadura +Armor Stand=Suporte de Armadura +Locked Armor Stand=Suporte de armadura trancado +Armor Stand (owned by @1)=Suporte de Armadura (dono: @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr new file mode 100644 index 00000000..5987eed7 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=верх Ñтойки Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ +Armor Stand=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ +Locked Armor Stand=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ Ñ Ð·Ð°Ð¼ÐºÐ¾Ð¼ +Armor Stand (owned by @1)=Ñтойка Ð´Ð»Ñ Ð±Ð¾Ð½Ð¸ (владелец @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr new file mode 100644 index 00000000..5800a313 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Rustningställstopp +Armor Stand=Rustningställ +Locked Armor Stand=LÃ¥st rustningställ +Armor Stand (owned by @1)=Rustningställ (ägd av @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/template.txt b/mods/3d_armor/3d_armor_stand/locale/template.txt new file mode 100644 index 00000000..f9fcb5da --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: 3d_armor_stand +Armor Stand Top= +Armor Stand= +Locked Armor Stand= +Shared Armor Stand= +Armor Stand (owned by @1)= diff --git a/mods/3d_armor/3d_armor_stand/mod.conf b/mods/3d_armor/3d_armor_stand/mod.conf new file mode 100644 index 00000000..d1f1a4eb --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/mod.conf @@ -0,0 +1,2 @@ +name = 3d_armor_stand +depends = 3d_armor diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_entity.obj b/mods/3d_armor/3d_armor_stand/models/3d_armor_entity.obj new file mode 100644 index 00000000..052f6925 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/models/3d_armor_entity.obj @@ -0,0 +1,193 @@ +# Blender v2.73 (sub 0) OBJ File: '3d_armor_entity_3.blend' +# www.blender.org +mtllib 3d_armor_entity.mtl +o Player_Cube +v 2.200000 9.763893 1.200000 +v 2.200000 9.763893 -1.200000 +v 2.200000 2.663871 1.200000 +v 2.200000 2.663871 -1.200000 +v -2.200000 9.763893 -1.200000 +v -2.200000 9.763893 1.200000 +v -2.200000 2.663871 -1.200000 +v -2.200000 2.663871 1.200000 +v 2.300000 13.863962 2.300000 +v 2.300000 13.863962 -2.300000 +v 2.300000 9.263885 2.300000 +v 2.300000 9.263885 -2.300000 +v -2.300000 13.863962 -2.300000 +v -2.300000 13.863962 2.300000 +v -2.300000 9.263885 -2.300000 +v -2.300000 9.263885 2.300000 +v -2.322686 2.473175 -1.300000 +v -2.322686 2.473175 1.300000 +v -4.713554 2.682348 1.300000 +v -4.713554 2.682348 -1.300000 +v -1.686446 9.745432 -1.300000 +v -1.686446 9.745432 1.300000 +v -4.077313 9.954605 1.300000 +v -4.077313 9.954605 -1.300000 +v 4.077313 9.954605 -1.300000 +v 4.077313 9.954605 1.300000 +v 1.686446 9.745432 1.300000 +v 1.686446 9.745432 -1.300000 +v 4.713554 2.682348 -1.300000 +v 4.713554 2.682348 1.300000 +v 2.322686 2.473175 1.300000 +v 2.322686 2.473175 -1.300000 +v 0.139099 2.938947 -1.200000 +v 0.139099 2.938947 1.200000 +v 0.261266 -4.059988 1.200000 +v 0.261266 -4.059988 -1.200000 +v 2.660901 -4.018101 1.190000 +v 2.660901 -4.018101 -1.210000 +v 2.538733 2.980834 1.190000 +v 2.538733 2.980834 -1.210000 +v -0.139099 2.938947 -1.200000 +v -0.139099 2.938947 1.200000 +v -0.261266 -4.059988 1.200000 +v -0.261266 -4.059988 -1.200000 +v -2.538734 2.980834 -1.210000 +v -2.538734 2.980834 1.190000 +v -2.660901 -4.018101 -1.210000 +v -2.660901 -4.018101 1.190000 +v -2.799999 -4.387500 1.390000 +v -2.799999 -4.387500 -1.410000 +v -2.800000 -0.812499 1.390000 +v -2.800000 -0.812499 -1.410000 +v -0.000000 -4.387500 -1.400000 +v -0.000000 -4.387500 1.400000 +v -0.000000 -0.812499 1.400000 +v -0.000000 -0.812499 -1.400000 +v 2.800000 -0.812499 -1.410000 +v 2.800000 -0.812499 1.390000 +v 2.799999 -4.387500 -1.410000 +v 2.799999 -4.387500 1.390000 +v 0.000000 -4.387500 -1.400000 +v 0.000000 -4.387500 1.400000 +v 0.000000 -0.812499 1.400000 +v 0.000000 -0.812499 -1.400000 +v 2.267006 13.830965 2.267006 +v 2.267006 13.830965 -2.267006 +v 2.267006 9.296881 2.267006 +v 2.267006 9.296881 -2.267006 +v -2.267006 13.830965 -2.267006 +v -2.267006 13.830965 2.267006 +v -2.267006 9.296881 -2.267006 +v -2.267006 9.296881 2.267006 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.500000 +vt 0.312500 0.500000 +vt 0.562500 0.375000 +vt 0.562500 0.500000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.375000 +vt 0.625000 0.000000 +vt 0.625000 0.375000 +vt 0.500000 0.750000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vt 0.875000 1.000000 +vt 0.750000 0.500000 +vt 0.875000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.500000 +vt 0.812500 0.375000 +vt 0.687500 0.375000 +vt 0.687500 0.500000 +vt 0.687500 0.000000 +vt 0.750000 0.000000 +vt 0.812500 0.000000 +vt 0.875000 0.375000 +vt 0.875000 0.000000 +vt 0.125000 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.500000 +vt 0.125000 0.500000 +vt 0.187500 0.375000 +vt 0.187500 0.500000 +vt 0.000000 0.375000 +vt 0.000000 0.000000 +vt 0.062500 0.000000 +vt 0.187500 0.000000 +vt 0.125000 0.000000 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.656250 +vt 0.250000 0.656250 +vt 0.500000 0.875000 +vt 0.437500 0.656250 +vt 0.500000 0.656250 +vt 0.375000 0.656250 +vt 0.312500 1.000000 +usemtl Armor +s off +f 1/1 3/2 4/3 2/4 +f 5/5 6/6 1/7 2/4 +f 8/6 7/5 4/8 3/9 +f 5/5 2/4 4/3 7/10 +f 7/10 8/11 6/12 5/5 +f 8/11 3/13 1/14 6/12 +f 9/15 11/16 12/17 10/18 +f 13/19 14/20 9/21 10/18 +f 12/22 11/23 16/20 15/19 +f 13/19 10/18 12/17 15/24 +f 14/22 13/19 15/24 16/25 +f 9/26 14/22 16/25 11/27 +f 17/28 18/24 19/29 20/30 +f 24/31 23/32 22/24 21/28 +f 23/31 24/14 20/13 19/33 +f 24/31 21/28 17/34 20/33 +f 21/28 22/30 18/35 17/34 +f 22/30 23/36 19/37 18/35 +f 27/30 31/35 30/37 26/36 +f 28/28 32/34 31/35 27/30 +f 25/31 29/33 32/34 28/28 +f 26/31 30/33 29/13 25/14 +f 25/31 28/28 27/24 26/32 +f 32/28 29/30 30/29 31/24 +f 40/38 33/39 34/40 39/41 +f 36/42 38/38 37/41 35/43 +f 39/44 37/45 38/46 40/39 +f 34/1 35/2 37/47 39/42 +f 40/38 38/48 36/46 33/39 +f 33/42 36/47 35/48 34/38 +f 45/38 46/41 42/40 41/39 +f 41/42 42/38 43/48 44/47 +f 45/38 41/39 44/46 47/48 +f 42/1 46/42 48/47 43/2 +f 46/44 45/39 47/46 48/45 +f 44/42 43/43 48/41 47/38 +f 53/49 54/50 49/51 50/52 +f 51/53 52/54 50/55 49/56 +f 55/57 51/49 49/58 54/59 +f 52/52 56/54 53/55 50/60 +f 56/49 55/52 54/60 53/58 +f 52/52 51/51 55/61 56/54 +f 64/49 61/58 62/60 63/52 +f 57/52 59/60 61/55 64/54 +f 63/57 62/59 60/58 58/49 +f 58/53 60/56 59/55 57/54 +f 61/49 59/52 60/51 62/50 +f 57/52 64/54 63/61 58/51 +f 65/15 66/18 68/17 67/16 +f 69/19 66/18 65/21 70/20 +f 68/22 71/19 72/20 67/23 +f 69/19 71/24 68/17 66/18 +f 70/22 72/25 71/24 69/19 +f 65/26 67/27 72/25 70/22 diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj new file mode 100644 index 00000000..0df6dc78 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj @@ -0,0 +1,280 @@ +# Blender v2.72 (sub 0) OBJ File: '' +# www.blender.org +mtllib 3d_armor_stand.mtl +o Armor_Stand_Player_Cube_Stand +v 0.062500 0.125002 -0.062500 +v 0.062500 -0.437500 -0.062500 +v 0.062500 -0.437500 0.062500 +v 0.062500 0.125002 0.062500 +v -0.187500 0.250004 0.062500 +v -0.187500 0.250004 -0.062500 +v -0.250000 0.250004 -0.062500 +v -0.250000 0.250004 0.062500 +v -0.062500 -0.437500 -0.062500 +v -0.062500 -0.437500 0.062500 +v -0.187500 -0.437500 0.062500 +v -0.187500 -0.437500 -0.062500 +v -0.187500 0.125002 0.062500 +v -0.187500 0.125002 -0.062500 +v -0.187500 0.937504 0.062500 +v -0.187500 0.937504 -0.062500 +v -0.375000 0.937504 -0.062500 +v -0.375000 0.937504 0.062500 +v -0.062500 0.125002 0.062500 +v 0.187500 0.125002 -0.062500 +v 0.187500 -0.437500 -0.062500 +v -0.062500 0.125002 -0.062500 +v -0.250000 0.125007 -0.062500 +v -0.250000 0.125007 0.062500 +v 0.187500 -0.437500 0.062500 +v 0.187500 0.125002 0.062500 +v -0.062500 0.937504 0.062500 +v -0.187500 0.812504 0.062500 +v -0.062500 0.812504 0.062500 +v -0.062500 0.937504 -0.062500 +v 0.187500 0.250004 -0.062500 +v 0.187500 0.250004 0.062500 +v 0.250000 0.250004 0.062500 +v 0.250000 0.250004 -0.062500 +v 0.250000 0.125007 0.062500 +v 0.250000 0.125007 -0.062500 +v 0.187500 0.812504 0.062500 +v 0.187500 0.812504 -0.062500 +v 0.375000 0.812504 -0.062500 +v 0.375000 0.812504 0.062500 +v 0.187500 0.937504 -0.062500 +v 0.187500 0.937504 0.062500 +v 0.375000 0.937504 0.062500 +v 0.375000 0.937504 -0.062500 +v 0.062500 0.937504 -0.062500 +v 0.062500 0.937504 0.062500 +v -0.062500 0.812504 -0.062500 +v -0.187500 0.812504 -0.062500 +v 0.062500 0.812504 -0.062500 +v 0.062500 0.812504 0.062500 +v -0.375000 0.812504 -0.062500 +v -0.375000 0.812504 0.062500 +v -0.062500 0.250004 0.062500 +v 0.062500 0.250004 0.062500 +v 0.062500 0.250004 -0.062500 +v -0.062500 0.250004 -0.062500 +v -0.062500 1.312504 -0.062500 +v 0.062500 1.312504 -0.062500 +v -0.062500 1.312504 0.062500 +v 0.062500 1.312504 0.062500 +v -0.500000 -0.437500 -0.500000 +v -0.500000 -0.437500 0.500000 +v 0.500000 -0.437500 0.500000 +v 0.500000 -0.437500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +vt 0.062500 0.140625 +vt 0.062500 0.000000 +vt 0.093750 0.000000 +vt 0.093750 0.140625 +vt 0.140625 0.234375 +vt 0.140625 0.203125 +vt 0.156250 0.203125 +vt 0.156250 0.234375 +vt 0.093750 0.171875 +vt 0.062500 0.171875 +vt 0.218750 0.140625 +vt 0.187500 0.140625 +vt 0.187500 0.000000 +vt 0.218750 0.000000 +vt 0.078125 0.437500 +vt 0.078125 0.468750 +vt 0.031250 0.468750 +vt 0.031250 0.437500 +vt 0.250000 0.140625 +vt 0.250000 0.000000 +vt 0.031250 0.140625 +vt 0.031250 0.000000 +vt 0.156250 0.140625 +vt 0.156250 0.000000 +vt 0.187500 0.203125 +vt 0.156250 0.171875 +vt 0.187500 0.171875 +vt 0.125000 0.000000 +vt 0.125000 0.140625 +vt 0.000000 0.140625 +vt 0.000000 0.000000 +vt 0.328125 0.437500 +vt 0.296875 0.437500 +vt 0.296875 0.406250 +vt 0.328125 0.406250 +vt 0.109375 0.437500 +vt 0.109375 0.468750 +vt 0.046875 0.203125 +vt 0.046875 0.234375 +vt 0.031250 0.234375 +vt 0.031250 0.203125 +vt 0.000000 0.203125 +vt 0.000000 0.171875 +vt 0.031250 0.171875 +vt 0.265625 0.468750 +vt 0.265625 0.437500 +vt 0.218750 0.437500 +vt 0.218750 0.468750 +vt 0.218750 0.171875 +vt 0.171875 0.468750 +vt 0.171875 0.437500 +vt 0.078125 0.406250 +vt 0.031250 0.406250 +vt 0.140625 0.468750 +vt 0.140625 0.437500 +vt 0.140625 0.406250 +vt 0.171875 0.406250 +vt 0.109375 0.406250 +vt 0.359375 0.437500 +vt 0.359375 0.406250 +vt 0.390625 0.406250 +vt 0.390625 0.437500 +vt 0.437500 0.406250 +vt 0.437500 0.437500 +vt 0.000000 0.437500 +vt 0.000000 0.406250 +vt 0.250000 0.437500 +vt 0.218750 0.406250 +vt 0.250000 0.406250 +vt 0.359375 0.468750 +vt 0.406250 0.468750 +vt 0.406250 0.437500 +vt 0.109375 0.234375 +vt 0.078125 0.234375 +vt 0.078125 0.203125 +vt 0.109375 0.203125 +vt 0.062500 0.468750 +vt 0.062500 0.562500 +vt 0.031250 0.562500 +vt 0.328125 0.468750 +vt 0.296875 0.468750 +vt 0.062500 0.593750 +vt 0.031250 0.593750 +vt 0.093750 0.468750 +vt 0.093750 0.562500 +vt 0.125000 0.468750 +vt 0.125000 0.562500 +vt 0.000000 0.562500 +vt 0.000000 0.468750 +vt 0.078125 0.171875 +vt 0.046875 0.171875 +vt 0.265625 0.203125 +vt 0.265625 0.171875 +vt 0.296875 0.171875 +vt 0.296875 0.203125 +vt 0.265625 0.234375 +vt 0.281250 0.234375 +vt 0.281250 0.203125 +vt 0.312500 0.171875 +vt 0.312500 0.203125 +vt 0.140625 0.171875 +vt 0.171875 0.234375 +vt 0.171875 0.203125 +vt 0.109375 0.171875 +vt 0.234375 0.203125 +vt 0.203125 0.203125 +vt 0.203125 0.171875 +vt 0.234375 0.171875 +vt 0.234375 0.234375 +vt 0.203125 0.234375 +vt 0.062500 0.375000 +vt 0.062500 0.234375 +vt 0.093750 0.234375 +vt 0.093750 0.375000 +vt 0.031250 0.375000 +vt 0.125000 0.234375 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.234375 +vt 0.218750 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.234375 +vt 0.218750 0.234375 +vt 0.250000 0.375000 +vt 0.250000 0.234375 +vt 0.156250 0.375000 +vt 0.250000 1.000000 +vt 0.250000 0.750000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 0.750000 0.750000 +vt 0.750000 1.000000 +vt 0.750000 0.734375 +vt 1.000000 0.734375 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.734375 +vt 0.250000 0.734375 +vt 0.500000 0.734375 +usemtl Stand +s off +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 9/1 10/4 11/9 12/10 +f 13/11 14/12 12/13 11/14 +f 15/15 16/16 17/17 18/18 +f 19/19 13/11 11/14 10/20 +f 2/2 1/1 20/21 21/22 +f 14/12 22/23 9/24 12/13 +f 8/25 7/7 23/26 24/27 +f 4/4 3/3 25/28 26/29 +f 22/23 19/29 10/28 9/24 +f 26/30 25/31 21/22 20/21 +f 27/32 15/33 28/34 29/35 +f 16/16 15/15 27/36 30/37 +f 31/38 32/39 33/40 34/41 +f 33/42 35/43 36/44 34/41 +f 37/45 38/46 39/47 40/48 +f 2/49 21/27 25/12 3/11 +f 41/50 42/51 43/47 44/48 +f 38/52 41/15 44/18 39/53 +f 41/50 45/54 46/55 42/51 +f 16/51 30/55 47/56 48/57 +f 41/15 38/52 49/58 45/36 +f 46/59 50/60 37/61 42/62 +f 42/62 37/61 40/63 43/64 +f 43/65 40/66 39/53 44/18 +f 18/67 17/47 51/68 52/69 +f 28/34 15/33 18/67 52/69 +f 16/51 48/57 51/68 17/47 +f 48/59 28/70 52/71 51/72 +f 53/73 54/74 55/75 56/76 +f 30/77 57/78 58/79 45/17 +f 50/60 46/59 27/32 29/35 +f 29/80 47/32 49/33 50/81 +f 47/56 30/55 45/36 49/58 +f 57/78 59/82 60/83 58/79 +f 27/84 59/85 57/78 30/77 +f 46/86 60/87 59/85 27/84 +f 45/17 58/79 60/88 46/89 +f 1/90 55/75 31/38 20/91 +f 54/92 4/93 26/94 32/95 +f 26/92 20/96 36/97 35/98 +f 20/91 31/38 34/41 36/44 +f 32/95 26/94 35/99 33/100 +f 6/6 14/101 23/26 7/7 +f 14/102 13/103 24/7 23/8 +f 6/6 56/76 22/104 14/101 +f 53/105 5/106 13/107 19/108 +f 13/107 5/106 8/25 24/27 +f 1/90 22/104 56/76 55/75 +f 53/105 19/108 4/93 54/92 +f 1/109 4/105 19/106 22/110 +f 49/111 55/112 54/113 50/114 +f 38/115 31/40 55/112 49/111 +f 50/114 54/113 32/116 37/117 +f 37/118 32/119 31/40 38/115 +f 28/120 48/121 6/122 5/123 +f 29/124 28/120 5/123 53/125 +f 48/121 47/126 56/8 6/122 +f 47/126 29/117 53/116 56/8 +usemtl Base +f 61/127 62/128 63/129 64/130 +f 65/129 66/131 67/132 68/130 +f 62/131 68/133 67/134 63/135 +f 63/136 67/137 66/138 64/128 +f 61/129 64/128 66/138 65/139 +f 62/131 61/129 65/139 68/133 diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.png new file mode 100644 index 00000000..aeb26de9 Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.png differ diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_locked.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_locked.png new file mode 100644 index 00000000..3ee08b4b Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_locked.png differ diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png new file mode 100644 index 00000000..e54b599d Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png new file mode 100644 index 00000000..6b34d666 Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png new file mode 100644 index 00000000..864bf5cf Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png new file mode 100644 index 00000000..5441f0c4 Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_shield.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_shield.png new file mode 100644 index 00000000..51b490f6 Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_shield.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png new file mode 100644 index 00000000..1856baea Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png differ diff --git a/mods/3d_armor/3d_armor_ui/init.lua b/mods/3d_armor/3d_armor_ui/init.lua new file mode 100644 index 00000000..6afd13fc --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/init.lua @@ -0,0 +1,58 @@ +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local has_technic = minetest.get_modpath("technic") ~= nil + +if not minetest.global_exists("unified_inventory") then + minetest.log("warning", "3d_armor_ui: Mod loaded but unused.") + return +end + +local ui = unified_inventory +if ui.sfinv_compat_layer then + return +end + +armor:register_on_update(function(player) + local name = player:get_player_name() + if unified_inventory.current_page[name] == "armor" then + unified_inventory.set_inventory_formspec(player, "armor") + end +end) + +unified_inventory.register_button("armor", { + type = "image", + image = "inventory_plus_armor.png", + tooltip = S("3D Armor") +}) + +unified_inventory.register_page("armor", { + get_formspec = function(player, perplayer_formspec) + local fy = perplayer_formspec.form_header_y + 0.5 + local gridx = perplayer_formspec.std_inv_x + local gridy = 0.6 + + local name = player:get_player_name() + local formspec = perplayer_formspec.standard_inv_bg.. + perplayer_formspec.standard_inv.. + ui.make_inv_img_grid(gridx, gridy, 2, 3).. + string.format("label[%f,%f;%s]", + perplayer_formspec.form_header_x, perplayer_formspec.form_header_y, F(S("Armor"))).. + string.format("list[detached:%s_armor;armor;%f,%f;2,3;]", + name, gridx + ui.list_img_offset, gridy + ui.list_img_offset) .. + "image[3.5,"..(fy - 0.25)..";2,4;"..armor.textures[name].preview.."]".. + "label[6.0,"..(fy + 0.0)..";"..F(S("Level"))..": "..armor.def[name].level.."]".. + "label[6.0,"..(fy + 0.5)..";"..F(S("Heal"))..": "..armor.def[name].heal.."]".. + "listring[current_player;main]".. + "listring[detached:"..name.."_armor;armor]" + if armor.config.fire_protect then + formspec = formspec.."label[6.0,"..(fy + 1.0)..";".. + F(S("Fire"))..": "..armor.def[name].fire.."]" + end + if has_technic then + formspec = formspec.."label[6.0,"..(fy + 1.5)..";".. + F(S("Radiation"))..": "..armor.def[name].groups["radiation"].."]" + end + return {formspec=formspec} + end, +}) diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr new file mode 100644 index 00000000..84e850c1 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D-Rüstung +Armor not initialized!=Rüstung ist nicht initialisiert! +Armor=Rüstung +Level=Stufe +Heal=Heilung +Fire=Feuer +Radiation=Strahlung diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr new file mode 100644 index 00000000..7c31cbd1 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D Armaĵoj +Armor not initialized!=Armaĵoj ne pretigitaj! +Armor=Armaĵo +Level=Nivelo +Heal=Sanigi +Fire=Fajro +Radiation=Radiado diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr new file mode 100644 index 00000000..358814cb --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=Armure 3D +Armor not initialized!=Armure non initialisée ! +Armor=Armure +Level=Niveau +Heal=Soins +Fire=Feu +Radiation=Radiation diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr new file mode 100644 index 00000000..761c6ec7 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D Armor +Armor not initialized!=Armadura não inicializada! +Armor=Armadura +Level=Nível +Heal=Vida +Fire=Fogo +Radiation=Radiação diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr new file mode 100644 index 00000000..711bf9c3 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor= +Armor not initialized!=Rustning har inte initialiserats +Armor=Rustning +Level=NivÃ¥ +Heal=Läkning +Fire=Eld +Radiation=StrÃ¥lning diff --git a/mods/3d_armor/3d_armor_ui/locale/template.txt b/mods/3d_armor/3d_armor_ui/locale/template.txt new file mode 100644 index 00000000..4982060c --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor= +Armor not initialized!= +Armor= +Level= +Heal= +Fire= +Radiation= diff --git a/mods/3d_armor/3d_armor_ui/mod.conf b/mods/3d_armor/3d_armor_ui/mod.conf new file mode 100644 index 00000000..331627e7 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/mod.conf @@ -0,0 +1,5 @@ +name = 3d_armor_ui +depends = 3d_armor +optional_depends = unified_inventory +description = Adds 3d_armor page to the unified inventory. +min_minetest_version = 5.4.0 diff --git a/mods/3d_armor/LICENSE.md b/mods/3d_armor/LICENSE.md new file mode 100644 index 00000000..4e638395 --- /dev/null +++ b/mods/3d_armor/LICENSE.md @@ -0,0 +1,10 @@ +3D Armor - Visible Player Armor +=============================== + +License Source Code: Copyright (C) 2013-2023 Stuart Jones - LGPL v2.1 + +Armor Textures: Copyright (C) 2017-2023 davidthecreator - CC-BY-SA 3.0 + +Special credit to Jordach and MirceaKitsune for providing the default 3d character model. + +New armor/shield textures CC-BY-SA 3.0 / davidthecreator / https://forum.minetest.net/viewtopic.php?f=11&t=4654&start=800#p356448 diff --git a/mods/3d_armor/README.md b/mods/3d_armor/README.md new file mode 100644 index 00000000..8b114584 --- /dev/null +++ b/mods/3d_armor/README.md @@ -0,0 +1,93 @@ +Modpack - 3d Armor +================== +![3d_armor screenshot](https://github.com/minetest-mods/3d_armor/blob/master/screenshot.png) + + +![](https://github.com/minetest-mods/3d_armor/workflows/luacheck/badge.svg) +![](https://github.com/minetest-mods/3d_armor/workflows/integration-test/badge.svg) + +### Table of Contents + + + + +- [[mod] Visible Player Armor [3d_armor]](#mod-visible-player-armor-3d_armor) +- [[mod] Visible Wielded Items [wieldview]](#mod-visible-wielded-items-wieldview) +- [[mod] Shields [shields]](#mod-shields-shields) +- [[mod] 3d Armor Stand [3d_armor_stand]](#mod-3d-armor-stand-3d_armor_stand) + + + + +[mod] Visible Player Armor [3d_armor] +------------------------------------- + +Minetest Version: 5.0.0 and newer + +Game: minetest_game and many derivatives + +Depends: default + +Adds craftable armor that is visible to other players. Each armor item worn contributes to +a player's armor group level making them less vulnerable to attack. + +Armor takes damage when a player is hurt, however, many armor items offer a 'stackable' +percentage chance of restoring the lost health points. Overall armor level is boosted by 10% +when wearing a full matching set (helmet, chestplate, leggings and boots of the same material) + +Fire protection has been added by TenPlus1 and in use when ethereal mod is found and crystal +armor has been enabled. each piece of armor offers 1 fire protection, level 1 protects +against torches, level 2 against crystal spikes, 3 for fire and 5 protects when in lava. + +Compatible with sfinv, inventory plus or unified inventory by enabling the appropriate +inventory module, [3d_armor_sfinv], [3d_armor_ip] and [3d_armor_ui] respectively. +Also compatible with [smart_inventory] without the need for additional modules. + +built in support player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam +and [simple_skins] by TenPlus1. + +Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory. +see armor.conf.example for all available options. + +For **mod installation** instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods + +The specific "armors as modpack" refactorization allows anyone to enable/disable any armors they want as mods rather than obscure settings of the past. (See [#78](https://github.com/minetest-mods/3d_armor/commit/9444afd7222a71fc17d40c9793506812d715dcc3) for further explanation.) + +Currently, the modpack includes: + +- armor_admin +- armor_bronze +- armor_cactus +- armor_crystal +- armor_diamond +- armor_gold +- armor_mithril +- armor_nether +- armor_steel +- armor_wood + +as separate armor mods intentionally. All these mods depend on 3d_armor. + +[API Reference](https://minetest-mods.github.io/3d_armor/reference/) + +[mod] Visible Wielded Items [wieldview] +--------------------------------------- + +Depends: 3d_armor + +Makes hand wielded items visible to other players. + +[mod] Shields [shields] +----------------------- + +Depends: 3d_armor + +Originally a part of 3d_armor, shields have been re-included as an optional extra. +If you do not want shields then simply remove the shields folder from the modpack. + +[mod] 3d Armor Stand [3d_armor_stand] +------------------------------------- + +Depends: 3d_armor + +Adds a chest-like armor stand for armor storage and display. diff --git a/mods/3d_armor/armor_admin/init.lua b/mods/3d_armor/armor_admin/init.lua new file mode 100644 index 00000000..a84ec624 --- /dev/null +++ b/mods/3d_armor/armor_admin/init.lua @@ -0,0 +1,94 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Admin Helmet +-- +-- @helmet 3d_armor:helmet_admin +-- @img 3d_armor_inv_helmet_admin.png +-- @grp armor_head 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp armor_water 1 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:helmet_admin", { + description = S("Admin Helmet"), + inventory_image = "3d_armor_inv_helmet_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Chestplate +-- +-- @chestplate 3d_armor:chestplate_admin +-- @img 3d_armor_inv_chestplate_admin.png +-- @grp armor_torso 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:chestplate_admin", { + description = S("Admin Chestplate"), + inventory_image = "3d_armor_inv_chestplate_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_torso=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Leggings +-- +-- @leggings 3d_armor:leggings_admin +-- @img 3d_armor_inv_leggings_admin.png +-- @grp armor_legs 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:leggings_admin", { + description = S("Admin Leggings"), + inventory_image = "3d_armor_inv_leggings_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_legs=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Boots +-- +-- @boots 3d_armor:boots_admin +-- @img 3d_armor_inv_boots_admin.png +-- @grp armor_feet 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:boots_admin", { + description = S("Admin Boots"), + inventory_image = "3d_armor_inv_boots_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_feet=1, armor_heal=100, armor_use=0, physics_speed=1, + armor_water=1, not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +minetest.register_alias("adminboots", "3d_armor:boots_admin") +minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") +minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") +minetest.register_alias("adminleggings", "3d_armor:leggings_admin") diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.de.tr b/mods/3d_armor/armor_admin/locale/armor_admin.de.tr new file mode 100644 index 00000000..d4751c0f --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Adminhelm +Admin Chestplate=Adminbrustplatte +Admin Leggings=Adminhose +Admin Boots=Adminstiefel diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr b/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr new file mode 100644 index 00000000..ee050eb2 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Administra Kasko +Admin Chestplate=Administra Kiraso +Admin Leggings=Administra Pantalono +Admin Boots=Administraj Botoj diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.es.tr b/mods/3d_armor/armor_admin/locale/armor_admin.es.tr new file mode 100644 index 00000000..3e1f8e04 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Casco de admin +Admin Chestplate=Peto de admin +Admin Leggings=Grebas de admin +Admin Boots=Botas de admin diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr b/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr new file mode 100644 index 00000000..497df2d3 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Casque d'admin +Admin Chestplate=Cuirasse d'admin +Admin Leggings=Jambières d'admin +Admin Boots=Bottes d'admin diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.it.tr b/mods/3d_armor/armor_admin/locale/armor_admin.it.tr new file mode 100644 index 00000000..d59b9c92 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Elmo dell'amministratrice/tore +Admin Chestplate=Corazza dell'amministratrice/tore +Admin Leggings=Gambali dell'amministratrice/tore +Admin Boots=Stivali dell'amministratrice/tore diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr b/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr new file mode 100644 index 00000000..b91f9def --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Helmet Pentadbir +Admin Chestplate=Perisai Dada Pentadbir +Admin Leggings=Perisai Kaki Pentadbir +Admin Boots=But Pentadbir diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr b/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr new file mode 100644 index 00000000..920e44f6 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet= +Admin Chestplate= +Admin Leggings= +Admin Boots= diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr b/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr new file mode 100644 index 00000000..077be2be --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Capacete de Administrador +Admin Chestplate=Peitoral de Administrador +Admin Leggings=Calças de Administrador +Admin Boots=Botas de Administrador diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr b/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr new file mode 100644 index 00000000..cd300fb0 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=шлем админа +Admin Chestplate=нагрудник админа +Admin Leggings=штаны админа +Admin Boots=ботинки админа diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr b/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr new file mode 100644 index 00000000..91631fe8 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Adminhjälm +Admin Chestplate=AdminbröstplÃ¥t +Admin Leggings=Adminbyxor +Admin Boots=Adminstövlar diff --git a/mods/3d_armor/armor_admin/locale/template.txt b/mods/3d_armor/armor_admin/locale/template.txt new file mode 100644 index 00000000..920e44f6 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet= +Admin Chestplate= +Admin Leggings= +Admin Boots= diff --git a/mods/3d_armor/armor_admin/mod.conf b/mods/3d_armor/armor_admin/mod.conf new file mode 100644 index 00000000..588d4a43 --- /dev/null +++ b/mods/3d_armor/armor_admin/mod.conf @@ -0,0 +1,3 @@ +name = armor_admin +depends = 3d_armor +description = Adds admin armor. diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png new file mode 100644 index 00000000..833f6b71 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png new file mode 100644 index 00000000..2487a7ea Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png new file mode 100644 index 00000000..d8df83df Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png new file mode 100644 index 00000000..1bb10fd3 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png new file mode 100644 index 00000000..862956ad Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png new file mode 100644 index 00000000..0f344d01 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png new file mode 100644 index 00000000..71fd4106 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png new file mode 100644 index 00000000..c65c606e Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png new file mode 100644 index 00000000..abb43a7e Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png new file mode 100644 index 00000000..12473045 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png new file mode 100644 index 00000000..1f7207d0 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png differ diff --git a/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png new file mode 100644 index 00000000..95c973a4 Binary files /dev/null and b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png differ diff --git a/mods/3d_armor/armor_bronze/init.lua b/mods/3d_armor/armor_bronze/init.lua new file mode 100644 index 00000000..ebdc4c2b --- /dev/null +++ b/mods/3d_armor/armor_bronze/init.lua @@ -0,0 +1,180 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) +--- Bronze +-- +-- Requires setting `armor_material_bronze`. +-- +-- @section bronze + +if armor.materials.bronze then + --- Bronze Helmet + -- + -- @helmet 3d_armor:helmet_bronze + -- @img 3d_armor_inv_helmet_bronze.png + -- @grp armor_head 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_bronze", { + description = S("Bronze Helmet"), + inventory_image = "3d_armor_inv_helmet_bronze.png", + groups = {armor_head=1, armor_heal=6, armor_use=400, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Chestplate + -- + -- @chestplate 3d_armor:chestplate_bronze + -- @img 3d_armor_inv_chestplate_bronze.png + -- @grp armor_torso 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_bronze", { + description = S("Bronze Chestplate"), + inventory_image = "3d_armor_inv_chestplate_bronze.png", + groups = {armor_torso=1, armor_heal=6, armor_use=400, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Leggings + -- + -- @leggings 3d_armor:leggings_bronze + -- @img 3d_armor_inv_leggings_bronze.png + -- @grp armor_legs 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_bronze", { + description = S("Bronze Leggings"), + inventory_image = "3d_armor_inv_leggings_bronze.png", + groups = {armor_legs=1, armor_heal=6, armor_use=400, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Boots + -- + -- @boots 3d_armor:boots_bronze + -- @img 3d_armor_inv_boots_bronze.png + -- @grp armor_feet 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_bronze", { + description = S("Bronze Boots"), + inventory_image = "3d_armor_inv_boots_bronze.png", + groups = {armor_feet=1, armor_heal=6, armor_use=400, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "bronze" + local m = armor.materials.bronze + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr new file mode 100644 index 00000000..789bdd82 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronzehelm +Bronze Chestplate=Bronzebrustplatte +Bronze Leggings=Bronzehose +Bronze Boots=Bronzestiefel diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr new file mode 100644 index 00000000..f7a13c2d --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronza Kasko +Bronze Chestplate=Bronza Kiraso +Bronze Leggings=Bronza Pantalono +Bronze Boots=Bronzaj Botoj diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr new file mode 100644 index 00000000..8103e7a4 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Casco de bronce +Bronze Chestplate=Peto de bronce +Bronze Leggings=Grebas de bronce +Bronze Boots=Botas de bronce diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr new file mode 100644 index 00000000..72d1dc4c --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Casque en bronze +Bronze Chestplate=Cuirasse en bronze +Bronze Leggings=Jambières en bronze +Bronze Boots=Bottes en bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr new file mode 100644 index 00000000..e1298244 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Elmo di bronzo +Bronze Chestplate=Corazza di bronzo +Bronze Leggings=Gambali di bronzo +Bronze Boots=Stivali di bronzo diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr new file mode 100644 index 00000000..f9167771 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Helmet Gangsa +Bronze Chestplate=Perisai Dada Gangsa +Bronze Leggings=Perisai Kaki Gangsa +Bronze Boots=But Gangsa diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr new file mode 100644 index 00000000..a9a5ab27 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Capacete de Bronze +Bronze Chestplate=Peitoral de Bronze +Bronze Leggings=Calças de Bronze +Bronze Boots=Botas de Bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr new file mode 100644 index 00000000..a9a5ab27 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Capacete de Bronze +Bronze Chestplate=Peitoral de Bronze +Bronze Leggings=Calças de Bronze +Bronze Boots=Botas de Bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr new file mode 100644 index 00000000..61abdd48 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=бронзовый шлем +Bronze Chestplate=бронзовый нагрудник +Bronze Leggings=бронзовые штаны +Bronze Boots=бронзовые ботинки diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr new file mode 100644 index 00000000..eea6741f --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronshjälm +Bronze Chestplate=Bronsbröstplatta +Bronze Leggings=Bronsbyxor +Bronze Boots=Bronsstövlar diff --git a/mods/3d_armor/armor_bronze/locale/template.txt b/mods/3d_armor/armor_bronze/locale/template.txt new file mode 100644 index 00000000..59a56121 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet= +Bronze Chestplate= +Bronze Leggings= +Bronze Boots= diff --git a/mods/3d_armor/armor_bronze/mod.conf b/mods/3d_armor/armor_bronze/mod.conf new file mode 100644 index 00000000..7eec9023 --- /dev/null +++ b/mods/3d_armor/armor_bronze/mod.conf @@ -0,0 +1,3 @@ +name = armor_bronze +depends = 3d_armor +description = Adds craftable bronze armor. diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png new file mode 100644 index 00000000..2b187e50 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png new file mode 100644 index 00000000..78badbb8 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png new file mode 100644 index 00000000..b8e6d853 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png new file mode 100644 index 00000000..8c78716c Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png new file mode 100644 index 00000000..17b87c9a Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png new file mode 100644 index 00000000..c7117450 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png new file mode 100644 index 00000000..e704d50b Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png new file mode 100644 index 00000000..f0753eef Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png new file mode 100644 index 00000000..4297d9b8 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png new file mode 100644 index 00000000..7252662c Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png new file mode 100644 index 00000000..26d05f09 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png differ diff --git a/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png new file mode 100644 index 00000000..12952ff7 Binary files /dev/null and b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png differ diff --git a/mods/3d_armor/armor_cactus/init.lua b/mods/3d_armor/armor_cactus/init.lua new file mode 100644 index 00000000..aaece5c6 --- /dev/null +++ b/mods/3d_armor/armor_cactus/init.lua @@ -0,0 +1,183 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Cactus +-- +-- Requires setting `armor_material_cactus`. +-- +-- @section cactus + +if armor.materials.cactus then + --- Cactus Helmet + -- + -- @helmet 3d_armor:helmet_cactus + -- @img 3d_armor_inv_helmet_cactus.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:helmet_cactus", { + description = S("Cactus Helmet"), + inventory_image = "3d_armor_inv_helmet_cactus.png", + groups = {armor_head=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Chestplate + -- + -- @chestplate 3d_armor:chestplate_cactus + -- @img 3d_armor_inv_chestplate_cactus.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:chestplate_cactus", { + description = S("Cactus Chestplate"), + inventory_image = "3d_armor_inv_chestplate_cactus.png", + groups = {armor_torso=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Leggings + -- + -- @leggings 3d_armor:leggings_cactus + -- @img 3d_armor_inv_leggings_cactus.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:leggings_cactus", { + description = S("Cactus Leggings"), + inventory_image = "3d_armor_inv_leggings_cactus.png", + groups = {armor_legs=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Boots + -- + -- @boots 3d_armor:boots_cactus + -- @img 3d_armor_inv_boots_cactus.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:boots_cactus", { + description = S("Cactus Boots"), + inventory_image = "3d_armor_inv_boots_cactus.png", + groups = {armor_feet=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + local cactus_armor_fuel = { + helmet = 14, + chestplate = 16, + leggings = 15, + boots = 13 + } + for armor, burn in pairs(cactus_armor_fuel) do + minetest.register_craft({ + type = "fuel", + recipe = "3d_armor:" .. armor .. "_cactus", + burntime = burn, + }) + end + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "cactus" + local m = armor.materials.cactus + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr new file mode 100644 index 00000000..a09c15e6 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kaktushelm +Cactus Chestplate=Kaktusbrustplatte +Cactus Leggings=Kaktushose +Cactus Boots=Kaktusstiefel diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr new file mode 100644 index 00000000..fffcd5d5 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kakta Kasko +Cactus Chestplate=Kakta Kiraso +Cactus Leggings=Kakta Pantalono +Cactus Boots=Kaktaj Botoj diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr new file mode 100644 index 00000000..f9689177 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Casco de cactus +Cactus Chestplate=Peto de cactus +Cactus Leggings=Grebas de cactus +Cactus Boots=Botas de cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr new file mode 100644 index 00000000..b678e313 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Casque en cactus +Cactus Chestplate=Cuirasse en cactus +Cactus Leggings=Jambières en cactus +Cactus Boots=Bottes en cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr new file mode 100644 index 00000000..e46a235a --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Elmo di cactus +Cactus Chestplate=Corazza di cactus +Cactus Leggings=Gambali di cactus +Cactus Boots=Stivali di cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr new file mode 100644 index 00000000..f859b9eb --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Helmet Kaktus +Cactus Chestplate=Perisai Dada Kaktus +Cactus Leggings=Perisai Kaki Kaktus +Cactus Boots=But Kaktus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr new file mode 100644 index 00000000..f3ca0923 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Capacete de Cacto +Cactus Chestplate=Peitoral de Cacto +Cactus Leggings=Calças de Cacto +Cactus Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr new file mode 100644 index 00000000..75eca173 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Capacete de Cacto +Cactus Chestplate=Peitoral de Cacto +Cactus Leggings=Calças de Cacto +Cactus Boots=Botas de Cacto diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr new file mode 100644 index 00000000..5c7df36a --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=кактуÑовый шлем +Cactus Chestplate=кактуÑовый нагрудник +Cactus Leggings=кактуÑовые штаны +Cactus Boots=кактуÑовые ботинки diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr new file mode 100644 index 00000000..2f0981ac --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kaktushjälm +Cactus Chestplate=Kaktusbröstplatta +Cactus Leggings=Kaktusbyxor +Cactus Boots=Kaktusstövlar diff --git a/mods/3d_armor/armor_cactus/locale/template.txt b/mods/3d_armor/armor_cactus/locale/template.txt new file mode 100644 index 00000000..49da2402 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet= +Cactus Chestplate= +Cactus Leggings= +Cactus Boots= diff --git a/mods/3d_armor/armor_cactus/mod.conf b/mods/3d_armor/armor_cactus/mod.conf new file mode 100644 index 00000000..fc94af23 --- /dev/null +++ b/mods/3d_armor/armor_cactus/mod.conf @@ -0,0 +1,3 @@ +name = armor_cactus +depends = 3d_armor +description = Adds craftable cactus armor. diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png new file mode 100644 index 00000000..350b065b Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png new file mode 100644 index 00000000..08e76c60 Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png new file mode 100644 index 00000000..afcd557b Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png new file mode 100644 index 00000000..b166c7cf Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png new file mode 100644 index 00000000..f616e1ea Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png new file mode 100644 index 00000000..7e750cca Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png new file mode 100644 index 00000000..1b013957 Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png new file mode 100644 index 00000000..ca315dfc Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png new file mode 100644 index 00000000..7f44463e Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png new file mode 100644 index 00000000..3f05b162 Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png new file mode 100644 index 00000000..537adcbf Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png differ diff --git a/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png new file mode 100644 index 00000000..09f848e9 Binary files /dev/null and b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png differ diff --git a/mods/3d_armor/armor_crystal/init.lua b/mods/3d_armor/armor_crystal/init.lua new file mode 100644 index 00000000..aa9a76af --- /dev/null +++ b/mods/3d_armor/armor_crystal/init.lua @@ -0,0 +1,169 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Crystal +-- +-- Requires `armor_material_crystal`. +-- +-- @section crystal + +if armor.materials.crystal then + --- Crystal Helmet + -- + -- @helmet 3d_armor:helmet_crystal + -- @img 3d_armor_inv_helmet_crystal.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_crystal", { + description = S("Crystal Helmet"), + inventory_image = "3d_armor_inv_helmet_crystal.png", + groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Chestplate + -- + -- @chestplate 3d_armor:chestplate_crystal + -- @img 3d_armor_inv_chestplate_crystal.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_crystal", { + description = S("Crystal Chestplate"), + inventory_image = "3d_armor_inv_chestplate_crystal.png", + groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Leggings + -- + -- @leggings 3d_armor:leggings_crystal + -- @img 3d_armor_inv_leggings_crystal.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_crystal", { + description = S("Crystal Leggings"), + inventory_image = "3d_armor_inv_leggings_crystal.png", + groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Boots + -- + -- @boots 3d_armor:boots_crystal + -- @img 3d_armor_inv_boots_crystal.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp physics_speed 1 + -- @grp physics_jump 0.5 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_crystal", { + description = S("Crystal Boots"), + inventory_image = "3d_armor_inv_boots_crystal.png", + groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1, + physics_jump=0.5, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "crystal" + local m = armor.materials.crystal + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr new file mode 100644 index 00000000..18e76242 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristallhelm +Crystal Chestplate=Kristallbrustplatte +Crystal Leggings=Kristallhose +Crystal Boots=Kristallstiefel diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr new file mode 100644 index 00000000..7fae4ea2 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristala Kasko +Crystal Chestplate=Kristala Kiraso +Crystal Leggings=Kristala Pantalono +Crystal Boots=Kristalaj Botoj diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr new file mode 100644 index 00000000..cc7e60b1 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Casco de cristal +Crystal Chestplate=Peto de cristal +Crystal Leggings=Grebas de cristal +Crystal Boots=Botas de cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr new file mode 100644 index 00000000..d127635d --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Casque en cristal +Crystal Chestplate=Cuirasse en cristal +Crystal Leggings=Jambières en cristal +Crystal Boots=Bottes en cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr new file mode 100644 index 00000000..85c3f512 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Elmo di cristallo +Crystal Chestplate=Corazza di cristallo +Crystal Leggings=Gambali di cristallo +Crystal Boots=Stivali di cristallo diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr new file mode 100644 index 00000000..6e53ffda --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Helmet Kristal +Crystal Chestplate=Perisai Dada Kristal +Crystal Leggings=Perisai Kaki Kristal +Crystal Boots=But Kristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr new file mode 100644 index 00000000..43e042ee --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Capacete de Cristal +Crystal Chestplate=Peitoral de Cristal +Crystal Leggings=Calças de Cristal +Crystal Boots=Botas de Cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr new file mode 100644 index 00000000..43e042ee --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Capacete de Cristal +Crystal Chestplate=Peitoral de Cristal +Crystal Leggings=Calças de Cristal +Crystal Boots=Botas de Cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr new file mode 100644 index 00000000..4915198b --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=криÑталловый шлем +Crystal Chestplate=криÑталловый нагрудник +Crystal Leggings=криÑталловые штаны +Crystal Boots=криÑталловые ботинки diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr new file mode 100644 index 00000000..57d0bd12 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristallhjälm +Crystal Chestplate=Kristallbröstplatta +Crystal Leggings=Kristallbyxor +Crystal Boots=Kristallstövlar diff --git a/mods/3d_armor/armor_crystal/locale/template.txt b/mods/3d_armor/armor_crystal/locale/template.txt new file mode 100644 index 00000000..4244d314 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet= +Crystal Chestplate= +Crystal Leggings= +Crystal Boots= diff --git a/mods/3d_armor/armor_crystal/mod.conf b/mods/3d_armor/armor_crystal/mod.conf new file mode 100644 index 00000000..9531bbcc --- /dev/null +++ b/mods/3d_armor/armor_crystal/mod.conf @@ -0,0 +1,4 @@ +name = armor_crystal +depends = 3d_armor +optional_depends = ethereal +description = Adds craftable crystal armor. diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png new file mode 100644 index 00000000..31c06b58 Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png new file mode 100644 index 00000000..01a6bfaf Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png new file mode 100644 index 00000000..4a268f4d Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png new file mode 100644 index 00000000..63304f67 Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png new file mode 100644 index 00000000..1405a42f Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png new file mode 100644 index 00000000..7bb01ff6 Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png new file mode 100644 index 00000000..f663470e Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png new file mode 100644 index 00000000..46742a1c Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png new file mode 100644 index 00000000..baf6bdf3 Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png new file mode 100644 index 00000000..8197b01b Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png new file mode 100644 index 00000000..6bf702f7 Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png differ diff --git a/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png new file mode 100644 index 00000000..96a11bf7 Binary files /dev/null and b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png differ diff --git a/mods/3d_armor/armor_diamond/init.lua b/mods/3d_armor/armor_diamond/init.lua new file mode 100644 index 00000000..c92cf0eb --- /dev/null +++ b/mods/3d_armor/armor_diamond/init.lua @@ -0,0 +1,166 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Diamond +-- +-- Requires setting `armor_material_diamond`. +-- +-- @section diamond + +if armor.materials.diamond then + --- Diamond Helmet + -- + -- @helmet 3d_armor:helmet_diamond + -- @img 3d_armor_inv_helmet_diamond.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_diamond", { + description = S("Diamond Helmet"), + inventory_image = "3d_armor_inv_helmet_diamond.png", + groups = {armor_head=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Chestplate + -- + -- @chestplate 3d_armor:chestplate_diamond + -- @img 3d_armor_inv_chestplate_diamond.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_diamond", { + description = S("Diamond Chestplate"), + inventory_image = "3d_armor_inv_chestplate_diamond.png", + groups = {armor_torso=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Leggings + -- + -- @leggings 3d_armor:leggings_diamond + -- @img 3d_armor_inv_leggings_diamond.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_diamond", { + description = S("Diamond Leggings"), + inventory_image = "3d_armor_inv_leggings_diamond.png", + groups = {armor_legs=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Boots + -- + -- @boots 3d_armor:boots_diamond + -- @img 3d_armor_inv_boots_diamond.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_diamond", { + description = S("Diamond Boots"), + inventory_image = "3d_armor_inv_boots_diamond.png", + groups = {armor_feet=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "diamond" + local m = armor.materials.diamond + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr new file mode 100644 index 00000000..f19d67a3 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanthelm +Diamond Chestplate=Diamantbrustplatte +Diamond Leggings=Diamanthose +Diamond Boots=Diamantstiefel diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr new file mode 100644 index 00000000..48e57683 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanta Kasko +Diamond Chestplate=Diamanta Kiraso +Diamond Leggings=Diamanta Pantalono +Diamond Boots=Diamantaj Botoj diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr new file mode 100644 index 00000000..c0a96b30 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Casco de diamante +Diamond Chestplate=Peto de diamante +Diamond Leggings=Grebas de diamante +Diamond Boots=Botas de diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr new file mode 100644 index 00000000..347d2213 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Casque en diamant +Diamond Chestplate=Cuirasse en diamant +Diamond Leggings=Jambières en diamant +Diamond Boots=Bottes en diamant diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr new file mode 100644 index 00000000..b5aa14c1 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Elmo di diamante +Diamond Chestplate=Corazza di diamante +Diamond Leggings=Gambali di diamante +Diamond Boots=Stivali di diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr new file mode 100644 index 00000000..bc6f7372 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Helmet Intan +Diamond Chestplate=Perisai Dada Intan +Diamond Leggings=Perisai Kaki Intan +Diamond Boots=But Intan diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr new file mode 100644 index 00000000..effc56c0 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Capacete de Diamante +Diamond Chestplate=Peitoral de Diamante +Diamond Leggings=Calças de Diamante +Diamond Boots=Botas de Diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr new file mode 100644 index 00000000..effc56c0 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Capacete de Diamante +Diamond Chestplate=Peitoral de Diamante +Diamond Leggings=Calças de Diamante +Diamond Boots=Botas de Diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr new file mode 100644 index 00000000..0ee465b9 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=алмазный шлем +Diamond Chestplate=алмазный нагрудник +Diamond Leggings=алмазные штаны +Diamond Boots=алмазные ботинки diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr new file mode 100644 index 00000000..622daadd --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanthjälm +Diamond Chestplate=Diamantbröstplatta +Diamond Leggings=Diamantbyxor +Diamond Boots=Diamantstövlar diff --git a/mods/3d_armor/armor_diamond/locale/template.txt b/mods/3d_armor/armor_diamond/locale/template.txt new file mode 100644 index 00000000..6e169f12 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet= +Diamond Chestplate= +Diamond Leggings= +Diamond Boots= diff --git a/mods/3d_armor/armor_diamond/mod.conf b/mods/3d_armor/armor_diamond/mod.conf new file mode 100644 index 00000000..27d1cc98 --- /dev/null +++ b/mods/3d_armor/armor_diamond/mod.conf @@ -0,0 +1,3 @@ +name = armor_diamond +depends = 3d_armor +description = Adds craftable diamond armor. diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png new file mode 100644 index 00000000..18703596 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png new file mode 100644 index 00000000..2e4f5d3d Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png new file mode 100644 index 00000000..f61e28f6 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png new file mode 100644 index 00000000..9ec99712 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png new file mode 100644 index 00000000..91966818 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png new file mode 100644 index 00000000..936fa669 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png new file mode 100644 index 00000000..e4394b89 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png new file mode 100644 index 00000000..1fd75ae1 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png new file mode 100644 index 00000000..424e9700 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png new file mode 100644 index 00000000..9dac33be Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png new file mode 100644 index 00000000..df3cf162 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png differ diff --git a/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png new file mode 100644 index 00000000..1bb32956 Binary files /dev/null and b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png differ diff --git a/mods/3d_armor/armor_gold/init.lua b/mods/3d_armor/armor_gold/init.lua new file mode 100644 index 00000000..a8bb01ff --- /dev/null +++ b/mods/3d_armor/armor_gold/init.lua @@ -0,0 +1,183 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + + +--- Gold +-- +-- Requires `armor_material_gold`. +-- +-- @section gold + +if armor.materials.gold then + --- Gold Helmet + -- + -- @helmet 3d_armor:helmet_gold + -- @img 3d_armor_inv_helmet_gold.png + -- @grp armor_head 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.02 + -- @grp physics_gravity 0.02 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_gold", { + description = S("Gold Helmet"), + inventory_image = "3d_armor_inv_helmet_gold.png", + groups = {armor_head=1, armor_heal=6, armor_use=300, + physics_speed=-0.02, physics_gravity=0.02}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Chestplate + -- + -- @chestplate 3d_armor:chestplate_gold + -- @img 3d_armor_inv_chestplate_gold.png + -- @grp armor_torso 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.05 + -- @grp physics_gravity 0.05 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_gold", { + description = S("Gold Chestplate"), + inventory_image = "3d_armor_inv_chestplate_gold.png", + groups = {armor_torso=1, armor_heal=6, armor_use=300, + physics_speed=-0.05, physics_gravity=0.05}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Leggings + -- + -- @leggings 3d_armor:leggings_gold + -- @img 3d_armor_inv_leggings_gold.png + -- @grp armor_legs 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_gold", { + description = S("Gold Leggings"), + inventory_image = "3d_armor_inv_leggings_gold.png", + groups = {armor_legs=1, armor_heal=6, armor_use=300, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Boots + -- + -- @boots 3d_armor:boots_gold + -- @img 3d_armor_inv_boots_gold.png + -- @grp armor_feet 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.02 + -- @grp physics_gravity 0.02 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_gold", { + description = S("Gold Boots"), + inventory_image = "3d_armor_inv_boots_gold.png", + groups = {armor_feet=1, armor_heal=6, armor_use=300, + physics_speed=-0.02, physics_gravity=0.02}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "gold" + local m = armor.materials.gold + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.de.tr b/mods/3d_armor/armor_gold/locale/armor_gold.de.tr new file mode 100644 index 00000000..f7098cf1 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Goldhelm +Gold Chestplate=Goldbrustplatte +Gold Leggings=Goldhose +Gold Boots=Goldstiefel diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr b/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr new file mode 100644 index 00000000..58916f1d --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Ora Kasko +Gold Chestplate=Ora Kiraso +Gold Leggings=Ora Pantalono +Gold Boots=Oraj Botoj diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.es.tr b/mods/3d_armor/armor_gold/locale/armor_gold.es.tr new file mode 100644 index 00000000..e82affbc --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Casco de oro +Gold Chestplate=Peto de oro +Gold Leggings=Grebas de oro +Gold Boots=Botas de oro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr b/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr new file mode 100644 index 00000000..8b3a2ae8 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Casque en or +Gold Chestplate=Cuirasse en or +Gold Leggings=Jambières en or +Gold Boots=Bottes en or diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.it.tr b/mods/3d_armor/armor_gold/locale/armor_gold.it.tr new file mode 100644 index 00000000..7480cfcd --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Elmo d'oro +Gold Chestplate=Corazza d'oro +Gold Leggings=Gambali d'oro +Gold Boots=Stivali d'oro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr b/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr new file mode 100644 index 00000000..47e0e695 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Helmet Emas +Gold Chestplate=Perisai Dada Emas +Gold Leggings=Perisai Kaki Emas +Gold Boots=But Emas diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr b/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr new file mode 100644 index 00000000..abe79331 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Capacete de Ouro +Gold Chestplate=Peitoral de Ouro +Gold Leggings=Calças de Ouro +Gold Boots=Botas de Ouro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr b/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr new file mode 100644 index 00000000..abe79331 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Capacete de Ouro +Gold Chestplate=Peitoral de Ouro +Gold Leggings=Calças de Ouro +Gold Boots=Botas de Ouro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr b/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr new file mode 100644 index 00000000..c25f20fe --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=золотой шлем +Gold Chestplate=золотой нагрудник +Gold Leggings=золотые штаны +Gold Boots=золотые ботинки diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr b/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr new file mode 100644 index 00000000..02191d3b --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Guldhjälm +Gold Chestplate=Goldbröstplatta +Gold Leggings=Guldbyxor +Gold Boots=Guldstövlar diff --git a/mods/3d_armor/armor_gold/locale/template.txt b/mods/3d_armor/armor_gold/locale/template.txt new file mode 100644 index 00000000..178aff0b --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet= +Gold Chestplate= +Gold Leggings= +Gold Boots= diff --git a/mods/3d_armor/armor_gold/mod.conf b/mods/3d_armor/armor_gold/mod.conf new file mode 100644 index 00000000..092ab6de --- /dev/null +++ b/mods/3d_armor/armor_gold/mod.conf @@ -0,0 +1,3 @@ +name = armor_gold +depends = 3d_armor +description = Adds craftable gold armor. diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png new file mode 100644 index 00000000..cd339b6a Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png new file mode 100644 index 00000000..f70f30f1 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png new file mode 100644 index 00000000..4c67491c Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png new file mode 100644 index 00000000..01d8d5c7 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png new file mode 100644 index 00000000..3a51908c Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png new file mode 100644 index 00000000..fb3ba0e9 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png new file mode 100644 index 00000000..1102ea05 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png new file mode 100644 index 00000000..bdbea82b Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png new file mode 100644 index 00000000..f5f2fa67 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png new file mode 100644 index 00000000..5aeccb58 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png new file mode 100644 index 00000000..8ee0bc44 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png differ diff --git a/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png new file mode 100644 index 00000000..a7cf3104 Binary files /dev/null and b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png differ diff --git a/mods/3d_armor/armor_mithril/init.lua b/mods/3d_armor/armor_mithril/init.lua new file mode 100644 index 00000000..cdec0db3 --- /dev/null +++ b/mods/3d_armor/armor_mithril/init.lua @@ -0,0 +1,162 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Mithril +-- +-- Requires `armor_material_mithril`. +-- +-- @section mithril + +if armor.materials.mithril then + --- Mithril Helmet + -- + -- @helmet 3d_armor:helmet_mithril + -- @img 3d_armor_inv_helmet_mithril.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_mithril", { + description = S("Mithril Helmet"), + inventory_image = "3d_armor_inv_helmet_mithril.png", + groups = {armor_head=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Chestplate + -- + -- @chestplate 3d_armor:chestplate_mithril + -- @img 3d_armor_inv_chestplate_mithril.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_mithril", { + description = S("Mithril Chestplate"), + inventory_image = "3d_armor_inv_chestplate_mithril.png", + groups = {armor_torso=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=21}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Leggings + -- + -- @leggings 3d_armor:leggings_mithril + -- @img 3d_armor_inv_leggings_mithril.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_mithril", { + description = S("Mithril Leggings"), + inventory_image = "3d_armor_inv_leggings_mithril.png", + groups = {armor_legs=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=21}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Boots + -- + -- @boots 3d_armor:boots_mithril + -- @img 3d_armor_inv_boots_mithril.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_mithril", { + description = S("Mithril Boots"), + inventory_image = "3d_armor_inv_boots_mithril.png", + groups = {armor_feet=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "mithril" + local m = armor.materials.mithril + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr new file mode 100644 index 00000000..09fdf206 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mithrilhelm +Mithril Chestplate=Mithrilbrustplatte +Mithril Leggings=Mithrilhose +Mithril Boots=Mithrilstiefel diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr new file mode 100644 index 00000000..ae5c92da --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mitrila Kasko +Mithril Chestplate=Mitrila Kiraso +Mithril Leggings=Mitrila Pantalono +Mithril Boots=Mitrilaj Botoj diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr new file mode 100644 index 00000000..aaae80fb --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Casco de mitrilo +Mithril Chestplate=Peto de mitrilo +Mithril Leggings=Grebas de mitrilo +Mithril Boots=Botas de mitrilo diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr new file mode 100644 index 00000000..fad39102 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Casque en mithril +Mithril Chestplate=Cuirasse en mithril +Mithril Leggings=Jambières en mithril +Mithril Boots=Bottes en mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr new file mode 100644 index 00000000..9490f72b --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Elmo di mithril +Mithril Chestplate=Corazza di mithril +Mithril Leggings=Gambali di mithril +Mithril Boots=Stivali di mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr new file mode 100644 index 00000000..fc113a63 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Helmet Mithril +Mithril Chestplate=Perisai Dada Mithril +Mithril Leggings=Perisai Kaki Mithril +Mithril Boots=But Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr new file mode 100644 index 00000000..82b8db1d --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Capacete de Mithril +Mithril Chestplate=Peitoral de Mithril +Mithril Leggings=Calças de Mithril +Mithril Boots=Botas de Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr new file mode 100644 index 00000000..82b8db1d --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Capacete de Mithril +Mithril Chestplate=Peitoral de Mithril +Mithril Leggings=Calças de Mithril +Mithril Boots=Botas de Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr new file mode 100644 index 00000000..3444f2f8 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=мифриловый шлем +Mithril Chestplate=мифриловый нагрудник +Mithril Leggings=мифриловые штаны +Mithril Boots=мифриловые ботинки diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr new file mode 100644 index 00000000..0d8ed8e0 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mithrilhjälm +Mithril Chestplate=Mithrilbröstplatta +Mithril Leggings=Mithrilbyxor +Mithril Boots=Mithrilstövlar diff --git a/mods/3d_armor/armor_mithril/locale/template.txt b/mods/3d_armor/armor_mithril/locale/template.txt new file mode 100644 index 00000000..4d5da603 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet= +Mithril Chestplate= +Mithril Leggings= +Mithril Boots= diff --git a/mods/3d_armor/armor_mithril/mod.conf b/mods/3d_armor/armor_mithril/mod.conf new file mode 100644 index 00000000..5cc6948d --- /dev/null +++ b/mods/3d_armor/armor_mithril/mod.conf @@ -0,0 +1,4 @@ +name = armor_mithril +depends = 3d_armor +optional_depends = moreores +description = Adds craftable mithril armor. diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png new file mode 100644 index 00000000..af7b9439 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png new file mode 100644 index 00000000..1ebf92a0 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png new file mode 100644 index 00000000..aa06d189 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png new file mode 100644 index 00000000..27542900 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png new file mode 100644 index 00000000..2e9caef9 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png new file mode 100644 index 00000000..91e7c185 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png new file mode 100644 index 00000000..43e6b14b Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png new file mode 100644 index 00000000..d2b1bd09 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png new file mode 100644 index 00000000..850991c6 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png new file mode 100644 index 00000000..3825a235 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png new file mode 100644 index 00000000..9fc78fb5 Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png differ diff --git a/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png new file mode 100644 index 00000000..dde7b3de Binary files /dev/null and b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png differ diff --git a/mods/3d_armor/armor_nether/init.lua b/mods/3d_armor/armor_nether/init.lua new file mode 100644 index 00000000..3e20ee33 --- /dev/null +++ b/mods/3d_armor/armor_nether/init.lua @@ -0,0 +1,168 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + + +--- Nether +-- +-- Requires `armor_material_nether`. +-- +-- @section nether + +if armor.materials.nether then + --- Nether Helmet + -- + -- @helmet 3d_armor:helmet_nether + -- @img 3d_armor_inv_helmet_nether.png + -- @grp armor_head 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 18 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_nether", { + description = S("Nether Helmet"), + inventory_image = "3d_armor_inv_helmet_nether.png", + groups = {armor_head=1, armor_heal=14, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=18}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Chestplate + -- + -- @chestplate 3d_armor:chestplate_nether + -- @img 3d_armor_inv_chestplate_nether.png + -- @grp armor_torso 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 25 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_nether", { + description = S("Nether Chestplate"), + inventory_image = "3d_armor_inv_chestplate_nether.png", + groups = {armor_torso=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=25}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Leggings + -- + -- @leggings 3d_armor:leggings_nether + -- @img 3d_armor_inv_leggings_nether.png + -- @grp armor_legs 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 25 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_nether", { + description = S("Nether Leggings"), + inventory_image = "3d_armor_inv_leggings_nether.png", + groups = {armor_legs=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=25}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Boots + -- + -- @boots 3d_armor:boots_nether + -- @img 3d_armor_inv_boots_nether.png + -- @grp armor_feet 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 18 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_nether", { + description = S("Nether Boots"), + inventory_image = "3d_armor_inv_boots_nether.png", + groups = {armor_feet=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=18}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "nether" + local m = armor.materials.nether + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) + +end diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.de.tr b/mods/3d_armor/armor_nether/locale/armor_nether.de.tr new file mode 100644 index 00000000..d1793537 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Netherhelm +Nether Chestplate=Netherbrustplatte +Nether Leggings=Netherhose +Nether Boots=Netherstiefel diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr b/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr new file mode 100644 index 00000000..cdf5c02f --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Inferna Kasko +Nether Chestplate=Inferna Kiraso +Nether Leggings=Inferna Pantalono +Nether Boots=Infernaj Botoj diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.es.tr b/mods/3d_armor/armor_nether/locale/armor_nether.es.tr new file mode 100644 index 00000000..1e672e48 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Casco de nether +Nether Chestplate=Peto de nether +Nether Leggings=Grebas de nether +Nether Boots=Botas de nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr b/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr new file mode 100644 index 00000000..96b78781 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Casque en nether +Nether Chestplate=Cuirasse en nether +Nether Leggings=Jambières en nether +Nether Boots=Bottes en nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.it.tr b/mods/3d_armor/armor_nether/locale/armor_nether.it.tr new file mode 100644 index 00000000..036118b4 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Elmo di nether +Nether Chestplate=Corazza di nether +Nether Leggings=Gambali di nether +Nether Boots=Stivali di nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr b/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr new file mode 100644 index 00000000..7b9fd1bb --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Helmet Nether +Nether Chestplate=Perisai Dada Nether +Nether Leggings=Perisai Kaki Nether +Nether Boots=But Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr b/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr new file mode 100644 index 00000000..b29983a5 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Capacete de Nether +Nether Chestplate=Peitoral de Nether +Nether Leggings=Calças de Nether +Nether Boots=Botas de Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr b/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr new file mode 100644 index 00000000..b29983a5 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Capacete de Nether +Nether Chestplate=Peitoral de Nether +Nether Leggings=Calças de Nether +Nether Boots=Botas de Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr b/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr new file mode 100644 index 00000000..3ba213d8 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=адÑкий шлем +Nether Chestplate=адÑкий нагрудник +Nether Leggings=адÑкие штаны +Nether Boots=адÑкие ботинки diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr b/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr new file mode 100644 index 00000000..a26599ce --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Netherhjälm +Nether Chestplate=Netherbröstplatta +Nether Leggings=Netherbyxor +Nether Boots=Netherstövlar diff --git a/mods/3d_armor/armor_nether/locale/template.txt b/mods/3d_armor/armor_nether/locale/template.txt new file mode 100644 index 00000000..7b02e38c --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet= +Nether Chestplate= +Nether Leggings= +Nether Boots= diff --git a/mods/3d_armor/armor_nether/mod.conf b/mods/3d_armor/armor_nether/mod.conf new file mode 100644 index 00000000..3e99b555 --- /dev/null +++ b/mods/3d_armor/armor_nether/mod.conf @@ -0,0 +1,4 @@ +name = armor_nether +depends = 3d_armor +optional_depends = nether +description = Adds craftable wood armor. diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png new file mode 100644 index 00000000..745b765c Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png new file mode 100644 index 00000000..e459d953 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png new file mode 100644 index 00000000..c26bf2dc Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png new file mode 100644 index 00000000..818c3056 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png new file mode 100644 index 00000000..202a8d52 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png new file mode 100644 index 00000000..0f2c0e14 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png new file mode 100644 index 00000000..97e4781a Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png new file mode 100644 index 00000000..8fa2aecf Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png new file mode 100644 index 00000000..2882244b Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png new file mode 100644 index 00000000..94b08762 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png new file mode 100644 index 00000000..772c4869 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png differ diff --git a/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png new file mode 100644 index 00000000..32bceb88 Binary files /dev/null and b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png differ diff --git a/mods/3d_armor/armor_steel/init.lua b/mods/3d_armor/armor_steel/init.lua new file mode 100644 index 00000000..d8cbc0bc --- /dev/null +++ b/mods/3d_armor/armor_steel/init.lua @@ -0,0 +1,181 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Steel +-- +-- Requires setting `armor_material_steel`. +-- +-- @section steel + +if armor.materials.steel then + --- Steel Helmet + -- + -- @helmet 3d_armor:helmet_steel + -- @img 3d_armor_inv_helmet_steel.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.01 + -- @grp physica_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_steel", { + description = S("Steel Helmet"), + inventory_image = "3d_armor_inv_helmet_steel.png", + groups = {armor_head=1, armor_heal=0, armor_use=800, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Chestplate + -- + -- @chestplate 3d_armor:chestplate_steel + -- @img 3d_armor_inv_chestplate_steel.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed + -- @grp physics_gravity + -- @armorgrp fleshy + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_steel", { + description = S("Steel Chestplate"), + inventory_image = "3d_armor_inv_chestplate_steel.png", + groups = {armor_torso=1, armor_heal=0, armor_use=800, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Leggings + -- + -- @leggings 3d_armor:leggings_steel + -- @img 3d_armor_inv_leggings_steel.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_steel", { + description = S("Steel Leggings"), + inventory_image = "3d_armor_inv_leggings_steel.png", + groups = {armor_legs=1, armor_heal=0, armor_use=800, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Boots + -- + -- @boots 3d_armor:boots_steel + -- @img 3d_armor_inv_boots_steel.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_steel", { + description = S("Steel Boots"), + inventory_image = "3d_armor_inv_boots_steel.png", + groups = {armor_feet=1, armor_heal=0, armor_use=800, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "steel" + local m = armor.materials.steel + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.de.tr b/mods/3d_armor/armor_steel/locale/armor_steel.de.tr new file mode 100644 index 00000000..0be569ac --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Stahlhelm +Steel Chestplate=Stahlbrustplatte +Steel Leggings=Stahlhose +Steel Boots=Stahlstiefel diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr b/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr new file mode 100644 index 00000000..8c1d0661 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Åœtala Kasko +Steel Chestplate=Åœtala Kiraso +Steel Leggings=Åœtala Pantalono +Steel Boots=Åœtalaj Botoj diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.es.tr b/mods/3d_armor/armor_steel/locale/armor_steel.es.tr new file mode 100644 index 00000000..9af65df6 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Casco de acero +Steel Chestplate=Peto de acero +Steel Leggings=Grebas de acero +Steel Boots=Botas de acero diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr b/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr new file mode 100644 index 00000000..8f1d063a --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Casque en acier +Steel Chestplate=Cuirasse en acier +Steel Leggings=Jambières en acier +Steel Boots=Bottes en acier diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.it.tr b/mods/3d_armor/armor_steel/locale/armor_steel.it.tr new file mode 100644 index 00000000..cbd08789 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Elmo d'acciaio +Steel Chestplate=Corazza d'acciaio +Steel Leggings=Gambali d'acciaio +Steel Boots=Stivali d'acciaio diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr b/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr new file mode 100644 index 00000000..201a2f6c --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Helmet Keluli +Steel Chestplate=Perisai Dada Keluli +Steel Leggings=Perisai Kaki Keluli +Steel Boots=But Keluli diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr b/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr new file mode 100644 index 00000000..a30fd928 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Capacete de Aço +Steel Chestplate=Peitoral de Aço +Steel Leggings=Calças de Aço +Steel Boots=Botas de Aço diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr b/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr new file mode 100644 index 00000000..a30fd928 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Capacete de Aço +Steel Chestplate=Peitoral de Aço +Steel Leggings=Calças de Aço +Steel Boots=Botas de Aço diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr b/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr new file mode 100644 index 00000000..ed836ce2 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Ñтальной шлем +Steel Chestplate=Ñтальной нагрудник +Steel Leggings=Ñтальные штаны +Steel Boots=Ñтальные ботинки diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr b/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr new file mode 100644 index 00000000..1353b4ad --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=StÃ¥lhjälm +Steel Chestplate=StÃ¥lbröstplatta +Steel Leggings=StÃ¥lbyxor +Steel Boots=StÃ¥lstövlar diff --git a/mods/3d_armor/armor_steel/locale/template.txt b/mods/3d_armor/armor_steel/locale/template.txt new file mode 100644 index 00000000..0d6c3f61 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet= +Steel Chestplate= +Steel Leggings= +Steel Boots= diff --git a/mods/3d_armor/armor_steel/mod.conf b/mods/3d_armor/armor_steel/mod.conf new file mode 100644 index 00000000..962e756d --- /dev/null +++ b/mods/3d_armor/armor_steel/mod.conf @@ -0,0 +1,3 @@ +name = armor_steel +depends = 3d_armor +description = Adds craftable steel armor. diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png new file mode 100644 index 00000000..ff8e8f8d Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png new file mode 100644 index 00000000..968ffc5b Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png new file mode 100644 index 00000000..cc6d5709 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png new file mode 100644 index 00000000..162ce4b9 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png new file mode 100644 index 00000000..f3c4a395 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png new file mode 100644 index 00000000..fb939c4e Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png new file mode 100644 index 00000000..170f0d9b Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png new file mode 100644 index 00000000..434f1bc3 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png new file mode 100644 index 00000000..5414f9a2 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png new file mode 100644 index 00000000..b4d083e7 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png new file mode 100644 index 00000000..974cb5d8 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png differ diff --git a/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png new file mode 100644 index 00000000..99034ca8 Binary files /dev/null and b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png differ diff --git a/mods/3d_armor/armor_wood/init.lua b/mods/3d_armor/armor_wood/init.lua new file mode 100644 index 00000000..f9b6b82b --- /dev/null +++ b/mods/3d_armor/armor_wood/init.lua @@ -0,0 +1,186 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Wood +-- +-- Requires setting `armor_material_wood`. +-- +-- @section wood + +if armor.materials.wood then + --- Wood Helmet + -- + -- @helmet 3d_armor:helmet_wood + -- @img 3d_armor_inv_helmet_wood.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:helmet_wood", { + description = S("Wood Helmet"), + inventory_image = "3d_armor_inv_helmet_wood.png", + groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Chestplate + -- + -- @chestplate 3d_armor:chestplate_wood + -- @img 3d_armor_inv_chestplate_wood.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:chestplate_wood", { + description = S("Wood Chestplate"), + inventory_image = "3d_armor_inv_chestplate_wood.png", + groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Leggings + -- + -- @leggings 3d_armor:leggings_wood + -- @img 3d_armor_inv_leggings_wood.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @grp flammable 1 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:leggings_wood", { + description = S("Wood Leggings"), + inventory_image = "3d_armor_inv_leggings_wood.png", + groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Boots + -- + -- @boots 3d_armor:boots_wood + -- @img 3d_armor_inv_boots_wood.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:boots_wood", { + description = S("Wood Boots"), + inventory_image = "3d_armor_inv_boots_wood.png", + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1}, + }) + local wood_armor_fuel = { + helmet = 6, + chestplate = 8, + leggings = 7, + boots = 5 + } + for armor, burn in pairs(wood_armor_fuel) do + minetest.register_craft({ + type = "fuel", + recipe = "3d_armor:" .. armor .. "_wood", + burntime = burn, + }) + end + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "wood" + local m = armor.materials.wood + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.de.tr b/mods/3d_armor/armor_wood/locale/armor_wood.de.tr new file mode 100644 index 00000000..f4a10224 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Holzhelm +Wood Chestplate=Holzbrustplatte +Wood Leggings=Holzhose +Wood Boots=Holzstiefel diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr b/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr new file mode 100644 index 00000000..042ca7de --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Ligna Kasko +Wood Chestplate=Ligna Kiraso +Wood Leggings=Ligna Pantalono +Wood Boots=Lignaj Botoj diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.es.tr b/mods/3d_armor/armor_wood/locale/armor_wood.es.tr new file mode 100644 index 00000000..a43f9ab8 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Casco de madera +Wood Chestplate=Peto de madera +Wood Leggings=Grebas de madera +Wood Boots=Botas de madera diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr b/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr new file mode 100644 index 00000000..953a787e --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Casque en bois +Wood Chestplate=Cuirasse en bois +Wood Leggings=Jambières en bois +Wood Boots=Bottes en bois diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.it.tr b/mods/3d_armor/armor_wood/locale/armor_wood.it.tr new file mode 100644 index 00000000..ef4b540d --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Elmo di legno +Wood Chestplate=Corazza di legno +Wood Leggings=Gambali di legno +Wood Boots=Stivali di legno diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr b/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr new file mode 100644 index 00000000..6ef45935 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Helmet Kayu +Wood Chestplate=Perisai Dada Kayu +Wood Leggings=Perisai Kaki Kayu +Wood Boots=But Kayu diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr b/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr new file mode 100644 index 00000000..ab471a43 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Capacete de Madeira +Wood Chestplate=Peitoral de Madeira +Wood Leggings=Calças de Madeira +Wood Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr b/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr new file mode 100644 index 00000000..ab471a43 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Capacete de Madeira +Wood Chestplate=Peitoral de Madeira +Wood Leggings=Calças de Madeira +Wood Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr b/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr new file mode 100644 index 00000000..93fdb554 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=деревÑнный шлем +Wood Chestplate=деревÑнный нагрудник +Wood Leggings=деревÑнные штаны +Wood Boots=деревÑнные ботинки diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr b/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr new file mode 100644 index 00000000..56b08a08 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Trähjälm +Wood Chestplate=Träbröstplatta +Wood Leggings=Träbyxor +Wood Boots=Trästövlar diff --git a/mods/3d_armor/armor_wood/locale/template.txt b/mods/3d_armor/armor_wood/locale/template.txt new file mode 100644 index 00000000..88934d38 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet= +Wood Chestplate= +Wood Leggings= +Wood Boots= diff --git a/mods/3d_armor/armor_wood/mod.conf b/mods/3d_armor/armor_wood/mod.conf new file mode 100644 index 00000000..2155fa3c --- /dev/null +++ b/mods/3d_armor/armor_wood/mod.conf @@ -0,0 +1,3 @@ +name = armor_wood +depends = 3d_armor +description = Adds craftable wood armor. diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png new file mode 100644 index 00000000..e62bdc5f Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png new file mode 100644 index 00000000..de841b01 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png new file mode 100644 index 00000000..2db95ce2 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png new file mode 100644 index 00000000..a1431e3e Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png new file mode 100644 index 00000000..8bda21c7 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png new file mode 100644 index 00000000..903a0182 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png new file mode 100644 index 00000000..a5e78630 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png new file mode 100644 index 00000000..fa1b24ef Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png new file mode 100644 index 00000000..8fbe6a80 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png new file mode 100644 index 00000000..c46cdd92 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png new file mode 100644 index 00000000..96081449 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png differ diff --git a/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png new file mode 100644 index 00000000..7e43ea55 Binary files /dev/null and b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png differ diff --git a/mods/3d_armor/cc-by-sa-3.0.txt b/mods/3d_armor/cc-by-sa-3.0.txt new file mode 100644 index 00000000..604209a8 --- /dev/null +++ b/mods/3d_armor/cc-by-sa-3.0.txt @@ -0,0 +1,359 @@ +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at https://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at https://creativecommons.org/. diff --git a/mods/3d_armor/lgpl-2.1.md b/mods/3d_armor/lgpl-2.1.md new file mode 100644 index 00000000..4c337f0b --- /dev/null +++ b/mods/3d_armor/lgpl-2.1.md @@ -0,0 +1,503 @@ +# GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +## Preamble + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public Licenses +are intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + +When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there +is no warranty for the free library. Also, if the library is modified +by someone else and passed on, the recipients should know that what +they have is not the original version, so that the original author's +reputation will not be affected by problems that might be introduced +by others. + +Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + +When a program is linked with a library, whether statically or using a +shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + +We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + +Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +**0.** This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). Each +licensee is addressed as "you". + +A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does and +what the program that uses the Library does. + +**1.** You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a +fee. + +**2.** You may modify your copy or copies of the Library or any +portion of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +- **a)** The modified work must itself be a software library. +- **b)** You must cause the files modified to carry prominent + notices stating that you changed the files and the date of + any change. +- **c)** You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. +- **d)** If a facility in the modified Library refers to a function + or a table of data to be supplied by an application program that + uses the facility, other than as an argument passed when the + facility is invoked, then you must make a good faith effort to + ensure that, in the event an application does not supply such + function or table, the facility still operates, and performs + whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of + the application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +**3.** You may opt to apply the terms of the ordinary GNU General +Public License instead of this License to a given copy of the Library. +To do this, you must alter all the notices that refer to this License, +so that they refer to the ordinary GNU General Public License, version +2, instead of to this License. (If a newer version than version 2 of +the ordinary GNU General Public License has appeared, then you can +specify that version instead if you wish.) Do not make any other +change in these notices. + +Once this change is made in a given copy, it is irreversible for that +copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the +Library into a program that is not a library. + +**4.** You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from +a designated place, then offering equivalent access to copy the source +code from the same place satisfies the requirement to distribute the +source code, even though third parties are not compelled to copy the +source along with the object code. + +**5.** A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a work, +in isolation, is not a derivative work of the Library, and therefore +falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. Section +6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure +layouts and accessors, and small macros and small inline functions +(ten lines or less in length), then the use of the object file is +unrestricted, regardless of whether it is legally a derivative work. +(Executables containing this object code plus portions of the Library +will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +**6.** As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a work +containing portions of the Library, and distribute that work under +terms of your choice, provided that the terms permit modification of +the work for the customer's own use and reverse engineering for +debugging such modifications. + +You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +- **a)** Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood that + the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) +- **b)** Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (1) uses at run time + a copy of the library already present on the user's computer + system, rather than copying library functions into the executable, + and (2) will operate properly with a modified version of the + library, if the user installs one, as long as the modified version + is interface-compatible with the version that the work was + made with. +- **c)** Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. +- **d)** If distribution of the work is made by offering access to + copy from a designated place, offer equivalent access to copy the + above specified materials from the same place. +- **e)** Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + +It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +**7.** 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +- **a)** Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other + library facilities. This must be distributed under the terms of + the Sections above. +- **b)** Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + +**8.** You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +**9.** You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +**10.** Each time you redistribute the Library (or any work based on +the Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + +**11.** If, as a consequence of a court judgment or allegation of +patent infringement or for any other reason (not limited to patent +issues), conditions are imposed on you (whether by court order, +agreement or otherwise) that contradict the conditions of this +License, they do not excuse you from the conditions of this License. +If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, +then as a consequence you may not distribute the Library at all. For +example, if a patent license would not permit royalty-free +redistribution of the Library by all those who receive copies directly +or indirectly through you, then the only way you could satisfy both it +and this License would be to refrain entirely from distribution of the +Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +**12.** If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +**13.** The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +**14.** If you wish to incorporate parts of the Library into other +free programs whose distribution conditions are incompatible with +these, write to the author to ask for permission. For software which +is copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +**NO WARRANTY** + +**15.** BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**16.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + +## How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It +is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + one line to give the library's name and an idea of what it does. + Copyright (C) year name of author + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper +mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in + the library `Frob' (a library for tweaking knobs) written + by James Random Hacker. + + signature of Ty Coon, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/3d_armor/modpack.conf b/mods/3d_armor/modpack.conf new file mode 100644 index 00000000..9fa2a905 --- /dev/null +++ b/mods/3d_armor/modpack.conf @@ -0,0 +1,3 @@ +name = 3d_armor +title = 3D Armor +description = Visible player armor & wielded items. diff --git a/mods/3d_armor/settingtypes.txt b/mods/3d_armor/settingtypes.txt new file mode 100644 index 00000000..cd7750e0 --- /dev/null +++ b/mods/3d_armor/settingtypes.txt @@ -0,0 +1,73 @@ +[3d_armor] + +armor_material_wood (Enable wood armor) bool true +armor_material_cactus (Enable cactus armor) bool true +armor_material_steel (Enable steel armor) bool true +armor_material_bronze (Enable bronze armor) bool true +armor_material_diamond (Enable diamond armor) bool true +armor_material_gold (Enable gold armor) bool true +armor_material_mithril (Enable mithril armor) bool true +armor_material_crystal (Enable crystal armor) bool true +armor_material_nether (Enable nether armor) bool true + +# Increase this if you get initialization glitches when a player first joins. +armor_init_delay (Initialization delay) int 2 + +# Increase this if armor is not getting into bones due to server lag. +armor_bones_delay (Delay for bones) int 1 + +# How often player armor items are updated. +armor_update_time (Armor refresh rate [seconds]) int 1 + +# Drop armor when a player dies. +# Uses bones mod if present, otherwise items are dropped around the player. +armor_drop (Drop armor on death) bool true + +# Pulverize armor when a player dies, overrides armor_drop. +armor_destroy (Pulverize armor on death) bool false + +# You can use this to increase or decrease overall armor effectiveness, +# eg: level_multiplier = 0.5 will reduce armor level by half. +armor_level_multiplier (Armor effectiveness multiplier) float 1 + +# You can use this to increase or decrease overall armor healing, +# eg: armor_heal_multiplier = 0 will disable healing altogether. +armor_heal_multiplier (Armor healing multiplier) float 1 + +# Armor set item names, remove or add items to include them or remove them from whats considered an Armor set. +armor_set_elements (Armor set items) string head torso legs feet shield + +# Bonus multiplier when wearing armor set, set to the same as armor_level_multiplier to disable +armor_set_multiplier (Armor Set Bonus multiplier) float 1.1 + +# Enable water protection (periodically restores breath when activated). +armor_water_protect (Enable water protection) bool true + +# Enable fire protection (defaults true if using ethereal mod). +armor_fire_protect (Enable fire protection) bool false + +# Enable fire damage from torches (defaults true if using ethereal mod). +armor_fire_protect_torch (Enable fire protection torch damage) bool false + +# Enable punch damage effects. +armor_punch_damage (Enable damage effects) bool true + +# Enable migration of old armor inventories. +armor_migrate_old_inventory (Migrate old armor inventories) bool true + +# Armor is not visible on player model when enabled. +armor_transparent (Transparent armor) bool false + + +[shields] + +shields_disable_sounds (Disable shield sounds) bool false + + +[wieldview] + +# Set number of seconds between visible wielded item updates. +wieldview_update_time (Wieldview refresh rate [seconds]) int 2 + +# Show nodes as tiles, disabled by default. +wieldview_node_tiles (Show nodes as tiles) bool false diff --git a/mods/3d_armor/shields/README.txt b/mods/3d_armor/shields/README.txt new file mode 100644 index 00000000..5a72097a --- /dev/null +++ b/mods/3d_armor/shields/README.txt @@ -0,0 +1,16 @@ +[mod] Shields [shields] +======================= + +Adds shields to 3d_armor + +Depends: 3d_armor + +Originally a part of 3d_armor, shields have been re-included as an optional extra. +If you do not what shields then simply remove the shields folder from the modpack. + +Shields Configuration +--------------------- + +Override the following default settings by adding them to your minetest.conf file. + +shields_disable_sounds = false diff --git a/mods/3d_armor/shields/crafting_guide.txt b/mods/3d_armor/shields/crafting_guide.txt new file mode 100644 index 00000000..689da8c6 --- /dev/null +++ b/mods/3d_armor/shields/crafting_guide.txt @@ -0,0 +1,37 @@ +Shields -- Crafting Guide +-------------------------- + ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | X | X | ++---+---+---+ +| | X | | ++---+---+---+ + +[shields:shield_wood] X = [default:wood] +[shields:shield_cactus] X = [default:cactus] +[shields:shield_steel] X = [default:steel_ingot] +[shields:shield_bronze] X = [default:bronze_ingot] +[shields:shield_diamond] X = [default:diamond] +[shields:shield_gold] X = [default:gold_ingot] +[shields:shield_mithril] X = [moreores:mithril_ingot] +[shields:shield_crystal] X = [ethereal:crystal_ingot] +[shields:shield_nether] X = [ethereal:nether_ingot] + +Enhanced Shields +---------------- + ++---+ +| S | ++---+ +| X | ++---+ +| S | ++---+ + +[shields:shield_enhanced_wood] X = [shields:shield_wood] +[shields:shield_enhanced_cactus] X = [shields:shield_cactus] + +S = [default:steel_ingot] + diff --git a/mods/3d_armor/shields/init.lua b/mods/3d_armor/shields/init.lua new file mode 100644 index 00000000..3b2b43cf --- /dev/null +++ b/mods/3d_armor/shields/init.lua @@ -0,0 +1,411 @@ + +--- 3D Armor Shields +-- +-- @topic shields + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +local disable_sounds = minetest.settings:get_bool("shields_disable_sounds") +local function play_sound_effect(player, name) + if not disable_sounds and player then + local pos = player:get_pos() + if pos then + minetest.sound_play(name, { + pos = pos, + max_hear_distance = 10, + gain = 0.5, + }) + end + end +end + +if minetest.global_exists("armor") and armor.elements then + table.insert(armor.elements, "shield") +end + +-- Regisiter Shields + +--- Admin Shield +-- +-- @shield shields:shield_admin +-- @img shields_inv_shield_admin.png +-- @grp armor_shield 1000 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_int_creative_inventory 1 +armor:register_armor("shields:shield_admin", { + description = S("Admin Shield"), + inventory_image = "shields_inv_shield_admin.png", + groups = {armor_shield=1000, armor_heal=100, armor_use=0, not_in_creative_inventory=1}, +}) + +minetest.register_alias("adminshield", "shields:shield_admin") + + +if armor.materials.wood then + --- Wood Shield + -- + -- @shield shields:shield_wood + -- @img shields_inv_shield_wood.png + -- @grp armor_shield 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor("shields:shield_wood", { + description = S("Wooden Shield"), + inventory_image = "shields_inv_shield_wood.png", + groups = {armor_shield=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_wood_footstep") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_wood_footstep") + end, + }) + --- Enhanced Wood Shield + -- + -- @shield shields:shield_enhanced_wood + -- @img shields_inv_shield_enhanced_wood.png + -- @grp armor_shield 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @armorgrp fleshy 8 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 2 + armor:register_armor("shields:shield_enhanced_wood", { + description = S("Enhanced Wood Shield"), + inventory_image = "shields_inv_shield_enhanced_wood.png", + groups = {armor_shield=1, armor_heal=0, armor_use=2000}, + armor_groups = {fleshy=8}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=2}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_dig_metal") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_dug_metal") + end, + }) + minetest.register_craft({ + output = "shields:shield_enhanced_wood", + recipe = { + {"default:steel_ingot"}, + {"shields:shield_wood"}, + {"default:steel_ingot"}, + }, + }) + minetest.register_craft({ + type = "fuel", + recipe = "shields:shield_wood", + burntime = 8, + }) +end + +if armor.materials.cactus then + --- Cactus Shield + -- + -- @shield shields:shield_cactus + -- @img shields_inv_shield_cactus.png + -- @grp armor_shield 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor("shields:shield_cactus", { + description = S("Cactus Shield"), + inventory_image = "shields_inv_shield_cactus.png", + groups = {armor_shield=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_wood_footstep") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_wood_footstep") + end, + }) + --- Enhanced Cactus Shield + -- + -- @shield shields:shield_enhanced_cactus + -- @img shields_inv_shield_enhanced_cactus.png + -- @grp armor_shield 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 8 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 2 + armor:register_armor("shields:shield_enhanced_cactus", { + description = S("Enhanced Cactus Shield"), + inventory_image = "shields_inv_shield_enhanced_cactus.png", + groups = {armor_shield=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=8}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=2}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_dig_metal") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_dug_metal") + end, + }) + minetest.register_craft({ + output = "shields:shield_enhanced_cactus", + recipe = { + {"default:steel_ingot"}, + {"shields:shield_cactus"}, + {"default:steel_ingot"}, + }, + }) + minetest.register_craft({ + type = "fuel", + recipe = "shields:shield_cactus", + burntime = 16, + }) +end + +if armor.materials.steel then + --- Steel Shield + -- + -- @shield shields:shield_steel + -- @img shields_inv_shield_steel.png + -- @grp armor_shield 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor("shields:shield_steel", { + description = S("Steel Shield"), + inventory_image = "shields_inv_shield_steel.png", + groups = {armor_shield=1, armor_heal=0, armor_use=800, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_dig_metal") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_dug_metal") + end, + }) +end + +if armor.materials.bronze then + --- Bronze Shield + -- + -- @shield shields:shield_bronze + -- @img shields_inv_shield_bronze.png + -- @grp armor_shield 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor("shields:shield_bronze", { + description = S("Bronze Shield"), + inventory_image = "shields_inv_shield_bronze.png", + groups = {armor_shield=1, armor_heal=6, armor_use=400, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_dig_metal") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_dug_metal") + end, + }) +end + +if armor.materials.diamond then + --- Diamond Shield + -- + -- @shield shields:shield_diamond + -- @img shields_inv_shield_diamond.png + -- @grp armor_shield 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor("shields:shield_diamond", { + description = S("Diamond Shield"), + inventory_image = "shields_inv_shield_diamond.png", + groups = {armor_shield=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_glass_footstep") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_break_glass") + end, + }) +end + +if armor.materials.gold then + --- Gold Shield + -- + -- @shield shields:shield_gold + -- @img shields_inv_shield_gold.png + -- @grp armor_shield 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor("shields:shield_gold", { + description = S("Gold Shield"), + inventory_image = "shields_inv_shield_gold.png", + groups = {armor_shield=1, armor_heal=6, armor_use=300, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_dig_metal") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_dug_metal") + end, + }) +end + +if armor.materials.mithril then + --- Mithril Shield + -- + -- @shield shields:shield_mithril + -- @img shields_inv_shield_mithril.png + -- @grp armor_shield 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor("shields:shield_mithril", { + description = S("Mithril Shield"), + inventory_image = "shields_inv_shield_mithril.png", + groups = {armor_shield=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_glass_footstep") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_break_glass") + end, + }) +end + +if armor.materials.crystal then + --- Crystal Shield + -- + -- @shield shields:shield_crystal + -- @img shields_inv_shield_crystal.png + -- @grp armor_shield 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor("shields:shield_crystal", { + description = S("Crystal Shield"), + inventory_image = "shields_inv_shield_crystal.png", + groups = {armor_shield=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_glass_footstep") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_break_glass") + end, + }) +end + +if armor.materials.nether then + --- Nether Shield + -- + -- @shield shields:shield_nether + -- @img shields_inv_shield_nether.png + -- @grp armor_shield 1 + -- @grp armor_heal 17 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor("shields:shield_nether", { + description = S("Nether Shield"), + inventory_image = "shields_inv_shield_nether.png", + groups = {armor_shield=1, armor_heal=17, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=3, snappy=2, level=3}, + reciprocate_damage = true, + on_damage = function(player, index, stack) + play_sound_effect(player, "default_glass_footstep") + end, + on_destroy = function(player, index, stack) + play_sound_effect(player, "default_break_glass") + end, + }) +end + +for k, v in pairs(armor.materials) do + minetest.register_craft({ + output = "shields:shield_"..k, + recipe = { + {v, v, v}, + {v, v, v}, + {"", v, ""}, + }, + }) +end diff --git a/mods/3d_armor/shields/locale/shields.de.tr b/mods/3d_armor/shields/locale/shields.de.tr new file mode 100644 index 00000000..7f86b4d6 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.de.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Adminschild +Wooden Shield=Holzschild +Enhanced Wood Shield=Verstärkter Holzschild +Cactus Shield=Kaktusschild +Enhanced Cactus Shield=Verstärkter Kaktusschild +Steel Shield=Stahlschild +Bronze Shield=Bronzeschild +Diamond Shield=Diamantschild +Gold Shield=Goldschild +Mithril Shield=Mithrilschild +Crystal Shield=Kristallschild +Nether Shield=Netherschild diff --git a/mods/3d_armor/shields/locale/shields.eo.tr b/mods/3d_armor/shields/locale/shields.eo.tr new file mode 100644 index 00000000..02de4e9e --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.eo.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Administra Åœildo +Wooden Shield=Ligna Åœildo +Enhanced Wood Shield=Plibonigita Ligna Åœildo +Cactus Shield=Kakta Åœildo +Enhanced Cactus Shield=Plibonigita Kakta Åœildo +Steel Shield=Åœtala Åœildo +Bronze Shield=Bronza Åœildo +Diamond Shield=Diamanta Åœildo +Gold Shield=Ora Åœildo +Mithril Shield=Mitrila Åœildo +Crystal Shield=Kristala Åœildo +Nether Shield=Inferna Åœildo diff --git a/mods/3d_armor/shields/locale/shields.es.tr b/mods/3d_armor/shields/locale/shields.es.tr new file mode 100644 index 00000000..962f130f --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.es.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Escudo de admin +Wooden Shield=Escudo de madera +Enhanced Wood Shield=Escudo de madera mejorado +Cactus Shield=Escudo de cactus +Enhanced Cactus Shield=Escudo de cactus mejorado +Steel Shield=Escudo de acero +Bronze Shield=Escudo de bronce +Diamond Shield=Escudo de diamante +Gold Shield=Escudo de oro +Mithril Shield=Escudo de mitrilo +Crystal Shield=Escudo de cristal +Nether Shield=Escudo de nether diff --git a/mods/3d_armor/shields/locale/shields.fr.tr b/mods/3d_armor/shields/locale/shields.fr.tr new file mode 100644 index 00000000..5c76e992 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.fr.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Bouclier d'admin +Wooden Shield=Bouclier en bois +Enhanced Wood Shield=Bouclier en bois amélioré +Cactus Shield=Bouclier en cactus +Enhanced Cactus Shield=Bouclier en cactus amélioré +Steel Shield=Bouclier en acier +Bronze Shield=Bouclier en bronze +Diamond Shield=Bouclier en diamant +Gold Shield=Bouclier en or +Mithril Shield=Bouclier en mithril +Crystal Shield=Bouclier en cristal +Nether Shield=Bouclier en nether diff --git a/mods/3d_armor/shields/locale/shields.pt_BR.tr b/mods/3d_armor/shields/locale/shields.pt_BR.tr new file mode 100644 index 00000000..26515cc6 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Escudo de Administrador +Wooden Shield=Escudo de Madeira +Enhanced Wood Shield=Escudo de Madeira Encantado +Cactus Shield=Escudo de Cacto +Enhanced Cactus Shield=Escude de Cacto Encantado +Steel Shield=Escudo de Aço +Bronze Shield=Escudo de Bronze +Diamond Shield=Escudo de Diamante +Gold Shield=Escudo de Ouro +Mithril Shield=Escudo de Mithril +Crystal Shield=Escudo de Cristal +Nether Shield=Escudo de Nether diff --git a/mods/3d_armor/shields/locale/shields.ru.tr b/mods/3d_armor/shields/locale/shields.ru.tr new file mode 100644 index 00000000..9e80ce64 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.ru.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=щит админа +Wooden Shield=деревÑнный щит +Enhanced Wood Shield=уÑиленный деревÑнный щит +Cactus Shield=кактуÑовый щит +Enhanced Cactus Shield=уÑиленный кактуÑовый щит +Steel Shield=Ñтальной щит +Bronze Shield=бронзовый щит +Diamond Shield=алмазный щит +Gold Shield=золотой щит +Mithril Shield=мифриловый щит +Crystal Shield=криÑтальный щит +Nether Shield=адÑкий щит diff --git a/mods/3d_armor/shields/locale/shields.sv.tr b/mods/3d_armor/shields/locale/shields.sv.tr new file mode 100644 index 00000000..fb14f539 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.sv.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Adminsköld +Wooden Shield=Träsköld +Enhanced Wood Shield=Förbättrad träsköld +Cactus Shield=Kaktussköld +Enhanced Cactus Shield=Förbättrad kaktussköld +Steel Shield=StÃ¥lsköld +Bronze Shield=Bronssköld +Diamond Shield=Diamantsköld +Gold Shield=Guldsköld +Mithril Shield=Mithrilsköld +Crystal Shield=Kristallsköld +Nether Shield=Nethersköld diff --git a/mods/3d_armor/shields/locale/template.txt b/mods/3d_armor/shields/locale/template.txt new file mode 100644 index 00000000..1b39fd68 --- /dev/null +++ b/mods/3d_armor/shields/locale/template.txt @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield= +Wooden Shield= +Enhanced Wood Shield= +Cactus Shield= +Enhanced Cactus Shield= +Steel Shield= +Bronze Shield= +Diamond Shield= +Gold Shield= +Mithril Shield= +Crystal Shield= +Nether Shield= diff --git a/mods/3d_armor/shields/mod.conf b/mods/3d_armor/shields/mod.conf new file mode 100644 index 00000000..9a956297 --- /dev/null +++ b/mods/3d_armor/shields/mod.conf @@ -0,0 +1,3 @@ +name = shields +depends = default, 3d_armor +description = Adds visible shields to 3d armor. diff --git a/mods/3d_armor/shields/textures/preview_index.txt b/mods/3d_armor/shields/textures/preview_index.txt new file mode 100644 index 00000000..8298ea79 --- /dev/null +++ b/mods/3d_armor/shields/textures/preview_index.txt @@ -0,0 +1,12 @@ +shields/textures/shields_shield_wood.png:shield +shields/textures/shields_shield_enhanced_wood.png:shield +shields/textures/shields_shield_cactus.png:shield +shields/textures/shields_shield_enhanced_cactus.png:shield +shields/textures/shields_shield_steel.png:shield +shields/textures/shields_shield_bronze.png:shield +shields/textures/shields_shield_gold.png:shield +shields/textures/shields_shield_diamond.png:shield +shields/textures/shields_shield_mithril.png:shield +shields/textures/shields_shield_crystal.png:shield +shields/textures/shields_shield_nether.png:shield +shields/textures/shields_shield_admin.png:shield diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_admin.png b/mods/3d_armor/shields/textures/shields_inv_shield_admin.png new file mode 100644 index 00000000..7ec86c46 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_admin.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png b/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png new file mode 100644 index 00000000..0e5c0725 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png b/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png new file mode 100644 index 00000000..4fd5cf21 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png b/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png new file mode 100644 index 00000000..18e90f54 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png b/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png new file mode 100644 index 00000000..e1723977 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png new file mode 100644 index 00000000..45cf71fd Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png new file mode 100644 index 00000000..945f84f9 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_gold.png b/mods/3d_armor/shields/textures/shields_inv_shield_gold.png new file mode 100644 index 00000000..d8e9d6b8 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_gold.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png b/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png new file mode 100644 index 00000000..a9dfa067 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_nether.png b/mods/3d_armor/shields/textures/shields_inv_shield_nether.png new file mode 100644 index 00000000..dbafb537 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_nether.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_steel.png b/mods/3d_armor/shields/textures/shields_inv_shield_steel.png new file mode 100644 index 00000000..76e00355 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_steel.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_wood.png b/mods/3d_armor/shields/textures/shields_inv_shield_wood.png new file mode 100644 index 00000000..2365086f Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_admin.png b/mods/3d_armor/shields/textures/shields_shield_admin.png new file mode 100644 index 00000000..12592728 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_admin.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_admin_preview.png b/mods/3d_armor/shields/textures/shields_shield_admin_preview.png new file mode 100644 index 00000000..f37efd5a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_admin_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_bronze.png b/mods/3d_armor/shields/textures/shields_shield_bronze.png new file mode 100644 index 00000000..e3a7ad4b Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_bronze.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png b/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png new file mode 100644 index 00000000..8450130c Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_cactus.png b/mods/3d_armor/shields/textures/shields_shield_cactus.png new file mode 100644 index 00000000..8c69d76a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png b/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png new file mode 100644 index 00000000..ab2a5316 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_crystal.png b/mods/3d_armor/shields/textures/shields_shield_crystal.png new file mode 100644 index 00000000..1ee039d8 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_crystal.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png b/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png new file mode 100644 index 00000000..8a32c8b1 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_diamond.png b/mods/3d_armor/shields/textures/shields_shield_diamond.png new file mode 100644 index 00000000..5bbb4fc1 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_diamond.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png b/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png new file mode 100644 index 00000000..78e69e61 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png new file mode 100644 index 00000000..980c4f19 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png new file mode 100644 index 00000000..4b85f48c Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png new file mode 100644 index 00000000..f87cf65a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png new file mode 100644 index 00000000..52ba7eb4 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_gold.png b/mods/3d_armor/shields/textures/shields_shield_gold.png new file mode 100644 index 00000000..09fa339a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_gold.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_gold_preview.png b/mods/3d_armor/shields/textures/shields_shield_gold_preview.png new file mode 100644 index 00000000..43375448 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_gold_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_mithril.png b/mods/3d_armor/shields/textures/shields_shield_mithril.png new file mode 100644 index 00000000..38558c4b Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_mithril.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png b/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png new file mode 100644 index 00000000..e5ca9873 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_nether.png b/mods/3d_armor/shields/textures/shields_shield_nether.png new file mode 100644 index 00000000..e7e3da29 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_nether.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_nether_preview.png b/mods/3d_armor/shields/textures/shields_shield_nether_preview.png new file mode 100644 index 00000000..a54a64bd Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_nether_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_steel.png b/mods/3d_armor/shields/textures/shields_shield_steel.png new file mode 100644 index 00000000..108dffe7 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_steel.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_steel_preview.png b/mods/3d_armor/shields/textures/shields_shield_steel_preview.png new file mode 100644 index 00000000..301a1499 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_steel_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_wood.png b/mods/3d_armor/shields/textures/shields_shield_wood.png new file mode 100644 index 00000000..8cc5b85a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_wood_preview.png b/mods/3d_armor/shields/textures/shields_shield_wood_preview.png new file mode 100644 index 00000000..c22465e4 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_wood_preview.png differ diff --git a/mods/3d_armor/wieldview/README.txt b/mods/3d_armor/wieldview/README.txt new file mode 100644 index 00000000..3a8b6406 --- /dev/null +++ b/mods/3d_armor/wieldview/README.txt @@ -0,0 +1,27 @@ +[mod] visible wielded items [wieldview] +======================================= + +Depends on: 3d_armor + +Makes hand wielded items visible to other players. + +default settings: [minetest.conf] + +# Set number of seconds between visible wielded item updates. +wieldview_update_time = 2 + +# Show nodes as tiles, disabled by default +wieldview_node_tiles = false + + +Info for modders +################ + +Wield image transformation: To apply a simple transformation to the item in +hand, add the group “wieldview_transform†to the item definition. The group +rating equals one of the numbers used for the [transform texture modifier +of the Lua API. + +Disabling the feature in-game: If you want to hide the wielded item +you can add an INT metadata to the player called "show_wielded_item" and set +it to 2 (any other value will show the wielded item again). diff --git a/mods/3d_armor/wieldview/get_texture.lua b/mods/3d_armor/wieldview/get_texture.lua new file mode 100644 index 00000000..1c84f16b --- /dev/null +++ b/mods/3d_armor/wieldview/get_texture.lua @@ -0,0 +1,215 @@ +local f = string.format + +local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") +if not node_tiles then + node_tiles = false + minetest.settings:set("wieldview_node_tiles", "false") +end + +-- https://github.com/minetest/minetest/blob/9fc018ded10225589d2559d24a5db739e891fb31/doc/lua_api.txt#L453-L462 +local function escape_texture(texturestring) + -- store in a variable so we don't return both rvs of gsub + local v = texturestring:gsub("%^", "\\^"):gsub(":", "\\:") + return v +end + +local function memoize(func) + local memo = {} + return function(arg) + if arg == nil then + return func(arg) + end + local rv = memo[arg] + + if not rv then + rv = func(arg) + memo[arg] = rv + end + + return rv + end +end + +local function is_vertical_frames(animation) + return ( + animation.type == "vertical_frames" and + animation.aspect_w and + animation.aspect_h + ) +end + +local function get_single_frame(animation, image_name) + return ("[combine:%ix%i^[noalpha^[colorize:#FFF:255^[mask:%s"):format( + animation.aspect_w, + animation.aspect_h, + image_name + ) +end + +local function is_sheet_2d(animation) + return ( + animation.type == "sheet_2d" and + animation.frames_w and + animation.frames_h + ) +end + +local function get_sheet_2d(animation, image_name) + return ("%s^[sheet:%ix%i:0,0"):format( + image_name, + animation.frames_w, + animation.frames_h + ) +end + +local get_image_from_tile = memoize(function(tile) + if type(tile) == "string" then + return tile + + elseif type(tile) == "table" then + local image_name + + if type(tile.image) == "string" then + image_name = tile.image + + elseif type(tile.name) == "string" then + image_name = tile.name + + end + + if image_name then + local animation = tile.animation + if animation then + if is_vertical_frames(animation) then + return get_single_frame(animation, image_name) + + elseif is_sheet_2d(animation) then + return get_sheet_2d(animation, image_name) + end + end + + return image_name + end + end + + return "blank.png" +end) + +local function get_image_cube(tiles) + if #tiles >= 6 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[6] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 5 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[5] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 4 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[4] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 3 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 2 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[2] or "no_texture.png"), + get_image_from_tile(tiles[2] or "no_texture.png") + ) + + elseif #tiles == 1 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[1] or "no_texture.png") + ) + end + + return "blank.png" +end + +local function is_normal_node(drawtype) + return ( + drawtype == "normal" or + drawtype == "allfaces" or + drawtype == "allfaces_optional" or + drawtype == "glasslike" or + drawtype == "glasslike_framed" or + drawtype == "glasslike_framed_optional" or + drawtype == "liquid" + ) +end + +armor.get_wield_image = memoize(function(item) + item = ItemStack(item) + + if item:is_empty() then + return "blank.png" + end + + local def = item:get_definition() + if not def then + return "unknown_item.png" + end + + local meta = item:get_meta() + local color = meta:get("color") or def.color + + local image = "blank.png" + + if def.wield_image and def.wield_image ~= "" then + local parts = {def.wield_image} + if color then + parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color)) + end + if def.wield_overlay then + parts[#parts + 1] = def.wield_overlay + end + image = table.concat(parts, "^") + + elseif def.inventory_image and def.inventory_image ~= "" then + local parts = {def.inventory_image} + if color then + parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color)) + end + if def.inventory_overlay then + parts[#parts + 1] = def.inventory_overlay + end + image = table.concat(parts, "^") + + elseif def.type == "node" then + if def.drawtype == "nodebox" or def.drawtype == "mesh" then + image = "blank.png" + + else + local tiles = def.tiles + if type(tiles) == "string" then + image = get_image_from_tile(tiles) + + elseif type(tiles) == "table" then + if is_normal_node(def.drawtype) and node_tiles then + image = get_image_cube(tiles) + + else + image = get_image_from_tile(tiles[1]) + end + end + end + end + + return image +end) diff --git a/mods/3d_armor/wieldview/init.lua b/mods/3d_armor/wieldview/init.lua new file mode 100644 index 00000000..80bb9cff --- /dev/null +++ b/mods/3d_armor/wieldview/init.lua @@ -0,0 +1,77 @@ +local time = 0 +local update_time = tonumber(minetest.settings:get("wieldview_update_time")) +if not update_time then + update_time = 2 + minetest.settings:set("wieldview_update_time", tostring(update_time)) +end + +wieldview = { + wielded_item = {}, + transform = {}, +} + +dofile(minetest.get_modpath(minetest.get_current_modname()).."/get_texture.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") + +wieldview.get_item_texture = function(self, item) + local texture = "blank.png" + if item ~= "" then + texture = armor.get_wield_image(item) + + -- Get item image transformation, first from group, then from transform.lua + local transform = minetest.get_item_group(item, "wieldview_transform") + if transform == 0 then + transform = wieldview.transform[item] + end + if transform then + -- This actually works with groups ratings because transform1, transform2, etc. + -- have meaning and transform0 is used for identidy, so it can be ignored + texture = texture.."^[transform"..tostring(transform) + end + end + return texture +end + +wieldview.update_wielded_item = function(self, player) + if not player then + return + end + local name = player:get_player_name() + local stack = player:get_wielded_item() + local item = stack:get_name() + if not item then + return + end + if self.wielded_item[name] then + if player:get_meta():get_int("show_wielded_item") == 2 then + item = "" + end + if self.wielded_item[name] == item then + return + end + armor.textures[name].wielditem = self:get_item_texture(item) + armor:update_player_visuals(player) + end + self.wielded_item[name] = item +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + wieldview.wielded_item[name] = "" + minetest.after(0, function(pname) + local pplayer = minetest.get_player_by_name(pname) + if pplayer then + wieldview:update_wielded_item(pplayer) + end + end, name) +end) + +minetest.register_globalstep(function(dtime) + time = time + dtime + if time > update_time then + for _,player in ipairs(minetest.get_connected_players()) do + wieldview:update_wielded_item(player) + end + time = 0 + end +end) diff --git a/mods/3d_armor/wieldview/mod.conf b/mods/3d_armor/wieldview/mod.conf new file mode 100644 index 00000000..c5f48128 --- /dev/null +++ b/mods/3d_armor/wieldview/mod.conf @@ -0,0 +1,3 @@ +name = wieldview +depends = 3d_armor +description = Makes hand wielded items visible to other players. diff --git a/mods/3d_armor/wieldview/transform.lua b/mods/3d_armor/wieldview/transform.lua new file mode 100644 index 00000000..4d5133e8 --- /dev/null +++ b/mods/3d_armor/wieldview/transform.lua @@ -0,0 +1,24 @@ +-- Wielded Item Transformations - http://dev.minetest.net/texture + +wieldview.transform = { + ["default:torch"]="R270", + ["default:sapling"]="R270", + ["flowers:dandelion_white"]="R270", + ["flowers:dandelion_yellow"]="R270", + ["flowers:geranium"]="R270", + ["flowers:rose"]="R270", + ["flowers:tulip"]="R270", + ["flowers:viola"]="R270", + ["bucket:bucket_empty"]="R270", + ["bucket:bucket_water"]="R270", + ["bucket:bucket_lava"]="R270", + ["screwdriver:screwdriver"]="R270", + ["screwdriver:screwdriver1"]="R270", + ["screwdriver:screwdriver2"]="R270", + ["screwdriver:screwdriver3"]="R270", + ["screwdriver:screwdriver4"]="R270", + ["vessels:glass_bottle"]="R270", + ["vessels:drinking_glass"]="R270", + ["vessels:steel_bottle"]="R270", +} + diff --git a/mods/abdecor/LICENSE b/mods/abdecor/LICENSE new file mode 100644 index 00000000..4b7f73fb --- /dev/null +++ b/mods/abdecor/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright © 2023 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mods/abdecor/README.md b/mods/abdecor/README.md new file mode 100644 index 00000000..b46f3f98 --- /dev/null +++ b/mods/abdecor/README.md @@ -0,0 +1,92 @@ +Advance Biome Decoration API +============================ + +Create advanced, complex biome decorations with the Advanced Biome Decoration API! While the internal Minetest biome API can be used to create many types of biome decorations, it has some limitations. Standard biome decorations cannot: + +- Place wallmounted decorations on walls +- Check for complex patterns of nodes to determine placement, e.g., checking multiple nodes high above the ground +- Create structures that vary placement based on arbitrary conditions, e.g., place different colors of nodes based on whether x/z coordinates are odd or even + +In order to facilitate more complex decorations, the Advanced Biome Decoration API uses a powerful and performant mechanism for targeting advanced decorations to the environment. The advanced decoration process works like so: + +1. Call `abdecor.register_advanced_decoration(...)` to register an advanced decoration +2. Self-destructing 'marker nodes' are placed to mark locations where advanced decorations should be generated +3. The biome API gennotify mechanism is used to identify the marker nodes during map generation +4. An advanced decoration function (supplied during registration) is called for each marker node to generate the advanced decoration at each marker location +5. All advanced decorations are written to the map and rendered in the world + +For working examples of what this API can do, see the [Advanced Biome Decoration Modpack](https://github.com/EmptyStar/abdecor_modpack) for reference. + +API +--- + +Advanced decorations are created via `abdecor.register_advanced_decoration(name, definition)`. This function returns `true` when an advanced decoration registration is successful and `false` if the registration was not successful. If the function returns `false`, check your debug.txt file to see why it rejected registration and make any adjustments as necessary. + +This function's parameters and definition schema are explained in the sections below. + +### `name` + +This is a simple string used to name the decoration. It should contain only `[a-zA-Z-0-9_]`. The name must be unique across all mods that use this API, so it is advised to do some simple namespacing, e.g., `mymod_mydecor1`. + +### `definition` + +This is a table that defines an advanced decoration. It must have certain keys that define how it is rendered in the world, plus other optional values that are important for certain use cases. Each key of the definition schema is described in detail below. + +#### `target` + +This is a table that represents a partial decoration definition as described in [the decoration definition section of the Minetest API docs](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L9140). This decoration definition is used to place mapgen nodes for your decoration in the environment, so you should try to target nodes in the environment that are closest to where you want to generate your advanced decoration. + +The following decoration definition fields are set/overridden by this API and therefore should not be specified: + +- `deco_type = "simple"` +- `name = ` +- `decoration = ` + +#### `fn` + +This is a function that is called for each marker node that is placed in the environment for your advanced decoration. It is responsible for actually checking the surrounding nodes and placing nodes according to how they should be placed in the current mapchunk. It is effectively the implementation of your advanced decoration. + +This function gets called for each advanced decoration that can be placed and gets passed a table with the following keys defined for each call: + +- `pos`: This is a table that represents the absolute position of the current decoration in the form of `{ x = , y = , z = }`. +- `voxelarea`: This is a [VoxelArea](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L4495) that represents the area of the current mapchunk being generated. It can be used to index the following two parameters. +- `data`: This is a flat [VoxelManip](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L4231) table that holds the node data for the current mapchunk being generated. This table can be read/written like any usual mapgen VoxelManip table. +- `param2`: This optional parameter is also a flat VoxelManip table, but it instead holds the [param2](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L1032) values for the nodes in the current mapchunk. This can be useful for rotating nodes, placing wallmounted nodes, etc. The value of this key is `nil` unless `param2 = true` is specified for the decoration's flags. +- `place_schematic`: This optional key is a function that passes through parameters to [`minetest.place_schematic_on_vmanip`](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L6285) for the current mapchunk being generated in order to place schematics in the current mapchunk. The value of this key is `nil` unless `schematic = true` is specified for the decoration's flags. The function takes a single table argument with the following keys: + - `pos`: The position at which to place the schematic. Must be a table in the form of `{ x = , y = , z = }`. This value is required. + - `schematic`: The schematic to place. This value must be a [schematic specifier](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L4179). This value is required. + - `rotation`: Which direction the schematic should face. Optional value that defaults to `"random"` + - `replacements`: Which nodes to replace with other nodes in the schematic. Optional value that defaults to `{}` + - `force_placement`: Boolean flag that determines whether to force placement of the schematic if it would otherwise collide with nodes that are already placed. Optional value that defaults to `false`. + - `flags`: A comma-delimited string containing any of `place_center_x`, `place_center_y`, and `place_center_z`. Optional value that defaults to `""` +- `calc_lighting`: This key is a function that passes through its exact parameters to [`VoxelManip.calc_lighting`](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L4479) +- `index2d`: This key is a function that indexes a two-dimensional flat array for the current mapchunk such as the array returned from `minetest.get_mapgen_object("heatmap")` and other such functions. This function takes either two integer arguments that represent x/z coordinates, or a single table argument in the form of `{ x = , z = }` (`y` value is optional/unused). +- `minp`: This is the `minp` value for the current [`minetest.register_on_generated(...)`](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L5185) call. +- `maxp`: This is the `maxp` value for the current [`minetest.register_on_generated(...)`](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L5185) call. +- `seed`: This is the `blockseed` value for the current [`minetest.register_on_generated(...)`](https://github.com/minetest/minetest/blob/cf5add14728f6f00eec0cc8221050ba91e6a9646/doc/lua_api.txt#L5185) call. + +This function does not directly interact with the VoxelManip object returned by `minetest.get_mapgen_object("voxelmanip")` and instead will only modify the current mapchunk using the values described above which are managed by the Advanced Biome Decoration API. Attempting to access the VoxelManip for the current mapchunk directly inside of this function is undefined and not recommended under any circumstances. + +This function may be called many times per mapchunk depending on how common your advanced decorations are, so this function should be made as efficient as possible as not to slow down mapgen: + +- Use the supplied VoxelArea and its `ystride`/`zstride` values to index the supplied `data`/`param2` arrays for best read/write performance. +- Make use of `return` to exit your decoration function quickly if an advanced decoration is not suitable at a given target location. +- Cache the results of lookup operations outside of your decoration function, such as calls to `minetest.get_content_id(...)` or `minetest.get_modpath(...)`. + +#### `flags` + +This optional parameter is a table that defines flags that each determine any special needs for an advanced decoration. Its keys and values are simple boolean flags that work as follows: + +- `param2`: Whether or not to load/use the VoxelManip param2 data for the current mapchunk. This should be set if your advanced decoration function needs access to param2 data. If your decoration does not use param2, then this flag should remain unset for better performance. Defaults to `false`. +- `liquid`: Whether or not your advanced decoration function manipulates liquids. If set, then `VoxelManip.update_liquids()` is called before writing the values back to the mapchunk. This ensures that generated liquids flow as expected. Set if your advanced decoration function places liquids, else leave unset for better performance. Defaults to `false`. +- `schematic`: Whether or not your advanced decoration function may place schematics. If set, then the `place_schematic` function described above is made available to your advanced decoration function for the purpose of placing schematics. Defaults to `false`. + +For clarity, the default flags table looks like this: + +```lua +{ + param2 = false, -- do not load param2 data + liquid = false, -- do not update liquids + schematic = false, -- decoration does not place schematics +} +``` \ No newline at end of file diff --git a/mods/abdecor/init.lua b/mods/abdecor/init.lua new file mode 100644 index 00000000..3d1eaf32 --- /dev/null +++ b/mods/abdecor/init.lua @@ -0,0 +1,227 @@ +local modpath = minetest.get_modpath("abdecor") + +abdecor = {} +abdecor.registered_names = {} +abdecor.registered_advanced_decorations = {} +abdecor.register_advanced_decoration = function(name, def) + -- Ensure that all necessary arguments are defined + if not name or not def.target or not def.fn then + minetest.warn("[abdecor] Advanced decoration '" .. (name or "???") .. "' was not provided with all necessary values.") + return false + end + + -- Ensure that the name isn't already in use + local mapgen = nil + if abdecor.registered_names[name] then + minetest.warn("[abdecor] Advanced decoration '" .. name .. "' was already registered.") + return false + else + mapgen = {} + abdecor.registered_names[name] = true + end + + -- Check for all_floors + all_ceilings flags which is unsupported due to + -- undefined mapgen node erasure + local is_ceiling = false + local is_water_surface = false + def.target.flags = def.target.flags or "" + if def.target.flags and def.target.flags:find("all_floors") and def.target.flags:find("all_ceilings") then + minetest.warn("[abdecor] Advanced decoration '" .. name .. "' specifies all_floors and all_ceilings which the abdecor API does not support.") + return false + else + is_ceiling = def.target.flags:find("all_ceilings") and true or false + is_water_surface = def.target.flags:find("water_surface") and true or false + end + + -- Register node for targeted mapgen node + local mapgen_node_name = "abdecor:" .. name .. "_marker" + minetest.register_node(":" .. mapgen_node_name,{ + drawtype = "airlike", + sunlight_propagates = true, + walkable = false, + pointable = true, + diggable = false, + climbable = false, + buildable_to = true, + floodable = false, + groups = { not_in_creative_inventory = 1 }, + }) + + -- Register injected decor for targeted mapgen node placement + def.target.deco_type = "simple" + def.target.name = "abdecor:" .. name .. "_decoration" + def.target.decoration = mapgen_node_name + minetest.register_decoration(def.target) + + local decoration_id = minetest.get_decoration_id(def.target.name) + minetest.set_gen_notify({ decoration = true },{decoration_id}) + mapgen.decoration_id = "decoration#" .. decoration_id + abdecor.registered_advanced_decorations[mapgen.decoration_id] = mapgen + + -- Compute decoration placement offset for automatic erasure during mapgen + mapgen.offset = (is_water_surface and 0 or 1) * (is_ceiling and -1 or 1) + (def.target.place_offset_y or 0) + + -- Capture placement function and voxelmanip flags for later use + mapgen.fn = def.fn + + if not def.flags then + def.flags = {} + end + + if def.flags.param2 == nil then + def.flags.param2 = false + end + if def.flags.liquid == nil then + def.flags.liquid = false + end + if def.flags.schematic == nil then + def.flags.schematic = false + end + mapgen.flags = def.flags + + -- Success! + return true +end + +-- Schematic placement helper functions +abdecor._place_schematic_check = function(args) + -- Fail or set defaults for missing arguments + if not args.pos or not args.schematic then + return nil -- fail + end + + args.rotation = args.rotation or "random" + args.replacements = args.replacements or {} + args.force_placement = (args.force_placement == nil) and false or true + args.flags = args.flags or "" + + -- Arguments are good + return true +end + +-- Register targeted mapgen generation +local vdata = {} +local vparam2 = {} +minetest.register_on_generated(function(minp, maxp, seed) + -- Lazy initializers for mapgen + local mapgen = {} + + local is_mapgen_init = false + local function mapgen_init() + if not is_mapgen_init then + mapgen.vm, mapgen.emin, mapgen.emax = minetest.get_mapgen_object("voxelmanip") + mapgen.va = VoxelArea:new({MinEdge = mapgen.emin, MaxEdge = mapgen.emax}) + is_mapgen_init = true + end + end + + local is_vm_data_init = false + local function vm_data_init() + mapgen_init() + if not is_vm_data_init then + mapgen.vm:get_data(vdata) + is_vm_data_init = true + end + end + + local is_vm_param2_init = false + local function vm_param2_init() + mapgen_init() + if not is_vm_param2_init then + mapgen.vm:get_param2_data(vparam2) + is_vm_param2_init = true + end + end + + local is_schematic_init = false + local function schematic_init() + if not is_schematic_init then + mapgen.place_schematic = function(args) + mapgen.vm:set_data(vdata) + local retval = abdecor._place_schematic_check(args) and minetest.place_schematic_on_vmanip(mapgen.vm,args.pos,args.schematic,args.rotation,args.replacements,args.force_placement,args.flags) + if retval then + mapgen.vm:get_data(vdata) + end + return retval + end + is_schematic_init = true + end + end + + mapgen.calc_lighting = function(p1,p2,propagate_shadow) + return mapgen.vm:calc_lighting(p1,p2,propagate_shadow) + end + + local is_liquid = false + + -- Place any targeted decorations that were generated + local gennotify = minetest.get_mapgen_object("gennotify") + for decoration_id,decorations in pairs(gennotify) do + local decoration = abdecor.registered_advanced_decorations[decoration_id] + if decoration then + -- Initialize vm data + vm_data_init() + + -- Initialize param2 data if needed + if decoration.flags.param2 then + vm_param2_init() + end + + -- Initialize schematic placement function if needed + if decoration.flags.schematic then + schematic_init() + end + + -- Note liquid status + if decoration.flags.liquid then + is_liquid = true + end + + -- Erase dummy mapgen nodes and process decorations + for i = 1, #decorations do + local pos = decorations[i] + vdata[mapgen.va:index(pos.x,pos.y + decoration.offset,pos.z)] = minetest.CONTENT_AIR + decoration.fn({ + pos = pos, + voxelarea = mapgen.va, + data = vdata, + param2 = vparam2, + minp = minp, + maxp = maxp, + seed = seed, + place_schematic = mapgen.place_schematic, + calc_lighting = mapgen.calc_lighting, + index2d = function(x,z) -- (portions of this function © FaceDeer 2018, licensed MIT, copied from https://github.com/minetest-mods/mapgen_helper/blob/2521562a42472271d9d761f2b1e84ead59250a14/noise_manager.lua) + if type(x) == "table" then -- accept x/y/z pos table + z = x.z + x = x.x + end + return x - minp.x + + (maxp.x - minp.x + 1) + *(z - minp.z) + + 1 + end, + }) + end + end + end + + -- Write data back to voxelmanip if necessary + if is_mapgen_init then + if is_vm_data_init then + mapgen.vm:set_data(vdata) + end + + if is_vm_param2_init then + mapgen.vm:set_param2_data(vparam2) + end + + if is_liquid then + mapgen.vm:update_liquids() + end + + if is_vm_data_init or is_vm_param2_init then + mapgen.vm:write_to_map() + end + end +end) \ No newline at end of file diff --git a/mods/abdecor/mod.conf b/mods/abdecor/mod.conf new file mode 100644 index 00000000..7f8e0684 --- /dev/null +++ b/mods/abdecor/mod.conf @@ -0,0 +1,3 @@ +name = abdecor +title = Advanced Biome Decoration API +author = EmptyStar \ No newline at end of file diff --git a/mods/animalia/.luacheckrc b/mods/animalia/.luacheckrc new file mode 100644 index 00000000..f01bf451 --- /dev/null +++ b/mods/animalia/.luacheckrc @@ -0,0 +1,21 @@ +max_line_length = 120 + +globals = { + "minetest", + "VoxelArea", + "mob_core", + "creatura", + "animalia", + "farming", + "mcl_player", + "player_api", + "armor" +} + +read_globals = { + "vector", + "ItemStack", + table = {fields = {"copy"}} +} + +ignore = {"212/self", "212/this"} \ No newline at end of file diff --git a/mods/animalia/LICENSE b/mods/animalia/LICENSE new file mode 100644 index 00000000..ed8c3a0f --- /dev/null +++ b/mods/animalia/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 ElCeejo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/animalia/api/api.lua b/mods/animalia/api/api.lua new file mode 100644 index 00000000..49b40820 --- /dev/null +++ b/mods/animalia/api/api.lua @@ -0,0 +1,882 @@ +--------- +-- API -- +--------- + +-- Math -- + +local abs = math.abs +local atan2 = math.atan2 +local cos = math.cos +local deg = math.deg +local min = math.min +local pi = math.pi +local pi2 = pi * 2 +local rad = math.rad +local random = math.random +local sin = math.sin +local sqrt = math.sqrt + + +local function diff(a, b) -- Get difference between 2 angles + return atan2(sin(b - a), cos(b - a)) +end + +local function interp_angle(a, b, w) + local cs = (1 - w) * cos(a) + w * cos(b) + local sn = (1 - w) * sin(a) + w * sin(b) + return atan2(sn, cs) +end + +local function lerp_step(a, b, dtime, rate) + return min(dtime * rate, abs(diff(a, b)) % (pi2)) +end + +local function clamp(val, _min, _max) + if val < _min then + val = _min + elseif _max < val then + val = _max + end + return val +end + +-- Vector Math -- + +local vec_add, vec_dir, vec_dist, vec_divide, vec_len, vec_multi, vec_normal, + vec_round, vec_sub = vector.add, vector.direction, vector.distance, vector.divide, + vector.length, vector.multiply, vector.normalize, vector.round, vector.subtract + +local dir2yaw = minetest.dir_to_yaw +local yaw2dir = minetest.yaw_to_dir + +------------ +-- Common -- +------------ + +function animalia.get_average_pos(vectors) + local sum = {x = 0, y = 0, z = 0} + for _, vec in pairs(vectors) do sum = vec_add(sum, vec) end + return vec_divide(sum, #vectors) +end + +function animalia.correct_name(str) + if str then + if str:match(":") then str = str:split(":")[2] end + return (string.gsub(" " .. str, "%W%l", string.upper):sub(2):gsub("_", " ")) + end +end + +--------------------- +-- Local Utilities -- +--------------------- + +local function activate_nametag(self) + self.nametag = self:recall("nametag") or nil + if not self.nametag then return end + self.object:set_properties({ + nametag = self.nametag, + nametag_color = "#FFFFFF" + }) +end + +animalia.animate_player = {} + +if minetest.get_modpath("default") +and minetest.get_modpath("player_api") then + animalia.animate_player = player_api.set_animation +elseif minetest.get_modpath("mcl_player") then + animalia.animate_player = mcl_player.player_set_animation +end + +----------------------- +-- Dynamic Animation -- +----------------------- + +function animalia.rotate_to_pitch(self) + local rot = self.object:get_rotation() + if self._anim == "fly" then + local vel = vec_normal(self.object:get_velocity()) + local step = min(self.dtime * 5, abs(diff(rot.x, vel.y)) % (pi2)) + local n_rot = interp_angle(rot.x, vel.y, step) + self.object:set_rotation({ + x = clamp(n_rot, -0.75, 0.75), + y = rot.y, + z = rot.z + }) + elseif rot.x ~= 0 then + self.object:set_rotation({ + x = 0, + y = rot.y, + z = rot.z + }) + end +end + +function animalia.move_head(self, tyaw, pitch) + local data = self.head_data + if not data then return end + local yaw = self.object:get_yaw() + local pitch_offset = data.pitch_correction or 0 + local bone = data.bone or "Head.CTRL" + local _, rot = self.object:get_bone_position(bone) + if not rot then return end + local n_yaw = (tyaw ~= yaw and diff(tyaw, yaw) / 2) or 0 + if abs(deg(n_yaw)) > 45 then n_yaw = 0 end + local dir = yaw2dir(n_yaw) + dir.y = pitch or 0 + local n_pitch = (sqrt(dir.x^2 + dir.y^2) / dir.z) + if abs(deg(n_pitch)) > 45 then n_pitch = 0 end + if self.dtime then + local yaw_w = lerp_step(rad(rot.z), tyaw, self.dtime, 3) + n_yaw = interp_angle(rad(rot.z), n_yaw, yaw_w) + local rad_offset = rad(pitch_offset) + local pitch_w = lerp_step(rad(rot.x), n_pitch + rad_offset, self.dtime, 3) + n_pitch = interp_angle(rad(rot.x), n_pitch + rad_offset, pitch_w) + end + local pitch_max = pitch_offset + 45 + local pitch_min = pitch_offset - 45 + self.object:set_bone_position(bone, data.offset, + {x = clamp(deg(n_pitch), pitch_min, pitch_max), y = 0, z = clamp(deg(n_yaw), -45, 45)}) +end + +function animalia.head_tracking(self) + if not self.head_data then return end + -- Calculate Head Position + local yaw = self.object:get_yaw() + local pos = self.object:get_pos() + if not pos then return end + local y_dir = yaw2dir(yaw) + local offset_h = self.head_data.pivot_h + local offset_v = self.head_data.pivot_v + pos = { + x = pos.x + y_dir.x * offset_h, + y = pos.y + offset_v, + z = pos.z + y_dir.z * offset_h + } + local vel = self.object:get_velocity() + if vec_len(vel) > 2 then + self.head_tracking = nil + animalia.move_head(self, yaw, 0) + return + end + local player = self.head_tracking + local plyr_pos = player and player:get_pos() + if plyr_pos then + plyr_pos.y = plyr_pos.y + 1.4 + local dir = vec_dir(pos, plyr_pos) + local tyaw = dir2yaw(dir) + if abs(diff(yaw, tyaw)) > pi / 10 + and self._anim == "stand" then + self:turn_to(tyaw, 1) + end + animalia.move_head(self, tyaw, dir.y) + return + elseif self:timer(6) + and random(4) < 2 then + + local players = creatura.get_nearby_players(self, 6) + self.head_tracking = #players > 0 and players[random(#players)] + end + animalia.move_head(self, yaw, 0) + +end + +--------------- +-- Utilities -- +--------------- + +function animalia.alias_mob(old_mob, new_mob) + minetest.register_entity(":" .. old_mob, { + on_activate = function(self) + local pos = self.object:get_pos() + minetest.add_entity(pos, new_mob) + self.object:remove() + end, + }) +end + +------------------------ +-- Environment Access -- +------------------------ + +function animalia.has_shared_owner(obj1, obj2) + local ent1 = obj1 and obj1:get_luaentity() + local ent2 = obj2 and obj2:get_luaentity() + if ent1 + and ent2 then + return ent1.owner and ent2.owner and ent1.owner == ent2.owner + end + return false +end + +function animalia.get_attack_score(entity, attack_list) + local pos = entity.stand_pos + if not pos then return end + + local order = entity.order or "wander" + if order ~= "wander" then return 0 end + + local target = entity._target or (entity.attacks_players and creatura.get_nearby_player(entity)) + local tgt_pos = target and target:get_pos() + + if not tgt_pos + or not entity:is_pos_safe(tgt_pos) + or (target:is_player() + and minetest.is_creative_enabled(target:get_player_name())) then + target = creatura.get_nearby_object(entity, attack_list) + tgt_pos = target and target:get_pos() + end + + if not tgt_pos then entity._target = nil return 0 end + + if target == entity.object then entity._target = nil return 0 end + + if animalia.has_shared_owner(entity.object, target) then entity._target = nil return 0 end + + local dist = vec_dist(pos, tgt_pos) + local score = (entity.tracking_range - dist) / entity.tracking_range + + if entity.trust + and target:is_player() + and entity.trust[target:get_player_name()] then + local trust = entity.trust[target:get_player_name()] + local trust_score = ((entity.max_trust or 10) - trust) / (entity.max_trust or 10) + + score = score - trust_score + end + + entity._target = target + return score * 0.5, {entity, target} +end + +function animalia.get_nearby_mate(self) + local pos = self.object:get_pos() + if not pos then return end + local objects = creatura.get_nearby_objects(self, self.name) + for _, object in ipairs(objects) do + local obj_pos = object and object:get_pos() + local ent = obj_pos and object:get_luaentity() + if obj_pos + and ent.growth_scale == 1 + and ent.gender ~= self.gender + and ent.breeding then + return object + end + end +end + +function animalia.find_collision(self, dir) + local pos = self.object:get_pos() + local pos2 = vec_add(pos, vec_multi(dir, 16)) + local ray = minetest.raycast(pos, pos2, false, false) + for pointed_thing in ray do + if pointed_thing.type == "node" then + return pointed_thing.under + end + end + return nil +end + +function animalia.random_drop_item(self, item, chance) + local pos = self.object:get_pos() + if not pos then return end + if random(chance) < 2 then + local object = minetest.add_item(pos, ItemStack(item)) + object:add_velocity({ + x = random(-2, 2), + y = 1.5, + z = random(-2, 2) + }) + end +end + +--------------- +-- Particles -- +--------------- + +function animalia.particle_spawner(pos, texture, type, min_pos, max_pos) + type = type or "float" + min_pos = min_pos or vec_sub(pos, 1) + max_pos = max_pos or vec_add(pos, 1) + if type == "float" then + minetest.add_particlespawner({ + amount = 16, + time = 0.25, + minpos = min_pos, + maxpos = max_pos, + minvel = {x = 0, y = 0.2, z = 0}, + maxvel = {x = 0, y = 0.25, z = 0}, + minexptime = 0.75, + maxexptime = 1, + minsize = 4, + maxsize = 4, + texture = texture, + glow = 1, + }) + elseif type == "splash" then + minetest.add_particlespawner({ + amount = 6, + time = 0.25, + minpos = {x = pos.x - 7/16, y = pos.y + 0.6, z = pos.z - 7/16}, + maxpos = {x = pos.x + 7/16, y = pos.y + 0.6, z = pos.z + 7/16}, + minvel = {x = -1, y = 2, z = -1}, + maxvel = {x = 1, y = 5, z = 1}, + minacc = {x = 0, y = -9.81, z = 0}, + maxacc = {x = 0, y = -9.81, z = 0}, + minsize = 2, + maxsize = 4, + collisiondetection = true, + texture = texture, + }) + end +end + +function animalia.add_food_particle(self, item_name) + local pos, yaw = self.object:get_pos(), self.object:get_yaw() + if not pos then return end + local head = self.head_data + local offset_h = (head and head.pivot_h) or self.width + local offset_v = (head and head.pivot_v) or self.height + local head_pos = { + x = pos.x + sin(yaw) * -offset_h, + y = pos.y + offset_v, + z = pos.z + cos(yaw) * offset_h + } + local def = minetest.registered_items[item_name] + local image = def.inventory_image + if def.tiles then + image = def.tiles[1].name or def.tiles[1] + end + if image then + local crop = "^[sheet:4x4:" .. random(0,3) .. "," .. random(0,3) + minetest.add_particlespawner({ + pos = head_pos, + time = 0.5, + amount = 12, + collisiondetection = true, + collision_removal = true, + vel = {min = {x = -1, y = 1, z = -1}, max = {x = 1, y = 2, z = 1}}, + acc = {x = 0, y = -9.8, z = 0}, + size = {min = 1, max = 2}, + texture = image .. crop + }) + end +end + +function animalia.add_break_particle(pos) + pos = vec_round(pos) + local def = creatura.get_node_def(pos) + local texture = (def.tiles and def.tiles[1]) or def.inventory_image + texture = texture .. "^[resize:8x8" + minetest.add_particlespawner({ + amount = 6, + time = 0.1, + minpos = { + x = pos.x, + y = pos.y - 0.49, + z = pos.z + }, + maxpos = { + x = pos.x, + y = pos.y - 0.49, + z = pos.z + }, + minvel = {x=-1, y=1, z=-1}, + maxvel = {x=1, y=2, z=1}, + minacc = {x=0, y=-5, z=0}, + maxacc = {x=0, y=-9, z=0}, + minexptime = 1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = true, + vertical = false, + texture = texture, + }) +end + +---------- +-- Mobs -- +---------- + +function animalia.death_func(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end +end + +function animalia.get_dropped_food(self, item, radius) + local pos = self.object:get_pos() + if not pos then return end + + local objects = minetest.get_objects_inside_radius(pos, radius or self.tracking_range) + for _, object in ipairs(objects) do + local ent = object:get_luaentity() + if ent + and ent.name == "__builtin:item" + and ent.itemstring + and ((item and ent.itemstring:match(item)) + or self:follow_item(ItemStack(ent.itemstring))) then + return object, object:get_pos() + end + end +end + +function animalia.eat_dropped_item(self, item) + local pos = self.object:get_pos() + if not pos then return end + + local food = item or animalia.get_dropped_food(self, nil, self.width + 1) + + local food_ent = food and food:get_luaentity() + if food_ent then + local food_pos = food:get_pos() + + local stack = ItemStack(food_ent.itemstring) + if stack + and stack:get_count() > 1 then + stack:take_item() + food_ent.itemstring = stack:to_string() + else + food:remove() + end + + self.object:set_yaw(dir2yaw(vec_dir(pos, food_pos))) + animalia.add_food_particle(self, stack:get_name()) + + if self.on_eat_drop then + self:on_eat_drop() + end + return true + end +end + +function animalia.protect_from_despawn(self) + self._despawn = self:memorize("_despawn", false) + self.despawn_after = self:memorize("despawn_after", false) +end + +function animalia.despawn_inactive_mob(self) + local os_time = os.time() + self._last_active = self:recall("_last_active") + if self._last_active + and self.despawn_after then + local last_active = self._last_active + if os_time - last_active > self.despawn_after then + self.object:remove() + return true + end + end +end + +function animalia.set_nametag(self, clicker) + local plyr_name = clicker and clicker:get_player_name() + if not plyr_name then return end + local item = clicker:get_wielded_item() + if item + and item:get_name() ~= "animalia:nametag" then + return + end + local name = item:get_meta():get_string("name") + if not name + or name == "" then + return + end + self.nametag = self:memorize("nametag", name) + self.despawn_after = self:memorize("despawn_after", false) + activate_nametag(self) + if not minetest.is_creative_enabled(plyr_name) then + item:take_item() + clicker:set_wielded_item(item) + end + return true +end + +function animalia.initialize_api(self) + -- Set Gender + self.gender = self:recall("gender") or nil + if not self.gender then + local genders = {"male", "female"} + self.gender = self:memorize("gender", genders[random(2)]) + -- Reset Texture ID + self.texture_no = nil + end + + -- Taming/Breeding + self.food = self:recall("food") or 0 + self.gotten = self:recall("gotten") or false + self.breeding = false + self.breeding_cooldown = self:recall("breeding_cooldown") or 0 + + -- Textures/Scale + activate_nametag(self) + if self.growth_scale then + self:memorize("growth_scale", self.growth_scale) -- This is for spawning children + end + self.growth_scale = self:recall("growth_scale") or 1 + self:set_scale(self.growth_scale) + local child_textures = self.growth_scale < 0.8 and self.child_textures + local textures = (not child_textures and self[self.gender .. "_textures"]) or self.textures + if child_textures then + if not self.texture_no + or self.texture_no > #child_textures then + self.texture_no = random(#child_textures) + end + self:set_texture(self.texture_no, child_textures) + elseif textures then + if not self.texture_no then + self.texture_no = random(#textures) + end + self:set_texture(self.texture_no, textures) + end + if self.growth_scale < 0.8 + and self.child_mesh then + self.object:set_properties({ + mesh = self.child_mesh + }) + end +end + +function animalia.step_timers(self) + local breed_cd = self.breeding_cooldown or 30 + local trust_cd = self.trust_cooldown or 0 + self.breeding_cooldown = (breed_cd > 0 and breed_cd - self.dtime) or 0 + self.trust_cooldown = (trust_cd > 0 and trust_cd - self.dtime) or 0 + if self.breeding + and self.breeding_cooldown <= 30 then + self.breeding = false + end + self:memorize("breeding_cooldown", self.breeding_cooldown) + self:memorize("trust_cooldown", self.trust_cooldown) + self:memorize("_last_active", os.time()) +end + +function animalia.do_growth(self, interval) + if self.growth_scale + and self.growth_scale < 0.9 then + if self:timer(interval) then + self.growth_scale = self.growth_scale + 0.1 + self:set_scale(self.growth_scale) + if self.growth_scale < 0.8 + and self.child_textures then + local tex_no = self.texture_no + if not self.child_textures[tex_no] then + tex_no = 1 + end + self:set_texture(tex_no, self.child_textures) + elseif self.growth_scale == 0.8 then + if self.child_mesh then self:set_mesh() end + if self.male_textures + and self.female_textures then + if #self.child_textures == 1 then + self.texture_no = random(#self[self.gender .. "_textures"]) + end + self:set_texture(self.texture_no, self[self.gender .. "_textures"]) + else + if #self.child_textures == 1 then + self.texture_no = random(#self.textures) + end + self:set_texture(self.texture_no, self.textures) + end + if self.on_grown then + self:on_grown() + end + end + self:memorize("growth_scale", self.growth_scale) + end + end +end + +function animalia.random_sound(self) + if self:timer(8) + and random(4) < 2 then + self:play_sound("random") + end +end + +function animalia.add_trust(self, player, amount) + if self.trust_cooldown > 0 then return end + self.trust_cooldown = 60 + local plyr_name = player:get_player_name() + local trust = self.trust[plyr_name] or 0 + if trust > 4 then return end + self.trust[plyr_name] = trust + (amount or 1) + self:memorize("trust", self.trust) +end + +function animalia.feed(self, clicker, tame, breed) + local yaw = self.object:get_yaw() + local pos = self.object:get_pos() + if not pos then return end + local name = clicker:is_player() and clicker:get_player_name() + local item, item_name = self:follow_wielded_item(clicker) + if item_name then + -- Eat Animation + local head = self.head_data + local offset_h = (head and head.pivot_h) or 0.5 + local offset_v = (head and head.pivot_v) or 0.5 + local head_pos = { + x = pos.x + sin(yaw) * -offset_h, + y = pos.y + offset_v, + z = pos.z + cos(yaw) * offset_h + } + local def = minetest.registered_items[item_name] + if def.inventory_image then + minetest.add_particlespawner({ + pos = head_pos, + time = 0.1, + amount = 3, + collisiondetection = true, + collision_removal = true, + vel = {min = {x = -1, y = 3, z = -1}, max = {x = 1, y = 4, z = 1}}, + acc = {x = 0, y = -9.8, z = 0}, + size = {min = 2, max = 4}, + texture = def.inventory_image + }) + end + -- Increase Health + local feed_no = (self.feed_no or 0) + 1 + local max_hp = self.max_health + local hp = self.hp + hp = hp + (max_hp / 5) + if hp > max_hp then hp = max_hp end + self.hp = hp + -- Tame/Breed + if feed_no >= 5 then + feed_no = 0 + if tame then + self.owner = self:memorize("owner", name) + minetest.add_particlespawner({ + pos = {min = vec_sub(pos, self.width), max = vec_add(pos, self.width)}, + time = 0.1, + amount = 12, + vel = {min = {x = 0, y = 3, z = 0}, max = {x = 0, y = 4, z = 0}}, + size = {min = 4, max = 6}, + glow = 16, + texture = "creatura_particle_green.png" + }) + end + if breed then + if self.breeding then return false end + if self.breeding_cooldown <= 0 then + self.breeding = true + self.breeding_cooldown = 60 + animalia.particle_spawner(pos, "heart.png", "float") + end + end + self._despawn = self:memorize("_despawn", false) + self.despawn_after = self:memorize("despawn_after", false) + end + self.feed_no = feed_no + -- Take item + if not minetest.is_creative_enabled(name) then + item:take_item() + clicker:set_wielded_item(item) + end + return true + end +end + +function animalia.mount(self, player, params) + if not creatura.is_alive(player) + or (player:get_attach() + and player:get_attach() ~= self.object) then + return + end + local plyr_name = player:get_player_name() + if (player:get_attach() + and player:get_attach() == self.object) + or not params then + player:set_detach() + player:set_properties({ + visual_size = { + x = 1, + y = 1 + } + }) + player:set_eye_offset() + if minetest.get_modpath("player_api") then + animalia.animate_player(player, "stand", 30) + if player_api.player_attached then + player_api.player_attached[plyr_name] = false + end + end + return + end + if minetest.get_modpath("player_api") then + player_api.player_attached[plyr_name] = true + end + self.rider = player + player:set_attach(self.object, "Torso", params.pos, params.rot) + player:set_eye_offset({x = 0, y = 20, z = 5}, {x = 0, y = 15, z = 15}) + self:clear_utility() + minetest.after(0.4, function() + animalia.animate_player(player, "sit" , 30) + end) +end + +function animalia.punch(self, puncher, ...) + if self.hp <= 0 then return end + creatura.basic_punch_func(self, puncher, ...) + self._puncher = puncher + if self.flee_puncher + and (self:get_utility() or "") ~= "animalia:flee_from_target" then + self:clear_utility() + end +end + +function animalia.find_crop(self) + local pos = self.object:get_pos() + if not pos then return end + + local nodes = minetest.find_nodes_in_area(vec_sub(pos, 6), vec_add(pos, 6), "group:crop") or {} + if #nodes < 1 then return end + return nodes[math.random(#nodes)] +end + +function animalia.eat_crop(self, pos) + local node_name = minetest.get_node(pos).name + local new_name = node_name:sub(1, #node_name - 1) .. (tonumber(node_name:sub(-1)) or 2) - 1 + local new_def = minetest.registered_nodes[new_name] + if not new_def then return false end + local p2 = new_def.place_param2 or 1 + minetest.set_node(pos, {name = new_name, param2 = p2}) + animalia.add_food_particle(self, new_name) + return true +end + +function animalia.eat_turf(mob, pos) + for name, sub_name in pairs(mob.consumable_nodes) do + if minetest.get_node(pos).name == name then + --add_break_particle(turf_pos) + minetest.set_node(pos, {name = sub_name}) + mob.collected = mob:memorize("collected", false) + --creatura.action_idle(mob, 1, "eat") + return true + end + end +end + +-------------- +-- Spawning -- +-------------- + +animalia.registered_biome_groups = {} + +function animalia.register_biome_group(name, def) + animalia.registered_biome_groups[name] = def + animalia.registered_biome_groups[name].biomes = {} +end + +local function assign_biome_group(name) + local def = minetest.registered_biomes[name] + local turf = def.node_top + local heat = def.heat_point or 0 + local humidity = def.humidity_point or 50 + local y_min = def.y_min + local y_max = def.y_max + for group, params in pairs(animalia.registered_biome_groups) do -- k, v in pairs + if name:find(params.name_kw or "") + and turf and turf:find(params.turf_kw or "") + and heat >= params.min_heat + and heat <= params.max_heat + and humidity >= params.min_humidity + and humidity <= params.max_humidity + and (not params.min_height or y_min >= params.min_height) + and (not params.max_height or y_max <= params.max_height) then + table.insert(animalia.registered_biome_groups[group].biomes, name) + end + end +end + +minetest.register_on_mods_loaded(function() + for name in pairs(minetest.registered_biomes) do + assign_biome_group(name) + end +end) + +animalia.register_biome_group("temperate", { + name_kw = "", + turf_kw = "grass", + min_heat = 45, + max_heat = 70, + min_humidity = 0, + max_humidity = 50 +}) + +animalia.register_biome_group("urban", { + name_kw = "", + turf_kw = "grass", + min_heat = 0, + max_heat = 100, + min_humidity = 0, + max_humidity = 100 +}) + +animalia.register_biome_group("grassland", { + name_kw = "", + turf_kw = "grass", + min_heat = 45, + max_heat = 90, + min_humidity = 0, + max_humidity = 80 +}) + +animalia.register_biome_group("boreal", { + name_kw = "", + turf_kw = "litter", + min_heat = 10, + max_heat = 55, + min_humidity = 0, + max_humidity = 80 +}) + +animalia.register_biome_group("ocean", { + name_kw = "ocean", + turf_kw = "", + min_heat = 0, + max_heat = 100, + min_humidity = 0, + max_humidity = 100, + max_height = 0 +}) + +animalia.register_biome_group("swamp", { + name_kw = "", + turf_kw = "", + min_heat = 55, + max_heat = 90, + min_humidity = 55, + max_humidity = 90, + max_height = 10, + min_height = -20 +}) + +animalia.register_biome_group("tropical", { + name_kw = "", + turf_kw = "litter", + min_heat = 70, + max_heat = 90, + min_humidity = 65, + max_humidity = 90 +}) + +animalia.register_biome_group("cave", { + name_kw = "under", + turf_kw = "", + min_heat = 0, + max_heat = 100, + min_humidity = 0, + max_humidity = 100, + max_height = 5 +}) + +animalia.register_biome_group("common", { + name_kw = "", + turf_kw = "", + min_heat = 25, + max_heat = 75, + min_humidity = 20, + max_humidity = 80, + min_height = 1 +}) diff --git a/mods/animalia/api/lasso.lua b/mods/animalia/api/lasso.lua new file mode 100644 index 00000000..b702f57d --- /dev/null +++ b/mods/animalia/api/lasso.lua @@ -0,0 +1,251 @@ +----------- +-- Lasso -- +----------- + +local abs = math.abs + +local vec_add, vec_dir, vec_dist, vec_len = vector.add, vector.direction, vector.distance, vector.length +local dir2rot = vector.dir_to_rotation + +-- Entities -- + +local using_lasso = {} + +minetest.register_entity("animalia:lasso_entity", { + visual = "mesh", + mesh = "animalia_lasso_entity.b3d", + textures = {"animalia_lasso_entity.png"}, + pointable = false, + on_activate = function(self) + self.object:set_armor_groups({immortal = 1}) + end, + _scale = 1, + on_step = function(self) + local pos, parent = self.object:get_pos(), (self.object:get_attach() or self._attached) + local pointed_ent = self._point_to and self._point_to:get_luaentity() + local point_to = self._point_to and self._point_to:get_pos() + if not pos or not parent or not point_to then self.object:remove() return end + if type(parent) == "string" then + parent = minetest.get_player_by_name(parent) + if not parent then self.object:remove() return end + local tgt_pos = parent:get_pos() + tgt_pos.y = tgt_pos.y + 1 + point_to.y = point_to.y + pointed_ent.height * 0.5 + local dist = vec_dist(pos, tgt_pos) + if dist > 0.5 then + self.object:set_pos(tgt_pos) + else + self.object:move_to(tgt_pos) + end + self.object:set_rotation(dir2rot(vec_dir(tgt_pos, point_to))) + elseif parent.x then + point_to.y = point_to.y + pointed_ent.height * 0.5 + self.object:set_rotation(dir2rot(vec_dir(pos, point_to))) + else + self.object:remove() + return + end + local size = vec_dist(pos, point_to) + if abs(size - self._scale) > 0.1 then + self.object:set_properties({ + visual_size = {x = 1, y = 1, z = size} + }) + self._scale = size + end + end +}) + +local function remove_from_fence(self) + local pos = self.object:get_pos() + local mob = self._mob and self._mob:get_luaentity() + if not mob then + self.object:remove() + return + end + mob._lassod_to = nil + mob:forget("_lassod_to") + mob._lasso_ent:remove() + local dirs = { + {x = 0.5, y = 0, z = 0}, + {x = -0.5, y = 0, z = 0}, + {x = 0, y = 0.5, z = 0}, + {x = 0, y = -0.5, z = 0}, + {x = 0, y = 0, z = 0.5}, + {x = 0, y = 0, z = -0.5} + } + for i = 1, 6 do + local i_pos = vec_add(pos, dirs[i]) + if not creatura.get_node_def(i_pos).walkable then + minetest.add_item(i_pos, "animalia:lasso") + break + end + end + self.object:remove() +end + +minetest.register_entity("animalia:tied_lasso_entity", { + collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25}, + visual = "cube", + visual_size = {x = 0.3, y = 0.3}, + mesh = "model", + textures = { + "animalia_tied_lasso_entity.png", + "animalia_tied_lasso_entity.png", + "animalia_tied_lasso_entity.png", + "animalia_tied_lasso_entity.png", + "animalia_tied_lasso_entity.png", + "animalia_tied_lasso_entity.png", + }, + on_activate = function(self) + self.object:set_armor_groups({immortal = 1}) + end, + on_step = function(self) + local mob = self._mob and self._mob:get_luaentity() + if not mob then remove_from_fence(self) return end + end, + on_rightclick = remove_from_fence, + on_punch = remove_from_fence +}) + +-- API -- + +local function add_lasso(self, origin) + local pos = self.object:get_pos() + if not pos then return end + local object = minetest.add_entity(pos, "animalia:lasso_entity") + local ent = object and object:get_luaentity() + if not ent then return end + -- Attachment point of entity + ent._attached = origin + if type(origin) ~= "string" then + --local player = minetest.get_player_by_name(origin) + --object:set_attach(player) + --else + object:set_pos(origin) + end + self._lassod_to = origin + ent._point_to = self.object + self:memorize("_lassod_to", origin) + return object +end + +local function get_rope_velocity(pos1, pos2, dist) + local force = dist / 10 + local vel = vector.new((pos2.x - pos1.x) * force, ((pos2.y - pos1.y) / (24 + dist)), (pos2.z - pos1.z) * force) + return vel +end + +function animalia.initialize_lasso(self) + self._lassod_to = self:recall("_lassod_to") or self:recall("lasso_origin") + if self._lassod_to then + local origin = self._lassod_to + if type(origin) == "table" + and minetest.get_item_group(minetest.get_node(origin).name, "fence") > 0 then + local object = minetest.add_entity(origin, "animalia:tied_lasso_entity") + object:get_luaentity()._mob = self.object + self._lasso_ent = add_lasso(self, origin) + elseif type(origin) == "string" then + self._lassod_to = origin + self._lasso_ent = add_lasso(self, origin) + else + self:forget("_lassod_to") + end + end +end + +function animalia.update_lasso_effects(self) + local pos = self.object:get_pos() + if not creatura.is_alive(self) then return end + if self._lassod_to then + local lasso = self._lassod_to + self._lasso_ent = self._lasso_ent or add_lasso(self, lasso) + if type(lasso) == "string" then + using_lasso[lasso] = self + local name = lasso + lasso = minetest.get_player_by_name(lasso) + if lasso then + if lasso:get_wielded_item():get_name() ~= "animalia:lasso" then + using_lasso[name] = nil + self._lasso_ent:remove() + self._lasso_ent = nil + self._lassod_to = nil + self:forget("_lassod_to") + return + end + local lasso_pos = lasso:get_pos() + local dist = vec_dist(pos, lasso_pos) + local vel = self.object:get_velocity() + if not vel or dist < 8 and self.touching_ground then return end + if vec_len(vel) < 8 then + self.object:add_velocity(get_rope_velocity(pos, lasso_pos, dist)) + end + return + end + elseif type(lasso) == "table" then + local dist = vec_dist(pos, lasso) + local vel = self.object:get_velocity() + if not vel or dist < 8 and self.touching_ground then return end + if vec_len(vel) < 8 then + self.object:add_velocity(get_rope_velocity(pos, lasso, dist)) + end + return + end + end + if self._lasso_ent then + self._lasso_ent:remove() + self._lasso_ent = nil + self._lassod_to = nil + self:forget("_lassod_to") + end +end + +-- Item + +minetest.register_craftitem("animalia:lasso", { + description = "Lasso", + inventory_image = "animalia_lasso.png", + on_secondary_use = function(_, placer, pointed) + local ent = pointed.ref and pointed.ref:get_luaentity() + if ent + and (ent.name:match("^animalia:") + or ent.name:match("^monstrum:")) then + if not ent.catch_with_lasso then return end + local name = placer:get_player_name() + if not ent._lassod_to + and not using_lasso[name] then + using_lasso[name] = ent + ent._lassod_to = name + ent:memorize("_lassod_to", name) + elseif ent._lassod_to + and ent._lassod_to == name then + using_lasso[name] = nil + ent._lassod_to = nil + ent:forget("_lassod_to") + end + end + end, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = minetest.get_pointed_thing_position(pointed_thing) + if minetest.get_item_group(minetest.get_node(pos).name, "fence") > 0 then + local name = placer:get_player_name() + local ent = using_lasso[name] + if ent + and ent._lassod_to + and ent._lassod_to == name then + using_lasso[name] = nil + ent._lasso_ent:set_detach() + ent._lasso_ent:set_pos(pos) + ent._lasso_ent:get_luaentity()._attached = pos + ent._lassod_to = pos + ent:memorize("_lassod_to", pos) + local fence_obj = minetest.add_entity(pos, "animalia:tied_lasso_entity") + fence_obj:get_luaentity()._mob = ent.object + fence_obj:get_luaentity()._lasso_obj = ent._lasso_ent + itemstack:take_item(1) + end + end + end + return itemstack + end +}) diff --git a/mods/animalia/api/legacy_convert.lua b/mods/animalia/api/legacy_convert.lua new file mode 100644 index 00000000..bc2fe624 --- /dev/null +++ b/mods/animalia/api/legacy_convert.lua @@ -0,0 +1,82 @@ +-------------------------------------- +-- Convert Better Fauna to Animalia -- +-------------------------------------- + +for i = 1, #animalia.mobs do + local new_mob = animalia.mobs[i] + local old_mob = "better_fauna:" .. new_mob:split(":")[2] + minetest.register_entity(":" .. old_mob, { + on_activate = mob_core.on_activate + }) + minetest.register_alias_force("better_fauna:spawn_" .. new_mob:split(":")[2], + "animalia:spawn_" .. new_mob:split(":")[2]) +end + +minetest.register_globalstep(function(dtime) + local mobs = minetest.luaentities + for _, mob in pairs(mobs) do + if mob + and mob.name:match("better_fauna:") then + local pos = mob.object:get_pos() + if not pos then return end + if mob.name:find("lasso_fence_ent") then + if pos then + minetest.add_entity(pos, "animalia:lasso_fence_ent") + end + mob.object:remove() + elseif mob.name:find("lasso_visual") then + if pos then + minetest.add_entity(pos, "animalia:lasso_visual") + end + mob.object:remove() + end + for i = 1, #animalia.mobs do + local ent = animalia.mobs[i] + local new_name = ent:split(":")[2] + local old_name = mob.name:split(":")[2] + if new_name == old_name then + if pos then + local new_mob = minetest.add_entity(pos, ent) + local mem = nil + if mob.memory then + mem = mob.memory + end + minetest.after(0.1, function() + if mem then + new_mob:get_luaentity().memory = mem + new_mob:get_luaentity():on_activate(new_mob, nil, dtime) + end + end) + end + mob.object:remove() + end + end + end + end +end) + + +-- Tools + +minetest.register_alias_force("better_fauna:net", "animalia:net") +minetest.register_alias_force("better_fauna:lasso", "animalia:lasso") +minetest.register_alias_force("better_fauna:cat_toy", "animalia:cat_toy") +minetest.register_alias_force("better_fauna:saddle", "animalia:saddle") +minetest.register_alias_force("better_fauna:shears", "animalia:shears") + +-- Drops + +minetest.register_alias_force("better_fauna:beef_raw", "animalia:beef_raw") +minetest.register_alias_force("better_fauna:beef_cooked", "animalia:beef_cooked") +minetest.register_alias_force("better_fauna:bucket_milk", "animalia:bucket_milk") +minetest.register_alias_force("better_fauna:leather", "animalia:leather") +minetest.register_alias_force("better_fauna:chicken_egg", "animalia:chicken_egg") +minetest.register_alias_force("better_fauna:chicken_raw", "animalia:poultry_raw") +minetest.register_alias_force("better_fauna:chicken_cooked", "animalia:poultry_cooked") +minetest.register_alias_force("better_fauna:feather", "animalia:feather") +minetest.register_alias_force("better_fauna:mutton_raw", "animalia:mutton_raw") +minetest.register_alias_force("better_fauna:mutton_cooked", "animalia:mutton_cooked") +minetest.register_alias_force("better_fauna:porkchop_raw", "animalia:porkchop_raw") +minetest.register_alias_force("better_fauna:porkchop_cooked", "animalia:porkchop_cooked") +minetest.register_alias_force("better_fauna:turkey_raw", "animalia:poultry_raw") +minetest.register_alias_force("better_fauna:turkey_cooked", "animalia:poultry_cooked") \ No newline at end of file diff --git a/mods/animalia/api/libri.lua b/mods/animalia/api/libri.lua new file mode 100644 index 00000000..7888d43f --- /dev/null +++ b/mods/animalia/api/libri.lua @@ -0,0 +1,528 @@ +----------- +-- Libri -- +----------- + +local libri = {} + +local path = minetest.get_modpath(minetest.get_current_modname()) + +local color = minetest.colorize + +local libri_bg = { + "formspec_version[3]", + "size[16,10]", + "background[-0.7,-0.5;17.5,11.5;animalia_libri_bg.png]" +} + +local libri_btn_next = "image_button[15,9;1,1;animalia_libri_icon_next.png;btn_next;;true;false]" + +local libri_btn_last = "image_button[1,9;1,1;animalia_libri_icon_last.png;btn_last;;true;false]" + +local libri_drp_font_scale = "dropdown[17,0;0.75,0.5;drp_font_scale;0.25,0.5,0.75,1;1]" + +local function correct_string(str) + if str then + if str:match(":") then str = str:split(":")[2] end + return (string.gsub(" " .. str, "%W%l", string.upper):sub(2):gsub("_", " ")) + end +end + +local pages = {} + +local generate_mobs = { + ["animalia:bat"] = "Bat", + ["animalia:cat"] = "Cat", + ["animalia:chicken"] = "Chicken", + ["animalia:cow"] = "Cow", + ["animalia:opossum"] = "Opossum", + ["animalia:owl"] = "Owl", + ["animalia:tropical_fish"] = "Tropical Fish", + ["animalia:fox"] = "Fox", + ["animalia:frog"] = "Frog", + ["animalia:grizzly_bear"] = "Grizzly Bear", + ["animalia:horse"] = "Horse", + ["animalia:pig"] = "Pig", + ["animalia:rat"] = "Rat", + ["animalia:reindeer"] = "Reindeer", + ["animalia:sheep"] = "Sheep", + ["animalia:song_bird"] = "Song Bird", + ["animalia:turkey"] = "Turkey", + ["animalia:wolf"] = "Wolf", +} + + +local spawn_biomes = { + ["animalia:bat"] = "cave", + ["animalia:cat"] = "urban", + ["animalia:chicken"] = "tropical", + ["animalia:cow"] = "grassland", + ["animalia:opossum"] = "temperate", + ["animalia:owl"] = "temperate", + ["animalia:tropical_fish"] = "ocean", + ["animalia:fox"] = "boreal", + ["animalia:frog"] = "swamp", + ["animalia:grizzly_bear"] = "boreal", + ["animalia:horse"] = "grassland", + ["animalia:pig"] = "temperate", + ["animalia:rat"] = "urban", + ["animalia:reindeer"] = "boreal", + ["animalia:sheep"] = "grassland", + ["animalia:song_bird"] = "temperate", + ["animalia:turkey"] = "boreal", + ["animalia:wolf"] = "boreal", +} + +----------- +-- Pages -- +----------- + + +local function get_spawn_biomes(name) + local biomes = asuna.features.animals[name] or {} + return (#biomes > 0) and biomes or {"grassland"} +end + +local function can_lasso(name) + return tostring(minetest.registered_entities[name].catch_with_lasso or false) +end + +local function can_net(name) + return tostring(minetest.registered_entities[name].catch_with_net or false) +end + +local function max_health(name) + return minetest.registered_entities[name].max_health or 20 +end + +local function mob_textures(name, mesh_no) + local def = minetest.registered_entities[name] + local textures = def.textures + if def.male_textures + or def.female_textures then + textures = {unpack(def.male_textures), unpack(def.female_textures)} + end + if def.mesh_textures then + textures = def.mesh_textures[mesh_no or 1] + end + return textures +end + +local biome_cubes = {} + +local function generate_page(mob) + local name = mob:split(":")[2] + local def = minetest.registered_entities[mob] + if not def then return end + local page = { + { -- Info + element_type = "label", + center_text = true, + font_size = 20, + offset = {x = 8, y = 1.5}, + file = "animalia_libri_" .. name .. ".txt" + }, + { -- Image + element_type = "model", + offset = {x = 1.5, y = 1.5}, + size = {x = 5, y = 5}, + mesh_iter = def.meshes and 1, + texture_iter = 1, + text = "mesh;" .. def.mesh .. ";" .. mob_textures(mob)[1] .. ";-30,225;false;false;0,0;0" + }, + { -- Spawn Biome + element_type = "image", + offset = {x = 0.825, y = 8.15}, + size = {x = 1, y = 1}, + biome_iter = 1, + text = biome_cubes[get_spawn_biomes(mob)[1]] + }, + { -- Biome Label + element_type = "tooltip", + offset = {x = 0.825, y = 8.15}, + size = {x = 1, y = 1}, + biome_iter = 1, + text = correct_string(get_spawn_biomes(mob)[1]) + }, + libri.render_element({ -- Health Icon + element_type = "image", + offset = {x = 2.535, y = 8.15}, + size = {x = 1, y = 1}, + text = "animalia_libri_health_fg.png" + }), + libri.render_element({ -- Health Amount + element_type = "label", + offset = {x = 3.25, y = 9}, + text = "x" .. max_health(mob) / 2 + }), + libri.render_element({ -- Lasso Icon + element_type = "item_image", + offset = {x = 4.25, y = 8.15}, + size = {x = 1, y = 1}, + text = "animalia:lasso" + }), + libri.render_element({ -- Lasso Indication Icon + element_type = "image", + offset = {x = 4.75, y = 8.75}, + size = {x = 0.5, y = 0.5}, + text = "animalia_libri_" .. can_lasso(mob) .. "_icon.png" + }), + libri.render_element({ -- Net Icon + element_type = "item_image", + offset = {x = 6, y = 8.15}, + size = {x = 1, y = 1}, + text = "animalia:net" + }), + libri.render_element({ -- Net Indication Icon + element_type = "image", + offset = {x = 6.5, y = 8.75}, + size = {x = 0.5, y = 0.5}, + text = "animalia_libri_" .. can_net(mob) .. "_icon.png" + }), + libri.render_element({ -- Styling + element_type = "image", + offset = {x = -0.7, y = -0.5}, + size = {x = 17.5, y = 11.5}, + text = "animalia_libri_info_fg.png" + }) + } + pages[mob] = page +end + +minetest.register_on_mods_loaded(function() + -- Register Biome Cubes + for name, def in pairs(minetest.registered_biomes) do + if def.node_top then + local tiles = { + "unknown_node.png", + "unknown_node.png", + "unknown_node.png" + } + local n_def = minetest.registered_nodes[def.node_top] + if n_def then + local def_tiles = table.copy(n_def.tiles or n_def.textures) + for i, tile in ipairs(def_tiles) do + if tile.name then + def_tiles[i] = tile.name + end + end + tiles = (#def_tiles > 0 and def_tiles) or tiles + end + biome_cubes[name] = minetest.inventorycube(tiles[1], tiles[3], tiles[3]) + else + biome_cubes[name] = minetest.inventorycube("unknown_node.png", "unknown_node.png", "unknown_node.png") + end + end + pages = { + ["home_1"] = { + { -- Info + element_type = "label", + center_text = true, + font_size = 24, + offset = {x = 0, y = 1.5}, + file = "animalia_libri_home.txt" + }, + { + element_type = "mobs", + start_iter = 0, + offset = {x = 10.25, y = 1.5} + } + }, + ["home_2"] = { + { + element_type = "mobs", + start_iter = 4, + offset = {x = 1.75, y = 1.5} + } + }, + ["home_3"] = { + { + element_type = "mobs", + start_iter = 12, + offset = {x = 1.75, y = 1.5} + } + } + } + for mob in pairs(generate_mobs) do + generate_page(mob) + end +end) + +--------- +-- API -- +--------- + +local function get_item_list(list, offset_x, offset_y) -- Creates a visual list of items for Libri formspecs + local size = 1 / ((#list < 3 and #list) or 3) + if size < 0.45 then size = 0.45 end + local spacing = size * 0.5 + local total_scale = size + spacing + local max_horiz = 3 + local form = "" + for i, item in ipairs(list) do + local vert_multi = math.floor((i - 1) / max_horiz) + local horz_multi = (total_scale * max_horiz) * vert_multi + local pos_x = offset_x + ((total_scale * i) - horz_multi) + local pos_y = offset_y + (total_scale * vert_multi ) + form = form .. "item_image[" .. pos_x .. "," .. pos_y .. ";" .. size .. "," .. size .. ";" .. item .. "]" + end + return form +end + +function libri.generate_list(meta, offset, start_iter) + local chapters = minetest.deserialize(meta:get_string("chapters")) or {} + local i = 0 + local elements = "" + local offset_x = offset.x + local offset_y = offset.y + for mob in pairs(chapters) do + if not mob then break end + i = i + 1 + if i > start_iter then + local mob_name = mob:split(":")[2] + local offset_txt = offset_x .. "," .. offset_y + local element = "button[" .. offset_txt .. ";4,1;btn_" .. mob_name .. ";" .. correct_string(mob_name) .. "]" + elements = elements .. element + offset_y = offset_y + 2 + if offset_y > 7.5 then + offset_x = offset_x + 8.5 + if offset_x > 10.25 then + return elements + end + offset_y = 1.5 + end + end + end + return elements +end + +function libri.render_element(def, meta, playername) + local chapters = (meta and minetest.deserialize(meta:get_string("chapters"))) or {} + local chap_no = 0 + for _ in pairs(chapters) do + chap_no = chap_no + 1 + end + local offset_x = def.offset.x + local offset_y = def.offset.y + local form = "" + -- Add text + if def.element_type == "label" then + local font_size_x = (animalia.libri_font_size[playername] or 1) + local font_size = (def.font_size or 16) * font_size_x + if def.file then + local filename = path .. "/libri/" .. def.file + local file = io.open(filename) + if file then + local text = "" + for line in file:lines() do + text = text .. line .. "\n" + end + local total_offset = (offset_x + (0.35 - 0.35 * font_size_x)) .. "," .. offset_y + form = form .. + "hypertext[" .. total_offset .. ";8,9;text;" .. text .. "]" + file:close() + end + else + form = form .. "style_type[label;font_size=" .. font_size .. "]" + local line = def.text + form = form .. "label[" .. offset_x .. "," .. offset_y .. ";" .. color("#000000", line .. "\n") .. "]" + end + elseif def.element_type == "mobs" then + form = form .. libri.generate_list(meta, def.offset, def.start_iter) + if chap_no > def.start_iter + 4 then form = form .. libri_btn_next end + if def.start_iter > 3 then form = form .. libri_btn_last end + else + -- Add Images/Interaction + local render_element = false + if def.unlock_key + and #chapters > 0 then + for _, chapter in ipairs(chapters) do + if chapter + and chapter == def.unlock_key then + render_element = true + break + end + end + elseif not def.unlock_key then + render_element = true + end + if render_element then + local offset = def.offset.x .. "," .. def.offset.y + local size = def.size.x .. "," .. def.size.y + form = form .. def.element_type .. "[" .. offset .. ";" .. size .. ";" .. def.text .. "]" + end + end + return form +end + +local function get_page(key, meta, playername) + local form = table.copy(libri_bg) + local chapters = minetest.deserialize(meta:get_string("chapters")) or {} + local chap_no = 0 + for _ in pairs(chapters) do + chap_no = chap_no + 1 + end + local page = pages[key] + for _, element in ipairs(page) do + if type(element) == "table" then + local element_rendered = libri.render_element(element, meta, playername) + table.insert(form, element_rendered) + else + table.insert(form, element) + end + end + table.insert(form, "style[drp_font_scale;noclip=true]") + table.insert(form, libri_drp_font_scale) + table.insert(form, "style[drp_font_scale;noclip=true]") + local def = minetest.registered_entities[key] + if def then + if def.follow then + table.insert(form, get_item_list(def.follow, 12.45, 8.05)) + end + if def.drops then + local drops = {} + for i = 1, #def.drops do + table.insert(drops, def.drops[i].name) + end + table.insert(form, get_item_list(drops, 8, 8.05)) + end + end + return table.concat(form, "") +end + +-- Iterate through Animal textures and Biomes + +local libri_players = {} + +local function iterate_libri_images() + for page, elements in pairs(pages) do + if page ~= "home" then + for _, info in ipairs(elements) do + if info.texture_iter then + local def = minetest.registered_entities[page] + local textures = mob_textures(page, info.mesh_iter) + + local tex_i = info.texture_iter + info.texture_iter = (textures[tex_i + 1] and tex_i + 1) or 1 + + local mesh_i = info.mesh_iter + if info.texture_iter < 2 then -- Only iterate mesh if all textures have been shown + info.mesh_iter = def.meshes and ((def.meshes[mesh_i + 1] and mesh_i + 1) or 1) + textures = mob_textures(page, info.mesh_iter) + end + + local mesh = (info.mesh_iter and def.meshes[info.mesh_iter]) or def.mesh + info.text = "mesh;" .. mesh .. ";" .. textures[info.texture_iter] .. ";-30,225;false;false;0,0;0]" + end + if info.biome_iter then + local mobname = page:split(":")[2] + local biomes = asuna.features.animals[mobname] or {} + if biomes[info.biome_iter + 1] then + info.biome_iter = info.biome_iter + 1 + else + info.biome_iter = 1 + end + local spawn_biome = biomes[info.biome_iter] or "grassland" + if info.element_type == "image" then + info.text = biome_cubes[spawn_biome] + else + info.text = correct_string(asuna.biomes[spawn_biome].name) + end + end + end + end + end + for name, page in pairs(libri_players) do + local player = minetest.get_player_by_name(name) + if player + and spawn_biomes[page] then + local meta = player:get_wielded_item():get_meta() + minetest.show_formspec(name, "animalia:libri_" .. page:split(":")[2], get_page(page, meta, name)) + end + end + minetest.after(2, iterate_libri_images) +end + +iterate_libri_images() + +-- Craftitem + +minetest.register_craftitem("animalia:libri_animalia", { + description = "Libri Animalia", + inventory_image = "animalia_libri_animalia.png", + stack_max = 1, + groups = {book = 1}, + + on_place = function(itemstack, player) + local meta = itemstack:get_meta() + if meta:get_string("pages") ~= "" then meta:set_string("pages", "") end + local name = player:get_player_name() + minetest.show_formspec(name, "animalia:libri_home_1", get_page("home_1", meta, name)) + libri_players[name] = "home_1" + end, + on_secondary_use = function(itemstack, player, pointed) + local meta = itemstack:get_meta() + if meta:get_string("pages") ~= "" then meta:set_string("pages", "") end + local chapters = minetest.deserialize(meta:get_string("chapters")) or {} + if pointed + and pointed.type == "object" then + local ent = pointed.ref and pointed.ref:get_luaentity() + if ent + and pages[ent.name] + and not chapters[ent.name] then + chapters[ent.name] = true + itemstack:get_meta():set_string("chapters", minetest.serialize(chapters)) + player:set_wielded_item(itemstack) + end + return itemstack + end + local name = player:get_player_name() + minetest.show_formspec(name, "animalia:libri_home_1", get_page("home_1", meta, name)) + libri_players[name] = "home_1" + end +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local plyr_name = player:get_player_name() + local wielded_item = player:get_wielded_item() + local meta = wielded_item:get_meta() + if formname:match("animalia:libri_") then + for page in pairs(pages) do + if not page:match("^home") then + local name = page:split(":")[2] + if fields["btn_" .. name] then + minetest.show_formspec(plyr_name, "animalia:libri_" .. name, get_page(page, meta, plyr_name)) + libri_players[plyr_name] = page + return true + end + end + end + if fields.btn_next then + local current_no = tonumber(formname:sub(-1)) + local page = "home_" .. current_no + 1 + if pages[page] then + minetest.show_formspec(plyr_name, "animalia:libri_" .. page, get_page(page, meta, plyr_name)) + libri_players[plyr_name] = page + return true + end + end + if fields.btn_last then + local current_no = tonumber(formname:sub(-1)) + local page = "home_" .. current_no - 1 + if pages[page] then + minetest.show_formspec(plyr_name, "animalia:libri_" .. page, get_page(page, meta, plyr_name)) + libri_players[plyr_name] = page + return true + end + end + if fields.drp_font_scale then + animalia.libri_font_size[plyr_name] = fields.drp_font_scale + local page = libri_players[plyr_name] + if not page then return end + minetest.show_formspec(plyr_name, "animalia:libri_" .. page, get_page(page, meta, plyr_name)) + end + if fields.quit or fields.key_enter then + libri_players[plyr_name] = nil + end + end +end) diff --git a/mods/animalia/api/mob_ai.lua b/mods/animalia/api/mob_ai.lua new file mode 100644 index 00000000..489e4762 --- /dev/null +++ b/mods/animalia/api/mob_ai.lua @@ -0,0 +1,2065 @@ +------------ +-- Mob AI -- +------------ + +-- Math -- + +local abs = math.abs +local atan2 = math.atan2 +local cos = math.cos +local min = math.min +local max = math.max +local floor = math.floor +local pi = math.pi +local pi2 = pi * 2 +local sin = math.sin +local rad = math.rad +local random = math.random + +local function diff(a, b) -- Get difference between 2 angles + return atan2(sin(b - a), cos(b - a)) +end + +local function clamp(val, minn, maxn) + if val < minn then + val = minn + elseif maxn < val then + val = maxn + end + return val +end + +-- Vector Math -- + +local vec_add, vec_dot, vec_dir, vec_dist, vec_multi, vec_normal, + vec_round, vec_sub = vector.add, vector.dot, vector.direction, vector.distance, + vector.multiply, vector.normalize, vector.round, vector.subtract + +local dir2yaw = minetest.dir_to_yaw +local yaw2dir = minetest.yaw_to_dir + +----------------- +-- Local Tools -- +----------------- + +local farming_enabled = minetest.get_modpath("farming") and farming.registered_plants + +if farming_enabled then + minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_nodes) do + local item_string = name:sub(1, #name - 2) + local item_name = item_string:split(":")[2] + local growth_stage = tonumber(name:sub(-1)) or 1 + if farming.registered_plants[item_string] + or farming.registered_plants[item_name] then + def.groups.crop = growth_stage + end + minetest.register_node(":" .. name, def) + end + end) +end + +local animate_player = {} + +if minetest.get_modpath("default") +and minetest.get_modpath("player_api") then + animate_player = player_api.set_animation +elseif minetest.get_modpath("mcl_player") then + animate_player = mcl_player.player_set_animation +end + +local function get_group_positions(self) + local objects = creatura.get_nearby_objects(self, self.name) + local group = {} + for _, object in ipairs(objects) do + local obj_pos = object and object:get_pos() + if obj_pos then table.insert(group, obj_pos) end + end + return group +end + +local function calc_altitude(self, pos2) + local height_half = self.height * 0.5 + local center_y = pos2.y + height_half + local calc_pos = {x = pos2.x, y = center_y, z = pos2.z} + local range = (height_half + 2) + local offset = {x = 0, y = range, z = 0} + local ceil_pos, floor_pos = vec_add(calc_pos, offset), vec_sub(calc_pos, offset) + local ray_up = minetest.raycast(calc_pos, ceil_pos, false, true):next() + local ray_down = minetest.raycast(calc_pos, floor_pos, false, true):next() + ceil_pos = (ray_up and ray_up.above) or ceil_pos + floor_pos = (ray_down and ray_down.above) or floor_pos + + local dist_up = ceil_pos.y - center_y + local dist_down = floor_pos.y - center_y + + local altitude = (dist_up + dist_down) / 2 + + return ((calc_pos.y + altitude) - center_y) / range * 2 +end + +--[[local function calc_steering_and_lift(self, pos, pos2, dir, steer_method) + local steer_to = creatura.calc_steering(self, pos2, steer_method or creatura.get_context_small) + pos2 = vec_add(pos, steer_to) + local lift = creatura.get_avoidance_lift(self, pos2, 2) + steer_to.y = (lift ~= 0 and lift) or dir.y + return steer_to +end + +local function calc_steering_and_lift_aquatic(self, pos, pos2, dir, steer_method) + local steer_to = creatura.calc_steering(self, pos2, steer_method or creatura.get_context_small_aquatic) + local lift = creatura.get_avoidance_lift_aquatic(self, vec_add(pos, steer_to), 2) + steer_to.y = (lift ~= 0 and lift) or dir.y + return steer_to +end]] + +local function get_obstacle(pos, water) + local pos2 = {x = pos.x, y = pos.y, z = pos.z} + local n_def = creatura.get_node_def(pos2) + if n_def.walkable + or (water and (n_def.groups.liquid or 0) > 0) then + pos2.y = pos.y + 1 + n_def = creatura.get_node_def(pos2) + local col_max = n_def.walkable or (water and (n_def.groups.liquid or 0) > 0) + pos2.y = pos.y - 1 + local col_min = col_max and (n_def.walkable or (water and (n_def.groups.liquid or 0) > 0)) + if col_min then + return pos + else + pos2.y = pos.y + 1 + return pos2 + end + end +end + +function animalia.get_steering_context(self, goal, steer_dir, interest, danger, range) + local pos = self.object:get_pos() + if not pos then return end + pos = vec_round(pos) + local width = self.width or 0.5 + + local check_pos = vec_add(pos, steer_dir) + local collision = get_obstacle(check_pos) + local unsafe_pos = not collision and not self:is_pos_safe(check_pos) and check_pos + + if collision + or unsafe_pos then + local dir2goal = vec_normal(vec_dir(pos, goal)) + local dir2col = vec_normal(vec_dir(pos, collision or unsafe_pos)) + local dist2col = vec_dist(pos, collision or unsafe_pos) - width + local dot_score = vec_dot(dir2col, dir2goal) + local dist_score = (range - dist2col) / range + interest = interest - dot_score + danger = dist_score + end + return interest, danger +end + +-------------- +-- Movement -- +-------------- + +-- Obstacle Avoidance + +function animalia.obstacle_avoidance(self, goal, water) + local steer_method = water and creatura.get_context_small_aquatic or animalia.get_steering_context + local dir = creatura.calc_steering(self, goal, steer_method) + + local lift_method = water and creatura.get_avoidance_lift_aquatic or creatura.get_avoidance_lift + local lift = lift_method(self, vec_add(self.stand_pos, dir), 2) + dir.y = (lift ~= 0 and lift) or dir.y + + return dir +end + +-- Methods + +creatura.register_movement_method("animalia:fly_wide", function(self) + local steer_to + local steer_int = 0 + self:set_gravity(0) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + if vec_dist(pos, goal) < clamp(self.width, 0.5, 1) then + _self:halt() + return true + end + -- Calculate Movement + local turn_rate = 2.5 + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / max(speed, 1) + steer_to = (steer_int <= 0 and creatura.calc_steering(_self, goal)) or steer_to + local dir = steer_to or vec_dir(pos, goal) + local altitude = calc_altitude(self, vec_add(pos, dir)) + dir.y = (altitude ~= 0 and altitude) or dir.y + + if vec_dot(dir, yaw2dir(_self.object:get_yaw())) > 0.2 then -- Steer faster for major obstacles + turn_rate = 5 + end + -- Apply Movement + _self:turn_to(dir2yaw(dir), turn_rate) + _self:set_forward_velocity(speed) + _self:set_vertical_velocity(speed * dir.y) + end + return func +end) + +-- Steering Methods + +creatura.register_movement_method("animalia:steer", function(self) + local steer_to + local steer_int = 0 + + local radius = 2 -- Arrival Radius + + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + -- Vectors + local pos = self.object:get_pos() + if not pos or not goal then return end + + local dist = vec_dist(pos, goal) + local dir = vec_dir(pos, goal) + + -- Movement Params + local vel = self.speed * speed_factor + local turn_rate = self.turn_rate + local mag = min(radius - ((radius - dist) / 1), 1) + vel = vel * mag + + -- Steering + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / max(vel, 1) + steer_to = steer_int <= 0 and animalia.obstacle_avoidance(_self, goal) or steer_to + + -- Apply Movement + _self:turn_to(minetest.dir_to_yaw(steer_to or dir), turn_rate) + _self:set_forward_velocity(vel) + end + return func +end) + +creatura.register_movement_method("animalia:steer_no_gravity", function(self) + local steer_to + local steer_int = 0 + + local radius = 2 -- Arrival Radius + + self:set_gravity(0) + local function func(_self, goal, speed_factor) + -- Vectors + local pos = self.object:get_pos() + if not pos or not goal then return end + + local dist = vec_dist(pos, goal) + local dir = vec_dir(pos, goal) + + -- Movement Params + local vel = self.speed * speed_factor + local turn_rate = self.turn_rate + local mag = min(radius - ((radius - dist) / 1), 1) + vel = vel * mag + + -- Steering + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / max(vel, 1) + steer_to = steer_int <= 0 and animalia.obstacle_avoidance(_self, goal, _self.max_breath == 0) or steer_to + + -- Apply Movement + _self:turn_to(minetest.dir_to_yaw(steer_to or dir), turn_rate) + _self:set_forward_velocity(vel) + _self:set_vertical_velocity(dir.y * vel) + end + return func +end) + +-- Simple Methods + +creatura.register_movement_method("animalia:move", function(self) + local radius = 2 -- Arrival Radius + + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + -- Vectors + local pos = self.object:get_pos() + if not pos or not goal then return end + + local dist = vec_dist(pos, goal) + local dir = vec_dir(pos, goal) + + -- Movement Params + local vel = self.speed * speed_factor + local turn_rate = self.turn_rate + local mag = min(radius - ((radius - dist) / 1), 1) + vel = vel * mag + + -- Apply Movement + _self:turn_to(minetest.dir_to_yaw(dir), turn_rate) + _self:set_forward_velocity(vel) + end + return func +end) + +creatura.register_movement_method("animalia:move_no_gravity", function(self) + local radius = 2 -- Arrival Radius + + self:set_gravity(0) + local function func(_self, goal, speed_factor) + -- Vectors + local pos = self.object:get_pos() + if not pos or not goal then return end + + local dist = vec_dist(pos, goal) + local dir = vec_dir(pos, goal) + + -- Movement Params + local vel = self.speed * speed_factor + local turn_rate = self.turn_rate + local mag = min(radius - ((radius - dist) / 1), 1) + vel = vel * mag + + -- Apply Movement + _self:turn_to(minetest.dir_to_yaw(dir), turn_rate) + _self:set_forward_velocity(vel) + _self:set_vertical_velocity(vel * dir.y) + end + return func +end) + +------------- +-- Actions -- +------------- + +function animalia.action_walk(self, time, speed, animation, pos2) + local timeout = time or 3 + local speed_factor = speed or 0.5 + local anim = animation or "walk" + + local wander_radius = 2 + + local dir = pos2 and vec_dir(self.stand_pos, pos2) + local function func(mob) + local pos, yaw = mob.object:get_pos(), mob.object:get_yaw() + if not pos or not yaw then return true end + + dir = pos2 and vec_dir(pos, pos2) or minetest.yaw_to_dir(yaw) + + local wander_point = vec_add(pos, vec_multi(dir, wander_radius + 0.5)) + local goal = vec_add(wander_point, vec_multi(minetest.yaw_to_dir(random(pi2)), wander_radius)) + + local safe = true + + if mob.max_fall then + safe = mob:is_pos_safe(goal) + end + + if timeout <= 0 + or not safe + or mob:move_to(goal, "animalia:steer", speed_factor) then + mob:halt() + return true + end + + timeout = timeout - mob.dtime + if timeout <= 0 then return true end + + mob:animate(anim) + end + self:set_action(func) +end + +function animalia.action_swim(self, time, speed, animation, pos2) + local timeout = time or 3 + local speed_factor = speed or 0.5 + local anim = animation or "swim" + + local wander_radius = 2 + + local function func(mob) + local pos, yaw = mob.object:get_pos(), mob.object:get_yaw() + if not pos or not yaw then return true end + + if not mob.in_liquid then return true end + + local steer_direction = pos2 and vec_dir(pos, pos2) + + if not steer_direction then + local wander_point = { + x = pos.x + -sin(yaw) * (wander_radius + 0.5), + y = pos.y, + z = pos.z + cos(yaw) * (wander_radius + 0.5) + } + local wander_angle = random(pi2) + + steer_direction = vec_dir(pos, { + x = wander_point.x + -sin(wander_angle) * wander_radius, + y = wander_point.y + (random(-10, 10) / 10), + z = wander_point.z + cos(wander_angle) * wander_radius + }) + end + + -- Boids + local boid_dir = mob.uses_boids and creatura.get_boid_dir(mob) + if boid_dir then + steer_direction = { + x = (steer_direction.x + boid_dir.x) / 2, + y = (steer_direction.y + boid_dir.y) / 2, + z = (steer_direction.z + boid_dir.z) / 2 + } + end + + local goal = vec_add(pos, vec_multi(steer_direction, mob.width + 2)) + + if timeout <= 0 + or mob:move_to(goal, "animalia:steer_no_gravity", speed_factor) then + mob:halt() + return true + end + + timeout = timeout - mob.dtime + if timeout <= 0 then return true end + + mob:animate(anim) + end + self:set_action(func) +end + +function animalia.action_fly(self, time, speed, animation, pos2, turn) + local timeout = time or 3 + local speed_factor = speed or 0.5 + local anim = animation or "fly" + local turn_rate = turn or 1.5 + + local wander_radius = 2 + + local function func(mob) + local pos, yaw = mob.object:get_pos(), mob.object:get_yaw() + if not pos or not yaw then return true end + + local steer_direction = pos2 and vec_dir(pos, pos2) + + if not steer_direction then + local wander_point = { + x = pos.x + -sin(yaw) * (wander_radius + turn_rate), + y = pos.y, + z = pos.z + cos(yaw) * (wander_radius + turn_rate) + } + local wander_angle = random(pi2) + + steer_direction = vec_dir(pos, { + x = wander_point.x + -sin(wander_angle) * wander_radius, + y = wander_point.y + (random(-10, 10) / 10) * turn_rate, + z = wander_point.z + cos(wander_angle) * wander_radius + }) + end + + -- Boids + local boid_dir = mob.uses_boids and creatura.get_boid_dir(mob) + if boid_dir then + steer_direction = { + x = (steer_direction.x + boid_dir.x) / 2, + y = (steer_direction.y + boid_dir.y) / 2, + z = (steer_direction.z + boid_dir.z) / 2 + } + end + + local goal = vec_add(pos, vec_multi(steer_direction, mob.width + 2)) + + if timeout <= 0 + or mob:move_to(goal, "animalia:steer_no_gravity", speed_factor) then + mob:halt() + return true + end + + timeout = timeout - mob.dtime + if timeout <= 0 then return true end + + mob:animate(anim) + end + self:set_action(func) +end + +-- Latch to pos +-- if self.animations["latch_ceiling"] then latch to ceiling end +-- if self.animations["latch_wall"] then latch to wall end + +local latch_ceil_offset = {x = 0, y = 1, z = 0} +local latch_wall_offset = { + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1} +} + + +function animalia.action_latch(self) + local pos = self.object:get_pos() + if not pos then return end + + local ceiling + if self.animations["latch_ceiling"] then + ceiling = vec_add(pos, latch_ceil_offset) + + if not creatura.get_node_def(ceiling).walkable then + ceiling = nil + end + end + + local wall + if self.animations["latch_wall"] then + for n = 1, 4 do + wall = vec_add(self.stand_pos, latch_wall_offset[n]) + + if creatura.get_node_def(wall).walkable then + break + else + wall = nil + end + end + end + local function func(mob) + mob:set_gravity(0) + + if ceiling then + mob:animate("latch_ceiling") + mob:set_vertical_velocity(1) + mob:set_forward_velocity(0) + return + end + + if wall then + mob:animate("latch_wall") + mob.object:set_yaw(minetest.dir_to_yaw(vec_dir(pos, wall))) + mob:set_vertical_velocity(0) + mob:set_forward_velocity(1) + end + end + self:set_action(func) +end + +function animalia.action_pursue(self, target, timeout, method, speed_factor, anim) + local timer = timeout or 4 + local goal + local function func(_self) + local target_alive, line_of_sight, tgt_pos = _self:get_target(target) + if not target_alive then + return true + end + goal = goal or tgt_pos + timer = timer - _self.dtime + self:animate(anim or "walk") + local safe = true + if _self.max_fall + and _self.max_fall > 0 then + local pos = self.object:get_pos() + if not pos then return end + safe = _self:is_pos_safe(goal) + end + if line_of_sight + and vec_dist(goal, tgt_pos) > 3 then + goal = tgt_pos + end + if timer <= 0 + or not safe + or _self:move_to(goal, method or "creatura:obstacle_avoidance", speed_factor or 0.5) then + return true + end + end + self:set_action(func) +end + +function animalia.action_melee(self, target) + local stage = 1 + local is_animated = self.animations["melee"] ~= nil + local timeout = 1 + + local function func(mob) + local target_pos = target and target:get_pos() + if not target_pos then return true end + + local pos = mob.stand_pos + local dist = vec_dist(pos, target_pos) + local dir = vec_dir(pos, target_pos) + + local anim = is_animated and mob:animate("melee", "stand") + + if stage == 1 then + mob.object:add_velocity({x = dir.x * 3, y = 2, z = dir.z * 3}) + + stage = 2 + end + + if stage == 2 + and dist < mob.width + 1 then + mob:punch_target(target) + local knockback = minetest.calculate_knockback( + target, mob.object, 1.0, + {damage_groups = {fleshy = mob.damage}}, + dir, 2.0, mob.damage + ) + target:add_velocity({x = dir.x * knockback, y = dir.y * knockback, z = dir.z * knockback}) + + stage = 3 + end + + if stage == 3 + and (not is_animated + or anim == "stand") then + return true + end + + timeout = timeout - mob.dtime + if timeout <= 0 then return true end + end + self:set_action(func) +end + +function animalia.action_play(self, target) + local stage = 1 + local is_animated = self.animations["play"] ~= nil + local timeout = 1 + + local function func(mob) + local target_pos = target and target:get_pos() + if not target_pos then return true end + + local pos = mob.stand_pos + local dist = vec_dist(pos, target_pos) + local dir = vec_dir(pos, target_pos) + + local anim = is_animated and mob:animate("play", "stand") + + if stage == 1 then + mob.object:add_velocity({x = dir.x * 3, y = 2, z = dir.z * 3}) + + stage = 2 + end + + if stage == 2 + and dist < mob.width + 1 then + animalia.add_trust(mob, target, 1) + + stage = 3 + end + + if stage == 3 + and (not is_animated + or anim == "stand") then + return true + end + + timeout = timeout - mob.dtime + if timeout <= 0 then return true end + end + self:set_action(func) +end + +function animalia.action_float(self, time, anim) + local timer = time + local function func(_self) + _self:set_gravity(-0.14) + _self:halt() + _self:animate(anim or "foat") + timer = timer - _self.dtime + if timer <= 0 then + return true + end + end + self:set_action(func) +end + +function animalia.action_dive_attack(self, target, timeout) + timeout = timeout or 12 + local timer = timeout + local width = self.width or 0.5 + local punch_init = false + local anim + local function func(_self) + -- Tick down timers + timer = timer - _self.dtime + if timer <= 0 then return true end + + -- Get positions + local pos = _self.stand_pos + local tgt_pos = target and target:get_pos() + if not tgt_pos then return true end + local dist = vec_dist(pos, tgt_pos) + + if punch_init then + anim = _self:animate("fly_punch", "fly") + if anim == "fly" then return true end + else + anim = _self:animate("fly") + end + + if dist > width + 1 then + local method = "animalia:move_no_gravity" + if dist > 4 then + method = "animalia:steer_no_gravity" + end + _self:move_to(tgt_pos, method, 1) + elseif not punch_init then + _self:punch_target(target) + punch_init = true + end + end + self:set_action(func) +end + +-- Behaviors + +creatura.register_utility("animalia:die", function(self) + local timer = 1.5 + local init = false + local function func(_self) + if not init then + _self:play_sound("death") + creatura.action_fallover(_self) + init = true + end + timer = timer - _self.dtime + if timer <= 0 then + local pos = _self.object:get_pos() + if not pos then return end + minetest.add_particlespawner({ + amount = 8, + time = 0.25, + minpos = {x = pos.x - 0.1, y = pos.y, z = pos.z - 0.1}, + maxpos = {x = pos.x + 0.1, y = pos.y + 0.1, z = pos.z + 0.1}, + minacc = {x = 0, y = 2, z = 0}, + maxacc = {x = 0, y = 3, z = 0}, + minvel = {x = random(-1, 1), y = -0.25, z = random(-1, 1)}, + maxvel = {x = random(-2, 2), y = -0.25, z = random(-2, 2)}, + minexptime = 0.75, + maxexptime = 1, + minsize = 4, + maxsize = 4, + texture = "creatura_smoke_particle.png", + animation = { + type = 'vertical_frames', + aspect_w = 4, + aspect_h = 4, + length = 1, + }, + glow = 1 + }) + creatura.drop_items(_self) + _self.object:remove() + end + end + self:set_utility(func) +end) + +-- Basic -- + +creatura.register_utility("animalia:basic_idle", function(self, timeout, anim) + local timer = timeout or 1 + local init = false + local function func(mob) + if not init then + creatura.action_idle(mob, timer, anim) + end + timer = timer - mob.dtime + if timer <= 0 then + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_wander", function(self) + local idle_max = 4 + local move_chance = 3 + local graze_chance = 16 + + --local iter = 1 + local range = self.tracking_range + + local center + local function func(mob) + local pos = mob.stand_pos + + if mob:timer(2) then + --iter = iter < 3 and iter + 1 or 1 -- Iterate to 3, then reset to 1 + + -- Grazing Behavior + if mob.is_grazing_mob + and random(graze_chance) < 2 then + local yaw = mob.object:get_yaw() + if not yaw then return true end + + local turf_pos = { + x = pos.x + -sin(yaw) * mob.width, + y = pos.y - 0.5, + z = pos.z + cos(yaw) * mob.width + } + + if animalia.eat_turf(mob, turf_pos) then + animalia.add_break_particle(turf_pos) + creatura.action_idle(mob, 1, "eat") + end + end + + -- Herding Behavior + if mob.is_herding_mob then + center = animalia.get_average_pos(get_group_positions(mob)) or pos + + if vec_dist(pos, center) < range / 4 then + center = false + end + end + + -- Skittish Behavior + if mob.is_skittish_mob then + local plyr = creatura.get_nearby_player(mob) + local plyr_alive, los, plyr_pos = mob:get_target(plyr) + if plyr_alive + and los then + center = vec_add(pos, vec_dir(plyr_pos, pos)) + end + end + end + + if not mob:get_action() then + if random(move_chance) < 2 then + animalia.action_walk(mob, 3, 0.2, "walk", center) + center = false + else + creatura.action_idle(mob, random(idle_max), "stand") + end + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_seek_pos", function(self, pos2, timeout) + timeout = timeout or 3 + local function func(mob) + local pos = mob.object:get_pos() + if not pos or not pos2 then return true end + + if not mob:get_action() then + local anim = (mob.animations["run"] and "run") or "walk" + animalia.action_walk(mob, 1, 1, anim, pos2) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_seek_food", function(self) + local timeout = 3 + + local food = animalia.get_dropped_food(self) + local food_reached = false + local function func(mob) + local pos = mob.object:get_pos() + local food_pos = food and food:get_pos() + if not pos or not food_pos then return true, 10 end + + local dist = vec_dist(pos, food_pos) + if dist < mob.width + 0.5 + and not food_reached then + food_reached = true + + local anim = (mob.animations["eat"] and "eat") or "stand" + creatura.action_idle(mob, 1, anim) + animalia.eat_dropped_item(mob, food) + end + + if not mob:get_action() then + if food_reached then return true, 10 end + local anim = (mob.animations["run"] and "run") or "walk" + animalia.action_walk(mob, 1, 1, anim, food_pos) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_seek_crop", function(self) + local timeout = 12 + + local crop = animalia.find_crop(self) + local crop_reached = false + local function func(mob) + local pos = mob.object:get_pos() + if not pos or not crop then return true, 30 end + + local dist = vec_dist(pos, crop) + if dist < mob.width + 0.5 + and not crop_reached then + crop_reached = true + + local anim = (mob.animations["eat"] and "eat") or "stand" + creatura.action_idle(mob, 1, anim) + animalia.eat_crop(mob, crop) + end + + if not mob:get_action() then + if crop_reached then return true, 10 end + animalia.action_walk(mob, 2, 0.5, "walk", crop) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_flee", function(self, target) + local function func(mob) + local pos, target_pos = mob.object:get_pos(), target:get_pos() + if not pos or not target_pos then return true end + + if not mob:get_action() then + animalia.action_walk(mob, 0.5, 1, "run", vec_add(pos, vec_dir(target_pos, pos))) + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_attack", function(self, target) + local has_attacked = false + local has_warned = not self.warn_before_attack + local function func(mob) + local target_alive, _, target_pos = mob:get_target(target) + if not target_alive then return true end + + local pos = mob.object:get_pos() + if not pos then return true end + + if not mob:get_action() then + if has_attacked then return true, 2 end + + local dist = vec_dist(pos, target_pos) + + if dist > mob.width + 1 then + if not has_warned + and dist > mob.width + 2 then + local yaw = mob.object:get_yaw() + local yaw_to_target = minetest.dir_to_yaw(vec_dir(pos, target_pos)) + + if abs(diff(yaw, yaw_to_target)) > pi / 2 then + animalia.action_pursue(mob, target) + else + creatura.action_idle(mob, 0.5, "warn") + end + return + else + animalia.action_pursue(mob, target, 0.5) + end + else + animalia.action_melee(mob, target) + has_attacked = true + end + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:basic_breed", function(self) + local mate = animalia.get_nearby_mate(self, self.name) + + local timer = 0 + local function func(mob) + if not mob.breeding then return true end + + local pos, target_pos = mob.object:get_pos(), mate and mate:get_pos() + if not pos or not target_pos then return true end + + local dist = vec_dist(pos, target_pos) + timer = dist < mob.width + 0.5 and timer + mob.dtime or timer + + if timer > 2 then + local mate_entity = mate:get_luaentity() + + mob.breeding = mob:memorize("breeding", false) + mob.breeding_cooldown = mob:memorize("breeding_cooldown", 300) + mate_entity.breeding = mate_entity:memorize("breeding", false) + mate_entity.breeding_cooldown = mate_entity:memorize("breeding_cooldown", 300) + + animalia.particle_spawner(pos, "heart.png", "float") + + for _ = 1, mob.birth_count or 1 do + if mob.add_child then + mob:add_child(mate_entity) + else + local object = minetest.add_entity(pos, mob.name) + local ent = object:get_luaentity() + ent.growth_scale = 0.7 + animalia.initialize_api(ent) + animalia.protect_from_despawn(ent) + end + end + return true, 60 + end + + if not mob:get_action() then + animalia.action_pursue(mob, mate) + end + end + self:set_utility(func) +end) + +-- Swim -- + +creatura.register_utility("animalia:swim_wander", function(self) + local move_chance = 2 + local idle_max = 4 + + local function func(mob) + if not mob:get_action() then + if not mob.in_liquid then + creatura.action_idle(mob, 1, "flop") + return + end + + if not mob.idle_in_water + or random(move_chance) < 2 then + animalia.action_swim(mob, 0.5) + else + animalia.action_float(mob, random(idle_max), "float") + end + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:swim_seek_land", function(self) + local land_pos + + self:set_gravity(-9.8) + local function func(mob) + if not land_pos then + for i = 0, 330, 30 do + land_pos = animalia.find_collision(mob, yaw2dir(rad(i))) + + if land_pos then + land_pos.y = land_pos.y + 1 + if minetest.get_node(land_pos).name == "air" then + break + else + land_pos = nil + end + end + end + if not land_pos then return true end + end + + local pos, yaw = mob.object:get_pos(), mob.object:get_yaw() + if not yaw then return end + + local tyaw = dir2yaw(vec_dir(pos, land_pos)) + if abs(tyaw - yaw) > 0.1 then + mob:turn_to(tyaw, 12) + end + + mob:set_forward_velocity(mob.speed * 0.5) + mob:animate("walk") + if vec_dist(pos, land_pos) < 1 + or (not mob.in_liquid + and mob.touching_ground) then + return true + end + end + self:set_utility(func) +end) + +-- Fly -- + +creatura.register_utility("animalia:fly_wander", function(self, turn_rate) + local move_chance = 2 + local idle_max = 4 + + local function func(mob) + if not mob:get_action() then + if not mob.idle_while_flying + or random(move_chance) < 2 then + animalia.action_fly(mob, 1, 0.5, "fly", nil, turn_rate) + else + animalia.action_hover(mob, random(idle_max), "hover") + end + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:fly_seek_home", function(self) + local home = self.home_position + local roost = self.roost_action or creatura.action_idle + local is_home = self.is_roost or function(pos, home_pos) + if abs(pos.x - home_pos.x) < 0.5 + and abs(pos.z - home_pos.z) < 0.5 + and abs(pos.y - home_pos.y) < 0.75 then + return true + end + return false + end + local function func(mob) + local pos = mob.object:get_pos() + if not pos or not home then return true end + + if not mob:get_action() then + if is_home(pos, home) then + roost(mob, 1) + return + end + creatura.action_move(mob, home, 3, "animalia:steer_no_gravity", 1, "fly") + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:fly_seek_land", function(self) + local landed = false + local function func(_self) + if not _self:get_action() then + if landed then return true end + if _self.touching_ground then + creatura.action_idle(_self, 0.5, "stand") + landed = true + else + local pos2 = _self:get_wander_pos_3d(3, 6) + if pos2 then + local dist2floor = creatura.sensor_floor(_self, 10, true) + pos2.y = pos2.y - dist2floor + creatura.action_move(_self, pos2, 3, "animalia:move_no_gravity", 0.6, "fly") + end + end + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:fly_seek_food", function(self) + local timeout = 3 + + local food = animalia.get_dropped_food(self) + local food_reached = false + local function func(mob) + local pos = mob.object:get_pos() + local food_pos = food and food:get_pos() + if not pos or not food_pos then return true, 5 end + + local dist = vec_dist(pos, food_pos) + if dist < mob.width + 0.5 + and not food_reached then + food_reached = true + + local anim = (mob.animations["eat"] and "eat") or "stand" + creatura.action_idle(mob, 1, anim) + animalia.eat_dropped_item(mob, food) + end + + if not mob:get_action() then + if food_reached then return true, 10 end + animalia.action_fly(mob, 1, 1, "fly", food_pos, 3) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +-- Horse -- + +creatura.register_utility("animalia:horse_tame", function(self) + local trust = 5 + local player = self.rider + local player_props = player and player:get_properties() + if not player_props then return end + local player_size = player_props.visual_size + local mob_size = self.visual_size + local adj_size = { + x = player_size.x / mob_size.x, + y = player_size.y / mob_size.y + } + if player_size.x ~= adj_size.x then + player:set_properties({ + visual_size = adj_size + }) + end + local function func(_self) + local pos = _self.object:get_pos() + if not pos then return end + if not player or not creatura.is_alive(player) then return true end + + -- Increase Taming progress while Players view is aligned with the Horses + local yaw, plyr_yaw = _self.object:get_yaw(), player:get_look_horizontal() + local yaw_diff = abs(diff(yaw, plyr_yaw)) + + trust = yaw_diff < pi / 3 and trust + _self.dtime or trust - _self.dtime * 0.5 + + if trust >= 10 then -- Tame + _self.owner = _self:memorize("owner", player:get_player_name()) + animalia.protect_from_despawn(_self) + animalia.mount(_self, player) + animalia.particle_spawner(pos, "creatura_particle_green.png", "float") + elseif trust <= 0 then -- Fail + animalia.mount(_self, player) + animalia.particle_spawner(pos, "creatura_particle_red.png", "float") + end + + -- Actions + if not _self:get_action() then + if random(3) < 2 then + creatura.action_idle(_self, 0.5, "punch_aoe") + else + animalia.action_walk(_self, 2, 0.75, "run") + end + end + + -- Dismount + if not player + or player:get_player_control().sneak then + animalia.mount(_self, player) + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:horse_ride", function(self, player) + local player_props = player and player:get_properties() + if not player_props then return end + local player_size = player_props.visual_size + local mob_size = self.visual_size + local adj_size = { + x = player_size.x / mob_size.x, + y = player_size.y / mob_size.y + } + if player_size.x ~= adj_size.x then + player:set_properties({ + visual_size = adj_size + }) + end + + local function func(_self) + if not creatura.is_alive(player) then + return true + end + local anim = "stand" + local speed_x = 0 + local tyaw = player:get_look_horizontal() + local control = player:get_player_control() + local vel = _self.object:get_velocity() + if not tyaw then return true end + + if control.sneak + or not _self.rider then + animalia.mount(_self, player) + return true + end + + animate_player(player, "sit", 30) + + if _self:timer(1) then + player_props = player and player:get_properties() + if player_props.visual_size.x ~= adj_size.x then + player:set_properties({ + visual_size = adj_size + }) + end + end + + if control.up then + speed_x = 1 + anim = "walk" + if control.aux1 then + speed_x = 1.5 + anim = "run" + end + end + + -- Jump Control + if control.jump + and _self.touching_ground + and vel.y < 1 then + _self.object:add_velocity({ + x = 0, + y = _self.jump_power * 2, + z = 0 + }) + elseif not _self.touching_ground then + speed_x = speed_x * 0.75 + end + + -- Rear Animation when jumping + if not _self.touching_ground + and not _self.in_liquid + and vel.y > 0 then + anim = "rear" + end + + -- Steering + local yaw = _self.object:get_yaw() + + _self.head_tracking = nil + animalia.move_head(_self, tyaw, 0) + + if speed_x > 0 and control.left then tyaw = tyaw + pi * 0.25 end + if speed_x > 0 and control.right then tyaw = tyaw - pi * 0.25 end + if abs(yaw - tyaw) > 0.1 then + _self:turn_to(tyaw, _self.turn_rate) + end + + _self:set_forward_velocity(_self.speed * speed_x) + _self:animate(anim) + end + self:set_utility(func) +end) + +-- Eagle -- + +creatura.register_utility("animalia:eagle_attack", function(self, target) + local function func(mob) + local pos = mob.object:get_pos() + local _, is_visible, target_pos = mob:get_target(target) + + if not pos or not target_pos then return true end + + if not mob:get_action() then + local vantage_pos = { + x = target_pos.x, + y = target_pos.y + 6, + z = target_pos.z + } + local dist = vec_dist(pos, vantage_pos) + + if dist > 8 then + animalia.action_fly(mob, 1, 1, "fly", vantage_pos, 2) + elseif not is_visible then + animalia.action_fly(mob, 1, 0.5, "glide", vantage_pos, 4) + else + animalia.action_dive_attack(mob, target, 6) + end + end + end + self:set_utility(func) +end) + +-- Cat -- + +creatura.register_utility("animalia:cat_seek_vessel", function(self) + local timeout = 12 + + local vessel + local vessel_reached = false + local function func(mob) + local pos = mob.object:get_pos() + if not pos then return true end + + if not vessel then + local nodes = minetest.find_nodes_in_area(vec_sub(pos, 6), vec_add(pos, 6), + {"vessels:glass_bottle", "vessels:drinking_glass"}) or {} + + if #nodes < 1 then return true, 10 end + + vessel = nodes[random(#nodes)] + end + + local dist = vec_dist(pos, vessel) + if dist < mob.width + 0.5 + and not vessel_reached then + vessel_reached = true + + creatura.action_idle(mob, 1) + + if not minetest.is_protected(vessel, "") then + minetest.remove_node(vessel) + minetest.add_item(vessel, "vessels:glass_fragments") + end + end + + if not mob:get_action() then + if vessel_reached then return true end + + animalia.action_walk(mob, 1, 1, "run", vessel) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:cat_follow_owner", function(self, player) + local timeout = 6 + local attack_chance = 6 + + local function func(mob) + local owner = player or (mob.owner and minetest.get_player_by_name(mob.owner)) + if not owner then return true end + + local pos, target_pos = mob.object:get_pos(), owner:get_pos() + if not pos or not target_pos then return true end + + if not mob:get_action() then + local dist = vec_dist(pos, target_pos) + + if dist > mob.width + 0.5 then + animalia.action_pursue(mob, owner) + else + if random(attack_chance) < 2 then + animalia.action_melee(mob, owner) + else + creatura.action_idle(mob, 1) + end + end + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:cat_play_with_owner", function(self) + local timeout = 6 + --local attack_chance = 6 + + local has_played = false + + local function func(mob) + local owner = mob.owner and minetest.get_player_by_name(mob.owner) + if not owner then return true end + + local item = owner:get_wielded_item() + local item_name = item and item:get_name() + + if item_name ~= "animalia:cat_toy" then return true, 5 end + + local pos, target_pos = mob.object:get_pos(), owner:get_pos() + if not pos or not target_pos then return true end + + if not mob:get_action() then + if has_played then return true, 20 end + local dist = vec_dist(pos, target_pos) + + if dist > mob.width + 0.5 then + animalia.action_pursue(mob, owner) + else + animalia.action_play(mob, owner) + has_played = true + end + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +-- Frog -- + +local function get_bug_pos(self) + local pos = self.object:get_pos() + if not pos then return end + + local food = minetest.find_nodes_in_area( + vec_sub(pos, 3), + vec_add(pos, 3), + self.follow + ) or {} + + return #food > 0 and food[1] +end + +creatura.register_utility("animalia:frog_seek_bug", function(self) + local timeout = 12 + + local bug = get_bug_pos(self) + local bug_reached = false + local function func(mob) + local pos = mob.object:get_pos() + if not pos or not bug then return true, 30 end + + local dist = vec_dist(pos, bug) + if dist < mob.width + 0.5 + and not bug_reached then + bug_reached = true + + local dir = vec_dir(pos, bug) + local frame = floor(dist * 10) + + self.object:set_yaw(dir2yaw(dir)) + animalia.move_head(self, dir2yaw(dir), dir.y) + creatura.action_idle(self, 0.4, "tongue_" .. frame) + + minetest.remove_node(bug) + end + + if not mob:get_action() then + if bug_reached then return true, 10 end + animalia.action_walk(mob, 2, 0.5, "walk", bug) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +-- Opossum + +local function grow_crop(crop) + local crop_name = minetest.get_node(crop).name + local growth_stage = tonumber(crop_name:sub(-1)) or 1 + local new_name = crop_name:sub(1, #crop_name - 1) .. (growth_stage + 1) + local new_def = minetest.registered_nodes[new_name] + + if new_def then + local p2 = new_def.place_param2 or 1 + minetest.set_node(crop, {name = new_name, param2 = p2}) + end +end + +creatura.register_utility("animalia:opossum_seek_crop", function(self) + local timeout = 12 + + local crop = animalia.find_crop(self) + local crop_reached = false + local function func(mob) + local pos = mob.object:get_pos() + if not pos or not crop then return true, 30 end + + local dist = vec_dist(pos, crop) + if dist < mob.width + 0.5 + and not crop_reached then + crop_reached = true + + creatura.action_idle(mob, 1, "clean_crop") + grow_crop(crop) + end + + if not mob:get_action() then + if crop_reached then return true, 10 end + animalia.action_walk(mob, 2, 0.5, "walk", crop) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +-- Rat -- + +local function find_chest(self) + local pos = self.object:get_pos() + if not pos then return end + + local nodes = minetest.find_nodes_with_meta(vec_sub(pos, 6), vec_add(pos, 6)) or {} + local pos2 + for _, node_pos in ipairs(nodes) do + local meta = minetest.get_meta(node_pos) + if meta:get_string("owner") == "" then + local inv = minetest.get_inventory({type = "node", pos = node_pos}) + if inv + and inv:get_list("main") then + pos2 = node_pos + end + end + end + return pos2 +end + +local function take_food_from_chest(self, pos) + local inv = minetest.get_inventory({type = "node", pos = pos}) + if inv + and inv:get_list("main") then + for i, stack in ipairs(inv:get_list("main")) do + local item_name = stack:get_name() + local def = minetest.registered_items[item_name] + for group in pairs(def.groups) do + if group:match("food_") then + stack:take_item() + inv:set_stack("main", i, stack) + animalia.add_food_particle(self, item_name) + return true + end + end + end + end +end + +creatura.register_utility("animalia:rat_seek_chest", function(self) + local timeout = 12 + + local chest = find_chest(self) + local chest_reached = false + local function func(mob) + local pos = mob.object:get_pos() + if not pos or not chest then return true, 30 end + + local dist = vec_dist(pos, chest) + if dist < mob.width + 0.5 + and not chest_reached then + chest_reached = true + + creatura.action_idle(mob, 1, "eat") + take_food_from_chest(mob, chest) + end + + if not mob:get_action() then + if chest_reached then return true, 10 end + animalia.action_walk(mob, 2, 0.5, "walk", chest) + end + + timeout = timeout - mob.dtime + if timeout <= 0 then + return true + end + end + self:set_utility(func) +end) + +-- Tamed -- + +creatura.register_utility("animalia:tamed_idle", function(self) + local function func(mob) + if not mob.owner or mob.order ~= "stay" then return true end + + if not mob:get_action() then + creatura.action_idle(mob, 1) + end + end + self:set_utility(func) +end) + +creatura.register_utility("animalia:tamed_follow_owner", function(self, player) + local function func(mob) + local owner = player or (mob.owner and minetest.get_player_by_name(mob.owner)) + if not owner then return true end + + local pos, target_pos = mob.object:get_pos(), owner:get_pos() + if not pos or not target_pos then return true end + + if not mob:get_action() then + local dist = vec_dist(pos, target_pos) + + if dist > mob.width + 1 then + animalia.action_pursue(mob, owner) + else + creatura.action_idle(mob, 1) + end + end + end + self:set_utility(func) +end) + +------------ +-- Mob AI -- +------------- + +animalia.mob_ai = {} + +animalia.mob_ai.basic_wander = { + utility = "animalia:basic_wander", + step_delay = 0.25, + get_score = function(self) + return 0.1, {self} + end +} + +animalia.mob_ai.basic_flee = { + utility = "animalia:basic_flee", + get_score = function(self) + local puncher = self._puncher + if puncher + and puncher:get_pos() then + return 0.6, {self, puncher} + end + self._puncher = nil + return 0 + end +} + +animalia.mob_ai.basic_breed = { + utility = "animalia:basic_breed", + get_score = function(self) + if self.breeding + and animalia.get_nearby_mate(self, self.name) then + return 0.6, {self} + end + return 0 + end +} + +animalia.mob_ai.basic_attack = { + utility = "animalia:basic_attack", + get_score = function(self) + return animalia.get_attack_score(self, self.attack_list) + end +} + +animalia.mob_ai.basic_seek_crop = { + utility = "animalia:basic_seek_crop", + step_delay = 0.25, + get_score = function(self) + if random(8) < 2 then + return 0.2, {self} + end + return 0 + end +} + +animalia.mob_ai.basic_seek_food = { + utility = "animalia:basic_seek_food", + get_score = function(self) + if random(1) < 8 then + return 0.3, {self} + end + return 0 + end +} + +-- Fly + +animalia.mob_ai.fly_wander = { + utility = "animalia:fly_wander", + step_delay = 0.25, + get_score = function(self) + return 0.1, {self} + end +} + +animalia.mob_ai.fly_landing_wander = { + utility = "animalia:fly_wander", + get_score = function(self) + if self.is_landed then + local player = creatura.get_nearby_player(self) + if player then + self.is_landed = self:memorize("is_landed", false) + end + end + if not self.is_landed + or self.in_liquid then + return 0.2, {self} + end + return 0 + end +} + +animalia.mob_ai.fly_seek_food = { + utility = "animalia:fly_seek_food", + get_score = function(self) + if random(8) < 2 then + return 0.3, {self} + end + return 0 + end +} + +animalia.mob_ai.fly_seek_land = { + utility = "animalia:fly_seek_land", + get_score = function(self) + if self.is_landed + and not self.touching_ground + and not self.in_liquid + and creatura.sensor_floor(self, 3, true) > 2 then + return 0.3, {self} + end + return 0 + end +} + +-- Swim + +animalia.mob_ai.swim_seek_land = { + utility = "animalia:swim_seek_land", + step_delay = 0.25, + get_score = function(self) + if self.in_liquid then + return 0.3, {self} + end + return 0 + end +} + +animalia.mob_ai.swim_wander = { + utility = "animalia:swim_wander", + step_delay = 0.25, + get_score = function(self) + return 0.1, {self} + end +} + +-- Tamed + +animalia.mob_ai.tamed_follow_owner = { + utility = "animalia:tamed_follow_owner", + get_score = function(self) + if self.owner + and self.order == "follow" then + return 0.4, {self} + end + + local lasso_holder = type(self._lassod_to) == "string" and minetest.get_player_by_name(self._lassod_to) + local player = lasso_holder or creatura.get_nearby_player(self) + + if lasso_holder + or self:follow_wielded_item(player) then + return 0.4, {self, player} + end + return 0 + end +} + +animalia.mob_ai.tamed_stay = { + utility = "animalia:basic_idle", + step_delay = 0.25, + get_score = function(self) + local order = self.order or "wander" + if order == "sit" then + return 0.5, {self} + end + return 0 + end +} + +-- Bat + +animalia.mob_ai.bat_seek_home = { + utility = "animalia:fly_seek_home", + get_score = function(self) + local pos = self.object:get_pos() + if not pos then return end + local home = animalia.is_day and self.home_position + if (home + and home.x + and vec_dist(pos, home) < 8) + or self.is_landed then + return 0.4, {self} + end + return 0 + end +} + +-- Cat + +animalia.mob_ai.cat_seek_vessel = { + utility = "animalia:cat_seek_vessel", + step_delay = 0.25, + get_score = function(self) + if random(8) < 2 then + return 0.2, {self} + end + return 0 + end +} + +animalia.mob_ai.cat_follow_owner = { + utility = "animalia:cat_follow_owner", + get_score = function(self) + local trust = (self.owner and self.trust[self.owner]) or 0 + + if trust + and trust > 4 + and self.order == "follow" then + return 0.4, {self} + end + + local lasso_holder = type(self._lassod_to) == "string" and minetest.get_player_by_name(self._lassod_to) + + if lasso_holder then + return 0.6, {self, lasso_holder} + end + return 0 + end +} + +animalia.mob_ai.cat_stay = { + utility = "animalia:basic_idle", + step_delay = 0.25, + get_score = function(self) + local trust = (self.owner and self.trust[self.owner]) or 0 + if trust < 5 then return 0 end + + local order = self.order or "wander" + if order == "sit" then + return 0.5, {self} + end + return 0 + end +} + +animalia.mob_ai.cat_play_with_owner = { + utility = "animalia:cat_play_with_owner", + get_score = function(self) + local trust = (self.owner and self.trust[self.owner]) or 0 + + if trust + and trust > 1 + and random(4) < 2 then + return 0.3, {self} + end + return 0 + end +} + +-- Eagle + +animalia.mob_ai.eagle_attack = { + utility = "animalia:eagle_attack", + get_score = function(self) + if random(12) > 1 + and (self:get_utility() or "") ~= "animalia:eagle_attack" then + return 0 + end + + local target = self._target or creatura.get_nearby_object(self, {"animalia:rat", "animalia:song_bird"}) + local tgt_pos = target and target:get_pos() + if tgt_pos then + return 0.4, {self, target} + end + return 0 + end +} + +-- Fox + +animalia.mob_ai.fox_flee = { + utility = "animalia:basic_flee", + get_score = function(self) + local target = self._puncher or creatura.get_nearby_player(self) + local pos, target_pos = self.object:get_pos(), target and target:get_pos() + if not pos or not target_pos then self._puncher = nil return 0 end + + local dist = vec_dist(pos, target_pos) + local score = ((self.tracking_range - dist) / self.tracking_range) * 0.5 + + if target:get_player_control().sneak then score = score * 0.5 end + + self._puncher = target + return score, {self, target} + end +} + +-- Frog + +animalia.mob_ai.frog_breed = { + utility = "animalia:basic_breed", + step_delay = 0.25, + get_score = function(self) + if self.breeding + and animalia.get_nearby_mate(self, self.name) + and self.in_liquid then + return 1, {self} + end + return 0 + end +} + +animalia.mob_ai.frog_flop = { + utility = "animalia:basic_idle", + step_delay = 0.25, + get_score = function(self) + if not self.in_liquid + and self.growth_scale < 0.8 then + return 1, {self, 1, "flop"} + end + return 0 + end +} + +animalia.mob_ai.frog_seek_water = { + utility = "animalia:basic_seek_pos", + get_score = function(self) + if self.in_liquid then return 0 end + + local pos = self.object:get_pos() + if not pos then return end + + local water = minetest.find_nodes_in_area(vec_sub(pos, 3), vec_add(pos, 3), {"group:water"}) + if not water[1] then return 0 end + + local player = self._target + local plyr_name = player and player:is_player() and player:get_player_name() + + if plyr_name then + local plyr_pos = player and player:get_pos() + local trust = self.trust[plyr_name] or 0 + return (10 - (vec_dist(pos, plyr_pos) + trust)) * 0.1, {self, water[1]} + end + return 0 + end +} + +animalia.mob_ai.frog_seek_bug = { + utility = "animalia:frog_seek_bug", + get_score = function(self) + if random(8) < 2 then + return 0.3, {self} + end + return 0 + end +} + +-- Opossum + +animalia.mob_ai.opossum_feint = { + utility = "animalia:basic_idle", + get_score = function(self) + local target = self._puncher or creatura.get_nearby_player(self) + local pos, tgt_pos = self.object:get_pos(), target and target:get_pos() + if not pos then return end + if not tgt_pos then self._puncher = nil return 0 end + local sneaking = target:get_player_control().sneak + if not sneaking then + local dist = vec_dist(pos, tgt_pos) + local score = (self.tracking_range - dist) / self.tracking_range + self._puncher = target + return score / 3, {self, 5, "feint"} + end + self._puncher = nil + return 0 + end +} + +animalia.mob_ai.opossum_seek_crop = { + utility = "animalia:opossum_seek_crop", + step_delay = 0.25, + get_score = function(self) + if random(8) < 2 then + return 0.4, {self} + end + return 0 + end +} + +-- Rat + +animalia.mob_ai.rat_seek_chest = { + utility = "animalia:rat_seek_chest", + step_delay = 0.25, + get_score = function(self) + if random(8) < 2 then + return 0.3, {self} + end + return 0 + end +} diff --git a/mods/animalia/api/spawning.lua b/mods/animalia/api/spawning.lua new file mode 100644 index 00000000..533c1294 --- /dev/null +++ b/mods/animalia/api/spawning.lua @@ -0,0 +1,409 @@ +-------------- +-- Spawning -- +-------------- + +local random = math.random + +local function table_contains(tbl, val) + for _, v in pairs(tbl) do + if v == val then + return true + end + end + return false +end + +local common_spawn_chance = tonumber(minetest.settings:get("animalia_common_chance")) or 60000 + +local ambient_spawn_chance = tonumber(minetest.settings:get("animalia_ambient_chance")) or 9000 + +local pest_spawn_chance = tonumber(minetest.settings:get("animalia_pest_chance")) or 3000 + +local predator_spawn_chance = tonumber(minetest.settings:get("animalia_predator_chance")) or 45000 + +-- Get Biomes -- already happens via Asuna/biomes.lua + +--[[local chicken_biomes = {} + +local frog_biomes = {} + +local pig_biomes = {} + +local function insert_all(tbl, tbl2) + for i = 1, #tbl2 do + table.insert(tbl, tbl2[i]) + end +end + +minetest.register_on_mods_loaded(function() + insert_all(chicken_biomes, animalia.registered_biome_groups["grassland"].biomes) + insert_all(chicken_biomes, animalia.registered_biome_groups["tropical"].biomes) + insert_all(pig_biomes, animalia.registered_biome_groups["temperate"].biomes) + insert_all(pig_biomes, animalia.registered_biome_groups["boreal"].biomes) + insert_all(frog_biomes, animalia.registered_biome_groups["swamp"].biomes) + insert_all(frog_biomes, animalia.registered_biome_groups["tropical"].biomes) +end)]] + +creatura.register_abm_spawn("animalia:grizzly_bear", { + chance = predator_spawn_chance, + min_height = -1, + max_height = 31000, + min_group = 1, + max_group = 1, + biomes = asuna.features.animals.grizzly_bear, + nodes = {"group:sand","group:soil","group:snowy"}, +}) + +creatura.register_abm_spawn("animalia:chicken", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 3, + max_group = 5, + spawn_cap = 3, + biomes = asuna.features.animals.chicken, + nodes = {"group:soil"}, +}) + +creatura.register_abm_spawn("animalia:cat", { + chance = common_spawn_chance, + min_height = 0, + max_height = 31000, + min_group = 1, + max_group = 2, + biomes = asuna.features.animals.cat, + nodes = {"group:soil"}, + neighbors = {"group:wood"} +}) + +creatura.register_abm_spawn("animalia:cow", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 3, + max_group = 4, + spawn_cap = 3, + biomes = asuna.features.animals.cow, + nodes = {"group:soil"}, + neighbors = {"air", "group:grass", "group:flora"} +}) + +creatura.register_abm_spawn("animalia:fox", { + chance = predator_spawn_chance, + min_height = 0, + max_height = 31000, + min_group = 1, + max_group = 2, + biomes = asuna.features.animals.fox, + nodes = {"group:soil"}, +}) + +creatura.register_abm_spawn("animalia:horse", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 3, + max_group = 4, + spawn_cap = 3, + biomes = asuna.features.animals.horse, + nodes = {"group:soil"}, + neighbors = {"air", "group:grass", "group:flora"} +}) + +creatura.register_abm_spawn("animalia:rat", { + chance = pest_spawn_chance, + interval = 60, + min_height = -1, + max_height = 31000, + min_group = 1, + max_group = 3, + spawn_in_nodes = true, + biomes = asuna.features.animals.rat, + nodes = {"group:crop"} +}) + +creatura.register_abm_spawn("animalia:owl", { + chance = predator_spawn_chance, + interval = 60, + min_height = 3, + max_height = 31000, + min_group = 1, + max_group = 1, + spawn_cap = 1, + biomes = asuna.features.animals.owl, + nodes = {"group:leaves"} +}) + +creatura.register_abm_spawn("animalia:opossum", { + chance = predator_spawn_chance, + interval = 60, + min_height = -1, + max_height = 31000, + min_group = 1, + max_group = 2, + biomes = asuna.features.animals.opossum, + nodes = {"group:soil", "group:leaves"} +}) + +creatura.register_abm_spawn("animalia:pig", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 2, + max_group = 3, + spawn_cap = 3, + biomes = asuna.features.animals.pig, + nodes = {"group:soil"}, +}) + +creatura.register_abm_spawn("animalia:reindeer", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 6, + max_group = 8, + spawn_cap = 3, + biomes = asuna.features.animals.reindeer, + nodes = {"group:soil"}, +}) + +creatura.register_abm_spawn("animalia:sheep", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 3, + max_group = 6, + spawn_cap = 3, + biomes = asuna.features.animals.sheep, + nodes = {"group:soil"}, + neighbors = {"air", "group:grass", "group:flora"} +}) + +creatura.register_abm_spawn("animalia:turkey", { + chance = common_spawn_chance, + spawn_active = true, + min_height = 0, + max_height = 31000, + min_group = 3, + max_group = 4, + spawn_cap = 3, + biomes = asuna.features.animals.turkey, + nodes = {"group:soil"}, +}) + +creatura.register_abm_spawn("animalia:wolf", { + chance = predator_spawn_chance, + min_height = 0, + max_height = 31000, + min_group = 2, + max_group = 3, + biomes = asuna.features.animals.wolf, + nodes = {"group:soil"}, +}) + +-- Ambient Spawning + +creatura.register_abm_spawn("animalia:bat", { + chance = ambient_spawn_chance, + interval = 30, + min_light = 0, + min_height = -31000, + max_height = 1, + min_group = 3, + max_group = 5, + spawn_cap = 6, + biomes = asuna.features.animals.bat, + nodes = {"group:stone"} +}) + +creatura.register_abm_spawn("animalia:song_bird", { + chance = ambient_spawn_chance, + interval = 60, + min_light = 0, + min_height = 1, + max_height = 31000, + min_group = 6, + max_group = 12, + spawn_cap = 6, + biomes = asuna.features.animals.song_bird, + nodes = {"group:leaves", "animalia:nest_song_bird"}, + neighbors = {"group:leaves"} +}) + +creatura.register_on_spawn("animalia:song_bird", function(self, pos) + local nests = minetest.find_nodes_in_area_under_air( + {x = pos.x - 16, y = pos.y - 16, z = pos.z - 16}, + {x = pos.x + 16, y = pos.y + 16, z = pos.z + 16}, + "animalia:nest_song_bird" + ) + if nests[1] then return end + local node = minetest.get_node(pos) + if node.name == "air" then + minetest.set_node(pos, {name = "animalia:nest_song_bird"}) + else + local nodes = minetest.find_nodes_in_area_under_air( + {x = pos.x - 3, y = pos.y - 3, z = pos.z - 3}, + {x = pos.x + 3, y = pos.y + 7, z = pos.z + 3}, + "group:leaves" + ) + if nodes[1] then + pos = nodes[1] + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, {name = "animalia:nest_song_bird"}) + end + end +end) + +creatura.register_abm_spawn("animalia:frog", { + chance = ambient_spawn_chance * 0.75, + interval = 60, + min_light = 0, + min_height = -1, + max_height = 8, + min_group = 1, + max_group = 2, + --neighbors = {"group:water"}, + nodes = {"group:soil"} +}) + +creatura.register_on_spawn("animalia:frog", function(self, pos) + local biome_data = minetest.get_biome_data(pos) + local biome_name = minetest.get_biome_name(biome_data.biome) + + if table_contains(animalia.registered_biome_groups["tropical"].biomes, biome_name) then + self:set_mesh(3) + elseif table_contains(animalia.registered_biome_groups["temperate"].biomes, biome_name) + or table_contains(animalia.registered_biome_groups["boreal"].biomes, biome_name) then + self:set_mesh(1) + elseif table_contains(animalia.registered_biome_groups["grassland"].biomes, biome_name) then + self:set_mesh(2) + else + self.object:remove() + end + + local activate = self.activate_func + + activate(self) +end) + +creatura.register_abm_spawn("animalia:tropical_fish", { + chance = ambient_spawn_chance, + min_height = -40, + max_height = -2, + min_group = 6, + max_group = 12, + biomes = asuna.features.animals.tropical_fish, + nodes = {"group:water","mapgen_water_source"}, + neighbors = {"group:coral","group:sand"}, + spawn_in_nodes = true, +}) + +-- World Gen Spawning + +minetest.register_node("animalia:spawner", { + description = "???", + drawtype = "airlike", + walkable = false, + pointable = false, + buildable_to = true, + paramtype = "light", + sunlight_propagates = true, + groups = {oddly_breakable_by_hand = 1, not_in_creative_inventory = 1} +}) + +minetest.register_decoration({ + name = "animalia:world_gen_spawning", + deco_type = "simple", + place_on = {"group:stone", "group:sand", "group:soil"}, + sidelen = 1, + fill_ratio = 0.0001, -- One node per chunk + decoration = "animalia:spawner" +}) + +local function do_on_spawn(pos, obj) + local name = obj and obj:get_luaentity().name + if not name then return end + local spawn_functions = creatura.registered_on_spawns[name] or {} + + if #spawn_functions > 0 then + for _, func in ipairs(spawn_functions) do + func(obj:get_luaentity(), pos) + if not obj:get_yaw() then break end + end + end +end + +minetest.register_abm({ + label = "[animalia] World Gen Spawning", + nodenames = {"animalia:spawner"}, + interval = 10, -- TODO: Set this to 1 if world is singleplayer and just started + chance = 16, + + action = function(pos, _, active_object_count) + minetest.remove_node(pos) + + if active_object_count > 4 then return end + + local spawnable_mobs = {} + + local current_biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) + + local spawn_definitions = creatura.registered_mob_spawns + + for mob, def in pairs(spawn_definitions) do + if mob:match("^animalia:") + and def.biomes + and table_contains(def.biomes, current_biome) then + table.insert(spawnable_mobs, mob) + end + end + + if #spawnable_mobs > 0 then + local mob_to_spawn = spawnable_mobs[math.random(#spawnable_mobs)] + local spawn_definition = creatura.registered_mob_spawns[mob_to_spawn] + + local group_size = random(spawn_definition.min_group or 1, spawn_definition.max_group or 1) + local obj + local mob_positions + + if group_size > 1 then + mob_positions = {} + local offset + local spawn_pos + for _ = 1, group_size do + offset = group_size * 0.5 + spawn_pos = creatura.get_ground_level({ + x = pos.x + random(-offset, offset), + y = pos.y, + z = pos.z + random(-offset, offset) + }, 3) + + if not creatura.is_pos_moveable(spawn_pos, 0.5, 0.5) then + table.insert(mob_positions,pos) + else + table.insert(mob_positions,spawn_pos) + end + end + else + mob_positions = { pos } + end + + for _,mpos in ipairs(mob_positions) do + local node = minetest.get_node(vector.offset(mpos,0,-1,0)).name + for _,target in ipairs(spawn_definition.nodes) do + if node == target or (target:find("^group:") and minetest.get_item_group(node,target:sub(7)) > 0) then + do_on_spawn(mpos, minetest.add_entity(mpos, mob_to_spawn)) + minetest.log("action","[Animalia] [ABM Spawning] Spawned " .. mob_to_spawn .. " at " .. minetest.pos_to_string(mpos)) + goto next_mpos + end + end + ::next_mpos:: + end + end + end +}) diff --git a/mods/animalia/api/storage.lua b/mods/animalia/api/storage.lua new file mode 100644 index 00000000..efbec8ac --- /dev/null +++ b/mods/animalia/api/storage.lua @@ -0,0 +1,22 @@ +local mod_storage = minetest.get_mod_storage() + +local data = { + spawn_points = minetest.deserialize(mod_storage:get_string("spawn_points")) or {}, + libri_font_size = minetest.deserialize(mod_storage:get_string("libri_font_size")) or {}, +} + +local function save() + mod_storage:set_string("spawn_points", minetest.serialize(data.spawn_points)) + mod_storage:set_string("libri_font_size", minetest.serialize(data.libri_font_size)) +end + +minetest.register_on_shutdown(save) +minetest.register_on_leaveplayer(save) + +local function periodic_save() + save() + minetest.after(120, periodic_save) +end +minetest.after(120, periodic_save) + +return data \ No newline at end of file diff --git a/mods/animalia/craftitems.lua b/mods/animalia/craftitems.lua new file mode 100644 index 00000000..05184e58 --- /dev/null +++ b/mods/animalia/craftitems.lua @@ -0,0 +1,796 @@ +---------------- +-- Craftitems -- +---------------- + +local random = math.random + +local vec_add, vec_sub = vector.add, vector.subtract + +local color = minetest.colorize + +local function correct_name(str) + if str then + if str:match(":") then str = str:split(":")[2] end + return (string.gsub(" " .. str, "%W%l", string.upper):sub(2):gsub("_", " ")) + end +end + +local function register_egg(name, def) + + minetest.register_entity(def.mob .. "_egg_entity", { + hp_max = 1, + physical = true, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + visual = "sprite", + visual_size = {x = 0.5, y = 0.5}, + textures = {def.inventory_image .. ".png"}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = true, + on_step = function(self, _, moveresult) + local pos = self.object:get_pos() + if not pos then return end + if moveresult.collides then + for _, collision in ipairs(moveresult.collisions) do + if collision.type == "nodes" then + minetest.add_particlespawner({ + amount = 6, + time = 0.1, + minpos = {x = pos.x - 7/16, y = pos.y - 5/16, z = pos.z - 7/16}, + maxpos = {x = pos.x + 7/16, y = pos.y - 5/16, z = pos.z + 7/16}, + minvel = {x = -1, y = 2, z = -1}, + maxvel = {x = 1, y = 5, z = 1}, + minacc = {x = 0, y = -9.8, z = 0}, + maxacc = {x = 0, y = -9.8, z = 0}, + collisiondetection = true, + collision_removal = true, + texture = "animalia_egg_fragment.png" + }) + break + elseif collision.type == "object" then + collision.object:punch(self.object, 2.0, {full_punch_interval = 0.1, damage_groups = {fleshy = 1}}, nil) + break + end + end + if random(3) < 2 then + local object = minetest.add_entity(pos, def.mob) + local ent = object and object:get_luaentity() + if not ent then return end + ent.growth_scale = 0.7 + animalia.initialize_api(ent) + animalia.protect_from_despawn(ent) + end + self.object:remove() + end + end + }) + + minetest.register_craftitem(name, { + description = def.description, + inventory_image = def.inventory_image .. ".png", + on_use = function(itemstack, player) + local pos = player:get_pos() + minetest.sound_play("default_place_node_hard", { + pos = pos, + gain = 1.0, + max_hear_distance = 5, + }) + local vel = 19 + local gravity = 9 + local object = minetest.add_entity({ + x = pos.x, + y = pos.y + 1.5, + z = pos.z + }, def.mob .. "_egg_entity") + local dir = player:get_look_dir() + object:set_velocity({ + x = dir.x * vel, + y = dir.y * vel, + z = dir.z * vel + }) + object:set_acceleration({ + x = dir.x * -3, + y = -gravity, + z = dir.z * -3 + }) + itemstack:take_item() + return itemstack + end, + groups = {food_egg = 1, flammable = 2}, + }) + + minetest.register_craftitem(name .. "_fried", { + description = "Fried " .. def.description, + inventory_image = def.inventory_image .. "_fried.png", + on_use = minetest.item_eat(4), + groups = {food_egg = 1, flammable = 2}, + }) + + minetest.register_craft({ + type = "cooking", + recipe = name, + output = name .. "_fried", + }) +end + +local function mob_storage_use(itemstack, player, pointed) + local ent = pointed.ref and pointed.ref:get_luaentity() + if ent + and (ent.name:match("^animalia:") + or ent.name:match("^monstrum:")) then + local desc = itemstack:get_short_description() + if itemstack:get_count() > 1 then + local name = itemstack:get_name() + local inv = player:get_inventory() + if inv:room_for_item("main", {name = name}) then + itemstack:take_item(1) + inv:add_item("main", name) + end + return itemstack + end + local plyr_name = player:get_player_name() + local meta = itemstack:get_meta() + local mob = meta:get_string("mob") or "" + if mob == "" then + animalia.protect_from_despawn(ent) + meta:set_string("mob", ent.name) + meta:set_string("staticdata", ent:get_staticdata()) + local ent_name = correct_name(ent.name) + local ent_gender = correct_name(ent.gender) + desc = desc .. " \n" .. color("#a9a9a9", ent_name) .. "\n" .. color("#a9a9a9", ent_gender) + if ent.trust + and ent.trust[plyr_name] then + desc = desc .. "\n Trust: " .. color("#a9a9a9", ent.trust[plyr_name]) + end + meta:set_string("description", desc) + player:set_wielded_item(itemstack) + ent.object:remove() + return itemstack + else + minetest.chat_send_player(plyr_name, + "This " .. desc .. " already contains a " .. correct_name(mob)) + end + end +end + +----------- +-- Drops -- +----------- + +minetest.register_craftitem("animalia:leather", { + description = "Leather", + inventory_image = "animalia_leather.png", + groups = {flammable = 2, leather = 1}, +}) + +minetest.register_craftitem("animalia:feather", { + description = "Feather", + inventory_image = "animalia_feather.png", + groups = {flammable = 2, feather = 1}, +}) + +minetest.register_craftitem("animalia:pelt_bear", { + description = "Bear Pelt", + inventory_image = "animalia_pelt_bear.png", + groups = {flammable = 2, pelt = 1}, +}) + +-- Meat -- + +minetest.register_craftitem("animalia:beef_raw", { + description = "Raw Beef", + inventory_image = "animalia_beef_raw.png", + on_use = minetest.item_eat(1), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craftitem("animalia:beef_cooked", { + description = "Steak", + inventory_image = "animalia_beef_cooked.png", + on_use = minetest.item_eat(8), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:beef_raw", + output = "animalia:beef_cooked", +}) + +minetest.register_craftitem("animalia:mutton_raw", { + description = "Raw Mutton", + inventory_image = "animalia_mutton_raw.png", + on_use = minetest.item_eat(1), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craftitem("animalia:mutton_cooked", { + description = "Cooked Mutton", + inventory_image = "animalia_mutton_cooked.png", + on_use = minetest.item_eat(6), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:mutton_raw", + output = "animalia:mutton_cooked", +}) + +minetest.register_craftitem("animalia:rat_raw", { + description = "Raw Rat", + inventory_image = "animalia_rat_raw.png", + on_use = minetest.item_eat(1), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craftitem("animalia:rat_cooked", { + description = "Cooked Rat", + inventory_image = "animalia_rat_cooked.png", + on_use = minetest.item_eat(2), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:rat_raw", + output = "animalia:rat_cooked", +}) + +minetest.register_craftitem("animalia:porkchop_raw", { + description = "Raw Porkchop", + inventory_image = "animalia_porkchop_raw.png", + on_use = minetest.item_eat(1), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craftitem("animalia:porkchop_cooked", { + description = "Cooked Porkchop", + inventory_image = "animalia_porkchop_cooked.png", + on_use = minetest.item_eat(7), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:porkchop_raw", + output = "animalia:porkchop_cooked", +}) + +minetest.register_craftitem("animalia:poultry_raw", { + description = "Raw Poultry", + inventory_image = "animalia_poultry_raw.png", + on_use = minetest.item_eat(1), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craftitem("animalia:poultry_cooked", { + description = "Cooked Poultry", + inventory_image = "animalia_poultry_cooked.png", + on_use = minetest.item_eat(6), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:poultry_raw", + output = "animalia:poultry_cooked", +}) + +minetest.register_craftitem("animalia:venison_raw", { + description = "Raw Venison", + inventory_image = "animalia_venison_raw.png", + on_use = minetest.item_eat(1), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craftitem("animalia:venison_cooked", { + description = "Venison Steak", + inventory_image = "animalia_venison_cooked.png", + on_use = minetest.item_eat(10), + groups = {flammable = 2, meat = 1, food_meat = 1}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:venison_raw", + output = "animalia:venison_cooked", +}) + +register_egg("animalia:chicken_egg", { + description = "Chicken Egg", + inventory_image = "animalia_egg", + mob = "animalia:chicken" +}) + +register_egg("animalia:turkey_egg", { + description = "Turkey Egg", + inventory_image = "animalia_egg", + mob = "animalia:turkey" +}) + +register_egg("animalia:song_bird_egg", { + description = "Song Bird Egg", + inventory_image = "animalia_song_bird_egg", + mob = "animalia:bird" +}) + +---------- +-- Misc -- +---------- + +minetest.register_craftitem("animalia:bucket_milk", { + description = "Bucket of Milk", + inventory_image = "animalia_milk_bucket.png", + stack_max = 1, + on_use = minetest.item_eat(8, "bucket:bucket_empty"), + groups = {food_milk = 1, flammable = 3}, +}) + +minetest.register_craftitem("animalia:bucket_guano", { + description = "Bucket of Guano", + inventory_image = "animalia_guano_bucket.png", + stack_max = 1, + groups = {flammable = 3}, + on_place = function(itemstack, placer, pointed) + local pos = pointed.under + local node = minetest.get_node(pos) + if node + and node.on_rightclick then + return node.on_rightclick(pos, node, placer, itemstack) + end + if minetest.is_protected(pos, placer:get_player_name()) then + return + end + local crops = minetest.find_nodes_in_area_under_air( + vec_sub(pos, 5), + vec_add(pos, 5), + {"group:grass", "group:plant", "group:flora", "group:crop"} + ) or {} + local crops_grown = 0 + for _, crop in ipairs(crops) do + local crop_name = minetest.get_node(crop).name + local growth_stage = tonumber(crop_name:sub(-1)) or 1 + local new_name = crop_name:sub(1, #crop_name - 1) .. (growth_stage + 1) + local new_def = minetest.registered_nodes[new_name] + if new_def then + local p2 = new_def.place_param2 or 1 + minetest.set_node(crop, {name = new_name, param2 = p2}) + crops_grown = crops_grown + 1 + end + end + if crops_grown < 1 then minetest.set_node(pointed.above, {name = "animalia:guano"}) end + local meta = itemstack:get_meta() + local og_item = meta:get_string("original_item") + if og_item == "" then og_item = "bucket:bucket_empty" end + itemstack:replace(ItemStack(og_item)) + return itemstack + end +}) + +minetest.register_node("animalia:nest_song_bird", { + description = "Song Bird Nest", + paramtype = "light", + drawtype = "mesh", + mesh = "animalia_nest.obj", + tiles = {"animalia_nest.png"}, + sunlight_propagates = true, + walkable = false, + stack_max = 1, + groups = {snappy = 3, flammable = 3, falling_node = 1}, + selection_box = { + type = "fixed", + fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, -0.31, 5 / 16}, + }, + node_box = { + type = "fixed", + fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, -0.31, 5 / 16}, + }, + drop = { + items = { + { + items = {"animalia:song_bird_egg"}, + rarity = 2, + }, + { + items = {"animalia:song_bird_egg 2"}, + rarity = 4, + }, + { + items = {"default:stick"}, + } + } + }, +}) + +----------- +-- Tools -- +----------- + +minetest.register_craftitem("animalia:cat_toy", { + description = "Cat Toy", + inventory_image = "animalia_cat_toy.png", + wield_image = "animalia_cat_toy.png^[transformFYR90", + stack_max = 1 +}) + +local nametag = {} + +local function get_rename_formspec(meta) + local tag = meta:get_string("name") or "" + local form = { + "size[8,4]", + "field[0.5,1;7.5,0;name;" .. minetest.formspec_escape("Enter name:") .. ";" .. tag .. "]", + "button_exit[2.5,3.5;3,1;set_name;" .. minetest.formspec_escape("Set Name") .. "]" + } + return table.concat(form, "") +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "animalia:set_name" and fields.name then + local name = player:get_player_name() + if not nametag[name] then + return + end + local itemstack = nametag[name] + if string.len(fields.name) > 64 then + fields.name = string.sub(fields.name, 1, 64) + end + local meta = itemstack:get_meta() + meta:set_string("name", fields.name) + meta:set_string("description", fields.name) + player:set_wielded_item(itemstack) + if fields.quit or fields.key_enter then + nametag[name] = nil + end + end +end) + +local function nametag_rightclick(itemstack, player, pointed_thing) + if pointed_thing + and pointed_thing.type == "object" then + return + end + local name = player:get_player_name() + nametag[name] = itemstack + local meta = itemstack:get_meta() + minetest.show_formspec(name, "animalia:set_name", get_rename_formspec(meta)) +end + +minetest.register_craftitem("animalia:nametag", { + description = "Nametag", + inventory_image = "animalia_nametag.png", + on_rightclick = nametag_rightclick, + on_secondary_use = nametag_rightclick +}) + +minetest.register_craftitem("animalia:saddle", { + description = "Saddle", + inventory_image = "animalia_saddle.png", +}) + +minetest.register_tool("animalia:shears", { + description = "Shears", + inventory_image = "animalia_shears.png", + groups = {flammable = 2} +}) + +minetest.register_craftitem("animalia:net", { + description = "Animal Net", + inventory_image = "animalia_net.png", + stack_max = 1, + on_secondary_use = mob_storage_use, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if pos then + local under = minetest.get_node(pointed_thing.under) + local node = minetest.registered_nodes[under.name] + if node and node.on_rightclick then + return node.on_rightclick(pointed_thing.under, under, placer, + itemstack) + end + if pos and not minetest.is_protected(pos, placer:get_player_name()) then + local mob = itemstack:get_meta():get_string("mob") + local staticdata = itemstack:get_meta():get_string("staticdata") + if mob ~= "" then + pos.y = pos.y + + math.abs( + minetest.registered_entities[mob] + .collisionbox[2]) + minetest.add_entity(pos, mob, staticdata) + itemstack:get_meta():set_string("mob", nil) + itemstack:get_meta():set_string("staticdata", nil) + itemstack:get_meta():set_string("description", "Animal Net") + end + end + end + return itemstack + end +}) + +----------- +-- Armor -- +----------- + +if minetest.get_modpath("3d_armor") then + + if armor + and armor.attributes then + table.insert(armor.attributes, "heavy_pelt") + + minetest.register_on_punchplayer(function(player, hitter, _, _, _, damage) + local name = player:get_player_name() + if name + and (armor.def[name].heavy_pelt or 0) > 0 then + local hit_ip = hitter:is_player() + if hit_ip and minetest.is_protected(player:get_pos(), "") then + return + else + local player_pos = player:get_pos() + if not player_pos then return end + + local biome_data = minetest.get_biome_data(player_pos) + + if biome_data.heat < 50 then + player:set_hp(player:get_hp() - (damage / 1.5)) + return true + end + end + end + end) + end + + armor:register_armor("animalia:coat_bear_pelt", { + description = "Bear Pelt Coat", + inventory_image = "animalia_inv_coat_bear_pelt.png", + groups = {armor_torso = 1, armor_heal = 0, armor_heavy_pelt = 1, armor_use = 1000}, + armor_groups = {fleshy = 5} + }) + + + + minetest.register_craft({ + output = "animalia:coat_bear_pelt", + recipe = { + {"animalia:pelt_bear", "", "animalia:pelt_bear"}, + {"animalia:pelt_bear", "animalia:pelt_bear", "animalia:pelt_bear"}, + {"animalia:pelt_bear", "animalia:pelt_bear", "animalia:pelt_bear"} + } + }) +end + +----------- +-- Nodes -- +----------- + +minetest.register_node("animalia:guano", { + description = "Guano", + tiles = {"animalia_guano.png"}, + paramtype = "light", + buildable_to = true, + floodable = true, + walkable = false, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1, not_in_creative_inventory = 1}, + on_punch = function(pos, _, player) + local inv = player:get_inventory() + local stack = ItemStack("animalia:bucket_guano") + if not inv:room_for_item("main", stack) then return end + local item = player:get_wielded_item() + local item_name = item:get_name() + if item_name:match("bucket_empty") then + item:take_item() + stack:get_meta():set_string("original_item", item_name) + inv:add_item("main", stack) + player:set_wielded_item(item) + minetest.remove_node(pos) + end + end +}) + +minetest.register_node("animalia:crate", { + description = "Animal Crate", + tiles = {"animalia_crate.png", "animalia_crate.png", "animalia_crate_side.png"}, + groups = {choppy = 2}, + stack_max = 1, + on_secondary_use = mob_storage_use, + preserve_metadata = function(_, _, oldmeta, drops) + for _, stack in pairs(drops) do + if stack:get_name() == "animalia:crate" then + local meta = stack:get_meta() + meta:set_string("mob", oldmeta["mob"]) + meta:set_string("staticdata", oldmeta["staticdata"]) + meta:set_string("description", oldmeta["description"]) + end + end + end, + after_place_node = function(pos, placer, itemstack) + local meta = itemstack:get_meta() + local mob = meta:get_string("mob") + if mob ~= "" then + local nmeta = minetest.get_meta(pos) + nmeta:set_string("mob", mob) + nmeta:set_string("infotext", "Contains a " .. correct_name((mob))) + nmeta:set_string("staticdata", meta:get_string("staticdata")) + nmeta:set_string("description", meta:get_string("description")) + itemstack:take_item() + placer:set_wielded_item(itemstack) + end + end, + on_rightclick = function(pos, _, clicker) + if minetest.is_protected(pos, clicker:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local mob = meta:get_string("mob") + local staticdata = meta:get_string("staticdata") + if mob ~= "" then + local above = { + x = pos.x, + y = pos.y + 1, + z = pos.z + } + if creatura.get_node_def(above).walkable then + return + end + minetest.add_entity(above, mob, staticdata) + meta:set_string("mob", nil) + meta:set_string("infotext", nil) + meta:set_string("staticdata", nil) + meta:set_string("description", "Animal Crate") + end + end +}) + +-------------- +-- Crafting -- +-------------- + +local steel_ingot = "default:steel_ingot" + +minetest.register_on_mods_loaded(function() + if minetest.registered_items[steel_ingot] then return end + for name, _ in pairs(minetest.registered_items) do + if name:find("ingot") + and (name:find("steel") + or name:find("iron")) then + steel_ingot = name + break + end + end +end) + +minetest.register_craft({ + output = "animalia:cat_toy", + recipe = { + {"", "", "group:thread"}, + {"", "group:stick", "group:thread"}, + {"group:stick", "", "group:feather"} + } +}) + +minetest.register_craft({ + output = "animalia:cat_toy", + recipe = { + {"", "", "farming:string"}, + {"", "group:stick", "farming:string"}, + {"group:stick", "", "group:feather"} + } +}) + +minetest.register_craft({ + output = "animalia:lasso", + recipe = { + {"", "group:thread", "group:thread"}, + {"", "group:leather", "group:thread"}, + {"group:thread", "", ""} + } +}) + +minetest.register_craft({ + output = "animalia:lasso", + recipe = { + {"", "farming:string", "farming:string"}, + {"", "group:leather", "farming:string"}, + {"farming:string", "", ""} + } +}) + +minetest.register_craft({ + output = "animalia:net", + recipe = { + {"group:thread", "", "group:thread"}, + {"group:thread", "", "group:thread"}, + {"group:stick", "group:thread", ""} + } +}) + +minetest.register_craft({ + output = "animalia:net", + recipe = { + {"farming:string", "", "farming:string"}, + {"farming:string", "", "farming:string"}, + {"group:stick", "farming:string", ""} + } +}) + +minetest.register_craft({ + output = "animalia:crate", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "animalia:net", "group:wood"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "animalia:saddle", + recipe = { + {"group:leather", "group:leather", "group:leather"}, + {"group:leather", steel_ingot, "group:leather"}, + {"group:thread", "", "group:thread"} + } +}) + +minetest.register_craft({ + output = "animalia:saddle", + recipe = { + {"group:leather", "group:leather", "group:leather"}, + {"group:leather", steel_ingot, "group:leather"}, + {"farming:string", "", "farming:string"} + } +}) + + +minetest.register_craft({ + output = "animalia:shears", + recipe = { + {"", steel_ingot, ""}, + {"", "group:leather", steel_ingot} + } +}) + +minetest.register_craft({ + output = "animalia:libri_animalia", + recipe = { + {"", "", ""}, + {"animalia:feather", "", ""}, + {"group:book", "group:color_green", ""} + } +}) + +minetest.register_craft({ + output = "animalia:libri_animalia", + recipe = { + {"", "", ""}, + {"animalia:feather", "", ""}, + {"group:book", "group:unicolor_green", ""} + } +}) + +minetest.register_craft({ + output = "animalia:libri_animalia 2", + recipe = { + {"", "", ""}, + {"animalia:libri_animalia", "group:book", ""}, + {"", "", ""} + } +}) + +minetest.register_on_craft(function(itemstack, _, old_craft_grid) + if itemstack:get_name() == "animalia:libri_animalia" + and itemstack:get_count() > 1 then + for _, old_libri in pairs(old_craft_grid) do + if old_libri:get_meta():get_string("chapters") then + local chapters = old_libri:get_meta():get_string("chapters") + itemstack:get_meta():set_string("chapters", chapters) + return itemstack + end + end + end +end) \ No newline at end of file diff --git a/mods/animalia/init.lua b/mods/animalia/init.lua new file mode 100644 index 00000000..339aba3e --- /dev/null +++ b/mods/animalia/init.lua @@ -0,0 +1,205 @@ +animalia = {} + +local path = minetest.get_modpath("animalia") + +local storage = dofile(path .. "/api/storage.lua") + +animalia.spawn_points = storage.spawn_points +animalia.libri_font_size = storage.libri_font_size + +animalia.pets = {} + +animalia.bones = minetest.registered_items["bonemeal:bone"] and {name = "bonemeal:bone", min = 1, max = 2, chance = 2} or nil + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + animalia.pets[name] = {} +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + animalia.pets[name] = nil +end) + +-- Daytime Tracking + +animalia.is_day = true + +local function is_day() + local time = (minetest.get_timeofday() or 0) * 24000 + animalia.is_day = time < 19500 and time > 4500 + minetest.after(10, is_day) +end + +is_day() + +-- Player Effects + +animalia.player_effects = {} + +local function player_effect_step() + for player, data in pairs(animalia.player_effects) do + if player then + local timer = data.timer - 1 + animalia.player_effects[player].timer = timer + local func = data.func + func(minetest.get_player_by_name(player)) + if timer <= 0 then + animalia.player_effects[player] = nil + end + end + end + minetest.after(1, player_effect_step) +end + +player_effect_step() + +function animalia.set_player_effect(player_name, effect, timer) + animalia.player_effects[player_name] = { + func = effect, + timer = timer or 5 + } +end + +-- Create lists of items for reuse + +animalia.food_wheat = {} +animalia.food_seeds = {} +animalia.food_crops = {} +animalia.food_bear = {} + +minetest.register_on_mods_loaded(function() + if minetest.get_modpath("farming") + and farming.registered_plants then + for _, def in pairs(farming.registered_plants) do + if def.crop then + table.insert(animalia.food_crops, def.crop) + end + end + end + for name in pairs(minetest.registered_items) do + if (name:match(":wheat") + or minetest.get_item_group(name, "food_wheat") > 0) + and not name:find("seed") then + table.insert(animalia.food_wheat, name) + end + if name:match(":seed_") + or name:match("_seed") then + table.insert(animalia.food_seeds, name) + end + if (minetest.get_item_group(name, "food_berry") > 0 + and not name:find("seed")) + or minetest.get_item_group(name, "food_fish") > 0 then + table.insert(animalia.food_bear, name) + end + end +end) + +-- Load Files + +local function load_file(filepath, filename) + if io.open(filepath .. "/" .. filename, "r") then + dofile(filepath .. "/" .. filename) + else + minetest.log("action", "[Creatura] The file " .. filename .. " could not be loaded.") + end +end + +dofile(path.."/api/api.lua") +dofile(path.."/api/mob_ai.lua") +dofile(path.."/api/lasso.lua") +dofile(path.."/craftitems.lua") + +animalia.animals = { + "animalia:bat", + "animalia:song_bird", + "animalia:cat", + "animalia:chicken", + "animalia:cow", + "animalia:fox", + "animalia:frog", + "animalia:grizzly_bear", + "animalia:horse", + "animalia:opossum", + "animalia:owl", + "animalia:pig", + "animalia:rat", + "animalia:reindeer", + "animalia:sheep", + "animalia:turkey", + "animalia:tropical_fish", + "animalia:wolf", +} + +dofile(path.."/api/api.lua") + +load_file(path .. "/mobs", "bat.lua") +load_file(path .. "/mobs", "bear.lua") +load_file(path .. "/mobs", "cat.lua") +load_file(path .. "/mobs", "chicken.lua") +load_file(path .. "/mobs", "cow.lua") +load_file(path .. "/mobs", "fox.lua") +load_file(path .. "/mobs", "frog.lua") +load_file(path .. "/mobs", "horse.lua") +load_file(path .. "/mobs", "opossum.lua") +load_file(path .. "/mobs", "owl.lua") +load_file(path .. "/mobs", "pig.lua") +load_file(path .. "/mobs", "rat.lua") +load_file(path .. "/mobs", "reindeer.lua") +load_file(path .. "/mobs", "sheep.lua") +load_file(path .. "/mobs", "song_bird.lua") +load_file(path .. "/mobs", "turkey.lua") +load_file(path .. "/mobs", "tropical_fish.lua") +load_file(path .. "/mobs", "wolf.lua") + +minetest.settings:set_bool("spawn_mobs",asuna.content.menagerie.animals) +if minetest.settings:get_bool("spawn_mobs", true) then + dofile(path.."/api/spawning.lua") +end + +dofile(path.."/api/libri.lua") + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_entities) do + if def.logic + or def.brainfunc + or def.bh_tree + or def._cmi_is_mob then + local old_punch = def.on_punch + if not old_punch then + old_punch = function() end + end + local on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) + old_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) + local pos = self.object:get_pos() + if not pos then return end + local plyr_name = puncher:is_player() and puncher:get_player_name() + local pets = (plyr_name and animalia.pets[plyr_name]) or {} + for _, obj in ipairs(pets) do + local ent = obj and obj:get_luaentity() + if ent + and ent.assist_owner then + ent.owner_target = self + end + end + end + def.on_punch = on_punch + minetest.register_entity(":" .. name, def) + end + end +end) + +local convert_mobs_redo = minetest.settings:get_bool("convert_redo_items", false) + +if convert_mobs_redo then + minetest.register_alias_force("mobs:leather", "animalia:leather") + minetest.register_alias_force("mobs:meat_raw", "animalia:beef_raw") + minetest.register_alias_force("mobs:meat", "animalia:beef_cooked") + minetest.register_alias_force("mobs:lasso", "animalia:lasso") + minetest.register_alias_force("mobs:net", "animalia:net") + minetest.register_alias_force("mobs:shears", "animalia:shears") + minetest.register_alias_force("mobs:saddles", "animalia:saddles") + minetest.register_alias_force("mobs:nametag", "animalia:nametag") +end + +minetest.log("action", "[MOD] Animalia [0.6] loaded") diff --git a/mods/animalia/libri/animalia_libri_bat.txt b/mods/animalia/libri/animalia_libri_bat.txt new file mode 100644 index 00000000..5c9eaff6 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_bat.txt @@ -0,0 +1,7 @@ +Bats are a unique flying mammal, found +living in large colonies underground. They +sleep clinging to the ceiling during day, and +leave at night in search of food. While the +colony sleeps, Guano accumulates beneath +them. This Guano can be picked up with a +Bucket and used as fertilizer \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_bird.txt b/mods/animalia/libri/animalia_libri_bird.txt new file mode 100644 index 00000000..ffb138e1 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_bird.txt @@ -0,0 +1,5 @@ +Song Birds are small and brightly colored, +often seen moving in flocks swarming +through the air near their nests. Each +species has a unique call that can be used +to identify what Birds are around you. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_cat.txt b/mods/animalia/libri/animalia_libri_cat.txt new file mode 100644 index 00000000..b83fbf3e --- /dev/null +++ b/mods/animalia/libri/animalia_libri_cat.txt @@ -0,0 +1,9 @@ +Cats are often found near Human +settlements. While typically skittish, their +trust can initially be gained by feeding +them, and further increased by playing. +They don't follow commands well but will +do better as their trust grows. However, +some habits never die. If you have Cats in +your home, never leave down glass vessels +unless you want them destroyed. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_chicken.txt b/mods/animalia/libri/animalia_libri_chicken.txt new file mode 100644 index 00000000..8153c958 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_chicken.txt @@ -0,0 +1,9 @@ +Chickens are a flightless bird, most often +found in Jungles. They live in tight flocks, +wandering along the floor in search of bugs. +Males, also called Roosters, are visually +distinguised from Females, or hens, by their +large tail feathers. Chickens are a popular +choice among farmers since they can +reliably produce eggs, giving a consistent +source of food. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_cow.txt b/mods/animalia/libri/animalia_libri_cow.txt new file mode 100644 index 00000000..9760771d --- /dev/null +++ b/mods/animalia/libri/animalia_libri_cow.txt @@ -0,0 +1,5 @@ +Cows are large bovines that live in herds. +They're a staple of agriculture and are often +farmed on large plots of land. They produce +Milk and can be slaughtered for Beef, one +of the most filling types of meat. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_fox.txt b/mods/animalia/libri/animalia_libri_fox.txt new file mode 100644 index 00000000..acfb30c7 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_fox.txt @@ -0,0 +1,7 @@ +Foxes wander forests, hunting +for their favorite food: Rats. +They can be quite helpful in +keeping rodent populations +down, but also pose a serious +threat to Chickens and +Turkeys. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_frog.txt b/mods/animalia/libri/animalia_libri_frog.txt new file mode 100644 index 00000000..9a851c7c --- /dev/null +++ b/mods/animalia/libri/animalia_libri_frog.txt @@ -0,0 +1,7 @@ +Frogs are a small amphibian found in +Swamps. The sound of their croaks often fill +the landscape, in addition to the splashes +heard as they flee to the water from +approaching Humans. Like most +amphibians, Frogs breed in water and live in +it exclusively as tadpoles. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_grizzly_bear.txt b/mods/animalia/libri/animalia_libri_grizzly_bear.txt new file mode 100644 index 00000000..e7ae08e3 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_grizzly_bear.txt @@ -0,0 +1,6 @@ +Large, territorial Omnivores. Bears can be +found in colder forests searching for berries. +When approached too closely they will lash out +with their massive claws. Their pelt can be +harvested and crafted into a warm coat that +reduces incoming damage in cold weather. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_home.txt b/mods/animalia/libri/animalia_libri_home.txt new file mode 100644 index 00000000..da3ecbf6 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_home.txt @@ -0,0 +1,13 @@ +This is a journal of all the +Animals you've met in this +world. When you find an +Animal you wish to log in this +Journal, simply right-click it. +Doing so will give valuable +information on the Animal, +including the biomes it +inhabits, if and and how it can +be tamed, and a general +overview of it's behavior. + +Good luck, Explorer! \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_horse.txt b/mods/animalia/libri/animalia_libri_horse.txt new file mode 100644 index 00000000..59a92d18 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_horse.txt @@ -0,0 +1,11 @@ +Horses are a large mammal found in open +plains. They're commonly used for +transportation, as they can run at high +speed for vast distances without tiring. To +tame one, you have to mount it and keep +your view aligned with the Horse's. After +taming, the Horse can be saddled and +ridden. Not every Horse is created equal, +some can jump tremendous heights, and +others can run faster. Horses will pass +these attributes down to their offspring. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_opossum.txt b/mods/animalia/libri/animalia_libri_opossum.txt new file mode 100644 index 00000000..646d547c --- /dev/null +++ b/mods/animalia/libri/animalia_libri_opossum.txt @@ -0,0 +1,5 @@ +A unique Marsupial and a key member +of it's ecosystem. The Opossum helps +keep pests like rodents and insects +under control, allowing plantlife and +crops to flourish. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_owl.txt b/mods/animalia/libri/animalia_libri_owl.txt new file mode 100644 index 00000000..1c4a4309 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_owl.txt @@ -0,0 +1,6 @@ +Owls are a nocturnal bird of prey, most +common in forests. Owls play an important +role in rodent population control, and are +incredibly efficient at it. Their wings are dead +silent, allowing them to avoid detection by +potential prey. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_pig.txt b/mods/animalia/libri/animalia_libri_pig.txt new file mode 100644 index 00000000..091a87b0 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_pig.txt @@ -0,0 +1,6 @@ +Pigs are medium-sized, forest-dwelling +mammals. Males are differentiated from +Females by their tusks, which they use to +root up food. They're very destructive to +crops, so it's best to keep them well +contained if you choose to farm them. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_rat.txt b/mods/animalia/libri/animalia_libri_rat.txt new file mode 100644 index 00000000..5f29ecb3 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_rat.txt @@ -0,0 +1,6 @@ +Rats are common pest on most +farms. They slowly eat away at +crops and often do so in large +numbers. They can also get +into any unlocked storage and +will eat food from it. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_reindeer.txt b/mods/animalia/libri/animalia_libri_reindeer.txt new file mode 100644 index 00000000..091ef74c --- /dev/null +++ b/mods/animalia/libri/animalia_libri_reindeer.txt @@ -0,0 +1,5 @@ +Reindeer are among the most common +animals found in arctic biomes. They move +in large herds, grazing on grass. They're a +great alternative to Cattle for those looking +to farm meat in cold regions. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_sheep.txt b/mods/animalia/libri/animalia_libri_sheep.txt new file mode 100644 index 00000000..9aed39be --- /dev/null +++ b/mods/animalia/libri/animalia_libri_sheep.txt @@ -0,0 +1,4 @@ +Sheep are a medium mammal that live in +medium-large flocks on open prairies. While +they can be farmed for mutton, they're more +often farmed for their wool. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_tropical_fish.txt b/mods/animalia/libri/animalia_libri_tropical_fish.txt new file mode 100644 index 00000000..35bfe7c3 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_tropical_fish.txt @@ -0,0 +1,4 @@ +Tropical Fish travel in schools among coral +reefs. Their brilliant colors are a staple of +the ocean, but they don't offer anything as +far as food or utility. diff --git a/mods/animalia/libri/animalia_libri_turkey.txt b/mods/animalia/libri/animalia_libri_turkey.txt new file mode 100644 index 00000000..ee87f4bf --- /dev/null +++ b/mods/animalia/libri/animalia_libri_turkey.txt @@ -0,0 +1,7 @@ +Turkeys are a flightless bird found in colder +pine forests. As far as utility, they are +similar to Chickens, but they drop more +meat when killed. Similar to Reindeer, +they're a good alternative to other more +common livestock that don't live in the +same cold regions. \ No newline at end of file diff --git a/mods/animalia/libri/animalia_libri_wolf.txt b/mods/animalia/libri/animalia_libri_wolf.txt new file mode 100644 index 00000000..96ffb038 --- /dev/null +++ b/mods/animalia/libri/animalia_libri_wolf.txt @@ -0,0 +1,5 @@ +Wolves are a relatively large canine found +in pine forests. They're easy to tame with +mutton, and are a very loyal companion. +They can be given various orders, and will +assist you while fighting. \ No newline at end of file diff --git a/mods/animalia/mobs/bat.lua b/mods/animalia/mobs/bat.lua new file mode 100644 index 00000000..9e442a61 --- /dev/null +++ b/mods/animalia/mobs/bat.lua @@ -0,0 +1,178 @@ +--------- +-- Bat -- +--------- + +local vec_dist = vector.distance + +local function get_home_pos(self) + local pos = self.object:get_pos() + if not pos then return end + local nodes = minetest.find_nodes_in_area( + vector.subtract(pos, 16), + vector.add(pos, 16), + {"group:leaves", "group:stone"} + ) + local home_dist + local new_home + for _, n_pos in ipairs(nodes or {}) do + local dist = vec_dist(pos, n_pos) + if not home_dist + or dist < home_dist then + n_pos.y = n_pos.y - 1 + if creatura.get_node_def(n_pos).name == "air" then + home_dist = dist + new_home = n_pos + end + end + end + if new_home then + self.home_position = self:memorize("home_position", new_home) + end +end + +creatura.register_mob("animalia:bat", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_bat.b3d", + textures = { + "animalia_bat_1.png", + "animalia_bat_2.png", + "animalia_bat_3.png", + }, + makes_footstep_sound = false, + + -- Creatura Props + max_health = 2, + armor_groups = {fleshy = 100}, + damage = 0, + speed = 4, + tracking_range = 12, + max_boids = 3, + despawn_after = 200, + max_fall = 0, + sounds = { + random = { + name = "animalia_bat", + gain = 0.5, + distance = 16 + } + }, + hitbox = { + width = 0.15, + height = 0.3 + }, + animations = { + stand = {range = {x = 1, y = 40}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 51, y = 69}, speed = 30, frame_blend = 0.3, loop = true}, + fly = {range = {x = 81, y = 99}, speed = 80, frame_blend = 0.3, loop = true}, + latch_ceiling = {range = {x = 110, y = 110}, speed = 1, frame_blend = 0, loop = false} + }, + follow = { + "butterflies:butterfly_red", + "butterflies:butterfly_white", + "butterflies:butterfly_violet" + }, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = false, + roost_action = animalia.action_latch, + + -- Functions + utility_stack = { + animalia.mob_ai.fly_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.bat_seek_home + }, + + is_home = function(pos, home_pos) + local dist = vec_dist(pos, home_pos) + if dist < 4 then + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + if creatura.get_node_def(above).walkable + or dist < 1 then + return true + end + end + return false + end, + + activate_func = function(self) + animalia.initialize_api(self) + self.home_position = self:recall("home_position") or nil + local home_pos = self.home_position + self.is_landed = self:recall("is_landed") or false + self.trust = self:recall("trust") or {} + if not home_pos + or not creatura.get_node_def(home_pos).walkable then + get_home_pos(self) + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.do_growth(self, 60) + animalia.rotate_to_pitch(self) + animalia.random_sound(self) + if not self.is_landed + or not self.touching_ground then + self.speed = 4 + else + self.speed = 1 + end + if self:timer(10) + and math.random(10) < 2 then + local anim = self._anim or "" + if anim == "cling" then + local colony = creatura.get_nearby_objects(self, self.name) + local pos = self.object:get_pos() + if not pos then return end + local center = pos + if #colony > 0 then + local pos_sum = center + local pos_ttl = 1 + for _, object in ipairs(colony) do + local obj_pos = object and object:get_pos() + if obj_pos then + pos_sum = vector.add(pos_sum, obj_pos) + pos_ttl = pos_ttl + 1 + end + end + center = vector.divide(pos_sum, pos_ttl) + end + center = creatura.get_ground_level(center, 8) + if center.y < pos.y then + local under = {x = center.x, y = center.y - 1, z = center.z} + if creatura.get_node_def(under).walkable + and not minetest.is_protected(center, "") then + minetest.set_node(center, {name = "animalia:guano"}) + end + end + end + end + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, false) then + animalia.add_trust(self, clicker, 1) + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:bat", { + col1 = "392517", + col2 = "321b0b" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/bear.lua b/mods/animalia/mobs/bear.lua new file mode 100644 index 00000000..13c76cf0 --- /dev/null +++ b/mods/animalia/mobs/bear.lua @@ -0,0 +1,123 @@ +---------- +-- Bear -- +---------- + +creatura.register_mob("animalia:grizzly_bear", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_bear.b3d", + textures = { + "animalia_bear_grizzly.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 20, + armor_groups = {fleshy = 100}, + damage = 6, + speed = 4, + tracking_range = 10, + despawn_after = 1000, + max_fall = 3, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_bear", + gain = 0.5, + distance = 8 + }, + hurt = { + name = "animalia_bear_hurt", + gain = 0.5, + distance = 8 + }, + death = { + name = "animalia_bear_death", + gain = 0.5, + distance = 8 + } + }, + hitbox = { + width = 0.5, + height = 1 + }, + animations = { + stand = {range = {x = 1, y = 59}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 61, y = 79}, speed = 10, frame_blend = 0.3, loop = true}, + run = {range = {x = 81, y = 99}, speed = 20, frame_blend = 0.3, loop = true}, + melee = {range = {x = 101, y = 120}, speed = 30, frame_blend = 0.3, loop = false} + }, + follow = animalia.food_bear, + drops = { + {name = "animalia:pelt_bear", min = 1, max = 3, chance = 1}, + animalia.bones, + }, + fancy_collide = false, + + -- Behavior Parameters + attacks_players = true, + + -- Animalia Parameters + catch_with_net = true, + catch_with_lasso = true, + head_data = { + offset = {x = 0, y = 0.35, z = 0.0}, + pitch_correction = -45, + pivot_h = 0.75, + pivot_v = 1 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.basic_seek_food, + animalia.mob_ai.basic_attack, + animalia.mob_ai.basic_breed + }, + + on_eat_drop = function(self) + local feed_no = (self.feed_no or 0) + 1 + + if feed_no >= 5 then + feed_no = 0 + + if self.breeding then return false end + if self.breeding_cooldown <= 0 then + self.breeding = true + self.breeding_cooldown = 60 + animalia.particle_spawner(self.stand_pos, "heart.png", "float") + end + + self._despawn = self:memorize("_despawn", false) + self.despawn_after = self:memorize("despawn_after", false) + end + self.feed_no = feed_no + end, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.75, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:grizzly_bear", { + col1 = "64361d", + col2 = "2c0d03" +}) diff --git a/mods/animalia/mobs/cat.lua b/mods/animalia/mobs/cat.lua new file mode 100644 index 00000000..644f8abc --- /dev/null +++ b/mods/animalia/mobs/cat.lua @@ -0,0 +1,227 @@ +--------- +-- Cat -- +--------- + +local follow = { + "animalia:poultry_raw" +} + +if minetest.registered_items["ethereal:fish_raw"] then + follow = { + "ethereal:fish_raw", + "animalia:poultry_raw" + } +end + +creatura.register_mob("animalia:cat", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_cat.b3d", + textures = { + "animalia_cat_1.png", + "animalia_cat_2.png", + "animalia_cat_3.png", + "animalia_cat_4.png", + "animalia_cat_5.png", + "animalia_cat_6.png", + "animalia_cat_7.png", + "animalia_cat_8.png", + "animalia_cat_9.png", + "animalia_cat_ash.png", + "animalia_cat_birch.png", + }, + use_texture_alpha = false, + makes_footstep_sound = false, + backface_culling = true, + glow = 0, + + -- Creatura Props + max_health = 10, + damage = 1, + speed = 3, + tracking_range = 16, + max_boids = 0, + despawn_after = 500, + max_fall = 0, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_cat", + gain = 0.25, + distance = 8 + }, + purr = { + name = "animalia_cat_purr", + gain = 0.6, + distance = 8 + }, + hurt = { + name = "animalia_cat_hurt", + gain = 0.25, + distance = 8 + }, + death = { + name = "animalia_cat_hurt", + gain = 0.25, + distance = 8 + } + }, + hitbox = { + width = 0.2, + height = 0.4 + }, + animations = { + stand = {range = {x = 1, y = 60}, speed = 20, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 119}, speed = 40, frame_blend = 0.3, loop = true}, + sit = {range = {x = 130, y = 139}, speed = 10, frame_blend = 0.3, loop = true}, + }, + follow = follow, + drops = {}, + + -- Behavior Parameters + is_skittish_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + head_data = { + offset = {x = 0, y = 0.14, z = 0}, + pitch_correction = -25, + pivot_h = 0.4, + pivot_v = 0.4 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.cat_seek_vessel, + animalia.mob_ai.cat_stay, + animalia.mob_ai.cat_play_with_owner, + animalia.mob_ai.cat_follow_owner, + animalia.mob_ai.basic_attack, + animalia.mob_ai.basic_breed + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + self.interact_sound_cooldown = 0 + self.trust_cooldown = self:recall("trust_cooldown") or 0 + self.order = self:recall("order") or "wander" + self.owner = self:recall("owner") or nil + self.trust = self:recall("trust") or {} + if self.owner + and minetest.get_player_by_name(self.owner) then + if not animalia.pets[self.owner][self.object] then + table.insert(animalia.pets[self.owner], self.object) + end + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.75, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + if self:timer(1) then + if self.interact_sound_cooldown > 0 then + self.interact_sound_cooldown = self.interact_sound_cooldown - 1 + end + end + end, + + death_func = animalia.death_func, + + deactivate_func = function(self) + if self.owner then + for i, object in ipairs(animalia.pets[self.owner] or {}) do + if object == self.object then + animalia.pets[self.owner][i] = nil + end + end + end + if self.enemies + and self.enemies[1] + and self.memorize then + self.enemies[1] = nil + self.enemies = self:memorize("enemies", self.enemies) + end + end, + + on_rightclick = function(self, clicker) + local item_name = clicker:get_wielded_item():get_name() + if item_name == "animalia:net" then return end + local trust = self.trust[clicker:get_player_name()] or 0 + local pos = self.object:get_pos() + if not pos then return end + if animalia.feed(self, clicker, true, true) then + animalia.add_trust(self, clicker, 1) + animalia.particle_spawner(pos, "creatura_particle_green.png", "float") + return + end + if animalia.set_nametag(self, clicker) then + return + end + -- Purr to indicate trust level (louder = more trust) + if clicker:get_player_control().sneak then + if self.interact_sound_cooldown <= 0 then + self.sounds["purr"].gain = 0.15 * trust + self.interact_sound_cooldown = 3 + self:play_sound("purr") + end + end + if not self.owner + or clicker:get_player_name() ~= self.owner then + return + end + if trust <= 5 then + if self.interact_sound_cooldown <= 0 then + self.interact_sound_cooldown = 3 + self:play_sound("random") + end + return + end + if clicker:get_player_control().sneak then + if self.interact_sound_cooldown <= 0 then + self.sounds["purr"].gain = 0.15 * self.trust[self.owner] + self.interact_sound_cooldown = 3 + self:play_sound("purr") + end + local order = self.order + if order == "wander" then + minetest.chat_send_player(clicker:get_player_name(), "Cat is following") + self.order = "follow" + self:initiate_utility("animalia:follow_player", self, clicker, true) + self:set_utility_score(0.7) + elseif order == "follow" then + minetest.chat_send_player(clicker:get_player_name(), "Cat is sitting") + self.order = "sit" + self:initiate_utility("animalia:stay", self) + self:set_utility_score(0.5) + else + minetest.chat_send_player(clicker:get_player_name(), "Cat is wandering") + self.order = "wander" + self:set_utility_score(0) + end + self:memorize("order", self.order) + end + end, + + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) + creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) + self:initiate_utility("animalia:flee_from_player", self, puncher) + self:set_utility_score(1) + animalia.add_trust(self, puncher, -1) + local pos = self.object:get_pos() + animalia.particle_spawner(pos, "creatura_particle_red.png", "float") + end +}) + +creatura.register_spawn_item("animalia:cat", { + col1 = "db9764", + col2 = "cf8d5a" +}) diff --git a/mods/animalia/mobs/chicken.lua b/mods/animalia/mobs/chicken.lua new file mode 100644 index 00000000..4f025d23 --- /dev/null +++ b/mods/animalia/mobs/chicken.lua @@ -0,0 +1,143 @@ +------------- +-- Chicken -- +------------- + +creatura.register_mob("animalia:chicken", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_chicken.b3d", + female_textures = { + "animalia_chicken_1.png", + "animalia_chicken_2.png", + "animalia_chicken_3.png" + }, + male_textures = { + "animalia_rooster_1.png", + "animalia_rooster_2.png", + "animalia_rooster_3.png" + }, + child_textures = {"animalia_chicken_child.png"}, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 5, + armor_groups = {fleshy = 100}, + damage = 0, + speed = 2, + tracking_range = 8, + max_boids = 3, + despawn_after = 500, + max_fall = 0, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_chicken", + gain = 0.5, + distance = 8 + }, + hurt = { + name = "animalia_chicken_hurt", + gain = 0.5, + distance = 8 + }, + death = { + name = "animalia_chicken_death", + gain = 0.5, + distance = 8 + } + }, + hitbox = { + width = 0.25, + height = 0.5 + }, + animations = { + stand = {range = {x = 1, y = 39}, speed = 20, frame_blend = 0.3, loop = true}, + walk = {range = {x = 41, y = 59}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 41, y = 59}, speed = 45, frame_blend = 0.3, loop = true}, + eat = {range = {x = 61, y = 89}, speed = 45, frame_blend = 0.3, loop = true}, + fall = {range = {x = 91, y = 99}, speed = 70, frame_blend = 0.3, loop = true} + }, + follow = animalia.food_seeds, + drops = { + {name = "animalia:poultry_raw", min = 1, max = 3, chance = 1}, + {name = "animalia:feather", min = 1, max = 3, chance = 2} + }, + + -- Behavior Parameters + is_herding_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + head_data = { + offset = {x = 0, y = 0.45, z = 0}, + pitch_correction = 40, + pivot_h = 0.25, + pivot_v = 0.55 + }, + move_chance = 2, + idle_time = 1, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee + }, + + add_child = function(self) + local pos = self.object:get_pos() + if not pos then return end + animalia.particle_spawner(pos, "animalia_egg_fragment.png", "splash", pos, pos) + local object = minetest.add_entity(pos, self.name) + local ent = object:get_luaentity() + ent.growth_scale = 0.7 + animalia.initialize_api(ent) + animalia.protect_from_despawn(ent) + end, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.75, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + if self.fall_start then + self:set_gravity(-4.9) + self:animate("fall") + end + if (self.growth_scale or 1) > 0.8 + and self.gender == "female" + and self:timer(60) then + animalia.random_drop_item(self, "animalia:chicken_egg", 10) + end + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) then + return + end + animalia.set_nametag(self, clicker) + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:chicken", { + col1 = "c6c6c6", + col2 = "d22222" +}) diff --git a/mods/animalia/mobs/cow.lua b/mods/animalia/mobs/cow.lua new file mode 100644 index 00000000..941dd46a --- /dev/null +++ b/mods/animalia/mobs/cow.lua @@ -0,0 +1,169 @@ +--------- +-- Cow -- +--------- + +creatura.register_mob("animalia:cow", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_cow.b3d", + female_textures = { + "animalia_cow_1.png^animalia_cow_udder.png", + "animalia_cow_2.png^animalia_cow_udder.png", + "animalia_cow_3.png^animalia_cow_udder.png", + "animalia_cow_4.png^animalia_cow_udder.png", + "animalia_cow_5.png^animalia_cow_udder.png" + }, + male_textures = { + "animalia_cow_1.png", + "animalia_cow_2.png", + "animalia_cow_3.png", + "animalia_cow_4.png", + "animalia_cow_5.png" + }, + child_textures = { + "animalia_cow_1.png", + "animalia_cow_2.png", + "animalia_cow_3.png", + "animalia_cow_4.png", + "animalia_cow_5.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 20, + armor_groups = {fleshy = 100}, + damage = 0, + speed = 2, + tracking_range = 10, + max_boids = 0, + despawn_after = 500, + max_fall = 3, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_cow", + gain = 0.5, + distance = 8 + }, + hurt = { + name = "animalia_cow_hurt", + gain = 0.5, + distance = 8 + }, + death = { + name = "animalia_cow_death", + gain = 0.5, + distance = 8 + } + }, + hitbox = { + width = 0.5, + height = 1 + }, + animations = { + stand = {range = {x = 1, y = 59}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 71, y = 89}, speed = 15, frame_blend = 0.3, loop = true}, + run = {range = {x = 71, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + }, + follow = animalia.food_wheat, + drops = { + {name = "animalia:beef_raw", min = 1, max = 3, chance = 1}, + {name = "animalia:leather", min = 1, max = 3, chance = 2}, + animalia.bones, + }, + fancy_collide = false, + + -- Behavior Parameters + is_grazing_mob = true, + is_herding_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + consumable_nodes = { + ["default:dirt_with_grass"] = "default:dirt", + ["default:dry_dirt_with_dry_grass"] = "default:dry_dirt" + }, + head_data = { + offset = {x = 0, y = 0.5, z = 0.0}, + pitch_correction = -40, + pivot_h = 0.75, + pivot_v = 1 + }, + wander_action = animalia.action_boid_move, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + self.collected = self:recall("collected") or false + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.75, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) + or animalia.set_nametag(self, clicker) then + return + end + + local tool = clicker:get_wielded_item() + local name = clicker:get_player_name() + + if tool:get_name() == "bucket:bucket_empty" then + + if self.growth_scale < 1 then + return + end + + if self.collected then + minetest.chat_send_player(name, "This Cow has already been milked.") + return + end + + local inv = clicker:get_inventory() + + tool:take_item() + clicker:set_wielded_item(tool) + + if inv:room_for_item("main", {name = "animalia:bucket_milk"}) then + clicker:get_inventory():add_item("main", "animalia:bucket_milk") + else + local pos = self.object:get_pos() + pos.y = pos.y + 0.5 + minetest.add_item(pos, {name = "animalia:bucket_milk"}) + end + + self.collected = self:memorize("collected", true) + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:cow", { + col1 = "cac3a1", + col2 = "464438" +}) diff --git a/mods/animalia/mobs/fox.lua b/mods/animalia/mobs/fox.lua new file mode 100644 index 00000000..b8acf6c2 --- /dev/null +++ b/mods/animalia/mobs/fox.lua @@ -0,0 +1,106 @@ +--------- +-- Fox -- +--------- + +creatura.register_mob("animalia:fox", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_fox.b3d", + textures = { + "animalia_fox_1.png" + }, + makes_footstep_sound = false, + + -- Creatura Props + max_health = 10, + armor_groups = {fleshy = 100}, + damage = 2, + speed = 4, + tracking_range = 16, + max_boids = 0, + despawn_after = 500, + stepheight = 1.1, + sound = {}, + hitbox = { + width = 0.35, + height = 0.5 + }, + animations = { + stand = {range = {x = 1, y = 39}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 41, y = 59}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 41, y = 59}, speed = 45, frame_blend = 0.3, loop = true}, + }, + follow = { + "animalia:rat_raw", + "animalia:mutton_raw", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:poultry_raw" + }, + drops = { + animalia.bones, + }, + + -- Behavior Parameters + is_skittish_mob = true, + attack_list = { + "animalia:chicken", + "animalia:rat" + }, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + head_data = { + offset = {x = 0, y = 0.18, z = 0}, + pitch_correction = -67, + pivot_h = 0.65, + pivot_v = 0.65 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.basic_attack, + animalia.mob_ai.fox_flee, + animalia.mob_ai.basic_seek_food, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed + }, + + on_eat_drop = function(self) + animalia.protect_from_despawn(self) + end, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.5, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + end, + + death_func = animalia.death_func, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, true, true) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:fox", { + col1 = "d0602d", + col2 = "c9c9c9" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/frog.lua b/mods/animalia/mobs/frog.lua new file mode 100644 index 00000000..51f0aaa6 --- /dev/null +++ b/mods/animalia/mobs/frog.lua @@ -0,0 +1,257 @@ +---------- +-- Frog -- +---------- + +local random = math.random + +local function poison_effect(object) + object:punch(object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = 1}, + }) +end + +local hitboxes = { + {-0.25, 0, -0.25, 0.2, 0.4, 0.25}, + {-0.4, 0, -0.4, 0.4, 0.5, 0.4}, + {-0.15, 0, -0.15, 0.15, 0.3, 0.15} +} + +local animations = { + { + stand = {range = {x = 1, y = 40}, speed = 10, frame_blend = 0.3, loop = true}, + float = {range = {x = 90, y = 90}, speed = 1, frame_blend = 0.3, loop = true}, + swim = {range = {x = 90, y = 110}, speed = 50, frame_blend = 0.3, loop = true}, + walk = {range = {x = 50, y = 80}, speed = 50, frame_blend = 0.3, loop = true}, + run = {range = {x = 50, y = 80}, speed = 60, frame_blend = 0.3, loop = true} + }, + { + stand = {range = {x = 1, y = 40}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 50, y = 79}, speed = 20, frame_blend = 0.3, loop = true}, + run = {range = {x = 50, y = 79}, speed = 30, frame_blend = 0.3, loop = true}, + warn = {range = {x = 90, y = 129}, speed = 30, frame_blend = 0.3, loop = true}, + punch = {range = {x = 140, y = 160}, speed = 30, frame_blend = 0.1, loop = false}, + float = {range = {x = 170, y = 209}, speed = 10, frame_blend = 0.3, loop = true}, + swim = {range = {x = 220, y = 239}, speed = 20, frame_blend = 0.3, loop = true} + }, + { + stand = {range = {x = 1, y = 40}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 50, y = 69}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 50, y = 69}, speed = 40, frame_blend = 0.3, loop = true}, + float = {range = {x = 80, y = 119}, speed = 10, frame_blend = 0.3, loop = true}, + swim = {range = {x = 130, y = 149}, speed = 20, frame_blend = 0.3, loop = true} + } +} + +local utility_stacks = { + { -- Tree Frog + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_wander, + animalia.mob_ai.frog_seek_bug, + animalia.mob_ai.frog_breed, + animalia.mob_ai.basic_flee, + animalia.mob_ai.frog_flop, + animalia.mob_ai.frog_seek_water + }, + { -- Bull Frog + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_wander, + animalia.mob_ai.basic_seek_food, + animalia.mob_ai.basic_attack, + animalia.mob_ai.frog_breed, + animalia.mob_ai.frog_flop, + animalia.mob_ai.frog_seek_water + }, + { -- Poison Dart Frog + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_wander, + animalia.mob_ai.frog_breed, + animalia.mob_ai.basic_flee, + animalia.mob_ai.frog_flop, + animalia.mob_ai.frog_seek_water + } +} + +local head_data = { + { + offset = {x = 0, y = 0.43, z = 0}, + pitch_correction = -15, + pivot_h = 0.3, + pivot_v = 0.3 + }, + { + offset = {x = 0, y = 0.50, z = 0}, + pitch_correction = -20, + pivot_h = 0.3, + pivot_v = 0.3 + }, + { + offset = {x = 0, y = 0.25, z = 0}, + pitch_correction = -20, + pivot_h = 0.3, + pivot_v = 0.3 + } +} + +local follow = { + { + "butterflies:butterfly_white", + "butterflies:butterfly_violet", + "butterflies:butterfly_red" + }, + { + "animalia:rat_raw" + }, + {} +} + +creatura.register_mob("animalia:frog", { + -- Engine Props + visual_size = {x = 10, y = 10}, + meshes = { + "animalia_frog.b3d", + "animalia_bull_frog.b3d", + "animalia_dart_frog.b3d" + }, + child_mesh = "animalia_tadpole.b3d", + mesh_textures = { + { + "animalia_tree_frog.png" + }, + { + "animalia_bull_frog.png" + }, + { + "animalia_dart_frog_1.png", + "animalia_dart_frog_2.png", + "animalia_dart_frog_3.png" + } + }, + child_textures = { + "animalia_tadpole.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 5, + armor_groups = {fleshy = 100}, + damage = 2, + max_breath = 0, + speed = 2, + tracking_range = 8, + max_boids = 0, + despawn_after = 300, + max_fall = 0, + stepheight = 1.1, + sound = {}, + hitbox = { + width = 0.15, + height = 0.3 + }, + animations = {}, + follow = {}, + drops = {}, + fancy_collide = false, + bouyancy_multiplier = 0, + hydrodynamics_multiplier = 0.3, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = false, + head_data = {}, + + -- Functions + utility_stack = {}, + + on_grown = function(self) + local mesh_no = self.mesh_no + self.animations = animations[mesh_no] + self.utility_stack = utility_stacks[mesh_no] + self.head_data = head_data[mesh_no] + self.object:set_properties({ + collisionbox = hitboxes[mesh_no] + }) + end, + + activate_func = function(self) + animalia.initialize_api(self) + self.trust = self:recall("trust") or {} + + local mesh_no = self.mesh_no + + -- Set Species Properties + if self.growth_scale >= 0.8 then + self.animations = animations[mesh_no] + self.utility_stack = utility_stacks[mesh_no] + self.object:set_properties({ + collisionbox = hitboxes[mesh_no] + }) + else + self.animations = { + swim = {range = {x = 1, y = 19}, speed = 20, frame_blend = 0.1, loop = true} + } + self.utility_stack = utility_stacks[1] + end + + self.head_data = head_data[mesh_no] + + if mesh_no == 1 then + for i = 1, 15 do + local frame = 120 + i + local anim = {range = {x = frame, y = frame}, speed = 1, frame_blend = 0.3, loop = false} + self.animations["tongue_" .. i] = anim + end + elseif mesh_no == 2 then + self.object:set_armor_groups({fleshy = 50}) + self.warn_before_attack = true + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.2, 0.2) + animalia.do_growth(self, 60) + if self:timer(random(5, 15)) then + self:play_sound("random") + end + + if not self.mesh_vars_set then + self.follow = follow[self.mesh_no] + end + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if self.mesh_no ~= 2 then return end + if animalia.feed(self, clicker, false, true) then + animalia.add_trust(self, clicker, 1) + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) + creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) + local name = puncher:is_player() and puncher:get_player_name() + if name then + self.trust[name] = 0 + self:memorize("trust", self.trust) + if self.mesh_no == 3 then + animalia.set_player_effect(name, poison_effect, 3) + end + end + end +}) + +creatura.register_spawn_item("animalia:frog", { + col1 = "67942e", + col2 = "294811" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/horse.lua b/mods/animalia/mobs/horse.lua new file mode 100644 index 00000000..89a3e6f7 --- /dev/null +++ b/mods/animalia/mobs/horse.lua @@ -0,0 +1,426 @@ +----------- +-- Horse -- +----------- + +local random = math.random + +-- Horse Inventory + +local form_obj = {} + +local function create_horse_inventory(self) + if not self.owner then return end + local inv_name = "animalia:horse_" .. self.owner + local inv = minetest.create_detached_inventory(inv_name, { + allow_move = function(_, _, _, _, _, count) + return count + end, + allow_put = function(_, _, _, stack) + return stack:get_count() + end, + allow_take = function(_, _, _, stack) + return stack:get_count() + end + }) + inv:set_size("main", 12) + inv:set_width("main", 4) + return inv +end + +local function serialize_horse_inventory(self) + if not self.owner then return end + local inv_name = "animalia:horse_" .. self.owner + local inv = minetest.get_inventory({type = "detached", name = inv_name}) + if not inv then return end + local list = inv:get_list("main") + local stored = {} + for k, item in ipairs(list) do + local itemstr = item:to_string() + if itemstr ~= "" then + stored[k] = itemstr + end + end + self._inventory = self:memorize("_inventory", minetest.serialize(stored)) +end + +local function get_form(self, player_name) + local inv = create_horse_inventory(self) + if inv + and self._inventory then + inv:set_list("main", minetest.deserialize(self._inventory)) + end + + local frame_range = self.animations["stand"].range + local frame_loop = frame_range.x .. "," .. frame_range.y + local texture = self:get_props().textures[1] + local form = { + "formspec_version[3]", + "size[10.5,10]", + "image[0,0;10.5,5.25;animalia_form_horse_bg.png]", + "model[0,0.5;5,3.5;mob_mesh;animalia_horse.b3d;" .. texture .. ";-10,-130;false;false;" .. frame_loop .. ";15]", + "list[detached:animalia:horse_" .. player_name .. ";main;5.4,0.5;4,3;]", + "list[current_player;main;0.4,4.9;8,4;]", + "listring[current_player;main]" + } + + return table.concat(form, "") +end + +local function close_form(player) + local name = player:get_player_name() + + if form_obj[name] then + form_obj[name] = nil + minetest.remove_detached_inventory("animalia:horse_" .. name) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if not form_obj[name] or not form_obj[name]:get_yaw() then + return + end + local obj = form_obj[name] + if formname == "animalia:horse_forms" then + local ent = obj and obj:get_luaentity() + if not ent then return end + + if fields.quit or fields.key_enter then + form_obj[name] = nil + serialize_horse_inventory(ent) + minetest.remove_detached_inventory("animlaia:horse_" .. name) + end + end + + if formname == "animalia:horse_inv" then + local ent = obj and obj:get_luaentity() + if not ent then return end + + if fields.quit or fields.key_enter then + form_obj[name] = nil + serialize_horse_inventory(ent) + minetest.remove_detached_inventory("animalia:horse_" .. name) + end + end +end) + +minetest.register_on_leaveplayer(close_form) + +-- Pattern + +local patterns = { + "animalia_horse_pattern_1.png", + "animalia_horse_pattern_2.png", + "animalia_horse_pattern_3.png" +} + +local avlbl_colors = { + [1] = { + "animalia_horse_2.png", + "animalia_horse_3.png", + "animalia_horse_5.png" + }, + [2] = { + "animalia_horse_1.png", + "animalia_horse_5.png" + }, + [3] = { + "animalia_horse_2.png", + "animalia_horse_1.png" + }, + [4] = { + "animalia_horse_2.png", + "animalia_horse_1.png" + }, + [5] = { + "animalia_horse_2.png", + "animalia_horse_1.png" + } +} + +local function set_pattern(self) + local pattern_no = self:recall("pattern_no") + if pattern_no and pattern_no < 1 then return end + if not pattern_no then + if random(3) < 2 then + pattern_no = self:memorize("pattern_no", random(#patterns)) + else + self:memorize("pattern_no", 0) + return + end + end + local colors = avlbl_colors[self.texture_no] + local color_no = self:recall("color_no") or self:memorize("color_no", random(#colors)) + if not colors[color_no] then return end + local pattern = "(" .. patterns[pattern_no] .. "^[mask:" .. colors[color_no] .. ")" + local texture = self.textures[self.texture_no] + self.object:set_properties({ + textures = {texture .. "^" .. pattern} + }) +end + +-- Definition + +creatura.register_mob("animalia:horse", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_horse.b3d", + textures = { + "animalia_horse_1.png", + "animalia_horse_2.png", + "animalia_horse_3.png", + "animalia_horse_4.png", + "animalia_horse_5.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 40, + armor_groups = {fleshy = 100}, + damage = 8, + speed = 10, + tracking_range = 16, + max_boids = 7, + despawn_after = 1000, + max_fall = 4, + stepheight = 1.2, + sounds = { + alter_child_pitch = true, + random = { + name = "animalia_horse_idle", + gain = 1.0, + distance = 8 + }, + hurt = { + name = "animalia_horse_hurt", + gain = 1.0, + distance = 8 + }, + death = { + name = "animalia_horse_death", + gain = 1.0, + distance = 8 + } + }, + hitbox = { + width = 0.65, + height = 1.95 + }, + animations = { + stand = {range = {x = 1, y = 59}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 20, frame_blend = 0.3, loop = true}, + run = {range = {x = 101, y = 119}, speed = 40, frame_blend = 0.3, loop = true}, + punch_aoe = {range = {x = 170, y = 205}, speed = 30, frame_blend = 0.2, loop = false}, + rear = {range = {x = 130, y = 160}, speed = 20, frame_blend = 0.1, loop = false}, + eat = {range = {x = 210, y = 240}, speed = 30, frame_blend = 0.3, loop = false} + }, + follow = animalia.food_wheat, + drops = { + {name = "animalia:leather", min = 1, max = 4, chance = 2}, + animalia.bones, + }, + fancy_collide = false, + + -- Behavior Parameters + is_grazing_mob = true, + is_herding_mob = true, + + -- Animalia Props + catch_with_net = true, + catch_with_lasso = true, + consumable_nodes = { + ["default:dirt_with_grass"] = "default:dirt", + ["default:dry_dirt_with_dry_grass"] = "default:dry_dirt" + }, + head_data = { + bone = "Neck.CTRL", + offset = {x = 0, y = 1.4, z = 0.0}, + pitch_correction = 15, + pivot_h = 1, + pivot_v = 1.75 + }, + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee, + { + utility = "animalia:horse_tame", + get_score = function(self) + local rider = not self.owner and self.rider + if rider + and rider:get_pos() then + return 0.7, {self} + end + return 0 + end + }, + { + utility = "animalia:horse_ride", + get_score = function(self) + if not self.owner then return 0 end + local owner = self.owner and minetest.get_player_by_name(self.owner) + local rider = owner == self.rider and self.rider + if rider + and rider:get_pos() then + return 0.8, {self, rider} + end + return 0 + end + } + }, + + -- Functions + set_saddle = function(self, saddle) + if saddle then + self.saddled = self:memorize("saddled", true) + local texture = self.object:get_properties().textures[1] + self.object:set_properties({ + textures = {texture .. "^animalia_horse_saddle.png"} + }) + self.drops = { + {name = "animalia:leather", chance = 2, min = 1, max = 4}, + {name = "animalia:saddle", chance = 1, min = 1, max = 1} + } + else + local pos = self.object:get_pos() + if not pos then return end + self.saddled = self:memorize("saddled", false) + set_pattern(self) + self.drops = { + {name = "animalia:leather", chance = 2, min = 1, max = 4} + } + minetest.add_item(pos, "animalia:saddle") + end + end, + + add_child = function(self, mate) + local pos = self.object:get_pos() + if not pos then return end + local obj = minetest.add_entity(pos, self.name) + local ent = obj and obj:get_luaentity() + if not ent then return end + ent.growth_scale = 0.7 + local tex_no = self.texture_no + local mate_ent = mate and mate:get_luaentity() + if mate_ent + or not mate_ent.speed + or not mate_ent.jump_power + or not mate_ent.max_health then + return + end + if random(2) < 2 then + tex_no = mate_ent.texture_no + end + ent:memorize("texture_no", tex_no) + ent:memorize("speed", random(mate_ent.speed, self.speed)) + ent:memorize("jump_power", random(mate_ent.jump_power, self.jump_power)) + ent:memorize("max_health", random(mate_ent.max_health, self.max_health)) + ent.speed = ent:recall("speed") + ent.jump_power = ent:recall("jump_power") + ent.max_health = ent:recall("max_health") + animalia.initialize_api(ent) + animalia.protect_from_despawn(ent) + end, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + set_pattern(self) + + self.owner = self:recall("owner") or nil + + if self.owner then + self._inventory = self:recall("_inventory") + end + + self.rider = nil + self.saddled = self:recall("saddled") or false + self.max_health = self:recall("max_health") or random(30, 45) + self.speed = self:recall("speed") or random(5, 10) + self.jump_power = self:recall("jump_power") or random(2, 5) + self:memorize("max_health", self.max_health) + self:memorize("speed", self.speed) + self:memorize("jump_power", self.jump_power) + if self.saddled then + self:set_saddle(true) + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + end, + + death_func = function(self) + if self.rider then + animalia.mount(self, self.rider) + end + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) then + return + end + + local owner = self.owner + local name = clicker and clicker:get_player_name() + if owner and name ~= owner then return end + + if animalia.set_nametag(self, clicker) then + return + end + + local wielded_name = clicker:get_wielded_item():get_name() + + if wielded_name == "animalia:saddle" then + self:set_saddle(true) + return + end + + if clicker:get_player_control().sneak + and owner then + minetest.show_formspec(name, "animalia:horse_forms", get_form(self, name)) + form_obj[name] = self.object + elseif wielded_name == "" then + animalia.mount(self, clicker, {rot = {x = -65, y = 180, z = 0}, pos = {x = 0, y = 0.75, z = 0.6}}) + if self.saddled then + self:initiate_utility("animalia:mount", self, clicker) + end + end + end, + + on_punch = function(self, puncher, ...) + if self.rider and puncher == self.rider then return end + local name = puncher:is_player() and puncher:get_player_name() + if name + and name == self.owner + and puncher:get_player_control().sneak then + self:set_saddle(false) + return + end + animalia.punch(self, puncher, ...) + end, + + on_detach_child = function(self, child) + if child + and self.rider == child then + self.rider = nil + child:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + child:set_properties({visual_size = {x = 1, y = 1}}) + animalia.animate_player(child, "stand", 30) + end + end +}) + +creatura.register_spawn_item("animalia:horse", { + col1 = "ebdfd8", + col2 = "653818" +}) diff --git a/mods/animalia/mobs/opossum.lua b/mods/animalia/mobs/opossum.lua new file mode 100644 index 00000000..c68ae3a1 --- /dev/null +++ b/mods/animalia/mobs/opossum.lua @@ -0,0 +1,105 @@ +------------- +-- Opossum -- +------------- + +creatura.register_mob("animalia:opossum", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_opossum.b3d", + textures = { + "animalia_opossum.png" + }, + makes_footstep_sound = false, + + -- Creatura Props + max_health = 5, + armor_groups = {fleshy = 100}, + damage = 2, + speed = 4, + tracking_range = 16, + max_boids = 0, + despawn_after = 500, + stepheight = 1.1, + max_fall = 8, + sound = {}, + hitbox = { + width = 0.25, + height = 0.4 + }, + animations = { + stand = {range = {x = 1, y = 59}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 119}, speed = 45, frame_blend = 0.3, loop = true}, + feint = {range = {x = 130, y = 130}, speed = 45, frame_blend = 0.3, loop = false}, + clean_crop = {range = {x = 171, y = 200}, speed = 15, frame_blend = 0.2, loop = false} + }, + follow = { + "animalia:song_bird_egg", + "animalia:rat_raw", + "animalia:mutton_raw", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:poultry_raw" + }, + + -- Behavior Parameters + is_skittish_mob = true, + attack_list = {"animalia:rat"}, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + head_data = { + offset = {x = 0, y = 0.18, z = 0}, + pitch_correction = -67, + pivot_h = 0.65, + pivot_v = 0.65 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.basic_attack, + animalia.mob_ai.opossum_feint, + animalia.mob_ai.opossum_seek_crop, + animalia.mob_ai.basic_seek_food, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed + }, + + on_eat_drop = function(self) + animalia.protect_from_despawn(self) + end, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.5, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + end, + + death_func = animalia.death_func, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, true, true) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:opossum", { + col1 = "75665f", + col2 = "ccbfb8" +}) diff --git a/mods/animalia/mobs/owl.lua b/mods/animalia/mobs/owl.lua new file mode 100644 index 00000000..c30be37b --- /dev/null +++ b/mods/animalia/mobs/owl.lua @@ -0,0 +1,169 @@ +--------- +-- Owl -- +--------- + +local abs = math.abs + +local vec_dist = vector.distance + +local function get_home_pos(self) + local pos = self.object:get_pos() + if not pos then return end + local leaves = minetest.find_nodes_in_area_under_air( + vector.subtract(pos, 16), + vector.add(pos, 16), + "group:leaves" + ) + local home_dist + local new_home + for _, leaf_pos in ipairs(leaves or {}) do + local dist = vec_dist(pos, leaf_pos) + if not home_dist + or dist < home_dist then + home_dist = dist + new_home = leaf_pos + end + end + if new_home then + new_home.y = new_home.y + 1 + self.home_position = self:memorize("home_position", new_home) + end +end + +creatura.register_mob("animalia:owl", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_owl.b3d", + textures = { + "animalia_owl.png" + }, + makes_footstep_sound = false, + + -- Creatura Props + max_health = 10, + damage = 2, + speed = 4, + tracking_range = 16, + max_boids = 0, + despawn_after = 500, + max_fall = 0, + sound = {}, -- TODO + hitbox = { + width = 0.15, + height = 0.3 + }, + animations = { + stand = {range = {x = 1, y = 60}, speed = 20, frame_blend = 0.3, loop = true}, + fly = {range = {x = 71, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + glide = {range = {x = 101, y = 119}, speed = 20, frame_blend = 0.2, loop = true}, + fly_punch = {range = {x = 131, y = 149}, speed = 20, frame_blend = 0.1, loop = false}, + eat = {range = {x = 161, y = 179}, speed = 20, frame_blend = 0.1, loop = false} + }, + follow = {"animalia:rat_raw"}, + drops = { + {name = "animalia:feather", min = 1, max = 2, chance = 1} + }, + + -- Animalia Props + flee_puncher = true, -- TODO + catch_with_net = true, + catch_with_lasso = false, + roost_action = animalia.action_roost, + + -- Functions + on_eat_drop = function(self) + animalia.protect_from_despawn(self) + get_home_pos(self) + end, + + is_home = function(pos, home_pos) + if abs(pos.x - home_pos.x) < 0.5 + and abs(pos.z - home_pos.z) < 0.5 then + if abs(pos.y - home_pos.y) < 0.75 then + return true + else + local under = {x = home_pos.x, y = home_pos.y, z = home_pos.z} + local name = minetest.get_node(under).name + if minetest.get_node_group(name, "leaves") > 0 then + return true + end + end + end + return false + end, + + wander_action = creatura.action_move, + + utility_stack = { + animalia.mob_ai.fly_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.bat_seek_home, + animalia.mob_ai.fly_seek_food, + animalia.mob_ai.eagle_attack + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + self._tp2home = self:recall("_tp2home") or nil + self.home_position = self:recall("home_position") or nil + local home_pos = self.home_position + if self._tp2home + and home_pos then + self.object:set_pos(home_pos) + end + self.is_landed = self:recall("is_landed") or false + if not home_pos + or creatura.get_node_def(home_pos).walkable then + get_home_pos(self) + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.rotate_to_pitch(self) + if not self.is_landed + or not self.touching_ground then + self.speed = 5 + else + self.speed = 1 + end + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + deactivate_func = function(self) + if self:get_utility() + and self:get_utility() == "animalia:fly_to_roost" then + local pos = self.home_position + local node = minetest.get_node_or_nil(pos) + if node + and not creatura.get_node_def(node.name).walkable + and minetest.get_natural_light(pos) > 0 then + self:memorize("_tp2home", true) + end + end + end, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, false) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:owl", { + col1 = "412918", + col2 = "735b46" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/pig.lua b/mods/animalia/mobs/pig.lua new file mode 100644 index 00000000..813372fb --- /dev/null +++ b/mods/animalia/mobs/pig.lua @@ -0,0 +1,120 @@ +--------- +-- Pig -- +--------- + +creatura.register_mob("animalia:pig", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_pig.b3d", + female_textures = { + "animalia_pig_1.png", + "animalia_pig_2.png", + "animalia_pig_3.png" + }, + male_textures = { + "animalia_pig_1.png^animalia_pig_tusks.png", + "animalia_pig_2.png^animalia_pig_tusks.png", + "animalia_pig_3.png^animalia_pig_tusks.png" + }, + child_textures = { + "animalia_pig_1.png", + "animalia_pig_2.png", + "animalia_pig_3.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 20, + damage = 2, + speed = 3, + tracking_range = 12, + despawn_after = 500, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_pig", + gain = 1.0, + distance = 8 + }, + hurt = { + name = "animalia_pig_hurt", + gain = 1.0, + distance = 8 + }, + death = { + name = "animalia_pig_death", + gain = 1.0, + distance = 8 + } + }, + hitbox = { + width = 0.35, + height = 0.7 + }, + animations = { + stand = {range = {x = 1, y = 60}, speed = 20, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 119}, speed = 40, frame_blend = 0.3, loop = true}, + }, + follow = animalia.food_crops, + drops = { + {name = "animalia:porkchop_raw", min = 1, max = 3, chance = 1}, + animalia.bones, + }, + + -- Behavior Parameters + is_herding_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + birth_count = 2, + head_data = { + offset = {x = 0, y = 0.7, z = 0}, + pitch_correction = 0, + pivot_h = 0.5, + pivot_v = 0.3 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.basic_seek_crop, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.do_growth(self, 60) + animalia.head_tracking(self) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + end, + + death_func = animalia.death_func, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:pig", { + col1 = "e0b1a7", + col2 = "cc9485" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/rat.lua b/mods/animalia/mobs/rat.lua new file mode 100644 index 00000000..6cc38339 --- /dev/null +++ b/mods/animalia/mobs/rat.lua @@ -0,0 +1,82 @@ +---------- +-- Mice -- +---------- + +creatura.register_mob("animalia:rat", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_rat.b3d", + textures = { + "animalia_rat_1.png", + "animalia_rat_2.png", + "animalia_rat_3.png" + }, + + -- Creatura Props + max_health = 5, + damage = 0, + speed = 1, + tracking_range = 8, + despawn_after = 200, + stepheight = 1.1, + --sound = {}, + hitbox = { + width = 0.15, + height = 0.3 + }, + animations = { + stand = {range = {x = 1, y = 39}, speed = 20, frame_blend = 0.3, loop = true}, + walk = {range = {x = 51, y = 69}, speed = 20, frame_blend = 0.3, loop = true}, + run = {range = {x = 81, y = 99}, speed = 45, frame_blend = 0.3, loop = true}, + eat = {range = {x = 111, y = 119}, speed = 20, frame_blend = 0.1, loop = false} + }, + drops = { + {name = "animalia:rat_raw", min = 1, max = 1, chance = 1} + }, + + -- Behavior Parameters + is_skittish_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = false, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.basic_seek_crop, + animalia.mob_ai.rat_seek_chest, + animalia.mob_ai.basic_flee + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.do_growth(self, 60) + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:rat", { + col1 = "605a55", + col2 = "ff936f" +}) diff --git a/mods/animalia/mobs/reindeer.lua b/mods/animalia/mobs/reindeer.lua new file mode 100644 index 00000000..b20b5aa1 --- /dev/null +++ b/mods/animalia/mobs/reindeer.lua @@ -0,0 +1,119 @@ +-------------- +-- Reindeer -- +-------------- + +creatura.register_mob("animalia:reindeer", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_reindeer.b3d", + textures = {"animalia_reindeer.png"}, + child_textures = {"animalia_reindeer_calf.png"}, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 15, + damage = 0, + speed = 3, + tracking_range = 12, + max_boids = 4, + despawn_after = 500, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_reindeer", + gain = 0.5, + distance = 8 + }, + hurt = { + name = "animalia_reindeer_hurt", + gain = 0.5, + distance = 8 + }, + death = { + name = "animalia_reindeer_death", + gain = 0.5, + distance = 8 + } + }, + hitbox = { + width = 0.45, + height = 0.9 + }, + animations = { + stand = {range = {x = 1, y = 59}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 119}, speed = 40, frame_blend = 0.3, loop = true}, + eat = {range = {x = 130, y = 150}, speed = 20, frame_blend = 0.3, loop = false} + }, + follow = animalia.food_wheat, + drops = { + {name = "animalia:venison_raw", min = 1, max = 3, chance = 1}, + {name = "animalia:leather", min = 1, max = 3, chance = 2}, + animalia.bones, + }, + + -- Behavior Parameters + is_grazing_mob = true, + is_herding_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + consumable_nodes = { + { + name = "default:dirt_with_grass", + replacement = "default:dirt" + }, + { + name = "default:dry_dirt_with_dry_grass", + replacement = "default:dry_dirt" + } + }, + head_data = { + offset = {x = 0, y = 0.55, z = 0}, + pitch_correction = -45, + pivot_h = 1, + pivot_v = 1 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + end, + + death_func = animalia.death_func, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:reindeer", { + col1 = "413022", + col2 = "d5c0a3" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/sheep.lua b/mods/animalia/mobs/sheep.lua new file mode 100644 index 00000000..ae2a6941 --- /dev/null +++ b/mods/animalia/mobs/sheep.lua @@ -0,0 +1,199 @@ +----------- +-- Sheep -- +----------- + +local random = math.random + +local palette = { + black = {"Black", "#000000b0"}, + blue = {"Blue", "#015dbb70"}, + brown = {"Brown", "#663300a0"}, + cyan = {"Cyan", "#01ffd870"}, + dark_green = {"Dark Green", "#005b0770"}, + dark_grey = {"Dark Grey", "#303030b0"}, + green = {"Green", "#61ff0170"}, + grey = {"Grey", "#5b5b5bb0"}, + magenta = {"Magenta", "#ff05bb70"}, + orange = {"Orange", "#ff840170"}, + pink = {"Pink", "#ff65b570"}, + red = {"Red", "#ff0000a0"}, + violet = {"Violet", "#2000c970"}, + white = {"White", "#ababab00"}, + yellow = {"Yellow", "#e3ff0070"}, +} + +creatura.register_mob("animalia:sheep", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_sheep.b3d", + textures = { + "animalia_sheep.png^animalia_sheep_wool.png" + }, + child_textures = { + "animalia_sheep.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 15, + armor_groups = {fleshy = 100}, + damage = 0, + speed = 3, + tracking_range = 12, + max_boids = 4, + despawn_after = 500, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_sheep", + gain = 1.0, + distance = 8 + }, + hurt = { + name = "animalia_sheep_hurt", + gain = 1.0, + distance = 8 + }, + death = { + name = "animalia_sheep_death", + gain = 1.0, + distance = 8 + } + }, + hitbox = { + width = 0.4, + height = 0.8 + }, + animations = { + stand = {range = {x = 1, y = 59}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 20, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 119}, speed = 30, frame_blend = 0.3, loop = true}, + eat = {range = {x = 130, y = 150}, speed = 20, frame_blend = 0.3, loop = false} + }, + follow = animalia.food_wheat, + drops = { + {name = "animalia:mutton_raw", min = 1, max = 3, chance = 1}, + minetest.get_modpath("wool") and {name = "wool:white", min = 1, max = 3, chance = 2} or nil, + animalia.bones, + }, + + -- Behavior Parameters + is_grazing_mob = true, + is_herding_mob = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + consumable_nodes = { + ["default:dirt_with_grass"] = "default:dirt", + ["default:dry_dirt_with_dry_grass"] = "default:dry_dirt" + }, + head_data = { + offset = {x = 0, y = 0.41, z = 0}, + pitch_correction = -45, + pivot_h = 0.75, + pivot_v = 0.85 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + + self.collected = self:recall("collected") or false + self.dye_color = self:recall("dye_color") or "white" + if self.collected then + self.object:set_properties({ + textures = {"animalia_sheep.png"}, + }) + elseif self.dye_color ~= "white" then + self.object:set_properties({ + textures = {"animalia_sheep.png^(animalia_sheep_wool.png^[multiply:" .. palette[self.dye_color][2] .. ")"}, + }) + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + end, + + death_func = animalia.death_func, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + if self.collected + or self.growth_scale < 1 then + return + end + + local tool = clicker:get_wielded_item() + local tool_name = tool:get_name() + local creative = minetest.is_creative_enabled(clicker:get_player_name()) + + if tool_name == "animalia:shears" then + if not minetest.get_modpath("wool") then + return + end + + minetest.add_item( + self.object:get_pos(), + ItemStack("wool:" .. self.dye_color .. " " .. random(1, 3)) + ) + + self.collected = self:memorize("collected", true) + self.dye_color = self:memorize("dye_color", "white") + + self.object:set_properties({ + textures = {"animalia_sheep.png"}, + }) + + if not creative then + tool:add_wear(650) + clicker:set_wielded_item(tool) + end + end + + if tool_name:match("^dye:") then + local dye_color = tool_name:split(":")[2] + if palette[dye_color] then + self.dye_color = self:memorize("dye_color", dye_color) + self.drops = { + {name = "animalia:mutton_raw", chance = 1, min = 1, max = 4}, + {name = "wool:" .. dye_color, chance = 2, min = 1, max = 2}, + } + self.object:set_properties({ + textures = {"animalia_sheep.png^(animalia_sheep_wool.png^[multiply:" .. palette[dye_color][2] .. ")"}, + }) + if not creative then + tool:take_item() + clicker:set_wielded_item(tool) + end + end + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:sheep", { + col1 = "f4e6cf", + col2 = "e1ca9b" +}) \ No newline at end of file diff --git a/mods/animalia/mobs/song_bird.lua b/mods/animalia/mobs/song_bird.lua new file mode 100644 index 00000000..f4641d4a --- /dev/null +++ b/mods/animalia/mobs/song_bird.lua @@ -0,0 +1,138 @@ +--------------- +-- Song Bird -- +--------------- + +local random = math.random + +creatura.register_mob("animalia:song_bird", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_bird.b3d", + textures = { + "animalia_cardinal.png", + "animalia_bluebird.png", + "animalia_goldfinch.png" + }, + + -- Creatura Props + max_health = 2, + speed = 4, + tracking_range = 8, + max_boids = 6, + boid_seperation = 0.3, + despawn_after = 200, + max_fall = 0, + stepheight = 1.1, + sounds = { + cardinal = { + name = "animalia_cardinal", + gain = 0.5, + distance = 63 + }, + eastern_blue = { + name = "animalia_bluebird", + gain = 0.5, + distance = 63 + }, + goldfinch = { + name = "animalia_goldfinch", + gain = 0.5, + distance = 63 + }, + }, + hitbox = { + width = 0.2, + height = 0.4 + }, + animations = { + stand = {range = {x = 1, y = 100}, speed = 30, frame_blend = 0.3, loop = true}, + walk = {range = {x = 110, y = 130}, speed = 40, frame_blend = 0.3, loop = true}, + fly = {range = {x = 140, y = 160}, speed = 40, frame_blend = 0.3, loop = true} + }, + --follow = {}, + drops = { + {name = "animalia:feather", min = 1, max = 1, chance = 2} + }, + + -- Behavior Parameters + uses_boids = true, + + -- Animalia Props + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = false, + wander_action = animalia.action_boid_move, + --roost_action = animalia.action_roost, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.fly_landing_wander, + animalia.mob_ai.fly_seek_land + }, + + activate_func = function(self) + if animalia.despawn_inactive_mob(self) then return end + animalia.initialize_api(self) + animalia.initialize_lasso(self) + self.is_landed = (random(2) < 2 and true) or false + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.do_growth(self, 60) + --animalia.update_lasso_effects(self) + animalia.rotate_to_pitch(self) + if self:timer(random(6, 12)) then + if animalia.is_day then + if self.texture_no == 1 then + self:play_sound("cardinal") + elseif self.texture_no == 2 then + self:play_sound("eastern_blue") + else + self:play_sound("goldfinch") + end + end + end + if not self.is_landed + or not self.touching_ground then + self.speed = 4 + else + self.speed = 3 + end + end, + + death_func = animalia.death_func, + + on_rightclick = function(self, clicker) + --[[if animalia.feed(self, clicker, false, false) then + return + end]] + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:song_bird", { + col1 = "ae2f2f", + col2 = "f3ac1c" +}) + +minetest.register_entity("animalia:bird", { + static_save = false, + on_activate = function(self) + self.object:remove() + end +}) + +minetest.register_abm({ + label = "animalia:nest_cleanup", + nodenames = "animalia:nest_song_bird", + interval = 900, + action = function(pos) + minetest.remove_node(pos) + end +}) \ No newline at end of file diff --git a/mods/animalia/mobs/tropical_fish.lua b/mods/animalia/mobs/tropical_fish.lua new file mode 100644 index 00000000..22eaa332 --- /dev/null +++ b/mods/animalia/mobs/tropical_fish.lua @@ -0,0 +1,91 @@ +---------- +-- Fish -- +---------- + +creatura.register_mob("animalia:tropical_fish", { + -- Engine Props + visual_size = {x = 10, y = 10}, + meshes = { + "animalia_clownfish.b3d", + "animalia_angelfish.b3d" + }, + mesh_textures = { + { + "animalia_clownfish.png", + "animalia_blue_tang.png" + }, + { + "animalia_angelfish.png" + } + }, + + -- Creatura Props + max_health = 5, + armor_groups = {fleshy = 150}, + damage = 0, + max_breath = 0, + speed = 2, + tracking_range = 6, + max_boids = 6, + boid_seperation = 0.3, + despawn_after = 200, + max_fall = 0, + stepheight = 1.1, + hitbox = { + width = 0.15, + height = 0.3 + }, + animations = { + swim = {range = {x = 1, y = 20}, speed = 20, frame_blend = 0.3, loop = true}, + flop = {range = {x = 30, y = 40}, speed = 20, frame_blend = 0.3, loop = true}, + }, + liquid_submergence = 1, + liquid_drag = 0, + + -- Animalia Behaviors + is_aquatic_mob = true, + + -- Animalia Props + flee_puncher = false, + catch_with_net = true, + catch_with_lasso = false, + + -- Functions + utility_stack = { + animalia.mob_ai.swim_wander + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.set_nametag(self, clicker) then + return + end + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:tropical_fish", { + col1 = "e28821", + col2 = "f6e5d2" +}) + +animalia.alias_mob("animalia:clownfish", "animalia:tropical_fish") +animalia.alias_mob("animalia:blue_tang", "animalia:tropical_fish") +animalia.alias_mob("animalia:angelfish", "animalia:tropical_fish") \ No newline at end of file diff --git a/mods/animalia/mobs/turkey.lua b/mods/animalia/mobs/turkey.lua new file mode 100644 index 00000000..54246e8d --- /dev/null +++ b/mods/animalia/mobs/turkey.lua @@ -0,0 +1,133 @@ +------------ +-- Turkey -- +------------ + +creatura.register_mob("animalia:turkey", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_turkey.b3d", + female_textures = {"animalia_turkey_hen.png"}, + male_textures = {"animalia_turkey_tom.png"}, + child_textures = {"animalia_turkey_chick.png"}, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 8, + armor_groups = {fleshy = 100}, + damage = 0, + speed = 2, + tracking_range = 8, + max_boids = 3, + despawn_after = 500, + max_fall = 0, + stepheight = 1.1, + sounds = { + random = { + name = "animalia_turkey", + gain = 0.5, + distance = 8 + }, + hurt = { + name = "animalia_turkey_hurt", + gain = 0.5, + distance = 8 + }, + death = { + name = "animalia_turkey_death", + gain = 0.5, + distance = 8 + } + }, + hitbox = { + width = 0.3, + height = 0.6 + }, + animations = { + stand = {range = {x = 0, y = 0}, speed = 1, frame_blend = 0.3, loop = true}, + walk = {range = {x = 10, y = 30}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 40, y = 60}, speed = 45, frame_blend = 0.3, loop = true}, + fall = {range = {x = 70, y = 90}, speed = 30, frame_blend = 0.3, loop = true}, + }, + follow = animalia.food_seeds, + drops = { + {name = "animalia:poultry_raw", min = 1, max = 4, chance = 1}, + {name = "animalia:feather", min = 1, max = 3, chance = 2}, + animalia.bones, + }, + + -- Animalia Props + group_wander = true, + flee_puncher = true, + catch_with_net = true, + catch_with_lasso = true, + head_data = { + offset = {x = 0, y = 0.15, z = 0}, + pitch_correction = 45, + pivot_h = 0.45, + pivot_v = 0.65 + }, + move_chance = 2, + idle_time = 1, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_breed, + animalia.mob_ai.basic_flee + }, + + add_child = function(self) + local pos = self.object:get_pos() + if not pos then return end + animalia.particle_spawner(pos, "animalia_egg_fragment.png", "splash", pos, pos) + local object = minetest.add_entity(pos, self.name) + local ent = object:get_luaentity() + ent.growth_scale = 0.7 + animalia.initialize_api(ent) + animalia.protect_from_despawn(ent) + end, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self, 0.75, 0.75) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + animalia.random_sound(self) + if self.fall_start then + self:set_gravity(-4.9) + self:animate("fall") + end + if (self.growth_scale or 1) > 0.8 + and self.gender == "female" + and self:timer(60) then + animalia.random_drop_item(self, "animalia:turkey_egg", 10) + end + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + on_rightclick = function(self, clicker) + if animalia.feed(self, clicker, false, true) then + return + end + animalia.set_nametag(self, clicker) + end, + + on_punch = animalia.punch +}) + +creatura.register_spawn_item("animalia:turkey", { + col1 = "352b22", + col2 = "2f2721" +}) diff --git a/mods/animalia/mobs/wolf.lua b/mods/animalia/mobs/wolf.lua new file mode 100644 index 00000000..10a499b2 --- /dev/null +++ b/mods/animalia/mobs/wolf.lua @@ -0,0 +1,198 @@ +---------- +-- Wolf -- +---------- + + + +local follow = { + "animalia:mutton_raw", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:poultry_raw" +} + +if minetest.registered_items["bonemeal:bone"] then + follow = { + "bonemeal:bone", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:mutton_raw", + "animalia:poultry_raw" + } +end + +local function is_value_in_table(tbl, val) + for _, v in pairs(tbl) do + if v == val then + return true + end + end + return false +end + +creatura.register_mob("animalia:wolf", { + -- Engine Props + visual_size = {x = 10, y = 10}, + mesh = "animalia_wolf.b3d", + textures = { + "animalia_wolf_1.png", + "animalia_wolf_2.png", + "animalia_wolf_3.png", + "animalia_wolf_4.png" + }, + makes_footstep_sound = true, + + -- Creatura Props + max_health = 20, + damage = 4, + speed = 4, + tracking_range = 24, + despawn_after = 500, + stepheight = 1.1, + sound = {}, + hitbox = { + width = 0.35, + height = 0.7 + }, + animations = { + stand = {range = {x = 1, y = 60}, speed = 20, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 89}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 119}, speed = 40, frame_blend = 0.3, loop = true}, + sit = {range = {x = 130, y = 139}, speed = 10, frame_blend = 0.3, loop = true}, + }, + follow = follow, + drops = { + animalia.bones, + }, + + -- Behavior Parameters + is_skittish_mob = true, + is_herding_mob = true, + + -- Animalia Props + assist_owner = true, + flee_puncher = false, + catch_with_net = true, + catch_with_lasso = true, + consumable_nodes = {}, + head_data = { + offset = {x = 0, y = 0.22, z = 0}, + pitch_correction = -35, + pivot_h = 0.45, + pivot_v = 0.45 + }, + + -- Functions + utility_stack = { + animalia.mob_ai.basic_wander, + animalia.mob_ai.swim_seek_land, + animalia.mob_ai.tamed_stay, + animalia.mob_ai.tamed_follow_owner, + animalia.mob_ai.basic_attack, + animalia.mob_ai.basic_breed + }, + + activate_func = function(self) + animalia.initialize_api(self) + animalia.initialize_lasso(self) + self.order = self:recall("order") or "wander" + self.owner = self:recall("owner") or nil + self.enemies = self:recall("enemies") or {} + if self.owner + and minetest.get_player_by_name(self.owner) then + if not is_value_in_table(animalia.pets[self.owner], self.object) then + table.insert(animalia.pets[self.owner], self.object) + end + end + end, + + step_func = function(self) + animalia.step_timers(self) + animalia.head_tracking(self) + animalia.do_growth(self, 60) + animalia.update_lasso_effects(self) + end, + + death_func = function(self) + if self:get_utility() ~= "animalia:die" then + self:initiate_utility("animalia:die", self) + end + end, + + deactivate_func = function(self) + if self.owner then + for i, object in ipairs(animalia.pets[self.owner] or {}) do + if object == self.object then + animalia.pets[self.owner][i] = nil + end + end + end + if self.enemies + and self.enemies[1] + and self.memorize then + self.enemies[1] = nil + self.enemies = self:memorize("enemies", self.enemies) + end + end, + + on_rightclick = function(self, clicker) + if not clicker:is_player() then return end + local name = clicker:get_player_name() + local passive = true + if is_value_in_table(self.enemies, name) then passive = false end + if animalia.feed(self, clicker, passive, passive) then + return + end + if animalia.set_nametag(self, clicker) then + return + end + if self.owner + and name == self.owner + and clicker:get_player_control().sneak then + local order = self.order + if order == "wander" then + minetest.chat_send_player(name, "Wolf is following") + self.order = "follow" + self:initiate_utility("animalia:follow_player", self, clicker, true) + self:set_utility_score(0.7) + elseif order == "follow" then + minetest.chat_send_player(name, "Wolf is sitting") + self.order = "sit" + self:initiate_utility("animalia:stay", self) + self:set_utility_score(0.5) + else + minetest.chat_send_player(name, "Wolf is wandering") + self.order = "wander" + self:set_utility_score(0) + end + self:memorize("order", self.order) + end + end, + + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) + creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) + local name = puncher:is_player() and puncher:get_player_name() + if name then + if self.owner + and name == self.owner then + return + elseif not is_value_in_table(self.enemies, name) then + table.insert(self.enemies, name) + if #self.enemies > 15 then + table.remove(self.enemies, 1) + end + self.enemies = self:memorize("enemies", self.enemies) + else + table.remove(self.enemies, 1) + table.insert(self.enemies, name) + self.enemies = self:memorize("enemies", self.enemies) + end + end + self._target = puncher + end, +}) + +creatura.register_spawn_item("animalia:wolf", { + col1 = "a19678", + col2 = "231b13" +}) diff --git a/mods/animalia/mod.conf b/mods/animalia/mod.conf new file mode 100644 index 00000000..102fff36 --- /dev/null +++ b/mods/animalia/mod.conf @@ -0,0 +1,6 @@ +name = animalia +depends = creatura +optional_depends = default, mcl_player, farming, 3d_armor, bonemeal +description = Adds unique and consistantly designed Animals +title = Animalia +author = ElCeejo diff --git a/mods/animalia/models/animala_horse.b3d b/mods/animalia/models/animala_horse.b3d new file mode 100644 index 00000000..a3992ba5 Binary files /dev/null and b/mods/animalia/models/animala_horse.b3d differ diff --git a/mods/animalia/models/animalia_angelfish.b3d b/mods/animalia/models/animalia_angelfish.b3d new file mode 100644 index 00000000..4622b966 Binary files /dev/null and b/mods/animalia/models/animalia_angelfish.b3d differ diff --git a/mods/animalia/models/animalia_bat.b3d b/mods/animalia/models/animalia_bat.b3d new file mode 100644 index 00000000..acbcb074 Binary files /dev/null and b/mods/animalia/models/animalia_bat.b3d differ diff --git a/mods/animalia/models/animalia_bear.b3d b/mods/animalia/models/animalia_bear.b3d new file mode 100644 index 00000000..4af43e3f Binary files /dev/null and b/mods/animalia/models/animalia_bear.b3d differ diff --git a/mods/animalia/models/animalia_bird.b3d b/mods/animalia/models/animalia_bird.b3d new file mode 100644 index 00000000..295f926d Binary files /dev/null and b/mods/animalia/models/animalia_bird.b3d differ diff --git a/mods/animalia/models/animalia_bull_frog.b3d b/mods/animalia/models/animalia_bull_frog.b3d new file mode 100644 index 00000000..e02327d4 Binary files /dev/null and b/mods/animalia/models/animalia_bull_frog.b3d differ diff --git a/mods/animalia/models/animalia_cat.b3d b/mods/animalia/models/animalia_cat.b3d new file mode 100644 index 00000000..1726d06b Binary files /dev/null and b/mods/animalia/models/animalia_cat.b3d differ diff --git a/mods/animalia/models/animalia_chicken.b3d b/mods/animalia/models/animalia_chicken.b3d new file mode 100644 index 00000000..5870d000 Binary files /dev/null and b/mods/animalia/models/animalia_chicken.b3d differ diff --git a/mods/animalia/models/animalia_clownfish.b3d b/mods/animalia/models/animalia_clownfish.b3d new file mode 100644 index 00000000..0de9939f Binary files /dev/null and b/mods/animalia/models/animalia_clownfish.b3d differ diff --git a/mods/animalia/models/animalia_cow.b3d b/mods/animalia/models/animalia_cow.b3d new file mode 100644 index 00000000..5e809bcd Binary files /dev/null and b/mods/animalia/models/animalia_cow.b3d differ diff --git a/mods/animalia/models/animalia_dart_frog.b3d b/mods/animalia/models/animalia_dart_frog.b3d new file mode 100644 index 00000000..b9cb7917 Binary files /dev/null and b/mods/animalia/models/animalia_dart_frog.b3d differ diff --git a/mods/animalia/models/animalia_fox.b3d b/mods/animalia/models/animalia_fox.b3d new file mode 100644 index 00000000..2e76956f Binary files /dev/null and b/mods/animalia/models/animalia_fox.b3d differ diff --git a/mods/animalia/models/animalia_frog.b3d b/mods/animalia/models/animalia_frog.b3d new file mode 100644 index 00000000..40d71344 Binary files /dev/null and b/mods/animalia/models/animalia_frog.b3d differ diff --git a/mods/animalia/models/animalia_horse.b3d b/mods/animalia/models/animalia_horse.b3d new file mode 100644 index 00000000..70a2877a Binary files /dev/null and b/mods/animalia/models/animalia_horse.b3d differ diff --git a/mods/animalia/models/animalia_lasso.b3d b/mods/animalia/models/animalia_lasso.b3d new file mode 100644 index 00000000..ddeb5c0d Binary files /dev/null and b/mods/animalia/models/animalia_lasso.b3d differ diff --git a/mods/animalia/models/animalia_lasso_entity.b3d b/mods/animalia/models/animalia_lasso_entity.b3d new file mode 100644 index 00000000..ad8b2e97 Binary files /dev/null and b/mods/animalia/models/animalia_lasso_entity.b3d differ diff --git a/mods/animalia/models/animalia_nest.obj b/mods/animalia/models/animalia_nest.obj new file mode 100644 index 00000000..04e5c339 --- /dev/null +++ b/mods/animalia/models/animalia_nest.obj @@ -0,0 +1,49 @@ +# Made in Blockbench 4.1.5 +mtllib animalia_nest.mtl + +o cube +v 0.3125 -0.3125 0.3125 +v 0.3125 -0.3125 -0.3125 +v 0.3125 -0.5 0.3125 +v 0.3125 -0.5 -0.3125 +v -0.3125 -0.3125 -0.3125 +v -0.3125 -0.3125 0.3125 +v -0.3125 -0.5 -0.3125 +v -0.3125 -0.5 0.3125 +vt 0.16666666666666666 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.45833333333333337 +vt 0.16666666666666666 0.45833333333333337 +vt 0.16666666666666666 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.45833333333333337 +vt 0.16666666666666666 0.45833333333333337 +vt 0.16666666666666666 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.45833333333333337 +vt 0.16666666666666666 0.45833333333333337 +vt 0.16666666666666666 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.45833333333333337 +vt 0.16666666666666666 0.45833333333333337 +vt 1 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 1 +vt 1 1 +vt 1 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.16666666666666663 +vt 1 0.16666666666666663 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 \ No newline at end of file diff --git a/mods/animalia/models/animalia_opossum.b3d b/mods/animalia/models/animalia_opossum.b3d new file mode 100644 index 00000000..0a41d895 Binary files /dev/null and b/mods/animalia/models/animalia_opossum.b3d differ diff --git a/mods/animalia/models/animalia_owl.b3d b/mods/animalia/models/animalia_owl.b3d new file mode 100644 index 00000000..6b65ba3a Binary files /dev/null and b/mods/animalia/models/animalia_owl.b3d differ diff --git a/mods/animalia/models/animalia_pig.b3d b/mods/animalia/models/animalia_pig.b3d new file mode 100644 index 00000000..88390876 Binary files /dev/null and b/mods/animalia/models/animalia_pig.b3d differ diff --git a/mods/animalia/models/animalia_rat.b3d b/mods/animalia/models/animalia_rat.b3d new file mode 100644 index 00000000..98ce53f6 Binary files /dev/null and b/mods/animalia/models/animalia_rat.b3d differ diff --git a/mods/animalia/models/animalia_reindeer.b3d b/mods/animalia/models/animalia_reindeer.b3d new file mode 100644 index 00000000..4610c7d1 Binary files /dev/null and b/mods/animalia/models/animalia_reindeer.b3d differ diff --git a/mods/animalia/models/animalia_sheep.b3d b/mods/animalia/models/animalia_sheep.b3d new file mode 100644 index 00000000..81835cca Binary files /dev/null and b/mods/animalia/models/animalia_sheep.b3d differ diff --git a/mods/animalia/models/animalia_tadpole.b3d b/mods/animalia/models/animalia_tadpole.b3d new file mode 100644 index 00000000..b02191de Binary files /dev/null and b/mods/animalia/models/animalia_tadpole.b3d differ diff --git a/mods/animalia/models/animalia_turkey.b3d b/mods/animalia/models/animalia_turkey.b3d new file mode 100644 index 00000000..93bbc33e Binary files /dev/null and b/mods/animalia/models/animalia_turkey.b3d differ diff --git a/mods/animalia/models/animalia_wolf.b3d b/mods/animalia/models/animalia_wolf.b3d new file mode 100644 index 00000000..8e4e1513 Binary files /dev/null and b/mods/animalia/models/animalia_wolf.b3d differ diff --git a/mods/animalia/settingtypes.txt b/mods/animalia/settingtypes.txt new file mode 100644 index 00000000..6ef8f2b6 --- /dev/null +++ b/mods/animalia/settingtypes.txt @@ -0,0 +1,29 @@ +# How many chunks can generate before adding another to spawn queue +chunk_spawn_add_int (Chunk Spawning Addition Interval) float 6 + +# How often (in seconds) the spawn queue is executed and cleared +chunk_spawn_queue_int (Chunk Spawning Queue Execution Interval) float 16 + +# If true, mobs will spawn in the wild +spawn_mobs (Spawn Mobs) bool true + +# If true, items from mobs_redo and mobs_animal will be converted to Animalia items +convert_redo_items(Convert Mobs Redo Items) bool false + +# If true, Guano will accumulate under resting bats +guano_accumulation (Guano Accumulation) bool true + +# If true, Guano can be used as fertilizer +guano_fertilization (Guano Fertilization) bool true + +# Chance for Common Mobs to spawn (1 in x nodes will spawn a mob every minute) +animalia_common_chance (Common Mob Spawn Chance) int 40000 20000 60000 + +# Chance for Ambient Mobs to spawn (1 in x nodes will spawn a mob every minute) +animalia_ambient_chance (Ambient Mob Spawn Chance) int 15000 5000 25000 + +# Chance for Pest Mobs to spawn (1 in x nodes will spawn a mob every minute) +animalia_pest_chance (Pest Mob Spawn Chance) int 5000 100 15000 + +# Chance for Common Mobs to spawn (1 in x nodes will spawn a mob every minute) +animalia_predator_chance (Predator Mob Spawn Chance) int 40000 20000 50000 \ No newline at end of file diff --git a/mods/animalia/sounds/animalia_bat_1.ogg b/mods/animalia/sounds/animalia_bat_1.ogg new file mode 100644 index 00000000..b9f27987 Binary files /dev/null and b/mods/animalia/sounds/animalia_bat_1.ogg differ diff --git a/mods/animalia/sounds/animalia_bat_2.ogg b/mods/animalia/sounds/animalia_bat_2.ogg new file mode 100644 index 00000000..fb30ed6d Binary files /dev/null and b/mods/animalia/sounds/animalia_bat_2.ogg differ diff --git a/mods/animalia/sounds/animalia_horse_whistle.ogg b/mods/animalia/sounds/animalia_horse_whistle.ogg new file mode 100644 index 00000000..ca4d4dde Binary files /dev/null and b/mods/animalia/sounds/animalia_horse_whistle.ogg differ diff --git a/mods/animalia/sounds/bluebird/animalia_bluebird.1.ogg b/mods/animalia/sounds/bluebird/animalia_bluebird.1.ogg new file mode 100644 index 00000000..aabd3742 Binary files /dev/null and b/mods/animalia/sounds/bluebird/animalia_bluebird.1.ogg differ diff --git a/mods/animalia/sounds/bluebird/animalia_bluebird.2.ogg b/mods/animalia/sounds/bluebird/animalia_bluebird.2.ogg new file mode 100644 index 00000000..96becf7c Binary files /dev/null and b/mods/animalia/sounds/bluebird/animalia_bluebird.2.ogg differ diff --git a/mods/animalia/sounds/bluebird/animalia_bluebird.3.ogg b/mods/animalia/sounds/bluebird/animalia_bluebird.3.ogg new file mode 100644 index 00000000..c957f4f6 Binary files /dev/null and b/mods/animalia/sounds/bluebird/animalia_bluebird.3.ogg differ diff --git a/mods/animalia/sounds/cardinal/animalia_cardinal.1.ogg b/mods/animalia/sounds/cardinal/animalia_cardinal.1.ogg new file mode 100644 index 00000000..41109d77 Binary files /dev/null and b/mods/animalia/sounds/cardinal/animalia_cardinal.1.ogg differ diff --git a/mods/animalia/sounds/cardinal/animalia_cardinal.2.ogg b/mods/animalia/sounds/cardinal/animalia_cardinal.2.ogg new file mode 100644 index 00000000..a369b0ec Binary files /dev/null and b/mods/animalia/sounds/cardinal/animalia_cardinal.2.ogg differ diff --git a/mods/animalia/sounds/cardinal/animalia_cardinal.3.ogg b/mods/animalia/sounds/cardinal/animalia_cardinal.3.ogg new file mode 100644 index 00000000..7e346079 Binary files /dev/null and b/mods/animalia/sounds/cardinal/animalia_cardinal.3.ogg differ diff --git a/mods/animalia/sounds/cat/animalia_cat_hurt.ogg b/mods/animalia/sounds/cat/animalia_cat_hurt.ogg new file mode 100644 index 00000000..db2f360d Binary files /dev/null and b/mods/animalia/sounds/cat/animalia_cat_hurt.ogg differ diff --git a/mods/animalia/sounds/cat/animalia_cat_idle.ogg b/mods/animalia/sounds/cat/animalia_cat_idle.ogg new file mode 100644 index 00000000..0ebc9b94 Binary files /dev/null and b/mods/animalia/sounds/cat/animalia_cat_idle.ogg differ diff --git a/mods/animalia/sounds/cat/animalia_cat_purr.ogg b/mods/animalia/sounds/cat/animalia_cat_purr.ogg new file mode 100644 index 00000000..9fb085fa Binary files /dev/null and b/mods/animalia/sounds/cat/animalia_cat_purr.ogg differ diff --git a/mods/animalia/sounds/chicken/animalia_chicken.ogg b/mods/animalia/sounds/chicken/animalia_chicken.ogg new file mode 100644 index 00000000..67661efa Binary files /dev/null and b/mods/animalia/sounds/chicken/animalia_chicken.ogg differ diff --git a/mods/animalia/sounds/chicken/animalia_chicken_death.ogg b/mods/animalia/sounds/chicken/animalia_chicken_death.ogg new file mode 100644 index 00000000..6c93428b Binary files /dev/null and b/mods/animalia/sounds/chicken/animalia_chicken_death.ogg differ diff --git a/mods/animalia/sounds/chicken/animalia_chicken_hurt.ogg b/mods/animalia/sounds/chicken/animalia_chicken_hurt.ogg new file mode 100644 index 00000000..4f803fde Binary files /dev/null and b/mods/animalia/sounds/chicken/animalia_chicken_hurt.ogg differ diff --git a/mods/animalia/sounds/cow/animalia_cow.ogg b/mods/animalia/sounds/cow/animalia_cow.ogg new file mode 100644 index 00000000..cb890333 Binary files /dev/null and b/mods/animalia/sounds/cow/animalia_cow.ogg differ diff --git a/mods/animalia/sounds/cow/animalia_cow_death.ogg b/mods/animalia/sounds/cow/animalia_cow_death.ogg new file mode 100644 index 00000000..05b2e3d5 Binary files /dev/null and b/mods/animalia/sounds/cow/animalia_cow_death.ogg differ diff --git a/mods/animalia/sounds/cow/animalia_cow_hurt.ogg b/mods/animalia/sounds/cow/animalia_cow_hurt.ogg new file mode 100644 index 00000000..a5110c94 Binary files /dev/null and b/mods/animalia/sounds/cow/animalia_cow_hurt.ogg differ diff --git a/mods/animalia/sounds/frog/animalia_frog_1.ogg b/mods/animalia/sounds/frog/animalia_frog_1.ogg new file mode 100644 index 00000000..accb1403 Binary files /dev/null and b/mods/animalia/sounds/frog/animalia_frog_1.ogg differ diff --git a/mods/animalia/sounds/frog/animalia_frog_2.ogg b/mods/animalia/sounds/frog/animalia_frog_2.ogg new file mode 100644 index 00000000..2f226f1f Binary files /dev/null and b/mods/animalia/sounds/frog/animalia_frog_2.ogg differ diff --git a/mods/animalia/sounds/frog/animalia_frog_3.ogg b/mods/animalia/sounds/frog/animalia_frog_3.ogg new file mode 100644 index 00000000..d543525e Binary files /dev/null and b/mods/animalia/sounds/frog/animalia_frog_3.ogg differ diff --git a/mods/animalia/sounds/goldfinch/animalia_goldfinch.1.ogg b/mods/animalia/sounds/goldfinch/animalia_goldfinch.1.ogg new file mode 100644 index 00000000..aed91791 Binary files /dev/null and b/mods/animalia/sounds/goldfinch/animalia_goldfinch.1.ogg differ diff --git a/mods/animalia/sounds/goldfinch/animalia_goldfinch.2.ogg b/mods/animalia/sounds/goldfinch/animalia_goldfinch.2.ogg new file mode 100644 index 00000000..7f2971f0 Binary files /dev/null and b/mods/animalia/sounds/goldfinch/animalia_goldfinch.2.ogg differ diff --git a/mods/animalia/sounds/goldfinch/animalia_goldfinch.3.ogg b/mods/animalia/sounds/goldfinch/animalia_goldfinch.3.ogg new file mode 100644 index 00000000..456d32be Binary files /dev/null and b/mods/animalia/sounds/goldfinch/animalia_goldfinch.3.ogg differ diff --git a/mods/animalia/sounds/horse/animalia_horse_death.ogg b/mods/animalia/sounds/horse/animalia_horse_death.ogg new file mode 100644 index 00000000..2d716d88 Binary files /dev/null and b/mods/animalia/sounds/horse/animalia_horse_death.ogg differ diff --git a/mods/animalia/sounds/horse/animalia_horse_hurt.ogg b/mods/animalia/sounds/horse/animalia_horse_hurt.ogg new file mode 100644 index 00000000..16041382 Binary files /dev/null and b/mods/animalia/sounds/horse/animalia_horse_hurt.ogg differ diff --git a/mods/animalia/sounds/horse/animalia_horse_idle.1.ogg b/mods/animalia/sounds/horse/animalia_horse_idle.1.ogg new file mode 100644 index 00000000..a618c16b Binary files /dev/null and b/mods/animalia/sounds/horse/animalia_horse_idle.1.ogg differ diff --git a/mods/animalia/sounds/horse/animalia_horse_idle.2.ogg b/mods/animalia/sounds/horse/animalia_horse_idle.2.ogg new file mode 100644 index 00000000..0c4f7805 Binary files /dev/null and b/mods/animalia/sounds/horse/animalia_horse_idle.2.ogg differ diff --git a/mods/animalia/sounds/horse/animalia_horse_idle.3.ogg b/mods/animalia/sounds/horse/animalia_horse_idle.3.ogg new file mode 100644 index 00000000..dd6c121a Binary files /dev/null and b/mods/animalia/sounds/horse/animalia_horse_idle.3.ogg differ diff --git a/mods/animalia/sounds/morbiu.ogg b/mods/animalia/sounds/morbiu.ogg new file mode 100644 index 00000000..46fa65f7 Binary files /dev/null and b/mods/animalia/sounds/morbiu.ogg differ diff --git a/mods/animalia/sounds/pig/animalia_pig.1.ogg b/mods/animalia/sounds/pig/animalia_pig.1.ogg new file mode 100644 index 00000000..140821b0 Binary files /dev/null and b/mods/animalia/sounds/pig/animalia_pig.1.ogg differ diff --git a/mods/animalia/sounds/pig/animalia_pig.2.ogg b/mods/animalia/sounds/pig/animalia_pig.2.ogg new file mode 100644 index 00000000..61cf2ba9 Binary files /dev/null and b/mods/animalia/sounds/pig/animalia_pig.2.ogg differ diff --git a/mods/animalia/sounds/pig/animalia_pig_death.ogg b/mods/animalia/sounds/pig/animalia_pig_death.ogg new file mode 100644 index 00000000..d85b29ef Binary files /dev/null and b/mods/animalia/sounds/pig/animalia_pig_death.ogg differ diff --git a/mods/animalia/sounds/pig/animalia_pig_hurt.ogg b/mods/animalia/sounds/pig/animalia_pig_hurt.ogg new file mode 100644 index 00000000..43cca8da Binary files /dev/null and b/mods/animalia/sounds/pig/animalia_pig_hurt.ogg differ diff --git a/mods/animalia/sounds/reindeer/animalia_reindeer.1.ogg b/mods/animalia/sounds/reindeer/animalia_reindeer.1.ogg new file mode 100644 index 00000000..56e61019 Binary files /dev/null and b/mods/animalia/sounds/reindeer/animalia_reindeer.1.ogg differ diff --git a/mods/animalia/sounds/reindeer/animalia_reindeer.2.ogg b/mods/animalia/sounds/reindeer/animalia_reindeer.2.ogg new file mode 100644 index 00000000..dfe7d706 Binary files /dev/null and b/mods/animalia/sounds/reindeer/animalia_reindeer.2.ogg differ diff --git a/mods/animalia/sounds/reindeer/animalia_reindeer_death.ogg b/mods/animalia/sounds/reindeer/animalia_reindeer_death.ogg new file mode 100644 index 00000000..8f841a8d Binary files /dev/null and b/mods/animalia/sounds/reindeer/animalia_reindeer_death.ogg differ diff --git a/mods/animalia/sounds/reindeer/animalia_reindeer_hurt.ogg b/mods/animalia/sounds/reindeer/animalia_reindeer_hurt.ogg new file mode 100644 index 00000000..16621571 Binary files /dev/null and b/mods/animalia/sounds/reindeer/animalia_reindeer_hurt.ogg differ diff --git a/mods/animalia/sounds/sheep/animalia_sheep_death.ogg b/mods/animalia/sounds/sheep/animalia_sheep_death.ogg new file mode 100644 index 00000000..915e215b Binary files /dev/null and b/mods/animalia/sounds/sheep/animalia_sheep_death.ogg differ diff --git a/mods/animalia/sounds/sheep/animalia_sheep_hurt.ogg b/mods/animalia/sounds/sheep/animalia_sheep_hurt.ogg new file mode 100644 index 00000000..6054439a Binary files /dev/null and b/mods/animalia/sounds/sheep/animalia_sheep_hurt.ogg differ diff --git a/mods/animalia/sounds/sheep/animalia_sheep_idle.ogg b/mods/animalia/sounds/sheep/animalia_sheep_idle.ogg new file mode 100644 index 00000000..46e7da48 Binary files /dev/null and b/mods/animalia/sounds/sheep/animalia_sheep_idle.ogg differ diff --git a/mods/animalia/sounds/turkey/animalia_turkey.ogg b/mods/animalia/sounds/turkey/animalia_turkey.ogg new file mode 100644 index 00000000..5b04744e Binary files /dev/null and b/mods/animalia/sounds/turkey/animalia_turkey.ogg differ diff --git a/mods/animalia/sounds/turkey/animalia_turkey_death.ogg b/mods/animalia/sounds/turkey/animalia_turkey_death.ogg new file mode 100644 index 00000000..95ff25d5 Binary files /dev/null and b/mods/animalia/sounds/turkey/animalia_turkey_death.ogg differ diff --git a/mods/animalia/sounds/turkey/animalia_turkey_hurt.ogg b/mods/animalia/sounds/turkey/animalia_turkey_hurt.ogg new file mode 100644 index 00000000..16995fbb Binary files /dev/null and b/mods/animalia/sounds/turkey/animalia_turkey_hurt.ogg differ diff --git a/mods/animalia/textures/animalia_egg_fragment.png b/mods/animalia/textures/animalia_egg_fragment.png new file mode 100644 index 00000000..3fb7de7a Binary files /dev/null and b/mods/animalia/textures/animalia_egg_fragment.png differ diff --git a/mods/animalia/textures/animalia_lasso_entity.png b/mods/animalia/textures/animalia_lasso_entity.png new file mode 100644 index 00000000..b3fa5547 Binary files /dev/null and b/mods/animalia/textures/animalia_lasso_entity.png differ diff --git a/mods/animalia/textures/animalia_tied_lasso_entity.png b/mods/animalia/textures/animalia_tied_lasso_entity.png new file mode 100644 index 00000000..bb1a743b Binary files /dev/null and b/mods/animalia/textures/animalia_tied_lasso_entity.png differ diff --git a/mods/animalia/textures/armor/animalia_coat_bear_pelt.png b/mods/animalia/textures/armor/animalia_coat_bear_pelt.png new file mode 100644 index 00000000..1c05a46e Binary files /dev/null and b/mods/animalia/textures/armor/animalia_coat_bear_pelt.png differ diff --git a/mods/animalia/textures/armor/animalia_coat_bear_pelt_preview.png b/mods/animalia/textures/armor/animalia_coat_bear_pelt_preview.png new file mode 100644 index 00000000..3a65b01a Binary files /dev/null and b/mods/animalia/textures/armor/animalia_coat_bear_pelt_preview.png differ diff --git a/mods/animalia/textures/armor/animalia_inv_coat_bear_pelt.png b/mods/animalia/textures/armor/animalia_inv_coat_bear_pelt.png new file mode 100644 index 00000000..1ad8a8c3 Binary files /dev/null and b/mods/animalia/textures/armor/animalia_inv_coat_bear_pelt.png differ diff --git a/mods/animalia/textures/bat/animalia_bat_1.png b/mods/animalia/textures/bat/animalia_bat_1.png new file mode 100644 index 00000000..1c87b207 Binary files /dev/null and b/mods/animalia/textures/bat/animalia_bat_1.png differ diff --git a/mods/animalia/textures/bat/animalia_bat_2.png b/mods/animalia/textures/bat/animalia_bat_2.png new file mode 100644 index 00000000..2bcabf7b Binary files /dev/null and b/mods/animalia/textures/bat/animalia_bat_2.png differ diff --git a/mods/animalia/textures/bat/animalia_bat_3.png b/mods/animalia/textures/bat/animalia_bat_3.png new file mode 100644 index 00000000..ff468678 Binary files /dev/null and b/mods/animalia/textures/bat/animalia_bat_3.png differ diff --git a/mods/animalia/textures/bear/animalia_bear_grizzly.png b/mods/animalia/textures/bear/animalia_bear_grizzly.png new file mode 100644 index 00000000..f703c72f Binary files /dev/null and b/mods/animalia/textures/bear/animalia_bear_grizzly.png differ diff --git a/mods/animalia/textures/birds/animalia_bluebird.png b/mods/animalia/textures/birds/animalia_bluebird.png new file mode 100644 index 00000000..b2eb92fd Binary files /dev/null and b/mods/animalia/textures/birds/animalia_bluebird.png differ diff --git a/mods/animalia/textures/birds/animalia_cardinal.png b/mods/animalia/textures/birds/animalia_cardinal.png new file mode 100644 index 00000000..a7e18769 Binary files /dev/null and b/mods/animalia/textures/birds/animalia_cardinal.png differ diff --git a/mods/animalia/textures/birds/animalia_goldfinch.png b/mods/animalia/textures/birds/animalia_goldfinch.png new file mode 100644 index 00000000..bb7c5bec Binary files /dev/null and b/mods/animalia/textures/birds/animalia_goldfinch.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_1.png b/mods/animalia/textures/cat/animalia_cat_1.png new file mode 100644 index 00000000..89da6ecc Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_1.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_2.png b/mods/animalia/textures/cat/animalia_cat_2.png new file mode 100644 index 00000000..e60daec7 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_2.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_3.png b/mods/animalia/textures/cat/animalia_cat_3.png new file mode 100644 index 00000000..3fa1f825 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_3.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_4.png b/mods/animalia/textures/cat/animalia_cat_4.png new file mode 100644 index 00000000..a55fe133 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_4.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_5.png b/mods/animalia/textures/cat/animalia_cat_5.png new file mode 100644 index 00000000..40cd7ab5 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_5.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_6.png b/mods/animalia/textures/cat/animalia_cat_6.png new file mode 100644 index 00000000..38429741 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_6.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_7.png b/mods/animalia/textures/cat/animalia_cat_7.png new file mode 100644 index 00000000..55b28986 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_7.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_8.png b/mods/animalia/textures/cat/animalia_cat_8.png new file mode 100644 index 00000000..f8b366a6 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_8.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_9.png b/mods/animalia/textures/cat/animalia_cat_9.png new file mode 100644 index 00000000..060ad9c0 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_9.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_ash.png b/mods/animalia/textures/cat/animalia_cat_ash.png new file mode 100644 index 00000000..82a4f9f6 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_ash.png differ diff --git a/mods/animalia/textures/cat/animalia_cat_birch.png b/mods/animalia/textures/cat/animalia_cat_birch.png new file mode 100644 index 00000000..90837863 Binary files /dev/null and b/mods/animalia/textures/cat/animalia_cat_birch.png differ diff --git a/mods/animalia/textures/chicken/animalia_chicken_1.png b/mods/animalia/textures/chicken/animalia_chicken_1.png new file mode 100644 index 00000000..c98069b8 Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_chicken_1.png differ diff --git a/mods/animalia/textures/chicken/animalia_chicken_2.png b/mods/animalia/textures/chicken/animalia_chicken_2.png new file mode 100644 index 00000000..3bd3077b Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_chicken_2.png differ diff --git a/mods/animalia/textures/chicken/animalia_chicken_3.png b/mods/animalia/textures/chicken/animalia_chicken_3.png new file mode 100644 index 00000000..6e6003fe Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_chicken_3.png differ diff --git a/mods/animalia/textures/chicken/animalia_chicken_child.png b/mods/animalia/textures/chicken/animalia_chicken_child.png new file mode 100644 index 00000000..53f9f399 Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_chicken_child.png differ diff --git a/mods/animalia/textures/chicken/animalia_rooster_1.png b/mods/animalia/textures/chicken/animalia_rooster_1.png new file mode 100644 index 00000000..51829057 Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_rooster_1.png differ diff --git a/mods/animalia/textures/chicken/animalia_rooster_2.png b/mods/animalia/textures/chicken/animalia_rooster_2.png new file mode 100644 index 00000000..e02a4a38 Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_rooster_2.png differ diff --git a/mods/animalia/textures/chicken/animalia_rooster_3.png b/mods/animalia/textures/chicken/animalia_rooster_3.png new file mode 100644 index 00000000..69497797 Binary files /dev/null and b/mods/animalia/textures/chicken/animalia_rooster_3.png differ diff --git a/mods/animalia/textures/cow/animalia_cow_1.png b/mods/animalia/textures/cow/animalia_cow_1.png new file mode 100644 index 00000000..4064c648 Binary files /dev/null and b/mods/animalia/textures/cow/animalia_cow_1.png differ diff --git a/mods/animalia/textures/cow/animalia_cow_2.png b/mods/animalia/textures/cow/animalia_cow_2.png new file mode 100644 index 00000000..d9bf583d Binary files /dev/null and b/mods/animalia/textures/cow/animalia_cow_2.png differ diff --git a/mods/animalia/textures/cow/animalia_cow_3.png b/mods/animalia/textures/cow/animalia_cow_3.png new file mode 100644 index 00000000..a96621f2 Binary files /dev/null and b/mods/animalia/textures/cow/animalia_cow_3.png differ diff --git a/mods/animalia/textures/cow/animalia_cow_4.png b/mods/animalia/textures/cow/animalia_cow_4.png new file mode 100644 index 00000000..3c256dc8 Binary files /dev/null and b/mods/animalia/textures/cow/animalia_cow_4.png differ diff --git a/mods/animalia/textures/cow/animalia_cow_5.png b/mods/animalia/textures/cow/animalia_cow_5.png new file mode 100644 index 00000000..02030900 Binary files /dev/null and b/mods/animalia/textures/cow/animalia_cow_5.png differ diff --git a/mods/animalia/textures/cow/animalia_cow_udder.png b/mods/animalia/textures/cow/animalia_cow_udder.png new file mode 100644 index 00000000..cc1e3dec Binary files /dev/null and b/mods/animalia/textures/cow/animalia_cow_udder.png differ diff --git a/mods/animalia/textures/fish/animalia_angelfish.png b/mods/animalia/textures/fish/animalia_angelfish.png new file mode 100644 index 00000000..06b793c3 Binary files /dev/null and b/mods/animalia/textures/fish/animalia_angelfish.png differ diff --git a/mods/animalia/textures/fish/animalia_blue_tang.png b/mods/animalia/textures/fish/animalia_blue_tang.png new file mode 100644 index 00000000..6451c615 Binary files /dev/null and b/mods/animalia/textures/fish/animalia_blue_tang.png differ diff --git a/mods/animalia/textures/fish/animalia_clownfish.png b/mods/animalia/textures/fish/animalia_clownfish.png new file mode 100644 index 00000000..6a71054e Binary files /dev/null and b/mods/animalia/textures/fish/animalia_clownfish.png differ diff --git a/mods/animalia/textures/formspecs/animalia_form_horse_bg.png b/mods/animalia/textures/formspecs/animalia_form_horse_bg.png new file mode 100644 index 00000000..6059b9a0 Binary files /dev/null and b/mods/animalia/textures/formspecs/animalia_form_horse_bg.png differ diff --git a/mods/animalia/textures/formspecs/animalia_horse_call_icon.png b/mods/animalia/textures/formspecs/animalia_horse_call_icon.png new file mode 100644 index 00000000..5bd0484c Binary files /dev/null and b/mods/animalia/textures/formspecs/animalia_horse_call_icon.png differ diff --git a/mods/animalia/textures/formspecs/animalia_horse_inv_icon.png b/mods/animalia/textures/formspecs/animalia_horse_inv_icon.png new file mode 100644 index 00000000..4f9bf0d8 Binary files /dev/null and b/mods/animalia/textures/formspecs/animalia_horse_inv_icon.png differ diff --git a/mods/animalia/textures/formspecs/libri/animalia_libri_bg.png b/mods/animalia/textures/formspecs/libri/animalia_libri_bg.png new file mode 100644 index 00000000..1e116725 Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/animalia_libri_bg.png differ diff --git a/mods/animalia/textures/formspecs/libri/animalia_libri_health_bg.png b/mods/animalia/textures/formspecs/libri/animalia_libri_health_bg.png new file mode 100644 index 00000000..9ee4b38d Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/animalia_libri_health_bg.png differ diff --git a/mods/animalia/textures/formspecs/libri/animalia_libri_health_fg.png b/mods/animalia/textures/formspecs/libri/animalia_libri_health_fg.png new file mode 100644 index 00000000..e4936174 Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/animalia_libri_health_fg.png differ diff --git a/mods/animalia/textures/formspecs/libri/animalia_libri_info_fg.png b/mods/animalia/textures/formspecs/libri/animalia_libri_info_fg.png new file mode 100644 index 00000000..af96870b Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/animalia_libri_info_fg.png differ diff --git a/mods/animalia/textures/formspecs/libri/icons/animalia_libri_false_icon.png b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_false_icon.png new file mode 100644 index 00000000..ad712c5b Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_false_icon.png differ diff --git a/mods/animalia/textures/formspecs/libri/icons/animalia_libri_icon_last.png b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_icon_last.png new file mode 100644 index 00000000..28a4d368 Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_icon_last.png differ diff --git a/mods/animalia/textures/formspecs/libri/icons/animalia_libri_icon_next.png b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_icon_next.png new file mode 100644 index 00000000..e601c439 Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_icon_next.png differ diff --git a/mods/animalia/textures/formspecs/libri/icons/animalia_libri_true_icon.png b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_true_icon.png new file mode 100644 index 00000000..6670f301 Binary files /dev/null and b/mods/animalia/textures/formspecs/libri/icons/animalia_libri_true_icon.png differ diff --git a/mods/animalia/textures/fox/animalia_fox_1.png b/mods/animalia/textures/fox/animalia_fox_1.png new file mode 100644 index 00000000..6dc327ba Binary files /dev/null and b/mods/animalia/textures/fox/animalia_fox_1.png differ diff --git a/mods/animalia/textures/frog/animalia_bull_frog.png b/mods/animalia/textures/frog/animalia_bull_frog.png new file mode 100644 index 00000000..6a5d3156 Binary files /dev/null and b/mods/animalia/textures/frog/animalia_bull_frog.png differ diff --git a/mods/animalia/textures/frog/animalia_dart_frog_1.png b/mods/animalia/textures/frog/animalia_dart_frog_1.png new file mode 100644 index 00000000..4e15104c Binary files /dev/null and b/mods/animalia/textures/frog/animalia_dart_frog_1.png differ diff --git a/mods/animalia/textures/frog/animalia_dart_frog_2.png b/mods/animalia/textures/frog/animalia_dart_frog_2.png new file mode 100644 index 00000000..0ba84cf5 Binary files /dev/null and b/mods/animalia/textures/frog/animalia_dart_frog_2.png differ diff --git a/mods/animalia/textures/frog/animalia_dart_frog_3.png b/mods/animalia/textures/frog/animalia_dart_frog_3.png new file mode 100644 index 00000000..afa1d7ce Binary files /dev/null and b/mods/animalia/textures/frog/animalia_dart_frog_3.png differ diff --git a/mods/animalia/textures/frog/animalia_tadpole.png b/mods/animalia/textures/frog/animalia_tadpole.png new file mode 100644 index 00000000..398cd0fb Binary files /dev/null and b/mods/animalia/textures/frog/animalia_tadpole.png differ diff --git a/mods/animalia/textures/frog/animalia_tree_frog.png b/mods/animalia/textures/frog/animalia_tree_frog.png new file mode 100644 index 00000000..812ee2f3 Binary files /dev/null and b/mods/animalia/textures/frog/animalia_tree_frog.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_1.png b/mods/animalia/textures/horse/animalia_horse_1.png new file mode 100644 index 00000000..198b4f0d Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_1.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_2.png b/mods/animalia/textures/horse/animalia_horse_2.png new file mode 100644 index 00000000..e629581b Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_2.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_3.png b/mods/animalia/textures/horse/animalia_horse_3.png new file mode 100644 index 00000000..13b906ce Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_3.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_4.png b/mods/animalia/textures/horse/animalia_horse_4.png new file mode 100644 index 00000000..04b926e6 Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_4.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_5.png b/mods/animalia/textures/horse/animalia_horse_5.png new file mode 100644 index 00000000..5323f4e2 Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_5.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_6.png b/mods/animalia/textures/horse/animalia_horse_6.png new file mode 100644 index 00000000..1e3efeef Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_6.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_pattern_1.png b/mods/animalia/textures/horse/animalia_horse_pattern_1.png new file mode 100644 index 00000000..a57feb2b Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_pattern_1.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_pattern_2.png b/mods/animalia/textures/horse/animalia_horse_pattern_2.png new file mode 100644 index 00000000..ac70bbaf Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_pattern_2.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_pattern_3.png b/mods/animalia/textures/horse/animalia_horse_pattern_3.png new file mode 100644 index 00000000..f4ea648e Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_pattern_3.png differ diff --git a/mods/animalia/textures/horse/animalia_horse_saddle.png b/mods/animalia/textures/horse/animalia_horse_saddle.png new file mode 100644 index 00000000..a974fb9a Binary files /dev/null and b/mods/animalia/textures/horse/animalia_horse_saddle.png differ diff --git a/mods/animalia/textures/items/animalia_beef_cooked.png b/mods/animalia/textures/items/animalia_beef_cooked.png new file mode 100644 index 00000000..ed30f7a4 Binary files /dev/null and b/mods/animalia/textures/items/animalia_beef_cooked.png differ diff --git a/mods/animalia/textures/items/animalia_beef_raw.png b/mods/animalia/textures/items/animalia_beef_raw.png new file mode 100644 index 00000000..5c10b576 Binary files /dev/null and b/mods/animalia/textures/items/animalia_beef_raw.png differ diff --git a/mods/animalia/textures/items/animalia_cat_toy.png b/mods/animalia/textures/items/animalia_cat_toy.png new file mode 100644 index 00000000..d115c494 Binary files /dev/null and b/mods/animalia/textures/items/animalia_cat_toy.png differ diff --git a/mods/animalia/textures/items/animalia_crate.png b/mods/animalia/textures/items/animalia_crate.png new file mode 100644 index 00000000..5fa801c2 Binary files /dev/null and b/mods/animalia/textures/items/animalia_crate.png differ diff --git a/mods/animalia/textures/items/animalia_crate_side.png b/mods/animalia/textures/items/animalia_crate_side.png new file mode 100644 index 00000000..1d2ebaae Binary files /dev/null and b/mods/animalia/textures/items/animalia_crate_side.png differ diff --git a/mods/animalia/textures/items/animalia_egg.png b/mods/animalia/textures/items/animalia_egg.png new file mode 100644 index 00000000..0dee08a9 Binary files /dev/null and b/mods/animalia/textures/items/animalia_egg.png differ diff --git a/mods/animalia/textures/items/animalia_egg_fried.png b/mods/animalia/textures/items/animalia_egg_fried.png new file mode 100644 index 00000000..25a99186 Binary files /dev/null and b/mods/animalia/textures/items/animalia_egg_fried.png differ diff --git a/mods/animalia/textures/items/animalia_feather.png b/mods/animalia/textures/items/animalia_feather.png new file mode 100644 index 00000000..9c8d2bf6 Binary files /dev/null and b/mods/animalia/textures/items/animalia_feather.png differ diff --git a/mods/animalia/textures/items/animalia_guano_bucket.png b/mods/animalia/textures/items/animalia_guano_bucket.png new file mode 100644 index 00000000..1c16f83d Binary files /dev/null and b/mods/animalia/textures/items/animalia_guano_bucket.png differ diff --git a/mods/animalia/textures/items/animalia_lasso.png b/mods/animalia/textures/items/animalia_lasso.png new file mode 100644 index 00000000..85bf814a Binary files /dev/null and b/mods/animalia/textures/items/animalia_lasso.png differ diff --git a/mods/animalia/textures/items/animalia_leather.png b/mods/animalia/textures/items/animalia_leather.png new file mode 100644 index 00000000..0d0b0736 Binary files /dev/null and b/mods/animalia/textures/items/animalia_leather.png differ diff --git a/mods/animalia/textures/items/animalia_libri_animalia.png b/mods/animalia/textures/items/animalia_libri_animalia.png new file mode 100644 index 00000000..015d51e1 Binary files /dev/null and b/mods/animalia/textures/items/animalia_libri_animalia.png differ diff --git a/mods/animalia/textures/items/animalia_milk_bucket.png b/mods/animalia/textures/items/animalia_milk_bucket.png new file mode 100644 index 00000000..a985d6e3 Binary files /dev/null and b/mods/animalia/textures/items/animalia_milk_bucket.png differ diff --git a/mods/animalia/textures/items/animalia_mutton_cooked.png b/mods/animalia/textures/items/animalia_mutton_cooked.png new file mode 100644 index 00000000..577a5609 Binary files /dev/null and b/mods/animalia/textures/items/animalia_mutton_cooked.png differ diff --git a/mods/animalia/textures/items/animalia_mutton_raw.png b/mods/animalia/textures/items/animalia_mutton_raw.png new file mode 100644 index 00000000..44bcc028 Binary files /dev/null and b/mods/animalia/textures/items/animalia_mutton_raw.png differ diff --git a/mods/animalia/textures/items/animalia_nametag.png b/mods/animalia/textures/items/animalia_nametag.png new file mode 100644 index 00000000..0f7cd317 Binary files /dev/null and b/mods/animalia/textures/items/animalia_nametag.png differ diff --git a/mods/animalia/textures/items/animalia_net.png b/mods/animalia/textures/items/animalia_net.png new file mode 100644 index 00000000..25596665 Binary files /dev/null and b/mods/animalia/textures/items/animalia_net.png differ diff --git a/mods/animalia/textures/items/animalia_pelt_bear.png b/mods/animalia/textures/items/animalia_pelt_bear.png new file mode 100644 index 00000000..f3155738 Binary files /dev/null and b/mods/animalia/textures/items/animalia_pelt_bear.png differ diff --git a/mods/animalia/textures/items/animalia_porkchop_cooked.png b/mods/animalia/textures/items/animalia_porkchop_cooked.png new file mode 100644 index 00000000..8bc89ce9 Binary files /dev/null and b/mods/animalia/textures/items/animalia_porkchop_cooked.png differ diff --git a/mods/animalia/textures/items/animalia_porkchop_raw.png b/mods/animalia/textures/items/animalia_porkchop_raw.png new file mode 100644 index 00000000..24496dcc Binary files /dev/null and b/mods/animalia/textures/items/animalia_porkchop_raw.png differ diff --git a/mods/animalia/textures/items/animalia_poultry_cooked.png b/mods/animalia/textures/items/animalia_poultry_cooked.png new file mode 100644 index 00000000..da0a3082 Binary files /dev/null and b/mods/animalia/textures/items/animalia_poultry_cooked.png differ diff --git a/mods/animalia/textures/items/animalia_poultry_raw.png b/mods/animalia/textures/items/animalia_poultry_raw.png new file mode 100644 index 00000000..e8c4adf3 Binary files /dev/null and b/mods/animalia/textures/items/animalia_poultry_raw.png differ diff --git a/mods/animalia/textures/items/animalia_rat_cooked.png b/mods/animalia/textures/items/animalia_rat_cooked.png new file mode 100644 index 00000000..f5009cd8 Binary files /dev/null and b/mods/animalia/textures/items/animalia_rat_cooked.png differ diff --git a/mods/animalia/textures/items/animalia_rat_raw.png b/mods/animalia/textures/items/animalia_rat_raw.png new file mode 100644 index 00000000..abdeec6a Binary files /dev/null and b/mods/animalia/textures/items/animalia_rat_raw.png differ diff --git a/mods/animalia/textures/items/animalia_saddle.png b/mods/animalia/textures/items/animalia_saddle.png new file mode 100644 index 00000000..f6f9f978 Binary files /dev/null and b/mods/animalia/textures/items/animalia_saddle.png differ diff --git a/mods/animalia/textures/items/animalia_shears.png b/mods/animalia/textures/items/animalia_shears.png new file mode 100644 index 00000000..b5af03cb Binary files /dev/null and b/mods/animalia/textures/items/animalia_shears.png differ diff --git a/mods/animalia/textures/items/animalia_song_bird_egg.png b/mods/animalia/textures/items/animalia_song_bird_egg.png new file mode 100644 index 00000000..446824ed Binary files /dev/null and b/mods/animalia/textures/items/animalia_song_bird_egg.png differ diff --git a/mods/animalia/textures/items/animalia_song_bird_egg_fried.png b/mods/animalia/textures/items/animalia_song_bird_egg_fried.png new file mode 100644 index 00000000..41123683 Binary files /dev/null and b/mods/animalia/textures/items/animalia_song_bird_egg_fried.png differ diff --git a/mods/animalia/textures/items/animalia_venison_cooked.png b/mods/animalia/textures/items/animalia_venison_cooked.png new file mode 100644 index 00000000..ccf30aba Binary files /dev/null and b/mods/animalia/textures/items/animalia_venison_cooked.png differ diff --git a/mods/animalia/textures/items/animalia_venison_raw.png b/mods/animalia/textures/items/animalia_venison_raw.png new file mode 100644 index 00000000..0cffb33e Binary files /dev/null and b/mods/animalia/textures/items/animalia_venison_raw.png differ diff --git a/mods/animalia/textures/nodes/animalia_guano.png b/mods/animalia/textures/nodes/animalia_guano.png new file mode 100644 index 00000000..5df9be96 Binary files /dev/null and b/mods/animalia/textures/nodes/animalia_guano.png differ diff --git a/mods/animalia/textures/nodes/animalia_nest.png b/mods/animalia/textures/nodes/animalia_nest.png new file mode 100644 index 00000000..c40ea417 Binary files /dev/null and b/mods/animalia/textures/nodes/animalia_nest.png differ diff --git a/mods/animalia/textures/opossum/animalia_opossum.png b/mods/animalia/textures/opossum/animalia_opossum.png new file mode 100644 index 00000000..0978b74d Binary files /dev/null and b/mods/animalia/textures/opossum/animalia_opossum.png differ diff --git a/mods/animalia/textures/owl/animalia_owl.png b/mods/animalia/textures/owl/animalia_owl.png new file mode 100644 index 00000000..a8b8d698 Binary files /dev/null and b/mods/animalia/textures/owl/animalia_owl.png differ diff --git a/mods/animalia/textures/pig/animalia_pig_1.png b/mods/animalia/textures/pig/animalia_pig_1.png new file mode 100644 index 00000000..7993db8f Binary files /dev/null and b/mods/animalia/textures/pig/animalia_pig_1.png differ diff --git a/mods/animalia/textures/pig/animalia_pig_2.png b/mods/animalia/textures/pig/animalia_pig_2.png new file mode 100644 index 00000000..8628f6a6 Binary files /dev/null and b/mods/animalia/textures/pig/animalia_pig_2.png differ diff --git a/mods/animalia/textures/pig/animalia_pig_3.png b/mods/animalia/textures/pig/animalia_pig_3.png new file mode 100644 index 00000000..a0958215 Binary files /dev/null and b/mods/animalia/textures/pig/animalia_pig_3.png differ diff --git a/mods/animalia/textures/pig/animalia_pig_tusks.png b/mods/animalia/textures/pig/animalia_pig_tusks.png new file mode 100644 index 00000000..317cf07b Binary files /dev/null and b/mods/animalia/textures/pig/animalia_pig_tusks.png differ diff --git a/mods/animalia/textures/rat/animalia_rat_1.png b/mods/animalia/textures/rat/animalia_rat_1.png new file mode 100644 index 00000000..0d4398b2 Binary files /dev/null and b/mods/animalia/textures/rat/animalia_rat_1.png differ diff --git a/mods/animalia/textures/rat/animalia_rat_2.png b/mods/animalia/textures/rat/animalia_rat_2.png new file mode 100644 index 00000000..d90930a1 Binary files /dev/null and b/mods/animalia/textures/rat/animalia_rat_2.png differ diff --git a/mods/animalia/textures/rat/animalia_rat_3.png b/mods/animalia/textures/rat/animalia_rat_3.png new file mode 100644 index 00000000..2276071f Binary files /dev/null and b/mods/animalia/textures/rat/animalia_rat_3.png differ diff --git a/mods/animalia/textures/reindeer/animalia_reindeer.png b/mods/animalia/textures/reindeer/animalia_reindeer.png new file mode 100644 index 00000000..8c853422 Binary files /dev/null and b/mods/animalia/textures/reindeer/animalia_reindeer.png differ diff --git a/mods/animalia/textures/reindeer/animalia_reindeer_calf.png b/mods/animalia/textures/reindeer/animalia_reindeer_calf.png new file mode 100644 index 00000000..d6acdc7f Binary files /dev/null and b/mods/animalia/textures/reindeer/animalia_reindeer_calf.png differ diff --git a/mods/animalia/textures/sheep/animalia_sheep.png b/mods/animalia/textures/sheep/animalia_sheep.png new file mode 100644 index 00000000..03ffca4f Binary files /dev/null and b/mods/animalia/textures/sheep/animalia_sheep.png differ diff --git a/mods/animalia/textures/sheep/animalia_sheep_wool.png b/mods/animalia/textures/sheep/animalia_sheep_wool.png new file mode 100644 index 00000000..2f1ffb8f Binary files /dev/null and b/mods/animalia/textures/sheep/animalia_sheep_wool.png differ diff --git a/mods/animalia/textures/transparency.png b/mods/animalia/textures/transparency.png new file mode 100644 index 00000000..dba73480 Binary files /dev/null and b/mods/animalia/textures/transparency.png differ diff --git a/mods/animalia/textures/turkey/animalia_turkey_chick.png b/mods/animalia/textures/turkey/animalia_turkey_chick.png new file mode 100644 index 00000000..1b7718c5 Binary files /dev/null and b/mods/animalia/textures/turkey/animalia_turkey_chick.png differ diff --git a/mods/animalia/textures/turkey/animalia_turkey_hen.png b/mods/animalia/textures/turkey/animalia_turkey_hen.png new file mode 100644 index 00000000..ea75f6de Binary files /dev/null and b/mods/animalia/textures/turkey/animalia_turkey_hen.png differ diff --git a/mods/animalia/textures/turkey/animalia_turkey_tom.png b/mods/animalia/textures/turkey/animalia_turkey_tom.png new file mode 100644 index 00000000..c26a59e8 Binary files /dev/null and b/mods/animalia/textures/turkey/animalia_turkey_tom.png differ diff --git a/mods/animalia/textures/wolf/animalia_wolf_1.png b/mods/animalia/textures/wolf/animalia_wolf_1.png new file mode 100644 index 00000000..33d09a45 Binary files /dev/null and b/mods/animalia/textures/wolf/animalia_wolf_1.png differ diff --git a/mods/animalia/textures/wolf/animalia_wolf_2.png b/mods/animalia/textures/wolf/animalia_wolf_2.png new file mode 100644 index 00000000..be13a442 Binary files /dev/null and b/mods/animalia/textures/wolf/animalia_wolf_2.png differ diff --git a/mods/animalia/textures/wolf/animalia_wolf_3.png b/mods/animalia/textures/wolf/animalia_wolf_3.png new file mode 100644 index 00000000..7899b115 Binary files /dev/null and b/mods/animalia/textures/wolf/animalia_wolf_3.png differ diff --git a/mods/animalia/textures/wolf/animalia_wolf_4.png b/mods/animalia/textures/wolf/animalia_wolf_4.png new file mode 100644 index 00000000..d78381e3 Binary files /dev/null and b/mods/animalia/textures/wolf/animalia_wolf_4.png differ diff --git a/mods/asuna/asuna_alias/init.lua b/mods/asuna/asuna_alias/init.lua new file mode 100644 index 00000000..637f5ba7 --- /dev/null +++ b/mods/asuna/asuna_alias/init.lua @@ -0,0 +1,136 @@ +-- The better_farming mod was removed in favor of Farming Redo and X Farming, +-- and to avoid unknown nodes in existing worlds, the better_farming nodes are +-- aliased here. + +for old,new in pairs({ + adzuki = "x_farming:soybean", + agave = "air", + aloe = "air", + asparagus = "air", + beetroot = "x_farming:beetroot", + bokchoy = "x_farming:soybean", + cabbage = "farming:cabbage", + carrot = "x_farming:carrot", + cassava = "x_farming:coffee", + chilie = "farming:chili", + corn = "x_farming:corn", + cucumber = "farming:cucumber", + eggplants = "farming:eggplant", + ginger = "farming:ginger", + jute = "air", + kale = "farming:cabbage", + medicinal_plant = "air", + millet = "air", + mint = "farming:mint", + onion = "farming:onion", + pepper = "farming:pepper", + potato = "x_farming:potato", + rice = "farming:rice", + sisal = "air", + spiceleaf = "stevia", + spinach = "farming:spinach", + strawberry = "x_farming:strawberry", + tomatoes = "farming:tomato", + yucca = "air", +}) do + for i = 1, 8 do + minetest.register_alias("better_farming:" .. old .. "_" .. i,new == "air" and new or (new .. "_" .. i)) + end +end + +-- Alias Plantlife sunflowers to Farming Redo sunflowers +minetest.register_alias("flowers:sunflower","farming:sunflower_8") +minetest.register_alias("sunflower:sunflower","farming:sunflower_8") + +-- Alias Plantlife bushes to default bushes +minetest.register_alias("bushes:bushbranches1","default:bush_stem") +minetest.register_alias("bushes:bushbranches2","default:bush_stem") +minetest.register_alias("bushes:bushbranches3","default:bush_stem") +minetest.register_alias("bushes:bushbranches4","default:bush_stem") +minetest.register_alias("bushes:BushLeaves1","default:bush_leaves") +minetest.register_alias("bushes:BushLeaves2","default:bush_leaves") +minetest.register_alias("bushes:youngtree2_bottom","air") + +-- Alias Plantlife young trees to air +minetest.register_alias("youngtrees:bamboo","air") +minetest.register_alias("youngtrees:youngtree_top","air") +minetest.register_alias("youngtrees:youngtree_middle","air") +minetest.register_alias("youngtrees:youngtree_bottom","air") + +-- Aliases for removed biomes/bambooforest nodes +minetest.register_alias("bambooforest:bamboo","everness:bamboo_1") +minetest.register_alias("bambooforest:bamboo_wood","everness:bamboo_wood") +minetest.register_alias("bambooforest:bamboo_block","everness:bamboo_block") +minetest.register_alias("bambooforest:dirt_with_bamboo","default:dirt_with_rainforest_litter") +minetest.register_alias("bambooforest:granite","too_many_stones:granite_gray") +minetest.register_alias("bambooforest:granite_block","too_many_stones:granite_gray_block") +minetest.register_alias("bambooforest:granite_brick","too_many_stones:granite_gray_brick") +minetest.register_alias("walls:granite_brick","too_many_stones:granite_gray_wall") +minetest.register_alias("bambooforest:melon","x_farming:melon_fruit") +minetest.register_alias("bambooforest:bamboo_trapdoor","everness:trapdoor_bamboo") +minetest.register_alias("bambooforest:fence_bamboo_wood","everness:fence_bamboo_wood") +minetest.register_alias("bambooforest:fence_rail_bamboo_wood","everness:fence_rail_bamboo_wood") + +-- Aliases for Ethereal bamboo +minetest.register_alias_force("ethereal:bamboo_leaves","air") +minetest.register_alias_force("ethereal:bamboo","everness:bamboo_3") +minetest.register_alias_force("ethereal:bamboo_block","everness:bamboo_block") +minetest.register_alias_force("ethereal:bamboo_floor","stairs:slab_bamboo_wood") + +-- Alias for palm trees and coconuts to the Everness versions of these nodes +minetest.register_alias_force("ethereal:palmleaves","everness:palm_leaves") +minetest.register_alias_force("ethereal:palm_trunk","everness:palm_tree") +minetest.register_alias_force("ethereal:palm_sapling","everness:palm_tree_sapling") +minetest.register_alias_force("ethereal:coconut","everness:coconut") +minetest.register_alias_force("ethereal:coconut_slice","everness:coconut_fruit") +minetest.register_alias_force("ethereal:palm_wood","everness:palm_tree_wood") + +minetest.register_alias_force("ethereal:fence_palm","everness:fence_palm_wood") +minetest.register_alias_force("ethereal:fence_rail_palm","everness:fence_rail_palm_wood") +minetest.register_alias_force("ethereal:fencegate_palm_closed","everness:gate_palm_wood_closed") +minetest.register_alias_force("ethereal:fencegate_palm_open","everness:gate_palm_wood_open") +minetest.register_alias_force("ethereal:mese_post_palm","everness:mese_post_light_palm_wood") +minetest.register_alias_force("stairs:slab_palm_wood","stairs:slab_palm_tree_wood") +minetest.register_alias_force("stairs:stair_palm_wood","stairs:stair_palm_tree_wood") +minetest.register_alias_force("stairs:stair_outer_palm_wood","stairs:stair_outer_palm_tree_wood") +minetest.register_alias_force("stairs:stair_inner_palm_wood","stairs:stair_inner_palm_tree_wood") + +-- Aliases for unused Natural Biomes nodes that are not registered +minetest.register_alias("naturalbiomes:bambooforest_litter","default:dirt_with_rainforest_litter") +minetest.register_alias("naturalbiomes:bamboo_trunk","everness:bamboo_3") +minetest.register_alias("naturalbiomes:bamboo_wood","everness:bamboo_block") +minetest.register_alias("naturalbiomes:bamboo_leaves","air") +minetest.register_alias("naturalbiomes:bamboo_sapling","everness:bamboo_2") +minetest.register_alias("stairs:slab_naturalbiomes_bambooforest_bamboo_wood2","stairs:slab_bamboo_wood") +minetest.register_alias("naturalbiomes:stair_naturalbiomes_bambooforest_bamboo_wood2","stairs:stair_bamboo_wood") +minetest.register_alias("naturalbiomes:stair_outer_naturalbiomes_bambooforest_bamboo_wood2","stairs:stair_outer_bamboo_wood") +minetest.register_alias("naturalbiomes:stair_inner_naturalbiomes_bambooforest_bamboo_wood2","stairs:stair_inner_bamboo_wood") +minetest.register_alias("stairs:slab_naturalbiomes_bambooforest_bamboo_trunk","stairs:slab_bamboo_wood") +minetest.register_alias("naturalbiomes:stair_naturalbiomes_bambooforest_bamboo_trunk","stairs:stair_bamboo_wood") +minetest.register_alias("naturalbiomes:stair_outer_naturalbiomes_bambooforest_bamboo_trunk","stairs:stair_outer_bamboo_wood") +minetest.register_alias("naturalbiomes:stair_inner_naturalbiomes_bambooforest_bamboo_trunk","stairs:stair_inner_bamboo_wood") +minetest.register_alias("naturalbiomes:smallbamboo","everness:bamboo_2") +minetest.register_alias("naturalbiomes:bambooforest_rock","default:cobble") +minetest.register_alias("naturalbiomes:bambooforest_groundgrass","default:grass_4") +minetest.register_alias("naturalbiomes:bambooforest_groundgrass2","default:grass_5") +minetest.register_alias("naturalbiomes:banana_trunk","ethereal:banana_trunk") +minetest.register_alias("naturalbiomes:banana_wood","ethereal:banana_wood") +minetest.register_alias("naturalbiomes:banana_leaves","ethereal:bananaleaves") +minetest.register_alias("naturalbiomes:banana_sapling","ethereal:banana_tree_sapling") + +minetest.register_alias("naturalbiomes:palmbeach_sand","default:sand") +minetest.register_alias("naturalbiomes:palmbeach_rock","default:cobble") +minetest.register_alias("naturalbiomes:palm_trunk","everness:palm_tree") +minetest.register_alias("naturalbiomes:palm_wood","everness:palm_tree_wood") +minetest.register_alias("naturalbiomes:palm_leaves","everness:palm_leaves") +minetest.register_alias("naturalbiomes:palm_sapling","everness:palm_tree_sapling") +minetest.register_alias("naturalbiomes:beach_bush_stem","default:bush_stem") +minetest.register_alias("naturalbiomes:beach_bush_leaves","default:bush_leaves") +minetest.register_alias("naturalbiomes:beach_bush_sapling","default:bush_sapling") +minetest.register_alias("naturalbiomes:palmbeach_grass1","default:marram_grass_1") +minetest.register_alias("naturalbiomes:palmbeach_grass2","default:marram_grass_2") +minetest.register_alias("naturalbiomes:palmbeach_grass3","default:marram_grass_3") +minetest.register_alias("naturalbiomes:banana_bunch","ethereal:banana") +minetest.register_alias("naturalbiomes:banana","ethereal:banana") +minetest.register_alias("naturalbiomes:coconut_slice","everness:coconut_fruit") +minetest.register_alias("naturalbiomes:coconut","everness:coconut") \ No newline at end of file diff --git a/mods/asuna/asuna_alias/mod.conf b/mods/asuna/asuna_alias/mod.conf new file mode 100644 index 00000000..b072d11f --- /dev/null +++ b/mods/asuna/asuna_alias/mod.conf @@ -0,0 +1,4 @@ +name = asuna_alias +description = Aliases for items/nodes across various mods +depends = ethereal, everness +author = EmptyStar \ No newline at end of file diff --git a/mods/asuna/asuna_awards/LICENSE b/mods/asuna/asuna_awards/LICENSE new file mode 100644 index 00000000..1dc59eaf --- /dev/null +++ b/mods/asuna/asuna_awards/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright © 2024 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/at_the_end_of_the_tunnel.lua b/mods/asuna/asuna_awards/awards/at_the_end_of_the_tunnel.lua new file mode 100644 index 00000000..9be4e578 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/at_the_end_of_the_tunnel.lua @@ -0,0 +1,36 @@ +return function(award) + -- Process all applicable TMS and Caverealms glow gems/minerals + local goals = {} + for _,node in ipairs({ + "caverealms:glow_amethyst", + "caverealms:glow_crystal", + "caverealms:glow_ruby", + "caverealms:glow_emerald", + "caverealms:glow_gem", + "too_many_stones:glow_apatite", + "too_many_stones:glow_calcite", + "too_many_stones:glow_esperite", + "too_many_stones:glow_fluorite", + "too_many_stones:glow_selenite", + "too_many_stones:glow_sodalite", + "too_many_stones:glow_willemite", + }) do + table.insert(goals,{ + description = "Mine " .. minetest.registered_nodes[node].description, + trigger = { + type = "dig", + target = 1, + node = node, + }, + }) + end + + -- Add triggers to award + return { + title = "At the End of the Tunnel", + description = "Mine every underground glow gem and glow mineral", + difficulty = 215, + icon = "[inventorycube{tms_glow_willemite.png{tms_glow_willemite.png{tms_glow_willemite.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/by_the_seashore.lua b/mods/asuna/asuna_awards/awards/by_the_seashore.lua new file mode 100644 index 00000000..c7fd16c1 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/by_the_seashore.lua @@ -0,0 +1,25 @@ +return function(award) + local goals = { target = 1 } + + for node,def in pairs(minetest.registered_nodes) do + if node:find("^marinara:sand_with_seashells") then + table.insert(goals,{ + id = node:gsub(":","_"), + description = "Dig " .. def.description, + trigger = { + type = "dig", + target = 1, + node = node, + }, + }) + end + end + + return { + title = "By the Seashore", + description = "Dig up any seashells", + difficulty = 10, + icon = "[inventorycube{default_sand.png&marinara_seashells.png{default_sand.png&marinara_seashells.png{default_sand.png&marinara_seashells.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/cosmopolitan.lua b/mods/asuna/asuna_awards/awards/cosmopolitan.lua new file mode 100644 index 00000000..0afb7854 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/cosmopolitan.lua @@ -0,0 +1,36 @@ +return function(award) + -- Register goals for each base biome + local goals = {} + local biomes = {} + local excluded_biomes = { + mountain = true, + underground = true, + quicksand = true, + } + for _,biome in ipairs(asuna.biome_groups.base) do + if not excluded_biomes[biome] then + biomes[biome] = true + table.insert(goals,{ + id = biome, + description = "Explore " .. asuna.biomes[biome].name, + }) + end + end + + -- Register interval callback to check player biome + asuna_awards.register_on_interval(award,function(player) + local biome = minetest.get_biome_name(minetest.get_biome_data(player:get_pos()).biome) + if biomes[biome] then + return award, biome + end + end) + + -- Return award definition + return { + title = "Cosmopolitan", + description = "Explore all Asuna surface biomes", + difficulty = 400, + icon = "server_favorite.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/dont_touch_that.lua b/mods/asuna/asuna_awards/awards/dont_touch_that.lua new file mode 100644 index 00000000..e0e38cc0 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/dont_touch_that.lua @@ -0,0 +1,15 @@ +return function(award) + minetest.register_on_player_hpchange(function(player, hp_change, reason) + if reason.type == "node_damage" then + awards.unlock(player:get_player_name(),award) + end + end) + + return { + title = "Don't Touch That", + description = "Take damage from a harmful node", + difficulty = 15, + icon = "fire_basic_flame.png", + condition = core.settings:get_bool("enable_damage"), + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/ea_nasirs_legacy.lua b/mods/asuna/asuna_awards/awards/ea_nasirs_legacy.lua new file mode 100644 index 00000000..8e62a862 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/ea_nasirs_legacy.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Ea-nÄá¹£ir's Legacy", + description = "Mine copper ore", + difficulty = 20, + icon = "[inventorycube{default_stone.png&default_mineral_copper.png{default_stone.png&default_mineral_copper.png{default_stone.png&default_mineral_copper.png", + trigger = { + type = "dig", + node = "default:stone_with_copper", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/enter_sandman.lua b/mods/asuna/asuna_awards/awards/enter_sandman.lua new file mode 100644 index 00000000..a461e192 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/enter_sandman.lua @@ -0,0 +1,35 @@ +-- Get beds skip night setting +local is_night_skip_enabled = minetest.settings:get_bool("enable_bed_night_skip",true) + +return function(award) + -- Unlock for actual sleeping if night skip is enabled, else unlock for laying down + if is_night_skip_enabled then + local ogbsn = beds.skip_night + beds.skip_night = function() + for _,player in ipairs(minetest.get_connected_players()) do + local player_name = player and player:get_player_name() or nil + if player_name and beds.player[player_name] then + awards.unlock(player_name,award) + end + end + ogbsn() + end + else + local ogborc = beds.on_rightclick + beds.on_rightclick = function(pos, player) + local retval = ogborc(pos, player) + local player_name = player and player:get_player_name() or nil + if beds.player[player_name] then + awards.unlock(player_name,award) + end + return retval + end + end + + return { + title = "Enter Sandman", + description = "Sleep in a bed", + difficulty = 240, + icon = "beds_bed_fancy.png", + } +end diff --git a/mods/asuna/asuna_awards/awards/fellowship_of_the_mese.lua b/mods/asuna/asuna_awards/awards/fellowship_of_the_mese.lua new file mode 100644 index 00000000..4f1fa854 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/fellowship_of_the_mese.lua @@ -0,0 +1,22 @@ +return function(award) + minetest.override_item("default:mese_block",{ + dropped_step = function(self,pos) + -- Check if player explicitly dropped it + local dropper = self.dropped_by + if dropper and minetest.get_player_by_name(dropper) then + local groups = minetest.registered_nodes[minetest.get_node(pos).name].groups + if groups and groups.lava and groups.lava > 0 then + awards.unlock(dropper,award) + end + end + return true + end, + }) + + return { + title = "Fellowship of the Mese", + description = "Drop a mese block into lava", + difficulty = 280, + icon = "[inventorycube{default_mese_block.png{default_mese_block.png{default_mese_block.png^fire_basic_flame.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/fools_gold.lua b/mods/asuna/asuna_awards/awards/fools_gold.lua new file mode 100644 index 00000000..a49729b7 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/fools_gold.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Fool's Gold", + description = "Mine pyrite ore", + difficulty = 25, + icon = "[inventorycube{default_stone.png&everness_mineral_pyrite.png{default_stone.png&everness_mineral_pyrite.png{default_stone.png&everness_mineral_pyrite.png", + trigger = { + type = "dig", + node = "everness:pyrite_ore", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/fruit_of_the_heavens.lua b/mods/asuna/asuna_awards/awards/fruit_of_the_heavens.lua new file mode 100644 index 00000000..1bd4e7a6 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/fruit_of_the_heavens.lua @@ -0,0 +1,22 @@ +return function(award) + local mese_fruit_on_dig = minetest.registered_nodes["everness:mese_tree_fruit"].on_dig + minetest.override_item("everness:mese_tree_fruit",{ + on_dig = function(pos,node,digger) + if node.param2 == 0 + and minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name == "everness:mese_leaves" + and digger + and digger:is_player() + then + awards.unlock(digger:get_player_name(),award) + end + return mese_fruit_on_dig(pos,node,digger) + end, + }) + + return { + title = "Fruit of the Heavens", + description = "Pluck a mese fruit from a mese tree", + difficulty = 140, + icon = "everness_mese_tree_fruit_item.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/gourmand.lua b/mods/asuna/asuna_awards/awards/gourmand.lua new file mode 100644 index 00000000..b664bc22 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/gourmand.lua @@ -0,0 +1,28 @@ +return function(award) + local goals = { + target = 20, + show_locked = false, + } + + for item,def in pairs(minetest.registered_items) do + if def.on_use then + table.insert(goals,{ + id = item:gsub(":","_"), + description = "Eat " .. def.description, + trigger = { + type = "eat", + target = 1, + item = item, + }, + }) + end + end + + return { + title = "Gourmand", + description = "Eat 20 different food items", + difficulty = 180, + icon = "farming_bread.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/have_a_heart.lua b/mods/asuna/asuna_awards/awards/have_a_heart.lua new file mode 100644 index 00000000..fcadfea2 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/have_a_heart.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Have a Heart", + description = "Mine tin ore", + difficulty = 30, + icon = "[inventorycube{default_stone.png&default_mineral_tin.png{default_stone.png&default_mineral_tin.png{default_stone.png&default_mineral_tin.png", + trigger = { + type = "dig", + node = "default:stone_with_tin", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/home_gardening.lua b/mods/asuna/asuna_awards/awards/home_gardening.lua new file mode 100644 index 00000000..a8cab623 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/home_gardening.lua @@ -0,0 +1,20 @@ +return function(award) + local forc = minetest.registered_items["flowerpot:empty"].on_rightclick + minetest.override_item("flowerpot:empty",{ + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local retval = forc(pos, node, clicker, itemstack, pointed_thing) + local node = minetest.get_node(pos).name + if node ~= "flowerpot:empty" and node:find("^flowerpot:") then + awards.unlock(clicker:get_player_name(),award) + end + return retval + end, + }) + + return { + title = "Home Gardening", + description = "Pot a flower in a flowerpot", + difficulty = 30, + icon = "pia.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/how_can_she_slap.lua b/mods/asuna/asuna_awards/awards/how_can_she_slap.lua new file mode 100644 index 00000000..61af28ad --- /dev/null +++ b/mods/asuna/asuna_awards/awards/how_can_she_slap.lua @@ -0,0 +1,23 @@ +return function(award) + for entity,def in pairs(minetest.registered_entities) do + if def._creatura_mob or def._cmi_is_mob then + local ogop = def.on_punch + def.on_punch = function(self,puncher,...) + if puncher and puncher:is_player() then + local player = puncher:get_player_name() + if not awards.player(player).unlocked[award] and puncher:get_wielded_item():get_name() == "" then + awards.unlock(player,award) + end + end + return ogop(self,puncher,...) + end + end + end + + return { + title = "HOW CAN SHE SLAP???", + description = "Punch a critter with your bare hand", + difficulty = 45, + icon = "heart.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/its_honest_work.lua b/mods/asuna/asuna_awards/awards/its_honest_work.lua new file mode 100644 index 00000000..bf862b8f --- /dev/null +++ b/mods/asuna/asuna_awards/awards/its_honest_work.lua @@ -0,0 +1,17 @@ +return function(award) + local oghou = farming.hoe_on_use + farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) + local retval = oghou(itemstack, user, pointed_thing, uses) + if retval ~= nil then + awards.unlock(user:get_player_name(),award) + end + return retval + end + + return { + title = "It's Honest Work", + description = "Till soil for farming using a hoe", + difficulty = 40, + icon = "farming_tool_stonehoe.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/johnny_appleseed.lua b/mods/asuna/asuna_awards/awards/johnny_appleseed.lua new file mode 100644 index 00000000..6d2bd2ba --- /dev/null +++ b/mods/asuna/asuna_awards/awards/johnny_appleseed.lua @@ -0,0 +1,29 @@ +return function(award) + local goals = { + target = 25, + show_locked = false, + } + + for node,def in pairs(minetest.registered_nodes) do + local groups = def.groups + if groups and groups.sapling and groups.sapling > 0 then + table.insert(goals,{ + id = node:gsub(":","_"), + description = "Plant a " .. def.description, + trigger = { + type = "place", + target = 1, + node = node, + }, + }) + end + end + + return { + title = "Johnny Appleseed", + description = "Plant " .. goals.target .. " different types of tree sapling", + difficulty = 130, + icon = "default_sapling.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/joys_of_spring.lua b/mods/asuna/asuna_awards/awards/joys_of_spring.lua new file mode 100644 index 00000000..677e3c44 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/joys_of_spring.lua @@ -0,0 +1,29 @@ +return function(award) + local goals = { + target = 50, + show_locked = false, + } + + for node,def in pairs(minetest.registered_nodes) do + local groups = def.groups + if groups and groups.flower and groups.flower > 0 then + table.insert(goals,{ + id = node:gsub(":","_"), + description = "Pick " .. def.description, + trigger = { + type = "dig", + target = 1, + node = node, + }, + }) + end + end + + return { + title = "Joys of Spring", + description = "Pick " .. goals.target .. " different types of flower", + difficulty = 140, + icon = "flowers_rose.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/let_there_be_light.lua b/mods/asuna/asuna_awards/awards/let_there_be_light.lua new file mode 100644 index 00000000..e75de8b4 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/let_there_be_light.lua @@ -0,0 +1,28 @@ +return function(award) + local goals = { + target = 1, + show_locked = false, + } + + for node,def in pairs(minetest.registered_nodes) do + if def.light_source and def.light_source > 0 then + table.insert(goals,{ + id = node:gsub(":","_"), + description = "Place a " .. def.description, + trigger = { + type = "place", + target = 1, + node = node, + }, + }) + end + end + + return { + title = "Let There Be Light", + description = "Place any light", + difficulty = 15, + icon = "default_torch_on_floor.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/lost_but_not_forgotten.lua b/mods/asuna/asuna_awards/awards/lost_but_not_forgotten.lua new file mode 100644 index 00000000..9e2c5b4c --- /dev/null +++ b/mods/asuna/asuna_awards/awards/lost_but_not_forgotten.lua @@ -0,0 +1,16 @@ +return function(award) + minetest.override_item("lootchests_default:stone_chest",{ + on_rightclick = function(pos,node,clicker) + if clicker:is_player() then + awards.unlock(clicker:get_player_name(),award) + end + end, + }) + + return { + title = "Lost But Not Forgotten", + description = "Open an ancient stone chest", + difficulty = 240, + icon = "[inventorycube{lootchests_default_stone_chest_top.png{lootchests_default_stone_chest_front.png{lootchests_default_stone_chest_side.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/lucy_in_the_sky.lua b/mods/asuna/asuna_awards/awards/lucy_in_the_sky.lua new file mode 100644 index 00000000..dbbaaa44 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/lucy_in_the_sky.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Lucy in the Sky", + description = "Mine diamond ore", + difficulty = 205, + icon = "[inventorycube{default_stone.png&default_mineral_diamond.png{default_stone.png&default_mineral_diamond.png{default_stone.png&default_mineral_diamond.png", + trigger = { + type = "dig", + node = "default:stone_with_diamond", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/mightier_than_the_sword.lua b/mods/asuna/asuna_awards/awards/mightier_than_the_sword.lua new file mode 100644 index 00000000..5908b822 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/mightier_than_the_sword.lua @@ -0,0 +1,14 @@ +return function(award) + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "default:book" and fields.save and fields.title and fields.text then + awards.unlock(player:get_player_name(),award) + end + end) + + return { + title = "Mightier Than the Sword", + description = "Write a book", + difficulty = 135, + icon = "default_book_written.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/mod_soup.lua b/mods/asuna/asuna_awards/awards/mod_soup.lua new file mode 100644 index 00000000..e2abb31d --- /dev/null +++ b/mods/asuna/asuna_awards/awards/mod_soup.lua @@ -0,0 +1,30 @@ +return function(award) + -- Process all soup items + local goals = { target = 1 } + for _,item in ipairs({ + "farming:tomato_soup", + "ethereal:mushroom_soup", + "soup:chicken_noodle_soup", + "x_farming:beetroot_soup", + "farming:pea_soup", + "farming:onion_soup", + }) do + table.insert(goals,{ + description = "Cook " .. minetest.registered_items[item].description, + trigger = { + type = "craft", + target = 1, + item = item, + }, + }) + end + + -- Add triggers to award + return { + title = "Mod Soup", + description = "Cook any soup", + difficulty = 35, + icon = "chicken_noodle_soup.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/my_god_its_full_of_stars.lua b/mods/asuna/asuna_awards/awards/my_god_its_full_of_stars.lua new file mode 100644 index 00000000..3808ef3f --- /dev/null +++ b/mods/asuna/asuna_awards/awards/my_god_its_full_of_stars.lua @@ -0,0 +1,15 @@ +return function(award) + local ogtt = telemosaic.teleport + telemosaic.teleport = function(player,src,dst) + ogtt(player,src,dst) + awards.unlock(player:get_player_name(),award) + end + + return { + title = "My God, It's Full of Stars", + description = "Teleport using a teleportation beacon", + difficulty = 60, + icon = "[inventorycube{telemosaic_beacon_top.png{telemosaic_beacon_side.png{telemosaic_beacon_side.png", + condition = asuna.content.wayfarer.worldgate, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/net_worth.lua b/mods/asuna/asuna_awards/awards/net_worth.lua new file mode 100644 index 00000000..21b3e58d --- /dev/null +++ b/mods/asuna/asuna_awards/awards/net_worth.lua @@ -0,0 +1,23 @@ +return function(award) + for _,bug in ipairs({ + "fireflies:firefly", + "butterflies:butterfly_red", + "butterflies:butterfly_white", + "butterflies:butterfly_violet", + }) do + minetest.override_item(bug,{ + after_dig_node = function(pos,oldnode,oldmeta,digger) + if digger:is_player() and digger:get_wielded_item():get_name() == "fireflies:bug_net" then + awards.unlock(digger:get_player_name(),award) + end + end, + }) + end + + return { + title = "Net Worth", + description = "Use a bug net to catch a butterfly or a firefly", + difficulty = 55, + icon = "fireflies_bugnet.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/opalescent.lua b/mods/asuna/asuna_awards/awards/opalescent.lua new file mode 100644 index 00000000..e5eafc91 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/opalescent.lua @@ -0,0 +1,27 @@ +return function(award) + -- Process all applicable TMS opal + local goals = { target = 1 } + for _,node in ipairs({ + "too_many_stones:opal", + "too_many_stones:black_opal", + "too_many_stones:fire_opal", + }) do + table.insert(goals,{ + description = "Mine " .. minetest.registered_nodes[node].description, + trigger = { + type = "dig", + target = 1, + node = node, + }, + }) + end + + -- Add triggers to award + return { + title = "Opalescent", + description = "Mine any opal", + difficulty = 205, + icon = "[inventorycube{[combine:16x16:0,0=tms_opal_animated.png{[combine:16x16:0,0=tms_opal_animated.png{[combine:16x16:0,0=tms_opal_animated.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/paul_bunyan.lua b/mods/asuna/asuna_awards/awards/paul_bunyan.lua new file mode 100644 index 00000000..294018bd --- /dev/null +++ b/mods/asuna/asuna_awards/awards/paul_bunyan.lua @@ -0,0 +1,29 @@ +return function(award) + local goals = { + target = 25, + show_locked = false, + } + + for node,def in pairs(minetest.registered_nodes) do + local groups = def.groups + if groups and groups.tree and groups.tree > 0 then + table.insert(goals,{ + id = node:gsub(":","_"), + description = "Chop " .. def.description, + trigger = { + type = "dig", + target = 1, + node = node, + }, + }) + end + end + + return { + title = "Paul Bunyan", + description = "Chop " .. goals.target .. " different types of timber", + difficulty = 180, + icon = "[inventorycube{default_tree_top.png{default_tree.png{default_tree.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/play_that_funky_music.lua b/mods/asuna/asuna_awards/awards/play_that_funky_music.lua new file mode 100644 index 00000000..30728439 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/play_that_funky_music.lua @@ -0,0 +1,14 @@ +return function(award) + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "music_settings" and fields.play then + awards.unlock(player:get_player_name(),award) + end + end) + + return { + title = "Play That Funky Music", + description = "Use the music settings to play a music track", + difficulty = 4, + icon = "music_sfinv_buttons_icon.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/prometheus.lua b/mods/asuna/asuna_awards/awards/prometheus.lua new file mode 100644 index 00000000..40cd7930 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/prometheus.lua @@ -0,0 +1,18 @@ +return function(award) + local ogfsou = minetest.registered_items["fire:flint_and_steel"].on_use + minetest.override_item("fire:flint_and_steel",{ + on_use = function(itemstack,user,pointed_thing) + ogfsou(itemstack,user,pointed_thing) + if pointed_thing.type == "node" and minetest.get_node(pointed_thing.above).name:find("^fire:") then + awards.unlock(user:get_player_name(),award) + end + end + }) + + return { + title = "Prometheus", + description = "Start a fire using Flint and Steel", + difficulty = 240, + icon = "fire_flint_steel.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/put_a_cork_in_it.lua b/mods/asuna/asuna_awards/awards/put_a_cork_in_it.lua new file mode 100644 index 00000000..6e149a24 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/put_a_cork_in_it.lua @@ -0,0 +1,30 @@ +return function(award) + local goals = { + target = 25, + show_locked = false, + } + + for bottle,def in pairs(bottles.registered_filled_bottles) do + table.insert(goals,{ + id = bottle:gsub(":","_"), + description = def.description:split("\n")[1], + }) + end + + local ogbf = bottles.fill + bottles.fill = function(itemstack,placer,target) + local retval, bottle = ogbf(itemstack,placer,target) + if bottle then + awards.unlock(placer:get_player_name(),award,bottle:gsub(":","_")) + end + return retval + end + + return { + title = "Put a Cork in It", + description = "Fill bottles with " .. goals.target .. " different substances", + difficulty = 260, + icon = bottles.registered_filled_bottles["bottles:bottle_of_water"].image, + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/rare_earth.lua b/mods/asuna/asuna_awards/awards/rare_earth.lua new file mode 100644 index 00000000..256e7fe1 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/rare_earth.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Rare Earth", + description = "Mine mese ore", + difficulty = 200, + icon = "[inventorycube{default_stone.png&default_mineral_mese.png{default_stone.png&default_mineral_mese.png{default_stone.png&default_mineral_mese.png", + trigger = { + type = "dig", + node = "default:stone_with_mese", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/rarest_earth.lua b/mods/asuna/asuna_awards/awards/rarest_earth.lua new file mode 100644 index 00000000..2649fbb7 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/rarest_earth.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Rarest Earth", + description = "Mine a mese block", + difficulty = 250, + icon = "[inventorycube{default_mese_block.png{default_mese_block.png{default_mese_block.png", + trigger = { + type = "dig", + node = "default:mese_block", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/reach_for_the_sky.lua b/mods/asuna/asuna_awards/awards/reach_for_the_sky.lua new file mode 100644 index 00000000..3f83326f --- /dev/null +++ b/mods/asuna/asuna_awards/awards/reach_for_the_sky.lua @@ -0,0 +1,18 @@ +return function(award) + -- Register interval callback to look for nearby sequoia trunks + asuna_awards.register_on_interval(award,function(player) + local pos = player:get_pos() + local tree_nodes = minetest.find_nodes_in_area(pos:add(vector.new(-10,0,-10)),pos:add(vector.new(10,2,10)),{"everness:sequoia_tree"},false) + if #tree_nodes > 60 then + return award + end + end) + + -- Award definition + return { + title = "Reach for the Sky", + description = "Find a giant sequoia tree", + difficulty = 115, + icon = "everness_sequoia_tree_sapling.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/rock_on.lua b/mods/asuna/asuna_awards/awards/rock_on.lua new file mode 100644 index 00000000..d783f07a --- /dev/null +++ b/mods/asuna/asuna_awards/awards/rock_on.lua @@ -0,0 +1,29 @@ +return function(award) + local goals = { + target = 50, + show_locked = false, + } + + for node,def in pairs(minetest.registered_nodes) do + local groups = def.groups + if def.is_ground_content and groups and groups.stone and groups.stone > 0 then + table.insert(goals,{ + id = node:gsub(":","_"), + description = "Mine " .. def.description, + trigger = { + type = "dig", + target = 1, + node = node, + }, + }) + end + end + + return { + title = "Rock On", + description = "Mine " .. goals.target .. " different types of stone", + difficulty = 180, + icon = "[inventorycube{default_stone.png{default_stone.png{default_stone.png", + goals = goals, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/sixteen_tons.lua b/mods/asuna/asuna_awards/awards/sixteen_tons.lua new file mode 100644 index 00000000..5dc1951e --- /dev/null +++ b/mods/asuna/asuna_awards/awards/sixteen_tons.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Sixteen Tons", + description = "Mine coal ore", + difficulty = 20, + icon = "[inventorycube{default_stone.png&default_mineral_coal.png{default_stone.png&default_mineral_coal.png{default_stone.png&default_mineral_coal.png", + trigger = { + type = "dig", + node = "default:stone_with_coal", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/sleepy_hollow.lua b/mods/asuna/asuna_awards/awards/sleepy_hollow.lua new file mode 100644 index 00000000..261f2e51 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/sleepy_hollow.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Sleepy Hollow", + description = "Craft a pumpkin lantern", + difficulty = 60, + icon = "[inventorycube{x_farming_pumpkin_fruit_top.png{x_farming_pumpkin_fruit_side_on.png{x_farming_pumpkin_fruit_side.png", + trigger = { + type = "craft", + item = "x_farming:pumpkin_lantern", + target = 1, + } + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/slip_slidin_away.lua b/mods/asuna/asuna_awards/awards/slip_slidin_away.lua new file mode 100644 index 00000000..3e3049dc --- /dev/null +++ b/mods/asuna/asuna_awards/awards/slip_slidin_away.lua @@ -0,0 +1,26 @@ +return function(award) + -- Get set of slippery nodes + local slippery_nodes = {} + for node,def in pairs(minetest.registered_nodes) do + local groups = def.groups + if groups and groups.slippery and groups.slippery > 0 then + slippery_nodes[node] = true + end + end + + -- Register interval callback to check node below players + asuna_awards.register_on_interval(award,function(player) + local below = minetest.get_node(player:get_pos():add(vector.new(0,-1,0))).name + if below and slippery_nodes[below] then + return award + end + end) + + -- Award definition + return { + title = "Slip Slidin' Away", + description = "Walk on a slippery surface", + difficulty = 30, + icon = "[inventorycube{default_ice.png{default_ice.png{default_ice.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/strike_while_its_hot.lua b/mods/asuna/asuna_awards/awards/strike_while_its_hot.lua new file mode 100644 index 00000000..0f81b688 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/strike_while_its_hot.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Strike While It's Hot", + description = "Mine iron ore", + difficulty = 40, + icon = "[inventorycube{default_stone.png&default_mineral_iron.png{default_stone.png&default_mineral_iron.png{default_stone.png&default_mineral_iron.png", + trigger = { + type = "dig", + node = "default:stone_with_iron", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/super_mushroom.lua b/mods/asuna/asuna_awards/awards/super_mushroom.lua new file mode 100644 index 00000000..27fb7322 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/super_mushroom.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Super Mushroom", + description = "Mine a giant red mushroom cap", + difficulty = 35, + icon = "[inventorycube{ethereal_mushroom_block.png{ethereal_mushroom_block.png{ethereal_mushroom_block.png", + trigger = { + type = "dig", + node = "ethereal:mushroom", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/tarzan.lua b/mods/asuna/asuna_awards/awards/tarzan.lua new file mode 100644 index 00000000..c527fd95 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/tarzan.lua @@ -0,0 +1,20 @@ +return function(award) + -- Register interval callback to check y value + asuna_awards.register_on_interval(award,function(player) + local pos = player:get_pos() + if minetest.get_item_group(minetest.get_node(pos:add(vector.new(0,-0.5,0))).name,"leaves") > 0 then + local tree_nodes = minetest.find_nodes_in_area(pos:add(vector.new(-3,-3,-3)),pos:add(vector.new(3,3,3)),{"group:tree"},false) + if #tree_nodes > 1 and #minetest.find_nodes_in_area(pos:add(vector.new(0,-3,0)),pos,{"group:soil","group:stone"},false) == 0 then + return award + end + end + end) + + -- Award definition + return { + title = "Tarzan", + description = "Climb a tree", + difficulty = 20, + icon = "[inventorycube{default_leaves.png{default_leaves.png{default_leaves.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/the_careful_way_down.lua b/mods/asuna/asuna_awards/awards/the_careful_way_down.lua new file mode 100644 index 00000000..4cf705e5 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/the_careful_way_down.lua @@ -0,0 +1,17 @@ +return function(award) + -- Register interval callback to check node at each player's location + asuna_awards.register_on_interval(award,function(player) + local at = minetest.get_node(player:get_pos()).name + if at == "x_farming:rope" then + return award + end + end) + + -- Award definition + return { + title = "The Careful Way Down", + description = "Climb on a rope made from vines, hemp, or barley", + difficulty = 40, + icon = "x_farming_rope_item.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/the_easy_way_down.lua b/mods/asuna/asuna_awards/awards/the_easy_way_down.lua new file mode 100644 index 00000000..8d51fb5a --- /dev/null +++ b/mods/asuna/asuna_awards/awards/the_easy_way_down.lua @@ -0,0 +1,14 @@ +return function(award) + minetest.register_on_player_hpchange(function(player, hp_change, reason) + if reason.type == "fall" then + awards.unlock(player:get_player_name(),award) + end + end) + + return { + title = "The Easy Way Down", + description = "Take fall damage", + icon = "drop_btn.png", + condition = core.settings:get_bool("enable_damage"), + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/the_matrix_reloaded.lua b/mods/asuna/asuna_awards/awards/the_matrix_reloaded.lua new file mode 100644 index 00000000..5726c802 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/the_matrix_reloaded.lua @@ -0,0 +1,12 @@ +return function(award) + return { + title = "The Matrix Reloaded", + description = "Enter the world a second time", + difficulty = 5, + icon = "server_public.png", + trigger = { + type = "join", + target = 2, + } + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/the_new_hotness.lua b/mods/asuna/asuna_awards/awards/the_new_hotness.lua new file mode 100644 index 00000000..3b57a1af --- /dev/null +++ b/mods/asuna/asuna_awards/awards/the_new_hotness.lua @@ -0,0 +1,20 @@ +return function(award) + local ogbou = minetest.registered_craftitems["bucket:bucket_empty"].on_use + minetest.override_item("bucket:bucket_empty",{ + on_use = function(itemstack, player, pointed_thing) + local was_lava = pointed_thing.type == "node" and (minetest.get_node(pointed_thing.under).name == "default:lava_source") or false + local retval = ogbou(itemstack, player, pointed_thing) + if retval and was_lava and minetest.get_node(pointed_thing.under).name ~= "default:lava_source" then + awards.unlock(player:get_player_name(),award) + end + return retval + end, + }) + + return { + title = "The New Hotness", + description = "Collect a bucket of lava", + difficulty = 45, + icon = "bucket_lava.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/the_prestige.lua b/mods/asuna/asuna_awards/awards/the_prestige.lua new file mode 100644 index 00000000..49959dc0 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/the_prestige.lua @@ -0,0 +1,19 @@ +return function(award) + local ogacp = awards.clear_player + awards.clear_player = function(name) + local had_cosmopolitan = awards.player(name).unlocked["asuna_awards:cosmopolitan"] + local retval = ogacp(name) + if had_cosmopolitan then + awards.unlock(name,award) + end + return retval + end + + return { + title = "The Prestige", + description = "Reset your awards after earning Cosmopolitan", + difficulty = 1000, + icon = "cdb_update.png", + secret = true, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/timeless.lua b/mods/asuna/asuna_awards/awards/timeless.lua new file mode 100644 index 00000000..14c36b58 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/timeless.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Timeless", + description = "Mine quartz ore", + difficulty = 25, + icon = "[inventorycube{default_stone.png&everness_quartz_ore.png{default_stone.png&everness_quartz_ore.png{default_stone.png&everness_quartz_ore.png", + trigger = { + type = "dig", + node = "everness:quartz_ore", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/under_the_sea.lua b/mods/asuna/asuna_awards/awards/under_the_sea.lua new file mode 100644 index 00000000..8881e9b3 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/under_the_sea.lua @@ -0,0 +1,18 @@ +return function(award) + -- Register interval callback to check for deep water + asuna_awards.register_on_interval(award,function(player) + local pos = player:get_pos() + local y = pos.y + if y <= -20 and y >= -32 and minetest.get_node(pos).name:find("water") then + return award + end + end) + + -- Award definition + return { + title = "Under the Sea", + description = "Dive into deep ocean", + difficulty = 50, + icon = "bubble.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/way_down_hadestown.lua b/mods/asuna/asuna_awards/awards/way_down_hadestown.lua new file mode 100644 index 00000000..dfcca157 --- /dev/null +++ b/mods/asuna/asuna_awards/awards/way_down_hadestown.lua @@ -0,0 +1,16 @@ +return function(award) + -- Register interval callback to check y value + asuna_awards.register_on_interval(award,function(player) + if player:get_pos().y <= -1000 then + return award + end + end) + + -- Award definition + return { + title = "Way Down Hadestown", + description = "Reach a depth of -1000", + difficulty = 110, + icon = "everness_weeping_obsidian.png", + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/awards/worth_its_weight.lua b/mods/asuna/asuna_awards/awards/worth_its_weight.lua new file mode 100644 index 00000000..1b8532ef --- /dev/null +++ b/mods/asuna/asuna_awards/awards/worth_its_weight.lua @@ -0,0 +1,13 @@ +return function(award) + return { + title = "Worth Its Weight", + description = "Mine gold ore", + difficulty = 90, + icon = "[inventorycube{default_stone.png&default_mineral_gold.png{default_stone.png&default_mineral_gold.png{default_stone.png&default_mineral_gold.png", + trigger = { + type = "dig", + node = "default:stone_with_gold", + target = 1, + }, + } +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/init.lua b/mods/asuna/asuna_awards/init.lua new file mode 100644 index 00000000..fc99d9a2 --- /dev/null +++ b/mods/asuna/asuna_awards/init.lua @@ -0,0 +1,24 @@ +-- Globals +asuna_awards = { + awards = {}, +} + +-- Load awards after other mods are loaded if enabled +if asuna.content.wayfarer.awards then + minetest.register_on_mods_loaded(function() + local mpath = minetest.get_modpath("asuna_awards") + dofile(mpath .. "/register_on_interval.lua") + local awards_path = mpath .. "/awards/" + local award_files = minetest.get_dir_list(awards_path,false) + for i = 1, #award_files do + local file = award_files[i] + local award_name = "asuna_awards:" .. file:sub(1,-5) + local implementation = dofile(awards_path .. file) + local award_definition = implementation(award_name) + if award_definition.condition == nil or award_definition.condition then + asuna_awards.awards[award_name] = award_definition + awards.register_award(award_name,award_definition) + end + end + end) +end \ No newline at end of file diff --git a/mods/asuna/asuna_awards/mod.conf b/mods/asuna/asuna_awards/mod.conf new file mode 100644 index 00000000..11bdb8f1 --- /dev/null +++ b/mods/asuna/asuna_awards/mod.conf @@ -0,0 +1,5 @@ +name = asuna_awards +title = Asuna Awards +description = Adds awards to Asuna using the Awards mod +author = EmptyStar +depends = asuna_core, awards, bottles, ethereal, everness, naturalbiomes, caverealms, lootchests_default, too_many_stones, flowerpot \ No newline at end of file diff --git a/mods/asuna/asuna_awards/register_on_interval.lua b/mods/asuna/asuna_awards/register_on_interval.lua new file mode 100644 index 00000000..0ea7018c --- /dev/null +++ b/mods/asuna/asuna_awards/register_on_interval.lua @@ -0,0 +1,31 @@ +-- Settings +local INTERVAL = 1 + +-- Register interval callbacks +local interval_callbacks = {} +function asuna_awards.register_on_interval(award,fn) + table.insert(interval_callbacks,{ + award = award, + fn = fn, + }) +end + +-- Do callbacks at regular intervals +local function analyze_players() + for _,player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local award_data = awards.player(name) + for _,callback in ipairs(interval_callbacks) do + if not award_data.unlocked[callback.award] then + local award, goal = callback.fn(player) + if award then + awards.unlock(name,award,goal) + end + end + end + end + minetest.after(INTERVAL,analyze_players) +end + +-- Start intervals +minetest.after(INTERVAL,analyze_players) \ No newline at end of file diff --git a/mods/asuna/asuna_core/LICENSE b/mods/asuna/asuna_core/LICENSE new file mode 100644 index 00000000..1dc59eaf --- /dev/null +++ b/mods/asuna/asuna_core/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright © 2024 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mods/asuna/asuna_core/biomes.lua b/mods/asuna/asuna_core/biomes.lua new file mode 100644 index 00000000..78df1301 --- /dev/null +++ b/mods/asuna/asuna_core/biomes.lua @@ -0,0 +1,1333 @@ +--[[ + Biome definitions +]] + +asuna.biomes = { + mountain = { + name = "Mountain", + heat = 50, + humidity = 50, + y_min = -31000, + y_max = -31000, + nodes = { + "default:snow", 1, + "default:snowblock", 2, + }, + flowers = {}, + mushrooms = {}, + animals = {"sheep","reindeer"}, + crops = {}, + shore = "default:sand", + seabed = "default:sand", + ocean = "bare", + cave = "none", + }, + + grassland = { + name = "Grassland", + heat = 51, + humidity = 54, + y_min = 4, + y_max = 31000, + y_blend = 4, + nodes = { + "default:dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"blue","cyan","white","red","purple","orange","pink","yellow"}, + mushrooms = {}, + animals = {"chicken","cow","horse","pig","sheep"}, + crops = {"cucumber","spinach","eggplant","tomato","strawberry","parsley","corn","beans","lettuce"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "bamboo", + }, + + underground = { + name = "Underground", + heat = 50, + humidity = 50, + y_min = -31000, + y_max = -31000, + nodes = { + "default:stone", 1, + "default:stone", 1, + }, + flowers = {}, + mushrooms = {}, + animals = {"bat"}, + crops = {}, + shore = "default:sand", + seabed = "default:sand", + ocean = "bare", + cave = "none", + }, + + plains = { + name = "Plains", + heat = 54, + humidity = 32, + y_min = 4, + y_max = 31000, + y_blend = 4, + nodes = { + "default:dry_dirt_with_dry_grass", 1, + "default:dry_dirt", 3, + }, + flowers = {"yellow","white"}, + mushrooms = {}, + animals = {"chicken","horse","pig","cow"}, + crops = {"corn","wheat","cotton","pumpkin","barley"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "dry", + dungeon = "travertine", + }, + + prairie = { + name = "Prairie", + heat = 47, + humidity = 47, + y_min = 4, + y_max = 31000, + y_blend = 4, + nodes = { + "prairie:prairie_dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {}, + mushrooms = {}, + animals = {"chicken","owl","bird","rat","sheep","cow"}, + crops = {"cucumber","eggplant","tomato","strawberry","lettuce","vanilla","peas","rhubarb","grapes"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "dorwinion", + }, + + dorwinion = { + name = "Dorwinion", + heat = 51, + humidity = 45, + y_min = 4, + y_max = 31000, + nodes = { + "dorwinion:dorwinion_grass", 1, + "dorwinion:dorwinion", 5, + }, + flowers = {"red","white"}, + mushrooms = {"brown"}, + animals = {"owl","rat","bird","sheep","cat"}, + crops = {"cucumber","strawberry","parsley","garlic","peas","rhubarb","tomato","raspberry"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + dungeon = { + node = "dorwinion:dorwinion_brick_with_moss", + alt = "dorwinion:dorwinion_brick", + stair = "stairs:stair_dorwinion_brick", + }, + cave = "dorwinion", + }, + + quicksand = { + name = "Quicksand", + heat = 72, + humidity = 92, + y_min = 0, + y_max = 0, + nodes = { + "ethereal:quicksand2", 2, + "ethereal:quicksand2", 2, + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "fungal", + dungeon = "mudstone", + y_blend = 1, + }, + + ["naturalbiomes:alpine"] = { + name = "Alpine", + heat = 25, + humidity = 35, + y_min = 4, + y_max = 31000, + nodes = { + "naturalbiomes:alpine_litter", 1, + "naturalbiomes:alpine_rock", 32, + }, + flowers = {"black","yellow","cyan","white"}, + mushrooms = {"brown"}, + animals = {"fox","owl","pig","sheep","turkey","wolf","cow","bird","grizzly_bear"}, + crops = {"spinach","beetroot","potato","carrot","onion","pine_nut"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "cold", + cave = "moss", + dungeon = "granite_white", + }, + + desert = { + name = "Desert", + heat = 52, + humidity = 11, + y_min = 4, + y_max = 31000, + y_blend = 6, + nodes = { + "default:desert_sand", 1, + "default:desert_sand", 3, + "default:desert_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {"cactus"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + dungeon = { + node = "default:sandstonebrick", + alt = "default:sandstonebrick", + stair = "stairs:stair_sandstonebrick", + }, + cave = "coal", + }, + + fiery = { + name = "Fiery", + heat = 86, + humidity = 3, + y_min = 4, + y_max = 46, + y_blend = 2, + nodes = { + "ethereal:fiery_dirt", 1, + "default:dirt", 3, + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {"obsidian_wart"}, + shore = "default:sandstone", + seabed = "default:sand", + ocean = "temperate", + cave = "fire", + dungeon = "basalt", + }, + + ["everness:forsaken_desert"] = { + name = "Forsaken Desert", + heat = 95, + humidity = 25, + y_min = 4, + y_max = 31000, + nodes = { + "everness:forsaken_desert_sand", 1, + "everness:forsaken_desert_sand", 1, + "everness:forsaken_desert_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {"cactus"}, + shore = "everness:dry_ocean_dirt", + seabed = "everness:dry_ocean_dirt", + ocean = "forsaken_desert", + cave = "forsaken_desert", + dungeon = { + node = "everness:forsaken_desert_brick", + alt = "everness:forsaken_desert_brick_red", + stair = "stairs:stair_forsaken_desert_brick", + }, + }, + + ["naturalbiomes:outback"] = { + name = "Outback", + heat = 83, + humidity = 35, + y_min = 4, + y_max = 31000, + nodes = { + "naturalbiomes:outback_litter", 1, + "naturalbiomes:outback_ground", 32, + "default:desert_stone", + }, + flowers = {"yellow","red","white"}, + mushrooms = {}, + animals = {"horse","bird"}, + crops = {"kiwi"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "forsaken_desert", + dungeon = "gabbro", + }, + + ["naturalbiomes:bushland"] = { + name = "Bushland", + heat = 80, + humidity = 46, + y_min = 4, + y_max = 31000, + nodes = { + "naturalbiomes:bushland_bushlandlitter", 1, + "default:dirt", 3, + extra = {"naturalbiomes:bushland_bushlandlitter2","naturalbiomes:bushland_bushlandlitter3",} + }, + flowers = {"green","black","white"}, + mushrooms = {}, + animals = {"bird","chicken","pig","sheep","cat"}, + crops = {"kiwi","strawberry","cotton","onion","hemp","rhubarb","parsley","spinach","grapes","raspberry"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "moss", + dungeon = "sandstone", + }, + + ["naturalbiomes:heath"] = { + name = "Heath", + heat = 46, + humidity = 64, + y_min = 1, + y_max = 31000, + nodes = { + "naturalbiomes:heath_litter", 1, + "default:sand", 3, + extra = {"naturalbiomes:heath_litter2","naturalbiomes:heath_litter3"}, + }, + flowers = {"white","pink","purple"}, + mushrooms = {}, + animals = {"bird","cow","chicken","sheep","owl","cat"}, + crops = {"strawberry","rice","rhubarb","vanilla","garlic","parsley","peas","grapes"}, + shore = "default:sand", + seabed = "default:clay", + ocean = "temperate", + cave = "bamboo", + dungeon = "galena", + }, + + sandstone_desert = { + name = "Sandstone Desert", + heat = 74, + humidity = 7, + y_min = 4, + y_max = 31000, + nodes = { + "default:sand", 1, + "default:sandstone", 32, + "default:desert_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {"cactus"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "coal", + dungeon = { + node = "default:sandstonebrick", + alt = "default:sandstonebrick", + stair = "stairs:stair_sandstonebrick", + }, + }, + + savanna = { + name = "Savanna", + heat = 58, + humidity = 24, + y_min = 4, + y_max = 31000, + nodes = { + "naturalbiomes:savannalitter", 1, + "default:dirt", 3, + extra = {"default:dry_dirt_with_dry_grass"}, + }, + flowers = {"orange","yellow"}, + mushrooms = {}, + animals = {"horse","cat","chicken","bird"}, + crops = {"cotton","kiwi","pepper","artichoke"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "dry", + dungeon = "travertine", + }, + + ["naturalbiomes:mediterranean"] = { + name = "Mediterranean", + heat = 82, + humidity = 48, + y_min = 4, + y_max = 31000, + nodes = { + "naturalbiomes:mediterran_litter", 1, + "naturalbiomes:mediterran_rock", 16, + }, + flowers = {"green","white","purple","black"}, + mushrooms = {}, + animals = {"bird","cat","chicken"}, + crops = {"cotton","chili","pepper","tomato","artichoke","parsley","garlic","peas","grapes"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "dry", + dungeon = "marble", + }, + + mushroom = { + name = "Mushroom", + heat = 73, + humidity = 94, + y_min = 4, + y_max = 31000, + y_blend = 4, + nodes = { + "ethereal:mushroom_dirt", 1, + "default:dirt", 3, + }, + flowers = {}, + mushrooms = {}, -- special mushrooms set in decor.lua + animals = {}, + crops = {"hemp"}, + shore = "default:clay", + seabed = "default:sand", + ocean = "temperate", + cave = "fungal", + dungeon = "sugilite", + }, + + swamp = { + name = "Swamp", + heat = 77, + humidity = 72, + y_min = 1, + y_max = 31000, + nodes = { + "default:dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"yellow","green","orange","black"}, + mushrooms = {"brown","red"}, + animals = {"frog","owl","rat","bird"}, + crops = {"beetroot","rice","onion","mint","asparagus","soybean","cabbage","hemp","peas"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "fungal", + dungeon = { + node = "default:mossycobble", + alt = "default:mossycobble", + stair = "stairs:stair_mossycobble", + }, + }, + + marsh = { + name = "Marsh", + heat = 73, + humidity = 93, + y_min = 1, + y_max = 24, + y_blend = 4, + nodes = { + "default:dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"yellow","green","orange","black"}, + mushrooms = {"brown","red"}, + animals = {"frog"}, + crops = {"rice","onion","mint","asparagus","peas"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "fungal", + dungeon = { + node = "default:mossycobble", + alt = "default:mossycobble", + stair = "stairs:stair_mossycobble", + }, + }, + + ["everness:bamboo_forest"] = { + name = "Bamboo Forest", + heat = 48, + humidity = 99, + y_min = 4, + y_max = 31000, + nodes = { + "everness:dirt_with_grass_1", 1, + "everness:dirt_1", 3, + }, + flowers = {"purple","orange"}, + mushrooms = {"brown","red"}, + animals = {"bird","cat","chicken","frog","pig","rat"}, + crops = {"melon","pepper","mint","ginger","cabbage"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "bamboo", + dungeon = "granite_gray", + }, + + japaneseforest = { + name = "Japanese Forest", + heat = 39, + humidity = 75, + y_min = 4, + y_max = 31000, + nodes = { + "japaneseforest:japanese_dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"orange","pink","red","purple"}, + mushrooms = {}, + animals = {"fox","owl","rat","bird"}, + crops = {"rice","soybean","ginger","garlic","cabbage","peas"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "bamboo", + dungeon = "howlite", + }, + + nightshade = { + name = "Nightshade", + heat = 28, + humidity = 68, + y_min = 4, + y_max = 31000, + nodes = { + "nightshade:nightshade_dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"black"}, + mushrooms = {"odd","red"}, + animals = {"bat","owl"}, + crops = {"potato","pumpkin","onion"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "coral_forest", + dungeon = "soapstone", + }, + + grassytwo = { + name = "Birch Forest", + heat = 35, + humidity = 40, + y_min = 4, + y_max = 31000, + y_blend = 4, + nodes = { + "default:dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"blue","cyan","white","red","purple","orange","pink","yellow"}, + mushrooms = {}, + animals = {"chicken","cow","horse","pig","rat","owl","bird","sheep"}, + crops = {"carrot","potato","strawberry","pumpkin","onion","eggplant","beans","lettuce","raspberry"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "moss", + }, + + mesa = { + name = "Mesa", + heat = 36, + humidity = 15, + y_min = 4, + y_max = 31000, + nodes = { + "default:dirt_with_dry_grass", 1, + "bakedclay:orange", 15, + "default:desert_stone", + }, + flowers = {"yellow","orange","white"}, + mushrooms = {}, + animals = {"chicken","cow","horse","owl","rat"}, + crops = {"chili","pepper"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "dry", + dungeon = { + node = "default:sandstonebrick", + alt = "default:sandstonebrick", + stair = "stairs:stair_sandstonebrick", + }, + }, + + jumble = { + name = "Jumble", + heat = 56, + humidity = 93, + y_min = 4, + y_max = 31000, + nodes = { + "default:dirt_with_rainforest_litter", 1, + "default:dirt", 3, + }, + flowers = {"yellow","green","orange","black"}, + mushrooms = {"brown","red","odd"}, + animals = {"frog","owl","rat","bird"}, + crops = {"potato","carrot","onion","spinach","eggplant","cabbage","asparagus","pepper"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "fungal", + dungeon = { + node = "default:mossycobble", + alt = "default:mossycobble", + stair = "stairs:stair_mossycobble", + }, + }, + + deciduous_forest = { + name = "Deciduous Forest", + heat = 37, + humidity = 52, + y_min = 4, + y_max = 192, + nodes = { + "default:dirt_with_grass", 1, + "default:dirt", 3, + }, + flowers = {"blue","white","yellow"}, + mushrooms = {"brown"}, + animals = {"chicken","pig","owl","rat","bird"}, + crops = {"carrot","strawberry","onion","cucumber","spinach","eggplant","lettuce","parsley","raspberry"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "bamboo", + }, + + bamboo = { + name = "Bamboo", + heat = 44, + humidity = 75, + y_min = 4, + y_max = 31000, + y_blend = 6, + nodes = { + "ethereal:bamboo_dirt", 1, + "default:dirt", 3, + }, + flowers = {"pink","white","orange"}, + mushrooms = {}, + animals = {"chicken","fox","pig","sheep","bird"}, + crops = {"rice","soybean","ginger","rhubarb","strawberry","garlic","lettuce","vanilla","grapes"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "bamboo", + dungeon = "howlite", + }, + + rainforest = { + name = "Rainforest", + heat = 89, + humidity = 77, + y_min = 4, + y_max = 31000, + nodes = { + "default:dirt_with_rainforest_litter", 1, + "default:dirt", 3, + }, + flowers = {"blue","purple","orange","black"}, + mushrooms = {"brown","odd"}, + animals = {"bird","cat","chicken","pig","rat","frog"}, + crops = {"melon","stevia","cocoa","coffee","artichoke","hemp","pineapple","rhubarb"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "tropical", + cave = "mineral_waters", + cave_stone = "everness:mineral_cave_stone", + dungeon = "serpentine", + }, + + ["livingjungle:jungle"] = { + name = "Living Jungle", + heat = 90, + humidity = 89, + y_min = 1, + y_max = 31000, + nodes = { + "livingjungle:jungleground", 1, + "default:dirt", 6, + }, + flowers = {"purple","green","black"}, + mushrooms = {"brown","odd"}, + animals = {"bird","cat","frog","pig","rat","frog"}, + crops = {"melon","stevia","coffee","artichoke","mint","hemp","pineapple","rhubarb"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "tropical", + cave = "bamboo", + dungeon = "serpentine", + }, + + grove = { + name = "Grove", + heat = 82, + humidity = 65, + y_min = 4, + y_max = 31000, + y_blend = 2, + nodes = { + "ethereal:grove_dirt", 1, + "default:dirt", 3, + }, + flowers = {"blue","orange","black","green"}, + mushrooms = {}, + animals = {"bird","chicken","pig","cow","cat"}, + crops = {"stevia","coffee","kiwi","artichoke","pepper","chili","parsley","pineapple","hemp","melon","soybean","vanilla","grapes"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "tropical", + cave = "moss", + dungeon = "mudstone", + }, + + ["naturalbiomes:alderswamp"] = { + name = "Alder Swamp", + heat = 59, + humidity = 79, + y_min = 1, + y_max = 31000, + y_blend = 4, + nodes = { + "naturalbiomes:alderswamp_litter", 1, + "naturalbiomes:alderswamp_dirt", 3, + }, + flowers = {"yellow","green"}, + mushrooms = {"brown","red","odd"}, + animals = {"frog","owl","rat","bird"}, + crops = {"rice","onion","mint","asparagus","hemp"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "temperate", + cave = "fungal", + dungeon = { + node = "default:mossycobble", + alt = "default:mossycobble", + stair = "stairs:stair_mossycobble", + }, + }, + + badland = { + name = "Badland", + heat = 19, + humidity = 65, + y_min = 4, + y_max = 31000, + nodes = { + "badland:badland_grass", 1, + "default:dirt", 3, + }, + flowers = {}, + mushrooms = {"brown"}, + animals = {"chicken","fox","owl","pig","rat","turkey","bat"}, + crops = {"carrot","beetroot","potato","corn","barley","beans","wheat"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "cold", + cave = "cursed_lands", + dungeon = "slate", + }, + + grayness = { + name = "Gray Lands", + heat = 21, + humidity = 12, + y_min = 4, + y_max = 31000, + nodes = { + "ethereal:gray_dirt", 1, + "default:silver_sand", 5, + }, + flowers = {"white","cyan"}, + mushrooms = {"brown"}, + animals = {"reindeer","turkey","sheep","grizzly_bear"}, + crops = {}, + shore = "default:silver_sand", + seabed = "default:silver_sand", + ocean = "cold", + cave = "frosted_icesheet", + dungeon = "silver_sandstone", + }, + + coniferous_forest = { + name = "Coniferous Forest", + heat = 20, + humidity = 41, + y_min = 4, + y_max = 48, + nodes = { + "default:dirt_with_coniferous_litter", 1, + "default:dirt", 3, + }, + flowers = {"white","green","cyan"}, + mushrooms = {"brown"}, + animals = {"fox","owl","sheep","turkey","wolf","grizzly_bear"}, + crops = {"carrot","potato","pine_nut","onion","beetroot"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "cold", + cave = "moss", + dungeon = "granite_white", + }, + + taiga = { + name = "Taiga", + heat = 20, + humidity = 41, + y_min = 49, + y_max = 31000, + nodes = { + "default:dirt_with_snow", 1, + "default:dirt", 3, + }, + flowers = {"white","green","cyan"}, + mushrooms = {"brown"}, + animals = {"fox","owl","sheep","turkey","wolf","grizzly_bear"}, + crops = {"carrot","potato","pine_nut","onion","beetroot"}, + shore = "default:sand", + seabed = "default:sand", + ocean = "cold", + cave = "moss", + dungeon = "granite_white" + }, + + glacier = { + name = "Glacier", + heat = 2, + humidity = 47, + y_min = 1, + y_max = 31000, + nodes = { + "default:snowblock", 1, + "default:snowblock", 3, + "default:stone", + "default:snowblock", + }, + flowers = {}, + mushrooms = {}, + animals = {"grizzly_bear"}, + crops = {}, + shore = "default:cave_ice", + seabed = "default:sand", + ocean = "frozen", + cave = "frosted_icesheet", + dungeon = "howlite", + }, + + frost_land = { + name = "Frost Land", + heat = 10, + humidity = 80, + y_min = 4, + y_max = 31000, + nodes = { + "frost_land:frost_land_grass", 1, + "default:dirt", 3, + "default:cave_ice", + "default:snow", + }, + flowers = {}, + mushrooms = {}, + animals = {"fox","owl","turkey","wolf","reindeer","grizzly_bear"}, + crops = {}, + shore = "default:cave_ice", + seabed = "default:sand", + ocean = "frozen", + cave = "frosted_icesheet", + dungeon = "granite_blue", + }, + + tundra = { + name = "Tundra", + heat = -1, + humidity = 20, + y_min = 4, + y_max = 40, + y_blend = 2, + nodes = { + "default:permafrost_with_stones", 1, + "default:permafrost", 1, + }, + flowers = {}, + mushrooms = {}, + animals = {"grizzly_bear"}, + crops = {}, + shore = "default:gravel", + seabed = "default:sand", + ocean = "bare", + cave = "frosted_icesheet", + dungeon = "granite_gray", + }, + + tundra_highland = { + name = "Tundra Highland", + heat = -1, + humidity = 20, + y_min = 41, + y_max = 192, + nodes = { + "default:permafrost_with_stones", 1, + "default:permafrost", 1, + "default:stone", + "default:snow", + }, + flowers = {}, + mushrooms = {}, + animals = {"grizzly_bear"}, + crops = {}, + shore = "default:gravel", + seabed = "default:sand", + ocean = "bare", + cave = "frosted_icesheet", + dungeon = "granite_black", + }, + + ["everness:forsaken_tundra"] = { + name = "Forsaken Tundra", + heat = 22, + humidity = 9, + y_min = 4, + y_max = 31000, + nodes = { + "everness:forsaken_tundra_dirt", 1, + "everness:forsaken_tundra_dirt", 1, + "everness:forsaken_tundra_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {}, + shore = "everness:forsaken_tundra_beach_sand", + seabed = "everness:forsaken_tundra_beach_sand", + ocean = "forsaken_tundra", + cave = "forsaken_tundra", + dungeon = { + node = "everness:forsaken_tundra_cobble", + alt = "everness:forsaken_tundra_brick", + stair = "stairs:stair_forsaken_tundra_cobble", + }, + }, + + frost = { + name = "Frost", + heat = 8, + humidity = 91, + y_min = 4, + y_max = 31000, + nodes = { + "ethereal:crystal_dirt", 1, + "default:dirt", 3, + "default:cave_ice", + "default:snow", + }, + flowers = {}, + mushrooms = {}, + animals = {"fox","owl","turkey","wolf","reindeer","grizzly_bear"}, + crops = {}, + shore = "default:cave_ice", + seabed = "default:sand", + ocean = "frozen", + cave = "crystal_forest", + dungeon = "granite_blue", + }, + + ["everness:frosted_icesheet"] = { + name = "Frosted Icesheet", + heat = 1, + humidity = 59, + y_min = 4, + y_max = 31000, + nodes = { + "everness:frosted_snowblock", 1, + "everness:frosted_snowblock", 3, + "everness:frosted_cave_ice", + }, + flowers = {}, + mushrooms = {}, + animals = {"grizzly_bear"}, + crops = {}, + shore = "default:cave_ice", + seabed = "default:cave_ice", + ocean = "frozen", + cave = "frosted_icesheet", + dungeon = { + node = "everness:icecobble", + alt = "everness:snowcobble", + stair = "stairs:stair_ice", + }, + }, + + ["everness:cursed_lands"] = { + name = "Cursed Lands", + heat = 63, + humidity = 81, + y_min = 1, + y_max = 31000, + nodes = { + "everness:dirt_with_cursed_grass", 1, + "everness:cursed_dirt", 3, + "everness:cursed_stone_carved", + }, + flowers = {"black","green"}, + mushrooms = {"red"}, + animals = {"bat","owl","frog"}, + crops = {"pumpkin","soybean","onion"}, + shore = "everness:cursed_stone", + seabed = "everness:cursed_stone", + deep_seabed = "everness:cursed_lands_deep_ocean_sand", + ocean = "cursed_lands", + cave = "cursed_lands", + dungeon = { + node = "everness:cursed_brick", + alt = "everness:cursed_brick_with_growth", + stair = "stairs:stair_cursed_brick", + }, + }, + + ["everness:crystal_forest"] = { + name = "Crystal Forest", + heat = 22, + humidity = 98, + y_min = 4, + y_max = 31000, + nodes = { + "everness:dirt_with_crystal_grass", 1, + "everness:crystal_dirt", 3, + "everness:crystal_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {}, + shore = "everness:crystal_sand", + seabed = "everness:crystal_sand", + deep_seabed = "everness:crystal_forest_deep_ocean_sand", + ocean = "crystal_forest", + cave = "crystal_forest", + dungeon = { + node = "everness:crystal_cobble", + alt = "everness:crystal_stone_brick", + stair = "everness:stair_crystal_cobble", + }, + }, + + ["everness:coral_forest"] = { + name = "Coral Forest", + heat = 24, + humidity = 74, + y_min = 4, + y_max = 31000, + nodes = { + "everness:dirt_with_coral_grass", 1, + "everness:coral_dirt", 3, + "everness:coral_desert_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {}, + shore = "everness:coral_white_sand", + seabed = "everness:coral_white_sand", + deep_seabed = "everness:coral_forest_deep_ocean_sand", + ocean = "coral_forest", + cave = "coral_forest", + dungeon = { + node = "everness:coral_desert_stone_block", + alt = "everness:coral_desert_stone_brick", + stair = "stairs:stair_coral_desert_stone_block", + }, + }, + + ["everness:mineral_waters"] = { + name = "Mineral Waters", + heat = 98, + humidity = 56, + y_min = 4, + y_max = 31000, + nodes = { + "everness:mineral_sand", 1, + "everness:mineral_stone", 1, + "everness:mineral_stone", + }, + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {}, + shore = "everness:mineral_sand", + seabed = "everness:mineral_sand", + deep_seabed = "everness:mineral_sand", + ocean = "tropical", + cave = "mineral_waters", + cave_stone = "everness:mineral_cave_stone", + dungeon = { + node = "everness:mineral_stone_brick", + alt = "everness:mineral_stone_brick_with_growth", + stair = "stairs:stair_mineral_stone_brick", + }, + }, +} + +--[[ + Biome groups +]] + +asuna.biome_groups = { + all = {}, + base = {}, + shore = {}, + below = {}, + ocean = {}, +} + +-- Generate dungeon definitions, shore biomes, and below ground biomes from base biomes +local supplementary_biomes = {} +for biome,def in pairs(asuna.biomes) do + -- Add to base biome group + table.insert(asuna.biome_groups.base,biome) + table.insert(asuna.biome_groups.all,biome) + + -- If no dungeon overrides are defined + if not def.dungeon then + def.dungeon = { + node = "default:cobble", + alt = "default:mossycobble", + stair = "stairs:stair_cobble", + } + elseif type(def.dungeon) == "string" then + def.dungeon = { + node = "too_many_stones:" .. def.dungeon .. "_brick", + alt = "too_many_stones:" .. def.dungeon .. "_cracked_brick", + stair = "stairs:stair_" .. def.dungeon .. "_brick", + } + end + + -- If no deep seabed is defined + if not def.deep_seabed then + def.deep_seabed = def.seabed + end + + -- Generate shore biome if the biome should have a proper shore + if def.y_min <= 4 and def.y_min >= 1 then + local shore_name = biome .. "_shore" + table.insert(asuna.biome_groups.shore,shore_name) + supplementary_biomes[shore_name] = { + name = def.name .. " Shore", + heat = def.heat, + humidity = def.humidity, + y_min = 0, + y_max = def.y_min - 1, + y_blend = 1, + nodes = { + def.shore, 1, + def.nodes[5] or "default:stone", def.nodes[4] - 1, + def.nodes[5] or "default:stone", + }, + flowers = {}, + mushrooms = {}, + animals = def.ocean == "tropical" and {"tropical_fish"} or {}, + crops = def.crops, + shore = def.shore, + seabed = def.seabed, + deep_seabed = def.deep_seabed, + ocean = def.ocean, + dungeon = def.dungeon, + cave = def.cave, + } + end + + -- Generate below biome if the biome should have a below biome + if def.y_min < 100 and def.y_min > -1 and def.y_max > 10 then + local below_name = biome .. "_below" + local ocean_group_name = "ocean_" .. def.ocean + table.insert(asuna.biome_groups.below,below_name) + + -- Ocean biome groups + local ocean_group = asuna.biome_groups[ocean_group_name] or {} + table.insert(ocean_group,below_name) + asuna.biome_groups[ocean_group_name] = ocean_group + + local below_stone = def.cave_stone or "default:stone" + supplementary_biomes[below_name] = { + name = def.name .. " Below", + heat = def.heat, + humidity = def.humidity, + y_min = -31000, + y_max = -1, + nodes = { + below_stone, 0, + below_stone, 0, + below_stone, + }, + flowers = {}, + mushrooms = {}, + animals = def.ocean == "tropical" and {"bat","tropical_fish"} or {"bat"}, + crops = {}, + shore = def.shore, + seabed = def.seabed, + deep_seabed = def.deep_seabed, + ocean = def.ocean, + dungeon = def.dungeon, + cave = def.cave, + } + end +end + +-- Add supplementary biomes +for biome,def in pairs(supplementary_biomes) do + table.insert(asuna.biome_groups.all,biome) + asuna.biomes[biome] = def +end + +--[[ + Biome feature groups +]] + +asuna.features = { + flowers = {}, + mushrooms = {}, + animals = {}, + crops = {}, + shore = {}, + seabed = {}, + ocean = {}, + cave = {}, +} + +for biome,def in pairs(asuna.biomes) do + for feature,group in pairs(asuna.features) do + local values = def[feature] + if type(values) ~= "table" then + local members = group[values] or {} + table.insert(members,biome) + group[values] = members + else + for _,value in ipairs(def[feature]) do + local members = group[value] or {} + table.insert(members,biome) + group[value] = members + end + end + end +end + +--[[ + Biome support functions +]] + +-- Generate a Minetest biome definition from Asuna data +for biome,def in pairs(asuna.biomes) do + local frozen_ocean = def.ocean == "frozen" and true or false + local mtbiomedef = { + name = biome, + heat_point = def.heat, + humidity_point = def.humidity, + y_min = def.y_min, + y_max = def.y_max, + vertical_blend = def.y_blend or 0, + node_top = def.nodes[1], + depth_top = def.nodes[2], + node_filler = def.nodes[3], + depth_filler = def.nodes[4], + node_stone = def.nodes[5] or "default:stone", + node_dust = def.nodes[6], + node_water_top = frozen_ocean and "default:ice" or nil, + depth_water_top = frozen_ocean and 3 or nil, + node_riverbed = def.seabed, + depth_riverbed = 2, + node_dungeon = def.dungeon.node, + node_dungeon_alt = def.dungeon.alt, + node_dungeon_stair = def.dungeon.stair, + } + def.generate_definition = function() + return mtbiomedef + end +end + +-- Inject a Minetest decoration definition with feature group biome data +for feature,groups in pairs(asuna.features) do + for group,biomes in pairs(groups) do + local surface_nodes = {} + local only_biomes = {} + for _,biome in ipairs(biomes) do + surface_nodes[asuna.biomes[biome].nodes[1]] = true + table.insert(only_biomes,biome) + end + local surface_array = {} + for node,_ in pairs(surface_nodes) do + table.insert(surface_array,node) + end + biomes.inject_decoration = function(mtdecorationdef) + mtdecorationdef.biomes = mtdecorationdef.biomes or only_biomes + mtdecorationdef.place_on = mtdecorationdef.place_on or surface_array + return mtdecorationdef + end + end +end + +-- Inject a Minetest decoration definition with biome group data +for name,group in pairs(asuna.biome_groups) do + local surface_nodes = {} + local only_biomes = {} + for _,biome in ipairs(group) do + surface_nodes[asuna.biomes[biome].nodes[1]] = true + table.insert(only_biomes,biome) + end + local surface_array = {} + for node,_ in pairs(surface_nodes) do + table.insert(surface_array,node) + end + group.inject_decoration = function(mtdecorationdef) + mtdecorationdef.biomes = mtdecorationdef.biomes or only_biomes + mtdecorationdef.place_on = mtdecorationdef.place_on or surface_array + return mtdecorationdef + end +end + +-- Override biome registration function to prevent duplicate biome registrations +local no_biome_mods = { + default = true, + ethereal = true, + everness = true, + livingjungle = true, + naturalbiomes = true, +} +local mtrb = minetest.register_biome +minetest.register_biome = function(def) + if minetest.registered_biomes[def.name] or no_biome_mods[minetest.get_current_modname()] then + return minetest.get_biome_id(def.name) + else + return mtrb(def) + end +end + +-- Register all biomes beginning with base biomes +for _,biome in ipairs(asuna.biome_groups.base) do + minetest.register_biome(asuna.biomes[biome].generate_definition()) +end + +for _,biome in ipairs(asuna.biome_groups.shore) do + minetest.register_biome(asuna.biomes[biome].generate_definition()) +end + +for _,biome in ipairs(asuna.biome_groups.below) do + minetest.register_biome(asuna.biomes[biome].generate_definition()) +end \ No newline at end of file diff --git a/mods/asuna/asuna_core/caves.lua b/mods/asuna/asuna_core/caves.lua new file mode 100644 index 00000000..989f9e0a --- /dev/null +++ b/mods/asuna/asuna_core/caves.lua @@ -0,0 +1,38 @@ +minetest.set_mapgen_setting("mgv7_cave_width",0.0415,true) +minetest.set_mapgen_setting("mgv7_cavern_limit",-48,true) +minetest.set_mapgen_setting("mgv7_cavern_taper",64,true) +minetest.set_mapgen_setting("mgv7_cavern_threshold",0.5,true) +minetest.set_mapgen_setting("mgv7_large_cave_depth",0,true) +minetest.set_mapgen_setting("mgv7_large_cave_flooded",0,true) +minetest.set_mapgen_setting("mgv7_large_cave_num_min",0,true) +minetest.set_mapgen_setting("mgv7_large_cave_num_max",0,true) +minetest.set_mapgen_setting("mgv7_small_cave_num_min",0,true) +minetest.set_mapgen_setting("mgv7_small_cave_num_max",0,true) + +minetest.set_mapgen_setting_noiseparams("mgv7_np_cave1",{ + offset = 0.96, + scale = 11.45, + seed = 3141592653, + spread = { + x = 62, + y = 32.75, + z = 62, + }, + octaves = 4, + persistence = 0.44, + lacunarity = 1.698, +},true) + +minetest.set_mapgen_setting_noiseparams("mgv7_np_cave2",{ + offset = 0, + scale = 11.25, + seed = 2718281828, + spread = { + x = 180, + y = 32.75, + z = 180, + }, + octaves = 4, + persistence = 0.675, + lacunarity = 1.5, +},true) \ No newline at end of file diff --git a/mods/asuna/asuna_core/climate.lua b/mods/asuna/asuna_core/climate.lua new file mode 100644 index 00000000..c7f264aa --- /dev/null +++ b/mods/asuna/asuna_core/climate.lua @@ -0,0 +1,100 @@ +--[[ + Biome API noise settings +]] + +-- Set heat noise params +minetest.set_mapgen_setting_noiseparams("mg_biome_np_heat",{ + flags = "default", + lacunarity = 1, + persistence = 0.925, + seed = 5349, + spread = { + x = 2000, + y = 2000, + z = 2000, + }, + scale = 42, + octaves = 2, + offset = 50, +},true) + +-- Set humidity noise params +minetest.set_mapgen_setting_noiseparams("mg_biome_np_humidity",{ + flags = "default", + lacunarity = 1, + persistence = 0.925, + seed = 842, + spread = { + x = 2000, + y = 2000, + z = 2000, + }, + scale = 42, + octaves = 2, + offset = 50, +},true) + +-- Set heat blend noise params +minetest.set_mapgen_setting_noiseparams("mg_biome_np_heat_blend",{ + flags = "default", + lacunarity = 1.678, + persistence = 0.625, + seed = 13, + spread = { + x = 24, + y = 24, + z = 24, + }, + scale = 0.525, + octaves = 2, + offset = 0, +},true) + +-- Set humidity blend noise params +minetest.set_mapgen_setting_noiseparams("mg_biome_np_humidity_blend",{ + flags = "default", + lacunarity = 1.678, + persistence = 0.625, + seed = 90003, + spread = { + x = 24, + y = 24, + z = 24, + }, + scale = 0.525, + octaves = 2, + offset = 0, +},true) + +--[[ + Climate analysis command +]] + +-- Register climate analysis privilege +minetest.register_privilege("climate",{ + description = "Privilege required to use the /climate command", + give_to_singleplayer = false, + give_to_admin = true, +}) + +-- Register climate analysis command +minetest.register_chatcommand("climate",{ + params = "", + description = "analyze climate at current position", + privs = { climate = true }, + func = function(name) + local player = minetest.get_player_by_name(name) + + if not minetest.check_player_privs("climate") then + return false, "You do not have the 'climate' privilege necessary to use this command." + end + + local pos = player:get_pos() + local data = minetest.get_biome_data(pos) + if data then + return true, "(" .. math.floor(pos.x) .. "," .. math.floor(pos.y) .. "," .. math.floor(pos.z) .. "): biome = " .. minetest.get_biome_name(data.biome) .. ", heat = " .. data.heat .. ", humidity = " .. data.humidity + else + return false, "No biome data for your current position!" + end + end +}) \ No newline at end of file diff --git a/mods/asuna/asuna_core/decor.lua b/mods/asuna/asuna_core/decor.lua new file mode 100644 index 00000000..1f1d739b --- /dev/null +++ b/mods/asuna/asuna_core/decor.lua @@ -0,0 +1,816 @@ +asuna.decor = {} + +--[[ + Flowers +]] + +-- Group flowers by color +local flower_colors = { + black = { + "flowers:tulip_black", + }, + white = { + "beautiflowers:carla", + "beautiflowers:cloe", + "beautiflowers:genesis", + "beautiflowers:gloria", + "beautiflowers:hadassa", + "beautiflowers:ingrid", + "beautiflowers:irene", + "beautiflowers:iris", + "beautiflowers:ivette", + "beautiflowers:michelle", + "beautiflowers:suri", + "flowers:dandelion_white", + "herbs:achillea_white", + "herbs:leontopodium_white", + "herbs:leucanthemum_white", + "herbs:trifolium_white", + }, + blue = { + "beautiflowers:beatriz", + "beautiflowers:berta", + "flowers:geranium", + "herbs:centaurea", + "herbs:campanula_blue", + "herbs:digitalis_blue", + "herbs:iris", + "bakedclay:delphinium", + }, + cyan = { + "beautiflowers:thais", + "beautiflowers:valentina", + "beautiflowers:valeria", + "beautiflowers:vera", + "beautiflowers:victoria", + "beautiflowers:virginia", + "beautiflowers:xenia", + "beautiflowers:zaida", + }, + orange = { + "beautiflowers:dafne", + "beautiflowers:dana", + "beautiflowers:delia", + "beautiflowers:elena", + "beautiflowers:erica", + "beautiflowers:estela", + "beautiflowers:eva", + "beautiflowers:fabiola", + "beautiflowers:fiona", + "beautiflowers:gala", + "flowers:tulip", + }, + yellow = { + "beautiflowers:ada", + "beautiflowers:agnes", + "beautiflowers:alicia", + "beautiflowers:alma", + "beautiflowers:amaia", + "beautiflowers:anastasia", + "beautiflowers:any", + "flowers:dandelion_yellow", + "farming:sunflower_8", + "herbs:digitalis_yellow", + "herbs:plantago", + }, + purple = { + "beautiflowers:arleth", + "beautiflowers:astrid", + "beautiflowers:belen", + "beautiflowers:blanca", + "beautiflowers:casandra", + "beautiflowers:clara", + "beautiflowers:claudia", + "beautiflowers:minerva", + "beautiflowers:miriam", + "beautiflowers:nazareth", + "beautiflowers:noemi", + "beautiflowers:olga", + "beautiflowers:paula", + "beautiflowers:regina", + "beautiflowers:rocio", + "beautiflowers:sabrina", + "beautiflowers:vanesa", + "flowers:viola", + "beautiflowers:xena", + }, + red = { + "beautiflowers:arcoiris", + "beautiflowers:jennifer", + "beautiflowers:lara", + "beautiflowers:laura", + "beautiflowers:lidia", + "beautiflowers:lucia", + "beautiflowers:mara", + "beautiflowers:martina", + "beautiflowers:melania", + "beautiflowers:mireia", + "beautiflowers:nadia", + "beautiflowers:nerea", + "beautiflowers:noelia", + "flowers:rose", + "herbs:dosera", + "herbs:papaver_red", + }, + pink = { + "beautiflowers:caroline", + "beautiflowers:cristina", + "beautiflowers:diana", + "beautiflowers:gisela", + "beautiflowers:olimpia", + "beautiflowers:oriana", + "beautiflowers:pia", + "beautiflowers:raquel", + "beautiflowers:ruth", + "beautiflowers:sandra", + "beautiflowers:sara", + "beautiflowers:silvia", + "beautiflowers:sofia", + "beautiflowers:sonia", + "beautiflowers:talia", + "herbs:antirrhinum", + "herbs:trifolium_red", + "bakedclay:thistle", + "bakedclay:lazarus", + "ethereal:lilac", + }, + green = { + "flowers:chrysanthemum_green", + "beautiflowers:pasto_1", + "beautiflowers:pasto_2", + "beautiflowers:pasto_3", + "beautiflowers:pasto_4", + "beautiflowers:pasto_5", + "beautiflowers:pasto_6", + "beautiflowers:pasto_7", + "beautiflowers:pasto_8", + "beautiflowers:pasto_9", + "beautiflowers:pasto_10", + "bakedclay:mannagrass", + }, + red_mushroom = { + "flowers:mushroom_red", + }, + brown_mushroom = { + "flowers:mushroom_brown", + "herbs:mushroom_boletus", + "herbs:mushroom_cantharellus", + "herbs:mushroom_macrolepiota", + }, + odd_mushroom = { + "herbs:mushroom_amanita_green", + "herbs:mushroom_gyromitra", + "herbs:mushroom_galerina", + } +} + +-- Register flower decorations per biome +local function cf(biome) + local decor = { + flowers = {}, + mushrooms = {}, + } + + -- Generate list of flowers + for _,flower in ipairs(biome.flowers or {}) do + for _,flower in ipairs(flower_colors[flower]) do + table.insert(decor.flowers,flower) + end + end + + -- Generate list of mushrooms + for _,mushroom in ipairs(biome.mushrooms or {}) do + for _,mushroom in ipairs(flower_colors[mushroom .. "_mushroom"]) do + table.insert(decor.mushrooms,mushroom) + end + end + + return decor +end + +-- Do actual decoration registration after other mods are finished +minetest.register_on_mods_loaded(function() + -- Register shore grass + local sandy_biomes = {} + local desert_biomes = { + desert = true, + sandstone_desert = true, + desert_shore = true, + sandstone_desert_shore = true, + desert_below = true, + sandstone_desert_below = true, + } + for biome,def in pairs(asuna.biomes) do + if def.shore == "default:sand" and + (def.ocean == "temperate" or def.ocean == "tropical" or def.ocean == "cold") and + not desert_biomes[biome] + then + table.insert(sandy_biomes,biome) + end + end + + minetest.register_decoration(asuna.biome_groups.shore.inject_decoration({ + deco_type = "simple", + place_on = "default:sand", + decoration = {"default:marram_grass_1","default:marram_grass_2","default:marram_grass_3"}, + y_min = 2, + y_max = 2, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.0195, + spread = {x = 11, y = 11, z = 11}, + seed = 69420, + octaves = 1, + }, + biomes = sandy_biomes, + })) + + minetest.register_decoration(asuna.biome_groups.shore.inject_decoration({ + deco_type = "simple", + place_on = "default:sand", + decoration = {"default:marram_grass_1","default:marram_grass_2","default:marram_grass_3"}, + y_min = 3, + y_max = 4, + sidelen = 16, + noise_params = { + offset = 0.075, + scale = 0.175, + spread = {x = 10, y = 10, z = 10}, + seed = 42069, + octaves = 1, + }, + biomes = sandy_biomes, + })) + + -- Register flowers and mushrooms + for name,biome in pairs(asuna.biomes) do + -- Get node groups for biome + local decor = cf(biome) + + -- Register flowers + if #biome.flowers > 0 then + minetest.register_decoration({ + name = "asuna_core:flowers_" .. name, + deco_type = "simple", + sidelen = 80, + place_on = biome.nodes.extra and {biome.nodes[1],unpack(biome.nodes.extra)} or biome.nodes[1], + noise_params = { + offset = 0.006786, + scale = 0.004175, + spread = {x = 8, y = 8, z = 8}, + seed = 1999, + octaves = 2, + persist = 0.44, + lacunarity = 0.75, + }, + biomes = {name}, + y_max = 31000, + y_min = 1, + decoration = decor.flowers, + }) + end + + -- Register mushrooms + if #biome.mushrooms > 0 then + minetest.register_decoration({ + name = "asuna_core:mushrooms_" .. name, + deco_type = "simple", + sidelen = 8, + place_on = biome.nodes.extra and {biome.nodes[1],unpack(biome.nodes.extra)} or biome.nodes[1], + noise_params = { + offset = -0.0069, + scale = 0.027525, + spread = {x = 8, y = 8, z = 8}, + seed = 60659, + octaves = 2, + persist = 0.7625, + lacunarity = 0.6, + }, + biomes = {name}, + y_max = 31000, + y_min = 1, + decoration = decor.mushrooms, + }) + end + end + + -- Special sunflower decor for the Plains biome + minetest.register_decoration({ + name = "asuna_core:plains_special_sunflower", + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 80, + fill_ratio = 0.075, + biomes = {"plains"}, + y_max = 31000, + y_min = 1, + decoration = "farming:sunflower_8", + }) + + -- Special dense flower decor for the Prairie biome + minetest.register_decoration({ + name = "asuna_core:prairie_special_flowers", + deco_type = "simple", + place_on = "prairie:prairie_dirt_with_grass", + sidelen = 80, + fill_ratio = 0.265, + biomes = {"prairie"}, + y_max = 31000, + y_min = 1, + decoration = cf({ flowers = {"blue","cyan","white","orange","yellow"} }).flowers, + }) + + -- Special mushroom decor for the Mushroom biome + minetest.register_decoration({ + name = "asuna_core:mushroom_special_mushrooms", + deco_type = "simple", + place_on = "ethereal:mushroom_dirt", + sidelen = 80, + fill_ratio = 0.075, + biomes = {"mushroom"}, + y_max = 31000, + y_min = 1, + decoration = cf({ mushrooms = {"odd","brown"} }).mushrooms, + }) + + -- Bushes for certain grassy biomes + minetest.register_decoration({ + name = "bushes:default_replacement", + deco_type = "schematic", + place_on = "default:dirt_with_grass", + sidelen = 80, + fill_ratio = 0.00025, + y_min = 2, + y_max = 31000, + biomes = { + "grassland", + "deciduous_forest", + "grassytwo", + "jumble", + "marsh", + }, + schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x,place_center_z", + }) + + --[[ + Butterflies + ]] + + if minetest.get_modpath("butterflies") then + + minetest.register_decoration({ + name = "butterflies:butterfly", + deco_type = "simple", + place_on = "group:soil", + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.005, + biomes = { + "grassland", + "deciduous_forest", + "grassytwo", + "prairie", + "dorwinion", + "jumble", + "bamboo", + "naturalbiomes:heath", + "naturalbiomes:alpine", + "everness:bamboo_forest", + }, + y_max = 31000, + y_min = 1, + decoration = { + "butterflies:butterfly_white", + "butterflies:butterfly_red", + "butterflies:butterfly_violet", + }, + spawn_by = "group:flower", + num_spawn_by = 1, + }) + end + + --[[ + Fireflies + ]] + + if minetest.get_modpath("fireflies") then + minetest.register_decoration({ + name = "fireflies:firefly_low", + deco_type = "simple", + place_on = "group:soil", + place_offset_y = 2, + sidelen = 16, + noise_params = { + offset = -0.005, + scale = 0.015, + spread = {x = 60, y = 20, z = 60}, + seed = 2112, + octaves = 1, + persistence = 0.75, + flags = "eased" + }, + biomes = { + "deciduous_forest", + "grassland", + "grassytwo", + "prairie", + "dorwinion", + "jumble", + "swamp", + "marsh", + "naturalbiomes:alderswamp", + "naturalbiomes:alpine", + "naturalbiomes:bushland", + "everness:bamboo_forest", + }, + y_max = 31000, + y_min = -1, + place_offset_y = 2, + decoration = "fireflies:hidden_firefly", + }) + + minetest.register_decoration({ + name = "fireflies:firefly_low_bamboo_cave", + deco_type = "simple", + place_on = "everness:moss_block", + place_offset_y = 2, + sidelen = 16, + fill_ratio = 0.0065, + biomes = asuna.features.cave.bamboo, + y_max = 0, + y_min = -31000, + place_offset_y = 1, + decoration = "fireflies:hidden_firefly", + }) + + minetest.register_decoration({ + name = "fireflies:firefly_low_dorwinion_cave", + deco_type = "simple", + place_on = "dorwinion:dorwinion_grass", + place_offset_y = 2, + sidelen = 16, + fill_ratio = 0.0065, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + place_offset_y = 1, + decoration = "fireflies:hidden_firefly", + }) + end + + --[[ + Large jungle trees + ]] + + local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + if chunksize >= 5 then + minetest.register_decoration({ + name = "default:emergent_jungle_tree", + deco_type = "schematic", + place_on = { + "default:dirt_with_rainforest_litter", + }, + sidelen = 80, + noise_params = { + offset = 0.0, + scale = 0.0025, + spread = {x = 200, y = 200, z = 200}, + seed = 2685, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest"}, + y_max = 30000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/emergent_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + place_offset_y = -4, + }) + end + + --[[ + Hanging vines + ]] + + local soil_nodes = {} + for _,soil_node in ipairs({ + "default:dirt", + "default:dirt_with_grass", + "default:dirt_with_rainforest_litter", + "livingjungle:jungleground", + "livingjungle:leafyjungleground", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:alderswamp_dirt", + "default:tree", + "default:jungletree", + "default:jungleleaves", + }) do + soil_nodes[minetest.get_content_id(soil_node)] = true + end + + local cids = { + air = minetest.get_content_id("air"), + vine = minetest.get_content_id("ethereal:vine"), + water = minetest.get_content_id("default:water_source"), -- used for waterfalls below; unrelated to vines + water_flowing = minetest.get_content_id("default:water_flowing"), -- used for cave liquids below; unrelated to vines + lava = minetest.get_content_id("default:lava_source"), -- used for cave liquids below; unrelated to vines + lava_flowing = minetest.get_content_id("default:lava_flowing"), -- used for cave liquids below; unrelated to vines + stone = minetest.get_content_id("default:stone"), + jungleleaves = minetest.get_content_id("default:jungleleaves"), + } + + local asuna_hanging_vines_fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + local vparam2 = mapgen.param2 + + -- Get stride values and set position + local ystride = va.ystride + local zstride = va.zstride + pos = va:index(pos.x,pos.y,pos.z) + + -- Scan for dirt or surface nodes for a short distance above the position + for above = 1, 2 do + above = pos + above * ystride + if soil_nodes[vdata[above]] then + pos = above + break + end + end + + -- List of cardinal directions relative to the current position + local cardinal = { + pos - 1, + pos + 1, + pos - zstride, + pos + zstride, + } + + -- Iterate over cardinal positions and place vines at and below those positions + for i = 1, 4 do + local dir = cardinal[i] + if vdata[dir] == cids.air then + for below = 0, ((dir ^ 2 + (dir + pos) % 3) % 4 + 2) do + below = dir - below * ystride + if vdata[below] == cids.air then + vdata[below] = cids.vine + vparam2[below] = i + 1 + else + break + end + end + end + end + end + + abdecor.register_advanced_decoration("asuna_hanging_vines_jungletree",{ + target = { + place_on = { + "default:jungletree", + }, + sidelen = 80, + fill_ratio = 0.3, + biomes = { + "rainforest", + }, + y_max = 31000, + y_min = 1, + flags = "all_ceilings", + }, + fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + local vparam2 = mapgen.param2 + + -- Get stride values and set position + local ystride = va.ystride + local zstride = va.zstride + pos = va:index(pos.x,pos.y,pos.z) + + -- Check surrounding nodes for jungle leaves + for x = -1, 1 do + for z = -zstride, zstride, zstride do + local lpos = pos + x + z + if vdata[lpos] == cids.jungleleaves and (pos * x + z) % 3 > 0 then + mapgen.pos = va:position(lpos) + asuna_hanging_vines_fn(mapgen) + end + end + end + end, + flags = { + param2 = true, + } + }) + + abdecor.register_advanced_decoration("asuna_hanging_vines",{ + target = { + place_on = { + "group:stone", + "default:dirt", + "default:jungletree", + }, + spawn_by = "air", + num_spawn_by = 5, + sidelen = 80, + fill_ratio = 0.3, + biomes = { + "swamp", + "naturalbiomes:alderswamp", + "marsh", + "rainforest", + "jumble", + "livingjungle:jungle", + }, + y_max = 31000, + y_min = 1, + flags = "all_ceilings", + }, + fn = asuna_hanging_vines_fn, + flags = { + param2 = true, + }, + }) + + --[[ + Ocean waterfalls + ]] + + local wall_stones = { + "default:stone_with_coal", + "default:stone_with_iron", + "default:stone_with_tin", + "default:stone_with_copper", + "default:stone_with_gold", + "default:stone_with_diamond", + "default:stone_with_mese", + } + + for node,def in pairs(minetest.registered_nodes) do + if def.groups and def.groups.stone and def.groups.stone > 0 then + table.insert(wall_stones,node) + end + end + + local valid_wall_stones = {} + for _,node in ipairs(wall_stones) do + valid_wall_stones[minetest.get_content_id(node)] = true + end + + abdecor.register_advanced_decoration("asuna_waterfalls",{ + target = { + place_on = "default:water_source", + spawn_by = wall_stones, + num_spawn_by = 3, + sidelen = 80, + fill_ratio = 0.11, + biomes = asuna.biome_groups.shore, + y_max = 1, + y_min = 1, + flags = "liquid_surface", + }, + fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + + -- Get stride values and adjust position + local ystride = va.ystride + local zstride = va.zstride + pos = va:index(pos.x,pos.y + 1,pos.z) + local too_low_pos = 0 + + -- Get stone wall direction + local cardinal = { + -1, + -zstride, + 1, + zstride, + } + + local found_stone = false + local check_wall = nil + for i = 1, 4 do + local wallpos = pos + cardinal[i] + local wallleft = cardinal[i % 4 + 1] + local wallright = cardinal[(i + 2) % 4 + 1] + check_wall = function(pos) -- is the entire row of wall nodes made of stone? + return valid_wall_stones[vdata[pos]] and valid_wall_stones[vdata[pos + wallleft]] and valid_wall_stones[vdata[pos + wallright]] and true or false + end + if check_wall(wallpos) then + pos = wallpos + too_low_pos = pos + found_stone = true + break + end + end + + -- Do nothing if no stone wall found + if not found_stone then + return + end + + -- Iterate above 'rows' of stone wall until we find something that isn't stone + repeat + pos = pos + ystride + until not check_wall(pos) + + -- Set two below stone position to water if higher than one node + local placepos = pos - 2 * ystride + if placepos > too_low_pos then + vdata[placepos] = cids.water + end + end, + flags = { + liquid = true, + }, + }) + + --[[ + Cave ceiling liquids + ]] + + local enclosing_nodes = valid_wall_stones + + abdecor.register_advanced_decoration("asuna_cave_liquids",{ + target = { + place_on = { + "group:stone", + }, + sidelen = 80, + spawn_by = { + "group:stone", + }, + num_spawn_by = 8, + fill_ratio = 0.000015, + y_max = -30, + y_min = -31000, + flags = "all_ceilings", + }, + fn = function(mapgen) + -- Get provided values + local va = mapgen.voxelarea + local vdata = mapgen.data + local vparam2 = mapgen.param2 + local pos = mapgen.pos + + -- Get stride values and set position + local ystride = va.ystride + local zstride = va.zstride + local pos = va:index(pos.x,pos.y,pos.z) + + -- Liquid must be enclosed to its sides and above + for _,adjacent in ipairs({ + ystride, + 1, + -1, + zstride, + -zstride, + }) do + if not enclosing_nodes[vdata[pos + adjacent]] then + return -- liquid is not fully enclosed + end + end + + -- Liquid must have sufficient clearance below + -- Scanning from bottom up should typically fail faster than top down + for below = pos - ystride * 8, pos - ystride, ystride do + if vdata[below] ~= minetest.CONTENT_AIR then + return -- not enough space between ceiling and ground + end + end + + -- Fill the position and all air below with liquid based on climate + bias + -- Dry/hot climates are more likely to be lava, vice-versa with water + local liquid = (function() + local heatmap = minetest.get_mapgen_object("heatmap") or {} + local humiditymap = minetest.get_mapgen_object("humiditymap") or {} + local pos2d = mapgen.index2d(mapgen.pos) + local heat = heatmap[pos2d] or 50 + local humidity = humiditymap[pos2d] or 50 + local climate = 50 + (heat / 2 - 25) - (humidity / 2 - 25) + local pos_random = (pos ^ 2 + pos) % 38 * (pos % 2 == 0 and 1 or -1) + climate -- not actually random but good enough + return pos_random > 56 and {cids.lava,cids.lava_flowing} or {cids.water,cids.water_flowing} -- bias in favor of water + end)() + vdata[pos] = liquid[1] + pos = pos - ystride + while vdata[pos] == minetest.CONTENT_AIR do + vdata[pos] = liquid[2] + vparam2[pos] = 15 + pos = pos - ystride + end + end, + flags = { + liquid = true, + param2 = true, + }, + }) +end) \ No newline at end of file diff --git a/mods/asuna/asuna_core/init.lua b/mods/asuna/asuna_core/init.lua new file mode 100644 index 00000000..51ba718e --- /dev/null +++ b/mods/asuna/asuna_core/init.lua @@ -0,0 +1,46 @@ +asuna = { + modpath = core.get_modpath("asuna_core"), + content = { + nutrition = { + enabled = core.settings:get_bool("asuna.content.nutrition.enabled",true), + exhaustion_level = core.settings:get_bool("asuna.content.nutrition.enabled",true) and tonumber(core.settings:get("asuna.content.nutrition.exhaustion_level",160) or 160), + starvation = core.settings:get_bool("asuna.content.nutrition.enabled",true) and core.settings:get_bool("asuna.content.nutrition.starvation",false), + }, + wayfarer = { + enabled = core.settings:get_bool("asuna.content.wayfarer.enabled",true), + awards = core.settings:get_bool("asuna.content.wayfarer.enabled",true) and core.settings:get_bool("asuna.content.wayfarer.awards",true), + loot_chests = core.settings:get_bool("asuna.content.wayfarer.enabled",true) and core.settings:get_bool("asuna.content.wayfarer.loot_chests",true), + worldgate = core.settings:get_bool("asuna.content.wayfarer.enabled",true) and core.settings:get_bool("asuna.content.wayfarer.worldgate",true), + }, + menagerie = { + enabled = core.settings:get_bool("asuna.content.menagerie.enabled",true), + animals = core.settings:get_bool("asuna.content.menagerie.enabled",true) and core.settings:get_bool("asuna.content.menagerie.animals",true), + slimes = core.settings:get_bool("asuna.content.menagerie.enabled",true) and core.settings:get_bool("asuna.content.menagerie.slimes",true), + }, + research = { + enabled = core.settings:get_bool("asuna.content.research.enabled",true), + }, + }, + settings = { + particles = { + amount = core.settings:get("asuna.settings.particles.amount","less") or "less", + }, + mod_override_warnings = { + enabled = core.settings:get_bool("asuna.settings.mod_override_warnings.enabled",true), + }, + }, +} + +local function runfile(file,condition) + if condition == nil or condition then + dofile(asuna.modpath .. "/" .. file .. ".lua") + end +end + +runfile("biomes") +runfile("terrain") +runfile("climate") +runfile("caves") +runfile("decor") +runfile("music") +runfile("mod_override_warnings",asuna.settings.mod_override_warnings.enabled) \ No newline at end of file diff --git a/mods/asuna/asuna_core/mod.conf b/mods/asuna/asuna_core/mod.conf new file mode 100644 index 00000000..120e85b2 --- /dev/null +++ b/mods/asuna/asuna_core/mod.conf @@ -0,0 +1,6 @@ +name = asuna_core +title = Asuna Core +description = The core mod that defines functionality specific to Asuna and its content +author = EmptyStar +depends = music_api +# ephemeral_depends = abdecor, default, flowers, beautiflowers, herbs, bakedclay, fireflies, ethereal, badland, dorwinion, prairie, naturalbiomes, livingjungle, bambooforest, frost_land, japaneseforest, nightshade, terracotta, too_many_stones \ No newline at end of file diff --git a/mods/asuna/asuna_core/mod_override_warnings.lua b/mods/asuna/asuna_core/mod_override_warnings.lua new file mode 100644 index 00000000..aed5b1c8 --- /dev/null +++ b/mods/asuna/asuna_core/mod_override_warnings.lua @@ -0,0 +1,46 @@ +local asuna_mod_path = core.get_game_info().path .. "/mods" +local bundled_mods = core.get_dir_list(asuna_mod_path,true) +local warn + +if asuna.settings.mod_override_warnings.enabled then + local messages = {} + warn = function(mod) + local message = "MOD OVERRIDE WARNING: Mod '" .. mod .. "' is enabled externally which overrides Asuna's version of this mod. This may cause issues." + core.log("warning",message) + table.insert(messages,core.colorize("#eeee00",message)) + end + core.register_on_joinplayer(function(player) + local name = player:get_player_name() + local privs = core.get_player_privs(name) + if privs.server or privs.debug or name == "singleplayer" then + for _,message in ipairs(messages) do + core.chat_send_player(name,message) + end + end + end) +else + warn = function(mod) + core.log("warning","MOD OVERRIDE WARNING: Mod '" .. mod .. "' is enabled externally which overrides Asuna's version of this mod. This may cause issues.") + end +end + +for _,mod in ipairs(bundled_mods) do + local mods = { mod } + local mpath = asuna_mod_path .. "/" .. mod + local mfiles = core.get_dir_list(mpath,false) + + for _,mfile in ipairs(mfiles) do + if mfile:find("^modpack\\.") then + mods = core.get_dir_list(mpath,true) + break + end + end + + for _,mpath in ipairs(mods) do + mod = mpath + mpath = core.get_modpath(mpath) + if mpath and not mpath:find("[\\/]games[\\/][^\\/]+[\\/]mods[\\/]") then + warn(mod) + end + end +end \ No newline at end of file diff --git a/mods/asuna/asuna_core/music.lua b/mods/asuna/asuna_core/music.lua new file mode 100644 index 00000000..2fe00ebe --- /dev/null +++ b/mods/asuna/asuna_core/music.lua @@ -0,0 +1,105 @@ +--[[ + Day or night +]] + +music.register_track({ + name = "reparateur", + length = 200 + 30, + gain = 1.25, + day = true, + night = true, + ymin = -12, + ymax = 31000, +}) + +music.register_track({ + name = "blood", + length = 89 + 30, + gain = 1, + day = true, + night = true, + ymin = -12, + ymax = 31000, +}) + +--[[ + Daytime only +]] + +for track,length in pairs({ + castlesinthesky = 107, + firefly = 152, + bathedinthelight = 166, + roquefortprolog = 85, + meditatingbeat = 132, + pond = 142, + onefineday = 51, + antarctica = 65, + simplicity = 122, + endtitles = 135, + imagefilm033 = 121, +}) do + music.register_track({ + name = track, + length = length + 30, + gain = 1, + day = true, + night = false, + ymin = -12, + ymax = 31000, + }) +end + +--[[ + Nighttime only +]] + +for track,length in pairs({ + jul = 204, + skyward = 149, + thelongwayhome = 171, + --moonlight = 176, + --walkingstars = 172, + hymn = 73, + reverie = 136, + atemubungen = 177, + breezyreflections = 91, + dreamsphere1 = 177, + dreamsphere2 = 109, + dreamsphere4 = 104, + lonelyfish = 107, +}) do + music.register_track({ + name = track, + length = length + 30, + gain = 1, + day = false, + night = true, + ymin = -12, + ymax = 31000, + }) +end + +--[[ + Underground +]] + +for track,length in pairs({ + machina = 192, + tearsinrain = 172, + screensaver = 113, + cobalt = 176, + infinitepeace = 73, + thevisitors = 160, + sunriseonmars = 129, +}) do + music.register_track({ + name = track, + length = length + 30, + gain = 1, + day = true, + night = true, + ymin = -31000, + ymax = -12, + }) +end \ No newline at end of file diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_large_01.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_large_01.mts new file mode 100644 index 00000000..9d85f66c Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_large_01.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_large_02.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_large_02.mts new file mode 100644 index 00000000..2cfdf2c0 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_large_02.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_large_03.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_large_03.mts new file mode 100644 index 00000000..228e96c5 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_large_03.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_medium_01.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_medium_01.mts new file mode 100644 index 00000000..f0569ed5 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_medium_01.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_medium_02.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_medium_02.mts new file mode 100644 index 00000000..9494a8c5 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_medium_02.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_medium_03.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_medium_03.mts new file mode 100644 index 00000000..314153d0 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_medium_03.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_small_01.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_small_01.mts new file mode 100644 index 00000000..4ffe5cdd Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_small_01.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_small_02.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_small_02.mts new file mode 100644 index 00000000..fb858b5e Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_small_02.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/boulder_small_03.mts b/mods/asuna/asuna_core/schematics/boulders/boulder_small_03.mts new file mode 100644 index 00000000..67f4a6a7 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/boulder_small_03.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/cobblestone_boulder_medium.mts b/mods/asuna/asuna_core/schematics/boulders/cobblestone_boulder_medium.mts new file mode 100644 index 00000000..01bdda77 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/cobblestone_boulder_medium.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/cobblestone_boulder_small.mts b/mods/asuna/asuna_core/schematics/boulders/cobblestone_boulder_small.mts new file mode 100644 index 00000000..46c38acd Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/cobblestone_boulder_small.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/desert_boulder_medium.mts b/mods/asuna/asuna_core/schematics/boulders/desert_boulder_medium.mts new file mode 100644 index 00000000..81ba922d Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/desert_boulder_medium.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/desert_boulder_small.mts b/mods/asuna/asuna_core/schematics/boulders/desert_boulder_small.mts new file mode 100644 index 00000000..5b008f38 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/desert_boulder_small.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/mossy_cobblestone_boulder_medium.mts b/mods/asuna/asuna_core/schematics/boulders/mossy_cobblestone_boulder_medium.mts new file mode 100644 index 00000000..4f076c4b Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/mossy_cobblestone_boulder_medium.mts differ diff --git a/mods/asuna/asuna_core/schematics/boulders/mossy_cobblestone_boulder_small.mts b/mods/asuna/asuna_core/schematics/boulders/mossy_cobblestone_boulder_small.mts new file mode 100644 index 00000000..29a9e006 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/boulders/mossy_cobblestone_boulder_small.mts differ diff --git a/mods/asuna/asuna_core/schematics/everness/everness_haunted_house_badland.mts b/mods/asuna/asuna_core/schematics/everness/everness_haunted_house_badland.mts new file mode 100644 index 00000000..c5a058c1 Binary files /dev/null and b/mods/asuna/asuna_core/schematics/everness/everness_haunted_house_badland.mts differ diff --git a/mods/asuna/asuna_core/schematics/everness/everness_japanese_shrine_new.mts b/mods/asuna/asuna_core/schematics/everness/everness_japanese_shrine_new.mts new file mode 100644 index 00000000..b7dee64c Binary files /dev/null and b/mods/asuna/asuna_core/schematics/everness/everness_japanese_shrine_new.mts differ diff --git a/mods/asuna/asuna_core/schematics/everness/everness_jungle_temple_new.mts b/mods/asuna/asuna_core/schematics/everness/everness_jungle_temple_new.mts new file mode 100644 index 00000000..2a4bfe7d Binary files /dev/null and b/mods/asuna/asuna_core/schematics/everness/everness_jungle_temple_new.mts differ diff --git a/mods/asuna/asuna_core/sounds/music/CREDITS.md b/mods/asuna/asuna_core/sounds/music/CREDITS.md new file mode 100644 index 00000000..9aa716ab --- /dev/null +++ b/mods/asuna/asuna_core/sounds/music/CREDITS.md @@ -0,0 +1,39 @@ +All of the music in this mod is listed/credited below by author, license, and source. Each track followed by an asterisk (`*`) has been edited from its original form, often to trim and fade the end of the track. + +- **Scott Buckley** -- [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/), + - Blood (blood.ogg)* + - Castles In The Sky (castlesinthesky.ogg)* + - Firefly (firefly.ogg) + - Jul (jul.ogg)* + - Machina (machina.ogg)* + - Reparateur (reparateur.ogg)* + - Skyward (skyward.ogg)* + - Tears In Rain (tearsinrain.ogg)* + - The Long Way Home (thelongwayhome.ogg)* + - Cobalt (cobalt.ogg)* + - Hymn (hymn.ogg)* + - Reverie (reverie.ogg)* + - Simplicity (simplicity.ogg)* +- **Kevin MacLeod** -- [CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/), + - Bathed in the Light (bathedinthelight.ogg) +- **Kevin MacLeod** -- [CC0](https://creativecommons.org/publicdomain/zero/1.0/), + - Screen Saver (screensaver.ogg)* + - Roquefort Prolog (roquefortprolog.ogg)* + - Infinite Peace (infinitepeace.ogg)* + - Meditating Beat (meditatingbeat.ogg)* +- **Rafael Krux** -- [CC0](https://creativecommons.org/publicdomain/zero/1.0/), + - Pond (pond.ogg)* +- **Jason Shaw** -- [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/legalcode), + - Antarctica (antarctica.ogg)* + - One Fine Day (onefineday.ogg)* + - The Visitors (thevisitors.ogg)* + - Sunrise on Mars (sunriseonmars.ogg)* +- **Sascha Ende** -- [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/legalcode), + - Atemubüngen (atemubungen.ogg)* + - Breezy Reflections (breezyreflections.ogg)* + - Dreamsphere 1 (dreamsphere1.ogg)* + - Dreamsphere 2 (dreamsphere2.ogg)* + - Dreamsphere 4 (dreamsphere4.ogg)* + - End Titles (endtitles.ogg)* + - Image Film 033 (imagefilm033.ogg)* + - Lonely Fish (lonelyfish.ogg)* \ No newline at end of file diff --git a/mods/asuna/asuna_core/sounds/music/antarctica.ogg b/mods/asuna/asuna_core/sounds/music/antarctica.ogg new file mode 100644 index 00000000..7d035e04 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/antarctica.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/atemubungen.ogg b/mods/asuna/asuna_core/sounds/music/atemubungen.ogg new file mode 100644 index 00000000..1eddd803 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/atemubungen.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/bathedinthelight.ogg b/mods/asuna/asuna_core/sounds/music/bathedinthelight.ogg new file mode 100644 index 00000000..fa102736 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/bathedinthelight.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/blood.ogg b/mods/asuna/asuna_core/sounds/music/blood.ogg new file mode 100644 index 00000000..70f9c487 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/blood.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/breezyreflections.ogg b/mods/asuna/asuna_core/sounds/music/breezyreflections.ogg new file mode 100644 index 00000000..d0aa136a Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/breezyreflections.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/castlesinthesky.ogg b/mods/asuna/asuna_core/sounds/music/castlesinthesky.ogg new file mode 100644 index 00000000..e7704eff Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/castlesinthesky.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/cobalt.ogg b/mods/asuna/asuna_core/sounds/music/cobalt.ogg new file mode 100644 index 00000000..fecb6277 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/cobalt.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/dreamsphere1.ogg b/mods/asuna/asuna_core/sounds/music/dreamsphere1.ogg new file mode 100644 index 00000000..53e949cc Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/dreamsphere1.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/dreamsphere2.ogg b/mods/asuna/asuna_core/sounds/music/dreamsphere2.ogg new file mode 100644 index 00000000..1703f3ab Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/dreamsphere2.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/dreamsphere4.ogg b/mods/asuna/asuna_core/sounds/music/dreamsphere4.ogg new file mode 100644 index 00000000..50168268 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/dreamsphere4.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/endtitles.ogg b/mods/asuna/asuna_core/sounds/music/endtitles.ogg new file mode 100644 index 00000000..2d36d078 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/endtitles.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/firefly.ogg b/mods/asuna/asuna_core/sounds/music/firefly.ogg new file mode 100644 index 00000000..c47dfc9c Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/firefly.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/hymn.ogg b/mods/asuna/asuna_core/sounds/music/hymn.ogg new file mode 100644 index 00000000..ca81700b Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/hymn.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/imagefilm033.ogg b/mods/asuna/asuna_core/sounds/music/imagefilm033.ogg new file mode 100644 index 00000000..f2e7bf58 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/imagefilm033.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/infinitepeace.ogg b/mods/asuna/asuna_core/sounds/music/infinitepeace.ogg new file mode 100644 index 00000000..7aacd767 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/infinitepeace.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/jul.ogg b/mods/asuna/asuna_core/sounds/music/jul.ogg new file mode 100644 index 00000000..57f592f9 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/jul.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/lonelyfish.ogg b/mods/asuna/asuna_core/sounds/music/lonelyfish.ogg new file mode 100644 index 00000000..8c8c19e8 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/lonelyfish.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/machina.ogg b/mods/asuna/asuna_core/sounds/music/machina.ogg new file mode 100644 index 00000000..7c9693a4 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/machina.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/meditatingbeat.ogg b/mods/asuna/asuna_core/sounds/music/meditatingbeat.ogg new file mode 100644 index 00000000..45af7318 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/meditatingbeat.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/onefineday.ogg b/mods/asuna/asuna_core/sounds/music/onefineday.ogg new file mode 100644 index 00000000..7a7257b1 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/onefineday.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/pond.ogg b/mods/asuna/asuna_core/sounds/music/pond.ogg new file mode 100644 index 00000000..c5eac474 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/pond.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/reparateur.ogg b/mods/asuna/asuna_core/sounds/music/reparateur.ogg new file mode 100644 index 00000000..05611002 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/reparateur.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/reverie.ogg b/mods/asuna/asuna_core/sounds/music/reverie.ogg new file mode 100644 index 00000000..484955fc Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/reverie.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/roquefortprolog.ogg b/mods/asuna/asuna_core/sounds/music/roquefortprolog.ogg new file mode 100644 index 00000000..195c7d0f Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/roquefortprolog.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/screensaver.ogg b/mods/asuna/asuna_core/sounds/music/screensaver.ogg new file mode 100644 index 00000000..52bacdef Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/screensaver.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/simplicity.ogg b/mods/asuna/asuna_core/sounds/music/simplicity.ogg new file mode 100644 index 00000000..614f7320 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/simplicity.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/skyward.ogg b/mods/asuna/asuna_core/sounds/music/skyward.ogg new file mode 100644 index 00000000..fe074db2 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/skyward.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/sunriseonmars.ogg b/mods/asuna/asuna_core/sounds/music/sunriseonmars.ogg new file mode 100644 index 00000000..9951dd09 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/sunriseonmars.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/tearsinrain.ogg b/mods/asuna/asuna_core/sounds/music/tearsinrain.ogg new file mode 100644 index 00000000..2b73477a Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/tearsinrain.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/thelongwayhome.ogg b/mods/asuna/asuna_core/sounds/music/thelongwayhome.ogg new file mode 100644 index 00000000..561df646 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/thelongwayhome.ogg differ diff --git a/mods/asuna/asuna_core/sounds/music/thevisitors.ogg b/mods/asuna/asuna_core/sounds/music/thevisitors.ogg new file mode 100644 index 00000000..c4dfe017 Binary files /dev/null and b/mods/asuna/asuna_core/sounds/music/thevisitors.ogg differ diff --git a/mods/asuna/asuna_core/terrain.lua b/mods/asuna/asuna_core/terrain.lua new file mode 100644 index 00000000..827524a9 --- /dev/null +++ b/mods/asuna/asuna_core/terrain.lua @@ -0,0 +1,715 @@ +--[[ + Boulders + - Should be registered before surface/terrain overrides +]] + +local function boulder(name,seed,nodes) + minetest.register_decoration({ + deco_type = "schematic", + place_on = nodes, + fill_ratio = 0.00000000000000001, + y_min = 2, + y_max = 31000, + flags = "force_placement,place_center_x,place_center_z", + schematic = asuna.modpath .. "/schematics/boulders/" .. name .. ".mts", + rotation = "random", + place_offset_y = 0 + }) +end + +local seed = 90210 + +for _,name in ipairs({ + "cobblestone_boulder_small", + "cobblestone_boulder_medium", +}) do + boulder(name,seed,{ + "default:dirt_with_dry_grass", + "default:dry_dirt_with_dry_grass", + "default:dirt_with_snow", + "naturalbiomes:savannalitter", + }) + seed = seed + 13 +end + +for _,name in ipairs({ + "mossy_cobblestone_boulder_small", + "mossy_cobblestone_boulder_medium", +}) do + boulder(name,seed,{ + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "ethereal:grove_dirt", + "naturalbiomes:alpine_litter", + "naturalbiomes:heath_litter", + "naturalbiomes:heath_litter2", + "naturalbiomes:heath_litter3", + }) + seed = seed + 17 +end + +for _,name in ipairs({ + "desert_boulder_small", + "desert_boulder_medium", +}) do + boulder(name,seed,{ + "default:desert_sand", + "default:sandstone", + }) + seed = seed + 19 +end + +--[[ + Terrain changes + - Sweeping terrain changes that must be made before decorations are placed +]] + +-- Special decoration handling +local mtrd = minetest.register_decoration +minetest.register_decoration = function(def) + -- Set all_floors for all surface decorations + local flags = def.flags or "" + if not (flags:find("all_") or flags:find("liquid_")) then + def.flags = #flags > 0 and (flags .. ",all_floors") or "all_floors" + end + + -- Set negative y_min for select surface decorations + if def.y_min == 1 and def.y_max and def.y_max > 1 and def.deco_type == "simple" then + def.y_min = -20 + end + + -- Ensure spawning in water for underwater decorations + if def.y_max and def.y_max < 1 and not def.spawn_by and (def.place_on == "default:sand" or def.place_on[1] == "default:sand") then + def.spawn_by = "default:water_source" + def.num_spawn_by = 1 + end + + -- Return original register_decoration call + return mtrd(def) +end + +-- Surface nodes that should be propagated through surface stone +local surface_spread = { + "default:dirt_with_grass", + "default:dry_dirt_with_dry_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", + "default:dirt_with_coniferous_litter", + "naturalbiomes:savannalitter", + "naturalbiomes:alpine_litter", + "naturalbiomes:mediterran_litter", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:outback_litter", + "ethereal:grove_dirt", + "ethereal:bamboo_dirt", + "livingjungle:jungleground", + "livingjungle:leafyjungleground", + "ethereal:mushroom_dirt", + "nightshade:nightshade_dirt_with_grass", + "japaneseforest:japanese_dirt_with_grass", + "bambooforest:dirt_with_bamboo", + "dorwinion:dorwinion_grass", + "badland:badland_grass", + "frost_land:frost_land_grass", + "prairie:prairie_dirt_with_grass", + "everness:dirt_with_crystal_grass", + "everness:dirt_with_cursed_grass", + "everness:dirt_with_coral_grass", + "ethereal:gray_dirt", + "naturalbiomes:heath_litter", + "naturalbiomes:bushland_bushlandlitter", + "naturalbiomes:bushland_bushlandlitter2", + "naturalbiomes:bushland_bushlandlitter3", +} + +-- Replace some surface stone with grass; also causes some biome ingress into caves +for _,node in ipairs(surface_spread) do + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "group:stone", + "default:stone_with_coal", + "default:dirt", + "default:silver_sand", + "default:gravel", + "everness:coral_desert_stone_with_coal", + "everness:cursed_stone_carved_with_coal", + "everness:crystal_stone_with_coal", + }, + spawn_by = node, + num_spawn_by = 1, + sidelen = 4, + y_min = 3, + y_max = 31000, + place_offset_y = -1, + fill_ratio = 10, + decoration = node, + flags = "force_placement", + }) +end + +-- Ocean floor nodes that should be replaced with proper ocean floor +local ocean_floor_replace = { + "group:stone", + "default:stone_with_coal", + "everness:quartz_ore", + "default:dirt", + "default:dry_dirt", + "default:gravel", + "default:silver_sand", + "default:dirt_with_grass", + "default:dry_dirt_with_dry_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", + "default:dirt_with_coniferous_litter", + "naturalbiomes:savannalitter", + "naturalbiomes:alpine_litter", + "naturalbiomes:mediterran_litter", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:outback_litter", + "ethereal:grove_dirt", + "ethereal:bamboo_dirt", + "livingjungle:jungleground", + "livingjungle:leafyjungleground", + "ethereal:mushroom_dirt", + "nightshade:nightshade_dirt_with_grass", + "japaneseforest:japanese_dirt_with_grass", + "bambooforest:dirt_with_bamboo", + "dorwinion:dorwinion_grass", + "badland:badland_grass", + "frost_land:frost_land_grass", + "prairie:prairie_dirt_with_grass", + "everness:dirt_with_crystal_grass", + "everness:dirt_with_cursed_grass", + "everness:coral_desert_stone_with_coal", + "everness:cursed_stone_carved_with_coal", + "everness:cursed_stone", + "everness:crystal_stone_with_coal", +} + +-- Ocean floor generation function +local function register_ocean_floor(name) + -- Get above and shore biome names + local above = name:sub(1,-7) -- to trim "_below" from the end of the biome name + local shore = above .. "_shore" + + -- Get biome + local biome = asuna.biomes[name] + + -- Register shore ocean floor terrain + minetest.register_decoration({ + deco_type = "schematic", + place_on = ocean_floor_replace, + sidelen = 80, + fill_ratio = 10, -- fill all + biomes = {name,shore,above}, + y_max = 0, + y_min = 0, + decoration = "default:stone", + spawn_by = "default:water_source", + num_spawn_by = 1, + place_offset_y = -1, + flags = "all_floors,force_placement", + schematic = { + size = { + x = 1, + y = 2, + z = 1, + }, + data = { + { name = "default:stone" , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + }, + }, + }) + + -- Register ocean floor terrain + minetest.register_decoration({ + deco_type = "schematic", + place_on = ocean_floor_replace, + sidelen = 80, + fill_ratio = 10, -- fill all + biomes = {name,shore,above}, + y_max = -1, + y_min = -10, + decoration = "default:stone", + spawn_by = "default:water_source", + num_spawn_by = 1, + place_offset_y = -3, + flags = "all_floors,force_placement", + schematic = { + size = { + x = 1, + y = 4, + z = 1, + }, + data = { + { name = "default:stone" , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + }, + }, + }) + + -- Register deep ocean floor terrain + minetest.register_decoration({ + deco_type = "schematic", + place_on = ocean_floor_replace, + sidelen = 80, + fill_ratio = 10, -- fill all + biomes = {name,shore,above}, + y_max = -11, + y_min = -36, + decoration = "default:stone", + spawn_by = "default:water_source", + num_spawn_by = 1, + place_offset_y = -3, + flags = "all_floors,force_placement", + schematic = { + size = { + x = 1, + y = 4, + z = 1, + }, + data = { + { name = "default:stone" , param1 = 255 , param2 = 0 }, + { name = biome.deep_seabed , param1 = 255 , param2 = 0 }, + { name = biome.deep_seabed , param1 = 255 , param2 = 0 }, + { name = biome.deep_seabed , param1 = 255 , param2 = 0 }, + }, + }, + }) + + -- Replace underwater surface nodes below sea level + minetest.register_decoration({ + deco_type = "schematic", + place_on = surface_spread, + spawn_by = { + "default:sand", + "default:water_source", + }, + num_spawn_by = 1, + sidelen = 4, + y_max = 0, + y_min = -10, + place_offset_y = -3, + fill_ratio = 10, + biomes = {name,shore,above}, + schematic = { + size = { + x = 1, + y = 4, + z = 1, + }, + data = { + { name = "default:stone" , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + { name = biome.seabed , param1 = 255 , param2 = 0 }, + }, + }, + flags = "all_floors,force_placement", + }) +end + +-- Generate ocean floor terrain +local seed = 124 +for _,biome in ipairs(asuna.biome_groups.below) do + register_ocean_floor(biome) +end + +-- Maximum pool limits +local limits = { + MAX_SCAN_DISTANCE = 3, + MAX_DEPTH = 2, + MAX_AREA = 89, +} + +-- Relevant content IDs +local cids = nil +minetest.register_on_mods_loaded(function() -- load after mapgen aliases are defined + cids = { + lava = minetest.get_content_id("mapgen_lava_source"), + water = minetest.get_content_id("mapgen_water_source"), + air = minetest.CONTENT_AIR, + ignore = minetest.CONTENT_IGNORE, + } +end) + +-- Array of flammable nodes to be avoided when placing lava along with invalid +-- pool edge nodes +local is_flammable = {} +local is_invalid = { + [minetest.CONTENT_AIR] = true +} +minetest.register_on_mods_loaded(function() + for node,def in pairs(minetest.registered_nodes) do + if def.groups and def.groups.flammable and def.groups.flammable > 0 then + is_flammable[minetest.get_content_id(node)] = true + is_invalid[minetest.get_content_id(node)] = true + elseif def.floodable + or def.drawtype == "airlike" + or def.drawtype == "liquid" + or def.drawtype == "flowingliquid" + or def.buildable_to + or def.walkable == false + or (def.groups and def.groups.not_in_creative_inventory and def.groups.not_in_creative_inventory > 0) + or node:find("_marker") -- mapgen marker names used by some mods + then + is_invalid[minetest.get_content_id(node)] = true + end + end +end) + +-- States that liquid pool nodes can be in +local nodestate = { + -- Invalid states + OUT_OF_BOUNDS = 128, -- outside of voxelarea or ignore nodes + INVALID = 64, -- nodes that cannot be part of a pool or pool borders + UNSATISFIABLE = 32, -- pool nodes that cannot be filled with liquid + MASK_INVALID = 128 + 64 + 32, -- combination of invalid states + + -- Single nodes above the pool to be replaced with air + ERASE = 16, -- surface nodes that have been flagged for erasure of nodes above + MASK_ERASURE = 16 + 64, -- nodes that will be erased if the pool is generated + + -- Directions + POSITIVE_Z = 8, + POSITIVE_X = 4, + NEGATIVE_Z = 2, + NEGATIVE_X = 1, + MASK_SATISFIED = 8 + 4 + 2 + 1, -- combination of all directions + + -- Blank state + NONE = 0, +} + +-- Monotonic map-like pool 'class' to track nodes and node states +local function Pool() + local nodemap = {} + local node_iterator = {} -- for fast, ordered, deterministic iteration + local size = 0 + local scan_queue = {} -- for collecting non-terminated nodes to be scanned + return { + add = function(node,state) + nodemap[node] = state + table.insert(node_iterator,node) + size = size + 1 + return state + end, + put = function(node,state) + nodemap[node] = state + return state + end, + get = function(node) + return nodemap[node] + end, + foreach = function(start,fn) + for i = start, size do + if not fn(node_iterator[i]) then + return false + end + end + return true + end, + size = function() + return size + end, + } +end + +-- Register advanced decoration +abdecor.register_advanced_decoration("asuna_cave_pools",{ + target = { + sidelen = 80, + fill_ratio = 0.0000925, + place_on = { + "group:stone", + "group:soil", + "default:clay", + "default:stone_with_coal_ore", + "default:stone_with_iron_ore", + "default:sand", + "default:silver_sand", + "default:desert_sand", + "default:gravel", + "default:coalblock", + "caverealms:coal_dust", + "everness:moss_block", + "everness:forsaken_desert_sand", + "everness:crystal_moss_block", + "everness:emerald_ice", + "everness:ancient_emerald_ice", + "everness:dense_emerald_ice", + "everness:frosted_ice", + "everness:frosted_ice_translucent", + "caverealms:stone_with_moss", + "caverealms:stone_with_lichen", + "caverealms:stone_with_algae", + "caverealms:stone_with_salt", + "caverealms:hot_cobble", + }, + y_max = -36, + y_min = -31000, + flags = "all_floors", + }, + fn = function(mapgen) + -- Get provided values + local va = mapgen.voxelarea + local vdata = mapgen.data + local pos = mapgen.pos + + -- Get stride values and set position + local ystride = va.ystride + local zstride = va.zstride + local pos = va:index(pos.x,pos.y,pos.z) + + -- Determine pool liquid based on climate + -- Dry/hot climates are more likely to be lava, vice-versa with water + local liquid = (function() + local heatmap = minetest.get_mapgen_object("heatmap") or {} + local humiditymap = minetest.get_mapgen_object("humiditymap") or {} + local pos2d = mapgen.index2d(mapgen.pos) + local heat = heatmap[pos2d] or 50 + local humidity = humiditymap[pos2d] or 50 + local climate = 50 + (heat / 2 - 25) - (humidity / 2 - 25) + local pos_random = PcgRandom(mapgen.seed):next(-29,29) + climate + return pos_random > 50 and cids.lava or cids.water + end)() + + -- Create new pool for nodes + local pool = Pool() + + -- VoxelManip offset lookup by direction + local adjacent = { + [nodestate.POSITIVE_X] = 1, + [nodestate.POSITIVE_Z] = zstride, + [nodestate.NEGATIVE_X] = -1, + [nodestate.NEGATIVE_Z] = -zstride, + } + + -- Recursive scanning function + local function scan(node,direction,distance,depth) + -- Get the node's state if it exists, else initialize it based on depth + -- and pool size limit + local state = pool.get(node) or pool.add(node,(function() + if depth == 1 and pool.size() > limits.MAX_AREA then + if is_invalid[vdata[node]] then + return nodestate.INVALID + else + return nodestate.UNSATISFIABLE + end + else + return nodestate.NONE + end + end)()) + + -- Return if this node is already in an invalid state + if state > 31 then + return bit.band(state,nodestate.MASK_INVALID) + end + + -- Return if this node is already satisfied in the given direction + if bit.band(state,direction) ~= 0 then + return direction + end + + -- Check if this node is out of bounds + local content = vdata[node] + if content == nil or content == cids.ignore then + return nodestate.OUT_OF_BOUNDS + end + + -- Check the validity of this node + if is_invalid[content] then + return pool.put(node,nodestate.INVALID) + end + + -- Return unsatisfiable if the node below is invalid + if is_invalid[vdata[node - ystride]] then + return pool.put(node,nodestate.UNSATISFIABLE) + end + + -- Return solution if this node is beyond the max scan distance + if distance > limits.MAX_SCAN_DISTANCE then + return direction + end + + -- Checks based on depth + local above = node + ystride + if depth == 1 then + -- Flag nodes above for erasure if the node above is solid and the node + -- above that is air, but this node is unsatisfiable if both the node + -- above and the node above that are solid + if bit.band(state,nodestate.ERASE) == 0 and vdata[above] ~= cids.air then + local above2 = above + ystride + if vdata[above2] == cids.air then + pool.add(above,nodestate.MASK_ERASURE) + else + -- Do not generate lava pools around flammable nodes that won't be + -- erased + if liquid == cids.lava and (is_flammable[vdata[above]] or is_flammable[vdata[above2]]) then + return nodestate.OUT_OF_BOUNDS + else + return pool.put(node,nodestate.UNSATISFIABLE) + end + end + state = bit.bor(state,nodestate.ERASE) -- flag this node as already having been checked for erasure + end + else + -- At non-surface depths, the node above must have been fully satisfied + -- in a previous scan + if bit.band(pool.get(above) or nodestate.NONE,nodestate.MASK_SATISFIED) ~= nodestate.MASK_SATISFIED then + return pool.put(node,nodestate.INVALID) + end + end + + -- Scan neighbor in the given direction + local neighbor = node + adjacent[direction] + local nstate = scan(neighbor,direction,distance + 1,depth) + + -- Return the direction if the neighbor is satisfied in the given direction + if nstate == direction or nstate == nodestate.UNSATISFIABLE then + pool.put(node,bit.bor(state,direction)) + return direction + end + + -- If neighbor is out of bounds, then the entire pool is invalid + if nstate == nodestate.OUT_OF_BOUNDS then + return nodestate.OUT_OF_BOUNDS + end + + -- If neighbor is invalid, then this node is unsatisfiable + if nstate == nodestate.INVALID then + return pool.put(node,nodestate.UNSATISFIABLE) + end + end + + -- Initialize pool with the target position and perform the scan + for depth = 1, limits.MAX_DEPTH do + pool.add(pos - (depth - 1) * ystride,nodestate.NONE) + local scan_count = 4 -- each of four -/+ x/z directions + local i = 0 + local scan_start = pool.size() -- optimization to skip nodes from prior scans + while i < scan_count do + local previous_size = pool.size() + local direction = bit.lshift(1,i % 4) -- cycle through directions + if not pool.foreach(scan_start,function(node) + return scan(node,direction,1,depth) ~= nodestate.OUT_OF_BOUNDS -- stop scanning immediately if out of bounds + end) then + return -- cannot render out of bounds pools + end + if pool.size() > previous_size then + scan_count = scan_count + 1 -- new nodes need additional scans + end + i = i + 1 + end + end + + -- Fill the pool and erase nodes above + pool.foreach(1,function(node) + local state = pool.get(node) + if bit.band(state,nodestate.MASK_SATISFIED) == nodestate.MASK_SATISFIED then + vdata[node] = liquid + elseif state == nodestate.MASK_ERASURE then + vdata[node] = cids.air + end + return true + end) + end, +}) + +--[[ + Schematics + - Placed before other biome mods in order to mitigate interference from trees, etc. +]] + +local mpath = minetest.get_modpath("asuna_core") + +-- Haunted house +minetest.register_decoration({ + name = "asuna_core:everness_haunted_house_badland", + deco_type = 'schematic', + place_on = "badland:badland_grass", + spawn_by = "badland:badland_grass", + num_spawn_by = 8, + sidelen = 80, + fill_ratio = 0.0000175, + biomes = "badland", + y_max = 31000, + y_min = 7, + place_offset_y = -1, + schematic = mpath .. '/schematics/everness/everness_haunted_house_badland.mts', + rotation = "random", + flags = 'place_center_x,place_center_z,force_placement', +}) + +-- Jungle temple +minetest.register_decoration({ + name = "asuna_core:everness_jungle_temple_new", + deco_type = 'schematic', + place_on = "group:soil", + spawn_by = "group:soil", + num_spawn_by = 8, + sidelen = 80, + fill_ratio = 0.0000275, + biomes = { + "rainforest", + "livingjungle:jungle", + }, + y_max = 31000, + y_min = 8, + place_offset_y = -3, + schematic = mpath .. '/schematics/everness/everness_jungle_temple_new.mts', + rotation = "random", + flags = 'place_center_x,place_center_z,force_placement', +}) + +-- Japanese shrine +minetest.register_decoration({ + name = "asuna_core:everness_japanese_shrine_new", + deco_type = 'schematic', + place_on = "group:soil", + spawn_by = "group:soil", + num_spawn_by = 7, + sidelen = 80, + fill_ratio = 0.0000175, + biomes = { + "bamboo", + "japaneseforest", + }, + y_max = 31000, + y_min = 8, + place_offset_y = -1, + schematic = mpath .. '/schematics/everness/everness_japanese_shrine_new.mts', + rotation = "random", + flags = 'place_center_x,place_center_z,force_placement', +}) + +-- Populate chests with loot +local asuna_core_everness_dids = {} +for _,decoration in ipairs({ + "asuna_core:everness_haunted_house_badland", + "asuna_core:everness_jungle_temple_new", + "asuna_core:everness_japanese_shrine_new", +}) do + local did = minetest.get_decoration_id(decoration) + minetest.set_gen_notify({decoration = true},{did}) + asuna_core_everness_dids["decoration#" .. did] = true +end + +minetest.register_on_generated(function(minp,maxp) + if maxp.y > 4 then + local gennotify = minetest.get_mapgen_object("gennotify") + for decoration_id,decorations in pairs(gennotify) do + if asuna_core_everness_dids[decoration_id] then + local chest_positions = minetest.find_nodes_in_area(minp,maxp,{ 'everness:chest' }) + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + return + end + end + end +end) \ No newline at end of file diff --git a/mods/asuna/asuna_textures/CREDITS.md b/mods/asuna/asuna_textures/CREDITS.md new file mode 100644 index 00000000..99ce0403 --- /dev/null +++ b/mods/asuna/asuna_textures/CREDITS.md @@ -0,0 +1,3 @@ +- Butterfly textures created by Hugues Alexandre Ross as part of the [RPG16 texture pack](https://content.minetest.net/packages/Hugues%20Ross/rpg16/) and distributed under the [Creative Commons Attribution-ShareAlike 4.0 International Public License](https://creativecommons.org/licenses/by-sa/4.0/). See `./textures/butterflies/LICENSE` for details. butterflies_butterfly_violet_animated.png was modified from its original version as a bugfix. +- Baunilha textures copied from [the Baunilha texture pack](https://content.minetest.net/packages/Mirtilo/baunilha/) created by [Mirtilo](https://content.minetest.net/users/Mirtilo/). These textures are distributed under the [Creative Commons Attribution-ShareAlike 4.0 International Public License](https://creativecommons.org/licenses/by-sa/4.0/). See `./textures/baunilha/LICENSE.txt` for details. +- Textures under `./textures/joe` by JoeEnderman, licensed CC0 \ No newline at end of file diff --git a/mods/asuna/asuna_textures/init.lua b/mods/asuna/asuna_textures/init.lua new file mode 100644 index 00000000..be6fb76c --- /dev/null +++ b/mods/asuna/asuna_textures/init.lua @@ -0,0 +1 @@ +-- no-op; this mod currently only supplies textures \ No newline at end of file diff --git a/mods/asuna/asuna_textures/mod.conf b/mods/asuna/asuna_textures/mod.conf new file mode 100644 index 00000000..0be0e311 --- /dev/null +++ b/mods/asuna/asuna_textures/mod.conf @@ -0,0 +1,4 @@ +name = asuna_textures +description = Textures overrides for Asuna +author = EmptyStar +depends = bottles, butterflies, everness, ethereal, farming, default, wool, x_farming \ No newline at end of file diff --git a/mods/asuna/asuna_textures/textures/baunilha/LICENSE.txt b/mods/asuna/asuna_textures/textures/baunilha/LICENSE.txt new file mode 100644 index 00000000..165ab01c --- /dev/null +++ b/mods/asuna/asuna_textures/textures/baunilha/LICENSE.txt @@ -0,0 +1,551 @@ +Many of the textures in this pack are edited from the original Minetest game files. Creator credits and licenses are below... + + +BlockMen (CC BY-SA 3.0) + some of the "bed" textures + default_aspen_leaves.png -- Derived from Sofar's texture + default_tool_steelsword.png + default_tool_*.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + farming_tool_diamondhoe.png + farming_tool_mesehoe.png + farming_tool_bronzehoe.png + farming_tool_steelhoe.png + farming_tool_stonehoe.png + farming_tool_woodhoe.png + +Cisoun's texture pack (CC BY-SA 3.0): + default_sapling.png + default_bush_sapling.png + default_tree.png + default_water.png + +RealBadAngel's animated water (CC BY-SA 3.0): + default_water_source_animated.png + default_water_flowing_animated.png + +Calinou (CC BY-SA 3.0): + default_brick.png + default_papyrus.png + +PilzAdam (CC BY-SA 3.0): + default_junglesapling.png + farming_bread.png + +Splizard (CC BY-SA 3.0): + default_pine_sapling.png + +paramat (CC BY-SA 3.0): + default_acacia_sapling.png + default_acacia_bush_sapling.png + default_acacia_tree.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png + default_dry_grass_side.png + default_dry_grass_*.png + default_grass_side.png -- Derived from a texture by TumeniNodes (CC-BY-SA 3.0) + default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) + default_emergent_jungle_sapling.png + gui_hotbar.png + default_stone_brick.png + default_desert_stone_brick.png + +TumeniNodes (CC BY-SA 3.0): + default_coniferous_litter.png + default_coniferous_litter_side.png + default_grass.png + +sofar (CC BY-SA 3.0): + default_aspen_sapling + default_aspen_tree + +Neuromancer (CC BY-SA 3.0): + default_furnace_*.png + +Gambit (CC BY-SA 3.0): + default_clay_lump.png + default_grass_*.png + default_paper.png + default_sign_wall_wood.png + default_snow.png + default_snow_side.png + default_snowball.png + default_book.png + keys_key.png + keys_key_skeleton.png + +asl97 (CC BY-SA 3.0): + default_ice.png + +CloudyProton (CC BY-SA 3.0): + default_book_written.png, based on default_book.png by Gambit + +Mossmanikin (CC BY-SA 3.0): + default_fern_*.png + +random-geek (CC BY-SA 3.0): + default_blueberry_bush_sapling.png + +Krock (CC0 1.0): + default_glass.png + default_glass_detail.png + +Extex101 (CC BY-SA 3.0) + default_large_cactus_seedling.png + default_dry_shrub.png -- Derived from the original texture by celeron55 + farming_cotton_wild.png + +An0n3m0us (CC BY-SA 3.0): + bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0) + +RHRhino (CC BY-SA 3.0): + flowers_dandelion_white.png + flowers_geranium.png + flowers_rose.png + flowers_tulip.png + flowers_viola.png + +paramat (CC BY-SA 3.0): + flowers_dandelion_yellow.png -- Derived from RHRhino's texture + flowers_tulip_black.png -- Derived from RHRhino's texture + flowers_chrysanthemum_green.png + +Vanessa Ezekowitz (CC BY-SA 3.0) + vessels_shelf.png + + + +All original textures in the pack are under CC-BY-SA-4.0: + + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.†The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed.png new file mode 100644 index 00000000..86dd6f04 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_fancy.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_fancy.png new file mode 100644 index 00000000..ab9f4426 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_fancy.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_foot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_foot.png new file mode 100644 index 00000000..3aca5621 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_foot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_head.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_head.png new file mode 100644 index 00000000..d40317a7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_head.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side1.png new file mode 100644 index 00000000..af380b82 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side2.png new file mode 100644 index 00000000..cf5deeab Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_bottom.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_bottom.png new file mode 100644 index 00000000..11052d8f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_bottom.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_bottom_r.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_bottom_r.png new file mode 100644 index 00000000..d34f67ab Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_bottom_r.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_top.png new file mode 100644 index 00000000..6b9fba7f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_top_r.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_top_r.png new file mode 100644 index 00000000..cc22dbf0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_side_top_r.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top1.png new file mode 100644 index 00000000..bcb5e170 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top2.png new file mode 100644 index 00000000..c4184c01 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top_bottom.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top_bottom.png new file mode 100644 index 00000000..99ecb433 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top_bottom.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top_top.png new file mode 100644 index 00000000..fae77b86 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_top_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_under.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_under.png new file mode 100644 index 00000000..34c8687f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/beds_bed_under.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/binoculars_binoculars.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/binoculars_binoculars.png new file mode 100644 index 00000000..6ad37a43 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/binoculars_binoculars.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/boats_inventory.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/boats_inventory.png new file mode 100644 index 00000000..05f0af66 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/boats_inventory.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/boats_wield.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/boats_wield.png new file mode 100644 index 00000000..05f0af66 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/boats_wield.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_bottom.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_bottom.png new file mode 100644 index 00000000..a53ecbea Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_bottom.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_front.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_front.png new file mode 100644 index 00000000..a36ceaa2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_front.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_rear.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_rear.png new file mode 100644 index 00000000..9c1ef96c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_rear.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_side.png new file mode 100644 index 00000000..0472afe6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_top.png new file mode 100644 index 00000000..e414a4b7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bones_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bubble.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bubble.png new file mode 100644 index 00000000..12deaa50 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bubble.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bubble_gone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bubble_gone.png new file mode 100644 index 00000000..9f38d817 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bubble_gone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket.png new file mode 100644 index 00000000..7bfc01a0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_lava.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_lava.png new file mode 100644 index 00000000..350d7de6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_lava.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_river_water.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_river_water.png new file mode 100644 index 00000000..4a2b4a23 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_river_water.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_water.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_water.png new file mode 100644 index 00000000..85d1b2ea Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/bucket_water.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart.png new file mode 100644 index 00000000..565a171f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_front.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_front.png new file mode 100644 index 00000000..fc22cca2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_front.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_side.png new file mode 100644 index 00000000..e938ddb2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_top.png new file mode 100644 index 00000000..3e7b27a5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_cart_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing.png new file mode 100644 index 00000000..f96748ee Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing_brk.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing_brk.png new file mode 100644 index 00000000..778337c7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing_brk.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing_pwr.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing_pwr.png new file mode 100644 index 00000000..096bd2f0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_crossing_pwr.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved.png new file mode 100644 index 00000000..eac5eb4d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved_brk.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved_brk.png new file mode 100644 index 00000000..196b8a91 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved_brk.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved_pwr.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved_pwr.png new file mode 100644 index 00000000..68b3596e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_curved_pwr.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight.png new file mode 100644 index 00000000..0c7e9ca2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight_brk.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight_brk.png new file mode 100644 index 00000000..82db6a7c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight_brk.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight_pwr.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight_pwr.png new file mode 100644 index 00000000..3026f1b2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_straight_pwr.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction.png new file mode 100644 index 00000000..aa6293d8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction_brk.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction_brk.png new file mode 100644 index 00000000..364ec019 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction_brk.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction_pwr.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction_pwr.png new file mode 100644 index 00000000..62958162 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/carts_rail_t_junction_pwr.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/character.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/character.png new file mode 100644 index 00000000..7d45c29c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/character.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/crack_anylength.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/crack_anylength.png new file mode 100644 index 00000000..23927262 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/crack_anylength.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/craftguide_furnace.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/craftguide_furnace.png new file mode 100644 index 00000000..04a9402d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/craftguide_furnace.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_bush_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_bush_sapling.png new file mode 100644 index 00000000..e405e9f7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_bush_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_bush_stem.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_bush_stem.png new file mode 100644 index 00000000..35dbb20f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_bush_stem.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_leaves.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_leaves.png new file mode 100644 index 00000000..a2a0baa2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_leaves.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_leaves_simple.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_leaves_simple.png new file mode 100644 index 00000000..6a6b9327 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_leaves_simple.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_sapling.png new file mode 100644 index 00000000..0f0d6d68 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_tree.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_tree.png new file mode 100644 index 00000000..65bc6f6a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_tree.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_tree_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_tree_top.png new file mode 100644 index 00000000..0be96d78 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_tree_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_wood.png new file mode 100644 index 00000000..927eb9fb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_acacia_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_apple.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_apple.png new file mode 100644 index 00000000..16ad9a15 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_apple.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_leaves.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_leaves.png new file mode 100644 index 00000000..6deb8561 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_leaves.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_sapling.png new file mode 100644 index 00000000..907928bb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_tree.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_tree.png new file mode 100644 index 00000000..16794026 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_tree.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_tree_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_tree_top.png new file mode 100644 index 00000000..b8154ff0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_tree_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_wood.png new file mode 100644 index 00000000..96ca55b8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_aspen_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberries.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberries.png new file mode 100644 index 00000000..e55a3438 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberries.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_bush_leaves.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_bush_leaves.png new file mode 100644 index 00000000..f613b654 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_bush_leaves.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_bush_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_bush_sapling.png new file mode 100644 index 00000000..43d47144 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_bush_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_overlay.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_overlay.png new file mode 100644 index 00000000..8ef76c6f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_blueberry_overlay.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_book.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_book.png new file mode 100644 index 00000000..f018abe1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_book.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_book_written.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_book_written.png new file mode 100644 index 00000000..58279dd6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_book_written.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bookshelf.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bookshelf.png new file mode 100644 index 00000000..6d898514 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bookshelf.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bookshelf_slot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bookshelf_slot.png new file mode 100644 index 00000000..91171b5d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bookshelf_slot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_brick.png new file mode 100644 index 00000000..19d84e70 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bronze_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bronze_block.png new file mode 100644 index 00000000..ac852f84 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bronze_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bronze_ingot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bronze_ingot.png new file mode 100644 index 00000000..51fe7905 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bronze_ingot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bush_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bush_sapling.png new file mode 100644 index 00000000..a8d34c4b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bush_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bush_stem.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bush_stem.png new file mode 100644 index 00000000..9ecb66b5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_bush_stem.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cactus_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cactus_side.png new file mode 100644 index 00000000..2fd990e1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cactus_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cactus_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cactus_top.png new file mode 100644 index 00000000..b7d78e1d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cactus_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_front.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_front.png new file mode 100644 index 00000000..93f803d2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_front.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_lock.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_lock.png new file mode 100644 index 00000000..fcbda24c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_lock.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_side.png new file mode 100644 index 00000000..46d25863 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_top.png new file mode 100644 index 00000000..8ded84b2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_chest_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay.png new file mode 100644 index 00000000..0dfc9dd7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay_brick.png new file mode 100644 index 00000000..4aad9814 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay_lump.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay_lump.png new file mode 100644 index 00000000..bbc69296 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_clay_lump.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coal_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coal_block.png new file mode 100644 index 00000000..07ce48f0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coal_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coal_lump.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coal_lump.png new file mode 100644 index 00000000..e93e8462 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coal_lump.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cobble.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cobble.png new file mode 100644 index 00000000..47f9e680 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_cobble.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coniferous_litter.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coniferous_litter.png new file mode 100644 index 00000000..aab46c1d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coniferous_litter.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coniferous_litter_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coniferous_litter_side.png new file mode 100644 index 00000000..57116b7a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_coniferous_litter_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_block.png new file mode 100644 index 00000000..23d9066e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_ingot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_ingot.png new file mode 100644 index 00000000..2483d26b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_ingot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_lump.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_lump.png new file mode 100644 index 00000000..9a1f4163 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_copper_lump.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_cobble.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_cobble.png new file mode 100644 index 00000000..abccc624 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_cobble.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sand.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sand.png new file mode 100644 index 00000000..5124ca39 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sand.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone.png new file mode 100644 index 00000000..6c857c66 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone_block.png new file mode 100644 index 00000000..7812b462 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone_brick.png new file mode 100644 index 00000000..64e88b67 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_sandstone_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone.png new file mode 100644 index 00000000..c03f330f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone_block.png new file mode 100644 index 00000000..53714f1e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone_brick.png new file mode 100644 index 00000000..a863d785 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_desert_stone_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_diamond.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_diamond.png new file mode 100644 index 00000000..1b946c53 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_diamond.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_diamond_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_diamond_block.png new file mode 100644 index 00000000..3ab8a70f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_diamond_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dirt.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dirt.png new file mode 100644 index 00000000..cbdaea54 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dirt.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_dirt.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_dirt.png new file mode 100644 index 00000000..27db0272 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_dirt.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass.png new file mode 100644 index 00000000..e2a8f194 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_1.png new file mode 100644 index 00000000..c153a5a4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_2.png new file mode 100644 index 00000000..5231defd Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_3.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_3.png new file mode 100644 index 00000000..b38db547 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_3.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_4.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_4.png new file mode 100644 index 00000000..206c44a0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_4.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_5.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_5.png new file mode 100644 index 00000000..4d4ffdf1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_5.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_side.png new file mode 100644 index 00000000..2a5a76eb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_grass_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_shrub.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_shrub.png new file mode 100644 index 00000000..650de36b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_dry_shrub.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_emergent_jungle_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_emergent_jungle_sapling.png new file mode 100644 index 00000000..8cafe3d5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_emergent_jungle_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_acacia_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_acacia_wood.png new file mode 100644 index 00000000..5e3f2134 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_acacia_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_aspen_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_aspen_wood.png new file mode 100644 index 00000000..5d969731 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_aspen_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_junglewood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_junglewood.png new file mode 100644 index 00000000..b92b2fd4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_junglewood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_overlay.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_overlay.png new file mode 100644 index 00000000..067e0739 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_overlay.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_pine_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_pine_wood.png new file mode 100644 index 00000000..a611f81f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_pine_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_acacia_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_acacia_wood.png new file mode 100644 index 00000000..aaa66b32 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_acacia_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_aspen_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_aspen_wood.png new file mode 100644 index 00000000..52fb0978 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_aspen_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_junglewood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_junglewood.png new file mode 100644 index 00000000..cfa6ef4e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_junglewood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_pine_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_pine_wood.png new file mode 100644 index 00000000..cc30d34a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_pine_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_wood.png new file mode 100644 index 00000000..7ee72b23 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_rail_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_wood.png new file mode 100644 index 00000000..5dd2b82b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fence_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_1.png new file mode 100644 index 00000000..6e346fab Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_2.png new file mode 100644 index 00000000..5bba2765 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_3.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_3.png new file mode 100644 index 00000000..06a69087 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_fern_3.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_front.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_front.png new file mode 100644 index 00000000..883376ea Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_front.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_front_active.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_front_active.png new file mode 100644 index 00000000..bafbd1d9 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_front_active.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_side.png new file mode 100644 index 00000000..367f4131 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_top.png new file mode 100644 index 00000000..5a2c57ae Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_furnace_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_glass.png new file mode 100644 index 00000000..72fd19cb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_glass_detail.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_glass_detail.png new file mode 100644 index 00000000..33831f47 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_glass_detail.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_block.png new file mode 100644 index 00000000..2b4ab7b8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_ingot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_ingot.png new file mode 100644 index 00000000..07d630d7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_ingot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_lump.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_lump.png new file mode 100644 index 00000000..adc8a66e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gold_lump.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass.png new file mode 100644 index 00000000..aa9bbd7d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_1.png new file mode 100644 index 00000000..76a0f9ae Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_2.png new file mode 100644 index 00000000..6258ab1f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_3.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_3.png new file mode 100644 index 00000000..a5103841 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_3.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_4.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_4.png new file mode 100644 index 00000000..fa9c9437 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_4.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_5.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_5.png new file mode 100644 index 00000000..685b4a9f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_5.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_side.png new file mode 100644 index 00000000..6b059251 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_grass_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gravel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gravel.png new file mode 100644 index 00000000..113d9c75 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_gravel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_ice.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_ice.png new file mode 100644 index 00000000..8c3fc137 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_ice.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_iron_lump.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_iron_lump.png new file mode 100644 index 00000000..1aa54619 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_iron_lump.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglegrass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglegrass.png new file mode 100644 index 00000000..c997f3b6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglegrass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungleleaves.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungleleaves.png new file mode 100644 index 00000000..944dfd4f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungleleaves.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungleleaves_simple.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungleleaves_simple.png new file mode 100644 index 00000000..6a9dcc06 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungleleaves_simple.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglesapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglesapling.png new file mode 100644 index 00000000..8945db85 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglesapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungletree.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungletree.png new file mode 100644 index 00000000..c6a57e86 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungletree.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungletree_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungletree_top.png new file mode 100644 index 00000000..f2b7c58e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_jungletree_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglewood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglewood.png new file mode 100644 index 00000000..5f25d43c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_junglewood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_ladder_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_ladder_wood.png new file mode 100644 index 00000000..cf912a86 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_ladder_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_large_cactus_seedling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_large_cactus_seedling.png new file mode 100644 index 00000000..7e489cf6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_large_cactus_seedling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava.png new file mode 100644 index 00000000..02ac1b46 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava_flowing_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava_flowing_animated.png new file mode 100644 index 00000000..18df6f34 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava_flowing_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava_source_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava_source_animated.png new file mode 100644 index 00000000..3aafb85e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_lava_source_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_leaves.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_leaves.png new file mode 100644 index 00000000..8084a39d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_leaves.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_leaves_simple.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_leaves_simple.png new file mode 100644 index 00000000..3ee9cf81 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_leaves_simple.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_1.png new file mode 100644 index 00000000..2ff93b85 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_2.png new file mode 100644 index 00000000..3ab03e23 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_3.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_3.png new file mode 100644 index 00000000..98c4b370 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_marram_grass_3.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_crystal.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_crystal.png new file mode 100644 index 00000000..9ea7ea52 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_crystal.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_crystal_fragment.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_crystal_fragment.png new file mode 100644 index 00000000..657a84ce Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_crystal_fragment.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_post_light_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_post_light_side.png new file mode 100644 index 00000000..ed99014c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_post_light_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_post_light_side_dark.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_post_light_side_dark.png new file mode 100644 index 00000000..ed99014c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mese_post_light_side_dark.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_meselamp.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_meselamp.png new file mode 100644 index 00000000..37a47487 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_meselamp.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_coal.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_coal.png new file mode 100644 index 00000000..de0c023d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_coal.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_copper.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_copper.png new file mode 100644 index 00000000..8848c171 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_copper.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_diamond.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_diamond.png new file mode 100644 index 00000000..8844e4cf Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_diamond.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_gold.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_gold.png new file mode 100644 index 00000000..dfc860fa Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_gold.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_iron.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_iron.png new file mode 100644 index 00000000..ac3406ed Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_iron.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_mese.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_mese.png new file mode 100644 index 00000000..97d066dd Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_mese.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_tin.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_tin.png new file mode 100644 index 00000000..c0e63a22 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mineral_tin.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_moss.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_moss.png new file mode 100644 index 00000000..78de3c4e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_moss.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_moss_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_moss_side.png new file mode 100644 index 00000000..7711b2d9 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_moss_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mossycobble.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mossycobble.png new file mode 100644 index 00000000..04509a1a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_mossycobble.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian.png new file mode 100644 index 00000000..350cf2a5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_block.png new file mode 100644 index 00000000..180f9fb6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_brick.png new file mode 100644 index 00000000..3ef96e09 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_glass.png new file mode 100644 index 00000000..cdd023c6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_glass_detail.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_glass_detail.png new file mode 100644 index 00000000..d36768a7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_glass_detail.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_shard.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_shard.png new file mode 100644 index 00000000..ab154bde Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_obsidian_shard.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_paper.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_paper.png new file mode 100644 index 00000000..a51752a6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_paper.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_papyrus.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_papyrus.png new file mode 100644 index 00000000..2a7b9216 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_papyrus.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_bush_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_bush_sapling.png new file mode 100644 index 00000000..05eedddc Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_bush_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_bush_stem.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_bush_stem.png new file mode 100644 index 00000000..d1a2ae26 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_bush_stem.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_needles.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_needles.png new file mode 100644 index 00000000..69e13baa Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_needles.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_sapling.png new file mode 100644 index 00000000..71df7784 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_tree.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_tree.png new file mode 100644 index 00000000..61730890 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_tree.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_tree_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_tree_top.png new file mode 100644 index 00000000..4134223c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_tree_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_wood.png new file mode 100644 index 00000000..1f533d57 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_pine_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_rainforest_litter.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_rainforest_litter.png new file mode 100644 index 00000000..7112cfb7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_rainforest_litter.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_rainforest_litter_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_rainforest_litter_side.png new file mode 100644 index 00000000..2b11ac8f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_rainforest_litter_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water.png new file mode 100644 index 00000000..be57575b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water_flowing_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water_flowing_animated.png new file mode 100644 index 00000000..52e6e8ec Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water_flowing_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water_source_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water_source_animated.png new file mode 100644 index 00000000..560078ee Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_river_water_source_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sand.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sand.png new file mode 100644 index 00000000..9a7263b7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sand.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone.png new file mode 100644 index 00000000..f35cbd5a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone_block.png new file mode 100644 index 00000000..97a9a868 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone_brick.png new file mode 100644 index 00000000..b1e42e63 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sandstone_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sapling.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sapling.png new file mode 100644 index 00000000..5a1ec20b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sapling.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sign_wall_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sign_wall_wood.png new file mode 100644 index 00000000..29fc7002 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sign_wall_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sign_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sign_wood.png new file mode 100644 index 00000000..ef23ff8d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_sign_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sand.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sand.png new file mode 100644 index 00000000..543765be Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sand.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone.png new file mode 100644 index 00000000..3d53068d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone_block.png new file mode 100644 index 00000000..a6f2e330 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone_brick.png new file mode 100644 index 00000000..a047810e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_silver_sandstone_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snow.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snow.png new file mode 100644 index 00000000..caf98c5d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snow.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snow_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snow_side.png new file mode 100644 index 00000000..23bf788b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snow_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snowball.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snowball.png new file mode 100644 index 00000000..15482165 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_snowball.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_steel_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_steel_block.png new file mode 100644 index 00000000..59f8cb46 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_steel_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_steel_ingot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_steel_ingot.png new file mode 100644 index 00000000..366afa13 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_steel_ingot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone.png new file mode 100644 index 00000000..52a4bba7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone_block.png new file mode 100644 index 00000000..a223f429 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone_brick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone_brick.png new file mode 100644 index 00000000..be047e77 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stone_brick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stones.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stones.png new file mode 100644 index 00000000..ea82938d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stones.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stones_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stones_side.png new file mode 100644 index 00000000..115c153e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_stones_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_block.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_block.png new file mode 100644 index 00000000..9d36f15d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_block.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_ingot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_ingot.png new file mode 100644 index 00000000..22730db5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_ingot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_lump.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_lump.png new file mode 100644 index 00000000..f89c1b98 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tin_lump.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzeaxe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzeaxe.png new file mode 100644 index 00000000..c2543cb3 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzeaxe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzepick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzepick.png new file mode 100644 index 00000000..1db2e9a0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzepick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzeshovel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzeshovel.png new file mode 100644 index 00000000..f695b7a9 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzeshovel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzesword.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzesword.png new file mode 100644 index 00000000..b71ddc2d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_bronzesword.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondaxe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondaxe.png new file mode 100644 index 00000000..ea80b3f7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondaxe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondpick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondpick.png new file mode 100644 index 00000000..7083cf8e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondpick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondshovel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondshovel.png new file mode 100644 index 00000000..9cb5cd77 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondshovel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondsword.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondsword.png new file mode 100644 index 00000000..c129aa8a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_diamondsword.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_meseaxe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_meseaxe.png new file mode 100644 index 00000000..e14d6568 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_meseaxe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_mesepick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_mesepick.png new file mode 100644 index 00000000..1898a909 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_mesepick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_meseshovel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_meseshovel.png new file mode 100644 index 00000000..4fb4df05 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_meseshovel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_mesesword.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_mesesword.png new file mode 100644 index 00000000..bd9eec5f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_mesesword.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelaxe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelaxe.png new file mode 100644 index 00000000..f8e74886 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelaxe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelpick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelpick.png new file mode 100644 index 00000000..e26687b2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelpick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelshovel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelshovel.png new file mode 100644 index 00000000..9a86e85e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelshovel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelsword.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelsword.png new file mode 100644 index 00000000..aa7f1814 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_steelsword.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stoneaxe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stoneaxe.png new file mode 100644 index 00000000..96309d4f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stoneaxe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stonepick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stonepick.png new file mode 100644 index 00000000..d38d9d58 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stonepick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stoneshovel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stoneshovel.png new file mode 100644 index 00000000..b130da05 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stoneshovel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stonesword.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stonesword.png new file mode 100644 index 00000000..54d069e4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_stonesword.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodaxe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodaxe.png new file mode 100644 index 00000000..2ee22223 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodaxe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodpick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodpick.png new file mode 100644 index 00000000..7a09bf2e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodpick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodshovel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodshovel.png new file mode 100644 index 00000000..0b152dfd Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodshovel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodsword.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodsword.png new file mode 100644 index 00000000..0db09f04 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tool_woodsword.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_torch_on_floor.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_torch_on_floor.png new file mode 100644 index 00000000..bc68f46f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_torch_on_floor.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_torch_on_floor_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_torch_on_floor_animated.png new file mode 100644 index 00000000..2aca2484 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_torch_on_floor_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tree.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tree.png new file mode 100644 index 00000000..ccffdacc Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tree.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tree_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tree_top.png new file mode 100644 index 00000000..3012851e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_tree_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water.png new file mode 100644 index 00000000..095eb5ef Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water_flowing_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water_flowing_animated.png new file mode 100644 index 00000000..ccb18cdc Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water_flowing_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water_source_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water_source_animated.png new file mode 100644 index 00000000..0fad6a93 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_water_source_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_wood.png new file mode 100644 index 00000000..acd675ca Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/default_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_glass.png new file mode 100644 index 00000000..5d11f0cf Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_obsidian_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_obsidian_glass.png new file mode 100644 index 00000000..20bcc9ba Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_obsidian_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_steel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_steel.png new file mode 100644 index 00000000..d8463cfb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_steel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_wood.png new file mode 100644 index 00000000..c10822be Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_door_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_glass.png new file mode 100644 index 00000000..15083338 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_obsidian_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_obsidian_glass.png new file mode 100644 index 00000000..2a5a78c3 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_obsidian_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_steel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_steel.png new file mode 100644 index 00000000..cf268301 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_steel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_wood.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_wood.png new file mode 100644 index 00000000..5087b9ad Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_item_wood.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor.png new file mode 100644 index 00000000..8b67ee33 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_side.png new file mode 100644 index 00000000..0c04602d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_steel.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_steel.png new file mode 100644 index 00000000..d44486ee Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_steel.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_steel_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_steel_side.png new file mode 100644 index 00000000..f9a67531 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/doors_trapdoor_steel_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_black.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_black.png new file mode 100644 index 00000000..c8710d93 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_black.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_blue.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_blue.png new file mode 100644 index 00000000..b58d652c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_blue.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_brown.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_brown.png new file mode 100644 index 00000000..bb2f9f86 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_brown.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_cyan.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_cyan.png new file mode 100644 index 00000000..85708878 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_cyan.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_dark_green.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_dark_green.png new file mode 100644 index 00000000..30f26bcb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_dark_green.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_dark_grey.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_dark_grey.png new file mode 100644 index 00000000..3ce95a73 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_dark_grey.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_green.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_green.png new file mode 100644 index 00000000..e4bf6187 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_green.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_grey.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_grey.png new file mode 100644 index 00000000..305e2496 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_grey.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_magenta.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_magenta.png new file mode 100644 index 00000000..2edd26c6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_magenta.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_orange.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_orange.png new file mode 100644 index 00000000..acdbcf0d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_orange.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_pink.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_pink.png new file mode 100644 index 00000000..41f8a711 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_pink.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_red.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_red.png new file mode 100644 index 00000000..2f3dfd3c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_red.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_violet.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_violet.png new file mode 100644 index 00000000..a6f89d6d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_violet.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_white.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_white.png new file mode 100644 index 00000000..787f40d4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_white.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_yellow.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_yellow.png new file mode 100644 index 00000000..cedcde61 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/dye_yellow.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_bread.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_bread.png new file mode 100644 index 00000000..3bc34005 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_bread.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton.png new file mode 100644 index 00000000..3157f79d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_1.png new file mode 100644 index 00000000..c4491df3 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_2.png new file mode 100644 index 00000000..e6e75971 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_3.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_3.png new file mode 100644 index 00000000..e654eda8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_3.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_4.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_4.png new file mode 100644 index 00000000..013a79b8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_4.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_5.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_5.png new file mode 100644 index 00000000..2cd1a178 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_5.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_6.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_6.png new file mode 100644 index 00000000..1b61fbed Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_6.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_7.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_7.png new file mode 100644 index 00000000..575a9bda Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_7.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_8.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_8.png new file mode 100644 index 00000000..729d3cb0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_8.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_wild.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_wild.png new file mode 100644 index 00000000..7acfca0e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_cotton_wild.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil.png new file mode 100644 index 00000000..10fcfa20 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil_wet.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil_wet.png new file mode 100644 index 00000000..42ae1204 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil_wet.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil_wet_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil_wet_side.png new file mode 100644 index 00000000..1db9a7ac Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_desert_sand_soil_wet_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_flour.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_flour.png new file mode 100644 index 00000000..4422f478 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_flour.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_soil.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_soil.png new file mode 100644 index 00000000..d6e8cd6f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_soil.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_soil_wet.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_soil_wet.png new file mode 100644 index 00000000..79c7f9a4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_soil_wet.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_straw.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_straw.png new file mode 100644 index 00000000..49c72836 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_straw.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_string.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_string.png new file mode 100644 index 00000000..49fe9c7b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_string.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_bronzehoe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_bronzehoe.png new file mode 100644 index 00000000..d59085a0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_bronzehoe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_diamondhoe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_diamondhoe.png new file mode 100644 index 00000000..7dd446ae Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_diamondhoe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_mesehoe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_mesehoe.png new file mode 100644 index 00000000..92464b78 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_mesehoe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_steelhoe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_steelhoe.png new file mode 100644 index 00000000..baf115ae Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_steelhoe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_stonehoe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_stonehoe.png new file mode 100644 index 00000000..d9f1ae57 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_stonehoe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_woodhoe.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_woodhoe.png new file mode 100644 index 00000000..83bab457 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_tool_woodhoe.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat.png new file mode 100644 index 00000000..d6016d9b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_1.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_1.png new file mode 100644 index 00000000..9ef6e4af Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_1.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_2.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_2.png new file mode 100644 index 00000000..fec8dfe9 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_2.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_3.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_3.png new file mode 100644 index 00000000..797ae4c7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_3.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_4.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_4.png new file mode 100644 index 00000000..d626c8de Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_4.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_5.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_5.png new file mode 100644 index 00000000..16198d19 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_5.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_6.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_6.png new file mode 100644 index 00000000..643e349a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_6.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_7.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_7.png new file mode 100644 index 00000000..912b01dd Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_7.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_8.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_8.png new file mode 100644 index 00000000..d787a54a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/farming_wheat_8.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/fireflies_bugnet.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/fireflies_bugnet.png new file mode 100644 index 00000000..5e4f24aa Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/fireflies_bugnet.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_chrysanthemum_green.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_chrysanthemum_green.png new file mode 100644 index 00000000..08d120aa Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_chrysanthemum_green.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_dandelion_white.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_dandelion_white.png new file mode 100644 index 00000000..82010c38 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_dandelion_white.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_dandelion_yellow.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_dandelion_yellow.png new file mode 100644 index 00000000..b5e30e42 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_dandelion_yellow.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_geranium.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_geranium.png new file mode 100644 index 00000000..2978931b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_geranium.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_mushroom_brown.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_mushroom_brown.png new file mode 100644 index 00000000..1befd3c1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_mushroom_brown.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_mushroom_red.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_mushroom_red.png new file mode 100644 index 00000000..9777afd7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_mushroom_red.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_rose.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_rose.png new file mode 100644 index 00000000..23b14886 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_rose.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_tulip.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_tulip.png new file mode 100644 index 00000000..949ab32a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_tulip.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_tulip_black.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_tulip_black.png new file mode 100644 index 00000000..fe4f4e1b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_tulip_black.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_viola.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_viola.png new file mode 100644 index 00000000..ac234055 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_viola.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_waterlily.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_waterlily.png new file mode 100644 index 00000000..27c072ef Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_waterlily.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_waterlily_bottom.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_waterlily_bottom.png new file mode 100644 index 00000000..463d57a4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/flowers_waterlily_bottom.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_formbg.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_formbg.png new file mode 100644 index 00000000..4c358443 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_formbg.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_furnace_arrow_bg.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_furnace_arrow_bg.png new file mode 100644 index 00000000..636474b6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_furnace_arrow_bg.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_furnace_arrow_fg.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_furnace_arrow_fg.png new file mode 100644 index 00000000..035b1c1b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_furnace_arrow_fg.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_hotbar.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_hotbar.png new file mode 100644 index 00000000..fbd18a79 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_hotbar.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_hotbar_selected.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_hotbar_selected.png new file mode 100644 index 00000000..00df7822 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/gui_hotbar_selected.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/heart.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/heart.png new file mode 100644 index 00000000..3629376c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/heart.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/heart_gone.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/heart_gone.png new file mode 100644 index 00000000..419df66e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/heart_gone.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/keys_key.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/keys_key.png new file mode 100644 index 00000000..833a6d4a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/keys_key.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/keys_key_skeleton.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/keys_key_skeleton.png new file mode 100644 index 00000000..822605e7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/keys_key_skeleton.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/map_mapping_kit.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/map_mapping_kit.png new file mode 100644 index 00000000..03c6c8fd Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/map_mapping_kit.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_outer_stairside.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_outer_stairside.png new file mode 100644 index 00000000..be1bc242 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_outer_stairside.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_split.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_split.png new file mode 100644 index 00000000..bef50c9a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_split.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_stairside.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_stairside.png new file mode 100644 index 00000000..e03df56b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_glass_stairside.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_outer_stairside.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_outer_stairside.png new file mode 100644 index 00000000..e074e8fb Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_outer_stairside.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_split.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_split.png new file mode 100644 index 00000000..a6cd6e0d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_split.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_stairside.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_stairside.png new file mode 100644 index 00000000..d5beb021 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/stairs_obsidian_glass_stairside.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_boom.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_boom.png new file mode 100644 index 00000000..d2f88696 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_boom.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_bottom.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_bottom.png new file mode 100644 index 00000000..1df82227 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_bottom.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_crossing_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_crossing_animated.png new file mode 100644 index 00000000..129e0755 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_crossing_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_curved_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_curved_animated.png new file mode 100644 index 00000000..7caf569d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_curved_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_straight_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_straight_animated.png new file mode 100644 index 00000000..03e7655a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_straight_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_t_junction_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_t_junction_animated.png new file mode 100644 index 00000000..c08b406c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_burning_t_junction_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_crossing.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_crossing.png new file mode 100644 index 00000000..42d2eee8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_crossing.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_curved.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_curved.png new file mode 100644 index 00000000..4b972500 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_curved.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_inventory.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_inventory.png new file mode 100644 index 00000000..7c95f9c9 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_inventory.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_straight.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_straight.png new file mode 100644 index 00000000..f362cbd5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_straight.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_t_junction.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_t_junction.png new file mode 100644 index 00000000..f85fd4ba Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_gunpowder_t_junction.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_side.png new file mode 100644 index 00000000..6926244d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_smoke.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_smoke.png new file mode 100644 index 00000000..a5dffa6c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_smoke.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_tnt_stick.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_tnt_stick.png new file mode 100644 index 00000000..0bf6d50e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_tnt_stick.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top.png new file mode 100644 index 00000000..0261741d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top_burning.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top_burning.png new file mode 100644 index 00000000..3524407d Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top_burning.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top_burning_animated.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top_burning_animated.png new file mode 100644 index 00000000..ad4f2e8c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/tnt_top_burning_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_drinking_glass.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_drinking_glass.png new file mode 100644 index 00000000..a482c2e5 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_drinking_glass.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_drinking_glass_inv.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_drinking_glass_inv.png new file mode 100644 index 00000000..005fec5b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_drinking_glass_inv.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_glass_bottle.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_glass_bottle.png new file mode 100644 index 00000000..33d547fc Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_glass_bottle.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_glass_fragments.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_glass_fragments.png new file mode 100644 index 00000000..46973dff Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_glass_fragments.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_shelf.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_shelf.png new file mode 100644 index 00000000..8532299b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_shelf.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_shelf_slot.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_shelf_slot.png new file mode 100644 index 00000000..b9d4e001 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_shelf_slot.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_steel_bottle.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_steel_bottle.png new file mode 100644 index 00000000..6f0b80a6 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/vessels_steel_bottle.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/wieldhand.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/wieldhand.png new file mode 100644 index 00000000..724bb000 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/wieldhand.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_bar.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_bar.png new file mode 100644 index 00000000..af4ba1a1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_bar.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_door_steel_bar.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_door_steel_bar.png new file mode 100644 index 00000000..1de29877 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_door_steel_bar.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_item_steel_bar.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_item_steel_bar.png new file mode 100644 index 00000000..4de87cc3 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_item_steel_bar.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_trapdoor_steel_bar.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_trapdoor_steel_bar.png new file mode 100644 index 00000000..d175d56a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_trapdoor_steel_bar.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_trapdoor_steel_bar_side.png b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_trapdoor_steel_bar_side.png new file mode 100644 index 00000000..c1512ea0 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Minetest Game/xpanes_trapdoor_steel_bar_side.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_bg.png b/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_bg.png new file mode 100644 index 00000000..a6c7fa4c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_bg.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_fg.png b/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_fg.png new file mode 100644 index 00000000..dd6269e8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_fg.png differ diff --git a/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_poison.png b/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_poison.png new file mode 100644 index 00000000..eadc6a6f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/baunilha/Stamina/stamina_hud_poison.png differ diff --git a/mods/asuna/asuna_textures/textures/butterflies/LICENSE b/mods/asuna/asuna_textures/textures/butterflies/LICENSE new file mode 100644 index 00000000..203e0da3 --- /dev/null +++ b/mods/asuna/asuna_textures/textures/butterflies/LICENSE @@ -0,0 +1,103 @@ +Creative Commons Attribution-ShareAlike 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. + Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. + Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + Licensor means the individual(s) or entity(ies) granting rights under this Public License. + Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + License grant. + Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + reproduce and Share the Licensed Material, in whole or in part; and + produce, reproduce, and Share Adapted Material. + Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + Term. The term of this Public License is specified in Section 6(a). + Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + Downstream recipients. + Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + Other rights. + Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + Patent and trademark rights are not licensed under this Public License. + To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + Attribution. + + If You Share the Licensed Material (including in modified form), You must: + retain the following if it is supplied by the Licensor with the Licensed Material: + identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + a copyright notice; + a notice that refers to this Public License; + a notice that refers to the disclaimer of warranties; + a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + ShareAlike. + + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. + You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and + You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. diff --git a/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_red.png b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_red.png new file mode 100644 index 00000000..c6432996 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_red.png differ diff --git a/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_red_animated.png b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_red_animated.png new file mode 100644 index 00000000..f47ef34e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_red_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_violet.png b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_violet.png new file mode 100644 index 00000000..54cd31d8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_violet.png differ diff --git a/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_violet_animated.png b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_violet_animated.png new file mode 100644 index 00000000..25c786c1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_violet_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_white.png b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_white.png new file mode 100644 index 00000000..7ba3443b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_white.png differ diff --git a/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_white_animated.png b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_white_animated.png new file mode 100644 index 00000000..7c57395a Binary files /dev/null and b/mods/asuna/asuna_textures/textures/butterflies/butterflies_butterfly_white_animated.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/CREDITS.md b/mods/asuna/asuna_textures/textures/custom/CREDITS.md new file mode 100644 index 00000000..4e1deb5d --- /dev/null +++ b/mods/asuna/asuna_textures/textures/custom/CREDITS.md @@ -0,0 +1,4 @@ +- `crosshair.png`, `object_crosshair.png`, and `ethereal_mushroom_block.png` created from scratch by EmptyStar, dedicated to the public domain, [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +- `vessels_glass_bottle_mask.png` derivied from `vessels_glass_bottle.png` by Mirtilo from the Baunilha texture pack, licensed [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) +- `default_mese_block.png` is a re-palette of a texture by JoeEnderman, originally dedicated to the public domain [CC0](https://creativecommons.org/publicdomain/zero/1.0/), edited by EmptyStar and also dedicated to the public domain [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +- `farming_tomato_soup.png` and `ethereal_mushroom_soup.png` by JoeEnderman, dedicated to the public domain [CC0](https://creativecommons.org/publicdomain/zero/1.0/) \ No newline at end of file diff --git a/mods/asuna/asuna_textures/textures/custom/crosshair.png b/mods/asuna/asuna_textures/textures/custom/crosshair.png new file mode 100644 index 00000000..46147717 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/crosshair.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/default_mese_block.png b/mods/asuna/asuna_textures/textures/custom/default_mese_block.png new file mode 100644 index 00000000..a45342f8 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/default_mese_block.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/ethereal_mushroom_block.png b/mods/asuna/asuna_textures/textures/custom/ethereal_mushroom_block.png new file mode 100644 index 00000000..d01a923e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/ethereal_mushroom_block.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/ethereal_mushroom_soup.png b/mods/asuna/asuna_textures/textures/custom/ethereal_mushroom_soup.png new file mode 100644 index 00000000..74b6afed Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/ethereal_mushroom_soup.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/farming_tomato_soup.png b/mods/asuna/asuna_textures/textures/custom/farming_tomato_soup.png new file mode 100644 index 00000000..84104173 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/farming_tomato_soup.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/object_crosshair.png b/mods/asuna/asuna_textures/textures/custom/object_crosshair.png new file mode 100644 index 00000000..03ae7c85 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/object_crosshair.png differ diff --git a/mods/asuna/asuna_textures/textures/custom/vessels_glass_bottle_mask.png b/mods/asuna/asuna_textures/textures/custom/vessels_glass_bottle_mask.png new file mode 100644 index 00000000..448aceb4 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/custom/vessels_glass_bottle_mask.png differ diff --git a/mods/asuna/asuna_textures/textures/ethereal/LICENSE b/mods/asuna/asuna_textures/textures/ethereal/LICENSE new file mode 100644 index 00000000..05fd9da1 --- /dev/null +++ b/mods/asuna/asuna_textures/textures/ethereal/LICENSE @@ -0,0 +1,455 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 2023 Atlante + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. \ No newline at end of file diff --git a/mods/asuna/asuna_textures/textures/ethereal/cherry_leaves_particul.png b/mods/asuna/asuna_textures/textures/ethereal/cherry_leaves_particul.png new file mode 100644 index 00000000..53b6069f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/ethereal/cherry_leaves_particul.png differ diff --git a/mods/asuna/asuna_textures/textures/ethereal/ethereal_sakura_leaves.png b/mods/asuna/asuna_textures/textures/ethereal/ethereal_sakura_leaves.png new file mode 100644 index 00000000..5779edfc Binary files /dev/null and b/mods/asuna/asuna_textures/textures/ethereal/ethereal_sakura_leaves.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass.png b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass.png new file mode 100644 index 00000000..773f309e Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_0.png b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_0.png new file mode 100644 index 00000000..7e70a59b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_0.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_1.png b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_1.png new file mode 100644 index 00000000..072471e1 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_1.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_2.png b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_2.png new file mode 100644 index 00000000..878d8214 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_2.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_3.png b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_3.png new file mode 100644 index 00000000..54d078d2 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_3.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_side.png b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_side.png new file mode 100644 index 00000000..7f5a4413 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_crystal_grass_side.png differ diff --git a/mods/asuna/asuna_textures/textures/everness/everness_sparkling_crystal_grass.png b/mods/asuna/asuna_textures/textures/everness/everness_sparkling_crystal_grass.png new file mode 100644 index 00000000..8ff7e19f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/everness/everness_sparkling_crystal_grass.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/LICENSE b/mods/asuna/asuna_textures/textures/x_farming/LICENSE new file mode 100644 index 00000000..eacbe348 --- /dev/null +++ b/mods/asuna/asuna_textures/textures/x_farming/LICENSE @@ -0,0 +1 @@ +Textures in this folder licensed [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by SaKeL \ No newline at end of file diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_black.png b/mods/asuna/asuna_textures/textures/x_farming/wool_black.png new file mode 100644 index 00000000..64273af7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_black.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_blue.png b/mods/asuna/asuna_textures/textures/x_farming/wool_blue.png new file mode 100644 index 00000000..77eccf32 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_blue.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_brown.png b/mods/asuna/asuna_textures/textures/x_farming/wool_brown.png new file mode 100644 index 00000000..fb1d4e55 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_brown.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_cyan.png b/mods/asuna/asuna_textures/textures/x_farming/wool_cyan.png new file mode 100644 index 00000000..0c90b8d7 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_cyan.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_dark_green.png b/mods/asuna/asuna_textures/textures/x_farming/wool_dark_green.png new file mode 100644 index 00000000..62ebd8af Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_dark_green.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_dark_grey.png b/mods/asuna/asuna_textures/textures/x_farming/wool_dark_grey.png new file mode 100644 index 00000000..519b32a9 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_dark_grey.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_green.png b/mods/asuna/asuna_textures/textures/x_farming/wool_green.png new file mode 100644 index 00000000..ac557007 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_green.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_grey.png b/mods/asuna/asuna_textures/textures/x_farming/wool_grey.png new file mode 100644 index 00000000..cdd8fa25 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_grey.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_light_blue.png b/mods/asuna/asuna_textures/textures/x_farming/wool_light_blue.png new file mode 100644 index 00000000..a2d5337f Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_light_blue.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_magenta.png b/mods/asuna/asuna_textures/textures/x_farming/wool_magenta.png new file mode 100644 index 00000000..4166191c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_magenta.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_orange.png b/mods/asuna/asuna_textures/textures/x_farming/wool_orange.png new file mode 100644 index 00000000..cda0791c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_orange.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_pink.png b/mods/asuna/asuna_textures/textures/x_farming/wool_pink.png new file mode 100644 index 00000000..fa79944c Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_pink.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_red.png b/mods/asuna/asuna_textures/textures/x_farming/wool_red.png new file mode 100644 index 00000000..6976cc5b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_red.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_violet.png b/mods/asuna/asuna_textures/textures/x_farming/wool_violet.png new file mode 100644 index 00000000..99340581 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_violet.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_white.png b/mods/asuna/asuna_textures/textures/x_farming/wool_white.png new file mode 100644 index 00000000..efa18479 Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_white.png differ diff --git a/mods/asuna/asuna_textures/textures/x_farming/wool_yellow.png b/mods/asuna/asuna_textures/textures/x_farming/wool_yellow.png new file mode 100644 index 00000000..b0b5c18b Binary files /dev/null and b/mods/asuna/asuna_textures/textures/x_farming/wool_yellow.png differ diff --git a/mods/asuna/modpack.txt b/mods/asuna/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/awards/.gitattributes b/mods/awards/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/mods/awards/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/mods/awards/.gitignore b/mods/awards/.gitignore new file mode 100644 index 00000000..b9d6bd92 --- /dev/null +++ b/mods/awards/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/mods/awards/.gitlab-c.yml b/mods/awards/.gitlab-c.yml new file mode 100644 index 00000000..1e20853d --- /dev/null +++ b/mods/awards/.gitlab-c.yml @@ -0,0 +1,8 @@ +image: abaez/luarocks + +test: + stage: test + before_script: + - luarocks install --local luacheck + script: + - $HOME/.luarocks/bin/luacheck . diff --git a/mods/awards/.luacheckrc b/mods/awards/.luacheckrc new file mode 100644 index 00000000..f6b420e8 --- /dev/null +++ b/mods/awards/.luacheckrc @@ -0,0 +1,14 @@ +unused_args = false +allow_defined_top = true + +globals = { + "minetest", "awards", +} + +read_globals = { + string = {fields = {"split"}}, + table = {fields = {"copy", "getn"}}, + "vector", "default", "ItemStack", + "dump", "sfinv", "intllib", + "unified_inventory", +} diff --git a/mods/awards/LICENSE.txt b/mods/awards/LICENSE.txt new file mode 100644 index 00000000..b9bc22e4 --- /dev/null +++ b/mods/awards/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2013-8 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/mods/awards/README.md b/mods/awards/README.md new file mode 100644 index 00000000..544ff649 --- /dev/null +++ b/mods/awards/README.md @@ -0,0 +1,330 @@ +# Awards + +Adds awards/achievements to Minetest (plus a very good API). + +by [rubenwardy](https://rubenwardy.com), licensed under MIT. +With thanks to Wuzzy, kaeza, and MrIbby. + +Majority of awards are back ported from Calinou's old fork in Carbone, under same license. + + +# Introduction + +## Awards and Triggers + +An award is a single unlockable unit, registered like so: + +```lua +awards.register_award("mymod:award", { + description = "My Example Award", +}) +``` + +Awards are unlocked either using `awards.unlock()` or by a trigger being +fullfilled. A trigger is a condition which unlocks an award. Triggers are +registered at the same time as an award is registered: + +```lua +awards.register_award("mymod:award", { + description = "My Example Award", + trigger = { + type = "dig", + node = "default:stone", + target = 10, + }, +}) +``` + +The above trigger type is an example of a counted_key trigger: +rather than a single counter there's a counter per key - in this +case the key is the value of the `node` field. + +If you leave out the key in a `counted_key` trigger, then the total will be used +instead. For example, here is an award which unlocks after you've placed 10 +nodes of any type: + +```lua +awards.register_award("mymod:award", { + description = "Place 10 nodes!", + trigger = { + type = "place", + target = 10, + }, +}) +``` + +You can also register an *Unlock Function*, which can return the name of an +award to unlock it: + +```lua +awards.register_award("mymod:award", { + title = "Lava Miner", + description = "Mine any block while being very close to lava.", +}) + +awards.register_on_dig(function(player, data) + local pos = player:get_pos() + if pos and (minetest.find_node_near(pos, 1, "default:lava_source") or + minetest.find_node_near(pos, 1, "default:lava_flowing")) then + return "mymod:award" + end + return nil +end) +``` + +The above is a bad example as you don't actually need the stats data given. +It would be better to register a `dignode` callback and call `awards.unlock()` +if the condition is met. + +## Trigger Types + +The trigger type is used to determine which event will cause the trigger will be +fulfilled. The awards mod comes with a number of predefined types, documented +in [Builtin Trigger Types](#builtin-trigger-types). + +Trigger types are registered like so: + +```lua +awards.register_trigger("chat", { + type = "counted", + progress = "@1/@2 chat messages", + auto_description = { "Send a chat message", "Chat @1 times" }, +}) + +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player or string.find(message, "/") then + return + end + awards.notify_chat(player) +end) +``` + +A trigger type has a type as well, which determines how the data is stored and +also how the trigger is fulfilled. + +**Trigger Type Types:** + +* **custom** requires you handle the calling of awards.unlock() yourself. You also + need to implement on_register() yourself. You'll also probably want to implement + `on_register()` to catch awards registered with your trigger type. +* **counted** stores a single counter for each player which is incremented by calling + `trigger:notify(player)`. Good for homogenous actions like number of chat messages, + joins, and the like. +* **counted_key** stores a table of counters each indexed by a key. There is also + a total field (`__total`) which stores the sum of all counters. A counter is + incremented by calling `trigger:notify(player, key)`. This is good for things like + placing nodes or crafting items, where the key will be the item or node name. + If `key` is an item, then you should also add `key_is_item = true` to the + trigger type definition. + +As said, you could use a custom trigger if none of the other ones match your needs. +Here's an example. + +```lua +awards.register_trigger("foo", { + type = "custom", + progress = "@1/@2 foos", + auto_description = { "Do a foo", "Foo @1 times" }, + + on_register = function(self, award) + print(award.name .. " was registered with foo trigger type") + end, +}) + +minetest.register_on_foo(function() + for _, trigger in pairs(awards.on.foo) do + -- trigger is either a trigger tables or + -- or an unlock function. + + -- some complex logic + if condition then + awards.unlock(trigger) + end + end +end) + +``` + +## Award Difficulty + +Difficulty is used to determine how awards are sorted in awards lists. + +If the award trigger is counted, ie: the trigger requires a `target` property, +then the difficulty multipler is timesd by `target` to get the overall difficulty. +If the award isn't a counted type then the difficulty multiplier is used as the +overal difficulty. Award difficulty affects how awards are sorted in a list - +more difficult awards are further down the list. + +In real terms, `difficulty` is a relative difficulty to do one unit of the trigger +if its counted, otherwise it's the relative difficulty of completely doing the +award (if not-counted). For the `dig` trigger type, 1 unit would be 1 node dug. + + +Actual code used to calculate award difficulty: + +```lua +local difficulty = def.difficulty or 1 +if def.trigger and def.trigger.target then + difficulty = difficulty * def.trigger.target +end +``` + + +# API + +## Awards + +* `awards.register_award(name, def)`, the def table has the following fields: + * `title` - title of the award (defaults to name) + * `description` - longer description of the award, displayed in Awards tab + * `difficulty` - see [Award Difficulty](#award-difficulty). + * `requires` - list of awards that need to be unlocked before this one + is visible. + * `prizes` - list of items to give when you earn the award + * `secret` - boolean if this award is secret (i.e. showed on awards list) + * `sound` - `SimpleSoundSpec` table to play on unlock. + `false` to disable unlock sound. + * `icon` - the icon image. Defaults to `awards_unknown.png`. + * `hud_background` - the background image used in the HUD to contain the text and icon. + Defaults to `awards_bg_default.png`. + * `trigger` - trigger definition, see [Builtin Trigger Types](#builtin-trigger-types). + * `on_unlock(name, def)` - callback on unlock. +* `awards.registered_awards` - table of award name to definition. +* `awards.register_on_unlock(func(name, def))` + * `name` is the player name + * `def` is the award def. + * return true to cancel HUD from appearing. +* `awards.unlock(player_name, award_name)` + * gives an award to a player +* `awards.remove(player_name, award_name)` + * removes an award from a player +* `awards.get_award_states(player_name)` + * Returns list of tables, sorted by `score`, each having the fields: + + ```lua + { + name = "mymod:awardname", + def = {}, -- Award definition + unlocked = true, -- Whether award has been unlocked + started = true, -- Whether any progress has been made + score = 0, -- Score used in sorting + + -- Either a table or nil + -- Will be nil if progress is indeterminable or + -- if the award is unlocked + progress = { + current = 5, + target = 10, + label = "label", -- Label to show over progress bar + } + } + ``` + +## Triggers + +* `awards.register_trigger(name, def)`, the def table has the following fields: + * `type` - see trigger type types in [Trigger Types](#trigger-types). + * `progress` - used to format progress, defaults to "%1/%2". + * `auto_description` - a table of two elements. Each element is a format string. Element 1 is singular, element 2 is plural. Used for the award description (not title) if none is given. + * `on_register(self, award_def)` - called when an award registers with this type. + * "counted_key" only: + * `auto_description_total` - Used if the trigger is for the total. + * `get_key(self, def)` - get key for particular award, return nil for a total. + * `key_is_item` - true if the key is an item name. On notify(), + any watched groups will also be notified as `group:groupname` keys. +* `awards.registered_triggers` - table of trigger name to definition. + +## Builtin Trigger Types + +Callbacks (register a function to be run) + +* dig type: Dig a node. + * node: the dug node type. If nil, all dug nodes are counted +* place type: Place a node. + * node: the placed node type. If nil, all placed nodes are counted +* craft type: Craft something. + * item: the crafted item type. If nil, all crafted items are counted +* death type: Die. + * reason: the death reason, one of the types in PlayerHPChangeReason (see lua_api.txt) + or nil for total deaths. +* chat type: Write a chat message. +* join type: Join the server. +* eat type: Eat an item. + * item: the eaten item type. If nil, all eaten items are counted + +(for all types) target - how many times to dig/place/craft/etc. + +Each type has a register function like so: + +* awards.register_on_TRIGGERTYPE(func(player, data)) + * data is the player stats data + * return award name or null + +### dig + +```lua +trigger = { + type = "dig", + node = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### place + +```lua +trigger = { + type = "place", + node = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### craft + +```lua +trigger = { + type = "craft", + item = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### death + +```lua +trigger = { + type = "death", + reason = "fall", + target = 5, +} +``` + +### chat + +```lua +trigger = { + type = "chat", + target = 100, +} +``` + +### join + +```lua +trigger = { + type = "join", + target = 100, +} +``` + +### eat + +```lua +trigger = { + type = "eat", + item = "default:apple", + target = 100, +} +``` diff --git a/mods/awards/init.lua b/mods/awards/init.lua new file mode 100644 index 00000000..21d8b3dd --- /dev/null +++ b/mods/awards/init.lua @@ -0,0 +1,61 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +-- Internationalization support. +local S = minetest.get_translator(minetest.get_current_modname()) + +-- The global award namespace +awards = { + show_mode = "hud", + registered_awards = {}, + registered_goals = {}, + registered_triggers = {}, + on_unlock = {}, + translator = S, +} + +-- Load files +if asuna.content.wayfarer.awards then + local modpath = minetest.get_modpath(minetest.get_current_modname()).."/src" + dofile(modpath.."/data.lua") + dofile(modpath.."/api_awards.lua") + dofile(modpath.."/api_triggers.lua") + dofile(modpath.."/chat_commands.lua") + dofile(modpath.."/gui.lua") + dofile(modpath.."/triggers.lua") + + awards.load() + minetest.register_on_shutdown(awards.save) + + local function check_save() + awards.save() + minetest.after(18, check_save) + end + minetest.after(8 * math.random() + 10, check_save) +else + -- Dummy out API functions + local function noop() end + awards.unlock = noop + awards.get_formspec = noop + awards.show_to = noop + awards.register_on_dig = noop + awards.register_on_place = noop + awards.register_on_death = noop + awards.register_on_chat = noop + awards.register_on_join = noop + awards.register_on_craft = noop + awards.registered_awards = noop + awards.register_award = noop +end + +-- Backwards compatibility +awards.give_achievement = awards.unlock +awards.getFormspec = awards.get_formspec +awards.showto = awards.show_to +awards.register_onDig = awards.register_on_dig +awards.register_onPlace = awards.register_on_place +awards.register_onDeath = awards.register_on_death +awards.register_onChat = awards.register_on_chat +awards.register_onJoin = awards.register_on_join +awards.register_onCraft = awards.register_on_craft +awards.def = awards.registered_awards +awards.register_achievement = awards.register_award diff --git a/mods/awards/locale/awards.de.tr b/mods/awards/locale/awards.de.tr new file mode 100644 index 00000000..fd5b0437 --- /dev/null +++ b/mods/awards/locale/awards.de.tr @@ -0,0 +1,259 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!=Auszeichnung freigeschaltet! +Award Unlocked: %s=Auszeichnung freigeschaltet: %s +Secret Award Unlocked!=Versteckte Auszeichnung freigeschaltet! +Secret Award Unlocked: %s=Versteckte Auszeichnung freigeschaltet: %s + +### awards.lua ### +A Cat in a Pop-Tart?!=Eine Katze im Pop-Tart?! +Architect=Architekt +Aspiring Farmer=Aufstrebender Bauer +Backpacker=Rucksacktourist +Baker=Bäcker +Banker=Banker +Bricker=Ziegler +Build a Cave=Höhlenbauer +Builder=Bauarbeiter +Burn to death in a fire.=Verbrenne im Feuer. +Castorama=Gießmeister +Craft 10 furnaces.=Fertigen Sie 10 Öfen. +Craft 10 mese lamps.=Fertigen Sie 10 Meselampen. +Craft 100 obsidian bricks.=Fertigen Sie 100 Obsidianziegel. +Craft 100 sandstone bricks.=Fertigen Sie 100 Sandsteinziegel. +Craft 100 sticks.=Fertigen Sie 100 Stöcke. +Craft 100 white dyes.=Fertigen Sie 100 weiße Farbstoffe. +Craft 14 vessels shelves.=Fertigen Sie 14 Gefäßregale. +Craft 15 chests.=Fertigen Sie 15 Truhen. +Craft 15 fancy beds.=Fertigen Sie 15 schicke Betten. +Craft 200 brick blocks.=Fertigen Sie 200 Ziegelblöcke. +Craft 200 stone bricks.=Fertigen Sie 200 Steinziegel. +Craft 24 gold block stairs.=Fertigen Sie 24 Goldblockstufen. +Craft 250 white wool.=Fertigen Sie 250 weiße Wolle. +Craft 3,200 stone bricks.=Fertigen Sie 3200 Steinziegel. +Craft 30 locked chests.=Fertigen Sie 30 abgeschlossene Truhen. +Craft 4 large bags.=Fertigen Sie 4 große Taschen. +Craft 400 blue dyes.=Fertigen Sie 400 blaue Farbstoffe. +Craft 400 desert stone bricks.=Fertigen Sie 400 Wüstensteinziegel. +Craft 400 red dyes.=Fertigen Sie 400 rote Farbstoffe. +Craft 400 yellow dyes.=Fertigen Sie 400 gelbe Farbstoffe. +Craft 500 times oil extract.=Fertigen Sie 500 mal Ölextrakte. +Craft 7 bookshelves.=Fertigen Sie 7 Bücherregale. +Craft 8 times flint and steel.=Fertigen Sie 8 mal einen Feuerstein und Stahl an. +Craft 800 stone bricks.=Fertigen Sie 800 Steinziegel an. +Craft a diamond block.=Fertigen Sie einen Diamantblock an. +Crafter of Sticks=Stockmacher +Dandelions are Yellow=Löwenzahn ist gelb +Death in the Deeps=Tod in der Tiefe +Desert Discoverer=Wüstenerkunder +Desert Dweller=Wüstenbewohner +Die 100 times.=Sterben Sie 100 mal. +Die above 10000=Sterben Sie über 10.000 . +Die below -10000=Sterben Sie unter -10.000 . +Die in flowing lava.=Sterben Sie in fließender Lava. +Die near bones.=Sterben Sie in der Nähe von Knochen. +Die near diamond ore.=Sterben Sie in der Nähe von Diamantenadern. +Dig 1,000 copper ores.=Bauen Sie 1000 Kupfererze ab. +Dig 1,000 jungle tree blocks.=Bauen Sie 1000 Dschungelbaumblöcke ab. +Dig 1,000 sand.=Bauen Sie 1000 Sand ab. +Dig 1,000 stone blocks.=Bauen Sie 1000 Steine ab. +Dig 1,296 tree blocks.=Bauen Sie 1296 Baumblöcke ab. +Dig 10,000 stone blocks.=Bauen Sie 10000 Steine ab. +Dig 100 jungle tree blocks.=Bauen Sie 100 Dschungelbaumblöcke ab. +Dig 100 stone blocks.=Bauen Sie 100 Steinblöcke ab. +Dig 216 tree blocks.=Bauen Sie 216 Baumblöcke ab. +Dig 36 tree blocks.=Bauen Sie 36 Baumblöcke ab. +Dig 6 tree blocks.=Bauen Sie 6 Baumblöcke ab. +Eat 10 loaves of bread.=Essen Sie 10 Brote. +Eat 3 brown mushrooms.=Essen Sie 3 braune Pilze. +Eat 33 brown mushrooms.=Essen Sie 33 braune Pilze. +Eat 333 brown mushrooms.=Essen Sie 333 braune Pilze. +Eat 80 apples.=Essen Sie 80 Äpfel. +Electical Engineer=Elektroingeniuer +Engineer=Ingenieur +Factory=Fabrik +Far Lands=Ferne Lande +Farming Skills Acquired=Landwirtschaft erlernt +Field Worker=Feldarbeiter +Filthy Rich=Stinkreich +Firefighter=Feuerwehr +First Day in the Woods=Erster Tag im Wald +First Gold Find=Erster Goldfund +First Mese Find=Erster Mesefund +Fortress=Burg +Geraniums are Blue=Geranien sind blau +Girl's Best Friend=Bester Freund der Mädchen +Glacier Discoverer=Gletschererkunder +Glasser=Glasmacher +Gold Rush=Goldrausch +Grasslands Discoverer=Prärieerkunder +Graveyard=Friedhof +Hardened Miner=Abhehärteter Bergarbeiter +Hardest Block on Earth=Härtester Block der Welt +Harvest 125 fully grown wheat plants.=Ernten Sie 125 voll ausgewachsene Getreidepflanzen. +Harvest 25 fully grown wheat plants.=Ernten Sie 25 voll ausgewachsene Getreidepflanzen. +Harvest 625 fully grown wheat plants.=Ernten Sie 625 voll ausgewachsene Getreidepflanzen. +Harvest a fully grown wheat plant.=Ernten Sie eine voll ausgewachsene Getreidepflanze. +Hotelier=Hotelier +House of Obsidian=Haus aus Obsidian +In space, no one can hear you scream=Im Weltall hört niemand deine Schreie +In the Dungeon=Im Verlies +In the Flow=Flow-Erlebnis +Industrial Age=Industriezeitalter +Item transporter=Gegenstandtransporteur +Jungle Discoverer=Dschungelerkunder +Junglebaby=Dschungelbaby +Jungleman=Dschungelmann +Lava Miner=Lavagräber +Lava and Water=Lava und Wasser +Light It Up=Licht an! +Little Library=Kleine Bücherei +Long Ladder=Lange Leiter +Lumberjack=Holzfäller +Marchand De Sable=Sandmann +Master Architect=Meisterarchitekt +Master Miner=Profibergarbeiter +Mese Mastery=Mesemeister +Mine 18 diamond ores.=Bauen Sie 18 Diamanterze ab. +Mine 45 gold ores.=Bauen Sie 18 Diamanterze ab. +Mine 50 obsidian.=Bauen Sie 50 Obsidian ab. +Mine a mese block.=Bauen Sie einen Meseblock ab. +Mine a mossy cobblestone.=Bauen Sie ein bemoostes Kopfsteinpflaster ab. +Mine a nyan cat.=Bauen Sie eine Nyan Cat ab. +Mine any block while being very close to lava.=Bauen Sie einen beliebigen Block ab, während Sie sehr nahe an der Lava stehen. +Mine some dry grass.=Bauen Sie etwas trockenes Gras ab. +Mine some grass.=Bauen Sie etwas Gras ab. +Mine your first cactus.=Bauen Sie Ihren ersten Kaktus ab. +Mine your first diamond ore.=Bauen Sie Ihr erstes Diamanterz ab. +Mine your first dry shrub.=Bauen Sie Ihren ersten vertrockneten Strauch ab. +Mine your first gold ore.=Bauen Sie Ihr erstes Golderz ab. +Mine your first ice.=Bauen Sie Ihr erstes Eis ab. +Mine your first jungle grass.=Bauen Sie Ihr erstes Dschungelgras ab. +Mine your first mese ore.=Bauen Sie Ihr erstes Meseerz ab. +Mine your first obsidian.=Bauen Sie Ihr erstes Obsidian ab. +Mini Miner=Berganfänger +Mushroom Lover=Pilzfreund +Obsessed with Obsidian=Von Obsidian besessen +Oil Tycoon=Ölmagnat +On The Way=Auf dem Weg +Outpost=Außenposten +Pharaoh=Pharao +Place 1,000 torches.=Platzieren Sie 1000 Fackeln. +Place 100 rails.=Platzieren Sie 100 Gleise. +Place 100 stone.=Platzieren Sie 100 Steine. +Place 100 torches.=Platzieren Sie 100 Fackeln. +Place 10000 tubes.=Platzieren Sie 10.000 Rohre. +Place 2 trap stones.=Platzieren Sie 2 Fallensteine. +Place 20 coal checkers.=Platzieren Sie 20 Kohlenschachbrettmuster. +Place 20 iron checkers.=Platzieren Sie 20 Eisenschachbrettmuster. +Place 40 steel ladders.=Platzieren Sie 40 Stahlleitern. +Place 400 wooden ladders.=Platzieren Sie 400 Holzleitern. +Place 5 autocrafters.=Platzieren Sie 5 Autohersteller. +Place 500 mesecon wires.=Platzieren Sie 500 Mesecon Kabeln. +Place two snow blocks.=Platzieren Sie zwei Schneeblöcke. +Professional Lumberjack=Profiholzfäller +Put out 1000 fires.=Löschen Sie 1000 Flammen. +Pyromaniac=Pyromane +Really Well Lit=Sehr gute Beleuchtung +Roses Are Red=Rosen sind rot +Saint-Maclou=Saint-Maclou +Sam the Trapper=Sam der Fallensteller +Savannah Discoverer=Savannenerkunder +Semi-pro Lumberjack=Fortgeschrittener Holzfäller +Smelter=Schmelzer +Tasty Mushrooms=Leckere Pilze +This is Sad=Echt Schade +Treasurer=Schatzmeister +Underground Mushroom Farmer=Unterirdischer Pilzbauer +Very Simple Snow Man=Sehr simpler Schneemann +Watchtower=Wachturm +Well Lit=Gut ausgeleuchtet +Wheat Magnate=Getreidemagnat +White Color Stock=Weißer Farbstoffvorrat +Wool Over Your Eyes=Wollige Augen +Wow, I am Diamonds!=Wow, ich bin Diamanten! +You Suck!=Das geht dir nicht +You're a witch!=Du bist eine Hexe! +You’re a copper=Du Kupfer! +Yummy!=Lecker! + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.=All Ihre Auszeichnugen und Statistiken wurden zurückgesetzt. Sie können nun von vorne anfangen. +Award not found.=Auszeichnung nicht gefunden. +Get the awards statistics for the given player or yourself=Auszeichnungsstatistiken für anderen oder für Sie selber abrufen. +Show details of an award=Details einer Auszeichnung anzeigen. +Show, clear, disable or enable your awards=Auszeichnungen zeigen, löschen, deaktivieren oder aktivieren. +You have disabled awards.=Sie haben die Auszeichnugen deaktiviert. +You have enabled awards.=Sie haben die Auszeichnugen aktiviert. +[c|clear|disable|enable]=[c|clear|disable|enable] + +### gui.lua ### +%s’s awards:=%ss Auszeichnungen: +(Secret Award)=(Geheime Auszeichnung) +@1 (unlocked)=@1 (freigeschaltet) +Awards=Auszeichnungen +Error: No achivements available.=Fehler: Keine Auszeichnungen verfügbar. +Error: No award available.=Fehler: Keine Auszeichnung verfügbar. +OK=OK +Unlock this award to find out what it is.=Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. +You have not unlocked any awards.=Sie haben noch keine Auszeichnungen. +You've disabled awards. Type /awards enable to reenable.=Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um sie wieder zu aktivieren. + +### triggers.lua ### +@1/@2 chat messages=@1/@2 Chatnachrichten +@1/@2 crafted=@1/@2 gefertigt +@1/@2 deaths=@1/@2 Tode +@1/@2 dug=@1/@2 abgebaut +@1/@2 eaten=@1/@2 gegessen +@1/@2 joins=@1/@2 beigetreten +@1/@2 placed=@1/@2 platziert +Chat @1 times=Chatten Sie @1 mal. +Craft @1 item=Stellen Sie @1 Gegenstand her. +Craft @1 items.=Stellen Sie @1 Gegenstände her. +Craft: @1×@2=Stellen Sie @1x@2 her. +Craft: @2=Stellen Sie @2 her. +Die @1 times of @2=Sterben Sie @1 mal von @2. +Die @1 times.=Sterben Sie @1 mal. +Die once of @2=Sterben Sie einmal von @2. +Eat @1 item=Essen Sie @1 Gegenstand. +Eat @1 items.=Essen Sie @1 Gegenstände. +Eat @1×@2=Essen Sie @1x@2. +Eat @2=Essen Sie @2. +Join @1 times=Treten Sie @1 mal bei. +Join once=Treten Sie einmal bei. +Mine @1 block.=Bauen Sie @1 Block. +Mine @1 blocks.=Bauen Sie @1 Blöcke. +Mine @1 times=Bauen Sie @1 mal ab. +Mine: @1×@2=Bauen Sie @1x@2 ab. +Mine: @2=Bauen Sie @2 ab. +Place @1 block.=Platzieren Sie @1 Block. +Place @1 blocks.=Platzieren Sie @1 Blöcke. +Place: @1×@2=Platzieren Sie: @1x@2 +Place: @2=Platzieren Sie: @2 +Send a chat message=Versenden Sie eine Chatnachricht + + +##### not used anymore ##### + +%s: %s=%s: %s +Secret Achievement Unlocked:=Geheime Auszeichnung erhalten: +Achievement Unlocked:=Auszeichnung erhalten: +Secret Achievement Unlocked: %s=Geheime Auszeichnung erhalten: %s +Achievement Unlocked: %s=Auszeichnung erhalten: %s +Secret Achievement Unlocked!=Geheime Auszeichnung erhalten! +Achievement Unlocked!=Auszeichnung erhalten: +Error: No awards available.=Fehler: Keine Auszeichnungen vorhanden. +%s (got)=%s (erhalten) +@1/@2 game joins=@1/@2 Spielen beigetreten +Bankier=Bankier +Constructor=Konstrukteur +Show, clear, disable or enable your achievements=Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen +You have disabled your achievements.=Sie haben Ihre Auszeichnungen deaktiviert. +You have enabled your achievements.=Sie haben Ihre Auszeichnungen aktiviert. += +Show details of an achievement=Details einer Auszeichnung anzeigen +Achievement not found.=Auszeichnung nicht gefunden. +Get the achievements statistics for the given player or yourself=Die Statistik der Auszeichnungen eines Spielers zeigen diff --git a/mods/awards/locale/awards.es.tr b/mods/awards/locale/awards.es.tr new file mode 100644 index 00000000..91d24169 --- /dev/null +++ b/mods/awards/locale/awards.es.tr @@ -0,0 +1,259 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!= +Award Unlocked: %s= +Secret Award Unlocked!= +Secret Award Unlocked: %s= + +### awards.lua ### +A Cat in a Pop-Tart?!=¡¿Un Gato en un Pop-Tart?! +Architect=Arquitecto +Aspiring Farmer=Aspirante a Granjero +Backpacker=Mochilero +Baker=Panadero +Banker= +Bricker=Ladrillero +Build a Cave=Construye Una Cueva +Builder=Hacedor +Burn to death in a fire.= +Castorama=Castorama +Craft 10 furnaces.=Elaborar 10 hornos. +Craft 10 mese lamps.=Elaborar 10 lámparas de MESE. +Craft 100 obsidian bricks.=Elaborar 100 ladrillos de obsidiana. +Craft 100 sandstone bricks.=Elaborar 200 ladrillos de arenisca. +Craft 100 sticks.=Elaborar 100 varitas. +Craft 100 white dyes.=Elabora 100 colorantes blancos. +Craft 14 vessels shelves.=Elabora 14 estanterías para botellas. +Craft 15 chests.=Elaborar 15 cofres. +Craft 15 fancy beds.=Elabora 15 camas de lujo. +Craft 200 brick blocks.=Elaborar 200 bloques de ladrillo. +Craft 200 stone bricks.=Elaborar 200 ladrillos de piedra. +Craft 24 gold block stairs.=Elabora 24 escaleras de bloque de oro. +Craft 250 white wool.=Elabora 250 bloques de lana blanca. +Craft 3,200 stone bricks.=Elaborar 3.200 ladrillos de piedra. +Craft 30 locked chests.=Elaborar 30 bloques cerrados. +Craft 4 large bags.=Elaborar 4 bolsas grandes. +Craft 400 blue dyes.=Elabora 400 colorantes azules. +Craft 400 desert stone bricks.=Elaborar 400 ladrillos de piedra desértica. +Craft 400 red dyes.=Elabora 400 colorantes rojos. +Craft 400 yellow dyes.=Elabora 400 colorantes amarillos. +Craft 500 times oil extract.= +Craft 7 bookshelves.=Elaborar 7 libreros. +Craft 8 times flint and steel.=Elaborar pedernal y hierro 8 veces. +Craft 800 stone bricks.=Elaborar 800 ladrillos de piedra. +Craft a diamond block.=Elaborar un bloque de diamante. +Crafter of Sticks=Elaborador de Varitas +Dandelions are Yellow=Los Dientes de León Son Amarillos +Death in the Deeps= +Desert Discoverer=Descubridor del Desierto +Desert Dweller=Morador Desértico +Die 100 times.= +Die above 10000= +Die below -10000= +Die in flowing lava.= +Die near bones.= +Die near diamond ore.= +Dig 1,000 copper ores.=Excavar 1.000 minerales de cobre +Dig 1,000 jungle tree blocks.=Cortar 1.000 árboles selváticos. +Dig 1,000 sand.=Cavar 1.000 bloques de arena. +Dig 1,000 stone blocks.=Excavar 1.000 bloques de piedra. +Dig 1,296 tree blocks.=Cortar 1.296 árboles. +Dig 10,000 stone blocks.=Excavar 10.000 bloques de piedra. +Dig 100 jungle tree blocks.=Cortar 100 árboles selváticos. +Dig 100 stone blocks.=Excavar 100 bloques de piedra. +Dig 216 tree blocks.=Cortar 216 árboles. +Dig 36 tree blocks.=Cortar 36 árboles. +Dig 6 tree blocks.=Cortar 6 árboles. +Eat 10 loaves of bread.=Come 10 rebanadas de pan. +Eat 3 brown mushrooms.=Come 3 hongos marrones. +Eat 33 brown mushrooms.=Come 33 hongos marrones. +Eat 333 brown mushrooms.=Come 333 hongos marrones. +Eat 80 apples.=Come 80 manzanas. +Electical Engineer= +Engineer= +Factory= +Far Lands=Tierras Lejanas +Farming Skills Acquired=Habilidades de Granja Adquiridas +Field Worker=Trabajador de Campo +Filthy Rich=Sucio Rico +Firefighter=Bombero +First Day in the Woods=Primer Día en el Bosque +First Gold Find=Primer Encuentro de Oro +First Mese Find=Primer Encuentro de MESE +Fortress=Fortaleza +Geraniums are Blue=Los Geranios Son Azules +Girl's Best Friend=El Mejor Amigo de Las Mujeres +Glacier Discoverer=Descubridor del Glaciar +Glasser=Vidriero +Gold Rush=Fiebre del Oro +Grasslands Discoverer=Descubridor de Praderas +Graveyard= +Hardened Miner=Minero Curtido +Hardest Block on Earth=El Bloque Más Duro Sobre La Tierra +Harvest 125 fully grown wheat plants.=Cosecha 125 plantas de trigo maduras. +Harvest 25 fully grown wheat plants.=Cosecha 25 plantas de trigo maduras. +Harvest 625 fully grown wheat plants.=Cosecha 625 plantas de trigo maduras. +Harvest a fully grown wheat plant.=Cosecha una plantas de trigo madura. +Hotelier=Hotelero +House of Obsidian=Casa de Obsidiana +In space, no one can hear you scream= +In the Dungeon=En Las Mazmorras +In the Flow= +Industrial Age=Era Industrial +Item transporter= +Jungle Discoverer=Descubridor de Selva +Junglebaby=Bebé de la Selva +Jungleman=Hombre de la Selva +Lava Miner=Minero de Lava +Lava and Water=Lava y Agua +Light It Up=Ilumínalo +Little Library=Pequeña Biblioteca +Long Ladder=Escalerilla Larga +Lumberjack=Leñador +Marchand De Sable=Marchand De Sable +Master Architect=Maestro Arquitecto +Master Miner=Minero Maestro +Mese Mastery=Maestría de MESE +Mine 18 diamond ores.=Excava 10 diamantes. +Mine 45 gold ores.=Excavar 45 pepitas de oro. +Mine 50 obsidian.=Excavar 50 obsidianas. +Mine a mese block.=Excava tu primer bloque de MESE. +Mine a mossy cobblestone.=Excavar unos adoquines musgosos. +Mine a nyan cat.=Excavar un Gato Nyan. +Mine any block while being very close to lava.=Excavar un bloque cerca de lava. +Mine some dry grass.=Cortar un poco de pasto seco. +Mine some grass.=Cortar un poco de pasto. +Mine your first cactus.=Cortar tu primer cácto. +Mine your first diamond ore.=Excava tu primer diamante. +Mine your first dry shrub.=Cortar tu primer arbusto seco +Mine your first gold ore.=Excavar tu primer pepita de oro. +Mine your first ice.=Romper tu primer bloque de hielo. +Mine your first jungle grass.=Cortar tu primer pasto de selva. +Mine your first mese ore.=Excava tu primer mineral de MESE. +Mine your first obsidian.=Excavar tu primera obsidiana. +Mini Miner=Mini Minero +Mushroom Lover=Amante de los Hongos +Obsessed with Obsidian=Obsesionado con la Obsidiana +Oil Tycoon= +On The Way=En Camino +Outpost=Puesto de avanzada +Pharaoh=Faraón +Place 1,000 torches.=Colocar 1.000 antorchas. +Place 100 rails.=Colocar 100 rieles. +Place 100 stone.=Coloca 100 piedras. +Place 100 torches.=Colocar 100 antorchas. +Place 10000 tubes.= +Place 2 trap stones.=Colocar 2 piedras trampa. +Place 20 coal checkers.=Colocar 20 baldosas de ajedrez de carbón. +Place 20 iron checkers.=Colocar 20 baldosas de ajedrez de hierro. +Place 40 steel ladders.=Coloca 40 escalerillas de acero. +Place 400 wooden ladders.=Coloca 400 escalerillas de madera. +Place 5 autocrafters.= +Place 500 mesecon wires.= +Place two snow blocks.=Colocar dos bloques de nieve. +Professional Lumberjack=Leñador profesional +Put out 1000 fires.=Apagar 1000 incendios. +Pyromaniac=Piromaníaco +Really Well Lit=Realmente Bien Iluminado +Roses Are Red=Las Rosas Son Rojas +Saint-Maclou=Saint-Maclou +Sam the Trapper=Sam el Atrapador +Savannah Discoverer=Descubridor de Savana +Semi-pro Lumberjack=Leñador semi-profesional +Smelter=Fundidor +Tasty Mushrooms=Ricos Hongos +This is Sad= +Treasurer=Tesorero +Underground Mushroom Farmer=Granjero de Hongos Subterráneo +Very Simple Snow Man=Muñeco de Nieve Muy Simple +Watchtower=Torre del vigía +Well Lit=Bien Iluminado +Wheat Magnate=Magnate del Maíz +White Color Stock=Reserva de Color Blanco +Wool Over Your Eyes=Lana Sobre Tus Ojos +Wow, I am Diamonds!=¡Guau, Soy Diamantes! +You Suck!= +You're a witch!= +You’re a copper=Eres un cobre +Yummy!=¡Qué Rico! + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.=Todos tus logros y estadísticas han sido borrados. Puedes iniciar nuevamente. +Award not found.= +Get the awards statistics for the given player or yourself= +Show details of an award= +Show, clear, disable or enable your awards= +You have disabled awards.= +You have enabled awards.= +[c|clear|disable|enable]=[c|clear|disable|enable] + +### gui.lua ### +%s’s awards:=Logros de %s: +(Secret Award)=(Logro secreto) +@1 (unlocked)= +Awards=Logros +Error: No achivements available.= +Error: No award available.= +OK=Aceptar +Unlock this award to find out what it is.=Desbloquea éste logro para saber qué es. +You have not unlocked any awards.=No has desbloqueado ningún logro. +You've disabled awards. Type /awards enable to reenable.=Has deshabilitado los logros. Escribe "/awards enable" para reactivar. + +### triggers.lua ### +@1/@2 chat messages=@1/@2 conversaciones +@1/@2 crafted=@1/@2 elaborado +@1/@2 deaths=@1/@2 muertes +@1/@2 dug=@1/@2 excavados +@1/@2 eaten=@1/@2 comidos +@1/@2 joins= +@1/@2 placed=@1/@2 colocados +Chat @1 times= +Craft @1 item= +Craft @1 items.= +Craft: @1×@2= +Craft: @2= +Die @1 times of @2= +Die @1 times.= +Die once of @2= +Eat @1 item= +Eat @1 items.= +Eat @1×@2= +Eat @2= +Join @1 times= +Join once= +Mine @1 block.= +Mine @1 blocks.= +Mine @1 times= +Mine: @1×@2= +Mine: @2= +Place @1 block.= +Place @1 blocks.= +Place: @1×@2= +Place: @2= +Send a chat message= + + +##### not used anymore ##### + +%s: %s=%s: %s +Secret Achievement Unlocked:=Logro secreto desbloqueado: +Achievement Unlocked:=Logro desbloqueado: +Secret Achievement Unlocked: %s=Logro secreto desbloqueado: %s +Achievement Unlocked: %s=Logro desbloqueado: %s +Secret Achievement Unlocked!=Logro secreto desbloqueado! +Achievement Unlocked!=Logro desbloqueado! +Error: No awards available.=Error: No hay logros disponibles. +%s (got)=%s (obtenido) +@1/@2 game joins=@1/@2 veces unido +Bankier=Banquero +Constructor=Constructor +Show, clear, disable or enable your achievements=Mostrar, limpiar, deshabilitar o habilitar tus logros +You have disabled your achievements.=Has deshabilitado tus logros. +You have enabled your achievements.=Has habilitado tus logros. += +Show details of an achievement=Muestra los detalles de un logro +Achievement not found.=Logro no encontrado. +Get the achievements statistics for the given player or yourself=Obtener las estadísticas y logros del jugador dado diff --git a/mods/awards/locale/awards.fr.tr b/mods/awards/locale/awards.fr.tr new file mode 100644 index 00000000..dc036f48 --- /dev/null +++ b/mods/awards/locale/awards.fr.tr @@ -0,0 +1,260 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!=Réussite atteinte ! +Award Unlocked: %s=Réussite atteinte : %s +Secret Award Unlocked!=Réussite secrète atteinte ! +Secret Award Unlocked: %s=Réussite secrète atteinte : %s + +### awards.lua ### +A Cat in a Pop-Tart?!=Un chat dans un Pop-Tart ?! +Architect=Architecte +Aspiring Farmer=Apprenti·e Agricult.eur.rice +Backpacker=Randonneu·r·se +Baker=Boulang·er·ère +Banker=Banqui·er·ère +Bricker=Briqueu·r·se +Build a Cave=Construis une grotte +Builder=Bâtisseu·r·se +Burn to death in a fire.=Brûlé.e mort. +Castorama=Castorama +Craft 10 furnaces.=Construis 10 fours. +Craft 10 mese lamps.=Fabrique 10 lampes de mese. +Craft 100 obsidian bricks.=Confectionne 100 briques d'obsidienne. +Craft 100 sandstone bricks.=Confectionne 100 briques de roche de sable. +Craft 100 sticks.=Confectionne 100 bâtons. +Craft 100 white dyes.=Prépare 100 teintures blanches. +Craft 14 vessels shelves.=Fabrique 14 vaisseliers. +Craft 15 chests.=Fabrique 15 coffres. +Craft 15 fancy beds.=Construis 15 lits chics. +Craft 200 brick blocks.=Confectionne 200 blocs de brique. +Craft 200 stone bricks.=Confectionne 200 briques de pierre. +Craft 24 gold block stairs.=Construis 24 escaliers en or. +Craft 250 white wool.=Confectionne 250 blocs de laine blanche. +Craft 3,200 stone bricks.=Confectionne 3200 briques de pierre. +Craft 30 locked chests.=Fabrique 30 coffres verrouillés. +Craft 4 large bags.=Confectionne 4 grands sacs +Craft 400 blue dyes.=Prépare 400 teintures bleues. +Craft 400 desert stone bricks.=Confectionne 400 briques de pierre du désert. +Craft 400 red dyes.=Prépare 400 teintures rouges. +Craft 400 yellow dyes.=Prépare 400 teintures jaunes. +Craft 500 times oil extract.=Prépare 500 fois de l'extrait d'huile. +Craft 7 bookshelves.=Fabrique 7 bibliothèques. +Craft 8 times flint and steel.=Fabrique 8 briquets. +Craft 800 stone bricks.=Confectionne 800 briques de pierre. +Craft a diamond block.=Confectionne un bloc de diamant. +Crafter of Sticks=Fabriquant·e de bâtons. +Dandelions are Yellow=Les pissenlits sont jaunes. +Death in the Deeps=Mort.e dans les profondeurs. +Desert Discoverer=Expolrat·eur·rice du Désert. +Desert Dweller=Habitant·e du désert +Die 100 times.=Mort 100 fois. +Die above 10000=Mort.e au dessus de 10000 blocs d'altitude +Die below -10000=Mort.e plus profond que -10000 blocs. +Die in flowing lava.=Mort.e dans une coulée de lave. +Die near bones.=Mort.e près d'os. +Die near diamond ore.=Mort.e près de diamands. +Dig 1,000 copper ores.=Creuse 1000 minerais de cuivre. +Dig 1,000 jungle tree blocks.=Creuse 1000 blocs d'arbre de jungle. +Dig 1,000 sand.=Creuse 1000 blocs de sable. +Dig 1,000 stone blocks.=Creuse 1000 blocs de pierre. +Dig 1,296 tree blocks.=Creuse 1296 blocs d'arbre. +Dig 10,000 stone blocks.=Creuse 10000 blocs de pierre. +Dig 100 jungle tree blocks.=Creuse 100 blocs d'arbres de jungle. +Dig 100 stone blocks.=Creuse 100 blocs de pierre. +Dig 216 tree blocks.=Creuse 216 blocs d'arbre. +Dig 36 tree blocks.=Creuse 36 blocs d'arbre. +Dig 6 tree blocks.=Creuse 6 blocs d'arbre. +Eat 10 loaves of bread.=Mange 10 miches de pain. +Eat 3 brown mushrooms.=Mange 3 champignons marrons. +Eat 33 brown mushrooms.=Mange 33 champignons marrons. +Eat 333 brown mushrooms.=Mange 333 champignons marrons. +Eat 80 apples.=Mange 80 pommes. +Electical Engineer=Ingénieur.e électrique +Engineer=Ingénieur.e +Factory=Usine +Far Lands=Terres lointaines +Farming Skills Acquired=Compétences agricoles acquises +Field Worker=Travailleu·r·se agricole +Filthy Rich=Richissime +Firefighter=Pompier +First Day in the Woods=Premier jour dans les bois +First Gold Find=Première pépite d'or +First Mese Find=Première pépite de mese +Fortress=Forteresse +Geraniums are Blue=Les geraniums sont bleus +Girl's Best Friend=Girl's Best Friend +Glacier Discoverer=Découvreu·r·se de glacier +Glasser=Verri·er·ère +Gold Rush=Ruée vers l'or +Grasslands Discoverer=Découvreu·r·se de prairies +Graveyard=Cimetière +Hardened Miner=Mineu·r·se endurci·e +Hardest Block on Earth=Le bloc le plus dur du monde +Harvest 125 fully grown wheat plants.=Récolte 125 plants de blé à maturité. +Harvest 25 fully grown wheat plants.=Récolte 25 plants de blé à maturité. +Harvest 625 fully grown wheat plants.=Récolte 625 plants de blé à maturité. +Harvest a fully grown wheat plant.=Récolte un plant de blé à maturité. +Hotelier=Hoteli·er·ère +House of Obsidian=La Maison d'obsidienne +In space, no one can hear you scream=Personne ne t'entend dans l'espace +In the Dungeon=Dans le donjon +In the Flow=Dans la coulée +Industrial Age=Âge Industriel +Item transporter=Transport automatisé +Jungle Discoverer=Explorat·eur·rice de la jungle +Junglebaby=Enfant de la jungle +Jungleman=Personne de la jungle +Lava Miner=Mineu·r·se de lave +Lava and Water=La lave et l'eau +Light It Up=Eclairé·e +Little Library=Petite bibliothèque +Long Ladder=Longue Échelle +Lumberjack=Bûcheron·ne +Marchand De Sable=Marchand·e de sable +Master Architect=Maître·sse architecte +Master Miner=Maître·sse mineu·r·se +Mese Mastery=Maîtrise du mese +Mine 18 diamond ores.=Mine 18 diamants. +Mine 45 gold ores.=Mine 45 minerais d'or. +Mine 50 obsidian.=Mine 50 pierres d'obsidienne. +Mine a mese block.=Mine un bloc de mese. +Mine a mossy cobblestone.=Mine un bloc de pavés moussus. +Mine a nyan cat.=Mine un nyan cat. +Mine any block while being very close to lava.=Mine n'importe quel bloc à proximité de la lave. +Mine some dry grass.=Ramasse de l'herbe sèche. +Mine some grass.=Ramasse de l'herbe. +Mine your first cactus.=Mine ton premier catus. +Mine your first diamond ore.=Mine ton premier diamant. +Mine your first dry shrub.=Coupe ton premier arbuste sec. +Mine your first gold ore.=Mine ton premier minerai d'or. +Mine your first ice.=Creuse ton premier bloc de glace. +Mine your first jungle grass.=Ramasse ta première herbe de jungle. +Mine your first mese ore.=Mine ton premier minerai de mese. +Mine your first obsidian.=Mine ton premier bloc d'obsidienne. +Mini Miner=Mini Mineu·r·se +Mushroom Lover=Adorat·eur·rice de champignons +Obsessed with Obsidian=Obsédé·e par l'obsidienne +Oil Tycoon=Magnat.e de l'huile +On The Way=Sur la voie +Outpost=Poste avancé +Pharaoh=Pharaon +Place 1,000 torches.=Place 1000 torches. +Place 100 rails.=Place 100 rails. +Place 100 stone.=Place 100 pierres. +Place 100 torches.=Place 100 torches. +Place 10000 tubes.=Place 10000 tubes. +Place 2 trap stones.=Place 2 pièges de pierre. +Place 20 coal checkers.=Place 20 damiers de charbon. +Place 20 iron checkers.=Place 20 damiers de fer. +Place 40 steel ladders.=Place 40 échelles métalliques. +Place 400 wooden ladders.=Place 400 échelles en bois. +Place 5 autocrafters.=Place 5 auto-constructeurs. +Place 500 mesecon wires.=Place 500 fils de mesecon. +Place two snow blocks.=Place deux blocs de neige. +Professional Lumberjack=Bûcheron·ne professionnel·le +Put out 1000 fires.=Éteint 1000 feux. +Pyromaniac=Pyromane +Really Well Lit=Vraiment vien éclairé +Roses Are Red=Les roses sont rouges +Saint-Maclou=Saint-Maclou +Sam the Trapper=Sam le trappeur +Savannah Discoverer=Explorat·eur·rice de la savanne +Semi-pro Lumberjack=Bûcheron.ne semi-professionnel.le. +Smelter=Fondeu·r·se +Tasty Mushrooms=Délicieux champignons +This is Sad=Quel tristesse +Treasurer=Trésori·er·ère +Underground Mushroom Farmer=Agricult.eur.rice de champignons sous-terrain +Very Simple Snow Man=Bonhomme de neige rudimentaire +Watchtower=Tour de garde +Well Lit=Bien éclairé +Wheat Magnate=Magnat·e du blé +White Color Stock=Chaussettes blanches +Wool Over Your Eyes=De la laines dans tes yeux +Wow, I am Diamonds!=Wow, je suis diamants! +You Suck!=Tu es terrible ! +You're a witch!=Tu es un.e sorci.er.ère +You’re a copper=Faîtes jouer les cuivres +Yummy!=Miam ! + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.=Tous vos trophées et statistiques ont été réinitialisés. Vous pouvez recommencer à nouveau. +Award not found.=Réussite introuvable. +Get the awards statistics for the given player or yourself=Obtenir les statistiques de réussite pour un.e joueu.r.se donné.e ou vous même +Show details of an award=Montrer les détails d'une réussite +Show, clear, disable or enable your awards=Montrer, effacer, désactiver ou activer vos réussites +You have disabled awards.=Vous avez désactivé les réussites. +You have enabled awards.=Vous avez activé les réussites. +[c|clear|disable|enable]=[c|clear|disable|enable] (c|effacer|désactiver|activer) + +### gui.lua ### +%s’s awards:=Les trophées de %s : +(Secret Award)=(Trophée Secret) +@1 (unlocked)=@1 (acquise) +Awards=Trophées +Error: No achivements available.=Erreur : aucune réussite disponible. +Error: No award available.=Erreur : aucun trophée disponible. +OK=OK +Unlock this award to find out what it is.=Débloque ce trophée pour découvrir ce que c'est. +You have not unlocked any awards.=Vous n'avez encore débloqué aucun trophée. +You've disabled awards. Type /awards enable to reenable.=Vous avez désactivé les trophées. Tapez '/awards enable' pour les réactiver. + +### triggers.lua ### +@1/@2 chat messages=@1/@2 messages +@1/@2 crafted=@1/@2 créé +@1/@2 deaths=@1/@2 morts +@1/@2 dug=@1/@2 creusés +@1/@2 eaten=@1/@2 mangés +@1/@2 joins=@1/@2 arrivées +@1/@2 placed=@1/@2 placés +Chat @1 times=@1 messages envoyés +Craft @1 item=Crée @1 item +Craft @1 items.=Crée @1 items. +Craft: @1×@2=Création : @1×@2 +Craft: @2=Création : @2 +Die @1 times of @2=Mort.e @1 de @2 fois +Die @1 times.=Mort.e @1 fois. +Die once of @2=Mort.e une de @2 fois +Eat @1 item=Mange @1 aliment +Eat @1 items.=Mange @1 aliments. +Eat @1×@2=Mange @1×@2 +Eat @2=Mange @2 +Join @1 times=Rejoindre @1 fois +Join once=Rejoindre une fois +Mine @1 block.=Mine @1 bloc. +Mine @1 blocks.=Mine @1 blocs. +Mine @1 times=Mine @1 fois +Mine: @1×@2=Mine: @1×@2 +Mine: @2=Mine: @2 +Place @1 block.=Place @1 bloc. +Place @1 blocks.=Place @1 blocs. +Place: @1×@2=Place: @1×@2 +Place: @2=Place: @2 +Send a chat message=Envoit un message + + +##### not used anymore ##### + +%s (unlocked)=%s (acquise) +%s: %s=%s : %s +Secret Achievement Unlocked:=Réussite Secrète Débloquée : +Achievement Unlocked:=Réussite Débloquée : +Secret Achievement Unlocked: %s=Réussite Secrète Débloquée : %s +Achievement Unlocked: %s=Réussite Débloquée : %s +Secret Achievement Unlocked!=Réussite Secrète Débloquée ! +Achievement Unlocked!=Réussite Débloquée ! +Error: No awards available.=Erreur : Aucun trophée disponible +%s (got)=%s (obtenu) +@1/@2 game joins=@1/@2 connexions +Bankier=Banqui·er·ère +Constructor=Construct·eur·rice +Show, clear, disable or enable your achievements=Affiche, réinitialise, désactive ou active vos réussites. +You have disabled your achievements.=Vous avez désactivé vos réussites. +You have enabled your achievements.=Vous avez activé vos réussites. += +Show details of an achievement=Afficher les détails d'une réussite +Achievement not found.=Réussite non trouvée. +Get the achievements statistics for the given player or yourself=Obtenez les statistiques des réussites d'un joueur donné ou de vous-même diff --git a/mods/awards/locale/awards.hu.tr b/mods/awards/locale/awards.hu.tr new file mode 100644 index 00000000..b47edaf9 --- /dev/null +++ b/mods/awards/locale/awards.hu.tr @@ -0,0 +1,259 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!=Elnyertél egy kitüntetést! +Award Unlocked: %s=Elnyert kitüntetés: %s +Secret Award Unlocked!=Elnyertél egy titkos kitüntetést! +Secret Award Unlocked: %s=Elnyert titkos kitüntetés: %s + +### awards.lua ### +A Cat in a Pop-Tart?!=Egy macska Pop-Tartban?! +Architect=Építész +Aspiring Farmer=FeltörekvÅ‘ földműves +Backpacker=Hátizsákos turista +Baker=Pék +Banker=Bankár +Bricker=Téglamester +Build a Cave=BarlangépítÅ‘ +Builder=ÉpítÅ‘munkás +Burn to death in a fire.=Égj el tűzben. +Castorama=ÖntÅ‘mester +Craft 10 furnaces.=Készíts 10 kohót. +Craft 10 mese lamps.=Készíts 10 mese-lámpát. +Craft 100 obsidian bricks.=Készíts 100 obszidiántéglát. +Craft 100 sandstone bricks.=Készíts 100 homokkÅ‘-téglát. +Craft 100 sticks.=Készíts 100 botot. +Craft 100 white dyes.=Készíts 100 fehér festéket. +Craft 14 vessels shelves.=Készíts 14 poharas polcot. +Craft 15 chests.=Készíts 15 ládát. +Craft 15 fancy beds.=Készíts 15 elegáns ágyat. +Craft 200 brick blocks.=Készíts 200 téglablokkot. +Craft 200 stone bricks.=Készíts 200 kÅ‘blokkot. +Craft 24 gold block stairs.=Készíts 24 aranyblokk-lépcsÅ‘t. +Craft 250 white wool.=Készíts 250 fehér gyapjút. +Craft 3,200 stone bricks.=Készíts 3.200 kÅ‘téglát. +Craft 30 locked chests.=Készíts 30 zárt ládát. +Craft 4 large bags.=Készíts 4 nagy hátizsákot. +Craft 400 blue dyes.=Készíts 400 kék festékanyagot. +Craft 400 desert stone bricks.=Készíts 400 sivatagi kÅ‘-téglát. +Craft 400 red dyes.=Készíts 400 vörös festéket. +Craft 400 yellow dyes.=Készíts 400 sárga festéket. +Craft 500 times oil extract.=Készíts 500 olajkivonatot. +Craft 7 bookshelves.=Készíts 7 könyvespolcot. +Craft 8 times flint and steel.=Készíts 8 kovakövet acéllal. +Craft 800 stone bricks.=Készíts 800 kÅ‘téglát. +Craft a diamond block.=Készíts egy gyémántblokkot. +Crafter of Sticks=Botcsinálta botcsináló +Dandelions are Yellow=A gyermekláncfű sárga +Death in the Deeps=Halál a mélyben +Desert Discoverer=Sivatagi nomád +Desert Dweller=Sivataglakó +Die 100 times.=Halj meg százszor. +Die above 10000=Halj meg 10.000 fölött. +Die below -10000=Halj meg -10.000 alatt. +Die in flowing lava.=Halj meg folyó lávában. +Die near bones.=Halj meg csontok közelében. +Die near diamond ore.=Halj meg gyémántérc közelében. +Dig 1,000 copper ores.=Bányássz ki 1.000 rézércet. +Dig 1,000 jungle tree blocks.=Vágj ki 1.000 dzsungelfa-blokkot. +Dig 1,000 sand.=Ãss ki 1.000 homokblokkot. +Dig 1,000 stone blocks.=Ãss ki 1.000 követ. +Dig 1,296 tree blocks.=Vágj ki 1.296 fablokkot. +Dig 10,000 stone blocks.=Bányássz ki 10.000 kÅ‘blokkot. +Dig 100 jungle tree blocks.=Vágj ki 100 dzsungelfa-blokkot. +Dig 100 stone blocks.=Fejts ki 100 kÅ‘blokkot. +Dig 216 tree blocks.=Vágj ki 216 fablokkot. +Dig 36 tree blocks.=Vágj ki 36 fablokkot. +Dig 6 tree blocks.=Vágj ki 6 fablokkot. +Eat 10 loaves of bread.=Egyél meg 10 kenyeret. +Eat 3 brown mushrooms.=Egyél meg 3 barna gombát. +Eat 33 brown mushrooms.=Egyél meg 33 barna gombát. +Eat 333 brown mushrooms.=Egyél meg 333 barna gombát. +Eat 80 apples.=Egyél meg 80 almát. +Electical Engineer=Elektromérnök +Engineer=Mérnök +Factory=Gyár +Far Lands=Messzi tájakon +Farming Skills Acquired=Földművestanonc +Field Worker=A kaszás +Filthy Rich=KÅ‘gazdag +Firefighter=Tűzoltó +First Day in the Woods=ElsÅ‘ nap az erdÅ‘ben +First Gold Find=ElsÅ‘ arany +First Mese Find=ElsÅ‘ mese +Fortress=Végvár +Geraniums are Blue=A gólyaorr kék +Girl's Best Friend=Lányok legjobb barátja +Glacier Discoverer=Gleccserjáró +Glasser=Üveges +Gold Rush=Aranyláz +Grasslands Discoverer=Az alföldi rónaságon +Graveyard=TemetÅ‘ +Hardened Miner=Veterán bányász +Hardest Block on Earth=A legkeményebb blokk a Földön. +Harvest 125 fully grown wheat plants.=Arass le 125 teljesen érett búzát. +Harvest 25 fully grown wheat plants.=Arass le 25 teljesen érett búzát. +Harvest 625 fully grown wheat plants.=Arass le 625 teljesen érett búzát. +Harvest a fully grown wheat plant.=Arass le egy teljesen érett búzát. +Hotelier=Szállodatulajdonos +House of Obsidian=Obszidiánház +In space, no one can hear you scream=Az űrben senki nem hallja a sikolyodat +In the Dungeon=Tömlöcben +In the Flow=Flow-élmény +Industrial Age=Ipari forradalom +Item transporter=Tárgyszállító +Jungle Discoverer=Dzsungeljáró +Junglebaby=A dzsungel gyermeke +Jungleman=A dzsungel felnÅ‘ttje +Lava Miner=Lávabányász +Lava and Water=Láva és víz +Light It Up=Legyen világosság! +Little Library=Kis könyvtár +Long Ladder=Hosszú létra +Lumberjack=Favágó +Marchand De Sable=Ãlommanó +Master Architect=Építészmester +Master Miner=Mesterbányász +Mese Mastery=Mese-mester +Mine 18 diamond ores.=Bányássz ki 18 gyémántot. +Mine 45 gold ores.=Bányássz ki 45 aranyrögöt. +Mine 50 obsidian.=Bányássz ki 50 obszidiánt. +Mine a mese block.=Bányássz ki egy mese-blokkot. +Mine a mossy cobblestone.=Gyűjts be egy mohos macskakÅ‘-blokkot. +Mine a nyan cat.=Gyűjtsd be egy Nyan macskát. +Mine any block while being very close to lava.=Bányássz ki egy blokkot úgy, hogy közben nagyon közel állsz lávához. +Mine some dry grass.=Gyűjts be némi száraz füvet. +Mine some grass.=Gyűjts be némi füvet. +Mine your first cactus.=Gyűjtsd be az elsÅ‘ kaktuszodat. +Mine your first diamond ore.=Bányászd ki az elsÅ‘ gyémántodat. +Mine your first dry shrub.=Gyűjtsd be az elsÅ‘ elszáradt bozótodat. +Mine your first gold ore.=Bányászd ki az elsÅ‘ aranyrögödet. +Mine your first ice.=Gyűjtsd be az elsÅ‘ jégblokkodat. +Mine your first jungle grass.=Gyűjtsd be az elsÅ‘ dzsungelfüvedet. +Mine your first mese ore.=Bányászd ki az elsÅ‘ mese-ércedet. +Mine your first obsidian.=Bányászd ki az elsÅ‘ obszidiánodat. +Mini Miner=Mini bányász +Mushroom Lover=Gombarát +Obsessed with Obsidian=Obszesszió +Oil Tycoon=Jockey Ewing +On The Way=Úton +Outpost=HelyÅ‘rség +Pharaoh=Fáraó +Place 1,000 torches.=Ãllíts 1.000 fáklyát. +Place 100 rails.=Fektess le 100 sínt. +Place 100 stone.=Helyezz el 100 követ. +Place 100 torches.=Ãllíts 100 fáklyát. +Place 10000 tubes.=Helyezz el 10.000 csövet. +Place 2 trap stones.=Helyezz el 2 zúzott követ. +Place 20 coal checkers.=Helyezz el 20 szén sakktábla-mintát. +Place 20 iron checkers.=Helyezz el 20 vas sakktábla-mintát. +Place 40 steel ladders.=Helyezz el 40 acéllétrát. +Place 400 wooden ladders.=Helyezz el 400 falépcsÅ‘t. +Place 5 autocrafters.=Telepíts 5 automata gyártót. +Place 500 mesecon wires.=Fektess le 500 mesecon kábelt. +Place two snow blocks.=Helyezz el két hóblokkot. +Professional Lumberjack=Profi favágó +Put out 1000 fires.=Olts el 1.000 tüzet. +Pyromaniac=Piromán +Really Well Lit=Megvilágosodás +Roses Are Red=A rózsa vörös +Saint-Maclou=Saint-Maclou +Sam the Trapper=Sam, a csapdaállító +Savannah Discoverer=Szavannai nomád +Semi-pro Lumberjack=Félprofi favágó +Smelter=Olvasztár +Tasty Mushrooms=Fincsi gombák +This is Sad=Ez bizony szomorú +Treasurer=Kincstárnok +Underground Mushroom Farmer=Földalatti gombatermesztÅ‘ +Very Simple Snow Man=Minimalista hóember +Watchtower=Årtorony +Well Lit=Fényáradat +Wheat Magnate=Búzamágnás +White Color Stock=Feneketlen fehérség +Wool Over Your Eyes=Gyapjútakaró +Wow, I am Diamonds!=Gyémánt fokozatú bányász +You Suck!=Ezt megszívtad! +You're a witch!=Boszorkány vagy! +You’re a copper=Üdv a rezesbandában! +Yummy!=Nyami! + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.=Minden kitüntetésed és statisztikád törölve. Kezdheted elölrÅ‘l. +Award not found.=Kitüntetés nem található. +Get the awards statistics for the given player or yourself=Kitüntetés-statisztikák lekérdezése a megadott játékosról vagy önmagadról. +Show details of an award=Mutasd egy kitüntetés részleteit. +Show, clear, disable or enable your awards=Mutasd, töröld, tiltsd le vagy engedélyezd a kitüntetéseidet. +You have disabled awards.=Letiltottad a kitüntetéseket. +You have enabled awards.=Engedélyezted a kitüntetéseket. +[c|clear|disable|enable]=[c|clear|disable|enable] + +### gui.lua ### +%s’s awards:=%s kitüntetései: +(Secret Award)=(Titkos kitüntetés) +@1 (unlocked)=@1 (megszerezve) +Awards=Kitüntetések +Error: No achivements available.=Hiba: Nincsenek elérhetÅ‘ kitüntetések. +Error: No award available.=Hiba: Nincs elérhetÅ‘ kitüntetés. +OK=OK +Unlock this award to find out what it is.=Amint megszerzed ezt a kitüntetést, megtudod, hogy micsoda. +You have not unlocked any awards.=Még nincsenek kitüntetéseid. +You've disabled awards. Type /awards enable to reenable.=Deaktiváltad a kitüntetéseket. Az »/awards enable« paranccsal aktiválhatod Å‘ket újra. + +### triggers.lua ### +@1/@2 chat messages=@1/@2 chat-üzenetek +@1/@2 crafted=@1/@2 elkészítve +@1/@2 deaths=@1/@2 halál +@1/@2 dug=@1/@2 kifejtve +@1/@2 eaten=@1/@2 elfogyasztva +@1/@2 joins=@1/@2 összeillesztve +@1/@2 placed=@1/@2 elhelyezve +Chat @1 times=Chatelj @1 alkalommal. +Craft @1 item=Készíts @1 tárgyat. +Craft @1 items.=Készíts @1 tárgyat. +Craft: @1×@2=Készíts @1 @2-*t. +Craft: @2=Készíts @2-*t. +Die @1 times of @2=Halj meg @2-bÅ‘l @1 alkalommal. +Die @1 times.=Halj meg @1 alkalommal. +Die once of @2=Halj meg egyszer @2-tól. +Eat @1 item=Egyél @1 falatot. +Eat @1 items.=Egyél @1 falatot. +Eat @1×@2=Egyél @1 @2-*t. +Eat @2=Egyél @2-*t. +Join @1 times=Csatlakozz @1 alkalommal. +Join once=Csatlakozz egyszer. +Mine @1 block.=Bányássz @1 blokkot. +Mine @1 blocks.=Bányássz @1 blokkot. +Mine @1 times=Bányássz @1 alkalommal. +Mine: @1×@2=Bányássz @1 @2-*t. +Mine: @2=Bányássz @2-*t. +Place @1 block.=Helyezz el @1 blokkot. +Place @1 blocks.=Helyezz el @1 blokkot. +Place: @1×@2=Helyezz el @1 @2-*t. +Place: @2=Helyezz el @2-*t. +Send a chat message=Küldj egy chat-üzenetet. + + +##### not used anymore ##### + +%s: %s=%s: %s +Secret Achievement Unlocked:=Geheime Auszeichnung erhalten: +Achievement Unlocked:=Auszeichnung erhalten: +Secret Achievement Unlocked: %s=Geheime Auszeichnung erhalten: %s +Achievement Unlocked: %s=Auszeichnung erhalten: %s +Secret Achievement Unlocked!=Geheime Auszeichnung erhalten! +Achievement Unlocked!=Auszeichnung erhalten: +Error: No awards available.=Fehler: Keine Auszeichnungen vorhanden. +%s (got)=%s (erhalten) +@1/@2 game joins=@1/@2 Spielen beigetreten +Bankier=Bankier +Constructor=Konstrukteur +Show, clear, disable or enable your achievements=Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen +You have disabled your achievements.=Sie haben Ihre Auszeichnungen deaktiviert. +You have enabled your achievements.=Sie haben Ihre Auszeichnungen aktiviert. += +Show details of an achievement=Details einer Auszeichnung anzeigen +Achievement not found.=Auszeichnung nicht gefunden. +Get the achievements statistics for the given player or yourself=Die Statistik der Auszeichnungen eines Spielers zeigen diff --git a/mods/awards/locale/awards.pl.tr b/mods/awards/locale/awards.pl.tr new file mode 100644 index 00000000..70f5694b --- /dev/null +++ b/mods/awards/locale/awards.pl.tr @@ -0,0 +1,259 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!= +Award Unlocked: %s= +Secret Award Unlocked!= +Secret Award Unlocked: %s= + +### awards.lua ### +A Cat in a Pop-Tart?!=Kot w Pop-Tart?! +Architect=Architekt +Aspiring Farmer=Ambitny rolnik +Backpacker=Plecakowiec +Baker=Piekarz +Banker= +Bricker=Ceglarz +Build a Cave=Zbuduj jaskiniÄ™ +Builder=Budowniczy +Burn to death in a fire.= +Castorama=Castorama +Craft 10 furnaces.=Stwórz 10 pieców. +Craft 10 mese lamps.=Stwórz 10 mese lamp. +Craft 100 obsidian bricks.=Stwórz 100 obsydianowych cegieÅ‚. +Craft 100 sandstone bricks.=Stwórz 100 cegieÅ‚ z piaskowca. +Craft 100 sticks.=Stwórz 100 patyków. +Craft 100 white dyes.=Stwórz 100 biaÅ‚ych barwników. +Craft 14 vessels shelves.=Stwórz 14 półek z naczyniami. +Craft 15 chests.=Stwórz 15 skrzyÅ„. +Craft 15 fancy beds.=Stwórz 15 fantazyjnych łóżek. +Craft 200 brick blocks.=Stwórz 200 ceglanych bloków. +Craft 200 stone bricks.=Stwórz 200 kamiennych cegieÅ‚. +Craft 24 gold block stairs.=Stwórz 24 schody z bloków zÅ‚ota. +Craft 250 white wool.=Stwórz 250 biaÅ‚ej weÅ‚ny. +Craft 3,200 stone bricks.=Stwórz 3200 kamiennych cegieÅ‚. +Craft 30 locked chests.=Stwórz 30 zablokowanych skrzyÅ„. +Craft 4 large bags.=Stwórz 4 duże plecaki. +Craft 400 blue dyes.=Stwórz 400 niebieskich barwników. +Craft 400 desert stone bricks.=Stwórz 400 cegieÅ‚ z pustynnego kamienia. +Craft 400 red dyes.=Stwórz 400 czerwonych barwników. +Craft 400 yellow dyes.=Stwórz 400 żółtych barwników. +Craft 500 times oil extract.= +Craft 7 bookshelves.=Stwórz 7 półek na książki. +Craft 8 times flint and steel.=Stwórz krzesiwo 8 razy. +Craft 800 stone bricks.=Stwórz 800 kamiennych cegieÅ‚. +Craft a diamond block.=Stwórz diamentowy blok. +Crafter of Sticks=Twórca patyków +Dandelions are Yellow=Mlecze sÄ… żółte +Death in the Deeps= +Desert Discoverer=Odkrywca pustyni +Desert Dweller=Mieszkaniec pustyni +Die 100 times.= +Die above 10000= +Die below -10000= +Die in flowing lava.= +Die near bones.= +Die near diamond ore.= +Dig 1,000 copper ores.=Wykop 1000 rudy miedzi. +Dig 1,000 jungle tree blocks.=Wykop 1000 bloków drzewa dżunglowego. +Dig 1,000 sand.=Wykop 1000 piasku. +Dig 1,000 stone blocks.=Wykop 1000 kamiennych bloków. +Dig 1,296 tree blocks.=Wykop 1296 bloków. +Dig 10,000 stone blocks.=Wykop 10 000 kamiennych bloków. +Dig 100 jungle tree blocks.=Wykop 100 bloków drzewa dżunglowego. +Dig 100 stone blocks.=Wykop 100 kamiennych bloków. +Dig 216 tree blocks.=Wykop 216 bloków drzewa. +Dig 36 tree blocks.=Wykop 36 bloków drzewa. +Dig 6 tree blocks.=Wykop 6 bloków drewna. +Eat 10 loaves of bread.=Zjedz 10 bochenków chleba. +Eat 3 brown mushrooms.=Zjedz 3 brÄ…zowe grzyby. +Eat 33 brown mushrooms.=Zjedz 33 brÄ…zowe grzyby. +Eat 333 brown mushrooms.=Zjedz 333 brÄ…zowe grzyby. +Eat 80 apples.=Zjedz 80 jabÅ‚ek. +Electical Engineer= +Engineer= +Factory= +Far Lands=OdlegÅ‚e lÄ…dy +Farming Skills Acquired=Nabyto umiejÄ™tnoÅ›ci rolnicze +Field Worker=Pracownik na polu +Filthy Rich=Obrzydliwie bogaty +Firefighter=Strażak +First Day in the Woods=Pierwszy dzieÅ„ w lesie +First Gold Find=Pierwsze znalezione zÅ‚oto +First Mese Find=Pierwsze mese +Fortress=Forteca +Geraniums are Blue=Gerania sÄ… niebieskie +Girl's Best Friend=Najlepszy przyjaciel kobiety +Glacier Discoverer=Odkrywca lodowca +Glasser=Szklarz +Gold Rush=GorÄ…czka zÅ‚ota +Grasslands Discoverer=Odkrywca terenów trawiastych +Graveyard= +Hardened Miner=ZatwardziaÅ‚y górnik +Hardest Block on Earth=Najtwardszy blok na ziemi +Harvest 125 fully grown wheat plants.=Zbierz 125 w peÅ‚ni dojrzaÅ‚ej pszenicy. +Harvest 25 fully grown wheat plants.=Zbierz 25 w peÅ‚ni dojrzaÅ‚ej pszenicy. +Harvest 625 fully grown wheat plants.=Zbierz 625 w peÅ‚ni dojrzaÅ‚ej pszenicy. +Harvest a fully grown wheat plant.=Zbierz w peÅ‚ni dojrzałą pszenicÄ™. +Hotelier=Hotelarz +House of Obsidian=Dom z obsydianu +In space, no one can hear you scream= +In the Dungeon=W lochu +In the Flow= +Industrial Age=Era przemysÅ‚owa +Item transporter= +Jungle Discoverer=Odkrywca dżungli +Junglebaby=Dziecko dżungli +Jungleman=CzÅ‚owiek dżungli +Lava Miner=Górnik lawy +Lava and Water=Lawa i woda +Light It Up=Roznieć to +Little Library=MaÅ‚a biblioteka +Long Ladder=DÅ‚uga drabina +Lumberjack=Drwal +Marchand De Sable=Piaskowy dziadek +Master Architect=Mistrz architekt +Master Miner=Mistrz górnik +Mese Mastery=Mistrzostwo mese +Mine 18 diamond ores.=Wykop 18 diamentów. +Mine 45 gold ores.=Wykop 45 rud zÅ‚ota. +Mine 50 obsidian.=Wykop 50 obsydianów. +Mine a mese block.=Wykop blok mese. +Mine a mossy cobblestone.=Wykop omszałą kostkÄ™ brukowÄ…. +Mine a nyan cat.=Wykop kota nyan. +Mine any block while being very close to lava.=Wykop jakikolwiek blok bÄ™dÄ…c bardzo blisko lawy. +Mine some dry grass.=Wykop trochÄ™ wysuszonej trawy. +Mine some grass.=Wykop trochÄ™ trawy. +Mine your first cactus.=Wykop pierwszego kaktusa. +Mine your first diamond ore.=Wykop pierwszy diament. +Mine your first dry shrub.=Wykop pierwszy wysuszony krzak. +Mine your first gold ore.=Wykop pierwszÄ… rudÄ™ zÅ‚ota. +Mine your first ice.=Wykop pierwszy lód. +Mine your first jungle grass.=Wykop pierwszÄ… trawÄ™ dżunglowÄ…. +Mine your first mese ore.=Wykop pierwszÄ… rudÄ™ mese. +Mine your first obsidian.=Wykop pierwszy obsydian. +Mini Miner=Mini górnik +Mushroom Lover=Wielbiciel grzybów +Obsessed with Obsidian=Obsesja na punkcie obsydianu +Oil Tycoon= +On The Way=W drodze +Outpost=Posterunek +Pharaoh=Faraon +Place 1,000 torches.=Postaw 1000 pochodni. +Place 100 rails.=Połóż 100 torów. +Place 100 stone.=Postaw 100 kamieni. +Place 100 torches.=Postaw 100 pochodni. +Place 10000 tubes.= +Place 2 trap stones.=Postaw 2 kamienne puÅ‚apki. +Place 20 coal checkers.=Postaw 20 szachownic wÄ™glowych. +Place 20 iron checkers.=Postaw 20 szachownic żelaznych. +Place 40 steel ladders.=Postaw 40 stalowych drabin. +Place 400 wooden ladders.=Postaw 400 drewnianych drabin. +Place 5 autocrafters.= +Place 500 mesecon wires.= +Place two snow blocks.=Postaw dwa bloki Å›niegu. +Professional Lumberjack=Profesjonalny drwal +Put out 1000 fires.=ZgaÅ› 1000 pożarów. +Pyromaniac=Piromaniak +Really Well Lit=NaprawdÄ™ dobrze oÅ›wietlone +Roses Are Red=Róże sÄ… czerwone +Saint-Maclou=Saint-Maclou +Sam the Trapper=Sam MyÅ›liwy +Savannah Discoverer=Odkrywca sawanny +Semi-pro Lumberjack=Pół-profesjonalny drwal +Smelter=Przetapiacz +Tasty Mushrooms=Smaczne grzyby +This is Sad= +Treasurer=Podskarbi +Underground Mushroom Farmer=Hodowca podziemnych grzybów +Very Simple Snow Man=Bardzo prosty baÅ‚wan +Watchtower=Strażnica +Well Lit=Dobrze oÅ›wietlone +Wheat Magnate=Pszeniczny magnat +White Color Stock=Zapas biaÅ‚ego koloru +Wool Over Your Eyes=Owijanie w baweÅ‚nÄ™ +Wow, I am Diamonds!=Wow, jestem diamentami! +You Suck!= +You're a witch!= +You’re a copper=JesteÅ› miedziÄ… +Yummy!=Pychota + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.=Wszystkie nagrody i statystyki zostaÅ‚y usuniÄ™te. Możesz znów zacząć od nowa. +Award not found.= +Get the awards statistics for the given player or yourself= +Show details of an award= +Show, clear, disable or enable your awards= +You have disabled awards.= +You have enabled awards.= +[c|clear|disable|enable]=[c|clear|disable|enable] + +### gui.lua ### +%s’s awards:=%s's nagrody: +(Secret Award)=(Sekretna nagroda) +@1 (unlocked)= +Awards=Nagrody +Error: No achivements available.= +Error: No award available.= +OK=OK +Unlock this award to find out what it is.=Odblokuj tÄ™ nagrodÄ™, aby dowiedzieć siÄ™ czym jest. +You have not unlocked any awards.=Nie odblokowaÅ‚eÅ› żadnych nagród. +You've disabled awards. Type /awards enable to reenable.=WyłączyÅ‚eÅ› nagrody. Wpisz /awards enable, aby je ponownie włączyć. + +### triggers.lua ### +@1/@2 chat messages=@1/@2 wiadomoÅ›ci na czacie +@1/@2 crafted=@1/@2 stworzono +@1/@2 deaths=@1/@2 Å›mierci +@1/@2 dug=@1/@2 wykopano +@1/@2 eaten=@1/@2 zjedzono +@1/@2 joins= +@1/@2 placed=@1/@2 postawiono +Chat @1 times= +Craft @1 item= +Craft @1 items.= +Craft: @1×@2= +Craft: @2= +Die @1 times of @2= +Die @1 times.= +Die once of @2= +Eat @1 item= +Eat @1 items.= +Eat @1×@2= +Eat @2= +Join @1 times= +Join once= +Mine @1 block.= +Mine @1 blocks.= +Mine @1 times= +Mine: @1×@2= +Mine: @2= +Place @1 block.= +Place @1 blocks.= +Place: @1×@2= +Place: @2= +Send a chat message= + + +##### not used anymore ##### + +%s: %s=%s: %s +Secret Achievement Unlocked:=Odblokowano sekretne osiÄ…gniÄ™cie: +Achievement Unlocked:=Odblokowano osiÄ…gniÄ™cie: +Secret Achievement Unlocked: %s=Odblokowano sekretne osiÄ…gniÄ™cie: %s +Achievement Unlocked: %s=Odblokowano osiÄ…gniÄ™cie: %s +Secret Achievement Unlocked!=Odblokowano sekretne osiÄ…gniÄ™cie! +Achievement Unlocked!=Odblokowano osiÄ…gniÄ™cie! +Error: No awards available.=Błąd: Brak dostÄ™pnych nagród. +%s (got)=%s (zdobyto) +@1/@2 game joins=@1/@2 dołączeÅ„ do gry +Bankier=Bankier +Constructor=Konstruktor +Show, clear, disable or enable your achievements=Pokaż, usuÅ„, wyłącz lub włącz osiÄ…gniÄ™cia +You have disabled your achievements.=WyłączyÅ‚eÅ› osiÄ…gniÄ™cia. +You have enabled your achievements.=WłączyÅ‚eÅ› osiÄ…gniÄ™cia. += +Show details of an achievement=Pokaż szczegóły osiÄ…gniÄ™cia +Achievement not found.=Nie znaleziono osiÄ…gniÄ™cia. +Get the achievements statistics for the given player or yourself=Pokaż swoje statystyki lub danego gracza diff --git a/mods/awards/locale/awards.pt.tr b/mods/awards/locale/awards.pt.tr new file mode 100644 index 00000000..77650e90 --- /dev/null +++ b/mods/awards/locale/awards.pt.tr @@ -0,0 +1,259 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!= +Award Unlocked: %s= +Secret Award Unlocked!= +Secret Award Unlocked: %s= + +### awards.lua ### +A Cat in a Pop-Tart?!=Um Gato em um Pop-Tart?! +Architect=Arquiteto +Aspiring Farmer=Fazendeiro Aspirante +Backpacker= +Baker=Padeiro +Banker= +Bricker=Tijoleiro +Build a Cave=Montar uma Caverna +Builder=Construtor +Burn to death in a fire.= +Castorama= +Craft 10 furnaces.=Montar 10 fornos. +Craft 10 mese lamps.=Fazer 10 lâmpadas de mese. +Craft 100 obsidian bricks.=Montar 100 tijolos de obsidiana. +Craft 100 sandstone bricks.=Fazer 100 tijolos de arenito. +Craft 100 sticks.=Lenhar 100 gravetos. +Craft 100 white dyes.=Fazer 100 tintas brancas. +Craft 14 vessels shelves.=Montar 14 estantes de frascos. +Craft 15 chests.=Montar 10 baús. +Craft 15 fancy beds.=Montar 15 camas chiques. +Craft 200 brick blocks.=Fazer 200 blocos de tijolo. +Craft 200 stone bricks.=Fazer 200 tijolos de pedra. +Craft 24 gold block stairs.=Montar 24 escadas de bloco de ouro. +Craft 250 white wool.=Tecer 250 lãs branca. +Craft 3,200 stone bricks.=Fazer 3.200 tijolos de pedra. +Craft 30 locked chests.=Montar 30 baús trancados. +Craft 4 large bags.= +Craft 400 blue dyes.=Fazer 400 tintas azuis. +Craft 400 desert stone bricks.=Fazer 400 Tijolos de pedra do deserto. +Craft 400 red dyes.=Fazer 400 tintas vermelhas. +Craft 400 yellow dyes.=Fazer 400 tintas amarelas. +Craft 500 times oil extract.= +Craft 7 bookshelves.=Fazer 7 estantes de livros. +Craft 8 times flint and steel.=Montar acendedor de Ferro e Pederneira 8 vezes. +Craft 800 stone bricks.=Fazer 800 tijolos de pedra. +Craft a diamond block.=Montar um bloco de diamante. +Crafter of Sticks=Rachador de Lenha +Dandelions are Yellow=Dentes-de-Leões são Amarelos +Death in the Deeps= +Desert Discoverer=Descobridor do Deserto +Desert Dweller=Morador do Deserto +Die 100 times.= +Die above 10000= +Die below -10000= +Die in flowing lava.= +Die near bones.= +Die near diamond ore.= +Dig 1,000 copper ores.=Minerar 1.000 cobres. +Dig 1,000 jungle tree blocks.=Cortar 1.000 blocos de árvore selvagem. +Dig 1,000 sand.=Cavar 1.000 blocos de areia. +Dig 1,000 stone blocks.=Minerar 1.000 blocos de pedra. +Dig 1,296 tree blocks.=Cortar 1.296 blocos de árvore. +Dig 10,000 stone blocks.=Minerar 10.000 blocos de pedra. +Dig 100 jungle tree blocks.=Cortar 100 blocos de árvore selvagem. +Dig 100 stone blocks.=Minerar 100 blocos de pedra. +Dig 216 tree blocks.=Cortar 216 blocos de árvore. +Dig 36 tree blocks.=Cortar 36 blocos de árvore. +Dig 6 tree blocks.=Cortar 6 blocos de árvore. +Eat 10 loaves of bread.=Comer 10 pães. +Eat 3 brown mushrooms.=Comer 3 cogumelos marrons. +Eat 33 brown mushrooms.=Comer 33 cogumelos marrons. +Eat 333 brown mushrooms.=Comer 333 cogumelos marrons. +Eat 80 apples.=Comer 80 maçãs. +Electical Engineer= +Engineer= +Factory= +Far Lands=Terras Distantes +Farming Skills Acquired=Conhecimento de Cultivo Adquirido +Field Worker=Trabalhador do Campo +Filthy Rich=Muito Rico +Firefighter=Bombeiro +First Day in the Woods=Primeiro dia na Floresta +First Gold Find=Achei Ouro +First Mese Find=Primeiro Mese +Fortress=Fortaleza +Geraniums are Blue=Gerânios são Azuis +Girl's Best Friend=Melhor Amigo da Menina +Glacier Discoverer=Descobridor Glacial +Glasser=Vidraceiro +Gold Rush=Corriga do Ouro +Grasslands Discoverer=Descobridor do Gramado +Graveyard= +Hardened Miner=Minerador Avançado +Hardest Block on Earth=O Bloco mais Duro da Terra +Harvest 125 fully grown wheat plants.=Colher 125 plantas trigos totalmente crescidos. +Harvest 25 fully grown wheat plants.=Colher 25 plantas trigos totalmente crescidos. +Harvest 625 fully grown wheat plants.=Colher 625 plantas trigos totalmente crescidos. +Harvest a fully grown wheat plant.=Colher um trigo totalmente crescido. +Hotelier=Hoteleiro +House of Obsidian=Casa de Obsidiana +In space, no one can hear you scream= +In the Dungeon=Na Masmorra +In the Flow= +Industrial Age=Era Industrial +Item transporter= +Jungle Discoverer=Desbravador Selvagem +Junglebaby=Bebê Selvagem +Jungleman=Homem Selvagem +Lava Miner=Minerador de Lava +Lava and Water=Lava e Ãgua +Light It Up=Ilumine Isso +Little Library=Pequena Biblioteca +Long Ladder=Longa Escadaria +Lumberjack=Lenhador +Marchand De Sable=Vendedor de Areia +Master Architect=Arquiteto Mestre +Master Miner=Minerador Mestre +Mese Mastery=Mestre do Mese +Mine 18 diamond ores.=Minere 18 diamantes. +Mine 45 gold ores.=Minerar 45 de ouro. +Mine 50 obsidian.=Minerar 50 obsidianas. +Mine a mese block.=Cavar um bloco de mese. +Mine a mossy cobblestone.=Minerar um pedregulho com musgo. +Mine a nyan cat.=Capturar um gato nyan. +Mine any block while being very close to lava.=Minerar qualquer bloco enquanto estiver mergulhado em lava. +Mine some dry grass.=Minerar algum mato seco. +Mine some grass.=Minerar algum mato +Mine your first cactus.=Cortar seu primeiro cacto. +Mine your first diamond ore.=Minerar seu primeiro diamante. +Mine your first dry shrub.=Minerar seu primeiro arbusto seco. +Mine your first gold ore.=Minerar sua primeira de ouro. +Mine your first ice.=Quebrar seu primeiro bloco de gelo. +Mine your first jungle grass.=Cortar seu primeiro mato selvagem. +Mine your first mese ore.=Cavar seu primeiro mese. +Mine your first obsidian.=Cavar sua primeira obsidiana. +Mini Miner=Mini Minerador +Mushroom Lover=Amante de Cogumelo +Obsessed with Obsidian=Obcecado por Obsidiana +Oil Tycoon= +On The Way=No Caminho +Outpost=Posto Avançado +Pharaoh=Faraó +Place 1,000 torches.=Colocar 1.000 tochas. +Place 100 rails.=Colocar 100 trilhos. +Place 100 stone.=Colocar 100 pedras. +Place 100 torches.=Colocar 100 tochas. +Place 10000 tubes.= +Place 2 trap stones.= +Place 20 coal checkers.= +Place 20 iron checkers.= +Place 40 steel ladders.=Colocar 40 escadas de ferro. +Place 400 wooden ladders.=Colocar 400 escadas de madeira. +Place 5 autocrafters.= +Place 500 mesecon wires.= +Place two snow blocks.=Colocar 2 blocos de neve. +Professional Lumberjack=Lenhador Profissional +Put out 1000 fires.=Apagar fogo 1000 vezes. +Pyromaniac=Piromaníaco +Really Well Lit=Realmente Bem Iluminado +Roses Are Red=Rosas São Vermelhas +Saint-Maclou=Saint-Maclou +Sam the Trapper= +Savannah Discoverer=Descobridor da Savana +Semi-pro Lumberjack=Lenhador Semi-Profissional +Smelter=Fundidor +Tasty Mushrooms=Cogumelos Deliciosos +This is Sad= +Treasurer=Tesoureiro +Underground Mushroom Farmer=Fazendeiro Subterrâneo de Cogumelos +Very Simple Snow Man=Homem de Neve Muito Simples +Watchtower=Sentinela +Well Lit=Bem Iluminado +Wheat Magnate=Magnata do Trigo +White Color Stock=Estoque de Cor Branca +Wool Over Your Eyes=Lã Sobre Meus Olhos +Wow, I am Diamonds!=Uau, Diamante! +You Suck!= +You're a witch!= +You’re a copper=Sou um Cobre +Yummy!=Humm! + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.=Todas as suas conquistas e estatísticas foram limpas. Agora podes iniciar novamente. +Award not found.= +Get the awards statistics for the given player or yourself= +Show details of an award= +Show, clear, disable or enable your awards= +You have disabled awards.= +You have enabled awards.= +[c|clear|disable|enable]=[c|clear|disable|enable] + +### gui.lua ### +%s’s awards:=%s das conquistas: +(Secret Award)=(Conquista Secreta) +@1 (unlocked)= +Awards=Conquistas +Error: No achivements available.= +Error: No award available.= +OK=OK +Unlock this award to find out what it is.=Desbloqueie essa conquista para descobrir o que significa. +You have not unlocked any awards.=Nenhuma conquista desbloqueada ainda. +You've disabled awards. Type /awards enable to reenable.=Desabilitaste as conquistas. Digite /awards enable para reabilitar. + +### triggers.lua ### +@1/@2 chat messages=@1 de @2 +@1/@2 crafted=@1 de @2 feitos +@1/@2 deaths=@1 de @2 mortes +@1/@2 dug=@1 de @2 obtidos +@1/@2 eaten=@1 de @2 consumidos +@1/@2 joins= +@1/@2 placed=@1 de @2 colocados +Chat @1 times= +Craft @1 item= +Craft @1 items.= +Craft: @1×@2= +Craft: @2= +Die @1 times of @2= +Die @1 times.= +Die once of @2= +Eat @1 item= +Eat @1 items.= +Eat @1×@2= +Eat @2= +Join @1 times= +Join once= +Mine @1 block.= +Mine @1 blocks.= +Mine @1 times= +Mine: @1×@2= +Mine: @2= +Place @1 block.= +Place @1 blocks.= +Place: @1×@2= +Place: @2= +Send a chat message= + + +##### not used anymore ##### + +%s: %s=%s: %s +Secret Achievement Unlocked:=Conquista Secreta Desbloqueada: +Achievement Unlocked:=Conquista Desbloqueada: +Secret Achievement Unlocked: %s=Conquista Secreta Desbloqueada: %s +Achievement Unlocked: %s=Conquista Desbloqueada: %s +Secret Achievement Unlocked!=Conquista Secreta Desbloqueada! +Achievement Unlocked!=Conquista Desbloqueada! +Error: No awards available.=Erro: Nenhuma conquista encontrada. +%s (got)=%s (obtido) +@1/@2 game joins=@1 de @2 +Bankier=Banqueiro +Constructor=Empreiteiro +Show, clear, disable or enable your achievements=Exibir, limpar, desabilitar ou habilitar suas conquistas +You have disabled your achievements.=Suas conquistas foram desabilitadas. +You have enabled your achievements.=Suas conquistas foram habilitadas. += +Show details of an achievement=Mostra detalhes de uma conquista +Achievement not found.=Conquista não encontrada. +Get the achievements statistics for the given player or yourself=Ver as estatísticas de conquistas de um jogador ou suas próprias diff --git a/mods/awards/locale/awards.ru.tr b/mods/awards/locale/awards.ru.tr new file mode 100644 index 00000000..67b6d1f9 --- /dev/null +++ b/mods/awards/locale/awards.ru.tr @@ -0,0 +1,236 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!=ДоÑтижение разблокировано! +Award Unlocked: %s=ДоÑтижение разблокировано: %s +Secret Award Unlocked!=Секретное доÑтижение разблокировано! +Secret Award Unlocked: %s=Секретное доÑтижение разблокировано: %s + +### awards.lua ### +A Cat in a Pop-Tart?!=Кот в Поп-Тарте?! +Architect=Ðрхитектор +Aspiring Farmer=Ðачинающий фермер +Backpacker=ТуриÑÑ‚ +Baker=Пекарь +Banker=Банкир +Bricker=Кирпичник +Build a Cave=ПоÑтроить пещеру +Builder=Строитель +Burn to death in a fire.=Сгореть в огне. +Castorama=Castorama +Craft 10 furnaces.=Создать 10 печей. +Craft 10 mese lamps.=Создать 10 мезовых ламп. +Craft 100 obsidian bricks.=Создать 100 обÑидиановых кирпичей. +Craft 100 sandstone bricks.=Создать 100 пеÑчаниковых кирпичей. +Craft 100 sticks.=Создать 100 палок. +Craft 100 white dyes.=Создать 100 белых краÑителей. +Craft 14 vessels shelves.=Создать 14 полок Ñ ÑоÑудами. +Craft 15 chests.=Создать 15 Ñундуков. +Craft 15 fancy beds.=Создать 15 краÑивых кроватей. +Craft 200 brick blocks.=Создать 200 блоков кирпичей. +Craft 200 stone bricks.=Создать 200 каменных кирпичей. +Craft 24 gold block stairs.=Создать 24 Ñтупеньки из золотых блоков. +Craft 250 white wool.=Создать 250 белой шерÑти. +Craft 3,200 stone bricks.=Создать 3,200 каменных кирпичей. +Craft 30 locked chests.=Создать 30 запертых Ñундуков. +Craft 4 large bags.=Создать 4 больших Ñумки. +Craft 400 blue dyes.=Создать 400 Ñиних краÑителей. +Craft 400 desert stone bricks.=Создать 400 пеÑчаниковых кирпичей. +Craft 400 red dyes.=Создать 400 краÑных краÑителей. +Craft 400 yellow dyes.=Создать 400 жёлтых краÑителей. +Craft 500 times oil extract.=Создать маÑлÑный ÑкÑтракт 500 раз. +Craft 7 bookshelves.=Создать 7 книжных полок. +Craft 8 times flint and steel.=Создать огниво 8 раз. +Craft 800 stone bricks.=Создать 800 каменных кирпичей. +Craft a diamond block.=Создать алмазный блок. +Crafter of Sticks=Создатель Палочек +Dandelions are Yellow=Одуванчики - жёлтые +Death in the Deeps=Смерть в глубинах +Desert Discoverer=Первооткрыватель пуÑтыни +Desert Dweller=Обитатель пуÑтыни +Die 100 times.=Умереть 100 раз. +Die above 10000=Умереть выше 10000 +Die below -10000=Умереть ниже -10000 +Die in flowing lava.=Умереть в разлитой лаве. +Die near bones.=Умереть около коÑтей. +Die near diamond ore.=Умереть около алмазной руды. +Dig 1,000 copper ores.=Добыть 1,000 медной руды. +Dig 1,000 jungle tree blocks.=Добыть 1,000 блоков тропичеÑкого дерева. +Dig 1,000 sand.=Добыть 1,000 блоков пеÑка. +Dig 1,000 stone blocks.=Добыть 1,000 блоков камнÑ. +Dig 1,296 tree blocks.=Добыть 1,296 блоков дерева. +Dig 10,000 stone blocks.=Добыть 10,000 блоков камнÑ. +Dig 100 jungle tree blocks.=Добыть 100 блоков тропичеÑкого дерева. +Dig 100 stone blocks.=Добыть 100 блоков камнÑ. +Dig 216 tree blocks.=Добыть 216 блоков дерева. +Dig 36 tree blocks.=Добыть 36 блоков дерева. +Dig 6 tree blocks.=Добыть 6 блоков дерева. +Eat 10 loaves of bread.=СъеÑть 10 буханок хлеба. +Eat 3 brown mushrooms.=СъеÑть 3 коричневых гриба. +Eat 33 brown mushrooms.=СъеÑть 33 коричневых гриба. +Eat 333 brown mushrooms.=СъеÑть 333 коричневых гриба. +Eat 80 apples.=СъеÑть 80 Ñблок. +Electical Engineer=Инженер-Ñлектрик +Engineer=Инженер +Factory=Фабрика +Far Lands=Далёкие земли +Farming Skills Acquired=Первые Ð½Ð°Ñ‡Ð¸Ð½Ð°Ð½Ð¸Ñ Ð² фермерÑтве +Field Worker=КреÑтьÑнин +Filthy Rich=Богат до Ð½ÐµÐ¿Ñ€Ð¸Ð»Ð¸Ñ‡Ð¸Ñ +Firefighter=Пожарный +First Day in the Woods=Первый день в леÑу +First Gold Find=Ðаходка золота +First Mese Find=Ðаходка мезе +Fortress=КрепоÑть +Geraniums are Blue=Герань - ÑинÑÑ +Girl's Best Friend=ПопулÑрен Ñреди девушек +Glacier Discoverer=Первооткрыватель ледников +Glasser=Стеклодув +Gold Rush=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð»Ð¸Ñ…Ð¾Ñ€Ð°Ð´ÐºÐ° +Grasslands Discoverer=Первооткрыватель равнин +Graveyard=Кладбище +Hardened Miner=Закалённый шахтёр +Hardest Block on Earth=Самый Ñложный блок на Земле +Harvest 125 fully grown wheat plants.=Соберите 125 полноÑтью выроÑших раÑтений. +Harvest 25 fully grown wheat plants.=Соберите 25 полноÑтью выроÑших раÑтений. +Harvest 625 fully grown wheat plants.=Соберите 625 полноÑтью выроÑших раÑтений. +Harvest a fully grown wheat plant.=Соберите полноÑтью выроÑшее раÑтение. +Hotelier=Владелец гоÑтиницы +House of Obsidian=Дом из обÑидиана +In space, no one can hear you scream=Ð’ коÑмоÑе ваши крики не Ñлышно +In the Dungeon=Ð’ подземелье +In the Flow=Ð’ течении +Industrial Age=ИндуÑÑ‚Ñ€Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ +Item transporter=ТранÑпортировщик предметов +Jungle Discoverer=Первооткрыватель джунглей +Junglebaby=Маугли +Jungleman=Тарзан +Lava Miner=Лавовый шахтёр +Lava and Water=Лава и вода +Light It Up=Да будет Ñвет! +Little Library=ÐÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° +Long Ladder=Ð”Ð»Ð¸Ð½Ð½Ð°Ñ Ð»ÐµÑтница +Lumberjack=ЛеÑоруб +Marchand De Sable=Торговец пеÑком +Master Architect=Главный архитектор +Master Miner=Главный шахтёр +Mese Mastery=Мезе-маÑтер +Mine 18 diamond ores.=Добыть 18 алмазной руды. +Mine 45 gold ores.=Добыть 45 золотой руды. +Mine 50 obsidian.=Добыть 50 обÑидиана. +Mine a mese block.=Добыть мезовый блок. +Mine a mossy cobblestone.=Добыть замшелый булыжник. +Mine a nyan cat.=Добыть нÑн-кÑта. +Mine any block while being very close to lava.=Добыть любой блок, находÑÑÑŒ очень близко к лаве. +Mine some dry grass.=Добыть немного Ñухой травы. +Mine some grass.=Добыть немного травы. +Mine your first cactus.=Добыть Ñвой первый кактуÑ. +Mine your first diamond ore.=Добыть Ñвою первую алмазную руду. +Mine your first dry shrub.=Добыть Ñвой первый Ñухой куÑÑ‚. +Mine your first gold ore.=Добыть Ñвою первую золотую руду. +Mine your first ice.=Добыть Ñвой первый лёд. +Mine your first jungle grass.=Добыть Ñвою первую траву из джунглей. +Mine your first mese ore.=Добыть Ñвою первую мезовую руду. +Mine your first obsidian.=Добыть Ñвой первый обÑидиан. +Mini Miner=Мини-шахтёр +Mushroom Lover=Любитель грибов +Obsessed with Obsidian=Одержимый обÑидианом +Oil Tycoon=Фабрика маÑла +On The Way=Вагонные Ñпоры +Outpost=ÐванпоÑÑ‚ +Pharaoh=Фараон +Place 1,000 torches.=ПоÑтавить 1,000 факелов. +Place 100 rails.=ПоÑтавить 100 рельÑ. +Place 100 stone.=ПоÑтавить 100 камней. +Place 100 torches.=ПоÑтавить 100 факелов. +Place 10000 tubes.=УÑтановить 10000 труб. +Place 2 trap stones.=УÑтановить 2 камнÑ-ловушки. +Place 20 coal checkers.=ПоÑтавить 20 мозаик из углÑ. +Place 20 iron checkers.=ПоÑтавить 20 мозаик из железа. +Place 40 steel ladders.=УÑтановить 40 Ñтальных леÑтниц. +Place 400 wooden ladders.=УÑтановить 400 деревÑнных леÑтниц. +Place 5 autocrafters.=УÑтановить 5 авто-крафтеров. +Place 500 mesecon wires.=УÑтановить 500 мезовых проводов. +Place two snow blocks.=ПоÑтавить два Ñнежных блока. +Professional Lumberjack=ПрофеÑÑиональный леÑоруб +Put out 1000 fires.=Потушить 1000 блоков огнÑ. +Pyromaniac=ПироманьÑк +Really Well Lit=ДейÑтвительно Ñветло +Roses Are Red=Розы - краÑные +Saint-Maclou=Сен-Маклу +Sam the Trapper=СÑм-Охотник +Savannah Discoverer=Первооткрыватель Ñаванн +Semi-pro Lumberjack=ПолупрофеÑÑиональный леÑоруб +Smelter=ÐŸÐ»Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ +Tasty Mushrooms=ВкуÑные грибы +This is Sad=Это? Это печально +Treasurer=Казначей +Underground Mushroom Farmer=Подпольный грибовод +Very Simple Snow Man=ПроÑто Ñнеговик +Watchtower=Ð¡Ñ‚Ð¾Ñ€Ð¾Ð¶ÐµÐ²Ð°Ñ Ð±Ð°ÑˆÐ½Ñ +Well Lit=Светло +Wheat Magnate=Пшеничный магнат +White Color Stock=Ð—Ð°Ð¿Ð°Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ цвета +Wool Over Your Eyes=Слишком много шерÑти +Wow, I am Diamonds!=Ух ты, алмазы! +You Suck!=Ðеудачник! +You're a witch!=Сжечь ведьму! +You’re a copper=Ð’Ñ‹ коппер +Yummy!=М-м-м! + +### chat_commands.lua ### += +=<имÑ> +All your awards and statistics have been cleared. You can now start again.=Ð’Ñе ваши доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑтатиÑтика были уÑтранены. Теперь вы можете начать Ñнова. +Award not found.=ДоÑтижение не найдено. +Get the awards statistics for the given player or yourself=Получите ÑтатиÑтику доÑтижений Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ игрока или ÑÐµÐ±Ñ +Show details of an award=Показать информацию о доÑтижении +Show, clear, disable or enable your awards=Показать, очиÑтить, отключить или включить ваши доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ +You have disabled awards.=Ð’Ñ‹ отключили доÑтижениÑ. +You have enabled awards.=Ð’Ñ‹ включили доÑтижениÑ. +[c|clear|disable|enable]=[c|clear|disable|enable] + +### gui.lua ### +%s’s awards:=ДоÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ %s: +(Secret Award)=(Секретное доÑтижение) +@1 (unlocked)=@1 (разблокировано) +Awards=ДоÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ +Error: No achivements available.=Ошибка: доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупны. +Error: No award available.=Ошибка: доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупны. +OK=OK +Unlock this award to find out what it is.=Разблокируйте Ñто доÑтижение, чтобы выÑÑнить, что Ñто такое. +You have not unlocked any awards.=Ð’Ñ‹ не открыли ни одно доÑтижение. +You've disabled awards. Type /awards enable to reenable.=Ð’Ñ‹ отключили доÑтижениÑ. Введите /awards, чтобы включить обратно. + +### triggers.lua ### +@1/@2 chat messages=@1/@2 Ñообщений в чате +@1/@2 crafted=@1/@2 Ñоздано +@1/@2 deaths=@1/@2 Ñмертей +@1/@2 dug=@1/@2 добыто +@1/@2 eaten=@1/@2 Ñъедено +@1/@2 joins=@1/@2 приÑоединений +@1/@2 placed=@1/@2 уÑтановлено +Chat @1 times=Отправить Ñообщений в чат @1 раз +Craft @1 item=Создать @1 предмет +Craft @1 items.=Создать @1 предметов. +Craft: @1×@2=Создать: @1×@2 +Craft: @2=Создать: @2 +Die @1 times of @2=Умереть @1 из @2 раз +Die @1 times.=Умереть @1 раз. +Die once of @2=Умереть один раз из @2 +Eat @1 item=СъеÑть @1 +Eat @1 items.=СъеÑть @1 предметов. +Eat @1×@2=СъеÑть @1×@2 +Eat @2=СъеÑть @2 +Join @1 times=ПриÑоединитÑÑ @1 раз +Join once=ПриÑоединитÑÑ Ð¾Ð´Ð¸Ð½ раз +Mine @1 block.=Добыть @1 блок. +Mine @1 blocks.=Добыть @1 блоков. +Mine @1 times=Добыть @1 раз +Mine: @1×@2=Добыть: @1×@2 +Mine: @2=Добыть: @2 +Place @1 block.=УÑтановить @1 блок. +Place @1 blocks.=УÑтановить @1 блоков. +Place: @1×@2=УÑтановить: @1×@2 +Place: @2=УÑтановить: @2 +Send a chat message=Отправить Ñообщение в чат diff --git a/mods/awards/locale/template.txt b/mods/awards/locale/template.txt new file mode 100644 index 00000000..58b98c89 --- /dev/null +++ b/mods/awards/locale/template.txt @@ -0,0 +1,236 @@ +# textdomain: awards + +### api_awards.lua ### +Award Unlocked!= +Award Unlocked: %s= +Secret Award Unlocked!= +Secret Award Unlocked: %s= + +### awards.lua ### +A Cat in a Pop-Tart?!= +Architect= +Aspiring Farmer= +Backpacker= +Baker= +Banker= +Bricker= +Build a Cave= +Builder= +Burn to death in a fire.= +Castorama= +Craft 10 furnaces.= +Craft 10 mese lamps.= +Craft 100 obsidian bricks.= +Craft 100 sandstone bricks.= +Craft 100 sticks.= +Craft 100 white dyes.= +Craft 14 vessels shelves.= +Craft 15 chests.= +Craft 15 fancy beds.= +Craft 200 brick blocks.= +Craft 200 stone bricks.= +Craft 24 gold block stairs.= +Craft 250 white wool.= +Craft 3,200 stone bricks.= +Craft 30 locked chests.= +Craft 4 large bags.= +Craft 400 blue dyes.= +Craft 400 desert stone bricks.= +Craft 400 red dyes.= +Craft 400 yellow dyes.= +Craft 500 times oil extract.= +Craft 7 bookshelves.= +Craft 8 times flint and steel.= +Craft 800 stone bricks.= +Craft a diamond block.= +Crafter of Sticks= +Dandelions are Yellow= +Death in the Deeps= +Desert Discoverer= +Desert Dweller= +Die 100 times.= +Die above 10000= +Die below -10000= +Die in flowing lava.= +Die near bones.= +Die near diamond ore.= +Dig 1,000 copper ores.= +Dig 1,000 jungle tree blocks.= +Dig 1,000 sand.= +Dig 1,000 stone blocks.= +Dig 1,296 tree blocks.= +Dig 10,000 stone blocks.= +Dig 100 jungle tree blocks.= +Dig 100 stone blocks.= +Dig 216 tree blocks.= +Dig 36 tree blocks.= +Dig 6 tree blocks.= +Eat 10 loaves of bread.= +Eat 3 brown mushrooms.= +Eat 33 brown mushrooms.= +Eat 333 brown mushrooms.= +Eat 80 apples.= +Electical Engineer= +Engineer= +Factory= +Far Lands= +Farming Skills Acquired= +Field Worker= +Filthy Rich= +Firefighter= +First Day in the Woods= +First Gold Find= +First Mese Find= +Fortress= +Geraniums are Blue= +Girl's Best Friend= +Glacier Discoverer= +Glasser= +Gold Rush= +Grasslands Discoverer= +Graveyard= +Hardened Miner= +Hardest Block on Earth= +Harvest 125 fully grown wheat plants.= +Harvest 25 fully grown wheat plants.= +Harvest 625 fully grown wheat plants.= +Harvest a fully grown wheat plant.= +Hotelier= +House of Obsidian= +In space, no one can hear you scream= +In the Dungeon= +In the Flow= +Industrial Age= +Item transporter= +Jungle Discoverer= +Junglebaby= +Jungleman= +Lava Miner= +Lava and Water= +Light It Up= +Little Library= +Long Ladder= +Lumberjack= +Marchand De Sable= +Master Architect= +Master Miner= +Mese Mastery= +Mine 18 diamond ores.= +Mine 45 gold ores.= +Mine 50 obsidian.= +Mine a mese block.= +Mine a mossy cobblestone.= +Mine a nyan cat.= +Mine any block while being very close to lava.= +Mine some dry grass.= +Mine some grass.= +Mine your first cactus.= +Mine your first diamond ore.= +Mine your first dry shrub.= +Mine your first gold ore.= +Mine your first ice.= +Mine your first jungle grass.= +Mine your first mese ore.= +Mine your first obsidian.= +Mini Miner= +Mushroom Lover= +Obsessed with Obsidian= +Oil Tycoon= +On The Way= +Outpost= +Pharaoh= +Place 1,000 torches.= +Place 100 rails.= +Place 100 stone.= +Place 100 torches.= +Place 10000 tubes.= +Place 2 trap stones.= +Place 20 coal checkers.= +Place 20 iron checkers.= +Place 40 steel ladders.= +Place 400 wooden ladders.= +Place 5 autocrafters.= +Place 500 mesecon wires.= +Place two snow blocks.= +Professional Lumberjack= +Put out 1000 fires.= +Pyromaniac= +Really Well Lit= +Roses Are Red= +Saint-Maclou= +Sam the Trapper= +Savannah Discoverer= +Semi-pro Lumberjack= +Smelter= +Tasty Mushrooms= +This is Sad= +Treasurer= +Underground Mushroom Farmer= +Very Simple Snow Man= +Watchtower= +Well Lit= +Wheat Magnate= +White Color Stock= +Wool Over Your Eyes= +Wow, I am Diamonds!= +You Suck!= +You're a witch!= +You’re a copper= +Yummy!= + +### chat_commands.lua ### += += +All your awards and statistics have been cleared. You can now start again.= +Award not found.= +Get the awards statistics for the given player or yourself= +Show details of an award= +Show, clear, disable or enable your awards= +You have disabled awards.= +You have enabled awards.= +[c|clear|disable|enable]= + +### gui.lua ### +%s’s awards:= +(Secret Award)= +@1 (unlocked)= +Awards= +Error: No achivements available.= +Error: No award available.= +OK= +Unlock this award to find out what it is.= +You have not unlocked any awards.= +You've disabled awards. Type /awards enable to reenable.= + +### triggers.lua ### +@1/@2 chat messages= +@1/@2 crafted= +@1/@2 deaths= +@1/@2 dug= +@1/@2 eaten= +@1/@2 joins= +@1/@2 placed= +Chat @1 times= +Craft @1 item= +Craft @1 items.= +Craft: @1×@2= +Craft: @2= +Die @1 times of @2= +Die @1 times.= +Die once of @2= +Eat @1 item= +Eat @1 items.= +Eat @1×@2= +Eat @2= +Join @1 times= +Join once= +Mine @1 block.= +Mine @1 blocks.= +Mine @1 times= +Mine: @1×@2= +Mine: @2= +Place @1 block.= +Place @1 blocks.= +Place: @1×@2= +Place: @2= +Send a chat message= diff --git a/mods/awards/mod.conf b/mods/awards/mod.conf new file mode 100644 index 00000000..1e7b5d54 --- /dev/null +++ b/mods/awards/mod.conf @@ -0,0 +1,8 @@ +name = awards +title = Awards +author = rubenwardy +description = Adds awards to Minetest, and an API to register new ones. +optional_depends = sfinv,unified_inventory,default,stairs,farming,dye,beds,wool,vessels,moreblocks,fire,flowers,nyancat +license = MIT +forum = https://forum.minetest.net/viewtopic.php?t=4870 +version = 3.0.0 diff --git a/mods/awards/settingtypes.txt b/mods/awards/settingtypes.txt new file mode 100644 index 00000000..1133d522 --- /dev/null +++ b/mods/awards/settingtypes.txt @@ -0,0 +1,2 @@ +# Add default achievements from the awards mod +awards.add_defaults (Add Default Achievements) bool true diff --git a/mods/awards/sounds/awards_got_generic.ogg b/mods/awards/sounds/awards_got_generic.ogg new file mode 100644 index 00000000..3ae982b3 Binary files /dev/null and b/mods/awards/sounds/awards_got_generic.ogg differ diff --git a/mods/awards/src/api_awards.lua b/mods/awards/src/api_awards.lua new file mode 100644 index 00000000..dbd61682 --- /dev/null +++ b/mods/awards/src/api_awards.lua @@ -0,0 +1,379 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.translator +local GOAL_ID_SEPARATOR = string.char(31) + +function awards.register_award(name, def) + def.name = name + def.goals = def.goals or {} + + -- Add legacy trigger as a goal + if def.trigger and def.trigger.type then + table.insert(def.goals,{ + description = def.description or def.trigger.type, + trigger = def.trigger, + }) + def.trigger = nil + end + + -- Add goals + def.goals.show_unlocked = def.goals.show_unlocked == nil and true or def.goals.show_unlocked + def.goals.show_locked = def.goals.show_locked == nil and true or def.goals.show_locked + for i = 1, #def.goals do + local goal = def.goals[i] + local goal_id = name .. GOAL_ID_SEPARATOR .. (goal.id or i) + goal.id = goal_id + goal.name = goal.id + function goal:can_unlock(data) + return def:can_unlock(data) + end + if goal.trigger then + local tdef = awards.registered_triggers[goal.trigger.type] + assert(tdef, "Trigger not found: " .. goal.trigger.type) + tdef:on_register(goal) + end + end + + def.goals.target = def.goals.target or #def.goals + + function def:can_unlock(data) + if not self.requires then + return true + end + + for i=1, #self.requires do + if not data.unlocked[self.requires[i]] then + return false + end + end + return true + end + + -- Add Award + awards.registered_awards[name] = def + + local tdef = awards.registered_awards[name] + if def.description == nil and tdef.getDefaultDescription then + def.description = tdef:getDefaultDescription() + end +end + + +-- This function is called whenever a target condition is met. +-- It checks if a player already has that award, and if they do not, +-- it gives it to them +---------------------------------------------- +--awards.unlock(name, award) +-- name - the name of the player +-- award - the name of the award to give +function awards.unlock(name, award, goal) + -- Ensure the player is online. + if not minetest.get_player_by_name(name) then + return + end + + -- Access Player Data + local data = awards.player(name) + + -- Do nothing if awards are disabled for the player + if data.disabled then + return + end + + -- Check for full award+goal string submitted by triggers + local separator_pos = award:find(GOAL_ID_SEPARATOR) + if separator_pos then + goal = award:sub(separator_pos + 1,-1) + award = award:sub(1,separator_pos - 1) + end + + -- Generate full goal string if we're unlocking a goal + if goal then + goal = award .. GOAL_ID_SEPARATOR .. goal + end + + local awdef = awards.registered_awards[award] + assert(awdef, "Unable to unlock an award which doesn't exist!") + + if not awdef:can_unlock(data) then + minetest.log("warning", "can_unlock returned false in unlock of " .. + award .. " for " .. name) + return + end + + -- Complete goal and proceed with award if target goals are complete + if goal then + if data.unlocked[goal] then + return + end + data.unlocked[goal] = goal + awards.save() + local goals_unlocked = 0 + for _,goal in ipairs(awdef.goals) do + if data.unlocked[goal.id] then + goals_unlocked = goals_unlocked + 1 + end + end + if goals_unlocked < awdef.goals.target then + return + end + end + + -- Return if award is already unlocked + if data.unlocked[award] then + return + end + + -- Unlock Award + minetest.log("action", name.." has unlocked award "..award) + data.unlocked[award] = award + awards.save() + + -- Give Prizes + if awdef and awdef.prizes then + for i = 1, #awdef.prizes do + local itemstack = ItemStack(awdef.prizes[i]) + if not itemstack:is_empty() then + local receiverref = minetest.get_player_by_name(name) + if receiverref then + receiverref:get_inventory():add_item("main", itemstack) + end + end + end + end + + -- Run callbacks + if awdef.on_unlock and awdef.on_unlock(name, awdef) then + return + end + for _, callback in pairs(awards.on_unlock) do + if callback(name, awdef) then + return + end + end + + -- Get Notification Settings + local title = awdef.title or award + local desc = awdef.description or "" + local background = awdef.hud_background or awdef.background or "awards_bg_default.png" + local icon = (awdef.icon or "awards_unknown.png") .. "^[resize:32x32" + local sound = awdef.sound + if sound == nil then + -- Explicit check for nil because sound could be `false` to disable it + sound = {name="awards_got_generic", gain=0.25} + end + + -- Do Notification + if sound then + -- Enforce sound delay to prevent sound spamming + local lastsound = data.lastsound + if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then + minetest.sound_play(sound, {to_player=name}) + data.lastsound = os.time() + end + end + + if awards.show_mode == "chat" then + local chat_announce + if awdef.secret then + chat_announce = S("Secret Award Unlocked: %s") + else + chat_announce = S("Award Unlocked: %s") + end + -- use the chat console to send it + minetest.chat_send_player(name, string.format(chat_announce, title)) + if desc~="" then + minetest.chat_send_player(name, desc) + end + else + local player = minetest.get_player_by_name(name) + local one = player:hud_add({ + hud_elem_type = "image", + name = "award_bg", + scale = {x = 2, y = 1}, + text = background, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 138}, + alignment = {x = 0, y = -1} + }) + local hud_announce + if awdef.secret then + hud_announce = S("Secret Award Unlocked!") + else + hud_announce = S("Award Unlocked!") + end + local two = player:hud_add({ + hud_elem_type = "text", + name = "award_au", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = hud_announce, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 45}, + alignment = {x = 0, y = -1} + }) + local three = player:hud_add({ + hud_elem_type = "text", + name = "award_title", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = title, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 100}, + alignment = {x = 0, y = -1} + }) + local four = player:hud_add({ + hud_elem_type = "image", + name = "award_icon", + scale = {x = 2, y = 2}, -- adjusted for 32x32 from x/y = 4 + text = icon, + position = {x = 0.5, y = 0.05}, + offset = {x = -200.5, y = 126}, + alignment = {x = 0, y = -1} + }) + minetest.after(4, function() + local player2 = minetest.get_player_by_name(name) + if player2 then + player2:hud_remove(one) + player2:hud_remove(two) + player2:hud_remove(three) + player2:hud_remove(four) + end + end) + end +end + +function awards.remove(name, award) + local data = awards.player(name) + local awdef = awards.registered_awards[award] + assert(awdef, "Unable to remove an award which doesn't exist!") + + if data.disabled or + (not data.unlocked[award]) then + return + end + + minetest.log("action", "Award " .. award .." has been removed from ".. name) + data.unlocked[award] = nil + awards.save() +end + +local function sorter(a,b) + return a.score < b.score +end + +function awards.get_award_states(name) + local hash_is_unlocked = {} + local retval = {} + + -- Add all unlocked awards + local data = awards.player(name) + if data and data.unlocked then + for awardname, _ in pairs(data.unlocked) do + local def = awards.registered_awards[awardname] + if def then + hash_is_unlocked[awardname] = true + local difficulty = def.difficulty or 1 + local score = -1000000 + difficulty + + retval[#retval + 1] = { + name = awardname, + def = def, + goals = (function() + local goals = { + show_locked = def.goals.show_locked, + show_unlocked = def.goals.show_unlocked, + } + if def.goals then + for i = 1, #def.goals do + local goal = def.goals[i] + local progress = goal.get_progress and goal:get_progress(data) + table.insert(goals,{ + def = goal, + progress = progress, + unlocked = data.unlocked[goal.id] and true or false, + }) + end + end + return #goals > 0 and goals or nil + end)(), + unlocked = true, + started = true, + score = score, + progress = nil, + } + end + end + end + + -- Add all locked awards + local in_progress = {} + local not_started = {} + for _, def in pairs(awards.registered_awards) do + if not hash_is_unlocked[def.name] and def:can_unlock(data) then + local total_progress = { current = 0, target = 0 } + local started = false + local difficulty = def.difficulty or 1 + local score = difficulty + if def.secret then + score = 1000000 + end + + local award = { + name = def.name, + def = def, + goals = (function() + local goals = { + show_locked = def.goals.show_locked, + show_unlocked = def.goals.show_unlocked, + } + if def.goals then + local target = def.goals.target + for i = 1, #def.goals do + local goal = def.goals[i] + local progress = goal.get_progress and goal:get_progress(data) or { current = data.unlocked[goal.id] and 1 or 0, target = 1 } + total_progress.current = total_progress.current + progress.current + total_progress.target = total_progress.target + progress.target + local perc = progress.current / progress.target + if perc > 0 then + started = true + end + table.insert(goals,{ + def = goal, + progress = progress, + unlocked = data.unlocked[goal.id] and true or false, + }) + end + end + return #goals > 0 and goals or nil + end)(), + unlocked = false, + started = started, + score = score, + progress = total_progress, + } + + if award.started then + table.insert(in_progress,award) + else + table.insert(not_started,award) + end + end + end + + -- Sort award categories + table.sort(retval,sorter) + table.sort(in_progress,sorter) + table.sort(not_started,sorter) + + -- Append categories to the return value + for _,award in ipairs(in_progress) do + table.insert(retval,award) + end + for _,award in ipairs(not_started) do + table.insert(retval,award) + end + + -- Return complete list of awards + return retval +end diff --git a/mods/awards/src/api_triggers.lua b/mods/awards/src/api_triggers.lua new file mode 100644 index 00000000..2df58930 --- /dev/null +++ b/mods/awards/src/api_triggers.lua @@ -0,0 +1,222 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local function ngettext(msgid, msgid_plural, n, ...) + return awards.translator(n==1 and msgid or msgid_plural, ...) +end + +local S, NS = awards.translator, ngettext + +awards.on = {} + +local default_def = {} + +function default_def:run_callbacks(player, data, table_func) + for i = 1, #self.on do + local res = nil + local entry = self.on[i] + if type(entry) == "function" then + res = entry(player, data) + elseif type(entry) == "table" and entry.award then + res = table_func(entry) + end + + if res then + awards.unlock(player:get_player_name(), res) + end + end +end + +function awards.register_trigger(tname, tdef) + assert(type(tdef) == "table", + "Passing a callback to register_trigger is not supported in 3.0") + + tdef.name = tname + for key, value in pairs(default_def) do + tdef[key] = value + end + + if tdef.type == "counted" then + local old_reg = tdef.on_register + + function tdef:on_register(def) + local tmp = { + award = def.name, + target = def.trigger.target, + } + tdef.register(tmp) + + function def.get_progress(_, data) + local current = math.min(data[tname] or 0, tmp.target) + return { + current = current, + target = tmp.target, + label = S(tdef.progress, current, tmp.target), + } + end + + function def.getDefaultDescription(_) + local n = def.trigger.target + return NS(tdef.auto_description[1], tdef.auto_description[2], n, n) + end + + if old_reg then + return old_reg(tdef, def) + end + end + + function tdef.notify(player) + assert(player and player.is_player and player:is_player()) + local name = player:get_player_name() + local data = awards.player(name) + + -- Increment counter + local currentVal = (data[tname] or 0) + 1 + data[tname] = currentVal + + tdef:run_callbacks(player, data, function(entry) + if entry.target and entry.award and currentVal and + currentVal >= entry.target then + return entry.award + end + end) + end + + awards["notify_" .. tname] = tdef.notify + + elseif tdef.type == "counted_key" then + if tdef.key_is_item then + tdef.watched_groups = {} + end + + -- On award register + local old_reg = tdef.on_register + function tdef:on_register(def) + -- Register trigger + local tmp = { + award = def.name, + key = tdef:get_key(def), + target = def.trigger.target, + } + tdef.register(tmp) + + -- If group, add it to watch list + if tdef.key_is_item and tmp.key and tmp.key:sub(1, 6) == "group:" then + tdef.watched_groups[tmp.key:sub(7, #tmp.key)] = true + end + + -- Called to get progress values and labels + function def.get_progress(_, data) + data[tname] = data[tname] or {} + + local done + if tmp.key then + done = data[tname][tmp.key] or 0 + else + done = data[tname].__total or 0 + end + done = math.min(done, tmp.target) + + return { + current = done, + target = tmp.target, + label = S(tdef.progress, done, tmp.target), + } + end + + -- Build description if none is specificed by the award + function def.getDefaultDescription(_) + local n = def.trigger.target + if tmp.key then + local nname = tmp.key + return NS(tdef.auto_description[1], + tdef.auto_description[2], n, n, nname) + else + return NS(tdef.auto_description_total[1], + tdef.auto_description_total[2], n, n) + end + end + + -- Call on_register in trigger type definition + if old_reg then + return old_reg(tdef, def) + end + end + + function tdef.notify(player, key, n) + n = n or 1 + + if tdef.key_is_item and key:sub(1, 6) ~= "group:" then + local itemdef = minetest.registered_items[key] + if itemdef then + for groupname,rating in pairs(itemdef.groups or {}) do + if rating ~= 0 and tdef.watched_groups[groupname] then + tdef.notify(player, "group:" .. groupname, n) + end + end + end + end + + assert(player and player.is_player and player:is_player() and key) + local name = player:get_player_name() + local data = awards.player(name) + + -- Increment counter + data[tname] = data[tname] or {} + local currentVal = (data[tname][key] or 0) + n + data[tname][key] = currentVal + data[tname].__total = (data[tname].__total or 0) + if key:sub(1, 6) ~= "group:" then + data[tname].__total = data[tname].__total + n + end + + tdef:run_callbacks(player, data, function(entry) + local current + if entry.key == key then + current = currentVal + elseif entry.key == nil then + current = data[tname].__total + else + return + end + if current >= entry.target then + return entry.award + end + end) + end + + awards["notify_" .. tname] = tdef.notify + + elseif tdef.type and tdef.type ~= "custom" then + error("Unrecognised trigger type " .. tdef.type) + end + + awards.registered_triggers[tname] = tdef + + tdef.on = {} + tdef.register = function(func) + table.insert(tdef.on, func) + end + + -- Backwards compat + awards.on[tname] = tdef.on + awards['register_on_' .. tname] = tdef.register + return tdef +end + +function awards.increment_item_counter(data, field, itemname, count) + itemname = minetest.registered_aliases[itemname] or itemname + data[field][itemname] = (data[field][itemname] or 0) + (count or 1) +end + +function awards.get_item_count(data, field, itemname) + itemname = minetest.registered_aliases[itemname] or itemname + return data[field][itemname] or 0 +end + +function awards.get_total_keyed_count(data, field) + return data[field].__total or 0 +end + +function awards.register_on_unlock(func) + table.insert(awards.on_unlock, func) +end diff --git a/mods/awards/src/awards.lua b/mods/awards/src/awards.lua new file mode 100644 index 00000000..2e1ffae9 --- /dev/null +++ b/mods/awards/src/awards.lua @@ -0,0 +1,1112 @@ +-- Copyright (c) 2013-18 rubenwardy and Wuzzy. MIT. + +local S = awards.translator + + +-- Saint-Maclou +if minetest.get_modpath("moreblocks") then + awards.register_award("award_saint_maclou",{ + title = S("Saint-Maclou"), + description = S("Place 20 coal checkers."), + icon = "awards_saint_maclou.png", + trigger = { + type = "place", + node = "moreblocks:coal_checker", + target = 20 + } + }) + + -- Castorama + awards.register_award("award_castorama",{ + title = S("Castorama"), + description = S("Place 20 iron checkers."), + icon = "awards_castorama.png", + trigger = { + type = "place", + node = "moreblocks:iron_checker", + target = 20 + } + }) + + -- Sam the Trapper + awards.register_award("award_sam_the_trapper",{ + title = S("Sam the Trapper"), + description = S("Place 2 trap stones."), + icon = "awards_sam_the_trapper.png", + trigger = { + type = "place", + node = "moreblocks:trap_stone", + target = 2 + } + }) +end + +-- This award can't be part of Unified Inventory, it would make a circular dependency +if minetest.get_modpath("unified_inventory") then + if minetest.get_all_craft_recipes("unified_inventory:bag_large") ~= nil then + awards.register_award("awards_ui_bags", { + title = S("Backpacker"), + description = S("Craft 4 large bags."), + icon = "awards_backpacker.png", + trigger = { + type = "craft", + item = "unified_inventory:bag_large", + target = 4 + } + }) + end +end + +if minetest.get_modpath("fire") then + awards.register_award("awards_pyro", { + title = S("Pyromaniac"), + description = S("Craft 8 times flint and steel."), + icon = "awards_pyromaniac.png", + trigger = { + type = "craft", + item = "fire:flint_and_steel", + target = 8 + } + }) + if minetest.settings:get_bool("disable_fire") ~= true then + awards.register_award("awards_firefighter", { + title = S("Firefighter"), + description = S("Put out 1000 fires."), + icon = "awards_firefighter.png", + trigger = { + type = "dig", + node = "fire:basic_flame", + target = 1000 + } + }) + end + + + -- Burned to death + awards.register_award("award_burn", { + title = S("You're a witch!"), + description = S("Burn to death in a fire."), + secret = true, + }) + awards.register_on_death(function(player,data) + local pos = player:get_pos() + if pos and minetest.find_node_near(pos, 2, "fire:basic_flame") ~= nil then + return "award_burn" + end + return nil + end) +end + +-- You Suck! +awards.register_award("award_you_suck", { + title = S("You Suck!"), + description = S("Die 100 times."), + trigger = { + type = "death", + target = 100 + }, + secret = true, +}) + +-- Die hi +awards.register_award("award_deep_down", { + title = S("Death in the Deeps"), + description = S("Die below -10000"), + secret = true, +}) +awards.register_on_death(function(player,data) + local pos = player:get_pos() + if pos and pos.y < -10000 then + return "award_deep_down" + end + return nil +end) + +-- Die near diamond ore +awards.register_award("award_no_screen", { + title = S("In space, no one can hear you scream"), + description = S("Die above 10000"), + secret = true, +}) +awards.register_on_death(function(player,data) + local pos = player:get_pos() + if pos and pos.y > 10000 then + return "award_no_screen" + end + return nil +end) + +if minetest.get_modpath("default") then + -- Light it up + awards.register_award("award_lightitup",{ + title = S("Light It Up"), + description = S("Place 100 torches."), + icon = "awards_light_it_up.png^awards_level1.png", + difficulty = 0.01, + trigger = { + type = "place", + node = "default:torch", + target = 100 + } + }) + + -- Light ALL the things! + awards.register_award("award_well_lit",{ + title = S("Well Lit"), + icon = "awards_well_lit.png^awards_level2.png", + description = S("Place 1,000 torches."), + difficulty = 0.01, + trigger = { + type = "place", + node = "default:torch", + target = 1000 + } + }) + + awards.register_award("award_meselamp",{ + title = S("Really Well Lit"), + description = S("Craft 10 mese lamps."), + icon = "awards_really_well_lit.png", + difficulty = 0.2, + trigger = { + type = "craft", + item = "default:meselamp", + target = 10 + } + }) + + awards.register_award("awards_stonebrick", { + title = S("Outpost"), + description = S("Craft 200 stone bricks."), + icon = "awards_outpost.png^awards_level1.png", + difficulty = 0.08, + trigger = { + type = "craft", + item = "default:stonebrick", + target = 200 + } + }) + + awards.register_award("awards_stonebrick2", { + title = S("Watchtower"), + description = S("Craft 800 stone bricks."), + icon = "awards_watchtower.png^awards_level2.png", + difficulty = 0.08, + trigger = { + type = "craft", + item = "default:stonebrick", + target = 800 + } + }) + + awards.register_award("awards_stonebrick3", { + title = S("Fortress"), + description = S("Craft 3,200 stone bricks."), + icon = "awards_fortress.png^awards_level3.png", + difficulty = 0.08, + trigger = { + type = "craft", + item = "default:stonebrick", + target = 3200 + } + }) + + awards.register_award("awards_desert_stonebrick", { + title = S("Desert Dweller"), + description = S("Craft 400 desert stone bricks."), + icon = "awards_desert_dweller.png", + difficulty = 0.09, + trigger = { + type = "craft", + item = "default:desert_stonebrick", + target = 400 + } + }) + + awards.register_award("awards_desertstonebrick", { + title = S("Pharaoh"), + description = S("Craft 100 sandstone bricks."), + icon = "awards_pharaoh.png", + difficulty = 0.09, + trigger = { + type = "craft", + item = "default:sandstonebrick", + target = 100 + } + }) + + awards.register_award("awards_bookshelf", { + title = S("Little Library"), + description = S("Craft 7 bookshelves."), + icon = "awards_little_library.png", + difficulty = 0.2, + trigger = { + type = "craft", + item = "default:bookshelf", + target = 7 + } + }) + + awards.register_award("awards_obsidian", { + title = S("Lava and Water"), + description = S("Mine your first obsidian."), + icon = "awards_lava_and_water.png^awards_level1.png", + hud_background = "awards_bg_mining.png", + difficulty = 1.5, + trigger = { + type = "dig", + node = "default:obsidian", + target = 1 + } + }) + + -- Obsessed with Obsidian + awards.register_award("award_obsessed_with_obsidian",{ + title = S("Obsessed with Obsidian"), + description = S("Mine 50 obsidian."), + icon = "awards_obsessed_with_obsidian.png^awards_level2.png", + hud_background = "awards_bg_mining.png", + difficulty = 1.5, + trigger = { + type = "dig", + node = "default:obsidian", + target = 50 + } + }) + + -- Proof that player has found lava + awards.register_award("award_lavaminer",{ + title = S("Lava Miner"), + description = S("Mine any block while being very close to lava."), + icon = "awards_lava_miner.png", + hud_background = "awards_bg_mining.png", + difficulty = 1, + }) + awards.register_on_dig(function(player,data) + local pos = player:get_pos() + if pos and (minetest.find_node_near(pos, 1, "default:lava_source") or + minetest.find_node_near(pos, 1, "default:lava_flowing")) then + return "award_lavaminer" + end + return nil + end) + + awards.register_award("award_lumberjack_firstday", { + title = S("First Day in the Woods"), + description = S("Dig 6 tree blocks."), + icon = "awards_first_day_in_the_woods.png^awards_level1.png", + difficulty = 0.03, + trigger = { + type = "dig", + node = "group:tree", + target = 6 + } + }) + + -- Lumberjack + awards.register_award("award_lumberjack", { + title = S("Lumberjack"), + description = S("Dig 36 tree blocks."), + icon = "awards_lumberjack.png^awards_level2.png", + difficulty = 0.03, + trigger = { + type = "dig", + node = "group:tree", + target = 36 + } + }) + + -- Semi-pro Lumberjack + awards.register_award("award_lumberjack_semipro", { + title = S("Semi-pro Lumberjack"), + description = S("Dig 216 tree blocks."), + icon = "awards_semi_pro_lumberjack.png^awards_level3.png", + difficulty = 0.03, + trigger = { + type = "dig", + node = "group:tree", + target = 216 + } + }) + + -- Professional Lumberjack + awards.register_award("award_lumberjack_professional", { + title = S("Professional Lumberjack"), + description = S("Dig 1,296 tree blocks."), + icon = "awards_professional_lumberjack.png^awards_level4.png", + difficulty = 0.03, + trigger = { + type = "dig", + node = "group:tree", + target = 1296 + } + }) + + -- Junglebaby + awards.register_award("award_junglebaby", { + title = S("Junglebaby"), + description = S("Dig 100 jungle tree blocks."), + icon = "awards_junglebaby.png^awards_level1.png", + difficulty = 0.05, + trigger = { + type = "dig", + node = "default:jungletree", + target = 100 + } + }) + + -- Jungleman + awards.register_award("award_jungleman", { + title = S("Jungleman"), + description = S("Dig 1,000 jungle tree blocks."), + icon = "awards_jungleman.png^awards_level2.png", + difficulty = 0.05, + trigger = { + type = "dig", + node = "default:jungletree", + target = 1000 + } + }) + + -- Found some Mese! + awards.register_award("award_mesefind", { + title = S("First Mese Find"), + description = S("Mine your first mese ore."), + icon = "awards_first_mese_find.png", + hud_background = "awards_bg_mining.png", + difficulty = 1, + trigger = { + type = "dig", + node = "default:stone_with_mese", + target = 1 + } + }) + + -- Mese Block + awards.register_award("award_meseblock", { + secret = true, + title = S("Mese Mastery"), + description = S("Mine a mese block."), + icon = "awards_mese_mastery.png", + hud_background = "awards_bg_mining.png", + difficulty = 1.1, + trigger = { + type = "dig", + node = "default:mese", + target = 1 + } + }) + + -- You're a copper + awards.register_award("award_youre_a_copper", { + title = S("You’re a copper"), + description = S("Dig 1,000 copper ores."), + icon = "awards_youre_a_copper.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.2, + trigger = { + type = "dig", + node = "default:stone_with_copper", + target = 1000 + } + }) + + -- Mini Miner + awards.register_award("award_mine2", { + title = S("Mini Miner"), + description = S("Dig 100 stone blocks."), + icon = "awards_mini_miner.png^awards_level1.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.02, + trigger = { + type = "dig", + node = "default:stone", + target = 100 + } + }) + + -- Hardened Miner + awards.register_award("award_mine3", { + title = S("Hardened Miner"), + description = S("Dig 1,000 stone blocks."), + icon = "awards_hardened_miner.png^awards_level2.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.02, + trigger = { + type = "dig", + node = "default:stone", + target = 1000 + } + }) + + -- Master Miner + awards.register_award("award_mine4", { + title = S("Master Miner"), + description = S("Dig 10,000 stone blocks."), + icon = "awards_master_miner.png^awards_level3.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.02, + trigger = { + type = "dig", + node = "default:stone", + target = 10000 + } + }) + + -- Marchand de sable + awards.register_award("award_marchand_de_sable", { + title = S("Marchand De Sable"), + description = S("Dig 1,000 sand."), + icon = "awards_marchand_de_sable.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.05, + trigger = { + type = "dig", + node = "default:sand", + target = 1000 + } + }) + + awards.register_award("awards_crafter_of_sticks", { + title = S("Crafter of Sticks"), + description = S("Craft 100 sticks."), + icon = "awards_crafter_of_sticks.png", + difficulty = 0.01, + trigger = { + type = "craft", + item = "default:stick", + target = 100 + } + }) + + awards.register_award("awards_junglegrass", { + title = S("Jungle Discoverer"), + description = S("Mine your first jungle grass."), + icon = "awards_jungle_discoverer.png", + difficulty = 0.009, + trigger = { + type = "dig", + node = "default:junglegrass", + target = 1 + } + }) + + awards.register_award("awards_grass", { + title = S("Grasslands Discoverer"), + description = S("Mine some grass."), + icon = "awards_grasslands_discoverer.png", + difficulty = 0.009, + trigger = { + type = "dig", + node = "default:grass_1", + target = 1 + } + }) + + awards.register_award("awards_dry_grass", { + title = S("Savannah Discoverer"), + description = S("Mine some dry grass."), + icon = "awards_savannah_discoverer.png", + difficulty = 0.009, + trigger = { + type = "dig", + node = "default:dry_grass_3", + target = 1 + } + }) + + awards.register_award("awards_cactus", { + title = S("Desert Discoverer"), + description = S("Mine your first cactus."), + icon = "awards_desert_discoverer.png", + difficulty = 0.03, + trigger = { + type = "dig", + node = "default:cactus", + target = 1 + } + }) + + awards.register_award("awards_dry_shrub", { + title = S("Far Lands"), + description = S("Mine your first dry shrub."), + icon = "awards_far_lands.png", + difficulty = 0.009, + trigger = { + type = "dig", + node = "default:dry_shrub", + target = 1 + } + }) + + awards.register_award("awards_ice", { + title = S("Glacier Discoverer"), + description = S("Mine your first ice."), + icon = "awards_glacier_discoverer.png", + difficulty = 0.02, + trigger = { + type = "dig", + node = "default:ice", + target = 1 + } + }) + + -- Proof that player visited snowy lands + awards.register_award("awards_snowblock", { + title = S("Very Simple Snow Man"), + description = S("Place two snow blocks."), + icon = "awards_very_simple_snow_man.png", + difficulty = 0.02, + trigger = { + type = "place", + node = "default:snowblock", + target = 2 + } + }) + + awards.register_award("awards_gold_ore", { + title = S("First Gold Find"), + description = S("Mine your first gold ore."), + icon = "awards_first_gold_find.png^awards_level1.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.9, + trigger = { + type = "dig", + node = "default:stone_with_gold", + target = 1 + } + }) + + awards.register_award("awards_gold_rush", { + title = S("Gold Rush"), + description = S("Mine 45 gold ores."), + icon = "awards_gold_rush.png^awards_level2.png", + hud_background = "awards_bg_mining.png", + difficulty = 0.9, + trigger = { + type = "dig", + node = "default:stone_with_gold", + target = 45 + } + }) + + awards.register_award("awards_diamond_ore", { + title = S("Wow, I am Diamonds!"), + description = S("Mine your first diamond ore."), + icon = "awards_wow_i_am_diamonds.png^awards_level1.png", + difficulty = 1, + trigger = { + type = "dig", + node = "default:stone_with_diamond", + target = 1 + } + }) + + awards.register_award("awards_diamond_rush", { + title = S("Girl's Best Friend"), + description = S("Mine 18 diamond ores."), + icon = "awards_girls_best_friend.png^awards_level2.png", + hud_background = "awards_bg_mining.png", + difficulty = 1, + trigger = { + type = "dig", + node = "default:stone_with_diamond", + target = 18 + } + }) + + awards.register_award("awards_diamondblock", { + title = S("Hardest Block on Earth"), + description = S("Craft a diamond block."), + icon = "awards_hardest_block_on_earth.png", + difficulty = 1.1, + trigger = { + type = "craft", + item = "default:diamondblock", + target = 1 + } + }) + + awards.register_award("awards_mossycobble", { + title = S("In the Dungeon"), + description = S("Mine a mossy cobblestone."), + icon = "awards_in_the_dungeon.png", + difficulty = 0.9, + trigger = { + type = "dig", + node = "default:mossycobble", + target = 1 + } + }) + + awards.register_award("award_furnace", { + title = S("Smelter"), + description = S("Craft 10 furnaces."), + icon = "awards_smelter.png", + difficulty = 0.08, + trigger = { + type = "craft", + item= "default:furnace", + target = 10 + } + }) + + awards.register_award("award_chest", { + title = S("Treasurer"), + description = S("Craft 15 chests."), + icon = "awards_treasurer.png", + difficulty = 0.08, + trigger = { + type = "craft", + item= "default:chest", + target = 15 + } + }) + + awards.register_award("award_chest2", { + title = S("Banker"), + description = S("Craft 30 locked chests."), + icon = "awards_banker.png", + difficulty = 0.08, + trigger = { + type = "craft", + item= "default:chest_locked", + target = 30 + } + }) + + awards.register_award("award_brick", { + title = S("Bricker"), + description = S("Craft 200 brick blocks."), + icon = "awards_bricker.png", + difficulty = 0.03, + trigger = { + type = "craft", + item= "default:brick", + target = 200 + } + }) + + awards.register_award("award_obsidianbrick", { + title = S("House of Obsidian"), + description = S("Craft 100 obsidian bricks."), + icon = "awards_house_of_obsidian.png", + difficulty = 0.4, + trigger = { + type = "craft", + item= "default:obsidianbrick", + target = 100 + } + }) + + awards.register_award("award_placestone", { + title = S("Build a Cave"), + description = S("Place 100 stone."), + icon = "awards_build_a_cave.png", + difficulty = 0.1, + trigger = { + type = "place", + node = "default:stone", + target = 100 + } + }) + + awards.register_award("award_woodladder", { + title = S("Long Ladder"), + description = S("Place 400 wooden ladders."), + icon = "awards_long_ladder.png", + difficulty = 0.1, + trigger = { + type = "place", + node = "default:ladder_wood", + target = 400 + } + }) + + awards.register_award("award_steelladder", { + title = S("Industrial Age"), + description = S("Place 40 steel ladders."), + icon = "awards_industrial_age.png", + difficulty = 1, + trigger = { + type = "place", + node = "default:ladder_steel", + target = 40 + } + }) + + awards.register_award("award_apples", { + title = S("Yummy!"), + description = S("Eat 80 apples."), + icon = "awards_yummy.png", + difficulty = 0.1, + trigger = { + type = "eat", + item = "default:apple", + target = 80 + } + }) + + -- Died in flowing lava + awards.register_award("award_in_the_flow", { + title = S("In the Flow"), + description = S("Die in flowing lava."), + secret = true, + }) + awards.register_on_death(function(player,data) + local pos = player:get_pos() + if pos and (minetest.find_node_near(pos, 2, "default:lava_flowing") ~= nil or + minetest.find_node_near(pos, 2, "default:lava_source") ~= nil) then + return "award_in_the_flow" + end + return nil + end) + + -- Die near diamond ore + awards.register_award("award_this_is_sad", { + title = S("This is Sad"), + description = S("Die near diamond ore."), + secret = true, + }) + awards.register_on_death(function(player,data) + local pos = player:get_pos() + if pos and minetest.find_node_near(pos, 5, "default:stone_with_diamond") ~= nil then + return "award_this_is_sad" + end + return nil + end) +end + +if minetest.get_modpath("carts") then + -- On the way + awards.register_award("award_on_the_way", { + title = S("On The Way"), + description = S("Place 100 rails."), + icon = "awards_on_the_way.png", + difficulty = 0.1, + trigger = { + type = "place", + node = "group:rail", + target = 100 + } + }) +end + +if minetest.get_modpath("bones") then + -- Die near bones + awards.register_award("award_the_stack", { + title = S("Graveyard"), + description = S("Die near bones."), + secret = true, + }) + awards.register_on_death(function(player,data) + local pos = player:get_pos() + if pos and minetest.find_node_near(pos, 5, "bones:bones") ~= nil then + return "award_the_stack" + end + return nil + end) +end + +if minetest.get_modpath("vessels") then + awards.register_award("award_vessels_shelf", { + title = S("Glasser"), + icon = "awards_glasser.png", + description = S("Craft 14 vessels shelves."), + trigger = { + type = "craft", + item= "vessels:shelf", + target = 14 + } + }) +end + +if minetest.get_modpath("farming") then + awards.register_award("awards_farmer", { + title = S("Farming Skills Acquired"), + description = S("Harvest a fully grown wheat plant."), + icon = "awards_farming_skills_acquired.png^awards_level1.png", + trigger = { + type = "dig", + node = "farming:wheat_8", + target = 1 + } + }) + awards.register_award("awards_farmer2", { + title = S("Field Worker"), + description = S("Harvest 25 fully grown wheat plants."), + icon = "awards_field_worker.png^awards_level2.png", + trigger = { + type = "dig", + node = "farming:wheat_8", + target = 25 + } + }) + + awards.register_award("awards_farmer3", { + title = S("Aspiring Farmer"), + description = S("Harvest 125 fully grown wheat plants."), + icon = "awards_aspiring_farmer.png^awards_level3.png", + trigger = { + type = "dig", + node = "farming:wheat_8", + target = 125 + } + }) + + awards.register_award("awards_farmer4", { + title = S("Wheat Magnate"), + description = S("Harvest 625 fully grown wheat plants."), + icon = "awards_wheat_magnate.png^awards_level4.png", + trigger = { + type = "dig", + node = "farming:wheat_8", + target = 625 + } + }) + + awards.register_award("award_bread", { + title = S("Baker"), + description = S("Eat 10 loaves of bread."), + icon = "awards_baker.png", + trigger = { + type = "eat", + item = "farming:bread", + target = 10 + } + }) + +end + +if minetest.get_modpath("wool") and minetest.get_modpath("farming") then + awards.register_award("awards_wool", { + title = S("Wool Over Your Eyes"), + description = S("Craft 250 white wool."), + icon = "awards_wool_over_your_eyes.png", + trigger = { + type = "craft", + item = "wool:white", + target = 250 + } + }) +end + +if minetest.get_modpath("beds") then + awards.register_award("award_bed", { + title = S("Hotelier"), + description = S("Craft 15 fancy beds."), + icon = "awards_hotelier.png", + trigger = { + type = "craft", + item= "beds:fancy_bed_bottom", + target = 15 + } + }) +end + +if minetest.get_modpath("stairs") then + awards.register_award("award_stairs_goldblock", { + title = S("Filthy Rich"), + description = S("Craft 24 gold block stairs."), + icon = "awards_filthy_rich.png", + trigger = { + type = "craft", + item= "stairs:stair_goldblock", + target = 24 + } + }) +end + +if minetest.get_modpath("dye") then + awards.register_award("awards_dye_red", { + title = S("Roses Are Red"), + description = S("Craft 400 red dyes."), + icon = "awards_roses_are_red.png", + trigger = { + type = "craft", + item = "dye:red", + target = 400 + } + }) + + awards.register_award("awards_dye_yellow", { + title = S("Dandelions are Yellow"), + description = S("Craft 400 yellow dyes."), + icon = "awards_dandelions_are_yellow.png", + trigger = { + type = "craft", + item = "dye:yellow", + target = 400 + } + }) + + awards.register_award("awards_dye_blue", { + title = S("Geraniums are Blue"), + description = S("Craft 400 blue dyes."), + icon = "awards_geraniums_are_blue.png", + trigger = { + type = "craft", + item= "dye:blue", + target = 400 + } + }) + + awards.register_award("awards_dye_white", { + title = S("White Color Stock"), + description = S("Craft 100 white dyes."), + icon = "awards_white_color_stock.png", + trigger = { + type = "craft", + item= "dye:white", + target = 100 + } + }) +end + +if minetest.get_modpath("flowers") then + awards.register_award("awards_brown_mushroom1", { + title = S("Tasty Mushrooms"), + description = S("Eat 3 brown mushrooms."), + icon = "awards_tasty_mushrooms.png^awards_level1.png", + trigger = { + type = "eat", + item= "flowers:mushroom_brown", + target = 3, + } + }) + awards.register_award("awards_brown_mushroom2", { + title = S("Mushroom Lover"), + description = S("Eat 33 brown mushrooms."), + icon = "awards_mushroom_lover.png^awards_level2.png", + trigger = { + type = "eat", + item= "flowers:mushroom_brown", + target = 33, + } + }) + awards.register_award("awards_brown_mushroom3", { + title = S("Underground Mushroom Farmer"), + description = S("Eat 333 brown mushrooms."), + icon = "awards_underground_mushroom_farmer.png^awards_level3.png", + trigger = { + type = "eat", + item= "flowers:mushroom_brown", + target = 333, + } + }) +end + +-- This ensures the following code is executed after all items have been registered +minetest.after(0, function() + -- Check whether there is at least one node which can be built by the player + local building_is_possible = false + for _, def in pairs(minetest.registered_nodes) do + if (def.description and def.pointable ~= false and not def.groups.not_in_creative_inventory) then + building_is_possible = true + break + end + end + + -- The following awards require at least one node which can be built + if not building_is_possible then + return + end + + awards.register_award("awards_builder1", { + title = S("Builder"), + icon = "awards_builder.png^awards_level1.png", + trigger = { + type = "place", + target = 1000, + }, + }) + awards.register_award("awards_builder2", { + title = S("Engineer"), + icon = "awards_engineer.png^awards_level2.png", + trigger = { + type = "place", + target = 5000, + }, + }) + awards.register_award("awards_builder3", { + title = S("Architect"), + icon = "awards_architect.png^awards_level3.png", + trigger = { + type = "place", + target = 10000, + }, + }) + awards.register_award("awards_builder4", { + title = S("Master Architect"), + icon = "awards_master_architect.png^awards_level4.png", + trigger = { + type = "place", + target = 25000, + }, + }) +end) + +if minetest.get_modpath("nyancat") then + -- Found a Nyan cat! + awards.register_award("award_nyanfind", { + secret = true, + title = S("A Cat in a Pop-Tart?!"), + description = S("Mine a nyan cat."), + icon = "awards_a_cat_in_a_pop_tart.png", + trigger = { + type = "dig", + node = "nyancat:nyancat", + target = 1 + } + }) +end + +if minetest.get_modpath("pipeworks") then + awards.register_award("award_pipeworks_transporter", { + title = S("Item transporter"), + description = S("Place 10000 tubes."), + difficulty = 0.05, + trigger = { + type = "place", + node = "pipeworks:tube_1", + target = 2000, + } + }) + + awards.register_award("award_pipeworks_automator", { + title = S("Factory"), + description = S("Place 5 autocrafters."), + difficulty = 3, + trigger = { + type = "place", + node = "pipeworks:autocrafter", + target = 5, + } + }) +end + +if minetest.get_modpath("mesecons") then + awards.register_award("awards_mesecons", { + title = S("Electical Engineer"), + description = S("Place 500 mesecon wires."), + difficulty = 0.2, + trigger = { + type = "place", + node = "mesecons:wire_00000000_off", + target = 500, + } + }) +end + +if minetest.get_modpath("basic_materials") then + awards.register_award("awards_oil", { + title = S("Oil Tycoon"), + description = S("Craft 500 times oil extract."), + + trigger = { + type = "craft", + item = "basic_materials:oil_extract", + target = 500, + } + }) +end diff --git a/mods/awards/src/chat_commands.lua b/mods/awards/src/chat_commands.lua new file mode 100644 index 00000000..86b2a393 --- /dev/null +++ b/mods/awards/src/chat_commands.lua @@ -0,0 +1,61 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.translator + +minetest.register_chatcommand("awards", { + params = S("[c|clear|disable|enable]"), + description = S("Show, clear, disable or enable your awards"), + func = function(name, param) + if param == "clear" then + awards.clear_player(name) + minetest.chat_send_player(name, + S("All your awards and statistics have been cleared. You can now start again.")) + elseif param == "disable" then + awards.disable(name) + minetest.chat_send_player(name, S("You have disabled awards.")) + elseif param == "enable" then + awards.enable(name) + minetest.chat_send_player(name, S("You have enabled awards.")) + elseif param == "c" then + awards.show_to(name, name, nil, true) + else + awards.show_to(name, name, nil, false) + end + + if (param == "disable" or param == "enable") and minetest.global_exists("sfinv") then + local player = minetest.get_player_by_name(name) + if player then + sfinv.set_player_inventory_formspec(player) + end + end + end +}) + +minetest.register_chatcommand("awd", { + params = S(""), + description = S("Show details of an award"), + func = function(name, param) + local def = awards.registered_awards[param] + if def then + minetest.chat_send_player(name, string.format("%s: %s", def.title, def.description)) + else + minetest.chat_send_player(name, S("Award not found.")) + end + end +}) + +minetest.register_chatcommand("awpl", { + privs = { + server = true + }, + params = S(""), + description = S("Get the awards statistics for the given player or yourself"), + func = function(name, param) + if not param or param == "" then + param = name + end + minetest.chat_send_player(name, param) + local player = awards.player(param) + minetest.chat_send_player(name, dump(player)) + end +}) diff --git a/mods/awards/src/data.lua b/mods/awards/src/data.lua new file mode 100644 index 00000000..27359a11 --- /dev/null +++ b/mods/awards/src/data.lua @@ -0,0 +1,113 @@ + +local storage = minetest.get_mod_storage() +local __player_data + +-- Table Save Load Functions +function awards.save() + storage:set_string("player_data", minetest.write_json(__player_data)) +end + +local function convert_data() + minetest.log("warning", "Importing awards data from previous version") + + local old_players = __player_data + __player_data = {} + for name, data in pairs(old_players) do + while name.name do + name = name.name + end + data.name = name + print("Converting data for " .. name) + + -- Just rename counted + local counted = { + chats = "chat", + deaths = "death", + joins = "join", + } + for from, to in pairs(counted) do + data[to] = data[from] + data[from] = nil + end + + data.death = { + unknown = data.death, + __total = data.death, + } + + -- Convert item db to new format + local counted_items = { + count = "dig", + place = "place", + craft = "craft", + } + for from, to in pairs(counted_items) do + local ret = {} + + local count = 0 + if data[from] then + for modname, items in pairs(data[from]) do + for itemname, value in pairs(items) do + itemname = modname .. ":" .. itemname + local key = minetest.registered_aliases[itemname] or itemname + ret[key] = value + count = count + value + end + end + end + + ret.__total = count + data[from] = nil + data[to] = ret + end + + __player_data[name] = data + end +end + +function awards.load() + local old_save_path = minetest.get_worldpath().."/awards.txt" + local file = io.open(old_save_path, "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + __player_data = table + convert_data() + else + __player_data = {} + end + file:close() + os.rename(old_save_path, minetest.get_worldpath().."/awards.bk.txt") + awards.save() + else + local json = storage:get("player_data") + __player_data = json and minetest.parse_json(json) or {} + end +end + +function awards.player(name) + assert(type(name) == "string") + local data = __player_data[name] or {} + __player_data[name] = data + + data.name = data.name or name + data.unlocked = data.unlocked or {} + return data +end + +function awards.player_or_nil(name) + return __player_data[name] +end + +function awards.enable(name) + awards.player(name).disabled = nil +end + +function awards.disable(name) + awards.player(name).disabled = true +end + +function awards.clear_player(name) + __player_data[name] = {} + awards.save() +end diff --git a/mods/awards/src/gui.lua b/mods/awards/src/gui.lua new file mode 100644 index 00000000..ef6350bb --- /dev/null +++ b/mods/awards/src/gui.lua @@ -0,0 +1,251 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.translator + +function awards.get_formspec(name, to, sid) + local formspec = "" + local awards_list = awards.get_award_states(name) + + if #awards_list == 0 then + formspec = formspec .. "label[3.9,1.5;"..minetest.formspec_escape(S("Error: No achivements available.")).."]" + formspec = formspec .. "button_exit[4.2,2.3;3,1;close;"..minetest.formspec_escape(S("OK")).."]" + return formspec + end + sid = awards_list[sid] and sid or 1 + + -- Sidebar + local sitem = awards_list[sid] + local sdef = sitem.def + if sdef and sdef.secret and not sitem.unlocked then + formspec = formspec .. "label[1,2.75;".. + minetest.formspec_escape(S("(Secret Award)")).."]".. + "image[1,0;3,3;awards_unknown.png]" + if sdef and sdef.description then + formspec = formspec .. "textarea[0.25,3.25;4.8,1.7;;".. + minetest.formspec_escape( + S("Unlock this award to find out what it is."))..";]" + end + else + local title = sitem.name + if sdef and sdef.title then + title = sdef.title + end + local status = "@1" + if sitem.unlocked then + -- Don't actually use translator here. We define empty S() to fool the update_translations script + -- into extracting that string for the templates. + local function S(str) + return str + end + status = S("@1 (unlocked)") + end + + formspec = formspec .. "textarea[0.5,3.1;4.8,1.45;;" .. + S(status, minetest.formspec_escape(title)) .. + ";]" + + if sdef and sdef.icon then + formspec = formspec .. "image[0.45,0;3.5,3.5;" .. minetest.formspec_escape(sdef.icon) .. "]" -- adjusted values from 0.6,0;3,3 + end + + -- List out goal progress + if sitem.goals then + local goal_list = "textlist[-0.05,5;3.9,3.7;goals;" + local has_visible_goals = false + local goals_target = sdef.goals.target + local goals_unlocked = 0 + for i = 1, #sitem.goals do + local goal = sitem.goals[i] + local goal_status + local goal_progress = goal.progress and (" (" .. goal.progress.current .. "/" .. goal.progress.target .. ")") or "" + if goal.unlocked then + goals_unlocked = goals_unlocked + 1 + if not sitem.goals.show_unlocked then + goto continue + else + goal_status = "#25fc34✓ " + end + else + if not sitem.goals.show_locked then + goto continue + else + goal_status = goal.progress and (goal.progress.current == 0 and "#aaaaaa☠" or "#ffffff☠") or "#aaaaaa☠" + end + end + goal_list = goal_list .. goal_status .. minetest.formspec_escape(goal.def.description:split("\n")[1]) .. goal_progress .. "," + has_visible_goals = true + ::continue:: + end + + -- Goal progress bar + local goal_progress_bar = "box[-0.05,4.65;3.9,0.3;#191919]" + local gpb_width = 3.9 * math.min(goals_unlocked / goals_target,1.0) + if gpb_width > 0 then + goal_progress_bar = goal_progress_bar .. "box[-0.05,4.65;" .. gpb_width .. ",0.3;#25fc34]" + end + --goal_progress_bar = goal_progress_bar .. "box[-0.05,5.05;3.9,0.05;#000000]" + goal_progress_bar = goal_progress_bar .. "hypertext[0.295,4.7;3.9,0.4;;" .. goals_unlocked .. " / " .. goals_target .. "]" + + -- Append formspec + formspec = formspec .. goal_progress_bar .. (has_visible_goals and goal_list:sub(1,-2) or "") .. "]" + end + + if sdef and sdef.description then + formspec = formspec .. "box[-0.05,3.75;3.9,0.85;#000]" + formspec = formspec .. "textarea[0.25,3.75;3.9,0.85;;" .. + minetest.formspec_escape(sdef.description) .. ";]" + end + end + + -- Create list box + formspec = formspec .. "textlist[4,0;3.8,8.7;awards;" + local first = true + for _, award in pairs(awards_list) do + local def = award.def + if def then + if not first then + formspec = formspec .. "," + end + first = false + + if def.secret and not award.unlocked then + formspec = formspec .. "#707070"..minetest.formspec_escape(S("(Secret Award)")) + else + local title = award.name + if def and def.title then + title = def.title + end + -- title = title .. " [" .. award.score .. "]" + if award.unlocked then + formspec = formspec .. "#25fc34" .. minetest.formspec_escape(title) + elseif award.started then + formspec = formspec .. "#ffffff".. minetest.formspec_escape(title) + else + formspec = formspec .. "#aaaaaa".. minetest.formspec_escape(title) + end + end + end + end + return formspec .. ";"..sid.."]" +end + + +function awards.show_to(name, to, sid, text) + if name == "" or name == nil then + name = to + end + local data = awards.player(to) + if name == to and data.disabled then + minetest.chat_send_player(name, S("You've disabled awards. Type /awards enable to reenable.")) + return + end + if text then + local awards_list = awards.get_award_states(name) + if #awards_list == 0 then + minetest.chat_send_player(to, S("Error: No award available.")) + return + elseif not data or not data.unlocked then + minetest.chat_send_player(to, S("You have not unlocked any awards.")) + return + end + minetest.chat_send_player(to, string.format(S("%s’s awards:"), name)) + + for str, _ in pairs(data.unlocked) do + local def = awards.registered_awards[str] + if def then + if def.title then + if def.description then + minetest.chat_send_player(to, string.format("%s: %s", def.title, def.description)) + else + minetest.chat_send_player(to, def.title) + end + else + minetest.chat_send_player(to, str) + end + end + end + else + local deco = "" + if minetest.global_exists("default") then + deco = default.gui_bg .. default.gui_bg_img + end + -- Show formspec to user + minetest.show_formspec(to,"awards:awards", + "size[8,8.6]" .. deco .. + awards.get_formspec(name, to, sid)) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "awards:awards" then + return false + end + if fields.quit then + return true + end + local name = player:get_player_name() + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + awards.show_to(name, name, event.index, false) + end + end + + return true +end) + +if minetest.get_modpath("sfinv") then + sfinv.register_page("awards:awards", { + title = S("Awards"), + on_enter = function(self, player, context) + context.awards_idx = 1 + end, + is_in_nav = function(self, player, context) + local data = awards.player(player:get_player_name()) + return not data.disabled + end, + get = function(self, player, context) + local name = player:get_player_name() + return sfinv.make_formspec(player, context, + awards.get_formspec(name, name, context.awards_idx), + false) + end, + on_player_receive_fields = function(self, player, context, fields) + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + context.awards_idx = event.index + sfinv.set_player_inventory_formspec(player, context) + end + end + end + }) + + local function check_and_reshow(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + + local context = sfinv.get_or_create_context(player) + if context.page ~= "awards:awards" then + return + end + + sfinv.set_player_inventory_formspec(player, context) + end + + awards.register_on_unlock(check_and_reshow) +end + +if minetest.get_modpath("unified_inventory") ~= nil then + unified_inventory.register_button("awards", { + type = "image", + image = "awards_ui_icon.png", + tooltip = S("Awards"), + action = function(player) + local name = player:get_player_name() + awards.show_to(name, name, nil, false) + end, + }) +end diff --git a/mods/awards/src/triggers.lua b/mods/awards/src/triggers.lua new file mode 100644 index 00000000..5ebb0c9d --- /dev/null +++ b/mods/awards/src/triggers.lua @@ -0,0 +1,151 @@ +-- AWARDS +-- +-- Copyright (C) 2013-2015 rubenwardy +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- This program 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 Lesser General Public License for more details. +-- You should have received a copy of the GNU Lesser General Public License along +-- with this program; if not, write to the Free Software Foundation, Inc., +-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +-- + +-- Don't actually use translator here. We define empty S() to fool the update_translations script +-- into extracting those strings for the templates. Actual translation is done in api_triggers.lua. +local S = function (str) + return str +end + +-- Check if a player object is valid for awards. +local function player_ok(player) + return player and player.is_player and player:is_player() and not player.is_fake_player +end + +awards.register_trigger("chat", { + type = "counted", + progress = S("@1/@2 chat messages"), + auto_description = { S("Send a chat message"), S("Chat @1 times") }, +}) +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player_ok(player) or string.find(message, "/") then + return + end + + awards.notify_chat(player) +end) + + +awards.register_trigger("join", { + type = "counted", + progress = S("@1/@2 joins"), + auto_description = { S("Join once"), S("Join @1 times") }, +}) +minetest.register_on_joinplayer(awards.notify_join) + + +awards.register_trigger("death", { + type = "counted_key", + progress = S("@1/@2 deaths"), + auto_description = { S("Die once of @2"), S("Die @1 times of @2") }, + auto_description_total = { S("Die @1 times."), S("Mine @1 times") }, + get_key = function(self, def) + return def.trigger.reason + end, +}) +minetest.register_on_dieplayer(function(player, reason) + if reason then + reason = reason.type + else + reason = "unknown" + end + awards.notify_death(player, reason) +end) + + +awards.register_trigger("dig", { + type = "counted_key", + progress = S("@1/@2 dug"), + auto_description = { S("Mine: @2"), S("Mine: @1×@2") }, + auto_description_total = { S("Mine @1 block."), S("Mine @1 blocks.") }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node + end, + key_is_item = true, +}) +minetest.register_on_dignode(function(pos, node, player) + if not player_ok(player) or not pos or not node then + return + end + + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_dig(player, node_name) +end) + + +awards.register_trigger("place", { + type = "counted_key", + progress = S("@1/@2 placed"), + auto_description = { S("Place: @2"), S("Place: @1×@2") }, + auto_description_total = { S("Place @1 block."), S("Place @1 blocks.") }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node + end, + key_is_item = true, +}) +minetest.register_on_placenode(function(pos, node, player) + if not player_ok(player) or not pos or not node then + return + end + + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_place(player, node_name) +end) + + +awards.register_trigger("craft", { + type = "counted_key", + progress = S("@1/@2 crafted"), + auto_description = { S("Craft: @2"), S("Craft: @1×@2") }, + auto_description_total = { S("Craft @1 item"), S("Craft @1 items.") }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if not player_ok(player) or itemstack:is_empty() then + return + end + + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_craft(player, itemname, itemstack:get_count()) +end) + + +awards.register_trigger("eat", { + type = "counted_key", + progress = S("@1/@2 eaten"), + auto_description = { S("Eat @2"), S("Eat @1×@2") }, + auto_description_total = { S("Eat @1 item"), S("Eat @1 items.") }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) +minetest.register_on_item_eat(function(_, _, itemstack, player, _) + if not player_ok(player) or itemstack:is_empty() then + return + end + + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_eat(player, itemname) +end) diff --git a/mods/awards/textures/_Read Me.txt b/mods/awards/textures/_Read Me.txt new file mode 100644 index 00000000..c7f5dcfd --- /dev/null +++ b/mods/awards/textures/_Read Me.txt @@ -0,0 +1,428 @@ + __________ .___ _____ + \______ \ ____ _____ __| _/ / \ ____ + | _// __ \\__ \ / __ | / \ / \_/ __ \ + | | \ ___/ / __ \_/ /_/ | / Y \ ___/ + |____|_ /\___ >____ /\____ | \____|__ /\___ > + \/ \/ \/ \/ \/ \/ + + and license info + + Below is a listing of the Award icon source and attribution/licence info. + CC BY-SA 3.0 - https://creativecommons.org/licenses/by-sa/3.0/ + CC0 - https://creativecommons.org/share-your-work/public-domain/cc0/ + +A Cat in a Pop Tart?! -- CC0 + Inspiration art RinRinDaishi on Deviant art + https://www.deviantart.com/rinrindaishi/art/Nyancat-Bed-335515771 + see _RinrinDaishi_message.png + Icon drawn by Sirrobzeroone from scratch + +Architect -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Stone Wall (cobble) texture - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Aspiring Farmer -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Fence texture - Paramat/Blockmen + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Rest - Sirrobzeroone + +Backpacker -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Binoculars - Paramat + Wool Texture - Cisoun + Rest - Sirrobzeroone + +Baker -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Stone Wall texture - Neuromancer/Brane Praefect + Furnace - Neuromancer + Rest - Sirrobzeroone + +Banker -- CC BY-SA 3.0 + Wood Pine Floor (default_pinewood.png) - Paramat + Chest - BlockMen + Rest - Sirrobzeroone + +Bricker -- CC BY-SA 3.0 + Brick Texture - Calinou + Rest - Sirrobzeroone + +Build a Cave -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Grass texture (default_grass.png) - Paramat + Rest - Sirrobzeroone + +Builder -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Wool Texture - Cisoun + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Castorama -- CC0 (Public Domain) + All - Sirrobzeroone + +Crafter of Sticks -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Grass Tall (default_grass_*.png) - Gambit + Rest - Sirrobzeroone + +Dandelions are Yellow -- CC0 (Public Domain) + All - Openclipart Library/Sirrobzeroone + +Desert Discoverer -- CC BY-SA 3.0 + Sand (default_desert_sand.png) - VanessaE + Dry Shrub (default_dry_shrub.png) - celeron55 + Sun () - Celeron55 + Rest - Sirrobzeroone + +Desert Dweller -- CC BY-SA 3.0 + Sand (default_desert_sand.png) - VanessaE + Rest - Sirrobzeroone + +Engineer -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Far Lands -- CC BY-SA 3.0 + Water (default_water.png) - Cisoun + Tree Bark (default_tree.png) - Cisoun + Tree Wood (default_wood.png) - BlockMen + Tree Leaves (default_leaves.png) - Cisoun + Sun () - Celeron55 + Rest - Sirrobzeroone + +Farming Skills Acquired -- CC BY-SA 3.0 + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Grass texture (default_grass.png) - Paramat + Sun () - Celeron55 + Rest - Sirrobzeroone + +Field Worker -- CC BY-SA 3.0 + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Rest - Sirrobzeroone + +Filthy Rich -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Firefighter -- CC0 (Public Domain) + All - Sirrobzeroone + +First Day in the Woods -- CC BY-SA 3.0 + Tree Bark (default_tree.png) - Cisoun + Grass texture (default_grass.png) - Paramat + Grass Tall (default_grass_*.png) - Gambit + Axe (default_tool_*.png) - BlockMen + Rest - Sirrobzeroone + +First Gold Find -- CC BY-SA 3.0 + Gold Nugget (default_gold_lump.png) - Gambit + Stone (default_stone.png) - Cisoun + Rest - Sirrobzeroone + +First Mese Find -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Mese Crystal (default_mese_crystal.png) - VanessaE + Rest - Sirrobzeroone + +Fortress -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rest - Sirrobzeroone + +Geraniums are Blue -- CC BY-SA 3.0 + Geranium (flowers_geranium.png) + Wool Texture - Cisoun + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Girl's Best Friend -- CC BY-SA 3.0 + Diamond (default_diamond.png) - BlockMen + Rest - Sirrobzeroone + +Glacier Discoverer -- CC BY-SA 3.0 + Ice (default_ice.png) - as197 + Snow (default_snow.png) - Gambit + Rest - Sirrobzeroone + +Glasser -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Gold Rush -- CC BY-SA 3.0 + Stone Blocks (default_stone_block.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Stone (default_stone.png) - Cisoun + Gold Nugget (default_gold_lump.png) - Gambit + Torch (default_torch_on_floor.png) - VanessaE + Rail (carts_rail_*) - Hexafraction/Sofar + Cart (carts_cart_side.png) - Gambit + Rest - Sirrobzeroone + +Grasslands Discoverer -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Sun () - Celeron55 + Bluberry (default_blueberries.png) - Random-Geek + Viola (flowers_viola.png) - RHRhino/Gambit/yyt16384/Paramat + Rest - Sirrobzeroone + +Hardened Miner -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Hardest Block on Earth -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Diamond Block (default_diamond_block.png) - Gambit + Rest - Sirrobzeroone + +Hotelier -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Tree Bark (default_tree.png) - Cisoun + Wood Pine Floor (default_pinewood.png) - Paramat + Wood Acacia Floor (default_acacia_wood.png) - Paramat + Rest - Sirrobzeroone + +House of Obsidian -- CC BY-SA 3.0 + Wood Acacia Floor (default_acacia_wood.png) - Paramat + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Obsidian (default_obsidian.png) - Jojoa1997 + Rest - Sirrobzeroone + +In the Dungeon -- CC BY-SA 3.0 + Wood Pine Floor (default_pinewood.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Industrial Age -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Wood Pine Floor (default_pinewood.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Sun () - Celeron55 + Rest - Sirrobzeroone + +Jungle Discoverer -- CC BY-SA 3.0 + Jungle Bark (default_jungletree.png) - Cisoun + Jungle Leaves (default_jungleleaves.png) - PilzAdam + Jungle Litter (default_rainforest_litter.png) - npx + Grass texture (default_grass.png) - Paramat + Rest - Sirrobzeroone + +Junglebaby -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Jungle Bark (default_jungletree.png) - Cisoun + Rest - Sirrobzeroone + +Jungleman -- CC BY-SA 3.0 + Jungle Bark (default_jungletree.png) - Cisoun + Jungle Leaves (default_jungleleaves.png) - PilzAdam + Rest - Sirrobzeroone + +Lava and Water -- CC BY-SA 3.0 + Water (default_water.png) - Cisoun + Lava (default_lava.png) - Cisoun + Obsidian (default_obsidian.png) - Jojoa1997 + Rest - Sirrobzeroone + +Lava Miner -- CC BY-SA 3.0 + Lava (default_lava.png) - Cisoun + Stone (default_stone.png) - Cisoun + Rest - Sirrobzeroone + +Light It Up -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Torch (default_torch_on_floor.png) - VanessaE + Rest - Sirrobzeroone + +Little Library -- CC BY-SA 3.0 + BookShelf (default_bookshelf.png) - Celeron55 + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Long Ladder -- CC BY-SA 3.0 + Ladder (default_ladder_wood.png) - Celeron55 + Rest - Sirrobzeroone + +Lumberjack -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Rest - Sirrobzeroone + +Marchand De Sable -- CC BY-SA 3.0 + Sand ( default_desert_sand.png) - VanessaE + Sand Block (default_desert_stone.png) - VanessaE + Rest - Sirrobzeroone + +Master Miner -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Mese Mastery -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Mese block (default_mese_block.png) - Paramat + Rest - Sirrobzeroone + +Mini Miner -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Iron Ore (default_mineral_iron.png) - Celeron55 + Rest - Sirrobzeroone + +Mushroom Lover -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Obsessed with Obsidian -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Obsidian (default_obsidian.png) - Jojoa1997 + Rest - Sirrobzeroone + +On The Way -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rail (carts_rail_*) - Hexafraction/Sofar + Rest - Sirrobzeroone + +Outpost -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rest - Sirrobzeroone + +Pharaoh -- CC BY-SA 3.0 + Sand (default_desert_sand.png) - VanessaE + Rest - Sirrobzeroone + +Professional Lumberjack -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Axe (default_tool_*.png) - BlockMen + Rest - Sirrobzeroone + +Pyromaniac -- CC0 (Public Domain) + All - Sirrobzeroone + +Really Well Lit -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Roses Are Red -- CC0 (Public Domain) + All - Sirrobzeroone + +Saint-Maclou -- CC0 (Public Domain) + All - Sirrobzeroone + +Sam the Trapper -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Grass texture (default_grass.png) - Paramat + Rest - Sirrobzeroone + +Savannah Discoverer -- CC BY-SA 3.0 + Dry grass (default_dry_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Sun () - Celeron55 + Acacia Leaves (default_acacia_leaves.png) - Paramat + Acacia Bark (default_acacia_tree.png) - Paramat + Rest - Sirrobzeroone + +Semi-pro Lumberjack -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Tree Bark (default_tree.png) - Cisoun + Axe (default_tool_*.png) - BlockMen + Rest - Sirrobzeroone + +Smelter -- CC0 (Public Domain) + All - Openclipart library/Sirrobzeroone + +Tasty Mushrooms -- CC0 (Public Domain) + All - Openclipart library/Sirrobzeroone + +Treasurer -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Wood Pine Floor (default_pinewood.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Underground Mushroom Farmer -- CC BY-SA 3.0 + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Stone (default_stone.png) - Cisoun + Mushroom (flowers_mushroom_brown.png) - RHRhino/Gambit/yyt16384/Paramat + Torch (default_torch_on_floor.png) - VanessaE + Rest - Sirrobzeroone + +Very Simple Snow Man -- CC BY-SA 3.0 + Snow (default_snow.png) - Gambit + Stick (default_stick.png) - BlockMen + Rest - Sirrobzeroone + +Watchtower -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rest - Sirrobzeroone + +Well Lit -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Wood Pine Floor (default_pinewood.png) - Paramat + Rest - Sirrobzeroone + +Wheat Magnate -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Sun () - Celeron55 + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Rest - Sirrobzeroone + +White Color Stock -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Wool Over Your Eyes -- CC BY-SA 3.0 + Sun () - Celeron55 + Grass texture (default_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Bluberry (default_blueberries.png) - Random-Geek + Viola (flowers_viola.png) - RHRhino/Gambit/yyt16384/Paramat + Grass Tall (default_grass_*.png) - Gambit + Rest - Sirrobzeroone + +Wow, I am Diamonds! -- CC BY-SA 3.0 + Diamond (default_diamond.png) - BlockMen + Stone (default_stone.png) - Cisoun + Rest - Sirrobzeroone + +You’re a copper -- CC0 (Public Domain) + All - Sirrobzeroone + +Yummy! -- CC0 (Public Domain) + All - Openclipart library/Sirrobzeroone + + + + + diff --git a/mods/awards/textures/_RinrinDaishi_message.png b/mods/awards/textures/_RinrinDaishi_message.png new file mode 100644 index 00000000..b22781ee Binary files /dev/null and b/mods/awards/textures/_RinrinDaishi_message.png differ diff --git a/mods/awards/textures/awards_a_cat_in_a_pop_tart.png b/mods/awards/textures/awards_a_cat_in_a_pop_tart.png new file mode 100644 index 00000000..79ec4c15 Binary files /dev/null and b/mods/awards/textures/awards_a_cat_in_a_pop_tart.png differ diff --git a/mods/awards/textures/awards_architect.png b/mods/awards/textures/awards_architect.png new file mode 100644 index 00000000..526a290c Binary files /dev/null and b/mods/awards/textures/awards_architect.png differ diff --git a/mods/awards/textures/awards_aspiring_farmer.png b/mods/awards/textures/awards_aspiring_farmer.png new file mode 100644 index 00000000..6fcce951 Binary files /dev/null and b/mods/awards/textures/awards_aspiring_farmer.png differ diff --git a/mods/awards/textures/awards_backpacker.png b/mods/awards/textures/awards_backpacker.png new file mode 100644 index 00000000..d87ffa70 Binary files /dev/null and b/mods/awards/textures/awards_backpacker.png differ diff --git a/mods/awards/textures/awards_baker.png b/mods/awards/textures/awards_baker.png new file mode 100644 index 00000000..445da142 Binary files /dev/null and b/mods/awards/textures/awards_baker.png differ diff --git a/mods/awards/textures/awards_banker.png b/mods/awards/textures/awards_banker.png new file mode 100644 index 00000000..f0899c0f Binary files /dev/null and b/mods/awards/textures/awards_banker.png differ diff --git a/mods/awards/textures/awards_bg_default.png b/mods/awards/textures/awards_bg_default.png new file mode 100644 index 00000000..a6f57d32 Binary files /dev/null and b/mods/awards/textures/awards_bg_default.png differ diff --git a/mods/awards/textures/awards_bg_mining.png b/mods/awards/textures/awards_bg_mining.png new file mode 100644 index 00000000..a6987794 Binary files /dev/null and b/mods/awards/textures/awards_bg_mining.png differ diff --git a/mods/awards/textures/awards_bricker.png b/mods/awards/textures/awards_bricker.png new file mode 100644 index 00000000..eb5e814a Binary files /dev/null and b/mods/awards/textures/awards_bricker.png differ diff --git a/mods/awards/textures/awards_build_a_cave.png b/mods/awards/textures/awards_build_a_cave.png new file mode 100644 index 00000000..de2e75b9 Binary files /dev/null and b/mods/awards/textures/awards_build_a_cave.png differ diff --git a/mods/awards/textures/awards_builder.png b/mods/awards/textures/awards_builder.png new file mode 100644 index 00000000..6c04003f Binary files /dev/null and b/mods/awards/textures/awards_builder.png differ diff --git a/mods/awards/textures/awards_castorama.png b/mods/awards/textures/awards_castorama.png new file mode 100644 index 00000000..b5dce24d Binary files /dev/null and b/mods/awards/textures/awards_castorama.png differ diff --git a/mods/awards/textures/awards_crafter_of_sticks.png b/mods/awards/textures/awards_crafter_of_sticks.png new file mode 100644 index 00000000..a2137bd8 Binary files /dev/null and b/mods/awards/textures/awards_crafter_of_sticks.png differ diff --git a/mods/awards/textures/awards_dandelions_are_yellow.png b/mods/awards/textures/awards_dandelions_are_yellow.png new file mode 100644 index 00000000..c875de10 Binary files /dev/null and b/mods/awards/textures/awards_dandelions_are_yellow.png differ diff --git a/mods/awards/textures/awards_desert_discoverer.png b/mods/awards/textures/awards_desert_discoverer.png new file mode 100644 index 00000000..6d4a2e51 Binary files /dev/null and b/mods/awards/textures/awards_desert_discoverer.png differ diff --git a/mods/awards/textures/awards_desert_dweller.png b/mods/awards/textures/awards_desert_dweller.png new file mode 100644 index 00000000..e03a2d1c Binary files /dev/null and b/mods/awards/textures/awards_desert_dweller.png differ diff --git a/mods/awards/textures/awards_engineer.png b/mods/awards/textures/awards_engineer.png new file mode 100644 index 00000000..bd6bd4f7 Binary files /dev/null and b/mods/awards/textures/awards_engineer.png differ diff --git a/mods/awards/textures/awards_far_lands.png b/mods/awards/textures/awards_far_lands.png new file mode 100644 index 00000000..2072bf60 Binary files /dev/null and b/mods/awards/textures/awards_far_lands.png differ diff --git a/mods/awards/textures/awards_farming_skills_acquired.png b/mods/awards/textures/awards_farming_skills_acquired.png new file mode 100644 index 00000000..28803dcd Binary files /dev/null and b/mods/awards/textures/awards_farming_skills_acquired.png differ diff --git a/mods/awards/textures/awards_field_worker.png b/mods/awards/textures/awards_field_worker.png new file mode 100644 index 00000000..e898ee99 Binary files /dev/null and b/mods/awards/textures/awards_field_worker.png differ diff --git a/mods/awards/textures/awards_filthy_rich.png b/mods/awards/textures/awards_filthy_rich.png new file mode 100644 index 00000000..6578c385 Binary files /dev/null and b/mods/awards/textures/awards_filthy_rich.png differ diff --git a/mods/awards/textures/awards_firefighter.png b/mods/awards/textures/awards_firefighter.png new file mode 100644 index 00000000..46076a7f Binary files /dev/null and b/mods/awards/textures/awards_firefighter.png differ diff --git a/mods/awards/textures/awards_first_day_in_the_woods.png b/mods/awards/textures/awards_first_day_in_the_woods.png new file mode 100644 index 00000000..e677d883 Binary files /dev/null and b/mods/awards/textures/awards_first_day_in_the_woods.png differ diff --git a/mods/awards/textures/awards_first_gold_find.png b/mods/awards/textures/awards_first_gold_find.png new file mode 100644 index 00000000..edd6c14a Binary files /dev/null and b/mods/awards/textures/awards_first_gold_find.png differ diff --git a/mods/awards/textures/awards_first_mese_find.png b/mods/awards/textures/awards_first_mese_find.png new file mode 100644 index 00000000..43d848ed Binary files /dev/null and b/mods/awards/textures/awards_first_mese_find.png differ diff --git a/mods/awards/textures/awards_fortress.png b/mods/awards/textures/awards_fortress.png new file mode 100644 index 00000000..d40ab744 Binary files /dev/null and b/mods/awards/textures/awards_fortress.png differ diff --git a/mods/awards/textures/awards_geraniums_are_blue.png b/mods/awards/textures/awards_geraniums_are_blue.png new file mode 100644 index 00000000..f4fed56d Binary files /dev/null and b/mods/awards/textures/awards_geraniums_are_blue.png differ diff --git a/mods/awards/textures/awards_girls_best_friend.png b/mods/awards/textures/awards_girls_best_friend.png new file mode 100644 index 00000000..6143ea4b Binary files /dev/null and b/mods/awards/textures/awards_girls_best_friend.png differ diff --git a/mods/awards/textures/awards_glacier_discoverer.png b/mods/awards/textures/awards_glacier_discoverer.png new file mode 100644 index 00000000..5d7b3ca1 Binary files /dev/null and b/mods/awards/textures/awards_glacier_discoverer.png differ diff --git a/mods/awards/textures/awards_glasser.png b/mods/awards/textures/awards_glasser.png new file mode 100644 index 00000000..a5dfb035 Binary files /dev/null and b/mods/awards/textures/awards_glasser.png differ diff --git a/mods/awards/textures/awards_gold_rush.png b/mods/awards/textures/awards_gold_rush.png new file mode 100644 index 00000000..dbd6ac36 Binary files /dev/null and b/mods/awards/textures/awards_gold_rush.png differ diff --git a/mods/awards/textures/awards_grasslands_discoverer.png b/mods/awards/textures/awards_grasslands_discoverer.png new file mode 100644 index 00000000..7de444cd Binary files /dev/null and b/mods/awards/textures/awards_grasslands_discoverer.png differ diff --git a/mods/awards/textures/awards_hardened_miner.png b/mods/awards/textures/awards_hardened_miner.png new file mode 100644 index 00000000..d4baf48c Binary files /dev/null and b/mods/awards/textures/awards_hardened_miner.png differ diff --git a/mods/awards/textures/awards_hardest_block_on_earth.png b/mods/awards/textures/awards_hardest_block_on_earth.png new file mode 100644 index 00000000..3ab903c3 Binary files /dev/null and b/mods/awards/textures/awards_hardest_block_on_earth.png differ diff --git a/mods/awards/textures/awards_hotelier.png b/mods/awards/textures/awards_hotelier.png new file mode 100644 index 00000000..5a0f6fdb Binary files /dev/null and b/mods/awards/textures/awards_hotelier.png differ diff --git a/mods/awards/textures/awards_house_of_obsidian.png b/mods/awards/textures/awards_house_of_obsidian.png new file mode 100644 index 00000000..15b3409d Binary files /dev/null and b/mods/awards/textures/awards_house_of_obsidian.png differ diff --git a/mods/awards/textures/awards_in_the_dungeon.png b/mods/awards/textures/awards_in_the_dungeon.png new file mode 100644 index 00000000..d419d647 Binary files /dev/null and b/mods/awards/textures/awards_in_the_dungeon.png differ diff --git a/mods/awards/textures/awards_industrial_age.png b/mods/awards/textures/awards_industrial_age.png new file mode 100644 index 00000000..d02c3c8e Binary files /dev/null and b/mods/awards/textures/awards_industrial_age.png differ diff --git a/mods/awards/textures/awards_jungle_discoverer.png b/mods/awards/textures/awards_jungle_discoverer.png new file mode 100644 index 00000000..f955e668 Binary files /dev/null and b/mods/awards/textures/awards_jungle_discoverer.png differ diff --git a/mods/awards/textures/awards_junglebaby.png b/mods/awards/textures/awards_junglebaby.png new file mode 100644 index 00000000..e8789778 Binary files /dev/null and b/mods/awards/textures/awards_junglebaby.png differ diff --git a/mods/awards/textures/awards_jungleman.png b/mods/awards/textures/awards_jungleman.png new file mode 100644 index 00000000..11ad3bd9 Binary files /dev/null and b/mods/awards/textures/awards_jungleman.png differ diff --git a/mods/awards/textures/awards_lava_and_water.png b/mods/awards/textures/awards_lava_and_water.png new file mode 100644 index 00000000..a61ec12e Binary files /dev/null and b/mods/awards/textures/awards_lava_and_water.png differ diff --git a/mods/awards/textures/awards_lava_miner.png b/mods/awards/textures/awards_lava_miner.png new file mode 100644 index 00000000..14c4ff8d Binary files /dev/null and b/mods/awards/textures/awards_lava_miner.png differ diff --git a/mods/awards/textures/awards_level1.png b/mods/awards/textures/awards_level1.png new file mode 100644 index 00000000..92051e61 Binary files /dev/null and b/mods/awards/textures/awards_level1.png differ diff --git a/mods/awards/textures/awards_level2.png b/mods/awards/textures/awards_level2.png new file mode 100644 index 00000000..7132dcc2 Binary files /dev/null and b/mods/awards/textures/awards_level2.png differ diff --git a/mods/awards/textures/awards_level3.png b/mods/awards/textures/awards_level3.png new file mode 100644 index 00000000..4a61d259 Binary files /dev/null and b/mods/awards/textures/awards_level3.png differ diff --git a/mods/awards/textures/awards_level4.png b/mods/awards/textures/awards_level4.png new file mode 100644 index 00000000..5909a329 Binary files /dev/null and b/mods/awards/textures/awards_level4.png differ diff --git a/mods/awards/textures/awards_level5.png b/mods/awards/textures/awards_level5.png new file mode 100644 index 00000000..26b94acd Binary files /dev/null and b/mods/awards/textures/awards_level5.png differ diff --git a/mods/awards/textures/awards_level6.png b/mods/awards/textures/awards_level6.png new file mode 100644 index 00000000..16851251 Binary files /dev/null and b/mods/awards/textures/awards_level6.png differ diff --git a/mods/awards/textures/awards_level7.png b/mods/awards/textures/awards_level7.png new file mode 100644 index 00000000..6b84557e Binary files /dev/null and b/mods/awards/textures/awards_level7.png differ diff --git a/mods/awards/textures/awards_light_it_up.png b/mods/awards/textures/awards_light_it_up.png new file mode 100644 index 00000000..e8725d16 Binary files /dev/null and b/mods/awards/textures/awards_light_it_up.png differ diff --git a/mods/awards/textures/awards_little_library.png b/mods/awards/textures/awards_little_library.png new file mode 100644 index 00000000..bf609f34 Binary files /dev/null and b/mods/awards/textures/awards_little_library.png differ diff --git a/mods/awards/textures/awards_long_ladder.png b/mods/awards/textures/awards_long_ladder.png new file mode 100644 index 00000000..a3c38d9d Binary files /dev/null and b/mods/awards/textures/awards_long_ladder.png differ diff --git a/mods/awards/textures/awards_lumberjack.png b/mods/awards/textures/awards_lumberjack.png new file mode 100644 index 00000000..4f89c471 Binary files /dev/null and b/mods/awards/textures/awards_lumberjack.png differ diff --git a/mods/awards/textures/awards_marchand_de_sable.png b/mods/awards/textures/awards_marchand_de_sable.png new file mode 100644 index 00000000..01e80d6d Binary files /dev/null and b/mods/awards/textures/awards_marchand_de_sable.png differ diff --git a/mods/awards/textures/awards_master_architect.png b/mods/awards/textures/awards_master_architect.png new file mode 100644 index 00000000..34b8bc2e Binary files /dev/null and b/mods/awards/textures/awards_master_architect.png differ diff --git a/mods/awards/textures/awards_master_miner.png b/mods/awards/textures/awards_master_miner.png new file mode 100644 index 00000000..8bf37c44 Binary files /dev/null and b/mods/awards/textures/awards_master_miner.png differ diff --git a/mods/awards/textures/awards_mese_mastery.png b/mods/awards/textures/awards_mese_mastery.png new file mode 100644 index 00000000..89714ae9 Binary files /dev/null and b/mods/awards/textures/awards_mese_mastery.png differ diff --git a/mods/awards/textures/awards_mini_miner.png b/mods/awards/textures/awards_mini_miner.png new file mode 100644 index 00000000..4ccb127e Binary files /dev/null and b/mods/awards/textures/awards_mini_miner.png differ diff --git a/mods/awards/textures/awards_mushroom_lover.png b/mods/awards/textures/awards_mushroom_lover.png new file mode 100644 index 00000000..52805bdf Binary files /dev/null and b/mods/awards/textures/awards_mushroom_lover.png differ diff --git a/mods/awards/textures/awards_obsessed_with_obsidian.png b/mods/awards/textures/awards_obsessed_with_obsidian.png new file mode 100644 index 00000000..4b179bd9 Binary files /dev/null and b/mods/awards/textures/awards_obsessed_with_obsidian.png differ diff --git a/mods/awards/textures/awards_on_the_way.png b/mods/awards/textures/awards_on_the_way.png new file mode 100644 index 00000000..c2fd224b Binary files /dev/null and b/mods/awards/textures/awards_on_the_way.png differ diff --git a/mods/awards/textures/awards_outpost.png b/mods/awards/textures/awards_outpost.png new file mode 100644 index 00000000..e2780520 Binary files /dev/null and b/mods/awards/textures/awards_outpost.png differ diff --git a/mods/awards/textures/awards_pharaoh.png b/mods/awards/textures/awards_pharaoh.png new file mode 100644 index 00000000..f2f4b9a0 Binary files /dev/null and b/mods/awards/textures/awards_pharaoh.png differ diff --git a/mods/awards/textures/awards_professional_lumberjack.png b/mods/awards/textures/awards_professional_lumberjack.png new file mode 100644 index 00000000..6d67fb75 Binary files /dev/null and b/mods/awards/textures/awards_professional_lumberjack.png differ diff --git a/mods/awards/textures/awards_progress_gray.png b/mods/awards/textures/awards_progress_gray.png new file mode 100644 index 00000000..a5fc6cb3 Binary files /dev/null and b/mods/awards/textures/awards_progress_gray.png differ diff --git a/mods/awards/textures/awards_progress_green.png b/mods/awards/textures/awards_progress_green.png new file mode 100644 index 00000000..54b4e5d5 Binary files /dev/null and b/mods/awards/textures/awards_progress_green.png differ diff --git a/mods/awards/textures/awards_pyromaniac.png b/mods/awards/textures/awards_pyromaniac.png new file mode 100644 index 00000000..a12649c9 Binary files /dev/null and b/mods/awards/textures/awards_pyromaniac.png differ diff --git a/mods/awards/textures/awards_really_well_lit.png b/mods/awards/textures/awards_really_well_lit.png new file mode 100644 index 00000000..b69cdffd Binary files /dev/null and b/mods/awards/textures/awards_really_well_lit.png differ diff --git a/mods/awards/textures/awards_roses_are_red.png b/mods/awards/textures/awards_roses_are_red.png new file mode 100644 index 00000000..994760f2 Binary files /dev/null and b/mods/awards/textures/awards_roses_are_red.png differ diff --git a/mods/awards/textures/awards_saint_maclou.png b/mods/awards/textures/awards_saint_maclou.png new file mode 100644 index 00000000..96b3b39a Binary files /dev/null and b/mods/awards/textures/awards_saint_maclou.png differ diff --git a/mods/awards/textures/awards_sam_the_trapper.png b/mods/awards/textures/awards_sam_the_trapper.png new file mode 100644 index 00000000..89ba5674 Binary files /dev/null and b/mods/awards/textures/awards_sam_the_trapper.png differ diff --git a/mods/awards/textures/awards_savannah_discoverer.png b/mods/awards/textures/awards_savannah_discoverer.png new file mode 100644 index 00000000..26c5a39b Binary files /dev/null and b/mods/awards/textures/awards_savannah_discoverer.png differ diff --git a/mods/awards/textures/awards_semi_pro_lumberjack.png b/mods/awards/textures/awards_semi_pro_lumberjack.png new file mode 100644 index 00000000..c4d2d79b Binary files /dev/null and b/mods/awards/textures/awards_semi_pro_lumberjack.png differ diff --git a/mods/awards/textures/awards_smelter.png b/mods/awards/textures/awards_smelter.png new file mode 100644 index 00000000..0dea637c Binary files /dev/null and b/mods/awards/textures/awards_smelter.png differ diff --git a/mods/awards/textures/awards_tasty_mushrooms.png b/mods/awards/textures/awards_tasty_mushrooms.png new file mode 100644 index 00000000..bf34fd23 Binary files /dev/null and b/mods/awards/textures/awards_tasty_mushrooms.png differ diff --git a/mods/awards/textures/awards_template.png b/mods/awards/textures/awards_template.png new file mode 100644 index 00000000..4ea47d15 Binary files /dev/null and b/mods/awards/textures/awards_template.png differ diff --git a/mods/awards/textures/awards_treasurer.png b/mods/awards/textures/awards_treasurer.png new file mode 100644 index 00000000..b8726047 Binary files /dev/null and b/mods/awards/textures/awards_treasurer.png differ diff --git a/mods/awards/textures/awards_ui_icon.png b/mods/awards/textures/awards_ui_icon.png new file mode 100644 index 00000000..239ad71e Binary files /dev/null and b/mods/awards/textures/awards_ui_icon.png differ diff --git a/mods/awards/textures/awards_underground_mushroom_farmer.png b/mods/awards/textures/awards_underground_mushroom_farmer.png new file mode 100644 index 00000000..5623171e Binary files /dev/null and b/mods/awards/textures/awards_underground_mushroom_farmer.png differ diff --git a/mods/awards/textures/awards_unknown.png b/mods/awards/textures/awards_unknown.png new file mode 100644 index 00000000..40d839c3 Binary files /dev/null and b/mods/awards/textures/awards_unknown.png differ diff --git a/mods/awards/textures/awards_very_simple_snow_man.png b/mods/awards/textures/awards_very_simple_snow_man.png new file mode 100644 index 00000000..b2da7b71 Binary files /dev/null and b/mods/awards/textures/awards_very_simple_snow_man.png differ diff --git a/mods/awards/textures/awards_watchtower.png b/mods/awards/textures/awards_watchtower.png new file mode 100644 index 00000000..22fabd58 Binary files /dev/null and b/mods/awards/textures/awards_watchtower.png differ diff --git a/mods/awards/textures/awards_well_lit.png b/mods/awards/textures/awards_well_lit.png new file mode 100644 index 00000000..db85e70c Binary files /dev/null and b/mods/awards/textures/awards_well_lit.png differ diff --git a/mods/awards/textures/awards_wheat_magnate.png b/mods/awards/textures/awards_wheat_magnate.png new file mode 100644 index 00000000..835d5fa3 Binary files /dev/null and b/mods/awards/textures/awards_wheat_magnate.png differ diff --git a/mods/awards/textures/awards_white_color_stock.png b/mods/awards/textures/awards_white_color_stock.png new file mode 100644 index 00000000..4f850f02 Binary files /dev/null and b/mods/awards/textures/awards_white_color_stock.png differ diff --git a/mods/awards/textures/awards_wool_over_your_eyes.png b/mods/awards/textures/awards_wool_over_your_eyes.png new file mode 100644 index 00000000..740c5f00 Binary files /dev/null and b/mods/awards/textures/awards_wool_over_your_eyes.png differ diff --git a/mods/awards/textures/awards_wow_i_am_diamonds.png b/mods/awards/textures/awards_wow_i_am_diamonds.png new file mode 100644 index 00000000..5bb71b99 Binary files /dev/null and b/mods/awards/textures/awards_wow_i_am_diamonds.png differ diff --git a/mods/awards/textures/awards_youre_a_copper.png b/mods/awards/textures/awards_youre_a_copper.png new file mode 100644 index 00000000..4d288113 Binary files /dev/null and b/mods/awards/textures/awards_youre_a_copper.png differ diff --git a/mods/awards/textures/awards_yummy.png b/mods/awards/textures/awards_yummy.png new file mode 100644 index 00000000..da230e8b Binary files /dev/null and b/mods/awards/textures/awards_yummy.png differ diff --git a/mods/bakedclay/README.md b/mods/bakedclay/README.md new file mode 100644 index 00000000..17983950 --- /dev/null +++ b/mods/bakedclay/README.md @@ -0,0 +1,29 @@ +Baked Clay + +This mod lets the player bake clay into hardened blocks and colour them with +dye (8x baked clay and 1x dye in centre), stairs and slabs are also available. +Cooking baked clay turns it into glazed terracotta blocks. + +https://forum.minetest.net/viewtopic.php?id=8890 + +Changelog: + +- 1.2 - Add 'stairsplus_clay_compatibility' setting. +- 1.1 - Remove 0.4.x compatibility to better support 5.x mods +- 1.0 - Re-Added glazed terracotta blocks when you cook baked clay in furnace (thanks Amara2_MK), added support for sofar's flowerpot mod, missing glazed textures re-coloured by firefox. +- 0.9 - Baked clay now works in the technic cnc machine +- 0.8 - Cooking clay block in furnace gives natural baked clay which you can dye +- 0.7 - Added support for stairsplus so that stairs are registered properly +- 0.6 - Added 3 new flowers and a new grass that are used for missing dyes +- 0.5 - Now using minecraft recipe to colour baked clay (8x baked clay, 1x dye in centre) +- 0.4 - Code tweak and tidy +- 0.3 - Added Stairs and Slabs for each colour +- 0.2 - Any colour of baked clay can be re-dyed into another colour +- 0.1 - Initial Release + +Lucky Blocks: 10 + + +Note: Under settings you will find 'colored_clay_compatibility' switch that when enabled will register aliases for the older colored clay mod and it's stairplus stairs. + +You will also find the 'stairsplus_clay_compatibility' setting that is enabled by default for older worlds that switched from default stairs mod to stairsplus. It can be disabled for brand new worlds only using stairsplus mod though. diff --git a/mods/bakedclay/flowers.lua b/mods/bakedclay/flowers.lua new file mode 100644 index 00000000..21919eb6 --- /dev/null +++ b/mods/bakedclay/flowers.lua @@ -0,0 +1,61 @@ + +-- translation support + +local S = minetest.get_translator("bakedclay") + +-- new flowers + +local flowers = { + {"delphinium", S("Blue Delphinium"), + {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_blue = 1}}, + + {"thistle", S("Thistle"), + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_magenta = 1}}, + + {"lazarus", S("Lazarus Bell"), + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_pink = 1}}, + + {"mannagrass", S("Reed Mannagrass"), + {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_dark_green = 1}} +} + +-- helper function + +local function add_simple_flower(name, desc, box, f_groups) + + f_groups.snappy = 3 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node("bakedclay:" .. name, { + description = desc, + drawtype = "plantlike", + waving = 1, + tiles = {"baked_clay_" .. name .. ".png"}, + inventory_image = "baked_clay_" .. name .. ".png", + wield_image = "baked_clay_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + buildable_to = true, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = {type = "fixed", fixed = box} + }) +end + +-- register new flowers to fill in missing dye colours + +for _,item in pairs(flowers) do + add_simple_flower(unpack(item)) +end + +-- flowerpot mod support + +if minetest.get_modpath("flowerpot") then + flowerpot.register_node("bakedclay:delphinium") + flowerpot.register_node("bakedclay:thistle") + flowerpot.register_node("bakedclay:lazarus") + flowerpot.register_node("bakedclay:mannagrass") +end diff --git a/mods/bakedclay/init.lua b/mods/bakedclay/init.lua new file mode 100644 index 00000000..d34a946c --- /dev/null +++ b/mods/bakedclay/init.lua @@ -0,0 +1,254 @@ + +-- translation support + +local S = minetest.get_translator("bakedclay") + +-- list of clay colours + +local clay = { + {"natural", S("Natural")}, + {"white", S("White")}, + {"grey", S("Grey")}, + {"black", S("Black")}, + {"red", S("Red")}, + {"yellow", S("Yellow")}, + {"green", S("Green")}, + {"cyan", S("Cyan")}, + {"blue", S("Blue")}, + {"magenta", S("Magenta")}, + {"orange", S("Orange")}, + {"violet", S("Violet")}, + {"brown", S("Brown")}, + {"pink", S("Pink")}, + {"dark_grey", S("Dark Grey")}, + {"dark_green", S("Dark Green")} +} + +-- check mod support + +local techcnc_mod = minetest.get_modpath("technic_cnc") +local stairs_mod = minetest.get_modpath("stairs") +local stairsplus_mod = minetest.get_modpath("moreblocks") + and minetest.global_exists("stairsplus") +local stairsplus_compat = minetest.settings:get_bool("stairsplus_clay_compatibility") ~= false + +-- scroll through colours + +for _, clay in pairs(clay) do + + -- register node + + minetest.register_node("bakedclay:" .. clay[1], { + description = clay[2] .. " " .. S("Baked Clay"), + tiles = {"baked_clay_" .. clay[1] ..".png"}, + groups = {cracky = 3, bakedclay = 1}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false + }) + + -- register craft recipe + + if clay[1] ~= "natural" then + + minetest.register_craft({ + output = "bakedclay:" .. clay[1] .. " 8", + recipe = { + {"group:bakedclay", "group:bakedclay", "group:bakedclay"}, + {"group:bakedclay", "dye:" .. clay[1], "group:bakedclay"}, + {"group:bakedclay", "group:bakedclay", "group:bakedclay"} + } + }) + end + + -- stairs plus + + if stairsplus_mod then + + stairsplus:register_all("bakedclay", "baked_clay_" .. clay[1], + "bakedclay:" .. clay[1], { + description = clay[2] .. " " .. S("Baked Clay"), + tiles = {"baked_clay_" .. clay[1] .. ".png"}, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults() + }) + + if stairsplus_compat then + + stairsplus:register_alias_all("bakedclay", clay[1], + "bakedclay", "baked_clay_" .. clay[1]) + + minetest.register_alias("stairs:slab_bakedclay_".. clay[1], + "bakedclay:slab_baked_clay_" .. clay[1]) + + minetest.register_alias("stairs:stair_bakedclay_".. clay[1], + "bakedclay:stair_baked_clay_" .. clay[1]) + end + + -- stairs redo + + elseif stairs_mod and stairs.mod then + + stairs.register_all("bakedclay_" .. clay[1], "bakedclay:" .. clay[1], + {cracky = 3}, + {"baked_clay_" .. clay[1] .. ".png"}, + clay[2] .. " " .. S("Baked Clay"), + default.node_sound_stone_defaults()) + + -- default stairs + + elseif stairs_mod then + + stairs.register_stair_and_slab("bakedclay_".. clay[1], "bakedclay:".. clay[1], + {cracky = 3}, + {"baked_clay_" .. clay[1] .. ".png"}, + clay[2] .. " " .. S("Baked Clay Stair"), + clay[2] .. " " .. S("Baked Clay Slab"), + default.node_sound_stone_defaults()) + end + + -- register bakedclay for use in technic_cnc mod after all mods loaded + + if techcnc_mod then + + minetest.register_on_mods_loaded(function() + + technic_cnc.register_all("bakedclay:" .. clay[1], + {cracky = 3, not_in_creative_inventory = 1}, + {"baked_clay_" .. clay[1] .. ".png"}, + clay[2] .. " Baked Clay") + end) + end +end + +-- Terracotta blocks + +for _, clay in pairs(clay) do + + if clay[1] ~= "natural" then + + local texture = "baked_clay_terracotta_" .. clay[1] ..".png" + + minetest.register_node("bakedclay:terracotta_" .. clay[1], { + description = clay[2] .. " " .. S("Glazed Terracotta"), + tiles = { + texture .. "", + texture .. "", + texture .. "^[transformR180", + texture .. "", + texture .. "^[transformR270", + texture .. "^[transformR90", + }, + paramtype2 = "facedir", + groups = {cracky = 3, terracotta = 1}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + on_place = minetest.rotate_node + }) + + minetest.register_craft({ + type = "cooking", + output = "bakedclay:terracotta_" .. clay[1], + recipe = "bakedclay:" .. clay[1] + }) + end +end + +minetest.register_alias("bakedclay:terracotta_light_blue", "bakedclay:terracotta_cyan") + +-- cook clay block into natural baked clay + +minetest.register_craft({ + type = "cooking", + output = "bakedclay:natural", + recipe = "default:clay" +}) + +-- register a few extra dye colour options + +minetest.register_craft({ + output = "dye:green 4", + recipe = {{"default:cactus"}} +}) + +minetest.register_craft({ + output = "dye:brown 4", + recipe = {{"default:dry_shrub"}} +}) + +-- only add light grey recipe if unifieddye mod isnt present (conflict) + +if not minetest.get_modpath("unifieddyes") then + + minetest.register_craft( { + output = "dye:dark_grey 3", + recipe = {{"dye:black", "dye:black", "dye:white"}} + }) + + minetest.register_craft( { + output = "dye:grey 3", + recipe = {{"dye:black", "dye:white", "dye:white"}} + }) +end + +-- 2x2 red baked clay makes 16x clay brick + +minetest.register_craft( { + output = "default:clay_brick 16", + recipe = { + {"bakedclay:red", "bakedclay:red"}, + {"bakedclay:red", "bakedclay:red"} + } +}) + +-- colored clay compatibility + +if minetest.settings:get_bool("colored_clay_compatibility") == true then + + local cc = { + {"black", "black"}, + {"blue", "blue"}, + {"bright", "natural"}, + {"brown", "brown"}, + {"cyan", "cyan"}, + {"dark_green", "dark_green"}, + {"dark_grey", "dark_grey"}, + {"green", "green"}, + {"grey", "grey"}, + {"hardened", "natural"}, + {"magenta", "magenta"}, + {"orange", "orange"}, + {"pink", "pink"}, + {"red", "red"}, + {"violet", "violet"}, + {"white", "white"}, + {"yellow", "yellow"} + } + + for n = 1, #cc do + + local nod1 = "colored_clay:" .. cc[n][1] + local nod2 = "bakedclay:" .. cc[n][2] + + minetest.register_alias(nod1, nod2) + + if stairsplus_mod then + stairsplus:register_alias_all("colored_clay", cc[n][1], "bakedclay", cc[n][2]) + end + end +end + +-- get mod path + +local path = minetest.get_modpath("bakedclay") + +-- add new flowers + +dofile(path .. "/flowers.lua") + +-- add lucky blocks if mod present + +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end + +print ("[MOD] Baked Clay loaded") diff --git a/mods/bakedclay/license.txt b/mods/bakedclay/license.txt new file mode 100644 index 00000000..9019798c --- /dev/null +++ b/mods/bakedclay/license.txt @@ -0,0 +1,36 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Textures by TenPlus1 (CC0) unless listed below + +Textures by Amara2_MK (Creative Commons) +https://www.curseforge.com/minecraft/texture-packs/glazed-terracotta-revamp + baked_clay_terracotta*.png + +Missing gray, light gray, black and green textures re-coloured by Firefox. + +Textures by Timbits (CC-BY-SA 3.0) + baked_clay_lazarus.png + baked_clay_delphinium.png + baked_clay_mannagrass.png + baked_clay_thistle.png diff --git a/mods/bakedclay/locale/bakedclay.es.tr b/mods/bakedclay/locale/bakedclay.es.tr new file mode 100644 index 00000000..5418a559 --- /dev/null +++ b/mods/bakedclay/locale/bakedclay.es.tr @@ -0,0 +1,25 @@ +# textdomain: bakedclay +Blue Delphinium=Delfinio Azul +Thistle=Cardo +Lazarus Bell=Campana Lázaro +Reed Mannagrass=Césped de caña +Natural=Natural +White=Blanco +Grey=Gris +Black=Negro +Red=Rojo +Yellow=Amarillo +Green=Verde +Cyan=Celeste +Blue=Azul +Magenta=Magenta +Orange=Naranja +Violet=Violeta +Brown=Cáfe +Pink=Rosa +Dark Grey=Gris Oscuro +Dark Green=Verde Oscuro +Baked Clay=Barro Cocido +Baked Clay Stair=Escalera de Barro Cocido +Baked Clay Slab=Losa de Barro Cocido +Glazed Terracotta=Terracota esmaltada. diff --git a/mods/bakedclay/locale/template.txt b/mods/bakedclay/locale/template.txt new file mode 100644 index 00000000..1f426049 --- /dev/null +++ b/mods/bakedclay/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: bakedclay +Blue Delphinium= +Thistle= +Lazarus Bell= +Reed Mannagrass= +Natural= +White= +Grey= +Black= +Red= +Yellow= +Green= +Cyan= +Blue= +Magenta= +Orange= +Violet= +Brown= +Pink= +Dark Grey= +Dark Green= +Baked Clay= +Baked Clay Stair= +Baked Clay Slab= +Glazed Terracotta= diff --git a/mods/bakedclay/lucky_block.lua b/mods/bakedclay/lucky_block.lua new file mode 100644 index 00000000..cec71b94 --- /dev/null +++ b/mods/bakedclay/lucky_block.lua @@ -0,0 +1,65 @@ + +-- helpers + +local p = "bakedclay:" +local p2 = "bakedclay:terracotta_" + +-- add lucky blocks + +lucky_block:add_blocks({ + {"dro", {"bakedclay:"}, 10, true}, + {"fal", { + p .. "black", p .. "blue", p .. "brown", p .. "cyan", p .. "dark_green", + p .. "dark_grey", p .. "green", p .. "grey", p .. "magenta", p .. "orange", + p .. "pink", p .. "red", p .. "violet", p .. "white", p .. "yellow", p .. "natural" + }, 0}, + {"fal", { + p .. "black", p .. "blue", p .. "brown", p .. "cyan", p .. "dark_green", + p .. "dark_grey", p .. "green", p .. "grey", p .. "magenta", p .. "orange", + p .. "pink", p .. "red", p .. "violet", p .. "white", p .. "yellow", p .. "natural" + }, 0, true}, + {"dro", {p .. "delphinium"}, 5}, + {"dro", {p .. "lazarus"}, 5}, + {"dro", {p .. "mannagrass"}, 5}, + {"dro", {p .. "thistle"}, 6}, + {"flo", 5, { + p .. "natural", p .. "black", p .. "blue", p .. "brown", p .. "cyan", + p .. "dark_green", p .. "dark_grey", p .. "green", p .. "grey", p .. "magenta", + p .. "orange", p .. "pink", p .. "red", p .. "violet", p .. "white", p .. "yellow" + }, 2}, + {"nod", "default:chest", 0, { + {name = p .. "natural", max = 20}, + {name = p .. "black", max = 20}, + {name = p .. "blue", max = 20}, + {name = p .. "brown", max = 20}, + {name = p .. "cyan", max = 20}, + {name = p .. "dark_green", max = 20}, + {name = p .. "dark_grey", max = 20}, + {name = p .. "green", max = 20}, + {name = p .. "grey", max = 20}, + {name = p .. "magenta", max = 20}, + {name = p .. "orange", max = 20}, + {name = p .. "pink", max = 20}, + {name = p .. "red", max = 20}, + {name = p .. "violet", max = 20}, + {name = p .. "white", max = 20}, + {name = p .. "yellow", max = 20} + }}, + {"nod", "default:chest", 0, { + {name = p2 .. "black", max = 20}, + {name = p2 .. "blue", max = 20}, + {name = p2 .. "brown", max = 20}, + {name = p2 .. "cyan", max = 20}, + {name = p2 .. "dark_green", max = 20}, + {name = p2 .. "dark_grey", max = 20}, + {name = p2 .. "green", max = 20}, + {name = p2 .. "grey", max = 20}, + {name = p2 .. "magenta", max = 20}, + {name = p2 .. "orange", max = 20}, + {name = p2 .. "pink", max = 20}, + {name = p2 .. "red", max = 20}, + {name = p2 .. "violet", max = 20}, + {name = p2 .. "white", max = 20}, + {name = p2 .. "yellow", max = 20} + }} +}) diff --git a/mods/bakedclay/mod.conf b/mods/bakedclay/mod.conf new file mode 100644 index 00000000..e58f6993 --- /dev/null +++ b/mods/bakedclay/mod.conf @@ -0,0 +1,5 @@ +name = bakedclay +description = Bake clay blocks and colour with dye, also has Terracotta designs. +depends = default +optional_depends = stairs, moreblocks, lucky_block, flowerpot +min_minetest_version = 5.0 diff --git a/mods/bakedclay/settingtypes.txt b/mods/bakedclay/settingtypes.txt new file mode 100644 index 00000000..657f9652 --- /dev/null +++ b/mods/bakedclay/settingtypes.txt @@ -0,0 +1,5 @@ +# Registers compatibility aliases with the older colored_clay mod +colored_clay_compatibility (Colored Clay Compatibility) bool false + +# Registers compatibility aliases in older worlds for StairsPlus mod +stairsplus_clay_compatibility (StairsPlus Stair Compatibility) bool true diff --git a/mods/bakedclay/textures/baked_clay_black.png b/mods/bakedclay/textures/baked_clay_black.png new file mode 100644 index 00000000..956f3150 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_black.png differ diff --git a/mods/bakedclay/textures/baked_clay_blue.png b/mods/bakedclay/textures/baked_clay_blue.png new file mode 100644 index 00000000..2b11d36e Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_blue.png differ diff --git a/mods/bakedclay/textures/baked_clay_brown.png b/mods/bakedclay/textures/baked_clay_brown.png new file mode 100644 index 00000000..f46e3280 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_brown.png differ diff --git a/mods/bakedclay/textures/baked_clay_cyan.png b/mods/bakedclay/textures/baked_clay_cyan.png new file mode 100644 index 00000000..364793e0 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_cyan.png differ diff --git a/mods/bakedclay/textures/baked_clay_dark_green.png b/mods/bakedclay/textures/baked_clay_dark_green.png new file mode 100644 index 00000000..2bd2586a Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_dark_green.png differ diff --git a/mods/bakedclay/textures/baked_clay_dark_grey.png b/mods/bakedclay/textures/baked_clay_dark_grey.png new file mode 100644 index 00000000..44642e70 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_dark_grey.png differ diff --git a/mods/bakedclay/textures/baked_clay_delphinium.png b/mods/bakedclay/textures/baked_clay_delphinium.png new file mode 100644 index 00000000..51b8ef9f Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_delphinium.png differ diff --git a/mods/bakedclay/textures/baked_clay_green.png b/mods/bakedclay/textures/baked_clay_green.png new file mode 100644 index 00000000..58f348c5 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_green.png differ diff --git a/mods/bakedclay/textures/baked_clay_grey.png b/mods/bakedclay/textures/baked_clay_grey.png new file mode 100644 index 00000000..deecb6a5 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_grey.png differ diff --git a/mods/bakedclay/textures/baked_clay_lazarus.png b/mods/bakedclay/textures/baked_clay_lazarus.png new file mode 100644 index 00000000..548a4b10 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_lazarus.png differ diff --git a/mods/bakedclay/textures/baked_clay_magenta.png b/mods/bakedclay/textures/baked_clay_magenta.png new file mode 100644 index 00000000..e740738d Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_magenta.png differ diff --git a/mods/bakedclay/textures/baked_clay_mannagrass.png b/mods/bakedclay/textures/baked_clay_mannagrass.png new file mode 100644 index 00000000..295d41d6 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_mannagrass.png differ diff --git a/mods/bakedclay/textures/baked_clay_natural.png b/mods/bakedclay/textures/baked_clay_natural.png new file mode 100644 index 00000000..56893aa9 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_natural.png differ diff --git a/mods/bakedclay/textures/baked_clay_orange.png b/mods/bakedclay/textures/baked_clay_orange.png new file mode 100644 index 00000000..847b7932 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_orange.png differ diff --git a/mods/bakedclay/textures/baked_clay_pink.png b/mods/bakedclay/textures/baked_clay_pink.png new file mode 100644 index 00000000..417fcfc1 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_pink.png differ diff --git a/mods/bakedclay/textures/baked_clay_red.png b/mods/bakedclay/textures/baked_clay_red.png new file mode 100644 index 00000000..e7162188 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_red.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_black.png b/mods/bakedclay/textures/baked_clay_terracotta_black.png new file mode 100644 index 00000000..5e009360 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_black.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_blue.png b/mods/bakedclay/textures/baked_clay_terracotta_blue.png new file mode 100644 index 00000000..77181d01 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_blue.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_brown.png b/mods/bakedclay/textures/baked_clay_terracotta_brown.png new file mode 100644 index 00000000..6b178431 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_brown.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_cyan.png b/mods/bakedclay/textures/baked_clay_terracotta_cyan.png new file mode 100644 index 00000000..cc6cff81 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_cyan.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_dark_green.png b/mods/bakedclay/textures/baked_clay_terracotta_dark_green.png new file mode 100644 index 00000000..4900f04e Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_dark_green.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_dark_grey.png b/mods/bakedclay/textures/baked_clay_terracotta_dark_grey.png new file mode 100644 index 00000000..0f2504f5 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_dark_grey.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_green.png b/mods/bakedclay/textures/baked_clay_terracotta_green.png new file mode 100644 index 00000000..959393d6 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_green.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_grey.png b/mods/bakedclay/textures/baked_clay_terracotta_grey.png new file mode 100644 index 00000000..6f396c34 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_grey.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_light_blue.png b/mods/bakedclay/textures/baked_clay_terracotta_light_blue.png new file mode 100644 index 00000000..12bc97ec Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_light_blue.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_magenta.png b/mods/bakedclay/textures/baked_clay_terracotta_magenta.png new file mode 100644 index 00000000..4ac69434 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_magenta.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_orange.png b/mods/bakedclay/textures/baked_clay_terracotta_orange.png new file mode 100644 index 00000000..e43289d2 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_orange.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_pink.png b/mods/bakedclay/textures/baked_clay_terracotta_pink.png new file mode 100644 index 00000000..f487bf99 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_pink.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_red.png b/mods/bakedclay/textures/baked_clay_terracotta_red.png new file mode 100644 index 00000000..adbbe829 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_red.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_violet.png b/mods/bakedclay/textures/baked_clay_terracotta_violet.png new file mode 100644 index 00000000..8bc3847a Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_violet.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_white.png b/mods/bakedclay/textures/baked_clay_terracotta_white.png new file mode 100644 index 00000000..02843282 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_white.png differ diff --git a/mods/bakedclay/textures/baked_clay_terracotta_yellow.png b/mods/bakedclay/textures/baked_clay_terracotta_yellow.png new file mode 100644 index 00000000..bd79f390 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_terracotta_yellow.png differ diff --git a/mods/bakedclay/textures/baked_clay_thistle.png b/mods/bakedclay/textures/baked_clay_thistle.png new file mode 100644 index 00000000..22a3d518 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_thistle.png differ diff --git a/mods/bakedclay/textures/baked_clay_violet.png b/mods/bakedclay/textures/baked_clay_violet.png new file mode 100644 index 00000000..b5db133e Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_violet.png differ diff --git a/mods/bakedclay/textures/baked_clay_white.png b/mods/bakedclay/textures/baked_clay_white.png new file mode 100644 index 00000000..ff953ab3 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_white.png differ diff --git a/mods/bakedclay/textures/baked_clay_yellow.png b/mods/bakedclay/textures/baked_clay_yellow.png new file mode 100644 index 00000000..e26e40c7 Binary files /dev/null and b/mods/bakedclay/textures/baked_clay_yellow.png differ diff --git a/mods/beautiflowers/.gitignore b/mods/beautiflowers/.gitignore new file mode 100644 index 00000000..6fd0a376 --- /dev/null +++ b/mods/beautiflowers/.gitignore @@ -0,0 +1,41 @@ +# Compiled Lua sources +luac.out + +# luarocks build files +*.src.rock +*.zip +*.tar.gz + +# Object files +*.o +*.os +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo +*.def +*.exp + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + diff --git a/mods/beautiflowers/LICENSE b/mods/beautiflowers/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/mods/beautiflowers/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/mods/beautiflowers/README.md b/mods/beautiflowers/README.md new file mode 100644 index 00000000..dffdd3ac --- /dev/null +++ b/mods/beautiflowers/README.md @@ -0,0 +1,25 @@ +# Minetest Beautiflowers + +Adds many flowers to minetest. + +Fill your world with colorful flowers! + +You can configure the amount of flowers that you want at your world. Just open spawn.lua + +## Links + +* [Github](https://github.com/minefaco/beautiflowers) +* [Contentdb](https://content.minetest.net/packages/1faco/beautiflowers/) +* [forums](https://forum.minetest.net/viewtopic.php?f=9&t=26318) + +## License + +__Code__ + +by minefaco GPLv3.0 (License for code) + +code for bonsai's abm are taken from default flowers mod. + +__Textures__ + +BTL-games under CC0 license. diff --git a/mods/beautiflowers/init.lua b/mods/beautiflowers/init.lua new file mode 100644 index 00000000..9f7d2e8f --- /dev/null +++ b/mods/beautiflowers/init.lua @@ -0,0 +1,196 @@ +beautiflowers = {} +local mpath = minetest.get_modpath("beautiflowers") +local pot = minetest.get_modpath("flowerpot") + +beautiflowers.flowers ={ + + {"Bonsai_1","green", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Bonsai_2","brown", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Bonsai_3","green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Bonsai_4","brown", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Bonsai_5","dark_green", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + + {"Pasto_1","dark_green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_2","dark_green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_3","dark_green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_4","green", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Pasto_5","green", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Pasto_6","green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_7","green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_8","green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_9","green", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Pasto_10","green",{-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + + {"Arcoiris","red", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Ada","yellow", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Agnes","yellow", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Alicia","yellow", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Alma","yellow", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Amaia","yellow", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Any","yellow", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Anastasia","yellow", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Astrid","violet", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Beatriz","blue", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Belen","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Berta","blue", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Blanca","violet", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Carla","white", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Casandra","violet", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Clara","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Claudia","violet", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Cloe","white", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Cristina","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Dafne","orange", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Dana","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Delia","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Elena","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Erica","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Estela","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Eva","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Fabiola","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Fiona","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Gala","orange", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Gisela","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Gloria","white", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Irene","white", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Ingrid","white", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Iris","white", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Ivette","white", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Jennifer","red", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Lara","red", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Laura","red", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Lidia","red", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Lucia","red", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Mara","red", {-5 / 16, -0.5, -5 / 16, 5 / 16, 2 / 16, 5 / 16}}, + {"Martina","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Melania","orange", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Mireia","red", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Nadia","red", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Nerea","red", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Noelia","red", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Noemi","violet", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Olimpia","magenta", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Oriana","magenta", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Pia","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 0 / 16, 2 / 16}}, + {"Raquel","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 0 / 16, 2 / 16}}, + {"Ruth","pink", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Sandra","pink", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Sara","pink", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Silvia","pink", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Sofia","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Sonia","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, -1 / 16, 2 / 16}}, + {"Talia","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Thais","cyan", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Valeria","cyan", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Valentina","cyan", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Vera","cyan", {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}}, + {"Victoria","cyan", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Xenia","cyan", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Zaida","cyan", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Virginia","cyan", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Nazareth","violet", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Arleth","violet", {-0.375, -0.5, -0.375, 0.375, 0.375, 0.375}}, + {"Miriam","violet", {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}}, + {"Minerva","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Vanesa","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Sabrina","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Rocio","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Regina","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Paula","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Olga","violet", {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16}}, + {"Xena","violet", {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}}, + {"Diana","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Caroline","pink", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + {"Michelle","white", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Genesis","white", {-2 / 16, -0.5, -2 / 16, 2 / 16, 1 / 16, 2 / 16}}, + {"Suri","white", {-2 / 16, -0.5, -2 / 16, 2 / 16, 7 / 16, 2 / 16}}, + {"Hadassa","white", {-2 / 16, -0.5, -2 / 16, 2 / 16, 6 / 16, 2 / 16}}, + +} + +local flowers = beautiflowers.flowers + +for i = 1, #flowers do + local name, dye, box = unpack(flowers[i]) + local desc = name:gsub("_"," ") + name = name:lower() + + minetest.register_node("beautiflowers:"..name, { + description = desc, + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {name..".png"}, + inventory_image = name..".png", + wield_image = name..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1, ["color_" .. dye] = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box or {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + }, + }) + + minetest.register_craft({ + output = "dye:"..dye.." 4", + recipe = { + {"beautiflowers:"..name} + }, + }) + + if pot then + flowerpot.register_node("beautiflowers:"..name) + end +end + +minetest.register_craft({ + output = "beautiflowers:bonsai_1", + recipe = { + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:sapling", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"} + } +}) + +minetest.register_craft({ + output = "beautiflowers:bonsai_2", + recipe = { + {"default:cobble", "default:sapling", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:sapling", "default:cobble"} + } +}) + +minetest.register_craft({ + output = "beautiflowers:bonsai_3", + recipe = { + {"default:cobble", "default:sapling", "default:cobble"}, + {"default:cobble", "default:sapling", "default:cobble"}, + {"default:cobble", "default:sapling", "default:cobble"} + } +}) + +minetest.register_craft({ + output = "beautiflowers:bonsai_4", + recipe = { + {"default:cobble", "default:sapling", "default:cobble"}, + {"default:sapling", "default:cobble", "default:sapling"}, + {"default:cobble", "default:sapling", "default:cobble"} + } +}) + +minetest.register_craft({ + output = "beautiflowers:bonsai_5", + recipe = { + {"default:cobble", "default:sapling", "default:cobble"}, + {"default:sapling", "default:sapling", "default:sapling"}, + {"default:cobble", "default:sapling", "default:cobble"} + } +}) + + +dofile(mpath .. "/spawn.lua") diff --git a/mods/beautiflowers/mod.conf b/mods/beautiflowers/mod.conf new file mode 100644 index 00000000..bdad5269 --- /dev/null +++ b/mods/beautiflowers/mod.conf @@ -0,0 +1,4 @@ +name = beautiflowers +author = 1faco +depends = default, dye +optional_depends = flowerpot diff --git a/mods/beautiflowers/screenshot_20210221_184403.png b/mods/beautiflowers/screenshot_20210221_184403.png new file mode 100644 index 00000000..0b49c8c0 Binary files /dev/null and b/mods/beautiflowers/screenshot_20210221_184403.png differ diff --git a/mods/beautiflowers/spawn.lua b/mods/beautiflowers/spawn.lua new file mode 100644 index 00000000..c6e19bab --- /dev/null +++ b/mods/beautiflowers/spawn.lua @@ -0,0 +1,139 @@ +local flowers = beautiflowers.flowers + + + +--[[Amount of flowers that you want to be generated + 5 = normal + less than 5= just a little + more than 5 = a lot of flowers +]]-- + +local FLOWERS_AMOUNT = 4 + +--Maximun height that you want to spawn flowers (min 1, max 30000) +local MAX_HEIGHT = 30000 + +local function register_pasto(name) + + minetest.register_decoration({ + name = "beautiflowers:"..name, + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:alpine_litter", + "naturalbiomes:bambooforest_litter", + "naturalbiomes:mediterran_litter", + "naturalbiomes:outback_litter", + "naturalbiomes:savannalitter", + }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.07, + spread = {x = 100, y = 100, z = 100}, + seed = 1602, + octaves = 3, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "beautiflowers:"..name, + spawn_by = "default:dirt_with_grass" + }) + +end + +local function register_bonsai(name) + + minetest.register_decoration({ + name = "beautiflowers:"..name, + deco_type = "simple", + place_on = {"default:stone","default:cobble","default:mossycobble"}, + sidelen = 16, + noise_params = { + offset = -0.006, + scale = 0.07, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66, + }, + y_max = 30000, + y_min = 60, + decoration = "beautiflowers:"..name, + }) + +end + +local function register_flower(name) + local fill = (FLOWERS_AMOUNT/16000) + minetest.register_decoration({ + name = "beautiflowers:"..name, + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:alpine_litter", + "naturalbiomes:bambooforest_litter", + "naturalbiomes:mediterran_litter", + "naturalbiomes:outback_litter", + "naturalbiomes:savannalitter", + }, + sidelen = 16, + fill_ratio = fill, + y_max = MAX_HEIGHT, + y_min = 1, + decoration = "beautiflowers:"..name, + }) + +end + +function beautiflowers.bonsai_spread(pos, node) + if minetest.get_node_light(pos, 0.5) > 3 then + if minetest.get_node_light(pos, nil) == 15 then + minetest.remove_node(pos) + end + return + end + local positions = minetest.find_nodes_in_area_under_air( + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, + {"group:stone"}) + if #positions == 0 then + return + end + local pos2 = positions[math.random(#positions)] + pos2.y = pos2.y + 1 + if minetest.get_node_light(pos2, 0.5) <= 3 then + minetest.set_node(pos2, {name = node.name}) + end +end + +minetest.register_abm({ + label = "Bonsai spread", + nodenames = {"beautiflowers:bonsai_1","beautiflowers:bonsai_2","beautiflowers:bonsai_3","beautiflowers:bonsai_4","beautiflowers:bonsai_5"}, + interval = 11, + chance = 150, + action = function(...) + beautiflowers.bonsai_spread(...) + end, +}) + +--[[for i = 1, #flowers do + local name, color = unpack(flowers[i]) + local aux = unpack(name:split("_")) + if aux == "pasto" then + register_pasto(name) + else + if aux == "bonsai" then + register_bonsai(name) + else + register_flower(name,color) + end + + end + + +end]] diff --git a/mods/beautiflowers/textures/ada.png b/mods/beautiflowers/textures/ada.png new file mode 100644 index 00000000..8f4d66d7 Binary files /dev/null and b/mods/beautiflowers/textures/ada.png differ diff --git a/mods/beautiflowers/textures/agnes.png b/mods/beautiflowers/textures/agnes.png new file mode 100644 index 00000000..7e781dc9 Binary files /dev/null and b/mods/beautiflowers/textures/agnes.png differ diff --git a/mods/beautiflowers/textures/alicia.png b/mods/beautiflowers/textures/alicia.png new file mode 100644 index 00000000..c35b95fe Binary files /dev/null and b/mods/beautiflowers/textures/alicia.png differ diff --git a/mods/beautiflowers/textures/alma.png b/mods/beautiflowers/textures/alma.png new file mode 100644 index 00000000..63cb493b Binary files /dev/null and b/mods/beautiflowers/textures/alma.png differ diff --git a/mods/beautiflowers/textures/amaia.png b/mods/beautiflowers/textures/amaia.png new file mode 100644 index 00000000..03c25ad2 Binary files /dev/null and b/mods/beautiflowers/textures/amaia.png differ diff --git a/mods/beautiflowers/textures/anastasia.png b/mods/beautiflowers/textures/anastasia.png new file mode 100644 index 00000000..d70b85fb Binary files /dev/null and b/mods/beautiflowers/textures/anastasia.png differ diff --git a/mods/beautiflowers/textures/any.png b/mods/beautiflowers/textures/any.png new file mode 100644 index 00000000..f24a45ca Binary files /dev/null and b/mods/beautiflowers/textures/any.png differ diff --git a/mods/beautiflowers/textures/arcoiris.png b/mods/beautiflowers/textures/arcoiris.png new file mode 100644 index 00000000..2dd40fcb Binary files /dev/null and b/mods/beautiflowers/textures/arcoiris.png differ diff --git a/mods/beautiflowers/textures/arleth.png b/mods/beautiflowers/textures/arleth.png new file mode 100644 index 00000000..41712a7a Binary files /dev/null and b/mods/beautiflowers/textures/arleth.png differ diff --git a/mods/beautiflowers/textures/astrid.png b/mods/beautiflowers/textures/astrid.png new file mode 100644 index 00000000..b9a0a623 Binary files /dev/null and b/mods/beautiflowers/textures/astrid.png differ diff --git a/mods/beautiflowers/textures/beatriz.png b/mods/beautiflowers/textures/beatriz.png new file mode 100644 index 00000000..dc20a103 Binary files /dev/null and b/mods/beautiflowers/textures/beatriz.png differ diff --git a/mods/beautiflowers/textures/belen.png b/mods/beautiflowers/textures/belen.png new file mode 100644 index 00000000..c6b33449 Binary files /dev/null and b/mods/beautiflowers/textures/belen.png differ diff --git a/mods/beautiflowers/textures/berta.png b/mods/beautiflowers/textures/berta.png new file mode 100644 index 00000000..fff6ea1c Binary files /dev/null and b/mods/beautiflowers/textures/berta.png differ diff --git a/mods/beautiflowers/textures/blanca.png b/mods/beautiflowers/textures/blanca.png new file mode 100644 index 00000000..6be9a7a6 Binary files /dev/null and b/mods/beautiflowers/textures/blanca.png differ diff --git a/mods/beautiflowers/textures/bonsai_1.png b/mods/beautiflowers/textures/bonsai_1.png new file mode 100644 index 00000000..7eb22819 Binary files /dev/null and b/mods/beautiflowers/textures/bonsai_1.png differ diff --git a/mods/beautiflowers/textures/bonsai_2.png b/mods/beautiflowers/textures/bonsai_2.png new file mode 100644 index 00000000..18f57a95 Binary files /dev/null and b/mods/beautiflowers/textures/bonsai_2.png differ diff --git a/mods/beautiflowers/textures/bonsai_3.png b/mods/beautiflowers/textures/bonsai_3.png new file mode 100644 index 00000000..6ca2fde9 Binary files /dev/null and b/mods/beautiflowers/textures/bonsai_3.png differ diff --git a/mods/beautiflowers/textures/bonsai_4.png b/mods/beautiflowers/textures/bonsai_4.png new file mode 100644 index 00000000..2df2fe11 Binary files /dev/null and b/mods/beautiflowers/textures/bonsai_4.png differ diff --git a/mods/beautiflowers/textures/bonsai_5.png b/mods/beautiflowers/textures/bonsai_5.png new file mode 100644 index 00000000..0c308fce Binary files /dev/null and b/mods/beautiflowers/textures/bonsai_5.png differ diff --git a/mods/beautiflowers/textures/carla.png b/mods/beautiflowers/textures/carla.png new file mode 100644 index 00000000..a64aa8f0 Binary files /dev/null and b/mods/beautiflowers/textures/carla.png differ diff --git a/mods/beautiflowers/textures/caroline.png b/mods/beautiflowers/textures/caroline.png new file mode 100644 index 00000000..a0ae7cab Binary files /dev/null and b/mods/beautiflowers/textures/caroline.png differ diff --git a/mods/beautiflowers/textures/casandra.png b/mods/beautiflowers/textures/casandra.png new file mode 100644 index 00000000..3f0a2474 Binary files /dev/null and b/mods/beautiflowers/textures/casandra.png differ diff --git a/mods/beautiflowers/textures/clara.png b/mods/beautiflowers/textures/clara.png new file mode 100644 index 00000000..1017ded7 Binary files /dev/null and b/mods/beautiflowers/textures/clara.png differ diff --git a/mods/beautiflowers/textures/claudia.png b/mods/beautiflowers/textures/claudia.png new file mode 100644 index 00000000..137ad5ed Binary files /dev/null and b/mods/beautiflowers/textures/claudia.png differ diff --git a/mods/beautiflowers/textures/cloe.png b/mods/beautiflowers/textures/cloe.png new file mode 100644 index 00000000..da3f59d5 Binary files /dev/null and b/mods/beautiflowers/textures/cloe.png differ diff --git a/mods/beautiflowers/textures/cristina.png b/mods/beautiflowers/textures/cristina.png new file mode 100644 index 00000000..2adcf098 Binary files /dev/null and b/mods/beautiflowers/textures/cristina.png differ diff --git a/mods/beautiflowers/textures/dafne.png b/mods/beautiflowers/textures/dafne.png new file mode 100644 index 00000000..eff1b386 Binary files /dev/null and b/mods/beautiflowers/textures/dafne.png differ diff --git a/mods/beautiflowers/textures/dana.png b/mods/beautiflowers/textures/dana.png new file mode 100644 index 00000000..b41c6f9f Binary files /dev/null and b/mods/beautiflowers/textures/dana.png differ diff --git a/mods/beautiflowers/textures/delia.png b/mods/beautiflowers/textures/delia.png new file mode 100644 index 00000000..9da57ad7 Binary files /dev/null and b/mods/beautiflowers/textures/delia.png differ diff --git a/mods/beautiflowers/textures/diana.png b/mods/beautiflowers/textures/diana.png new file mode 100644 index 00000000..4eb61652 Binary files /dev/null and b/mods/beautiflowers/textures/diana.png differ diff --git a/mods/beautiflowers/textures/elena.png b/mods/beautiflowers/textures/elena.png new file mode 100644 index 00000000..97e93524 Binary files /dev/null and b/mods/beautiflowers/textures/elena.png differ diff --git a/mods/beautiflowers/textures/erica.png b/mods/beautiflowers/textures/erica.png new file mode 100644 index 00000000..219b3ee8 Binary files /dev/null and b/mods/beautiflowers/textures/erica.png differ diff --git a/mods/beautiflowers/textures/estela.png b/mods/beautiflowers/textures/estela.png new file mode 100644 index 00000000..7ec07dd0 Binary files /dev/null and b/mods/beautiflowers/textures/estela.png differ diff --git a/mods/beautiflowers/textures/eva.png b/mods/beautiflowers/textures/eva.png new file mode 100644 index 00000000..ca1157cd Binary files /dev/null and b/mods/beautiflowers/textures/eva.png differ diff --git a/mods/beautiflowers/textures/fabiola.png b/mods/beautiflowers/textures/fabiola.png new file mode 100644 index 00000000..dced8a90 Binary files /dev/null and b/mods/beautiflowers/textures/fabiola.png differ diff --git a/mods/beautiflowers/textures/fiona.png b/mods/beautiflowers/textures/fiona.png new file mode 100644 index 00000000..e6a1c338 Binary files /dev/null and b/mods/beautiflowers/textures/fiona.png differ diff --git a/mods/beautiflowers/textures/gala.png b/mods/beautiflowers/textures/gala.png new file mode 100644 index 00000000..f74bf850 Binary files /dev/null and b/mods/beautiflowers/textures/gala.png differ diff --git a/mods/beautiflowers/textures/genesis.png b/mods/beautiflowers/textures/genesis.png new file mode 100644 index 00000000..76e22746 Binary files /dev/null and b/mods/beautiflowers/textures/genesis.png differ diff --git a/mods/beautiflowers/textures/gisela.png b/mods/beautiflowers/textures/gisela.png new file mode 100644 index 00000000..f5399f10 Binary files /dev/null and b/mods/beautiflowers/textures/gisela.png differ diff --git a/mods/beautiflowers/textures/gloria.png b/mods/beautiflowers/textures/gloria.png new file mode 100644 index 00000000..6d54b367 Binary files /dev/null and b/mods/beautiflowers/textures/gloria.png differ diff --git a/mods/beautiflowers/textures/hadassa.png b/mods/beautiflowers/textures/hadassa.png new file mode 100644 index 00000000..f7b8fa05 Binary files /dev/null and b/mods/beautiflowers/textures/hadassa.png differ diff --git a/mods/beautiflowers/textures/ingrid.png b/mods/beautiflowers/textures/ingrid.png new file mode 100644 index 00000000..2f461818 Binary files /dev/null and b/mods/beautiflowers/textures/ingrid.png differ diff --git a/mods/beautiflowers/textures/irene.png b/mods/beautiflowers/textures/irene.png new file mode 100644 index 00000000..c267a506 Binary files /dev/null and b/mods/beautiflowers/textures/irene.png differ diff --git a/mods/beautiflowers/textures/iris.png b/mods/beautiflowers/textures/iris.png new file mode 100644 index 00000000..334e5211 Binary files /dev/null and b/mods/beautiflowers/textures/iris.png differ diff --git a/mods/beautiflowers/textures/ivette.png b/mods/beautiflowers/textures/ivette.png new file mode 100644 index 00000000..3da1aba7 Binary files /dev/null and b/mods/beautiflowers/textures/ivette.png differ diff --git a/mods/beautiflowers/textures/jennifer.png b/mods/beautiflowers/textures/jennifer.png new file mode 100644 index 00000000..4bfc7433 Binary files /dev/null and b/mods/beautiflowers/textures/jennifer.png differ diff --git a/mods/beautiflowers/textures/lara.png b/mods/beautiflowers/textures/lara.png new file mode 100644 index 00000000..38134b40 Binary files /dev/null and b/mods/beautiflowers/textures/lara.png differ diff --git a/mods/beautiflowers/textures/laura.png b/mods/beautiflowers/textures/laura.png new file mode 100644 index 00000000..df32db6c Binary files /dev/null and b/mods/beautiflowers/textures/laura.png differ diff --git a/mods/beautiflowers/textures/lidia.png b/mods/beautiflowers/textures/lidia.png new file mode 100644 index 00000000..b422ed91 Binary files /dev/null and b/mods/beautiflowers/textures/lidia.png differ diff --git a/mods/beautiflowers/textures/lucia.png b/mods/beautiflowers/textures/lucia.png new file mode 100644 index 00000000..956b03b1 Binary files /dev/null and b/mods/beautiflowers/textures/lucia.png differ diff --git a/mods/beautiflowers/textures/mara.png b/mods/beautiflowers/textures/mara.png new file mode 100644 index 00000000..2bc487b8 Binary files /dev/null and b/mods/beautiflowers/textures/mara.png differ diff --git a/mods/beautiflowers/textures/martina.png b/mods/beautiflowers/textures/martina.png new file mode 100644 index 00000000..6ccb6cb9 Binary files /dev/null and b/mods/beautiflowers/textures/martina.png differ diff --git a/mods/beautiflowers/textures/melania.png b/mods/beautiflowers/textures/melania.png new file mode 100644 index 00000000..2beea16c Binary files /dev/null and b/mods/beautiflowers/textures/melania.png differ diff --git a/mods/beautiflowers/textures/michelle.png b/mods/beautiflowers/textures/michelle.png new file mode 100644 index 00000000..c10819dd Binary files /dev/null and b/mods/beautiflowers/textures/michelle.png differ diff --git a/mods/beautiflowers/textures/minerva.png b/mods/beautiflowers/textures/minerva.png new file mode 100644 index 00000000..e3201acb Binary files /dev/null and b/mods/beautiflowers/textures/minerva.png differ diff --git a/mods/beautiflowers/textures/mireia.png b/mods/beautiflowers/textures/mireia.png new file mode 100644 index 00000000..30c5a06b Binary files /dev/null and b/mods/beautiflowers/textures/mireia.png differ diff --git a/mods/beautiflowers/textures/miriam.png b/mods/beautiflowers/textures/miriam.png new file mode 100644 index 00000000..6a355a97 Binary files /dev/null and b/mods/beautiflowers/textures/miriam.png differ diff --git a/mods/beautiflowers/textures/nadia.png b/mods/beautiflowers/textures/nadia.png new file mode 100644 index 00000000..8f95fbb2 Binary files /dev/null and b/mods/beautiflowers/textures/nadia.png differ diff --git a/mods/beautiflowers/textures/nazareth.png b/mods/beautiflowers/textures/nazareth.png new file mode 100644 index 00000000..0d34a2b7 Binary files /dev/null and b/mods/beautiflowers/textures/nazareth.png differ diff --git a/mods/beautiflowers/textures/nerea.png b/mods/beautiflowers/textures/nerea.png new file mode 100644 index 00000000..931eefd3 Binary files /dev/null and b/mods/beautiflowers/textures/nerea.png differ diff --git a/mods/beautiflowers/textures/noelia.png b/mods/beautiflowers/textures/noelia.png new file mode 100644 index 00000000..a273d54a Binary files /dev/null and b/mods/beautiflowers/textures/noelia.png differ diff --git a/mods/beautiflowers/textures/noemi.png b/mods/beautiflowers/textures/noemi.png new file mode 100644 index 00000000..c8522fb8 Binary files /dev/null and b/mods/beautiflowers/textures/noemi.png differ diff --git a/mods/beautiflowers/textures/olga.png b/mods/beautiflowers/textures/olga.png new file mode 100644 index 00000000..e1ee0f70 Binary files /dev/null and b/mods/beautiflowers/textures/olga.png differ diff --git a/mods/beautiflowers/textures/olimpia.png b/mods/beautiflowers/textures/olimpia.png new file mode 100644 index 00000000..1deaeb6e Binary files /dev/null and b/mods/beautiflowers/textures/olimpia.png differ diff --git a/mods/beautiflowers/textures/oriana.png b/mods/beautiflowers/textures/oriana.png new file mode 100644 index 00000000..d6bc022d Binary files /dev/null and b/mods/beautiflowers/textures/oriana.png differ diff --git a/mods/beautiflowers/textures/pasto_1.png b/mods/beautiflowers/textures/pasto_1.png new file mode 100644 index 00000000..8ca18bb6 Binary files /dev/null and b/mods/beautiflowers/textures/pasto_1.png differ diff --git a/mods/beautiflowers/textures/pasto_10.png b/mods/beautiflowers/textures/pasto_10.png new file mode 100644 index 00000000..79b2f10e Binary files /dev/null and b/mods/beautiflowers/textures/pasto_10.png differ diff --git a/mods/beautiflowers/textures/pasto_2.png b/mods/beautiflowers/textures/pasto_2.png new file mode 100644 index 00000000..925b3d49 Binary files /dev/null and b/mods/beautiflowers/textures/pasto_2.png differ diff --git a/mods/beautiflowers/textures/pasto_3.png b/mods/beautiflowers/textures/pasto_3.png new file mode 100644 index 00000000..75a4c803 Binary files /dev/null and b/mods/beautiflowers/textures/pasto_3.png differ diff --git a/mods/beautiflowers/textures/pasto_4.png b/mods/beautiflowers/textures/pasto_4.png new file mode 100644 index 00000000..82db98f4 Binary files /dev/null and b/mods/beautiflowers/textures/pasto_4.png differ diff --git a/mods/beautiflowers/textures/pasto_5.png b/mods/beautiflowers/textures/pasto_5.png new file mode 100644 index 00000000..14aafabd Binary files /dev/null and b/mods/beautiflowers/textures/pasto_5.png differ diff --git a/mods/beautiflowers/textures/pasto_6.png b/mods/beautiflowers/textures/pasto_6.png new file mode 100644 index 00000000..4dfbf292 Binary files /dev/null and b/mods/beautiflowers/textures/pasto_6.png differ diff --git a/mods/beautiflowers/textures/pasto_7.png b/mods/beautiflowers/textures/pasto_7.png new file mode 100644 index 00000000..d215315d Binary files /dev/null and b/mods/beautiflowers/textures/pasto_7.png differ diff --git a/mods/beautiflowers/textures/pasto_8.png b/mods/beautiflowers/textures/pasto_8.png new file mode 100644 index 00000000..a442f3bf Binary files /dev/null and b/mods/beautiflowers/textures/pasto_8.png differ diff --git a/mods/beautiflowers/textures/pasto_9.png b/mods/beautiflowers/textures/pasto_9.png new file mode 100644 index 00000000..ed66244f Binary files /dev/null and b/mods/beautiflowers/textures/pasto_9.png differ diff --git a/mods/beautiflowers/textures/paula.png b/mods/beautiflowers/textures/paula.png new file mode 100644 index 00000000..50e0f936 Binary files /dev/null and b/mods/beautiflowers/textures/paula.png differ diff --git a/mods/beautiflowers/textures/pia.png b/mods/beautiflowers/textures/pia.png new file mode 100644 index 00000000..5611780b Binary files /dev/null and b/mods/beautiflowers/textures/pia.png differ diff --git a/mods/beautiflowers/textures/raquel.png b/mods/beautiflowers/textures/raquel.png new file mode 100644 index 00000000..80795606 Binary files /dev/null and b/mods/beautiflowers/textures/raquel.png differ diff --git a/mods/beautiflowers/textures/regina.png b/mods/beautiflowers/textures/regina.png new file mode 100644 index 00000000..3ba6d0a2 Binary files /dev/null and b/mods/beautiflowers/textures/regina.png differ diff --git a/mods/beautiflowers/textures/rocio.png b/mods/beautiflowers/textures/rocio.png new file mode 100644 index 00000000..df5febb0 Binary files /dev/null and b/mods/beautiflowers/textures/rocio.png differ diff --git a/mods/beautiflowers/textures/ruth.png b/mods/beautiflowers/textures/ruth.png new file mode 100644 index 00000000..80ff9eb0 Binary files /dev/null and b/mods/beautiflowers/textures/ruth.png differ diff --git a/mods/beautiflowers/textures/sabrina.png b/mods/beautiflowers/textures/sabrina.png new file mode 100644 index 00000000..c96f4628 Binary files /dev/null and b/mods/beautiflowers/textures/sabrina.png differ diff --git a/mods/beautiflowers/textures/sandra.png b/mods/beautiflowers/textures/sandra.png new file mode 100644 index 00000000..832f289d Binary files /dev/null and b/mods/beautiflowers/textures/sandra.png differ diff --git a/mods/beautiflowers/textures/sara.png b/mods/beautiflowers/textures/sara.png new file mode 100644 index 00000000..24062e2a Binary files /dev/null and b/mods/beautiflowers/textures/sara.png differ diff --git a/mods/beautiflowers/textures/silvia.png b/mods/beautiflowers/textures/silvia.png new file mode 100644 index 00000000..9a7fc40e Binary files /dev/null and b/mods/beautiflowers/textures/silvia.png differ diff --git a/mods/beautiflowers/textures/sofia.png b/mods/beautiflowers/textures/sofia.png new file mode 100644 index 00000000..c4d9bdb2 Binary files /dev/null and b/mods/beautiflowers/textures/sofia.png differ diff --git a/mods/beautiflowers/textures/sonia.png b/mods/beautiflowers/textures/sonia.png new file mode 100644 index 00000000..1f9e74ed Binary files /dev/null and b/mods/beautiflowers/textures/sonia.png differ diff --git a/mods/beautiflowers/textures/suri.png b/mods/beautiflowers/textures/suri.png new file mode 100644 index 00000000..4d41ccc4 Binary files /dev/null and b/mods/beautiflowers/textures/suri.png differ diff --git a/mods/beautiflowers/textures/talia.png b/mods/beautiflowers/textures/talia.png new file mode 100644 index 00000000..440ccc53 Binary files /dev/null and b/mods/beautiflowers/textures/talia.png differ diff --git a/mods/beautiflowers/textures/textures.txt b/mods/beautiflowers/textures/textures.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mods/beautiflowers/textures/textures.txt @@ -0,0 +1 @@ + diff --git a/mods/beautiflowers/textures/thais.png b/mods/beautiflowers/textures/thais.png new file mode 100644 index 00000000..435ee783 Binary files /dev/null and b/mods/beautiflowers/textures/thais.png differ diff --git a/mods/beautiflowers/textures/valentina.png b/mods/beautiflowers/textures/valentina.png new file mode 100644 index 00000000..faf49192 Binary files /dev/null and b/mods/beautiflowers/textures/valentina.png differ diff --git a/mods/beautiflowers/textures/valeria.png b/mods/beautiflowers/textures/valeria.png new file mode 100644 index 00000000..1f4e904f Binary files /dev/null and b/mods/beautiflowers/textures/valeria.png differ diff --git a/mods/beautiflowers/textures/vanesa.png b/mods/beautiflowers/textures/vanesa.png new file mode 100644 index 00000000..c4ee6f76 Binary files /dev/null and b/mods/beautiflowers/textures/vanesa.png differ diff --git a/mods/beautiflowers/textures/vera.png b/mods/beautiflowers/textures/vera.png new file mode 100644 index 00000000..1a015b4b Binary files /dev/null and b/mods/beautiflowers/textures/vera.png differ diff --git a/mods/beautiflowers/textures/victoria.png b/mods/beautiflowers/textures/victoria.png new file mode 100644 index 00000000..5a091041 Binary files /dev/null and b/mods/beautiflowers/textures/victoria.png differ diff --git a/mods/beautiflowers/textures/virginia.png b/mods/beautiflowers/textures/virginia.png new file mode 100644 index 00000000..b19915ca Binary files /dev/null and b/mods/beautiflowers/textures/virginia.png differ diff --git a/mods/beautiflowers/textures/xena.png b/mods/beautiflowers/textures/xena.png new file mode 100644 index 00000000..6688a6b1 Binary files /dev/null and b/mods/beautiflowers/textures/xena.png differ diff --git a/mods/beautiflowers/textures/xenia.png b/mods/beautiflowers/textures/xenia.png new file mode 100644 index 00000000..3409c4c9 Binary files /dev/null and b/mods/beautiflowers/textures/xenia.png differ diff --git a/mods/beautiflowers/textures/zaida.png b/mods/beautiflowers/textures/zaida.png new file mode 100644 index 00000000..ea6a9530 Binary files /dev/null and b/mods/beautiflowers/textures/zaida.png differ diff --git a/mods/biomes/CREDITS.md b/mods/biomes/CREDITS.md new file mode 100644 index 00000000..a6ac13ff --- /dev/null +++ b/mods/biomes/CREDITS.md @@ -0,0 +1,5 @@ +Credits +======= + +- Many textures are derived from [RPG16](https://content.minetest.net/packages/Hugues%20Ross/rpg16/) by Hughes Ross; see license.txt for details +- Many textures are derived from [Minetest Game](https://content.minetest.net/packages/Minetest/minetest_game/); see license.txt for details \ No newline at end of file diff --git a/mods/biomes/badland/README.md b/mods/biomes/badland/README.md new file mode 100644 index 00000000..f80c032e --- /dev/null +++ b/mods/biomes/badland/README.md @@ -0,0 +1,2 @@ +# badland +Adds a Badlands biome with a few more objects. diff --git a/mods/biomes/badland/badland.png b/mods/biomes/badland/badland.png new file mode 100644 index 00000000..e38c2d76 Binary files /dev/null and b/mods/biomes/badland/badland.png differ diff --git a/mods/biomes/badland/crafting.lua b/mods/biomes/badland/crafting.lua new file mode 100644 index 00000000..7b28dfb6 --- /dev/null +++ b/mods/biomes/badland/crafting.lua @@ -0,0 +1,15 @@ +------------Crafting +minetest.register_craft({ + output = "badland:badland_wood 4", + recipe = { + {"badland:badland_tree"}, + } +}) + +minetest.register_craft({ + output = "badland:badland_trapdoor 2", + recipe = { + {"badland:badland_wood", "badland:badland_wood", "badland:badland_wood"}, + {"badland:badland_wood", "badland:badland_wood", "badland:badland_wood"}, + } +}) \ No newline at end of file diff --git a/mods/biomes/badland/flowers.lua b/mods/biomes/badland/flowers.lua new file mode 100644 index 00000000..460d97d6 --- /dev/null +++ b/mods/biomes/badland/flowers.lua @@ -0,0 +1,103 @@ +badland = {} +local mpath = minetest.get_modpath("badland") +local pot = minetest.get_modpath("flowerpot") + + + minetest.register_node("badland:toadstool", { + description = "Toadstool", + drawtype = "plantlike", + waving = 1, + on_use = minetest.item_eat(1), + visual_scale = 1, + tiles = {"toadstool.png"}, + inventory_image = "toadstool.png", + wield_image = "toadstool.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, prairie = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box or {-0.15, -0.5, -0.15, 0.15, 0.15, 0.15}, + }, + }) + + minetest.register_node("badland:brown_mushroom_2", { + description = "Brown Mushroom", + drawtype = "plantlike", + waving = 1, + on_use = minetest.item_eat(1), + visual_scale = 1, + tiles = {"brown_mushroom_2.png"}, + inventory_image = "brown_mushroom_2.png", + wield_image = "brown_mushroom_2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, prairie = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box or {-0.15, -0.5, -0.15, 0.15, 0.15, 0.15}, + }, + }) + + minetest.register_node("badland:brown_mushroom_3", { + description = "Brown Mushroom", + drawtype = "plantlike", + waving = 1, + on_use = minetest.item_eat(1), + visual_scale = 1, + tiles = {"brown_mushroom_3.png"}, + inventory_image = "brown_mushroom_3.png", + wield_image = "brown_mushroom_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, prairie = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box or {-0.15, -0.5, -0.15, 0.15, 0.15, 0.15}, + }, + }) + + minetest.register_node("badland:brown_mushroom_4", { + description = "Brown Mushroom", + drawtype = "plantlike", + waving = 1, + on_use = minetest.item_eat(1), + visual_scale = 1, + tiles = {"brown_mushroom_4.png"}, + inventory_image = "brown_mushroom_4.png", + wield_image = "brown_mushroom_4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, prairie = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box or {-0.15, -0.5, -0.15, 0.15, 0.15, 0.15}, + }, + }) + + + + + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"badland:badland_grass"}, + sidelen = 16, + fill_ratio = 0.01, + biomes = {"badland"}, + decoration = { + "badland:toadstool", "badland:brown_mushroom_4", "badland:brown_mushroom_3", "badland:brown_mushroom_2", + } +}) diff --git a/mods/biomes/badland/init.lua b/mods/biomes/badland/init.lua new file mode 100644 index 00000000..56f48d0f --- /dev/null +++ b/mods/biomes/badland/init.lua @@ -0,0 +1,7 @@ +local default_path = minetest.get_modpath("badland") + +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/nodes.lua") +--dofile(default_path.."/flowers.lua") -- replaced with brown mushrooms in asuna_core/decor.lua +dofile(default_path.."/crafting.lua") +dofile(default_path.."/moreblocks.lua") diff --git a/mods/biomes/badland/license.txt b/mods/biomes/badland/license.txt new file mode 100644 index 00000000..af3dc37b --- /dev/null +++ b/mods/biomes/badland/license.txt @@ -0,0 +1,18 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + + diff --git a/mods/biomes/badland/mapgen.lua b/mods/biomes/badland/mapgen.lua new file mode 100644 index 00000000..c83f5187 --- /dev/null +++ b/mods/biomes/badland/mapgen.lua @@ -0,0 +1,180 @@ +-----------------------Trees +minetest.register_decoration({ + name = "badland:badland_tree_1", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.00125, + scale = 0.0075, + spread = {x = 80, y = 20, z = 80}, + seed = 777, + octaves = 1, + }, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "badland:badland_tree_2", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00025, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "badland:badland_tree_3", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.0025, + spread = {x = 40, y = 40, z = 40}, + seed = 999, + octaves = 1, + }, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_tree_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "badland:badland_tree_4", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.005, + scale = 0.01, + spread = {x = 80, y = 20, z = 80}, + seed = 101010, + octaves = 2, + persistence = 0.5, + lacunarity = 0.9, + }, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_tree_4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +---------------------------------------Bush +minetest.register_decoration({ + name = "badland:badland_brush", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.008265, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) +----------------------------------Log 1 +minetest.register_decoration({ + name = "badland:badland_log_1", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.008265, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_log_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) +----------------------------------Log 2 +minetest.register_decoration({ + name = "badland:badland_log_2", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.008265, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/badland_log_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) +---------------------Racine +minetest.register_decoration({ + name = "badland:racine_1", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.000665, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/racine_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) +---------------------------Puit +minetest.register_decoration({ + name = "badland:puit_1", + deco_type = "schematic", + place_on = {"badland:badland_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.000165, + biomes = {"badland"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("badland").."/schematics/puit_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) +---------------------------Grass +minetest.register_decoration({ + deco_type = "simple", + place_on = {"badland:badland_grass"}, + sidelen = 16, + fill_ratio = 0.35, + biomes = {"badland"}, + decoration = { + "badland:badland_grass_1", "badland:badland_grass_2", "badland:badland_grass_3", "badland:badland_grass_4", "badland:badland_grass_5", + } +}) +---------------------------Pumpkins +minetest.register_decoration({ + deco_type = "simple", + place_on = {"badland:badland_grass"}, + sidelen = 16, + fill_ratio = 0.0025, + param2 = 0, + param2_max = 3, + biomes = {"badland"}, + decoration = { + "badland:pumpkin_block", + } +}) \ No newline at end of file diff --git a/mods/biomes/badland/mod.conf b/mods/biomes/badland/mod.conf new file mode 100644 index 00000000..e70ed053 --- /dev/null +++ b/mods/biomes/badland/mod.conf @@ -0,0 +1,8 @@ + +author = Atlante +name = badland + +description = Adds a Badlands biome with a few more objects. +title = Badlands +depends = default, doors, japaneseforest, flowerpot, x_farming +optional_depends = flowers, moreblocks diff --git a/mods/biomes/badland/models/scarecrow.obj b/mods/biomes/badland/models/scarecrow.obj new file mode 100644 index 00000000..f365e682 --- /dev/null +++ b/mods/biomes/badland/models/scarecrow.obj @@ -0,0 +1,278 @@ +# Blender v2.78 (sub 0) OBJ File: '' +# www.blender.org +mtllib scarecrow.mtl +o Cube_Cube.001 +v -0.561998 1.323839 0.300580 +v -0.561998 2.981953 0.300579 +v -0.561998 2.981953 -0.300582 +v -0.561998 1.323839 -0.300581 +v 0.563007 2.981953 -0.300580 +v 0.563007 1.323839 -0.300580 +v 0.563007 2.981953 0.300581 +v 0.563007 1.323839 0.300581 +v -0.561998 2.981304 0.562503 +v -0.561998 4.106310 0.562503 +v -0.561998 4.106310 -0.562503 +v -0.561998 2.981304 -0.562504 +v 0.563007 4.106310 -0.562503 +v 0.563007 2.981304 -0.562503 +v 0.563007 4.106310 0.562503 +v 0.563007 2.981304 0.562503 +v 0.139760 -0.287793 0.292342 +v -0.000793 1.318738 0.292342 +v -0.000793 1.318738 -0.292342 +v 0.139761 -0.287793 -0.292342 +v 0.546074 1.366583 -0.292342 +v 0.686627 -0.239948 -0.292342 +v 0.546074 1.366583 0.292342 +v 0.686627 -0.239948 0.292342 +v -0.139991 -0.287924 -0.292342 +v -0.139991 -0.287924 0.292342 +v -0.686857 -0.240079 0.292342 +v -0.686857 -0.240079 -0.292342 +v -0.546304 1.366452 -0.292342 +v 0.000563 1.318607 -0.292342 +v 0.000563 1.318607 0.292342 +v -0.546304 1.366452 0.292342 +v -0.128807 -1.218078 0.129312 +v -0.128807 1.378430 0.129312 +v -0.128807 1.378430 -0.129312 +v -0.128807 -1.218078 -0.129312 +v 0.129816 1.378430 -0.129312 +v 0.129816 -1.218078 -0.129312 +v 0.129816 1.378430 0.129312 +v 0.129816 -1.218078 0.129312 +v -2.627234 2.609297 0.129310 +v 2.628242 2.609298 0.129312 +v 2.628242 2.867920 0.129312 +v -2.627234 2.867920 0.129310 +v 2.628242 2.867921 -0.129311 +v -2.627234 2.867921 -0.129313 +v 2.628242 2.609297 -0.129311 +v -2.627234 2.609297 -0.129313 +v -2.219586 2.414515 0.300579 +v -2.219586 2.414515 -0.300582 +v -0.561471 2.414515 -0.300581 +v -0.561471 2.414515 0.300580 +v -2.219586 2.978941 -0.300582 +v -0.561471 2.978941 -0.300582 +v -2.219586 2.978941 0.300579 +v -0.561471 2.978941 0.300579 +v 2.219980 2.414515 0.300581 +v 0.561866 2.414515 0.300581 +v 0.561866 2.414515 -0.300580 +v 2.219980 2.414515 -0.300580 +v 0.561866 2.978941 -0.300580 +v 2.219980 2.978941 -0.300580 +v 0.561865 2.978941 0.300581 +v 2.219980 2.978941 0.300581 +v -1.668880 2.412450 0.302779 +v -1.668880 2.412450 -0.302782 +v -1.668880 2.981006 -0.302782 +v -1.668880 2.981006 0.302779 +v 1.669274 2.412450 0.302781 +v 1.669274 2.412450 -0.302780 +v 1.669274 2.981006 -0.302779 +v 1.669274 2.981006 0.302782 +vt 0.5000 0.5000 +vt 0.5000 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.5000 +vt 0.3125 0.6875 +vt 0.3125 0.5000 +vt 0.2500 0.6875 +vt 0.2500 0.5000 +vt 0.6250 0.5000 +vt 0.6250 0.6875 +vt 0.4375 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.7500 +vt 0.4375 0.7500 +vt 0.4375 0.7500 +vt 0.3125 0.7500 +vt 0.3750 0.7500 +vt 0.3750 0.8750 +vt 0.2500 0.8750 +vt 0.2500 0.7500 +vt 0.1250 0.8750 +vt 0.1250 0.7500 +vt -0.0000 0.8750 +vt -0.0000 0.7500 +vt 0.5000 0.7500 +vt 0.5000 0.8750 +vt 0.2500 0.8750 +vt 0.3750 0.8750 +vt 0.3750 1.0000 +vt 0.2500 1.0000 +vt 0.2500 1.0000 +vt 0.1250 1.0000 +vt 0.1875 0.5000 +vt 0.1875 0.6875 +vt 0.1250 0.6875 +vt 0.1250 0.5000 +vt 0.0625 0.6875 +vt 0.0625 0.5000 +vt -0.0000 0.6875 +vt -0.0000 0.5000 +vt 0.2500 0.5000 +vt 0.2500 0.6875 +vt 0.1250 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.7500 +vt 0.1250 0.7500 +vt 0.1250 0.7500 +vt 0.0625 0.7500 +vt 0.1250 0.6875 +vt 0.1250 0.7500 +vt 0.1875 0.7500 +vt 0.1875 0.6875 +vt 0.1250 0.5000 +vt 0.0625 0.5000 +vt 0.0625 0.6875 +vt 0.1250 0.6875 +vt 0.1875 0.5000 +vt 0.1875 0.6875 +vt 0.2500 0.5000 +vt 0.2500 0.6875 +vt 0.0625 0.7500 +vt 0.1250 0.7500 +vt -0.0000 0.5000 +vt -0.0000 0.6875 +vt 0.0938 0.1406 +vt 0.0938 0.4688 +vt 0.0625 0.4688 +vt 0.0625 0.1406 +vt 0.0312 0.4688 +vt 0.0312 0.1406 +vt 0.0000 0.4688 +vt -0.0000 0.1406 +vt 0.1250 0.1406 +vt 0.1250 0.4688 +vt 0.0625 0.4688 +vt 0.0938 0.4688 +vt 0.0938 0.5000 +vt 0.0625 0.5000 +vt 0.0625 0.5000 +vt 0.0312 0.5000 +vt 0.9688 0.0000 +vt 0.9688 0.5938 +vt 0.9375 0.5938 +vt 0.9375 0.0000 +vt 0.9062 0.5938 +vt 0.9062 0.0000 +vt 0.8750 0.5938 +vt 0.8750 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5938 +vt 0.9375 0.5938 +vt 0.9688 0.5938 +vt 0.9688 0.6250 +vt 0.9375 0.6250 +vt 0.9375 0.6250 +vt 0.9062 0.6250 +vt 0.8125 0.5000 +vt 0.7500 0.5000 +vt 0.7500 0.6875 +vt 0.8125 0.6875 +vt 0.6875 0.5000 +vt 0.6875 0.6875 +vt 0.6250 0.5000 +vt 0.6250 0.6875 +vt 0.8750 0.5000 +vt 0.8750 0.6875 +vt 0.7500 0.6875 +vt 0.7500 0.7500 +vt 0.8125 0.7500 +vt 0.8125 0.6875 +vt 0.6875 0.7500 +vt 0.7500 0.7500 +vt 0.8125 0.5000 +vt 0.8125 0.6875 +vt 0.7500 0.6875 +vt 0.7500 0.5000 +vt 0.6875 0.6875 +vt 0.6875 0.5000 +vt 0.6250 0.6875 +vt 0.6250 0.5000 +vt 0.8750 0.5000 +vt 0.8750 0.6875 +vt 0.7500 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.7500 +vt 0.7500 0.7500 +vt 0.7500 0.7500 +vt 0.6875 0.7500 +vt 0.7500 0.6875 +vt 0.7500 0.7500 +vt 0.8125 0.7500 +vt 0.8125 0.6875 +vt 0.7500 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.7500 +vt 0.7500 0.7500 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.9962 -0.0872 -0.0000 +vn 0.9962 0.0872 0.0000 +vn 0.0872 -0.9962 -0.0000 +vn -0.0872 0.9962 0.0000 +vn -0.0872 -0.9962 -0.0000 +vn 0.9962 -0.0872 -0.0000 +vn 0.0872 0.9962 0.0000 +vn -0.9962 0.0872 0.0000 +usemtl None +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/4/2 3/3/2 5/5/2 6/6/2 +f 6/6/3 5/5/3 7/7/3 8/8/3 +f 8/9/4 7/10/4 2/2/4 1/1/4 +f 4/11/5 6/12/5 8/13/5 1/14/5 +f 5/5/6 3/3/6 2/15/6 7/16/6 +f 9/17/1 10/18/1 11/19/1 12/20/1 +f 12/20/2 11/19/2 13/21/2 14/22/2 +f 14/22/3 13/21/3 15/23/3 16/24/3 +f 16/25/4 15/26/4 10/18/4 9/17/4 +f 12/27/5 14/28/5 16/29/5 9/30/5 +f 13/21/6 11/19/6 10/31/6 15/32/6 +f 17/33/7 18/34/7 19/35/7 20/36/7 +f 20/36/2 19/35/2 21/37/2 22/38/2 +f 22/38/8 21/37/8 23/39/8 24/40/8 +f 24/41/4 23/42/4 18/34/4 17/33/4 +f 20/43/9 22/44/9 24/45/9 17/46/9 +f 21/37/10 19/35/10 18/47/10 23/48/10 +f 25/49/11 26/50/11 27/51/11 28/52/11 +f 25/53/2 28/54/2 29/55/2 30/56/2 +f 26/57/12 25/53/12 30/56/12 31/58/12 +f 27/59/4 26/57/4 31/58/4 32/60/4 +f 29/55/13 32/61/13 31/62/13 30/56/13 +f 28/54/14 27/63/14 32/64/14 29/55/14 +f 33/65/1 34/66/1 35/67/1 36/68/1 +f 36/68/2 35/67/2 37/69/2 38/70/2 +f 38/70/3 37/69/3 39/71/3 40/72/3 +f 40/73/4 39/74/4 34/66/4 33/65/4 +f 36/75/5 38/76/5 40/77/5 33/78/5 +f 37/69/6 35/67/6 34/79/6 39/80/6 +f 41/81/4 42/82/4 43/83/4 44/84/4 +f 44/84/6 43/83/6 45/85/6 46/86/6 +f 46/86/2 45/85/2 47/87/2 48/88/2 +f 48/89/5 47/90/5 42/82/5 41/81/5 +f 44/91/1 46/92/1 48/93/1 41/94/1 +f 45/85/3 43/83/3 42/95/3 47/96/3 +f 49/97/5 50/98/5 51/99/5 52/100/5 +f 50/98/2 53/101/2 54/102/2 51/99/2 +f 53/101/6 55/103/6 56/104/6 54/102/6 +f 55/105/4 49/97/4 52/100/4 56/106/4 +f 50/107/1 49/108/1 55/109/1 53/110/1 +f 54/102/3 56/111/3 52/112/3 51/99/3 +f 57/113/5 58/114/5 59/115/5 60/116/5 +f 60/116/2 59/115/2 61/117/2 62/118/2 +f 62/118/6 61/117/6 63/119/6 64/120/6 +f 64/121/4 63/122/4 58/114/4 57/113/4 +f 60/123/3 62/124/3 64/125/3 57/126/3 +f 61/117/1 59/115/1 58/127/1 63/128/1 +f 66/129/1 65/130/1 68/131/1 67/132/1 +f 70/133/3 71/134/3 72/135/3 69/136/3 diff --git a/mods/biomes/badland/moreblocks.lua b/mods/biomes/badland/moreblocks.lua new file mode 100644 index 00000000..785b05bd --- /dev/null +++ b/mods/biomes/badland/moreblocks.lua @@ -0,0 +1,21 @@ +-----------------Moreblock +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("badland_wood", "wood", "badland:badland_wood", { + description = "Frost Land Wood", + tiles = {"badland_wood.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("badland_tree", "tree", "badland:badland_tree", { + description = "Japanese Tree", + tiles = {"badland_tree_top.png", "badland_tree_top.png", + "badland_tree.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + + +end diff --git a/mods/biomes/badland/nodes.lua b/mods/biomes/badland/nodes.lua new file mode 100644 index 00000000..183e830d --- /dev/null +++ b/mods/biomes/badland/nodes.lua @@ -0,0 +1,328 @@ +local modpath = minetest.get_modpath("badland") + +minetest.register_node("badland:badland_grass", { + description = "Badland Grass", + tiles = {"badland_grass.png", "default_dirt.png", + {name = "default_dirt.png^badland_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("badland:badland_leaves", { + description = "Spooky Badland Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"badland_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"badland:badland_sapling_1"}, rarity = 20}, + {items = {"badland:badland_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("badland:badland_leaves_2", { + description = "Haunted Badland Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"badland_leaves_2.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"badland:badland_sapling_2"}, rarity = 20}, + {items = {"badland:badland_leaves_2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("badland:badland_leaves_3", { + description = "Dusky Badland Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"badland_leaves_3.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"badland:badland_sapling_3"}, rarity = 20}, + {items = {"badland:badland_leaves_3"}}, + }, + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("badland:badland_tree", { + description = "Badland Tree", + tiles = {"badland_tree_top.png", "badland_tree_top.png", + "badland_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + + +minetest.register_node("badland:badland_wood", { + description = "Badland Wood", + tiles = {"badland_wood.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +stairs.register_stair_and_slab( + "badland_wood", + "badland:badland_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"badland_wood.png"}, + "Badland Wood Stair", + "Badland Wood Slab", + default.node_sound_wood_defaults(), + true +) + +doors.register_trapdoor("badland:badland_trapdoor", { + description = "Badland Trapdoor", + inventory_image = "badland_trapdoor.png", + wield_image = "badland_trapdoor.png", + tile_front = "badland_trapdoor.png", + tile_side = "badland_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + + +doors.register("badland_door", { + tiles = {{ name = "doors_badland_door.png", backface_culling = true }}, + description = "Badland Door", + inventory_image = "doors_item_badland.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"badland:badland_wood", "badland:badland_wood"}, + {"badland:badland_wood", "badland:badland_wood"}, + {"badland:badland_wood", "badland:badland_wood"}, + } +}) + + +doors.register_fencegate("badland:gate_badland", { + description = "Badland Wood Fence Gate", + texture = "badland_wood_fence.png", + material = "badland:badland_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + + default.register_fence("badland:fence_badland_wood", { + description = "Badland Wood Fence", + texture = "badland_wood_fence.png", + inventory_image = "default_fence_overlay.png^badland_wood_fence.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^badland_wood_fence.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "badland:badland_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("badland:fence_rail_badland_wood", { + description = "Badland Wood Fence Rail", + texture = "badland_wood_fence.png", + inventory_image = "default_fence_rail_overlay.png^badland_wood_fence.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^badland_wood_fence.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "badland:badland_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + + minetest.register_node("badland:badland_grass_1", { + description = "Badland Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"badland_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "badland_grass_3.png", + wield_image = "badland_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"badland:badland_grass_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("badland:badland_grass_" .. math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("badland:badland_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + minetest.register_node("badland:badland_grass_" .. i, { + description = "Badland Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"badland_grass_" .. i .. ".png"}, + inventory_image = "badland_grass_" .. i .. ".png", + wield_image = "badland_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "badland:badland_grass_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"badland:badland_grass_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + +-- Aliases for X Farming nodes +minetest.register_alias("badland:scarecrow","x_farming:scarecrow") +minetest.register_alias("badland:pumpkin_lantern","x_farming:pumpkin_lantern") +minetest.register_alias("badland:pumpkin_block","x_farming:pumpkin_block") + +--[[ + Trees +]] + +local trees = { + { + name = "Spooky", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/badland_tree_1.mts", "0", nil, false) + end, + }, + { + name = "Haunted", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-2}, modpath.."/schematics/badland_tree_3.mts", "0", nil, false) + end, + }, + { + name = "Dusky", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-2}, modpath.."/schematics/badland_tree_4.mts", "0", nil, false) + end, + }, +} + +local mod_bonemeal = minetest.get_modpath("bonemeal") + +for index,def in ipairs(trees) do + local sapling = "badland:badland_sapling_" .. index + local image = "badland_sapling_" .. index .. ".png" + local leaves = "badland:badland_leaves_" .. index + + -- Register sapling + minetest.register_node(sapling, { + description = def.name .. " Badland Sapling", + drawtype = "plantlike", + tiles = {image}, + inventory_image = image, + wield_image = image, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = function(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + else + def.grow_function(pos) + end + end, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + sapling, + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + -- Register sapling crafting recipe + minetest.register_craft({ + output = sapling, + recipe = { + {"", leaves, ""}, + {leaves, "default:stick", leaves} + }, + }) + + -- Add bonemeal integration if supported + if mod_bonemeal then + bonemeal:add_sapling({ + {sapling, def.grow_function, "soil"}, + }) + end +end diff --git a/mods/biomes/badland/schematics/badland_bush.mts b/mods/biomes/badland/schematics/badland_bush.mts new file mode 100644 index 00000000..2d4d3f5f Binary files /dev/null and b/mods/biomes/badland/schematics/badland_bush.mts differ diff --git a/mods/biomes/badland/schematics/badland_log_1.mts b/mods/biomes/badland/schematics/badland_log_1.mts new file mode 100644 index 00000000..6b1c917d Binary files /dev/null and b/mods/biomes/badland/schematics/badland_log_1.mts differ diff --git a/mods/biomes/badland/schematics/badland_log_2.mts b/mods/biomes/badland/schematics/badland_log_2.mts new file mode 100644 index 00000000..16283b3f Binary files /dev/null and b/mods/biomes/badland/schematics/badland_log_2.mts differ diff --git a/mods/biomes/badland/schematics/badland_tree_1.mts b/mods/biomes/badland/schematics/badland_tree_1.mts new file mode 100644 index 00000000..098faea8 Binary files /dev/null and b/mods/biomes/badland/schematics/badland_tree_1.mts differ diff --git a/mods/biomes/badland/schematics/badland_tree_2.mts b/mods/biomes/badland/schematics/badland_tree_2.mts new file mode 100644 index 00000000..7e90ec91 Binary files /dev/null and b/mods/biomes/badland/schematics/badland_tree_2.mts differ diff --git a/mods/biomes/badland/schematics/badland_tree_3.mts b/mods/biomes/badland/schematics/badland_tree_3.mts new file mode 100644 index 00000000..7b18e58b Binary files /dev/null and b/mods/biomes/badland/schematics/badland_tree_3.mts differ diff --git a/mods/biomes/badland/schematics/badland_tree_4.mts b/mods/biomes/badland/schematics/badland_tree_4.mts new file mode 100644 index 00000000..22971a9a Binary files /dev/null and b/mods/biomes/badland/schematics/badland_tree_4.mts differ diff --git a/mods/biomes/badland/schematics/puit_1.mts b/mods/biomes/badland/schematics/puit_1.mts new file mode 100644 index 00000000..a2e38198 Binary files /dev/null and b/mods/biomes/badland/schematics/puit_1.mts differ diff --git a/mods/biomes/badland/schematics/racine_1.mts b/mods/biomes/badland/schematics/racine_1.mts new file mode 100644 index 00000000..8fdc0bf2 Binary files /dev/null and b/mods/biomes/badland/schematics/racine_1.mts differ diff --git a/mods/biomes/badland/textures/badland_bowl.png b/mods/biomes/badland/textures/badland_bowl.png new file mode 100644 index 00000000..339dc590 Binary files /dev/null and b/mods/biomes/badland/textures/badland_bowl.png differ diff --git a/mods/biomes/badland/textures/badland_grass.png b/mods/biomes/badland/textures/badland_grass.png new file mode 100644 index 00000000..f2715738 Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass.png differ diff --git a/mods/biomes/badland/textures/badland_grass_1.png b/mods/biomes/badland/textures/badland_grass_1.png new file mode 100644 index 00000000..e136a6e1 Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass_1.png differ diff --git a/mods/biomes/badland/textures/badland_grass_2.png b/mods/biomes/badland/textures/badland_grass_2.png new file mode 100644 index 00000000..1e789b42 Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass_2.png differ diff --git a/mods/biomes/badland/textures/badland_grass_3.png b/mods/biomes/badland/textures/badland_grass_3.png new file mode 100644 index 00000000..6bd5f6d4 Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass_3.png differ diff --git a/mods/biomes/badland/textures/badland_grass_4.png b/mods/biomes/badland/textures/badland_grass_4.png new file mode 100644 index 00000000..ddd0bc0b Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass_4.png differ diff --git a/mods/biomes/badland/textures/badland_grass_5.png b/mods/biomes/badland/textures/badland_grass_5.png new file mode 100644 index 00000000..4c9f3531 Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass_5.png differ diff --git a/mods/biomes/badland/textures/badland_grass_side.png b/mods/biomes/badland/textures/badland_grass_side.png new file mode 100644 index 00000000..8710e2f8 Binary files /dev/null and b/mods/biomes/badland/textures/badland_grass_side.png differ diff --git a/mods/biomes/badland/textures/badland_leaves.png b/mods/biomes/badland/textures/badland_leaves.png new file mode 100644 index 00000000..06a203e2 Binary files /dev/null and b/mods/biomes/badland/textures/badland_leaves.png differ diff --git a/mods/biomes/badland/textures/badland_leaves_2.png b/mods/biomes/badland/textures/badland_leaves_2.png new file mode 100644 index 00000000..0f470611 Binary files /dev/null and b/mods/biomes/badland/textures/badland_leaves_2.png differ diff --git a/mods/biomes/badland/textures/badland_leaves_3.png b/mods/biomes/badland/textures/badland_leaves_3.png new file mode 100644 index 00000000..fe0a6cd9 Binary files /dev/null and b/mods/biomes/badland/textures/badland_leaves_3.png differ diff --git a/mods/biomes/badland/textures/badland_mushroom_bowl.png b/mods/biomes/badland/textures/badland_mushroom_bowl.png new file mode 100644 index 00000000..e39f9f62 Binary files /dev/null and b/mods/biomes/badland/textures/badland_mushroom_bowl.png differ diff --git a/mods/biomes/badland/textures/badland_pumpkin_fruit_side.png b/mods/biomes/badland/textures/badland_pumpkin_fruit_side.png new file mode 100644 index 00000000..c429a179 Binary files /dev/null and b/mods/biomes/badland/textures/badland_pumpkin_fruit_side.png differ diff --git a/mods/biomes/badland/textures/badland_pumpkin_fruit_side_off.png b/mods/biomes/badland/textures/badland_pumpkin_fruit_side_off.png new file mode 100644 index 00000000..1159ccf9 Binary files /dev/null and b/mods/biomes/badland/textures/badland_pumpkin_fruit_side_off.png differ diff --git a/mods/biomes/badland/textures/badland_pumpkin_fruit_side_on.png b/mods/biomes/badland/textures/badland_pumpkin_fruit_side_on.png new file mode 100644 index 00000000..a47c72e8 Binary files /dev/null and b/mods/biomes/badland/textures/badland_pumpkin_fruit_side_on.png differ diff --git a/mods/biomes/badland/textures/badland_pumpkin_fruit_top.png b/mods/biomes/badland/textures/badland_pumpkin_fruit_top.png new file mode 100644 index 00000000..e4fc9ec3 Binary files /dev/null and b/mods/biomes/badland/textures/badland_pumpkin_fruit_top.png differ diff --git a/mods/biomes/badland/textures/badland_sapling.png b/mods/biomes/badland/textures/badland_sapling.png new file mode 100644 index 00000000..db3966c7 Binary files /dev/null and b/mods/biomes/badland/textures/badland_sapling.png differ diff --git a/mods/biomes/badland/textures/badland_sapling_1.png b/mods/biomes/badland/textures/badland_sapling_1.png new file mode 100644 index 00000000..e302c3c8 Binary files /dev/null and b/mods/biomes/badland/textures/badland_sapling_1.png differ diff --git a/mods/biomes/badland/textures/badland_sapling_2.png b/mods/biomes/badland/textures/badland_sapling_2.png new file mode 100644 index 00000000..abeb376c Binary files /dev/null and b/mods/biomes/badland/textures/badland_sapling_2.png differ diff --git a/mods/biomes/badland/textures/badland_sapling_3.png b/mods/biomes/badland/textures/badland_sapling_3.png new file mode 100644 index 00000000..bb4a6cbf Binary files /dev/null and b/mods/biomes/badland/textures/badland_sapling_3.png differ diff --git a/mods/biomes/badland/textures/badland_scarecrow.png b/mods/biomes/badland/textures/badland_scarecrow.png new file mode 100644 index 00000000..35db654b Binary files /dev/null and b/mods/biomes/badland/textures/badland_scarecrow.png differ diff --git a/mods/biomes/badland/textures/badland_scarecrow_item.png b/mods/biomes/badland/textures/badland_scarecrow_item.png new file mode 100644 index 00000000..b54552e6 Binary files /dev/null and b/mods/biomes/badland/textures/badland_scarecrow_item.png differ diff --git a/mods/biomes/badland/textures/badland_trapdoor.png b/mods/biomes/badland/textures/badland_trapdoor.png new file mode 100644 index 00000000..5e58d668 Binary files /dev/null and b/mods/biomes/badland/textures/badland_trapdoor.png differ diff --git a/mods/biomes/badland/textures/badland_trapdoor_side.png b/mods/biomes/badland/textures/badland_trapdoor_side.png new file mode 100644 index 00000000..f06e49a9 Binary files /dev/null and b/mods/biomes/badland/textures/badland_trapdoor_side.png differ diff --git a/mods/biomes/badland/textures/badland_tree.png b/mods/biomes/badland/textures/badland_tree.png new file mode 100644 index 00000000..47035b75 Binary files /dev/null and b/mods/biomes/badland/textures/badland_tree.png differ diff --git a/mods/biomes/badland/textures/badland_tree_top.png b/mods/biomes/badland/textures/badland_tree_top.png new file mode 100644 index 00000000..dfae91aa Binary files /dev/null and b/mods/biomes/badland/textures/badland_tree_top.png differ diff --git a/mods/biomes/badland/textures/badland_wood.png b/mods/biomes/badland/textures/badland_wood.png new file mode 100644 index 00000000..2282c8cf Binary files /dev/null and b/mods/biomes/badland/textures/badland_wood.png differ diff --git a/mods/biomes/badland/textures/badland_wood_fence.png b/mods/biomes/badland/textures/badland_wood_fence.png new file mode 100644 index 00000000..2282c8cf Binary files /dev/null and b/mods/biomes/badland/textures/badland_wood_fence.png differ diff --git a/mods/biomes/badland/textures/brown_mushroom_2.png b/mods/biomes/badland/textures/brown_mushroom_2.png new file mode 100644 index 00000000..1c3ef64a Binary files /dev/null and b/mods/biomes/badland/textures/brown_mushroom_2.png differ diff --git a/mods/biomes/badland/textures/brown_mushroom_3.png b/mods/biomes/badland/textures/brown_mushroom_3.png new file mode 100644 index 00000000..16726fe7 Binary files /dev/null and b/mods/biomes/badland/textures/brown_mushroom_3.png differ diff --git a/mods/biomes/badland/textures/brown_mushroom_4.png b/mods/biomes/badland/textures/brown_mushroom_4.png new file mode 100644 index 00000000..13cc160c Binary files /dev/null and b/mods/biomes/badland/textures/brown_mushroom_4.png differ diff --git a/mods/biomes/badland/textures/doors_badland_door.png b/mods/biomes/badland/textures/doors_badland_door.png new file mode 100644 index 00000000..858f1a0d Binary files /dev/null and b/mods/biomes/badland/textures/doors_badland_door.png differ diff --git a/mods/biomes/badland/textures/doors_item_badland.png b/mods/biomes/badland/textures/doors_item_badland.png new file mode 100644 index 00000000..4d1cd28c Binary files /dev/null and b/mods/biomes/badland/textures/doors_item_badland.png differ diff --git a/mods/biomes/badland/textures/jack_o_lantern_bigeyes.png b/mods/biomes/badland/textures/jack_o_lantern_bigeyes.png new file mode 100644 index 00000000..e37de8f8 Binary files /dev/null and b/mods/biomes/badland/textures/jack_o_lantern_bigeyes.png differ diff --git a/mods/biomes/badland/textures/toadstool.png b/mods/biomes/badland/textures/toadstool.png new file mode 100644 index 00000000..c2ed472f Binary files /dev/null and b/mods/biomes/badland/textures/toadstool.png differ diff --git a/mods/biomes/biomes_leafdecay/init.lua b/mods/biomes/biomes_leafdecay/init.lua new file mode 100644 index 00000000..19d8739c --- /dev/null +++ b/mods/biomes/biomes_leafdecay/init.lua @@ -0,0 +1,58 @@ +default.register_leafdecay({ + trunks = {"badland:badland_tree"}, + leaves = { + "badland:badland_leaves", + "badland:badland_leaves_2", + "badland:badland_leaves_3", + }, + radius = 3, +}) + +default.register_leafdecay({ + trunks = { + "default:aspen_tree", + "default:tree", + }, + leaves = { + "default:aspen_leaves", + "default:apple", + "default:leaves", + "ethereal:orange", + "ethereal:orange_leaves", + "ethereal:lemon", + "ethereal:lemon_leaves", + "dorwinion:dorwinion_leaves", + "dorwinion:dorwinion_glow_leaves", + "prairie:prairie_leaves_1", + "prairie:prairie_leaves_2", + }, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"frost_land:frost_land_tree"}, + leaves = { + "frost_land:frost_land_leaves_1", + "frost_land:frost_land_leaves_2", + }, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"japaneseforest:japanese_tree"}, + leaves = { + "japaneseforest:japanese_leaves_1", + "japaneseforest:japanese_leaves_2", + "japaneseforest:japanese_leaves_3", + }, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"nightshade:nightshade_tree"}, + leaves = { + "nightshade:nightshade_leaves_1", + "nightshade:nightshade_glowin_leaves_1", + }, + radius = 3, +}) \ No newline at end of file diff --git a/mods/biomes/biomes_leafdecay/mod.conf b/mods/biomes/biomes_leafdecay/mod.conf new file mode 100644 index 00000000..567c5fe2 --- /dev/null +++ b/mods/biomes/biomes_leafdecay/mod.conf @@ -0,0 +1,3 @@ +name = biomes_leafdecay +author = EmptyStar +depends = default, ethereal, badland, dorwinion, frost_land, japaneseforest, nightshade, prairie \ No newline at end of file diff --git a/mods/biomes/description.txt b/mods/biomes/description.txt new file mode 100644 index 00000000..b78ee8ae --- /dev/null +++ b/mods/biomes/description.txt @@ -0,0 +1 @@ +Add many biomes,trees and decorative block. diff --git a/mods/biomes/dorwinion/cave.lua b/mods/biomes/dorwinion/cave.lua new file mode 100644 index 00000000..1f3ae59f --- /dev/null +++ b/mods/biomes/dorwinion/cave.lua @@ -0,0 +1,116 @@ +local mpath = minetest.get_modpath("dorwinion") + +local dorwinion_surface = { + "dorwinion:dorwinion_grass", + "dorwinion:dorwinion_brick", + "dorwinion:dorwinion_brick_cracked", + "dorwinion:dorwinion_brick_with_moss", + "dorwinion:dorwinion_brick_with_flowers", +} +local dorwinion_ceiling = { + "dorwinion:dorwinion", + "dorwinion:dorwinion_brick", + "dorwinion:dorwinion_brick_cracked", + "dorwinion:dorwinion_brick_with_moss", + "dorwinion:dorwinion_brick_with_flowers", + "everness:moss_block", +} + +minetest.register_decoration({ + deco_type = "simple", + place_on = "default:stone", + sidelen = 80, + fill_ratio = 10, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = dorwinion_surface, + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = dorwinion_surface, + sidelen = 80, + fill_ratio = 0.5125, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = "dorwinion:dorwinion_grass", + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = "default:stone", + sidelen = 80, + fill_ratio = 10, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = dorwinion_ceiling, + flags = "all_ceilings,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = dorwinion_surface, + fill_ratio = 0.00275, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + decoration = { + "dorwinion:dorwinion_leaves", + "dorwinion:dorwinion_glow_leaves", + }, + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = dorwinion_ceiling, + fill_ratio = 0.00275, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + decoration = { + "dorwinion:dorwinion_leaves", + "dorwinion:dorwinion_glow_leaves", + }, + flags = "all_ceilings", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "dorwinion:dorwinion_brick", + fill_ratio = 0.015, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + height = 2, + height_max = 3, + decoration = { + "dorwinion:dorwinion_brick", + "dorwinion:dorwinion_brick_with_flowers", + }, + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = dorwinion_surface, + fill_ratio = 0.0005, + biomes = asuna.features.cave.dorwinion, + y_max = 0, + y_min = -31000, + schematic = mpath .. "/schematics/ruins.mts", + rotation = "random", + flags = "all_floors,place_center_x,place_center_z", +}) \ No newline at end of file diff --git a/mods/biomes/dorwinion/donjon.png b/mods/biomes/dorwinion/donjon.png new file mode 100644 index 00000000..02420b89 Binary files /dev/null and b/mods/biomes/dorwinion/donjon.png differ diff --git a/mods/biomes/dorwinion/init.lua b/mods/biomes/dorwinion/init.lua new file mode 100644 index 00000000..4fda5ce9 --- /dev/null +++ b/mods/biomes/dorwinion/init.lua @@ -0,0 +1,8 @@ +local default_path = minetest.get_modpath("dorwinion") + +dofile(default_path.."/nodes.lua") +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/moreblocks.lua") +dofile(default_path.."/stairs.lua") +dofile(default_path.."/walls.lua") +dofile(default_path.."/cave.lua") diff --git a/mods/biomes/dorwinion/license.txt b/mods/biomes/dorwinion/license.txt new file mode 100644 index 00000000..c323bb29 --- /dev/null +++ b/mods/biomes/dorwinion/license.txt @@ -0,0 +1,26 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + + +---- + +The following textures are made by EmptyStar, licensed [CC0](https://creativecommons.org/publicdomain/zero/1.0/) + +- textures/dorwinion_sapling_1.png +- textures/dorwinion_sapling_2.png +- textures/dorwinion_sapling_3.png +- textures/dorwinion_sapling_4.png \ No newline at end of file diff --git a/mods/biomes/dorwinion/mapgen.lua b/mods/biomes/dorwinion/mapgen.lua new file mode 100644 index 00000000..e3204203 --- /dev/null +++ b/mods/biomes/dorwinion/mapgen.lua @@ -0,0 +1,275 @@ +local mpath = minetest.get_modpath("dorwinion") +local dpath = minetest.get_modpath("default") + +minetest.register_decoration({ + name = "dorwinion:tree_1", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 3, + schematic = mpath.."/schematics/tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "dorwinion:tree_2", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.001225, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 3, + schematic = mpath.."/schematics/tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "dorwinion:ruins", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.000222, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 2, + schematic = mpath.."/schematics/ruins.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "dorwinion:bush_1", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.015265, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 2, + schematic = mpath.."/schematics/bush_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "dorwinion:tree_3", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.001265, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 3, + schematic = mpath.."/schematics/tree_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "dorwinion:tree_4", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 3, + schematic = mpath.."/schematics/tree_4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +local did_dorwinion = minetest.get_decoration_id('dorwinion:tree_4') +minetest.set_gen_notify('decoration',{ did_dorwinion }) +did_dorwinion = 'decoration#' .. did_dorwinion + +minetest.register_on_generated(function(minp, maxp) + if maxp.y > 4 then + -- + -- Large Dorwinion Tree - fix light + -- + local gennotify = minetest.get_mapgen_object('gennotify') + for _, pos in ipairs(gennotify[did_dorwinion] or {}) do + minetest.after(0.2,function() minetest.fix_light(pos:offset(-16, -1, -16), pos:offset(16, 39, 16)) end) + end + end +end) + +minetest.register_decoration({ + name = "dorwinion:tree_5", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 3, + schematic = mpath.."/schematics/tree_5.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "dorwinion:aspen_tree", + deco_type = "schematic", + place_on = {"dorwinion:dorwinion_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"dorwinion"}, + y_max = 31000, + y_min = 3, + schematic = dpath.."/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.3, + biomes = {"dorwinion"}, + decoration = { + "default:grass_1", "default:grass_2", + "default:grass_3", "default:grass_4", + "default:grass_5", + } +}) + +--[[minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"dorwinion"}, + decoration = { + "flowers:rose", "flowers:dandelion_yellow", + "flowers:dandelion_white", "flowers:chryssanthemum_green", + "flowers:mushroom_brown", + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"dorwinion"}, + decoration = { +"flowers:dandelion_yellow", + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"dorwinion"}, + decoration = { + "flowers:dandelion_white", + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"dorwinion"}, + decoration = { +"flowers:chryssanthemum_green", + + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.01, + biomes = {"dorwinion"}, + decoration = { + "flowers:mushroom_brown", + } +})]] + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.08, + biomes = {"dorwinion"}, + decoration = { + "dorwinion:dorwinion_leaves", + } +}) + +--[[minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"dorwinion"}, + decoration = { +"butterflies:butterfly_white", "butterflies:butterfly_red", "butterflies:butterfly_violet", + } +})]] + +--[[minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"dorwinion"}, + decoration = { +"japaneseforest:red_firefly", "japaneseforest:green_firefly", "fireflies:firefly", + } +})]] + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"dorwinion:dorwinion_grass", "default:aspen_tree"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"dorwinion"}, + decoration = { +"dorwinion:dorwinion_glow_leaves", + } +}) + + -- dorwinion + + minetest.register_ore({ + ore_type = "blob", + ore = "dorwinion:dorwinion", + wherein = {"default:dirt"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = -50, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + biomes = {"dorwinion"}, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) diff --git a/mods/biomes/dorwinion/mod.conf b/mods/biomes/dorwinion/mod.conf new file mode 100644 index 00000000..04dca119 --- /dev/null +++ b/mods/biomes/dorwinion/mod.conf @@ -0,0 +1,7 @@ + +author = Atlante +name = dorwinion +description = Adds a Dorwinion biome with a few more objects. +title = Dorwinion +depends = default, japaneseforest, prairie +optional_depends = stairs \ No newline at end of file diff --git a/mods/biomes/dorwinion/moreblocks.lua b/mods/biomes/dorwinion/moreblocks.lua new file mode 100644 index 00000000..b46df066 --- /dev/null +++ b/mods/biomes/dorwinion/moreblocks.lua @@ -0,0 +1,50 @@ +-----------------Moreblock +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("dorwinion_brick", "stone", "dorwinion:dorwinion_brick", { + description = "Dorwinion Brick", + tiles = {"dorwinion_brick.png"}, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("dorwinion", "stone", "dorwinion:dorwinion", { + description = "Dorwinion", + tiles = {"dorwinion.png"}, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("dorwinion_carved", "stone", "dorwinion:dorwinion_carved", { + description = "Dorwinion Carved", + tiles = {"dorwinion_carved.png"}, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("dorwinion_brick_cracked", "stone", "dorwinion:dorwinion_brick_cracked", { + description = "Dorwinion Brick Cracked", + tiles = {"dorwinion_brick_cracked.png"}, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("dorwinion_brick_with_flowers", "stone", "dorwinion:dorwinion_brick_with_flowers", { + description = "Dorwinion Brick With Flowers", + tiles = {"dorwinion_brick_with_flowers.png"}, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("dorwinion_brick_with_moss", "stone", "dorwinion:dorwinion_brick_with_moss", { + description = "Dorwinion Brick With Moss", + tiles = {"dorwinion_brick_with_moss.png"}, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + + + + +end diff --git a/mods/biomes/dorwinion/nodes.lua b/mods/biomes/dorwinion/nodes.lua new file mode 100644 index 00000000..ed3040c5 --- /dev/null +++ b/mods/biomes/dorwinion/nodes.lua @@ -0,0 +1,269 @@ +minetest.register_node("dorwinion:dorwinion_brick", { + description = "Dorwninion Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dorwinion_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "dorwinion:dorwinion_brick 4", + recipe = { + {"dorwinion:dorwinion", "dorwinion:dorwinion"}, + {"dorwinion:dorwinion", "dorwinion:dorwinion"}, + } +}) +minetest.register_node("dorwinion:dorwinion_brick_with_flowers", { + description = "Dorwninion Brick With Flowers", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dorwinion_brick_with_flowers.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) +minetest.register_craft({ + output = "dorwinion:dorwinion_brick_with_flowers 2", + recipe = { + {"dorwinion:dorwinion_brick", "flowers:rose"}, + {"dorwinion:dorwinion_brick", "flowers:rose"}, + } +}) + +minetest.register_node("dorwinion:dorwinion_brick_with_moss", { + description = "Dorwninion Brick With Moss", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dorwinion_brick_with_moss.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) +minetest.register_craft({ + output = "dorwinion:dorwinion_brick_with_moss 3", + recipe = { + {"dorwinion:dorwinion_brick", "bucket:bucket_water"}, + {"dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick"}, + } +}) + +minetest.register_node("dorwinion:dorwinion_carved", { + description = "Dorwninion Carved", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dorwinion_carved.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) +minetest.register_craft({ + output = "dorwinion:dorwinion_carved 4", + recipe = { + {"dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick_cracked"}, + {"dorwinion:dorwinion_brick_cracked", "dorwinion:dorwinion_brick"}, + } +}) + +minetest.register_node("dorwinion:dorwinion_brick_cracked", { + description = "Dorwninion Brick Cracked", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dorwinion_brick_cracked.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) +minetest.register_craft({ + output = "dorwinion:dorwinion_brick_cracked 4", + recipe = { + {"dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick"}, + {"dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick"}, + } +}) + +minetest.register_node("dorwinion:dorwinion", { + description = "Dorwninion", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dorwinion.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("dorwinion:dorwinion_leaves", { + description = "Dorwinion Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"dorwinion_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"dorwinion:dorwinion_sapling_1"}, rarity = 80}, + {items = {"dorwinion:dorwinion_sapling_2"}, rarity = 80}, + {items = {"dorwinion:dorwinion_sapling_3"}, rarity = 80}, + {items = {"dorwinion:dorwinion_sapling_4"}, rarity = 80}, + {items = {"dorwinion:dorwinion_leaves"}} -- ~95% chance for leaves + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("dorwinion:dorwinion_glow_leaves", { + description = "Dorwinion Glowing Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"dorwinion_glow_leaves.png"}, + paramtype = "light", + light_source = 10, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"dorwinion:dorwinion_glow_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("dorwinion:dorwinion_grass", { + description = "Dorwinion Grass", + tiles = {"dorwinion_grass.png", "dorwinion.png", + {name = "dorwinion.png^dorwinion_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "dorwinion:dorwinion", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +local modpath = minetest.get_modpath("dorwinion") +local leaves = "dorwinion:dorwinion_leaves" +local stick = "default:stick" + +local trees = { + { + name = "Short Aspen", + recipe = { + {leaves, leaves, leaves}, + {leaves, stick, leaves}, + {"", stick, ""}, + }, + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-3}, modpath.."/schematics/tree_2.mts", "0", nil, false) + end, + }, + { + name = "Tall Aspen", + recipe = { + {leaves, leaves, leaves}, + {stick, leaves, stick}, + {"", stick, ""}, + }, + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-12, y = pos.y, z = pos.z-12}, modpath.."/schematics/tree_4.mts", "0", nil, false) + end, + }, + { + name = "Short Oak", + recipe = { + {"", leaves, ""}, + {leaves, leaves, leaves}, + {"", stick, ""}, + }, + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-5, y = pos.y, z = pos.z-5}, modpath.."/schematics/tree_3.mts", "0", nil, false) + end, + }, + { + name = "Tall Oak", + recipe = { + {"", leaves, ""}, + {leaves, stick, leaves}, + {"", stick, ""}, + }, + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/tree_5.mts", "0", nil, false) + end, + }, +} + +local mod_bonemeal = minetest.get_modpath("bonemeal") + +for index,def in ipairs(trees) do + local sapling = "dorwinion:dorwinion_sapling_" .. index + local image = "dorwinion_sapling_" .. index .. ".png" + + -- Register sapling + minetest.register_node(sapling, { + description = def.name .. " Dorwinion Sapling", + drawtype = "plantlike", + tiles = {image}, + inventory_image = image, + wield_image = image, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = function(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + else + minetest.remove_node(pos) + def.grow_function(pos) + end + end, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + sapling, + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + -- Register sapling crafting recipe + minetest.register_craft({ + output = sapling, + recipe = def.recipe, + }) + + -- Add bonemeal integration if supported + if mod_bonemeal then + bonemeal:add_sapling({ + {sapling, def.grow_function, "soil"}, + }) + end +end diff --git a/mods/biomes/dorwinion/schematics/bush_1.mts b/mods/biomes/dorwinion/schematics/bush_1.mts new file mode 100644 index 00000000..5c63278b Binary files /dev/null and b/mods/biomes/dorwinion/schematics/bush_1.mts differ diff --git a/mods/biomes/dorwinion/schematics/dorwinion.mts b/mods/biomes/dorwinion/schematics/dorwinion.mts new file mode 100644 index 00000000..ea9ab023 Binary files /dev/null and b/mods/biomes/dorwinion/schematics/dorwinion.mts differ diff --git a/mods/biomes/dorwinion/schematics/ruins.mts b/mods/biomes/dorwinion/schematics/ruins.mts new file mode 100644 index 00000000..77b0a9e3 Binary files /dev/null and b/mods/biomes/dorwinion/schematics/ruins.mts differ diff --git a/mods/biomes/dorwinion/schematics/tree_1.mts b/mods/biomes/dorwinion/schematics/tree_1.mts new file mode 100644 index 00000000..effb5b8c Binary files /dev/null and b/mods/biomes/dorwinion/schematics/tree_1.mts differ diff --git a/mods/biomes/dorwinion/schematics/tree_2.mts b/mods/biomes/dorwinion/schematics/tree_2.mts new file mode 100644 index 00000000..1fcaf82c Binary files /dev/null and b/mods/biomes/dorwinion/schematics/tree_2.mts differ diff --git a/mods/biomes/dorwinion/schematics/tree_3.mts b/mods/biomes/dorwinion/schematics/tree_3.mts new file mode 100644 index 00000000..c6d686df Binary files /dev/null and b/mods/biomes/dorwinion/schematics/tree_3.mts differ diff --git a/mods/biomes/dorwinion/schematics/tree_4.mts b/mods/biomes/dorwinion/schematics/tree_4.mts new file mode 100644 index 00000000..5f81daac Binary files /dev/null and b/mods/biomes/dorwinion/schematics/tree_4.mts differ diff --git a/mods/biomes/dorwinion/schematics/tree_5.mts b/mods/biomes/dorwinion/schematics/tree_5.mts new file mode 100644 index 00000000..2c1bf301 Binary files /dev/null and b/mods/biomes/dorwinion/schematics/tree_5.mts differ diff --git a/mods/biomes/dorwinion/stairs.lua b/mods/biomes/dorwinion/stairs.lua new file mode 100644 index 00000000..744f370e --- /dev/null +++ b/mods/biomes/dorwinion/stairs.lua @@ -0,0 +1,56 @@ +if minetest.get_modpath("stairs") then + stairs.register_stair_and_slab( + "dorwinion", + "dorwinion:dorwinion", + {cracky = 3}, + {"dorwinion.png"}, + "Dorwinion Stair", + "Dorwinion Slab", + default.node_sound_stone_defaults(), + true + ) + + stairs.register_stair_and_slab( + "dorwinion_brick", + "dorwinion:dorwinion_brick", + {cracky = 3}, + {"dorwinion_brick.png"}, + "Dorwinion Brick Stair", + "Dorwinion Brick Slab", + default.node_sound_stone_defaults(), + true + ) + + stairs.register_stair_and_slab( + "dorwinion_brick_with_flowers", + "dorwinion:dorwinion_brick_with_flowers", + {cracky = 3}, + {"dorwinion_brick_with_flowers.png"}, + "Dorwinion Brick With Flowers Stair", + "Dorwinion Brick With Flowers Slab", + default.node_sound_stone_defaults(), + true + ) + + stairs.register_stair_and_slab( + "dorwinion_brick_with_moss", + "dorwinion:dorwinion_brick_with_moss", + {cracky = 3}, + {"dorwinion_brick_with_moss.png"}, + "Dorwinion Brick With Moss Stair", + "Dorwinion Brick With Moss Slab", + default.node_sound_stone_defaults(), + true + ) + + stairs.register_stair_and_slab( + "dorwinion_carved", + "dorwinion:dorwinion_carved", + {cracky = 3}, + {"dorwinion_carved.png"}, + "Dorwinion Carved Stair", + "Dorwinion Carved Slab", + default.node_sound_stone_defaults(), + true + ) +end \ No newline at end of file diff --git a/mods/biomes/dorwinion/textures/dorwinion.png b/mods/biomes/dorwinion/textures/dorwinion.png new file mode 100644 index 00000000..3bf246b9 Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_brick.png b/mods/biomes/dorwinion/textures/dorwinion_brick.png new file mode 100644 index 00000000..34d0d8fb Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_brick.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_brick_cracked.png b/mods/biomes/dorwinion/textures/dorwinion_brick_cracked.png new file mode 100644 index 00000000..0eb61493 Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_brick_cracked.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_brick_with_flowers.png b/mods/biomes/dorwinion/textures/dorwinion_brick_with_flowers.png new file mode 100644 index 00000000..09ea03f6 Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_brick_with_flowers.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_brick_with_moss.png b/mods/biomes/dorwinion/textures/dorwinion_brick_with_moss.png new file mode 100644 index 00000000..6e2e071a Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_brick_with_moss.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_carved.png b/mods/biomes/dorwinion/textures/dorwinion_carved.png new file mode 100644 index 00000000..94c4989e Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_carved.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_glow_leaves.png b/mods/biomes/dorwinion/textures/dorwinion_glow_leaves.png new file mode 100644 index 00000000..dc5a858a Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_glow_leaves.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_grass.png b/mods/biomes/dorwinion/textures/dorwinion_grass.png new file mode 100644 index 00000000..3f0d6095 Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_grass.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_grass_side.png b/mods/biomes/dorwinion/textures/dorwinion_grass_side.png new file mode 100644 index 00000000..038fa697 Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_grass_side.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_leaves.png b/mods/biomes/dorwinion/textures/dorwinion_leaves.png new file mode 100644 index 00000000..0127872f Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_leaves.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_sapling_1.png b/mods/biomes/dorwinion/textures/dorwinion_sapling_1.png new file mode 100644 index 00000000..fa576bfc Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_sapling_1.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_sapling_2.png b/mods/biomes/dorwinion/textures/dorwinion_sapling_2.png new file mode 100644 index 00000000..d09e9cc7 Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_sapling_2.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_sapling_3.png b/mods/biomes/dorwinion/textures/dorwinion_sapling_3.png new file mode 100644 index 00000000..1e2555ef Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_sapling_3.png differ diff --git a/mods/biomes/dorwinion/textures/dorwinion_sapling_4.png b/mods/biomes/dorwinion/textures/dorwinion_sapling_4.png new file mode 100644 index 00000000..6e26b1ce Binary files /dev/null and b/mods/biomes/dorwinion/textures/dorwinion_sapling_4.png differ diff --git a/mods/biomes/dorwinion/walls.lua b/mods/biomes/dorwinion/walls.lua new file mode 100644 index 00000000..431b1080 --- /dev/null +++ b/mods/biomes/dorwinion/walls.lua @@ -0,0 +1,40 @@ +if minetest.get_modpath("walls") then + + +walls.register(":walls:dorwinion_brick", "Dorwinion Brick Wall", "dorwinion_brick.png", + "dorwinion:dorwinion_brick", default.node_sound_stone_defaults()) + +walls.register(":walls:dorwinion_carved", "Dorwinion Carved Wall", "dorwinion_carved.png", + "dorwinion:dorwinion_carved", default.node_sound_stone_defaults()) + +walls.register(":walls:dorwinion_brick_with_moss", "Dorwinion Brick With Moss Wall", "dorwinion_brick_with_moss.png", + "dorwinion:dorwinion_brick_with_moss", default.node_sound_stone_defaults()) + + +end + +minetest.register_craft({ + output = "walls:dorwinion_brick 6", + recipe = { + {"dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick"}, + {"dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick", "dorwinion:dorwinion_brick"}, + } +}) + +minetest.register_craft({ + output = "walls:dorwinion_carved 6", + recipe = { + {"dorwinion:dorwinion_carved", "dorwinion:dorwinion_carved", "dorwinion:dorwinion_carved"}, + {"dorwinion:dorwinion_carved", "dorwinion:dorwinion_carved", "dorwinion:dorwinion_carved"}, + } +}) + +minetest.register_craft({ + output = "walls:dorwinion_brick_with_moss 6", + recipe = { + {"dorwinion:dorwinion_brick_with_moss", "dorwinion:dorwinion_brick_with_moss", "dorwinion:dorwinion_brick_with_moss"}, + {"dorwinion:dorwinion_brick_with_moss", "dorwinion:dorwinion_brick_with_moss", "dorwinion:dorwinion_brick_with_moss"}, + } +}) + + diff --git a/mods/biomes/frost_land/README.md b/mods/biomes/frost_land/README.md new file mode 100644 index 00000000..35d27232 --- /dev/null +++ b/mods/biomes/frost_land/README.md @@ -0,0 +1,2 @@ +# frost_land +A simple and pleasant little mod, which adds a Frost Land biome with a few more objects. diff --git a/mods/biomes/frost_land/crafting.lua b/mods/biomes/frost_land/crafting.lua new file mode 100644 index 00000000..a61cfe1b --- /dev/null +++ b/mods/biomes/frost_land/crafting.lua @@ -0,0 +1,15 @@ +------------Crafting +minetest.register_craft({ + output = "frost_land:frost_land_wood 4", + recipe = { + {"frost_land:frost_land_tree"}, + } +}) + +minetest.register_craft({ + output = "frost_land:frost_land_trapdoor 2", + recipe = { + {"nightshade:nightshade_wood", "nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + {"nightshade:nightshade_wood", "nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + } +}) \ No newline at end of file diff --git a/mods/biomes/frost_land/fireflies.lua b/mods/biomes/frost_land/fireflies.lua new file mode 100644 index 00000000..dbd09dda --- /dev/null +++ b/mods/biomes/frost_land/fireflies.lua @@ -0,0 +1,343 @@ + +-------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("frost_land:blue_firefly", { + description = "Blue Firefly", + drawtype = "plantlike", + tiles = {{ + name = "frost_land_blue_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "frost_land_blue_firefly.png", + wield_image = "frost_land_blue_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:blue_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "frost_land:hidden_blue_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("frost_land:hidden_blue_firefly", { + description = "Hidden Blue Firefly", + drawtype = "airlike", + inventory_image = "frost_land_blue_firefly.png^default_invisible_node_overlay.png", + wield_image = "frost_land_blue_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:hidden_blue_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "frost_land:blue_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("frost_land:pink_firefly", { + description = "Pink Firefly", + drawtype = "plantlike", + tiles = {{ + name = "frost_land_pink_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "frost_land_pink_firefly.png", + wield_image = "frost_land_pink_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:pink_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "frost_land:hidden_pink_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("frost_land:hidden_pink_firefly", { + description = "Hidden Pink Firefly", + drawtype = "airlike", + inventory_image = "frost_land_pink_firefly.png^default_invisible_node_overlay.png", + wield_image = "frost_land_pink_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:hidden_pink_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "frost_land:pink_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("frost_land:cyan_firefly", { + description = "Cyan Firefly", + drawtype = "plantlike", + tiles = {{ + name = "frost_land_cyan_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "frost_land_cyan_firefly.png", + wield_image = "frost_land_cyan_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:cyan_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "frost_land:hidden_cyan_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("frost_land:hidden_cyan_firefly", { + description = "Hidden Cyan Firefly", + drawtype = "airlike", + inventory_image = "frost_land_cyan_firefly.png^default_invisible_node_overlay.png", + wield_image = "frost_land_cyan_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:hidden_cyan_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "frost_land:cyan_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +------------------------------------------------------------------------------------------------------------------------------ +minetest.register_node("frost_land:white_firefly", { + description = "White Firefly", + drawtype = "plantlike", + tiles = {{ + name = "frost_land_white_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "frost_land_white_firefly.png", + wield_image = "frost_land_white_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:white_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "frost_land:hidden_white_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("frost_land:hidden_white_firefly", { + description = "Hidden White Firefly", + drawtype = "airlike", + inventory_image = "frost_land_white_firefly.png^default_invisible_node_overlay.png", + wield_image = "frost_land_white_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "frost_land:hidden_white_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "frost_land:white_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:snow"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"frost_land"}, + decoration = { + "frost_land:white_firefly", "frost_land:cyan_firefly", "frost_land:blue_firefly", "frost_land:pink_firefly", + } +}) diff --git a/mods/biomes/frost_land/frost_land.png b/mods/biomes/frost_land/frost_land.png new file mode 100644 index 00000000..480cfff8 Binary files /dev/null and b/mods/biomes/frost_land/frost_land.png differ diff --git a/mods/biomes/frost_land/init.lua b/mods/biomes/frost_land/init.lua new file mode 100644 index 00000000..cf5d8384 --- /dev/null +++ b/mods/biomes/frost_land/init.lua @@ -0,0 +1,7 @@ +local default_path = minetest.get_modpath("frost_land") + +dofile(default_path.."/nodes.lua") +dofile(default_path.."/mapgen.lua") +--dofile(default_path.."/fireflies.lua") +dofile(default_path.."/moreblocks.lua") +dofile(default_path.."/crafting.lua") diff --git a/mods/biomes/frost_land/license.txt b/mods/biomes/frost_land/license.txt new file mode 100644 index 00000000..af3dc37b --- /dev/null +++ b/mods/biomes/frost_land/license.txt @@ -0,0 +1,18 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + + diff --git a/mods/biomes/frost_land/mapgen.lua b/mods/biomes/frost_land/mapgen.lua new file mode 100644 index 00000000..7b89c3b7 --- /dev/null +++ b/mods/biomes/frost_land/mapgen.lua @@ -0,0 +1,158 @@ + -- Frost Land + + minetest.register_biome(asuna.biomes.frost_land.generate_definition()) + +minetest.register_decoration({ + name = "frost_land:frost_tree_1", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.001265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/frost_tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:frost_tree_2", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.001265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/frost_tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:frost_tree_3", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.001265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/frost_tree_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + + +minetest.register_decoration({ + name = "frost_land:ice_1", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/ice_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:ice_2", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/ice_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:ice_3", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/ice_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:tree_4", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/tree_4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:tree_5", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002265, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/tree_5.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:igloo", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.000165, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/igloo.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "frost_land:bush", + deco_type = "schematic", + place_on = {"frost_land:frost_land_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.002165, + biomes = {"frost_land"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("frost_land").."/schematics/bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + + diff --git a/mods/biomes/frost_land/mod.conf b/mods/biomes/frost_land/mod.conf new file mode 100644 index 00000000..12789918 --- /dev/null +++ b/mods/biomes/frost_land/mod.conf @@ -0,0 +1,8 @@ + +author = Atlante +name = frost_land + +description = Adds a frost_land biome with a few more objects. +title = Frost Land +depends = default +optional_depends = moreblocks, bonemeal \ No newline at end of file diff --git a/mods/biomes/frost_land/moreblocks.lua b/mods/biomes/frost_land/moreblocks.lua new file mode 100644 index 00000000..72173826 --- /dev/null +++ b/mods/biomes/frost_land/moreblocks.lua @@ -0,0 +1,21 @@ +-----------------Moreblock +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("frost_land_wood", "wood", "frost_land:frost_land_wood", { + description = "Frost Land Wood", + tiles = {"frost_land_wood.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("frost_land_tree", "tree", "frost_land:frost_land_tree", { + description = "Japanese Tree", + tiles = {"frost_land_tree_top.png", "frost_land_tree_top.png", + "frost_land_tree.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + + +end diff --git a/mods/biomes/frost_land/nodes.lua b/mods/biomes/frost_land/nodes.lua new file mode 100644 index 00000000..36324f87 --- /dev/null +++ b/mods/biomes/frost_land/nodes.lua @@ -0,0 +1,210 @@ +local modpath = minetest.get_modpath("frost_land") + +minetest.register_node("frost_land:frost_land_grass", { + description = "Frost Land Grass", + tiles = {"frost_land_grass.png", "default_dirt.png", + {name = "default_dirt.png^frost_land_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("frost_land:frost_land_wood", { + description = "Frost Land Wood", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"frost_land_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("frost_land:frost_land_tree", { + description = "Frost Land Tree", + tiles = {"frost_land_tree_top.png", "frost_land_tree_top.png", + "frost_land_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +doors.register_trapdoor("frost_land:frost_land_trapdoor", { + description = "Frost Land Trapdoor", + inventory_image = "frost_land_trapdoor.png", + wield_image = "frost_land_trapdoor.png", + tile_front = "frost_land_trapdoor.png", + tile_side = "frost_land_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + + +doors.register("frost_land_door", { + tiles = {{ name = "doors_frost_land_door.png", backface_culling = true }}, + description = "Frost Land Door", + inventory_image = "doors_item_frost_land.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"frost_land:frost_land_wood", "frost_land:frost_land_wood"}, + {"frost_land:frost_land_wood", "frost_land:frost_land_wood"}, + {"frost_land:frost_land_wood", "frost_land:frost_land_wood"}, + } +}) + +stairs.register_stair_and_slab( + "frost_land_wood", + "frost_land:frost_land_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"frost_land_wood.png"}, + "Frost Land Wood Stair", + "Frost Land Wood Slab", + default.node_sound_wood_defaults(), + true +) + +doors.register_fencegate("frost_land:gate_frost_land", { + description = "Frost Land Wood Fence Gate", + texture = "frost_land_wood.png", + material = "frost_land:frost_land_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +default.register_fence("frost_land:fence_frost_land_wood", { + description = "Frost Land Wood Fence", + texture = "frost_land_wood.png", + inventory_image = "frost_land_fence_overlay.png^frost_land_wood.png^" .. + "frost_land_fence_overlay.png^[makealpha:255,126,126", + wield_image = "frost_land_fence_overlay.png^frost_land_wood.png^" .. + "frost_land_fence_overlay.png^[makealpha:255,126,126", + material = "frost_land:frost_land_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("frost_land:fence_rail_frost_land_wood", { + description = "Frost Land Wood Fence Rail", + texture = "frost_land_wood.png", + inventory_image = "frost_land_fence_rail_overlay.png^frost_land_wood.png^" .. + "frost_land_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "frost_land_fence_rail_overlay.png^frost_land_wood.png^" .. + "frost_land_fence_rail_overlay.png^[makealpha:255,126,126", + material = "frost_land:frost_land_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +--[[ + Trees +]] + +local trees = { + { + name = "Frigid", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/frost_tree_1.mts", "random", nil, false) + end, + }, + { + name = "Icy", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/tree_4.mts", "random", nil, false) + end, + }, +} + +for index,def in ipairs(trees) do + local sapling = "frost_land:frost_land_sapling_" .. index + local image = "frost_land_sapling_" .. index .. ".png" + local leaves = "frost_land:frost_land_leaves_" .. index + + -- Register leaves + minetest.register_node("frost_land:frost_land_leaves_" .. index, { + description = def.name .. " Frost Land Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"frost_leaves_" .. index .. ".png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {sapling}, rarity = 20}, + {items = {leaves}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + -- Register sapling + minetest.register_node(sapling, { + description = def.name .. " Frost Land Sapling", + drawtype = "plantlike", + tiles = {image}, + inventory_image = image, + wield_image = image, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = function(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + else + def.grow_function(pos) + end + end, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + sapling, + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + -- Register sapling crafting recipe + minetest.register_craft({ + output = sapling, + recipe = { + {"", leaves, ""}, + {leaves, "default:stick", leaves} + }, + }) + + -- Add bonemeal integration if supported + if minetest.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {sapling, def.grow_function, "soil"}, + }) + end +end diff --git a/mods/biomes/frost_land/schematics/bush.mts b/mods/biomes/frost_land/schematics/bush.mts new file mode 100644 index 00000000..f2cb8cfd Binary files /dev/null and b/mods/biomes/frost_land/schematics/bush.mts differ diff --git a/mods/biomes/frost_land/schematics/frost_tree_1.mts b/mods/biomes/frost_land/schematics/frost_tree_1.mts new file mode 100644 index 00000000..c2a6802e Binary files /dev/null and b/mods/biomes/frost_land/schematics/frost_tree_1.mts differ diff --git a/mods/biomes/frost_land/schematics/frost_tree_2.mts b/mods/biomes/frost_land/schematics/frost_tree_2.mts new file mode 100644 index 00000000..2fbe3c8d Binary files /dev/null and b/mods/biomes/frost_land/schematics/frost_tree_2.mts differ diff --git a/mods/biomes/frost_land/schematics/frost_tree_3.mts b/mods/biomes/frost_land/schematics/frost_tree_3.mts new file mode 100644 index 00000000..829339f6 Binary files /dev/null and b/mods/biomes/frost_land/schematics/frost_tree_3.mts differ diff --git a/mods/biomes/frost_land/schematics/ice_1.mts b/mods/biomes/frost_land/schematics/ice_1.mts new file mode 100644 index 00000000..fb7dc7ae Binary files /dev/null and b/mods/biomes/frost_land/schematics/ice_1.mts differ diff --git a/mods/biomes/frost_land/schematics/ice_2.mts b/mods/biomes/frost_land/schematics/ice_2.mts new file mode 100644 index 00000000..459be3d9 Binary files /dev/null and b/mods/biomes/frost_land/schematics/ice_2.mts differ diff --git a/mods/biomes/frost_land/schematics/ice_3.mts b/mods/biomes/frost_land/schematics/ice_3.mts new file mode 100644 index 00000000..a5aac59e Binary files /dev/null and b/mods/biomes/frost_land/schematics/ice_3.mts differ diff --git a/mods/biomes/frost_land/schematics/igloo.mts b/mods/biomes/frost_land/schematics/igloo.mts new file mode 100644 index 00000000..0765d580 Binary files /dev/null and b/mods/biomes/frost_land/schematics/igloo.mts differ diff --git a/mods/biomes/frost_land/schematics/tree_4.mts b/mods/biomes/frost_land/schematics/tree_4.mts new file mode 100644 index 00000000..c301fe20 Binary files /dev/null and b/mods/biomes/frost_land/schematics/tree_4.mts differ diff --git a/mods/biomes/frost_land/schematics/tree_5.mts b/mods/biomes/frost_land/schematics/tree_5.mts new file mode 100644 index 00000000..6cb41998 Binary files /dev/null and b/mods/biomes/frost_land/schematics/tree_5.mts differ diff --git a/mods/biomes/frost_land/textures/doors_frost_land_door.png b/mods/biomes/frost_land/textures/doors_frost_land_door.png new file mode 100644 index 00000000..d252c939 Binary files /dev/null and b/mods/biomes/frost_land/textures/doors_frost_land_door.png differ diff --git a/mods/biomes/frost_land/textures/doors_item_frost_land.png b/mods/biomes/frost_land/textures/doors_item_frost_land.png new file mode 100644 index 00000000..2a796e24 Binary files /dev/null and b/mods/biomes/frost_land/textures/doors_item_frost_land.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_blue_firefly.png b/mods/biomes/frost_land/textures/frost_land_blue_firefly.png new file mode 100644 index 00000000..20ddbdc3 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_blue_firefly.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_blue_firefly_animated.png b/mods/biomes/frost_land/textures/frost_land_blue_firefly_animated.png new file mode 100644 index 00000000..64956972 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_blue_firefly_animated.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_cyan_firefly.png b/mods/biomes/frost_land/textures/frost_land_cyan_firefly.png new file mode 100644 index 00000000..b9dc98c1 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_cyan_firefly.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_cyan_firefly_animated.png b/mods/biomes/frost_land/textures/frost_land_cyan_firefly_animated.png new file mode 100644 index 00000000..ffb20a78 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_cyan_firefly_animated.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_fence_overlay.png b/mods/biomes/frost_land/textures/frost_land_fence_overlay.png new file mode 100644 index 00000000..a3e65499 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_fence_overlay.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_fence_rail_overlay.png b/mods/biomes/frost_land/textures/frost_land_fence_rail_overlay.png new file mode 100644 index 00000000..234573ec Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_fence_rail_overlay.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_grass.png b/mods/biomes/frost_land/textures/frost_land_grass.png new file mode 100644 index 00000000..2fc1faec Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_grass.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_grass_side.png b/mods/biomes/frost_land/textures/frost_land_grass_side.png new file mode 100644 index 00000000..ae66f9a1 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_grass_side.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_pink_firefly.png b/mods/biomes/frost_land/textures/frost_land_pink_firefly.png new file mode 100644 index 00000000..8dc82853 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_pink_firefly.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_pink_firefly_animated.png b/mods/biomes/frost_land/textures/frost_land_pink_firefly_animated.png new file mode 100644 index 00000000..360f42b6 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_pink_firefly_animated.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_sapling.png b/mods/biomes/frost_land/textures/frost_land_sapling.png new file mode 100644 index 00000000..2e07c652 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_sapling.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_sapling_1.png b/mods/biomes/frost_land/textures/frost_land_sapling_1.png new file mode 100644 index 00000000..2e07c652 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_sapling_1.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_sapling_2.png b/mods/biomes/frost_land/textures/frost_land_sapling_2.png new file mode 100644 index 00000000..aefd96b5 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_sapling_2.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_trapdoor.png b/mods/biomes/frost_land/textures/frost_land_trapdoor.png new file mode 100644 index 00000000..3544745f Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_trapdoor.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_trapdoor_side.png b/mods/biomes/frost_land/textures/frost_land_trapdoor_side.png new file mode 100644 index 00000000..81c2d901 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_trapdoor_side.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_tree.png b/mods/biomes/frost_land/textures/frost_land_tree.png new file mode 100644 index 00000000..8136895f Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_tree.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_tree_top.png b/mods/biomes/frost_land/textures/frost_land_tree_top.png new file mode 100644 index 00000000..05a6025f Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_tree_top.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_white_firefly.png b/mods/biomes/frost_land/textures/frost_land_white_firefly.png new file mode 100644 index 00000000..4cf54b7f Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_white_firefly.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_white_firefly_animated.png b/mods/biomes/frost_land/textures/frost_land_white_firefly_animated.png new file mode 100644 index 00000000..43f8b92b Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_white_firefly_animated.png differ diff --git a/mods/biomes/frost_land/textures/frost_land_wood.png b/mods/biomes/frost_land/textures/frost_land_wood.png new file mode 100644 index 00000000..d1434c78 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_land_wood.png differ diff --git a/mods/biomes/frost_land/textures/frost_leaves_1.png b/mods/biomes/frost_land/textures/frost_leaves_1.png new file mode 100644 index 00000000..2b050e30 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_leaves_1.png differ diff --git a/mods/biomes/frost_land/textures/frost_leaves_2.png b/mods/biomes/frost_land/textures/frost_leaves_2.png new file mode 100644 index 00000000..e4ec0cb4 Binary files /dev/null and b/mods/biomes/frost_land/textures/frost_leaves_2.png differ diff --git a/mods/biomes/island.png b/mods/biomes/island.png new file mode 100644 index 00000000..b08b42c4 Binary files /dev/null and b/mods/biomes/island.png differ diff --git a/mods/biomes/japaneseforest/README.md b/mods/biomes/japaneseforest/README.md new file mode 100644 index 00000000..15a795bc --- /dev/null +++ b/mods/biomes/japaneseforest/README.md @@ -0,0 +1,2 @@ +# japaneseforest +A simple and pleasant little mod, which adds a japanese biome with a few more objects. And 3 new tree diff --git a/mods/biomes/japaneseforest/bonemeal.lua b/mods/biomes/japaneseforest/bonemeal.lua new file mode 100644 index 00000000..a5ffaa3d --- /dev/null +++ b/mods/biomes/japaneseforest/bonemeal.lua @@ -0,0 +1,12 @@ +if minetest.get_modpath("bonemeal") then + +bonemeal:add_crop({ + {"japaneseforest:sashimi_", 8, "japaneseforest:seed_sashimi"}, +}) +bonemeal:add_sapling({ + {"japaneseforest:japanese_sapling", grow_new_japanese_tree_2, "soil"}, +}) + bonemeal:add_deco({ + {"japaneseforest:japanese_dirt_with_grass", {"default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}, {}} + }) +end diff --git a/mods/biomes/japaneseforest/crafting.lua b/mods/biomes/japaneseforest/crafting.lua new file mode 100644 index 00000000..b2f4be43 --- /dev/null +++ b/mods/biomes/japaneseforest/crafting.lua @@ -0,0 +1,123 @@ +------------Crafting +minetest.register_craft({ + output = "japaneseforest:japanese_wood 4", + recipe = { + {"japaneseforest:japanese_tree"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:japanese_wood 4", + recipe = { + {"japaneseforest:japanese_tree"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:japanese_tatami 2", + recipe = { + {"japaneseforest:mud", "bambooforest:fiber_bamboo"}, + {"japaneseforest:japanese_wood", "bambooforest:fiber_bamboo"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:sashimi_brick 2", + recipe = { + {"default:brick", "japaneseforest:sashimi_cooked"}, + {"japaneseforest:sashimi_cooked", "japaneseforest:sashimi_cooked"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:tatami_simple 2", + recipe = { + {"japaneseforest:mud", "bambooforest:fiber_bamboo"}, + {"japaneseforest:japanese_wood", "japaneseforest:japanese_wood"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:japanese_thin_wall 2", + recipe = { + {"japaneseforest:japanese_wood", "bambooforest:fiber_bamboo"}, + {"bambooforest:fiber_bamboo", "bambooforest:fiber_bamboo"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:japanese_trapdoor 2", + recipe = { + {"bambooforest:fiber_bamboo", "japaneseforest:japanese_wood", "bambooforest:fiber_bamboo"}, + {"japaneseforest:japanese_wood", "bambooforest:fiber_bamboo", "japaneseforest:japanese_wood"}, + {"", "", ""}, + } +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 3, + output = "japaneseforest:sashimi_cooked", + recipe = "japaneseforest:sashimi" +}) +minetest.register_craft({ + type = "cooking", + cooktime = 3, + output = "japaneseforest:racine_cooked", + recipe = "japaneseforest:racine" +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 20, + output = "japaneseforest:dark_brick_cooked 2", + recipe = "japaneseforest:dark_brick" +}) + +minetest.register_craft({ + output = "japaneseforest:dark_brick 2", + recipe = { + {"default:brick", "default:coal_lump"}, + {"dye:black", "default:brick"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:mud 2", + recipe = { + {"japaneseforest:sashimi", "default:sandstone"}, + {"japaneseforest:sashimi", "japaneseforest:sashimi"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:mud_block 4", + recipe = { + {"japaneseforest:mud", "japaneseforest:mud"}, + {"japaneseforest:mud", "japaneseforest:mud"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:mud_brick 4", + recipe = { + {"japaneseforest:mud", "default:brick"}, + {"japaneseforest:mud", "japaneseforest:mud"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:japanese_lamp 2", + recipe = { + {"bambooforest:fiber_bamboo", "japaneseforest:japanese_wood"}, + {"default:paper", "default:torch"}, + } +}) + +minetest.register_craft({ + output = "japaneseforest:truel", + recipe = { + {"japaneseforest:dark_brick_cooked", "default:brick"}, + {"japaneseforest:dark_brick_cooked", "japaneseforest:dark_brick_cooked"}, + } +}) diff --git a/mods/biomes/japaneseforest/farm.lua b/mods/biomes/japaneseforest/farm.lua new file mode 100644 index 00000000..6a460ad2 --- /dev/null +++ b/mods/biomes/japaneseforest/farm.lua @@ -0,0 +1,11 @@ +farming.register_plant("japaneseforest:sashimi", { + description = "Sashimi Seed", + inventory_image = "seed_sashimi.png", + steps = 8, + on_use = minetest.item_eat(2), + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"japaneseforest", "bambooforest"}, + groups = {flammable = 4, food_bread = 1}, + place_param2 = 3, +}) diff --git a/mods/biomes/japaneseforest/fireflies.lua b/mods/biomes/japaneseforest/fireflies.lua new file mode 100644 index 00000000..8c20ca62 --- /dev/null +++ b/mods/biomes/japaneseforest/fireflies.lua @@ -0,0 +1,755 @@ +minetest.register_node("japaneseforest:red_firefly", { + description = "Red Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_red_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_red_firefly.png", + wield_image = "japaneseforest_red_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:red_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_red_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_red_firefly", { + description = "Hidden Red Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_red_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_red_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_red_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:red_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) +-------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("japaneseforest:blue_firefly", { + description = "Blue Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_blue_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_blue_firefly.png", + wield_image = "japaneseforest_blue_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:blue_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_blue_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_blue_firefly", { + description = "Hidden Blue Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_blue_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_blue_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_blue_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:blue_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +-------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("japaneseforest:green_firefly", { + description = "Green Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_green_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_green_firefly.png", + wield_image = "japaneseforest_green_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:green_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_green_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_green_firefly", { + description = "Hidden Green Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_green_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_green_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_green_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:green_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +-------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("japaneseforest:violet_firefly", { + description = "Violet Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_violet_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_violet_firefly.png", + wield_image = "japaneseforest_violet_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:violet_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_violet_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_violet_firefly", { + description = "Hidden Violet Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_violet_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_violet_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_violet_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:violet_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) +-------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("japaneseforest:orange_firefly", { + description = "Orange Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_orange_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_orange_firefly.png", + wield_image = "japaneseforest_orange_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:orange_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_orange_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_orange_firefly", { + description = "Hidden Orange Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_orange_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_orange_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_orange_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:orange_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("japaneseforest:pink_firefly", { + description = "Pink Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_pink_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_pink_firefly.png", + wield_image = "japaneseforest_pink_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:pink_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_pink_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_pink_firefly", { + description = "Hidden Pink Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_pink_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_pink_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_pink_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:pink_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +------------------------------------------------------------------------------------------------------------------------------- +minetest.register_node("japaneseforest:cyan_firefly", { + description = "Cyan Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_cyan_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_cyan_firefly.png", + wield_image = "japaneseforest_cyan_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:cyan_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_cyan_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_cyan_firefly", { + description = "Hidden Cyan Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_cyan_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_cyan_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_cyan_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:cyan_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +------------------------------------------------------------------------------------------------------------------------------ +minetest.register_node("japaneseforest:white_firefly", { + description = "White Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_white_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_white_firefly.png", + wield_image = "japaneseforest_white_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:white_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_white_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_white_firefly", { + description = "Hidden White Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_white_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_white_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_white_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:white_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + + +------------------------------------------------------------------------------------------------------------------------------ +minetest.register_node("japaneseforest:black_firefly", { + description = "Black Firefly", + drawtype = "plantlike", + tiles = {{ + name = "japaneseforest_black_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "japaneseforest_black_firefly.png", + wield_image = "japaneseforest_black_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:black_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "japaneseforest:hidden_black_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("japaneseforest:hidden_black_firefly", { + description = "Hidden Black Firefly", + drawtype = "airlike", + inventory_image = "japaneseforest_black_firefly.png^default_invisible_node_overlay.png", + wield_image = "japaneseforest_black_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "japaneseforest:hidden_black_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "japaneseforest:black_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"japaneseforest"}, + decoration = { +"japaneseforest:red_firefly", "japaneseforest:orange_firefly", "japaneseforest:white_firefly", "japaneseforest:cyan_firefly", "japaneseforest:blue_firefly", "japaneseforest:green_firefly", "japaneseforest:pink_firefly", "japaneseforest:violet_firefly", "japaneseforest:black_firefly", + } +}) diff --git a/mods/biomes/japaneseforest/init.lua b/mods/biomes/japaneseforest/init.lua new file mode 100644 index 00000000..9ffb581f --- /dev/null +++ b/mods/biomes/japaneseforest/init.lua @@ -0,0 +1,23 @@ +local path = minetest.get_modpath("japaneseforest") + + +--------------------Biome + dofile(path .. "/farm.lua") + dofile(path .. "/mapgen.lua") + --dofile(path .. "/fireflies.lua") + dofile(path .. "/crafting.lua") + dofile(path .. "/item.lua") + dofile(path .. "/nodes.lua") + dofile(path .. "/tree.lua") + dofile(path .. "/bonemeal.lua") + dofile(path .. "/moreblocks.lua") +-------Bonus + dofile(path .. "/tools.lua") + + + + + + + + diff --git a/mods/biomes/japaneseforest/item.lua b/mods/biomes/japaneseforest/item.lua new file mode 100644 index 00000000..f784b9c5 --- /dev/null +++ b/mods/biomes/japaneseforest/item.lua @@ -0,0 +1,18 @@ +minetest.register_craftitem("japaneseforest:sashimi_cooked", { + description = "Sashimi Cooked", + inventory_image = "japaneseforest_sashimi_cooked.png", + on_use = minetest.item_eat(5), + groups = {food_bread = 1, flammable = 2}, +}) + +minetest.register_craftitem("japaneseforest:racine_cooked", { + description = "Racine Cooked", + inventory_image = "racine_cooked.png", + on_use = minetest.item_eat(3), + groups = {food_bread = 1, flammable = 2}, +}) + +minetest.register_craftitem("japaneseforest:dark_brick_cooked", { + description = "Dark Brick Cooked", + inventory_image = "dark_brick_cooked.png", +}) diff --git a/mods/biomes/japaneseforest/japanese.png b/mods/biomes/japaneseforest/japanese.png new file mode 100644 index 00000000..b18b6eee Binary files /dev/null and b/mods/biomes/japaneseforest/japanese.png differ diff --git a/mods/biomes/japaneseforest/license.txt b/mods/biomes/japaneseforest/license.txt new file mode 100644 index 00000000..af3dc37b --- /dev/null +++ b/mods/biomes/japaneseforest/license.txt @@ -0,0 +1,18 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + + diff --git a/mods/biomes/japaneseforest/mapgen.lua b/mods/biomes/japaneseforest/mapgen.lua new file mode 100644 index 00000000..5177d7a2 --- /dev/null +++ b/mods/biomes/japaneseforest/mapgen.lua @@ -0,0 +1,140 @@ +minetest.register_decoration({ + name = "japaneseforest:japanese_tree_1_1", + deco_type = "schematic", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.009365, + biomes = {"japaneseforest"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("japaneseforest").."/schematics/japanese_tree_1_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "japaneseforest:japanese_tree_1_2", + deco_type = "schematic", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.009365, + biomes = {"japaneseforest"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("japaneseforest").."/schematics/japanese_tree_1_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "japaneseforest:japanese_tree_1_3", + deco_type = "schematic", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.007365, + biomes = {"japaneseforest"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("japaneseforest").."/schematics/japanese_tree_1_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + +minetest.register_decoration({ + name = "japaneseforest:japanese_tree_3_2", + deco_type = "schematic", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.008365, + biomes = {"japaneseforest"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("japaneseforest").."/schematics/japanese_tree_3_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "japaneseforest:japanese_tree_2_1", + deco_type = "schematic", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.008365, + biomes = {"japaneseforest"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("japaneseforest").."/schematics/japanese_tree_2_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + + +--[[minetest.register_decoration({ + name = "japaneseforest:bamboo", + deco_type = "schematic", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.009265, + biomes = {"japaneseforest"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("bambooforest").."/schematics/bamboo_tree_5.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +})]] + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.1, + biomes = {"japaneseforest"}, + decoration = { + "japaneseforest:racine" + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.1, + biomes = {"japaneseforest"}, + decoration = { + "default:junglegrass" + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"japaneseforest:japanese_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.3, + biomes = {"japaneseforest"}, + decoration = { + "default:grass_1", "default:grass_2", + "default:grass_3", "default:grass_4", + "default:grass_5", + } +}) + + + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"japaneseforest:japanese_dirt_with_grass", "bambooforest:dirt_with_bamboo"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"japaneseforest", "bambooforest"}, + decoration = { + "japaneseforest:sashimi_8", + } +}) diff --git a/mods/biomes/japaneseforest/mod.conf b/mods/biomes/japaneseforest/mod.conf new file mode 100644 index 00000000..d41f5942 --- /dev/null +++ b/mods/biomes/japaneseforest/mod.conf @@ -0,0 +1,8 @@ + +author = Atlante +name = japaneseforest + +description = Adds a japanese biome with a few more objects. And 3 new trees. +title = Japanese Forest +depends = default, doors, stairs, xpanes +optional_depends = moreblocks, bonemeal \ No newline at end of file diff --git a/mods/biomes/japaneseforest/moreblocks.lua b/mods/biomes/japaneseforest/moreblocks.lua new file mode 100644 index 00000000..e7cabfb5 --- /dev/null +++ b/mods/biomes/japaneseforest/moreblocks.lua @@ -0,0 +1,68 @@ +-----------------Moreblock +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("japanese_wood", "wood", "japaneseforest:japanese_wood", { + description = "Japanese Wood", + tiles = {"japanese_wood.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("japanese_tree", "tree", "japaneseforest:japanese_tree", { + description = "Japanese Tree", + tiles = {"japanese_tree_top.png", "japanese_tree_top.png", + "japanese_tree.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("mud", "stone", "japaneseforest:mud", { + description = "Mud", + tiles = {"mud.png"}, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("mud_block", "stone", "japaneseforest:mud_block", { + description = "Mud Block", + tiles = {"mud_block.png"}, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("mud_brick", "stone", "japaneseforest:mud_brick", { + description = "Mud Brick", + tiles = {"mud_brick.png"}, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("dark_brick", "stone", "japaneseforest:dark_brick", { + description = "Dark Brick", + tiles = {"japaneseforest_path_top.png"}, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("sashimi_brick", "stone", "japaneseforest:sashimi_brick", { + description = "Sashimi Brick", + tiles = {"sashimi_brick.png"}, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_all("japanese_lamp", "wood", "japaneseforest:japanese_lamp", { + description = "Japanese Lamp", + tiles = {"japanese_lamp.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("japanese_tatami", "wood", "japaneseforest:japanese_tatami", { + description = "Japanese Tatami", + tiles = {"tatami.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_wood_defaults(), + }) + +end diff --git a/mods/biomes/japaneseforest/nodes.lua b/mods/biomes/japaneseforest/nodes.lua new file mode 100644 index 00000000..1b8ef0d7 --- /dev/null +++ b/mods/biomes/japaneseforest/nodes.lua @@ -0,0 +1,221 @@ +minetest.register_node("japaneseforest:japanese_tree", { + description = "Japanese Tree", + tiles = {"japanese_tree_top.png", "japanese_tree_top.png", + "japanese_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("japaneseforest:japanese_wood", { + description = "Japanese Wood", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"japanese_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("japaneseforest:sashimi_brick", { + description = "Sashimi Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"sashimi_brick.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("japaneseforest:tatami_simple", { + description = "Japanese Simple Tatami", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tatami_simple.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("japaneseforest:japanese_tatami", { + description = "Japanese Tatami", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tatami.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +doors.register_trapdoor("japaneseforest:japanese_trapdoor", { + description = "Japanese Trapdoor", + inventory_image = "japanese_trapdoor.png", + wield_image = "japanese_trapdoor.png", + tile_front = "japanese_trapdoor.png", + tile_side = "japanese_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + + +doors.register("japanese_door", { + tiles = {{ name = "doors_japanese_door.png", backface_culling = true }}, + description = "Japanese Door", + inventory_image = "doors_item_japanese.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"bambooforest:fiber_bamboo", "japaneseforest:japanese_wood"}, + {"japaneseforest:japanese_wood", "bambooforest:fiber_bamboo"}, + {"bambooforest:fiber_bamboo", "japaneseforest:japanese_wood"}, + } +}) + +xpanes.register_pane("japanese_small_wall", { + description = "Japanese Small Wall", + textures = {"small_wall.png", "", "side_small_wall.png"}, + inventory_image = "small_wall.png", + wield_image = "small_wall.png", + sounds = default.node_sound_wood_defaults(), + groups = {choppy=1, oddly_breakable_by_hand=2, flammable = 3}, + recipe = { + {"bambooforest:fiber_bamboo", "bambooforest:fiber_bamboo", "bambooforest:fiber_bamboo"}, + {"dye:magenta", "japaneseforest:japanese_wood", "dye:magenta"}, + } +}) + +stairs.register_stair_and_slab( + "japanese_wood", + "japaneseforest:japanese_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"japanese_wood.png"}, + "Japanese Wood Stair", + "Japanese Wood Slab", + default.node_sound_wood_defaults(), + true +) + +doors.register_fencegate("japaneseforest:gate_japanese", { + description = "Japanese Wood Fence Gate", + texture = "japanese_wood_fence.png", + material = "japaneseforest:japanese_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +default.register_fence("japaneseforest:fence_japanese_wood", { + description = "Japanese Wood Fence", + texture = "japanese_wood_fence.png", + inventory_image = "japaneseforest_fence_overlay.png^japanese_wood_fence.png^" .. + "japaneseforest_fence_overlay.png^[makealpha:255,126,126", + wield_image = "japaneseforest_fence_overlay.png^japanese_wood_fence.png^" .. + "japaneseforest_fence_overlay.png^[makealpha:255,126,126", + material = "japaneseforest:japanese_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("japaneseforest:fence_rail_japanese_wood", { + description = "Japanese Wood Fence Rail", + texture = "japanese_wood_fence.png", + inventory_image = "japaneseforest_fence_rail_overlay.png^japanese_wood_fence.png^" .. + "japaneseforest_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "japaneseforest_fence_rail_overlay.png^japanese_wood_fence.png^" .. + "japaneseforest_fence_rail_overlay.png^[makealpha:255,126,126", + material = "japaneseforest:japanese_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_node("japaneseforest:racine", { + description = "Racine", + drawtype = "signlike", + waving = 1, + tiles = {"racine.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "racine_inv.png", + wield_image = "racine.png", + on_use = minetest.item_eat(1), + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, oddly_breakable_by_hand=3, +flammable = 1, food_bread = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type="wallmounted", + wall_top = {-0.5, 0.49, -0.5, 0.5, 0.5, 0.5}, + wall_bottom = {-0.5, -0.5, -0.5, 0.5, -0.49, 0.5}, + wall_side = {-0.5, -0.5, -0.5, -0.49, 0.5, 0.5}, + }, +}) + +minetest.register_node("japaneseforest:mud", { + description = "Japanese Mud", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"mud.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("japaneseforest:mud_block", { + description = "Japanese Mud Block", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"mud_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("japaneseforest:mud_brick", { + description = "Japanese Mud Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"mud_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("japaneseforest:japanese_dirt_with_grass", { + description = "Japanese Dirt With Grass", + tiles = {"japaneseforest_japanese_grass.png", "default_dirt.png", + {name = "default_dirt.png^japaneseforest_japanese_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("japaneseforest:japanese_lamp", { + description = "Japanese Lamp", + drawtype = "glasslike", + tiles = {"japanese_lamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_wood_defaults(), + light_source = default.LIGHT_MAX, +}) + +minetest.register_node("japaneseforest:dark_brick", { + description = "Japanese Dark Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"japaneseforest_path_top.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + diff --git a/mods/biomes/japaneseforest/schematics/japanese_tree_1_1.mts b/mods/biomes/japaneseforest/schematics/japanese_tree_1_1.mts new file mode 100644 index 00000000..47e8ed28 Binary files /dev/null and b/mods/biomes/japaneseforest/schematics/japanese_tree_1_1.mts differ diff --git a/mods/biomes/japaneseforest/schematics/japanese_tree_1_2.mts b/mods/biomes/japaneseforest/schematics/japanese_tree_1_2.mts new file mode 100644 index 00000000..9b87114b Binary files /dev/null and b/mods/biomes/japaneseforest/schematics/japanese_tree_1_2.mts differ diff --git a/mods/biomes/japaneseforest/schematics/japanese_tree_1_3.mts b/mods/biomes/japaneseforest/schematics/japanese_tree_1_3.mts new file mode 100644 index 00000000..7c6f3337 Binary files /dev/null and b/mods/biomes/japaneseforest/schematics/japanese_tree_1_3.mts differ diff --git a/mods/biomes/japaneseforest/schematics/japanese_tree_2_1.mts b/mods/biomes/japaneseforest/schematics/japanese_tree_2_1.mts new file mode 100644 index 00000000..97252b8b Binary files /dev/null and b/mods/biomes/japaneseforest/schematics/japanese_tree_2_1.mts differ diff --git a/mods/biomes/japaneseforest/schematics/japanese_tree_3_2.mts b/mods/biomes/japaneseforest/schematics/japanese_tree_3_2.mts new file mode 100644 index 00000000..ba535716 Binary files /dev/null and b/mods/biomes/japaneseforest/schematics/japanese_tree_3_2.mts differ diff --git a/mods/biomes/japaneseforest/textures/dark_brick_cooked.png b/mods/biomes/japaneseforest/textures/dark_brick_cooked.png new file mode 100644 index 00000000..a0896552 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/dark_brick_cooked.png differ diff --git a/mods/biomes/japaneseforest/textures/doors_item_japanese.png b/mods/biomes/japaneseforest/textures/doors_item_japanese.png new file mode 100644 index 00000000..7f7787aa Binary files /dev/null and b/mods/biomes/japaneseforest/textures/doors_item_japanese.png differ diff --git a/mods/biomes/japaneseforest/textures/doors_japanese_door.png b/mods/biomes/japaneseforest/textures/doors_japanese_door.png new file mode 100644 index 00000000..777ff768 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/doors_japanese_door.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_lamp.png b/mods/biomes/japaneseforest/textures/japanese_lamp.png new file mode 100644 index 00000000..bb4dc8c6 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_lamp.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_leaves_1.png b/mods/biomes/japaneseforest/textures/japanese_leaves_1.png new file mode 100644 index 00000000..91d2db25 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_leaves_1.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_leaves_2.png b/mods/biomes/japaneseforest/textures/japanese_leaves_2.png new file mode 100644 index 00000000..12188c78 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_leaves_2.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_leaves_3.png b/mods/biomes/japaneseforest/textures/japanese_leaves_3.png new file mode 100644 index 00000000..9d0a6f58 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_leaves_3.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_sapling.png b/mods/biomes/japaneseforest/textures/japanese_sapling.png new file mode 100644 index 00000000..a3985195 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_sapling.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_sapling_1.png b/mods/biomes/japaneseforest/textures/japanese_sapling_1.png new file mode 100644 index 00000000..405e3602 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_sapling_1.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_sapling_2.png b/mods/biomes/japaneseforest/textures/japanese_sapling_2.png new file mode 100644 index 00000000..5ccb5f8d Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_sapling_2.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_sapling_3.png b/mods/biomes/japaneseforest/textures/japanese_sapling_3.png new file mode 100644 index 00000000..0e10128f Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_sapling_3.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_trapdoor.png b/mods/biomes/japaneseforest/textures/japanese_trapdoor.png new file mode 100644 index 00000000..32fe1e60 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_trapdoor.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_trapdoor_side.png b/mods/biomes/japaneseforest/textures/japanese_trapdoor_side.png new file mode 100644 index 00000000..9702bbba Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_trapdoor_side.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_tree.png b/mods/biomes/japaneseforest/textures/japanese_tree.png new file mode 100644 index 00000000..0b2e1893 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_tree.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_tree_top.png b/mods/biomes/japaneseforest/textures/japanese_tree_top.png new file mode 100644 index 00000000..8f38fdaf Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_tree_top.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_wood.png b/mods/biomes/japaneseforest/textures/japanese_wood.png new file mode 100644 index 00000000..df242496 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_wood.png differ diff --git a/mods/biomes/japaneseforest/textures/japanese_wood_fence.png b/mods/biomes/japaneseforest/textures/japanese_wood_fence.png new file mode 100644 index 00000000..df242496 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japanese_wood_fence.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_black_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_black_firefly.png new file mode 100644 index 00000000..9ea040e0 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_black_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_black_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_black_firefly_animated.png new file mode 100644 index 00000000..dd708a2a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_black_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_blue_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_blue_firefly.png new file mode 100644 index 00000000..20ddbdc3 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_blue_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_blue_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_blue_firefly_animated.png new file mode 100644 index 00000000..64956972 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_blue_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_cyan_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_cyan_firefly.png new file mode 100644 index 00000000..b9dc98c1 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_cyan_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_cyan_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_cyan_firefly_animated.png new file mode 100644 index 00000000..ffb20a78 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_cyan_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_fence_overlay.png b/mods/biomes/japaneseforest/textures/japaneseforest_fence_overlay.png new file mode 100644 index 00000000..a3e65499 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_fence_overlay.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_fence_rail_overlay.png b/mods/biomes/japaneseforest/textures/japaneseforest_fence_rail_overlay.png new file mode 100644 index 00000000..234573ec Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_fence_rail_overlay.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_green_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_green_firefly.png new file mode 100644 index 00000000..8ec26c64 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_green_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_green_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_green_firefly_animated.png new file mode 100644 index 00000000..9148748d Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_green_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_japanese_grass.png b/mods/biomes/japaneseforest/textures/japaneseforest_japanese_grass.png new file mode 100644 index 00000000..ecafb695 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_japanese_grass.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_japanese_grass_side.png b/mods/biomes/japaneseforest/textures/japaneseforest_japanese_grass_side.png new file mode 100644 index 00000000..68c69268 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_japanese_grass_side.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_japaneseforest_side.png b/mods/biomes/japaneseforest/textures/japaneseforest_japaneseforest_side.png new file mode 100644 index 00000000..6533a61d Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_japaneseforest_side.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_orange_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_orange_firefly.png new file mode 100644 index 00000000..93a7805a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_orange_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_orange_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_orange_firefly_animated.png new file mode 100644 index 00000000..8fb531b4 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_orange_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_path_top.png b/mods/biomes/japaneseforest/textures/japaneseforest_path_top.png new file mode 100644 index 00000000..8230b872 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_path_top.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_pink_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_pink_firefly.png new file mode 100644 index 00000000..8dc82853 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_pink_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_pink_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_pink_firefly_animated.png new file mode 100644 index 00000000..360f42b6 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_pink_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_red_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_red_firefly.png new file mode 100644 index 00000000..292fb5af Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_red_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_red_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_red_firefly_animated.png new file mode 100644 index 00000000..6d668038 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_red_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi.png new file mode 100644 index 00000000..524a8dda Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_1.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_1.png new file mode 100644 index 00000000..50d40ed7 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_1.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_2.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_2.png new file mode 100644 index 00000000..0ca6a2f7 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_2.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_3.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_3.png new file mode 100644 index 00000000..5b153f71 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_3.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_4.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_4.png new file mode 100644 index 00000000..b25416f0 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_4.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_5.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_5.png new file mode 100644 index 00000000..1e36428c Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_5.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_6.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_6.png new file mode 100644 index 00000000..d01812d5 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_6.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_7.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_7.png new file mode 100644 index 00000000..60836e4a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_7.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_8.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_8.png new file mode 100644 index 00000000..ae2bf963 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_8.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_cooked.png b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_cooked.png new file mode 100644 index 00000000..9c6f8f3a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_sashimi_cooked.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_truel.png b/mods/biomes/japaneseforest/textures/japaneseforest_truel.png new file mode 100644 index 00000000..b0d7516a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_truel.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_truel_90.png b/mods/biomes/japaneseforest/textures/japaneseforest_truel_90.png new file mode 100644 index 00000000..21933717 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_truel_90.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_violet_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_violet_firefly.png new file mode 100644 index 00000000..f763d42c Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_violet_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_violet_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_violet_firefly_animated.png new file mode 100644 index 00000000..0e486be8 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_violet_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_white_firefly.png b/mods/biomes/japaneseforest/textures/japaneseforest_white_firefly.png new file mode 100644 index 00000000..4cf54b7f Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_white_firefly.png differ diff --git a/mods/biomes/japaneseforest/textures/japaneseforest_white_firefly_animated.png b/mods/biomes/japaneseforest/textures/japaneseforest_white_firefly_animated.png new file mode 100644 index 00000000..43f8b92b Binary files /dev/null and b/mods/biomes/japaneseforest/textures/japaneseforest_white_firefly_animated.png differ diff --git a/mods/biomes/japaneseforest/textures/mud.png b/mods/biomes/japaneseforest/textures/mud.png new file mode 100644 index 00000000..84a14d98 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/mud.png differ diff --git a/mods/biomes/japaneseforest/textures/mud_block.png b/mods/biomes/japaneseforest/textures/mud_block.png new file mode 100644 index 00000000..70a88d42 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/mud_block.png differ diff --git a/mods/biomes/japaneseforest/textures/mud_brick.png b/mods/biomes/japaneseforest/textures/mud_brick.png new file mode 100644 index 00000000..829a2afb Binary files /dev/null and b/mods/biomes/japaneseforest/textures/mud_brick.png differ diff --git a/mods/biomes/japaneseforest/textures/racine.png b/mods/biomes/japaneseforest/textures/racine.png new file mode 100644 index 00000000..a1f6a231 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/racine.png differ diff --git a/mods/biomes/japaneseforest/textures/racine_cooked.png b/mods/biomes/japaneseforest/textures/racine_cooked.png new file mode 100644 index 00000000..018ccb17 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/racine_cooked.png differ diff --git a/mods/biomes/japaneseforest/textures/racine_inv.png b/mods/biomes/japaneseforest/textures/racine_inv.png new file mode 100644 index 00000000..aaa9622a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/racine_inv.png differ diff --git a/mods/biomes/japaneseforest/textures/sashimi_brick.png b/mods/biomes/japaneseforest/textures/sashimi_brick.png new file mode 100644 index 00000000..c0969680 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/sashimi_brick.png differ diff --git a/mods/biomes/japaneseforest/textures/seed_sashimi.png b/mods/biomes/japaneseforest/textures/seed_sashimi.png new file mode 100644 index 00000000..23393834 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/seed_sashimi.png differ diff --git a/mods/biomes/japaneseforest/textures/side_small_wall.png b/mods/biomes/japaneseforest/textures/side_small_wall.png new file mode 100644 index 00000000..022dce0b Binary files /dev/null and b/mods/biomes/japaneseforest/textures/side_small_wall.png differ diff --git a/mods/biomes/japaneseforest/textures/small_wall.png b/mods/biomes/japaneseforest/textures/small_wall.png new file mode 100644 index 00000000..75d52e1a Binary files /dev/null and b/mods/biomes/japaneseforest/textures/small_wall.png differ diff --git a/mods/biomes/japaneseforest/textures/tatami.png b/mods/biomes/japaneseforest/textures/tatami.png new file mode 100644 index 00000000..1a6f20f7 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/tatami.png differ diff --git a/mods/biomes/japaneseforest/textures/tatami_simple.png b/mods/biomes/japaneseforest/textures/tatami_simple.png new file mode 100644 index 00000000..45c5daa2 Binary files /dev/null and b/mods/biomes/japaneseforest/textures/tatami_simple.png differ diff --git a/mods/biomes/japaneseforest/tools.lua b/mods/biomes/japaneseforest/tools.lua new file mode 100644 index 00000000..5f270978 --- /dev/null +++ b/mods/biomes/japaneseforest/tools.lua @@ -0,0 +1,405 @@ +japaneseforest = {} +-- save how many bullets owner fired +japaneseforest.fired_table = {} +local enable_particles = minetest.settings:get_bool("enable_particles") + +local function bound(x, minb, maxb) + if x < minb then + return minb + elseif x > maxb then + return maxb + else + return x + end +end + +--- Punch damage calculator. +-- By default, this just calculates damage in the vanilla way. Switch it out for something else to change the default damage mechanism for mobs. +-- @param ObjectRef player +-- @param ?ObjectRef puncher +-- @param number time_from_last_punch +-- @param table tool_capabilities +-- @param ?vector direction +-- @param ?Id attacker +-- @return number The calculated damage +-- @author raymoo +function japaneseforest.damage_calculator(player, puncher, tflp, caps, direction, attacker) + local a_groups = player:get_armor_groups() or {} + local full_punch_interval = caps.full_punch_interval or 1.4 + local time_prorate = bound(tflp / full_punch_interval, 0, 1) + + local damage = 0 + for group, damage_rating in pairs(caps.damage_groups or {}) do + local armor_rating = a_groups[group] or 0 + damage = damage + damage_rating * (armor_rating / 100) + end + + return math.floor(damage * time_prorate) +end + +-- particles +function japaneseforest.add_effects(pos) + if not enable_particles then return end + + return minetest.add_particlespawner({ + amount = 2, + time = 0, + minpos = {x=pos.x-1, y=pos.y+0.5, z=pos.z-1}, + maxpos = {x=pos.x+1, y=pos.y+1.5, z=pos.z+1}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.3, y=-0.3, z=0.3}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 5, + minsize = .5, + maxsize = 1.5, + texture = "japaneseforest_chest_particle.png", + glow = 7 + }) +end + +-- check for player near by to activate particles +function japaneseforest.check_around_radius(pos) + local player_near = false + + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 16)) do + if obj:is_player() then + player_near = true + break + end + end + + return player_near +end + +-- check if within physical map limits (-30911 to 30927) +function japaneseforest.within_limits(pos, radius) + if (pos.x - radius) > -30913 + and (pos.x + radius) < 30928 + and (pos.y - radius) > -30913 + and (pos.y + radius) < 30928 + and (pos.z - radius) > -30913 + and (pos.z + radius) < 30928 then + return true -- within limits + end + + return false -- beyond limits +end + + + +function japaneseforest.add_wear(itemstack, pos) + -- wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear(65535/4300) + -- Tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pos, gain = 0.5}) + end + + return itemstack +end + +-- prevent pick axe engraved of placing item when clicken on one of the items from this list +local pick_engraved_place_blacklist = { + ["xdecor:itemframe"] = true +} + +function japaneseforest.pick_engraved_place(itemstack, placer, pointed_thing) + local idx = placer:get_wield_index() + 1 -- item to right of wielded tool + local inv = placer:get_inventory() + local stack = inv:get_stack("main", idx) -- stack to right of tool + local stack_name = stack:get_name() + local under = pointed_thing.under + local above = pointed_thing.above + local node_under = minetest.get_node(under) + local udef = {} + local temp_stack = "" + + -- handle nodes + if pointed_thing.type == "node" then + local pos = minetest.get_pointed_thing_position(pointed_thing) + local pointed_node = minetest.get_node(pos) + + -- check if we have to use default on_place first + if pick_engraved_place_blacklist[pointed_node.name] ~= nil then + return minetest.item_place(itemstack, placer, pointed_thing) + end + + if pointed_node ~= nil and stack_name ~= "" then + local stack_def = minetest.registered_nodes[stack_name] + local stack_name_split = string.split(stack_name, ":") + local stack_mod = stack_name_split[1] + + udef = minetest.registered_nodes[stack_name] + -- print(dump(udef)) + + -- not for farming - that should be part of a hoe + if stack_mod ~= "farming" or stack_mod ~= "farming_addons" then + if udef and udef.on_place then + temp_stack = udef.on_place(stack, placer, pointed_thing) or stack + inv:set_stack("main", idx, temp_stack) + + -- itemstack = japaneseforest.add_wear(itemstack) + + -- play sound + -- if udef.sounds then + -- if udef.sounds.place then + -- udef.sounds.place.to_player = placer:get_player_name() + -- minetest.sound_play(udef.sounds.place) + -- end + -- end + + return itemstack + elseif udef and udef.on_use then + temp_stack = udef.on_use(stack, placer, pointed_thing) or stack + inv:set_stack("main", idx, temp_stack) + + -- itemstack = japaneseforest.add_wear(itemstack) + return itemstack + end + end + + -- handle default torch placement + if stack_name == "default:torch" then + local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) + local fakestack = stack + + if wdir == 0 then + fakestack:set_name("default:torch_ceiling") + elseif wdir == 1 then + fakestack:set_name("default:torch") + else + fakestack:set_name("default:torch_wall") + end + + temp_stack = minetest.item_place(fakestack, placer, pointed_thing, wdir) + + temp_stack:set_name("default:torch") + inv:set_stack("main", idx, temp_stack) + + -- itemstack = japaneseforest.add_wear(itemstack) + + -- play sound + -- if udef and udef.sounds then + -- if udef.sounds.place then + -- udef.sounds.place.to_player = placer:get_player_name() + -- minetest.sound_play(udef.sounds.place) + -- end + -- end + + return itemstack + end + end + -- if everything else fails use default on_place + stack = minetest.item_place(stack, placer, pointed_thing) + inv:set_stack("main", idx, stack) + + -- play sound + -- if udef and udef.sounds then + -- if udef.sounds.place then + -- udef.sounds.place.to_player = placer:get_player_name() + -- minetest.sound_play(udef.sounds.place) + -- end + -- end + + return itemstack + end +end + +function japaneseforest.shovel_place(itemstack, placer, pointed_thing) + local pt = pointed_thing + + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + if minetest.is_protected(pt.under, placer:get_player_name()) then + minetest.record_protection_violation(pt.under, placer:get_player_name()) + return + end + + if under.name == "default:dirt" and + under.name ~= "japaneseforest:paths" then + minetest.set_node(pt.under, {name = "japaneseforest:paths"}) + + + elseif (under.name == "default:dirt_with_grass" or + under.name == "default:dirt_with_grass_footsteps" or + under.name == "default:dirt_with_dry_grass" or + under.name == "default:dirt_with_snow" or + under.name == "default:dirt_with_rainforest_litter") and + under.name ~= "japaneseforest:paths" then + minetest.set_node(pt.under, {name = "japaneseforest:paths"}) + + + elseif under.name == "default:dry_dirt_with_dry_grass" and + under.name ~= "japaneseforest:paths" then + minetest.set_node(pt.under, {name = "japaneseforest:paths"}) + + elseif under.name == "default:dirt_with_coniferous_litter" and + under.name ~= "japaneseforest:paths" then + minetest.set_node(pt.under, {name = "japaneseforest:paths"}) + + elseif under.name == "japaneseforest:japanese_dirt_with_grass" and + under.name ~= "japaneseforest:paths" then + minetest.set_node(pt.under, {name = "japaneseforest:paths"}) + + elseif under.name == "bambooforest:dirt_with_bamboo" and + under.name ~= "japaneseforest:paths" then + minetest.set_node(pt.under, {name = "japaneseforest:paths"}) + + + else + return + end + + -- play sound + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.5 + }) + -- add wear + itemstack = japaneseforest.add_wear(itemstack) + return itemstack +end + + + +-- Taken from WorldEdit +-- Determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1) +function japaneseforest.player_axis(player) + local dir = player:get_look_dir() + local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z) + if x > y then + if x > z then + return "x", dir.x > 0 and 1 or -1 + end + elseif y > z then + return "y", dir.y > 0 and 1 or -1 + end + return "z", dir.z > 0 and 1 or -1 +end + +function japaneseforest.hoe_on_use(itemstack, user, pointed_thing) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") ~= 1 then + return + end + + -- check if (wet) soil defined + local regN = minetest.registered_nodes + if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then + return + end + + if minetest.is_protected(pt.under, user:get_player_name()) then + minetest.record_protection_violation(pt.under, user:get_player_name()) + return + end + if minetest.is_protected(pt.above, user:get_player_name()) then + minetest.record_protection_violation(pt.above, user:get_player_name()) + return + end + + -- turn the node into soil and play sound + minetest.set_node(pt.under, {name = regN[under.name].soil.dry}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.5, + }) +end + +-- shovel +minetest.register_tool("japaneseforest:truel", { + description = "Allows you to create Japanese paths", + inventory_image = "japaneseforest_truel.png", + wield_image = "japaneseforest_truel_90.png^[transformR90", + wield_scale = {x=1.0, y=1.0, z=1.0}, + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.5, [2]=1.50, [3]=1.50}, uses=15, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + on_place = japaneseforest.shovel_place +}) + + +-- japanese path +minetest.register_node("japaneseforest:paths", { + description = "Path", + drawtype = "nodebox", + tiles = {"japaneseforest_path_top.png", "default_dirt.png", "default_dirt.png^japaneseforest_japaneseforest_side.png"}, + is_ground_content = false, + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 1/2-1/16, 1/2}, + }, + collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 1/2-1/16, 1/2}, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 1/2-1/16, 1/2}, + }, + drop = "japaneseforest:paths", + is_ground_content = false, + groups = {crumbly = 3, cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + + diff --git a/mods/biomes/japaneseforest/tree.lua b/mods/biomes/japaneseforest/tree.lua new file mode 100644 index 00000000..85fb0ac8 --- /dev/null +++ b/mods/biomes/japaneseforest/tree.lua @@ -0,0 +1,117 @@ +-------------Trees +local mpath = minetest.get_modpath("japaneseforest") +local mod_bonemeal = minetest.get_modpath("bonemeal") + +local trees = { + { + kana = "ã„ã¡", + grow_function = function(pos) + local path = mpath .. "/schematics/japanese_tree_1_3.mts" + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y, z = pos.z - 2}, + path, "random", nil, false) + end, + }, + { + kana = "ã«", + grow_function = function(pos) + local path = mpath .. "/schematics/japanese_tree_2_1.mts" + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 5, y = pos.y, z = pos.z - 5}, + path, "random", nil, false) + end, + }, + { + kana = "ã•ã‚“", + grow_function = function(pos) + local path = mpath .. "/schematics/japanese_tree_3_2.mts" + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, + path, "random", nil, false) + end, + }, +} + +for index,def in ipairs(trees) do + local sapling = "japaneseforest:japanese_sapling_" .. index + local image = "japanese_sapling_" .. index .. ".png" + local leaves = "japaneseforest:japanese_leaves_" .. index + + -- Register leaves + minetest.register_node(leaves, { + description = "Japanese Leaves " .. def.kana, + drawtype = "allfaces_optional", + waving = 1, + tiles = {"japanese_leaves_" .. index .. ".png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {sapling}, rarity = 20}, + {items = {leaves}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + -- Register sapling + minetest.register_node(sapling, { + description = "Japanese Sapling " .. def.kana, + drawtype = "plantlike", + tiles = {image}, + inventory_image = image, + wield_image = image, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = function(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + else + def.grow_function(pos) + end + end, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + sapling, + {x = -2, y = 1, z = -2}, + {x = 2, y = 15, z = 2}, + 4) + + return itemstack + end, + }) + + -- Register sapling crafting recipe + minetest.register_craft({ + output = sapling, + recipe = { + {"", leaves, ""}, + {leaves, "default:stick", leaves} + }, + }) + + -- Add bonemeal integration if supported + if mod_bonemeal then + bonemeal:add_sapling({ + {sapling, def.grow_function, "soil"}, + }) + end +end diff --git a/mods/biomes/license.txt b/mods/biomes/license.txt new file mode 100644 index 00000000..df7aaccc --- /dev/null +++ b/mods/biomes/license.txt @@ -0,0 +1,78 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + +Licenses for specific textures: + +- Derived from [Minetest Game](https://content.minetest.net/packages/Minetest/minetest_game/) textures by celeron55, [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) + - badland_grass_1.png + - badland_grass_2.png + - badland_grass_3.png + - badland_grass_4.png + - badland_grass_5.png + - frost_land_blue_firefly.png + - frost_land_blue_firefly_animated.png + - frost_land_cyan_firefly.png + - frost_land_cyan_firefly_animated.png + - japaneseforest_black_firefly.png + - japaneseforest_black_firefly_animated.png + - japaneseforest_blue_firefly.png + - japaneseforest_blue_firefly_animated.png + - japaneseforest_cyan_firefly.png + - japaneseforest_cyan_firefly_animated.png + - japaneseforest_green_firefly.png + - japaneseforest_green_firefly_animated.png + - japaneseforest_orange_firefly.png + - japaneseforest_orange_firefly_animated.png + - japaneseforest_pink_firefly.png + - japaneseforest_pink_firefly_animated.png + - japaneseforest_red_firefly.png + - japaneseforest_red_firefly_animated.png + - japaneseforest_violet_firefly.png + - japaneseforest_violet_firefly_animated.png + - japaneseforest_white_firefly.png + - japaneseforest_white_firefly_animated.png + +- Derived from the [RPG16 texture pack](https://content.minetest.net/packages/Hugues%20Ross/rpg16/) by Hughes Ross, [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) + - badland_grass_side.png + - badland_grass.png + - badland_sapling.png + - badland_sapling_1.png + - badland_sapling_2.png + - badland_sapling_3.png + - bambooforest_bamboo_grass.png + - bambooforest_bamboo_grass_side.png + - bambooforest_bamboo_tree.png + - dorwinion_grass.png + - dorwinion_grass_side.png + - frost_land_grass.png + - frost_land_grass_side.png + - doors_item_japanese.png + - doors_japanese_door.png + - japanese_sapling.png + - japanese_sapling_1.png + - japanese_sapling_2.png + - japanese_sapling_3.png + - japanese_trapdoor.png + - japaneseforest_japanese_grass.png + - japaneseforest_japanese_grass_side.png + - tatami.png + - nightshade_nightshade_grass.png + - nightshade_nightshade_grass_side.png + - prairie_grass.png + - prairie_grass_side.png + - prairie_sapling_1.png + - prairie_sapling_2.png \ No newline at end of file diff --git a/mods/biomes/modpack.conf b/mods/biomes/modpack.conf new file mode 100644 index 00000000..70fb42dc --- /dev/null +++ b/mods/biomes/modpack.conf @@ -0,0 +1,5 @@ +description = Add many biomes,trees and decorative block. +name = biomes +title = Biomes + +author = Atlante diff --git a/mods/biomes/nightshade/crafting.lua b/mods/biomes/nightshade/crafting.lua new file mode 100644 index 00000000..6a8bd9dd --- /dev/null +++ b/mods/biomes/nightshade/crafting.lua @@ -0,0 +1,32 @@ +------------Crafting +minetest.register_craft({ + output = "nightshade:nightshade_wood 4", + recipe = { + {"nightshade:nightshade_tree"}, + } +}) + +local leaves = "nightshade:nightshade_leaves_1" +minetest.register_craft({ + output = "nightshade:nightshade_sapling", + recipe = { + {"", leaves, ""}, + {leaves, "default:stick", leaves} + }, +}) + +minetest.register_craft({ + output = "nightshade:nightshade_lamp", + recipe = { + {"nightshade:nightshade_wood", "default:meselamp"}, + } +}) + +minetest.register_craft({ + output = "nightshade:nightshade_trapdoor 2", + recipe = { + {"nightshade:nightshade_wood", "nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + {"nightshade:nightshade_wood", "nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + } +}) + diff --git a/mods/biomes/nightshade/fireflies.lua b/mods/biomes/nightshade/fireflies.lua new file mode 100644 index 00000000..032142c1 --- /dev/null +++ b/mods/biomes/nightshade/fireflies.lua @@ -0,0 +1,10 @@ +minetest.register_decoration({ + deco_type = "simple", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.02, + biomes = {"nightshade"}, + decoration = { +"japaneseforest:red_firefly", "japaneseforest:orange_firefly","japaneseforest:violet_firefly", "japaneseforest:black_firefly", + } +}) diff --git a/mods/biomes/nightshade/init.lua b/mods/biomes/nightshade/init.lua new file mode 100644 index 00000000..ffde6573 --- /dev/null +++ b/mods/biomes/nightshade/init.lua @@ -0,0 +1,7 @@ +local path = minetest.get_modpath("nightshade") + + dofile(path .. "/nodes.lua") + dofile(path .. "/mapgen.lua") + dofile(path .. "/crafting.lua") + --dofile(path .. "/fireflies.lua") + dofile(path .. "/moreblocks.lua") diff --git a/mods/biomes/nightshade/license.txt b/mods/biomes/nightshade/license.txt new file mode 100644 index 00000000..ad88456b --- /dev/null +++ b/mods/biomes/nightshade/license.txt @@ -0,0 +1,23 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + + +--- + +The following textures are made by EmptyStar, licensed [CC0](https://creativecommons.org/publicdomain/zero/1.0/) + +- textures/nightshade_sapling_1.png \ No newline at end of file diff --git a/mods/biomes/nightshade/mapgen.lua b/mods/biomes/nightshade/mapgen.lua new file mode 100644 index 00000000..f30b65bc --- /dev/null +++ b/mods/biomes/nightshade/mapgen.lua @@ -0,0 +1,126 @@ +minetest.register_decoration({ + name = "nightshade:nightshade_tree_1", + deco_type = "schematic", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.019265, + biomes = {"nightshade"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("nightshade").."/schematics/nightshade_tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nightshade:nightshade_tree_2", + deco_type = "schematic", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.019265, + biomes = {"nightshade"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("nightshade").."/schematics/nightshade_tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nightshade:nightshade_tree_3", + deco_type = "schematic", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.019265, + biomes = {"nightshade"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("nightshade").."/schematics/nightshade_tree_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nightshade:nightshade_bush", + deco_type = "schematic", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.039265, + biomes = {"nightshade"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("nightshade").."/schematics/nightshade_bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nightshade:nightshade_tree_log_1", + deco_type = "schematic", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.010265, + biomes = {"nightshade"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("nightshade").."/schematics/nightshade_tree_log_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nightshade:nightshade_tree_log_2", + deco_type = "schematic", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.012265, + biomes = {"nightshade"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("nightshade").."/schematics/nightshade_tree_log_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.0125, + biomes = {"nightshade"}, + decoration = { + "everness:ivis_moss", + "everness:ngrass_2", + "flowers:mushroom_brown", + "flowers:mushroom_red", + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"nightshade:nightshade_tree"}, + sidelen = 16, + fill_ratio = 0.125, + biomes = {"nightshade"}, + decoration = { + "flowers:mushroom_brown", + "flowers:mushroom_red", + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"nightshade:nightshade_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.175, + biomes = {"nightshade"}, + decoration = { + "nightshade:nightshade_grass", + } +}) diff --git a/mods/biomes/nightshade/mod.conf b/mods/biomes/nightshade/mod.conf new file mode 100644 index 00000000..c05b1b10 --- /dev/null +++ b/mods/biomes/nightshade/mod.conf @@ -0,0 +1,7 @@ + +author = Atlante +name = nightshade + +description = Adds a nighshade biome with a few more objects. +title = NightShade +depends = default, doors, japaneseforest \ No newline at end of file diff --git a/mods/biomes/nightshade/moreblocks.lua b/mods/biomes/nightshade/moreblocks.lua new file mode 100644 index 00000000..36a1d7a8 --- /dev/null +++ b/mods/biomes/nightshade/moreblocks.lua @@ -0,0 +1,28 @@ +-----------------Moreblock +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("nightshade_tree", "wood", "nightshade:nightshade_tree", { + description = "NightShade Tree", + tiles = {"nightshade_tree_top.png", "nightshade_tree_top.png", + "nightshade_tree.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("nightshade_wood", "wood", "nightshade:nightshade_wood", { + description = "NightShade Tree", + tiles = {"nightshade_wood_fence.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("nightshade_lamp", "glass", "nightshade:nightshade_lamp", { + description = "NightShade Lamp", + tiles = {"nightshade_lamp.png"}, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + }) + + + +end diff --git a/mods/biomes/nightshade/nightshade.png b/mods/biomes/nightshade/nightshade.png new file mode 100644 index 00000000..e5b29729 Binary files /dev/null and b/mods/biomes/nightshade/nightshade.png differ diff --git a/mods/biomes/nightshade/nodes.lua b/mods/biomes/nightshade/nodes.lua new file mode 100644 index 00000000..d961845e --- /dev/null +++ b/mods/biomes/nightshade/nodes.lua @@ -0,0 +1,286 @@ +local modpath = minetest.get_modpath("nightshade") + +local function grow_new_nightshade_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(300, 1500)) + return + end + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/nightshade_tree_1.mts", "0", nil, false) +end + +minetest.register_node("nightshade:nightshade_dirt_with_grass", { + description = "Nightshade Dirt With Grass", + tiles = {"nightshade_nightshade_grass.png", "default_dirt.png", + {name = "default_dirt.png^nightshade_nightshade_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("nightshade:nightshade_leaves_1", { + description = "Nightshade Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"nightshade_tree_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"nightshade:nightshade_sapling_1"}, rarity = 40}, + {items = {"nightshade:nightshade_sapling_2"}, rarity = 40}, + {items = {"nightshade:nightshade_leaves_1"}} -- ~95% chance for leaves + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("nightshade:nightshade_glowin_leaves_1", { + description = "Nightshade Glowing Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"nightshade_tree_glowing_leaves.png"}, + paramtype = "light", + is_ground_content = false, + light_source = 15, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"nightshade:nightshade_glowin_leaves_1"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + +}) + + +minetest.register_node("nightshade:nightshade_tree", { + description = "Nightshade Tree", + tiles = {"nightshade_tree_top.png", "nightshade_tree_top.png", + "nightshade_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("nightshade:nightshade_wood", { + description = "Nightshade Wood", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"nightshade_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("nightshade:nightshade_lamp", { + description = "Nightshade Lamp", + drawtype = "glasslike", + tiles = {"nightshade_lamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +minetest.register_node("nightshade:nightshade_grass", { + description = "Nightshade Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.5, + tiles = {"nightshade_grass.png"}, + inventory_image = "nightshade_grass.png", + wield_image = "nightshade_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, junglegrass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, +}) + +stairs.register_stair_and_slab( + "nightshade_wood", + "nightshade:nightshade_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"nightshade_wood.png"}, + "Nightshade Wood Stair", + "Nightshade Wood Slab", + default.node_sound_wood_defaults(), + true +) + +doors.register_trapdoor("nightshade:nightshade_trapdoor", { + description = "Nightshade Trapdoor", + inventory_image = "nightshade_trapdoor.png", + wield_image = "nightshade_trapdoor.png", + tile_front = "nightshade_trapdoor.png", + tile_side = "nightshade_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + + +doors.register("nightshade_door", { + tiles = {{ name = "doors_nightshade_door.png", backface_culling = true }}, + description = "Nightshade Door", + inventory_image = "doors_item_nightshade.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + {"nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + {"nightshade:nightshade_wood", "nightshade:nightshade_wood"}, + } +}) + + +doors.register_fencegate("nightshade:gate_nightshade", { + description = "Nightshade Wood Fence Gate", + texture = "nightshade_wood_fence.png", + material = "nightshade:nightshade_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + + default.register_fence("nightshade:fence_nightshade_wood", { + description = "Nightshade Wood Fence", + texture = "nightshade_wood_fence.png", + inventory_image = "default_fence_overlay.png^nightshade_wood_fence.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^nightshade_wood_fence.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "nightshade:nightshade_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("nightshade:fence_rail_nightshade_wood", { + description = "Nightshade Wood Fence Rail", + texture = "nightshade_wood_fence.png", + inventory_image = "default_fence_rail_overlay.png^nightshade_wood_fence.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^nightshade_wood_fence.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "nightshade:nightshade_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + +local modpath = minetest.get_modpath("nightshade") +local leaves = "nightshade:nightshade_leaves" +local stick = "default:stick" + +local trees = { + { + name = "Short", + recipe = { + {"", leaves, ""}, + {leaves, leaves, leaves}, + {"", stick, ""}, + }, + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-6, y = pos.y, z = pos.z-5}, modpath.."/schematics/nightshade_tree_2.mts", "0", nil, false) + end, + }, + { + name = "Tall", + recipe = { + {"", leaves, ""}, + {leaves, stick, leaves}, + {"", stick, ""}, + }, + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/nightshade_tree_1.mts", "0", nil, false) + end, + }, +} + +local mod_bonemeal = minetest.get_modpath("bonemeal") + +for index,def in ipairs(trees) do + local sapling = "nightshade:nightshade_sapling_" .. index + local image = "nightshade_sapling_" .. index .. ".png" + + -- Register sapling + minetest.register_node(sapling, { + description = def.name .. " Nightshade Sapling", + drawtype = "plantlike", + tiles = {image}, + inventory_image = image, + wield_image = image, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = function(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + else + minetest.remove_node(pos) + def.grow_function(pos) + end + end, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + sapling, + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + -- Register sapling crafting recipe + minetest.register_craft({ + output = sapling, + recipe = def.recipe, + }) + + -- Add bonemeal integration if supported + if mod_bonemeal then + bonemeal:add_sapling({ + {sapling, def.grow_function, "soil"}, + }) + end +end + +minetest.register_alias("nightshade:nightshade_sapling","nightshade:nightshade_sapling_2") \ No newline at end of file diff --git a/mods/biomes/nightshade/schematics/nightshade_bush.mts b/mods/biomes/nightshade/schematics/nightshade_bush.mts new file mode 100644 index 00000000..cc081c17 Binary files /dev/null and b/mods/biomes/nightshade/schematics/nightshade_bush.mts differ diff --git a/mods/biomes/nightshade/schematics/nightshade_tree_1.mts b/mods/biomes/nightshade/schematics/nightshade_tree_1.mts new file mode 100644 index 00000000..a3590f09 Binary files /dev/null and b/mods/biomes/nightshade/schematics/nightshade_tree_1.mts differ diff --git a/mods/biomes/nightshade/schematics/nightshade_tree_2.mts b/mods/biomes/nightshade/schematics/nightshade_tree_2.mts new file mode 100644 index 00000000..bc1f6141 Binary files /dev/null and b/mods/biomes/nightshade/schematics/nightshade_tree_2.mts differ diff --git a/mods/biomes/nightshade/schematics/nightshade_tree_3.mts b/mods/biomes/nightshade/schematics/nightshade_tree_3.mts new file mode 100644 index 00000000..7af305b5 Binary files /dev/null and b/mods/biomes/nightshade/schematics/nightshade_tree_3.mts differ diff --git a/mods/biomes/nightshade/schematics/nightshade_tree_log_1.mts b/mods/biomes/nightshade/schematics/nightshade_tree_log_1.mts new file mode 100644 index 00000000..4761feb8 Binary files /dev/null and b/mods/biomes/nightshade/schematics/nightshade_tree_log_1.mts differ diff --git a/mods/biomes/nightshade/schematics/nightshade_tree_log_2.mts b/mods/biomes/nightshade/schematics/nightshade_tree_log_2.mts new file mode 100644 index 00000000..0d9e5e75 Binary files /dev/null and b/mods/biomes/nightshade/schematics/nightshade_tree_log_2.mts differ diff --git a/mods/biomes/nightshade/textures/doors_item_nightshade.png b/mods/biomes/nightshade/textures/doors_item_nightshade.png new file mode 100644 index 00000000..f83c8712 Binary files /dev/null and b/mods/biomes/nightshade/textures/doors_item_nightshade.png differ diff --git a/mods/biomes/nightshade/textures/doors_nightshade_door.png b/mods/biomes/nightshade/textures/doors_nightshade_door.png new file mode 100644 index 00000000..d52429ad Binary files /dev/null and b/mods/biomes/nightshade/textures/doors_nightshade_door.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_grass.png b/mods/biomes/nightshade/textures/nightshade_grass.png new file mode 100644 index 00000000..044fa272 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_grass.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_lamp.png b/mods/biomes/nightshade/textures/nightshade_lamp.png new file mode 100644 index 00000000..2d58a1e5 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_lamp.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_nightshade_grass.png b/mods/biomes/nightshade/textures/nightshade_nightshade_grass.png new file mode 100644 index 00000000..6571feef Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_nightshade_grass.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_nightshade_grass_side.png b/mods/biomes/nightshade/textures/nightshade_nightshade_grass_side.png new file mode 100644 index 00000000..57f23d25 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_nightshade_grass_side.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_sapling_1.png b/mods/biomes/nightshade/textures/nightshade_sapling_1.png new file mode 100644 index 00000000..ea855ee5 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_sapling_1.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_sapling_2.png b/mods/biomes/nightshade/textures/nightshade_sapling_2.png new file mode 100644 index 00000000..bdb7255a Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_sapling_2.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_trapdoor.png b/mods/biomes/nightshade/textures/nightshade_trapdoor.png new file mode 100644 index 00000000..3c89d82e Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_trapdoor.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_trapdoor_side.png b/mods/biomes/nightshade/textures/nightshade_trapdoor_side.png new file mode 100644 index 00000000..69c23d17 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_trapdoor_side.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_tree.png b/mods/biomes/nightshade/textures/nightshade_tree.png new file mode 100644 index 00000000..1b792a2f Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_tree.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_tree_glowing_leaves.png b/mods/biomes/nightshade/textures/nightshade_tree_glowing_leaves.png new file mode 100644 index 00000000..469cc1f9 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_tree_glowing_leaves.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_tree_leaves.png b/mods/biomes/nightshade/textures/nightshade_tree_leaves.png new file mode 100644 index 00000000..5ae57392 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_tree_leaves.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_tree_top.png b/mods/biomes/nightshade/textures/nightshade_tree_top.png new file mode 100644 index 00000000..6e8bc0fb Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_tree_top.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_wood.png b/mods/biomes/nightshade/textures/nightshade_wood.png new file mode 100644 index 00000000..7c895adc Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_wood.png differ diff --git a/mods/biomes/nightshade/textures/nightshade_wood_fence.png b/mods/biomes/nightshade/textures/nightshade_wood_fence.png new file mode 100644 index 00000000..df69fdd8 Binary files /dev/null and b/mods/biomes/nightshade/textures/nightshade_wood_fence.png differ diff --git a/mods/biomes/prairie/README.md b/mods/biomes/prairie/README.md new file mode 100644 index 00000000..a564a364 --- /dev/null +++ b/mods/biomes/prairie/README.md @@ -0,0 +1,2 @@ +# prairie +Adds a prairie biome with a few more objects. And more tree with flowers diff --git a/mods/biomes/prairie/biome.png b/mods/biomes/prairie/biome.png new file mode 100644 index 00000000..5c6bba6c Binary files /dev/null and b/mods/biomes/prairie/biome.png differ diff --git a/mods/biomes/prairie/init.lua b/mods/biomes/prairie/init.lua new file mode 100644 index 00000000..7a1e592e --- /dev/null +++ b/mods/biomes/prairie/init.lua @@ -0,0 +1,4 @@ +local default_path = minetest.get_modpath("prairie") + +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/nodes.lua") diff --git a/mods/biomes/prairie/license.txt b/mods/biomes/prairie/license.txt new file mode 100644 index 00000000..af3dc37b --- /dev/null +++ b/mods/biomes/prairie/license.txt @@ -0,0 +1,18 @@ + License +------------------------------------------------------------------------------------------------------------------------ +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Anyone can fix the mod. My Discord "Atlante#1952" And my Mail Address "AtlanteEtDocteur@gmail.com" + + diff --git a/mods/biomes/prairie/mapgen.lua b/mods/biomes/prairie/mapgen.lua new file mode 100644 index 00000000..1765e969 --- /dev/null +++ b/mods/biomes/prairie/mapgen.lua @@ -0,0 +1,83 @@ +minetest.register_decoration({ + name = "prairie:prairie_tree_1", + deco_type = "schematic", + place_on = {"prairie:prairie_dirt_with_grass"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.003, + biomes = {"prairie"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("prairie").."/schematics/prairie_tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "prairie:tree_2", + deco_type = "schematic", + place_on = {"prairie:prairie_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.003, + biomes = {"prairie"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("prairie").."/schematics/prairie_tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "prairie:bush", + deco_type = "schematic", + place_on = {"prairie:prairie_dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.0005, + biomes = {"prairie"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("default").."/schematics/bush.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "prairie:blueberry", + deco_type = "schematic", + place_on = {"prairie:prairie_dirt_with_grass"}, + place_offset_y = 1, + sidelen = 16, + fill_ratio = 0.00175, + biomes = {"prairie"}, + y_max = 31000, + y_min = -20, + schematic = minetest.get_modpath("default").."/schematics/blueberry_bush.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"prairie:prairie_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.16, + biomes = {"prairie"}, + decoration = { + "default:grass_1", "default:grass_2", + "default:grass_3", "default:grass_4", + "default:grass_5", + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"prairie:prairie_dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.05, + biomes = {"prairie"}, + decoration = { + "default:mushroom_brown" + } +}) \ No newline at end of file diff --git a/mods/biomes/prairie/mod.conf b/mods/biomes/prairie/mod.conf new file mode 100644 index 00000000..fe441204 --- /dev/null +++ b/mods/biomes/prairie/mod.conf @@ -0,0 +1,7 @@ + +author = Atlante +name = prairie + +description = Adds a prairie biome with a few more objects. And more tree with flowers +title = Prairie +depends = default diff --git a/mods/biomes/prairie/nodes.lua b/mods/biomes/prairie/nodes.lua new file mode 100644 index 00000000..62d20132 --- /dev/null +++ b/mods/biomes/prairie/nodes.lua @@ -0,0 +1,121 @@ +local modpath = minetest.get_modpath("prairie") + +minetest.register_node("prairie:prairie_dirt_with_grass", { + description = "Prairie Dirt With Grass", + tiles = {"prairie_grass.png", "default_dirt.png", + {name = "default_dirt.png^prairie_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +--[[ + Trees +]] + +local trees = { + { + name = "Sunny", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/prairie_tree_1.mts", "random", nil, false) + end, + }, + { + name = "Cheerful", + grow_function = function(pos) + minetest.remove_node(pos) + minetest.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/prairie_tree_2.mts", "random", nil, false) + end, + }, +} + +for index,def in ipairs(trees) do + local sapling = "prairie:prairie_sapling_" .. index + local image = "prairie_sapling_" .. index .. ".png" + local leaves = "prairie:prairie_leaves_" .. index + + -- Register leaves + minetest.register_node("prairie:prairie_leaves_" .. index, { + description = def.name .. " Prairie Leaves", + drawtype = "allfaces_optional", + waving = 1, + tiles = {"prairie_leaves_" .. index .. ".png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {sapling}, rarity = 20}, + {items = {leaves}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + -- Register sapling + minetest.register_node(sapling, { + description = def.name .. " Prairie Sapling", + drawtype = "plantlike", + tiles = {image}, + inventory_image = image, + wield_image = image, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = function(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + else + def.grow_function(pos) + end + end, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + sapling, + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + -- Register sapling crafting recipe + minetest.register_craft({ + output = sapling, + recipe = { + {"", leaves, ""}, + {leaves, "default:stick", leaves} + }, + }) + + -- Add bonemeal integration if supported + if mod_bonemeal then + bonemeal:add_sapling({ + {node, def.grow_function, "soil"}, + }) + end +end \ No newline at end of file diff --git a/mods/biomes/prairie/schematics/prairie_tree_1.mts b/mods/biomes/prairie/schematics/prairie_tree_1.mts new file mode 100644 index 00000000..5c18dd2b Binary files /dev/null and b/mods/biomes/prairie/schematics/prairie_tree_1.mts differ diff --git a/mods/biomes/prairie/schematics/prairie_tree_2.mts b/mods/biomes/prairie/schematics/prairie_tree_2.mts new file mode 100644 index 00000000..59ab0f49 Binary files /dev/null and b/mods/biomes/prairie/schematics/prairie_tree_2.mts differ diff --git a/mods/biomes/prairie/textures/prairie_grass.png b/mods/biomes/prairie/textures/prairie_grass.png new file mode 100644 index 00000000..0f7c81a1 Binary files /dev/null and b/mods/biomes/prairie/textures/prairie_grass.png differ diff --git a/mods/biomes/prairie/textures/prairie_grass_side.png b/mods/biomes/prairie/textures/prairie_grass_side.png new file mode 100644 index 00000000..c37acce2 Binary files /dev/null and b/mods/biomes/prairie/textures/prairie_grass_side.png differ diff --git a/mods/biomes/prairie/textures/prairie_leaves_1.png b/mods/biomes/prairie/textures/prairie_leaves_1.png new file mode 100644 index 00000000..9ced7a50 Binary files /dev/null and b/mods/biomes/prairie/textures/prairie_leaves_1.png differ diff --git a/mods/biomes/prairie/textures/prairie_leaves_2.png b/mods/biomes/prairie/textures/prairie_leaves_2.png new file mode 100644 index 00000000..d9690426 Binary files /dev/null and b/mods/biomes/prairie/textures/prairie_leaves_2.png differ diff --git a/mods/biomes/prairie/textures/prairie_sapling_1.png b/mods/biomes/prairie/textures/prairie_sapling_1.png new file mode 100644 index 00000000..f28e7b4a Binary files /dev/null and b/mods/biomes/prairie/textures/prairie_sapling_1.png differ diff --git a/mods/biomes/prairie/textures/prairie_sapling_2.png b/mods/biomes/prairie/textures/prairie_sapling_2.png new file mode 100644 index 00000000..415bb661 Binary files /dev/null and b/mods/biomes/prairie/textures/prairie_sapling_2.png differ diff --git a/mods/bonemeal/README.md b/mods/bonemeal/README.md new file mode 100644 index 00000000..9a97f2aa --- /dev/null +++ b/mods/bonemeal/README.md @@ -0,0 +1,200 @@ +minetest mod Bonemeal +===================== + +FARM mod that helps and featured the farming to quickly grow samplings, crops, grass, etc + +Information +----------- + +Bonemeal is crushed from bones found in dirt or by using player bones, Mulch is +made from a tree trunk surrounded by leaves and Fertiliser is a mix of both, +each of which can be used to quickly grow saplings, crops and grass/decoration, +papyrus on top of dirt and cactus on sand. + +Support for ethereal saplings/crops, farming redo crops and moretrees saplings are included. + +![](screenshot.jpg) + +## Technical info + +This mod is named `bonemeal` and must be installed with such name. + +This mod adds four new items into the game, bones which can be dug from normal +dirt which can be cooked into bonemeal, mulch which is is crafted using a tree +and 8x leaves, and fertiliser which is a mixture of them both. + +Each item can be used on saplings and crops for a chance to grow them quicker +as well as dirt which will generate random grass, flowers or whichever +decoration is registered. + +Mulch has a strength of 1, Bonemeal 2 and Fertiliser 3. This means the stronger +the item, the more chance of growing saplings in low light, making crops sprout +quicker or simply decorate a larger area with grass and flowers. + +#### Dependencies + +Dependencies: default + +Optional Dependencies: farming, ethereal, moretrees, lucky_block, moretrees, flowers, dye, ferns, dryplants, df_trees, df_farming, df_primordial_items, everness + +Lucky Blocks: 6 + +#### API + +The [`api.txt`](api.txt) document shows how to add your own saplings, +crops and grasses to the list by using one of the 3 commands included and +the [`mod.lua`](mod.lua) file gives you many examples by using some of the +popular mods available. + +https://forum.minetest.net/viewtopic.php?f=9&t=16446 + +#### Nodes + +| Node name | description | notes | +| ----------------------- | ------------ | --------------------------------------------------- | +| bonemeal:mulch | Mulch | fertilizer to make grow plants and seeds faster | +| bonemeal:bonemeal | Bone Meal | 2 x fertilizer to make grow plants and seeds faster | +| bonemeal:fertiliser | Fertiliser | 3 x fertilizer to make grow plants and seeds faster | +| bonemeal:bone | Bone | cook to made fertilizers, found into dirt rarelly | +| bone:bone | Player bones | cook to made fertilizers, found into dirt rarelly | +| bonemeal:gelatin_powder | Gelatin Powder | made from bones | + +#### Crafts + +* bonemeal:gelatin_powder 4 + +``` + {"group:bone", "group:bone", "group:bone"}, + {"bucket:bucket_water", "bucket:bucket_water", "bucket:bucket_water"}, + {"bucket:bucket_water", "default:torch", "bucket:bucket_water"} +``` + +* bonemeal:bonemeal 2 + +``` + {{"group:bone"}} +``` + +* bonemeal:bonemeal 4 + +``` + {{"bones:bones"}} +``` + +* bonemeal:bonemeal 2 + +``` + {{"default:coral_skeleton"}} +``` + +* bonemeal:mulch 4 + +``` + {"group:tree", "group:leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"} +``` + +* bonemeal:mulch + +``` + {"group:seed", "group:seed", "group:seed"}, + {"group:seed", "group:seed", "group:seed"}, + {"group:seed", "group:seed", "group:seed"} +``` + +* fertiliser 2 + +``` + {{"bonemeal:bonemeal", "bonemeal:mulch"}} +``` + +## Changelog + +#### Version 0.1 + +* Initial release + +#### Version 0.2 + +* Added global `on_use` function for bonemeal growth + +#### Version 0.3 + +* Added strength to `on_use` global for new items (mulch and fertiliser) + +#### Version 0.4 + +* Added `Intllib` support and `fr.txt` file for French translation. + +#### Version 0.5 + +* Added support for default bush and acacia bush saplings + +#### Version 0.6 + +* Using newer functions. This means Minetest 0.4.16 and above needed to run + +#### Version 0.7 + +* Can be used on papyrus and cactus now +* Added coral recipe +* API addition + +#### Version 0.8 + +* Added support for farming redo's new garlic +* Added pepper and onion crops + +#### Version 0.9 + +* Added support for farming redo's pea and beetroot crops +* Checks for `place_param` + +#### Version 1.0 + +* `add_deco()` now adds to existing item list while `set_deco()` replaces item + list (thanks `h-v-smacker`) + +#### Version 1.1 + +* Added `{can_bonemeal=1}` group for special nodes + +#### Version 1.2 + +* Added support for Minetest 5.0 cactus seedling, blueberry bush sapling and + emergent jungle tree saplings, additional flowers and pine bush sapling + +#### Version 1.3 + +* Added ability to craft dye from mulch, bonemeal and fertiliser (thanks + `orbea`) + +#### Version 1.4 + +* Added support for fern saplings from `plantlife` mod (thanks `nixnoxus`) + +#### Version 1.5 + +* Added support for farming redo's asparagus, eggplant, spinach + +#### Version 1.6 + +* Added helper function for position and protection check +* Added ginger support +* Added moretrees poplar sapling + +#### Version 1.7 + +* Added farming redo's barley, hemp, rye, oat, mint, sunflower, rice seeds +* Added Everness saplings +* Update readme (thanks mckaygerhard) +* Recipe changes, player bones craft into 2x bones, bones must be cooked to + give bonemeal +* Added bushes_classic support + +## LICENSE + +Licence: Code is MIT, Media is CC0 + +(c) Tenplus1 diff --git a/mods/bonemeal/api.txt b/mods/bonemeal/api.txt new file mode 100644 index 00000000..e1966a22 --- /dev/null +++ b/mods/bonemeal/api.txt @@ -0,0 +1,98 @@ + +Bonemeal API +============ + +This guide will show you how to add saplings, crops and dirt types for the +bonemeal mod to use from withhin your own mods. Please make sure that bonemeal +appears in the depends.txt file of your mod so everything work properly. + + +Function Usage +============== + + +Adding Crops +------------ + +bonemeal:add_crop({ + { nodename_start, growing_steps, seed_name, ignore_light } +}) + +This command is used to add new crops for bonemeal to work on. + +e.g. + +bonemeal:add_crop({ + {"farming:cotton_", 8, "farming:seed_cotton"}, + {"farming:wheat_", 8, "farming:seed_wheat"}, + {"mymod:dark_wheat_", 8, "mymod:dark_wheat_seed", true}, -- can grow in darkness +}) + + +Adding Saplings +--------------- + +bonemeal:add_sapling({ + { sapling_node, function, soil_type["sand", "dirt", nodename, "group:"], ignore_light } +}) + +This command will add new saplings for bonemeal to grow on sand, soil or a +specified node type. + +bonemeal:add_sapling({ + {"ethereal:palm_sapling", ethereal.grow_palm_tree, "soil"}, + {"ethereal:palm_sapling", ethereal.grow_palm_tree, "sand"}, + {"mymod:dark_tree", mymod.dark_tree, "group:soil", true}, -- can grow in darkness +}) + + +Adding Dirt Decoration +---------------------- + +bonemeal:add_deco({ + { dirt_node, {grass_node_list}, {decor_node_list} } +}) + +This command will add grass and decoration to specific dirt types, use "" to +add an empty node. If some decorations have been already defined for this dirt type, new +will be added to the respective list. All empty ("") entries will be added regardless, +which allows to decrease the frequency of decoration emergence, if needed. + +e.g. + +bonemeal:add_deco({ + {"default:dirt_with_dry_grass", {"default:dry_grass_1", ""}, + {"flowers:rose", "flowers:viola"} } +}) + +Thus, add_deco() always adds (to) a definition, and never overrides. To discard an existing +definiton in favor of the new one, use + +bonemeal:set_deco({ + { dirt_node, {grass_node_list}, {decor_node_list} } +}) + +This command will set decoration for a given dirt type, fully replacing any existing definition. + + +Global ON_USE Function +---------------------- + +bonemeal:on_use(pos, strength, node) + +This function can be called from other mods to grow plants using alternative +bonemeal items and have the same effect. + + {pos} is the location to apply growing + {strength} is how strong to grow [low of 1 to high of 4] + {node} is the node at pos, but can be left nil to get_node itself + +Note: Higher strength items require lower light levels, and a strength of 4 +needs no light at all. + + +Final Words +=========== + +I hope this guide helps you add your own plants so you can grow them quickly +with the items included. Please check the mods.lua for more examples. diff --git a/mods/bonemeal/init.lua b/mods/bonemeal/init.lua new file mode 100644 index 00000000..7606a319 --- /dev/null +++ b/mods/bonemeal/init.lua @@ -0,0 +1,680 @@ + +bonemeal = { + item_list = { + bucket_water = "bucket:bucket_water", + bucket_empty = "bucket:bucket_empty", + dirt = "default:dirt", + torch = "default:torch", + coral = "default:coral_skeleton" + } +} + +local a = bonemeal.item_list + +if minetest.get_modpath("mcl_core") then + + a.bucket_water = "mcl_buckets:bucket_water" + a.bucket_empty = "mcl_buckets:bucker_empty" + a.dirt = "mcl_core:dirt" + a.torch = "mcl_torches:torch" + a.coral = "mcl_ocean:dead_horn_coral_block" +end + + +local path = minetest.get_modpath("bonemeal") +local min, max, random = math.min, math.max, math.random + +-- translation support +local S = minetest.get_translator("bonemeal") + +-- creative check +local creative_mode_cache = minetest.settings:get_bool("creative_mode") +function bonemeal.is_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + +local crops = {} +local saplings = {} +local deco = {} + +-- +-- local functions +-- + +-- particles +local function particle_effect(pos) + + minetest.add_particlespawner({ + amount = 4, + time = 0.15, + minpos = pos, + maxpos = pos, + minvel = {x = -1, y = 2, z = -1}, + maxvel = {x = 1, y = 4, z = 1}, + minacc = {x = -1, y = -1, z = -1}, + maxacc = {x = 1, y = 1, z = 1}, + minexptime = 1, + maxexptime = 1, + minsize = 1, + maxsize = 3, + texture = "bonemeal_particle.png", + glow = 5 + }) +end + + +-- tree type check +local function grow_tree(pos, object) + + if type(object) == "table" and object.axiom then + + -- grow L-system tree + minetest.remove_node(pos) + minetest.spawn_tree(pos, object) + + elseif type(object) == "string" and minetest.registered_nodes[object] then + + -- place node + minetest.set_node(pos, {name = object}) + + elseif type(object) == "function" then + + -- function + object(pos) + end +end + + +-- sapling check +local function check_sapling(pos, sapling_node, strength, light_ok) + + -- what is sapling placed on? + local under = minetest.get_node({ + x = pos.x, + y = pos.y - 1, + z = pos.z + }) + + local can_grow, grow_on + + -- check list for sapling and function + for n = 1, #saplings do + + if saplings[n][1] == sapling_node then + + grow_on = saplings[n][3] or "" + + -- backwards compatibility, add 'group:' to older grouping + if grow_on == "soil" or grow_on == "sand" then + grow_on = "group:" .. grow_on + end + + -- sapling grows on top of specific node group + if grow_on:find("group:") then + + local group = grow_on:split(":")[2] + + if minetest.get_item_group(under.name, group) > 0 then + can_grow = true + end + + -- sapling grows on specific node + elseif grow_on == under.name then + can_grow = true + end + + -- check if we can grow sapling at current light level + if can_grow and (light_ok or saplings[n][4] == true) then + + particle_effect(pos) + + if math.random(5 - strength) == 1 then + grow_tree(pos, saplings[n][2]) + end + + return true + end + end + end +end + + +-- crops check +local function check_crops(pos, node, strength, light_ok) + + local mod, crop, stage, nod, def + local nodename = node.name + + -- grow registered crops + for n = 1, #crops do + + -- check if crop can grow in current light level + if (light_ok or crops[n][4] == true) + and (nodename:find("^" .. crops[n][1]) + or nodename == crops[n][3]) then + + -- separate mod and node name + mod = nodename:split(":")[1] .. ":" + crop = nodename:split(":")[2] + + -- get stage number or set to 0 for seed + if crop:split("_")[3] then + stage = crop:split("_")[3] + else + stage = crop:split("_")[2] + end + + stage = tonumber(stage) or 0 + + stage = min(stage + strength, crops[n][2]) + + -- check for place_param setting + nod = crops[n][1] .. stage + def = minetest.registered_nodes[nod] + + -- make sure crop exists or isn't fully grown already + if not def or nod == nodename then + return false + end + + minetest.set_node(pos, {name = nod, param2 = node.param2 or def.place_param2}) + + particle_effect(pos) + + minetest.get_node_timer(pos):start(10) -- restart any timers + + return true + end + end +end + + +-- check soil for specific decoration placement +local function check_soil(pos, nodename, strength) + + -- set radius according to strength + local side = strength - 1 + local tall = max(strength - 2, 0) + + -- get area of land with free space above + local dirt = minetest.find_nodes_in_area_under_air( + {x = pos.x - side, y = pos.y - tall, z = pos.z - side}, + {x = pos.x + side, y = pos.y + tall, z = pos.z + side}, {nodename}) + + -- set default grass and decoration + local grass, decor + + -- choose grass and decoration to use on dirt patch + for n = 1, #deco do + + -- do we have a grass match? + if nodename == deco[n][1] then + + grass = deco[n][2] or {} + decor = deco[n][3] or {} + end + end + + local pos2, nod, def + + -- loop through soil + for _, n in pairs(dirt) do + + if random(5) == 5 then + + if decor and #decor > 0 then + + -- place random decoration (rare) + local dnum = #decor or 1 + + nod = decor[random(dnum)] or "" + end + else + if grass and #grass > 0 then + + -- place random grass (common) + local dgra = #grass or 1 + + nod = #grass > 0 and grass[random(dgra)] or "" + end + end + + pos2 = n + + pos2.y = pos2.y + 1 + + if nod and nod ~= "" then + + -- get crop param2 value + def = minetest.registered_nodes[nod] + def = def and def.place_param2 + + -- if param2 not preset then get from existing node + if not def then + + local node = minetest.get_node_or_nil(pos2) + + def = node and node.param2 or 0 + end + + minetest.set_node(pos2, {name = nod, param2 = def}) + end + + particle_effect(pos2) + end +end + + +-- helper function +local function use_checks(user, pointed_thing) + + -- make sure we use on node + if pointed_thing.type ~= "node" then + return false + end + + -- get position and node info + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + local dirt = def and def.groups + + -- does node have groups set + if not dirt then + return false + end + + -- if we're using on ground, move position up + if dirt.soil or dirt.sand or dirt.can_bonemeal then + pos = pointed_thing.above + end + + -- check if protected + if minetest.is_protected(pos, user:get_player_name()) then + return false + end + + return node +end + + +-- global functions + + +-- add to sapling list +-- {sapling node, schematic or function name, "soil"|"sand"|specific_node|"group:"} +--e.g. {"default:sapling", default.grow_new_apple_tree, "soil"} + +function bonemeal:add_sapling(list) + + for n = 1, #list do + saplings[#saplings + 1] = list[n] + end +end + + +-- add to crop list to force grow +-- {crop name start_, growth steps, seed node (if required)} +-- e.g. {"farming:wheat_", 8, "farming:seed_wheat"} +function bonemeal:add_crop(list) + + for n = 1, #list do + crops[#crops + 1] = list[n] + end +end + + +-- add grass and flower/plant decoration for specific dirt types +-- {dirt_node, {grass_nodes}, {flower_nodes} +-- e.g. {"default:dirt_with_dry_grass", dry_grass, flowers} +-- if an entry already exists for a given dirt type, it will add new entries and all empty +-- entries, allowing to both add decorations and decrease their frequency. +function bonemeal:add_deco(list) + + for l = 1, #list do + + for n = 1, #deco do + + -- update existing entry + if list[l][1] == deco[n][1] then + + -- adding grass types + for _, extra in pairs(list[l][2]) do + + if extra ~= "" then + + for _, entry in pairs(deco[n][2]) do + + if extra == entry then + extra = false + break + end + end + end + + if extra then + deco[n][2][#deco[n][2] + 1] = extra + end + end + + -- adding decoration types + for _, extra in ipairs(list[l][3]) do + + if extra ~= "" then + + for __, entry in pairs(deco[n][3]) do + + if extra == entry then + extra = false + break + end + end + end + + if extra then + deco[n][3][#deco[n][3] + 1] = extra + end + end + + list[l] = false + break + end + end + + if list[l] then + deco[#deco + 1] = list[l] + end + end +end + + +-- definitively set a decration scheme +-- this function will either add a new entry as is, or replace the existing one +function bonemeal:set_deco(list) + + for l = 1, #list do + + for n = 1, #deco do + + -- replace existing entry + if list[l][1] == deco[n][1] then + + deco[n][2] = list[l][2] + deco[n][3] = list[l][3] + + list[l] = false + + break + end + end + + if list[l] then + deco[#deco + 1] = list[l] + end + end +end + + +-- global on_use function for bonemeal +function bonemeal:on_use(pos, strength, node) + + -- get node pointed at + local node = node or minetest.get_node(pos) + + -- return if nothing there + if node.name == "ignore" then + return + end + + -- make sure strength is between 1 and 4 + strength = strength or 1 + strength = max(strength, 1) + strength = min(strength, 4) + + -- papyrus and cactus + if node.name == "default:papyrus" then + + default.grow_papyrus(pos, node) + + particle_effect(pos) + + return true + + elseif node.name == "default:cactus" then + + default.grow_cactus(pos, node) + + particle_effect(pos) + + return true + + elseif node.name == "default:dry_dirt" and strength == 1 then + + minetest.set_node(pos, {name = "default:dry_dirt_with_dry_grass"}) + + particle_effect(pos) + + return true + end + + -- grow grass and flowers + if minetest.get_item_group(node.name, "soil") > 0 + or minetest.get_item_group(node.name, "sand") > 0 + or minetest.get_item_group(node.name, "can_bonemeal") > 0 then + + check_soil(pos, node.name, strength) + + return true + end + + -- light check depending on strength (strength of 4 = no light needed) + local light_ok = true + + if (minetest.get_node_light(pos) or 0) < (12 - (strength * 3)) then + light_ok = nil + end + + -- check for sapling growth + if check_sapling(pos, node.name, strength, light_ok) then + return true + end + + -- check for crop growth + if check_crops(pos, node, strength, light_ok) then + return true + end +end + + +-- +-- items +-- + + +-- mulch (strength 1) +minetest.register_craftitem("bonemeal:mulch", { + description = S("Mulch"), + inventory_image = "bonemeal_mulch.png", + + on_use = function(itemstack, user, pointed_thing) + + -- use helper function to do checks and return position and node + local node = use_checks(user, pointed_thing) + + if node then + + -- call global on_use function with strength of 1 + local used = bonemeal:on_use(pointed_thing.under, 1, node) + + -- take item if not in creative + if used and not bonemeal.is_creative(user:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end +}) + + +-- bonemeal (strength 2) +minetest.register_craftitem("bonemeal:bonemeal", { + description = S("Bone Meal"), + inventory_image = "bonemeal_item.png", + + on_use = function(itemstack, user, pointed_thing) + + -- use helper function to do checks and return position and node + local node = use_checks(user, pointed_thing) + + if node then + + -- call global on_use function with strength of 2 + local used = bonemeal:on_use(pointed_thing.under, 2, node) + + -- take item if not in creative + if used and not bonemeal.is_creative(user:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end +}) + + +-- fertiliser (strength 3) +minetest.register_craftitem("bonemeal:fertiliser", { + description = S("Fertiliser"), + inventory_image = "bonemeal_fertiliser.png", + + on_use = function(itemstack, user, pointed_thing) + + -- use helper function to do checks and return position and node + local node = use_checks(user, pointed_thing) + + if node then + + -- call global on_use function with strength of 3 + local used = bonemeal:on_use(pointed_thing.under, 3, node) + + -- take item if not in creative + if used and not bonemeal.is_creative(user:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end +}) + + +-- bone +minetest.register_craftitem("bonemeal:bone", { + description = S("Bone"), + inventory_image = "bonemeal_bone.png", + groups = {bone = 1} +}) + +-- gelatin powder +minetest.register_craftitem("bonemeal:gelatin_powder", { + description = S("Gelatin Powder"), + inventory_image = "bonemeal_gelatin_powder.png", + groups = {food_gelatin = 1, flammable = 2} +}) + + +-- +-- crafting recipes +-- + +-- gelatin powder +minetest.register_craft({ + output = "bonemeal:gelatin_powder 4", + recipe = { + {"group:bone", "group:bone", "group:bone"}, + {a.bucket_water, a.bucket_water, a.bucket_water}, + {a.bucket_water, a.torch, a.bucket_water} + }, + replacements = { + {a.bucket_water, a.bucket_empty .. " 5"} + } +}) + +-- bonemeal (from bone) +minetest.register_craft({ + type = "cooking", + output = "bonemeal:bonemeal 2", + recipe = "group:bone", + cooktime = 4 +}) + +-- bonemeal (from player bones) +if minetest.settings:get_bool("bonemeal.disable_deathbones_recipe",true) ~= true then + + minetest.register_craft({ + output = "bonemeal:bone 2", + recipe = {{"bones:bones"}} + }) +end + +-- bonemeal (from coral skeleton) +minetest.register_craft({ + output = "bonemeal:bonemeal 2", + recipe = {{a.coral}} +}) + +-- mulch +minetest.register_craft({ + output = "bonemeal:mulch 4", + recipe = { + {"group:tree", "group:leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"} + } +}) + +minetest.register_craft({ + output = "bonemeal:mulch", + recipe = { + {"group:seed", "group:seed", "group:seed"}, + {"group:seed", "group:seed", "group:seed"}, + {"group:seed", "group:seed", "group:seed"} + } +}) + +-- fertiliser +minetest.register_craft({ + output = "bonemeal:fertiliser 2", + recipe = {{"bonemeal:bonemeal", "bonemeal:mulch"}} +}) + +-- add bones to dirt +if minetest.registered_items[a.dirt] then + + minetest.override_item(a.dirt, { + drop = { + max_items = 1, + items = { + { + items = {"bonemeal:bone"}, + rarity = 40 + }, + { + items = {a.dirt} + } + } + } + }) +end + +-- add support for mods +dofile(path .. "/mods.lua") + +-- lucky block support +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end + + +print ("[MOD] Bonemeal loaded") diff --git a/mods/bonemeal/license.txt b/mods/bonemeal/license.txt new file mode 100644 index 00000000..de42aeb6 --- /dev/null +++ b/mods/bonemeal/license.txt @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Textures by TenPlus1 (CC0) diff --git a/mods/bonemeal/locale/bonemeal.de.tr b/mods/bonemeal/locale/bonemeal.de.tr new file mode 100644 index 00000000..d31d3e34 --- /dev/null +++ b/mods/bonemeal/locale/bonemeal.de.tr @@ -0,0 +1,6 @@ +# textdomain:bonemeal +Bone=Knochen +Bone Meal=Knochenmehl +Fertiliser=Dünger +Gelatin Powder=Gelatinepulver +Mulch=Mulch diff --git a/mods/bonemeal/locale/bonemeal.en.tr b/mods/bonemeal/locale/bonemeal.en.tr new file mode 100644 index 00000000..c3e9590b --- /dev/null +++ b/mods/bonemeal/locale/bonemeal.en.tr @@ -0,0 +1,6 @@ +# textdomain:bonemeal +#Bone= +#Bone Meal= +#Fertiliser= +#Gelatin Powder= +#Mulch= diff --git a/mods/bonemeal/locale/bonemeal.es.tr b/mods/bonemeal/locale/bonemeal.es.tr new file mode 100644 index 00000000..3021ae20 --- /dev/null +++ b/mods/bonemeal/locale/bonemeal.es.tr @@ -0,0 +1,6 @@ +# textdomain:bonemeal +Bone=Hueso +Bone Meal=Comida de hueso +Fertiliser=Fertilizante +#Gelatin Powder= +Mulch=Mantillo diff --git a/mods/bonemeal/locale/bonemeal.fr.tr b/mods/bonemeal/locale/bonemeal.fr.tr new file mode 100644 index 00000000..11bf4091 --- /dev/null +++ b/mods/bonemeal/locale/bonemeal.fr.tr @@ -0,0 +1,6 @@ +# textdomain:bonemeal +Bone=Os +Bone Meal=Poudre d'os +Fertiliser=Engrais +Gelatin Powder=Poudre de gélatine +Mulch=Paillis diff --git a/mods/bonemeal/locale/bonemeal.it.tr b/mods/bonemeal/locale/bonemeal.it.tr new file mode 100644 index 00000000..7aa373a0 --- /dev/null +++ b/mods/bonemeal/locale/bonemeal.it.tr @@ -0,0 +1,6 @@ +# textdomain:bonemeal +Bone=Ossa +Bone Meal=Pasto osseo +Fertiliser=Fertilizzante +#Gelatin Powder= +Mulch=Pacciame diff --git a/mods/bonemeal/locale/bonemeal.ru.tr b/mods/bonemeal/locale/bonemeal.ru.tr new file mode 100644 index 00000000..fc65dc14 --- /dev/null +++ b/mods/bonemeal/locale/bonemeal.ru.tr @@ -0,0 +1,6 @@ +# textdomain:bonemeal +Bone=КоÑть +Bone Meal=КоÑÑ‚Ð½Ð°Ñ ÐœÑƒÐºÐ° +Fertiliser=Удобрение +#Gelatin Powder= +Mulch=Мульча diff --git a/mods/bonemeal/lucky_block.lua b/mods/bonemeal/lucky_block.lua new file mode 100644 index 00000000..a493ee93 --- /dev/null +++ b/mods/bonemeal/lucky_block.lua @@ -0,0 +1,25 @@ + +-- add lucky blocks + +local function growy(pos, player) + + local dpos = minetest.find_node_near(pos, 1, "group:soil") + + if dpos then + bonemeal:on_use(dpos, 5) + end +end + + +lucky_block:add_blocks({ + {"lig"}, + {"dro", {"bonemeal:mulch"}, 10}, + {"dro", {"bonemeal:bonemeal"}, 10}, + {"dro", {"bonemeal:fertiliser"}, 10}, + {"cus", growy}, + {"nod", "default:chest", 0, { + {name = "bonemeal:mulch", max = 20}, + {name = "bonemeal:bonemeal", max = 15}, + {name = "bonemeal:fertiliser", max = 10} + }} +}) diff --git a/mods/bonemeal/mod.conf b/mods/bonemeal/mod.conf new file mode 100644 index 00000000..9b18caf0 --- /dev/null +++ b/mods/bonemeal/mod.conf @@ -0,0 +1,4 @@ +name = bonemeal +description = Adds bone and bonemeal giving the ability to quickly grow plants and saplings. +optional_depends = default, mcl_core, lucky_block, farming, ethereal, moretrees, technic_worldgen, flowers, dye, ferns, dryplants, df_trees, df_farming, df_primordial_items, everness, x_farming +min_minetest_version = 5.0 diff --git a/mods/bonemeal/mods.lua b/mods/bonemeal/mods.lua new file mode 100644 index 00000000..4ebf36fe --- /dev/null +++ b/mods/bonemeal/mods.lua @@ -0,0 +1,480 @@ + +-- craft bones from animalmaterials into bonemeal +if minetest.get_modpath("animalmaterials") then + + minetest.register_craft({ + output = "bonemeal:bonemeal 2", + recipe = {{"animalmaterials:bone"}} + }) +end + + +if minetest.get_modpath("default") then + + -- saplings + + local function pine_grow(pos) + + if minetest.find_node_near(pos, 1, + {"default:snow", "default:snowblock", "default:dirt_with_snow"}) then + + default.grow_new_snowy_pine_tree(pos) + else + default.grow_new_pine_tree(pos) + end + end + + local function cactus_grow(pos) + default.grow_cactus(pos, minetest.get_node(pos)) + end + + local function papyrus_grow(pos) + default.grow_papyrus(pos, minetest.get_node(pos)) + end + + bonemeal:add_sapling({ + {"default:sapling", default.grow_new_apple_tree, "soil"}, + {"default:junglesapling", default.grow_new_jungle_tree, "soil"}, + {"default:emergent_jungle_sapling", default.grow_new_emergent_jungle_tree, "soil"}, + {"default:acacia_sapling", default.grow_new_acacia_tree, "soil"}, + {"default:aspen_sapling", default.grow_new_aspen_tree, "soil"}, + {"default:pine_sapling", pine_grow, "soil"}, + {"default:bush_sapling", default.grow_bush, "soil"}, + {"default:acacia_bush_sapling", default.grow_acacia_bush, "soil"}, + {"default:large_cactus_seedling", default.grow_large_cactus, "sand"}, + {"default:blueberry_bush_sapling", default.grow_blueberry_bush, "soil"}, + {"default:pine_bush_sapling", default.grow_pine_bush, "soil"}, + {"default:cactus", cactus_grow, "sand"}, + {"default:papyrus", papyrus_grow, "soil"} + }) + + -- decoration + + local green_grass = { + "default:grass_2", "default:grass_3", "default:grass_4", + "default:grass_5", "", "" + } + + local dry_grass = { + "default:dry_grass_2", "default:dry_grass_3", "default:dry_grass_4", + "default:dry_grass_5", "", "" + } + + local flowers = {} + + minetest.after(0.1, function() + + for node, def in pairs(minetest.registered_nodes) do + + if def.groups + and def.groups.flower + and not node:find("waterlily") + and not node:find("seaweed") + and not node:find("xdecor:potted_") + and not node:find("df_farming:") then + flowers[#flowers + 1] = node + end + end + end) + + bonemeal:add_deco({ + {"default:dirt", bonemeal.green_grass, flowers}, + {"default:dirt_with_grass", green_grass, flowers}, + {"default:dry_dirt", dry_grass, {}}, + {"default:dry_dirt_with_dry_grass", dry_grass, {}}, + {"default:dirt_with_dry_grass", dry_grass, flowers}, + {"default:sand", {}, {"default:dry_shrub", "", "", ""} }, + {"default:desert_sand", {}, {"default:dry_shrub", "", "", ""} }, + {"default:silver_sand", {}, {"default:dry_shrub", "", "", ""} }, + {"default:dirt_with_rainforest_litter", {}, {"default:junglegrass", "", "", ""} }, + {"default:dirt_with_coniferous_litter", {}, {"default:fern_1", "default:fern_2", + "default:fern_3", "", "", ""}} + }) +end + + +if farming then + + bonemeal:add_crop({ + {"farming:cotton_", 8, "farming:seed_cotton"}, + {"farming:wheat_", 8, "farming:seed_wheat"} + }) +end + + +if farming and farming.mod and farming.mod == "redo" then + + bonemeal:add_crop({ + {"farming:tomato_", 8}, + {"farming:corn_", 8}, + {"farming:melon_", 8}, + {"farming:pumpkin_", 8}, + {"farming:beanpole_", 5}, + {"farming:blueberry_", 4}, + {"farming:raspberry_", 4}, + {"farming:carrot_", 8}, + {"farming:cocoa_", 4}, + {"farming:coffee_", 5}, + {"farming:cucumber_", 4}, + {"farming:potato_", 4}, + {"farming:grapes_", 8}, + {"farming:rhubarb_", 4}, + {"farming:barley_", 8, "farming:seed_barley"}, + {"farming:hemp_", 8, "farming:seed_hemp"}, + {"farming:chili_", 8}, + {"farming:garlic_", 5}, + {"farming:onion_", 5}, + {"farming:pepper_", 7}, + {"farming:pineapple_", 8}, + {"farming:pea_", 5}, + {"farming:beetroot_", 5}, + {"farming:rye_", 8, "farming:seed_rye"}, + {"farming:oat_", 8, "farming:seed_oat"}, + {"farming:rice_", 8, "farming:seed_rice"}, + {"farming:mint_", 4, "farming:seed_mint"}, + {"farming:cabbage_", 6}, + {"farming:lettuce_", 5}, + {"farming:blackberry_", 4}, + {"farming:vanilla_", 8}, + {"farming:soy_", 7}, + {"farming:artichoke_", 5}, + {"farming:parsley_", 3}, + {"farming:sunflower_", 8, "farming:seed_sunflower"}, + {"farming:asparagus_", 5}, + {"farming:eggplant_", 4}, + {"farming:spinach_", 4}, + {"farming:ginger_", 4}, + {"ethereal:strawberry_", 8} + }) +end + + +if minetest.get_modpath("ethereal") then + + bonemeal:add_crop({ + {"ethereal:strawberry_", 8}, + {"ethereal:onion_", 5} + }) + + bonemeal:add_sapling({ + {"ethereal:palm_sapling", ethereal.grow_palm_tree, "soil"}, + {"ethereal:palm_sapling", ethereal.grow_palm_tree, "sand"}, + {"ethereal:yellow_tree_sapling", ethereal.grow_yellow_tree, "soil"}, + {"ethereal:big_tree_sapling", ethereal.grow_big_tree, "soil"}, + {"ethereal:banana_tree_sapling", ethereal.grow_banana_tree, "soil"}, + {"ethereal:frost_tree_sapling", ethereal.grow_frost_tree, "soil"}, + {"ethereal:mushroom_sapling", ethereal.grow_mushroom_tree, "soil"}, + {"ethereal:mushroom_brown_sapling", ethereal.grow_mushroom_brown_tree, "soil"}, + {"ethereal:willow_sapling", ethereal.grow_willow_tree, "soil"}, + {"ethereal:redwood_sapling", ethereal.grow_redwood_tree, "soil"}, + {"ethereal:giant_redwood_sapling", ethereal.grow_giant_redwood_tree, "soil"}, + {"ethereal:orange_tree_sapling", ethereal.grow_orange_tree, "soil"}, + {"ethereal:bamboo_sprout", ethereal.grow_bamboo_tree, "soil"}, + {"ethereal:birch_sapling", ethereal.grow_birch_tree, "soil"}, + {"ethereal:sakura_sapling", ethereal.grow_sakura_tree, "soil"}, + {"ethereal:lemon_tree_sapling", ethereal.grow_lemon_tree, "soil"}, + {"ethereal:olive_tree_sapling", ethereal.grow_olive_tree, "soil"}, + {"ethereal:basandra_bush_sapling", ethereal.grow_basandra_bush, "soil"} + }) + + local grass = {"default:grass_3", "default:grass_4", "default:grass_5", ""} + + bonemeal:add_deco({ + {"ethereal:crystal_dirt", {"ethereal:crystalgrass", "", "", "", ""}, {}}, + {"ethereal:fiery_dirt", {"ethereal:dry_shrub", "", "", "", ""}, {}}, + {"ethereal:prairie_dirt", grass, {"flowers:dandelion_white", + "flowers:dandelion_yellow", "flowers:geranium", "flowers:rose", + "flowers:tulip", "flowers:viola", "ethereal:strawberry_7"}}, + {"ethereal:gray_dirt", {}, {"ethereal:snowygrass", "", ""}}, + {"ethereal:cold_dirt", {}, {"ethereal:snowygrass", "", ""}}, + {"ethereal:mushroom_dirt", {}, {"flowers:mushroom_red", "flowers:mushroom_brown", + "ethereal:spore_grass", "ethereal:spore_grass", "", "", ""}}, + {"ethereal:jungle_dirt", grass, {"default:junglegrass", "", "", ""}}, + {"ethereal:grove_dirt", grass, {"ethereal:fern", "", "", ""}}, + {"ethereal:bamboo_dirt", grass, {}} + }) +end + + +if minetest.get_modpath("moretrees") then + + -- special fir check for snow + local function fir_grow(pos) + + if minetest.find_node_near(pos, 1, + {"default:snow", "default:snowblock", "default:dirt_with_snow"}) then + + moretrees.grow_fir_snow(pos) + else + moretrees.grow_fir(pos) + end + end + + bonemeal:add_sapling({ + {"moretrees:beech_sapling", moretrees.spawn_beech_object, "soil"}, + {"moretrees:apple_tree_sapling", moretrees.spawn_apple_tree_object, "soil"}, + {"moretrees:oak_sapling", moretrees.spawn_oak_object, "soil"}, + {"moretrees:sequoia_sapling", moretrees.spawn_sequoia_object, "soil"}, + {"moretrees:birch_sapling", moretrees.grow_birch, "soil"}, + {"moretrees:palm_sapling", moretrees.spawn_palm_object, "soil"}, + {"moretrees:palm_sapling", moretrees.spawn_palm_object, "sand"}, + {"moretrees:date_palm_sapling", moretrees.spawn_date_palm_object, "soil"}, + {"moretrees:date_palm_sapling", moretrees.spawn_date_palm_object, "sand"}, + {"moretrees:spruce_sapling", moretrees.grow_spruce, "soil"}, + {"moretrees:cedar_sapling", moretrees.spawn_cedar_object, "soil"}, + {"moretrees:poplar_sapling", moretrees.spawn_poplar_object, "soil"}, + {"moretrees:poplar_small_sapling", moretrees.spawn_poplar_small_object, "soil"}, + {"moretrees:willow_sapling", moretrees.spawn_willow_object, "soil"}, + {"moretrees:rubber_tree_sapling", moretrees.spawn_rubber_tree_object, "soil"}, + {"moretrees:fir_sapling", fir_grow, "soil"} + }) + +elseif minetest.get_modpath("technic_worldgen") then + + bonemeal:add_sapling({ + {"moretrees:rubber_tree_sapling", technic.rubber_tree_model, "soil"} + }) +end + + +if minetest.get_modpath("caverealms") then + + local fil = minetest.get_modpath("caverealms") .. "/schematics/shroom.mts" + local add_shroom = function(pos) + + minetest.swap_node(pos, {name = "air"}) + + minetest.place_schematic( + {x = pos.x - 5, y = pos.y, z = pos.z - 5}, fil, 0, nil, false) + end + + bonemeal:add_sapling({ + {"caverealms:mushroom_sapling", add_shroom, "soil"} + }) +end + + +local function y_func(grow_func) + return function(pos) + grow_func({x = pos.x, y = pos.y - 1, z = pos.z}) + end +end + +if minetest.get_modpath("ferns") then + + bonemeal:add_sapling({ + {"ferns:sapling_giant_tree_fern", y_func(abstract_ferns.grow_giant_tree_fern), "soil"}, + {"ferns:sapling_giant_tree_fern", y_func(abstract_ferns.grow_giant_tree_fern), "sand"}, + {"ferns:sapling_tree_fern", y_func(abstract_ferns.grow_tree_fern), "soil"} + }) +end + +if minetest.get_modpath("dryplants") then + + bonemeal:add_sapling({ + {"dryplants:reedmace_sapling", y_func(abstract_dryplants.grow_reedmace), "soil"} + }) +end + + +if minetest.get_modpath("dye") then + + local bonemeal_dyes = {bonemeal = "white", fertiliser = "green", mulch = "brown"} + + for mat, dye in pairs(bonemeal_dyes) do + + minetest.register_craft({ + output = "dye:" .. dye .. " 4", + recipe = { + {"bonemeal:" .. mat} + }, + }) + end +end + + +if minetest.get_modpath("df_trees") then + + local function spore_tree_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_spore_tree(pos) + end + + local function fungiwood_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_fungiwood(pos) + end + + local function tunnel_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_tunnel_tube(pos) + end + + local function black_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_black_cap(pos) + end + + local function goblin_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_goblin_cap(pos) + end + + local function tower_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_tower_cap(pos) + end + + local function nether_cap_fix(pos) + minetest.remove_node(pos) ; df_trees.spawn_nether_cap(pos) + end + + bonemeal:add_sapling({ + {"df_trees:black_cap_sapling", black_cap_fix, "soil", true}, + {"df_trees:fungiwood_sapling", fungiwood_fix, "soil", true}, + {"df_trees:goblin_cap_sapling", goblin_cap_fix, "soil", true}, + {"df_trees:spore_tree_sapling", spore_tree_fix, "soil", true}, + {"df_trees:tower_cap_sapling", tower_cap_fix, "soil", true}, + {"df_trees:tunnel_tube_sapling", tunnel_fix, "soil", true}, + {"df_trees:nether_cap_sapling", nether_cap_fix, "group:nether_cap", true}, + {"df_trees:nether_cap_sapling", nether_cap_fix, "group:cools_lava", true} + }) +end + + +if minetest.get_modpath("df_farming") then + + bonemeal:add_crop({ + {"df_farming:cave_wheat_", 8, "df_farming:cave_wheat_seed", true}, + {"df_farming:dimple_cup_", 4, "df_farming:dimple_cup_seed", true}, + {"df_farming:pig_tail_", 8, "df_farming:pig_tail_seed", true}, + {"df_farming:plump_helmet_", 4, "df_farming:plump_helmet_spawn", true}, + {"df_farming:quarry_bush_", 5, "df_farming:quarry_bush_seed", true}, + {"df_farming:sweet_pod_", 6, "df_farming:sweet_pod_seed", true} + }) +end + + +if minetest.get_modpath("df_primordial_items") then + + local function mush_fix(pos) + minetest.set_node(pos, {name = "air"}) + mapgen_helper.place_schematic(pos, + df_primordial_items.get_primordial_mushroom(), (math.random(4) - 1) * 90) + end + + local function fern_fix(pos) + minetest.set_node(pos, {name = "air"}) + local rotations = {0, 90, 180, 270} + mapgen_helper.place_schematic(pos, + df_primordial_items.get_fern_schematic(), rotations[math.random(#rotations)]) + end + + local function blood_fix(pos) + df_trees.grow_blood_thorn(pos, minetest.get_node(pos)) + end + + bonemeal:add_sapling({ + {"df_primordial_items:jungle_mushroom_sapling", + df_primordial_items.spawn_jungle_mushroom, "soil", true}, + {"df_primordial_items:jungletree_sapling", + df_primordial_items.spawn_jungle_tree, "soil", true}, + {"df_primordial_items:mush_sapling", mush_fix, "soil", true}, + {"df_primordial_items:fern_sapling", fern_fix, "soil", true}, + {"df_trees:blood_thorn", blood_fix, "sand", true} + }) + + local jgrass = { + "df_primordial_items:jungle_grass_1", + "df_primordial_items:jungle_grass_2", + "df_primordial_items:jungle_grass_3", + "df_primordial_items:fern_1", + "df_primordial_items:fern_2", + "", "", "", "" + } + + local jdeco = { + "df_primordial_items:jungle_mushroom_1", + "df_primordial_items:jungle_mushroom_2", + "df_primordial_items:glow_plant_1", + "df_primordial_items:glow_plant_2", + "df_primordial_items:glow_plant_3", + "", "", "" + } + + bonemeal:add_deco({ + {"df_primordial_items:dirt_with_jungle_grass", jgrass, jdeco} + }) + + local fgrass = { + "df_primordial_items:fungal_grass_1", + "df_primordial_items:fungal_grass_2", + "", "", "", "" + } + + local fdeco = { + "df_primordial_items:glow_orb_stalks", + "df_primordial_items:glow_pods", + "", "", "" + } + + bonemeal:add_deco({ + {"df_primordial_items:dirt_with_mycelium", fgrass, fdeco} + }) +end + + +if minetest.get_modpath("everness") then + + bonemeal:add_sapling({ + {"everness:baobab_sapling", Everness.grow_baobab_tree, "soil"}, + {"everness:coral_tree_bioluminescent_sapling", + Everness.coral_tree_bioluminescent, "soil"}, + {"everness:coral_tree_sapling", Everness.grow_coral_tree, "soil"}, + {"everness:crystal_bush_sapling", Everness.grow_crystal_bush, "soil"}, + {"everness:crystal_tree_large_sapling", Everness.grow_crystal_large_tree, "soil"}, + {"everness:crystal_tree_sapling", Everness.grow_crystal_tree, "soil"}, + {"everness:cursed_bush_sapling", Everness.grow_cursed_bush, "soil"}, + {"everness:cursed_dream_tree_sapling", Everness.grow_cursed_dream_tree, "soil"}, + {"everness:dry_tree_sapling", Everness.grow_dry_tree, "soil"}, + {"everness:sequoia_tree_sapling", Everness.grow_sequoia_tree, "soil"}, + {"everness:willow_tree_sapling", Everness.grow_willow_tree, "soil"} + }) +end + + +if minetest.get_modpath("bushes_classic") then + + local function grow_bush(pos) + + local meta = minetest.get_meta(pos) + local bush_name = meta:get_string("bush_type") + + -- only change if meta found + if meta and bush_name then + minetest.swap_node(pos, {name = "bushes:" .. bush_name .. "_bush"}) + end + end + + bonemeal:add_sapling({ + {"bushes:fruitless_bush", grow_bush, "soil"}, + }) +end + +if minetest.get_modpath("x_farming") then + -- Register crops + bonemeal:add_crop({ + {"x_farming:barley_", 8, "x_farming:seed_barley"}, + {"x_farming:beetroot_", 8, "x_farming:seed_beetroot"}, + {"x_farming:carrot_", 8, "x_farming:seed_carrot"}, + {"x_farming:cocoa_", 3}, + {"x_farming:coffee_", 5, "x_farming:seed_coffee"}, + {"x_farming:corn_", 10, "x_farming:seed_corn"}, + {"x_farming:melon_", 8, "x_farming:seed_melon"}, + {"x_farming:potato_", 8, "x_farming:seed_potato"}, + {"x_farming:pumpkin_", 8, "x_farming:seed_pumpkin"}, + {"x_farming:rice_", 8, "x_farming:seed_rice"}, + {"x_farming:soybean_", 7, "x_farming:seed_soybean"}, + {"x_farming:stevia_", 8, "x_farming:seed_stevia"}, + {"x_farming:strawberry_", 4, "x_farming:seed_strawberry"}, + }) + + -- Register trees + bonemeal:add_sapling({ + {"x_farming:kiwi_sapling", x_farming.grow_sapling, "soil"}, + }) +end \ No newline at end of file diff --git a/mods/bonemeal/screenshot.jpg b/mods/bonemeal/screenshot.jpg new file mode 100644 index 00000000..6c44743e Binary files /dev/null and b/mods/bonemeal/screenshot.jpg differ diff --git a/mods/bonemeal/settingtypes.txt b/mods/bonemeal/settingtypes.txt new file mode 100644 index 00000000..3eed8053 --- /dev/null +++ b/mods/bonemeal/settingtypes.txt @@ -0,0 +1,2 @@ +# Disable recipe for bones:bones to craft into bonemeal +bonemeal.disable_deathbones_recipe (Disable recipe for death bones into bonemeal) bool true diff --git a/mods/bonemeal/textures/bonemeal_bone.png b/mods/bonemeal/textures/bonemeal_bone.png new file mode 100644 index 00000000..d86e7bea Binary files /dev/null and b/mods/bonemeal/textures/bonemeal_bone.png differ diff --git a/mods/bonemeal/textures/bonemeal_fertiliser.png b/mods/bonemeal/textures/bonemeal_fertiliser.png new file mode 100644 index 00000000..b899356a Binary files /dev/null and b/mods/bonemeal/textures/bonemeal_fertiliser.png differ diff --git a/mods/bonemeal/textures/bonemeal_gelatin_powder.png b/mods/bonemeal/textures/bonemeal_gelatin_powder.png new file mode 100644 index 00000000..0625cc25 Binary files /dev/null and b/mods/bonemeal/textures/bonemeal_gelatin_powder.png differ diff --git a/mods/bonemeal/textures/bonemeal_item.png b/mods/bonemeal/textures/bonemeal_item.png new file mode 100644 index 00000000..3f75243f Binary files /dev/null and b/mods/bonemeal/textures/bonemeal_item.png differ diff --git a/mods/bonemeal/textures/bonemeal_mulch.png b/mods/bonemeal/textures/bonemeal_mulch.png new file mode 100644 index 00000000..9fa025f2 Binary files /dev/null and b/mods/bonemeal/textures/bonemeal_mulch.png differ diff --git a/mods/bonemeal/textures/bonemeal_particle.png b/mods/bonemeal/textures/bonemeal_particle.png new file mode 100644 index 00000000..71ef90f8 Binary files /dev/null and b/mods/bonemeal/textures/bonemeal_particle.png differ diff --git a/mods/bottles/.gitattributes b/mods/bottles/.gitattributes new file mode 100644 index 00000000..768fcf2d --- /dev/null +++ b/mods/bottles/.gitattributes @@ -0,0 +1 @@ +screenshot.png export-ignore \ No newline at end of file diff --git a/mods/bottles/CREDITS.md b/mods/bottles/CREDITS.md new file mode 100644 index 00000000..6034e976 --- /dev/null +++ b/mods/bottles/CREDITS.md @@ -0,0 +1,4 @@ +Bottle mask texture derived from `vessels_glass_bottle.png` supplied in the +vessels mod of Minetest Game. Original texture © Vanessa Ezekowitz and Thomas-S +and reused under the +[Creative Commons Attribution-ShareAlike 3.0 Unported license](https://creativecommons.org/licenses/by/3.0/). \ No newline at end of file diff --git a/mods/bottles/LICENSE b/mods/bottles/LICENSE new file mode 100644 index 00000000..104bb888 --- /dev/null +++ b/mods/bottles/LICENSE @@ -0,0 +1,31 @@ +Code is released under MIT License + +Copyright © 2022 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +File `textures/vessels_glass_bottle_mask.png` is released under the [CC-BY-SA 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/) in accordance with its original license as noted in CREDITS.md. + +You are free to: + + Share — copy and redistribute the material in any medium or format + Adapt — remix, transform, and build upon the material + for any purpose, even commercially. + +Under the following terms: + + Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + + ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + + No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +This license is acceptable for Free Cultural Works. + + The licensor cannot revoke these freedoms as long as you follow the license terms. \ No newline at end of file diff --git a/mods/bottles/README.md b/mods/bottles/README.md new file mode 100644 index 00000000..e8231a82 --- /dev/null +++ b/mods/bottles/README.md @@ -0,0 +1,76 @@ +Filled Bottles +============== + +Fill empty glass bottles with a variety of earthly materials including water, dirt, sand, and more! With an empty glass bottle in hand, simply point at the node that you wish to capture then click to fill the bottle. Conversely, using a filled bottle will empty it, thus allowing you to reuse the empty glass bottle. + +On their own, filled bottles are only good for collecting and decoration. However, other mods may wish to make use of filled bottles for other purposes, such as for ingredients in cooking or chemistry. It's also possible to define your own filled bottles; see the API section below for details. + +Bottles function in a very similar fashion to buckets with two key differences. First, many bottles may be filled from one single node before the node is exhausted (10 bottles by default), and an exhausted node may be fully consumed (e.g., sand or water) or replaced with a "stripped" version of itself (e.g., dirt with grass becomes only dirt). Secondly, emptying a filled bottle does not dispense its contents, it simply becomes an empty glass bottle when emptied. In this way, bottles are effectively "transformed" into other types of bottles but they do not actually carry their contents the way buckets do. + +Also note that partially bottled nodes have a chance to yield no drops when dug. This chance scales with how many times the node is bottled such that bottling a node more times increases the chance that it will not yield drops when dug. This is a balance measure to prevent infinite bottling of a single node. + +The chance to yield no drops does not apply to liquids by default as liquids can easily be exploited to bypass this restriction, but this can be changed via settings if needed for a special case. + +Supported games/mods +-------------------- + +- Minetest Game and its derivatives such as MeseCraft, Asuna, etc. +- Ethereal +- Everness +- Wilhelmines Living Jungle +- Wilhelmines Natural Biomes +- Caverealms +- Many biomes from the Biomes modpack by Atlante + +API +--- + +Want to create your own filled bottles? Use the `bottles.register_filled_bottle` function to register a filled bottle for any node you like. The function takes in a single table argument that conforms to the following: + +```lua +{ + target = , -- the node to target for a bottle to be filled + -- from; either a string for a single node name + -- or an array that is a list of node names + + replacement = , -- the node to replace the target node(s) with when + -- a target node is fully drained; default is "air" + + name = , -- a name for the filled bottle item; will be prefixed with + -- `bottles:`, so don't include any such namespace; default + -- value is "bottle_of_" + the name of the target node + + description = , -- the display name of the filled bottle; default + -- value is "Bottle of " + the description of the + -- target node + + contents = , -- the node that represents the contents of this bottle; + -- default value is the target node, or the first node in + -- the list of target nodes + + image = , -- the image to use for the contents of the filled bottle; + -- the first 16x16 pixels of this image will be rendered + -- 'inside' of the bottle; default value is the tile image + -- of the target node, or the first of such tiles of the + -- target node + + sound = , -- the name of a sound that conforms to the Minetest sound + -- spec; played at a high pitch when a bottle is filled or + -- spilled; default value is `nil` +} +``` + +For example, this is the registration for a bottle of water: + +```lua +bottles.register_filled_bottle({ + target = "default:water_source", + sound = "default_water_footstep", + name = "bottle_of_water", + description = "Bottle of Water", +}) +``` + +Note that this mod expects the target node(s) to be registered with Minetest prior to registering a filled bottle of its type, so if you wish to define new filled bottles with your own node targets, make sure to call `minetest.register_node` before calling `bottles.register_filled_bottle`. Also remember to add `bottles` to your dependency list in your mod's `mod.conf` file. + +If you wish to further extend the uses and capabilities of empty glass bottles or filled bottles, the functions assigned to the `on_use` field of the bottles are defined as `bottles.fill` (assigned to empty glass bottles to fill them with a targeted material) and `bottles.spill` (to empty the contents of a filled bottle). These functions are provided so that you can override them or wrap them in programming logic -- a task that is beyond the scope of this documentation. diff --git a/mods/bottles/bottles/init.lua b/mods/bottles/bottles/init.lua new file mode 100644 index 00000000..b06e4b37 --- /dev/null +++ b/mods/bottles/bottles/init.lua @@ -0,0 +1,262 @@ +-- Local wrapping functions for on_use reuse +local function do_fill(...) + return bottles.fill(...) +end + +local function do_spill(...) + return bottles.spill(...) +end + +-- Local map for liquid category to int for simple comparison +local liquid_map = { + none = 0, + source = 1, + flowing = 2, +} + +-- Globals +bottles = { + -- Settings + settings = { + node_fill_limit = tonumber(core.settings:get("bottles.node_fill_limit",10) or 10), + liquid_fill_unlimited = (function(value) + if value == "all" then + return 1 + elseif value == "flowing" then + return 2 + else + return 3 + end + end)(core.settings:get("bottles.liquid_fill_unlimited","all") or "all"), + }, + + -- Registry of filled bottles + registered_filled_bottles = {}, + + -- Index target nodes to their filled bottle types + target_node_map = {}, + + -- Cache node liquid statuses for special liquid handling + target_liquid_map = {}, + + -- Play a sound whenever a bottle is filled or spilled + play_bottle_sound = function(pos,sound) + if sound then + minetest.sound_play(sound,{ + pos, + gain = 0.25, + pitch = 5.0, + max_hear_distance = 12, + },true) + end + end, + + -- Fill an empty glass bottle + fill = function(itemstack,placer,target) + if target.type == "node" and placer:is_player() then + -- Get targeted node + local pos = target.under + local node = minetest.get_node(pos) + local filled_bottle = bottles.target_node_map[node.name] + if filled_bottle then + -- Play contents sound + bottles.play_bottle_sound(placer:get_pos(),filled_bottle.sound) + + -- Subtract from stack of empty bottles + local count = itemstack:get_count() + local retval = nil + if count == 1 then + itemstack:clear() + retval = ItemStack(filled_bottle.name) + else + itemstack:set_count(count - 1) + retval = itemstack + local leftover = placer:get_inventory():add_item("main", ItemStack(filled_bottle.name)) + if not leftover:is_empty() then + minetest.add_item(placer:get_pos(),leftover) + end + end + + -- Set filled node metadata if enabled; special handling for liquids + local liquid = bottles.target_liquid_map[node.name] + if bottles.settings.node_fill_limit > 0 and liquid < bottles.settings.liquid_fill_unlimited then + local meta = core.get_meta(pos) + local limit = meta:get_int("bottles.node_fill_limit") + limit = limit + 1 + if limit >= bottles.settings.node_fill_limit then + core.set_node(pos,{ name = filled_bottle.replacement }) + else + meta:set_int("bottles.node_fill_limit",limit) + end + end + + -- Return value + return retval, filled_bottle.name + end + end + return itemstack, nil + end, + + -- Spill the contents out of a filled bottle + spill = function(itemstack,placer) + if placer:is_player() then + -- Play contents sound + bottles.play_bottle_sound(placer:get_pos(),bottles.registered_filled_bottles[itemstack:get_name()].sound) + + -- Subtract from stack of filled bottles and set return value + local count = itemstack:get_count() + local retval = nil + if count == 1 then + itemstack:clear() + retval = ItemStack("vessels:glass_bottle") + else + itemstack:set_count(count - 1) + retval = itemstack + local leftover = placer:get_inventory():add_item("main", ItemStack("vessels:glass_bottle")) + if not leftover:is_empty() then + minetest.add_item(placer:get_pos(),leftover) + end + end + + -- Return value + return retval + else + return itemstack + end + end, + + -- Register a filled bottle + register_filled_bottle = function(spec) + -- Validate spec, and set defaults + if not spec.target then + return false + end + + local target_type = type(spec.target) + + if not spec.contents then + if target_type == "string" then + spec.contents = spec.target + elseif target_type == "table" then + spec.contents = spec.target[1] + else + return false + end + end + + local contents_node = minetest.registered_nodes[spec.contents] + if not contents_node then + return false + end + + spec.description = spec.description or ("Bottle of " .. contents_node.description:split("\n")[1]) + + spec.replacement = spec.replacement or "air" + + if spec.image then + -- do nothing + elseif type(contents_node.tiles[1]) == "string" then + spec.image = contents_node.tiles[1] + elseif type(contents_node.tiles[1]) == "table" then + spec.image = contents_node.tiles[1].name + else + return false + end + spec.image = "[combine:16x16:0,0=" .. spec.image .. "^vessels_glass_bottle_mask.png^[makealpha:0,254,0" + spec.name = "bottles:" .. (spec.name or "bottle_of_" .. contents_node.name:split(":")[2]) + + -- Ensure that name is not already in use, fail registration if so + if bottles.registered_filled_bottles[spec.name] then + return false + end + + -- Normalize target type + if target_type == "string" then + spec.target = {spec.target} + end + + -- Ensure that target nodes exist and are not already in use, fail registration if so + for _,target in ipairs(spec.target) do + if bottles.target_node_map[target] or not core.registered_nodes[target] then + return false + end + end + + -- Extract node footstep sounds if possible and if no other sounds are provided + if not spec.sound and contents_node.sounds and contents_node.sounds.footstep then + spec.sound = contents_node.sounds.footstep.name + end + + -- Map target nodes and liquid status to spec + for _,target in ipairs(spec.target) do + bottles.target_node_map[target] = spec + bottles.target_liquid_map[target] = liquid_map[core.registered_nodes[target].liquidtype or "none"] + end + + -- Put bottle into map of registered filled bottles + bottles.registered_filled_bottles[spec.name] = spec + + -- Register new bottle node + minetest.register_node(":" .. spec.name,{ + description = spec.description, + drawtype = "plantlike", + tiles = {spec.image}, + inventory_image = spec.image, + wield_image = spec.image, + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), + on_use = do_spill + }) + + -- Successful registration + return true + end, + + -- Unregister a filled bottle + unregister_filled_bottle = function(name) + -- Only unregister if it's already registered + local spec = bottles.registered_filled_bottles[name] + if not spec then + return false + end + + -- Remove from registered bottles list and target index + bottles.registered_filled_bottles[name] = nil + for _,target in ipairs(spec.target) do + bottles.target_node_map[target] = nil + end + + -- Unregister node + minetest.unregister_item(name) + + -- Successfully unregistered filled bottle + return true + end, +} + +-- Make empty glass bottles able to 'point and fill' +minetest.override_item("vessels:glass_bottle",{ + liquids_pointable = true, + on_use = do_fill, +}) + +-- Nodes that have been partially filled have a chance to drop nothing when dug +if bottles.settings.node_fill_limit > 0 then + local oghnd = core.handle_node_drops + core.handle_node_drops = function(pos, drops, digger) + local meta = core.get_meta(pos) + local limit = meta:get_int("bottles.node_fill_limit") + if limit > 0 and math.random(1,bottles.settings.node_fill_limit) <= limit then + -- do nothing, node will drop nothing + else + return oghnd(pos, drops, digger) + end + end +end \ No newline at end of file diff --git a/mods/bottles/bottles/mod.conf b/mods/bottles/bottles/mod.conf new file mode 100644 index 00000000..91905240 --- /dev/null +++ b/mods/bottles/bottles/mod.conf @@ -0,0 +1,5 @@ +name = bottles +title = Filled Bottles API +description = Filled bottles API +depends = vessels +author = EmptyStar \ No newline at end of file diff --git a/mods/bottles/bottles/textures/vessels_glass_bottle_mask.png b/mods/bottles/bottles/textures/vessels_glass_bottle_mask.png new file mode 100644 index 00000000..c76e8f89 Binary files /dev/null and b/mods/bottles/bottles/textures/vessels_glass_bottle_mask.png differ diff --git a/mods/bottles/bottles_badland/init.lua b/mods/bottles/bottles_badland/init.lua new file mode 100644 index 00000000..1d1381fc --- /dev/null +++ b/mods/bottles/bottles_badland/init.lua @@ -0,0 +1,4 @@ +bottles.register_filled_bottle({ + target = "badland:badland_grass", + replacement = "default:dirt", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_badland/mod.conf b/mods/bottles/bottles_badland/mod.conf new file mode 100644 index 00000000..c3fbd26f --- /dev/null +++ b/mods/bottles/bottles_badland/mod.conf @@ -0,0 +1,5 @@ +name = bottles_badland +title = Badland Bottles +description = Filled bottles for the badland mod +author = EmptyStar +depends = bottles, badland diff --git a/mods/bottles/bottles_caverealms/init.lua b/mods/bottles/bottles_caverealms/init.lua new file mode 100644 index 00000000..eb58214c --- /dev/null +++ b/mods/bottles/bottles_caverealms/init.lua @@ -0,0 +1,17 @@ +bottles.register_filled_bottle({ + target = "caverealms:stone_with_moss", + description = "Bottle of Cave Moss", + replacement = "default:cobble", +}) + +bottles.register_filled_bottle({ + target = "caverealms:stone_with_lichen", + description = "Bottle of Lichen", + replacement = "default:cobble", +}) + +bottles.register_filled_bottle({ + target = "caverealms:stone_with_algae", + description = "Bottle of Algae", + replacement = "default:cobble", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_caverealms/mod.conf b/mods/bottles/bottles_caverealms/mod.conf new file mode 100644 index 00000000..69c13e88 --- /dev/null +++ b/mods/bottles/bottles_caverealms/mod.conf @@ -0,0 +1,5 @@ +name = bottles_caverealms +title = Caverealms Bottles +description = Filled bottles for the caverealms mod +author = EmptyStar +depends = bottles, caverealms diff --git a/mods/bottles/bottles_default/init.lua b/mods/bottles/bottles_default/init.lua new file mode 100644 index 00000000..096e3d38 --- /dev/null +++ b/mods/bottles/bottles_default/init.lua @@ -0,0 +1,101 @@ +bottles.register_filled_bottle({ + target = {"default:water_source","default:water_flowing"}, + sound = "default_water_footstep", + name = "bottle_of_water", + description = "Bottle of Water", +}) + +bottles.register_filled_bottle({ + target = {"default:river_water_source","default:river_water_flowing"}, + sound = "default_water_footstep", + name = "bottle_of_river_water", + description = "Bottle of River Water", +}) + +bottles.register_filled_bottle({ + target = {"default:lava_source","default:lava_flowing"}, + sound = "default_water_footstep", + name = "bottle_of_lava", + description = "Bottle of Lava", +}) + +bottles.register_filled_bottle({ + target = "default:sand", + sound = "default_sand_footstep", +}) + +bottles.register_filled_bottle({ + target = "default:desert_sand", + sound = "default_sand_footstep", +}) + +bottles.register_filled_bottle({ + target = "default:silver_sand", + sound = "default_sand_footstep", +}) + +bottles.register_filled_bottle({ + target = "default:dirt", + sound = "default_dig_crumbly", +}) + +bottles.register_filled_bottle({ + target = "default:dry_dirt", + sound = "default_dig_crumbly", + name = "bottle_of_dry_dirt", + description = "Bottle of Dry Dirt", +}) + +bottles.register_filled_bottle({ + target = "default:dirt_with_grass", + sound = "default_grass_footstep", + name = "bottle_of_grass", + description = "Bottle of Grass", + replacement = "default:dirt", +}) + +bottles.register_filled_bottle({ + target = {"default:dirt_with_dry_grass","default:dry_dirt_with_dry_grass"}, + sound = "default_grass_footstep", + name = "bottle_of_dry_grass", + description = "Bottle of Dry Grass", + replacement = "default:dry_dirt", +}) + +bottles.register_filled_bottle({ + target = "default:dirt_with_coniferous_litter", + sound = "default_grass_footstep", + name = "bottle_of_coniferous_litter", + description = "Bottle of Coniferous Litter", + replacement = "default:dirt", +}) + +bottles.register_filled_bottle({ + target = "default:dirt_with_rainforest_litter", + sound = "default_grass_footstep", + name = "bottle_of_rainforest_litter", + description = "Bottle of Rainforest Litter", + replacement = "default:dirt", +}) + +bottles.register_filled_bottle({ + target = "default:permafrost_with_moss", + sound = "default_grass_footstep", + name = "bottle_of_moss", + description = "Bottle of Tundra Moss", + replacement = "default:permafrost_with_stones", +}) + +bottles.register_filled_bottle({ + target = "default:gravel", + sound = "default_gravel_footstep", +}) + +bottles.register_filled_bottle({ + target = {"default:snow","default:snowblock","default:dirt_with_snow"}, + sound = "default_sand_footstep", +}) + +bottles.register_filled_bottle({ + target = {"default:clay"}, +}) \ No newline at end of file diff --git a/mods/bottles/bottles_default/mod.conf b/mods/bottles/bottles_default/mod.conf new file mode 100644 index 00000000..cf1cffd5 --- /dev/null +++ b/mods/bottles/bottles_default/mod.conf @@ -0,0 +1,5 @@ +name = bottles_default +title = Minetest Game Bottles +description = Filled bottles for the default mod +author = EmptyStar +depends = bottles, default diff --git a/mods/bottles/bottles_dorwinion/init.lua b/mods/bottles/bottles_dorwinion/init.lua new file mode 100644 index 00000000..3aaa9dbc --- /dev/null +++ b/mods/bottles/bottles_dorwinion/init.lua @@ -0,0 +1,4 @@ +bottles.register_filled_bottle({ + target = "dorwinion:dorwinion_grass", + replacement = "dorwinion:dorwinion", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_dorwinion/mod.conf b/mods/bottles/bottles_dorwinion/mod.conf new file mode 100644 index 00000000..eca71424 --- /dev/null +++ b/mods/bottles/bottles_dorwinion/mod.conf @@ -0,0 +1,5 @@ +name = bottles_dorwinion +title = Dorwinion Bottles +description = Filled bottles for the dorwinion mod +author = EmptyStar +depends = bottles, dorwinion diff --git a/mods/bottles/bottles_ethereal/init.lua b/mods/bottles/bottles_ethereal/init.lua new file mode 100644 index 00000000..6f5458dc --- /dev/null +++ b/mods/bottles/bottles_ethereal/init.lua @@ -0,0 +1,17 @@ +for _,dirt in ipairs({ + "Bamboo", + "Jungle", + "Grove", + "Prairie", + "Cold", + "Crystal", + "Mushroom", + "Fiery", + "Gray", +}) do + bottles.register_filled_bottle({ + target = "ethereal:" .. dirt:lower() .. "_dirt", + description = "Bottle of " .. dirt .. " Dirt", + replacement = "default:dirt", + }) +end \ No newline at end of file diff --git a/mods/bottles/bottles_ethereal/mod.conf b/mods/bottles/bottles_ethereal/mod.conf new file mode 100644 index 00000000..f34808c2 --- /dev/null +++ b/mods/bottles/bottles_ethereal/mod.conf @@ -0,0 +1,5 @@ +name = bottles_ethereal +title = Ethereal Bottles +description = Filled bottles for the ethereal mod +author = EmptyStar +depends = bottles, ethereal diff --git a/mods/bottles/bottles_everness/init.lua b/mods/bottles/bottles_everness/init.lua new file mode 100644 index 00000000..ac82f636 --- /dev/null +++ b/mods/bottles/bottles_everness/init.lua @@ -0,0 +1,46 @@ +for node,data in pairs({ + ["everness:coral_desert_stone_with_moss"] = { "Coral Cave Moss", "everness:coral_desert_stone" }, + ["everness:mold_stone_with_moss"] = { "Moldy Moss" }, + ["everness:coral_dirt"] = {}, + ["everness:cursed_dirt"] = {}, + ["everness:crystal_dirt"] = { "Crystal Dirt", "air", "everness_crystal_dirt" }, + ["everness:forsaken_tundra_dirt"] = {}, + ["everness:forsaken_tundra_dirt_with_grass"] = { "Forsaken Tundra Grass", "everness:forsaken_tundra_dirt" }, + ["everness:dirt_with_coral_grass"] = { "Coral Grass", "everness:coral_dirt" }, + ["everness:dirt_with_cursed_grass"] = { "Cursed Grass", "everness:cursed_dirt" }, + ["everness:dirt_with_crystal_grass"] = { "Crystal Grass", "everness:crystal_dirt" }, + ["everness:dry_ocean_dirt"] = {}, + ["everness:crystal_cave_dirt"] = {}, + ["everness:crystal_cave_dirt_with_moss"] = { "Crystal Cave Moss" }, + ["everness:moss_block"] = { "Moss" }, + ["everness:crystal_moss_block"] = { "Crystal Moss" }, + ["everness:coral_sand"] = {}, + ["everness:coral_white_sand"] = {}, + ["everness:cursed_sand"] = {}, + ["everness:crystal_sand"] = {}, + ["everness:forsaken_tundra_beach_sand"] = {}, + ["everness:forsaken_desert_sand"] = {}, + ["everness:coral_forest_deep_ocean_sand"] = {}, + ["everness:cursed_lands_deep_ocean_sand"] = {}, + ["everness:crystal_forest_deep_ocean_sand"] = {}, + ["everness:mineral_sand"] = {}, + ["everness:frosted_snowblock"] = { "Frosted Snow" }, + ["everness:cursed_mud"] = {}, + ["everness:mineral_lava_stone_with_moss"] = { "Mineral Cave Moss", "everness:mineral_cave_stone" } +}) do + bottles.register_filled_bottle({ + name = data[3], + target = node, + description = data[1] and ("Bottle of " .. data[1]) or nil, + replacement = data[2] + }) +end + +-- Mineral water has an extra target +bottles.register_filled_bottle({ + target = { + "everness:mineral_water_source", + "everness:mineral_water_flowing", + }, + description = "Bottle of Mineral Water", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_everness/mod.conf b/mods/bottles/bottles_everness/mod.conf new file mode 100644 index 00000000..70dee0a4 --- /dev/null +++ b/mods/bottles/bottles_everness/mod.conf @@ -0,0 +1,5 @@ +name = bottles_everness +title = Everness Bottles +description = Filled bottles for the everness mod +author = EmptyStar +depends = bottles, everness diff --git a/mods/bottles/bottles_frost_land/init.lua b/mods/bottles/bottles_frost_land/init.lua new file mode 100644 index 00000000..e85d4322 --- /dev/null +++ b/mods/bottles/bottles_frost_land/init.lua @@ -0,0 +1,4 @@ +bottles.register_filled_bottle({ + target = "frost_land:frost_land_grass", + replacement = "default:dirt", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_frost_land/mod.conf b/mods/bottles/bottles_frost_land/mod.conf new file mode 100644 index 00000000..06c2cf67 --- /dev/null +++ b/mods/bottles/bottles_frost_land/mod.conf @@ -0,0 +1,5 @@ +name = bottles_frost_land +title = Frost Land Bottles +description = Filled bottles for the frost_land mod +author = EmptyStar +depends = bottles, frost_land diff --git a/mods/bottles/bottles_japaneseforest/init.lua b/mods/bottles/bottles_japaneseforest/init.lua new file mode 100644 index 00000000..4eaf80b0 --- /dev/null +++ b/mods/bottles/bottles_japaneseforest/init.lua @@ -0,0 +1,5 @@ +bottles.register_filled_bottle({ + target = "japaneseforest:japanese_dirt_with_grass", + description = "Bottle of Japanese Grass", + replacement = "default:dirt", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_japaneseforest/mod.conf b/mods/bottles/bottles_japaneseforest/mod.conf new file mode 100644 index 00000000..72f6f9d9 --- /dev/null +++ b/mods/bottles/bottles_japaneseforest/mod.conf @@ -0,0 +1,5 @@ +name = bottles_japaneseforest +title = Japanese Forest Bottles +description = Filled bottles for the japaneseforest mod +author = EmptyStar +depends = bottles, japaneseforest diff --git a/mods/bottles/bottles_livingjungle/init.lua b/mods/bottles/bottles_livingjungle/init.lua new file mode 100644 index 00000000..bdf4f01f --- /dev/null +++ b/mods/bottles/bottles_livingjungle/init.lua @@ -0,0 +1,9 @@ +for _,node in ipairs({ + "livingjungle:jungleground", + "livingjungle:leafyjungleground", +}) do + bottles.register_filled_bottle({ + target = node, + replacement = "default:dirt", + }) +end \ No newline at end of file diff --git a/mods/bottles/bottles_livingjungle/mod.conf b/mods/bottles/bottles_livingjungle/mod.conf new file mode 100644 index 00000000..431eccf0 --- /dev/null +++ b/mods/bottles/bottles_livingjungle/mod.conf @@ -0,0 +1,5 @@ +name = bottles_livingjungle +title = Living Jungle Bottles +description = Filled bottles for the livingjungle mod +author = EmptyStar +depends = bottles, livingjungle diff --git a/mods/bottles/bottles_naturalbiomes/init.lua b/mods/bottles/bottles_naturalbiomes/init.lua new file mode 100644 index 00000000..97bba25f --- /dev/null +++ b/mods/bottles/bottles_naturalbiomes/init.lua @@ -0,0 +1,22 @@ +for node,data in pairs({ + ["naturalbiomes:alderswamp_litter"] = { "Alder Swamp Grass", "naturalbiomes:alderswamp_dirt" }, + ["naturalbiomes:alderswamp_dirt"] = {}, + ["naturalbiomes:alpine_litter"] = { "Alpine Grass", "default:dirt" }, + ["naturalbiomes:bambooforest_litter"] = { "Bamboo Litter" }, + ["naturalbiomes:bushland_bushlandlitter"] = { false, "default:dirt" }, + ["naturalbiomes:bushland_bushlandlitter2"] = {}, + ["naturalbiomes:bushland_bushlandlitter3"] = {}, + ["naturalbiomes:heath_litter"] = { "Heath Litter", "default:sand" }, + ["naturalbiomes:heath_litter2"] = { "Heath Litter", "default:sand" }, + ["naturalbiomes:heath_litter3"] = { "Heath Litter", "default:sand" }, + ["naturalbiomes:mediterran_litter"] = { "Mediterranean Grass", "default:dirt" }, + ["naturalbiomes:outback_litter"] = { "Outback Grass", "naturalbiomes:outback_ground" }, + ["naturalbiomes:palmbeach_sand"] = { "Beach Sand" }, + ["naturalbiomes:savannalitter"] = { "Savanna Litter", "default:dirt" }, +}) do + bottles.register_filled_bottle({ + target = node, + description = data[1] and ("Bottle of " .. data[1]) or nil, + replacement = data[2], + }) +end \ No newline at end of file diff --git a/mods/bottles/bottles_naturalbiomes/mod.conf b/mods/bottles/bottles_naturalbiomes/mod.conf new file mode 100644 index 00000000..c49fe15b --- /dev/null +++ b/mods/bottles/bottles_naturalbiomes/mod.conf @@ -0,0 +1,5 @@ +name = bottles_naturalbiomes +title = Natural Biomes Bottles +description = Filled bottles for the naturalbiomes mod +author = EmptyStar +depends = bottles, naturalbiomes diff --git a/mods/bottles/bottles_nightshade/init.lua b/mods/bottles/bottles_nightshade/init.lua new file mode 100644 index 00000000..973e780d --- /dev/null +++ b/mods/bottles/bottles_nightshade/init.lua @@ -0,0 +1,5 @@ +bottles.register_filled_bottle({ + target = "nightshade:nightshade_dirt_with_grass", + description = "Bottle of Nightshade Grass", + replacement = "default:dirt", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_nightshade/mod.conf b/mods/bottles/bottles_nightshade/mod.conf new file mode 100644 index 00000000..d867db84 --- /dev/null +++ b/mods/bottles/bottles_nightshade/mod.conf @@ -0,0 +1,5 @@ +name = bottles_nightshade +title = Nightshade Bottles +description = Filled bottles for the nightshade mod +author = EmptyStar +depends = bottles, nightshade diff --git a/mods/bottles/bottles_prairie/init.lua b/mods/bottles/bottles_prairie/init.lua new file mode 100644 index 00000000..e5298592 --- /dev/null +++ b/mods/bottles/bottles_prairie/init.lua @@ -0,0 +1,5 @@ +bottles.register_filled_bottle({ + target = "prairie:prairie_dirt_with_grass", + description = "Bottle of Prairie Grass", + replacement = "default:dirt", +}) \ No newline at end of file diff --git a/mods/bottles/bottles_prairie/mod.conf b/mods/bottles/bottles_prairie/mod.conf new file mode 100644 index 00000000..bb9bbbc5 --- /dev/null +++ b/mods/bottles/bottles_prairie/mod.conf @@ -0,0 +1,5 @@ +name = bottles_prairie +title = Prairie Bottles +description = Filled bottles for the prairie mod +author = EmptyStar +depends = bottles, prairie diff --git a/mods/bottles/modpack.conf b/mods/bottles/modpack.conf new file mode 100644 index 00000000..9b9b4189 --- /dev/null +++ b/mods/bottles/modpack.conf @@ -0,0 +1,4 @@ +name = bottles +title = Filled Bottles Modpack +description = Filled bottles for Minetest Game and its supported mods +author = EmptyStar \ No newline at end of file diff --git a/mods/bottles/modpack.txt b/mods/bottles/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/bottles/settingtypes.txt b/mods/bottles/settingtypes.txt new file mode 100644 index 00000000..309e492a --- /dev/null +++ b/mods/bottles/settingtypes.txt @@ -0,0 +1,9 @@ +# How many times a node can be collected via bottle before the target node is used up. Used up nodes will be replaced with a registered replacement node and have a chance to drop nothing when mined. Set to 0 for infinite bottle fills per node. +bottles.node_fill_limit (Node fill limit) int 10 0 99 + +# Allow infinite bottling for liquids: +# "all" = all liquids allow infinite bottling +# "flowing" = only flowing liquids allow infinite bottling +# "none" = no liquids allow infinite bottling +# NOTE: This setting can easily be circumvented for most typical liquids +bottles.liquid_fill_unlimited (Liquid fill unlimited) enum all all,flowing,none \ No newline at end of file diff --git a/mods/builtin_item/.gitignore b/mods/builtin_item/.gitignore new file mode 100644 index 00000000..d9c069a6 --- /dev/null +++ b/mods/builtin_item/.gitignore @@ -0,0 +1,4 @@ +## Generic ignorable patterns and files +*~ +.*.swp +debug.txt diff --git a/mods/builtin_item/README.md b/mods/builtin_item/README.md new file mode 100644 index 00000000..bda2b799 --- /dev/null +++ b/mods/builtin_item/README.md @@ -0,0 +1,116 @@ +item_entity.lua replacement + +edited by TenPlus1 + +Features: +- Items are destroyed by lava +- Items are pushed along by flowing water (thanks to QwertyMine3 and Gustavo6046) +- Items are removed after 900 seconds or the time that is specified by + remove_items in minetest.conf (-1 disables it) +- Particle effects added +- Dropped items slide on nodes with {slippery} groups +- Items stuck inside solid nodes move to nearest empty space +- Can use new on_pickup() function if available +- Added 'dropped_step(self, pos, dtime, moveresult)' custom on_step for dropped items + 'self.node_inside' contains node table that item is inside + 'self.def_inside' contains node definition for above + 'self.node_under' contains node table that is below item + 'self.def_under' contains node definition for above + 'self.age' holds age of dropped item in seconds + 'self.itemstring' contains itemstring e.g. "default:dirt", "default:ice 20" + 'self.is_moving' true if dropped item is moving + 'pos' holds position of dropped item + 'dtime' used for timers + 'moveresult' table containing collision info + + return false to skip further checks by builtin_item + +License: LGPLv2.1+ + + +dropped_step() examples: + +-- if gunpowder dropped on burning tnt or gunpowder then remove + +if minetest.registered_items["tnt:gunpowder"] then + + minetest.override_item("tnt:gunpowder", { + + dropped_step = function(self, pos) + + if (self.node_inside + and self.node_inside.name == "tnt:gunpowder_burning") + or (self.node_under + and self.node_under.name == "tnt:tnt_burning") then + + minetest.sound_play("builtin_item_lava", { + pos = pos, + max_hear_distance = 6, + gain = 0.5 + }) + + self.itemstring = "" + self.object:remove() + + return false -- return with no further action + end + end + }) +end + + +-- if 2x mese crystal and 2x crystal spike dropped in pool of water_source +-- then merge into a single crystal_ingot. + +if minetest.registered_items["ethereal:crystal_spike"] then + + minetest.override_item("ethereal:crystal_spike", { + + dropped_step = function(self, pos, dtime) + + self.ctimer = (self.ctimer or 0) + dtime + if self.ctimer < 5.0 then return end + self.ctimer = 0 + + if self.node_inside + and self.node_inside.name ~= "default:water_source" then + return + end + + local objs = core.get_objects_inside_radius(pos, 0.8) + + if not objs or #objs ~= 2 then return end + + local crystal, mese, ent = nil, nil, nil + + for k, obj in pairs(objs) do + + ent = obj:get_luaentity() + + if ent and ent.name == "__builtin:item" then + + if ent.itemstring == "default:mese_crystal 2" + and not mese then + + mese = obj + + elseif ent.itemstring == "ethereal:crystal_spike 2" + and not crystal then + + crystal = obj + end + end + end + + if mese and crystal then + + mese:remove() + crystal:remove() + + core.add_item(pos, "ethereal:crystal_ingot") + + return false -- return with no further action + end + end + }) +end diff --git a/mods/builtin_item/init.lua b/mods/builtin_item/init.lua new file mode 100644 index 00000000..d1a80770 --- /dev/null +++ b/mods/builtin_item/init.lua @@ -0,0 +1,676 @@ +-- Minetest: builtin/item_entity.lua + +function core.spawn_item(pos, item) + + local obj = core.add_entity(pos, "__builtin:item") + + if obj then + obj:get_luaentity():set_item(ItemStack(item):to_string()) + end + + return obj +end + + +-- If item_entity_ttl is not set, entity will have default life time +-- Setting it to -1 disables the feature +local time_to_live = tonumber(core.settings:get("item_entity_ttl")) or 900 +local gravity = tonumber(core.settings:get("movement_gravity")) or 9.81 +local destroy_item = core.settings:get_bool("destroy_item") ~= false +local source_flow = core.settings:get_bool("builtin_item.source_flow") + + +-- localize some math functions +local math_abs, math_sqrt = math.abs, math.sqrt +local math_random, math_min = math.random, math.min + + +-- water flow functions by QwertyMine3, edited by TenPlus1 and Gustavo6046 +local inv_roots = {[0] = 1} + +local function to_unit_vector(dir_vector) + + local sum = dir_vector.x * dir_vector.x + dir_vector.z * dir_vector.z + local invr_sum + + -- find inverse square root if possible + if inv_roots[sum] ~= nil then + invr_sum = inv_roots[sum] + else + -- not found, compute and save the inverse square root + invr_sum = 1.0 / math_sqrt(sum) + inv_roots[sum] = invr_sum + end + + return { + x = dir_vector.x * invr_sum, + y = dir_vector.y, + z = dir_vector.z * invr_sum + } +end + + +local function node_ok(pos) + + local node = minetest.get_node_or_nil(pos) + + if node and minetest.registered_nodes[node.name] then + return node + end + + return minetest.registered_nodes["default:dirt"] +end + + +local function quick_flow_logic(node, pos_testing, direction) + + local node_testing = node_ok(pos_testing) + local param2 = node.param2 + + if not minetest.registered_nodes[node.name].groups.liquid then + param2 = 0 + end + + if minetest.registered_nodes[node_testing.name].liquidtype ~= "flowing" then + return 0 + end + + local param2_testing = node_testing.param2 + + if param2_testing < param2 then + + if (param2 - param2_testing) > 6 then + return -direction + else + return direction + end + + elseif param2_testing > param2 then + + if (param2_testing - param2) > 6 then + return direction + else + return -direction + end + end + + return 0 +end + + +local function quick_flow(pos, node) + + local x, z = 0, 0 + + x = x + quick_flow_logic(node, {x = pos.x - 1, y = pos.y, z = pos.z},-1) + x = x + quick_flow_logic(node, {x = pos.x + 1, y = pos.y, z = pos.z}, 1) + z = z + quick_flow_logic(node, {x = pos.x, y = pos.y, z = pos.z - 1},-1) + z = z + quick_flow_logic(node, {x = pos.x, y = pos.y, z = pos.z + 1}, 1) + + return to_unit_vector({x = x, y = 0, z = z}) +end + + +-- particle effects for when item is destroyed +local function add_effects(pos) + + minetest.add_particlespawner({ + amount = 1, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -1, y = 2, z = -1}, + maxvel = {x = 1, y = 4, z = 1}, + minacc = {x = 0, y = 0, z = 0}, + maxacc = {x = 0, y = 0, z = 0}, + minexptime = 1, + maxexptime = 3, + minsize = 1, + maxsize = 4, + texture = "tnt_smoke.png" + }) +end + + +local water_force = tonumber(minetest.settings:get("builtin_item.waterflow_force") or 1.6) +local water_drag = tonumber(minetest.settings:get("builtin_item.waterflow_drag") or 0.8) +local dry_friction = tonumber(minetest.settings:get("builtin_item.friction_dry") or 2.6) +local air_drag = tonumber(minetest.settings:get("builtin_item.air_drag") or 0.4) +local items_collect_on_slippery = tonumber( + minetest.settings:get("builtin_item.items_collect_on_slippery") or 1) ~= 0 + + +core.register_entity(":__builtin:item", { + + initial_properties = { + hp_max = 1, + physical = true, + collide_with_objects = false, + collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, + visual = "wielditem", + visual_size = {x = 0.4, y = 0.4}, + textures = {""}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = false, + infotext = "" + }, + + itemstring = "", + falling_state = true, + slippery_state = false, + waterflow_state = false, + age = 0, + + accel = {x = 0, y = 0, z = 0}, + + set_item = function(self, item) + + local stack = ItemStack(item or self.itemstring) + + self.itemstring = stack:to_string() + + if self.itemstring == "" then + return + end + + local itemname = stack:is_known() and stack:get_name() or "unknown" + local max_count = stack:get_stack_max() + local count = math_min(stack:get_count(), max_count) + local size = 0.2 + 0.1 * (count / max_count) ^ (1 / 3) + local col_height = size * 0.75 + local def = core.registered_nodes[itemname] + local glow = def and def.light_source + local c1 = "" + + if not(stack:get_count() == 1) then + c1 = " × " .. tostring(stack:get_count()) + end + + local name1 = stack:get_meta():get_string("description") + local name + + if name1 == "" then + name = core.registered_items[itemname].description + else + name = name1 + end + + -- small random size bias to counter Z-fighting + local bias = math_random() * 1e-3 + + self.object:set_properties({ + is_visible = true, + visual = "wielditem", + textures = {itemname}, + visual_size = {x = size + bias, y = size + bias, z = size + bias}, + collisionbox = {-size, -col_height, -size, size, col_height, size}, + selectionbox = {-size, -size, -size, size, size, size}, + automatic_rotate = 0.314 / size, + wield_item = self.itemstring, + glow = glow, + infotext = name .. c1 .. "\n(" .. itemname .. ")" + }) + end, + + get_staticdata = function(self) + + return core.serialize({ + itemstring = self.itemstring, + age = self.age, + dropped_by = self.dropped_by + }) + end, + + on_activate = function(self, staticdata, dtime_s) + + if string.sub(staticdata, 1, 6) == "return" then + + local data = core.deserialize(staticdata) + + if data and type(data) == "table" then + self.itemstring = data.itemstring + self.age = (data.age or 0) + dtime_s + self.dropped_by = data.dropped_by + end + else + self.itemstring = staticdata + end + + self.object:set_armor_groups({immortal = 1}) + self:set_item() + end, + + try_merge_with = function(self, own_stack, object, entity) + + if self.age == entity.age then + return false -- Can not merge with itself + end + + local stack = ItemStack(entity.itemstring) + local name = stack:get_name() + + if own_stack:get_name() ~= name + or own_stack:get_meta() ~= stack:get_meta() + or own_stack:get_wear() ~= stack:get_wear() + or own_stack:get_free_space() == 0 then + return false -- Can not merge different or full stack + end + + local count = own_stack:get_count() + local total_count = stack:get_count() + count + local max_count = stack:get_stack_max() + + if total_count > max_count then + return false + end + + -- Merge the remote stack into this one + local pos = object:get_pos() + local self_pos = self.object:get_pos() + local x_diff = (self_pos.x - pos.x) / 2 + local z_diff = (self_pos.z - pos.z) / 2 + local new_pos = vector.offset(pos, x_diff, 0, z_diff) + + self.object:move_to(new_pos) + self.age = 0 -- Reset age + + -- Merge velocities + local vel_a = self.object:get_velocity() + local vel_b = object:get_velocity() + + self.object:set_velocity({ + x = (vel_a.x + vel_b.x) / 2, + y = (vel_a.y + vel_b.y) / 2, + z = (vel_a.z + vel_b.z) / 2 + }) + + -- Merge stacks + own_stack:set_count(total_count) + self:set_item(own_stack) + + entity.itemstring = "" + object:remove() + + return true + end, + + step_update_node_state = function(self, moveresult, dtime) + + local pos = self.object:get_pos() + + -- get nodes every 1/4 second + self.timer = (self.timer or 0) + dtime + + if self.timer < 0.25 and self.node_inside then + return + end + + self.timer = 0 + + self.node_inside = minetest.get_node_or_nil(pos) + self.def_inside = self.node_inside + and core.registered_nodes[self.node_inside.name] + + -- get ground node for collision + self.node_under = nil + self.falling_state = true + + --[[ new ground check (glitchy) + if moveresult and moveresult.touching_ground then + + for _, info in ipairs(moveresult.collisions) do + + if info.axis == "y" then + + self.node_under = core.get_node_or_nil(info.node_pos) + self.falling_state = false + + break + end + end + end]] + + -- old ground check (stable) + self.node_under = minetest.get_node_or_nil({ + x = pos.x, + y = pos.y + self.object:get_properties().collisionbox[2] - 0.05, + z = pos.z + }) + + self.def_under = self.node_under + and core.registered_nodes[self.node_under.name] + + -- part of old ground check + if self.def_under and self.def_under.walkable then + self.falling_state = false + end + end, + + step_node_inside_checks = function(self) + + local pos = self.object:get_pos() + + -- Delete in 'ignore' nodes + if (self.node_inside and self.node_inside.name == "ignore") + or self.itemstring == "" then + + self.itemstring = "" + self.object:remove() + + return true + end + + local def = self.def_inside + + -- item inside block, move to vacant space + if def and (def.walkable == nil or def.walkable == true) + and (def.collision_box == nil or def.collision_box.type == "regular") + and (def.node_box == nil or def.node_box.type == "regular") then + + local npos = minetest.find_node_near(pos, 1, "air") + + if npos then + self.object:move_to(npos) + end + + self.node_inside = nil -- force get_node + end + + -- destroy item when dropped into lava (if enabled) + if destroy_item and def and def.groups and def.groups.lava then + + minetest.sound_play("builtin_item_lava", { + pos = pos, + max_hear_distance = 6, + gain = 0.5 + }, true) + + self.itemstring = "" + self.object:remove() + + add_effects(pos) + + return true + end + + return false + end, + + step_check_slippery = function(self) + + -- don't check for slippery if we're not on the ground + if self.falling_state or not self.node_under then + + self.slippery_state = false + + return + end + + if self.node_under and self.def_under and self.def_under.walkable then + + local slippery = core.get_item_group(self.node_under.name, "slippery") + + self.slippery_state = slippery ~= 0 + end + end, + + step_water_physics = function(self) + + self.waterflow_state = self.def_inside and + (self.def_inside.liquidtype == "flowing" or (source_flow and + self.def_inside.liquidtype == "source")) + + if self.waterflow_state then + + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + + -- get flow velocity + local flow_vel = quick_flow(pos, self.node_inside) + + -- calculate flow force and drag + local flow_force_x = flow_vel.x * water_force + local flow_force_z = flow_vel.z * water_force + + local flow_drag_x = (flow_force_x - vel.x) * water_drag + local flow_drag_z = (flow_force_z - vel.z) * water_drag + + -- apply water force and friction + self.accel.x = self.accel.x + flow_force_x + flow_drag_x + self.accel.z = self.accel.z + flow_force_z + flow_drag_z + end + end, + + step_gravity = function(self) + + local vel = self.object:get_velocity() + + -- apply gravity if falling or Y velocity not 0 (just incase) + if self.falling_state or (vel and vel.y ~= 0) then + self.accel.y = self.accel.y - gravity + end + end, + + step_ground_friction = function(self) + + -- don't apply ground friction when falling! + if self.falling_state then + return + end + + local vel = self.object:get_velocity() + + -- this stops the entity drift glitch by re-setting entity pos when not moving + if vel.x == 0 and vel.y == 0 and vel.z == 0 then + + if self.is_moving == true then + + self.is_moving = false + + local pos = self.object:get_pos() + + self.object:set_pos(pos) + end + else + self.is_moving = true + end + + local this_dry_friction = dry_friction + + if self.slippery_state then + + -- apply slip factor (tiny friction that depends on the actual block type) + if math_abs(vel.x) > 0.2 or math_abs(vel.z) > 0.2 then + + local slippery = core.get_item_group(self.node_under.name, "slippery") + local slip_factor = 4.0 / (slippery + 4) + + this_dry_friction = slip_factor + end + end + + self.accel.x = self.accel.x - vel.x * this_dry_friction + self.accel.z = self.accel.z - vel.z * this_dry_friction + end, + + step_apply_forces = function(self) + self.object:set_acceleration(self.accel) + end, + + -- let items die out after enough time + step_check_timeout = function(self, dtime) + + self.age = self.age + dtime + + if time_to_live > 0 and self.age > time_to_live then + + add_effects(self.object:get_pos()) + + self.itemstring = "" + self.object:remove() + + return true + end + + return false + end, + + step_check_custom_step = function(self, dtime, moveresult) + + -- do custom step function + local name = ItemStack(self.itemstring):get_name() or "" + local custom = core.registered_items[name] + and core.registered_items[name].dropped_step + + if custom + and custom(self, self.object:get_pos(), dtime, moveresult) == false then + return true -- skip further checks if false + end + + return false + end, + + step_try_collect = function(self) + + -- Don't collect items if falling + if self.falling_state then + return + end + + -- Check if we should collect items while sliding + if self.slippery_state and not items_collect_on_slippery then + return + end + + -- Collect the items around to merge with + local own_stack = ItemStack(self.itemstring) + + if own_stack:get_free_space() == 0 then + return + end + + local self_pos = self.object:get_pos() + local objects = core.get_objects_inside_radius(self_pos, 1.0) + + for _, obj in pairs(objects) do + + local entity = obj:get_luaentity() + + if entity and entity.name == "__builtin:item" and not entity.is_falling then + + if self:try_merge_with(own_stack, obj, entity) then + + -- item will be moved up due to try_merge_with + self.falling_state = true + + own_stack = ItemStack(self.itemstring) + + if own_stack:get_free_space() == 0 then + return + end + end + end + end + end, + + step_air_drag_physics = function(self) + + local vel = self.object:get_velocity() + + -- apply air drag + if self.falling_state or (self.slippery_state and not self.waterflow_state) then + self.accel.x = self.accel.x - vel.x * air_drag + self.accel.z = self.accel.z - vel.z * air_drag + end + end, + + on_step = function(self, dtime, moveresult) + + -- reset acceleration + self.accel = {x = 0, y = 0, z = 0} + + -- check item timeout + if self:step_check_timeout(dtime) then + return -- deleted, stop here + end + + -- check custom step function + if self:step_check_custom_step(dtime, moveresult) then + return -- overriden + end + + -- do general checks + self:step_update_node_state(moveresult, dtime) + + if self:step_node_inside_checks() then + return -- destroyed + end + + -- do physics checks, then apply + self:step_water_physics() + self:step_check_slippery() + self:step_ground_friction() + self:step_air_drag_physics() + self:step_gravity() + + self:step_apply_forces() + + self:step_try_collect() -- merge + end, + + on_punch = function(self, hitter, ...) + + if self.itemstring == "" then + + self.object:remove() + + return + end + + if core.item_pickup then + + -- Call on_pickup callback in item definition. + local itemstack = ItemStack(self.itemstring) + local callback = itemstack:get_definition().on_pickup + local ret = callback(itemstack, hitter, + {type = "object", ref = self.object}, ...) + + if not ret then + -- Don't modify (and don't reset rotation) + return + end + + itemstack = ItemStack(ret) + + -- Handle the leftover itemstack + if itemstack:is_empty() then + self.itemstring = "" + self.object:remove() + else + self:set_item(itemstack) + end + else + -- old method of pickup for backwards compatibility + local inv = hitter:get_inventory() + + if inv then + + local left = inv:add_item("main", self.itemstring) + + if left and not left:is_empty() then + + self:set_item(left) + + return + end + end + + self.itemstring = "" + self.object:remove() + end + end +}) + + +print("[MOD] Built-in Item loaded") diff --git a/mods/builtin_item/license.txt b/mods/builtin_item/license.txt new file mode 100644 index 00000000..357dcc66 --- /dev/null +++ b/mods/builtin_item/license.txt @@ -0,0 +1,5 @@ +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication for audio files (found in sounds folder) + +LGPLv2.1+ license for original code with changes by TenPlus1 + +CC BY-SA 3.0 license for textures diff --git a/mods/builtin_item/mod.conf b/mods/builtin_item/mod.conf new file mode 100644 index 00000000..4936a165 --- /dev/null +++ b/mods/builtin_item/mod.conf @@ -0,0 +1,4 @@ +name = builtin_item +description = Dropped items can now be pushed by water, slide on ice and have their own custom functions. +depends = default +min_minetest_version = 5.0 diff --git a/mods/builtin_item/settingtypes.txt b/mods/builtin_item/settingtypes.txt new file mode 100644 index 00000000..fc926b6e --- /dev/null +++ b/mods/builtin_item/settingtypes.txt @@ -0,0 +1,44 @@ +# Controls how much force should be exerted on +# dropped items when they are pushed by flowing water. +# +# The larger this number, the faster items become when +# carried by water. +waterflow_force (Force of water flow on dropped items) float 1.6 + +# Controls how much drag force should be exerted on +# dropped items when they are submerged in flowing water +# but have a different momentum vector than the flow velocity. +# +# The larger this number, the larger the resistance of water +# to the push of an item. In other words, items thrown at +# flowing water in a direction opposite that of the flow will +# be pushed more quickly in the other direction with higher drag, +# even if the actual flow force remains the same. +waterflow_drag (Drag of water flow on dropped items) float 0.8 + +# Controls how much friction force should be exerted on +# dropped items when they move horizontally on the +# ground. +# +# The larger this number, the quickier items will come to +# a halt horizontally after falling on the floor. +friction_dry (Friction of dry ground on dropped items) float 2.5 + +# Controls how much horizontal drag force should be exerted on +# dropped items when they move horizontally in air. +# +# The larger this number, the quickier horizontal velocity tends +# toward zero. +air_drag (Horizontal drag of air on falling items) float 0.4 + +# Allow items on the floor to collect even on slippery floors. +# +# Dropped items can 'collect', that is, to have their +# stacks merged if they're close enough and are of the same item +# type. By default they can do this even on a slippery floor, like +# ice, but this setting allows disabling that. +builtin_item.items_collect_on_slippery (Collect items on slippery ground) bool true + +# Allow dropped items to be pushed when inside of source nodes, +# False by default but can be enabled. +builtin_item.source_flow (Allow water source to push items) bool false diff --git a/mods/builtin_item/sounds/builtin_item_lava.ogg b/mods/builtin_item/sounds/builtin_item_lava.ogg new file mode 100644 index 00000000..5c293fe9 Binary files /dev/null and b/mods/builtin_item/sounds/builtin_item_lava.ogg differ diff --git a/mods/builtin_item/textures/tnt_smoke.png b/mods/builtin_item/textures/tnt_smoke.png new file mode 100644 index 00000000..488b50fe Binary files /dev/null and b/mods/builtin_item/textures/tnt_smoke.png differ diff --git a/mods/carpets/LICENSE b/mods/carpets/LICENSE new file mode 100644 index 00000000..8000a6fa --- /dev/null +++ b/mods/carpets/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/carpets/README.md b/mods/carpets/README.md new file mode 100644 index 00000000..9d6700cc --- /dev/null +++ b/mods/carpets/README.md @@ -0,0 +1,15 @@ +# Carpets mod for minetest + +This mod adds 15 colorized wool carpets to the minetest. + +![](https://github.com/bell07/minetest-carpets/blob/master/screenshot.png) + +Maintained version, based on https://forum.minetest.net/viewtopic.php?t=15459 and https://forum.minetest.net/viewtopic.php?f=11&t=11637 + +License: LGPL-2.1+. + +The mod provides an api to register more carpets using template nodes +Example: +```lua +carpets.register('default:dirt', {description=S('Carpet dirt')}) -- registers carpet looks like dirt +``` diff --git a/mods/carpets/api.lua b/mods/carpets/api.lua new file mode 100644 index 00000000..55d8a17a --- /dev/null +++ b/mods/carpets/api.lua @@ -0,0 +1,56 @@ +local carpet_proto = { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5} + }, + groups = { + snappy = 2, + flammable = 3, + oddly_breakable_by_hand = 3, + choppy = 2, + carpet = 1, + } +} + +-- Register the carpet and recipe using material +-- material - already registered material item the textures and sounds applied from +-- def - optional additional - or overriding data passed to minetest.register_node() +carpets = {} + +function carpets.register(material, def) + local node = table.copy(carpet_proto) + if def then + for k,v in pairs(def) do + node[k] = v + end + end + + local material_def = minetest.registered_nodes[material] + node.description = node.description or material_def.description.." carpet" + node.sounds = table.copy(node.sounds or material_def.sounds or default.node_sound_defaults()) + node.groups = table.copy(node.groups) + + if node.tiles then + node.tiles = table.copy(node.tiles) + elseif material_def.tiles[6] then + node.tiles = {material_def.tiles[6]} + else + node.tiles = table.copy(material_def.tiles) + end + + local name = "carpet:" .. (node.name or material:gsub(":", "_")) + node.name = nil + + minetest.register_node(":" .. name, node) + + minetest.register_craft({ + output = name .. " 32", + recipe = { + {"group:wool", "group:wool", "group:wool"}, + {"group:wool", material, "group:wool"} + } + }) +end diff --git a/mods/carpets/init.lua b/mods/carpets/init.lua new file mode 100644 index 00000000..b80cc4d3 --- /dev/null +++ b/mods/carpets/init.lua @@ -0,0 +1,26 @@ +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator("carpets") +dofile(modpath .. "/api.lua") + +if minetest.get_modpath("wool") then + local nodes = { + {name="wool:black", description=S("Black carpet")}, + {name="wool:blue", description=S("Blue carpet")}, + {name="wool:brown", description=S("Brown carpet")}, + {name="wool:cyan", description=S("Cyan carpet")}, + {name="wool:dark_green", description=S("Dark green carpet")}, + {name="wool:dark_grey", description=S("Dark grey carpet")}, + {name="wool:green", description=S("Green carpet")}, + {name="wool:grey", description=S("Grey carpet")}, + {name="wool:magenta", description=S("Magenta carpet")}, + {name="wool:orange", description=S("Orange carpet")}, + {name="wool:pink", description=S("Pink carpet")}, + {name="wool:red", description=S("Red carpet")}, + {name="wool:violet", description=S("Violet carpet")}, + {name="wool:white", description=S("White carpet")}, + {name="wool:yellow", description=S("Yellow carpet")}, + } + for _, node in ipairs(nodes) do + carpets.register(node.name, {description=node.description}) + end +end diff --git a/mods/carpets/locale/carpets.de.tr b/mods/carpets/locale/carpets.de.tr new file mode 100644 index 00000000..86355584 --- /dev/null +++ b/mods/carpets/locale/carpets.de.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Schwarzer Teppich +Blue carpet=Blauer Teppich +Brown carpet=Brauner Teppich +Cyan carpet=Türkiser Teppich +Dark green carpet=Dunkelgrüner Teppich +Dark grey carpet=Dunkelgrauer Teppich +Green carpet=Grüner Teppich +Grey carpet=Grauer Teppich +Magenta carpet=Magenta Teppich +Orange carpet=Orange Teppich +Pink carpet=Rosa Teppich +Red carpet=Roter Teppich +Violet carpet=Violetter Teppich +White carpet=Weißer Teppich +Yellow carpet=Gelber Teppich diff --git a/mods/carpets/locale/carpets.eo.tr b/mods/carpets/locale/carpets.eo.tr new file mode 100644 index 00000000..2432b37f --- /dev/null +++ b/mods/carpets/locale/carpets.eo.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Nigra tapiÅo +Blue carpet=Blua tapiÅo +Brown carpet=Bruna tapiÅo +Cyan carpet=Bluverda tapiÅo +Dark green carpet=Malhela verda tapiÅo +Dark grey carpet=Malhela griza tapiÅo +Green carpet=Verda tapiÅo +Grey carpet=Griza tapiÅo +Magenta carpet=Fuksina tapiÅo +Orange carpet=OranÄa tapiÅo +Pink carpet=Rozkolora tapiÅo +Red carpet=RuÄa tapiÅo +Violet carpet=Violkolora tapiÅo +White carpet=Blanka tapiÅo +Yellow carpet=Flava tapiÅo diff --git a/mods/carpets/locale/carpets.es.tr b/mods/carpets/locale/carpets.es.tr new file mode 100644 index 00000000..67913dbe --- /dev/null +++ b/mods/carpets/locale/carpets.es.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Alfombra negra +Blue carpet=Alfombra azul +Brown carpet=Alfombra marrón +Cyan carpet=Alfombra cian +Dark green carpet=Alfombra verde oscuro +Dark grey carpet=Alfombra gris oscuro +Green carpet=Alfombra verde +Grey carpet=Alfombra gris +Magenta carpet=Alfombra magenta +Orange carpet=Alfombra naranja +Pink carpet=Alfombra rosa +Red carpet=Alfombra roja +Violet carpet=Alfombra violeta +White carpet=Alfombra blanca +Yellow carpet=Alfombra amarilla diff --git a/mods/carpets/locale/carpets.fr.tr b/mods/carpets/locale/carpets.fr.tr new file mode 100644 index 00000000..c90196e4 --- /dev/null +++ b/mods/carpets/locale/carpets.fr.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Tapis noir +Blue carpet=Tapis bleu +Brown carpet=Tapis marron +Cyan carpet=Tapis cyan +Dark green carpet=Tapis vert foncé +Dark grey carpet=Tapis gris foncé +Green carpet=Tapis vert +Grey carpet=Tapis gris +Magenta carpet=Tapis magenta +Orange carpet=Tapis orange +Pink carpet=Tapis rose +Red carpet=Tapis rouge +Violet carpet=Tapis violet +White carpet=Tapis blanc +Yellow carpet=Tapis jaune diff --git a/mods/carpets/locale/carpets.hu.tr b/mods/carpets/locale/carpets.hu.tr new file mode 100644 index 00000000..c79666df --- /dev/null +++ b/mods/carpets/locale/carpets.hu.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Fekete szÅ‘nyeg +Blue carpet=Kék szÅ‘nyeg +Brown carpet=Barna szÅ‘nyeg +Cyan carpet=Égszínkék szÅ‘nyeg +Dark green carpet=Sötétzöld szÅ‘nyeg +Dark grey carpet=Sötétszürke szÅ‘nyeg +Green carpet=Zöld szÅ‘nyeg +Grey carpet=Szürke szÅ‘nyeg +Magenta carpet=Magenta szÅ‘nyeg +Orange carpet=Narancs szÅ‘nyeg +Pink carpet=Rózsaszín szÅ‘nyeg +Red carpet=Piros szÅ‘nyeg +Violet carpet=Lila szÅ‘nyeg +White carpet=Fehér szÅ‘nyeg +Yellow carpet=Sárga szÅ‘nyeg diff --git a/mods/carpets/locale/carpets.it.tr b/mods/carpets/locale/carpets.it.tr new file mode 100644 index 00000000..583986ac --- /dev/null +++ b/mods/carpets/locale/carpets.it.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Tappeto nero +Blue carpet=Tappeto blu +Brown carpet=Tappeto marrone +Cyan carpet=Tappero ciano +Dark green carpet=Tappeto verde scuro +Dark grey carpet=Tappeto grigio scuro +Green carpet=Tappeto verde +Grey carpet=Tappeto grigio +Magenta carpet=Tappeto magenta +Orange carpet=Tappeto arancione +Pink carpet=Tappeto rosa +Red carpet=Tappero rosso +Violet carpet=Tappeto viola +White carpet=Tappeto bianco +Yellow carpet=Tappeto giallo diff --git a/mods/carpets/locale/carpets.pl.tr b/mods/carpets/locale/carpets.pl.tr new file mode 100644 index 00000000..5ecd382e --- /dev/null +++ b/mods/carpets/locale/carpets.pl.tr @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet=Czarny dywan +Blue carpet=Niebieski dywan +Brown carpet=BrÄ…zowy dywan +Cyan carpet=Błękitny dywan +Dark green carpet=Ciemnozielony dywan +Dark grey carpet=Ciemnoszary dywan +Green carpet=Zielony dywan +Grey carpet=Szary dywan +Magenta carpet=Purpurowy dywan +Orange carpet=PomaraÅ„czowy dywan +Pink carpet=Różowy dywan +Red carpet=Czerwony dywan +Violet carpet=Fioletowy dywan +White carpet=BiaÅ‚y dywan +Yellow carpet=Żółty dywan diff --git a/mods/carpets/locale/template.txt b/mods/carpets/locale/template.txt new file mode 100644 index 00000000..2cb1ed70 --- /dev/null +++ b/mods/carpets/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: carpets + +##[ init.lua ]## +Black carpet= +Blue carpet= +Brown carpet= +Cyan carpet= +Dark green carpet= +Dark grey carpet= +Green carpet= +Grey carpet= +Magenta carpet= +Orange carpet= +Pink carpet= +Red carpet= +Violet carpet= +White carpet= +Yellow carpet= diff --git a/mods/carpets/mod.conf b/mods/carpets/mod.conf new file mode 100644 index 00000000..5540f748 --- /dev/null +++ b/mods/carpets/mod.conf @@ -0,0 +1,3 @@ +name = carpets +description = Adds 16 colorized wool carpets to the minetest. +optional_depends = wool diff --git a/mods/caverealms/LICENSE.txt b/mods/caverealms/LICENSE.txt new file mode 100644 index 00000000..6e9767ff --- /dev/null +++ b/mods/caverealms/LICENSE.txt @@ -0,0 +1,26 @@ +Copyright (c) 2017, Craig Robbins and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. diff --git a/mods/caverealms/README.md b/mods/caverealms/README.md new file mode 100644 index 00000000..4ab76b83 --- /dev/null +++ b/mods/caverealms/README.md @@ -0,0 +1,31 @@ +# caverealms-lite + +Based on the original minetest-caverealms mod (https://github.com/HeroOfTheWinds/minetest-caverealms/). + +Adds underground realms to minetest. + +This caverealms fork provides all the biomes and decorations from the original caverealms, with several additions and without the overhead of generating caves. This lowers the server resources the mod requires, for example CPU and RAM. This also removes the large lava spills created by the original caverealms. + +It is specifically written to work with the mgvalleys mapgen, but will work using other mapgens as well. The mapgen used will determine the shape and size of individual caves. Mapgens that generate only smaller caves may be less suitable for use with this fork than mgvalleys. + +Note: For worlds where the original caverealms is already in use, this fork is not advised as a replacement. If used in this way, some unknown nodes and other minor issues should be expected. + + +## License and Contributors + +Source code: FreeBSD License (Simplified) +The original caverealms was licensed as WTFPL. + +Contributors: +- Zeno, Shara RedCat - This rewrite +- HeroOfTheWinds, Zeno - Original mod + + +## Recommended Additions + +- VanessaE's HDX texturepacks provide alternative textures. For example, +https://gitlab.com/VanessaE/hdx-128. +- ethereal mod unlocks additional content (https://notabug.org/tenplus1/ethereal). +- mobs_monster mod allows Dungeon Masters to spawn in the Dungeon Master's Lair biome (https://notabug.org/tenplus1/mobs_monster). +- mobs_redo is required to run mobs_monster (https://notabug.org/tenplus1/mobs_redo). +- abritorch adds coloured torches made with caverealms items (https://github.com/Ezhh/abritorch). diff --git a/mods/caverealms/biomes.lua b/mods/caverealms/biomes.lua new file mode 100644 index 00000000..6c432c74 --- /dev/null +++ b/mods/caverealms/biomes.lua @@ -0,0 +1,661 @@ +--[[ + Biomes defined via the Minetest Biome API +]] + +local mpath = minetest.get_modpath("caverealms") +local spath = mpath .. "/schematics/" + +-- Moss cave + +local moss_cave_surface = { + "caverealms:stone_with_moss", +} + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 10, + biomes = asuna.features.cave.moss, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = moss_cave_surface, + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = moss_cave_surface, + spawn_by = moss_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.moss, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "emerald_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.moss, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "emerald_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = moss_cave_surface, + spawn_by = moss_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.moss, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "sapphire_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.moss, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "sapphire_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = moss_cave_surface, + fill_ratio = 0.00625, + biomes = asuna.features.cave.moss, + y_max = 0, + y_min = -31000, + decoration = "caverealms:glow_gem", + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 0.0175, + biomes = asuna.features.cave.moss, + y_max = 0, + y_min = -31000, + height = 2, + height_max = 4, + decoration = "caverealms:glow_worm", + flags = "all_ceilings", +}) + +-- Fungal cave + +local fungal_cave_surface = { + "caverealms:stone_with_lichen", +} + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 10, + biomes = asuna.features.cave.fungal, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = fungal_cave_surface, + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = fungal_cave_surface, + spawn_by = fungal_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.fungal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "emerald_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.fungal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "emerald_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = fungal_cave_surface, + spawn_by = fungal_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.fungal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "amethyst_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.fungal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "amethyst_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = fungal_cave_surface, + fill_ratio = 0.0005, + biomes = asuna.features.cave.fungal, + y_max = -16, + y_min = -31000, + schematic = spath .. "shroom.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = fungal_cave_surface, + fill_ratio = 0.025, + biomes = asuna.features.cave.fungal, + y_max = 0, + y_min = -31000, + decoration = "caverealms:fungus", + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = fungal_cave_surface, + fill_ratio = 0.025, + biomes = asuna.features.cave.fungal, + y_max = 0, + y_min = -31000, + decoration = "caverealms:mycena", + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 0.0175, + biomes = asuna.features.cave.fungal, + y_max = 0, + y_min = -31000, + height = 2, + height_max = 4, + decoration = "caverealms:glow_worm_green", + flags = "all_ceilings", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 16, + place_on = "default:stone", + noise_params = { + offset = -0.227, + scale = 0.385, + spread = {x = 9, y = 9, z = 9}, + seed = seed, + octaves = 2, + persist = 0.65, + lacunarity = 0.69, + }, + biomes = asuna.features.cave.fungal, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + height_max = 2, + decoration = "ethereal:mushroom", + flags = "all_ceilings,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = fungal_cave_surface, + fill_ratio = 0.00095, + biomes = asuna.features.cave.fungal, + y_max = 0, + y_min = -31000, + decoration = { + "flowers:mushroom_red", + "flowers:mushroom_brown", + "herbs:mushroom_boletus", + "herbs:mushroom_cantharellus", + "herbs:mushroom_macrolepiota", + "herbs:mushroom_amanita_green", + "herbs:mushroom_gyromitra", + "herbs:mushroom_galerina", + }, + flags = "all_floors", +}) + +-- Coal/desert cave + +local desert_cave_surface = { + "default:desert_sand", +} + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 10, + biomes = asuna.features.cave.coal, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = desert_cave_surface, + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = desert_cave_surface, + fill_ratio = 10, + biomes = asuna.features.cave.coal, + y_max = 0, + y_min = -31000, + place_offset_y = -2, + decoration = "default:stone", + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = { + "default:desert_sand", + "caverealms:coal_dust", + "default:coalblock", + }, + spawn_by = desert_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.coal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "ruby_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.coal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "ruby_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = { + "default:desert_sand", + "caverealms:coal_dust", + "default:coalblock", + }, + spawn_by = desert_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.coal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "amethyst_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.coal, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "amethyst_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = desert_cave_surface, + fill_ratio = 0.1, + biomes = asuna.features.cave.coal, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = "caverealms:coal_dust", + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = desert_cave_surface, + fill_ratio = 0.005, + biomes = asuna.features.cave.coal, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = "default:coalblock", + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = desert_cave_surface, + fill_ratio = 0.01, + biomes = asuna.features.cave.coal, + y_max = 0, + y_min = -31000, + decoration = "caverealms:constant_flame", + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = desert_cave_surface, + spawn_by = { + "default:desert_sand", + "caverealms:coal_dust", + "default:coalblock", + }, + num_spawn_by = 8, + fill_ratio = 0.001, + biomes = asuna.features.cave.coal, + y_max = 0, + y_min = -31000, + decoration = "default:cactus", + flags = "all_floors", +}) + +-- Fire cave + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 10, + biomes = asuna.features.cave.fire, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = "caverealms:hot_cobble", + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 4, + place_on = "caverealms:hot_cobble", + noise_params = { + offset = -0.325, + scale = 0.45, + spread = {x = 8, y = 8, z = 8}, + seed = seed, + octaves = 2, + persist = 0.64, + lacunarity = 0.7, + }, + biomes = asuna.features.cave.fire, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = "default:obsidian", + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 10, + biomes = asuna.features.cave.fire, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = "caverealms:hot_cobble", + flags = "all_ceilings,force_placement", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "caverealms:hot_cobble", + fill_ratio = 0.085, + biomes = asuna.features.cave.fire, + y_max = 0, + y_min = -31000, + decoration = "caverealms:constant_flame", + flags = "all_floors", +}) + +local c_lava = minetest.get_content_id("default:lava_source") +local valid_lava_enclosure = {} +for _,lava_enclosure in ipairs({ + minetest.get_content_id("default:stone"), + minetest.get_content_id("caverealms:hot_cobble"), + c_lava, +}) do + valid_lava_enclosure[lava_enclosure] = true +end + +abdecor.register_advanced_decoration("caverealms_fire_cave_lava",{ + target = { + place_on = { + "caverealms:hot_cobble", + }, + sidelen = 80, + fill_ratio = 0.065, + y_max = -8, + y_min = -31000, + flags = "all_floors", + }, + fn = function(mapgen) + -- Get provided values + local va = mapgen.voxelarea + local vdata = mapgen.data + local pos = mapgen.pos + + -- Get stride values and set position + local ystride = va.ystride + local zstride = va.zstride + local pos = va:index(pos.x,pos.y,pos.z) + + -- Lava must be enclosed to its sides and below + for _,adjacent in ipairs({ + -ystride, + 1, + -1, + zstride, + -zstride, + }) do + if not valid_lava_enclosure[vdata[pos + adjacent]] then + return -- lava is not properly enclosed + end + end + + -- Place lava + vdata[pos] = c_lava + end, + flags = { + liquid = true, + }, +}) + +-- Dry cave + +local dry_cave_surface = { + "default:dry_dirt", + "default:dry_dirt_with_dry_grass", + "default:desert_stone", + "default:desert_cobble", +} + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 10, + biomes = asuna.features.cave.dry, + y_max = 0, + y_min = -31000, + place_offset_y = -1, + decoration = dry_cave_surface, + flags = "all_floors,force_placement", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = dry_cave_surface, + spawn_by = dry_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.dry, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "ruby_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.dry, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "ruby_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = dry_cave_surface, + spawn_by = dry_cave_surface, + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.dry, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "amethyst_stalagmite.mts", + flags = "all_floors,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + sidelen = 80, + place_on = "default:stone", + spawn_by = "default:stone", + num_spawn_by = 8, + fill_ratio = 0.000085, + biomes = asuna.features.cave.dry, + y_max = -16, + y_min = -31000, + place_offset_y = -1, + schematic = spath .. "amethyst_stalactite.mts", + flags = "all_ceilings,place_center_x,place_center_z", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = dry_cave_surface, + fill_ratio = 0.01, + biomes = asuna.features.cave.dry, + y_max = 0, + y_min = -31000, + decoration = "caverealms:spike", + flags = "all_floors", +}) + +minetest.register_decoration({ + deco_type = "simple", + sidelen = 80, + place_on = "default:stone", + fill_ratio = 0.01, + biomes = asuna.features.cave.dry, + y_max = 0, + y_min = -31000, + height = 2, + height_max = 3, + decoration = "caverealms:fire_vine", + flags = "all_ceilings", +}) \ No newline at end of file diff --git a/mods/caverealms/config.lua b/mods/caverealms/config.lua new file mode 100644 index 00000000..5a5f9cc8 --- /dev/null +++ b/mods/caverealms/config.lua @@ -0,0 +1,53 @@ +local CONFIG_FILE_PREFIX = "caverealms." + +caverealms.config = {} + +-- This function based on kaeza/minetest-irc/config.lua and used under the +-- terms of BSD 2-clause license. +local function setting(stype, name, default) + local value + if stype == "bool" then + value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name) + elseif stype == "string" then + value = minetest.settings:get(CONFIG_FILE_PREFIX..name) + elseif stype == "number" then + value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + caverealms.config[name] = value +end + +--generation settings +setting("number", "ymin", -33000) --bottom realm limit +setting("number", "ymax", -1500) --top realm limit +setting("number", "tcave", 0.75) --cave threshold + +--decoration chances +setting("number", "stagcha", 0.003) --chance of stalagmites +setting("number", "stalcha", 0.003) --chance of stalactites + +setting("number", "h_lag", 8) --max height for stalagmites +setting("number", "h_lac", 8) --...stalactites +setting("number", "crystal", 0.0002) --chance of glow crystal formations +setting("number", "h_cry", 8) --max height of glow crystals +setting("number", "h_clac", 8) --max height of glow crystal stalactites + +setting("number", "gemcha", 0.03) --chance of small glow gems +setting("number", "mushcha", 0.04) --chance of mushrooms +setting("number", "myccha", 0.03) --chance of mycena mushrooms +setting("number", "wormcha", 0.015) --chance of glow worms +setting("number", "giantcha", 0.001) --chance of giant mushrooms +setting("number", "icicha", 0.035) --chance of icicles +setting("number", "flacha", 0.04) --chance of constant flames + +--realm limits for Dungeon Masters' Lair +setting("number", "dm_top", -14000) --upper limit +setting("number", "dm_bot", -16000) --lower limit + +--should DMs spawn in DM Lair? +setting("bool", "dm_spawn", true) + +--Deep cave settings +setting("number", "deep_cave", -7000) -- upper limit diff --git a/mods/caverealms/crafting.lua b/mods/caverealms/crafting.lua new file mode 100644 index 00000000..52da2771 --- /dev/null +++ b/mods/caverealms/crafting.lua @@ -0,0 +1,145 @@ +--thin ice to water +minetest.register_craft({ + output = "default:water_source", + type = "shapeless", + recipe = {"caverealms:thin_ice"} +}) + +--use for coal dust +minetest.register_craft({ + output = "default:coalblock", + recipe = { + {"caverealms:coal_dust","caverealms:coal_dust","caverealms:coal_dust"}, + {"caverealms:coal_dust","caverealms:coal_dust","caverealms:coal_dust"}, + {"caverealms:coal_dust","caverealms:coal_dust","caverealms:coal_dust"} + } +}) + +-- DM statue +minetest.register_craft({ + output = "caverealms:dm_statue", + recipe = { + {"caverealms:glow_ore","caverealms:hot_cobble","caverealms:glow_ore"}, + {"caverealms:hot_cobble","caverealms:hot_cobble","caverealms:hot_cobble"}, + {"caverealms:hot_cobble","caverealms:hot_cobble","caverealms:hot_cobble"} + } +}) + +-- Glow obsidian brick +minetest.register_craft({ + output = "caverealms:glow_obsidian_brick 4", + recipe = { + {"caverealms:glow_obsidian", "caverealms:glow_obsidian"}, + {"caverealms:glow_obsidian", "caverealms:glow_obsidian"} + } +}) + +minetest.register_craft({ + output = "caverealms:glow_obsidian_brick_2 4", + recipe = { + {"caverealms:glow_obsidian_2", "caverealms:glow_obsidian_2"}, + {"caverealms:glow_obsidian_2", "caverealms:glow_obsidian_2"} + } +}) + +-- Glow obsidian glass +minetest.register_craft({ + output = "caverealms:glow_obsidian_glass 5", + recipe = { + {"default:glass", "default:glass", "default:glass"}, + {"default:glass", "default:glass", "caverealms:glow_obsidian"} + } +}) + +minetest.register_craft({ + output = "caverealms:glow_obsidian_glass 5", + recipe = { + {"default:glass", "default:glass", "default:glass"}, + {"default:glass", "default:glass", "caverealms:glow_obsidian_2"} + } +}) + +-- Requires ethereal:fish_raw +if minetest.get_modpath("ethereal") then + + -- Professional Fishing Rod + minetest.register_craftitem("caverealms:angler_rod", { + description = "Pro Fishing Rod", + inventory_image = "caverealms_angler_rod.png", + wield_image = "caverealms_angler_rod.png" + }) + + minetest.register_craft({ + output = "caverealms:angler_rod", + recipe = { + {"","","default:steel_ingot"}, + {"", "default:steel_ingot", "caverealms:mushroom_gills"}, + {"default:steel_ingot", "", "caverealms:mushroom_gills"}, + } + }) + + -- Glow Bait + minetest.register_craftitem("caverealms:glow_bait", { + description = "Glow Bait", + inventory_image = "caverealms_glow_bait.png", + wield_image = "caverealms_glow_bait.png", + }) + + minetest.register_craft({ + output = "caverealms:glow_bait 9", + recipe = { + {"caverealms:glow_worm_green"}, + } + }) + + -- default ethereal fish + local fish = { + {"ethereal:fish_raw"}, + } + + -- Pro Fishing Rod (Baited) + minetest.register_craftitem("caverealms:angler_rod_baited", { + description = "Baited Pro Fishing Rod", + inventory_image = "caverealms_angler_rod_baited.png", + wield_image = "caverealms_angler_rod_weild.png", + stack_max = 1, + liquids_pointable = true, + + on_use = function (itemstack, user, pointed_thing) + + if pointed_thing.type ~= "node" then + return + end + + local node = minetest.get_node(pointed_thing.under).name + + if (node == "default:water_source" + or node == "default:river_water_source") + and math.random(1, 100) < 35 then + + local type = fish[math.random(1, #fish)][1] + local inv = user:get_inventory() + + if inv:room_for_item("main", {name = type}) then + + inv:add_item("main", {name = type}) + + if (math.random() < 0.6) then + return ItemStack("caverealms:angler_rod_baited") + else + return ItemStack("caverealms:angler_rod") + end + else + minetest.chat_send_player(user:get_player_name(), + "Inventory full, Fish Got Away!") + end + end + end, + }) + + minetest.register_craft({ + type = "shapeless", + output = "caverealms:angler_rod_baited", + recipe = {"caverealms:angler_rod", "caverealms:glow_bait"}, + }) +end diff --git a/mods/caverealms/depends.txt b/mods/caverealms/depends.txt new file mode 100644 index 00000000..bc12d19e --- /dev/null +++ b/mods/caverealms/depends.txt @@ -0,0 +1,8 @@ +default +asuna_core +stairs +ethereal? +mobs? +abdecor +flowers? +herbs? \ No newline at end of file diff --git a/mods/caverealms/description.txt b/mods/caverealms/description.txt new file mode 100644 index 00000000..23587508 --- /dev/null +++ b/mods/caverealms/description.txt @@ -0,0 +1 @@ +A mod for Minetest to add underground realms. diff --git a/mods/caverealms/docs/caverealms_lite_biomes.txt b/mods/caverealms/docs/caverealms_lite_biomes.txt new file mode 100644 index 00000000..d1591eeb --- /dev/null +++ b/mods/caverealms/docs/caverealms_lite_biomes.txt @@ -0,0 +1,19 @@ +Biome #, Biome name, "floor node" + + +0, None +1, Moss, "caverealms:stone_with_moss" +2, Fungal, "caverealms:stone_with_lichen" +3, Algae, "caverealms:stone_with_algae" +4, Glaciated, "caverealms:thin_ice" + +The following are "deep realms" + +5, Deep Glaciated, "default:ice" +6, DM, "caverealms:hot_cobble" +7, Salt Crystal, "caverealms:stone_with_salt" +8, Glow Obsidian, "caverealms:glow_obsidian" + OR "caverealms:glow_obsidian2" +9, Coal, "default:coalblock" + OR "caverealms:coal_dust" + OR "default:desert_sand" diff --git a/mods/caverealms/dungeon_master.lua b/mods/caverealms/dungeon_master.lua new file mode 100644 index 00000000..e93ea8c2 --- /dev/null +++ b/mods/caverealms/dungeon_master.lua @@ -0,0 +1,16 @@ +mobs:spawn({ + name = "mobs_monster:dungeon_master", + nodes = {"caverealms:hot_cobble"}, + max_light = 12, + min_light = 0, + chance = 7000, + active_object_count = 2, + max_height = -8000, + on_spawn = function(self, pos) + self.hp_max = 70 + self.health = 70 + self.damage = 5 + self.shoot_interval = 1.5 + self.dogshoot_switch = 0 + end +}) diff --git a/mods/caverealms/functions.lua b/mods/caverealms/functions.lua new file mode 100644 index 00000000..2be9e106 --- /dev/null +++ b/mods/caverealms/functions.lua @@ -0,0 +1,409 @@ +local H_LAG = caverealms.config.h_lag --15 --max height for stalagmites +local H_LAC = caverealms.config.h_lac --20 --...stalactites +local H_CRY = caverealms.config.h_cry --9 --max height of glow crystals +local H_CLAC = caverealms.config.h_clac --13 --max height of glow crystal stalactites + +function caverealms:above_solid(x,y,z,area,data) + local c_air = minetest.get_content_id("air") + + local ai = area:index(x,y+1,z-3) + if data[ai] == c_air then + return false + else + return true + end +end + +function caverealms:below_solid(x,y,z,area,data) + local c_air = minetest.get_content_id("air") + + local ai = area:index(x,y-1,z-3) + if data[ai] == c_air then + return false + else + return true + end +end + +--stalagmite spawner +function caverealms:stalagmite(x,y,z, area, data) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + + local top = math.random(6,H_LAG) --grab a random height for the stalagmite + for j = 0, top do --y + for k = -3, 3 do + for l = -3, 3 do + if j == 0 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j <= top/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j <= top/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = c_stone + end + end + end + end +end + +--stalactite spawner +function caverealms:stalactite(x,y,z, area, data) + + if not caverealms:above_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone")--("caverealms:limestone") + + local bot = math.random(-H_LAC, -6) --grab a random height for the stalagmite + for j = bot, 0 do --y + for k = -3, 3 do + for l = -3, 3 do + if j >= -1 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j >= bot/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j >= bot/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = c_stone + end + end + end + end +end + +--glowing crystal stalagmite spawner +function caverealms:crystal_stalagmite(x,y,z, area, data, biome) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + local c_crystal = minetest.get_content_id("caverealms:glow_crystal") + local c_crystore = minetest.get_content_id("caverealms:glow_ore") + local c_emerald = minetest.get_content_id("caverealms:glow_emerald") + local c_emore = minetest.get_content_id("caverealms:glow_emerald_ore") + local c_mesecry = minetest.get_content_id("caverealms:glow_mese") + local c_meseore = minetest.get_content_id("default:stone_with_mese") + local c_ruby = minetest.get_content_id("caverealms:glow_ruby") + local c_rubore = minetest.get_content_id("caverealms:glow_ruby_ore") + local c_ameth = minetest.get_content_id("caverealms:glow_amethyst") + local c_amethore = minetest.get_content_id("caverealms:glow_amethyst_ore") + local c_ice = minetest.get_content_id("default:ice") + local c_thinice = minetest.get_content_id("caverealms:thin_ice") + + --for randomness + local mode = 1 + if math.random(15) == 1 then + mode = 2 + end + if biome == 3 then + if math.random(25) == 1 then + mode = 2 + else + mode = 1 + end + end + if biome == 4 or biome == 5 then + if math.random(3) == 1 then + mode = 2 + end + end + + local stalids = { + { {c_crystore, c_crystal}, {c_emore, c_emerald} }, + { {c_emore, c_emerald}, {c_crystore, c_crystal} }, + { {c_emore, c_emerald}, {c_meseore, c_mesecry} }, + { {c_ice, c_thinice}, {c_crystore, c_crystal}}, + { {c_ice, c_thinice}, {c_crystore, c_crystal}}, + { {c_rubore, c_ruby}, {c_meseore, c_mesecry}}, + { {c_crystore, c_crystal}, {c_rubore, c_ruby} }, + { {c_rubore, c_ruby}, {c_emore, c_emerald}}, + { {c_amethore, c_ameth}, {c_meseore, c_mesecry} }, + } + + local nid_a + local nid_b + local nid_s = c_stone --stone base, will be rewritten to ice in certain biomes + + if biome > 3 and biome < 6 then + if mode == 1 then + nid_a = c_ice + nid_b = c_thinice + nid_s = c_ice + else + nid_a = c_crystore + nid_b = c_crystal + end + elseif mode == 1 then + nid_a = stalids[biome][1][1] + nid_b = stalids[biome][1][2] + else + nid_a = stalids[biome][2][1] + nid_b = stalids[biome][2][2] + end + + local top = math.random(5,H_CRY) --grab a random height for the stalagmite + for j = 0, top do --y + for k = -3, 3 do + for l = -3, 3 do + if j == 0 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_s + end + elseif j <= top/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_a + end + elseif j <= top/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_b + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = nid_b + end + end + end + end +end + +--crystal stalactite spawner +function caverealms:crystal_stalactite(x,y,z, area, data, biome) + + if not caverealms:above_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + local c_crystore = minetest.get_content_id("caverealms:glow_ore") + local c_crystal = minetest.get_content_id("caverealms:glow_crystal") + local c_emerald = minetest.get_content_id("caverealms:glow_emerald") + local c_emore = minetest.get_content_id("caverealms:glow_emerald_ore") + local c_mesecry = minetest.get_content_id("caverealms:glow_mese") + local c_meseore = minetest.get_content_id("default:stone_with_mese") + local c_ruby = minetest.get_content_id("caverealms:glow_ruby") + local c_rubore = minetest.get_content_id("caverealms:glow_ruby_ore") + local c_ameth = minetest.get_content_id("caverealms:glow_amethyst") + local c_amethore = minetest.get_content_id("caverealms:glow_amethyst_ore") + local c_ice = minetest.get_content_id("default:ice") + local c_thinice = minetest.get_content_id("caverealms:hanging_thin_ice") + + --for randomness + local mode = 1 + if math.random(15) == 1 then + mode = 2 + end + if biome == 3 then + if math.random(25) == 1 then + mode = 2 + else + mode = 1 + end + end + if biome == 4 or biome == 5 then + if math.random(3) == 1 then + mode = 2 + end + end + + local stalids = { + { {c_crystore, c_crystal}, {c_emore, c_emerald} }, + { {c_emore, c_emerald}, {c_crystore, c_crystal} }, + { {c_emore, c_emerald}, {c_meseore, c_mesecry} }, + { {c_ice, c_thinice}, {c_crystore, c_crystal}}, + { {c_ice, c_thinice}, {c_crystore, c_crystal}}, + { {c_rubore, c_ruby}, {c_meseore, c_mesecry}}, + { {c_crystore, c_crystal}, {c_rubore, c_ruby} }, + { {c_rubore, c_ruby}, {c_emore, c_emerald}}, + { {c_amethore, c_ameth}, {c_meseore, c_mesecry} }, + } + + local nid_a + local nid_b + local nid_s = c_stone --stone base, will be rewritten to ice in certain biomes + + if biome > 3 and biome < 6 then + if mode == 1 then + nid_a = c_ice + nid_b = c_thinice + nid_s = c_ice + else + nid_a = c_crystore + nid_b = c_crystal + end + elseif mode == 1 then + nid_a = stalids[biome][1][1] + nid_b = stalids[biome][1][2] + else + nid_a = stalids[biome][2][1] + nid_b = stalids[biome][2][2] + end + + local bot = math.random(-H_CLAC, -6) --grab a random height for the stalagmite + for j = bot, 0 do --y + for k = -3, 3 do + for l = -3, 3 do + if j >= -1 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_s + end + elseif j >= bot/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_a + end + elseif j >= bot/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_b + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = nid_b + end + end + end + end +end + +--glowing crystal stalagmite spawner +function caverealms:salt_stalagmite(x,y,z, area, data, biome) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + local c_salt = minetest.get_content_id("caverealms:salt_crystal") + + local scale = math.random(2, 4) + if scale == 2 then + for j = -3, 3 do + for k = -3, 3 do + local vi = area:index(x+j, y, z+k) + data[vi] = c_stone + if math.abs(j) ~= 3 and math.abs(k) ~= 3 then + local vi = area:index(x+j, y+1, z+k) + data[vi] = c_stone + end + end + end + else + for j = -4, 4 do + for k = -4, 4 do + local vi = area:index(x+j, y, z+k) + data[vi] = c_stone + if math.abs(j) ~= 4 and math.abs(k) ~= 4 then + local vi = area:index(x+j, y+1, z+k) + data[vi] = c_stone + end + end + end + end + for j = 2, scale + 2 do --y + for k = -2, scale - 2 do + for l = -2, scale - 2 do + local vi = area:index(x+k, y+j, z+l) + data[vi] = c_salt -- make cube + end + end + end +end + +--function to create giant 'shrooms +function caverealms:giant_shroom(x, y, z, area, data) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + local c_cap + local c_stem + + --as usual, grab the content ID's + if minetest.get_modpath("ethereal") then + c_stem = minetest.get_content_id("ethereal:mushroom_trunk") + c_cap = minetest.get_content_id("ethereal:mushroom") + else + c_stem = minetest.get_content_id("caverealms:mushroom_stem") + c_cap = minetest.get_content_id("caverealms:mushroom_cap") + end + + local c_gills = minetest.get_content_id("caverealms:mushroom_gills") + + z = z - 5 + --cap + for k = -5, 5 do + for l = -5, 5 do + if k*k + l*l <= 25 then + local vi = area:index(x+k, y+5, z+l) + data[vi] = c_cap + end + if k*k + l*l <= 16 then + local vi = area:index(x+k, y+6, z+l) + data[vi] = c_cap + vi = area:index(x+k, y+5, z+l) + data[vi] = c_gills + end + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+7, z+l) + data[vi] = c_cap + end + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+8, z+l) + data[vi] = c_cap + end + end + end + --stem + for j = 0, 5 do + for k = -1,1 do + local vi = area:index(x+k, y+j, z) + data[vi] = c_stem + if k == 0 then + local ai = area:index(x, y+j, z+1) + data[ai] = c_stem + ai = area:index(x, y+j, z-1) + data[ai] = c_stem + end + end + end +end diff --git a/mods/caverealms/init.lua b/mods/caverealms/init.lua new file mode 100644 index 00000000..b40c6bbb --- /dev/null +++ b/mods/caverealms/init.lua @@ -0,0 +1,24 @@ +-- caverealms v.0.8 by HeroOfTheWinds +-- original cave code modified from paramat's subterrain +-- For Minetest 0.4.8 stable +-- Depends default +-- License: code WTFPL + +caverealms = {} --create a container for functions and constants + +--grab a shorthand for the filepath of the mod +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +--load companion lua files +dofile(modpath.."/config.lua") --configuration file; holds various constants +dofile(modpath.."/crafting.lua") --crafting recipes +dofile(modpath.."/nodes.lua") --node definitions +dofile(modpath.."/functions.lua") --function definitions +dofile(modpath.."/plants.lua") +dofile(modpath.."/biomes.lua") + +if minetest.get_modpath("mobs_monster") then + if caverealms.config.dm_spawn == true then + dofile(modpath.."/dungeon_master.lua") --special DMs for DM's Lair biome + end +end \ No newline at end of file diff --git a/mods/caverealms/mod.conf b/mods/caverealms/mod.conf new file mode 100644 index 00000000..1f32f704 --- /dev/null +++ b/mods/caverealms/mod.conf @@ -0,0 +1 @@ +name = caverealms \ No newline at end of file diff --git a/mods/caverealms/nodes.lua b/mods/caverealms/nodes.lua new file mode 100644 index 00000000..8057a334 --- /dev/null +++ b/mods/caverealms/nodes.lua @@ -0,0 +1,521 @@ +-- CaveRealms nodes.lua + +--NODES-- + +--glowing crystal +minetest.register_node("caverealms:glow_crystal", { + description = "Glow Sapphire", + tiles = {"caverealms_glow_crystal.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing emerald +minetest.register_node("caverealms:glow_emerald", { + description = "Glow Emerald", + tiles = {"caverealms_glow_emerald.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing mese crystal blocks +minetest.register_node("caverealms:glow_mese", { + description = "Glow Mese Crystal", + tiles = {"caverealms_glow_mese.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing ruby +minetest.register_node("caverealms:glow_ruby", { + description = "Glow Ruby", + tiles = {"caverealms_glow_ruby.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing amethyst +minetest.register_node("caverealms:glow_amethyst", { + description = "Glow Amethyst", + tiles = {"caverealms_glow_amethyst.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--embedded crystal +minetest.register_node("caverealms:glow_ore", { + description = "Glow Crystal Ore", + tiles = {"caverealms_glow_ore.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 10, + paramtype = "light", +}) + +--embedded emerald +minetest.register_node("caverealms:glow_emerald_ore", { + description = "Glow Emerald Ore", + tiles = {"caverealms_glow_emerald_ore.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 10, + paramtype = "light", +}) + +--embedded ruby +minetest.register_node("caverealms:glow_ruby_ore", { + description = "Glow Ruby Ore", + tiles = {"caverealms_glow_ruby_ore.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 10, + paramtype = "light", +}) + +--embedded amethyst +minetest.register_node("caverealms:glow_amethyst_ore", { + description = "Glow Amethyst Ore", + tiles = {"caverealms_glow_amethyst_ore.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 10, + paramtype = "light", +}) + +--thin (transparent) ice +minetest.register_node("caverealms:thin_ice", { + description = "Thin Ice", + tiles = {"caverealms_thin_ice.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, + freezemelt = "default:water_source", + paramtype = "light", +}) + +--salt crystal +minetest.register_node("caverealms:salt_crystal", { + description = "Salt Crystal", + tiles = {"caverealms_salt_crystal.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 11, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing crystal gem +minetest.register_node("caverealms:glow_gem", { + description = "Glow Gem", + tiles = {"caverealms_glow_gem.png"}, + inventory_image = "caverealms_glow_gem.png", + wield_image = "caverealms_glow_gem.png", + is_ground_content = true, + groups = {cracky = 3, oddly_breakable_by_hand = 1, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), + light_source = 11, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 0.75, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + } +}) + +--glowing salt gem +minetest.register_node("caverealms:salt_gem", { + description = "Salt Gem", + tiles = {"caverealms_salt_gem.png"}, + inventory_image = "caverealms_salt_gem.png", + wield_image = "caverealms_salt_gem.png", + is_ground_content = true, + groups = {cracky = 3, oddly_breakable_by_hand = 1, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), + light_source = 11, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 0.75, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + } +}) + +--stone spike +minetest.register_node("caverealms:spike", { + description = "Stone Spike", + tiles = {"caverealms_spike.png"}, + inventory_image = "caverealms_spike.png", + wield_image = "caverealms_spike.png", + is_ground_content = true, + groups = {cracky = 3, oddly_breakable_by_hand = 1, attached_node = 1}, + sounds = default.node_sound_stone_defaults(), + light_source = 3, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 0.75, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + } +}) + + +--upward pointing icicle +minetest.register_node("caverealms:icicle_up", { + description = "Icicle", + tiles = {"caverealms_icicle_up.png"}, + inventory_image = "caverealms_icicle_up.png", + wield_image = "caverealms_icicle_up.png", + is_ground_content = true, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 8, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +--downward pointing icicle +minetest.register_node("caverealms:icicle_down", { + description = "Icicle", + tiles = {"caverealms_icicle_down.png"}, + inventory_image = "caverealms_icicle_down.png", + wield_image = "caverealms_icicle_down.png", + is_ground_content = true, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 8, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +--cave mossy cobble - bluish? +minetest.register_node("caverealms:stone_with_moss", { + description = "Cave Stone with Moss", + tiles = {"default_cobble.png^caverealms_moss.png", "default_cobble.png", "default_cobble.png^caverealms_moss_side.png"}, + is_ground_content = true, + groups = {crumbly=1, cracky=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +--cave lichen-covered cobble - purple-ish +minetest.register_node("caverealms:stone_with_lichen", { + description = "Cave Stone with Lichen", + tiles = {"default_cobble.png^caverealms_lichen.png", "default_cobble.png", "default_cobble.png^caverealms_lichen_side.png"}, + is_ground_content = true, + groups = {crumbly=1, cracky=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +--cave algae-covered cobble - yellow-ish +minetest.register_node("caverealms:stone_with_algae", { + description = "Cave Stone with Algae", + tiles = {"default_cobble.png^caverealms_algae.png", "default_cobble.png", "default_cobble.png^caverealms_algae_side.png"}, + is_ground_content = true, + groups = {crumbly=1, cracky=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +--tiny-salt-crystal-covered cobble - pink-ish +minetest.register_node("caverealms:stone_with_salt", { + description = "Salt Crystal", + tiles = {"caverealms_salty2.png"}, + light_source = 9, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +--Hot Cobble - cobble with lava instead of mortar XD +minetest.register_node("caverealms:hot_cobble", { + description = "Hot Cobble", + tiles = {"caverealms_hot_cobble.png"}, + is_ground_content = true, + groups = {cracky=1, hot=1, unbreakable = 1, stone = 1}, + damage_per_second = 1, + light_source = 3, + paramtype = "light", + sounds = default.node_sound_stone_defaults(), +}) + +--Glow Obsidian +minetest.register_node("caverealms:glow_obsidian", { + description = "Glowing Obsidian", + tiles = {"caverealms_glow_obsidian.png"}, + is_ground_content = true, + groups = {cracky=1, level=2}, + light_source = 7, + paramtype = "light", + sounds = default.node_sound_stone_defaults(), +}) + +--Glow Obsidian 2 - has traces of lava +minetest.register_node("caverealms:glow_obsidian_2", { + description = "Hot Glowing Obsidian", + tiles = {"caverealms_glow_obsidian2.png"}, + is_ground_content = true, + groups = {cracky=1, hot=1, level=2}, + light_source = 9, + paramtype = "light", + sounds = default.node_sound_stone_defaults(), +}) + +--Glow Obsidian Bricks +minetest.register_node("caverealms:glow_obsidian_brick", { + description = "Glow Obsidian Brick", + tiles = {"caverealms_glow_obsidian_brick.png"}, + light_source = 7, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("caverealms:glow_obsidian_brick_2", { + description = "Glow Obsidian Brick", + tiles = {"caverealms_glow_obsidian_brick_2.png"}, + light_source = 9, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +--Glow Obsidian Stairs/Slabs +stairs.register_stair_and_slab( + "glow_obsidian_brick", + "caverealms:glow_obsidian_brick", + {cracky = 1, level = 2}, + {"caverealms_glow_obsidian_brick.png"}, + "Glow Obsidian Brick Stair", + "Glow Obsidian Brick Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab( + "glow_obsidian_brick_2", + "caverealms:glow_obsidian_brick_2", + {cracky = 1, level = 2}, + {"caverealms_glow_obsidian_brick_2.png"}, + "Glow Obsidian Brick Stair", + "Glow Obsidian Brick Slab", + default.node_sound_stone_defaults()) + +--Glow Obsidian Glass +minetest.register_node("caverealms:glow_obsidian_glass", { + description = "Glow Obsidian Glass", + drawtype = "glasslike_framed_optional", + tiles = {"caverealms_glow_obsidian_glass.png", "default_obsidian_glass_detail.png"}, + paramtype = "light", + light_source = 13, + sunlight_propagates = true, + groups = {cracky = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +--Coal Dust +minetest.register_node("caverealms:coal_dust", { + description = "Coal Dust", + tiles = {"caverealms_coal_dust.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +--glow worms +minetest.register_node("caverealms:glow_worm", { + description = "Blue Glow Worms", + tiles = {"caverealms_glow_worm.png"}, + inventory_image = "caverealms_glow_worm.png", + wield_image = "caverealms_glow_worm.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand=3}, + light_source = 9, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-1/6, -1/2, -1/6, 1/6, 1/2, 1/6}, + }, +}) + +minetest.register_node("caverealms:glow_worm_green", { + description = "Green Glow Worms", + tiles = {"caverealms_glow_worm_green.png"}, + inventory_image = "caverealms_glow_worm_green.png", + wield_image = "caverealms_glow_worm_green.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand=3}, + light_source = 9, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-1/6, -1/2, -1/6, 1/6, 1/2, 1/6}, + }, +}) + +minetest.register_node("caverealms:fire_vine", { + description = "Fire Vine", + tiles = {"caverealms_fire_vine.png"}, + inventory_image = "caverealms_fire_vine.png", + wield_image = "caverealms_fire_vine.png", + is_ground_content = true, + damage_per_second = 1, + groups = {oddly_breakable_by_hand=3}, + light_source = 9, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-1/6, -1/2, -1/6, 1/6, 1/2, 1/6}, + }, +}) + + +--define special flame so that it does not expire +minetest.register_node("caverealms:constant_flame", { + description = "Fire", + drawtype = "plantlike", + tiles = {{ + name="fire_basic_flame_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}, + }}, + inventory_image = "fire_basic_flame.png", + light_source = 14, + groups = {igniter=2, dig_immediate=3, hot=3, not_in_creative_inventory=1}, + paramtype = "light", + drop = '', + walkable = false, + buildable_to = true, + floodable = true, + damage_per_second = 4, +}) + +--dungeon master statue (nodebox) +minetest.register_node("caverealms:dm_statue", { + description = "Dungeon Master Statue", + tiles = { + "caverealms_dm_stone.png", + "caverealms_dm_stone.png", + "caverealms_dm_stone.png", + "caverealms_dm_stone.png", + "caverealms_dm_stone.png", + "caverealms_stone_eyes.png" + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2}, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, -0.3125, 0.4375}, -- NodeBox1 + {-0.25, -0.125, -0.1875, 0.25, 0.5, 0.1875}, -- NodeBox2 + {-0.375, 0, -0.125, -0.25, 0.4375, 0.125}, -- NodeBox3 + {0.25, 0.125, -0.4375, 0.375, 0.375, 0.1875}, -- NodeBox4 + {-0.25, -0.5, -0.125, -0.125, -0.125, 0.125}, -- NodeBox5 + {0.125, -0.3125, -0.125, 0.25, 0, 0.125}, -- NodeBox6 + } + }, + selection_box = { + type = "regular" + } +}) + + +-- Compatibility +minetest.register_alias("caverealms:hanging_thin_ice", "caverealms:thin_ice") + +minetest.register_alias("caverealms:spike_2", "caverealms:spike") +minetest.register_alias("caverealms:spike_3", "caverealms:spike") +minetest.register_alias("caverealms:spike_4", "caverealms:spike") +minetest.register_alias("caverealms:spike_5", "caverealms:spike") + +minetest.register_alias("caverealms:salt_gem_2", "caverealms:salt_gem") +minetest.register_alias("caverealms:salt_gem_3", "caverealms:salt_gem") +minetest.register_alias("caverealms:salt_gem_4", "caverealms:salt_gem") +minetest.register_alias("caverealms:salt_gem_5", "caverealms:salt_gem") + +minetest.register_alias("caverealms:glow_gem_2", "caverealms:glow_gem") +minetest.register_alias("caverealms:glow_gem_3", "caverealms:glow_gem") +minetest.register_alias("caverealms:glow_gem_4", "caverealms:glow_gem") +minetest.register_alias("caverealms:glow_gem_5", "caverealms:glow_gem") diff --git a/mods/caverealms/plants.lua b/mods/caverealms/plants.lua new file mode 100644 index 00000000..60c65698 --- /dev/null +++ b/mods/caverealms/plants.lua @@ -0,0 +1,191 @@ +-- Cavrealms plants and trees for lichen, moss and algae biomes + +-- Lichen biome + +-- glowing fungi +minetest.register_node("caverealms:fungus", { + description = "Glowing Fungus", + tiles = {"caverealms_fungi.png"}, + inventory_image = "caverealms_fungi.png", + wield_image = "caverealms_fungi.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand = 3, attached_node = 1, flammable = 1}, + light_source = 5, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +-- mycena mushroom +minetest.register_node("caverealms:mycena", { + description = "Mycena Mushroom", + tiles = {"caverealms_mycena.png"}, + inventory_image = "caverealms_mycena.png", + wield_image = "caverealms_mycena.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand = 3, attached_node = 1, flammable = 1}, + light_source = 6, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +-- giant mushroom +if minetest.get_modpath("ethereal") then + minetest.register_alias("caverealms:mushroom_cap", "ethereal:mushroom") + minetest.register_alias("caverealms:mushroom_stem", "ethereal:mushroom_trunk") +else + -- stem + minetest.register_node("caverealms:mushroom_stem", { + description = "Giant Mushroom Stem", + tiles = {"caverealms_mushroom_stem.png"}, + is_ground_content = true, + groups = {choppy=2, oddly_breakable_by_hand=1}, + }) + + -- cap + minetest.register_node("caverealms:mushroom_cap", { + description = "Giant Mushroom Cap", + tiles = {"caverealms_mushroom_cap.png"}, + is_ground_content = true, + groups = {choppy=2, oddly_breakable_by_hand=1,}, + drop = { + max_items = 1, + items = { + {items = {"caverealms:mushroom_sapling"}, rarity = 20}, + {items = {"caverealms:mushroom_cap"}} + } + }, + }) + + -- sapling + minetest.register_node("caverealms:mushroom_sapling", { + description = "Mushroom Tree Sapling", + drawtype = "plantlike", + tiles = {"caverealms_mushroom_sapling.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + }) +end + +-- gills +minetest.register_node("caverealms:mushroom_gills", { + description = "Giant Mushroom Gills", + tiles = {"caverealms_mushroom_gills.png"}, + is_ground_content = true, + light_source = 10, + walkable = false, + groups = {choppy=2, oddly_breakable_by_hand=1}, + drawtype = "plantlike", + paramtype = "light", +}) + + +-- Saplings + +-- grow trees +local add_tree = function (pos, ofx, ofy, ofz, schem) + if not schem then + print ("Schematic not found") + return + end + minetest.swap_node(pos, {name = "air"}) + minetest.place_schematic( + {x = pos.x - ofx, y = pos.y - ofy, z = pos.z - ofz}, + schem, 0, nil, false) +end + +local path = minetest.get_modpath("caverealms").."/schematics/" + +-- giant mushrooms +function grow_caverealms_mushroom(pos) + add_tree(pos, 5, 0, 5, path .. "shroom.mts") +end + +-- height check +local function enough_height(pos, height) + local nod = minetest.line_of_sight( + {x = pos.x, y = pos.y + 1, z = pos.z}, + {x = pos.x, y = pos.y + height, z = pos.z}) + if not nod then + return false + else + return true + end +end + +minetest.register_abm({ + label = "Caverealms grow sapling", + nodenames = {"ethereal:mushroom_sapling", "caverealms:mushroom_sapling"}, + interval = 10, + chance = 50, + catch_up = false, + action = function(pos, node) + local light_level = minetest.get_node_light(pos) + -- check light level + if not light_level or light_level > 10 then + return + end + -- get node under sapling + local under = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name + -- check if registered + if not minetest.registered_nodes[node.name] then + return + end + -- ethereal sapling on lichen stone + if node.name == "ethereal:mushroom_sapling" + and under == "caverealms:stone_with_lichen" + and enough_height(pos, 10) then + grow_caverealms_mushroom(pos) + -- caverealms sapling on lichen stone + elseif node.name == "caverealms:mushroom_sapling" + and under == "caverealms:stone_with_lichen" + and enough_height(pos, 10) then + grow_caverealms_mushroom(pos) + end + end, +}) + + +-- spread moss/lichen/algae to nearby cobblestone +minetest.register_abm({ + label = "Caverealms stone spread", + nodenames = { + "caverealms:stone_with_moss", + "caverealms:stone_with_lichen", + "caverealms:stone_with_algae", + }, + neighbors = {"air"}, + interval = 16, + chance = 50, + catch_up = false, + action = function(pos, node) + local num = minetest.find_nodes_in_area_under_air( + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, + "default:cobble") + if #num > 0 then + minetest.set_node(num[math.random(#num)], {name = node.name}) + end + end, +}) diff --git a/mods/caverealms/schematics/amethyst_stalactite.mts b/mods/caverealms/schematics/amethyst_stalactite.mts new file mode 100644 index 00000000..06821e2a Binary files /dev/null and b/mods/caverealms/schematics/amethyst_stalactite.mts differ diff --git a/mods/caverealms/schematics/amethyst_stalagmite.mts b/mods/caverealms/schematics/amethyst_stalagmite.mts new file mode 100644 index 00000000..48918d84 Binary files /dev/null and b/mods/caverealms/schematics/amethyst_stalagmite.mts differ diff --git a/mods/caverealms/schematics/emerald_stalactite.mts b/mods/caverealms/schematics/emerald_stalactite.mts new file mode 100644 index 00000000..c56f19b2 Binary files /dev/null and b/mods/caverealms/schematics/emerald_stalactite.mts differ diff --git a/mods/caverealms/schematics/emerald_stalagmite.mts b/mods/caverealms/schematics/emerald_stalagmite.mts new file mode 100644 index 00000000..252923cd Binary files /dev/null and b/mods/caverealms/schematics/emerald_stalagmite.mts differ diff --git a/mods/caverealms/schematics/ruby_stalactite.mts b/mods/caverealms/schematics/ruby_stalactite.mts new file mode 100644 index 00000000..7c8d259f Binary files /dev/null and b/mods/caverealms/schematics/ruby_stalactite.mts differ diff --git a/mods/caverealms/schematics/ruby_stalagmite.mts b/mods/caverealms/schematics/ruby_stalagmite.mts new file mode 100644 index 00000000..79732d7f Binary files /dev/null and b/mods/caverealms/schematics/ruby_stalagmite.mts differ diff --git a/mods/caverealms/schematics/sapphire_stalactite.mts b/mods/caverealms/schematics/sapphire_stalactite.mts new file mode 100644 index 00000000..cc45452b Binary files /dev/null and b/mods/caverealms/schematics/sapphire_stalactite.mts differ diff --git a/mods/caverealms/schematics/sapphire_stalagmite.mts b/mods/caverealms/schematics/sapphire_stalagmite.mts new file mode 100644 index 00000000..a15fc5bb Binary files /dev/null and b/mods/caverealms/schematics/sapphire_stalagmite.mts differ diff --git a/mods/caverealms/schematics/shroom.mts b/mods/caverealms/schematics/shroom.mts new file mode 100644 index 00000000..07e49668 Binary files /dev/null and b/mods/caverealms/schematics/shroom.mts differ diff --git a/mods/caverealms/textures/Thumbs.db b/mods/caverealms/textures/Thumbs.db new file mode 100644 index 00000000..277f8564 Binary files /dev/null and b/mods/caverealms/textures/Thumbs.db differ diff --git a/mods/caverealms/textures/caverealms_algae.png b/mods/caverealms/textures/caverealms_algae.png new file mode 100644 index 00000000..1331bb03 Binary files /dev/null and b/mods/caverealms/textures/caverealms_algae.png differ diff --git a/mods/caverealms/textures/caverealms_algae_side.png b/mods/caverealms/textures/caverealms_algae_side.png new file mode 100644 index 00000000..b9bd4ed0 Binary files /dev/null and b/mods/caverealms/textures/caverealms_algae_side.png differ diff --git a/mods/caverealms/textures/caverealms_angler_rod.png b/mods/caverealms/textures/caverealms_angler_rod.png new file mode 100644 index 00000000..799abec4 Binary files /dev/null and b/mods/caverealms/textures/caverealms_angler_rod.png differ diff --git a/mods/caverealms/textures/caverealms_angler_rod_baited.png b/mods/caverealms/textures/caverealms_angler_rod_baited.png new file mode 100644 index 00000000..98c9f3ba Binary files /dev/null and b/mods/caverealms/textures/caverealms_angler_rod_baited.png differ diff --git a/mods/caverealms/textures/caverealms_angler_rod_weild.png b/mods/caverealms/textures/caverealms_angler_rod_weild.png new file mode 100644 index 00000000..160a5fff Binary files /dev/null and b/mods/caverealms/textures/caverealms_angler_rod_weild.png differ diff --git a/mods/caverealms/textures/caverealms_coal_dust.png b/mods/caverealms/textures/caverealms_coal_dust.png new file mode 100644 index 00000000..be6cbbbb Binary files /dev/null and b/mods/caverealms/textures/caverealms_coal_dust.png differ diff --git a/mods/caverealms/textures/caverealms_dm_stone.png b/mods/caverealms/textures/caverealms_dm_stone.png new file mode 100644 index 00000000..73e92664 Binary files /dev/null and b/mods/caverealms/textures/caverealms_dm_stone.png differ diff --git a/mods/caverealms/textures/caverealms_fire_vine.png b/mods/caverealms/textures/caverealms_fire_vine.png new file mode 100644 index 00000000..6f2c2a34 Binary files /dev/null and b/mods/caverealms/textures/caverealms_fire_vine.png differ diff --git a/mods/caverealms/textures/caverealms_fungi.png b/mods/caverealms/textures/caverealms_fungi.png new file mode 100644 index 00000000..fde8cbfd Binary files /dev/null and b/mods/caverealms/textures/caverealms_fungi.png differ diff --git a/mods/caverealms/textures/caverealms_glow_amethyst.png b/mods/caverealms/textures/caverealms_glow_amethyst.png new file mode 100644 index 00000000..7daa61bb Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_amethyst.png differ diff --git a/mods/caverealms/textures/caverealms_glow_amethyst_ore.png b/mods/caverealms/textures/caverealms_glow_amethyst_ore.png new file mode 100644 index 00000000..403d907b Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_amethyst_ore.png differ diff --git a/mods/caverealms/textures/caverealms_glow_bait.png b/mods/caverealms/textures/caverealms_glow_bait.png new file mode 100644 index 00000000..56a084b5 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_bait.png differ diff --git a/mods/caverealms/textures/caverealms_glow_crystal.png b/mods/caverealms/textures/caverealms_glow_crystal.png new file mode 100644 index 00000000..b9be3951 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_crystal.png differ diff --git a/mods/caverealms/textures/caverealms_glow_emerald.png b/mods/caverealms/textures/caverealms_glow_emerald.png new file mode 100644 index 00000000..025a48b0 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_emerald.png differ diff --git a/mods/caverealms/textures/caverealms_glow_emerald_ore.png b/mods/caverealms/textures/caverealms_glow_emerald_ore.png new file mode 100644 index 00000000..9f601aa4 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_emerald_ore.png differ diff --git a/mods/caverealms/textures/caverealms_glow_gem.png b/mods/caverealms/textures/caverealms_glow_gem.png new file mode 100644 index 00000000..9bf3426a Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_gem.png differ diff --git a/mods/caverealms/textures/caverealms_glow_mese.png b/mods/caverealms/textures/caverealms_glow_mese.png new file mode 100644 index 00000000..ed433fed Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_mese.png differ diff --git a/mods/caverealms/textures/caverealms_glow_obsidian.png b/mods/caverealms/textures/caverealms_glow_obsidian.png new file mode 100644 index 00000000..a1577382 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_obsidian.png differ diff --git a/mods/caverealms/textures/caverealms_glow_obsidian2.png b/mods/caverealms/textures/caverealms_glow_obsidian2.png new file mode 100644 index 00000000..7d1dcf38 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_obsidian2.png differ diff --git a/mods/caverealms/textures/caverealms_glow_obsidian_brick.png b/mods/caverealms/textures/caverealms_glow_obsidian_brick.png new file mode 100644 index 00000000..a5c6db82 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_obsidian_brick.png differ diff --git a/mods/caverealms/textures/caverealms_glow_obsidian_brick_2.png b/mods/caverealms/textures/caverealms_glow_obsidian_brick_2.png new file mode 100644 index 00000000..da2b2e33 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_obsidian_brick_2.png differ diff --git a/mods/caverealms/textures/caverealms_glow_obsidian_glass.png b/mods/caverealms/textures/caverealms_glow_obsidian_glass.png new file mode 100644 index 00000000..afd0fa7e Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_obsidian_glass.png differ diff --git a/mods/caverealms/textures/caverealms_glow_ore.png b/mods/caverealms/textures/caverealms_glow_ore.png new file mode 100644 index 00000000..19179a9c Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_ore.png differ diff --git a/mods/caverealms/textures/caverealms_glow_ruby.png b/mods/caverealms/textures/caverealms_glow_ruby.png new file mode 100644 index 00000000..59fd46b6 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_ruby.png differ diff --git a/mods/caverealms/textures/caverealms_glow_ruby_ore.png b/mods/caverealms/textures/caverealms_glow_ruby_ore.png new file mode 100644 index 00000000..31ecb63b Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_ruby_ore.png differ diff --git a/mods/caverealms/textures/caverealms_glow_worm.png b/mods/caverealms/textures/caverealms_glow_worm.png new file mode 100644 index 00000000..e324fbd6 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_worm.png differ diff --git a/mods/caverealms/textures/caverealms_glow_worm_green.png b/mods/caverealms/textures/caverealms_glow_worm_green.png new file mode 100644 index 00000000..686c2779 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_worm_green.png differ diff --git a/mods/caverealms/textures/caverealms_hot_cobble.png b/mods/caverealms/textures/caverealms_hot_cobble.png new file mode 100644 index 00000000..2e873e84 Binary files /dev/null and b/mods/caverealms/textures/caverealms_hot_cobble.png differ diff --git a/mods/caverealms/textures/caverealms_icicle_down.png b/mods/caverealms/textures/caverealms_icicle_down.png new file mode 100644 index 00000000..adcc340b Binary files /dev/null and b/mods/caverealms/textures/caverealms_icicle_down.png differ diff --git a/mods/caverealms/textures/caverealms_icicle_up.png b/mods/caverealms/textures/caverealms_icicle_up.png new file mode 100644 index 00000000..fcd5e2a2 Binary files /dev/null and b/mods/caverealms/textures/caverealms_icicle_up.png differ diff --git a/mods/caverealms/textures/caverealms_lichen.png b/mods/caverealms/textures/caverealms_lichen.png new file mode 100644 index 00000000..f38fe767 Binary files /dev/null and b/mods/caverealms/textures/caverealms_lichen.png differ diff --git a/mods/caverealms/textures/caverealms_lichen_side.png b/mods/caverealms/textures/caverealms_lichen_side.png new file mode 100644 index 00000000..b036dc3f Binary files /dev/null and b/mods/caverealms/textures/caverealms_lichen_side.png differ diff --git a/mods/caverealms/textures/caverealms_moss.png b/mods/caverealms/textures/caverealms_moss.png new file mode 100644 index 00000000..fd23ec37 Binary files /dev/null and b/mods/caverealms/textures/caverealms_moss.png differ diff --git a/mods/caverealms/textures/caverealms_moss_side.png b/mods/caverealms/textures/caverealms_moss_side.png new file mode 100644 index 00000000..a16d64ab Binary files /dev/null and b/mods/caverealms/textures/caverealms_moss_side.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_cap.png b/mods/caverealms/textures/caverealms_mushroom_cap.png new file mode 100644 index 00000000..e5a1a35a Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_cap.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_gills.png b/mods/caverealms/textures/caverealms_mushroom_gills.png new file mode 100644 index 00000000..596de9ec Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_gills.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_sapling.png b/mods/caverealms/textures/caverealms_mushroom_sapling.png new file mode 100644 index 00000000..262c6900 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_sapling.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_stem.png b/mods/caverealms/textures/caverealms_mushroom_stem.png new file mode 100644 index 00000000..d329ef12 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_stem.png differ diff --git a/mods/caverealms/textures/caverealms_mycena.png b/mods/caverealms/textures/caverealms_mycena.png new file mode 100644 index 00000000..50ea65ba Binary files /dev/null and b/mods/caverealms/textures/caverealms_mycena.png differ diff --git a/mods/caverealms/textures/caverealms_salt_crystal.png b/mods/caverealms/textures/caverealms_salt_crystal.png new file mode 100644 index 00000000..dde96fc2 Binary files /dev/null and b/mods/caverealms/textures/caverealms_salt_crystal.png differ diff --git a/mods/caverealms/textures/caverealms_salt_gem.png b/mods/caverealms/textures/caverealms_salt_gem.png new file mode 100644 index 00000000..0419e2ef Binary files /dev/null and b/mods/caverealms/textures/caverealms_salt_gem.png differ diff --git a/mods/caverealms/textures/caverealms_salty2.png b/mods/caverealms/textures/caverealms_salty2.png new file mode 100644 index 00000000..7f8b5219 Binary files /dev/null and b/mods/caverealms/textures/caverealms_salty2.png differ diff --git a/mods/caverealms/textures/caverealms_spike.png b/mods/caverealms/textures/caverealms_spike.png new file mode 100644 index 00000000..253c9e6e Binary files /dev/null and b/mods/caverealms/textures/caverealms_spike.png differ diff --git a/mods/caverealms/textures/caverealms_stone_eyes.png b/mods/caverealms/textures/caverealms_stone_eyes.png new file mode 100644 index 00000000..288db067 Binary files /dev/null and b/mods/caverealms/textures/caverealms_stone_eyes.png differ diff --git a/mods/caverealms/textures/caverealms_thin_ice.png b/mods/caverealms/textures/caverealms_thin_ice.png new file mode 100644 index 00000000..b16036d9 Binary files /dev/null and b/mods/caverealms/textures/caverealms_thin_ice.png differ diff --git a/mods/caverealms/textures/fire_basic_flame.png b/mods/caverealms/textures/fire_basic_flame.png new file mode 100644 index 00000000..7a126e32 Binary files /dev/null and b/mods/caverealms/textures/fire_basic_flame.png differ diff --git a/mods/caverealms/textures/fire_basic_flame_animated.png b/mods/caverealms/textures/fire_basic_flame_animated.png new file mode 100644 index 00000000..3b312e53 Binary files /dev/null and b/mods/caverealms/textures/fire_basic_flame_animated.png differ diff --git a/mods/colorful_beds/bounce_mech.lua b/mods/colorful_beds/bounce_mech.lua new file mode 100644 index 00000000..a29c7aab --- /dev/null +++ b/mods/colorful_beds/bounce_mech.lua @@ -0,0 +1,420 @@ +-- colorful_beds/bounce_mech.lua + +-- Modifies Beds To Be Bouncy +-- If You Land On The Bottom Portion You Add To The Height by 5% +-- While Landing Near The Top Portion Reduces Height By 5% +-- For Safety There Is 100% Damage Reduction When Falling Onto A Bed. + +-- Original Beds +minetest.override_item("beds:fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("beds:fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("beds:bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("beds:bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Black Beds +minetest.override_item("colorful_beds:black_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:black_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:black_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:black_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Black Beds +minetest.override_item("colorful_beds:black_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:black_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:black_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:black_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Blue Beds +minetest.override_item("colorful_beds:blue_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:blue_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:blue_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:blue_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Brown Beds +minetest.override_item("colorful_beds:brown_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:brown_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:brown_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:brown_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Cyan Beds +minetest.override_item("colorful_beds:cyan_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:cyan_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:cyan_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:cyan_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Dark Green Beds +minetest.override_item("colorful_beds:dark_green_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:dark_green_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:dark_green_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:dark_green_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Dark Grey Beds +minetest.override_item("colorful_beds:dark_grey_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:dark_grey_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:dark_grey_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:dark_grey_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Green Beds +minetest.override_item("colorful_beds:green_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:green_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:green_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:green_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Grey Beds +minetest.override_item("colorful_beds:grey_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:grey_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:grey_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:grey_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Light Blue Beds +minetest.override_item("colorful_beds:light_blue_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:light_blue_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:light_blue_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:light_blue_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Magenta Beds +minetest.override_item("colorful_beds:magenta_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:magenta_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:magenta_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:magenta_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Orange Beds +minetest.override_item("colorful_beds:orange_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:orange_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:orange_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:orange_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Pink Beds +minetest.override_item("colorful_beds:pink_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:pink_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:pink_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:pink_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Red Beds +minetest.override_item("colorful_beds:red_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:red_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:red_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:red_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Violet Beds +minetest.override_item("colorful_beds:violet_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:violet_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:violet_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:violet_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- White Beds +minetest.override_item("colorful_beds:white_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:white_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:white_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:white_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +-- Yellow Beds +minetest.override_item("colorful_beds:yellow_fancy_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:yellow_fancy_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) + +minetest.override_item("colorful_beds:yellow_bed_bottom", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 105, fall_damage_add_percent = -100 + } +}) +minetest.override_item("colorful_beds:yellow_bed_top", { + groups = { + choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1, bouncy = 95, fall_damage_add_percent = -100 + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_black.lua b/mods/colorful_beds/colorful_beds_black.lua new file mode 100644 index 00000000..9e6b7b83 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_black.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_black.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:black_fancy_bed", { + description = ("Black Fancy Bed"), + inventory_image = "black_beds_fancy.png", + wield_image = "black_beds_fancy.png", + tiles = { + bottom = { + "black_beds_bed_top1.png", + "beds_bed_under.png", + "black_beds_bed_side1.png", + "black_beds_bed_side1.png^[transformFX", + "black_beds_bed_foot.png", + "black_beds_bed_foot.png", + }, + top = { + "black_beds_bed_top2.png", + "beds_bed_under.png", + "black_beds_bed_side2.png", + "black_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:black", "wool:black", "wool:black"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:black_bed", { + description = ("Black Simple Bed"), + inventory_image = "black_beds_bed.png", + wield_image = "black_beds_bed.png", + tiles = { + bottom = { + "black_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "black_beds_bed_side_bottom_r.png", + "black_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "black_beds_bed_side_bottom.png" + }, + top = { + "black_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "black_beds_bed_side_top_r.png", + "black_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:black", "wool:black", "wool:black"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_blue.lua b/mods/colorful_beds/colorful_beds_blue.lua new file mode 100644 index 00000000..7cd4155b --- /dev/null +++ b/mods/colorful_beds/colorful_beds_blue.lua @@ -0,0 +1,93 @@ +-- colorful_beds/colorful_beds_blue.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:blue_fancy_bed", { + description = ("Blue Fancy Bed"), + inventory_image = "blue_beds_fancy.png", + wield_image = "blue_beds_fancy.png", + tiles = { + bottom = { + "blue_beds_bed_top1.png", + "beds_bed_under.png", + "blue_beds_bed_side1.png", + "blue_beds_bed_side1.png^[transformFX", + "blue_beds_bed_foot.png", + "blue_beds_bed_foot.png", + }, + top = { + "blue_beds_bed_top2.png", + "beds_bed_under.png", + "blue_beds_bed_side2.png", + "blue_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:blue", "wool:blue", "wool:blue"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:blue_bed", { + description = ("Blue Simple Bed"), + inventory_image = "blue_beds_bed.png", + wield_image = "blue_beds_bed.png", + tiles = { + bottom = { + "blue_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "blue_beds_bed_side_bottom_r.png", + "blue_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "blue_beds_bed_side_bottom.png" + }, + top = { + "blue_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "blue_beds_bed_side_top_r.png", + "blue_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:blue", "wool:blue", "wool:blue"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- If The Cropocalypse Mod Is Installed This Adds Light Blue Beds + +if minetest.global_exists("cropocalypse") then + dofile(path .. "/colorful_beds_light_blue.lua") +end \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_brown.lua b/mods/colorful_beds/colorful_beds_brown.lua new file mode 100644 index 00000000..edccc771 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_brown.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_brown.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:brown_fancy_bed", { + description = ("Brown Fancy Bed"), + inventory_image = "brown_beds_fancy.png", + wield_image = "brown_beds_fancy.png", + tiles = { + bottom = { + "brown_beds_bed_top1.png", + "beds_bed_under.png", + "brown_beds_bed_side1.png", + "brown_beds_bed_side1.png^[transformFX", + "brown_beds_bed_foot.png", + "brown_beds_bed_foot.png", + }, + top = { + "brown_beds_bed_top2.png", + "beds_bed_under.png", + "brown_beds_bed_side2.png", + "brown_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:brown", "wool:brown", "wool:brown"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:brown_bed", { + description = ("Brown Simple Bed"), + inventory_image = "brown_beds_bed.png", + wield_image = "brown_beds_bed.png", + tiles = { + bottom = { + "brown_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "brown_beds_bed_side_bottom_r.png", + "brown_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "brown_beds_bed_side_bottom.png" + }, + top = { + "brown_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "brown_beds_bed_side_top_r.png", + "brown_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:brown", "wool:brown", "wool:brown"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_cyan.lua b/mods/colorful_beds/colorful_beds_cyan.lua new file mode 100644 index 00000000..d86573c1 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_cyan.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_cyan.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:cyan_fancy_bed", { + description = ("Cyan Fancy Bed"), + inventory_image = "cyan_beds_fancy.png", + wield_image = "cyan_beds_fancy.png", + tiles = { + bottom = { + "cyan_beds_bed_top1.png", + "beds_bed_under.png", + "cyan_beds_bed_side1.png", + "cyan_beds_bed_side1.png^[transformFX", + "cyan_beds_bed_foot.png", + "cyan_beds_bed_foot.png", + }, + top = { + "cyan_beds_bed_top2.png", + "beds_bed_under.png", + "cyan_beds_bed_side2.png", + "cyan_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:cyan", "wool:cyan", "wool:cyan"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:cyan_bed", { + description = ("Cyan Simple Bed"), + inventory_image = "cyan_beds_bed.png", + wield_image = "cyan_beds_bed.png", + tiles = { + bottom = { + "cyan_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "cyan_beds_bed_side_bottom_r.png", + "cyan_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "cyan_beds_bed_side_bottom.png" + }, + top = { + "cyan_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "cyan_beds_bed_side_top_r.png", + "cyan_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:cyan", "wool:cyan", "wool:cyan"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_dark_green.lua b/mods/colorful_beds/colorful_beds_dark_green.lua new file mode 100644 index 00000000..eea34812 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_dark_green.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_dark_green.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:dark_green_fancy_bed", { + description = ("Dark Green Fancy Bed"), + inventory_image = "dark_green_beds_fancy.png", + wield_image = "dark_green_beds_fancy.png", + tiles = { + bottom = { + "dark_green_beds_bed_top1.png", + "beds_bed_under.png", + "dark_green_beds_bed_side1.png", + "dark_green_beds_bed_side1.png^[transformFX", + "dark_green_beds_bed_foot.png", + "dark_green_beds_bed_foot.png", + }, + top = { + "dark_green_beds_bed_top2.png", + "beds_bed_under.png", + "dark_green_beds_bed_side2.png", + "dark_green_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:dark_green", "wool:dark_green", "wool:dark_green"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:dark_green_bed", { + description = ("Dark Green Simple Bed"), + inventory_image = "dark_green_beds_bed.png", + wield_image = "dark_green_beds_bed.png", + tiles = { + bottom = { + "dark_green_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "dark_green_beds_bed_side_bottom_r.png", + "dark_green_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "dark_green_beds_bed_side_bottom.png" + }, + top = { + "dark_green_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "dark_green_beds_bed_side_top_r.png", + "dark_green_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:dark_green", "wool:dark_green", "wool:dark_green"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_dark_grey.lua b/mods/colorful_beds/colorful_beds_dark_grey.lua new file mode 100644 index 00000000..4cc8adb7 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_dark_grey.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_dark_grey.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:dark_grey_fancy_bed", { + description = ("Dark Grey Fancy Bed"), + inventory_image = "dark_grey_beds_fancy.png", + wield_image = "dark_grey_beds_fancy.png", + tiles = { + bottom = { + "dark_grey_beds_bed_top1.png", + "beds_bed_under.png", + "dark_grey_beds_bed_side1.png", + "dark_grey_beds_bed_side1.png^[transformFX", + "dark_grey_beds_bed_foot.png", + "dark_grey_beds_bed_foot.png", + }, + top = { + "dark_grey_beds_bed_top2.png", + "beds_bed_under.png", + "dark_grey_beds_bed_side2.png", + "dark_grey_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:dark_grey", "wool:dark_grey", "wool:dark_grey"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:dark_grey_bed", { + description = ("Dark Grey Simple Bed"), + inventory_image = "dark_grey_beds_bed.png", + wield_image = "dark_grey_beds_bed.png", + tiles = { + bottom = { + "dark_grey_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "dark_grey_beds_bed_side_bottom_r.png", + "dark_grey_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "dark_grey_beds_bed_side_bottom.png" + }, + top = { + "dark_grey_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "dark_grey_beds_bed_side_top_r.png", + "dark_grey_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:dark_grey", "wool:dark_grey", "wool:dark_grey"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_green.lua b/mods/colorful_beds/colorful_beds_green.lua new file mode 100644 index 00000000..a55c7155 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_green.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_green.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:green_fancy_bed", { + description = ("Green Fancy Bed"), + inventory_image = "green_beds_fancy.png", + wield_image = "green_beds_fancy.png", + tiles = { + bottom = { + "green_beds_bed_top1.png", + "beds_bed_under.png", + "green_beds_bed_side1.png", + "green_beds_bed_side1.png^[transformFX", + "green_beds_bed_foot.png", + "green_beds_bed_foot.png", + }, + top = { + "green_beds_bed_top2.png", + "beds_bed_under.png", + "green_beds_bed_side2.png", + "green_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:green", "wool:green", "wool:green"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:green_bed", { + description = ("Green Simple Bed"), + inventory_image = "green_beds_bed.png", + wield_image = "green_beds_bed.png", + tiles = { + bottom = { + "green_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "green_beds_bed_side_bottom_r.png", + "green_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "green_beds_bed_side_bottom.png" + }, + top = { + "green_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "green_beds_bed_side_top_r.png", + "green_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:green", "wool:green", "wool:green"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_grey.lua b/mods/colorful_beds/colorful_beds_grey.lua new file mode 100644 index 00000000..01c0fcea --- /dev/null +++ b/mods/colorful_beds/colorful_beds_grey.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_grey.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:grey_fancy_bed", { + description = ("Grey Fancy Bed"), + inventory_image = "grey_beds_fancy.png", + wield_image = "grey_beds_fancy.png", + tiles = { + bottom = { + "grey_beds_bed_top1.png", + "beds_bed_under.png", + "grey_beds_bed_side1.png", + "grey_beds_bed_side1.png^[transformFX", + "grey_beds_bed_foot.png", + "grey_beds_bed_foot.png", + }, + top = { + "grey_beds_bed_top2.png", + "beds_bed_under.png", + "grey_beds_bed_side2.png", + "grey_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:grey", "wool:grey", "wool:grey"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:grey_bed", { + description = ("Grey Simple Bed"), + inventory_image = "grey_beds_bed.png", + wield_image = "grey_beds_bed.png", + tiles = { + bottom = { + "grey_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "grey_beds_bed_side_bottom_r.png", + "grey_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "grey_beds_bed_side_bottom.png" + }, + top = { + "grey_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "grey_beds_bed_side_top_r.png", + "grey_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:grey", "wool:grey", "wool:grey"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_light_blue.lua b/mods/colorful_beds/colorful_beds_light_blue.lua new file mode 100644 index 00000000..339ba2ab --- /dev/null +++ b/mods/colorful_beds/colorful_beds_light_blue.lua @@ -0,0 +1,104 @@ +-- colorful_beds/colorful_beds_light_blue.lua + +-- Adds Light Blue Wool Node + +minetest.register_node("colorful_beds:wool_light_blue", { + description = ("Light Blue Wool"), + tiles = {"cb_wool_light_blue.png"}, + is_ground_content = false, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft({ + type = "shapeless", + output = "colorful_beds:wool_light_blue 1", + recipe = {"cropocalypse:light_blue_dye", "group:wool"} +}) + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:light_blue_fancy_bed", { + description = ("Light Blue Fancy Bed"), + inventory_image = "light_blue_beds_fancy.png", + wield_image = "light_blue_beds_fancy.png", + tiles = { + bottom = { + "light_blue_beds_bed_top1.png", + "beds_bed_under.png", + "light_blue_beds_bed_side1.png", + "light_blue_beds_bed_side1.png^[transformFX", + "light_blue_beds_bed_foot.png", + "light_blue_beds_bed_foot.png", + }, + top = { + "light_blue_beds_bed_top2.png", + "beds_bed_under.png", + "light_blue_beds_bed_side2.png", + "light_blue_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"colorful_beds:wool_light_blue", "colorful_beds:wool_light_blue", "colorful_beds:wool_light_blue"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:light_blue_bed", { + description = ("Light Blue Simple Bed"), + inventory_image = "light_blue_beds_bed.png", + wield_image = "light_blue_beds_bed.png", + tiles = { + bottom = { + "light_blue_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "light_blue_beds_bed_side_bottom_r.png", + "light_blue_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "light_blue_beds_bed_side_bottom.png" + }, + top = { + "light_blue_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "light_blue_beds_bed_side_top_r.png", + "light_blue_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"colorful_beds:wool_light_blue", "colorful_beds:wool_light_blue", "colorful_beds:wool_light_blue"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_magenta.lua b/mods/colorful_beds/colorful_beds_magenta.lua new file mode 100644 index 00000000..4b679905 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_magenta.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_magenta.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:magenta_fancy_bed", { + description = ("Magenta Fancy Bed"), + inventory_image = "magenta_beds_fancy.png", + wield_image = "magenta_beds_fancy.png", + tiles = { + bottom = { + "magenta_beds_bed_top1.png", + "beds_bed_under.png", + "magenta_beds_bed_side1.png", + "magenta_beds_bed_side1.png^[transformFX", + "magenta_beds_bed_foot.png", + "magenta_beds_bed_foot.png", + }, + top = { + "magenta_beds_bed_top2.png", + "beds_bed_under.png", + "magenta_beds_bed_side2.png", + "magenta_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:magenta", "wool:magenta", "wool:magenta"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:magenta_bed", { + description = ("Magenta Simple Bed"), + inventory_image = "magenta_beds_bed.png", + wield_image = "magenta_beds_bed.png", + tiles = { + bottom = { + "magenta_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "magenta_beds_bed_side_bottom_r.png", + "magenta_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "magenta_beds_bed_side_bottom.png" + }, + top = { + "magenta_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "magenta_beds_bed_side_top_r.png", + "magenta_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:magenta", "wool:magenta", "wool:magenta"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_orange.lua b/mods/colorful_beds/colorful_beds_orange.lua new file mode 100644 index 00000000..1f5abbac --- /dev/null +++ b/mods/colorful_beds/colorful_beds_orange.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_orange.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:orange_fancy_bed", { + description = ("Orange Fancy Bed"), + inventory_image = "orange_beds_fancy.png", + wield_image = "orange_beds_fancy.png", + tiles = { + bottom = { + "orange_beds_bed_top1.png", + "beds_bed_under.png", + "orange_beds_bed_side1.png", + "orange_beds_bed_side1.png^[transformFX", + "orange_beds_bed_foot.png", + "orange_beds_bed_foot.png", + }, + top = { + "orange_beds_bed_top2.png", + "beds_bed_under.png", + "orange_beds_bed_side2.png", + "orange_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:orange", "wool:orange", "wool:orange"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:orange_bed", { + description = ("Orange Simple Bed"), + inventory_image = "orange_beds_bed.png", + wield_image = "orange_beds_bed.png", + tiles = { + bottom = { + "orange_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "orange_beds_bed_side_bottom_r.png", + "orange_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "orange_beds_bed_side_bottom.png" + }, + top = { + "orange_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "orange_beds_bed_side_top_r.png", + "orange_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:orange", "wool:orange", "wool:orange"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_pink.lua b/mods/colorful_beds/colorful_beds_pink.lua new file mode 100644 index 00000000..ce3838b3 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_pink.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_pink.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:pink_fancy_bed", { + description = ("Pink Fancy Bed"), + inventory_image = "pink_beds_fancy.png", + wield_image = "pink_beds_fancy.png", + tiles = { + bottom = { + "pink_beds_bed_top1.png", + "beds_bed_under.png", + "pink_beds_bed_side1.png", + "pink_beds_bed_side1.png^[transformFX", + "pink_beds_bed_foot.png", + "pink_beds_bed_foot.png", + }, + top = { + "pink_beds_bed_top2.png", + "beds_bed_under.png", + "pink_beds_bed_side2.png", + "pink_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:pink", "wool:pink", "wool:pink"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:pink_bed", { + description = ("Pink Simple Bed"), + inventory_image = "pink_beds_bed.png", + wield_image = "pink_beds_bed.png", + tiles = { + bottom = { + "pink_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "pink_beds_bed_side_bottom_r.png", + "pink_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "pink_beds_bed_side_bottom.png" + }, + top = { + "pink_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "pink_beds_bed_side_top_r.png", + "pink_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:pink", "wool:pink", "wool:pink"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_red.lua b/mods/colorful_beds/colorful_beds_red.lua new file mode 100644 index 00000000..cd319d19 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_red.lua @@ -0,0 +1,105 @@ +-- colorful_beds/colorful_beds_red.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:red_fancy_bed", { + description = ("Red Fancy Bed"), + inventory_image = "red_beds_fancy.png", + wield_image = "red_beds_fancy.png", + tiles = { + bottom = { + "red_beds_bed_top1.png", + "beds_bed_under.png", + "red_beds_bed_side1.png", + "red_beds_bed_side1.png^[transformFX", + "red_beds_bed_foot.png", + "red_beds_bed_foot.png", + }, + top = { + "red_beds_bed_top2.png", + "beds_bed_under.png", + "red_beds_bed_side2.png", + "red_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:red", "wool:red", "wool:red"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:red_bed", { + description = ("Red Simple Bed"), + inventory_image = "red_beds_bed.png", + wield_image = "red_beds_bed.png", + tiles = { + bottom = { + "red_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "red_beds_bed_side_bottom_r.png", + "red_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "red_beds_bed_side_bottom.png" + }, + top = { + "red_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "red_beds_bed_side_top_r.png", + "red_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:red", "wool:red", "wool:red"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Crafting Legacy Beds +minetest.register_craft({ + output = "beds:bed 1", + recipe = { + {"wool:red", "wool:red", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "beds:fancy_bed 1", + recipe = { + {"", "", "group:stick"}, + {"wool:red", "wool:red", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_violet.lua b/mods/colorful_beds/colorful_beds_violet.lua new file mode 100644 index 00000000..9588dcb9 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_violet.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_violet.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:violet_fancy_bed", { + description = ("Violet Fancy Bed"), + inventory_image = "violet_beds_fancy.png", + wield_image = "violet_beds_fancy.png", + tiles = { + bottom = { + "violet_beds_bed_top1.png", + "beds_bed_under.png", + "violet_beds_bed_side1.png", + "violet_beds_bed_side1.png^[transformFX", + "violet_beds_bed_foot.png", + "violet_beds_bed_foot.png", + }, + top = { + "violet_beds_bed_top2.png", + "beds_bed_under.png", + "violet_beds_bed_side2.png", + "violet_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:violet", "wool:violet", "wool:violet"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:violet_bed", { + description = ("Violet Simple Bed"), + inventory_image = "violet_beds_bed.png", + wield_image = "violet_beds_bed.png", + tiles = { + bottom = { + "violet_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "violet_beds_bed_side_bottom_r.png", + "violet_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "violet_beds_bed_side_bottom.png" + }, + top = { + "violet_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "violet_beds_bed_side_top_r.png", + "violet_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:violet", "wool:violet", "wool:violet"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_white.lua b/mods/colorful_beds/colorful_beds_white.lua new file mode 100644 index 00000000..8c4eed2f --- /dev/null +++ b/mods/colorful_beds/colorful_beds_white.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_white.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:white_fancy_bed", { + description = ("White Fancy Bed"), + inventory_image = "white_beds_fancy.png", + wield_image = "white_beds_fancy.png", + tiles = { + bottom = { + "white_beds_bed_top1.png", + "beds_bed_under.png", + "white_beds_bed_side1.png", + "white_beds_bed_side1.png^[transformFX", + "white_beds_bed_foot.png", + "white_beds_bed_foot.png", + }, + top = { + "white_beds_bed_top2.png", + "beds_bed_under.png", + "white_beds_bed_side2.png", + "white_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:white_bed", { + description = ("White Simple Bed"), + inventory_image = "white_beds_bed.png", + wield_image = "white_beds_bed.png", + tiles = { + bottom = { + "white_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "white_beds_bed_side_bottom_r.png", + "white_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "white_beds_bed_side_bottom.png" + }, + top = { + "white_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "white_beds_bed_side_top_r.png", + "white_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_beds_yellow.lua b/mods/colorful_beds/colorful_beds_yellow.lua new file mode 100644 index 00000000..df3a31d0 --- /dev/null +++ b/mods/colorful_beds/colorful_beds_yellow.lua @@ -0,0 +1,87 @@ +-- colorful_beds/colorful_beds_yellow.lua + +-- Fancy Beds Section + +beds.register_bed("colorful_beds:yellow_fancy_bed", { + description = ("Yellow Fancy Bed"), + inventory_image = "yellow_beds_fancy.png", + wield_image = "yellow_beds_fancy.png", + tiles = { + bottom = { + "yellow_beds_bed_top1.png", + "beds_bed_under.png", + "yellow_beds_bed_side1.png", + "yellow_beds_bed_side1.png^[transformFX", + "yellow_beds_bed_foot.png", + "yellow_beds_bed_foot.png", + }, + top = { + "yellow_beds_bed_top2.png", + "beds_bed_under.png", + "yellow_beds_bed_side2.png", + "yellow_beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:yellow", "wool:yellow", "wool:yellow"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +-- Simple Beds Section + +beds.register_bed("colorful_beds:yellow_bed", { + description = ("Yellow Simple Bed"), + inventory_image = "yellow_beds_bed.png", + wield_image = "yellow_beds_bed.png", + tiles = { + bottom = { + "yellow_beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "yellow_beds_bed_side_bottom_r.png", + "yellow_beds_bed_side_bottom_r.png^[transformfx", + "blank.png", + "yellow_beds_bed_side_bottom.png" + }, + top = { + "yellow_beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "yellow_beds_bed_side_top_r.png", + "yellow_beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:yellow", "wool:yellow", "wool:yellow"}, + {"group:wood", "group:wood", "group:wood"} + } +}) \ No newline at end of file diff --git a/mods/colorful_beds/colorful_fuel.lua b/mods/colorful_beds/colorful_fuel.lua new file mode 100644 index 00000000..efd25dc1 --- /dev/null +++ b/mods/colorful_beds/colorful_fuel.lua @@ -0,0 +1,197 @@ +-- colorful_beds/colorful_fuel.lua + +-- Fuel Fancy Beds + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:black_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:blue_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:brown_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:cyan_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:dark_green_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:dark_grey_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:green_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:grey_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:light_blue_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:magenta_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:orange_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:pink_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:red_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:violet_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:white_fancy_bed", + burntime = 13 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:yellow_fancy_bed", + burntime = 13 +}) + +-- Fuel Simple Beds + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:black_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:blue_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:brown_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:cyan_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:dark_green_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:dark_grey_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:green_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:grey_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:light_blue_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:magenta_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:orange_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:pink_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:red_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:violet_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:white_bed", + burntime = 12 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "colorful_beds:yellow_bed", + burntime = 12 +}) \ No newline at end of file diff --git a/mods/colorful_beds/init.lua b/mods/colorful_beds/init.lua new file mode 100644 index 00000000..f99ebe1e --- /dev/null +++ b/mods/colorful_beds/init.lua @@ -0,0 +1,32 @@ +-- colorful_beds/init.lua + +-- Loads The LUA Files For The Mod + +local path = minetest.get_modpath("colorful_beds") + +dofile(path .. "/colorful_beds_black.lua") +dofile(path .. "/colorful_beds_blue.lua") +dofile(path .. "/colorful_beds_brown.lua") +dofile(path .. "/colorful_beds_cyan.lua") +dofile(path .. "/colorful_beds_dark_green.lua") +dofile(path .. "/colorful_beds_dark_grey.lua") +dofile(path .. "/colorful_beds_green.lua") +dofile(path .. "/colorful_beds_grey.lua") +dofile(path .. "/colorful_beds_magenta.lua") +dofile(path .. "/colorful_beds_orange.lua") +dofile(path .. "/colorful_beds_pink.lua") +dofile(path .. "/colorful_beds_red.lua") +dofile(path .. "/colorful_beds_violet.lua") +dofile(path .. "/colorful_beds_white.lua") +dofile(path .. "/colorful_beds_yellow.lua") + +-- Adds Some Light Blue Beds And Wool +-- They Are Only Obtainable In Survival If You Have The Cropocalypse Mod +-- To Craft Light Blue Dye +dofile(path .. "/colorful_beds_light_blue.lua") + +-- For Use As Fuel +dofile(path .. "/colorful_fuel.lua") + +-- For That Extra Bounce +dofile(path .. "/bounce_mech.lua") \ No newline at end of file diff --git a/mods/colorful_beds/license.txt b/mods/colorful_beds/license.txt new file mode 100644 index 00000000..6efb9cfe --- /dev/null +++ b/mods/colorful_beds/license.txt @@ -0,0 +1,62 @@ +MIT License + +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 Various Minetest developers and contributors +Copyright (c) 2023 Tarruvi + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the “Softwareâ€), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2018 TumeniNodes +Copyright (c) 2023 Tarruvi + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/colorful_beds/mod.conf b/mods/colorful_beds/mod.conf new file mode 100644 index 00000000..a3276094 --- /dev/null +++ b/mods/colorful_beds/mod.conf @@ -0,0 +1,4 @@ +name = colorful_beds +description = Minetest Game mod: colorful_beds +depends = beds, default, wool +optional_depends = cropocalypse \ No newline at end of file diff --git a/mods/colorful_beds/textures/black_beds_bed.png b/mods/colorful_beds/textures/black_beds_bed.png new file mode 100644 index 00000000..ea39aa4a Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_foot.png b/mods/colorful_beds/textures/black_beds_bed_foot.png new file mode 100644 index 00000000..c3541925 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_side1.png b/mods/colorful_beds/textures/black_beds_bed_side1.png new file mode 100644 index 00000000..c7097fb3 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_side2.png b/mods/colorful_beds/textures/black_beds_bed_side2.png new file mode 100644 index 00000000..fd2a3a99 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_side_bottom.png b/mods/colorful_beds/textures/black_beds_bed_side_bottom.png new file mode 100644 index 00000000..77ef7ec9 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/black_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..ddb6b327 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_side_top_r.png b/mods/colorful_beds/textures/black_beds_bed_side_top_r.png new file mode 100644 index 00000000..db25084b Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_top1.png b/mods/colorful_beds/textures/black_beds_bed_top1.png new file mode 100644 index 00000000..ba6d0859 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_top2.png b/mods/colorful_beds/textures/black_beds_bed_top2.png new file mode 100644 index 00000000..8289480a Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_top_bottom.png b/mods/colorful_beds/textures/black_beds_bed_top_bottom.png new file mode 100644 index 00000000..3b8543f7 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/black_beds_bed_top_top.png b/mods/colorful_beds/textures/black_beds_bed_top_top.png new file mode 100644 index 00000000..23661030 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/black_beds_fancy.png b/mods/colorful_beds/textures/black_beds_fancy.png new file mode 100644 index 00000000..1c4cf570 Binary files /dev/null and b/mods/colorful_beds/textures/black_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed.png b/mods/colorful_beds/textures/blue_beds_bed.png new file mode 100644 index 00000000..d6f64a64 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_foot.png b/mods/colorful_beds/textures/blue_beds_bed_foot.png new file mode 100644 index 00000000..9aabd3a7 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_side1.png b/mods/colorful_beds/textures/blue_beds_bed_side1.png new file mode 100644 index 00000000..e88bc374 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_side2.png b/mods/colorful_beds/textures/blue_beds_bed_side2.png new file mode 100644 index 00000000..6e08e30f Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_side_bottom.png b/mods/colorful_beds/textures/blue_beds_bed_side_bottom.png new file mode 100644 index 00000000..faafeca4 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/blue_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..d5acfaba Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_side_top_r.png b/mods/colorful_beds/textures/blue_beds_bed_side_top_r.png new file mode 100644 index 00000000..a6813991 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_top1.png b/mods/colorful_beds/textures/blue_beds_bed_top1.png new file mode 100644 index 00000000..6059e399 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_top2.png b/mods/colorful_beds/textures/blue_beds_bed_top2.png new file mode 100644 index 00000000..9ab064f8 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_top_bottom.png b/mods/colorful_beds/textures/blue_beds_bed_top_bottom.png new file mode 100644 index 00000000..342bebd1 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/blue_beds_bed_top_top.png b/mods/colorful_beds/textures/blue_beds_bed_top_top.png new file mode 100644 index 00000000..f6300b77 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/blue_beds_fancy.png b/mods/colorful_beds/textures/blue_beds_fancy.png new file mode 100644 index 00000000..28846803 Binary files /dev/null and b/mods/colorful_beds/textures/blue_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed.png b/mods/colorful_beds/textures/brown_beds_bed.png new file mode 100644 index 00000000..f84c5205 Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_foot.png b/mods/colorful_beds/textures/brown_beds_bed_foot.png new file mode 100644 index 00000000..b06eeb70 Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_side1.png b/mods/colorful_beds/textures/brown_beds_bed_side1.png new file mode 100644 index 00000000..03b5e9b7 Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_side2.png b/mods/colorful_beds/textures/brown_beds_bed_side2.png new file mode 100644 index 00000000..8074fc9e Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_side_bottom.png b/mods/colorful_beds/textures/brown_beds_bed_side_bottom.png new file mode 100644 index 00000000..c59840ae Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/brown_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..a583b6da Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_side_top_r.png b/mods/colorful_beds/textures/brown_beds_bed_side_top_r.png new file mode 100644 index 00000000..1ccc1a51 Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_top1.png b/mods/colorful_beds/textures/brown_beds_bed_top1.png new file mode 100644 index 00000000..e54800ef Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_top2.png b/mods/colorful_beds/textures/brown_beds_bed_top2.png new file mode 100644 index 00000000..2b12e0ca Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_top_bottom.png b/mods/colorful_beds/textures/brown_beds_bed_top_bottom.png new file mode 100644 index 00000000..e48d26d6 Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/brown_beds_bed_top_top.png b/mods/colorful_beds/textures/brown_beds_bed_top_top.png new file mode 100644 index 00000000..d56a6611 Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/brown_beds_fancy.png b/mods/colorful_beds/textures/brown_beds_fancy.png new file mode 100644 index 00000000..69cf342c Binary files /dev/null and b/mods/colorful_beds/textures/brown_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/cb_wool_light_blue.png b/mods/colorful_beds/textures/cb_wool_light_blue.png new file mode 100644 index 00000000..e4bcc342 Binary files /dev/null and b/mods/colorful_beds/textures/cb_wool_light_blue.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed.png b/mods/colorful_beds/textures/cyan_beds_bed.png new file mode 100644 index 00000000..924e6338 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_foot.png b/mods/colorful_beds/textures/cyan_beds_bed_foot.png new file mode 100644 index 00000000..9ed8ab64 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_side1.png b/mods/colorful_beds/textures/cyan_beds_bed_side1.png new file mode 100644 index 00000000..8302b0c3 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_side2.png b/mods/colorful_beds/textures/cyan_beds_bed_side2.png new file mode 100644 index 00000000..cdf892f3 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_side_bottom.png b/mods/colorful_beds/textures/cyan_beds_bed_side_bottom.png new file mode 100644 index 00000000..06e07156 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/cyan_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..7bd6132e Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_side_top_r.png b/mods/colorful_beds/textures/cyan_beds_bed_side_top_r.png new file mode 100644 index 00000000..46fb3eed Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_top1.png b/mods/colorful_beds/textures/cyan_beds_bed_top1.png new file mode 100644 index 00000000..cb8cd016 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_top2.png b/mods/colorful_beds/textures/cyan_beds_bed_top2.png new file mode 100644 index 00000000..55a80ab7 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_top_bottom.png b/mods/colorful_beds/textures/cyan_beds_bed_top_bottom.png new file mode 100644 index 00000000..b9804a66 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_bed_top_top.png b/mods/colorful_beds/textures/cyan_beds_bed_top_top.png new file mode 100644 index 00000000..eb481e86 Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/cyan_beds_fancy.png b/mods/colorful_beds/textures/cyan_beds_fancy.png new file mode 100644 index 00000000..ad15769f Binary files /dev/null and b/mods/colorful_beds/textures/cyan_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed.png b/mods/colorful_beds/textures/dark_green_beds_bed.png new file mode 100644 index 00000000..5607729a Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_foot.png b/mods/colorful_beds/textures/dark_green_beds_bed_foot.png new file mode 100644 index 00000000..7df9283d Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_side1.png b/mods/colorful_beds/textures/dark_green_beds_bed_side1.png new file mode 100644 index 00000000..5b4255a2 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_side2.png b/mods/colorful_beds/textures/dark_green_beds_bed_side2.png new file mode 100644 index 00000000..32569dfb Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_side_bottom.png b/mods/colorful_beds/textures/dark_green_beds_bed_side_bottom.png new file mode 100644 index 00000000..cd10051e Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/dark_green_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..201afd99 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_side_top_r.png b/mods/colorful_beds/textures/dark_green_beds_bed_side_top_r.png new file mode 100644 index 00000000..b1c17b79 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_top1.png b/mods/colorful_beds/textures/dark_green_beds_bed_top1.png new file mode 100644 index 00000000..3414cfc0 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_top2.png b/mods/colorful_beds/textures/dark_green_beds_bed_top2.png new file mode 100644 index 00000000..3e17cb40 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_top_bottom.png b/mods/colorful_beds/textures/dark_green_beds_bed_top_bottom.png new file mode 100644 index 00000000..2dedf480 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_bed_top_top.png b/mods/colorful_beds/textures/dark_green_beds_bed_top_top.png new file mode 100644 index 00000000..b007bbf0 Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/dark_green_beds_fancy.png b/mods/colorful_beds/textures/dark_green_beds_fancy.png new file mode 100644 index 00000000..2e4f9a3e Binary files /dev/null and b/mods/colorful_beds/textures/dark_green_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed.png b/mods/colorful_beds/textures/dark_grey_beds_bed.png new file mode 100644 index 00000000..67735119 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_foot.png b/mods/colorful_beds/textures/dark_grey_beds_bed_foot.png new file mode 100644 index 00000000..b1c41b92 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_side1.png b/mods/colorful_beds/textures/dark_grey_beds_bed_side1.png new file mode 100644 index 00000000..11fb0fc7 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_side2.png b/mods/colorful_beds/textures/dark_grey_beds_bed_side2.png new file mode 100644 index 00000000..106b08c1 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_side_bottom.png b/mods/colorful_beds/textures/dark_grey_beds_bed_side_bottom.png new file mode 100644 index 00000000..970332eb Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/dark_grey_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..2c095bf8 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_side_top_r.png b/mods/colorful_beds/textures/dark_grey_beds_bed_side_top_r.png new file mode 100644 index 00000000..83fae6b6 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_top1.png b/mods/colorful_beds/textures/dark_grey_beds_bed_top1.png new file mode 100644 index 00000000..50e10c14 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_top2.png b/mods/colorful_beds/textures/dark_grey_beds_bed_top2.png new file mode 100644 index 00000000..e05e7448 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_top_bottom.png b/mods/colorful_beds/textures/dark_grey_beds_bed_top_bottom.png new file mode 100644 index 00000000..2879f881 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_bed_top_top.png b/mods/colorful_beds/textures/dark_grey_beds_bed_top_top.png new file mode 100644 index 00000000..e1083de4 Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/dark_grey_beds_fancy.png b/mods/colorful_beds/textures/dark_grey_beds_fancy.png new file mode 100644 index 00000000..16d80a3f Binary files /dev/null and b/mods/colorful_beds/textures/dark_grey_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed.png b/mods/colorful_beds/textures/green_beds_bed.png new file mode 100644 index 00000000..633c217b Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_foot.png b/mods/colorful_beds/textures/green_beds_bed_foot.png new file mode 100644 index 00000000..522e37c9 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_side1.png b/mods/colorful_beds/textures/green_beds_bed_side1.png new file mode 100644 index 00000000..9fb54ab9 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_side2.png b/mods/colorful_beds/textures/green_beds_bed_side2.png new file mode 100644 index 00000000..310d820c Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_side_bottom.png b/mods/colorful_beds/textures/green_beds_bed_side_bottom.png new file mode 100644 index 00000000..cbb743f1 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/green_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..870bc5a2 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_side_top_r.png b/mods/colorful_beds/textures/green_beds_bed_side_top_r.png new file mode 100644 index 00000000..85c6a572 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_top1.png b/mods/colorful_beds/textures/green_beds_bed_top1.png new file mode 100644 index 00000000..c22e7d69 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_top2.png b/mods/colorful_beds/textures/green_beds_bed_top2.png new file mode 100644 index 00000000..907afead Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_top_bottom.png b/mods/colorful_beds/textures/green_beds_bed_top_bottom.png new file mode 100644 index 00000000..a8465a66 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/green_beds_bed_top_top.png b/mods/colorful_beds/textures/green_beds_bed_top_top.png new file mode 100644 index 00000000..e7ca5e36 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/green_beds_fancy.png b/mods/colorful_beds/textures/green_beds_fancy.png new file mode 100644 index 00000000..1cb91339 Binary files /dev/null and b/mods/colorful_beds/textures/green_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed.png b/mods/colorful_beds/textures/grey_beds_bed.png new file mode 100644 index 00000000..7d1f84ab Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_foot.png b/mods/colorful_beds/textures/grey_beds_bed_foot.png new file mode 100644 index 00000000..817e90aa Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_side1.png b/mods/colorful_beds/textures/grey_beds_bed_side1.png new file mode 100644 index 00000000..9872da91 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_side2.png b/mods/colorful_beds/textures/grey_beds_bed_side2.png new file mode 100644 index 00000000..588db0e3 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_side_bottom.png b/mods/colorful_beds/textures/grey_beds_bed_side_bottom.png new file mode 100644 index 00000000..ed59fcbc Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/grey_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..b2ec1755 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_side_top_r.png b/mods/colorful_beds/textures/grey_beds_bed_side_top_r.png new file mode 100644 index 00000000..b9282299 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_top1.png b/mods/colorful_beds/textures/grey_beds_bed_top1.png new file mode 100644 index 00000000..7a2f9ab3 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_top2.png b/mods/colorful_beds/textures/grey_beds_bed_top2.png new file mode 100644 index 00000000..c1c65b87 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_top_bottom.png b/mods/colorful_beds/textures/grey_beds_bed_top_bottom.png new file mode 100644 index 00000000..8f26e40b Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/grey_beds_bed_top_top.png b/mods/colorful_beds/textures/grey_beds_bed_top_top.png new file mode 100644 index 00000000..df35c966 Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/grey_beds_fancy.png b/mods/colorful_beds/textures/grey_beds_fancy.png new file mode 100644 index 00000000..2dc840fe Binary files /dev/null and b/mods/colorful_beds/textures/grey_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed.png b/mods/colorful_beds/textures/light_blue_beds_bed.png new file mode 100644 index 00000000..346f6500 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_foot.png b/mods/colorful_beds/textures/light_blue_beds_bed_foot.png new file mode 100644 index 00000000..efeb2454 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_side1.png b/mods/colorful_beds/textures/light_blue_beds_bed_side1.png new file mode 100644 index 00000000..7ab96c3f Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_side2.png b/mods/colorful_beds/textures/light_blue_beds_bed_side2.png new file mode 100644 index 00000000..970cb53f Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_side_bottom.png b/mods/colorful_beds/textures/light_blue_beds_bed_side_bottom.png new file mode 100644 index 00000000..dc7ab42e Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/light_blue_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..9375ba17 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_side_top_r.png b/mods/colorful_beds/textures/light_blue_beds_bed_side_top_r.png new file mode 100644 index 00000000..b59b4777 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_top1.png b/mods/colorful_beds/textures/light_blue_beds_bed_top1.png new file mode 100644 index 00000000..7aa59678 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_top2.png b/mods/colorful_beds/textures/light_blue_beds_bed_top2.png new file mode 100644 index 00000000..cf799ce4 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_top_bottom.png b/mods/colorful_beds/textures/light_blue_beds_bed_top_bottom.png new file mode 100644 index 00000000..3a42c8cc Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_bed_top_top.png b/mods/colorful_beds/textures/light_blue_beds_bed_top_top.png new file mode 100644 index 00000000..d3b514e2 Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/light_blue_beds_fancy.png b/mods/colorful_beds/textures/light_blue_beds_fancy.png new file mode 100644 index 00000000..3b09e0ad Binary files /dev/null and b/mods/colorful_beds/textures/light_blue_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed.png b/mods/colorful_beds/textures/magenta_beds_bed.png new file mode 100644 index 00000000..b0d6a554 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_foot.png b/mods/colorful_beds/textures/magenta_beds_bed_foot.png new file mode 100644 index 00000000..4e2e5580 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_side1.png b/mods/colorful_beds/textures/magenta_beds_bed_side1.png new file mode 100644 index 00000000..42193bac Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_side2.png b/mods/colorful_beds/textures/magenta_beds_bed_side2.png new file mode 100644 index 00000000..12aeedc6 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_side_bottom.png b/mods/colorful_beds/textures/magenta_beds_bed_side_bottom.png new file mode 100644 index 00000000..1e3a890c Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/magenta_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..d190e2eb Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_side_top_r.png b/mods/colorful_beds/textures/magenta_beds_bed_side_top_r.png new file mode 100644 index 00000000..9ea6621c Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_top1.png b/mods/colorful_beds/textures/magenta_beds_bed_top1.png new file mode 100644 index 00000000..426b8c75 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_top2.png b/mods/colorful_beds/textures/magenta_beds_bed_top2.png new file mode 100644 index 00000000..813b90c8 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_top_bottom.png b/mods/colorful_beds/textures/magenta_beds_bed_top_bottom.png new file mode 100644 index 00000000..46331112 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_bed_top_top.png b/mods/colorful_beds/textures/magenta_beds_bed_top_top.png new file mode 100644 index 00000000..793ff33b Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/magenta_beds_fancy.png b/mods/colorful_beds/textures/magenta_beds_fancy.png new file mode 100644 index 00000000..1ada7cc1 Binary files /dev/null and b/mods/colorful_beds/textures/magenta_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed.png b/mods/colorful_beds/textures/orange_beds_bed.png new file mode 100644 index 00000000..9ed719bf Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_foot.png b/mods/colorful_beds/textures/orange_beds_bed_foot.png new file mode 100644 index 00000000..5457bfb6 Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_side1.png b/mods/colorful_beds/textures/orange_beds_bed_side1.png new file mode 100644 index 00000000..d62f3f4b Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_side2.png b/mods/colorful_beds/textures/orange_beds_bed_side2.png new file mode 100644 index 00000000..ab89720c Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_side_bottom.png b/mods/colorful_beds/textures/orange_beds_bed_side_bottom.png new file mode 100644 index 00000000..a8d344da Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/orange_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..cb56f25d Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_side_top_r.png b/mods/colorful_beds/textures/orange_beds_bed_side_top_r.png new file mode 100644 index 00000000..4d8d28a4 Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_top1.png b/mods/colorful_beds/textures/orange_beds_bed_top1.png new file mode 100644 index 00000000..a42c9adc Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_top2.png b/mods/colorful_beds/textures/orange_beds_bed_top2.png new file mode 100644 index 00000000..1a0c6d50 Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_top_bottom.png b/mods/colorful_beds/textures/orange_beds_bed_top_bottom.png new file mode 100644 index 00000000..202b7957 Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/orange_beds_bed_top_top.png b/mods/colorful_beds/textures/orange_beds_bed_top_top.png new file mode 100644 index 00000000..22f5a677 Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/orange_beds_fancy.png b/mods/colorful_beds/textures/orange_beds_fancy.png new file mode 100644 index 00000000..8658fdf5 Binary files /dev/null and b/mods/colorful_beds/textures/orange_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed.png b/mods/colorful_beds/textures/pink_beds_bed.png new file mode 100644 index 00000000..2104f7c1 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_foot.png b/mods/colorful_beds/textures/pink_beds_bed_foot.png new file mode 100644 index 00000000..2c541f50 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_side1.png b/mods/colorful_beds/textures/pink_beds_bed_side1.png new file mode 100644 index 00000000..4754d2fa Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_side2.png b/mods/colorful_beds/textures/pink_beds_bed_side2.png new file mode 100644 index 00000000..536155bb Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_side_bottom.png b/mods/colorful_beds/textures/pink_beds_bed_side_bottom.png new file mode 100644 index 00000000..4ee74b70 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/pink_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..37fefbe3 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_side_top_r.png b/mods/colorful_beds/textures/pink_beds_bed_side_top_r.png new file mode 100644 index 00000000..16de4090 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_top1.png b/mods/colorful_beds/textures/pink_beds_bed_top1.png new file mode 100644 index 00000000..1c263060 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_top2.png b/mods/colorful_beds/textures/pink_beds_bed_top2.png new file mode 100644 index 00000000..929820e0 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_top_bottom.png b/mods/colorful_beds/textures/pink_beds_bed_top_bottom.png new file mode 100644 index 00000000..91cf191f Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/pink_beds_bed_top_top.png b/mods/colorful_beds/textures/pink_beds_bed_top_top.png new file mode 100644 index 00000000..297f7e83 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/pink_beds_fancy.png b/mods/colorful_beds/textures/pink_beds_fancy.png new file mode 100644 index 00000000..f754e693 Binary files /dev/null and b/mods/colorful_beds/textures/pink_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed.png b/mods/colorful_beds/textures/red_beds_bed.png new file mode 100644 index 00000000..6ef59bbc Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_foot.png b/mods/colorful_beds/textures/red_beds_bed_foot.png new file mode 100644 index 00000000..77825e5f Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_side1.png b/mods/colorful_beds/textures/red_beds_bed_side1.png new file mode 100644 index 00000000..19773d66 Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_side2.png b/mods/colorful_beds/textures/red_beds_bed_side2.png new file mode 100644 index 00000000..d3a23d3b Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_side_bottom.png b/mods/colorful_beds/textures/red_beds_bed_side_bottom.png new file mode 100644 index 00000000..df6437db Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/red_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..6fb897c5 Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_side_top_r.png b/mods/colorful_beds/textures/red_beds_bed_side_top_r.png new file mode 100644 index 00000000..735de3fb Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_top1.png b/mods/colorful_beds/textures/red_beds_bed_top1.png new file mode 100644 index 00000000..a49f5093 Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_top2.png b/mods/colorful_beds/textures/red_beds_bed_top2.png new file mode 100644 index 00000000..d29e64fe Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_top_bottom.png b/mods/colorful_beds/textures/red_beds_bed_top_bottom.png new file mode 100644 index 00000000..f7e68aff Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/red_beds_bed_top_top.png b/mods/colorful_beds/textures/red_beds_bed_top_top.png new file mode 100644 index 00000000..a8eceab9 Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/red_beds_fancy.png b/mods/colorful_beds/textures/red_beds_fancy.png new file mode 100644 index 00000000..a5fcbfa3 Binary files /dev/null and b/mods/colorful_beds/textures/red_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed.png b/mods/colorful_beds/textures/violet_beds_bed.png new file mode 100644 index 00000000..fa675932 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_foot.png b/mods/colorful_beds/textures/violet_beds_bed_foot.png new file mode 100644 index 00000000..a37a63a1 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_side1.png b/mods/colorful_beds/textures/violet_beds_bed_side1.png new file mode 100644 index 00000000..709e8b45 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_side2.png b/mods/colorful_beds/textures/violet_beds_bed_side2.png new file mode 100644 index 00000000..a6549c0b Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_side_bottom.png b/mods/colorful_beds/textures/violet_beds_bed_side_bottom.png new file mode 100644 index 00000000..c0d783e0 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/violet_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..8c8f7660 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_side_top_r.png b/mods/colorful_beds/textures/violet_beds_bed_side_top_r.png new file mode 100644 index 00000000..31057a61 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_top1.png b/mods/colorful_beds/textures/violet_beds_bed_top1.png new file mode 100644 index 00000000..27f59f95 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_top2.png b/mods/colorful_beds/textures/violet_beds_bed_top2.png new file mode 100644 index 00000000..53778ab0 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_top_bottom.png b/mods/colorful_beds/textures/violet_beds_bed_top_bottom.png new file mode 100644 index 00000000..fe74803a Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/violet_beds_bed_top_top.png b/mods/colorful_beds/textures/violet_beds_bed_top_top.png new file mode 100644 index 00000000..f725c18e Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/violet_beds_fancy.png b/mods/colorful_beds/textures/violet_beds_fancy.png new file mode 100644 index 00000000..d0996f43 Binary files /dev/null and b/mods/colorful_beds/textures/violet_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed.png b/mods/colorful_beds/textures/white_beds_bed.png new file mode 100644 index 00000000..1daa92e1 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_foot.png b/mods/colorful_beds/textures/white_beds_bed_foot.png new file mode 100644 index 00000000..cc8c9390 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_side1.png b/mods/colorful_beds/textures/white_beds_bed_side1.png new file mode 100644 index 00000000..c574a5bb Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_side2.png b/mods/colorful_beds/textures/white_beds_bed_side2.png new file mode 100644 index 00000000..674a5667 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_side_bottom.png b/mods/colorful_beds/textures/white_beds_bed_side_bottom.png new file mode 100644 index 00000000..60a8e773 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/white_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..886e44ee Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_side_top_r.png b/mods/colorful_beds/textures/white_beds_bed_side_top_r.png new file mode 100644 index 00000000..6616c767 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_top1.png b/mods/colorful_beds/textures/white_beds_bed_top1.png new file mode 100644 index 00000000..91605f96 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_top2.png b/mods/colorful_beds/textures/white_beds_bed_top2.png new file mode 100644 index 00000000..38cbbf31 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_top_bottom.png b/mods/colorful_beds/textures/white_beds_bed_top_bottom.png new file mode 100644 index 00000000..cb706c9a Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/white_beds_bed_top_top.png b/mods/colorful_beds/textures/white_beds_bed_top_top.png new file mode 100644 index 00000000..21d753b4 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/white_beds_fancy.png b/mods/colorful_beds/textures/white_beds_fancy.png new file mode 100644 index 00000000..565fd717 Binary files /dev/null and b/mods/colorful_beds/textures/white_beds_fancy.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed.png b/mods/colorful_beds/textures/yellow_beds_bed.png new file mode 100644 index 00000000..276fe0cc Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_foot.png b/mods/colorful_beds/textures/yellow_beds_bed_foot.png new file mode 100644 index 00000000..43017cba Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_foot.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_side1.png b/mods/colorful_beds/textures/yellow_beds_bed_side1.png new file mode 100644 index 00000000..5617edd6 Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_side1.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_side2.png b/mods/colorful_beds/textures/yellow_beds_bed_side2.png new file mode 100644 index 00000000..aef1e39b Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_side2.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_side_bottom.png b/mods/colorful_beds/textures/yellow_beds_bed_side_bottom.png new file mode 100644 index 00000000..3c2aba28 Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_side_bottom.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_side_bottom_r.png b/mods/colorful_beds/textures/yellow_beds_bed_side_bottom_r.png new file mode 100644 index 00000000..7a705caa Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_side_bottom_r.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_side_top_r.png b/mods/colorful_beds/textures/yellow_beds_bed_side_top_r.png new file mode 100644 index 00000000..9adc7d89 Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_side_top_r.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_top1.png b/mods/colorful_beds/textures/yellow_beds_bed_top1.png new file mode 100644 index 00000000..e99e1bd0 Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_top1.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_top2.png b/mods/colorful_beds/textures/yellow_beds_bed_top2.png new file mode 100644 index 00000000..01f1fe1c Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_top2.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_top_bottom.png b/mods/colorful_beds/textures/yellow_beds_bed_top_bottom.png new file mode 100644 index 00000000..f8cc2bfd Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_top_bottom.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_bed_top_top.png b/mods/colorful_beds/textures/yellow_beds_bed_top_top.png new file mode 100644 index 00000000..f2cc73fd Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_bed_top_top.png differ diff --git a/mods/colorful_beds/textures/yellow_beds_fancy.png b/mods/colorful_beds/textures/yellow_beds_fancy.png new file mode 100644 index 00000000..0d6272d1 Binary files /dev/null and b/mods/colorful_beds/textures/yellow_beds_fancy.png differ diff --git a/mods/creatura/.luacheckrc b/mods/creatura/.luacheckrc new file mode 100644 index 00000000..f8c5ab3b --- /dev/null +++ b/mods/creatura/.luacheckrc @@ -0,0 +1,15 @@ +max_line_length = 120 + +globals = { + "minetest", + "VoxelArea", + "creatura", +} + +read_globals = { + "vector", + "ItemStack", + table = {fields = {"copy"}} +} + +ignore = {"212/self", "212/this"} \ No newline at end of file diff --git a/mods/creatura/LICENSE b/mods/creatura/LICENSE new file mode 100644 index 00000000..ed8c3a0f --- /dev/null +++ b/mods/creatura/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 ElCeejo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/creatura/api.lua b/mods/creatura/api.lua new file mode 100644 index 00000000..e7663221 --- /dev/null +++ b/mods/creatura/api.lua @@ -0,0 +1,556 @@ +-------------- +-- Creatura -- +-------------- + +creatura.api = {} + +-- Math -- + +local abs = math.abs +local floor = math.floor +local random = math.random + +local function clamp(val, min_n, max_n) + if val < min_n then + val = min_n + elseif max_n < val then + val = max_n + end + return val +end + +local vec_dist = vector.distance + +local function vec_raise(v, n) + if not v then return end + return {x = v.x, y = v.y + n, z = v.z} +end + +--------------- +-- Local API -- +--------------- + +local function contains_val(tbl, val) + for _, v in pairs(tbl) do + if v == val then return true end + end + return false +end + +---------------------------- +-- Registration Functions -- +---------------------------- + +creatura.registered_movement_methods = {} + +function creatura.register_movement_method(name, func) + creatura.registered_movement_methods[name] = func +end + +creatura.registered_utilities = {} + +function creatura.register_utility(name, func) + creatura.registered_utilities[name] = func +end + +--------------- +-- Utilities -- +--------------- + +function creatura.is_valid(mob) + if not mob then return false end + if type(mob) == "table" then mob = mob.object end + if type(mob) == "userdata" then + if mob:is_player() then + if mob:get_look_horizontal() then return mob end + else + if mob:get_yaw() then return mob end + end + end + return false +end + +function creatura.is_alive(mob) + if not creatura.is_valid(mob) then + return false + end + if type(mob) == "table" then + return (mob.hp or mob.health or 0) > 0 + end + if mob:is_player() then + return mob:get_hp() > 0 + else + local ent = mob:get_luaentity() + return ent and (ent.hp or ent.health or 0) > 0 + end +end + +------------------------ +-- Environment access -- +------------------------ + +local default_node_def = {walkable = true} -- both ignore and unknown nodes are walkable + +function creatura.get_node_height_from_def(name) + local def = minetest.registered_nodes[name] or default_node_def + if not def then return 0.5 end + if def.walkable then + if def.drawtype == "nodebox" then + if def.node_box + and def.node_box.type == "fixed" then + if type(def.node_box.fixed[1]) == "number" then + return 0.5 + def.node_box.fixed[5] + elseif type(def.node_box.fixed[1]) == "table" then + return 0.5 + def.node_box.fixed[1][5] + else + return 1 + end + else + return 1 + end + else + return 1 + end + else + return 1 + end +end + +local get_node = minetest.get_node + +function creatura.get_node_def(node) -- Node can be name or pos + if type(node) == "table" then + node = get_node(node).name + end + local def = minetest.registered_nodes[node] or default_node_def + if def.walkable + and creatura.get_node_height_from_def(node) < 0.26 then + def.walkable = false -- workaround for nodes like snow + end + return def +end + +local get_node_def = creatura.get_node_def + +function creatura.get_ground_level(pos, range) + range = range or 2 + local above = vector.round(pos) + local under = {x = above.x, y = above.y - 1, z = above.z} + if not get_node_def(above).walkable and get_node_def(under).walkable then return above end + if get_node_def(above).walkable then + for _ = 1, range do + under = above + above = {x = above.x, y = above.y + 1, z = above.z} + if not get_node_def(above).walkable and get_node_def(under).walkable then return above end + end + end + if not get_node_def(under).walkable then + for _ = 1, range do + above = under + under = {x = under.x, y = under.y - 1, z = under.z} + if not get_node_def(above).walkable and get_node_def(under).walkable then return above end + end + end + return above +end + +function creatura.is_pos_moveable(pos, width, height) + local edge1 = { + x = pos.x - (width + 0.2), + y = pos.y, + z = pos.z - (width + 0.2), + } + local edge2 = { + x = pos.x + (width + 0.2), + y = pos.y, + z = pos.z + (width + 0.2), + } + local base_p = {x = pos.x, y = pos.y, z = pos.z} + local top_p = {x = pos.x, y = pos.y + height, z = pos.z} + for z = edge1.z, edge2.z do + for x = edge1.x, edge2.x do + base_p.x, base_p.z = pos.x + x, pos.z + z + top_p.x, top_p.z = pos.x + x, pos.z + z + local ray = minetest.raycast(base_p, top_p, false, false) + for pointed_thing in ray do + if pointed_thing.type == "node" then + local name = get_node(pointed_thing.under).name + if creatura.get_node_def(name).walkable then + return false + end + end + end + end + end + return true +end + +local function is_blocked_thin(pos, height) + local node + local pos2 = { + x = floor(pos.x + 0.5), + y = floor(pos.y + 0.5) - 1, + z = floor(pos.z + 0.5) + } + + for _ = 1, height do + pos2.y = pos2.y + 1 + node = minetest.get_node_or_nil(pos2) + + if not node + or get_node_def(node.name).walkable then + return true + end + end + return false +end + +function creatura.is_blocked(pos, width, height) + if width <= 0.5 then + return is_blocked_thin(pos, height) + end + + local p1 = { + x = pos.x - (width + 0.2), + y = pos.y, + z = pos.z - (width + 0.2), + } + local p2 = { + x = pos.x + (width + 0.2), + y = pos.y + (height + 0.2), + z = pos.z + (width + 0.2), + } + + local node + local pos2 = {} + for z = p1.z, p2.z do + pos2.z = z + for y = p1.y, p2.y do + pos2.y = y + for x = p1.x, p2.x do + pos2.x = x + node = minetest.get_node_or_nil(pos2) + + if not node + or get_node_def(node.name).walkable then + return true + end + end + end + end + return false +end + +function creatura.fast_ray_sight(pos1, pos2, water) + local ray = minetest.raycast(pos1, pos2, false, water or false) + local pointed_thing = ray:next() + while pointed_thing do + if pointed_thing.type == "node" + and creatura.get_node_def(pointed_thing.under).walkable then + return false, vec_dist(pos1, pointed_thing.intersection_point), pointed_thing.ref, pointed_thing.intersection_point + end + pointed_thing = ray:next() + end + return true, vec_dist(pos1, pos2), false, pos2 +end + +local fast_ray_sight = creatura.fast_ray_sight + +function creatura.sensor_floor(self, range, water) + local pos = self.object:get_pos() + local pos2 = vec_raise(pos, -range) + local _, dist, node = fast_ray_sight(pos, pos2, water or false) + return dist, node +end + +function creatura.sensor_ceil(self, range, water) + local pos = vec_raise(self.object:get_pos(), self.height) + local pos2 = vec_raise(pos, range) + local _, dist, node = fast_ray_sight(pos, pos2, water or false) + return dist, node +end + +function creatura.get_nearby_player(self, range) + local pos = self.object:get_pos() + if not pos then return end + local stored = self._nearby_obj or {} + local objects = (#stored > 0 and stored) or self:store_nearby_objects(range) + for _, object in ipairs(objects) do + if object:is_player() + and creatura.is_alive(object) then + return object + end + end +end + +function creatura.get_nearby_players(self, range) + local pos = self.object:get_pos() + if not pos then return end + local stored = self._nearby_obj or {} + local objects = (#stored > 0 and stored) or self:store_nearby_objects(range) + local nearby = {} + for _, object in ipairs(objects) do + if object:is_player() + and creatura.is_alive(object) then + table.insert(nearby, object) + end + end + return nearby +end + +function creatura.get_nearby_object(self, name, range) + local pos = self.object:get_pos() + if not pos then return end + local stored = self._nearby_obj or {} + local objects = (#stored > 0 and stored) or self:store_nearby_objects(range) + for _, object in ipairs(objects) do + local ent = creatura.is_alive(object) and object:get_luaentity() + if ent + and object ~= self.object + and not ent._ignore + and ((type(name) == "table" and contains_val(name, ent.name)) + or ent.name == name) then + return object + end + end +end + +function creatura.get_nearby_objects(self, name, range) + local pos = self.object:get_pos() + if not pos then return end + local stored = self._nearby_obj or {} + local objects = (#stored > 0 and stored) or self:store_nearby_objects(range) + local nearby = {} + for _, object in ipairs(objects) do + local ent = creatura.is_alive(object) and object:get_luaentity() + if ent + and object ~= self.object + and not ent._ignore + and ((type(name) == "table" and contains_val(name, ent.name)) + or ent.name == name) then + table.insert(nearby, object) + end + end + return nearby +end + +creatura.get_nearby_entity = creatura.get_nearby_object +creatura.get_nearby_entities = creatura.get_nearby_objects + +-------------------- +-- Global Mob API -- +-------------------- + +function creatura.default_water_physics(self) + local pos = self.stand_pos + local stand_node = self.stand_node + if not pos or not stand_node then return end + local gravity = self._movement_data.gravity or -9.8 + local submergence = self.liquid_submergence or 0.25 + local drag = self.liquid_drag or 0.7 + + if minetest.get_item_group(stand_node.name, "liquid") > 0 then -- In Liquid + local vel = self.object:get_velocity() + if not vel then return end + + self.in_liquid = stand_node.name + + if submergence < 1 then + local mob_level = pos.y + (self.height * submergence) + + -- Find Water Surface + local nodes = minetest.find_nodes_in_area_under_air( + {x = pos.x, y = pos.y, z = pos.z}, + {x = pos.x, y = pos.y + 3, z = pos.z}, + "group:liquid" + ) or {} + + local surface_level = (#nodes > 0 and nodes[#nodes].y or pos.y + self.height + 3) + surface_level = floor(surface_level + 0.9) + + local height_diff = mob_level - surface_level + + -- Apply Bouyancy + if height_diff <= 0 then + local displacement = clamp(abs(height_diff) / submergence, 0.5, 1) * self.width + + self.object:set_acceleration({x = 0, y = displacement, z = 0}) + else + self.object:set_acceleration({x = 0, y = gravity, z = 0}) + end + end + + -- Apply Drag + self.object:set_velocity({ + x = vel.x * (1 - self.dtime * drag), + y = vel.y * (1 - self.dtime * drag), + z = vel.z * (1 - self.dtime * drag) + }) + else + self.in_liquid = nil + + self.object:set_acceleration({x = 0, y = gravity, z = 0}) + end +end + +function creatura.default_vitals(self) + local pos = self.stand_pos + local node = self.stand_node + if not pos or node then return end + + local max_fall = self.max_fall or 3 + local in_liquid = self.in_liquid + local on_ground = self.touching_ground + local damage = 0 + + -- Fall Damage + if max_fall > 0 + and not in_liquid then + local fall_start = self._fall_start or (not on_ground and pos.y) + if fall_start + and on_ground then + damage = floor(fall_start - pos.y) + if damage < max_fall then + damage = 0 + else + local resist = self.fall_resistance or 0 + damage = damage - damage * resist + end + fall_start = nil + end + self._fall_start = fall_start + end + + -- Environment Damage + if self:timer(1) then + local stand_def = creatura.get_node_def(node.name) + local max_breath = self.max_breath or 0 + + -- Suffocation + if max_breath > 0 then + local head_pos = {x = pos.x, y = pos.y + self.height, z = pos.z} + local head_def = creatura.get_node_def(head_pos) + if head_def.groups + and (minetest.get_item_group(head_def.name, "water") > 0 + or (head_def.walkable + and head_def.groups.disable_suffocation ~= 1 + and head_def.drawtype == "normal")) then + local breath = self._breath + if breath <= 0 then + damage = damage + 1 + else + self._breath = breath - 1 + self:memorize("_breath", breath) + end + end + end + + -- Burning + local fire_resist = self.fire_resistance or 0 + if fire_resist < 1 + and minetest.get_item_group(stand_def.name, "igniter") > 0 + and stand_def.damage_per_second then + damage = (damage or 0) + stand_def.damage_per_second * fire_resist + end + end + + -- Apply Damage + if damage > 0 then + self:hurt(damage) + self:indicate_damage() + if random(4) < 2 then + self:play_sound("hurt") + end + end + + -- Entity Cramming + if self:timer(5) then + local objects = minetest.get_objects_inside_radius(pos, 0.2) + if #objects > 10 then + self:indicate_damage() + self.hp = self:memorize("hp", -1) + self:death_func() + end + end +end + +function creatura.drop_items(self) + if not self.drops then return end + local pos = self.object:get_pos() + if not pos then return end + + local drop_def, item_name, min_items, max_items, chance, amount, drop_pos + for i = 1, #self.drops do + drop_def = self.drops[i] + item_name = drop_def.name + if not item_name then return end + chance = drop_def.chance or 1 + + if random(chance) < 2 then + min_items = drop_def.min or 1 + max_items = drop_def.max or 2 + amount = random(min_items, max_items) + drop_pos = { + x = pos.x + random(-5, 5) * 0.1, + y = pos.y, + z = pos.z + random(-5, 5) * 0.1 + } + + local item = minetest.add_item(drop_pos, ItemStack(item_name .. " " .. amount)) + if item then + item:add_velocity({ + x = random(-2, 2), + y = 1.5, + z = random(-2, 2) + }) + end + end + end +end + +function creatura.basic_punch_func(self, puncher, tflp, tool_caps, dir) + if not puncher then return end + local tool + local tool_name = "" + local add_wear = false + if puncher:is_player() then + tool = puncher:get_wielded_item() + tool_name = tool:get_name() + add_wear = not minetest.is_creative_enabled(puncher:get_player_name()) + end + if (self.immune_to + and contains_val(self.immune_to, tool_name)) then + return + end + local damage = 0 + local armor_grps = self.object:get_armor_groups() or self.armor_groups or {} + for group, val in pairs(tool_caps.damage_groups or {}) do + local dmg_x = tflp / (tool_caps.full_punch_interval or 1.4) + damage = damage + val * clamp(dmg_x, 0, 1) * ((armor_grps[group] or 0) / 100.0) + end + if damage > 0 then + local dist = vec_dist(self.object:get_pos(), puncher:get_pos()) + dir.y = 0.2 + if self.touching_ground then + local power = clamp((damage / dist) * 8, 0, 8) + self:apply_knockback(dir, power) + end + self:hurt(damage) + end + if add_wear then + local wear = floor((tool_caps.full_punch_interval / 75) * 9000) + tool:add_wear(wear) + puncher:set_wielded_item(tool) + end + if random(2) < 2 then + self:play_sound("hurt") + end + if (tflp or 0) > 0.5 then + self:play_sound("hit") + end + self:indicate_damage() +end + +local path = minetest.get_modpath("creatura") + +dofile(path.."/mob_meta.lua") diff --git a/mods/creatura/boids.lua b/mods/creatura/boids.lua new file mode 100644 index 00000000..a7f338d6 --- /dev/null +++ b/mods/creatura/boids.lua @@ -0,0 +1,232 @@ +----------- +-- Boids -- +----------- + +local abs = math.abs +local atan2 = math.atan2 +local sin = math.sin +local cos = math.cos + +local function average_angle(tbl) + local sum_sin, sum_cos = 0, 0 + for _, v in pairs(tbl) do + sum_sin = sum_sin + sin(v) + sum_cos = sum_cos + cos(v) + end + return atan2(sum_sin, sum_cos) +end + +local function average(tbl) + local sum = 0 + for _,v in pairs(tbl) do -- Get the sum of all numbers in t + sum = sum + v + end + return sum / #tbl +end + +local function interp_rad(a, b, w) + local cs = (1 - w) * cos(a) + w * cos(b) + local sn = (1 - w) * sin(a) + w * sin(b) + return atan2(sn, cs) +end + +local vec_add = vector.add +local vec_dir = vector.direction +local vec_dist = vector.distance +local vec_divide = vector.divide +local vec_normal = vector.normalize + +local function get_average_pos(vectors) + local sum = {x = 0, y = 0, z = 0} + for _, vec in pairs(vectors) do sum = vec_add(sum, vec) end + return vec_divide(sum, #vectors) +end + +local function dist_2d(pos1, pos2) + local a = vector.new( + pos1.x, + 0, + pos1.z + ) + local b = vector.new( + pos2.x, + 0, + pos2.z + ) + return vec_dist(a, b) +end + +local yaw2dir = minetest.yaw_to_dir +local dir2yaw = minetest.dir_to_yaw + +-- Get Boid Members -- + +function creatura.get_boid_cached(self) + local pos = self.object:get_pos() + if not pos then return end + local radius = self.tracking_range * 0.5 or 4 + local members = self._movement_data.boids or {} + local max_boids = self.max_boids or 7 + if #members > 0 then + for i = #members, 1, -1 do + local object = members[i] + if not object or not object:get_yaw() then members[i] = nil end + end + if #members >= max_boids then return members end + end + local objects = minetest.get_objects_inside_radius(pos, radius) + if #objects < 2 then return {} end + for _, object in ipairs(objects) do + local ent = object and object ~= self.object and object:get_luaentity() + if ent + and ent.name == self.name then + local move_data = ent._movement_data + if move_data + and (not move_data.boids + or #move_data.boids < max_boids) then + table.insert(members, object) + end + end + if #members >= max_boids then break end + end + self._movement_data.boids = members + + return members +end + +-- Calculate Boid Movement Direction + +function creatura.get_boid_dir(self) + local pos = self.object:get_pos() + if not pos then return end + local boids = creatura.get_boid_cached(self) + if #boids < 2 then return end + local pos_no, pos_sum = 0, {x = 0, y = 0, z = 0} + local sum_sin, sum_cos = 0, 0 + local lift_no, lift_sum = 0, 0 + + local vel + local boid_pos + local closest_pos + for _, object in ipairs(boids) do + if object then + boid_pos, vel = object:get_pos(), object:get_velocity() + if boid_pos then + vel = vec_normal(vel) + local obj_yaw = object:get_yaw() + pos_no, pos_sum = pos_no + 1, vec_add(pos_sum, boid_pos) + sum_sin, sum_cos = sum_sin + sin(obj_yaw), sum_cos + cos(obj_yaw) + lift_no, lift_sum = lift_no + 1, lift_sum + vel.y + if not closest_pos + or vec_dist(pos, boid_pos) < vec_dist(pos, closest_pos) then + closest_pos = boid_pos + end + end + end + end + if not closest_pos then return end + local center = vec_divide(pos_sum, pos_no) + local lift = lift_sum / lift_no + + local angle_sin, angle_cos + local radius = self.tracking_range * 0.5 or 4 + local dist_factor = (radius - vec_dist(pos, closest_pos)) / radius + + local alignment = atan2(sum_sin, sum_cos) + local seperation = dir2yaw(vec_dir(closest_pos, pos)) + local cohesion = dir2yaw(vec_dir(pos, center)) + if dist_factor > 0.9 then + seperation = interp_rad(alignment, seperation, 0.5) + angle_sin, angle_cos = sin(seperation), cos(seperation) + else + angle_sin, angle_cos = sin(cohesion), cos(cohesion) + end + local angle = atan2(angle_sin + sin(alignment), angle_cos + cos(alignment)) + + local dir = yaw2dir(angle) + dir.y = lift + return vector.normalize(dir), boids +end + +-- Deprecated + +function creatura.get_boid_members(pos, radius, name) + local objects = minetest.get_objects_inside_radius(pos, radius) + if #objects < 2 then return {} end + local members = {} + local max_boid = minetest.registered_entities[name].max_boids or 7 + for i = 1, #objects do + if #members > max_boid then break end + local object = objects[i] + if object:get_luaentity() + and object:get_luaentity().name == name then + table.insert(members, object) + end + end + if #members > 1 then + for _, object in ipairs(members) do + local ent = object and object:get_luaentity() + if ent then + ent._movement_data.boids = members + end + end + end + return members +end + +function creatura.get_boid_angle(self, _boids, range) + local pos = self.object:get_pos() + local boids = _boids or creatura.get_boid_members(pos, range or 4, self.name) + if #boids < 3 then return end + local yaw = self.object:get_yaw() + local lift = self.object:get_velocity().y + -- Add Boid data to tables + local closest_pos + local positions = {} + local angles = {} + local lifts = {} + for i = 1, #boids do + local boid = boids[i] + if boid:get_pos() then + local vel = boid:get_velocity() + if boid ~= self.object + and (abs(vel.x) > 0.1 + or abs(vel.z) > 0.1) then + local boid_pos = boid:get_pos() + table.insert(positions, boid_pos) + table.insert(lifts, vec_normal(vel).y) + table.insert(angles, boid:get_yaw()) + if not closest_pos + or vec_dist(pos, boid_pos) < vec_dist(pos, closest_pos) then + closest_pos = boid_pos + end + end + end + end + if #positions < 3 then return end + local center = get_average_pos(positions) + local dir2closest = vec_dir(pos, closest_pos) + -- Calculate Parameters + local alignment = average_angle(angles) + center = vec_add(center, yaw2dir(alignment)) + local dir2center = vec_dir(pos, center) + local seperation = yaw + -(dir2yaw(dir2closest) - yaw) + local cohesion = dir2yaw(dir2center) + local params = {alignment} + if dist_2d(pos, closest_pos) < (self.boid_seperation or self.width * 3) then + table.insert(params, seperation) + elseif dist_2d(pos, center) > (#boids * 0.33) * (self.boid_seperation or self.width * 3) then + table.insert(params, cohesion) + end + -- Vertical Params + local vert_alignment = average(lifts) + local vert_seperation = (self.speed or 2) * -dir2closest.y + local vert_cohesion = (self.speed or 2) * dir2center.y + local vert_params = {vert_alignment} + if math.abs(pos.y - closest_pos.y) < (self.boid_seperation or self.width * 3) then + table.insert(vert_params, vert_seperation) + elseif math.abs(pos.y - closest_pos.y) > 1.5 * (self.boid_seperation or self.width * 3) then + table.insert(vert_params, vert_cohesion + (lift - vert_cohesion) * 0.1) + end + return average_angle(params), average(vert_params) +end diff --git a/mods/creatura/doc.txt b/mods/creatura/doc.txt new file mode 100644 index 00000000..89b8b026 --- /dev/null +++ b/mods/creatura/doc.txt @@ -0,0 +1,280 @@ + +Registration +------------ + +creatura.register_mob(name, mob definition) + +Mob Definition uses almost all entity definition params + +{ + max_health = 10 -- Maximum Health + damage = 0 -- Damage dealt by mob + speed = 4 -- Maximum Speed + tracking_range = 16 -- Maximum range for finding entities/blocks + despawn_after = 1500 -- Despawn after being active for this amount of time + + max_fall = 8 -- How far a mob can fall before taking damage (set to 0 to disable fall damage) + turn_rate = 7 -- Turn Rate in rad/s + bouyancy_multiplier = 1 -- Multiplier for bouyancy effects (set to 0 to disable bouyancy) + hydrodynamics_multiplier = 1 -- Multiplier for hydroynamic effects (set to 0 to disable hydrodynamics) + + hitbox = { -- Hitbox params (Uses custom registration to force get_pos() to always return bottom of box) + width = 0.5, (total width = width * 2. A width of 0.5 results in a box with a total width of 1) + height = 1 (total height of box) + } + + animations = { + anim = {range = {x = 1, y = 10}, speed = 30, frame_blend = 0.3, loop = true} + } + + drops = { + {name = (itemstring), min = 1, max = 3, chance = 1}, + } + follow = { + "farming:seed_wheat", + "farming:seed_cotton" + } + + utility_stack = { + -- Every second, all utilities in the stack are evaluated + -- Whichever utilitiy's get_score function returns the highest number will be executed + -- If multiple utilities have the same score, the one with the highest index is executed + [1] = { + `utility` -- name of utility to evaluate + `get_score` -- function (only accepts `self` as an arg) that returns a number + } + } + + activate_func = function(self, staticdata, dtime_s) -- called upon activation + step_func = function(self, dtime, moveresult) -- called every server step + death_func = function(self) -- called when mobs health drops to/below 0 +} + +Lua Entity Methods +------------------ + +`move(pos, method, speed, animation)` +- `pos`: position to move to +- `method`: method used to move to `pos` +- `speed`: multiplier for `speed` +- `animation`: animation to play while moving + +`halt()` +- stops movement + +`turn_to(yaw[, turn_rate])` +- `yaw`: yaw (in radians) to turn to +- `turn_rate`: turn rate in rad/s (default: 10) -- likely to be deprecated + +`set_gravity(gravity)` +- `gravity`: vertical acceleration rate + +`set_forward_velocity(speed)` +- `speed`: rate in m/s to travel forward at + +`set_vertical_velocity(speed)` +- `speed`: rate in m/s to travel vertically at + +`apply_knockback(dir, power)` +- `dir`: direction vector +- `power`: multiplier for dir + +`punch_target(target)` +- applies 'damage' to 'target' + +`hurt(damage)` +- `damage`: number to subtract from health (ignores armor) + +`heal(health)` +- `health`: number to add to health + +`get_center_pos()` +- returns position at center of hitbox + +`pos_in_box(pos[, size])` +- returns true if 'pos' is within hitbox +- `size`: width of box to check in (optional) + +`animate(anim)` +- sets animation to `anim` + +`set_texture(id, tbl)` +- `id`: table index +- `tbl`: table of textures + +`set_scale(x)` +- `x`: multiplier for base scale (0.5 sets scale to half, 2 sets scale to double) + +`fix_attached_scale(parent)` +- sets scale to appropriate value when attached to 'parent' +- `parent`: object + +`memorize(id, val)` +-- stores `val` to staticdata +- `id`: key for table +- `val`: value to store + +`forget(id)` +-- removes `id` from staticdata + +`recall(id)` +-- returns value of `id` from staticdata + +`timer(n)` +-- returns true avery `n` seconds + +`get_hitbox()` +-- returns current hitbox + +`get_height()` +-- returns current height + +`get_visual_size()` +-- returns current visual size + +`follow_wielded_item(player)` +-- returns itemstack, item name of `player`s wielded item if item is in 'follow' + +`get_target(target)` +-- returns if `target` is alive, if mob has a line of sight with `target`, position of `target` + +Utilities +--------- + +* `creatura.is_valid(mob)` + * Returns false if object doesn't exist, otherwise returns ObjectRef/PlayerRef + * `mob`: Luaentity, ObjectRef, or PlayerRef + +* `creatura.is_alive(mob)` + * Returns false if object doesn't exist or is dead, otherwise returns ObjectRef/PlayerRef + * `mob`: Luaentity, ObjectRef, or PlayerRef + +Environment access +------------------ + +* `creatura.get_node_height_from_def(name)` + -- Returns total height of nodebox + -- `name`: Itemstring/Name of node + + +* `creatura.get_node_def(node)` + -- Returns definition of node + -- `node`: Itemstring/Name of node or position + +* `creatura.get_ground_level(pos, max_diff)` + * Returns first position above walkable node within `max_diff` + +* `creatura.is_pos_moveable(pos, width, height)` + * Returns true if a box with specified `width` and `height` can fit at `pos` + * `width` should be the largest side of the collision box + * Check from bottom of box + +* `creatura.fast_ray_sight(pos1, pos2, water)` + * Checks for line of sight between `pos1 and `pos2` + * Returns bool + * Returns distance to obstruction + +* `creatura.sensor_floor(self, range, water)` + * Finds distance to ground from bottom of entities hitbox + * Returns distance to ground or `range` if no ground is found + * `range`: Maximum range + * `water`: If false, water will not be counted as ground + +* `creatura.sensor_ceil(self, range, water)` + * Finds distance to ceiling from top of entities hitbox + * Returns distance to ceiling or `range` if no ceiling is found + * `range`: Maximum range + * `water`: If false, water will not be counted as ceiling + +* `creatura.get_nearby_player(self)` + * Finds player within `self.tracking_range` + * Returns PlayerRef or nil + +* `creatura.get_nearby_players(self)` + * Finds players within `self.tracking_range` + * Returns table of PlayerRefs or empty table + +* `creatura.get_nearby_object(self, name)` + * Finds object within `self.tracking_range` + * Returns ObjectRef or nil + * `name`: Name of object to search for + +* `creatura.get_nearby_objects(self, name)` + * Finds objects within `self.tracking_range` + * Returns table of ObjectRefs or empty table + * `name`: Name of object to search for + +Global Mob API +-------------- + +* `creatura.default_water_physics(self)` + * Bouyancy and Drag physics used by default on all Mobs + +* `creatura.default_vitals(self)` + * Vitals used by default on all Mobs + * Handles suffocation, drowning, fire damage, and fall damage + +* `creatura.drop_items(self)` + * Drops items from `self.drops` + +* `creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage)` + * Deals damage + * Applies knockback + * Visualy and audibly indicates damage + +Pathfinding +----------- + +Creatura's pathfinder uses the A* algorithm for speed, as well as Theta* for decent performance and more natural looking paths. + +Both pathfinders will carry out pathfinding over multiple server steps to reduce lag spikes which does result in the path not +being returned immediately, so your code will have to account for this. + +The maximum amount of time the pathfinder can spend per-step (in microseconds) can be adjusted in settings. + + +* `creatura.pathfinder.find_path(self, pos1, pos2, get_neighbors)` + * Finds a path from `pos1` to `pos2` + * `get_neighbors` is a function used to find valid neighbors + * `creatura.pathfinder.get_neighbors_fly` and `creatura.pathfinder.get_neighbors_swim` are bundled by default + + +* `creatura.pathfinder.find_path_theta(self, pos1, pos2, get_neighbors)` + * Finds a path from `pos1` to `pos2` + * Returns a path with arbitrary angles for natural looking paths at the expense of performance + * `get_neighbors` is a function used to find valid neighbors + * `creatura.pathfinder.get_neighbors_fly` and `creatura.pathfinder.get_neighbors_swim` are bundled by default + +Spawning +-------- + +NOTE: Globalstep spawning from early versions of the API likely won't recieve much/any support going forward. Use ABM Spawning instead. + +* `creatura.register_abm_spawn(name, def)` + * `name` of the mob to spawn + * `def` is a table of spawn parameters + * `chance` is the chance of a mob spawning every `interval` + * (a `chance` of 30 and `interval` of 60 would mean a 1 in 30 chance of a mob spawning every 60 seconds) + * `chance_on_load` same as `chance` but for LBM spawning (when a chunk is loaded for the first time) + * `interval` is how often (in seconds) a spawn attempt will happen + * `min_height` is the minimum height that a spawn attempt can happen at + * a `min_height` of 0 would mean the mob cannot spawn below a y coordinate of 0 + * `max_height` is the maximum height that a spawn attempt can happen at + * a `max_height` of 128 would mean the mob cannot spawn above a y coordinate of 128 + * `min_time` is the minimum time a mob can spawn at + * `max_time` is the maximum time a mob can spawn at + * set `min_time` to 19500 and `max_time` to 4500 to only spawn at night and swap the numbers to only spawn at day + * `min_light` is the minimum light level a mob can spawn at + * `max_light` is the maximum light level a mob can spawn at + * `min_group` is the lowest number of mobs to spawn in a group at a time + * value of 3 means the mob will always spawn with at least 3 mobs together + * `max_group` is the highest number of mobs to spawn in a group at a time + * `block_protected` will block spawning mobs in protected areas if set to true + * `biomes` is a table of biomes the mob can spawn in + * `nodes` is a table of nodes the mob can spawn in/on + * `neighbors` is a table of nodes that must be adjacent to the spawn position + * ex: set to `{"groups:tree"}` to force the mob to spawn next to a tree + * `spawn_on_load` will spawn mobs when a chunk generates if set to true + * `spawn_in_nodes` will spawn mobs inside the node rather than above if set to true + * set this to true for mobs that spawn in water + * `spawn_cap` is the maximum amount of the mob that can spawn within active block range \ No newline at end of file diff --git a/mods/creatura/init.lua b/mods/creatura/init.lua new file mode 100644 index 00000000..89703002 --- /dev/null +++ b/mods/creatura/init.lua @@ -0,0 +1,25 @@ +creatura = {} + +local path = minetest.get_modpath("creatura") + +dofile(path.."/api.lua") +dofile(path.."/pathfinding.lua") +dofile(path.."/pathfinder_deprecated.lua") +dofile(path.."/methods.lua") + +-- Optional Files -- + +-- Optional files can be safely removed +-- by game developers who don't need the +-- extra features + +local function load_file(filepath, filename) + if io.open(filepath .. "/" .. filename, "r") then + dofile(filepath .. "/" .. filename) + else + minetest.log("action", "[Creatura] The file " .. filename .. " could not be loaded.") + end +end + +load_file(path, "boids.lua") +load_file(path, "spawning.lua") \ No newline at end of file diff --git a/mods/creatura/methods.lua b/mods/creatura/methods.lua new file mode 100644 index 00000000..70cd022b --- /dev/null +++ b/mods/creatura/methods.lua @@ -0,0 +1,677 @@ +------------- +-- Methods -- +------------- + +local pi = math.pi +local abs = math.abs +local ceil = math.ceil +local max = math.max +local random = math.random +local atan2 = math.atan2 +local sin = math.sin +local cos = math.cos + +local function diff(a, b) -- Get difference between 2 angles + return atan2(sin(b - a), cos(b - a)) +end + +local function clamp(val, _min, _max) + if val < _min then + val = _min + elseif _max < val then + val = _max + end + return val +end + +local vec_add = vector.add +local vec_normal = vector.normalize +local vec_len = vector.length +local vec_dist = vector.distance +local vec_dir = vector.direction +local vec_dot = vector.dot +local vec_multi = vector.multiply +local vec_sub = vector.subtract +local yaw2dir = minetest.yaw_to_dir +local dir2yaw = minetest.dir_to_yaw + +--[[local function debugpart(pos, time, tex) + minetest.add_particle({ + pos = pos, + texture = tex or "creatura_particle_red.png", + expirationtime = time or 0.1, + glow = 16, + size = 24 + }) +end]] + +--------------------- +-- Local Utilities -- +--------------------- + +local get_node_def = creatura.get_node_def +--local get_node_height = creatura.get_node_height_from_def + +function creatura.get_collision(self, dir, range) + local pos, yaw = self.object:get_pos(), self.object:get_yaw() + if not pos then return end + local width, height = self.width or 0.5, self.height or 1 + + dir = dir or yaw2dir(yaw) + + pos.x = pos.x + dir.x * width + pos.z = pos.z + dir.z * width + + local cos_yaw = cos(yaw) + local sin_yaw = sin(yaw) + + local width_i = width / ceil(width) + local height_i = height / ceil(height) + + local pos_x, pos_y, pos_z = pos.x, pos.y, pos.z + local dir_x, dir_y, dir_z = dir.x, dir.y, dir.z + + local pos2 = {x = pos_x, y = pos_y, z = pos_z} + local collision + + + pos.y = pos.y + height * 0.5 + range = range or 4 + local low_score + for _ = 0, range do + if collision then return collision end + pos_x = pos_x + dir_x + pos_y = pos_y + dir_y + pos_z = pos_z + dir_z + + pos2.y = pos_y + for x = -width, width, width_i do + pos2.x = cos_yaw * ((pos_x + x) - pos_x) + pos_x + pos2.z = sin_yaw * ((pos_x + x) - pos_x) + pos_z + + for y = height, 0, -height_i do + if y < self.stepheight or 1.1 then break end + pos2.y = pos_y + y + + if get_node_def(pos2).walkable then + local score = abs(pos.y - pos2.y) * vec_dot(dir, vec_dir(pos, pos2)) + if not low_score + or score < low_score then + low_score = score + collision = pos2 + end + end + end + end + end +end + +creatura.get_collision_ranged = creatura.get_collision + +local get_collision = creatura.get_collision + +local function get_avoidance_dir(self) + local pos = self.object:get_pos() + if not pos then return end + local _, col_pos = get_collision(self) + if col_pos then + local vel = self.object:get_velocity() + vel.y = 0 + local vel_len = vec_len(vel) * (1 + (self.step_delay or 0)) + local ahead = vec_add(pos, vec_normal(vel)) + local avoidance_force = vec_sub(ahead, col_pos) + avoidance_force.y = 0 + avoidance_force = vec_multi(vec_normal(avoidance_force), (vel_len > 1 and vel_len) or 1) + return vec_dir(pos, vec_add(ahead, avoidance_force)) + end +end + +local function get_collision_single(pos, water) + local pos2 = {x = pos.x, y = pos.y, z = pos.z} + local n_def = get_node_def(pos2) + if n_def.walkable + or (water and (n_def.groups.liquid or 0) > 0) then + pos2.y = pos.y + 1 + n_def = get_node_def(pos2) + local col_max = n_def.walkable or (water and (n_def.groups.liquid or 0) > 0) + pos2.y = pos.y - 1 + local col_min = col_max and (n_def.walkable or (water and (n_def.groups.liquid or 0) > 0)) + if col_min then + return pos + else + pos2.y = pos.y + 1 + return pos2 + end + end +end + +function creatura.get_avoidance_lift(self, pos2, range) + range = ceil(max(range or 1, 0.5)) + local height_half = (self.height or 1) * 0.5 + local center_y = pos2.y + height_half + local check_pos = {x = pos2.x, y = center_y, z = pos2.z} + + -- Find ceiling and floor collisions + local def + local ceil_pos + local floor_pos + for i = 1, range, 0.5 do -- 0.5 increment increases accuracy + if ceil_pos and floor_pos then break end + check_pos.y = center_y + i + def = creatura.get_node_def(check_pos) + if not ceil_pos + and (def.walkable + or minetest.get_item_group(def.name, "liquid") > 0) then + ceil_pos = check_pos + end + check_pos.y = center_y - i + def = creatura.get_node_def(check_pos) + if not floor_pos + and (def.walkable + or minetest.get_item_group(def.name, "liquid") > 0) then + floor_pos = check_pos + end + end + + -- Calculate direction to average point of collisions + check_pos.y = center_y + local offset = {x = 0, y = height_half + range, z = 0} + if not ceil_pos then ceil_pos = vec_add(check_pos, offset) end + if not floor_pos then floor_pos = vec_sub(check_pos, offset) end + + local dist_up = ceil_pos.y - center_y + local dist_down = floor_pos.y - center_y + + local altitude = (dist_up + dist_down) / 2 + + return ((check_pos.y + altitude) - center_y) / range * 2 +end + +function creatura.get_avoidance_lift_aquatic(self, pos2, range) + range = ceil(max(range or 1, 0.5)) + local height_half = (self.height or 1) * 0.5 + local center_y = pos2.y + height_half + local check_pos = {x = pos2.x, y = center_y, z = pos2.z} + + -- Find ceiling and floor collisions + local ceil_pos + local floor_pos + for i = 1, range, 0.5 do -- 0.5 increment increases accuracy + if ceil_pos and floor_pos then break end + check_pos.y = center_y + i + if not ceil_pos + and minetest.get_item_group(creatura.get_node_def(check_pos).name, "liquid") < 1 then + ceil_pos = check_pos + end + check_pos.y = center_y - i + if not floor_pos + and minetest.get_item_group(creatura.get_node_def(check_pos).name, "liquid") < 1 then + floor_pos = check_pos + end + end + + -- Calculate direction to average point of collisions + check_pos.y = center_y + local offset = {x = 0, y = height_half + range, z = 0} + if not ceil_pos then ceil_pos = vec_add(check_pos, offset) end + if not floor_pos then floor_pos = vec_sub(check_pos, offset) end + + local dist_up = ceil_pos.y - center_y + local dist_down = floor_pos.y - center_y + + local altitude = (dist_up + dist_down) / 2 + + return ((check_pos.y + altitude) - center_y) / range * 2 +end + +---------------------------- +-- Context Based Steering -- +---------------------------- + +local steer_directions = { + vec_normal({x = 1, y = 0, z = 0}), + vec_normal({x = 1, y = 0, z = 1}), + vec_normal({x = 0, y = 0, z = 1}), + vec_normal({x = -1, y = 0, z = 0}), + vec_normal({x = -1, y = 0, z = -1}), + vec_normal({x = 0, y = 0, z = -1}), + vec_normal({x = 1, y = 0, z = -1}), + vec_normal({x = -1, y = 0, z = 1}) +} + +-- Context Methods + +function creatura.get_context_default(self, goal, steer_dir, interest, danger, range) + local pos = self.object:get_pos() + if not pos then return end + local width, height = self.width or 0.5, self.height or 1 + local y_offset = math.min(self.stepheight or 1.1, height) + pos.y = pos.y + y_offset + local collision + + local ray = minetest.raycast(pos, vec_add(pos, vec_multi(steer_dir, width + range)), false, false) + local pointed = ray:next() + if pointed + and pointed.type == "node" + and creatura.get_node_def(pointed.under).walkable then + collision = pointed.under + end + + if collision then + local dir2goal = vec_normal(vec_dir(pos, goal)) + local dir2col = vec_normal(vec_dir(pos, collision)) + local dist2col = vec_dist(pos, collision) - width + local dot_score = vec_dot(dir2col, dir2goal) + local dist_score = (range - dist2col) / range + interest = interest - dot_score + danger = dist_score + end + return interest, danger +end + +function creatura.get_context_large(self, goal, steer_dir, interest, danger, range) + local pos = self.object:get_pos() + if not pos then return end + local width, height = self.width or 0.5, self.height or 1 + local y_offset = math.min(self.stepheight or height) + pos.y = pos.y + y_offset + local collision = creatura.get_collision(self, steer_dir, range) + + if collision then + local dir2goal = vec_normal(vec_dir(pos, goal)) + local dir2col = vec_normal(vec_dir(pos, collision)) + local dist2col = vec_dist(pos, collision) - width + local dot_score = vec_dot(dir2col, dir2goal) + local dist_score = (range - dist2col) / range + interest = interest - dot_score + danger = dist_score + end + return interest, danger +end + +function creatura.get_context_small(self, goal, steer_dir, interest, danger, range) + local pos = self.object:get_pos() + if not pos then return end + pos = vector.round(pos) + local width = self.width or 0.5 + local collision = get_collision_single(vec_add(pos, steer_dir)) + + if collision then + local dir2goal = vec_normal(vec_dir(pos, goal)) + local dir2col = vec_normal(vec_dir(pos, collision)) + local dist2col = vec_dist(pos, collision) - width + local dot_score = vec_dot(dir2col, dir2goal) + local dist_score = (range - dist2col) / range + interest = interest - dot_score + danger = dist_score + end + return interest, danger +end + +function creatura.get_context_small_aquatic(self, goal, steer_dir, interest, danger, range) + local pos = self.object:get_pos() + if not pos then return end + pos = vector.round(pos) + local width = self.width or 0.5 + local pos2 = vec_add(pos, steer_dir) + local collision = minetest.get_item_group(get_node_def(pos2).name, "liquid") < 1 and pos2 + + if collision then + local dir2goal = vec_normal(vec_dir(pos, goal)) + local dir2col = vec_normal(vec_dir(pos, collision)) + local dist2col = vec_dist(pos, collision) - width + local dot_score = vec_dot(dir2col, dir2goal) + local dist_score = (range - dist2col) / range + interest = interest - dot_score + danger = dist_score + end + return interest, danger +end + +-- Calculate Steering + +function creatura.calc_steering(self, goal, get_context, range) + if not goal then return end + get_context = get_context or creatura.get_context_default + local pos, yaw = self.object:get_pos(), self.object:get_yaw() + if not pos or not yaw then return end + range = math.max(range or 2, 2) + local dir2goal = vec_normal(vec_dir(pos, goal)) + local output_dir = {x = 0, y = dir2goal.y, z = 0} + + -- Cached variables + local dir + for _, _dir in ipairs(steer_directions) do + dir = {x = _dir.x, y = dir2goal.y, z = _dir.z} + local score = vec_dot(dir2goal, dir) + local interest = clamp(score, 0, 1) + local danger = 0 + if interest > 0 then -- Direction is within 90 degrees of goal + interest, danger = get_context(self, goal, dir, interest, danger, range) + end + score = interest - danger + output_dir = vector.add(output_dir, vector.multiply(dir, score)) + end + return vec_normal(output_dir) +end + +-- DEPRECATED + +function creatura.get_context_steering(self, goal, range, water) + local context = creatura.get_context_default + local width, height = self.width, self.height + if width > 0.5 + or height > 1 then + context = creatura.get_context_large + elseif water then + context = creatura.get_context_small_aquatic + end + return creatura.calc_steering(self, goal, context, range) +end + +------------- +-- Actions -- +------------- + +-- Actions are more specific behaviors used +-- to compose a Utility. + +-- Move + +function creatura.action_move(self, pos2, timeout, method, speed_factor, anim) + local timer = timeout or 4 + local function func(_self) + timer = timer - _self.dtime + self:animate(anim or "walk") + local safe = true + if _self.max_fall + and _self.max_fall > 0 then + local pos = self.object:get_pos() + if not pos then return end + safe = _self:is_pos_safe(pos2) + end + if timer <= 0 + or not safe + or _self:move_to(pos2, method or "creatura:obstacle_avoidance", speed_factor or 0.5) then + return true + end + end + self:set_action(func) +end + +creatura.action_walk = creatura.action_move -- Support for outdated versions + +-- Idle + +function creatura.action_idle(self, time, anim) + local timer = time + local function func(_self) + _self:set_gravity(-9.8) + _self:halt() + _self:animate(anim or "stand") + timer = timer - _self.dtime + if timer <= 0 then + return true + end + end + self:set_action(func) +end + +-- Rotate on Z axis in random direction until 90 degree angle is reached + +function creatura.action_fallover(self) + local zrot = 0 + local init = false + local dir = 1 + local rot = self.object:get_rotation() + local function func(_self) + if not init then + _self:animate("stand") + if random(2) < 2 then + dir = -1 + end + init = true + end + rot = _self.object:get_rotation() + local goal = (pi * 0.5) * dir + local step = _self.dtime + if step > 0.5 then step = 0.5 end + zrot = zrot + (pi * dir) * step + _self.object:set_rotation({x = rot.x, y = rot.y, z = zrot}) + if (dir > 0 and zrot >= goal) + or (dir < 0 and zrot <= goal) then return true end + end + self:set_action(func) +end + +---------------------- +-- Movement Methods -- +---------------------- + +-- Pathfinding + +--[[local function trim_path(pos, path) + if #path < 2 then return end + local trim = false + local closest + for i = #path, 1, -1 do + if not path[i] then break end + if (closest + and vec_dist(pos, path[i]) > vec_dist(pos, path[closest])) + or trim then + table.remove(path, i) + trim = true + else + closest = i + end + end + return path +end]] + +creatura.register_movement_method("creatura:pathfind_theta", function(self) + local path = {} + local steer_to + local steer_int = 0 + local arrival_threshold = clamp(self.width, 0.5, 1) + + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + + if vec_dist(pos, goal) < arrival_threshold then + _self:halt() + return true + end + + -- Calculate Movement + local turn_rate = abs(_self.turn_rate or 5) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + local path_dir = #path > 0 and vec_dir(pos, path[2] or path[1]) + + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / math.max(speed, 1) + steer_to = path_dir or (steer_int <= 0 and creatura.calc_steering(_self, goal)) or steer_to + + path = (#path > 0 and path) or (creatura.pathfinder.find_path_theta(_self, pos, goal) or {}) + + if path_dir + and ((path[2] and vec_dist(pos, path[2]) < arrival_threshold) + or vec_dist(pos, path[1]) < arrival_threshold) then + table.remove(path, 1) + end + + -- Apply Movement + _self:turn_to(dir2yaw(steer_to or vec_dir(pos, goal)), turn_rate) + _self:set_forward_velocity(speed) + end + return func +end) + +creatura.register_movement_method("creatura:pathfind", function(self) + local path = {} + local steer_to + local steer_int = 0 + local arrival_threshold = clamp(self.width, 0.5, 1) + + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + + if vec_dist(pos, goal) < arrival_threshold then + _self:halt() + return true + end + + -- Calculate Movement + local turn_rate = abs(_self.turn_rate or 5) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + local path_dir = #path > 0 and vec_dir(pos, path[2] or path[1]) + + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / math.max(speed, 1) + steer_to = path_dir or (steer_int <= 0 and creatura.calc_steering(_self, goal)) or steer_to + + path = (#path > 0 and path) or (creatura.pathfinder.find_path(_self, pos, goal) or {}) + + if path_dir + and ((path[2] and vec_dist(pos, path[2]) < arrival_threshold + 0.5) + or vec_dist(pos, path[1]) < arrival_threshold) then + table.remove(path, 1) + end + + -- Apply Movement + _self:turn_to(dir2yaw(steer_to or vec_dir(pos, goal)), turn_rate) + _self:set_forward_velocity(speed) + end + return func +end) + + +-- Steering + +creatura.register_movement_method("creatura:steer_small", function(self) + local steer_to + local steer_int = 0 + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + if vec_dist(pos, goal) < clamp(self.width, 0.5, 1) then + _self:halt() + return true + end + -- Calculate Movement + local turn_rate = abs(_self.turn_rate or 5) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / math.max(speed, 1) + steer_to = (steer_int <= 0 and creatura.calc_steering(_self, goal)) or steer_to + -- Apply Movement + _self:turn_to(dir2yaw(steer_to or vec_dir(pos, goal)), turn_rate) + _self:set_forward_velocity(speed) + end + return func +end) + +creatura.register_movement_method("creatura:steer_large", function(self) + local steer_to + local steer_int = 0 + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + if vec_dist(pos, goal) < clamp(self.width, 0.5, 1) then + _self:halt() + return true + end + -- Calculate Movement + local turn_rate = abs(_self.turn_rate or 5) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / math.max(speed, 1) + steer_to = (steer_int <= 0 and creatura.calc_steering(_self, goal, creatura.get_context_large)) or steer_to + -- Apply Movement + _self:turn_to(dir2yaw(steer_to or vec_dir(pos, goal)), turn_rate) + _self:set_forward_velocity(speed) + end + return func +end) + +creatura.register_movement_method("creatura:walk_simple", function(self) + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + if vec_dist(pos, goal) < clamp(self.width, 0.5, 1) then + _self:halt() + return true + end + -- Calculate Movement + local turn_rate = abs(_self.turn_rate or 5) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + -- Apply Movement + _self:turn_to(dir2yaw(vec_dir(pos, goal)), turn_rate) + _self:set_forward_velocity(speed) + end + return func +end) + +-- Deprecated + +creatura.register_movement_method("creatura:context_based_steering", function(self) + local steer_to + local steer_int = 0 + self:set_gravity(-9.8) + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos or not goal then return end + if vec_dist(pos, goal) < clamp(self.width, 0.5, 1) then + _self:halt() + return true + end + -- Calculate Movement + local turn_rate = abs(_self.turn_rate or 5) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + steer_int = (steer_int > 0 and steer_int - _self.dtime) or 1 / math.max(speed, 1) + steer_to = (steer_int <= 0 and creatura.calc_steering(_self, goal, creatura.get_context_large)) or steer_to + -- Apply Movement + _self:turn_to(dir2yaw(steer_to or vec_dir(pos, goal)), turn_rate) + _self:set_forward_velocity(speed) + end + return func +end) + +creatura.register_movement_method("creatura:obstacle_avoidance", function(self) + local box = clamp(self.width, 0.5, 1.5) + local steer_to + local steer_timer = 0.25 + local function func(_self, goal, speed_factor) + local pos = _self.object:get_pos() + if not pos then return end + self:set_gravity(-9.8) + -- Return true when goal is reached + if vec_dist(pos, goal) < box * 1.33 then + _self:halt() + return true + end + steer_timer = (steer_timer > 0 and steer_timer - _self.dtime) or 0.25 + -- Get movement direction + steer_to = (steer_timer > 0 and steer_to) or (steer_timer <= 0 and get_avoidance_dir(_self)) + local goal_dir = steer_to or vec_dir(pos, goal) + pos.y = pos.y + goal_dir.y + local yaw = _self.object:get_yaw() + local goal_yaw = dir2yaw(goal_dir) + local speed = abs(_self.speed or 2) * speed_factor or 0.5 + local turn_rate = abs(_self.turn_rate or 5) + -- Movement + local yaw_diff = abs(diff(yaw, goal_yaw)) + if yaw_diff < pi * 0.25 + or steer_to then + _self:set_forward_velocity(speed) + else + _self:set_forward_velocity(speed * 0.33) + end + _self:turn_to(goal_yaw, turn_rate) + end + return func +end) + + diff --git a/mods/creatura/mob_meta.lua b/mods/creatura/mob_meta.lua new file mode 100644 index 00000000..c4585081 --- /dev/null +++ b/mods/creatura/mob_meta.lua @@ -0,0 +1,1248 @@ +-------------- +-- Mob Meta -- +-------------- + +-- Math -- + +local pi = math.pi +local pi2 = pi * 2 +local abs = math.abs +local floor = math.floor +local random = math.random + +local sin = math.sin +local cos = math.cos +local atan2 = math.atan2 + +local function diff(a, b) -- Get difference between 2 angles + return atan2(sin(b - a), cos(b - a)) +end + +local vec_dir = vector.direction +local vec_dist = vector.distance +local vec_multi = vector.multiply +local vec_sub = vector.subtract +local vec_add = vector.add +local vec_normal = vector.normalize + +local function vec_center(v) + return {x = floor(v.x + 0.5), y = floor(v.y + 0.5), z = floor(v.z + 0.5)} +end + +local function vec_raise(v, n) + return {x = v.x, y = v.y + n, z = v.z} +end + +local function get_sightline(pos1, pos2) + local dir = vec_dir(pos1, pos2) + local dist = vec_dist(pos1, pos2) + local pos + for i = 0, dist do + if dist > 0 then + pos = { + x = pos1.x + dir.x * (i / dist), + y = pos1.y + dir.y * (i / dist), + z = pos1.z + dir.z * (i / dist) + } + else + pos = pos1 + end + if creatura.get_node_def(pos).walkable then + return false + end + end + return true +end + +-- Local Utilities -- + +local function is_value_in_table(tbl, val) + for _, v in pairs(tbl) do + if v == val then + return true + end + end + return false +end + +------------------------- +-- Physics/Vitals Tick -- +------------------------- + +local mob = { + max_health = 20, + max_breath = 30, + fire_resistance = 0.5, + fall_resistance = 0, + armor_groups = {fleshy = 100}, + damage = 2, + speed = 4, + tracking_range = 16, + despawn_after = nil, + max_fall = 3, + stepheight = 1.1, + hitbox = { + width = 0.5, + height = 1 + }, + follow = {}, + fancy_collide = false, + liquid_submergence = 0.25, + liquid_drag = 1 + +} + +local mob_meta = {__index = mob} + +function mob:indicate_damage() + self._original_texture_mod = self._original_texture_mod or self.object:get_texture_mod() + self.object:set_texture_mod(self._original_texture_mod .. "^[colorize:#FF000040") + minetest.after(0.2, function() + if creatura.is_alive(self) then + self.object:set_texture_mod(self._original_texture_mod) + end + end) +end + +-- Set Movement Data + +function mob:move(pos, method, speed_factor, anim) + self._movement_data.goal = pos + self._movement_data.method = method + self._movement_data.last_neighbor = nil + self._movement_data.gravity = self._movement_data.gravity or -9.8 + self._movement_data.speed = (self.speed or 2) * (speed_factor or 1) + if anim then + self._movement_data.anim = anim + end +end + +-- Clear Movement Data + +function mob:halt() + self._movement_data = { + goal = nil, + method = nil, + func = nil, + last_neighbor = nil, + gravity = self._movement_data.gravity or -9.8, + speed = 0 + } + --self.object:set_velocity({x = 0, y = 0, z = 0}) + self._path_data = {} + self._tyaw = self.object:get_yaw() or 0 +end + +-- Turn to specified yaw + +local function interp_rad(a, b, w) + local cs = (1 - w) * cos(a) + w * cos(b) + local sn = (1 - w) * sin(a) + w * sin(b) + return atan2(sn, cs) +end + +local function turn(self, tyaw, rate) + rate = rate or 5 + local rot = self.object:get_rotation() + local yaw = self.object:get_yaw() + if not yaw then return end + local step = math.min(self.dtime * rate, abs(diff(yaw, tyaw)) % (pi2)) + rot.y = interp_rad(yaw, tyaw, step) + if rot.y ~= rot.y then return end + self.object:set_rotation(rot) +end + +function mob:turn_to(tyaw, rate) + if self.step_delay then + self._tyaw = tyaw + self._movement_data.turn_rate = rate or 5 + return + end + turn(self, tyaw, rate) +end + +function mob:do_turn() + if not self.step_delay then return end + local tyaw = self._tyaw + local rate = self._movement_data.turn_rate or 5 + if not tyaw then return end + turn(self, self._tyaw, rate) +end + +-- Set Gravity (default of -9.8) + +function mob:set_gravity(gravity) + self._movement_data.gravity = gravity or -9.8 +end + +-- Sets Velocity to desired speed in mobs current look direction + +function mob:set_forward_velocity(speed) + if self.step_delay then + self._movement_data.horz_vel = speed + else + local yaw = self.object:get_yaw() + local vel = self.object:get_velocity() + vel.x = sin(yaw) * -speed + vel.z = cos(yaw) * speed + self.object:set_velocity(vel) + end +end + +-- Sets Velocity on y axis + +function mob:set_vertical_velocity(speed) + if self.step_delay then + self._movement_data.vert_vel = speed + else + local vel = self.object:get_velocity() + vel.y = speed + self.object:set_velocity(vel) + end +end + +function mob:do_velocity() + if not self.step_delay then return end + local data = self._movement_data or {} + local vel = self.object:get_velocity() + local yaw = self.object:get_yaw() + if not vel or not yaw then return end + local horz_vel = data.horz_vel --or (data.gravity >= 0 and 0) + local vert_vel = data.vert_vel --or (data.gravity >= 0 and 0) + vel.x = (horz_vel and (sin(yaw) * -horz_vel)) or vel.x + vel.y = vert_vel or vel.y + vel.z = (horz_vel and (cos(yaw) * horz_vel)) or vel.z + self.object:set_velocity(vel) +end + +-- Applies knockback in 'dir' + +function mob:apply_knockback(dir, power) + if not dir then return end + power = power or 6 + local knockback = vec_multi(dir, power) + self.object:add_velocity(knockback) +end + +-- Punch 'target' + +function mob:punch_target(target) -- + target:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage or 5}, + }) +end + +-- Apply damage to mob + +function mob:hurt(health) + if self.protected then return end + self.hp = self.hp - math.ceil(health) + if self.hp < 0 then self.hp = 0 end +end + +-- Add HP to mob + +function mob:heal(health) + if self.protected then return end + self.hp = self.hp + math.ceil(health) + if self.hp > self.max_health then + self.hp = self.max_health + end +end + +-- Return position at center of mobs hitbox + +function mob:get_center_pos() + local pos = self.object:get_pos() + if not pos then return end + return vec_raise(pos, self.height * 0.5 or 0.5) +end + +-- Return true if position is within box + +function mob:pos_in_box(pos, size) + if not pos then return false end + local center = self:get_center_pos() + if not center then return false end + local width = size or self.width + local height = size or (self.height * 0.5) + if not size + and self.width < 0.5 then + width = 0.5 + end + local edge_a = { + x = center.x - width, + y = center.y - height, + z = center.z - width + } + local edge_b = { + x = center.x + width, + y = center.y + height, + z = center.z + width + } + local minp, maxp = vector.sort(edge_a, edge_b) + if pos.x >= minp.x + and pos.y >= minp.y + and pos.z >= minp.z + and pos.x <= maxp.x + and pos.y <= maxp.y + and pos.z <= maxp.z then + return true + end + return false +end + +-- Terrain Navigation -- + +function mob:get_wander_pos(min_range, max_range, dir) + local pos = vec_center(self.object:get_pos()) + pos.y = floor(pos.y + 0.5) + if creatura.get_node_def(pos).walkable then -- Occurs if small mob is touching a fence + local offset = vector.add(pos, vec_multi(vec_dir(pos, self.object:get_pos()), 1.5)) + pos.x = floor(offset.x + 0.5) + pos.z = floor(offset.z + 0.5) + pos = creatura.get_ground_level(pos, 1) + end + local width = self.width + local outset = random(min_range, max_range) + if width < 0.6 then width = 0.6 end + local move_dir = vec_normal({ + x = random(-10, 10) * 0.1, + y = 0, + z = random(-10, 10) * 0.1 + }) + local pos2 = vec_add(pos, vec_multi(move_dir, width)) + if creatura.get_node_def(pos2).walkable + and not dir then + for _ = 1, 3 do + move_dir = { + x = move_dir.z, + y = 0, + z = move_dir.x * -1 + } + pos2 = vec_add(pos, vec_multi(move_dir, width)) + if not creatura.get_node_def(pos2).walkable then + break + end + end + elseif dir then + move_dir = dir + end + for i = 1, outset do + local a_pos = vec_add(pos2, vec_multi(move_dir, i)) + local b_pos = {x = a_pos.x, y = a_pos.y - 1, z = a_pos.z} + if creatura.get_node_def(a_pos).walkable + or not creatura.get_node_def(b_pos).walkable then + a_pos = creatura.get_ground_level(a_pos, floor(self.stepheight or 1)) + end + if not creatura.get_node_def(a_pos).walkable then + pos2 = a_pos + else + break + end + end + return pos2 +end + +function mob:get_wander_pos_3d(min_range, max_range, dir, vert_bias) + local pos = vec_center(self.object:get_pos()) + if creatura.get_node_def(pos).walkable then -- Occurs if small mob is touching a fence + local offset = vector.add(pos, vec_multi(vec_dir(pos, self.object:get_pos()), 1.5)) + pos.x = floor(offset.x + 0.5) + pos.z = floor(offset.z + 0.5) + pos = creatura.get_ground_level(pos, 1) + end + local width = self.width + local outset = random(min_range, max_range) + if width < 0.6 then width = 0.6 end + local move_dir = vec_normal({ + x = random(-10, 10) * 0.1, + y = vert_bias or random(-10, 10) * 0.1, + z = random(-10, 10) * 0.1 + }) + local pos2 = vec_add(pos, vec_multi(move_dir, width)) + if creatura.get_node_def(pos2).walkable + and not dir then + for _ = 1, 3 do + move_dir = { + x = move_dir.z, + y = move_dir.y, + z = move_dir.x * -1 + } + pos2 = vec_add(pos, vec_multi(move_dir, width)) + if not creatura.get_node_def(pos2).walkable then + break + end + end + elseif dir then + move_dir = dir + end + for i = 1, outset do + local a_pos = vec_add(pos2, vec_multi(move_dir, i)) + if creatura.get_node_def(a_pos).walkable then + a_pos = creatura.get_ground_level(a_pos, floor(self.stepheight or 1)) + end + if not creatura.get_node_def(a_pos).walkable then + pos2 = a_pos + else + break + end + end + return pos2 +end + +function mob:is_pos_safe(pos, ignore_liquid) + if not pos then return end + local n_def = creatura.get_node_def(pos) + if minetest.get_item_group(n_def.name, "igniter") > 0 + or (not ignore_liquid + and (n_def.drawtype == "liquid" + or creatura.get_node_def(vec_raise(pos, -1)).drawtype == "liquid")) then return false end + local fall_safe = false + local fall_pos = {x = pos.x, y = floor(pos.y + 0.5), z = pos.z} + if self.max_fall ~= 0 then + for _ = 1, self.max_fall or 3 do + fall_pos.y = fall_pos.y - 1 + if creatura.get_node_def(fall_pos).walkable then + fall_safe = true + break + end + end + else + fall_safe = true + end + return fall_safe +end + +-- Set mobs animation (if specified animation isn't already playing) + +function mob:animate(animation, transition) + if not animation + or not self.animations[animation] then + return + end + + -- Handle Transition Data + local transition_data = self._anim_transition or {} + local parent_anim = transition_data.parent + local child_anim = transition_data.child + if child_anim + and animation == parent_anim + and transition == child_anim then + local timer = transition_data.timer + transition_data.timer = (timer > 0 and timer - self.dtime) or 0 + if timer <= 0 then + animation = child_anim + end + else + transition_data = {} + end + self._anim_transition = transition_data + + -- Set Animation + if not self._anim + or self._anim ~= animation + or (transition + and not transition_data.timer) then + local anim = self.animations[animation] + if anim[2] then anim = anim[random(#anim)] end + self.object:set_animation(anim.range, anim.speed, anim.frame_blend, anim.loop) + self._anim = animation + -- Set Transition Data + if transition + and (not transition_data.timer + or transition_data.timer > 0) then + local anim_length = (anim.range.y - anim.range.x) / anim.speed + self._anim_transition = { + parent = animation, + child = transition, + timer = anim_length + } + end + end + return animation +end + +-- Set texture to variable at 'id' index in 'tbl' or 'textures' + +function mob:set_texture(id, tbl) + local _table = self.textures + if tbl then + _table = tbl + end + if not _table + or not _table[id] then + return + end + local tex = _table[id] + if type(tex) == "table" then + self.object:set_properties({ + textures = {unpack(tex)} + }) + else + self.object:set_properties({ + textures = {tex} + }) + end + return _table[id] +end + +-- Set/reset mesh + +function mob:set_mesh(id) + local mesh = self.mesh + if mesh + and not self.meshes then + self.object:set_properties({ + mesh = mesh + }) + return mesh + end + local meshes = self.meshes or {} + if #meshes > 0 then + local mesh_no = id or self.mesh_no or random(#meshes) + self.object:set_properties({ + mesh = meshes[mesh_no] + }) + self.mesh_no = mesh_no + if self.mesh_textures then + self.textures = self.mesh_textures[mesh_no] + self.texture_no = random(#self.textures) + self:set_texture(self.texture_no, self.textures) + end + return meshes[mesh_no] + end +end + +-- Set scale to base scale times 'x' and update bordering positions + +function mob:set_scale(x) + local def = minetest.registered_entities[self.name] + local scale = def.visual_size or {x = 1, y = 1} + local box = def.collisionbox + local new_box = {} + for k, v in ipairs(box) do + new_box[k] = v * x + end + self.object:set_properties({ + visual_size = { + x = scale.x * x, + y = scale.y * x + }, + collisionbox = new_box + }) + --self._border = index_box_border(self) +end + +-- Fixes mob scale being changed when attached to a parent + +function mob:fix_attached_scale(parent) + local scale = self:get_visual_size() + local parent_size = parent:get_properties().visual_size + self.object:set_properties({ + visual_size = { + x = scale.x / parent_size.x, + y = scale.y / parent_size.y + }, + }) +end + +-- Add sets 'id' to 'val' in permanent data + +function mob:memorize(id, val) + self.perm_data[id] = val + return self.perm_data[id] +end + +-- Remove 'id' from permanent data + +function mob:forget(id) + self.perm_data[id] = nil +end + +-- Return value from 'id' in permanent data + +function mob:recall(id) + return self.perm_data[id] +end + +-- Return true on interval specified by 'n' + +function mob:timer(n) + local t1 = floor(self.active_time) + local t2 = floor(self.active_time + self.dtime) + if t2 > t1 and t2%n == 0 then return true end +end + +-- Play 'sound' from self.sounds + +function mob:play_sound(sound) + local spec = self.sounds and self.sounds[sound] + local parameters = {object = self.object} + + if type(spec) == "table" then + local name = spec.name + local pitch = 1.0 + + pitch = pitch - (random(-10, 10) * 0.005) + + parameters.gain = spec.gain or 1 + parameters.max_hear_distance = spec.distance or 8 + parameters.fade = spec.fade or 1 + parameters.pitch = pitch + return minetest.sound_play(name, parameters) + end + return minetest.sound_play(spec, parameters) +end + +-- Return current collisionbox + +function mob:get_hitbox() + if not self:get_props() then return self.collisionbox end + return self:get_props().collisionbox +end + +-- Return height of current collisionbox + +function mob:get_height() + local hitbox = self:get_hitbox() + return hitbox[5] - hitbox[2] +end + +-- Return current visual size + +function mob:get_visual_size() + if not self:get_props() then return end + return self:get_props().visual_size +end + +local function is_group_in_table(tbl, name) + for _, v in pairs(tbl) do + if type(v) == "string" + and minetest.get_item_group(name, v:split(":")[2]) > 0 then + return true + end + end + return false +end + +function mob:follow_wielded_item(player) + if not player + or not self.follow then return end + local item = player:get_wielded_item() + local name = item:get_name() + if type(self.follow) == "string" + and (name == self.follow + or minetest.get_item_group(name, self.follow:split(":")[2]) > 0) then + return item, name + end + if type(self.follow) == "table" + and (is_value_in_table(self.follow, name) + or is_group_in_table(self.follow, name)) then + return item, name + end +end + +function mob:follow_item(stack) + if not stack + or not self.follow then return end + local name = stack:get_name() + if type(self.follow) == "string" + and (name == self.follow + or minetest.get_item_group(name, self.follow:split(":")[2]) > 0) then + return stack, name + end + if type(self.follow) == "table" + and (is_value_in_table(self.follow, name) + or is_group_in_table(self.follow, name)) then + return stack, name + end +end + +function mob:get_target(target) + local alive = creatura.is_alive(target) + if not alive then + return false, false, nil + end + if type(target) == "table" then + target = target.object + end + local pos = self:get_center_pos() + if not pos then return false, false, nil end + local tpos = target:get_pos() + tpos.y = floor(tpos.y + 0.5) + local line_of_sight = get_sightline(pos, tpos) + return true, line_of_sight, tpos +end + +function mob:store_nearby_objects(radius) + local pos = self.object:get_pos() + if not pos then return end + local track_radius = self.tracking_range or 8 + if track_radius < 8 then track_radius = 8 end + local objects = minetest.get_objects_inside_radius(pos, radius or track_radius) + if #objects < 1 then return end + local objs = {} + for _, object in ipairs(objects) do + if creatura.is_alive(object) + and object ~= self.object then + local ent = object:get_luaentity() + local player = object:is_player() + if (ent + and not ent._ignore) + or player then + table.insert(objs, object) + end + end + end + self._nearby_objs = objs + return objs +end + +function mob:get_props() + local props = self.properties or self.object and self.object:get_properties() + self.properties = props + return props +end + +-- Actions + +function mob:set_action(func) + self._action = func +end + +function mob:get_action() + if type(self._action) ~= "table" then + return self._action + end + return nil +end + +function mob:clear_action() + self._action = {} + self._movement_data.goal = nil + self._movement_data.func = nil +end + +function mob:set_utility(func) + if not self._utility_data then return end + self._utility_data.func = func +end + +function mob:get_utility() + if not self._utility_data then return end + return self._utility_data.utility +end + +function mob:initiate_utility(utility, ...) + local func = creatura.registered_utilities[utility] + if not func or not self._utility_data then return end + self._utility_data.utility = utility + self:clear_action() + func(...) +end + +function mob:set_utility_score(n) + if not self._utility_data then return end + self._utility_data.score = n or 0 +end + +function mob:get_utility_score() + return (self._utility_data and self._utility_data.score) or 0 +end + +function mob:try_initiate_utility(utility, score, ...) + if self._utility_data + and score >= self._utility_data.score then + self:initiate_utility(utility, ...) + self:set_utility_score(score) + end +end + +function mob:clear_utility() + self._utility_data = { + utility = nil, + func = nil, + score = 0 + } +end + +-- Functions + +function mob:activate(staticdata, dtime) + self:get_props() + self.width = self:get_hitbox()[4] or 0.5 + self.height = self:get_height() or 1 + self._tyaw = self.object:get_yaw() + self.last_yaw = self.object:get_yaw() + self.in_liquid = false + self.is_falling = false + self.touching_ground = false + + -- Backend Data (Should not be modified unless modder knows what they're doing) + self._movement_data = { + goal = nil, + method = nil, + func = nil, + last_neighbor = nil, + gravity = -9.8, + speed = 0 + } + self._path_data = {} + self._path = {} + self._task = {} + self._action = {} + + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + + if node + and minetest.get_item_group(node.name, "liquid") > 0 then + self.in_liquid = node.name + end + + -- Staticdata + local data = minetest.deserialize(staticdata) + + if data then + local tp + for k, v in pairs(data) do + tp = type(v) + if tp ~= "function" + and tp ~= "nil" + and tp ~= "userdata" then + self[k] = v + end + end + end + + -- Initialize Stats and Visuals + if self.meshes + and #self.meshes > 0 then + if not self.mesh_no + or not self.meshes[self.mesh_no] then + self.mesh_no = random(#self.meshes) + end + self:set_mesh(self.mesh_no) + end + + if not self.textures then + local textures = self:get_props().textures + if textures then self.textures = textures end + end + + if not self.perm_data then + if self.memory then + self.perm_data = self.memory + else + self.perm_data = {} + end + if #self.textures > 0 then self.texture_no = random(#self.textures) end + end + + self.active_time = self:recall("active_time") or 0 + + if self:recall("despawn_after") ~= nil then + self.despawn_after = self:recall("despawn_after") + end + self._despawn = self:recall("_despawn") or nil + + if self._despawn + and self.despawn_after + and self.object then + self.object:remove() + return + end + + self._breath = self:recall("_breath") or (self.max_breath or 30) + --self._border = index_box_border(self) + + if self.textures + and self.texture_no then + if not self.textures[self.texture_no] then + self.texture_no = random(#self.textures) + end + self:set_texture(self.texture_no, self.textures) + end + + self.max_health = self.max_health or 10 + self.hp = self.hp or self.max_health + + if type(self.armor_groups) ~= "table" then + self.armor_groups = {} + end + self.armor_groups.immortal = 1 + self.object:set_armor_groups(self.armor_groups) + + if self.timer + and type(self.timer) == "number" then -- fix crash for converted mobs_redo mobs + self.timer = function(_self, n) + local t1 = floor(_self.active_time) + local t2 = floor(_self.active_time + _self.dtime) + if t2 > t1 and t2%n == 0 then return true end + end + end + + self:store_nearby_objects() + + if self.activate_func then + self:activate_func(self, staticdata, dtime) + end +end + +function mob:staticdata() + local data = {} + data.perm_data = self.perm_data + data.hp = self.hp or self.max_health + data.texture_no = self.texture_no or random(#self.textures) + data.mesh_no = self.mesh_no or (self.meshes and random(#self.meshes)) + return minetest.serialize(data) +end + +function mob:on_step(dtime, moveresult) + if not self.hp then return end + self.last_yaw = self.object:get_yaw() + self.stand_pos = self.object:get_pos() + if not self.stand_pos then return end + self.stand_pos.y = self.stand_pos.y + 0.01 + self.stand_node = self.stand_node or minetest.get_node(self.stand_pos) + self.dtime = dtime or 0.09 + self.moveresult = moveresult or {} + self.touching_ground = false + if moveresult then + self.touching_ground = moveresult.touching_ground + end + local prop_tick = self._prop_tick or 0 + prop_tick = prop_tick - 1 + if prop_tick <= 0 then + self.stand_node = minetest.get_node(self.stand_pos) + prop_tick = 6 + end + if self:timer(1) then + self.width = self:get_hitbox()[4] or 0.5 + self.height = self:get_height() or 1 + end + if self._vitals then + self:_vitals() + end + if self._physics then + self:_physics(moveresult) + end + self._prop_tick = prop_tick + if self:timer(10) then self:store_nearby_objects() end -- Reduce expensive calls + self:do_velocity() + self:do_turn() + if self.utility_stack + and self._execute_utilities then + self:_execute_utilities() + end + -- Die + if self.hp <= 0 + and self.death_func then + self:death_func() + self:halt() + return + end + if self.step_func + and self.perm_data then + self:step_func(dtime, moveresult) + end + self.properties = nil + self.active_time = self.active_time + dtime + self:memorize("active_time", self.active_time) + if self.despawn_after then + local despawn = math.floor(self.active_time / self.despawn_after) + if despawn > 1 then self.object:remove() return end + if despawn > 0 + and not self._despawn then + self._despawn = self:memorize("_despawn", true) + end + end +end + +function mob:on_deactivate(removal) + self._task = {} + self._action = {} + if self.deactivate_func then + self:deactivate_func(removal) + end +end + +---------------- +-- Object API -- +---------------- + +-- Physics + +local function collision_detection(self) + if not creatura.is_alive(self) + or self.fancy_collide == false then return end + local pos = self.stand_pos + local width = self.width + 0.25 + local objects = minetest.get_objects_in_area(vec_sub(pos, width), vec_add(pos, width)) + if #objects < 2 then return end + local pos2 + local dir + local vel, vel2 + for i = 2, #objects do + local object = objects[i] + if creatura.is_alive(object) + and not self.object:get_attach() + and not object:get_attach() then + if i > 5 then break end + pos2 = object:get_pos() + dir = vec_dir(pos, pos2) + dir.y = 0 + if dir.x == 0 and dir.z == 0 then + dir = vector.new(random(-1, 1) * random(), 0, + random(-1, 1) * random()) + end + vel = vec_multi(dir, 1.5) + vel2 = vec_multi(dir, -2) -- multiplying by -2 accounts for friction + self.object:add_velocity(vel2) + object:add_velocity(vel) + end + end +end + +local mob_friction = 7 + +function mob:_physics() + -- Physics + creatura.default_water_physics(self) + collision_detection(self) + + -- Cache Environment Info + local in_liquid = self.in_liquid + local on_ground = self.touching_ground + if not in_liquid + and not on_ground then + self.is_falling = true + else + self.is_falling = false + end + local move_data = self._movement_data + if not in_liquid + --and not move_data.func + and move_data.gravity ~= 0 then + local vel = self.object:get_velocity() + local friction = math.min(self.dtime * mob_friction, 0.5) + local nvel = {x = vel.x * (1 - friction), y = vel.y, z = vel.z * (1 - friction)} + self.object:set_velocity(nvel) + end +end + +-- Movement Control + +function mob:move_to(goal, method, speed_factor) + local get_method = creatura.registered_movement_methods[method] + local data = self._movement_data + if get_method + and not data.func then + self._movement_data.func = get_method(self, goal, speed_factor) + return self._movement_data.func(self, goal, speed_factor) + end + if data.func then + local move = data.func + return move(self, goal, speed_factor) + end +end + +-- Execute Actions + +local function tbl_equals(tbl1, tbl2) + local match = true + for k, v in pairs(tbl1) do + if not tbl2[k] + and tbl2[k] ~= v then + match = false + break + end + end + return match +end + +function mob:_execute_utilities() + local is_alive = self.hp > 0 + if not self._utility_data then + self._utility_data = { + utility = nil, + func = nil, + step_delay = nil, + score = 0 + } + end + if not self._util_cooldown then + self._util_cooldown = {} + end + local loop_data = { + utility = nil, + func = nil, + step_delay = nil, + score = 0 + } + if (self:timer(self.util_timer or 1) + or not self._utility_data.func) + and is_alive then + local util_data = self._utility_data + local util_stack = self.utility_stack + local utility + local get_score + local cooldown + local step_delay + local score, args + for i = 1, #util_stack do + utility = util_stack[i].utility + get_score = util_stack[i].get_score + cooldown = self._util_cooldown[i] or 0 + step_delay = util_stack[i].step_delay + score, args = get_score(self) + + if cooldown > 0 then + cooldown = cooldown - (self.util_timer or 1) + end + + if util_data.utility + and utility == util_data.utility + and util_data.score > 0 + and score <= 0 then + self._utility_data = { + utility = nil, + func = nil, + step_delay = nil, + score = 0 + } + util_data = self._utility_data + end + + if score > 0 + and score >= util_data.score + and score >= loop_data.score + and cooldown <= 0 then + loop_data = { + utility = utility, + score = score, + util_no = i, + step_delay = step_delay, + args = args + } + end + + self._util_cooldown[i] = cooldown + end + end + + if loop_data.utility + and loop_data.args then + if not self._utility_data + or not self._utility_data.args then + self._utility_data = loop_data + else + local no_data = not self._utility_data.utility and not self._utility_data.args + local same_args = tbl_equals(self._utility_data.args, loop_data.args) + local new_util = self._utility_data.utility ~= loop_data.utility or not same_args + if no_data + or new_util then -- if utilities are different or utilities are the same and args are different set new data + self._utility_data = loop_data + end + end + end + + if self._utility_data.utility then -- If a utility is currently selected + local util_data = self._utility_data + if not util_data.func then + self:initiate_utility(util_data.utility, unpack(util_data.args)) + end + local func = util_data.func + if util_data.step_delay + and self.hp > 0 then + self.step_delay = util_data.step_delay + else + self.step_delay = nil + self._step_delay = 0 + end + local step_delay = self.step_delay and (self._step_delay or 0) + if not func then return end + if step_delay then + if step_delay > 0 then + self._step_delay = step_delay - self.dtime + return + else + self._step_delay = self.step_delay + end + end + local dtime = self.dtime + self.dtime = dtime + (self.step_delay or 0) + if self.horz_vel + and self.horz_vel ~= 0 then + self:set_forward_velocity(nil) + end + if self.vert_vel + and self.vert_vel ~= 0 then + self:set_vertical_velocity(nil) + end + local func_complete, func_cooldown = func(self) + if func_complete then + if util_data.util_no then + self._util_cooldown[util_data.util_no] = func_cooldown + end + self._utility_data = { + utility = nil, + func = nil, + score = 0 + } + self:clear_action() + end + local action = self._action + if action + and type(action) ~= "table" then + if action(self) then + self:clear_action() + end + end + self.dtime = dtime + end +end + +-- Vitals + +function creatura.register_mob(name, def) + local box_width = def.hitbox and def.hitbox.width or 0.5 + local box_height = def.hitbox and def.hitbox.height or 1 + local hitbox = {-box_width, 0, -box_width, box_width, box_height, box_width} + + def.physical = def.physical or true + def.collide_with_objects = def.collide_with_objects or false + def.visual = "mesh" + def.mesh = def.mesh or (def.meshes and def.meshes[1]) + def.makes_footstep_sound = def.makes_footstep_sound or false + if def.static_save ~= false then + def.static_save = true + end + def.collisionbox = def.collisionbox or hitbox + def._creatura_mob = true + + def.sounds = def.sounds or {} + + if not def.sounds.hit then + def.sounds.hit = { + name = "creatura_hit", + gain = 0.5, + distance = 16, + variations = 3 + } + end + + def._vitals = def._vitals or creatura.default_vitals + + def.on_activate = function(self, staticdata, dtime) + return self:activate(staticdata, dtime) + end + + def.get_staticdata = function(self) + return self:staticdata(self) + end + + minetest.register_entity(name, setmetatable(def, mob_meta)) +end diff --git a/mods/creatura/mod.conf b/mods/creatura/mod.conf new file mode 100644 index 00000000..e126b904 --- /dev/null +++ b/mods/creatura/mod.conf @@ -0,0 +1,2 @@ +name = creatura +description = A performant, semi-modular mob API \ No newline at end of file diff --git a/mods/creatura/pathfinder_deprecated.lua b/mods/creatura/pathfinder_deprecated.lua new file mode 100644 index 00000000..6c7aa648 --- /dev/null +++ b/mods/creatura/pathfinder_deprecated.lua @@ -0,0 +1,805 @@ +----------------- +-- Pathfinding -- +----------------- + +local a_star_alloted_time = tonumber(minetest.settings:get("creatura_a_star_alloted_time")) or 500 +local theta_star_alloted_time = tonumber(minetest.settings:get("creatura_theta_star_alloted_time")) or 700 + +local floor = math.floor +local abs = math.abs + +local vec_dist, vec_round = vector.distance, vector.round + +local moveable = creatura.is_pos_moveable + +local function get_distance(start_pos, end_pos) + local distX = abs(start_pos.x - end_pos.x) + local distZ = abs(start_pos.z - end_pos.z) + + if distX > distZ then + return 14 * distZ + 10 * (distX - distZ) + else + return 14 * distX + 10 * (distZ - distX) + end +end + +local function get_distance_to_neighbor(start_pos, end_pos) + local distX = abs(start_pos.x - end_pos.x) + local distY = abs(start_pos.y - end_pos.y) + local distZ = abs(start_pos.z - end_pos.z) + + if distX > distZ then + return (14 * distZ + 10 * (distX - distZ)) * (distY + 1) + else + return (14 * distX + 10 * (distZ - distX)) * (distY + 1) + end +end + +local function is_on_ground(pos) + local ground = { + x = pos.x, + y = pos.y - 1, + z = pos.z + } + if creatura.get_node_def(ground).walkable then + return true + end + return false +end + +local function vec_raise(v, n) + return {x = v.x, y = v.y + n, z = v.z} +end + +local function get_line_of_sight(a, b) + local steps = floor(vec_dist(a, b)) + local line = {} + + for i = 0, steps do + local pos + + if steps > 0 then + pos = { + x = a.x + (b.x - a.x) * (i / steps), + y = a.y + (b.y - a.y) * (i / steps), + z = a.z + (b.z - a.z) * (i / steps) + } + else + pos = a + end + table.insert(line, pos) + end + + if #line < 1 then + return false + else + for i = 1, #line do + local node = minetest.get_node(line[i]) + if creatura.get_node_def(node.name).walkable then + return false + end + end + end + return true +end + +-- Find a path from start to goal + +--[[local function debugpart(pos, time, tex) + minetest.add_particle({ + pos = pos, + texture = tex or "creatura_particle_red.png", + expirationtime = time or 0.1, + glow = 6, + size = 12 + }) +end]] + +local c_air = minetest.get_content_id("air") + +local function is_pos_moveable_vm(pos, width, height, area, data) + pos = vector.round(pos) + local pos1 = { + x = pos.x - math.ceil(width), + y = pos.y, + z = pos.z - math.ceil(width) + } + local pos2 = { + x = pos.x + math.ceil(width), + y = pos.y + math.ceil(height), + z = pos.z + math.ceil(width) + } + for z = pos1.z, pos2.z do + for y = pos1.y, pos2.y do + for x = pos1.x, pos2.x do + if not area:contains(x, y, z) then return false end + local vi = area:index(x, y, z) + local c = data[vi] + if c ~= c_air then + local c_name = minetest.get_name_from_content_id(c) + if creatura.get_node_def(c_name).walkable then + return false + end + end + end + end + end + return true +end + +local vm_buffer = {} + +function creatura.find_lvm_path(self, start, goal, obj_width, obj_height, max_open, climb, fly, swim) + climb = climb or false + fly = fly or false + swim = swim or false + + if vec_dist(start, goal) > (self.tracking_range or 128) then return {} end + + self._path_data.start = start + + local path_neighbors = { + {x = 1, y = 0, z = 0}, + {x = 1, y = 0, z = 1}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = -1, y = 0, z = -1}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = -1} + } + + if climb then + table.insert(path_neighbors, {x = 0, y = 1, z = 0}) + end + + if fly + or swim then + path_neighbors = { + -- Central + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + -- Directly Up or Down + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0} + } + end + + + local function get_neighbors(pos, width, height, tbl, open, closed, vm_area, vm_data) + local result = {} + for i = 1, #tbl do + local neighbor = vector.add(pos, tbl[i]) + if not vm_area or not vm_data or not vm_area:containsp(neighbor) then return end + local can_move = (not swim and get_line_of_sight({x = pos.x, y = neighbor.y, z = pos.z}, neighbor)) or true + if open[minetest.hash_node_position(neighbor)] + or closed[minetest.hash_node_position(neighbor)] then + can_move = false + end + if can_move then + can_move = is_pos_moveable_vm(neighbor, width, height, vm_area, vm_data) + if not fly and not swim then + if not can_move then -- Step Up + local step = vec_raise(neighbor, 1) + can_move = is_pos_moveable_vm(vec_round(step), width, height, vm_area, vm_data) + neighbor = vec_round(step) + else + local step = creatura.get_ground_level(vector.new(neighbor), 1) + if step.y < neighbor.y + and is_pos_moveable_vm(vec_round(step), width, height, vm_area, vm_data) then + neighbor = step + end + end + end + end + if vector.equals(neighbor, goal) then + can_move = true + end + if can_move + and (not swim + or creatura.get_node_def(neighbor).drawtype == "liquid") then + table.insert(result, neighbor) + end + end + return result + end + + local function find_path(_start, _goal) + local us_time = minetest.get_us_time() + + _start = { + x = floor(_start.x + 0.5), + y = floor(_start.y + 0.5), + z = floor(_start.z + 0.5) + } + + _goal = { + x = floor(_goal.x + 0.5), + y = floor(_goal.y + 0.5), + z = floor(_goal.z + 0.5) + } + + if _goal.x == _start.x + and _goal.z == _start.z then -- No path can be found + return nil + end + + local vm_area = self._path_data.vm_area + local vm_data = self._path_data.vm_data + + if not vm_area + or not vm_data then + local vm_center = vector.add(_start, vector.divide(vector.subtract(_goal, _start), 2)) + local vm_size = vec_dist(_goal, _start) + if vm_size < 24 then vm_size = 24 end + local e1 = vector.subtract(vm_center, vm_size) + local e2 = vector.add(vm_center, vm_size) + local vm = minetest.get_voxel_manip(e1, e2) + e1, e2 = vm:read_from_map(e1, e2) + vm_area = VoxelArea:new{MinEdge=e1, MaxEdge=e2} + vm_data = vm:get_data(vm_buffer) + end + + local openSet = self._path_data.open or {} + + local closedSet = self._path_data.closed or {} + + local start_index = minetest.hash_node_position(_start) + + openSet[start_index] = { + pos = _start, + parent = nil, + gScore = 0, + fScore = get_distance(_start, _goal) + } + + local count = self._path_data.count or 1 + + while count > 0 do + -- Initialize ID and data + local current_id, current = next(openSet) + + -- Find lowest f cost + for i, v in pairs(openSet) do + if v.fScore < current.fScore then + current_id = i + current = v + end + end + + -- Add lowest fScore to closedSet and remove from openSet + openSet[current_id] = nil + closedSet[current_id] = current + + self._path_data.open = openSet + self._path_data.closedSet = closedSet + + local current_start = vec_round(self._path_data.start) + + if closedSet[minetest.hash_node_position(current_start)] then + start_index = minetest.hash_node_position(current_start) + end + + -- Reconstruct path if end is reached + if ((is_on_ground(_goal) + or fly) + and current_id == minetest.hash_node_position(_goal)) + or (not fly + and not is_on_ground(_goal) + and math.abs(_goal.x - current.pos.x) < 1.1 + and math.abs(_goal.z - current.pos.z) < 1.1) then + local path = {} + local fail_safe = 0 + for _ in pairs(closedSet) do + fail_safe = fail_safe + 1 + end + repeat + if not closedSet[current_id] then return end + table.insert(path, closedSet[current_id].pos) + current_id = closedSet[current_id].parent + until current_id == start_index or #path >= fail_safe + if not closedSet[current_id] then self._path_data = {} return nil end + table.insert(path, closedSet[current_id].pos) + local reverse_path = {} + repeat table.insert(reverse_path, table.remove(path)) until #path == 0 + self._path_data = {} + return reverse_path + end + + count = count - 1 + + local adjacent = get_neighbors( + current.pos, + obj_width, + obj_height, + path_neighbors, + openSet, + closedSet, + vm_area, + vm_data + ) + + -- Go through neighboring nodes + if not adjacent or #adjacent < 1 then self._path_data = {} return {} end + for i = 1, #adjacent do + local neighbor = { + pos = adjacent[i], + parent = current_id, + gScore = 0, + fScore = 0 + } + local temp_gScore = current.gScore + get_distance_to_neighbor(current.pos, neighbor.pos) + local new_gScore = 0 + if openSet[minetest.hash_node_position(neighbor.pos)] then + new_gScore = openSet[minetest.hash_node_position(neighbor.pos)].gScore + end + if (temp_gScore < new_gScore + or not openSet[minetest.hash_node_position(neighbor.pos)]) + and not closedSet[minetest.hash_node_position(neighbor.pos)] then + if not openSet[minetest.hash_node_position(neighbor.pos)] then + count = count + 1 + end + local hCost = get_distance_to_neighbor(neighbor.pos, _goal) + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + openSet[minetest.hash_node_position(neighbor.pos)] = neighbor + end + end + if minetest.get_us_time() - us_time > a_star_alloted_time then + self._path_data = { + start = _start, + open = openSet, + closed = closedSet, + count = count, + vm_area = vm_area, + vm_data = vm_data + } + return {} + end + if count > (max_open or 100) then + self._path_data = {} + return + end + end + self._path_data = {} + return nil + end + return find_path(start, goal) +end + +function creatura.find_path(self, start, goal, obj_width, obj_height, max_open, climb, fly, swim) + climb = climb or false + fly = fly or false + swim = swim or false + + start = self._path_data.start or start + + self._path_data.start = start + + local path_neighbors = { + {x = 1, y = 0, z = 0}, + {x = 1, y = 0, z = 1}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = -1, y = 0, z = -1}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = -1} + } + + if climb then + table.insert(path_neighbors, {x = 0, y = 1, z = 0}) + end + + if fly + or swim then + path_neighbors = { + -- Central + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + -- Directly Up or Down + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0} + } + end + + local function get_neighbors(pos, width, height, tbl, open, closed) + local result = {} + for i = 1, #tbl do + local neighbor = vector.add(pos, tbl[i]) + local can_move = (not swim and get_line_of_sight({x = pos.x, y = neighbor.y, z = pos.z}, neighbor)) or true + if open[minetest.hash_node_position(neighbor)] + or closed[minetest.hash_node_position(neighbor)] then + can_move = false + end + if can_move then + can_move = moveable(neighbor, width, height) + if not fly and not swim then + if not can_move then -- Step Up + local step = vec_raise(neighbor, 1) + can_move = moveable(vec_round(step), width, height) + neighbor = vec_round(step) + else + local step = creatura.get_ground_level(vector.new(neighbor), 1) + if step.y < neighbor.y + and moveable(vec_round(step), width, height) then + neighbor = step + end + end + end + end + if vector.equals(neighbor, goal) then + can_move = true + end + if can_move + and (not swim + or creatura.get_node_def(neighbor).drawtype == "liquid") then + table.insert(result, neighbor) + end + end + return result + end + + local function find_path(_start, _goal) + local us_time = minetest.get_us_time() + + _start = { + x = floor(_start.x + 0.5), + y = floor(_start.y + 0.5), + z = floor(_start.z + 0.5) + } + + _goal = { + x = floor(_goal.x + 0.5), + y = floor(_goal.y + 0.5), + z = floor(_goal.z + 0.5) + } + + if _goal.x == _start.x + and _goal.z == _start.z then -- No path can be found + return nil + end + + local openSet = self._path_data.open or {} + + local closedSet = self._path_data.closed or {} + + local start_index = minetest.hash_node_position(_start) + + openSet[start_index] = { + pos = _start, + parent = nil, + gScore = 0, + fScore = get_distance(_start, _goal) + } + + local count = self._path_data.count or 1 + + while count > 0 do + if minetest.get_us_time() - us_time > a_star_alloted_time then + self._path_data = { + start = _start, + open = openSet, + closed = closedSet, + count = count + } + return + end + -- Initialize ID and data + local current_id, current = next(openSet) + + -- Find lowest f cost + for i, v in pairs(openSet) do + if v.fScore < current.fScore then + current_id = i + current = v + end + end + + -- Add lowest fScore to closedSet and remove from openSet + openSet[current_id] = nil + closedSet[current_id] = current + + self._path_data.open = openSet + self._path_data.closedSet = closedSet + + -- Reconstruct path if end is reached + if ((is_on_ground(_goal) + or fly) + and current_id == minetest.hash_node_position(_goal)) + or (not fly + and not is_on_ground(_goal) + and _goal.x == current.pos.x + and _goal.z == current.pos.z) then + local path = {} + local fail_safe = 0 + for _ in pairs(closedSet) do + fail_safe = fail_safe + 1 + end + repeat + if not closedSet[current_id] then return end + table.insert(path, closedSet[current_id].pos) + current_id = closedSet[current_id].parent + until current_id == start_index or #path >= fail_safe + if not closedSet[current_id] then self._path_data = {} return nil end + table.insert(path, closedSet[current_id].pos) + local reverse_path = {} + repeat table.insert(reverse_path, table.remove(path)) until #path == 0 + self._path_data = {} + return reverse_path + end + + count = count - 1 + + local adjacent = get_neighbors(current.pos, obj_width, obj_height, path_neighbors, openSet, closedSet) + + -- Go through neighboring nodes + for i = 1, #adjacent do + local neighbor = { + pos = adjacent[i], + parent = current_id, + gScore = 0, + fScore = 0 + } + local temp_gScore = current.gScore + get_distance_to_neighbor(current.pos, neighbor.pos) + local new_gScore = 0 + if openSet[minetest.hash_node_position(neighbor.pos)] then + new_gScore = openSet[minetest.hash_node_position(neighbor.pos)].gScore + end + if (temp_gScore < new_gScore + or not openSet[minetest.hash_node_position(neighbor.pos)]) + and not closedSet[minetest.hash_node_position(neighbor.pos)] then + if not openSet[minetest.hash_node_position(neighbor.pos)] then + count = count + 1 + end + local hCost = get_distance_to_neighbor(neighbor.pos, _goal) + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + openSet[minetest.hash_node_position(neighbor.pos)] = neighbor + end + end + if count > (max_open or 100) then + self._path_data = {} + return + end + end + self._path_data = {} + return nil + end + return find_path(start, goal) +end + +------------ +-- Theta* -- +------------ + +function creatura.find_theta_path(self, start, goal, obj_width, obj_height, max_open, climb, fly, swim) + climb = climb or false + fly = fly or false + swim = swim or false + + start = self._path_data.start or start + + self._path_data.start = start + + local path_neighbors = { + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + } + + if climb then + table.insert(path_neighbors, {x = 0, y = 1, z = 0}) + end + + if fly + or swim then + path_neighbors = { + -- Central + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + -- Directly Up or Down + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0} + } + end + + local function get_neighbors(pos, width, height, tbl, open, closed) + local result = {} + for i = 1, #tbl do + local neighbor = vector.add(pos, tbl[i]) + if neighbor.y == pos.y + and not fly + and not swim then + neighbor = creatura.get_ground_level(neighbor, 1) + end + local can_move = get_line_of_sight({x = pos.x, y = neighbor.y, z = pos.z}, neighbor) + if swim then + can_move = true + end + if not moveable(vec_raise(neighbor, -0.49), width, height) then + can_move = false + if neighbor.y == pos.y + and moveable(vec_raise(neighbor, 0.51), width, height) then + neighbor = vec_raise(neighbor, 1) + can_move = true + end + end + if vector.equals(neighbor, goal) then + can_move = true + end + if open[minetest.hash_node_position(neighbor)] + or closed[minetest.hash_node_position(neighbor)] then + can_move = false + end + if can_move + and ((is_on_ground(neighbor) + or (fly or swim)) + or (neighbor.x == pos.x + and neighbor.z == pos.z + and climb)) + and (not swim + or creatura.get_node_def(neighbor).drawtype == "liquid") then + table.insert(result, neighbor) + end + end + return result + end + + local function find_path(_start, _goal) + local us_time = minetest.get_us_time() + + _start = { + x = floor(_start.x + 0.5), + y = floor(_start.y + 0.5), + z = floor(_start.z + 0.5) + } + + _goal = { + x = floor(_goal.x + 0.5), + y = floor(_goal.y + 0.5), + z = floor(_goal.z + 0.5) + } + + if _goal.x == _start.x + and _goal.z == _start.z then -- No path can be found + return nil + end + + local openSet = self._path_data.open or {} + + local closedSet = self._path_data.closed or {} + + local start_index = minetest.hash_node_position(_start) + + openSet[start_index] = { + pos = _start, + parent = nil, + gScore = 0, + fScore = get_distance(_start, _goal) + } + + local count = self._path_data.count or 1 + + while count > 0 do + if minetest.get_us_time() - us_time > theta_star_alloted_time then + self._path_data = { + start = _start, + open = openSet, + closed = closedSet, + count = count + } + return + end + + -- Initialize ID and data + local current_id, current = next(openSet) + + -- Find lowest f cost + for i, v in pairs(openSet) do + if v.fScore < current.fScore then + current_id = i + current = v + end + end + + -- Add lowest fScore to closedSet and remove from openSet + openSet[current_id] = nil + closedSet[current_id] = current + + -- Reconstruct path if end is reached + if (is_on_ground(_goal) + and current_id == minetest.hash_node_position(_goal)) + or (not is_on_ground(_goal) + and _goal.x == current.pos.x + and _goal.z == current.pos.z) then + local path = {} + local fail_safe = 0 + for _ in pairs(closedSet) do + fail_safe = fail_safe + 1 + end + repeat + if not closedSet[current_id] then return end + table.insert(path, closedSet[current_id].pos) + current_id = closedSet[current_id].parent + until current_id == start_index or #path >= fail_safe + if not closedSet[current_id] then self._path_data = {} return nil end + table.insert(path, closedSet[current_id].pos) + local reverse_path = {} + repeat table.insert(reverse_path, table.remove(path)) until #path == 0 + self._path_data = {} + return reverse_path + end + + count = count - 1 + + local adjacent = get_neighbors(current.pos, obj_width, obj_height, path_neighbors, openSet, closedSet) + + -- Go through neighboring nodes + for i = 1, #adjacent do + local neighbor = { + pos = adjacent[i], + parent = current_id, + gScore = 0, + fScore = 0 + } + if not openSet[minetest.hash_node_position(neighbor.pos)] + and not closedSet[minetest.hash_node_position(neighbor.pos)] then + local current_parent = closedSet[current.parent] or closedSet[start_index] + if not current_parent then + current_parent = openSet[current.parent] or openSet[start_index] + end + if current_parent + and get_line_of_sight(current_parent.pos, neighbor.pos) then + local temp_gScore = current_parent.gScore + get_distance_to_neighbor(current_parent.pos, neighbor.pos) + local new_gScore = 999 + if openSet[minetest.hash_node_position(neighbor.pos)] then + new_gScore = openSet[minetest.hash_node_position(neighbor.pos)].gScore + end + if temp_gScore < new_gScore then + local hCost = get_distance_to_neighbor(neighbor.pos, _goal) + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + neighbor.parent = minetest.hash_node_position(current_parent.pos) + if openSet[minetest.hash_node_position(neighbor.pos)] then + openSet[minetest.hash_node_position(neighbor.pos)] = nil + end + openSet[minetest.hash_node_position(neighbor.pos)] = neighbor + count = count + 1 + end + else + local temp_gScore = current.gScore + get_distance_to_neighbor(current_parent.pos, neighbor.pos) + local new_gScore = 999 + if openSet[minetest.hash_node_position(neighbor.pos)] then + new_gScore = openSet[minetest.hash_node_position(neighbor.pos)].gScore + end + if temp_gScore < new_gScore then + local hCost = get_distance_to_neighbor(neighbor.pos, _goal) + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + if openSet[minetest.hash_node_position(neighbor.pos)] then + openSet[minetest.hash_node_position(neighbor.pos)] = nil + end + openSet[minetest.hash_node_position(neighbor.pos)] = neighbor + count = count + 1 + end + end + end + end + if count > (max_open or 100) then + self._path_data = {} + return + end + end + self._path_data = {} + return nil + end + return find_path(start, goal) +end diff --git a/mods/creatura/pathfinding.lua b/mods/creatura/pathfinding.lua new file mode 100644 index 00000000..83480e59 --- /dev/null +++ b/mods/creatura/pathfinding.lua @@ -0,0 +1,627 @@ +----------------- +-- Pathfinding -- +----------------- + +local a_star_alloted_time = tonumber(minetest.settings:get("creatura_a_star_alloted_time")) or 500 +local theta_star_alloted_time = tonumber(minetest.settings:get("creatura_theta_star_alloted_time")) or 700 + +creatura.pathfinder = {} + +local max_open = 300 + +-- Math + +local floor = math.floor +local abs = math.abs + +local vec_add, vec_dist, vec_new, vec_round = vector.add, vector.distance, vector.new, vector.round + +local function vec_raise(v, n) + return {x = v.x, y = v.y + n, z = v.z} +end + +-- Heuristic + +local function get_distance(start_pos, end_pos) + local distX = abs(start_pos.x - end_pos.x) + local distZ = abs(start_pos.z - end_pos.z) + + if distX > distZ then + return 14 * distZ + 10 * (distX - distZ) + else + return 14 * distX + 10 * (distZ - distX) + end +end + +local function get_distance_to_neighbor(start_pos, end_pos) + local distX = abs(start_pos.x - end_pos.x) + local distY = abs(start_pos.y - end_pos.y) + local distZ = abs(start_pos.z - end_pos.z) + + if distX > distZ then + return (14 * distZ + 10 * (distX - distZ)) * (distY + 1) + else + return (14 * distX + 10 * (distZ - distX)) * (distY + 1) + end +end + +-- Blocked Movement Checks + +local is_blocked = creatura.is_blocked + +local function get_line_of_sight(a, b) + local steps = floor(vec_dist(a, b)) + local line = {} + + for i = 0, steps do + local pos + + if steps > 0 then + pos = { + x = a.x + (b.x - a.x) * (i / steps), + y = a.y + (b.y - a.y) * (i / steps), + z = a.z + (b.z - a.z) * (i / steps) + } + else + pos = a + end + table.insert(line, pos) + end + + if #line < 1 then + return false + else + for i = 1, #line do + local node = minetest.get_node(line[i]) + if creatura.get_node_def(node.name).walkable then + return false + end + end + end + return true +end + +local function is_on_ground(pos) + local ground = { + x = pos.x, + y = pos.y - 1, + z = pos.z + } + if creatura.get_node_def(ground).walkable then + return true + end + return false +end + +-- Neighbor Check Grids + +local neighbor_grid = { + {x = 1, y = 0, z = 0}, + {x = 1, y = 0, z = 1}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = -1, y = 0, z = -1}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = -1} +} + +local neighbor_grid_climb = { + {x = 1, y = 0, z = 0}, + {x = 1, y = 0, z = 1}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = -1, y = 0, z = -1}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = -1}, + + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0} +} + +local neighbor_grid_3d = { + -- Central + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + -- Directly Up or Down + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0} +} + +-- Get Neighbors + +local function get_neighbors(pos, width, height, open, closed, parent, evaluated) + local result = {} + local neighbor + local can_move + local hashed_pos + local step + + for i = 1, #neighbor_grid do + neighbor = vec_add(pos, neighbor_grid[i]) + can_move = get_line_of_sight({x = pos.x, y = neighbor.y, z = pos.z}, neighbor) + hashed_pos = minetest.hash_node_position(neighbor) + + if parent + and vec_dist(parent, neighbor) < vec_dist(pos, neighbor) then + can_move = false + end + + if open[hashed_pos] + or closed[hashed_pos] + or evaluated[hashed_pos] then + can_move = false + elseif can_move then + can_move = not is_blocked(neighbor, width, height) + + if not can_move then -- Step Up + step = vec_raise(neighbor, 1) + can_move = not is_blocked(vec_round(step), width, height) + neighbor = vec_round(step) + else + step = creatura.get_ground_level(vec_new(neighbor), 1) + if step.y < neighbor.y + and not is_blocked(vec_round(step), width, height) then + neighbor = step + end + end + end + + if can_move then + table.insert(result, neighbor) + end + + evaluated[hashed_pos] = true + end + return result +end + +function creatura.pathfinder.get_neighbors_climb(pos, width, height, open, closed) + local result = {} + local neighbor + local can_move + local hashed_pos + local step + + for i = 1, #neighbor_grid_climb do + neighbor = vec_add(pos, neighbor_grid_climb[i]) + can_move = get_line_of_sight({x = pos.x, y = neighbor.y, z = pos.z}, neighbor) + hashed_pos = minetest.hash_node_position(neighbor) + + if open[hashed_pos] + or closed[hashed_pos] then + can_move = false + elseif can_move then + can_move = not is_blocked(neighbor, width, height) + + if not can_move then -- Step Up + step = vec_raise(neighbor, 1) + can_move = not is_blocked(vec_round(step), width, height) + neighbor = vec_round(step) + elseif i < 9 then + step = creatura.get_ground_level(vec_new(neighbor), 1) + if step.y < neighbor.y + and not is_blocked(vec_round(step), width, height) then + neighbor = step + end + end + end + + if can_move then + table.insert(result, neighbor) + end + end + return result +end + +function creatura.pathfinder.get_neighbors_fly(pos, width, height, open, closed, parent) + local result = {} + local neighbor + local can_move + local hashed_pos + + for i = 1, #neighbor_grid_3d do + neighbor = vec_add(pos, neighbor_grid_3d[i]) + can_move = get_line_of_sight({x = pos.x, y = pos.y, z = pos.z}, neighbor) + hashed_pos = minetest.hash_node_position(neighbor) + + if parent + and vec_dist(parent, neighbor) < vec_dist(pos, neighbor) then + can_move = false + end + + if open[hashed_pos] + or closed[hashed_pos] then + can_move = false + elseif can_move then + can_move = not is_blocked(neighbor, width, height) + end + + if can_move then + table.insert(result, neighbor) + end + end + return result, true +end + +function creatura.pathfinder.get_neighbors_swim(pos, width, height, open, closed, parent) + local result = {} + local neighbor + local can_move + local hashed_pos + + for i = 1, #neighbor_grid_3d do + neighbor = vec_add(pos, neighbor_grid_3d[i]) + can_move = get_line_of_sight({x = pos.x, y = pos.y, z = pos.z}, neighbor) + hashed_pos = minetest.hash_node_position(neighbor) + + if (parent + and vec_dist(parent, neighbor) < vec_dist(pos, neighbor)) + or creatura.get_node_def(neighbor).drawtype ~= "liquid" then + can_move = false + end + + if open[hashed_pos] + or closed[hashed_pos] then + can_move = false + elseif can_move then + can_move = not is_blocked(neighbor, width, height) + end + + if can_move then + table.insert(result, neighbor) + end + end + return result, true +end + +-- A* + +function creatura.pathfinder.find_path(self, pos1, pos2, neighbor_func) + local us_time = minetest.get_us_time() + local check_vertical = false + neighbor_func = neighbor_func or get_neighbors + + local start = self._path_data.start or { + x = floor(pos1.x + 0.5), + y = floor(pos1.y + 0.5), + z = floor(pos1.z + 0.5) + } + local goal = { + x = floor(pos2.x + 0.5), + y = floor(pos2.y + 0.5), + z = floor(pos2.z + 0.5) + } + + self._path_data.start = start + + if goal.x == start.x + and goal.z == start.z then -- No path can be found + self._path_data = {} + return + end + + local openSet = self._path_data.open or {} + local closedSet = self._path_data.closed or {} + local evaluated = {} + + local start_index = minetest.hash_node_position(start) + + openSet[start_index] = { + pos = start, + parent = nil, + gScore = 0, + fScore = get_distance(start, goal) + } + + local count = self._path_data.count or 1 + local current_id, current + local adjacent + local neighbor + + local temp_gScore + local new_gScore + local hCost + + local hashed_pos + local parent_open + local parent_closed + + while count > 0 do + + -- Initialize ID and data + current_id, current = next(openSet) + + -- Find lowest f cost + for i, v in pairs(openSet) do + if v.fScore < current.fScore then + current_id = i + current = v + end + end + + if not current_id then self._path_data = {} return end -- failsafe + + -- Add lowest fScore to closedSet and remove from openSet + openSet[current_id] = nil + closedSet[current_id] = current + + if ((check_vertical or is_on_ground(goal)) + and current_id == minetest.hash_node_position(goal)) + or ((not check_vertical and not is_on_ground(goal)) + and goal.x == current.pos.x + and goal.z == current.pos.z) then + local path = {} + local fail_safe = 0 + + for _ in pairs(closedSet) do + fail_safe = fail_safe + 1 + end + + repeat + if not closedSet[current_id] then self._path_data = {} return end + table.insert(path, closedSet[current_id].pos) + current_id = closedSet[current_id].parent + until current_id == start_index or #path >= fail_safe + + if not closedSet[current_id] then self._path_data = {} return nil end + + table.insert(path, closedSet[current_id].pos) + + local reverse_path = {} + repeat table.insert(reverse_path, table.remove(path)) until #path == 0 + + self._path_data = {} + return reverse_path + end + + parent_open = openSet[current.parent] + parent_closed = closedSet[current.parent] + adjacent, check_vertical = neighbor_func( + current.pos, + self.width, + self.height, + openSet, + closedSet, + (parent_closed and parent_closed.pos) or (parent_open and parent_open.pos), + evaluated + ) + -- Fly, Swim, and Climb all return true for check_vertical to properly check if goal has been reached + + -- Go through neighboring nodes + for i = 1, #adjacent do + neighbor = { + pos = adjacent[i], + parent = current_id, + gScore = 0, + fScore = 0 + } + + temp_gScore = current.gScore + get_distance_to_neighbor(current.pos, neighbor.pos) + new_gScore = 0 + + hashed_pos = minetest.hash_node_position(neighbor.pos) + + if openSet[hashed_pos] then + new_gScore = openSet[hashed_pos].gScore + end + + if (temp_gScore < new_gScore + or not openSet[hashed_pos]) + and not closedSet[hashed_pos] then + if not openSet[hashed_pos] then + count = count + 1 + end + + hCost = get_distance_to_neighbor(neighbor.pos, goal) + + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + openSet[hashed_pos] = neighbor + end + end + + if minetest.get_us_time() - us_time > a_star_alloted_time then + self._path_data = { + start = start, + open = openSet, + closed = closedSet, + count = count + } + return + end + + if count > (max_open or 100) then + self._path_data = {} + return + end + end +end + +-- Theta* + +function creatura.pathfinder.find_path_theta(self, pos1, pos2, neighbor_func) + local us_time = minetest.get_us_time() + local check_vertical = false + neighbor_func = neighbor_func or get_neighbors + + local start = self._path_data.start or { + x = floor(pos1.x + 0.5), + y = floor(pos1.y + 0.5), + z = floor(pos1.z + 0.5) + } + local goal = { + x = floor(pos2.x + 0.5), + y = floor(pos2.y + 0.5), + z = floor(pos2.z + 0.5) + } + + self._path_data.start = start + + if goal.x == start.x + and goal.z == start.z then -- No path can be found + return + end + + local openSet = self._path_data.open or {} + local closedSet = self._path_data.closed or {} + local evaluated = {} + + local start_index = minetest.hash_node_position(start) + + openSet[start_index] = { + pos = start, + parent = nil, + gScore = 0, + fScore = get_distance(start, goal) + } + + local count = self._path_data.count or 1 + local current_id, current + local current_parent + local adjacent + local neighbor + + local temp_gScore + local new_gScore + local hCost + + local hashed_pos + local parent_open + local parent_closed + + while count > 0 do + + -- Initialize ID and data + current_id, current = next(openSet) + + -- Find lowest f cost + for i, v in pairs(openSet) do + if v.fScore < current.fScore then + current_id = i + current = v + end + end + + if not current_id then return end -- failsafe + + -- Add lowest fScore to closedSet and remove from openSet + openSet[current_id] = nil + closedSet[current_id] = current + + if ((check_vertical or is_on_ground(goal)) + and current_id == minetest.hash_node_position(goal)) + or ((not check_vertical and not is_on_ground(goal)) + and goal.x == current.pos.x + and goal.z == current.pos.z) then + local path = {} + local fail_safe = 0 + + for _ in pairs(closedSet) do + fail_safe = fail_safe + 1 + end + + repeat + if not closedSet[current_id] then return end + table.insert(path, closedSet[current_id].pos) + current_id = closedSet[current_id].parent + until current_id == start_index or #path >= fail_safe + + if not closedSet[current_id] then self._path_data = {} return nil end + + table.insert(path, closedSet[current_id].pos) + + local reverse_path = {} + repeat table.insert(reverse_path, table.remove(path)) until #path == 0 + + self._path_data = {} + return reverse_path + end + + parent_open = openSet[current.parent] + parent_closed = closedSet[current.parent] + adjacent, check_vertical = neighbor_func( + current.pos, + self.width, + self.height, + openSet, + closedSet, + (parent_closed and parent_closed.pos) or (parent_open and parent_open.pos), + evaluated + ) + -- Fly, Swim, and Climb all return true for check_vertical to properly check if goal has been reached + + -- Go through neighboring nodes + for i = 1, #adjacent do + neighbor = { + pos = adjacent[i], + parent = current_id, + gScore = 0, + fScore = 0 + } + + hashed_pos = minetest.hash_node_position(neighbor.pos) + + if not openSet[hashed_pos] + and not closedSet[hashed_pos] then + current_parent = closedSet[current.parent] or closedSet[start_index] + if not current_parent then + current_parent = openSet[current.parent] or openSet[start_index] + end + + if current_parent + and get_line_of_sight(current_parent.pos, neighbor.pos) then + temp_gScore = current_parent.gScore + get_distance_to_neighbor(current_parent.pos, neighbor.pos) + new_gScore = 999 + + if openSet[hashed_pos] then + new_gScore = openSet[hashed_pos].gScore + end + + if temp_gScore < new_gScore then + hCost = get_distance_to_neighbor(neighbor.pos, goal) + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + neighbor.parent = minetest.hash_node_position(current_parent.pos) + openSet[hashed_pos] = neighbor + count = count + 1 + end + else + temp_gScore = current.gScore + get_distance_to_neighbor(current_parent.pos, neighbor.pos) + new_gScore = 999 + + if openSet[hashed_pos] then + new_gScore = openSet[hashed_pos].gScore + end + + if temp_gScore < new_gScore then + hCost = get_distance_to_neighbor(neighbor.pos, goal) + neighbor.gScore = temp_gScore + neighbor.fScore = temp_gScore + hCost + + openSet[hashed_pos] = neighbor + count = count + 1 + end + end + end + end + + if minetest.get_us_time() - us_time > theta_star_alloted_time then + self._path_data = { + start = start, + open = openSet, + closed = closedSet, + count = count + } + return + end + + if count > (max_open or 100) then + self._path_data = {} + return + end + end +end \ No newline at end of file diff --git a/mods/creatura/settingtypes.txt b/mods/creatura/settingtypes.txt new file mode 100644 index 00000000..090be0d0 --- /dev/null +++ b/mods/creatura/settingtypes.txt @@ -0,0 +1,32 @@ +# How mobs step up nodes. +# +# - Simple means mobs use Minetests builtin stepping. +# - Fancy means mobs will step up nodes with a quick hop but can cause lag. +creatura_step_type (Step Type) enum simple simple,fancy + +# How often (in seconds) the spawn ABM is called +creatura_spawn_interval (Spawn ABM Interval) int 10 + +# Allows Mobs to spawn during chunk generation (If dependent mods use spawn_on_gen) +creatura_mapgen_spawning (Mapgen Spawning) bool true + +# How many chunks are generated before a Mob can spawn +creatura_mapgen_spawn_interval (Mapgen Spawning Interval) int 64 + +# How many Mobs can be a in a Mapblock before ABM spawning is blocked +creatura_mapblock_limit (Max Mobs per Mapblock) int 12 + +# How many Mobs can be within Active Block Send Range of an attempted spawn before stopping attempt +creatura_abr_limit (Max Mobs within ABR) int 24 + +# Minimum distance to a player for ABM Spawning +creatura_min_abm_dist (Minimum ABM Spawning Distance) int 32 + +# Allows Mobs to spawn in protected areas +creatura_protected_spawn (Protected Area Spawning) bool true + +# Allotted time (in μs) per step for A* pathfinding (lower means less lag but slower pathfinding) +creatura_a_star_alloted_time (A* Pathfinding Alloted time per step) int 500 + +# Allotted time (in μs) per step for Theta* pathfinding (lower means less lag but slower pathfinding) +creatura_theta_star_alloted_time (Theta* Pathfinding Alloted time per step) int 700 \ No newline at end of file diff --git a/mods/creatura/sounds/creatura_hit_1.ogg b/mods/creatura/sounds/creatura_hit_1.ogg new file mode 100644 index 00000000..b41e505a Binary files /dev/null and b/mods/creatura/sounds/creatura_hit_1.ogg differ diff --git a/mods/creatura/sounds/creatura_hit_2.ogg b/mods/creatura/sounds/creatura_hit_2.ogg new file mode 100644 index 00000000..89192b15 Binary files /dev/null and b/mods/creatura/sounds/creatura_hit_2.ogg differ diff --git a/mods/creatura/sounds/creatura_hit_3.ogg b/mods/creatura/sounds/creatura_hit_3.ogg new file mode 100644 index 00000000..df31c8dc Binary files /dev/null and b/mods/creatura/sounds/creatura_hit_3.ogg differ diff --git a/mods/creatura/spawning.lua b/mods/creatura/spawning.lua new file mode 100644 index 00000000..5e383524 --- /dev/null +++ b/mods/creatura/spawning.lua @@ -0,0 +1,573 @@ +-------------- +-- Spawning -- +-------------- + +creatura.registered_mob_spawns = {} +creatura.registered_on_spawns = {} + +-- Math -- + +local abs = math.abs +local ceil = math.ceil +local pi = math.pi +local random = math.random +local min = math.min + +local vec_add, vec_dist, vec_sub = vector.add, vector.distance, vector.subtract + +-- Utility Functions -- + +local function format_name(str) + if str then + if str:match(":") then str = str:split(":")[2] end + return (string.gsub(" " .. str, "%W%l", string.upper):sub(2):gsub("_", " ")) + end +end + +local function table_contains(tbl, val) + for _, v in pairs(tbl) do + if v == val then + return true + end + end + return false +end + +local function pos_meets_params(pos, def) + if not minetest.find_nodes_in_area(pos, pos, def.nodes) then return false end + if not minetest.find_node_near(pos, 1, def.neighbors) then return false end + + return true +end + +local function can_spawn(pos, width, height) + local pos2 + local w_iter = width / ceil(width) + for y = 0, height, height / ceil(height) do + for z = -width, width, w_iter do + for x = -width, width, w_iter do + pos2 = {x = pos.x + x, y = pos.y + y, z = pos.z + z} + local def = creatura.get_node_def(pos2) + if def.walkable then return false end + end + end + end + return true +end + +local function do_on_spawn(pos, obj) + local name = obj and obj:get_luaentity().name + if not name then return end + local spawn_functions = creatura.registered_on_spawns[name] or {} + + if #spawn_functions > 0 then + for _, func in ipairs(spawn_functions) do + func(obj:get_luaentity(), pos) + if not obj:get_yaw() then break end + end + end +end + +---------------- +-- Spawn Item -- +---------------- + +local creative = minetest.settings:get_bool("creative_mode") + +function creatura.register_spawn_item(name, def) + local inventory_image + if not def.inventory_image + and ((def.col1 and def.col2) + or (def.hex_primary and def.hex_secondary)) then + local primary = def.col1 or def.hex_primary + local secondary = def.col2 or def.hex_secondary + local base = "(creatura_spawning_crystal_primary.png^[multiply:#" .. primary .. ")" + local spots = "(creatura_spawning_crystal_secondary.png^[multiply:#" .. secondary .. ")" + inventory_image = base .. "^" .. spots + end + local mod_name = name:split(":")[1] + local mob_name = name:split(":")[2] + def.description = def.description or "Spawn " .. format_name(name) + def.inventory_image = def.inventory_image or inventory_image + def.on_place = function(itemstack, player, pointed_thing) + -- If the player right-clicks something like a chest or item frame then + -- run the node's on_rightclick callback + local under = pointed_thing.under + local node = minetest.get_node(under) + local node_def = minetest.registered_nodes[node.name] + if node_def and node_def.on_rightclick and + not (player and player:is_player() and + player:get_player_control().sneak) then + return node_def.on_rightclick(under, node, player, itemstack, + pointed_thing) or itemstack + end + + -- Otherwise spawn the mob + local pos = minetest.get_pointed_thing_position(pointed_thing, true) + if minetest.is_protected(pos, player and player:get_player_name() or "") then return end + local mobdef = minetest.registered_entities[name] + local spawn_offset = abs(mobdef.collisionbox[2]) + pos.y = (pos.y - 0.49) + spawn_offset + if def.antispam then + local objs = minetest.get_objects_in_area(vec_sub(pos, 0.51), vec_add(pos, 0.51)) + for _, obj in ipairs(objs) do + if obj + and obj:get_luaentity() + and obj:get_luaentity().name == name then + return + end + end + end + local object = minetest.add_entity(pos, name) + if object then + object:set_yaw(random(0, pi * 2)) + object:get_luaentity().last_yaw = object:get_yaw() + if def.on_spawn then + def.on_spawn(object:get_luaentity(), player) + end + end + if not minetest.is_creative_enabled(player:get_player_name()) + or def.consume_in_creative then + itemstack:take_item() + return itemstack + end + end + minetest.register_craftitem(def.itemstring or (mod_name .. ":spawn_" .. mob_name), def) +end + +function creatura.register_on_spawn(name, func) + if not creatura.registered_on_spawns[name] then + creatura.registered_on_spawns[name] = {} + end + table.insert(creatura.registered_on_spawns[name], func) +end + +-------------- +-- Spawning -- +-------------- + +--[[creatura.register_abm_spawn("mymod:mymob", { + chance = 3000, + interval = 30, + min_height = 0, + max_height = 128, + min_light = 1, + max_light = 15, + min_group = 1, + max_group = 4, + nodes = {"group:soil", "group:stone"}, + neighbors = {"air"}, + spawn_on_load = false, + spawn_in_nodes = false, + spawn_cap = 5 +})]] + +local protected_spawn = minetest.settings:get_bool("creatura_protected_spawn", true) +local abr = (tonumber(minetest.get_mapgen_setting("active_block_range")) or 4) * 16 +local max_per_block = tonumber(minetest.settings:get("creatura_mapblock_limit")) or 12 +local max_in_abr = tonumber(minetest.settings:get("creatura_abr_limit")) or 24 +local min_abm_dist = min(abr / 2, tonumber(minetest.settings:get("creatura_min_abm_dist")) or 32) + +local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false + +local mapgen_mobs = {} + +function creatura.register_abm_spawn(mob, def) + local chance = def.chance or 3000 + local interval = def.interval or 30 + local min_height = def.min_height or 0 + local max_height = def.max_height or 128 + local min_time = def.min_time or 0 + local max_time = def.max_time or 24000 + local min_light = def.min_light or 1 + local max_light = def.max_light or 15 + local min_group = def.min_group or 1 + local max_group = def.max_group or 4 + local block_protected = def.block_protected_spawn or false + local biomes = def.biomes or {} + local nodes = def.nodes or {"group:soil", "group:stone"} + local neighbors = def.neighbors or {"air"} + local spawn_on_load = def.spawn_on_load or false + local spawn_in_nodes = def.spawn_in_nodes or false + local spawn_cap = def.spawn_cap or 5 + + local function spawn_func(pos, aocw) + + if not mobs_spawn then + return + end + + if not spawn_in_nodes then + pos.y = pos.y + 1 + end + + if (not protected_spawn + or block_protected) + and minetest.is_protected(pos, "") then + return + end + + local tod = (minetest.get_timeofday() or 0) * 24000 + + local bounds_in = tod >= min_time and tod <= max_time + local bounds_ex = tod >= max_time or tod <= min_time + + if (max_time > min_time and not bounds_in) + or (min_time > max_time and not bounds_ex) then + return + end + + local light = minetest.get_node_light(pos) or 7 + + if light > max_light + or light < min_light then + return + end + + if aocw + and aocw >= max_per_block then + return + end + + if biomes + and #biomes > 0 then + local biome_id = minetest.get_biome_data(pos).biome + local biome_name = minetest.get_biome_name(biome_id) + local is_spawn_biome = false + for _, biome in ipairs(biomes) do + if biome:match("^" .. biome_name) then + is_spawn_biome = true + break + end + end + if not is_spawn_biome then return end + end + + local mob_count = 0 + local plyr_found = false + + local objects = minetest.get_objects_inside_radius(pos, abr) + + for _, object in ipairs(objects) do + local ent = object:get_luaentity() + if ent + and ent.name == mob then + mob_count = mob_count + 1 + if mob_count > spawn_cap + or mob_count > max_in_abr then + return + end + end + if object:is_player() then + plyr_found = true + if vec_dist(pos, object:get_pos()) < min_abm_dist then + return + end + end + end + + if not plyr_found then + return + end + + local mob_def = minetest.registered_entities[mob] + local mob_width = mob_def.collisionbox[4] + local mob_height = mob_def.collisionbox[5] + + if not can_spawn(pos, mob_width, mob_height) then + return + end + + local group_size = random(min_group or 1, max_group or 1) + local obj + + if group_size > 1 then + local offset + local spawn_pos + for _ = 1, group_size do + offset = ceil(mob_width) + spawn_pos = creatura.get_ground_level({ + x = pos.x + random(-offset, offset), + y = pos.y, + z = pos.z + random(-offset, offset) + }, 3) + if not can_spawn(spawn_pos, mob_width, mob_height) then + spawn_pos = pos + end + obj = minetest.add_entity(spawn_pos, mob) + do_on_spawn(spawn_pos, obj) + end + else + obj = minetest.add_entity(pos, mob) + do_on_spawn(pos, obj) + end + + minetest.log("action", + "[Creatura] [ABM Spawning] Spawned " .. group_size .. " " .. mob .. " at " .. minetest.pos_to_string(pos)) + + end + + minetest.register_abm({ + label = mob .. " spawning", + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = chance, + min_y = min_height, + max_y = max_height, + catch_up = false, + action = function(pos, _, _, aocw) + spawn_func(pos, aocw) + end + }) + + if spawn_on_load then + table.insert(mapgen_mobs, mob) + end + + creatura.registered_mob_spawns[mob] = { + chance = def.chance or 3000, + interval = def.interval or 30, + min_height = def.min_height or 0, + max_height = def.max_height or 128, + min_time = def.min_time or 0, + max_time = def.max_time or 24000, + min_light = def.min_light or 1, + max_light = def.max_light or 15, + min_group = def.min_group or 1, + max_group = def.max_group or 4, + block_protected = def.block_protected_spawn or false, + biomes = def.biomes or {}, + nodes = def.nodes or {"group:soil", "group:stone"}, + neighbors = def.neighbors or {"air"}, + spawn_on_load = def.spawn_on_load or false, + spawn_in_nodes = def.spawn_in_nodes or false, + spawn_cap = def.spawn_cap or 5 + } +end + +---------------- +-- DEPRECATED -- +---------------- + + +-- Mapgen -- + +minetest.register_node("creatura:spawn_node", { + drawtype = "airlike", + groups = {not_in_creative_inventory = 1}, + walkable = false +}) + +local mapgen_spawning = false +local mapgen_spawning_int = tonumber(minetest.settings:get("creatura_mapgen_spawn_interval")) or 64 + +if mapgen_spawning then + local chunk_delay = 0 + local c_air = minetest.get_content_id("air") + local c_spawn = minetest.get_content_id("creatura:spawn_node") + + minetest.register_on_generated(function(minp, maxp) + if chunk_delay > 0 then chunk_delay = chunk_delay - 1 end + local meta_queue = {} + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax} + local data = vm:get_data() + + local min_x, max_x = minp.x, maxp.x + local min_y, max_y = minp.y, maxp.y + local min_z, max_z = minp.z, maxp.z + + local def + local center + + local current_biome + local spawn_biomes + + local current_pos + + for _, mob_name in ipairs(mapgen_mobs) do + local mob_spawned = false + + def = creatura.registered_mob_spawns[mob_name] + + center = { + x = min_x + (max_x - min_x) * 0.5, + y = min_y + (max_y - min_y) * 0.5, + z = min_z + (max_z - min_z) * 0.5 + } + + current_biome = minetest.get_biome_name(minetest.get_biome_data(center).biome) + spawn_biomes = def.biomes + + if not mob_spawned + and (not spawn_biomes + or table_contains(spawn_biomes, current_biome)) then + for z = min_z + 8, max_z - 7, 8 do + if mob_spawned then break end + for x = min_x + 8, max_x - 7, 8 do + if mob_spawned then break end + for y = min_y, max_y do + local vi = area:index(x, y, z) + + if data[vi] == c_air + or data[vi] == c_spawn then + break + end + + -- Check if position is outside of vertical bounds + if y > def.max_height + or y < def.min_height then + break + end + + current_pos = vector.new(x, y, z) + + -- Check if position has required nodes + if not pos_meets_params(current_pos, def) then + break + end + + if def.spawn_in_nodes then + -- Add Spawn Node to Map + data[vi] = c_spawn + + local group_size = random(def.min_group or 1, def.max_group or 1) + table.insert(meta_queue, {pos = current_pos, mob = mob_name, cluster = group_size}) + + mob_spawned = true + break + elseif data[area:index(x, y + 1, z)] == c_air then + vi = area:index(x, y + 1, z) + current_pos = vector.new(x, y + 1, z) + + -- Add Spawn Node to Map + data[vi] = c_spawn + + local group_size = random(def.min_group or 1, def.max_group or 1) + table.insert(meta_queue, {pos = current_pos, mob = mob_name, cluster = group_size}) + + mob_spawned = true + break + end + end + end + end + end + end + + if #meta_queue > 0 then + vm:set_data(data) + vm:write_to_map() + + for _, unset_meta in ipairs(meta_queue) do + local pos = unset_meta.pos + local mob = unset_meta.mob + local cluster = unset_meta.cluster + + local meta = minetest.get_meta(pos) + meta:set_string("mob", mob) + meta:set_int("cluster", cluster) + end + + chunk_delay = mapgen_spawning_int + end + end) + + local spawn_interval = tonumber(minetest.settings:get("creatura_spawn_interval")) or 10 + + minetest.register_abm({ + label = "Creatura Spawning", + nodenames = {"creatura:spawn_node"}, + interval = spawn_interval, + chance = 1, + action = function(pos) + local plyr_found = false + local objects = minetest.get_objects_inside_radius(pos, abr) + + for _, object in ipairs(objects) do + if object:is_player() then + plyr_found = true + break + end + end + + if not plyr_found then return end + + local meta = minetest.get_meta(pos) + local name = meta:get_string("mob") or "" + if name == "" then minetest.remove_node(pos) return end + local amount = meta:get_int("cluster") + local obj + if amount > 0 then + for _ = 1, amount do + obj = minetest.add_entity(pos, name) + do_on_spawn(pos, obj) + end + minetest.log("action", + "[Creatura] Spawned " .. amount .. " " .. name .. " at " .. minetest.pos_to_string(pos)) + else + obj = minetest.add_entity(pos, name) + do_on_spawn(pos, obj) + minetest.log("action", + "[Creatura] Spawned a " .. name .. " at " .. minetest.pos_to_string(pos)) + end + minetest.remove_node(pos) + end, + }) +end + +function creatura.register_mob_spawn(name, def) + local spawn_def = { + chance = def.chance or 5, + min_height = def.min_height or 0, + max_height = def.max_height or 128, + min_time = def.min_time or 0, + max_time = def.max_time or 24000, + min_light = def.min_light or 6, + max_light = def.max_light or 15, + min_group = def.min_group or 1, + max_group = def.max_group or 4, + nodes = def.nodes or nil, + biomes = def.biomes or nil, + --spawn_cluster = def.spawn_cluster or false, + spawn_on_load = def.spawn_on_gen or false, + spawn_in_nodes = def.spawn_in_nodes or false, + spawn_cap = def.spawn_cap or 5, + --send_debug = def.send_debug or false + } + --creatura.registered_mob_spawns[name] = spawn_def + + creatura.register_abm_spawn(name, spawn_def) +end + +function creatura.register_spawn_egg(name, col1, col2, inventory_image) + if col1 and col2 then + local base = "(creatura_spawning_crystal_primary.png^[multiply:#" .. col1 .. ")" + local spots = "(creatura_spawning_crystal_secondary.png^[multiply:#" .. col2 .. ")" + inventory_image = base .. "^" .. spots + end + local mod_name = name:split(":")[1] + local mob_name = name:split(":")[2] + minetest.register_craftitem(mod_name .. ":spawn_" .. mob_name, { + description = "Spawn " .. format_name(name), + inventory_image = inventory_image, + stack_max = 99, + on_place = function(itemstack, _, pointed_thing) + local mobdef = minetest.registered_entities[name] + local spawn_offset = abs(mobdef.collisionbox[2]) + local pos = minetest.get_pointed_thing_position(pointed_thing, true) + pos.y = (pos.y - 0.4) + spawn_offset + local object = minetest.add_entity(pos, name) + if object then + object:set_yaw(random(1, 6)) + object:get_luaentity().last_yaw = object:get_yaw() + end + if not creative then + itemstack:take_item() + return itemstack + end + end + }) +end diff --git a/mods/creatura/textures/creatura_particle_green.png b/mods/creatura/textures/creatura_particle_green.png new file mode 100644 index 00000000..2693cc35 Binary files /dev/null and b/mods/creatura/textures/creatura_particle_green.png differ diff --git a/mods/creatura/textures/creatura_particle_red.png b/mods/creatura/textures/creatura_particle_red.png new file mode 100644 index 00000000..019d9a2b Binary files /dev/null and b/mods/creatura/textures/creatura_particle_red.png differ diff --git a/mods/creatura/textures/creatura_smoke_particle.png b/mods/creatura/textures/creatura_smoke_particle.png new file mode 100644 index 00000000..4b77207f Binary files /dev/null and b/mods/creatura/textures/creatura_smoke_particle.png differ diff --git a/mods/creatura/textures/creatura_spawning_crystal_outline.png b/mods/creatura/textures/creatura_spawning_crystal_outline.png new file mode 100644 index 00000000..f839e523 Binary files /dev/null and b/mods/creatura/textures/creatura_spawning_crystal_outline.png differ diff --git a/mods/creatura/textures/creatura_spawning_crystal_primary.png b/mods/creatura/textures/creatura_spawning_crystal_primary.png new file mode 100644 index 00000000..242671c5 Binary files /dev/null and b/mods/creatura/textures/creatura_spawning_crystal_primary.png differ diff --git a/mods/creatura/textures/creatura_spawning_crystal_secondary.png b/mods/creatura/textures/creatura_spawning_crystal_secondary.png new file mode 100644 index 00000000..ddfc5ac3 Binary files /dev/null and b/mods/creatura/textures/creatura_spawning_crystal_secondary.png differ diff --git a/mods/effervescence/LICENSE b/mods/effervescence/LICENSE new file mode 100644 index 00000000..56a13cb8 --- /dev/null +++ b/mods/effervescence/LICENSE @@ -0,0 +1,13 @@ +MIT License + +Copyright © 2024 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +Texture file `effervescence_particles/textures/effervescence_petals.png` is derived from a texture by Liil/Wilhelmine/Skandarella, licensed MIT. A copy of its license accompanies the texture. \ No newline at end of file diff --git a/mods/effervescence/README.md b/mods/effervescence/README.md new file mode 100644 index 00000000..9165c44a --- /dev/null +++ b/mods/effervescence/README.md @@ -0,0 +1,40 @@ +# Effervescence + +Add a subtle touch of life to your world with Effervescence! This mod adds ambient particle effects to any world: bustling grasses, blossoming flowers, crumbling stone, and much more. + +## Effects + +Effervescence comes with the following default effects: + +- **dusty** - dust particles that swirl about from dry, dusty nodes +- **crumbly** - bits of loose dirt that fall from ceilings made of stone, dirt, or moss +- **bustling** - grass, pollen, and spores that lift up from the ground +- **snowy** - snowflake squalls that gust up from the ground +- **leafy** - gently falling leaves from trees and bushes +- **blossoming** - flower petals blown away from flowers +- **sporogenic** - bursts of spores shed by mushrooms and certain types of vines and plants +- **sparkly** - fine sparkles generated by crystals and ice +- **bubbling** - tiny bubbles that form at the surface of water +- **walking** - bits of dirt and grass kicked up under players' feet as they walk + +## Advanced Usage + +Effervescence is actually a modpack that comes with three mods: + +- The core `effervescence` mod which provides an API and trigger mechanism for particle effects +- `effervescence_decorators` which defines a set of default *decorators* used to place node metadata during mapgen +- `effervescence_particles` which defines the default particle effects bundled with Effervescence + +The secondary mods can be disabled in order to remove the bundled particle effects, and the mods can be individually depended upon for adding custom particle effects or decorators. The mod settings can be used to adjust mod behavior for performance, and the API can be used to control the mod programmatically. + +## Notes + +- This mod is primarily targeted at [Asuna](https://content.luanti.org/packages/EmptyStar/asuna/) but will mostly work for other typical sandbox games +- This mod utilizes mapgen to determine where particles can occur in the environment which means that environmental particles will only appear in previously unexplored areas +- Particle effects will not be applied to nodes placed by players although this can be achieved by adding `effervescence.particles` node metadata, an advanced task ~~covered in the API documentation~~ + +## Caveats + +- Particle effects may cause lag on older hardware, especially in areas with lots of dense particle-emitting nodes +- This mod adds metadata to the world to determine where particle effects can occur; uninstalling this mod will leave its metadata behind which causes no noticeable effect but will cause your world to permanently take up more space on your device +- The color of particles may be wrong for nodes that use hardware coloring \ No newline at end of file diff --git a/mods/effervescence/effervescence/init.lua b/mods/effervescence/effervescence/init.lua new file mode 100644 index 00000000..b5da2297 --- /dev/null +++ b/mods/effervescence/effervescence/init.lua @@ -0,0 +1,273 @@ +-- Settings loaded from Asuna +local asuna_amount = asuna.settings.particles.amount +local asuna_enabled = asuna_amount ~= "none" and true or false +local asuna_chance = (function() + if asuna_amount == "less" then + return 29 + elseif asuna_amount == "more" then + return 70 + elseif asuna_amount == "maximum" then + return 100 + else + return 1 + end +end)() +local asuna_interval = (function() + if asuna_amount == "less" then + return 5.25 + elseif asuna_amount == "more" then + return 3.5 + elseif asuna_amount == "maximum" then + return 2.0 + else + return 60.0 + end +end)() + +effervescence = { + -- Settings loaded from settingtypes.txt + settings = { + environmental = { + enabled = asuna_enabled, + interval = asuna_interval, + chance = asuna_chance, + radius_x = tonumber(core.settings:get("effervescence.environmental.radius_x",18) or 18), + radius_y = tonumber(core.settings:get("effervescence.environmental.radius_y",6) or 6), + radius_z = tonumber(core.settings:get("effervescence.environmental.radius_z",18) or 18), + look_dir_bias = tonumber(core.settings:get("effervescence.environmental.look_dir_bias",4) or 4), + }, + player = { + enabled = asuna_enabled, + interval = tonumber(core.settings:get("effervescence.player.interval",0.5) or 0.5), + }, + }, + + -- Node meta decorator registration + decorators = {}, + register_decorator = function(def) + if type(def.name) ~= "string" or effervescence.decorators[def.name] then + return false, "invalid name or name already in use" + end + + if type(def.apply_to) ~= "function" then + return false, "apply_to must be a function" + end + + if type(def.decorate) ~= "function" then + return false, "decorate must be a function" + end + + effervescence.decorators[def.name] = def + return true + end, + + -- Player-based particle registration + player_particles = {}, + register_player_particles = function(def) + if type(def.name) ~= "string" or def.name:find(",") or effervescence.environmental_particles[def.name] then + return false, "invalid name or name already in use" + end + + if type(def.applies_to) ~= "function" then + return false, "applies_to must be a function" + end + + if type(def.emit) ~= "function" then + return false, "emit must be a function" + end + + def.check = (type(def.check) == "function" and def.check) or function() return true end + + effervescence.player_particles[def.name] = def + return true + end, + + -- Environmental particle registration + environmental_particles = {}, + register_environmental_particles = function(def) + if type(def.name) ~= "string" or def.name:find(",") or effervescence.environmental_particles[def.name] then + return false, "invalid name or name already in use" + end + + if type(def.applies_to) ~= "function" then + return false, "applies_to must be a function" + end + + if type(def.emit) ~= "function" then + return false, "emit must be a function" + end + + def.check = (type(def.check) == "function" and def.check) or function() return true end + + effervescence.environmental_particles[def.name] = def + return true + end, + + -- Add particle to node meta + add_particle_meta = function(pos, particle) + local meta = core.get_meta(pos) + local particles = meta:get("effervescence.particles") + if particles then + meta:set_string("effervescence.particles",particles .. "," .. particle) + else + meta:set_string("effervescence.particles",particle) + end + end, +} + +-- Player effect trigger +local math_sign = function(number) + return (number > 0 and 1) or (number < 0 and -1) or 0 +end + +local math_round = function(number) + return math_sign(number) * math.floor(math.abs(number) + 0.5) +end + +local get_look_bias = effervescence.settings.environmental.look_dir_bias > 0 and function(look_dir) + local bias = effervescence.settings.environmental.look_dir_bias + return math_round(look_dir.x * bias), math_round(look_dir.y * bias / 2), math_round(look_dir.z * bias) +end or function() return 0, 0, 0 end + +-- Environmental particles +local environmental_particles +if effervescence.settings.environmental.enabled then + local etime = effervescence.settings.environmental.interval + environmental_particles = function(dtime) + etime = etime - dtime + if etime < 0 then + etime = effervescence.settings.environmental.interval + local already_emitted = {} + for _,player in ipairs(core.get_connected_players()) do + if player then + local pname = player:get_player_name() + local pos = player:get_pos() + local look_dir = player:get_look_dir() + local bx, by, bz = get_look_bias(look_dir) + for _,emitter in ipairs( + core.find_nodes_with_meta( + pos:offset(-effervescence.settings.environmental.radius_x + bx,-effervescence.settings.environmental.radius_y + by,-effervescence.settings.environmental.radius_z + bz), + pos:offset(effervescence.settings.environmental.radius_x + bx,effervescence.settings.environmental.radius_y + by,effervescence.settings.environmental.radius_z + bz) + )) do + local hash = core.hash_node_position(emitter) + if not already_emitted[hash] then + local particles = core.get_meta(emitter):get("effervescence.particles") + if particles and math.random(1,100) <= effervescence.settings.environmental.chance then + particles = particles:split(",") + local r = math.random(1,#particles) + local len = #particles + for i = r, len + r - 1, 1 do + local particle = effervescence.environmental_particles[particles[i % len + 1]] + if particle and particle:check(emitter) then + local pdef = particle:emit(emitter) + pdef.playername = pname, + core.add_particlespawner(pdef) + already_emitted[hash] = true + break + end + end + end + end + end + end + end + end + end +else + environmental_particles = function() + -- no-op; environmental particles are disabled + end +end + +-- Player walk particles +local player_particles +if effervescence.settings.player.enabled then + -- Lookup map of players to particle trigger time + local ptime = {} + + -- Initialize player in map on join + core.register_on_joinplayer(function(player) + ptime[player:get_player_name()] = effervescence.settings.player.interval + end) + + -- Remove player time + core.register_on_leaveplayer(function(player) + ptime[player:get_player_name()] = nil + end) + + -- Particle spawning function + player_particles = function(dtime) + for _,player in ipairs(core.get_connected_players()) do + if player then + local pname = player:get_player_name() + if ptime[pname] then + ptime[pname] = ptime[pname] - dtime + if ptime[pname] < 0 then + ptime[pname] = effervescence.settings.player.interval + for name,particle in pairs(effervescence.player_particles) do + if particle:check(player) then + core.add_particlespawner(particle:emit(player)) + end + end + end + end + end + end + end +else + player_particles = function() + -- no-op; player particles are disabled + end +end + +-- Particle trigger loop +core.register_globalstep(function(dtime) + environmental_particles(dtime) + player_particles(dtime) +end) + +-- Identify target nodes and decorators +core.register_on_mods_loaded(function() + -- Node-particle map setup + local npmap = {} + for decorator,_ in pairs(effervescence.decorators) do + npmap[decorator] = {} + end + + for node,ndef in pairs(core.registered_nodes) do + -- Environmental particles + for particle,pdef in pairs(effervescence.environmental_particles) do + local decorators = pdef:applies_to(node,ndef) or {} + for _,decorator in ipairs(decorators) do + npmap[decorator][node] = npmap[decorator][node] or {} + table.insert(npmap[decorator][node],particle) + end + end + + -- Player particles + for particle,pdef in pairs(effervescence.player_particles) do + pdef:applies_to(node,ndef) + end + end + + -- Apply particles to decorators + for name,decorator in pairs(effervescence.decorators) do + decorator:apply_to(npmap[name]) + end + + -- Hack for VoxelLibre/Mineclonia + local oggcm = core.get_current_modname + core.get_current_modname = function() + return "effervescence" + end + + -- Trigger decorators during mapgen + core.register_on_generated(function(minp, maxp, blockseed) + for name,decorator in pairs(effervescence.decorators) do + decorator:decorate(minp, maxp, blockseed) + end + end) + + -- Undo hack + core.get_current_modname = oggcm +end) \ No newline at end of file diff --git a/mods/effervescence/effervescence/mod.conf b/mods/effervescence/effervescence/mod.conf new file mode 100644 index 00000000..7ce4c3bb --- /dev/null +++ b/mods/effervescence/effervescence/mod.conf @@ -0,0 +1,5 @@ +name = effervescence +title = Effervescence +description = Add a subtle touch of life to your worlds with effervescent particles +author = EmptyStar +optional_depends = asuna_core, caverealms, everness \ No newline at end of file diff --git a/mods/effervescence/effervescence_decorators/init.lua b/mods/effervescence/effervescence_decorators/init.lua new file mode 100644 index 00000000..87cc5634 --- /dev/null +++ b/mods/effervescence/effervescence_decorators/init.lua @@ -0,0 +1,113 @@ +local strategy = { + -- decoration-based gennotify node selection strategy + gennotify = { + register = function(self, name, ddef) + ddef.name = name + effervescence.register_decorator({ + name = name, + apply_to = function(self, npmap) + local nlist = {} + for node,particles in pairs(npmap) do + table.insert(nlist,node) + npmap[node] = table.concat(particles,",") + end + self.nodes = npmap + + ddef.place_on = nlist + core.register_decoration(ddef) + + self.did = core.get_decoration_id(name) + core.set_gen_notify({ decoration = true },{ self.did }) + self.did = "decoration#" .. self.did + end, + decorate = function(self, minp, maxp, blockseed) + local gennotify = core.get_mapgen_object("gennotify") + local positions = gennotify[self.did] or {} + for _,pos in ipairs(positions) do + local node = core.get_node(pos).name + local particles = self.nodes[node] + if particles then + local meta = core.get_meta(pos) + meta:set_string("effervescence.particles",particles) + end + end + end, + }) + end, + }, + + -- random sample node selection strategy + sample = { + generation_id = 0, + nodelist = { init = false }, + init_decorate = function(self, blockseed) + if self.nodelist.init == false then + local nodelist = {} + for node,_ in pairs(self.nodelist) do + table.insert(nodelist,node) + end + self.nodelist = nodelist + end + if blockseed ~= self.generation_id then + self.generation_id = blockseed + local _, emin, emax = core.get_mapgen_object("voxelmanip") + self.nodes = core.find_nodes_in_area(emin,emax,self.nodelist,true) + end + end, + register = function(self, name, per) + local sampler = self + effervescence.register_decorator({ + name = name, + apply_to = function(self, npmap) + self.nodes = npmap + for node,particles in pairs(npmap) do + npmap[node] = table.concat(particles,",") + sampler.nodelist[node] = true + end + end, + decorate = function(self, minp, maxp, blockseed) + sampler:init_decorate(blockseed) + for node,particles in pairs(self.nodes) do + local positions = sampler.nodes[node] + if positions then + local plen = #positions + local pcgr = PcgRandom(blockseed) + for i = 0, math.floor(plen / per), 1 do + local pos = positions[pcgr:next(1,plen)] + local meta = core.get_meta(pos) + meta:set_string("effervescence.particles",particles) + end + end + end + end, + }) + end, + }, +} + +-- Register gennotify decorators +strategy.gennotify:register("effervescence:floors",{ + deco_type = "simple", + fill_ratio = 0.00375, + decoration = "air", + flags = "all_floors", +}) + +strategy.gennotify:register("effervescence:ceilings",{ + deco_type = "simple", + fill_ratio = 0.00375, + decoration = "air", + flags = "all_ceilings", +}) + +strategy.gennotify:register("effervescence:liquid_surface",{ + deco_type = "simple", + fill_ratio = 0.00425, + decoration = "air", + flags = "liquid_surface", +}) + +-- Register sample decorators +strategy.sample:register("effervescence:many",10) +strategy.sample:register("effervescence:few",50) +strategy.sample:register("effervescence:rare",250) \ No newline at end of file diff --git a/mods/effervescence/effervescence_decorators/mod.conf b/mods/effervescence/effervescence_decorators/mod.conf new file mode 100644 index 00000000..eac0207a --- /dev/null +++ b/mods/effervescence/effervescence_decorators/mod.conf @@ -0,0 +1,5 @@ +name = effervescence_decorators +title = Effervescence Builtin Decorators +description = Adds useful decorators for Effervescence +author = EmptyStar +depends = effervescence \ No newline at end of file diff --git a/mods/effervescence/effervescence_particles/init.lua b/mods/effervescence/effervescence_particles/init.lua new file mode 100644 index 00000000..aaf5d220 --- /dev/null +++ b/mods/effervescence/effervescence_particles/init.lua @@ -0,0 +1,512 @@ +-- Extract particle graphics from a node texture +local function extract_tile(tiles,color) + if not tiles then + return "blank.png" + end + + if not color and tiles.color then + color = tiles.color + end + + if type(tiles[1]) == "string" then + return tiles[1], color + elseif type(tiles[1]) == "table" then + return tiles[1].name or tiles[1].image, color + else + return "blank.png" + end +end + +local function extract_particles(tiles,color,coords) + tiles, color = extract_tile(tiles,color) + return tiles .. "^[resize:16x16^[sheet:8x8:" .. (coords or (math.random(0,7) .. "," .. math.random(0,7))) .. (color and ("^[multiply:" .. color) or "") +end + +-- Get texture blend value +local blend_method = core.features.particle_blend_clip and "clip" or "alpha" + +-- Dusty particles (sand, dry grass, etc.) +effervescence.register_environmental_particles({ + name = "effervescence:dusty", + check = function(self, pos) + return (pos.y < 0 or pos.y > 6) and core.get_node(pos:offset(0,1,0)).name == "air" + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local does_apply = (groups.stone and groups.stone > 0) or (groups.sand and groups.sand > 0) or (groups.everness_sand and groups.everness_sand > 0) or node:find("dry_") or node:find("clay") or node:find("gravel") or node:find("litter$") or node:find("podzol") + return does_apply and { "effervescence:floors" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(56,64), + time = 5, + pos = { + min = pos:add(vector.new(-6,0.575,-6)), + max = pos:add(vector.new(6,1,6)), + }, + minsize = 0.2, + maxsize = 0.275, + minvel = { x = -1, y = -0.02, z = -1 }, + maxvel = { x = 1, y = 0.02, z = 1 }, + minexptime = 6, + maxexptime = 8, + minacc = {x = -1.5, y = 0, z = -1.5}, + maxacc = {x = 1.5, y = 0.05, z = 1.5}, + texture = { + name = extract_particles(ndef.tiles,ndef.color), + blend = blend_method, + }, + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Crumbly particles (falling bits of stone, dirt, gravel, etc.) +effervescence.register_environmental_particles({ + name = "effervescence:crumbly", + check = function(self, pos) + return core.get_node(pos:offset(0,-1,0)).name == "air" + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local does_apply = (groups.stone and groups.stone > 0) or (groups.crumbly and groups.crumbly > 0) or (groups.soil and groups.soil > 0) or node:find("gravel") or node:find("ore") or node:find("moss") or node:find(":dirt_") + return does_apply and { "effervescence:ceilings" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = 6, + time = 0.5, + pos = { + min = pos:add(vector.new(-0.45,-0.75,-0.45)), + max = pos:add(vector.new(0.45,-0.9,0.45)), + }, + minvel = {x = 0, y = -5, z = 0}, + maxvel = {x = -0.1, y = -7, z = -0.1}, + minacc = {x = -0.1, y = -2, z = -0.1}, + maxacc = {x = 0.1, y = -3, z = 0.1}, + minexptime = 0.25, + maxexptime = 1, + minsize = 0.25, + maxsize = 1.25, + glow = ndef.glow or ndef.light_source, + texture = { + name = extract_particles(ndef.tiles,ndef.color), + blend = blend_method, + }, + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Bustling particles (bit of grasses and mosses lifting off the ground) +effervescence.register_environmental_particles({ + name = "effervescence:bustling", + check = function(self, pos) + return core.get_node(pos:offset(0,1,0)).name == "air" + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local does_apply = node:find("grass") or node:find("moss") or node:find("lichen") or node:find("^ethereal:.+_dirt$") or node:find("litter$") or node:find("mycelium") + return does_apply and { "effervescence:floors" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(40,48), + time = 6, + pos = { + min = pos:add(vector.new(-8,0.5,-8)), + max = pos:add(vector.new(8,0.75,8)), + }, + minvel = {x = -0.5, y = 0.1, z = -0.5}, + maxvel = {x = 0.5, y = 0.175, z = 0.5}, + minacc = {x = -0.325, y = 0.325, z = -0.325}, + maxacc = {x = 0.325, y = 0.5, z = 0.325}, + minexptime = 6, + maxexptime = 12, + minsize = 0.25, + maxsize = 0.375, + glow = ndef.glow or ndef.light_source, + texture = { + name = extract_particles(ndef.tiles,ndef.color), + blend = blend_method, + }, + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Snowy particles (snowflakes gusting up from the ground) +effervescence.register_environmental_particles({ + name = "effervescence:snowy", + check = function(self, pos) + return core.get_node(pos:offset(0,1,0)).name == "air" + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local is_snow = (groups.snowy and groups.snowy > 0) or node:find(":snow") or node:find("_with_snow") + if is_snow then + return { def.drawtype == "nodebox" and "effervescence:rare" or "effervescence:floors" } + else + return nil + end + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(8,40), + time = 2, + pos = { + min = pos:add(vector.new(-3,0,-3)), + max = pos:add(vector.new(3,0.4,3)), + }, + minvel = {x = -4, y = 2, z = -4}, + maxvel = {x = 4, y = 3, z = 4}, + minacc = {x = -1.75, y = 1, z = -1.75}, + maxacc = {x = 1.75, y = 1.5, z = 1.75}, + minexptime = 3, + maxexptime = 5, + minsize = 0.175, + maxsize = 0.225, + texture = { + name = extract_particles(ndef.tiles,ndef.color), + blend = blend_method, + }, + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Leafy particles (falling leaves and snow on leaves) +local leaves = { + air = true, -- special exception for easier check logic +} + +effervescence.register_environmental_particles({ + name = "effervescence:leafy", + check = function(self, pos) + local below = core.get_node(pos:offset(0,-1,0)).name + return leaves[below] + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local is_leaves = groups.leaves and groups.leaves > 0 + if is_leaves then + leaves[node] = true + return { "effervescence:few" } + elseif node:find(":snow$") then + return { "effervescence:many" } + else + return nil + end + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(1,2), + time = 3, + pos = { + min = pos:add(vector.new(-0.45,-0.3,-0.45)), + max = pos:add(vector.new(0.45,-0.475,0.45)), + }, + minvel = {x = -1, y = -0.75, z = -1}, + maxvel = {x = 1, y = -1.5, z = 1}, + minacc = {x = -0.75, y = -1, z = -0.75}, + maxacc = {x = 0.75, y = -1.5, z = 0.75}, + minexptime = 4, + maxexptime = 6, + minsize = 1, + maxsize = 1.5, + glow = ndef.glow or ndef.light_source, + texture = { + name = extract_particles(ndef.tiles,ndef.color), + blend = blend_method, + }, + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Blossoming particles (flower petals on the breeze) +local colors = { + black = "#000000", + white = "#ffffff", + blue = "#1f75fe", + cyan = "#00b7eb", + orange = "#ff8c00", + yellow = "#ffd700", + purple = "#6f2da8", + violet = "#6f2da8", + magenta = "#ff33cc", + red = "#ff2400", + pink = "#ffc0cb", + green = "#7cfc00", + dark_green = "#013220", + dark_gray = "#333333", + darkgray = "#333333", + grey = "#9a9a9a", + brown = "#704214", +} + +local flowers = { -- special cases listed here + ["farming:sunflower_8"] = "#ffd700", + ["farming:cotton_8"] = "#ffffff", + ["x_farming:cotton_8"] = "#ffffff", + ["dorwinion:dorwinion_glow_leaves"] = "self", + ["nightshade:nightshade_glowin_leaves_1"] = "self", + ["naturalbiomes:heatherflowernode"] = "self", + ["naturalbiomes:heatherflower2node"] = "self", + ["naturalbiomes:heatherflower3node"] = "self", + ["naturalbiomes:heatherflower4node"] = "self", +} + +effervescence.register_environmental_particles({ + name = "effervescence:blossoming", + check = function(self, pos) + return core.get_node(pos:offset(0,1,0)).name == "air" + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local is_plant = not def.walkable and def.drawtype:find("plant") and not node:find("shroom") and ((groups.flower and groups.flower > 0) or node:find("flower")) + if is_plant then + local dye = core.get_craft_result({ + method = "normal", + width = 1, + items = { node }, + }) + if not dye.item:is_empty() and dye.item:get_name():find("dye") then + local dgroups = core.registered_items[dye.item:get_name()].groups + for color,hex in pairs(colors) do + if (dgroups["color_" .. color] and dgroups["color_" .. color] > 0) or (dgroups["basecolor_" .. color] and dgroups["basecolor_" .. color] > 0) then + flowers[node] = hex + break + end + end + end + end + return flowers[node] and { "effervescence:many" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(2,3), + time = 1, + pos = { + min = pos:add(vector.new(-0.25,-0.125,-0.25)), + max = pos:add(vector.new(0.25,0.25,0.25)), + }, + minvel = {x = -3, y = -0.05, z = -3}, + maxvel = {x = 3, y = 1.5, z = 3}, + minacc = {x = -0.125, y = -0.125, z = -0.125}, + maxacc = {x = 0.125, y = 0.75, z = 0.125}, + minexptime = 3, + maxexptime = 5, + minsize = 0.375, + maxsize = 0.5, + glow = ndef.glow or ndef.light_source, + texture = { + name = extract_particles(flowers[node.name] == "self" and ndef.tiles or {[1] = "effervescence_petals.png"},flowers[node.name] ~= "self" and flowers[node.name]), + blend = blend_method, + }, + collisiondetection = true, + collision_removal = true, + vertical = false, + } + end, +}) + +-- Sporogenic particles (primarily mushrooms, glow worms, and certain vines) +effervescence.register_environmental_particles({ + name = "effervescence:sporogenic", + check = function(self, pos) + return true + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local does_apply = not def.walkable and def.drawtype:find("plant") and (node:find("glow_worm") or node:find("shroom") or node:find("fung") or node:find("myc") or node:find("coral_grass") or node:find("coral_plant") or node:find("[:_]vine") or node:find("spore") or (groups.mushroom and groups.mushroom > 0)) + return does_apply and { "effervescence:many" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(9,12), + time = 1.5, + pos = { + min = pos:add(vector.new(-0.25,-0.1,-0.25)), + max = pos:add(vector.new(0.25,0.1,0.25)), + }, + minvel = {x = -0.625, y = -0.075, z = -0.625}, + maxvel = {x = 0.625, y = -0.05, z = 0.625}, + minacc = {x = 0, y = -0.25, z = 0}, + maxacc = {x = 0, y = -0.125, z = 0}, + minexptime = 5, + maxexptime = 8, + minsize = 0.25, + maxsize = 0.325, + glow = ndef.glow or ndef.light_source or 2, + texture = { + name = extract_particles(ndef.tiles,ndef.color,"4,7"), + blend = blend_method, + }, + collisiondetection = true, + collision_removal = true, + vertical = false, + } + end, +}) + +-- Sparkly particles (glistening crystals or ice) +local neighbors = { + vector.new(0,1,0), + vector.new(1,0,0), + vector.new(0,0,1), + vector.new(-1,0,0), + vector.new(0,0,-1), + vector.new(0,-1,0), +} + +effervescence.register_environmental_particles({ + name = "effervescence:sparkly", + check = function(self, pos) + for _,direction in ipairs(neighbors) do + if core.get_node(pos:add(direction)).name == "air" then + return true + end + end + return false + end, + applies_to = function(self, node, def) + local does_apply = (def.drawtype:find("plant") and (node:find("[:_]crystal") or node:find("[:_]gem") or node:find("^caverealms:spike$") or node:find("icicle")) or node:find("[:_]ice$") or node:find("[:_]cave_ice$")) + return does_apply and { "effervescence:many" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(9,11), + time = 4, + pos = { + min = pos:add(vector.new(-0.75,-0.25,-0.75)), + max = pos:add(vector.new(0.75,0.575,0.75)), + }, + minvel = {x = 0, y = -0.05, z = 0}, + maxvel = {x = 0, y = 0, z = 0}, + minacc = {x = 0, y = 0, z = 0}, + maxacc = {x = 0, y = 0, z = 0}, + minexptime = 3, + maxexptime = 6, + minsize = 0.1, + maxsize = 0.2, + glow = ndef.glow or ndef.light_source or 2, + texture = { + name = extract_particles(ndef.tiles,nil,"4,7") .. "^[sheet:4x4:1,1^[opacity:255^[brighten", + blend = blend_method, + }, + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Tiny bubbles at the surface of water +effervescence.register_environmental_particles({ + name = "effervescence:bubbling", + check = function(self, pos) + return core.get_node(pos:offset(0,1,0)).name == "air" + end, + applies_to = function(self, node, def) + local does_apply = (def.liquidtype == "source" and node:find("[:_]water")) + return does_apply and { "effervescence:liquid_surface" } + end, + emit = function(self, pos) + local node = core.get_node(pos) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(4,6), + time = math.random(3,4), + pos = { + min = pos:add(vector.new(-0.45,0.5,-0.45)), + max = pos:add(vector.new(0.45,0.525,0.45)), + }, + minvel = {x = -0.0275, y = -0.025, z = -0.0275}, + maxvel = {x = 0.0275, y = 0, z = 0.0275}, + minacc = {x = 0, y = 0, z = 0}, + maxacc = {x = 0, y = 0, z = 0}, + minexptime = 1, + maxexptime = 2, + minsize = 1, + maxsize = 1.25, + glow = ndef.glow or ndef.light_source, + texture = extract_particles(ndef.tiles,ndef.color) .. "^[brighten^[opacity:127", + collisiondetection = false, + vertical = false, + } + end, +}) + +-- Player walk particles (bits of dirt, snow, etc. kicked up underfoot) +local walking_nodes = {} + +effervescence.register_player_particles({ + name = "effervescence:walking", + check = function(self, player) + local velocity = player:get_velocity() + if math.abs(velocity.x) > 0.025 or math.abs(velocity.z) > 0.025 then + local below = core.get_node(player:get_pos():offset(0,-0.1,0)).name + return walking_nodes[below] + end + end, + applies_to = function(self, node, def) + local groups = def.groups or {} + local does_apply = (groups.crumbly and groups.crumbly > 0) or (groups.soil and groups.soil > 0) or (groups.sand and groups.sand > 0) or (groups.leaves and groups.leaves > 0) or (groups.snowy and groups.snowy > 0) or node:find(":snow") or node:find("_with_snow") + if does_apply then + walking_nodes[node] = true + return true + else + return false + end + end, + emit = function(self, player) + local pos = player:get_pos() + local node = core.get_node(pos:offset(0,-0.1,0)) + local ndef = core.registered_nodes[node.name] + return { + amount = math.random(3,4), + time = 0.25, + pos = { + min = pos:add(vector.new(-0.45,0.175,-0.45)), + max = pos:add(vector.new(0.45,0.275,0.45)), + }, + minvel = {x = -1, y = 0.75, z = -1}, + maxvel = {x = 1, y = 1, z = 1}, + minacc = {x = 0, y = -9.81, z = 0}, + maxacc = {x = 0, y = -9.81, z = 0}, + minexptime = 1, + maxexptime = 1, + minsize = 0.75, + maxsize = 1, + glow = ndef.glow or ndef.light_source, + texture = { + name = extract_particles(ndef.tiles,ndef.color), + blend = blend_method, + }, + collisiondetection = true, + collision_removal = true, + vertical = false, + } + end, +}) \ No newline at end of file diff --git a/mods/effervescence/effervescence_particles/mod.conf b/mods/effervescence/effervescence_particles/mod.conf new file mode 100644 index 00000000..4333e062 --- /dev/null +++ b/mods/effervescence/effervescence_particles/mod.conf @@ -0,0 +1,5 @@ +name = effervescence_particles +title = Effervescence Builtin Particle Effects +description = Adds builtin effervescent particles that will work with many Luanti games +author = EmptyStar +depends = effervescence, effervescence_decorators \ No newline at end of file diff --git a/mods/effervescence/effervescence_particles/textures/LICENSE b/mods/effervescence/effervescence_particles/textures/LICENSE new file mode 100644 index 00000000..fe2a8a9f --- /dev/null +++ b/mods/effervescence/effervescence_particles/textures/LICENSE @@ -0,0 +1,25 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Textures and Models by Liil/Wilhelmine/ under (MIT) License (c) 2022 +Thanks to ShadMOrdre (https://github.com/ShadMOrdre) for fixing the schematics/leaf decay. \ No newline at end of file diff --git a/mods/effervescence/effervescence_particles/textures/effervescence_petals.png b/mods/effervescence/effervescence_particles/textures/effervescence_petals.png new file mode 100644 index 00000000..736684a2 Binary files /dev/null and b/mods/effervescence/effervescence_particles/textures/effervescence_petals.png differ diff --git a/mods/effervescence/modpack.conf b/mods/effervescence/modpack.conf new file mode 100644 index 00000000..9dc43436 --- /dev/null +++ b/mods/effervescence/modpack.conf @@ -0,0 +1,4 @@ +name = effervescence +title = Effervescence +description = Adds a subtle touch of life to Luanti worlds with ambient particle effects +author = EmptyStar \ No newline at end of file diff --git a/mods/effervescence/modpack.txt b/mods/effervescence/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/effervescence/settingtypes.txt b/mods/effervescence/settingtypes.txt new file mode 100644 index 00000000..fe9c0b14 --- /dev/null +++ b/mods/effervescence/settingtypes.txt @@ -0,0 +1,30 @@ +[Environmental Particles] + +# Enable environmental particles? If enabled, newly generated terrain will be decorated with particles that players will see as they explore the world. +effervescence.environmental.enabled (Enable environmental particles?) bool true + +# The interval at which environmental particles will generate, every X seconds. A smaller interval will trigger particles more often but will use more system resources and vice-versa. +effervescence.environmental.interval (Particle trigger interval) float 5.25 1.0 60.0 + +# The percentage chance of environmental particles to generate per node every interval. Lower numbers generate fewer particles and vice-versa. +effervescence.environmental.chance (Chance of particles) int 29 1 100 + +# The x radius around each player in which effervescent nodes are checked for at each interval. +effervescence.environmental.radius_x (Search radius x) int 16 8 32 + +# The y radius around each player in which effervescent nodes are checked for at each interval. +effervescence.environmental.radius_y (Search radius y) int 8 4 32 + +# The z radius around each player in which effervescent nodes are checked for at each interval. +effervescence.environmental.radius_z (Search radius z) int 16 8 32 + +# The number of nodes to shift a player's search box for effervescent nodes in the environment based on the direction they're looking. This causes more particles to spawn in the direction a player is looking which creates more particles in view at the expense of fewer particles further away in the opposite direction. This number is halved for the y axis. +effervescence.environmental.look_dir_bias (Look direction bias) int 4 0 32 + +[Player Particles] + +# Show particles at player locations? If true, player-based particles will appear near players. +effervescence.player.enabled (Use player particles?) bool true + +# How often to show player walk particles, in seconds. +effervescence.player.interval (Player particles interval) float 0.5 0.1 5.0 \ No newline at end of file diff --git a/mods/ethereal/README.md b/mods/ethereal/README.md new file mode 100644 index 00000000..1a14b0e8 --- /dev/null +++ b/mods/ethereal/README.md @@ -0,0 +1,539 @@ +minetest mod ethereal NG +====================== + +## Information +-------------- + +This mod is named `ethereal`, it produces huge amount of new biomes +overriding defaults, many new items and features that spice up gameplay. + +Known as Ethereal NG (next-generation) it give players that +little something extra to look for while exploring the world. + +![screenshot.png](screenshot.png) + +Forum Topic https://forum.minetest.net/viewtopic.php?f=11&t=14638 + +TODO: +* document items and crafting + +#### Lucky Blocks + +It provides 66 new lucky blocks if the mod is detected. + +## Technical info +----------------- + +#### Compatibility + +Make sure you are using Minetest 0.4.16+ and start a new world (anything but v6), +then enable Ethereal in the mods list. Ethereal has been designed to work +alongside with those mods: + +* default +* flowers +* Farming Redo `farming` +* Mobs Redo, `mobs` +* Baked Clay `backedclay` +* stairs + +Also those more as optional: + +* Lucky Block `lucky_block` +* doors +* moreblocks +* toolranks + +#### Settings and Biome List + +| name setting | Description | values | default | +| ------------------------------ | --------------------------------- | ---- | ------ | +| ethereal.leaftype | 2D plantlike leaves (0) or 3D (1) | int | 0 | +| ethereal.leafwalk | Walkable leaves | bool | false | +| ethereal.cavedirt | Caves cut through dirt | bool | true | +| ethereal.torchdrop | Torches drop when in water | bool | true | +| ethereal.papyruswalk | Papyrus and Bamboo are walkable | bool | true | +| ethereal.lilywalk | Lilypads are walkable | bool | true | +| ethereal.xcraft | Enable X-Craft cheats | bool | true | +| ethereal.flight | Enable Flight Potion | bool | true | +| ethereal.leaf_particles | Enable falling lead particles | bool | true | +| ethereal.glacier | Glacier biome, 1=on / 0=off | int | 1 | +| ethereal.bambo | Bamboo biome, 1=on / 0=off | int | 1 | +| ethereal.mesa | Mesa biome, 1=on / 0=off | int | 1 | +| ethereal.alpine | Alpine biome, 1=on / 0=off | int | 1 | +| ethereal.healing | Healing Tree biome, 1=on / 0=off | int | 1 | +| ethereal.snowy | Pine Tree biome, 1=on / 0=off | int | 1 | +| ethereal.frost | Blue Frost biome, 1=on / 0=off | int | 1 | +| ethereal.grassy | Grassy biome, 1=on / 0=off | int | 1 | +| ethereal.caves | Desertstone biome, 1=on / 0=off | int | 1 | +| ethereal.grayness | Grey Willow biome, 1=on / 0=off | int | 1 | +| ethereal.grassytwo | GrassyTwo biome, 1=on / 0=off | int | 1 | +| ethereal.prairie | Prairie biome, 1=on / 0=off | int | 1 | +| ethereal.jumble | Jumble biome, 1=on / 0=off | int | 1 | +| ethereal.junglee | Jungle biome, 1=on / 0=off | int | 1 | +| ethereal.desert | Desert biome, 1=on / 0=off | int | 1 | +| ethereal.grove | Banana Grove biome, 1=on / 0=off | int | 1 | +| ethereal.mushroom | Mushroom biome, 1=on / 0=off | int | 1 | +| ethereal.sandstone | Sandstone biome, 1=on / 0=off | int | 1 | +| ethereal.quicksand | Quicksand Bank biome, 1=on / 0=off | int | 1 | +| ethereal.plains | Scorched Plains biome, 1=on / 0=off | int | 1 | +| ethereal.savanna | Savanna biome, 1=on / 0=off | int | 1 | +| ethereal.fiery | Feiry Lava biome, 1=on / 0=off | int | 1 | +| ethereal.sandclay | Sandy Clay biome, 1=on / 0=off | int | 1 | +| ethereal.swamp | Swamp biome, 1=on / 0=off | int | 1 | +| ethereal.sealife | Coral and Seaweed biome, 1=on / 0=off | int | 1 | +| ethereal.reefs | MT5 Coral biome, 1=on / 0=off | int | 1 | +| ethereal.sakura | Sakura biome, 1=on / 0=off | int | 1 | +| ethereal.tundra | Tundra biome, 1=on / 0=off | int | 1 | +| ethereal.mediterranean | Mediterranean biome, 1=on / 0=off | int | 1 | +| ethereal.flightpotion_duration | Flight Potion Duration seconds | int | 300 | + +#### Fishing api + +The mod provides a fishing api, basically is `ethereal.add_item(fish, junk, bonus)`, +several examples are at the documentation of [api.txt](api.txt) file. + +## Changelog + +A huge thanks to Chinchow who was the inspiration behind Ethereal and everyone +who helped make this mod bigger and better throughout it's release :) + +### 1.32 + - Add {eatable} groups to food items + - Use underground decoration placement for illumishrooms to improve performance + - Use worldalign textures for stairs + - Tidy and tweak code to run on Minetest 5.2 and above + - Replace 32px textures with 16px variants so items do not look mismatched + - Add new biome layout so that specific biomes aren't too large or small + - Add falling leaf particles with setting to disable + - Add 'ethereal.old_biomes' setting to stay with older biome settings and not use + the new layout for compatibility if wanted. + - Update settings. + - Candles use [multiply for colour. + - Add desert stone spikes to caves biome, and stone spikes underneath. + - Add pond schematic for generation in flat mesa areas, add new pond lucky blocks. + +### 1.31 + - Fix fishing biome checks + - Increase bamboo leaf decay radius + - Switch ethereal coral to new plantlike_rooted drawtype (thanks Niklp) + - Switch seaweed to new plantlike_rooted drawtype (thanks Niklp) + - Added 'ethereal.logs' setting that adds decorative fallen tree logs to biomes + - Added 'ethereal.sapling_protection_check' setting to use default sapling placement checks + - Added alternative giant brown mushroom to higher elevations in mushroom biome + - Added 'ethereal.wood_rotate' setting to enable/disable directional placement of wood in ethereal + +### 1.30 + - New fish textures by SirroBzeroone and BlueTangs Rock + - New fish added along with food recipes (thanks BlueTangs Rock) + - Fishing rod now has 65 uses + - Fixed willow leaves scaling and forced schematic trunk placement + - Add 11 new lucky blocks + - Caverealms' glow bait reduces wait time when fishing + - Add Basandra Bush and wood items, Add Spore Grass + - Add 'ethereal.abundant_onions' setting (default: true) + +#### 1.29 + - Use "stratum" to generate mesa biome for stripey goodness + - Added coloured candles (thanks wRothbard) + - Rename some biomes to fall inline with default for spawning + - Make stairs and doors a soft dependency, fix willow recipes (thanks sangeet) + - Added 'ethereal.flightpotion_duration' setting, potion also works on 0.4.x clients + - Added olive wood fences, gates, mese posts + - Added lilac to sakura biome (can be crafted into magenta dye) + +#### 1.28 + + - Added new Mediterranean biome with Lemon and Olive trees (thanks Felfa) + - Added Candied Lemon and Olive Oil items and recipe + - Rewrite stairs and add auto-select function + - Added Lemonade + - Added smaller redwood trees, to grow large variety 2 saplings required + - Added Flight Potion (etherium dust arch, fire dust middle, empty bottle bottom) + - Added new Fishing mechanics (inspired by Rootyjr's on mineclone2) + - Added fishing api to add new items (read API.txt file) + - Certain fish can only be found in specific biomes + - Rename textures so they begin with ethereal_ (sorry texture pack folks) + - Override mushroom spread abm to use "group:mushroom" + +#### 1.27 + + - Added Etherium ore and dust + - Added sparse decoration of dry grass and shrub to caves biome + - Added sponges that spawn near coral, dry sponge in furnace to soak up water + - Added new savanna dirt and decorations + - Use default grass abms + - Split and re-write mapgen files for tidier generation + - Giant Mushroom tops now decay when trunk removed + - Added Blue Marble to grey biomes and Blue Marble Tile recipe + +#### 1.26 + + - Added Sakura biome, pink sakura trees and saplings + - 1 in 10 chance of sakura sapling growing into white sakura + - Bamboo grows in higher elevation while sakura grows in lower + - Added sakura wood, stairs, fence, gate and door + - Added 5.0 checks to add new biomes and decorations + - Fixed water abm for dry dirt and added check for minetest 5.1 dry dirt also + +#### 1.25 + + - Converted .mts files into schematic tables for easier editing + - Added firethorn shrub in glacier areas (can be crafted into jelly) + - Tweaked mapgen decorations + - Added more lucky blocks + - Added igloo to glacier biome + - 2x2 bamboo = bamboo floor, 3x3 bamboo or 2x bamboo floor = bamboo block, blocks can be made into sticks, bamboo stairs need blocks to craft + +#### 1.24 + + - Updating code to newer functions, requires Minetest 0.4.16 and above + - Added food groups to be more compatible with other food mods + - Bonemeal removed (use Bonemeal mod to replace https://forum.minetest.net/viewtopic.php?f=9&t=16446 ) + - Crystal Ingot recipe requires a bucket of water, unless you are using builtin_item mod where you can mix ingredients by dropping in a pool of water instead + +#### 1.23 + + - Added bonemeal support for bush sapling and acacia bush sapling + - Added support for [toolranks] mod if found + - Reworked Crystal Shovel so it acts more like a normal shovel with soft touch + +#### 1.22 + + - Added coral and silver sand to mapgen (0.4.15 only) + - Replaced ethereal:green_dirt with default:dirt_with_grass for mortrees compatibility + - Mesa biomes are now topped with dirt with dry grass (redwood saplings grow on dry grass) + - Added bonemeal support for moretree's saplings + - Added settings.conf file example so that settings remain after mod update + - Added support for Real Torch so that torches near water drop an unlit torch + - Added support for new leafdecay functions (0.4.15 dev) + - Mapgen will use dirt_with_rainforest_litter for jungles if found + - Added bushes to mapgen + +#### 1.21 + + - Saplings need clear space above to grow (depending on height of tree) + - Bonemeal changes to suit new sapling growth + - Fixes and tweaks + - Added default Abm overrides + - Added 4 new plants from baked clay mod to mapgen + - Added swamp biome to outskirts of bamboo areas + +#### 1.20 + +- Tweaked Ethereal to work with new features and nodes in Minetest 0.4.14 +- Added bones found in dirt and bonemeal to make tree's and crops grow quicker +- Tree's follow default rules where saplings need light to grow +- Using default schematics for apple, pine, acacia and jungle tree's +- Tidied and split code into separate files +- Redid coloured grass spread function to run better +- Added support for moreblock's stairsplus feature + +#### 1.19 + +- Added new biome routine to help restructure biomes +- Tweaked biome values so that they are more spread out (no more huge bamboo biome) +- Tweaked biome plant and tree decorations +- Fixed farming compatibility when using hoe on ethereal dirt +- Dirt with dry grass turns into green grass when near water +- Ice or snow above sea level melts into river water +- Disabling ethereal biomes no longer shows error messages +- Fire Flowers re-generate, can also be made into Fire Dust and both are fuel +- Optimize and tidy code + +#### 1.18 + +- Added Birch tree, also stairs; fence and gate +- Added Fire flower to fiery biomes (careful, it hurts) +- Tweaked biomes and decoration slightly +- Added tree_tool for admin to quickly grow tree's +- Cobble to Mossycobble when near water has been toned down a bit + +#### 1.17 + +- Added new Glacier biome filled with snow and ice +- Changed Mesa biome to have more coloured clay patterns +- Changed Bamboo biome to have tall tree-like stalks with leaves that give +- Bamboo sprouts are now saplings to grow new stalks +- Removed farmed mushrooms and replaced with default game mushrooms with spores + +#### 1.16 + +- Added new tree schematics that change when placed with random leaves, fruit and height +- Changed frost dirt so that it no longer freezes water (saves lag) +- Torches cannot be placed next to water, otherwise they drop as items +- Added latest farming redo Bean Bushes to mapgen +- Code tidy (thanks HybridDog) and bug fix +- Banana, Orange and Apple fruits now drop when tree has been removed. + +#### 1.15 + +- Added Staff of Light (thanks Xanthin), crafted from illumishrooms and can turn stone into glostone and back again +- Changed how Crystal Spikes reproduce +- Crystal Ingots now require 2x mese crystal and 2x crystal spikes to craft +- Removed obsidian brick & stairs now they are in default game, also removed pine wood stairs for same reason +- Tidied code and optimized a few routines + + +#### 1.14 + +- Changed Ethereal to work with Minetest 0.4.11 update and new mapgen features +- Changed Pine tree's to use default pine wood +- Added pine wood fence, gate and stairs +- Crystal Spikes now re-generate in crystal biomes +- Removed layer mapgen, keeping spread as default + + +#### 1.13 + +- Changed melting feature to work with 0.4.11 pre-release now that group:hot and group:melt have been removed + + +#### 1.12 + +- Added ability to disable biomes in the init.lua file by setting to 1 (enable) or 0 (disable) +- Supports Framing Redo 1.10 foods + + +#### 1.11 + +- Added Stairs for Ethereal wood types, mushroom, dry dirt, obsidian brick and clay +- Added Green Coral which can be used as green dye +- Craft 5x Ice in X pattern to give 5x Snow +- Added Snow and Ice Bricks with their own stairs and slabs which melt when near heat + + +#### 1.10 + +- Added Stone Ladders (another use for cobble) +- Craft 5x Gravel in X pattern to give 5 dirt, and 5x dirt in X pattern for 5 sand +- Added Acacia tree's to desert biome (a nice pink wood to build with, thanks to VanessaE for textures) +- Added Acacia fences and gates +- Added Vines, craftable with 2x3 leaves + + +#### 1.09 + +- Fixed Quicksand bug where player see's only black when sinking instead of yellow effect, note this will only work on new maps or newly generated areas of map containing quicksand +- Hot nodes will melt ice and snow in a better way +- Few spelling errors sorted for sapling and wood names + + +#### 1.08 + +- Saplings produce better placed tree's when grown, routines have been redone +- Orange tree's now spawn in prairie biomes +- The usual code tidy and few bug fixes along the way + +#### 1.07 + +- If Farming Redo mod detected then it's growing routines will be used for Ethereal plantlife instead of default +Leaftype and Mapstyle settings can be changed within init.lua file, new layered style maps are being tested +Changed crafting recipe for Fences, they tie in with Gates a little better + +#### 1.06 + +- Added support for Farming Redo mod, all plants spawn on newly generated areas: + - https://forum.minetest.net/viewtopic.php?id=9019 + +#### 1.05b + +- Added Gates for each of the fence types (thanks to Blockmen for gate model) +- Players can no longer jump over fences unless they wear crystal boots < REMOVED + +#### 1.04 + +- Farming of Mushrooms, Wild Onions and Strawberries now use minetest 0.4.10 functions +- Strawberries can be grown by using actual fruit, seeds no longer needed +- Tree leaves are no longer walkable, player can go through them +- Saplings now fall if block underneath disturbed + +#### 1.03 + +- Changed Fence recipe's so it doesn't interfere with 3d armor's wooden boots +- Tweaked textures to bring down file sizes +- Flowers, Sprouts and Ferns now spread over ALL grassland + +#### 1.02 + +- Fences added for each type of wood in Ethereal +- Changes to biome settings, less artifacts + +#### 1.01 + +- Quicksand generates throughout world near sandy water +- Bamboo as well as Papyrus now grow on dirt near water +- Fixed Coral textures and light + +#### 1.00 + +- Seaweed now spawns in deep water and can grow up to 10 high +- Coral also spawns in deep water and glows slightly (orange, pink and blue) +- Above items can be crafted into dye, also Seaweed is edible +- So long as sand isn't disturbed under the ocean, sealife will re-generate +- Fixed Leaves inventory images and Mushroom selection box (thanks Wuzzy) + +#### 0.0.9 +##### 0.0.9p + +- Willow Trees now spawn in grey biome instead of tiny grey trees (model by Phiwari123) +- Redwood Trees now spawn in Mesa biome (model by Wes42033) +- BakedClay mod no longer required for Mesa biome but used if found +- Paper Wall added + +##### 0.0.9o + +- Added Obsidian Brick craft for building +- Changed Illumishroom cave levels +- Changed *is_ground_content* to false for ethereal dirt so mapgen doesn't carve it up with caves + +##### 0.0.9n + +- New textures for farming mushrooms and spores +- Illumi-shrooms spawn in caves to brighten things up a little +- Crafting a wooden sign now gives 4 instead of 1 + +##### 0.0.9m + +- Changed Bamboo biome slightly, Bamboo Sprout has new image +- Abm timings changed and a few bugs fixed +- Crystal Gilly Staff has to be used (left-click) to replenish air while underwater +- Crystal Shovel now works with protection mods +- Tidied code and changed ladder recipe's to double output + +##### 0.0.9L + +- Scorched Tree's are now different sizes +- Crystal Shovel with soft touch can now be used to dig up sand and gravel +- Bamboo and Papyrus drop entire stalk when bottom node dug +- Crystal Spikes require steel pick or better to dig and fall when dirt below is removed +- Few changes to mapgen and water functions + +##### 0.0.9k + +- Fixed bug in charcoal lumps (no more placing as unknown nodes) +- Added Crystal Shovel with soft touch, can be used to dig up dirt with grass intact +- Fixed bug in Crystal Shovel, now works with dirt_with_snow and has sounds +- Tweaked Fiery Biomes slightly, smaller craters on outside, large in hotter areas + +##### 0.0.9i + +- Cleaned up mapgen_v7.lua file, maps now generate a little faster +- Removed cactus.mts, no longer required +- Removed mushroomtwo.mts, no longer required +- Removed bamboo.mts, no longer required +- Removed deadtree.mts, no longer required +- Few new textures added +- Papyrus also spawns on jungle dirt near water +- Replaced dead tree's with scorched tree's +- Each scorched tree trunk crafts into 2x charcoal Lumps (fixed) +- Torches can also be crafted from Charcoal + +##### 0.0.9h + +- Added Strawberry farming, Strawberry Seeds and new Textures +- Tidied up mapgen_v7.lua for better spawning of plants and trees +- Player can no longer walk through Bamboo Stalks + +##### 0.0.9g + +- Changed Ethereal's growing routine for Saplings, it now uses 1 single abm to grow all tree's + +##### 0.0.9f + +- Added Fishing to Ethereal, Fishing Rod, Worms, Fish and Cooked Fish (Left-click the water with a Baited Rod in the hope of landing your prize) + +##### 0.0.9e + +- Changed textures for Bowl, Mushroom Soup, Crystal Spike, Banana Loaf, Strawberry & Bush +- Added Hearty Stew Recipes +- If BakedClay mod is installed, Mesa Biome will be added to the mix + +##### 0.0.9d + +- Added Bamboo Grove and Bamboo Sprouts ) +- Craft Bamboo into Paper and Bamboo Flooring +- Cactus is now edible when crafted beside empty bucket + +##### 0.0.9c + +- Code re-worked so mod now uses sections for each function (easier to read and edit) +- New textures for Strawberry Bush and Crystal Spikes + +##### 0.0.9b + +- Pine Tree Leaves have new texture and sometimes give Pine Nuts +- Jungle Tree's now use default Jungle Wood as texture + +##### 0.0.9 + +- Prairie, Grove, Jungle and Snowy biomes have their own dirt +- Saplings will only grow in the biomes they were taken from +- Mapgen tweaks and code changes for new dirt added + +#### 0.0.8 Changes +##### 0.0.8m + +- Added Banana Trunk and Wood +- Added Boston Ferns to Grove biome +- Added edible Fern Tubers +- Mushroom Biome now has different sized mushrooms +- Changed Pine Needles texture + +##### 0.0.8k + +- Added Desert Sand biome +- Added Alpine biome with Pine Trees and Snow +- Added Grove biome with Banana Tree's (saplings only grow in that temperate area) +- Added Bananas, Banana Dough and Banana Bread +- Changed biome generation to be more like real-world environs (e.g. shrooms like hot & humid so that's where they spawn) +- Tidied up code and removed redundant lines + +##### 0.0.8e + +- New Plains biome added between Fiery and Green areas to hopefully stop forest fires, these have dry dirt and dead trees +- Placing water near Dry Dirt turns it into normal dirt, cooking normal dirt changes it into Dry Dirt + +Note: if your Ethereal world does have a few forest fires appearing you can always add this line to your minetest.conf file: + +disable_fire = true + +##### 0.0.8 + +- Healing Tree (grows on high snowy peaks, leaves are edible and golden apples heal all hearts) +- Added some new images for Cooked Mushroom Soup, Mushroom Spores and Palm Trees +- 2D leaves or 3D leaves option, both wave in wind if enabled +- All new saplings can grow on their native dirt, and palm tree's on sand +- Crystal Spike or Crystal Dirt freezes nearby water, Heat can also melt ice +- Wild Mushrooms now give Spores, plant these to grow edible mushrooms +- Cobble in water turns mossy +- Palm Leaves can be cooked into Palm Wax and made into Candles + +#### 0.0.7c + +- Gravel can be found under lake biomes (or craft 5 cobble in X pattern) +- Papyrus is found and grows on dirt near water (also craft 2x3 string for paper) +- Mushroom Heads have a chance of giving Mushroom Sapling (craft 1 head = 4x Mushrooms ready for Planting) +- Trees and Mushrooms have a chance of giving Saplings +- Frost Trunk and Mushroom Trunk are rotatable (craft 1 Mushroom Trunk = 4x White Dye) +- Desert areas have Dry Shrubs added +- Crystal Spikes added to Crystal Biome (watch out they hurt) +- Crystal Ingots added to make Sword and Pick +- New Pine Tree model added to snowy biome which adds Pine leaves and drops Pine Saplings +- Fixed GrassyTwo biome so that BigTree now spawns and grows from sapling +- Added Crystal Gilly Staff to allow breathing underwater (so long as it's in hand) +- Added Palm Trees, Trunk, Wood, Sapling, Coconuts, Coconut Slice (to eat) +- Thanks to VanessaE's for the Palm textures + +## LICENSE + +* Code: + * The MIT License (MIT) Copyright (c) 2016 TenPlus1 +* Art: + * Free textures from lisheng2121 (shutterstock) + * Free textures from epicwannehz, Altairas, JMArtsDesign + * Some from Royalty Free SFX from dreamstime.com + * Others + +Complete details are at the [license.txt](license.txt) file. + diff --git a/mods/ethereal/alt_textures/ethereal_bamboo_floor_32px.png b/mods/ethereal/alt_textures/ethereal_bamboo_floor_32px.png new file mode 100644 index 00000000..1a83cb91 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_bamboo_floor_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_banana_bread_32px.png b/mods/ethereal/alt_textures/ethereal_banana_bread_32px.png new file mode 100644 index 00000000..d309ff80 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_banana_bread_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_banana_leaf_32px.png b/mods/ethereal/alt_textures/ethereal_banana_leaf_32px.png new file mode 100644 index 00000000..5800cbfc Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_banana_leaf_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_banana_wood_alt.png b/mods/ethereal/alt_textures/ethereal_banana_wood_alt.png new file mode 100644 index 00000000..1142c195 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_banana_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/ethereal_basandra_bush_wood_32px.png b/mods/ethereal/alt_textures/ethereal_basandra_bush_wood_32px.png new file mode 100644 index 00000000..16d63280 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_basandra_bush_wood_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_blue_marble_32px.png b/mods/ethereal/alt_textures/ethereal_blue_marble_32px.png new file mode 100644 index 00000000..5625fd48 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_blue_marble_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_blue_marble_tile_32px.png b/mods/ethereal/alt_textures/ethereal_blue_marble_tile_32px.png new file mode 100644 index 00000000..f40315c1 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_blue_marble_tile_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_bowl_32px.png b/mods/ethereal/alt_textures/ethereal_bowl_32px.png new file mode 100644 index 00000000..486bd7bb Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_bowl_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_crystal_spike_32px.png b/mods/ethereal/alt_textures/ethereal_crystal_spike_32px.png new file mode 100644 index 00000000..61b4d88e Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_crystal_spike_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_frost_wood_alt.png b/mods/ethereal/alt_textures/ethereal_frost_wood_alt.png new file mode 100644 index 00000000..0361ed60 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_frost_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/ethereal_hearty_stew_32px.png b/mods/ethereal/alt_textures/ethereal_hearty_stew_32px.png new file mode 100644 index 00000000..b3ac2c00 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_hearty_stew_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_illumishroom_cyan_32px.png b/mods/ethereal/alt_textures/ethereal_illumishroom_cyan_32px.png new file mode 100644 index 00000000..afc5311b Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_illumishroom_cyan_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_illumishroom_green_32px.png b/mods/ethereal/alt_textures/ethereal_illumishroom_green_32px.png new file mode 100644 index 00000000..0921c645 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_illumishroom_green_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_illumishroom_red_32px.png b/mods/ethereal/alt_textures/ethereal_illumishroom_red_32px.png new file mode 100644 index 00000000..9cd55750 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_illumishroom_red_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_lemon_leaves_32px.png b/mods/ethereal/alt_textures/ethereal_lemon_leaves_32px.png new file mode 100644 index 00000000..94c4c463 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_lemon_leaves_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_lemonade_32px.png b/mods/ethereal/alt_textures/ethereal_lemonade_32px.png new file mode 100644 index 00000000..c80eb4d7 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_lemonade_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_mushroom_brown_sapling_32px.png b/mods/ethereal/alt_textures/ethereal_mushroom_brown_sapling_32px.png new file mode 100644 index 00000000..0aecb684 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_mushroom_brown_sapling_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_mushroom_sapling_32px.png b/mods/ethereal/alt_textures/ethereal_mushroom_sapling_32px.png new file mode 100644 index 00000000..5d219225 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_mushroom_sapling_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_mushroom_soup_32px.png b/mods/ethereal/alt_textures/ethereal_mushroom_soup_32px.png new file mode 100644 index 00000000..4d4a5b35 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_mushroom_soup_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_olive_fruit_32px.png b/mods/ethereal/alt_textures/ethereal_olive_fruit_32px.png new file mode 100644 index 00000000..1b038dfd Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_olive_fruit_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_olive_leaves_32px.png b/mods/ethereal/alt_textures/ethereal_olive_leaves_32px.png new file mode 100644 index 00000000..6f450c85 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_olive_leaves_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_olive_trunk_32px.png b/mods/ethereal/alt_textures/ethereal_olive_trunk_32px.png new file mode 100644 index 00000000..4ac03d69 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_olive_trunk_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_olive_trunk_top_32px.png b/mods/ethereal/alt_textures/ethereal_olive_trunk_top_32px.png new file mode 100644 index 00000000..bff6b7e6 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_olive_trunk_top_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_olive_wood_alt.png b/mods/ethereal/alt_textures/ethereal_olive_wood_alt.png new file mode 100644 index 00000000..ad7a06d0 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_olive_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/ethereal_orange_leaves_32px.png b/mods/ethereal/alt_textures/ethereal_orange_leaves_32px.png new file mode 100644 index 00000000..ea83d98c Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_orange_leaves_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_redwood_trunk_32px.png b/mods/ethereal/alt_textures/ethereal_redwood_trunk_32px.png new file mode 100644 index 00000000..fc6a3258 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_redwood_trunk_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_redwood_trunk_top_32px.png b/mods/ethereal/alt_textures/ethereal_redwood_trunk_top_32px.png new file mode 100644 index 00000000..40ca89e4 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_redwood_trunk_top_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_redwood_wood_32px.png b/mods/ethereal/alt_textures/ethereal_redwood_wood_32px.png new file mode 100644 index 00000000..9991ed77 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_redwood_wood_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_redwood_wood_alt.png b/mods/ethereal/alt_textures/ethereal_redwood_wood_alt.png new file mode 100644 index 00000000..01e90dac Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_redwood_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/ethereal_sakura_trunk_32px.png b/mods/ethereal/alt_textures/ethereal_sakura_trunk_32px.png new file mode 100644 index 00000000..82d19bd1 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_sakura_trunk_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_sakura_trunk_top_32px.png b/mods/ethereal/alt_textures/ethereal_sakura_trunk_top_32px.png new file mode 100644 index 00000000..eb949929 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_sakura_trunk_top_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_sakura_wood_32px.png b/mods/ethereal/alt_textures/ethereal_sakura_wood_32px.png new file mode 100644 index 00000000..b73380b4 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_sakura_wood_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_sakura_wood_alt.png b/mods/ethereal/alt_textures/ethereal_sakura_wood_alt.png new file mode 100644 index 00000000..95012a3a Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_sakura_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/ethereal_strawberry_32px.png b/mods/ethereal/alt_textures/ethereal_strawberry_32px.png new file mode 100644 index 00000000..5b43e6bc Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_strawberry_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_teriyaki_beef_32px.png b/mods/ethereal/alt_textures/ethereal_teriyaki_beef_32px.png new file mode 100644 index 00000000..613adb99 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_teriyaki_beef_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_wild_onion.png b/mods/ethereal/alt_textures/ethereal_wild_onion.png new file mode 100644 index 00000000..0ba1537e Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_wild_onion.png differ diff --git a/mods/ethereal/alt_textures/ethereal_wild_onion_1.png b/mods/ethereal/alt_textures/ethereal_wild_onion_1.png new file mode 100644 index 00000000..f24ea5f3 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_wild_onion_1.png differ diff --git a/mods/ethereal/alt_textures/ethereal_wild_onion_2.png b/mods/ethereal/alt_textures/ethereal_wild_onion_2.png new file mode 100644 index 00000000..0393a72f Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_wild_onion_2.png differ diff --git a/mods/ethereal/alt_textures/ethereal_wild_onion_3.png b/mods/ethereal/alt_textures/ethereal_wild_onion_3.png new file mode 100644 index 00000000..7709f34f Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_wild_onion_3.png differ diff --git a/mods/ethereal/alt_textures/ethereal_wild_onion_4.png b/mods/ethereal/alt_textures/ethereal_wild_onion_4.png new file mode 100644 index 00000000..ed0116d7 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_wild_onion_4.png differ diff --git a/mods/ethereal/alt_textures/ethereal_wild_onion_5.png b/mods/ethereal/alt_textures/ethereal_wild_onion_5.png new file mode 100644 index 00000000..d391a2eb Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_wild_onion_5.png differ diff --git a/mods/ethereal/alt_textures/ethereal_willow_trunk_32px.png b/mods/ethereal/alt_textures/ethereal_willow_trunk_32px.png new file mode 100644 index 00000000..f7e15174 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_willow_trunk_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_willow_trunk_top_32px.png b/mods/ethereal/alt_textures/ethereal_willow_trunk_top_32px.png new file mode 100644 index 00000000..cf3305ef Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_willow_trunk_top_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_willow_twig_64px.png b/mods/ethereal/alt_textures/ethereal_willow_twig_64px.png new file mode 100644 index 00000000..83d489d3 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_willow_twig_64px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_willow_wood_32px.png b/mods/ethereal/alt_textures/ethereal_willow_wood_32px.png new file mode 100644 index 00000000..180f2992 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_willow_wood_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_willow_wood_alt.png b/mods/ethereal/alt_textures/ethereal_willow_wood_alt.png new file mode 100644 index 00000000..eb130398 Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_willow_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/ethereal_worm_32px.png b/mods/ethereal/alt_textures/ethereal_worm_32px.png new file mode 100644 index 00000000..ceb5fece Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_worm_32px.png differ diff --git a/mods/ethereal/alt_textures/ethereal_yellow_wood_alt.png b/mods/ethereal/alt_textures/ethereal_yellow_wood_alt.png new file mode 100644 index 00000000..f5e5278e Binary files /dev/null and b/mods/ethereal/alt_textures/ethereal_yellow_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/moretrees_birch_wood_alt.png b/mods/ethereal/alt_textures/moretrees_birch_wood_alt.png new file mode 100644 index 00000000..dda4178f Binary files /dev/null and b/mods/ethereal/alt_textures/moretrees_birch_wood_alt.png differ diff --git a/mods/ethereal/alt_textures/moretrees_palm_wood_alt.png b/mods/ethereal/alt_textures/moretrees_palm_wood_alt.png new file mode 100644 index 00000000..7bf8448f Binary files /dev/null and b/mods/ethereal/alt_textures/moretrees_palm_wood_alt.png differ diff --git a/mods/ethereal/ambience.lua b/mods/ethereal/ambience.lua new file mode 100644 index 00000000..02cecdf8 --- /dev/null +++ b/mods/ethereal/ambience.lua @@ -0,0 +1,46 @@ + +-- mushroom biome + +ambience.add_set("ethereal_mushroom", { + + frequency = 40, + + sounds = { + {name = "ethereal_mushroom", length = 1.3, ephemeral = true}, + {name = "ethereal_mushroom", length = 1.3, pitch = 0.9, ephemeral = true}, + {name = "ethereal_mushroom", length = 1.3, pitch = 1.2, ephemeral = true}, + }, + + nodes = ({"ethereal:mushroom_trunk", "ethereal:mushroom_dirt"}), + + sound_check = function(def) + + local c = (def.totals["ethereal:mushroom_trunk"] or 0) + local d = (def.totals["ethereal:mushroom_dirt"] or 0) + + if c > 30 and d > 70 then return "ethereal_mushroom" end + end +}) + +-- frost biome + +ambience.add_set("ethereal_crystal", { + + frequency = 50, + + sounds = { + {name = "ethereal_crystal", length = 2.3, gain = 2.0, ephemeral = true}, + {name = "ethereal_crystal", length = 2.3, gain = 2.0, pitch = 0.9, ephemeral = true}, + {name = "ethereal_crystal", length = 2.3, gain = 2.0, pitch = 1.1, ephemeral = true}, + }, + + nodes = ({"ethereal:crystal_spike", "ethereal:crystal_dirt"}), + + sound_check = function(def) + + local c = (def.totals["ethereal:crystal_spike"] or 0) + local d = (def.totals["ethereal:crystal_dirt"] or 0) + + if c > 0 and d > 70 then return "ethereal_crystal" end + end +}) diff --git a/mods/ethereal/api.txt b/mods/ethereal/api.txt new file mode 100644 index 00000000..370e6006 --- /dev/null +++ b/mods/ethereal/api.txt @@ -0,0 +1,41 @@ +Ethereal Fishing Rod API + +Usage: + + ethereal.add_item(fish, junk, bonus) + + +Example: + +The fish, junk and bonus entries can all be entered or used seperately e.g. + +..add fish: + + ethereal.add_item("mymod:myfish", "", "") + +..add fish and junk: + + ethereal.add_item("mymod:myfish", "mymod:myjunk", "") + + +You may also use a table that not only adds an item but the biome it can be found in: + +..add fish only found in 'grassy_ocean' biome: + + ethereal.add_item({"mymod:myfish", "grassy_ocean"}, "", "") + +..add special item only found in 'frost' biome waters: + + ethereal.add_item("", "", {"ethereal:crystal_spike", "frost"}) + +.. add special item with wear level: + + ethereal.add_item("", "", "default:sword_steel 15000") + + +Please note that only Ethereal biome names can be used for specific finds, unless mod +specifically adds ethereal as an optional dependency. + + +Crystal Shovel has silk touch ability for digging blocks and returning the actual block +intact. The {no_silktouch=1} group can be used to override this. diff --git a/mods/ethereal/biome_info.json b/mods/ethereal/biome_info.json new file mode 100644 index 00000000..ec9c3f4b --- /dev/null +++ b/mods/ethereal/biome_info.json @@ -0,0 +1,74 @@ +[ +{"name": "mountain", "heat_point": 50, "humidity_point": 50, "y_min": 140, "y_max": 31000}, +{"name": "grassland", "heat_point": 50, "humidity_point": 35, "y_min": 3, "y_max": 71}, +{"name": "grassland_ocean", "heat_point": 50, "humidity_point": 35, "y_min": -192, "y_max": 2}, +{"name": "grassland_under", "heat_point": 50, "humidity_point": 35, "y_min": -31000, "y_max": -256}, +{"name": "desert", "heat_point": 92, "humidity_point": 16, "y_min": 3, "y_max": 23}, +{"name": "desert_ocean", "heat_point": 92, "humidity_point": 16, "y_min": -192, "y_max": 3}, +{"name": "desert_under", "heat_point": 92, "humidity_point": 16, "y_min": -31000, "y_max": -256}, +{"name": "bamboo", "heat_point": 45, "humidity_point": 45, "y_min": 3, "y_max": 70}, +{"name": "bamboo_ocean", "heat_point": 45, "humidity_point": 45, "y_min": -192, "y_max": 2}, +{"name": "mesa", "heat_point": 25, "humidity_point": 10, "y_min": 18, "y_max": 71}, +{"name": "mesa_redwood", "heat_point": 25, "humidity_point": 10, "y_min": 11, "y_max": 17}, +{"name": "mesa_beach", "heat_point": 25, "humidity_point": 10, "y_min": -1, "y_max": 10}, +{"name": "mesa_ocean", "heat_point": 25, "humidity_point": 10, "y_min": -192, "y_max": -2}, +{"name": "coniferous_forest", "heat_point": 45, "humidity_point": 70, "y_min": 6, "y_max": 140}, +{"name": "coniferous_dunes", "heat_point": 45, "humidity_point": 70, "y_min": 4, "y_max": 5}, +{"name": "coniferous_forest_ocean", "heat_point": 45, "humidity_point": 70, "y_min": -255, "y_max": 3}, +{"name": "coniferous_forest_under", "heat_point": 45, "humidity_point": 70, "y_min": -31000, "y_max": -256}, +{"name": "taiga", "heat_point": 25, "humidity_point": 70, "y_min": 4, "y_max": 140}, +{"name": "taiga_ocean", "heat_point": 25, "humidity_point": 70, "y_min": -255, "y_max": 3}, +{"name": "taiga_under", "heat_point": 25, "humidity_point": 70, "y_min": -31000, "y_max": -256}, +{"name": "frost_floatland", "heat_point": 5, "humidity_point": 60, "y_min": 1025, "y_max": 1750}, +{"name": "frost", "heat_point": 5, "humidity_point": 60, "y_min": 2, "y_max": 71}, +{"name": "frost_ocean", "heat_point": 5, "humidity_point": 60, "y_min": -192, "y_max": 1}, +{"name": "snowy_grassland", "heat_point": 15, "humidity_point": 58, "y_min": 3, "y_max": 30}, +{"name": "snowy_grassland_ocean", "heat_point": 15, "humidity_point": 58, "y_min": 2, "y_max": -192}, +{"name": "deciduous_forest", "heat_point": 60, "humidity_point": 68, "y_min": 3, "y_max": 91}, +{"name": "deciduous_forest_ocean", "heat_point": 60, "humidity_point": 68, "y_min": -31000, "y_max": 3}, +{"name": "deciduous_forest_under", "heat_point": 60, "humidity_point": 68, "y_min": -31000, "y_max": -256}, +{"name": "caves", "heat_point": 70, "humidity_point": 5, "y_min": 4, "y_max": 41}, +{"name": "grayness", "heat_point": 15, "humidity_point": 30, "y_min": 2, "y_max": 41}, +{"name": "grayness_ocean", "heat_point": 15, "humidity_point": 30, "y_min": -22, "y_max": 2}, +{"name": "grayness_under", "heat_point": 15, "humidity_point": 30, "y_min": -31000, "y_max": -23}, +{"name": "grassytwo", "heat_point": 15, "humidity_point": 25, "y_min": 1, "y_max": 91}, +{"name": "grassytwo_ocean", "heat_point": 15, "humidity_point": 25, "y_min": -192, "y_max": 2}, +{"name": "prairie", "heat_point": 30, "humidity_point": 35, "y_min": 3, "y_max": 26}, +{"name": "prairie_ocean", "heat_point": 30, "humidity_point": 35, "y_min": -192, "y_max": 2}, +{"name": "jumble", "heat_point": 25, "humidity_point": 55, "y_min": 1, "y_max": 71}, +{"name": "jumble_ocean", "heat_point": 25, "humidity_point": 55, "y_min": -192, "y_max": 1}, +{"name": "rainforest", "heat_point": 86, "humidity_point": 65, "y_min": 1, "y_max": 71}, +{"name": "rainforest_ocean", "heat_point": 86, "humidity_point": 65, "y_min": -192, "y_max": 0}, +{"name": "rainforest_under", "heat_point": 86, "humidity_point": 65, "y_min": -31000, "y_max": -256}, +{"name": "swamp", "heat_point": 80, "humidity_point": 90, "y_min": 1, "y_max": 7}, +{"name": "swamp_beach", "heat_point": 80, "humidity_point": 90, "y_min": -1, "y_max": 0}, +{"name": "swamp_ocean", "heat_point": 80, "humidity_point": 90, "y_min": -192, "y_max": -1}, +{"name": "grove", "heat_point": 40, "humidity_point": 25, "y_min": 3, "y_max": 23}, +{"name": "grove_ocean", "heat_point": 40, "humidity_point": 25, "y_min": -192, "y_max": 2}, +{"name": "mediterranean", "heat_point": 30, "humidity_point": 45, "y_min": 3, "y_max": 50}, +{"name": "mushroom", "heat_point": 45, "humidity_point": 82, "y_min": 4, "y_max": 50}, +{"name": "mushroom_ocean", "heat_point": 45, "humidity_point": 82, "y_min": -255, "y_max": 5}, +{"name": "sandstone_desert", "heat_point": 60, "humidity_point": 0, "y_min": 3, "y_max": 23}, +{"name": "sandstone_desert_ocean", "heat_point": 60, "humidity_point": 0, "y_min": -192, "y_max": 2}, +{"name": "sandstone_desert_under", "heat_point": 60, "humidity_point": 0, "y_min": -31000, "y_max": -256}, +{"name": "plains", "heat_point": 74, "humidity_point": 23, "y_min": 3, "y_max": 25}, +{"name": "plains_ocean", "heat_point": 74, "humidity_point": 23, "y_min": -192, "y_max": 2}, +{"name": "savanna", "heat_point": 89, "humidity_point": 42, "y_min": 3, "y_max": 50}, +{"name": "savanna_ocean", "heat_point": 89, "humidity_point": 42, "y_min": -192, "y_max": 2}, +{"name": "savanna_under", "heat_point": 89, "humidity_point": 42, "y_min": -31000, "y_max": -256}, +{"name": "fiery", "heat_point": 80, "humidity_point": 10, "y_min": 5, "y_max": 20}, +{"name": "fiery_beach", "heat_point": 80, "humidity_point": 10, "y_min": 1, "y_max": 4}, +{"name": "fiery_ocean", "heat_point": 80, "humidity_point": 10, "y_min": -192, "y_max": 2}, +{"name": "fiery_under", "heat_point": 80, "humidity_point": 10, "y_min": -31000, "y_max": -256}, +{"name": "glacier", "heat_point": 0, "humidity_point": 73, "y_min": -8, "y_max": 31000}, +{"name": "glacier_ocean", "heat_point": 0, "humidity_point": 73, "y_min": -112, "y_max": -9}, +{"name": "glacier_under", "heat_point": 0, "humidity_point": 73, "y_min": -31000, "y_max": -256}, +{"name": "tundra_highland", "heat_point": 0, "humidity_point": 40, "y_min": 47, "y_max": 180}, +{"name": "tundra", "heat_point": 0, "humidity_point": 40, "y_min": 2, "y_max": 46}, +{"name": "tundra_beach", "heat_point": 0, "humidity_point": 40, "y_min": -3, "y_max": 1}, +{"name": "tundra_ocean", "heat_point": 0, "humidity_point": 40, "y_min": -112, "y_max": -4}, +{"name": "tundra_under", "heat_point": 0, "humidity_point": 40, "y_min": -31000, "y_max": -256}, +{"name": "cold_desert", "heat_point": 20, "humidity_point": 85, "y_min": 4, "y_max": 100}, +{"name": "cold_desert_ocean", "heat_point": 20, "humidity_point": 85, "y_min": -255, "y_max": 3}, +{"name": "cold_desert_under", "heat_point": 20, "humidity_point": 85, "y_min": -31000, "y_max": -256} +] \ No newline at end of file diff --git a/mods/ethereal/biomes.lua b/mods/ethereal/biomes.lua new file mode 100644 index 00000000..9a679c96 --- /dev/null +++ b/mods/ethereal/biomes.lua @@ -0,0 +1,632 @@ + +-- register biome helper + +local function register_biome(enabled, def) + + if enabled ~= 1 then return end + + def.node_dungeon = def.node_dungeon or "default:cobble" + def.node_dungeon_alt = def.node_dungeon_alt or "default:mossycobble" + def.node_dungeon_stair = def.node_dungeon_stair or "stairs:stair_cobble" + + if def.y_max > 0 and def.node_riverbed == nil then + def.node_riverbed = "default:sand" ; def.depth_riverbed = 2 + end + + if def.y_min > 0 then def.vertical_blend = 1 end + + minetest.register_biome(def) + +--[[print('{"name": "' .. def.name .. '", "heat_point": ' ..def.heat_point .. ', "humidity_point": ' + .. def.humidity_point .. ', "y_min": ' .. def.y_min .. ', "y_max": ' .. def.y_max .. '}')]] + +end + +-- old biome setting (when enabled old heat/humidity values are used) + +local old = minetest.settings:get_bool("ethereal.old_biomes") + +-- mountain + +register_biome(1, { + name = "mountain", + heat_point = 50, humidity_point = 50, + y_min = 140, y_max = 31000, + node_top = "default:snow", depth_top = 1, + node_filler = "default:snowblock", depth_filler = 2}) + +-- grassland + +register_biome(1, { + name = "grassland", + heat_point = old and 45 or 50, humidity_point = old and 65 or 35, + y_min = 3, y_max = 71, + node_top = "default:dirt_with_grass", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(1, { + name = "grassland_ocean", + heat_point = old and 45 or 50, humidity_point = old and 65 or 35, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3}) + +register_biome(1, { + name = "grassland_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + heat_point = old and 45 or 50, humidity_point = old and 65 or 35, + y_min = -31000, y_max = -256}) + +-- desert + +register_biome(ethereal.desert, { + name = "desert", + heat_point = old and 35 or 92, humidity_point = old and 20 or 16, + y_min = 3, y_max = 23, + node_top = "default:desert_sand", depth_top = 1, + node_filler = "default:desert_sand", depth_filler = 3, + node_stone = "default:desert_stone", + node_dungeon_alt = "default:desert_cobble", + node_dungeon = "default:desert_stone", + node_dungeon_stair = "stairs:stair_desert_stone"}) + +register_biome(ethereal.desert, { + name = "desert_ocean", + heat_point = old and 35 or 92, humidity_point = old and 20 or 16, + y_min = -192, y_max = 3, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2, + node_stone = "default:desert_stone", + node_dungeon_alt = "default:desert_cobble", + node_dungeon = "default:desert_stone", + node_dungeon_stair = "stairs:stair_desert_stone"}) + +register_biome(ethereal.desert, { + name = "desert_under", + heat_point = old and 35 or 92, humidity_point = old and 20 or 16, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- bamboo + +register_biome(ethereal.bamboo, { + name = "bamboo", + heat_point = 45, humidity_point = old and 75 or 45, + y_min = 3, y_max = 70, + node_top = "ethereal:bamboo_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.bamboo, { + name = "bamboo_ocean", + heat_point = 45, humidity_point = old and 75 or 45, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- mesa + +register_biome(ethereal.mesa, { + name = "mesa", + heat_point = 25, humidity_point = old and 28 or 10, + y_min = 18, y_max = 71, + node_top = old and "default:dirt_with_dry_grass" or "bakedclay:orange", depth_top = 1, + node_filler = "bakedclay:orange", depth_filler = 15, + node_riverbed = "default:desert_sand", depth_riverbed = 2, + node_dungeon_alt = "default:desert_sandstone", + node_dungeon = "default:desert_sandstone_brick", + node_dungeon_stair = "stairs:stair_desert_sandstone_brick"}) + +register_biome(ethereal.mesa, { + name = "mesa_redwood", + heat_point = 25, humidity_point = old and 28 or 10, + y_min = 11, y_max = 17, + node_top = "default:dirt_with_dry_grass", depth_top = 1, + node_filler = "bakedclay:orange", depth_filler = 15, + node_riverbed = "default:desert_sand", depth_riverbed = 2, + node_dungeon_alt = "", + node_dungeon = "default:desert_sandstone", + node_dungeon_stair = "stairs:stair_desert_sandstone"}) + +register_biome(ethereal.mesa, { + name = "mesa_beach", + heat_point = 25, humidity_point = old and 28 or 10, + y_min = -1, y_max = 10, + node_top = "default:desert_sand", depth_top = 1, + node_filler = "bakedclay:orange", depth_filler = 2, + node_riverbed = "default:desert_sand", depth_riverbed = 2, + node_dungeon_alt = "", + node_dungeon = "default:desert_sandstone", + node_dungeon_stair = "stairs:stair_desert_sandstone"}) + +register_biome(ethereal.mesa, { + name = "mesa_ocean", + heat_point = 25, humidity_point = old and 28 or 10, + y_min = -192, y_max = -2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- coniferous forest + +register_biome(ethereal.snowy, { + name = "coniferous_forest", + heat_point = old and 10 or 45, humidity_point = old and 40 or 70, + y_min = 6, y_max = 140, + node_top = "default:dirt_with_coniferous_litter", depth_top = 1, + node_filler = "default:dirt", depth_filler = 2}) + +register_biome(ethereal.snowy, { + name = "coniferous_forest_dunes", + heat_point = old and 10 or 45, humidity_point = old and 40 or 70, + y_min = 4, y_max = 5, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3, + vertical_blend = 1}) + +register_biome(ethereal.snowy, { + name = "coniferous_forest_ocean", + heat_point = old and 10 or 45, humidity_point = old and 40 or 70, + y_min = -255, y_max = 3, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +register_biome(ethereal.snowy, { + name = "coniferous_forest_under", + heat_point = old and 10 or 45, humidity_point = old and 40 or 70, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- taiga + +register_biome(ethereal.alpine, { + name = "taiga", + heat_point = old and 10 or 25, humidity_point = old and 40 or 70, + y_min = 4, y_max = 140, + node_top = "default:dirt_with_snow", depth_top = 1, + node_filler = "default:dirt", depth_filler = 2}) + +register_biome(ethereal.alpine, { + name = "taiga_ocean", + heat_point = old and 10 or 25, humidity_point = old and 40 or 70, + y_min = -255, y_max = 3, + node_dust = "default:snow", + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3, + node_cave_liquid = "default:water_source", + vertical_blend = 1}) + +register_biome(ethereal.alpine, { + name = "taiga_under", + heat_point = old and 10 or 25, humidity_point = old and 40 or 70, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- frost + +register_biome(ethereal.frost, { + name = "frost_floatland", + heat_point = old and 10 or 5, humidity_point = old and 40 or 60, + y_min = 1025, y_max = 1750, + node_top = "ethereal:crystal_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 2}) + +register_biome(ethereal.frost, { + name = "frost", + heat_point = old and 10 or 5, humidity_point = old and 40 or 60, + y_min = 2, y_max = 71, + node_top = "ethereal:crystal_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.frost, { + name = "frost_ocean", + heat_point = old and 10 or 5, humidity_point = old and 40 or 60, + y_min = -192, y_max = 1, + node_top = "default:silver_sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3}) + +-- deciduous forest + +register_biome(ethereal.grassy, { + name = "deciduous_forest", + heat_point = old and 13 or 60, humidity_point = old and 40 or 68, + y_min = 3, y_max = 91, + node_top = "default:dirt_with_grass", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.grassy, { + name = "deciduous_forest_ocean", + heat_point = old and 13 or 60, humidity_point = old and 40 or 68, + y_min = -31000, y_max = 3, + node_top = "default:sand", depth_top = 2, + node_filler = "default:gravel", depth_filler = 1}) + +register_biome(ethereal.grassy, { + name = "deciduous_forest_under", + heat_point = old and 13 or 60, humidity_point = old and 40 or 68, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- caves + +register_biome(ethereal.caves, { + name = "caves", + heat_point = old and 15 or 70, humidity_point = old and 25 or 5, + y_min = 4, y_max = 41, + node_top = "default:desert_stone", depth_top = 3, + node_filler = "air", depth_filler = 8, + node_dungeon_alt = "", + node_dungeon = "default:desert_cobble", + node_dungeon_stair = "stairs:stair_desert_cobble"}) + +-- grayness + +register_biome(ethereal.grayness, { + name = "grayness", + heat_point = 15, humidity_point = old and 25 or 30, + y_min = 2, y_max = 41, + node_top = "ethereal:gray_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.grayness, { + name = "grayness_ocean", + heat_point = 15, humidity_point = old and 25 or 30, + y_min = -22, y_max = 2, + node_top = "default:silver_sand", depth_top = 2, + node_filler = "default:sand", depth_filler = 2, + node_stone = "ethereal:blue_marble", + node_dungeon_alt = "", + node_dungeon = "ethereal:blue_marble", + node_dungeon_stair = "stairs:stair_blue_marble"}) + +register_biome(ethereal.grayness, { + name = "grayness_under", + heat_point = 15, humidity_point = old and 25 or 30, + y_min = -31000, y_max = -23, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- grassy two + +register_biome(ethereal.grassytwo, { + name = "grassytwo", + heat_point = 15, humidity_point = old and 40 or 25, + y_min = 1, y_max = 91, + node_top = "default:dirt_with_grass", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.grassytwo, { + name = "grassytwo_ocean", + heat_point = 15, humidity_point = old and 40 or 25, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- prairie + +register_biome(ethereal.prairie, { + name = "prairie", + heat_point = old and 20 or 30, humidity_point = old and 40 or 35, + y_min = 3, y_max = 26, + node_top = "ethereal:prairie_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.prairie, { + name = "prairie_ocean", + heat_point = old and 20 or 30, humidity_point = old and 40 or 35, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- jumble + +register_biome(ethereal.jumble, { + name = "jumble", + heat_point = 25, humidity_point = old and 50 or 55, + y_min = 1, y_max = 71, + node_top = "default:dirt_with_grass", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.jumble, { + name = "jumble_ocean", + heat_point = 25, humidity_point = old and 50 or 55, + y_min = -192, y_max = 1, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- rainforest + +register_biome(ethereal.junglee, { + name = "rainforest", + heat_point = old and 30 or 86, humidity_point = old and 60 or 65, + y_min = 1, y_max = 71, + node_top = "default:dirt_with_rainforest_litter", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.junglee, { + name = "rainforest_ocean", + heat_point = old and 30 or 86, humidity_point = old and 60 or 65, + y_min = -192, y_max = 0, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +register_biome(ethereal.junglee, { + name = "rainforest_under", + heat_point = old and 30 or 86, humidity_point = old and 60 or 65, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- swamp + +register_biome(ethereal.swamp, { + name = "swamp", + heat_point = 80, humidity_point = 90, y_min = 1, y_max = 7, + node_top = "default:dirt_with_grass", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.quicksand, { + name = "swamp_beach", + heat_point = 80, humidity_point = 90, y_min = -1, y_max = 0, + node_top = "ethereal:quicksand2", depth_top = 3, + node_filler = "default:clay", depth_filler = 2, + vertical_blend = 1}) + +register_biome(ethereal.swamp, { + name = "swamp_ocean", + heat_point = 80, humidity_point = 90, y_min = -192, y_max = -1, + node_top = "default:sand", depth_top = 2, + node_filler = "default:clay", depth_filler = 2, + vertical_blend = 2}) + +-- grove + +register_biome(ethereal.grove, { + name = "grove", + heat_point = old and 45 or 40, humidity_point = old and 35 or 25, + y_min = 3, y_max = 23, + node_top = "ethereal:grove_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.grove, { + name = "grove_ocean", + heat_point = old and 45 or 40, humidity_point = old and 35 or 25, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- meditteranean + +register_biome(ethereal.mediterranean, { + name = "mediterranean", + heat_point = old and 20 or 30, humidity_point = 45, + y_min = 3, y_max = 50, + node_top = "ethereal:grove_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +-- mushroom + +register_biome(ethereal.mushroom, { + name = "mushroom", + heat_point = 45, humidity_point = old and 55 or 82, + y_min = 4, y_max = 50, + node_top = "ethereal:mushroom_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.mushroom, { + name = "mushroom_ocean", + heat_point = 45, humidity_point = old and 55 or 82, + y_min = -255, y_max = 5, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2, + vertical_blend = 1}) + +-- sandstone desert + +register_biome(ethereal.sandstone, { + name = "sandstone_desert", + heat_point = old and 50 or 60, humidity_point = old and 20 or 0, + y_min = 3, y_max = 23, + node_top = "default:sandstone", depth_top = 1, + node_filler = "default:sandstone", depth_filler = 1, + node_stone = "default:sandstone", + node_dungeon_alt = "", + node_dungeon = "default:sandstone", + node_dungeon_stair = "stairs:stair_sandstone"}) + +register_biome(ethereal.sandstone, { + name = "sandstone_desert_ocean", + heat_point = old and 50 or 60, humidity_point = old and 20 or 0, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2, + node_stone = "default:sandstone", + node_dungeon_alt = "", + node_dungeon = "default:sandstone", + node_dungeon_stair = "stairs:stair_sandstone"}) + +register_biome(ethereal.sandstone, { + name = "sandstone_desert_under", + heat_point = old and 50 or 60, humidity_point = old and 20 or 0, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- plains + +register_biome(ethereal.plains, { + name = "plains", + heat_point = old and 65 or 74, humidity_point = old and 25 or 23, + y_min = 3, y_max = 25, + node_top = "ethereal:dry_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3, + node_dungeon_alt = "", + node_dungeon = "ethereal:dry_dirt", + node_dungeon_stair = "stairs:stair_dry_dirt"}) + +register_biome(ethereal.plains, { + name = "plains_ocean", + heat_point = old and 65 or 74, humidity_point = old and 25 or 23, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +-- savanna + +register_biome(ethereal.savanna, { + name = "savanna", + heat_point = old and 55 or 89, humidity_point = old and 25 or 42, + y_min = 3, y_max = 50, + node_top = "default:dry_dirt_with_dry_grass", depth_top = 1, + node_filler = "default:dry_dirt", depth_filler = 3}) + +register_biome(ethereal.savanna, { + name = "savanna_ocean", + heat_point = old and 55 or 89, humidity_point = old and 25 or 42, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +register_biome(ethereal.savanna, { + name = "savanna_under", + heat_point = old and 55 or 89, humidity_point = old and 25 or 42, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- fiery + +register_biome(ethereal.fiery, { + name = "fiery", + heat_point = old and 75 or 80, humidity_point = 10, + y_min = 5, y_max = 20, + node_top = "ethereal:fiery_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + +register_biome(ethereal.fiery, { + name = "fiery_beach", + heat_point = old and 75 or 80, humidity_point = 10, + y_min = 1, y_max = 4, + node_top = "default:desert_sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +register_biome(ethereal.fiery, { + name = "fiery_ocean", + heat_point = old and 75 or 80, humidity_point = 10, + y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 2}) + +register_biome(ethereal.fiery, { + name = "fiery_under", + heat_point = old and 75 or 80, humidity_point = 10, + y_min = -31000, y_max = -256, + node_cave_liquid = {"default:lava_source"}}) + +-- glacier + +register_biome(ethereal.glacier, { + name = "glacier", + heat_point = 0, humidity_point = old and 50 or 73, + y_min = -8, y_max = 31000, + node_dust = "default:snowblock", + node_top = "default:snowblock", depth_top = 1, + node_filler = "default:snowblock", depth_filler = 3, + node_stone = "default:ice", + node_water_top = "default:ice", depth_water_top = 10, + node_river_water = "default:ice", + node_riverbed = "default:gravel", depth_riverbed = 2, + node_dungeon = "ethereal:icebrick", + node_dungeon_alt = "default:ice", + node_dungeon_stair = "stairs:stair_ice"}) + +register_biome(ethereal.glacier, { + name = "glacier_ocean", + heat_point = 0, humidity_point = old and 50 or 73, + y_min = -112, y_max = -9, + node_dust = "default:snowblock", + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3}) + +register_biome(ethereal.glacier, { + name = "glacier_under", + heat_point = 0, humidity_point = old and 50 or 73, + y_max = -256, y_min = -31000, + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble"}) + +-- tundra + +register_biome(ethereal.tundra, { + name = "tundra_highland", + heat_point = 0, humidity_point = 40, y_max = 180, y_min = 47, + node_dust = "default:snow", + node_riverbed = "default:gravel", depth_riverbed = 2}) + +register_biome(ethereal.tundra, { + name = "tundra", + heat_point = 0, humidity_point = 40, y_max = 46, y_min = 2, + node_top = "default:permafrost_with_stones", depth_top = 1, + node_filler = "default:permafrost", depth_filler = 1, + node_riverbed = "default:gravel", depth_riverbed = 2, + vertical_blend = 4}) + +register_biome(ethereal.tundra, { + name = "tundra_beach", + heat_point = 0, humidity_point = 40, y_max = 1, y_min = -3, + node_top = "default:gravel", depth_top = 1, + node_filler = "default:gravel", depth_filler = 2, + node_riverbed = "default:gravel", depth_riverbed = 2, + vertical_blend = 1}) + +register_biome(ethereal.tundra, { + name = "tundra_ocean", + heat_point = 0, humidity_point = 40, y_max = -4, y_min = -112, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3, + node_riverbed = "default:gravel", depth_riverbed = 2, + vertical_blend = 1}) + +register_biome(ethereal.tundra, { + name = "tundra_under", + heat_point = 0, humidity_point = 40, y_max = -256, y_min = -31000, + node_cave_liquid = {"default:water_source", "default:lava_source"}}) + +-- only register when using new mapgen + +if not old then + + -- cold desert + + register_biome(ethereal.cold_desert, { + name = "cold_desert", + heat_point = 20, humidity_point = 85, y_min = 4, y_max = 100, + node_top = "default:silver_sand", depth_top = 1, + node_filler = "default:silver_sand", depth_filler = 1, + node_riverbed = "default:silver_sand", depth_riverbed = 2}) + + register_biome(ethereal.cold_desert, { + name = "cold_desert_ocean", + heat_point = 20, humidity_point = 85, y_min = -255, y_max = 3, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3, + node_cave_liquid = "default:water_source", + vertical_blend = 1}) + + register_biome(ethereal.cold_desert, { + name = "cold_desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + heat_point = 20, humidity_point = 85, y_min = -31000, y_max = -256}) + + -- snowy grassland (inbetween frost and taiga/jumble) + + register_biome(ethereal.snowy_grassland, { + name = "snowy_grassland", + heat_point = 15, humidity_point = 58, y_min = 3, y_max = 30, + node_top = "ethereal:cold_dirt", depth_top = 1, + node_filler = "default:dirt", depth_filler = 3}) + + register_biome(ethereal.snowy_grassland, { + name = "snowy_grassland_ocean", + node_dust = "default:snow", + heat_point = 15, humidity_point = 58, y_min = -192, y_max = 2, + node_top = "default:sand", depth_top = 1, + node_filler = "default:sand", depth_filler = 3, + vertical_blend = 1}) +end diff --git a/mods/ethereal/biomes_init.lua b/mods/ethereal/biomes_init.lua new file mode 100644 index 00000000..0a3d9e29 --- /dev/null +++ b/mods/ethereal/biomes_init.lua @@ -0,0 +1,113 @@ + +-- storage tables + +local old_biomes, old_decor = {}, {} + +-- backup registered biomes + +for key, def in pairs(minetest.registered_biomes) do + old_biomes[key] = def +end + +-- backup registered decorations + +for key, def in pairs(minetest.registered_decorations) do + old_decor[key] = def +end + +-- clear current biome data + +minetest.clear_registered_biomes() +minetest.clear_registered_decorations() +-- minetest.clear_registered_ores() + +-- create list of default biomes to remove + +local def_biomes = { + ["rainforest"] = 1, + ["rainforest_swamp"] = 1, + ["rainforest_ocean"] = 1, + ["rainforest_under"] = 1, + ["grassland"] = 1, + ["grassland_dunes"] = 1, + ["grassland_ocean"] = 1, + ["grassland_under"] = 1, + ["taiga"] = 1, + ["taiga_ocean"] = 1, + ["taiga_under"] = 1, + ["icesheet"] = 1, + ["icesheet_ocean"] = 1, + ["icesheet_under"] = 1, + ["snowy_grassland"] = 1, + ["snowy_grassland_ocean"] = 1, + ["snowy_grassland_under"] = 1, + ["desert"] = 1, + ["desert_ocean"] = 1, + ["desert_under"] = 1, + ["tundra"] = 1, + ["tundra_highland"] = 1, + ["tundra_beach"] = 1, + ["tundra_ocean"] = 1, + ["tundra_under"] = 1, + ["sandstone_desert"] = 1, + ["sandstone_desert_ocean"] = 1, + ["sandstone_desert_under"] = 1, + ["savanna"] = 1, + ["savanna_shore"] = 1, + ["savanna_ocean"] = 1, + ["savanna_under"] = 1, + ["cold_desert"] = 1, + ["cold_desert_ocean"] = 1, + ["cold_desert_under"] = 1, + ["coniferous_forest"] = 1, + ["coniferous_forest_dunes"] = 1, + ["coniferous_forest_ocean"] = 1, + ["coniferous_forest_under"] = 1, + ["deciduous_forest"] = 1, + ["deciduous_forest_shore"] = 1, + ["deciduous_forest_ocean"] = 1, + ["deciduous_forest_under"] = 1 +} + +-- only re-register biomes that aren't on the list + +for key, def in pairs(old_biomes) do + + if not def_biomes[key] then minetest.register_biome(def) end +end + +-- loop through decorations + +for key, def in pairs(old_decor) do + + local can_add = true + local new_biomes = {} + + if type(def.biomes) == "table" then + + -- loop through decoration biomes, only re-add one's not on above list + for num, bio in pairs(def.biomes) do + + if not def_biomes[bio] then table.insert(new_biomes, bio) end + end + + -- if no biomes are left on new list, do not re-add decoration + if #new_biomes == 0 then can_add = false end + + elseif type(def.biomes) == "string" then + + if def_biomes[def.biomes] then + can_add = false + else + new_biomes = {def.biomes} -- convert to table + end + + elseif not def.biomes then new_biomes = nil end -- keep it nil for re-adding + + if can_add == true then + + def.biomes = new_biomes + + minetest.register_decoration(def) + end +end diff --git a/mods/ethereal/compatibility.lua b/mods/ethereal/compatibility.lua new file mode 100644 index 00000000..5dcffb3e --- /dev/null +++ b/mods/ethereal/compatibility.lua @@ -0,0 +1,47 @@ + +-- add compatibility for ethereal nodes already added to default game or name changed + +minetest.register_alias("ethereal:acacia_trunk", "default:acacia_tree") +minetest.register_alias("ethereal:acacia_wood", "default:acacia_wood") + +minetest.register_alias("ethereal:fence_acacia", "default:fence_acacia_wood") +minetest.register_alias("ethereal:fence_junglewood", "default:fence_junglewood") +minetest.register_alias("ethereal:fence_pine", "default:fence_pine_wood") + +minetest.register_alias("ethereal:acacia_leaves", "default:acacia_leaves") +minetest.register_alias("ethereal:pineleaves", "default:pine_needles") + +minetest.register_alias("ethereal:mushroom_craftingitem", "flowers:mushroom_brown") +minetest.register_alias("ethereal:mushroom_plant", "flowers:mushroom_brown") +minetest.register_alias("ethereal:mushroom_soup_cooked", "ethereal:mushroom_soup") +minetest.register_alias("ethereal:mushroom_1", "flowers:mushroom_brown") +minetest.register_alias("ethereal:mushroom_2", "flowers:mushroom_brown") +minetest.register_alias("ethereal:mushroom_3", "flowers:mushroom_brown") +minetest.register_alias("ethereal:mushroom_4", "flowers:mushroom_brown") + +minetest.register_alias("ethereal:strawberry_bush", "ethereal:strawberry_7") +minetest.register_alias("ethereal:seed_strawberry", "ethereal:strawberry") + +for i = 1, 5 do + minetest.register_alias("ethereal:wild_onion_" .. i, "ethereal:onion_" .. i) +end + +minetest.register_alias("ethereal:onion_7", "ethereal:onion_4") +minetest.register_alias("ethereal:onion_8", "ethereal:onion_5") +minetest.register_alias("ethereal:wild_onion_7", "ethereal:onion_4") +minetest.register_alias("ethereal:wild_onion_8", "ethereal:onion_5") +minetest.register_alias("ethereal:wild_onion_craftingitem", "ethereal:wild_onion_plant") + +minetest.register_alias("ethereal:hearty_stew_cooked", "ethereal:hearty_stew") + +minetest.register_alias("ethereal:obsidian_brick", "default:obsidianbrick") + +minetest.register_alias("ethereal:crystal_topped_dirt", "ethereal:crystal_dirt") +minetest.register_alias("ethereal:fiery_dirt_top", "ethereal:fiery_dirt") +minetest.register_alias("ethereal:gray_dirt_top", "ethereal:gray_dirt") +minetest.register_alias("ethereal:green_dirt_top", "default;dirt_with_grass") + +minetest.register_alias("ethereal:tree_sapling", "default:sapling") +minetest.register_alias("ethereal:jungle_tree_sapling", "default:junglesapling") +minetest.register_alias("ethereal:acacia_sapling", "default:acacia_sapling") +minetest.register_alias("ethereal:pine_tree_sapling", "default:pine_sapling") diff --git a/mods/ethereal/crystal.lua b/mods/ethereal/crystal.lua new file mode 100644 index 00000000..017579c8 --- /dev/null +++ b/mods/ethereal/crystal.lua @@ -0,0 +1,300 @@ + +local S = minetest.get_translator("ethereal") + +-- Crystal Ingot and recipe + +minetest.register_craftitem("ethereal:crystal_ingot", { + description = S("Crystal Ingot"), + inventory_image = "ethereal_crystal_ingot.png", + wield_image = "ethereal_crystal_ingot.png" +}) + +minetest.register_craft({ + output = "ethereal:crystal_ingot", + recipe = { + {"default:mese_crystal", "ethereal:crystal_spike"}, + {"ethereal:crystal_spike", "default:mese_crystal"}, + {"bucket:bucket_water", ""} + }, + replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}} +}) + +-- Crystal Spike (Hurts if you touch it) + +minetest.register_node("ethereal:crystal_spike", { + description = S("Crystal Spike"), + drawtype = "plantlike", + tiles = {"ethereal_crystal_spike.png"}, + inventory_image = "ethereal_crystal_spike.png", + wield_image = "ethereal_crystal_spike.png", + paramtype = "light", + light_source = 7, + sunlight_propagates = true, + walkable = true, + damage_per_second = 1, + groups = {cracky = 1, falling_node = 1, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_glass_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0, 5 / 16} + }, + node_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0, 5 / 16} + }, + + dropped_step = function(self, pos, dtime) -- custom function for builtin_item use + + self.ctimer = (self.ctimer or 0) + dtime + if self.ctimer < 5.0 then return end -- 5 second timer + self.ctimer = 0 + + if self.node_inside and self.node_inside.name ~= "default:water_source" then + return + end + + local objs = minetest.get_objects_inside_radius(pos, 0.8) + + if not objs or #objs ~= 2 then return end + + local crystal, mese, ent = nil, nil, nil + + for k, obj in pairs(objs) do + + ent = obj:get_luaentity() + + if ent and ent.name == "__builtin:item" then + + if ent.itemstring == "default:mese_crystal 2" and not mese then + + mese = obj + + elseif ent.itemstring == "ethereal:crystal_spike 2" and not crystal then + + crystal = obj + end + end + end + + if mese and crystal then + + mese:remove() + crystal:remove() + + minetest.add_item(pos, "ethereal:crystal_ingot") + + return false + end + end +}) + +-- Crystal Block and recipe + +minetest.register_node("ethereal:crystal_block", { + description = S("Crystal Block"), + tiles = {"ethereal_crystal_block.png"}, + light_source = 9, + is_ground_content = false, + groups = {cracky = 1, level = 2, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_glass_defaults() +}) + +minetest.register_craft({ + output = "ethereal:crystal_block", + recipe = { + {"ethereal:crystal_ingot", "ethereal:crystal_ingot", "ethereal:crystal_ingot"}, + {"ethereal:crystal_ingot", "ethereal:crystal_ingot", "ethereal:crystal_ingot"}, + {"ethereal:crystal_ingot", "ethereal:crystal_ingot", "ethereal:crystal_ingot"} + } +}) + +minetest.register_craft({ + output = "ethereal:crystal_ingot 9", + recipe = {{"ethereal:crystal_block"}} +}) + +-- Crystal Sword (Powerful wee beastie) + +minetest.register_tool("ethereal:sword_crystal", { + description = S("Crystal Sword"), + inventory_image = "ethereal_crystal_sword.png", + wield_image = "ethereal_crystal_sword.png", + tool_capabilities = { + full_punch_interval = 0.6, + max_drop_level = 1, + groupcaps = { + snappy = { + times = {[1] = 1.70, [2] = 0.70, [3] = 0.25}, uses = 50, maxlevel = 3 + } + }, + damage_groups = {fleshy = 10} + }, + groups = {sword = 1}, + sound = {breaks = "default_tool_breaks"} +}) + +minetest.register_craft({ + output = "ethereal:sword_crystal", + recipe = { + {"ethereal:crystal_ingot"}, + {"ethereal:crystal_ingot"}, + {"default:steel_ingot"} + } +}) + +-- Crystal Axe + +minetest.register_tool("ethereal:axe_crystal", { + description = S("Crystal Axe"), + inventory_image = "ethereal_crystal_axe.png", + wield_image = "ethereal_crystal_axe.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level = 1, + groupcaps = { + choppy = { + times = {[1] = 2.00, [2] = 0.80, [3] = 0.40}, uses = 40, maxlevel = 3 + } + }, + damage_groups = {fleshy = 7} + }, + groups = {axe = 1}, + sound = {breaks = "default_tool_breaks"} +}) + +minetest.register_craft({ + output = "ethereal:axe_crystal", + recipe = { + {"ethereal:crystal_ingot", "ethereal:crystal_ingot"}, + {"ethereal:crystal_ingot", "default:steel_ingot"}, + {"", "default:steel_ingot"} + } +}) + +minetest.register_craft({ + output = "ethereal:axe_crystal", + recipe = { + {"ethereal:crystal_ingot", "ethereal:crystal_ingot"}, + {"default:steel_ingot", "ethereal:crystal_ingot"}, + {"default:steel_ingot", ""} + } +}) + +-- Crystal Pick (This will last a while) + +minetest.register_tool("ethereal:pick_crystal", { + description = S("Crystal Pickaxe"), + inventory_image = "ethereal_crystal_pick.png", + wield_image = "ethereal_crystal_pick.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level = 3, + groupcaps={ + cracky = { + times = {[1] = 1.8, [2] = 0.8, [3] = 0.40}, uses = 40, maxlevel = 3 + } + }, + damage_groups = {fleshy = 6} + }, + groups = {pickaxe = 1}, + sound = {breaks = "default_tool_breaks"} +}) + +minetest.register_craft({ + output = "ethereal:pick_crystal", + recipe = { + {"ethereal:crystal_ingot", "ethereal:crystal_ingot", "ethereal:crystal_ingot"}, + {"", "default:steel_ingot", ""}, + {"", "default:steel_ingot", ""} + } +}) + +-- backup old function and replace with new silk touch ability for crystal shovel + +local old_handle_node_drops = minetest.handle_node_drops + +function minetest.handle_node_drops(pos, drops, digger) + + -- are we holding Crystal Shovel? + if not digger + or digger:get_wielded_item():get_name() ~= "ethereal:shovel_crystal" then + return old_handle_node_drops(pos, drops, digger) + end + + local nn = minetest.get_node(pos).name + + if minetest.get_item_group(nn, "crumbly") == 0 + or minetest.get_item_group(nn, "no_silktouch") == 1 then + return old_handle_node_drops(pos, drops, digger) + end + + return old_handle_node_drops(pos, {ItemStack(nn)}, digger) +end + +-- Crystal Shovel + +minetest.register_tool("ethereal:shovel_crystal", { + description = S("Crystal Shovel"), + inventory_image = "ethereal_crystal_shovel.png", + wield_image = "ethereal_crystal_shovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 1, + groupcaps = { + crumbly = { + times = {[1] = 1.10, [2] = 0.50, [3] = 0.30}, uses = 30, maxlevel = 3 + } + }, + damage_groups = {fleshy = 4} + }, + groups = {shovel = 1}, + sound = {breaks = "default_tool_breaks"} +}) + +minetest.register_craft({ + output = "ethereal:shovel_crystal", + recipe = { + {"ethereal:crystal_ingot"}, + {"default:steel_ingot"}, + {"default:steel_ingot"} + } +}) + +-- Crystal Gilly Staff (replenishes air supply when used) + +minetest.register_tool("ethereal:crystal_gilly_staff", { + description = S("Crystal Gilly Staff"), + inventory_image = "ethereal_crystal_gilly_staff.png", + wield_image = "ethereal_crystal_gilly_staff.png", + + on_use = function(itemstack, user, pointed_thing) + + if user and user:get_breath() < 10 then user:set_breath(10) end + end +}) + +minetest.register_craft({ + output = "ethereal:crystal_gilly_staff", + recipe = { + {"ethereal:green_moss", "ethereal:gray_moss", "ethereal:fiery_moss"}, + {"ethereal:crystal_moss", "ethereal:crystal_ingot", "ethereal:mushroom_moss"}, + {"", "ethereal:crystal_ingot", ""} + }, +}) + +-- Add Toolranks mod support + +if minetest.get_modpath("toolranks") then + + local function add_tool(name, desc, afteruse) -- helper function + + minetest.override_item(name, { + original_description = desc, + description = toolranks.create_description(desc, 0, 1), + after_use = afteruse and toolranks.new_afteruse + }) + end + + add_tool("ethereal:pick_crystal", "Crystal Pickaxe", true) + add_tool("ethereal:axe_crystal", "Crystal Axe", true) + add_tool("ethereal:shovel_crystal", "Crystal Shovel", true) + add_tool("ethereal:sword_crystal", "Crystal Sword", true) +end diff --git a/mods/ethereal/decor.lua b/mods/ethereal/decor.lua new file mode 100644 index 00000000..1a6f0d7c --- /dev/null +++ b/mods/ethereal/decor.lua @@ -0,0 +1,709 @@ +-- register decoration helper + +local function register_decoration(enabled, def) + + if enabled ~= 1 then return end + + def.sidelen = def.sidelen or 80 -- some handy defaults + def.deco_type = "simple" + def.y_min = def.y_min or 1 + def.y_max = def.y_max or 31000 + + minetest.register_decoration(def) +end + +-- thin ice + +register_decoration(ethereal.frost, { + place_on = {"default:silver_sand"}, + fill_ratio = 1.0, y_min = 0, y_max = 0, + decoration = "ethereal:thin_ice", place_offset_y = 1, + biomes = {"frost_ocean"} }) + +-- water pools in swamp areas + +register_decoration(1, { + place_on = {"default:dirt_with_grass"}, + sidelen = 4, fill_ratio = 0.02, y_min = 1, y_max = 3, + biomes = {"swamp","marsh"}, + flags = "force_placement", + decoration = "default:water_source", place_offset_y = -1, + spawn_by = "default:dirt_with_grass", num_spawn_by = 8}) + +register_decoration(1, { + place_on = {"default:dirt_with_grass"}, + sidelen = 4, fill_ratio = 0.33, y_min = 1, y_max = 32, + biomes = {"marsh"}, + flags = "force_placement", + decoration = "default:water_source", place_offset_y = -1, + spawn_by = {"default:dirt_with_grass", "default:water_source"}, num_spawn_by = 8}) + +-- dry dirt patches + +register_decoration(1, { + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 4, + noise_params = {offset = -1.5, scale = -1.5, spread = {x = 200, y = 200, z = 200}, + seed = 329, octaves = 4, persist = 1.0}, + biomes = {"plains"}, + decoration = "default:dry_dirt", place_offset_y = -1, + flags = "force_placement" +}) + +-- rainforest litter in grove biome + +register_decoration(1, { + place_on = {"ethereal:grove_dirt"}, + sidelen = 4, + noise_params = {offset = -0.0025, scale = 0.5, spread = {x = 100, y = 100, z = 100}, + seed = 329, octaves = 1, persist = 1.0}, + biomes = {"grove"}, + decoration = "default:dirt_with_rainforest_litter", place_offset_y = -1, + flags = "force_placement" +}) + +-- farming redo check, salt crystal if found, strawberry if not + +if minetest.get_modpath("farming") and farming.mod and farming.mod == "redo" then + + register_decoration(ethereal.grayness, { + place_on = "default:silver_sand", + fill_ratio = 0.001, + decoration = "farming:salt_crystal"}) +else + register_decoration(1, { + place_on = {"default:dirt_with_grass", "ethereal:prairie_dirt"}, + sidelen = 16, y_min = 15, y_max = 55, + noise_params = {offset = 0, scale = 0.002, spread = {x = 100, y = 100, z = 100}, + seed = 143, octaves = 3, persist = 0.6}, + decoration = "ethereal:strawberry_7"}) +end + +-- firethorn shrub + +register_decoration(ethereal.glacier, { + place_on = "default:snowblock", + fill_ratio = 0.001, y_min = 1, y_max = 30, + biomes = {"glacier"}, + decoration = "ethereal:firethorn"}) + +-- dry grass + +register_decoration(ethereal.savanna, { + place_on = {"default:dry_dirt_with_dry_grass", "default:dirt_with_dry_grass"}, + fill_ratio = 0.25, + biomes = {"savanna"}, + decoration = {"default:dry_grass_2", "default:dry_grass_3", "default:dry_grass_4", + "default:dry_grass_5"}}) + +register_decoration(ethereal.plains, { + place_on = {"default:dry_dirt_with_dry_grass"}, + fill_ratio = 0.875, + biomes = {"mesa_redwood"}, + decoration = {"default:dry_grass_2", "default:dry_grass_3", "default:dry_grass_4", + "default:dry_grass_5","default:grass_1"}}) + +register_decoration(ethereal.mesa, { + place_on = {"default:dirt_with_dry_grass"}, + fill_ratio = 0.25, + biomes = {"mesa"}, + decoration = {"default:dry_grass_2", "default:dry_grass_3", "default:dry_grass_4", + "default:dry_grass_5"}}) + +-- scorched tree + +register_decoration(ethereal.fiery, { + place_on = {"ethereal:fiery_dirt"}, + fill_ratio = 0.000275, + biomes = {"fiery"}, + decoration = "ethereal:scorched_tree", + height_max = 6}) + +-- fiery lava pits + +register_decoration(ethereal.fiery, { + place_on = {"ethereal:fiery_dirt"}, + place_offset_y = -1, + spawn_by = "ethereal:fiery_dirt", + num_spawn_by = 7, + sidelen = 8, + noise_params = { + offset = 0.0125, + scale = 0.025, + spread = {x = 50, y = 50, z = 50}, + seed = 909, + octaves = 2, + persist = 1.0 + }, + biomes = {"fiery"}, + decoration = "default:lava_source", + flags = "force_placement"}) + +-- Special orange baked clay surface decor for mesa + +register_decoration(ethereal.mesa,{ + deco_type = "simple", + place_on = {"default:dirt_with_dry_grass"}, + sidelen = 2, + noise_params = { + offset = -1, + scale = -1.25, + spread = {x = 100, y = 100, z = 100}, + seed = 4, + octaves = 4, + persist = 1.0 + }, + biomes = {"mesa"}, + y_max = 31000, + y_min = 1, + decoration = "bakedclay:orange", + place_offset_y = -1, + flags = "force_placement" +}) + +-- dry shrub +register_decoration(ethereal.plains, { + place_on = {"default:dry_dirt"}, + fill_ratio = 0.005, + biomes = {"plains"}, + decoration = "default:dry_shrub"}) + +register_decoration(ethereal.jumble, { + place_on = {"default:dirt_with_grass"}, + fill_ratio = 0.00325, + biomes = {"jumble"}, + decoration = "default:dry_shrub"}) + +register_decoration(ethereal.desert, { + place_on = {"default:desert_sand"}, + fill_ratio = 0.0025, + biomes = {"desert"}, + decoration = "default:dry_shrub"}) + +register_decoration(ethereal.sandstone, { + place_on = {"default:sand"}, + fill_ratio = 0.0025, + y_min = 5, + biomes = {"sandstone_desert"}, + decoration = "default:dry_shrub"}) + +register_decoration(ethereal.mesa, { + place_on = {"bakedclay:red","bakedclay:orange"}, + fill_ratio = 0.015, + biomes = {"mesa"}, + decoration = "default:dry_shrub"}) + +register_decoration(ethereal.caves, { + place_on = {"default:desert_stone"}, + fill_ratio = 0.005, y_min = 5, y_max = 42, + biomes = {"caves"}, + decoration = {"default:dry_grass_2", "default:dry_grass_3", "default:dry_shrub"}}) + +-- crystal spike & grass + +register_decoration(ethereal.frost, { + place_on = {"ethereal:crystal_dirt"}, + fill_ratio = 0.02, y_min = 1, y_max = 1750, + biomes = {"frost", "frost_floatland"}, + decoration = {"ethereal:crystal_spike", "ethereal:crystalgrass"}}) + +-- red shrub + +register_decoration(ethereal.fiery, { + place_on = {"ethereal:fiery_dirt"}, + fill_ratio = 0.10, + biomes = {"fiery"}, + decoration = "ethereal:dry_shrub"}) + +-- snowy grass + +register_decoration(ethereal.snowy, { + place_on = {"ethereal:gray_dirt"}, + fill_ratio = 0.175, + biomes = {"grayness"}, + decoration = "ethereal:snowygrass"}) + +-- cactus + +register_decoration(1,{ + name = node, + deco_type = "simple", + sidelen = 8, + place_on = { + "default:desert_sand", + "default:sand", + }, + noise_params = { + offset = -0.0069, + scale = 0.0175, + spread = {x = 8, y = 8, z = 8}, + seed = 60659, + octaves = 2, + persist = 0.7625, + lacunarity = 0.6, + }, + y_max = 31000, + y_min = 1, + biomes = { + "desert", + "sandstone_desert", + }, + height_max = 4, + decoration = "default:cactus", +}) + +-- wild red mushroom + +register_decoration(ethereal.mushroom, { + place_on = {"ethereal:mushroom_dirt"}, + fill_ratio = 0.25, + biomes = {"mushroom"}, + decoration = "flowers:mushroom_red"}) + +-- spore grass + +register_decoration(ethereal.mushroom, { + place_on = {"ethereal:mushroom_dirt"}, + fill_ratio = 0.175, + biomes = {"mushroom"}, + decoration = "ethereal:spore_grass"}) + +-- slime mold + +register_decoration(ethereal.mushroom, { + place_on = {"default:clay"}, + fill_ratio = 0.1, y_min = 1, y_max = 5, + biomes = {"mushroom_shore"}, + decoration = "ethereal:slime_mold"}) + +-- red & brown mushroom + +register_decoration(1,{ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_rainforest_litter", + "ethereal:prairie_dirt", + "ethereal:mushroom_dirt", + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.009, + spread = {x = 200, y = 200, z = 200}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { + "rainforest", + "deciduous_forest", + "grassytwo", + "prairie", + "swamp", + "marsh", + "mushroom", + }, + decoration = {"flowers:mushroom_brown", "flowers:mushroom_red"} +}) + +-- stumps + +register_decoration(ethereal.jumble, { + place_on = {"default:dirt_with_grass"}, + fill_ratio = 0.00175, + biomes = {"jumble"}, + y_min = 4, + decoration = "default:tree", + height_max = 4}) + +-- jungle grass + +register_decoration(ethereal.junglee, { + place_on = {"default:dirt_with_rainforest_litter"}, + fill_ratio = 0.1, + biomes = {"rainforest"}, + decoration = "default:junglegrass"}) + +register_decoration(ethereal.jumble, { + place_on = {"default:dirt_with_rainforest_litter"}, + fill_ratio = 0.1, + biomes = {"jumble", "grove"}, + decoration = "default:junglegrass"}) + +register_decoration(ethereal.swamp, { + place_on = {"default:dirt_with_grass"}, + fill_ratio = 0.25, + biomes = {"swamp","marsh"}, + decoration = "default:junglegrass"}) + +-- grass + +register_decoration(ethereal.grassy, { + place_on = {"default:dirt_with_grass"}, + fill_ratio = 0.35, + biomes = {"deciduous_forest"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(ethereal.grassytwo, { + place_on = {"default:dirt_with_grass"}, + fill_ratio = 0.35, + biomes = {"grassytwo"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(ethereal.jumble, { + place_on = {"default:dirt_with_grass","default:dirt_with_rainforest_litter"}, + fill_ratio = 0.35, + biomes = {"jumble"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(ethereal.junglee, { + place_on = {"default:dirt_with_rainforest_litter"}, + fill_ratio = 0.35, + biomes = {"rainforest"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(ethereal.grove, { + place_on = {"ethereal:grove_dirt","default:dirt_with_rainforest_litter"}, + fill_ratio = 0.375, + biomes = {"grove"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(ethereal.mediterranean, { + place_on = {"ethereal:grove_dirt"}, + fill_ratio = 0.35, + biomes = {"mediterranean"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(ethereal.bamboo, { + place_on = {"ethereal:bamboo_dirt"}, + fill_ratio = 0.35, + biomes = {"bamboo"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +register_decoration(1, { + place_on = {"default:dirt_with_grass"}, + fill_ratio = 0.35, + biomes = {"grassland","swamp","marsh"}, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5"}}) + +-- ferns + +register_decoration(ethereal.grove, { + place_on = {"default:dirt_with_rainforest_litter", "ethereal:grove_dirt"}, + fill_ratio = 0.2, + biomes = {"grove"}, + decoration = "ethereal:fern"}) + +-- snow + +register_decoration(1,{ + deco_type = "simple", + place_on = "default:dirt_with_coniferous_litter", + sidelen = 40, + noise_params = { + offset = 0.2, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 2, + octaves = 2, + persist = 1.0 + }, + biomes = {"coniferous_forest"}, + decoration = "default:snow", +}) + +register_decoration(ethereal.alpine, { + place_on = {"default:dirt_with_snow"}, + fill_ratio = 0.8, y_min = 40, y_max = 140, + biomes = {"taiga"}, + decoration = "default:snow"}) + +-- wild onion and setting + +local abundant = minetest.settings:get_bool("ethereal.abundant_onions") ~= false + +-- wild onion + +register_decoration(1,asuna.features.crops.onion.inject_decoration({ + deco_type = "simple", + sidelen = 8, + place_on = {"group:soil"}, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = seed, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 1, + decoration = { + "ethereal:onion_3", + "ethereal:onion_4", + "ethereal:onion_5", + }, +})) + +-- papyrus + +register_decoration(1, { + place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, + fill_ratio = 0.125, y_min = 1, y_max = 32, + biomes = {"rainforest", "swamp", "marsh"}, + decoration = "default:papyrus", height_max = 4, + spawn_by = "default:water_source", num_spawn_by = 1}) + +-- blue agave from wine mod + +if minetest.get_modpath("wine") then + + register_decoration(ethereal.desert, { + place_on = {"default:desert_sand"}, + sidelen = 16, fill_ratio = 0.001, + biomes = {"desert"}, + decoration = {"wine:blue_agave"}}) +end + +-- default ferns + +register_decoration(1, { + place_on = {"ethereal:cold_dirt", "default:dirt_with_coniferous_litter"}, + sidelen = 16, fill_ratio = 0.2, + decoration = {"default:fern_1", "default:fern_2", "default:fern_3"} }) + +-- Tundra moss + +register_decoration(ethereal.tundra, { + place_on = {"default:permafrost_with_stones"}, + sidelen = 4, y_min = 2, y_max = 50, + noise_params = {offset = -0.8, scale = 2.0, spread = {x = 100, y = 100, z = 100}, + seed = 53995, octaves = 3, persist = 1.0}, + biomes = {"tundra"}, + decoration = "default:permafrost_with_moss", place_offset_y = -1, + flags = "force_placement"}) + +-- Tundra patchy snow + +register_decoration(ethereal.tundra, { + place_on = {"default:permafrost_with_moss", "default:permafrost_with_stones", + "default:stone", "default:gravel"}, + sidelen = 4, y_min = 1, y_max = 50, + noise_params = {offset = 0, scale = 1.0, spread = {x = 100, y = 100, z = 100}, + seed = 172555, octaves = 3, persist = 1.0}, + biomes = {"tundra", "tundra_shore"}, + decoration = "default:snow"}) + +-- Tundra very sparse grass and dry shrubs + +register_decoration(1,{ + deco_type = "simple", + place_on = { + "default:permafrost_with_moss", + }, + sidelen = 16, + fill_ratio = 0.01, + biomes = {"tundra"}, + y_max = 50, + y_min = 1, + decoration = { + "default:grass_1", + "default:dry_shrub", + }, +}) + +-- Coral Reef + +register_decoration(1,{ + name = "default:corals", + deco_type = "simple", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -3, + scale = 4, + spread = {x = 50, y = 50, z = 50}, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.tropical, + y_max = -2, + y_min = -36, + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton" + } +}) + +-- Kelp + +register_decoration(1,{ + deco_type = "simple", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 200, y = 200, z = 200}, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = asuna.biome_groups.below, + y_max = -5, + y_min = -36, + flags = "force_placement", + decoration = "default:sand_with_kelp", + param2 = 48, + param2_max = 96 +}) + +-- illumishrooms using underground decoration placement + +local function add_illumishroom(low, high, nodename) + + register_decoration(1, { + place_on = {"default:stone_with_coal"}, + sidelen = 16, fill_ratio = 0.5, y_min = low, y_max = high, + flags = "force_placement, all_floors", + decoration = nodename}) +end + +add_illumishroom(-1000, -50, "ethereal:illumishroom") +add_illumishroom(-2000, -1000, "ethereal:illumishroom2") +add_illumishroom(-3000, -2000, "ethereal:illumishroom3") + +--= Register Biome Decoration Using Plants Mega Pack Lite if Xanadu found + +if minetest.get_modpath("xanadu") then + + --= Desert Biome + + -- Cactus + register_decoration(1, { + place_on = {"default:desert_sand", "default:sandstone"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"desert", "sandstone_desert"}, + decoration = {"xanadu:cactus_echinocereus", "xanadu:cactus_matucana", + "xanadu:cactus_baseball", "xanadu:cactus_golden"}}) + + -- Desert Plants + register_decoration(1, { + place_on = {"default:desert_sand", "default:sandstone", "default:sand"}, + sidelen = 16, fill_ratio = 0.004, + biomes = {"desert", "sandstone_desert"}, + decoration = {"xanadu:desert_kangaroo", "xanadu:desert_brittle", + "xanadu:desert_ocotillo", "xanadu:desert_whitesage"}}) + + --= Prairie Biome + + -- Grass + register_decoration(1, { + place_on = {"ethereal:prairie_dirt", "default:dirt_with_grass"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"prairie", "deciduous_forest", "grassytwo"}, + decoration = {"xanadu:grass_prairie", "xanadu:grass_cord", + "xanadu:grass_wheatgrass", "xanadu:desert_whitesage"}}) + + -- Flowers + register_decoration(1, { + place_on = {"ethereal:prairie_dirt", "default:dirt_with_grass", + "ethereal:grove_dirt", "ethereal:bamboo_dirt"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"prairie", "deciduous_forest", "grassytwo", "bamboo"}, + decoration = {"xanadu:flower_jacobsladder", "xanadu:flower_thistle", + "xanadu:flower_wildcarrot"}}) + + register_decoration(1, { + place_on = {"ethereal:prairie_dirt", "default:dirt_with_grass", + "ethereal:grove_dirt"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"prairie", "deciduous_forest", "grassytwo", "grove"}, + decoration = {"xanadu:flower_delphinium", "xanadu:flower_celosia", + "xanadu:flower_daisy", "xanadu:flower_bluerose"}}) + + -- Shrubs + register_decoration(1, { + place_on = {"ethereal:prairie_dirt", "default:dirt_with_grass", + "ethereal:grove_dirt", "ethereal:jungle_grass", "ethereal:gray_dirt", + "default:dirt_with_rainforest_litter"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"prairie", "deciduous_forest", "grassytwo", "grove", "rainforest", + "grayness", "jumble"}, + decoration = {"xanadu:shrub_kerria", "xanadu:shrub_spicebush"}}) + + --= Jungle Biome + + register_decoration(1, { + place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, + sidelen = 16, fill_ratio = 0.007, + biomes = {"rainforest", "jumble"}, + decoration = {"xanadu:rainforest_guzmania", "xanadu:rainforest_devil", + "xanadu:rainforest_lazarus", "xanadu:rainforest_lollipop", + "xanadu:mushroom_woolly"}}) + + --= Cold Biomes + + register_decoration(1, { + place_on = {"default:dirt_with_snow", "ethereal:gray_dirt"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"coniferous_forest", "taiga", "grayness"}, + decoration = {"xanadu:mountain_edelweiss", "xanadu:mountain_armeria", + "xanadu:mountain_bellflower", "xanadu:mountain_willowherb", + "xanadu:mountain_bistort"}}) + + --= Mushroom Biome + + register_decoration(1, { + place_on = {"ethereal:mushroom_dirt"}, + sidelen = 16, fill_ratio = 0.005, + biomes = {"mushroom"}, + decoration = {"xanadu:mushroom_powderpuff", "xanadu:mushroom_chanterelle", + "xanadu:mushroom_parasol"}}) + + --= Lakeside + + register_decoration(1, { + place_on = {"default:sand", "default:dirt_with_grass"}, + sidelen = 16, fill_ratio = 0.015, + biomes = {"deciduous_forest_ocean", "grassland", "grassytwo", "jumble", + "swamp"}, + decoration = {"xanadu:wetlands_cattails", "xanadu:wetlands_pickerel", + "xanadu:wetlands_mannagrass", "xanadu:wetlands_turtle"}, + spawn_by = "default:water_source", num_spawn_by = 1}) + + --= Harsh Biomes + + register_decoration(1, { + place_on = {"ethereal:mushroom_dirt", "default:dirt_with_grass", + "ethereal:gray_dirt", "ethereal:dirt_with_snow", "ethereal:prairie_dirt", + "ethereal:grove_dirt", "ethereal:dry_dirt", "ethereal:fiery_dirt", + "default:sand", "default:desert_sand", "ethereal:bamboo_dirt", + "default:dirt_with_rainforest_litter", "default:permafrost_with_stones"}, + sidelen = 16, fill_ratio = 0.004, + biomes = {"mushroom", "prairie", "grayness", "plains", "desert", "rainforest", + "deciduous_forest", "grassytwo", "jumble", "coniferous_forest", "taiga", + "fiery", "mesa", "bamboo", "tundra"}, + decoration = {"xanadu:spooky_thornbush", "xanadu:spooky_baneberry"}}) + + --= Poppy's growing in Clearing Biome in memory of RealBadAngel + + register_decoration(1, { + place_on = {"default:dirt_with_grass"}, + sidelen = 16, fill_ratio = 0.004, + biomes = {"grassland"}, + decoration = {"xanadu:poppy"}}) +end diff --git a/mods/ethereal/dirt.lua b/mods/ethereal/dirt.lua new file mode 100644 index 00000000..b255b6f1 --- /dev/null +++ b/mods/ethereal/dirt.lua @@ -0,0 +1,377 @@ + +local S = minetest.get_translator("ethereal") + +local math_random = math.random + +-- override default dirt (to stop caves cutting away dirt) + +minetest.override_item("default:dirt", {is_ground_content = ethereal.cavedirt}) + +-- replace old green_dirt with default grass + +minetest.register_alias("ethereal:green_dirt", "default:dirt_with_grass") + +-- dry dirt + +minetest.register_node("ethereal:dry_dirt", { + description = S("Dried Dirt"), + tiles = {"ethereal_dry_dirt.png"}, + is_ground_content = ethereal.cavedirt, + groups = {crumbly = 3}, + sounds = default.node_sound_dirt_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "ethereal:dry_dirt", + recipe = "default:dirt", + cooktime = 3 +}) + +-- ethereal dirt types + +local dirts = { + "Bamboo", "Jungle", "Grove", "Prairie", "Cold", "Crystal", "Mushroom", "Fiery", "Gray" +} + +-- loop through and register dirts + +for n = 1, #dirts do + + local desc = dirts[n] + local name = desc:lower() + + minetest.register_node("ethereal:" .. name .. "_dirt", { + description = S(desc .. " Dirt"), + tiles = { + "ethereal_grass_" .. name .. "_top.png", "default_dirt.png", + { + name = "default_dirt.png^ethereal_grass_" .. name .. "_side.png", + tileable_vertical = false + } + }, + is_ground_content = ethereal.cavedirt, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + soil = { + base = "ethereal:" .. name .. "_dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + }, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25} + }) + }) +end + +-- flower spread, also crystal and fire flower regeneration + +local function flower_spread(pos, node) + + if (minetest.get_node_light(pos) or 0) < 13 then return end + + local pos0 = {x = pos.x - 4, y = pos.y - 2, z = pos.z - 4} + local pos1 = {x = pos.x + 4, y = pos.y + 2, z = pos.z + 4} + local num = #minetest.find_nodes_in_area(pos0, pos1, "group:flora") + + -- stop flowers spreading too much just below top of map block + if minetest.find_node_near(pos, 2, "ignore") then return end + + if num > 3 and node.name == "ethereal:crystalgrass" then + + local grass = minetest.find_nodes_in_area_under_air( + pos0, pos1, {"ethereal:crystalgrass"}) + + if #grass > 4 + and not minetest.find_node_near(pos, 4, {"ethereal:crystal_spike"}) then + + pos = grass[math_random(#grass)] + + pos.y = pos.y - 1 + + if minetest.get_node(pos).name == "ethereal:crystal_dirt" then + + pos.y = pos.y + 1 + + minetest.swap_node(pos, {name = "ethereal:crystal_spike"}) + end + end + + return + + elseif num > 3 and node.name == "ethereal:dry_shrub" then + + local grass = minetest.find_nodes_in_area_under_air( + pos0, pos1, {"ethereal:dry_shrub"}) + + if #grass > 8 + and not minetest.find_node_near(pos, 4, {"ethereal:fire_flower"}) then + + pos = grass[math_random(#grass)] + + pos.y = pos.y - 1 + + if minetest.get_node(pos).name == "ethereal:fiery_dirt" then + + pos.y = pos.y + 1 + + minetest.swap_node(pos, {name = "ethereal:fire_flower"}) + end + end + + return + + elseif num > 3 then + return + end + + pos.y = pos.y - 1 + + local under = minetest.get_node(pos) + + -- make sure we have soil underneath + if minetest.get_item_group(under.name, "soil") == 0 + or under.name == "default:desert_sand" then + return + end + + local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1, {under.name}) + + if #seedling > 0 then + + pos = seedling[math_random(#seedling)] + + pos.y = pos.y + 1 + + if (minetest.get_node_light(pos) or 0) < 13 then return end + + minetest.swap_node(pos, {name = node.name}) + end +end + +-- grow papyrus up to 4 high and bamboo up to 8 high + +local function grow_papyrus(pos, node) + + local oripos = pos.y + local high = 4 + + pos.y = pos.y - 1 + + local nod = minetest.get_node_or_nil(pos) + + if not nod + or minetest.get_item_group(nod.name, "soil") < 1 + or minetest.find_node_near(pos, 3, {"group:water"}) == nil then return end + + if node.name == "ethereal:bamboo" then high = 8 end + + pos.y = pos.y + 1 + + local height = 0 + + while height < high and minetest.get_node(pos).name == node.name do + height = height + 1 + pos.y = pos.y + 1 + end + + nod = minetest.get_node_or_nil(pos) + + if nod and nod.name == "air" and height < high then + + if node.name == "ethereal:bamboo" and height == (high - 1) then + + ethereal.grow_bamboo_tree({x = pos.x, y = oripos, z = pos.z}) + else + minetest.swap_node(pos, {name = node.name}) + end + end + +end + +-- override abm function + +local function override_abm(name, redef) + + if not name or not redef then return end + + for _, ab in pairs(minetest.registered_abms) do + + if name == ab.label then + + for k, v in pairs(redef) do + ab[k] = v + end + + return ab + end + end +end + +override_abm("Flower spread", { +--interval = 1, chance = 1, -- testing only + chance = 96, -- moved back to original chance from 300 + nodenames = {"group:flora"}, + neighbors = {"group:soil"}, + action = flower_spread +}) + +override_abm("Grow papyrus", { +--interval = 2, chance = 1, -- testing only + nodenames = {"default:papyrus", "ethereal:bamboo"}, + neighbors = {"group:soil"}, + action = grow_papyrus +}) + +override_abm("Mushroom spread", { +--interval = 1, chance = 1, -- testing only + chance = 50, -- moved back to original chance from 150 + nodenames = {"group:mushroom"} +}) + +-- Add Red, Orange and Grey baked clay if mod isn't active + +if not minetest.get_modpath("bakedclay") then + + minetest.register_node(":bakedclay:red", { + description = S("Red Baked Clay"), + tiles = {"baked_clay_red.png"}, + groups = {cracky = 3, bakedclay = 1}, + is_ground_content = ethereal.cavedirt, + sounds = default.node_sound_stone_defaults() + }) + + minetest.register_node(":bakedclay:orange", { + description = S("Orange Baked Clay"), + tiles = {"baked_clay_orange.png"}, + groups = {cracky = 3, bakedclay = 1}, + is_ground_content = ethereal.cavedirt, + sounds = default.node_sound_stone_defaults() + }) + + minetest.register_node(":bakedclay:grey", { + description = S("Grey Baked Clay"), + tiles = {"baked_clay_grey.png"}, + groups = {cracky = 3, bakedclay = 1}, + is_ground_content = ethereal.cavedirt, + sounds = default.node_sound_stone_defaults() + }) + + minetest.register_node(":bakedclay:brown", { + description = S("Brown Baked Clay"), + tiles = {"baked_clay_brown.png"}, + groups = {cracky = 3, bakedclay = 1}, + is_ground_content = ethereal.cavedirt, + sounds = default.node_sound_stone_defaults() + }) +end + +-- Quicksand (new style, sinking inside shows yellow effect + +minetest.register_node("ethereal:quicksand2", { + description = S("Quicksand"), + tiles = {"default_sand.png^[colorize:#00004F10"}, + drawtype = "glasslike", + paramtype = "light", + drop = "default:sand", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "ethereal:quicksand2", + liquid_alternative_source = "ethereal:quicksand2", + liquid_renewable = false, + liquid_range = 0, + drowning = 1, + walkable = false, + climbable = false, + post_effect_color = {r = 230, g = 210, b = 160, a = 245}, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +-- alias old quicksand to new + +minetest.register_alias("ethereal:quicksand", "ethereal:quicksand2") + +-- craft quicksand + +minetest.register_craft({ + output = "ethereal:quicksand2", + recipe = { + {"group:sand", "group:sand", "group:sand"}, + {"group:sand", "bucket:bucket_water", "group:sand"}, + {"group:sand", "group:sand", "group:sand"} + }, + replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}} +}) + +-- slime mold + +minetest.register_node("ethereal:slime_mold", { + description = S("Slime Mold"), + drawtype = "raillike", + paramtype = "light", + tiles = {"ethereal_slime_mold.png"}, + inventory_image = "ethereal_slime_mold.png", + wield_image = "ethereal_slime_mold.png", + use_texture_alpha = "clip", + walkable = false, + buildable_to = true, + floodable = true, + drop = {}, + groups = {crumbly = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + } +}) + +-- how slime molds spread + +minetest.register_abm({ + label = "Slime mold spread", + nodenames = {"ethereal:slime_mold"}, + neighbors = {"ethereal:spore_grass", "ethereal:fire_flower"}, + interval = 15, + chance = 4, + catch_up = false, + + action = function(pos, node) + + if minetest.find_node_near(pos, 1, {"ethereal:fire_flower"}) then + + minetest.sound_play("fire_extinguish_flame", + {pos = pos, gain = 0.05, max_hear_distance = 3}, true) + + minetest.remove_node(pos) ; return + end + + local near = minetest.find_node_near(pos, 1, {"ethereal:spore_grass"}) + + if near then + + minetest.sound_play("default_gravel_dug", + {pos = near, gain = 0.3, max_hear_distance = 3}, true) + + minetest.set_node(near, {name = "ethereal:slime_mold"}) + end + end +}) + +-- slime block + +minetest.register_node("ethereal:slime_block", { + description = S("Slime Block"), + tiles = {"ethereal_slime_block.png"}, + inventory_image = minetest.inventorycube("ethereal_slime_block.png"), + groups = {crumbly = 3, bouncy = 100, fall_damage_add_percent = -100, disable_jump = 1}, + sounds = default.node_sound_leaves_defaults() +}) + +minetest.register_craft({ + output = "ethereal:slime_block", + recipe = { + {"ethereal:slime_mold", "ethereal:slime_mold", "ethereal:slime_mold"}, + {"ethereal:slime_mold", "ethereal:fire_dust", "ethereal:slime_mold"}, + {"ethereal:slime_mold", "ethereal:slime_mold", "ethereal:slime_mold"} + } +}) diff --git a/mods/ethereal/extra.lua b/mods/ethereal/extra.lua new file mode 100644 index 00000000..d2bc0981 --- /dev/null +++ b/mods/ethereal/extra.lua @@ -0,0 +1,477 @@ + +local S = minetest.get_translator("ethereal") + +-- Blue Marble Nodes and recipe + +minetest.register_node("ethereal:blue_marble", { + description = S("Blue Marble"), + tiles = {"ethereal_blue_marble.png"}, + groups = {cracky = 1, stone = 1}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node("ethereal:blue_marble_tile", { + description = S("Blue Marble Tile"), + tiles = {"ethereal_blue_marble_tile.png"}, + groups = {cracky = 1, stone = 1}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_craft({ + output = "ethereal:blue_marble_tile 9", + recipe = { + {"ethereal:blue_marble", "ethereal:blue_marble", "ethereal:blue_marble"}, + {"ethereal:blue_marble", "ethereal:blue_marble", "ethereal:blue_marble"}, + {"ethereal:blue_marble", "ethereal:blue_marble", "ethereal:blue_marble"} + } +}) + +-- Etherium Dust + +minetest.register_craftitem("ethereal:etherium_dust", { + description = S("Etherium Dust"), + inventory_image = "ethereal_etherium_dust.png", + wield_image = "ethereal_etherium_dust.png" +}) + +-- Ethereium Ore + +minetest.register_node("ethereal:etherium_ore", { + description = S("Etherium Ore"), + tiles = {"default_desert_stone.png^ethereal_etherium_ore.png"}, + groups = {cracky = 3}, + drop = "ethereal:etherium_dust", + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node("ethereal:stone_with_etherium_ore", { + description = S("Etherium Ore"), + tiles = {"default_stone.png^ethereal_etherium_ore.png"}, + groups = {cracky = 3}, + drop = "ethereal:etherium_dust", + sounds = default.node_sound_stone_defaults() +}) + +-- Bamboo Flooring + +--[[minetest.register_node("ethereal:bamboo_floor", { + description = S("Bamboo Floor"), + drawtype = "nodebox", + tiles = {"ethereal_bamboo_floor.png"}, + wield_image = "ethereal_bamboo_floor.png", + inventory_image = "ethereal_bamboo_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = true, + node_box = { + type = "wallmounted", + wall_top = {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, + wall_bottom = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + wall_side = {-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5} + }, + selection_box = {type = "wallmounted"}, + groups = {snappy = 3, choppy = 3 , flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + output = "ethereal:bamboo_floor 2", + recipe = { + {"ethereal:bamboo", "ethereal:bamboo"}, + {"ethereal:bamboo", "ethereal:bamboo"} + } +})]] + +-- Bamboo Block + +minetest.register_node("ethereal:bamboo_block", { + description = S("Bamboo Block"), + tiles = {"ethereal_bamboo_floor.png"}, + paramtype = "light", + groups = {snappy = 3, choppy = 3 , flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + output = "ethereal:bamboo_block", + recipe = { + {"ethereal:bamboo_floor"}, + {"ethereal:bamboo_floor"} + } +}) + +minetest.register_craft({ + output = "ethereal:bamboo_block", + recipe = { + {"ethereal:bamboo", "ethereal:bamboo", "ethereal:bamboo"}, + {"ethereal:bamboo", "ethereal:bamboo", "ethereal:bamboo"}, + {"ethereal:bamboo", "ethereal:bamboo", "ethereal:bamboo"} + } +}) + +-- Paper recipes + +minetest.register_craft({ + output = "default:paper 6", + recipe = { + {"ethereal:bamboo", "ethereal:bamboo"}, + {"ethereal:bamboo", "ethereal:bamboo"}, + {"ethereal:bamboo", "ethereal:bamboo"} + } +}) + +minetest.register_craft({ + output = "default:paper 2", + recipe = { + {"farming:cotton", "farming:cotton", "farming:cotton"} + } +}) + +-- 4x red mushrooms make mushroom block + +minetest.register_craft({ + output = "ethereal:mushroom", + recipe = { + {"flowers:mushroom_red", "flowers:mushroom_red"}, + {"flowers:mushroom_red", "flowers:mushroom_red"} + } +}) + +minetest.register_craft({ + output = "ethereal:mushroom_brown", + recipe = { + {"flowers:mushroom_brown", "flowers:mushroom_brown"}, + {"flowers:mushroom_brown", "flowers:mushroom_brown"} + } +}) + +-- X pattern craft recipes (5x 'a' in X pattern gives 5 of 'b') + +if ethereal.xcraft == true then + + local cheat = { + {"default:cobble", "default:gravel", 5}, + {"default:gravel", "default:dirt", 5}, + {"default:dirt", "default:sand", 5}, + {"default:ice", "default:snow", 20}, + {"ethereal:dry_dirt", "default:desert_sand", 5}, + {"default:stone", "default:silver_sandstone", 5} + } + + for n = 1, #cheat do + + minetest.register_craft({ + output = cheat[n][2] .. " " .. cheat[n][3], + recipe = { + {cheat[n][1], "", cheat[n][1]}, + {"", cheat[n][1], ""}, + {cheat[n][1], "", cheat[n][1]} + } + }) + end +end + +-- Palm Wax + +minetest.register_craftitem("ethereal:palm_wax", { + description = S("Palm Wax"), + inventory_image = "ethereal_palm_wax.png", + wield_image = "ethereal_palm_wax.png" +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 10, + output = "ethereal:palm_wax", + recipe = "ethereal:palmleaves" +}) + +-- candle helper function + +local candle_colors = { + [""] = "F7F2CD", + ["black"] = "40403F", + ["blue"] = "5587B4", + ["brown"] = "6D4728", + ["cyan"] = "78F1B1", + ["dark_green"] = "23AF23", + ["dark_grey"] = "868178", + ["green"] = "96CA32", + ["grey"] = "C0BAAF", + ["magenta"] = "C22E7D", + ["orange"] = "E88817", + ["pink"] = "FA8B91", + ["red"] = "CF4727", + ["violet"] = "975EC0", + ["yellow"] = "FFF74D" +} + +local function add_candle(col, dcol) + + local under = "" ; if dcol ~= "" then under = "_" end + + minetest.register_node("ethereal:candle" .. under .. col, { + description = S(dcol .. "Candle"), + drawtype = "plantlike", + + inventory_image = "ethereal_candle_base_inv.png^[multiply:#" + .. candle_colors[col] .. "70^ethereal_candle_flame_inv.png", + wield_image = "ethereal_candle_base_inv.png^[multiply:#" + .. candle_colors[col] .. "70^ethereal_candle_flame_inv.png", + tiles = { + { + name = "ethereal_candle_base.png^[multiply:#" + .. candle_colors[col] .. "70^ethereal_candle_flame.png", + animation = { + type="vertical_frames", aspect_w = 32, aspect_h = 32, length = 1.0 + } + } + }, + paramtype = "light", + light_source = 11, + sunlight_propagates = true, + walkable = false, + groups = {candle = 1, candle_ethereal = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = { -0.15, -0.5, -0.15, 0.15, 0, 0.15 } + } + }) + + if dcol ~= "" then + minetest.register_craft({ + output = "ethereal:candle" .. under .. col, + recipe = { {"group:candle_ethereal", "dye:" .. col} } + }) + end +end + +add_candle("", "") +add_candle("black", "Black ") +add_candle("blue", "Blue ") +add_candle("brown", "Brown ") +add_candle("cyan", "Cyan ") +add_candle("dark_green", "Dark Green ") +add_candle("dark_grey", "Dark Grey ") +add_candle("green", "Green ") +add_candle("grey", "Grey ") +add_candle("magenta", "Magenta ") +add_candle("orange", "Orange ") +add_candle("pink", "Pink ") +add_candle("red", "Red ") +add_candle("violet", "Violet ") +add_candle("yellow", "Yellow ") + +-- white candle recipe + +minetest.register_craft({ + output = "ethereal:candle", + recipe = { + {"group:candle_ethereal", "dye:white"} + } +}) + +-- base candle recipe + +minetest.register_craft({ + output = "ethereal:candle 2", + recipe = { + {"farming:string"}, + {"ethereal:palm_wax"}, + {"ethereal:palm_wax"} + } +}) + +-- wooden bowl, dont add bowl if farming redo already has one + +if not minetest.registered_items["farming:bowl"] then + + minetest.register_craftitem("ethereal:bowl", { + description = S("Bowl"), + inventory_image = "ethereal_bowl.png", + groups = {food_bowl = 1, flammable = 2} + }) + + minetest.register_craft({ + output = "ethereal:bowl 4", + recipe = { + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } + }) +else + minetest.register_alias("ethereal:bowl", "farming:bowl") +end + +-- stone Ladder + +minetest.register_node("ethereal:stone_ladder", { + description = S("Stone Ladder"), + drawtype = "signlike", + tiles = {"ethereal_stone_ladder.png"}, + inventory_image = "ethereal_stone_ladder.png", + wield_image = "ethereal_stone_ladder.png", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = {type = "wallmounted"}, + groups = {cracky = 3, oddly_breakable_by_hand = 1}, + legacy_wallmounted = true, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_craft({ + output = "ethereal:stone_ladder 4", + recipe = { + {"group:stone", "", "group:stone"}, + {"group:stone", "group:stone", "group:stone"}, + {"group:stone", "", "group:stone"} + } +}) + +-- Paper Wall + +minetest.register_node("ethereal:paper_wall", { + drawtype = "nodebox", + description = S("Paper Wall"), + tiles = {"ethereal_paper_wall.png"}, + inventory_image = "ethereal_paper_wall.png", + wield_image = "ethereal_paper_wall.png", + paramtype = "light", + groups = {snappy = 3}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + is_ground_content = false, + sunlight_propagates = true, + paramtype2 = "facedir", + selection_box = { + type = "fixed", fixed = {-0.5, -0.5, 5/11, 0.5, 0.5, 8/16} + }, + node_box = { + type = "fixed", fixed = {{-0.5, -0.5, 5/11, 0.5, 0.5, 8/16}} + } +}) + +minetest.register_craft({ + output = "ethereal:paper_wall", + recipe = { + {"group:stick", "default:paper", "group:stick"}, + {"group:stick", "default:paper", "group:stick"}, + {"group:stick", "default:paper", "group:stick"} + } +}) + +-- Glostone (A little bit of light decoration) + +minetest.register_node("ethereal:glostone", { + description = S("Glo Stone"), + tiles = {"ethereal_glostone.png"}, + groups = {cracky = 3}, + light_source = 13, + drop = "ethereal:glostone", + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_craft({ + output = "ethereal:glostone", + recipe = { + {"", "default:torch", ""}, + {"default:torch", "default:stone", "default:torch"}, + {"", "dye:yellow", ""} + } +}) + +-- Charcoal Lump + +minetest.register_craftitem("ethereal:charcoal_lump", { + description = S("Lump of Charcoal"), + inventory_image = "ethereal_charcoal_lump.png" +}) + +minetest.register_craft({ + output = "ethereal:charcoal_lump 2", + recipe = { + {"ethereal:scorched_tree"} + } +}) + +minetest.register_craft({ + output = "ethereal:charcoal_lump 2", + type = "cooking", + recipe = "group:tree", + cooktime = 4 +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:charcoal_lump", + burntime = 10 +}) + +-- Make Torch from Charcoal Lump + +minetest.register_craft({ + output = "default:torch 4", + recipe = { + {"ethereal:charcoal_lump"}, + {"default:stick"} + } +}) + +-- staff of light alternative node list + +ethereal.lightstaff_recipes = { + ["nether:rack"] = "nether:glowstone", + ["nether:rack_deep"] = "nether:glowstone_deep" +} + +-- Staff of Light (by Xanthin) + +minetest.register_tool("ethereal:light_staff", { + description = S("Staff of Light"), + inventory_image = "ethereal_light_staff.png", + light_source = 13, + wield_image = "ethereal_light_staff.png", + sound = {breaks = "default_tool_breaks"}, + stack_max = 1, + + on_use = function(itemstack, user, pointed_thing) + + if pointed_thing.type ~= "node" then return end + + local pos = pointed_thing.under + local pname = user:get_player_name() + + if minetest.is_protected(pos, pname) then + minetest.record_protection_violation(pos, pname) + return + end + + local node = minetest.get_node(pos).name + local def = minetest.registered_nodes[node] + local stone = def and def.groups and def.groups.stone and def.groups.stone == 1 + + if ethereal.lightstaff_recipes[node] or stone then + + local glo = ethereal.lightstaff_recipes[node] or "ethereal:glostone" + + minetest.set_node(pos, {name = glo}) + + itemstack:add_wear(65535 / 149) -- 150 uses + + return itemstack + end + end +}) + +minetest.register_craft({ + output = "ethereal:light_staff", + recipe = { + {"ethereal:illumishroom", "default:mese_crystal", "ethereal:illumishroom"}, + {"ethereal:illumishroom2", "default:steel_ingot", "ethereal:illumishroom2"}, + {"ethereal:illumishroom3", "default:steel_ingot", "ethereal:illumishroom3"} + } +}) diff --git a/mods/ethereal/fences.lua b/mods/ethereal/fences.lua new file mode 100644 index 00000000..b6a6e783 --- /dev/null +++ b/mods/ethereal/fences.lua @@ -0,0 +1,104 @@ + +-- translation and mod check + +local S = minetest.get_translator("ethereal") +local door_mod = minetest.get_modpath("doors") + +-- fence registration helper (fence, rail, gate, mese post) + +local function add_fence(name, node, desc, texture) + + if default.register_fence then + + default.register_fence("ethereal:fence_" .. name, { + description = S(desc .. " Fence"), + texture = texture .. ".png", + material = "ethereal:" .. node, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + check_for_pole = true + }) + end + + if default.register_fence_rail then + + default.register_fence_rail("ethereal:fence_rail_" .. name, { + description = S(desc .. " Fence Rail"), + texture = texture .. ".png", + material = "ethereal:" .. node, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + end + + if door_mod and doors.register_fencegate then + + doors.register_fencegate("ethereal:fencegate_" .. name, { + description = S(desc .. " Fence Gate"), + texture = texture .. ".png", + material = "ethereal:" .. node, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + }) + end + + if default.register_mesepost then + + default.register_mesepost("ethereal:mese_post_" .. name, { + description = S(desc .. " Mese Post Light"), + texture = texture .. ".png", + material = "ethereal:" .. node + }) + end +end + +-- add wooden fences, gates and mese posts + +add_fence("scorched", "scorched_tree", "Scorched", "ethereal_scorched_tree") +add_fence("frostwood", "frost_wood", "Frost", "ethereal_frost_wood") +add_fence("redwood", "redwood_wood", "Redwood", "ethereal_redwood_wood") +add_fence("willow", "willow_wood", "Willow", "ethereal_willow_wood") +add_fence("yellowwood", "yellow_wood", "Healing Wood", "ethereal_yellow_wood") +add_fence("palm", "palm_wood", "Palm", "moretrees_palm_wood") +add_fence("banana", "banana_wood", "Banana Wood", "ethereal_banana_wood") +add_fence("mushroom", "mushroom_trunk", "Mushroom", "ethereal_mushroom_trunk") +add_fence("birch", "birch_wood", "Birch", "moretrees_birch_wood") +add_fence("sakura", "sakura_wood", "Sakura", "ethereal_sakura_wood") +add_fence("olive", "olive_wood", "Olive", "ethereal_olive_wood") +add_fence("basandra", "basandra_wood", "Basandra", "ethereal_basandra_bush_wood") + + +-- add compatibility for previous ethereal gates + +minetest.register_alias("ethereal:fencegate_wood_open", "doors:gate_wood_open") +minetest.register_alias("ethereal:fencegate_wood_closed", "doors:gate_wood_closed") +minetest.register_alias("ethereal:fencegate_acacia_open", "doors:gate_acacia_wood_open") +minetest.register_alias("ethereal:fencegate_acacia_closed", "doors:gate_acacia_wood_closed") +minetest.register_alias("ethereal:fencegate_junglewood_open", "doors:gate_junglewood_open") +minetest.register_alias("ethereal:fencegate_junglewood_closed", "doors:gate_junglewood_closed") +minetest.register_alias("ethereal:fencegate_pine_open", "doors:gate_pine_wood_open") +minetest.register_alias("ethereal:fencegate_pine_closed", "doors:gate_pine_wood_closed") + +-- sakura door + +if door_mod then + + doors.register("ethereal:door_sakura", { + tiles = { + {name = "ethereal_sakura_door.png", backface_culling = true} + }, + description = S("Sakura Wood Door"), + inventory_image = "ethereal_sakura_door_inv.png", + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + recipe = { + {"group:stick", "default:paper"}, + {"default:paper", "group:stick"}, + {"ethereal:sakura_wood", "ethereal:sakura_wood"} + } + }) + + minetest.register_alias("ethereal:sakura_door", "ethereal:door_sakura") + minetest.register_alias("ethereal:sakura_door_a", "ethereal:door_sakura_a") + minetest.register_alias("ethereal:sakura_door_b", "ethereal:door_sakura_b") +end diff --git a/mods/ethereal/fishing.lua b/mods/ethereal/fishing.lua new file mode 100644 index 00000000..3639bd62 --- /dev/null +++ b/mods/ethereal/fishing.lua @@ -0,0 +1,598 @@ +--[[ + + This fishing routine is inspired by the great work Rootyjr did for MineClone2 + +]]-- + +-- fish and where they can be caught + +local fish_items = { + "ethereal:fish_bluefin", + "ethereal:fish_blueram", + "ethereal:fish_catfish", + "ethereal:fish_plaice", + "ethereal:fish_salmon", + {"ethereal:fish_clownfish", "savanna"}, + {"ethereal:fish_pike", "grassland_ocean"}, + {"ethereal:fish_flathead", "rainforest"}, + {"ethereal:fish_pufferfish", "desert_ocean"}, + {"ethereal:fish_cichlid", "rainforest_ocean"}, + {"ethereal:fish_coy", "bamboo"}, + {"ethereal:fish_tilapia", "bamboo"}, + {"ethereal:fish_trevally", "bamboo"}, + {"ethereal:fish_angler", "ocean"}, + {"ethereal:fish_jellyfish", "ocean"}, + {"ethereal:fish_seahorse", "ocean"}, + {"ethereal:fish_seahorse_green", "rainforest_ocean"}, + {"ethereal:fish_seahorse_pink", "mushroom_ocean"}, + {"ethereal:fish_seahorse_blue", "coniferous_forest_ocean"}, + {"ethereal:fish_seahorse_yellow", "desert_ocean"}, + {"ethereal:fish_parrot", "desert"}, + {"ethereal:fish_piranha", "rainforest"}, + {"ethereal:fish_tuna", "rainforest"}, + {"ethereal:fish_trout", "ocean"}, + {"ethereal:fish_cod", "ocean"}, + {"ethereal:fish_flounder", "ocean"}, + {"ethereal:fish_redsnapper", "ocean"}, + {"ethereal:fish_squid", "ocean"}, + {"ethereal:fish_shrimp", "ocean"}, + {"ethereal:fish_carp", "swamp"}, + {"ethereal:fish_tetra", "grayness_ocean"}, + {"ethereal:fish_mackerel", "glacier"} +} +-- grassland_ocean, desert_ocean, bamboo_ocean, mesa_ocean, coniferous_forest_ocean, +-- taiga_ocean, frost_ocean, deciduous_forest_ocean, grayness_ocean, grassytwo_ocean, +-- prairie_ocean, jumble_ocean, rainforest_ocean, grove_ocean, mushroom_ocean, +-- sandstone_desert_ocean, plains_ocean, savanna_ocean, fiery_ocean, swamp_ocean, +-- glacier_ocean, tundra_ocean + +-- translation and mod checks + +local S = minetest.get_translator("ethereal") +local mod_bonemeal = minetest.get_modpath("bonemeal") +local mod_armor = minetest.get_modpath("3d_armor") +local mod_mobs = minetest.get_modpath("mobs") + +-- junk items to be found + +local junk_items = { + "ethereal:bowl", + "default:stick", + "farming:string", + "default:papyrus", + "dye:black", + "flowers:waterlily", + "default:paper", + "flowers:mushroom_red", + "vessels:glass_bottle", + {"ethereal:bamboo", "bamboo"}, + mod_bonemeal and "bonemeal:bone" or "default:stick", + mod_armor and "3d_armor:boots_wood 6000" or "default:stick" +} + +-- bonus items to be found + +local bonus_items = { + mod_mobs and "mobs:nametag" or "fireflies:bug_net", + mod_mobs and "mobs:net" or "default:sapling", + "fireflies:firefly_bottle", + mod_mobs and "mobs:saddle" or "farming:cotton_wild", + "default:book", + {"ethereal:firethorn", "glacier"}, + {"ethereal:crystal_spike", "frost"}, + {"ethereal:banana_bunch", "grove"}, + "tnt:tnt_stick", + "bucket:bucket_empty", + "default:sword_steel 12000", + "ethereal:fishing_rod 9000" +} + +-- helpers + +local default_item = "default:dirt" +local random = math.random -- yup we use this a lot + +-- global add item function + +ethereal.add_item = function(fish, junk, bonus) + + if fish and fish ~= "" then table.insert(fish_items, fish) end + + if junk and junk ~= "" then table.insert(junk_items, junk) end + + if bonus and bonus ~= "" then table.insert(bonus_items, bonus) end +end + +-- bubble particle effect + +local function effect(pos) + + minetest.add_particle({ + pos = { + x = pos.x + random() - 0.5, + y = pos.y + 0.1, + z = pos.z + random() - 0.5 + }, + velocity = {x = 0, y = 4, z = 0}, + acceleration = {x = 0, y = -5, z = 0}, + expirationtime = random() * 0.5, + size = random(), + collisiondetection = false, + vertical = false, + texture = "bubble.png" + }) +end + +-- fishing bob entity + +minetest.register_entity("ethereal:bob_entity", { + + initial_properties = { + textures = {"ethereal_fishing_bob.png"}, + visual_size = {x = 0.5, y = 0.5}, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + physical = false, + pointable = false, + static_save = false + }, + + timer = 0, + + on_step = function(self, dtime) + + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + +-- casting rod into water +if not self.cast then + + -- remove if we hit something hard + if (def and def.walkable) or node.name == "ignore" then + + self.object:remove() ; --print("-- hit block") + + return + end + + -- while bob is in water + if def and def.liquidtype == "source" + and minetest.get_item_group(node.name, "water") > 0 then + + -- incase of lag find water level + local free_fall, blocker = minetest.line_of_sight( + {x = pos.x, y = pos.y + 2, z = pos.z}, + {x = pos.x, y = pos.y , z = pos.z}) + + -- do we have worms for bait, if so take one + local player = self.fisher and minetest.get_player_by_name(self.fisher) + local inv = player and player:get_inventory() + local bait = 0 + + if inv and inv:contains_item("main", "caverealms:glow_bait") then + inv:remove_item("main", "caverealms:glow_bait") + bait = 40 + elseif inv and inv:contains_item("main", "ethereal:worm") then + inv:remove_item("main", "ethereal:worm") + bait = 20 + end + + -- re-position fishing bob and set to cast + pos = {x = pos.x, y = blocker.y + 0.45, z = pos.z} + + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) + self.object:set_pos(pos) + self.bait = bait + self.cast = true + + -- splash + effect(pos) ; effect(pos) ; effect(pos) ; effect(pos) + + minetest.sound_play("default_water_footstep", + {pos = pos, gain = 0.1}, true) + end + +else -- already cast and waiting for fish + + -- we need a name + if self.fisher == nil or self.fisher == "" then + + self.object:remove() ; --print("-- no name") + + return + end + + local player = minetest.get_player_by_name(self.fisher) + + -- we need an actual person + if not player then + + self.object:remove() ; --print("-- no player") + + return + end + + local wield = player:get_wielded_item() + + -- we also need a rod to fish with + if not wield or wield:get_name() ~= "ethereal:fishing_rod" then + + self.object:remove() ; --print("-- no rod") + + return + end + + -- remove bob if player is too far away + local pla_pos = player:get_pos() + + if (pla_pos.y - pos.y) > 15 or (pla_pos.y - pos.y) < -15 + or (pla_pos.x - pos.x) > 15 or (pla_pos.x - pos.x) < -15 + or (pla_pos.z - pos.z) > 15 or (pla_pos.z - pos.z) < -15 then + + self.object:remove() ; --print("-- out of range") + + return + end + + -- when in water, bob. + if def and def.liquidtype == "source" + and minetest.get_item_group(def.name, "water") ~= 0 then + + self.old_y = self.old_y or pos.y + + -- choose random time to wait (minus bait time for worm) + if not self.patience or self.patience <= 0 then + + self.patience = random(10, (45 - self.bait)) + self.bait = 0 + end + + -- add particles if bobber bobbing + if self.bob then + + effect(pos) + + -- handle timer + if self.timer < self.patience then + self.timer = self.timer + dtime + else + self.patience = 0 + self.timer = 0 + self.bob = false + end + else + -- handle timer + if self.timer < self.patience then + self.timer = self.timer + dtime + else + -- waiting over, bob that bobber and play splash sound + self.bob = true + self.patience = 1.4 -- timeframe to catch fish after bob + self.timer = 0 + + self.object:set_velocity({x = 0, y = -1, z = 0}) + self.object:set_acceleration({x = 0, y = 3, z = 0}) + + minetest.sound_play("default_water_footstep", { + pos = pos, gain = 0.1}, true) + end + end + else + -- reset to original position after dive. + if self.old_y and pos.y > self.old_y then + + self.object:set_velocity({x = 0, y = 0, z = 0}) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_pos({x = pos.x, y = self.old_y, z = pos.z}) + --print("-- reset bob y pos") + end + + -- remove if not in water and not bobbing + if not self.bob then + self.object:remove() ; --print("-- not in water") + end + end + +end -- if not self.cast + + end -- on_step +}) + +-- narrow item list depending on biome + +local find_item = function(list, pos) + + local item + local items = {} + local data= minetest.get_biome_data(pos) + local biome = data and minetest.get_biome_name(data.biome) or "" + +--print("--biome", biome) + + for n = 1, #list do + + item = list[n] + + if type(item) == "string" then + + table.insert(items, item) + + elseif type(item) == "table" then + + if item[2] == "" or biome:find(item[2]) then + table.insert(items, item[1]) + end + end + end + +--print("==biome: " .. biome, dump(items)) + + if #items > 0 then return items[random(#items)] end + + return "" +end + +-- fishing rod function that throws pre bob, places bob and catches fish when it moves + +local use_rod = function(itemstack, player, pointed_thing) + + local pos = player:get_pos() + local objs = minetest.get_objects_inside_radius(pos, 15) + local found = true + local ent + + -- loop through entities and look for bobs + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + if ent and ent.fisher and ent.name == "ethereal:bob_entity" + and player:get_player_name() == ent.fisher then + + found = false + + if ent.bob == true then + + local item + local r = random(100) + local rodpos = ent.object:get_pos() or pos + + -- lower position to be in water + rodpos.y = rodpos.y - 1 + + -- chance between catching fish, bonuns item or junk + if r < 86 then + + item = find_item(fish_items, rodpos) + + elseif r > 85 and r < 96 then + + item = find_item(junk_items, rodpos) + + else + + item = find_item(bonus_items, rodpos) + end + + -- split into name and number (wear level or number of items) + local item_name = item:split(" ")[1] + local item_wear = item:split(" ")[2] + + -- make sure item exists, if not replace with default item + if not minetest.registered_items[item_name] then + item = default_item + end + +--print ("---caught", item, r) + + item = ItemStack(item) -- convert into itemstack + + -- if tool then add wear + if item_wear and minetest.registered_tools[item_name] then + item:set_wear(65535 - item_wear) + end + + local inv = player:get_inventory() + + if inv:room_for_item("main", item) then + inv:add_item("main", item) + else + minetest.add_item(pos, item) + end + end + + ent.object:remove() + + return itemstack + end + end + + -- loop through entities and look for bobs + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + if ent and ent.fisher and ent.name == "ethereal:bob_entity" + and player:get_player_name() == ent.fisher then + + found = false + + break + end + end + + if found == true then + + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local pos = {x = playerpos.x, y = playerpos.y + 1.5, z = playerpos.z} + + minetest.sound_play("ethereal_casting_rod", + {pos = pos, gain = 1.0, max_hear_distance = 10}, true) + + -- place actual bob + local obj = minetest.add_entity(pos, "ethereal:bob_entity") + + obj:set_velocity({x = dir.x * 8, y = dir.y * 8, z = dir.z * 8}) + obj:set_acceleration({x = dir.x * -3, y = -9.8, z = dir.z * -3}) + obj:get_luaentity().fisher = player and player:get_player_name() + end + + -- Add wear to fishing rod (65 uses) + itemstack:add_wear(65535 / 65) + + return itemstack +end + +-- scan area for bobs that belong to player and remove + +local remove_bob = function(player) + + local objs = minetest.get_objects_inside_radius(player:get_pos(), 15) + local name = player:get_player_name() + local ent + + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + if ent and ent.name == "ethereal:bob_entity" then + + -- only remove players own bob + if ent.fisher and ent.fisher == name then + ent.object:remove() + end + end + end +end + +-- remove bob if player signs off + +minetest.register_on_leaveplayer(function(player) + remove_bob(player) +end) + +-- remove bob if player dies + +minetest.register_on_dieplayer(function(player) + remove_bob(player) +end) + +-- fishing rod + +minetest.register_tool("ethereal:fishing_rod", { + description = S("Fishing Rod (USE to cast and again when the time is right)"), + groups = {tool = 1}, + inventory_image = "ethereal_fishing_rod.png", + wield_image = "ethereal_fishing_rod.png^[transformFX", + wield_scale = {x = 1.5, y = 1.5, z = 1}, + stack_max = 1, + on_use = use_rod, + sound = {breaks = "default_tool_breaks"} +}) + +minetest.register_craft({ + output = "ethereal:fishing_rod", + recipe = { + {"","","group:stick"}, + {"","group:stick","farming:string"}, + {"group:stick","","farming:string"} + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:fishing_rod", + burntime = 15 +}) + +-- table of fish and edibility + +local fish = { + {"Blue Fin", "bluefin", 2}, + {"Blue Ram Cichlid", "blueram", 2}, + {"Common Carp", "carp", 2}, + {"Cod", "cod", 2}, + {"Redtail Catfish", "catfish", 2}, + {"Clownfish", "clownfish", 2}, + {"Northern Pike", "pike", 2}, + {"Dusky Flathead", "flathead", 2}, + {"Plaice", "plaice", 2}, + {"Tiger Pufferfish", "pufferfish", -16}, + {"Coy", "coy", 2}, + {"European Flounder", "flounder", 2}, + {"Atlantic Salmon", "salmon", 2}, + {"Iceblue Zebra Cichlid", "cichlid", 2}, + {"Angler", "angler", 2}, + {"Moon Jellyfish", "jellyfish", 0}, + {"Pacific Mackerel", "mackerel", 2}, + {"Piranha", "piranha", 2}, + {"Rainbow Trout", "trout", 2}, + {"Red Snapper", "redsnapper", 2}, + {"Red Seahorse", "seahorse", 0}, + {"Green Seahorse", "seahorse_green", 0}, + {"Pink Seahorse", "seahorse_pink", 0}, + {"Blue Seahorse", "seahorse_blue", 0}, + {"Yellow Seahorse", "seahorse_yellow", 0}, + {"Yellowfin Tuna", "tuna", 2}, + {"Humboldt Squid", "squid", 0}, + {"White Shrimp", "shrimp", 0}, + {"Neon Tetra", "tetra", 1}, + {"Tilapia", "tilapia", 2}, + {"Golden Trevally", "trevally", 2}, + {"Stoplight Parrotfish", "parrot", 2} +} + +-- register above fish + +for n = 1, #fish do + + local usage + local groups = nil + + if fish[n][3] ~= 0 then + usage = minetest.item_eat(fish[n][3]) + groups = {food_fish_raw = 1, ethereal_fish = 1} + end + + minetest.register_craftitem("ethereal:fish_" .. fish[n][2], { + description = S(fish[n][1]), + inventory_image = "ethereal_fish_" .. fish[n][2] .. ".png", + on_use = usage, + groups = groups + }) + + if groups then + ethereal.add_eatable("ethereal:fish_" .. fish[n][2], fish[n][3]) + end +end + +-- Make Neon Tetra glow slightly + +minetest.override_item("ethereal:fish_tetra", {light_source = 3}) + +-- Pufferfish changes so it cannot be used in generic recipes + +minetest.override_item("ethereal:fish_pufferfish", {groups = {flammable = 2}}) + +-- Worm + +minetest.register_craftitem("ethereal:worm", { + description = S("Worm"), + inventory_image = "ethereal_worm.png", + wield_image = "ethereal_worm.png" +}) + +minetest.register_craft({ + output = "ethereal:worm", + recipe = { + {"default:dirt", "default:dirt"} + } +}) + +-- compatibility + +minetest.register_alias("ethereal:fish_raw", "ethereal:fish_cichlid") +minetest.register_alias("ethereal:fishing_rod_baited", "ethereal:fishing_rod") +minetest.register_alias("ethereal:fish_chichlid", "ethereal:fish_cichlid") diff --git a/mods/ethereal/flight.lua b/mods/ethereal/flight.lua new file mode 100644 index 00000000..abe722ec --- /dev/null +++ b/mods/ethereal/flight.lua @@ -0,0 +1,197 @@ + +-- translation and settings + +local S = minetest.get_translator("ethereal") +local flight_secs = minetest.settings:get("ethereal.flightpotion_duration") or (5 * 60) +local timer_check = 5 -- seconds per check + +-- get player timer + +local function get_timer(user) + + if not user then return end + + local meta = user:get_meta() ; if not meta then return "" end + + return meta:get_string("ethereal:fly_timer") or "" +end + +-- do we have fly privs + +local function has_fly(name) + return minetest.get_player_privs(name).fly +end + +-- set player timer + +local function set_timer(user, timer) + + local meta = user:get_meta() ; if not meta then return end + + meta:set_string("ethereal:fly_timer", timer) +end + +-- give or revoke fly priv + +local function set_flight(user, set) + + local name = user and user:get_player_name() ; if not name then return end + local privs = minetest.get_player_privs(name) + + privs.fly = set + + minetest.set_player_privs(name, privs) + + -- when flight removed set timer to temp position + if set ~= true then set_timer(user, "-99") end +end + +-- after function + +local function ethereal_set_flight(user) + + local name = user and user:get_player_name() ; if not name then return end + + local timer = tonumber(get_timer(user)) or 0 + + -- if timer ran out then remove 'fly' privelage + if timer <= 0 and timer ~= -99 then + + set_flight(user, nil) + + return + end + + local privs = minetest.get_player_privs(name) + + -- have we already applied 'fly' privelage? + if not privs.fly then set_flight(user, true) end + + -- handle timer + timer = timer - timer_check + + -- show expiration message and play sound + if timer <= 10 then + + minetest.chat_send_player(name, minetest.get_color_escape_sequence("#ff5500") + .. S("Flight timer about to expire!")) + + minetest.sound_play("default_dig_dig_immediate", + {to_player = name, gain = 1.0}, true) + end + + set_timer(user, timer) -- set update timer + + -- restart checks + minetest.after(timer_check, function() + ethereal_set_flight(user) + end) +end + +-- on join / leave + +minetest.register_on_joinplayer(function(player) + + -- wait 2 seconds before doing flight checks on player + minetest.after(2.0, function(player) + + -- get player name and timer + local name = player and player:get_player_name() ; if not name then return end + local timer = get_timer(player) + + -- if timer is blank and player can already fly then default and return + if timer == "" and has_fly(name) then + + set_timer(player, "-99") + + return + end + + timer = tonumber(timer) or 0 + + -- if timer is set to default then return + if timer == -99 then return end + + -- if we got this far and player is flying then start countdown check + if has_fly(name) then + + minetest.after(timer_check, function() + ethereal_set_flight(player) + end) + end + + end, player) +end) + +-- potion item + +minetest.register_node("ethereal:flight_potion", { + description = S("Flight Potion"), + drawtype = "plantlike", + tiles = {"ethereal_flight_potion.png"}, + inventory_image = "ethereal_flight_potion.png", + wield_image = "ethereal_flight_potion.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.2, -0.37, -0.2, 0.2, 0.31, 0.2} + }, + groups = {dig_immediate = 3, vessel = 1}, + sounds = default.node_sound_glass_defaults(), + + on_use = function(itemstack, user, pointed_thing) + + if user.is_fake_player then return end + + -- get info + local name = user:get_player_name() + local privs = minetest.get_player_privs(name) + local timer = get_timer(user) + + if privs.fly then + + local msg = timer + + if timer == "" or timer == "-99" then msg = S("unlimited") end + + minetest.chat_send_player(name, minetest.get_color_escape_sequence("#ffff00") + .. S("Flight already granted, @1 seconds left!", msg)) + + return + end + + set_timer(user, flight_secs) -- set flight timer + + -- show time remaining + minetest.chat_send_player(name, + minetest.get_color_escape_sequence("#1eff00") + .. S("Flight granted, you have @1 seconds!", flight_secs)) + + ethereal_set_flight(user) -- start check + + itemstack:take_item() -- take item + + -- return empty bottle + local inv = user:get_inventory() + + if inv:room_for_item("main", {name = "vessels:glass_bottle"}) then + user:get_inventory():add_item("main", "vessels:glass_bottle") + else + minetest.add_item(user:get_pos(), {name = "vessels:glass_bottle"}) + end + + return itemstack + end +}) + +-- recipe + +minetest.register_craft({ + output = "ethereal:flight_potion", + recipe = { + {"ethereal:etherium_dust", "ethereal:etherium_dust", "ethereal:etherium_dust"}, + {"ethereal:etherium_dust", "ethereal:fire_dust", "ethereal:etherium_dust"}, + {"ethereal:etherium_dust", "vessels:glass_bottle", "ethereal:etherium_dust"} + } +}) diff --git a/mods/ethereal/food.lua b/mods/ethereal/food.lua new file mode 100644 index 00000000..956cd077 --- /dev/null +++ b/mods/ethereal/food.lua @@ -0,0 +1,751 @@ + +-- translator and mod check + +local S = minetest.get_translator("ethereal") +local mod_fredo = minetest.get_modpath("farming") + and farming and farming.mod and farming.mod == "redo" + +-- replacement bowl + +local bowl = mod_fredo and "farming:bowl" or "ethereal:bowl" + +-- Banana + +minetest.register_node("ethereal:banana", { + description = S("Banana"), + drawtype = "torchlike", + tiles = {"ethereal_banana_single.png"}, + inventory_image = "ethereal_banana_single.png", + wield_image = "ethereal_banana_single.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3, leafdecay = 1, leafdecay_drop = 1 + }, + drop = "ethereal:banana", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + place_param2 = 1 +}) + +ethereal.add_eatable("ethereal:banana", 2) + +-- Banana Bunch + +minetest.register_node("ethereal:banana_bunch", { + description = S("Banana Bunch"), + drawtype = "torchlike", + tiles = {"ethereal_banana_bunch.png"}, + inventory_image = "ethereal_banana_bunch.png", + wield_image = "ethereal_banana_bunch.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, leafdecay = 1, leafdecay_drop = 1 + }, + drop = "ethereal:banana_bunch", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + place_param2 = 1 +}) + +ethereal.add_eatable("ethereal:banana_bunch", 6) + +minetest.register_craft({ + output = "ethereal:banana 3", + recipe = {{"ethereal:banana_bunch"}} +}) + +minetest.register_craft({ + output = "ethereal:banana_bunch", + recipe = {{"ethereal:banana", "ethereal:banana", "ethereal:banana"}} +}) + +-- Banana Dough + +minetest.register_craftitem("ethereal:banana_dough", { + description = S("Banana Dough"), + inventory_image = "ethereal_banana_dough.png" +}) + +minetest.register_craft({ + output = "ethereal:banana_dough", + recipe = {{"group:food_flour", "group:food_banana"}} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 14, + output = "ethereal:banana_bread", + recipe = "ethereal:banana_dough" +}) + +-- Orange + +minetest.register_node("ethereal:orange", { + description = S("Orange"), + drawtype = "plantlike", + tiles = {"farming_orange.png"}, + inventory_image = "farming_orange.png", + wield_image = "farming_orange.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.27, -0.37, -0.27, 0.27, 0.44, 0.27} + }, + groups = { + food_orange = 1, fleshy = 3, dig_immediate = 3, + leafdecay = 3, leafdecay_drop = 1 + }, + drop = "ethereal:orange", + on_use = minetest.item_eat(4), + sounds = default.node_sound_leaves_defaults(), + place_param2 = 1 +}) + +ethereal.add_eatable("ethereal:orange", 4) + +-- Pine Nuts + +minetest.register_craftitem("ethereal:pine_nuts", { + description = S("Pine Nuts"), + inventory_image = "ethereal_pine_nuts.png", + wield_image = "ethereal_pine_nuts.png", + groups = {food_pine_nuts = 1}, + on_use = minetest.item_eat(1) +}) + +ethereal.add_eatable("ethereal:pine_nuts", 1) + +-- Banana Loaf + +minetest.register_craftitem("ethereal:banana_bread", { + description = S("Banana Loaf"), + inventory_image = "ethereal_banana_bread.png", + wield_image = "ethereal_banana_bread.png", + groups = {food_bread = 1}, + on_use = minetest.item_eat(6) +}) + +ethereal.add_eatable("ethereal:banana_bread", 6) + +-- coconut settings if farming redo found + +local fredo = minetest.get_modpath("farming") and farming and farming.mod + and farming.mod == "redo" + +local cdrp = fredo and "ethereal:coconut" or "ethereal:coconut_slice 4" +local cgrp = fredo and {3, 2} or {1, 1} + +-- Coconut (drops 4x coconut slice by default, whole coconut if farming redo found) + +minetest.register_node("ethereal:coconut", { + description = S("Coconut"), + drawtype = "plantlike", + walkable = false, + paramtype = "light", + sunlight_propagates = true, + tiles = {"moretrees_coconut.png"}, + inventory_image = "moretrees_coconut.png", + wield_image = "moretrees_coconut.png", + selection_box = { + type = "fixed", fixed = {-0.31, -0.43, -0.31, 0.31, 0.44, 0.31} + }, + groups = { + food_coconut = 1, snappy = cgrp[1], oddly_breakable_by_hand = cgrp[2], + cracky = cgrp[1], choppy = cgrp[1], flammable = 1, + leafdecay = 3, leafdecay_drop = 1 + }, + drop = cdrp, + sounds = default.node_sound_wood_defaults(), + place_param2 = 1 +}) + +-- Coconut Slice + +minetest.register_craftitem("ethereal:coconut_slice", { + description = S("Coconut Slice"), + inventory_image = "moretrees_coconut_slice.png", + wield_image = "moretrees_coconut_slice.png", + groups = {food_coconut_slice = 1}, + on_use = minetest.item_eat(1) +}) + +ethereal.add_eatable("ethereal:coconut_slice", 1) + +-- coconut slice recipe (farming redo) + +if fredo then + + minetest.register_craft({ + output = "ethereal:coconut_slice 4", + recipe = {{"farming:cutting_board", "ethereal:coconut"}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} + }) +end + +-- coconut slice into whole coconut + +minetest.register_craft({ + output = "ethereal:coconut", + recipe = { + {"ethereal:coconut_slice", "ethereal:coconut_slice"}, + {"ethereal:coconut_slice", "ethereal:coconut_slice"} + } +}) + +-- Golden Apple + +minetest.register_node("ethereal:golden_apple", { + description = S("Golden Apple"), + drawtype = "plantlike", + tiles = {"default_apple_gold.png"}, + inventory_image = "default_apple_gold.png", + wield_image = "default_apple_gold.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.2, -0.37, -0.2, 0.2, 0.31, 0.2} + }, + groups = { + fleshy = 3, dig_immediate = 3, leafdecay = 3,leafdecay_drop = 1, eatable = 2 + }, + drop = "ethereal:golden_apple", + sounds = default.node_sound_leaves_defaults(), + place_param2 = 1, + + on_use = function(itemstack, user, pointed_thing) + + if user and pointed_thing and pointed_thing.type ~= "object" then + + user:set_hp(20) + + return minetest.do_item_eat(2, nil, itemstack, user, pointed_thing) + end + end +}) + +-- Hearty Stew + +minetest.register_craftitem("ethereal:hearty_stew", { + description = S("Hearty Stew"), + inventory_image = "ethereal_hearty_stew.png", + wield_image = "ethereal_hearty_stew.png", + on_use = minetest.item_eat(10, bowl) +}) + +ethereal.add_eatable("ethereal:hearty_stew", 10) + +minetest.register_craft({ + output = "ethereal:hearty_stew", + recipe = { + {"group:food_onion","flowers:mushroom_brown", "group:food_tuber"}, + {"","flowers:mushroom_brown", ""}, + {"","group:food_bowl", ""} + } +}) + +-- Extra recipe for hearty stew + +if fredo then + + minetest.register_craft({ + output = "ethereal:hearty_stew", + recipe = { + {"group:food_onion","flowers:mushroom_brown", "group:food_beans"}, + {"","flowers:mushroom_brown", ""}, + {"","group:food_bowl", ""} + } + }) +end + +-- Bucket of Cactus Pulp + +minetest.register_craftitem("ethereal:bucket_cactus", { + description = S("Bucket of Cactus Pulp"), + inventory_image = "bucket_cactus.png", + wield_image = "bucket_cactus.png", + stack_max = 1, + groups = {vessel = 1, drink = 1}, + on_use = minetest.item_eat(2, "bucket:bucket_empty"), +}) + +ethereal.add_eatable("ethereal:bucket_cactus", 2) + +minetest.register_craft({ + output = "ethereal:bucket_cactus", + recipe = {{"bucket:bucket_empty","default:cactus"}} +}) + +-- firethorn jelly + +minetest.register_craftitem("ethereal:firethorn_jelly", { + description = S("Firethorn Jelly"), + inventory_image = "ethereal_firethorn_jelly.png", + wield_image = "ethereal_firethorn_jelly.png", + on_use = minetest.item_eat(2, "vessels:glass_bottle"), + groups = {vessel = 1} +}) + +ethereal.add_eatable("ethereal:firethorn_jelly", 2) + +if fredo then + + minetest.register_craft({ + output = "ethereal:firethorn_jelly", + recipe = { + {"farming:mortar_pestle","vessels:glass_bottle", ""}, + {"ethereal:firethorn", "ethereal:firethorn", "ethereal:firethorn"}, + {"bucket:bucket_water", "bucket:bucket_water", "bucket:bucket_water"} + }, + replacements = { + {"bucket:bucket_water", "bucket:bucket_empty 3"}, + {"farming:mortar_pestle", "farming:mortar_pestle"} + } + }) +end + +-- Lemon + +minetest.register_node("ethereal:lemon", { + description = S("Lemon"), + drawtype = "plantlike", + tiles = {"ethereal_lemon.png"}, + inventory_image = "ethereal_lemon_fruit.png", + wield_image = "ethereal_lemon_fruit.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.27, -0.37, -0.27, 0.27, 0.44, 0.27} + }, + groups = { + food_lemon = 1, fleshy = 3, dig_immediate = 3, leafdecay = 3, leafdecay_drop = 1 + }, + drop = "ethereal:lemon", + on_use = minetest.item_eat(3), + sounds = default.node_sound_leaves_defaults(), + place_param2 = 1 +}) + +ethereal.add_eatable("ethereal:lemon", 3) + +-- Candied Lemon + +minetest.register_craftitem("ethereal:candied_lemon", { + description = S("Candied Lemon"), + inventory_image = "ethereal_candied_lemon.png", + wield_image = "ethereal_candied_lemon.png", + groups = {food_candied_lemon = 1}, + on_use = minetest.item_eat(5) +}) + +ethereal.add_eatable("ethereal:candied_lemon", 5) + +minetest.register_craft({ + output = "ethereal:candied_lemon", + recipe = { + {"farming:baking_tray", "ethereal:lemon", "group:food_sugar"} + }, + replacements = { + {"farming:baking_tray", "farming:baking_tray"} + } +}) + +-- Lemonade + +minetest.register_node("ethereal:lemonade", { + description = S("Lemonade"), + drawtype = "plantlike", + visual_scale = 0.5, + tiles = {"ethereal_lemonade.png"}, + inventory_image = "ethereal_lemonade.png", + wield_image = "ethereal_lemonade.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.15, -0.5, -0.15, 0.15, 0, 0.15} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, drink = 1}, + on_use = minetest.item_eat(5, "vessels:drinking_glass"), + sounds = default.node_sound_glass_defaults() +}) + +ethereal.add_eatable("ethereal:lemonade", 5) + +minetest.register_craft({ + output = "ethereal:lemonade", + recipe = { + {"ethereal:lemon", "group:food_sugar", "group:food_sugar"}, + {"vessels:drinking_glass", "group:water_bucket", ""} + }, + replacements = { + {"group:water_bucket", "bucket:bucket_empty"}, + } +}) + +-- Olive + +minetest.register_node("ethereal:olive", { + description = S("Olive"), + drawtype = "plantlike", + tiles = {"ethereal_olive.png"}, + inventory_image = "ethereal_olive_fruit.png", + wield_image = "ethereal_olive_fruit.png", + visual_scale = 0.2, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.1, -0.5, -0.1, 0.1, -0.3, 0.1} + }, + groups = {fleshy = 3, dig_immediate = 3, leafdecay = 3, leafdecay_drop = 1}, + on_use = minetest.item_eat(1), + sounds = default.node_sound_leaves_defaults(), + place_param2 = 1 +}) + +ethereal.add_eatable("ethereal:olive", 1) + +-- Olive Oil + +minetest.register_craftitem("ethereal:olive_oil", { + description = S("Olive Oil"), + inventory_image = "ethereal_olive_oil.png", + wield_image = "ethereal_olive_oil.png", + groups = {food_oil = 1, food_olive_oil = 1, vessel = 1} +}) + +minetest.register_craft({ + output = "ethereal:olive_oil", + recipe = { + {"ethereal:olive", "ethereal:olive", "ethereal:olive"}, + {"ethereal:olive", "ethereal:olive", "ethereal:olive"}, + {"farming:juicer", "vessels:glass_bottle", ""} + }, + replacements = {{"farming:juicer", "farming:juicer"}} +}) + +-- Kappa Maki (sushi with cucumber) + +minetest.register_craftitem("ethereal:sushi_kappamaki", { + description = S("Kappa Maki Sushi"), + inventory_image = "ethereal_sushi_kappa_maki.png", + on_use = minetest.item_eat(3) +}) + +ethereal.add_eatable("ethereal:sushi_kappamaki", 3) + +minetest.register_craft({ + output = "ethereal:sushi_kappamaki 2", + recipe = { + {"group:food_seaweed", "group:food_cucumber", "group:food_rice"} + } +}) + +-- Nigiri (sushi with raw fish) + +minetest.register_craftitem("ethereal:sushi_nigiri", { + description = S("Nigiri Sushi"), + inventory_image = "ethereal_sushi_nigiri.png", + on_use = minetest.item_eat(2) +}) + +ethereal.add_eatable("ethereal:sushi_nigiri", 2) + +minetest.register_craft({ + output = "ethereal:sushi_nigiri 2", + recipe = { + {"group:food_rice", "group:food_fish_raw", ""} + } +}) + +-- Tamago (sushi with sweet egg) + +minetest.register_craftitem("ethereal:sushi_tamago", { + description = S("Tamago Sushi"), + inventory_image = "ethereal_sushi_tamago.png", + on_use = minetest.item_eat(2) +}) + +ethereal.add_eatable("ethereal:sushi_tamago", 2) + +minetest.register_craft({ + output = "ethereal:sushi_tamago 2", + recipe = { + {"group:food_seaweed", "group:food_egg", "group:food_rice"} + } +}) + +-- Fugu (prepared pufferfish) + +minetest.register_craftitem("ethereal:fugu", { + description = S("Fugusashi"), + inventory_image = "ethereal_fugu.png", + + on_use = function(itemstack, user, pointed_thing) + + if user then + + if math.random(12) == 1 then + return minetest.do_item_eat(-16, nil, itemstack, user, pointed_thing) + else + return minetest.do_item_eat(4, nil, itemstack, user, pointed_thing) + end + end + end +}) + +ethereal.add_eatable("ethereal:fugu", 4) + +minetest.register_craft({ + output = "ethereal:fugu", + recipe = { + {"group:food_cutting_board", "ethereal:fish_pufferfish", "group:food_soy_sauce"} + }, + replacements = { + {"group:food_cutting_board", "farming:cutting_board"}, + {"group:food_soy_sauce", "vessels:glass_bottle"} + } +}) + +-- Teriyaki Chicken + +minetest.register_craftitem("ethereal:teriyaki_chicken", { + description = S("Teriyaki Chicken"), + inventory_image = "ethereal_teriyaki_chicken.png", + on_use = minetest.item_eat(4) +}) + +ethereal.add_eatable("ethereal:teriyaki_chicken", 4) + +minetest.register_craft({ + output = "ethereal:teriyaki_chicken 2", + recipe = { + {"group:food_chicken_raw", "group:food_sugar", "group:food_soy_sauce"}, + {"group:food_garlic_clove", "group:food_saucepan", "group:food_gelatin"} + }, + replacements = { + {"group:food_soy_sauce", "vessels:glass_bottle"}, + {"group:food_saucepan", "farming:saucepan"} + } +}) + +-- Teriyaki Beef + +minetest.register_craftitem("ethereal:teriyaki_beef", { + description = S("Teriyaki Beef"), + inventory_image = "ethereal_teriyaki_beef.png", + on_use = minetest.item_eat(12, bowl) +}) + +ethereal.add_eatable("ethereal:teriyaki_beef", 12) + +minetest.register_craft({ + output = "ethereal:teriyaki_beef", + recipe = { + {"group:food_meat_raw", "group:food_sugar", "group:food_soy_sauce"}, + {"group:food_garlic_clove", "group:food_saucepan", "group:food_gelatin"}, + {"group:food_cabbage", "group:food_rice", "group:food_bowl"} + }, + replacements = { + {"group:food_soy_sauce", "vessels:glass_bottle"}, + {"group:food_saucepan", "farming:saucepan"} + } +}) + +-- mushroom soup + +minetest.register_craftitem("ethereal:mushroom_soup", { + description = S("Mushroom Soup"), + inventory_image = "ethereal_mushroom_soup.png", + groups = {drink = 1}, + on_use = minetest.item_eat(5, bowl) +}) + +ethereal.add_eatable("ethereal:mushroom_soup", 5) + +minetest.register_craft({ + output = "ethereal:mushroom_soup", + recipe = { + {"group:food_mushroom"}, + {"group:food_mushroom"}, + {"group:food_bowl"} + } +}) + +-- boiled shrimp + +minetest.register_craftitem("ethereal:fish_shrimp_cooked", { + description = S("Boiled Shrimp"), + inventory_image = "ethereal_fish_shrimp_cooked.png", + on_use = minetest.item_eat(2) +}) + +ethereal.add_eatable("ethereal:fish_shrimp_cooked", 2) + +minetest.register_craft({ + output = "ethereal:fish_shrimp_cooked 5", + recipe = { + {"ethereal:fish_shrimp", "ethereal:fish_shrimp", "ethereal:fish_shrimp"}, + {"ethereal:fish_shrimp", "group:water_bucket", "ethereal:fish_shrimp"}, + {"", "ethereal:fire_dust", ""} + }, + replacements = {{"group:water_bucket", "bucket:bucket_empty"}} +}) + +-- garlic butter shrimp + +minetest.register_craftitem("ethereal:garlic_shrimp", { + description = S("Garlic Butter Shrimp"), + inventory_image = "ethereal_garlic_butter_shrimp.png", + on_use = minetest.item_eat(6) +}) + +ethereal.add_eatable("ethereal:garlic_shrimp", 6) + +minetest.register_craft({ + output = "ethereal:garlic_shrimp", + recipe = { + {"farming:skillet", "ethereal:fish_shrimp", "ethereal:fish_shrimp"}, + {"group:food_butter", "group:food_garlic_clove", "ethereal:lemon"} + }, + replacements = {{"farming:skillet", "farming:skillet"}} +}) + +-- jellyfish salad + +minetest.register_craftitem("ethereal:jellyfish_salad", { + description = S("Jellyfish Salad"), + inventory_image = "ethereal_jellyfish_salad.png", + on_use = minetest.item_eat(6) +}) + +ethereal.add_eatable("ethereal:jellyfish_salad", 6) + +minetest.register_craft({ + output = "ethereal:jellyfish_salad", + recipe = { + {"farming:cutting_board", "ethereal:fish_jellyfish", "group:food_onion"}, + }, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} +}) + +-- raw calamari + +minetest.register_craftitem("ethereal:calamari_raw", { + description = S("Raw Calamari"), + inventory_image = "ethereal_calamari_raw.png", + on_use = minetest.item_eat(-2) +}) + +ethereal.add_eatable("ethereal:calamari_raw", -2) + +minetest.register_craft({ + output = "ethereal:calamari_raw 2", + recipe = { + {"farming:cutting_board", "ethereal:fish_squid"}, + }, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} +}) + +-- cooked calamari + +minetest.register_craftitem("ethereal:calamari_cooked", { + description = S("Calamari"), + inventory_image = "ethereal_calamari_cooked.png", + on_use = minetest.item_eat(5) +}) + +ethereal.add_eatable("ethereal:calamari_cooked", 5) + +minetest.register_craft({ + output = "ethereal:calamari_cooked", + recipe = { + {"farming:skillet", "ethereal:calamari_raw", "farming:flour"}, + }, + replacements = {{"farming:skillet", "farming:skillet"}} +}) + +-- fish & chips + +minetest.register_craftitem("ethereal:fish_n_chips", { + description = S("Fish & Chips"), + inventory_image = "ethereal_fish_chips.png", + on_use = minetest.item_eat(6) +}) + +ethereal.add_eatable("ethereal:fish_n_chips", 6) + +minetest.register_craft({ + output = "ethereal:fish_n_chips", + recipe = { + {"farming:baking_tray", "group:ethereal_fish", "group:food_potato"} + }, + replacements = {{"farming:baking_tray", "farming:baking_tray"}} +}) + +-- cooked fish + +minetest.register_craftitem(":ethereal:fish_cooked", { + description = S("Cooked Fish"), + inventory_image = "ethereal_fish_cooked.png", + wield_image = "ethereal_fish_cooked.png", + groups = {food_fish = 1}, + on_use = minetest.item_eat(5) +}) + +ethereal.add_eatable("ethereal:fish_cooked", 5) + +minetest.register_craft({ + type = "cooking", + output = "ethereal:fish_cooked", + recipe = "group:ethereal_fish", + cooktime = 8 +}) + +-- Sashimi + +minetest.register_craftitem("ethereal:sashimi", { + description = S("Sashimi"), + inventory_image = "ethereal_sashimi.png", + wield_image = "ethereal_sashimi.png", + on_use = minetest.item_eat(4) +}) + +ethereal.add_eatable("ethereal:sashimi", 4) + +minetest.register_craft({ + output = "ethereal:sashimi 2", + recipe = { + {"group:food_seaweed", "group:food_fish_raw", "group:food_seaweed"}, + } +}) + +-- agar powder + +minetest.register_craftitem("ethereal:agar_powder", { + description = S("Agar Powder"), + inventory_image = "ethereal_agar_powder.png", + groups = {food_gelatin = 1, flammable = 2} +}) + +minetest.register_craft({ + output = "ethereal:agar_powder 3", + recipe = { + {"group:food_seaweed", "group:food_seaweed", "group:food_seaweed"}, + {"bucket:bucket_water", "bucket:bucket_water", "default:torch"}, + {"bucket:bucket_water", "bucket:bucket_water", "default:torch"} + }, + replacements = {{"bucket:bucket_water", "bucket:bucket_empty 4"}} +}) diff --git a/mods/ethereal/init.lua b/mods/ethereal/init.lua new file mode 100644 index 00000000..1c49e1bb --- /dev/null +++ b/mods/ethereal/init.lua @@ -0,0 +1,175 @@ +--[[ + Minetest Ethereal Mod + + Created by ChinChow + + Updated by TenPlus1 +]] + +-- global + +ethereal = {version = "20241014"} + +-- setting helper + +local function setting(stype, name, default) + + local value + + if stype == "bool" then + value = minetest.settings:get_bool("ethereal." .. name) + elseif stype == "string" then + value = minetest.settings:get("ethereal." .. name) + elseif stype == "number" then + value = tonumber(minetest.settings:get("ethereal." .. name)) + end + + if value == nil then value = default end + + ethereal[name] = value +end + +-- DO NOT change settings below, use the settings.conf file instead + +setting("number", "leaftype", 1) +setting("bool", "leafwalk", false) +setting("bool", "cavedirt", true) +setting("bool", "torchdrop", true) +setting("bool", "papyruswalk", true) +setting("bool", "lilywalk", true) +setting("bool", "xcraft", true) +setting("bool", "flight", true) +setting("number", "glacier", 1) +setting("number", "bamboo", 1) +setting("number", "mesa", 1) +setting("number", "alpine", 1)--taiga +setting("number", "snowy", 1)--coniferous_forest +setting("number", "frost", 1) +setting("number", "grassy", 1)--deciduous_forest +setting("number", "caves", 0) +setting("number", "grayness", 1) +setting("number", "grassytwo", 1) +setting("number", "prairie", 0) +setting("number", "jumble", 1) +setting("number", "junglee", 1)--rainforest +setting("number", "desert", 1) +setting("number", "grove", 1) +setting("number", "mushroom", 1) +setting("number", "sandstone", 1)--sandstone_desert +setting("number", "plains", 1) +setting("number", "savanna", 0) +setting("number", "fiery", 1) +setting("number", "swamp", 1) +setting("number", "quicksand", 1)--swamp quicksand +setting("number", "tundra", 1) +setting("number", "mediterranean", 0) +setting("number", "cold_desert", 1) +setting("number", "snowy_grassland", 1) +setting("number", "sealife", 1) +setting("number", "reefs", 1) +setting("number", "logs", 0) +setting("bool", "wood_rotate", false) + + +local path = minetest.get_modpath("ethereal") + +-- Load settings.conf file if found [DEPRECATED] + +local input = io.open(path.."/settings.conf", "r") + +if input then + dofile(path .. "/settings.conf") ; input:close() ; input = nil +end + +-- Falling node function + +ethereal.check_falling = minetest.check_for_falling or nodeupdate + +-- creative check + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + +function ethereal.check_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + +-- helper function to add {eatable} group to food items + +function ethereal.add_eatable(item, hp) + + local def = minetest.registered_items[item] + + if def then + + local groups = table.copy(def.groups) or {} + + groups.eatable = hp ; groups.flammable = 2 + + minetest.override_item(item, {groups = groups}) + end +end + +-- strawberry check and load + +if minetest.get_modpath("farming") and farming.mod and farming.mod == "redo" then + -- farming redo already has strawberry included +else + dofile(path .. "/strawberry.lua") +end + +-- load mod sections + +dofile(path .. "/plantlife.lua") +dofile(path .. "/onion.lua") +dofile(path .. "/crystal.lua") +dofile(path .. "/water.lua") +dofile(path .. "/dirt.lua") +dofile(path .. "/food.lua") +dofile(path .. "/wood.lua") +dofile(path .. "/leaves.lua") +dofile(path .. "/sapling.lua") +dofile(path .. "/fishing.lua") +dofile(path .. "/extra.lua") +dofile(path .. "/sealife.lua") +dofile(path .. "/fences.lua") + +if minetest.settings:get_bool("ethereal.clear_default_biomes", false) then + dofile(path .. "/biomes_init.lua") +end + +dofile(path .. "/biomes.lua") +dofile(path .. "/ores.lua") +dofile(path .. "/schems.lua") +dofile(path .. "/decor.lua") +dofile(path .. "/compatibility.lua") +dofile(path .. "/stairs.lua") + +-- add flight if enabled + +if ethereal.flight then + dofile(path .. "/flight.lua") +end + +-- add lucky blocks if mod active + +if minetest.get_modpath("lucky_block") then + dofile(path .. "/lucky_block.lua") +end + +-- Set bonemeal aliases + +if minetest.get_modpath("bonemeal") then + minetest.register_alias("ethereal:bone", "bonemeal:bone") + minetest.register_alias("ethereal:bonemeal", "bonemeal:bonemeal") +else -- or return to where it came from + minetest.register_alias("ethereal:bone", "default:dirt") + minetest.register_alias("ethereal:bonemeal", "default:dirt") +end + +-- ambience lite + +if minetest.get_modpath("ambience") then + dofile(path .. "/ambience.lua") +end + +print ("[MOD] Ethereal loaded") diff --git a/mods/ethereal/leaves.lua b/mods/ethereal/leaves.lua new file mode 100644 index 00000000..da4645d8 --- /dev/null +++ b/mods/ethereal/leaves.lua @@ -0,0 +1,734 @@ + +local S = minetest.get_translator("ethereal") + +-- set leaftype (0 for plantlike, 1 for block) + +local leaftype = "plantlike" +local leafscale = 1.4 + +if ethereal.leaftype ~= 0 then + leaftype = "allfaces_optional" + leafscale = 1.0 +end + +-- default apple tree leaves + +minetest.override_item("default:leaves", { + drawtype = leaftype, + visual_scale = leafscale, + inventory_image = "default_leaves.png", + wield_image = "default_leaves.png", + walkable = ethereal.leafwalk +}) + +-- ability to craft big tree sapling + +minetest.register_craft({ + recipe = {{"default:sapling", "default:sapling", "default:sapling"}}, + output = "ethereal:big_tree_sapling" +}) + +-- default jungle tree leaves + +minetest.override_item("default:jungleleaves", { + drawtype = leaftype, + visual_scale = leafscale, + inventory_image = "default_jungleleaves.png", + wield_image = "default_jungleleaves.png", + walkable = ethereal.leafwalk +}) + +-- default pine tree leaves + +minetest.override_item("default:pine_needles", { + drawtype = leaftype, + visual_scale = leafscale, + inventory_image = "default_pine_needles.png", + wield_image = "default_pine_needles.png", + walkable = ethereal.leafwalk, + drop = { + max_items = 1, + items = { + {items = {"default:pine_sapling"}, rarity = 20}, + {items = {"ethereal:pine_nuts"}, rarity = 5}, + {items = {"default:pine_needles"}} + } + } +}) + +-- default acacia tree leaves + +minetest.override_item("default:acacia_leaves", { + drawtype = leaftype, + inventory_image = "default_acacia_leaves.png", + wield_image = "default_acacia_leaves.png", + visual_scale = leafscale, + walkable = ethereal.leafwalk +}) + +-- default aspen tree leaves + +minetest.override_item("default:aspen_leaves", { + drawtype = leaftype, + inventory_image = "default_aspen_leaves.png", + wield_image = "default_aspen_leaves.png", + visual_scale = leafscale, + walkable = ethereal.leafwalk +}) + +-- willow twig + +minetest.register_node("ethereal:willow_twig", { + description = S("Willow Twig"), + drawtype = "plantlike", + tiles = {"ethereal_willow_twig.png"}, + inventory_image = "ethereal_willow_twig.png", + wield_image = "ethereal_willow_twig.png", + paramtype = "light", + walkable = ethereal.leafwalk, + visual_scale = 1.4, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:willow_sapling"}, rarity = 50}, + {items = {"ethereal:willow_twig"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- redwood leaves + +minetest.register_node("ethereal:redwood_leaves", { + description = S("Redwood Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_redwood_leaves.png"}, + inventory_image = "ethereal_redwood_leaves.png", + wield_image = "ethereal_redwood_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:redwood_sapling"}, rarity = 50}, + {items = {"ethereal:redwood_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- orange tree leaves + +minetest.register_node("ethereal:orange_leaves", { + description = S("Orange Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_orange_leaves.png"}, + inventory_image = "ethereal_orange_leaves.png", + wield_image = "ethereal_orange_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:orange_tree_sapling"}, rarity = 15}, + {items = {"ethereal:orange_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- banana tree leaves + +minetest.register_node("ethereal:bananaleaves", { + description = S("Banana Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_banana_leaf.png"}, + inventory_image = "ethereal_banana_leaf.png", + wield_image = "ethereal_banana_leaf.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:banana_tree_sapling"}, rarity = 10}, + {items = {"ethereal:bananaleaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- healing tree leaves + +minetest.register_node("ethereal:yellowleaves", { + description = S("Healing Tree Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_yellow_leaves.png"}, + inventory_image = "ethereal_yellow_leaves.png", + wield_image = "ethereal_yellow_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, eatable = 1}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:yellow_tree_sapling"}, rarity = 50}, + {items = {"ethereal:yellowleaves"}} + } + }, + on_use = minetest.item_eat(1), + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves, + light_source = 9 +}) + +-- palm tree leaves + +minetest.register_node("ethereal:palmleaves", { + description = S("Palm Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"moretrees_palm_leaves.png"}, + inventory_image = "moretrees_palm_leaves.png", + wield_image = "moretrees_palm_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:palm_sapling"}, rarity = 10}, + {items = {"ethereal:palmleaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- birch tree leaves + +minetest.register_node("ethereal:birch_leaves", { + description = S("Birch Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"moretrees_birch_leaves.png"}, + inventory_image = "moretrees_birch_leaves.png", + wield_image = "moretrees_birch_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:birch_sapling"}, rarity = 20}, + {items = {"ethereal:birch_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- frost tree leaves + +minetest.register_node("ethereal:frost_leaves", { + description = S("Frost Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_frost_leaves.png"}, + inventory_image = "ethereal_frost_leaves.png", + wield_image = "ethereal_frost_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, puts_out_fire = 1}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:frost_tree_sapling"}, rarity = 15}, + {items = {"ethereal:frost_leaves"}} + } + }, + light_source = 9, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- bamboo stalk leaves + +minetest.register_node("ethereal:bamboo_leaves", { + description = S("Bamboo Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_bamboo_leaves.png"}, + inventory_image = "ethereal_bamboo_leaves.png", + wield_image = "ethereal_bamboo_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:bamboo_sprout"}, rarity = 10}, + {items = {"ethereal:bamboo_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- sakura leaves + +minetest.register_node("ethereal:sakura_leaves", { + description = S("Sakura Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_sakura_leaves.png"}, + inventory_image = "ethereal_sakura_leaves.png", + wield_image = "ethereal_sakura_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:sakura_sapling"}, rarity = 30}, + {items = {"ethereal:sakura_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +minetest.register_node("ethereal:sakura_leaves2", { + description = S("Sakura Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_sakura_leaves2.png"}, + inventory_image = "ethereal_sakura_leaves2.png", + wield_image = "ethereal_sakura_leaves2.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:sakura_sapling"}, rarity = 30}, + {items = {"ethereal:sakura_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- lemon tree leaves + +minetest.register_node("ethereal:lemon_leaves", { + description = S("Lemon Tree Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_lemon_leaves.png"}, + inventory_image = "ethereal_lemon_leaves.png", + wield_image = "ethereal_lemon_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:lemon_tree_sapling"}, rarity = 25}, + {items = {"ethereal:lemon_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- olive tree leaves + +minetest.register_node("ethereal:olive_leaves", { + description = S("Olive Tree Leaves"), + drawtype = leaftype, + visual_scale = leafscale, + tiles = {"ethereal_olive_leaves.png"}, + inventory_image = "ethereal_olive_leaves.png", + wield_image = "ethereal_olive_leaves.png", + paramtype = "light", + walkable = ethereal.leafwalk, + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:olive_tree_sapling"}, rarity = 25}, + {items = {"ethereal:olive_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = default.after_place_leaves +}) + +-- red mushroom top + +minetest.register_node("ethereal:mushroom", { + description = S("Mushroom Cap"), + tiles = {"ethereal_mushroom_block.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, leafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:mushroom_sapling"}, rarity = 20}, + {items = {"ethereal:mushroom"}} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:mushroom", + burntime = 10 +}) + +-- brown mushroom top + +minetest.register_node("ethereal:mushroom_brown", { + description = S("Brown Mushroom Cap"), + tiles = {"ethereal_mushroom_block_brown.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, leafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:mushroom_brown_sapling"}, rarity = 15}, + {items = {"ethereal:mushroom_brown"}} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:mushroom_brown", + burntime = 10 +}) + +-- mushroom pore (spongelike material found inside giant shrooms) + +minetest.register_node("ethereal:mushroom_pore", { + description = S("Mushroom Pore"), + tiles = {"ethereal_mushroom_pore.png"}, + groups = { + snappy = 3, cracky = 3, choppy = 3, oddly_breakable_by_hand = 3, + flammable = 2, disable_jump = 1, fall_damage_add_percent = -100, + leafdecay = 3 + }, + sounds = default.node_sound_dirt_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:mushroom_pore", + burntime = 3 +}) + +-- hedge block + +minetest.register_node("ethereal:bush", { + description = S("Bush"), + tiles = {"ethereal_bush.png"}, + walkable = true, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults() +}) + +minetest.register_craft({ + output = "ethereal:bush", + recipe = { + {"group:leaves", "group:leaves", "group:leaves"}, + {"group:leaves", "ethereal:bamboo_leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"} + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:bush", + burntime = 1 +}) + +-- bush block #2 + +minetest.register_node("ethereal:bush2", { + drawtype = "allfaces_optional", + description = S("Bush #2"), + tiles = {"default_aspen_leaves.png"}, + paramtype = "light", + walkable = true, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults() +}) + +minetest.register_craft({ + output = "ethereal:bush2", + recipe = { + {"group:leaves", "group:leaves", "group:leaves"}, + {"group:leaves", "default:aspen_leaves", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"} + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:bush2", + burntime = 1 +}) + +-- pine needles bush (replaces bush 3) + +minetest.register_alias("ethereal:bush3", "default:pine_bush_needles") + +minetest.register_craft({ + output = "default:pine_bush_needles", + recipe = { + {"group:leaves", "group:leaves", "group:leaves"}, + {"group:leaves", "default:pine_needles", "group:leaves"}, + {"group:leaves", "group:leaves", "group:leaves"} + } +}) + +-- basandra bush stem, leaves + +minetest.register_node("ethereal:basandra_bush_stem", { + description = S("Basandra Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + walkable = false, + damage_per_second = 2, + tiles = {"ethereal_basandra_bush_stem.png"}, + inventory_image = "ethereal_basandra_bush_stem.png", + wield_image = "ethereal_basandra_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + } +}) + +minetest.register_node("ethereal:basandra_bush_leaves", { + description = S("Basandra Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ethereal_basandra_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ethereal:basandra_bush_sapling"}, rarity = 5}, + {items = {"ethereal:basandra_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults() +}) + +-- leafdecay helper function + +local function decay(tru, lea, rad) + default.register_leafdecay({trunks = tru, leaves = lea, radius = rad}) +end + +-- add leafdecay registrations + +decay({"default:tree"}, {"default:apple", "default:leaves", "ethereal:orange", + "ethereal:orange_leaves", "ethereal:lemon", "ethereal:lemon_leaves"}, 3) + +decay({"ethereal:willow_trunk"}, {"ethereal:willow_twig"}, 3) + +decay({"ethereal:redwood_trunk"}, {"ethereal:redwood_leaves"}, 3) + +decay({"ethereal:frost_tree"}, {"ethereal:frost_leaves"}, 3) + +decay({"ethereal:yellow_trunk"}, {"ethereal:yellowleaves", "ethereal:golden_apple"}, 3) + +decay({"ethereal:palm_trunk"}, {"ethereal:palmleaves", "ethereal:coconut"}, 3) + +decay({"ethereal:banana_trunk"}, {"ethereal:bananaleaves", "ethereal:banana", + "ethereal:banana_bunch"}, 3) + +decay({"ethereal:birch_trunk"}, {"ethereal:birch_leaves"}, 3) + +decay({"ethereal:bamboo"}, {"ethereal:bamboo_leaves"}, 3) + +decay({"ethereal:sakura_trunk"}, {"ethereal:sakura_leaves", "ethereal:sakura_leaves2"}, 3) + +decay({"ethereal:olive_trunk"}, {"ethereal:olive_leaves", "ethereal:olive"}, 3) + +decay({"ethereal:mushroom_trunk"}, {"ethereal:mushroom", "ethereal:mushroom_brown", + "ethereal:mushroom_pore", "ethereal:lightstring"}, 4) + +-- falling leaf particles + +if minetest.settings:get_bool("ethereal.leaf_particles",false) ~= false then + + local leaf_list = { + {"ethereal:frost_leaves", "331b37", 9}, + {"ethereal:bananaleaves", "28581e"}, + {"ethereal:lemon_leaves", "507c1e"}, + {"ethereal:olive_leaves", "416531"}, + {"ethereal:orange_leaves", "1a3b1b"}, + {"ethereal:redwood_leaves", "15342a"}, + {"ethereal:sakura_leaves", "c281a9"}, + {"ethereal:sakura_leaves2", "d4cbac"}, + {"ethereal:willow_twig", "0b9445"}, + {"ethereal:yellowleaves", "8b5f00", 9}, + {"ethereal:birch_leaves", "274527"}, + {"ethereal:palmleaves", "2b6000"}, + {"ethereal:bamboo_leaves", "445811"}, + {"default:acacia_leaves", "296600"}, + {"default:aspen_leaves", "395d16"}, + {"default:jungleleaves", "141e10"}, + {"default:pine_needles", "00280e"}, + {"default:leaves", "223a20"} + } + + minetest.register_abm({ + label = "Ethereal falling leaves", + nodenames = {"group:leaves"}, + neighbors = {"air"}, + interval = 7, + chance = 50, + catch_up = false, + + action = function(pos, node) + + local text, glow + + for n = 1, #leaf_list do + + if node.name == leaf_list[n][1] then + + text = "ethereal_falling_leaf.png^[multiply:#" + .. leaf_list[n][2] .. "70" + + glow = leaf_list[n][3] ; break + end + end + + if text then + + minetest.add_particlespawner({ + amount = 1, + time = 2, + minpos = {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + maxpos = {x = pos.x + 1, y = pos.y, z = pos.z + 1}, + minvel = {x = -0.8, y = -1, z = -0.8}, + maxvel = {x = 0.8, y = -3, z = 0.8}, + minacc = {x = -0.1, y = -1, z = -0.1}, + maxacc = {x = 0.2, y = -3, z = 0.2}, + minexptime = 5, + maxexptime = 10, + minsize = 3, + maxsize = 4, + collisiondetection = true, collision_removal = true, + texture = text, + vertical = true, + glow = glow + }) + end + end + }) +end + +-- Special vine decay +local vo = vector.offset +local vinedir = { + [2] = function(v) + return vo(v,1,0,0) + end, + [3] = function(v) + return vo(v,-1,0,0) + end, + [4] = function(v) + return vo(v,0,0,1) + end, + [5] = function(v) + return vo(v,0,0,-1) + end, +} + +minetest.register_abm({ + label = "Ethereal vine decay", + nodenames = "ethereal:vine", + interval = 3, + chance = 2, + catch_up = false, + action = function(pos,node) + -- Only process if the vine is under a node that isn't another vine; vines + -- below vines are allowed to hang in the air + pos = vo(pos,0,1,0) + if minetest.get_node(pos).name ~= "ethereal:vine" then + local param2 = node.param2 + local behindpos = vinedir[param2] + + -- Do nothing if the vine is on the floor or ceiling + if not behindpos then + return + end + + -- Process entire length of vine + behindpos = behindpos(pos) + local behind = nil + while true do + pos = vo(pos,0,-1,0) + behindpos = vo(behindpos,0,-1,0) + node = minetest.get_node(pos) + + -- Remove the vine if it's part of a vine that's suspended in the air + if node.name == "ethereal:vine" and node.param2 == param2 and minetest.get_node(behindpos).name == "air" then + minetest.remove_node(pos) + minetest.check_for_falling(pos) + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}), + maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -9.81, 0), + maxacc = vector.new(0, -9.81, 0), + minsize = 0, + maxsize = 0, + node = { name = "ethereal:vine" }, + }) + else + -- We've reached something that isn't a vine, a vine facing in a + -- different direction, or a vine that is actually attached to + -- something, so stop processing + break + end + end + end + end, +}) \ No newline at end of file diff --git a/mods/ethereal/license.txt b/mods/ethereal/license.txt new file mode 100644 index 00000000..d2a08511 --- /dev/null +++ b/mods/ethereal/license.txt @@ -0,0 +1,223 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Textures by TenPlus1 (CC0) unless listed below... + +Textures by Hugues Ross (CC BY-SA 4.0): + ethereal_strawberry*.png + ethereal_wild_onion*.png + +Textures by NameNotQuality (CC0): + ethereal_olive_leaves.png + ethereal_lemon_leaves.png + ethereal_frost_wood.png + ethereal_frost_tree.png + ethereal_frost_tree_top.png + ethereal_yellow_tree.png + ethereal_yellow_tree_top.png + ethereal_yellow_wood.png + +Textures by Jeterel from OpenGameArt.org (CC0): + ethereal_banana_bread.png + +Textures by SickleMoon and edited by TenPlus1 (CC0): + ethereal_illumishroom_red.png + ethereal_illumishroom_green.png + ethereal_illumishroom_cyan.png + +Textures by TenPlus1 and resized/edited by NameNotQuality (CC0): + ethereal_banana_leaf.png + ethereal_basandra_bush_wood.png + ethereal_blue_marble.png + ethereal_blue_marble_tile.png + ethereal_redwood_wood.png + ethereal_redwood_trunk.png + ethereal_redwood_trunk_top.png + ethereal_sakura_trunk.png + ethereal_sakura_trunk_top.png + ethereal_sakura_wood.png + ethereal_willow_trunk.png + ethereal_willow_trunk_top.png + ethereal_willow_wood.png + +Textures by Felfa and resized/edited by NameNotQuality (CC0): + ethereal_olive_trunk.png + ethereal_olive_trunk_top.png + ethereal_orange_leaves.png + +Textures based on default minetest wood by alerikaisattera (CC BY-SA 3.0): + ethereal_birch_wood_alt.png + ethereal_redwood_wood_alt.png + ethereal_banana_wood_alt.png + ethereal_olive_wood_alt.png + ethereal_palm_wood_alt.png + ethereal_sakura_wood_alt.png + ethereal_willow_wood_alt.png + +Based on pilzmod_giant_mushroom_brown_side.png (CC BY-SA 3.0) by Phseiff + ethereal_mushroom_block_brown.png + +Based on default_leaves.png (Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + ethereal_frost_leaves.png [edited by TenPlus1] + ethereal_yellow_leaves.png [edited by TenPlus1] + ethereal_basandra_leaves.png [edited by TenPlus1] + +Textures by BlueTangs Rock (CC BY-SA 3.0): + ethereal_seaweed.png + ethereal_fish_angler.png + ethereal_fish_bluefin.png + ethereal_fish_blueram.png + ethereal_fish_carp.png + ethereal_fish_catfish.png + ethereal_fish_chichlid.png + ethereal_fish_clownfish.png + ethereal_fish_cod.png + ethereal_fish_flathead.png + ethereal_fish_flounder.png + ethereal_fish_jellyfish.png + ethereal_fish_mackerel.png + ethereal_fish_parrot.png + ethereal_fish_pike.png + ethereal_fish_piranha.png + ethereal_fish_plaice.png + ethereal_fish_pufferfish.png + ethereal_fish_redsnapper.png + ethereal_fish_salmon.png + ethereal_fish_shrimp.png + ethereal_fish_shrimp_cooked.png + ethereal_fish_squid.png + ethereal_fish_tetra.png + ethereal_fish_tilapia.png + ethereal_fish_trevally.png + ethereal_fish_tuna.png + ethereal_fish_trout.png + ethereal_sashimi.png + ethereal_fugu.png + ethereal_fish_chips.png + ethereal_calamari_raw.png + ethereal_calamari_cooked.png + ethereal_garlic_butter_shrimp.png + +Texture by Sirrobzeroone (CC0) + ethereal_fish_seahorse*.png + ethereal_fish_coy.png + ethereal_fish_cooked.png + +Textures by Epoxum (CC0) + ethereal_sushi_*.png + +Based on candle textures and coloured by wRothbard (CC0): + ethereal_candle_black.png + ethereal_candle_blue.png + ethereal_candle_cyan.png + ethereal_candle_dark_green.png + ethereal_candle_dark_grey.png + ethereal_candle_green.png + ethereal_candle_grey.png + ethereal_candle_magenta.png + ethereal_candle_orange.png + ethereal_candle_pink.png + ethereal_candle_red.png + ethereal_candle_violet.png + ethereal_candle_yellow.png + +Based on default tool textures by BlockMen in Minetest (CC BY-SA 3.0): + ethereal_crystal_pick.png + ethereal_crystal_shovel.png + ethereal_crystal_axe.png + ethereal_crystal_sword.png + +Based on texture by ElementW (CC BY-SA 3.0): + bucket_cactus.png + +Based on tree textures by ElementW (CC BY-SA 3.0): + ethereal_scorched_tree.png + ethereal_scorched_tree_top.png + +Based on wood texture by BlockMen (CC BY-SA 3.0): + ethereal_yellow_wood_alt.png [edited by alerikaisattera] + ethereal_frost_wood_alt.png [edited by alerikaisattera] + +Based on bottle texture by Thomas-S (CC BY-SA 3.0): + ethereal_flight_potion.png + ethereal_firethorn_jelly.png + +Textures based on default_grass.png and default_grass_side.png by TumeniNodes (CC BY-SA 3.0) + ethereal_grass_*.png [Edited by TenPlus1] + ethereal_crystal_moss.png + ethereal_mushroom_moss.png + ethereal_fiery_moss.png + ethereal_gray_moss.png + ethereal_green_moss.png + +Texture by ZonerDarkRevention (CC0) + ethereal_bowl.png_32px + ethereal_crystal_spike_32px.png [edited by TenPlus1] + ethereal_teriyaki_beef_32px.png [edited by TenPlus1] + ethereal_hearty_stew_32px.png + +Textures by VanessaE (CC-BY-SA 4.0) + moretrees_acacia_leaves.png + moretrees_birch_wood.png + moretrees_palm_trunk.png + moretrees_birch_leaves.png + moretrees_coconut.png + moretrees_palm_trunk_top.png + moretrees_birch_sapling.png + moretrees_coconut_slice.png + moretrees_palm_wood.png + moretrees_birch_trunk.png + moretrees_palm_leaves.png + moretrees_birch_trunk_top.png + moretrees_palm_sapling.png + ethereal_banana_wood.png (edited) + ethereal_olive_wood.png (edited) + +Based on default ice texture by asl97 (CC BY-SA 3.0): + ethereal_brick_ice.png [edited by philipmi] + +Based on default snow texture by Gambit (CC BY-SA 3.0): + ethereal_brick_snow.png [edited by philipmi] + +Textures by Felfa (CC0) + ethereal_olive_trunk_32px.png + ethereal_olive_trunk_top_32px.png + ethereal_olive_leaves_32px.png + ethereal_olive_fruit.png + ethereal_lemon.png + ethereal_lemon_leaves.png + +Textures by Isaiah658 (CC0) + ethereal_lemonade.png + ethereal_bamboo.png + +Created by XSSheep (CC BY-SA 4.0 - https://minecraft.curseforge.com/projects/pixel-perfection-freshly-updated) + default_apple_gold.png + +Sound by I_q (Attribution 3.0) https://freesound.org/people/l_q/sounds/440956/ + ethereal_casting_rod.ogg + +Sounds by eZZin (CC0) https://freesound.org/people/eZZin/sounds/667122/ + ethereal_mushroom.ogg + +Sound by Kostrava (CC0) https://freesound.org/people/Kostrava/sounds/333988/ + ethereal_crystal.ogg diff --git a/mods/ethereal/locale/ethereal.de.tr b/mods/ethereal/locale/ethereal.de.tr new file mode 100644 index 00000000..a4303460 --- /dev/null +++ b/mods/ethereal/locale/ethereal.de.tr @@ -0,0 +1,151 @@ +# textdomain: ethereal +Blue Marble= +Blue Marble Tile= +Crystal Spike=Kristallnadel +Crystal Ingot=Kristallbarren +Crystal Block=Kristallblock +Crystal Sword=Kristallschwert +Crystal Axe=Kristallaxt +Crystal Pickaxe=Kristallspitzhacke +Crystal Shovel= +Crystal Gilly Staff=Kristallener Gilly-Stab +Dried Dirt=Vertrocknete Erde +Red Baked Clay=Roter gebrannter Ton +Orange Baked Clay=Orange gebrannter Ton +Grey Baked Clay=Grauer gebrannter Ton +Quicksand=Treibsand +Etherium Dust=Etheriumstaub +Etherium Ore=Etheriumerz +Bamboo Floor=Bambusboden +Bamboo Block=Bambusblock +Palm Wax=Palmwachs +Bowl=Schale +Stone Ladder=Steinleiter +Paper Wall=Papierwand +Glo Stone=Leuchtstein +Lump of Charcoal=Holzkohleklumpen +Staff of Light=Stab des Lichts +Sakura Wood Door=Sakuraholztür +Fishing Rod (USE to cast and again when the time is right)= +Cooked Fish=Gekochter Fisch +Sashimi=Sashimi +Worm=Wurm +Flight timer about to expire!= +Flight Potion= +unlimited= +Flight already granted, @1 seconds left!= +Flight granted, you have @1 seconds!= +Banana=Banane +Banana Bunch=Bananenbündel +Banana Dough=Bananenteig +Orange=Orange +Pine Nuts=Kiefernkerne +Banana Loaf=Bananenbrot +Coconut=Kokosnuss +Coconut Slice=Kokosscheibe +Golden Apple=Goldener Apfel +Hearty Stew=Deftiger Eintopf +Bucket of Cactus Pulp=Eimer Kaktusmark +Firethorn Jelly=Feuerdorngelee +Lemon= +Candied Lemon= +Lemonade= +Olive= +Olive Oil= +Kappa Maki Sushi= +Nigiri Sushi= +Tamago Sushi= +Fugusashi= +Teriyaki Chicken= +Teriyaki Beef= +Mushroom Soup=Pilzsuppe +Boiled Shrimp= +Garlic Butter Shrimp= +Jellyfish Salad= +Raw Calamari= +Calamari= +Fish & Chips= +Willow Twig=Weidenrute +Redwood Leaves=Mammutbaumblätter +Orange Leaves=Orangenblätter +Banana Leaves=Bananenblätter +Healing Tree Leaves=Lebensbaumblätter +Palm Leaves=Palmenblätter +Birch Leaves=Birkenblätter +Frost Leaves=Frostblätter +Bamboo Leaves=Bambusblätter +Sakura Leaves=Sakurablätter +Lemon Tree Leaves= +Olive Tree Leaves= +Mushroom Cap=Pilzkappe +Mushroom Pore=Pilzpore +Bush=Busch +Bush #2=Busch #2 +Bush #3=Busch #3 +Basandra Bush Stem= +Basandra Bush Leaves= +Wild Onion=Wildzwiebel +Spore Grass= +Firethorn Shrub=Feuerdornbusch +Fire Flower=Feuerblume +Fire Dust=Feuerstaub +Vine=Liane +Light String Vine=Leuchtschnurrebe +Fern=Farn +Fern Tubers=Farnsporenkapseln +Fiery Dry Shrub=Feuerroter vertrockneter Strauch +Snowy Grass=Verschneites Gras +Crystal Grass=Kristallgras +Lilac= +Basandra Bush Sapling= +Bamboo Sprout=Bambussprosse +Schematic not found=Schematic nicht gefunden +Seaweed=Seetang +Agar Powder=Agarpulver +Blue Glow Coral=Blaue Leuchtende Koralle +Orange Glow Coral=Orange Leuchtende Koralle +Pink Glow Coral=Rosa Leuchtende Koralle +Green Glow Coral=Grüne Leuchtende Koralle +Sandy=Sandy +Wet sponge=Nasser Schwamm +Sponge=Schwamm +Strawberry=Erdbeere +Ice Brick=Eisziegel +Snow Brick=Schneeziegel +Basandra Wood= +Sakura Trunk=Sakurastamm +Sakura Wood=Sakuraholz +Willow Trunk=Weidenstamm +Willow Wood=Weidenholz +Redwood Trunk=Mammutbaumstamm +Redwood Wood=Mammutbaumholz +Frost Tree=Frostbaum +Frost Wood=Frostholz +Healing Tree Trunk=Lebensbaumstamm +Healing Tree Wood=Lebensbaumholz +Palm Trunk=Palmstamm +Palm Wood=Palmholz +Banana Trunk=Bananenstamm +Banana Wood=Bananenholz +Scorched Tree=Verbrannter Baum +Mushroom=Pilz +Birch Trunk=Birkenstamm +Birch Wood=Birkenholz +Bamboo=Bambus +Olive Trunk= +Olive Wood= +Candle=Kerze +Black Candle=Schwarze Kerze +Blue Candle=Blaue Kerze +Brown Candle=Braune Kerze +Cyan Candle=Türkise Kerze +Dark Green Candle=Dunkelgrüne Kerze +Dark Grey Candle=Dunkelgraue Kerze +Green Candle=Grüne Kerze +Grey Candle=Graue Kerze +Magenta Candle=Magenta Kerze +Orange Candle=Orange Kerze +Pink Candle=Rosa Kerze +Red Candle=Rote Kerze +Violet Candle=Violette Kerze +Yellow Candle=Gelbe Kerze diff --git a/mods/ethereal/locale/ethereal.en.tr b/mods/ethereal/locale/ethereal.en.tr new file mode 100644 index 00000000..9dab260d --- /dev/null +++ b/mods/ethereal/locale/ethereal.en.tr @@ -0,0 +1,136 @@ +# textdomain: ethereal +Blue Marble= +Blue Marble Tile= +Crystal Spike= +Crystal Ingot= +Crystal Block= +Crystal Sword= +Crystal Axe= +Crystal Pickaxe= +Crystal Shovel= +Crystal Gilly Staff= +Dried Dirt= +Red Baked Clay= +Orange Baked Clay= +Grey Baked Clay= +Quicksand= +Etherium Dust= +Etherium Ore= +Bamboo Floor= +Bamboo Block= +Palm Wax= +Bowl= +Stone Ladder= +Paper Wall= +Glo Stone= +Lump of Charcoal= +Staff of Light= +Sakura Wood Door= +Fishing Rod (USE to cast and again when the time is right)= +Cooked Fish= +Sashimi= +Worm= +Flight timer about to expire!= +Flight Potion= +unlimited= +Flight already granted, @1 seconds left!= +Flight granted, you have @1 seconds!= +Banana= +Banana Bunch= +Banana Dough= +Orange= +Pine Nuts= +Banana Loaf= +Coconut= +Coconut Slice= +Golden Apple= +Hearty Stew= +Bucket of Cactus Pulp= +Firethorn Jelly= +Lemon= +Candied Lemon= +Lemonade= +Olive= +Olive Oil= +Kappa Maki Sushi= +Nigiri Sushi= +Tamago Sushi= +Fugusashi= +Teriyaki Chicken= +Teriyaki Beef= +Mushroom Soup= +Boiled Shrimp= +Garlic Butter Shrimp= +Jellyfish Salad= +Raw Calamari= +Calamari= +Fish & Chips= +Willow Twig= +Redwood Leaves= +Orange Leaves= +Banana Leaves= +Healing Tree Leaves= +Palm Leaves= +Birch Leaves= +Frost Leaves= +Bamboo Leaves= +Sakura Leaves= +Lemon Tree Leaves= +Olive Tree Leaves= +Mushroom Cap= +Mushroom Pore= +Bush= +Bush #2= +Bush #3= +Basandra Bush Stem= +Basandra Bush Leaves= +Wild Onion= +Spore Grass= +Firethorn Shrub= +Fire Flower= +Fire Dust= +Vine= +Light String Vine= +Fern= +Fern Tubers= +Fiery Dry Shrub= +Snowy Grass= +Crystal Grass= +Lilac= +Basandra Bush Sapling= +Bamboo Sprout= +Schematic not found= +Seaweed= +Agar Powder= +Blue Glow Coral= +Orange Glow Coral= +Pink Glow Coral= +Green Glow Coral= +Sandy= +Wet sponge= +Sponge= +Strawberry= +Ice Brick= +Snow Brick= +Basandra Wood= +Sakura Trunk= +Sakura Wood= +Willow Trunk= +Willow Wood= +Redwood Trunk= +Redwood Wood= +Frost Tree= +Frost Wood= +Healing Tree Trunk= +Healing Tree Wood= +Palm Trunk= +Palm Wood= +Banana Trunk= +Banana Wood= +Scorched Tree= +Mushroom= +Birch Trunk= +Birch Wood= +Bamboo= +Olive Trunk= +Olive Wood= diff --git a/mods/ethereal/locale/ethereal.es.tr b/mods/ethereal/locale/ethereal.es.tr new file mode 100644 index 00000000..3ad8fbd6 --- /dev/null +++ b/mods/ethereal/locale/ethereal.es.tr @@ -0,0 +1,136 @@ +# textdomain: ethereal +Blue Marble=Mármol azul +Blue Marble Tile=Baldosa de marmol azul +Crystal Spike=Púa de Cristal +Crystal Ingot=Lingote de Cristal +Crystal Block=Bloque de Cristal +Crystal Sword=Espada de Cristal +Crystal Axe=Hacha de Cristal +Crystal Pickaxe=Pico de Cristal +Crystal Shovel=Pala de Cristal +Crystal Gilly Staff=Bastón de Cristal de Gilly +Dried Dirt=Tierra seca +Red Baked Clay=Arcilla roja cocida +Orange Baked Clay=Arcilla naranja cocida +Grey Baked Clay=Arcilla gris cocida +Quicksand=Arena movediza +Etherium Dust=Polvo de Etherium +Etherium Ore=Mineral de Etherium +Bamboo Floor=Piso de bamboo +Bamboo Block=Bloque de bamboo +Palm Wax=Cera de palma +Bowl=Tazón +Stone Ladder=Escalera de piedra +Paper Wall=Papel mural +Glo Stone=Piedra brillante +Lump of Charcoal=Carbón de madera +Staff of Light=Bastón de Luz +Sakura Wood Door=Puerta de madera de sakura +Fishing Rod (USE to cast and again when the time is right)=Caña de pescar (Botón principal para lanzar, cuando sea el momento adecuado vuelve a presionarlo) +Cooked Fish=Pescado cocido +Sashimi=Sashimi +Worm=Gusano +Flight timer about to expire!=¡El tiempo de vuelo está apunto de acabarse! +Flight Potion=Poción de vuelo +unlimited= +Flight already granted, @1 seconds left!=El vuelo ya ha sido otorgado, ¡te quedan @1 segundos! +Flight granted, you have @1 seconds!=Ya puedes volar, ¡tienes @1 segundos! +Banana=Banana +Banana Bunch=Racimo de bananas +Banana Dough=Masa de banana +Orange=Naranja +Pine Nuts=Piñones +Banana Loaf=Pan de banana +Coconut=Coco +Coconut Slice=Trozo de coco +Golden Apple=Manzana de oro +Hearty Stew=Guiso abundante +Bucket of Cactus Pulp=Cubo de pulpa de cactus +Firethorn Jelly=Jalea de Firethorn +Lemon=Limón +Candied Lemon=Limón confitado +Lemonade=Limonada +Olive=Aceituna +Olive Oil=Aceite de oliva +Kappa Maki Sushi=Sushi Kappa Maki +Nigiri Sushi=Sushi Nigiri +Tamago Sushi=Sushi Tamago +Fugusashi=Fugusashi +Teriyaki Chicken=Pollo Teriyaki +Teriyaki Beef=Asado Teriyaki +Mushroom Soup=Sopa de champiñón +Boiled Shrimp= +Garlic Butter Shrimp= +Jellyfish Salad= +Raw Calamari= +Calamari= +Fish & Chips= +Willow Twig=Ramas de sauce +Redwood Leaves=Hojas de secoya +Orange Leaves=Hojas de naranja +Banana Leaves=Hojas de banana +Healing Tree Leaves=Hojas de árbol sanador +Palm Leaves=Hojas de palma +Birch Leaves=Hojas de abedul +Frost Leaves=Hojas congeladas +Bamboo Leaves=Hojas de bamboo +Sakura Leaves=Hojas de sakura +Lemon Tree Leaves=Hojas de limonero +Olive Tree Leaves=Hojas de olivo +Mushroom Cap=Sombrero de champiñón +Mushroom Pore=Esporas de champiñón +Bush=Arbusto +Bush #2=Arbusto #2 +Bush #3=Arbusto #3 +Basandra Bush Stem= +Basandra Bush Leaves= +Wild Onion=Cebolla silvestre +Spore Grass= +Firethorn Shrub=Arbusto de Firethorn +Fire Flower=Flor de fuego +Fire Dust=Polvo de fuego +Vine=Enredadera +Light String Vine=Enredadera luminosa +Fern=Helecho +Fern Tubers=Tubérculos de helecho +Fiery Dry Shrub=Arbusto seco de fuego +Snowy Grass=Pasto nevado +Crystal Grass=Pasto de cristal +Lilac= +Basandra Bush Sapling= +Bamboo Sprout=Brote de bamboo +Schematic not found=Schematica no encontrada +Seaweed=Alga marina +Agar Powder=Polvo de Agar +Blue Glow Coral=Coral azul brillante +Orange Glow Coral=Coral naranjo brillante +Pink Glow Coral=Coral rosado brillante +Green Glow Coral=Coral verde brillante +Sandy= +Wet sponge=Esponja de mar con agua +Sponge=Esponja de mar +Strawberry=Fresa +Ice Brick=Ladrillo de hielo +Snow Brick=Ladrillo de nieve +Basandra Wood= +Sakura Trunk=Tronco de sakura +Sakura Wood=Madera de sakura +Willow Trunk=Tronco de sauce +Willow Wood=Madera de sauce +Redwood Trunk=Tronco de secoya +Redwood Wood=Madera de secoya +Frost Tree=Ãrbol sanador +Frost Wood=Madera congelada +Healing Tree Trunk=Tronco de árbol sanador +Healing Tree Wood=Madera de árbol sanador +Palm Trunk=Tronco de palma +Palm Wood=Madera de palma +Banana Trunk=Tronco de banana +Banana Wood=Madera de banana +Scorched Tree=Ãrbol quemado +Mushroom=Champiñón +Birch Trunk=Tronco de abedul +Birch Wood=Madera de abedul +Bamboo=Bamboo +Olive Trunk=Tronco de olivo +Olive Wood=Madera de olivo diff --git a/mods/ethereal/locale/ethereal.fr.tr b/mods/ethereal/locale/ethereal.fr.tr new file mode 100644 index 00000000..5b71afd2 --- /dev/null +++ b/mods/ethereal/locale/ethereal.fr.tr @@ -0,0 +1,137 @@ +# textdomain: ethereal +Blue Marble=Marbre bleu +Blue Marble Tile=Dalle de marbre bleu +Crystal Spike=Pic de cristal +Crystal Ingot=Lingot de cristal +Crystal Block=Bloc de cristal +Crystal Sword=Épée de cristal +Crystal Axe=Hâche de cristal +Crystal Pickaxe=Pioche de cristal +Crystal Shovel=Pelle de cristal +Crystal Gilly Staff=Baton de cristal +Dried Dirt=Terre désséché +Red Baked Clay=Terre cuite rouge +Orange Baked Clay=Terre cuite orange +Grey Baked Clay=Terre cuite grise +Quicksand=Sables mouvants +Etherium Dust=Poudre céleste +Etherium Ore=Minerai céleste +Bamboo Floor=Plancher de bambou +Bamboo Block=Bloc de bambou +Paper Wall=Mur en papiers +Palm Wax=Cire de palmier +Bowl=Bol +Stone Ladder=Échelle en pierre +Paper Wall=Mur en papier +Glo Stone=Pierre luminescente +Lump of Charcoal=Morceau de charbon de bois +Staff of Light=Bâton de lumière +Sakura Wood Door=Porte en bois de cerisier Japonais +Fishing Rod (USE to cast and again when the time is right)=Canne à pêche (Action pour lancer, puis action pour mouliner au bon moment) +Cooked Fish=Poisson cuisiné +Sashimi=Sashimi +Worm=Ver +Flight timer about to expire!=La potion de vol se discipe! +Flight Potion=Potion de vol +unlimited=illimité +Flight already granted, @1 seconds left!=Vous pouvez déjà voler pendant @1 secondes! +Flight granted, you have @1 seconds!=Vous pouvez maintenant voler pendant @1 secondes! +Banana=Banane +Banana Bunch=Régime de banane +Banana Dough=Pâton de pain de banane +Orange=Orange +Pine Nuts=Pignon de pin +Banana Loaf=Pain de banane +Coconut=Noix de coco +Coconut Slice=Morceau de noix de coco +Golden Apple=Pomme dorée +Hearty Stew=Ragoût copieux +Bucket of Cactus Pulp=Seau de pulpe de cactus +Firethorn Jelly=Gelée de Pyracantha +Lemon=Citron +Candied Lemon=Citron confit +Lemonade=Limonade +Olive=Olive +Olive Oil=Huile d'olive +Kappa Maki Sushi=Maki au concombre +Nigiri Sushi=Nigiri au saumon +Tamago Sushi=Yaki à l'omelette +Fugusashi=Sashimi au fugu +Teriyaki Chicken=Poulet teriyaki +Teriyaki Beef=Boeuf teriyaki +Mushroom Soup=Soupe aux champignons +Boiled Shrimp=Crevettes vapeur +Garlic Butter Shrimp=Crevettes au beurre d'ail +Jellyfish Salad=Salade de calamar +Raw Calamari=Calamar cru +Calamari=Beignet de calamar +Fish & Chips=Fish & chips +Willow Twig=Brindille de saule +Redwood Leaves=Feuilles de séquoia +Orange Leaves=Feuilles d'oranger +Banana Leaves=Feuilles de bananier +Healing Tree Leaves=Feuilles de l'arbre à soins +Palm Leaves=Feuilles de palmier +Birch Leaves=Feuilles de bouleau +Frost Leaves=Feuilles de givrier +Bamboo Leaves=Feuilles de bambou +Sakura Leaves=Feuilles de cerisier du Japon +Lemon Tree Leaves=Feuilles de citronier +Olive Tree Leaves=Feuilles d'olivier +Mushroom Cap=Chapeau de champignon +Mushroom Pore=spore de champignon +Bush=Arbuste +Bush #2=Arbuste #2 +Bush #3=Arbuste #3 +Basandra Bush Stem=Tige de buisson de bassandre +Basandra Bush Leaves=Feuilles de buisson de bassandre +Wild Onion=Oignon sauvage +Spore Grass=Spore d'herbe +Firethorn Shrub=Arbuste Pyracantha +Fire Flower=Fleur de feu +Fire Dust=Poudre de feu +Vine=Vigne +Light String Vine=File de lumière de vigne +Fern=Fougère +Fern Tubers=Tubercules de fougère +Fiery Dry Shrub=Arbuste ardent sec +Snowy Grass=Herbe des neiges +Crystal Grass=Herbe de cristal +Lilac=Lilas +Basandra Bush Sapling=Buisson de bassandre +Bamboo Sprout=Germe de bambou +Schematic not found=Schéma introuvable +Seaweed=Algues +Agar Powder=Poudre d'agar +Blue Glow Coral=Corail lueur bleu +Orange Glow Coral=Corail lueur orange +Pink Glow Coral=Corail lueur rose +Green Glow Coral=Corail lueur vert +Sandy=Sable de mer +Wet sponge=Éponge mouillée +Sponge=Éponge +Strawberry=Fraise +Ice Brick=Brique de glace +Snow Brick=Brique de neige +Basandra Wood=Bois de bassandre +Sakura Trunk=Tronc de cerisier du Japon +Sakura Wood=Bois de cerisier du Japon +Willow Trunk=Tronc de saule +Willow Wood=Bois de saule +Redwood Trunk=Tronc de séquoia +Redwood Wood=Bois de séquoia +Frost Tree=Abre de gîvre +Frost Wood=Bois de l'arbre à givre +Healing Tree Trunk=Tronc de l'arbre à soins +Healing Tree Wood=Bois de l'arbre à soins +Palm Trunk=Tronc de palmier +Palm Wood=Bois de palmier +Banana Trunk=Tronc de bananier +Banana Wood=Bois de bananier +Scorched Tree=Arbre brûlé +Mushroom=Champignon +Birch Trunk=Tronc de bouleau +Birch Wood=Bois de bouleau +Bamboo=Bambou +Olive Trunk=Tronc d'olivier +Olive Wood=Bois d'olivier diff --git a/mods/ethereal/locale/ethereal.ru.tr b/mods/ethereal/locale/ethereal.ru.tr new file mode 100644 index 00000000..ef62007b --- /dev/null +++ b/mods/ethereal/locale/ethereal.ru.tr @@ -0,0 +1,140 @@ +# textdomain: ethereal + +## Items, nodes and other in-game stuff +Blue Marble=Голубой Мрамор +Blue Marble Tile=Плитка Голубого Мрамора +Crystal Spike=КриÑтальный Шип +Crystal Ingot=КриÑтальный Слиток +Crystal Block=КриÑтальный Блок +Crystal Sword=КриÑтальный Меч +Crystal Axe=КриÑтальный Топор +Crystal Pickaxe=КриÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÐšÐ¸Ñ€ÐºÐ° +Crystal Shovel=КриÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð›Ð¾Ð¿Ð°Ñ‚Ð° +Crystal Gilly Staff=КриÑтальный Джилли ПоÑох +Dried Dirt=Ð¡ÑƒÑ…Ð°Ñ Ð—ÐµÐ¼Ð»Ñ +Red Baked Clay=КраÑÐ½Ð°Ñ ÐŸÑ€Ð¸Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð“Ð»Ð¸Ð½Ð° +Orange Baked Clay=ÐžÑ€Ð°Ð½Ð¶ÐµÐ²Ð°Ñ ÐŸÑ€Ð¸Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð“Ð»Ð¸Ð½Ð° +Grey Baked Clay=Ð¡ÐµÑ€Ð°Ñ ÐŸÑ€Ð¸Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð“Ð»Ð¸Ð½Ð° +Quicksand=Зыбучий пеÑок +Etherium Dust=Ð­Ñ„Ð¸Ñ€Ð½Ð°Ñ ÐŸÑ‹Ð»ÑŒ +Etherium Ore=Ð­Ñ„Ð¸Ñ€Ð½Ð°Ñ Ð ÑƒÐ´Ð° +Bamboo Floor=Бамбуковый Пол +Bamboo Block=Бамбуковый Блок +Paper Wall=Ð‘ÑƒÐ¼Ð°Ð¶Ð½Ð°Ñ Ð¡Ñ‚ÐµÐ½Ð° +Palm Wax=Пальмовый ВоÑк +Bowl=МиÑка +Stone Ladder=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð›ÐµÑтница +Glo Stone=Гло Камень +Lump of Charcoal=КуÑочек ДревеÑного ÑƒÐ³Ð»Ñ +Staff of Light=ПоÑох Света +Sakura Wood Door=ДеревÑÐ½Ð½Ð°Ñ Ð”Ð²ÐµÑ€ÑŒ из Сакуры +Fishing Rod (USE to cast and again when the time is right)=Удочка (ИСПОЛЬЗУЙТЕ Ð´Ð»Ñ Ð·Ð°Ð±Ñ€Ð¾Ñа и повторите, когда придет времÑ) +Cooked Fish=ÐŸÑ€Ð¸Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð Ñ‹Ð±Ð° +Sashimi=Сашими +Worm=ЧервÑк +Flight Potion=Зелье Полёта +Banana=Банан +Banana Bunch=Кучка Бананов +Banana Dough=Банановое ТеÑто +Orange=ÐпельÑин +Pine Nuts=Кедровые Орехи +Banana Loaf=Банановый Рулет +Coconut=ÐšÐ¾ÐºÐ¾Ñ +Coconut Slice=КокоÑовый КуÑочек +Golden Apple=Золотое Яблоко +Hearty Stew=Сытное Рагу +Bucket of Cactus Pulp=Ведро Ñ ÐšÐ°ÐºÑ‚ÑƒÑовой МÑкотью +Firethorn Jelly=Желе из Терновника +Lemon=Лимон +Candied Lemon=ЗаÑахаренный Лимон +Lemonade=Лимонад +Olive=Оливка +Olive Oil=Оливковое МаÑло +Kappa Maki Sushi=Суши "Каппа Маки" +Nigiri Sushi=Суши "Ðигири" +Tamago Sushi=Суши "Тамаго" +Fugusashi=ФугуÑаши +Teriyaki Chicken=Курица ТериÑки +Teriyaki Beef=ГовÑдина ТериÑки +Mushroom Soup=Суп из Грибов +Boiled Shrimp=Вареные Креветки +Garlic Butter Shrimp=Креветки в чеÑночном маÑле +Jellyfish Salad=Салат из Медуз +Raw Calamari=Сырой Кальмар +Calamari=Кальмар +Fish & Chips=Рыба и ЧипÑÑ‹ +Willow Twig=Ивовый Прутик +Redwood Leaves=ЛиÑÑ‚ÑŒÑ ÐšÑ€Ð°Ñного дерева +Orange Leaves=ÐпельÑиновые ЛиÑÑ‚ÑŒÑ +Banana Leaves=Банановые ЛиÑÑ‚ÑŒÑ +Healing Tree Leaves=ЛиÑÑ‚ÑŒÑ Ð¦ÐµÐ»ÐµÐ±Ð½Ð¾Ð³Ð¾ Дерева +Palm Leaves=Пальмовые ЛиÑÑ‚ÑŒÑ +Birch Leaves=Берёзовые ЛиÑÑ‚ÑŒÑ +Frost Leaves=Морозные ЛиÑÑ‚ÑŒÑ +Bamboo Leaves=Бамбуковые ЛиÑÑ‚ÑŒÑ +Sakura Leaves=ЛиÑÑ‚ÑŒÑ Ð¡Ð°ÐºÑƒÑ€Ñ‹ +Lemon Tree Leaves=ЛиÑÑ‚ÑŒÑ Ð›Ð¸Ð¼Ð¾Ð½Ð½Ð¾Ð³Ð¾ Дерева +Olive Tree Leaves=ЛиÑÑ‚ÑŒÑ ÐžÐ»Ð¸Ð²ÐºÐ¾Ð³Ð¾ Дерева +Mushroom Cap=Шапка Гриба +Mushroom Pore=Скважина Гриба +Bush=КуÑÑ‚ +Bush #2=КуÑÑ‚ #2 +Bush #3=КуÑÑ‚ #3 +Basandra Bush Stem=Стебель КуÑта БаÑандры +Basandra Bush Leaves=ЛиÑÑ‚ÑŒÑ ÐšÑƒÑта БаÑандры +Wild Onion=Дикий Лук +Spore Grass=Ð¡Ð¿Ð¾Ñ€Ð¾Ð²Ð°Ñ Ð¢Ñ€Ð°Ð²Ð° +Firethorn Shrub=КуÑÑ‚ Терновника +Fire Flower=Огненный Цветок +Fire Dust=ÐžÐ³Ð½ÐµÐ½Ð½Ð°Ñ ÐŸÑ‹Ð»ÑŒ +Vine=Лианы +Light String Vine=Легко-Ð¡Ñ‚Ñ€ÑƒÐ½Ð½Ð°Ñ Ð’Ð¸Ð½Ð¾Ð³Ñ€Ð°Ð´Ð½Ð°Ñ Ð›Ð¾Ð·Ð° +Fern=Папоротник +Fern Tubers=Клубни Папоротника +Fiery Dry Shrub=Огненный Сухой куÑтарник +Snowy Grass=ЗаÑÐ½ÐµÐ¶ÐµÐ½Ð½Ð°Ñ Ð¢Ñ€Ð°Ð²Ð° +Crystal Grass=КриÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¢Ñ€Ð°Ð²Ð° +Lilac=Сирень +Basandra Bush Sapling=РоÑток КуÑта БаÑандры +Bamboo Sprout=РоÑток Бамбука +Seaweed=МорÑкие водороÑли +Agar Powder=Ðгаровый Порошок +Blue Glow Coral=Голубой CветÑщийÑÑ ÐšÐ¾Ñ€Ð°Ð»Ð» +Orange Glow Coral=Оранжевый CветÑщийÑÑ ÐšÐ¾Ñ€Ð°Ð»Ð» +Pink Glow Coral=Розовый CветÑщийÑÑ ÐšÐ¾Ñ€Ð°Ð»Ð» +Green Glow Coral=Зелёный CветÑщийÑÑ ÐšÐ¾Ñ€Ð°Ð»Ð» +Sandy=ПеÑчаный +Wet sponge=ÐœÐ¾ÐºÑ€Ð°Ñ Ð³ÑƒÐ±ÐºÐ° +Sponge=Губка +Strawberry=Клубника +Ice Brick=ЛедÑной Кирпич +Snow Brick=Снежный Кирпич +Basandra Wood=ДревеÑина БаÑандры +Sakura Trunk=Ствол Сакуры +Sakura Wood=ДревеÑина Сакуры +Willow Trunk=Ствол Ивы +Willow Wood=ДревеÑина Ивы +Redwood Trunk=Ствол КраÑного дерева +Redwood Wood=ДревеÑина КраÑного дерева +Frost Tree=Морозное Дерево +Frost Wood=ÐœÐ¾Ñ€Ð¾Ð·Ð½Ð°Ñ Ð”Ñ€ÐµÐ²ÐµÑина +Healing Tree Trunk=Ствол Целебного Дерева +Healing Tree Wood=ДревеÑина Целебного Дерева +Palm Trunk=Пальмовый Ствол +Palm Wood=ÐŸÐ°Ð»ÑŒÐ¼Ð¾Ð²Ð°Ñ Ð”Ñ€ÐµÐ²ÐµÑина +Banana Trunk=Банановый Ствол +Banana Wood=Ð‘Ð°Ð½Ð°Ð½Ð¾Ð²Ð°Ñ Ð”Ñ€ÐµÐ²ÐµÑина +Scorched Tree=Обгоревшее Дерево +Mushroom=Гриб +Birch Trunk= +Birch Wood= +Bamboo=Бамбук +Olive Trunk=Оливковый Ствол +Olive Wood=ÐžÐ»Ð¸Ð²ÐºÐ¾Ð²Ð°Ñ Ð”Ñ€ÐµÐ²ÐµÑина + +## Messages +unlimited=неограниченно +Flight timer about to expire!=Таймер полёта Ñкоро иÑтечёт! +Flight already granted, @1 seconds left!=Полёт уже выдан, @1 Ñекунд оÑталоÑÑŒ! +Flight granted, you have @1 seconds!=Полёт выдан, у Ð²Ð°Ñ @1 Ñекунд! +Schematic not found= \ No newline at end of file diff --git a/mods/ethereal/locale/ethereal.zh_CN.tr b/mods/ethereal/locale/ethereal.zh_CN.tr new file mode 100644 index 00000000..b4e5829a --- /dev/null +++ b/mods/ethereal/locale/ethereal.zh_CN.tr @@ -0,0 +1,136 @@ +# textdomain: ethereal +Blue Marble= +Blue Marble Tile= +Crystal Spike=æ°´æ™¶å°– +Crystal Ingot=æ°´æ™¶é”­ +Crystal Block=æ°´æ™¶å— +Crystal Sword=水晶剑 +Crystal Axe=æ°´æ™¶æ–§ +Crystal Pickaxe=水晶锄 +Crystal Shovel= +Crystal Gilly Staff=水晶网络人员 +Dried Dirt=干土 +Red Baked Clay=红色烤粘土 +Orange Baked Clay=橙色烤粘土 +Grey Baked Clay=ç°è‰²çƒ¤ç²˜åœŸ +Quicksand=æµæ²™ +Etherium Dust= +Etherium Ore= +Bamboo Floor=ç«¹åœ°æ¿ +Bamboo Block= +Palm Wax=棕榈蜡 +Bowl=碗 +Stone Ladder=石梯 +Paper Wall=纸墙 +Glo Stone=è§å…‰çŸ³ +Lump of Charcoal=å—æœ¨ç‚­ +Staff of Light=ç¯æŸ± +Sakura Wood Door= +Fishing Rod (USE to cast and again when the time is right)= +Cooked Fish=煮熟的鱼 +Sashimi=生鱼片 +Worm=蠕虫 +Flight timer about to expire!= +Flight Potion= +unlimited= +Flight already granted, @1 seconds left!= +Flight granted, you have @1 seconds!= +Banana=香蕉 +Banana Bunch= +Banana Dough=香蕉皮 +Orange=æ©™å­ +Pine Nuts=æ¾å­ +Banana Loaf=香蕉é¢åŒ… +Coconut=æ¤°å­ +Coconut Slice=椰å­ç‰‡ +Golden Apple=金苹果 +Hearty Stew=丰盛的炖肉 +Bucket of Cactus Pulp=仙人掌果肉桶 +Firethorn Jelly= +Lemon= +Candied Lemon= +Lemonade= +Olive= +Olive Oil= +Kappa Maki Sushi= +Nigiri Sushi= +Tamago Sushi= +Fugusashi= +Teriyaki Chicken= +Teriyaki Beef= +Mushroom Soup=è˜‘è‡æ±¤ +Boiled Shrimp= +Garlic Butter Shrimp= +Jellyfish Salad= +Raw Calamari= +Calamari= +Fish & Chips= +Willow Twig=æŸ³æ ‘æž +Redwood Leaves=çº¢æ‰æ ‘å¶ +Orange Leaves=æ©™å­æ ‘å¶ +Banana Leaves=é¦™è•‰æ ‘å¶ +Healing Tree Leaves=æ²»ç–—æ ‘å¶ +Palm Leaves=æ£•æ¦ˆå¶ +Birch Leaves=ç™½æ¡¦æ ‘å¶ +Frost Leaves=霜å¶å­ +Bamboo Leaves=ç«¹å¶ +Sakura Leaves= +Lemon Tree Leaves= +Olive Tree Leaves= +Mushroom Cap=蘑è‡å¸½ +Mushroom Pore=蘑è‡å­”éš™ +Bush=çŒæœ¨ +Bush #2=çŒæœ¨ #2 +Bush #3=çŒæœ¨ #3 +Basandra Bush Stem= +Basandra Bush Leaves= +Wild Onion=野生洋葱 +Spore Grass= +Firethorn Shrub= +Fire Flower=ç«ç„°èб +Fire Dust=ç«åœŸ +Vine=藤蔓 +Light String Vine=è§å…‰è—¤è”“ +Fern=蕨类æ¤ç‰© +Fern Tubers=蕨类æ¤ç‰©çš„茎 +Fiery Dry Shrub=å¹²æž¯çŒæœ¨ +Snowy Grass=é›ªè‰ +Crystal Grass=æ°´æ™¶è‰ +Lilac= +Basandra Bush Sapling= +Bamboo Sprout=竹笋 +Schematic not found=没有找到示æ„图 +Seaweed=æµ·è—» +Agar Powder= +Blue Glow Coral=è“色çŠç‘š +Orange Glow Coral=橙色çŠç‘š +Pink Glow Coral=粉色çŠç‘š +Green Glow Coral=绿色çŠç‘š +Sandy=æ²™å­ +Wet sponge= +Sponge= +Strawberry=è‰èŽ“ +Ice Brick=冰砖 +Snow Brick=雪砖 +Basandra Wood= +Sakura Trunk= +Sakura Wood= +Willow Trunk=柳树树干 +Willow Wood=柳树木 +Redwood Trunk=çº¢æœ¨ç®±å­ +Redwood Wood=红木木æ +Frost Tree=霜树 +Frost Wood=霜木 +Healing Tree Trunk=治疗树干 +Healing Tree Wood=治疗树木æ +Palm Trunk=棕榈树干 +Palm Wood=棕榈木 +Banana Trunk=香蕉树干 +Banana Wood=香蕉木 +Scorched Tree=烧焦的树 +Mushroom=è˜‘è‡ +Birch Trunk=桦树树干 +Birch Wood=白桦木æ +Bamboo=ç«¹å­ +Olive Trunk= +Olive Wood= diff --git a/mods/ethereal/locale/template.txt b/mods/ethereal/locale/template.txt new file mode 100644 index 00000000..bb89dd79 --- /dev/null +++ b/mods/ethereal/locale/template.txt @@ -0,0 +1,152 @@ +# textdomain: ethereal +Blue Marble= +Blue Marble Tile= +Crystal Spike= +Crystal Ingot= +Crystal Block= +Crystal Sword= +Crystal Axe= +Crystal Pickaxe= +Crystal Shovel= +Crystal Gilly Staff= +Dried Dirt= +Red Baked Clay= +Orange Baked Clay= +Grey Baked Clay= +Quicksand= +Etherium Dust= +Etherium Ore= +Bamboo Floor= +Bamboo Block= +Paper Wall= +Palm Wax= +Bowl= +Stone Ladder= +Paper Wall= +Glo Stone= +Lump of Charcoal= +Staff of Light= +Sakura Wood Door= +Fishing Rod (USE to cast and again when the time is right)= +Cooked Fish= +Sashimi= +Worm= +Flight timer about to expire!= +Flight Potion= +unlimited= +Flight already granted, @1 seconds left!= +Flight granted, you have @1 seconds!= +Banana= +Banana Bunch= +Banana Dough= +Orange= +Pine Nuts= +Banana Loaf= +Coconut= +Coconut Slice= +Golden Apple= +Hearty Stew= +Bucket of Cactus Pulp= +Firethorn Jelly= +Lemon= +Candied Lemon= +Lemonade= +Olive= +Olive Oil= +Kappa Maki Sushi= +Nigiri Sushi= +Tamago Sushi= +Fugusashi= +Teriyaki Chicken= +Teriyaki Beef= +Mushroom Soup= +Boiled Shrimp= +Garlic Butter Shrimp= +Jellyfish Salad= +Raw Calamari= +Calamari= +Fish & Chips= +Willow Twig= +Redwood Leaves= +Orange Leaves= +Banana Leaves= +Healing Tree Leaves= +Palm Leaves= +Birch Leaves= +Frost Leaves= +Bamboo Leaves= +Sakura Leaves= +Lemon Tree Leaves= +Olive Tree Leaves= +Mushroom Cap= +Mushroom Pore= +Bush= +Bush #2= +Bush #3= +Basandra Bush Stem= +Basandra Bush Leaves= +Wild Onion= +Spore Grass= +Firethorn Shrub= +Fire Flower= +Fire Dust= +Vine= +Light String Vine= +Fern= +Fern Tubers= +Fiery Dry Shrub= +Snowy Grass= +Crystal Grass= +Lilac= +Basandra Bush Sapling= +Bamboo Sprout= +Schematic not found= +Seaweed= +Agar Powder= +Blue Glow Coral= +Orange Glow Coral= +Pink Glow Coral= +Green Glow Coral= +Sandy= +Wet sponge= +Sponge= +Strawberry= +Ice Brick= +Snow Brick= +Basandra Wood= +Sakura Trunk= +Sakura Wood= +Willow Trunk= +Willow Wood= +Redwood Trunk= +Redwood Wood= +Frost Tree= +Frost Wood= +Healing Tree Trunk= +Healing Tree Wood= +Palm Trunk= +Palm Wood= +Banana Trunk= +Banana Wood= +Scorched Tree= +Mushroom= +Birch Trunk= +Birch Wood= +Bamboo= +Olive Trunk= +Olive Wood= +Candle= +Black Candle= +Blue Candle= +Brown Candle= +Cyan Candle= +Dark Green Candle= +Dark Grey Candle= +Green Candle= +Grey Candle= +Magenta Candle= +Orange Candle= +Pink Candle= +Red Candle= +Violet Candle= +Yellow Candle= diff --git a/mods/ethereal/lucky_block.lua b/mods/ethereal/lucky_block.lua new file mode 100644 index 00000000..c6a427e4 --- /dev/null +++ b/mods/ethereal/lucky_block.lua @@ -0,0 +1,231 @@ + +-- ethereal schematic path + +local epath = minetest.get_modpath("ethereal") .. "/schematics/" + +-- add schematics + +lucky_block:add_schematics({ + {"pinetree", ethereal.pinetree, {x = 3, y = 0, z = 3}}, + {"palmtree", ethereal.palmtree, {x = 4, y = 0, z = 4}}, + {"bananatree", ethereal.bananatree, {x = 3, y = 0, z = 3}}, + {"orangetree", ethereal.orangetree, {x = 2, y = 0, z = 2}}, + {"birchtree", ethereal.birchtree, {x = 2, y = 0, z = 2}}, + {"basandrabush", ethereal.basandrabush, {x = 1, y = 0, z = 1}}, + {"mushroomone", ethereal.mushroomone, {x = 4, y = 0, z = 4}}, + {"mushroomtwo", ethereal.mushroomtwo, {x = 1, y = 0, z = 1}}, + {"underspike", ethereal.desertstone_under_spike, {x = 1, y = 0, z = 1}}, + {"ethereal_pond", ethereal.pond, {x = 6, y = 2, z = 7}} +}) + +-- add lucky blocks + +lucky_block:add_blocks({ + {"sch", "basandrabush", 0, false}, + {"dro", {"ethereal:basandra_wood"}, 5}, + {"dro", {"ethereal:firethorn"}, 3}, + {"dro", {"ethereal:firethorn_jelly"}, 3}, + {"nod", "ethereal:crystal_spike", 1}, + {"sch", "pinetree", 0, false}, + {"dro", {"ethereal:orange"}, 10}, + {"sch", "appletree", 0, false}, + {"dro", {"ethereal:strawberry"}, 10}, + {"sch", "bananatree", 0, false}, + {"sch", "orangetree", 0, false}, + {"dro", {"ethereal:banana"}, 10}, + {"sch", "acaciatree", 0, false}, + {"dro", {"ethereal:golden_apple"}, 3}, + {"sch", "palmtree", 0, false}, + {"dro", {"ethereal:tree_sapling"}, 5}, + {"dro", {"ethereal:orange_tree_sapling"}, 5}, + {"dro", {"ethereal:banana_tree_sapling"}, 5}, + {"dro", {"ethereal:willow_sapling"} ,5}, + {"dro", {"ethereal:mushroom_sapling"} ,5}, + {"dro", {"ethereal:palm_sapling"} ,5}, + {"sch", "mushroomone", 0, false}, + {"dro", {"ethereal:flight_potion"}, 1}, + {"dro", {"ethereal:birch_sapling"} ,5}, + {"dro", {"ethereal:redwood_sapling"} ,1}, + {"dro", {"ethereal:prairie_dirt"}, 10}, + {"dro", {"ethereal:grove_dirt"}, 10}, + {"fal", {"default:lava_source", "default:lava_source", "default:lava_source", + "default:lava_source", "default:lava_source"}, 1, true, 4}, + {"dro", {"ethereal:cold_dirt"}, 10}, + {"dro", {"ethereal:mushroom_dirt"}, 10}, + {"dro", {"ethereal:fiery_dirt"}, 10}, + {"sch", "mushroomtwo", 0, false}, + {"dro", {"ethereal:axe_crystal"}}, + {"nod", "ethereal:fire_flower", 1}, + {"dro", {"ethereal:sword_crystal"}}, + {"nod", "ethereal:basandra_bush_stem", 1}, + {"dro", {"ethereal:pick_crystal"}}, + {"sch", "birchtree", 0, false}, + {"dro", {"ethereal:fish_raw"}}, + {"dro", {"ethereal:shovel_crystal"}}, + {"dro", {"ethereal:fishing_rod_baited"}}, + {"exp"}, + {"sch", "underspike", 0, false}, + {"sch", "underspike", 0, false, { + {"default:cobble", "default:desert_cobble"}, + {"default:stone", "default:desert_stone"} + }}, + {"sch", "underspike", 0, false, { + {"default:cobble", "default:sandstone"}, + {"default:stone", "default:sandstonebrick"} + }}, + {"sch", "underspike", 0, false, { + {"default:cobble", "default:desert_sandstone"}, + {"default:stone", "default:desert_sandstone_brick"} + }}, + {"sch", "underspike", 0, false, { + {"default:cobble", "default:silver_sandstone"}, + {"default:stone", "default:silver_sandstone_brick"} + }}, + {"dro", {"ethereal:fire_dust"}, 2}, + {"exp", 4}, + {"dro", {"ethereal:crystal_gilly_staff"}}, + {"dro", {"ethereal:light_staff"}}, + {"nod", "default:chest", 0, { + {name = "ethereal:birch_sapling", max = 10}, + {name = "ethereal:palm_sapling", max = 10}, + {name = "ethereal:orange_tree_sapling", max = 10}, + {name = "ethereal:redwood_sapling", max = 10}, + {name = "ethereal:bamboo_sprout", max = 10}, + {name = "ethereal:banana_tree_sapling", max = 10}, + {name = "ethereal:mushroom_sapling", max = 10}, + {name = "ethereal:mushroom_brown_sapling", max = 10}, + {name = "ethereal:frost_tree_sapling", max = 10}, + {name = "ethereal:sakura_sapling", max = 10}, + {name = "ethereal:willow_sapling", max = 10}, + {name = "ethereal:lemon_tree_sapling", max = 10}, + {name = "ethereal:olive_tree_sapling", max = 10} + }}, + {"flo", 5, {"ethereal:blue_marble_tile"}, 2}, + {"dro", {"ethereal:blue_marble", "ethereal:blue_marble_tile"}, 8}, + {"dro", {"ethereal:etherium_ore"}, 5}, + {"nod", "default:chest", 0, { + {name = "ethereal:fish_bluefin", max = 4}, + {name = "ethereal:fish_blueram", max = 4}, + {name = "ethereal:fish_catfish", max = 4}, + {name = "ethereal:fish_clownfish", max = 4}, + {name = "ethereal:fish_pike", max = 4}, + {name = "ethereal:fish_flathead", max = 4}, + {name = "ethereal:fish_plaice", max = 4}, + {name = "ethereal:fish_pufferfish", max = 4}, + {name = "ethereal:fish_salmon", max = 4}, + {name = "ethereal:fish_cichlid", max = 4}, + {name = "ethereal:fish_trout", max = 4}, + {name = "ethereal:fish_tilapia", max = 4}, + {name = "ethereal:fish_parrot", max = 4}, + {name = "ethereal:fishing_rod", max = 1}, + {name = "ethereal:worm", max = 10} + }}, + {"nod", "default:chest", 0, { + {name = "ethereal:fish_carp", max = 4}, + {name = "ethereal:fish_coy", max = 4}, + {name = "ethereal:fish_flounder", max = 4}, + {name = "ethereal:fish_jellyfish", max = 4}, + {name = "ethereal:fish_mackerel", max = 4}, + {name = "ethereal:fish_redsnapper", max = 4}, + {name = "ethereal:fish_tuna", max = 4}, + {name = "ethereal:fish_squid", max = 4}, + {name = "ethereal:fish_shrimp", max = 4}, + {name = "ethereal:fish_angler", max = 4}, + {name = "ethereal:fish_piranha", max = 4}, + {name = "ethereal:fish_trevally", max = 4}, + {name = "ethereal:fishing_rod", max = 1}, + {name = "ethereal:worm", max = 10} + }}, + {"dro", {"ethereal:lemon"}, 9}, + {"dro", {"ethereal:fish_seahorse", "ethereal:fish_seahorse_green", + "ethereal:fish_seahorse_pink", "ethereal:fish_seahorse_blue", + "ethereal:fish_seahorse_yellow"}, 1}, + {"dro", {"ethereal:jellyfish_salad"}, 2}, + {"dro", {"ethereal:calamari_cooked", "ethereal:calamari_raw"}, 4}, + {"dro", {"ethereal:fish_shrimp", "ethereal:fish_shrimp_cooked"}, 4}, + {"dro", {"ethereal:teriyaki_chicken", "ethereal:teriyaki_beef"}, 4}, + {"dro", {"ethereal:sushi_tamago", "ethereal:sushi_nigiri", + "ethereal:sushi_kappamaki", "ethereal:fugu", "ethereal:sashimi"}, 4}, + {"flo", 3, {"ethereal:gray_moss", "ethereal:fiery_moss", "ethereal:green_moss", + "ethereal:crystal_moss", "ethereal:mushroom_moss"}, 1}, + {"tro", "ethereal:candle_red", "tnt_blast", true}, + {"nod", "ethereal:candle_orange", 0}, + {"nod", "ethereal:candle", 0}, + {"dro", {"ethereal:fish_tetra", "ethereal:fish_shrimp", "ethereal:worm"}, 1}, + {"nod", "default:chest", 0, { + {name = "ethereal:fish_n_chips", max = 1}, + {name = "ethereal:calamari_cooked", max = 1}, + {name = "ethereal:jellyfish_salad", max = 1}, + {name = "ethereal:garlic_shrimp", max = 1}, + {name = "ethereal:fish_shrimp_cooked", max = 1}, + {name = "ethereal:mushroom_soup", max = 1}, + {name = "ethereal:teriyaki_beed", max = 1}, + {name = "ethereal:teriyaki_chicken", max = 1}, + {name = "ethereal:fugu", max = 1}, + {name = "ethereal:sushu_tamago", max = 1}, + {name = "ethereal:sushi_nigiri", max = 1}, + {name = "ethereal:sushi_kappamaki", max = 1}, + {name = "ethereal:hearty_stew", max = 1}, + }}, + {"sch", "ethereal_pond", 0, false}, + {"sch", "ethereal_pond", 0, false, { + {"default:river_water_source", "default:lava_source"}, + {"default:clay", "default:stone"}, + {"default:dirt", "ethereal:fiery_dirt"}, + {"default:mossycobble", "default:obsidian"}, + {"ethereal:bush2", "ethereal:basandra_bush_leaves"}, + {"default:fern_1", "ethereal:dry_shrub"}, + {"default:fern_2", "ethereal:dry_shrub"}, + {"default:fern_3", "ethereal:fire_flower"}, + {"default:grass_4", "ethereal:dry_shrub"} + }}, + {"sch", "ethereal_pond", 0, false, { + {"default:clay", "default:dirt"}, + {"default:dirt", "default:dry_dirt_with_dry_grass"}, + {"default:mossycobble", "default:dry_dirt"}, + {"ethereal:bush2", "default:acacia_bush_leaves"}, + {"default:fern_1", "default:dry_grass_1"}, + {"default:fern_2", "default:dry_grass_2"}, + {"default:fern_3", "default:dry_grass_3"}, + {"default:grass_4", "default:dry_grass_4"} + }}, + {"sch", "ethereal_pond", 0, false, { + {"default:river_water_source", "default:water_source"}, + {"default:dirt", "default:sand"}, + {"default:mossycobble", "default:dirt"}, + {"ethereal:bush2", "default:pine_bush_needles"}, + {"default:fern_1", "default:marram_grass_1"}, + {"default:fern_2", "default:marram_grass_2"}, + {"default:fern_3", "default:marram_grass_3"}, + {"default:grass_4", "default:dry_shrub"} + }}, + {"sch", "ethereal_pond", 0, false, { + {"default:river_water_source", "default:water_source"}, + {"default:dirt", "default:coral_brown"}, + {"default:mossycobble", "default:coral_orange"}, + {"ethereal:bush2", "default:coral_skeleton"}, + {"default:fern_1", "ethereal:coral2"}, + {"default:fern_2", "ethereal:coral3"}, + {"default:fern_3", "ethereal:coral4"}, + {"default:grass_4", "ethereal:seaweed"} + }} +}) + +if minetest.get_modpath("3d_armor") then + + lucky_block:add_blocks({ + {"dro", {"3d_armor:helmet_crystal"}}, + {"dro", {"3d_armor:chestplate_crystal"}}, + {"dro", {"3d_armor:leggings_crystal"}}, + {"dro", {"3d_armor:boots_crystal"}}, + {"lig"} + }) +end + +if minetest.get_modpath("shields") then + + lucky_block:add_blocks({ + {"dro", {"shields:shield_crystal"}}, + {"exp"} + }) +end diff --git a/mods/ethereal/mod.conf b/mods/ethereal/mod.conf new file mode 100644 index 00000000..0ef1342e --- /dev/null +++ b/mods/ethereal/mod.conf @@ -0,0 +1,5 @@ +name = ethereal +description = Adds many new biomes, items and features into your world. +depends = default, flowers +optional_depends = stairs, doors, farming, bakedclay, moreblocks, lucky_block, toolranks, ambience +min_minetest_version = 5.2 \ No newline at end of file diff --git a/mods/ethereal/onion.lua b/mods/ethereal/onion.lua new file mode 100644 index 00000000..a7f327f6 --- /dev/null +++ b/mods/ethereal/onion.lua @@ -0,0 +1,127 @@ + +local S = minetest.get_translator("ethereal") + +-- wild onion + +minetest.register_craftitem("ethereal:wild_onion_plant", { + description = S("Wild Onion"), + inventory_image = "ethereal_wild_onion.png", + wield_image = "ethereal_wild_onion.png", + groups = {food_onion = 1}, + on_use = minetest.item_eat(2), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "ethereal:wild_onion_1") + end +}) + +ethereal.add_eatable("ethereal:wild_onion_plant", 2) + +-- Onion definition + +local def = { + description = S("Wild Onion") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"ethereal_wild_onion_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = { + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} + }, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + growing = 1, not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults() +} + +--stage 1 + +minetest.register_node("ethereal:onion_1", table.copy(def)) + +--stage 2 + +def.tiles = {"ethereal_wild_onion_2.png"} +minetest.register_node("ethereal:onion_2", table.copy(def)) + +--stage 3 + +def.tiles = {"ethereal_wild_onion_3.png"} +minetest.register_node("ethereal:onion_3", table.copy(def)) + +--stage 4 + +def.tiles = {"ethereal_wild_onion_4.png"} +def.drop = { + items = { + {items = {"ethereal:wild_onion_plant"}, rarity = 1}, + {items = {"ethereal:wild_onion_plant 2"}, rarity = 3}, + } +} +minetest.register_node("ethereal:onion_4", table.copy(def)) + +--stage 5 + +def.tiles = {"ethereal_wild_onion_5.png"} +def.groups.growing = nil +def.selection_box = { + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -2.5/16, 0.5} +} +def.drop = { + items = { + {items = {"ethereal:wild_onion_plant 2"}, rarity = 1}, + {items = {"ethereal:wild_onion_plant 3"}, rarity = 2}, + } +} +minetest.register_node("ethereal:onion_5", table.copy(def)) + +-- register for use with farming redo growth routines + +if farming and farming.mod and farming.mod == "redo" then + + -- add to registered_plants + farming.registered_plants["ethereal:wild_onion_plant"] = { + crop = "ethereal:onion", + seed = "ethereal:wild_onion_plant", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 + } +else + minetest.register_abm({ + label = "Ethereal grow onion", + nodenames = { + "ethereal:onion_1", "ethereal:onion_2", "ethereal:onion_3", + "ethereal:onion_4" + }, + neighbors = {"farming:soil_wet"}, + interval = 11, + chance = 20, + catch_up = false, + + action = function(pos, node) + + -- are we on wet soil? + pos.y = pos.y - 1 + + if minetest.get_item_group(minetest.get_node(pos).name, "soil") < 3 then + return + end + + pos.y = pos.y + 1 + + -- do we have enough light? + local light = minetest.get_node_light(pos) or 0 ; if light < 13 then return end + + -- grow to next stage + local num = node.name:split("_")[2] + + node.name = "ethereal:onion_" .. tonumber(num + 1) + + minetest.swap_node(pos, node) + end + }) +end diff --git a/mods/ethereal/ores.lua b/mods/ethereal/ores.lua new file mode 100644 index 00000000..24ac825b --- /dev/null +++ b/mods/ethereal/ores.lua @@ -0,0 +1,119 @@ + +-- stratum ore helper + +local function add_stratum(y_min, y_max, node) + + minetest.register_ore({ + ore_type = "stratum", + ore = node, + wherein = {"bakedclay:orange"}, + clust_scarcity = 1, + y_max = y_max, + y_min = y_min, + biomes = {"mesa"} + }) +end + +-- add baked clay layers (mesa biome is between 20 and 71) + +for n = 0, 5 do + + add_stratum(20 + (n * 9), 21 + (n * 9), "bakedclay:brown") + add_stratum(22 + (n * 9), 23 + (n * 9), "bakedclay:grey") + add_stratum(25 + (n * 9), 26 + (n * 9), "bakedclay:red") +end + +-- scatter ore helper + +local function add_ore(a, b, c, d, e, f, g) + + minetest.register_ore({ + ore_type = "scatter", + ore = a, + wherein = b, + clust_scarcity = c, + clust_num_ores = d, + clust_size = e, + y_min = f, + y_max = g + }) +end + +-- Coal + +add_ore("default:stone_with_coal", "default:desert_stone", 24*24*24, 27, 6, -31000, -16) + +-- Iron + +add_ore("default:stone_with_iron", "default:desert_stone", 9*9*9, 5, 3, -63, -16) +add_ore("default:stone_with_iron", "default:desert_stone", 24*24*24, 27, 6, -31000, -64) + +--Mese + +add_ore("default:stone_with_mese", "default:desert_stone", 14*14*14, 5, 3, -31000, -256) + +-- Gold + +add_ore("default:stone_with_gold", "default:desert_stone", 15*15*15, 3, 2, -255, -64) +add_ore("default:stone_with_gold", "default:desert_stone", 13*13*13, 5, 3, -31000, -256) + +-- Diamond + +add_ore("default:stone_with_diamond", "default:desert_stone", 17*17*17, 4, 3, -255, -128) +add_ore("default:stone_with_diamond", "default:desert_stone", 15*15*15, 4, 3, -31000, -256) + +-- Copper + +add_ore("default:stone_with_copper", "default:desert_stone", 9*9*9, 5, 3, -31000, -64) + +-- Coral Sand + +add_ore("ethereal:sandy", "default:sand", 10*10*10, 24, 4, -45, -10) + +-- Etherium + +minetest.register_ore({ + ore_type = "scatter", + ore = "ethereal:etherium_ore", + wherein = "default:desert_stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 1, + clust_size = 1, + y_min = 5, + y_max = 40, + biomes = {"caves"} +}) + +-- Etherium in floatlands + +minetest.register_ore({ + ore_type = "scatter", + ore = "ethereal:stone_with_etherium_ore", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 6, + clust_size = 2, + y_min = 1025, + y_max = 31000 +}) + +-- Clay in silver and desert sand beaches + +minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:silver_sand", "default:desert_sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -15, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + } +}) diff --git a/mods/ethereal/plantlife.lua b/mods/ethereal/plantlife.lua new file mode 100644 index 00000000..6401547b --- /dev/null +++ b/mods/ethereal/plantlife.lua @@ -0,0 +1,376 @@ + +local S = minetest.get_translator("ethereal") + +-- Spore Grass + +minetest.register_node("ethereal:spore_grass", { + description = S("Spore Grass"), + drawtype = "plantlike", + tiles = {"ethereal_spore_grass.png"}, + inventory_image = "ethereal_spore_grass.png", + wield_image = "ethereal_spore_grass.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16} + } +}) + +-- Firethorn (poisonous when eaten raw, must be crushed and washed with water 1st) + +minetest.register_node("ethereal:firethorn", { + description = S("Firethorn Shrub"), + drawtype = "plantlike", + tiles = {"ethereal_firethorn.png"}, + inventory_image = "ethereal_firethorn.png", + wield_image = "ethereal_firethorn.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16} + } +}) + +-- Fire Flower + +minetest.register_node("ethereal:fire_flower", { + description = S("Fire Flower"), + drawtype = "plantlike", + tiles = { "ethereal_fire_flower.png" }, + inventory_image = "ethereal_fire_flower.png", + wield_image = "ethereal_fire_flower.png", + paramtype = "light", + light_source = 5, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + damage_per_second = 2, + groups = {snappy = 1, oddly_breakable_by_hand = 3, igniter = 2}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 1 / 2, 5 / 16} + }, + + on_punch = function(pos, node, puncher) -- hurts when punched + + puncher:punch(puncher, 1.0, { + full_punch_interval = 1.0, damage_groups = {fleshy = 2}}, nil) + end +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:fire_flower", + burntime = 20 +}) + +-- Fire Dust + +minetest.register_craftitem("ethereal:fire_dust", { + description = S("Fire Dust"), + inventory_image = "ethereal_fire_dust.png" +}) + +minetest.register_craft({ + output = "ethereal:fire_dust 2", + recipe = {{"ethereal:fire_flower"}} +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:fire_dust", + burntime = 10 +}) + +-- vines + +minetest.register_node("ethereal:vine", { + description = S("Vine"), + drawtype = "signlike", + tiles = {"ethereal_vine.png"}, + inventory_image = "ethereal_vine.png", + wield_image = "ethereal_vine.png", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = {type = "wallmounted"}, + groups = {choppy = 3, oddly_breakable_by_hand = 1, flammable = 2}, + legacy_wallmounted = true, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_craft({ + output = "ethereal:vine 2", + recipe = { + {"group:leaves", "", "group:leaves"}, + {"", "group:leaves", ""}, + {"group:leaves", "", "group:leaves"} + } +}) + +-- light strings (glowing vine) + +minetest.register_node("ethereal:lightstring", { + description = S("Light String Vine"), + drawtype = "signlike", + tiles = {"ethereal_lightstring.png"}, + inventory_image = "ethereal_lightstring.png", + wield_image = "ethereal_lightstring.png", + paramtype = "light", + paramtype2 = "wallmounted", + light_source = 10, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = {type = "wallmounted"}, + groups = {choppy = 3, oddly_breakable_by_hand = 1, flammable = 2}, + legacy_wallmounted = true, + sounds = default.node_sound_leaves_defaults() +}) + +minetest.register_craft({ + output = "ethereal:lightstring 8", + recipe = { + {"ethereal:vine", "ethereal:vine", "ethereal:vine"}, + {"ethereal:vine", "ethereal:fire_dust", "ethereal:vine"}, + {"ethereal:vine", "ethereal:vine", "ethereal:vine"} + } +}) + +-- Boston Fern + +-- Fern (boston) +if minetest.get_modpath("default") then + minetest.register_alias("ethereal:fern","default:fern_3") + minetest.override_item("default:fern_3",{ + drop = { + max_items = 1, + items = { + {items = {"ethereal:fern_tubers"}, rarity = 6}, + {items = {"default:fern_1"}}, + }, + }, + }) +else + minetest.register_node("ethereal:fern", { + description = S("Fern"), + drawtype = "plantlike", + visual_scale = 1.4, + tiles = {"ethereal_fern.png"}, + inventory_image = "ethereal_fern.png", + wield_image = "ethereal_fern.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + max_items = 1, + items = { + {items = {"ethereal:fern_tubers"}, rarity = 6}, + {items = {"ethereal:fern"}} + } + }, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.67, 5 / 16} + } + }) +end + +-- Boston Ferns sometimes drop edible Tubers + +minetest.register_craftitem("ethereal:fern_tubers", { + description = S("Fern Tubers"), + inventory_image = "ethereal_fern_tubers.png", + groups = {food_tuber = 1}, + on_use = minetest.item_eat(1) +}) + +ethereal.add_eatable("ethereal:fern_tubers", 1) + +-- Red Shrub (not flammable) + +minetest.register_node("ethereal:dry_shrub", { + description = S("Fiery Dry Shrub"), + drawtype = "plantlike", + tiles = {"ethereal_dry_shrub.png"}, + inventory_image = "ethereal_dry_shrub.png", + wield_image = "ethereal_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16} + } +}) + +-- Grey Shrub (not Flammable - too cold to burn) + +minetest.register_node("ethereal:snowygrass", { + description = S("Snowy Grass"), + drawtype = "plantlike", + visual_scale = 0.9, + tiles = {"ethereal_snowygrass.png"}, + inventory_image = "ethereal_snowygrass.png", + wield_image = "ethereal_snowygrass.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 5 / 16, 5 / 16} + } +}) + +-- Crystal Shrub (not Flammable - too cold to burn) + +minetest.register_node("ethereal:crystalgrass", { + description = S("Crystal Grass"), + drawtype = "plantlike", + visual_scale = 0.9, + tiles = {"ethereal_crystalgrass.png"}, + inventory_image = "ethereal_crystalgrass.png", + wield_image = "ethereal_crystalgrass.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 5 / 16, 5 / 16} + } +}) + +-- tall lilac + +minetest.register_node("ethereal:lilac", { + description = S("Lilac"), + drawtype = "plantlike", + visual_scale = 1.9, + tiles = {"ethereal_lilac.png"}, + inventory_image = "ethereal_lilac.png", + wield_image = "ethereal_lilac.png", + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.67, 5 / 16} + } +}) + +minetest.register_craft({ + output = "dye:magenta 2", + recipe = {{"ethereal:lilac"}} +}) + +-- moss helper function + +local function add_moss(typ, descr, texture, receipe_item) + + minetest.register_node("ethereal:" .. typ .. "_moss", { + description = S(descr .. " Moss"), + tiles = {texture}, + groups = {crumbly = 3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}}) + }) + + minetest.register_craft({ + output = "ethereal:" .. typ .. "_moss", + recipe = {{"default:dirt", receipe_item}} + }) +end + +-- add moss types (has grass texture on all sides) + +add_moss("crystal", "Crystal", "ethereal_grass_crystal_top.png", "ethereal:frost_leaves") +add_moss("mushroom", "Mushroom", "ethereal_grass_mushroom_top.png", "ethereal:spore_grass") +add_moss("fiery", "Fiery", "ethereal_grass_fiery_top.png", "ethereal:dry_shrub") +add_moss("gray", "Gray", "ethereal_grass_gray_top.png", "ethereal:snowygrass") +add_moss("green", "Green", "default_grass.png", "default:jungleleaves") +add_moss("bamboo", "Bamboo", "ethereal_grass_bamboo_top.png", "ethereal:bamboo_leaves") + +-- shroom helper function + +local function add_shroom(name, desc, ad) + + minetest.register_node("ethereal:illumishroom" .. ad, { + description = S(desc .. " Illumishroom"), + drawtype = "plantlike", + tiles = {"ethereal_illumishroom_" .. name .. ".png"}, + inventory_image = "ethereal_illumishroom_" .. name .. ".png", + wield_image = "ethereal_illumishroom_" .. name .. ".png", + paramtype = "light", + light_source = 5, + sunlight_propagates = true, + walkable = false, + groups = {dig_immediate = 3, attached_node = 1, flammable = 3}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.47, 6 / 16} + } + }) +end + +-- add illuminated cave shrooms + +add_shroom("red", "Red", "") +add_shroom("green", "Green", "2") +add_shroom("cyan", "Cyan", "3") + +-- poppy + +if not minetest.get_modpath("xanadu") then + + minetest.register_node(":xanadu:poppy", { + description = S("Poppy"), + tiles = {"ethereal_poppy.png"}, + inventory_image = "ethereal_poppy.png", + wield_image = "ethereal_poppy.png", + sunlight_propagates = true, + buildable_to = true, + waving = 1, + drawtype = "plantlike", + paramtype = "light", + walkable = false, + groups = {flower = 1, flora = 1, snappy = 3, attached_node = 1, flammable = 3}, + selection_box = { + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} + }, + sounds = default.node_sound_leaves_defaults(), + }) + + -- craft dye from plant + minetest.register_craft({ + output = "dye:red 4", + recipe = {{"xanadu:poppy"}} + }) +end diff --git a/mods/ethereal/sapling.lua b/mods/ethereal/sapling.lua new file mode 100644 index 00000000..200b71b1 --- /dev/null +++ b/mods/ethereal/sapling.lua @@ -0,0 +1,328 @@ + +-- translator and protection check setting + +local S = minetest.get_translator("ethereal") +local sapling_protection_check = minetest.settings:get_bool( + "ethereal.sapling_protection_check", false) + +-- sapling placement helper + +local function prepare_on_place(itemstack, placer, pointed_thing, name, w, h) + + if sapling_protection_check then + + -- check if grown tree area intersects any players protected area + return default.sapling_on_place(itemstack, placer, pointed_thing, + name, {x = -w, y = 1, z = -w}, {x = w, y = h, z = w}, 4) + end + + -- Position of sapling + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local pdef = node and minetest.registered_nodes[node.name] + + -- Check if node clicked on has it's own on_rightclick function + if pdef and pdef.on_rightclick + and not (placer and placer:is_player() and placer:get_player_control().sneak) then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + -- place normally + return minetest.item_place_node(itemstack, placer, pointed_thing) +end + +-- Basandra Bush Sapling + +minetest.register_node("ethereal:basandra_bush_sapling", { + description = S("Basandra Bush Sapling"), + drawtype = "plantlike", + tiles = {"ethereal_basandra_bush_sapling.png"}, + inventory_image = "ethereal_basandra_bush_sapling.png", + wield_image = "ethereal_basandra_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, attached_node = 1, ethereal_sapling = 1, + sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + grown_height = 2, + + on_place = function(itemstack, placer, pointed_thing) + return prepare_on_place(itemstack, placer, pointed_thing, + "ethereal:basandra_bush_sapling", 1, 2) + end +}) + +-- Bamboo Sprout + +minetest.register_node("ethereal:bamboo_sprout", { + description = S("Bamboo Sprout"), + drawtype = "plantlike", + tiles = {"ethereal_bamboo_sprout.png"}, + inventory_image = "ethereal_bamboo_sprout.png", + wield_image = "ethereal_bamboo_sprout.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = { + food_bamboo_sprout = 1, snappy = 3, attached_node = 1, flammable = 2, + dig_immediate = 3, ethereal_sapling = 1, sapling = 1, + }, + sounds = default.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -0.1, 3 / 16} + }, + on_use = minetest.item_eat(2), + grown_height = 11, + + on_place = function(itemstack, placer, pointed_thing) + return prepare_on_place(itemstack, placer, pointed_thing, + "ethereal:bamboo_sprout", 1, 18) + end +}) + +-- register Sapling helper + +local function register_sapling(name, desc, texture, width, height) + + minetest.register_node(name .. "_sapling", { + description = S(desc .. " Tree Sapling"), + drawtype = "plantlike", + tiles = {texture .. ".png"}, + inventory_image = texture .. ".png", + wield_image = texture .. ".png", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = { + snappy = 2, dig_immediate = 3, flammable = 2, + ethereal_sapling = 1, attached_node = 1, sapling = 1 + }, + sounds = default.node_sound_leaves_defaults(), + grown_height = height, + + on_place = function(itemstack, placer, pointed_thing) + return prepare_on_place(itemstack, placer, pointed_thing, + name .. "_sapling", width, height) + end + }) +end + +-- add saplings + +register_sapling("ethereal:willow", "Willow", "ethereal_willow_sapling", 5, 14) +register_sapling("ethereal:yellow_tree", "Healing", "ethereal_yellow_tree_sapling", 4, 19) +register_sapling("ethereal:big_tree", "Big", "ethereal_big_tree_sapling", 4, 7) +register_sapling("ethereal:banana_tree", "Banana", "ethereal_banana_tree_sapling", 3, 8) +register_sapling("ethereal:frost_tree", "Frost", "ethereal_frost_tree_sapling", 4, 19) +register_sapling("ethereal:mushroom", "Mushroom", "ethereal_mushroom_sapling", 4, 11) +register_sapling("ethereal:mushroom_brown", "Brown Mushroom", + "ethereal_mushroom_brown_sapling", 1, 11) +register_sapling("ethereal:palm", "Palm", "moretrees_palm_sapling", 4, 9) +register_sapling("ethereal:giant_redwood", "Giant Redwood", + "ethereal_giant_redwood_sapling", 7, 33) +register_sapling("ethereal:redwood", "Redwood", "ethereal_redwood_sapling", 4, 21) +register_sapling("ethereal:orange_tree", "Orange", "ethereal_orange_tree_sapling", 2, 6) +register_sapling("ethereal:birch", "Birch", "moretrees_birch_sapling", 2, 7) +register_sapling("ethereal:sakura", "Sakura", "ethereal_sakura_sapling", 4, 10) +register_sapling("ethereal:lemon_tree", "Lemon", "ethereal_lemon_tree_sapling", 2, 7) +register_sapling("ethereal:olive_tree", "Olive", "ethereal_olive_tree_sapling", 3, 10) + +-- add tree schematic + +local function add_tree(pos, schem, replace) + + minetest.swap_node(pos, {name = "air"}) + + minetest.place_schematic(pos, schem, "random", replace, false, + "place_center_x, place_center_z") +end + +-- get mod path and schematic folder + +local path = minetest.get_modpath("ethereal") .. "/schematics/" + +-- global tree grow functions + +function ethereal.grow_basandra_bush(pos) + add_tree(pos, ethereal.basandrabush) +end + +function ethereal.grow_yellow_tree(pos) + add_tree(pos, ethereal.yellowtree) +end + +function ethereal.grow_big_tree(pos) + add_tree(pos, ethereal.bigtree) +end + +function ethereal.grow_banana_tree(pos) + + if math.random(2) == 1 and minetest.find_node_near(pos, 1, {"farming:soil_wet"}) then + + add_tree(pos, ethereal.bananatree, + {{"ethereal:banana", "ethereal:banana_bunch"}}) + else + add_tree(pos, ethereal.bananatree) + end +end + +function ethereal.grow_frost_tree(pos) + add_tree(pos, ethereal.frosttrees) +end + +function ethereal.grow_mushroom_tree(pos) + add_tree(pos, ethereal.mushroomone) +end + +function ethereal.grow_mushroom_brown_tree(pos) + add_tree(pos, ethereal.mushroomtwo) +end + +function ethereal.grow_palm_tree(pos) + add_tree(pos, ethereal.palmtree) +end + +function ethereal.grow_willow_tree(pos) + add_tree(pos, ethereal.willow) +end + +function ethereal.grow_redwood_tree(pos) + add_tree(pos, ethereal.redwood_small_tree) +end + +function ethereal.grow_giant_redwood_tree(pos) + add_tree(pos, ethereal.redwood_tree) +end + +function ethereal.grow_orange_tree(pos) + add_tree(pos, ethereal.orangetree) +end + +function ethereal.grow_bamboo_tree(pos) + add_tree(pos, ethereal.bambootree) +end + +function ethereal.grow_birch_tree(pos) + add_tree(pos, ethereal.birchtree) +end + +function ethereal.grow_sakura_tree(pos) + + if math.random(10) == 1 then + + add_tree(pos, ethereal.sakura_tree, + {{"ethereal:sakura_leaves", "ethereal:sakura_leaves2"}}) + else + add_tree(pos, ethereal.sakura_tree) + end +end + +function ethereal.grow_lemon_tree(pos) + add_tree(pos, ethereal.lemontree) +end + +function ethereal.grow_olive_tree(pos) + add_tree(pos, ethereal.olivetree) +end + +-- return True if sapling has enough height room to grow + +local function enough_height(pos, height) + + return minetest.line_of_sight( + {x = pos.x, y = pos.y + 1, z = pos.z}, + {x = pos.x, y = pos.y + height, z = pos.z}) +end + +-- global function run by Abm + +function ethereal.grow_sapling(pos, node) + + if (minetest.get_node_light(pos) or 0) < 13 then return end + + -- get node below sapling + local under = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name + local def = minetest.registered_nodes[node.name] ; if not def then return end + local height = def.grown_height or 33 + + -- do we have enough height to grow sapling into tree? + if not height or not enough_height(pos, height) then return end + + -- check if Ethereal Sapling is growing on correct substrate + if node.name == "ethereal:basandra_bush_sapling" + and under == "ethereal:fiery_dirt" then ethereal.grow_basandra_bush(pos) + + elseif node.name == "ethereal:yellow_tree_sapling" + and minetest.get_item_group(under, "soil") > 0 then ethereal.grow_yellow_tree(pos) + + elseif node.name == "ethereal:big_tree_sapling" + and under == "default:dirt_with_grass" then ethereal.grow_big_tree(pos) + + elseif node.name == "ethereal:banana_tree_sapling" + and under == "ethereal:grove_dirt" then ethereal.grow_banana_tree(pos) + + elseif node.name == "ethereal:frost_tree_sapling" + and under == "ethereal:crystal_dirt" then ethereal.grow_frost_tree(pos) + + elseif node.name == "ethereal:mushroom_sapling" + and under == "ethereal:mushroom_dirt" then ethereal.grow_mushroom_tree(pos) + + elseif node.name == "ethereal:mushroom_brown_sapling" + and under == "ethereal:mushroom_dirt" then ethereal.grow_mushroom_brown_tree(pos) + + elseif node.name == "ethereal:palm_sapling" + and under == "default:sand" then ethereal.grow_palm_tree(pos) + + elseif node.name == "ethereal:willow_sapling" + and under == "ethereal:gray_dirt" then ethereal.grow_willow_tree(pos) + + elseif node.name == "ethereal:redwood_sapling" + and under == "default:dirt_with_dry_grass" then ethereal.grow_redwood_tree(pos) + + elseif node.name == "ethereal:giant_redwood_sapling" + and under == "default:dirt_with_dry_grass" then ethereal.grow_giant_redwood_tree(pos) + + elseif node.name == "ethereal:orange_tree_sapling" + and under == "ethereal:prairie_dirt" then ethereal.grow_orange_tree(pos) + + elseif node.name == "ethereal:bamboo_sprout" + and under == "ethereal:bamboo_dirt" then ethereal.grow_bamboo_tree(pos) + + elseif node.name == "ethereal:birch_sapling" + and under == "default:dirt_with_grass" then ethereal.grow_birch_tree(pos) + + elseif node.name == "ethereal:sakura_sapling" + and under == "ethereal:bamboo_dirt" then ethereal.grow_sakura_tree(pos) + + elseif node.name == "ethereal:olive_tree_sapling" + and under == "ethereal:grove_dirt" then ethereal.grow_olive_tree(pos) + + elseif node.name == "ethereal:lemon_tree_sapling" + and under == "ethereal:grove_dirt" then ethereal.grow_lemon_tree(pos) end +end + +-- grow saplings Abm + +minetest.register_abm({ + label = "Ethereal grow sapling", + nodenames = {"group:ethereal_sapling"}, + interval = 10, + chance = 50, + catch_up = false, + action = ethereal.grow_sapling -- (pos, node) +}) + +-- 2x redwood saplings make 1x giant redwood sapling + +minetest.register_craft({ + output = "ethereal:giant_redwood_sapling", + recipe = {{"ethereal:redwood_sapling", "ethereal:redwood_sapling"}} +}) diff --git a/mods/ethereal/schematics/bamboo_tree.lua b/mods/ethereal/schematics/bamboo_tree.lua new file mode 100644 index 00000000..9c37b313 --- /dev/null +++ b/mods/ethereal/schematics/bamboo_tree.lua @@ -0,0 +1,87 @@ + +local _ = {name = "air", param1 = 000} +local b = {name = "ethereal:bamboo", param1 = 255} +local B = {name = "ethereal:bamboo", param1 = 255, force_place = true} +local L = {name = "ethereal:bamboo_leaves", param1 = 255} +local l = {name = "ethereal:bamboo_leaves", param1 = 100} + +ethereal.bambootree = { + + size = {x = 3, y = 18, z = 3}, + + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127} + }, + + data = { + + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + l,L,l, + _,L,_, + _,_,_, + + _,B,_, + _,B,_, + _,B,_, + _,B,_, + _,B,_, + _,B,_, + _,b,_, + _,b,_, + _,b,_, + _,b,_, + _,b,_, + _,b,_, + _,b,_, + _,b,_, + _,b,_, + l,b,l, + _,L,_, + _,l,_, + + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + l,L,l, + _,L,_, + _,_,_, + + } +} + +if ethereal.papyruswalk == true then + + minetest.override_item("default:papyrus", { + walkable = true, + sunlight_propagates = true + }) +end diff --git a/mods/ethereal/schematics/banana_tree.lua b/mods/ethereal/schematics/banana_tree.lua new file mode 100644 index 00000000..4c85f2dc --- /dev/null +++ b/mods/ethereal/schematics/banana_tree.lua @@ -0,0 +1,85 @@ + +local _ = {name = "air", param1 = 0} +local t = {name = "ethereal:banana_trunk", param1 = 255} +local T = {name = "ethereal:banana_trunk", param1 = 255, force_place = true} +local L = {name = "ethereal:bananaleaves", param1 = 255} +local l = {name = "ethereal:bananaleaves", param1 = 180} +local B = {name = "ethereal:banana", param1 = 255} +local b = {name = "ethereal:banana", param1 = 070} + +ethereal.bananatree = { + + size = {x = 7, y = 8, z = 7}, + + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,l,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,l,_,_,_, + _,_,_,L,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,b,_,_,_, + _,_,_,B,_,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + _,_,b,t,b,_,_, + _,_,B,t,B,_,_, + _,L,L,L,L,L,_, + l,l,_,L,_,l,l, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,b,_,_,_, + _,_,_,B,_,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,_,_,l,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,l,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/basandra_bush.lua b/mods/ethereal/schematics/basandra_bush.lua new file mode 100644 index 00000000..00ca5d1c --- /dev/null +++ b/mods/ethereal/schematics/basandra_bush.lua @@ -0,0 +1,23 @@ + +local _ = {name = "air", param1 = 0} +local S = {name = "ethereal:basandra_bush_stem", param1 = 255, force_place = true} +local B = {name = "ethereal:basandra_bush_leaves", param1 = 255} +local b = {name = "ethereal:basandra_bush_leaves", param1 = 100} + +ethereal.basandrabush = { + + size = {x = 3, y = 2, z = 3}, + + data = { + + b,B,b, + b,b,b, + + B,S,B, + b,B,b, + + b,B,b, + b,b,b, + + } +} diff --git a/mods/ethereal/schematics/bigtree.lua b/mods/ethereal/schematics/bigtree.lua new file mode 100644 index 00000000..9004df81 --- /dev/null +++ b/mods/ethereal/schematics/bigtree.lua @@ -0,0 +1,101 @@ + +local _ = {name = "air", prob = 0} +local L = {name = "default:leaves", prob = 255} +local T = {name = "default:tree", prob = 255} +local t = {name = "default:tree", prob = 127} +local M = {name = "default:tree", prob = 255, force_place = true} + +ethereal.bigtree = { + + size = {x = 9, y = 8, z = 9}, + + yslice_prob = { + {ypos = 0, prob = 127}, + {ypos = 1, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,t,t,_,t,t,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,t,t,t,t,t,t,t,_, + _,_,_,t,_,t,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,t,t,t,T,t,t,t,_, + _,_,t,t,T,t,t,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,_,T,_,_,_,_, + _,L,L,L,T,L,L,L,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,t,T,M,T,t,_,_, + _,_,_,T,M,T,_,_,_, + _,_,_,T,M,T,_,_,_, + _,_,_,T,T,T,_,_,_, + L,L,L,L,T,L,L,L,L, + _,L,L,L,T,L,L,L,_, + _,_,L,L,L,L,L,_,_, + _,_,_,_,_,_,_,_,_, + + _,t,t,t,T,t,t,t,_, + _,_,t,t,T,t,t,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,_,T,_,_,_,_, + _,L,L,L,T,L,L,L,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,t,t,t,t,t,t,t,_, + _,_,_,t,_,t,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,t,t,_,t,t,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/birch_tree.lua b/mods/ethereal/schematics/birch_tree.lua new file mode 100644 index 00000000..d483eea4 --- /dev/null +++ b/mods/ethereal/schematics/birch_tree.lua @@ -0,0 +1,65 @@ + +local _ = {name = "air", param1 = 0} +local t = {name = "ethereal:birch_trunk", param1 = 255} +local T = {name = "ethereal:birch_trunk", param1 = 255, force_place = true} +local L = {name = "ethereal:birch_leaves", param1 = 255} +local l = {name = "ethereal:birch_leaves", param1 = 150} + +ethereal.birchtree = { + + size = {x = 5, y = 8, z = 5}, + + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127} + }, + + data = { + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + l,L,L,L,l, + l,L,L,L,l, + _,_,_,_,_, + _,_,_,_,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + L,L,L,L,L, + L,L,L,L,L, + _,l,L,l,_, + _,_,L,_,_, + + _,_,T,_,_, + _,_,T,_,_, + _,_,T,_,_, + _,_,T,_,_, + L,L,T,L,L, + L,L,t,L,L, + _,L,t,L,_, + _,L,L,L,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + L,L,L,L,L, + L,L,L,L,L, + _,l,L,l,_, + _,_,L,_,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + l,L,L,L,l, + l,L,L,L,l, + _,_,_,_,_, + _,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/bush.lua b/mods/ethereal/schematics/bush.lua new file mode 100644 index 00000000..67c3417f --- /dev/null +++ b/mods/ethereal/schematics/bush.lua @@ -0,0 +1,38 @@ + +local _ = {name = "air", param1 = 0} +local B = {name = "ethereal:bush", param1 = 255} +local b = {name = "ethereal:bush", param1 = 100} + +ethereal.bush = { + + size = {x = 5, y = 3, z = 5}, + + yslice_prob = { + {ypos = 0, prob = 127}, + {ypos = 2, prob = 127} + }, + + data = { + + b,B,B,B,b, + _,_,_,_,_, + _,_,_,_,_, + + B,B,B,B,B, + _,b,B,b,_, + _,_,_,_,_, + + B,B,B,B,B, + _,B,B,B,_, + _,_,b,_,_, + + B,B,B,B,B, + _,b,B,b,_, + _,_,_,_,_, + + b,B,B,B,b, + _,_,_,_,_, + _,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/cherry_tree_1.mts b/mods/ethereal/schematics/cherry_tree_1.mts new file mode 100644 index 00000000..651c73fa Binary files /dev/null and b/mods/ethereal/schematics/cherry_tree_1.mts differ diff --git a/mods/ethereal/schematics/cherry_tree_2.mts b/mods/ethereal/schematics/cherry_tree_2.mts new file mode 100644 index 00000000..3fe6bb4d Binary files /dev/null and b/mods/ethereal/schematics/cherry_tree_2.mts differ diff --git a/mods/ethereal/schematics/corals.mts b/mods/ethereal/schematics/corals.mts new file mode 100644 index 00000000..e1bd7ded Binary files /dev/null and b/mods/ethereal/schematics/corals.mts differ diff --git a/mods/ethereal/schematics/desertstone_spike.lua b/mods/ethereal/schematics/desertstone_spike.lua new file mode 100644 index 00000000..e421b353 --- /dev/null +++ b/mods/ethereal/schematics/desertstone_spike.lua @@ -0,0 +1,33 @@ + +-- simple fix for Flux's stairsplus mod as it breaks compatibility +local nodname = minetest.get_modpath("stairsplus") + and "default:stair_desert_cobble_outer" or "stairs:stair_outer_desert_cobble" + +local _ = {name = "air", param1 = 0} +local ds = {name = "default:desert_stone", param1 = 255, param2 = 0} +local dc = {name = "default:desert_cobble", param1 = 255, param2 = 0} +local s0 = {name = nodname, param1 = 255, param2 = 0} +local s2 = {name = nodname, param1 = 255, param2 = 2} +local s3 = {name = nodname, param1 = 255, param2 = 3} +local et = {name = "ethereal:etherium_ore", param1 = 128} + +ethereal.desertstone_spike = { + + size = {x = 2, y = 3, z = 2}, + + yslice_prob = { + {ypos = 2, prob = 127} + }, + + data = { + + et, ds, + dc, s0, + s3, _, + + ds, ds, + s2,s3, + _,_, + + } +} diff --git a/mods/ethereal/schematics/desertstone_under_spike.lua b/mods/ethereal/schematics/desertstone_under_spike.lua new file mode 100644 index 00000000..cc635870 --- /dev/null +++ b/mods/ethereal/schematics/desertstone_under_spike.lua @@ -0,0 +1,48 @@ + +local _ = {name = "air", param1 = 000} +local S = {name = "default:stone", param1 = 255} +local s = {name = "default:stone", param1 = 127} +local C = {name = "default:cobble", param1 = 255} +local c = {name = "default:cobble", param1 = 127} + +ethereal.desertstone_under_spike = { + + size = {x = 3, y = 8, z = 3}, + + yslice_prob = { + {ypos = 3, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 6, prob = 127}, + }, + + data = { + + C,S,C, + C,S,C, + _,S,_, + _,S,_, + _,C,_, + _,_,_, + _,_,_, + _,_,_, + + S,S,S, + S,S,S, + S,S,S, + _,S,_, + _,S,_, + _,S,_, + _,S,_, + _,C,_, + + C,S,C, + C,S,C, + _,S,_, + _,S,_, + _,C,_, + _,_,_, + _,_,_, + _,_,_, + + } +} diff --git a/mods/ethereal/schematics/frosttrees.lua b/mods/ethereal/schematics/frosttrees.lua new file mode 100644 index 00000000..4267b720 --- /dev/null +++ b/mods/ethereal/schematics/frosttrees.lua @@ -0,0 +1,185 @@ + +local _ = {name = "air", prob = 0} +local l = {name = "ethereal:frost_leaves", prob = 255} +local t = {name = "ethereal:frost_tree", prob = 255} +local T = {name = "ethereal:frost_tree", prob = 255, force_place = true} + +ethereal.frosttrees = { + + size = {x = 8, y = 19, z = 8}, + + yslice_prob = { + {ypos = 2, prob = 127}, -- trunk + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 6, prob = 127}, + {ypos = 7, prob = 127}, + {ypos = 13, prob = 127}, -- leaves + {ypos = 15, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,l,l,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,l,l,l,l,_,_, + _,_,_,_,_,_,_,_, + _,_,_,l,l,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,l,l,_,_,_, + _,l,l,l,l,l,l,_, + _,_,_,l,l,_,_,_, + _,_,l,l,l,l,_,_, + _,_,_,l,l,_,_,_, + _,_,_,l,l,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,l,t,t,l,_,_, + l,l,l,t,t,l,l,l, + _,_,l,t,t,l,_,_, + _,l,l,t,t,l,l,_, + _,_,l,t,t,l,_,_, + _,_,l,t,t,l,_,_, + _,_,_,l,l,_,_,_, + + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,l,t,t,l,_,_, + l,l,l,t,t,l,l,l, + _,_,l,t,t,l,_,_, + _,l,l,t,t,l,l,_, + _,_,l,t,t,l,_,_, + _,_,l,t,t,l,_,_, + _,_,_,l,l,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,l,l,_,_,_, + _,l,l,l,l,l,l,_, + _,_,_,l,l,_,_,_, + _,_,l,l,l,l,_,_, + _,_,_,l,l,_,_,_, + _,_,_,l,l,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,l,l,l,l,_,_, + _,_,_,_,_,_,_,_, + _,_,_,l,l,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,l,l,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/gaunt_tree_1.mts b/mods/ethereal/schematics/gaunt_tree_1.mts new file mode 100644 index 00000000..d8be2238 Binary files /dev/null and b/mods/ethereal/schematics/gaunt_tree_1.mts differ diff --git a/mods/ethereal/schematics/gaunt_tree_2.mts b/mods/ethereal/schematics/gaunt_tree_2.mts new file mode 100644 index 00000000..32ea3aa4 Binary files /dev/null and b/mods/ethereal/schematics/gaunt_tree_2.mts differ diff --git a/mods/ethereal/schematics/gaunt_tree_3.mts b/mods/ethereal/schematics/gaunt_tree_3.mts new file mode 100644 index 00000000..1db20850 Binary files /dev/null and b/mods/ethereal/schematics/gaunt_tree_3.mts differ diff --git a/mods/ethereal/schematics/igloo.lua b/mods/ethereal/schematics/igloo.lua new file mode 100644 index 00000000..cdccb780 --- /dev/null +++ b/mods/ethereal/schematics/igloo.lua @@ -0,0 +1,62 @@ + +local _ = {name = "air", prob = 255, force_place = true} +local S = {name = "default:snowblock", prob = 255} +local P = {name = "default:pine_bush_stem", prob = 50} +local C = {name = "ethereal:coconut", prob = 50} + +ethereal.igloo = { + + size = {x = 7, y = 5, z = 8}, + + data = { + + _,_,S,S,S,_,_, + _,_,S,_,S,_,_, + _,_,S,_,S,_,_, + _,_,_,S,_,_,_, + _,_,_,_,_,_,_, + + _,_,S,S,S,_,_, + _,_,S,_,S,_,_, + _,_,S,_,S,_,_, + _,_,_,S,_,_,_, + _,_,_,_,_,_,_, + + _,S,S,S,S,S,_, + _,S,_,_,_,S,_, + _,S,_,_,_,S,_, + _,_,S,S,S,_,_, + _,_,_,_,_,_,_, + + S,S,S,S,S,S,S, + S,P,_,_,_,C,S, + S,_,_,_,_,_,S, + _,S,_,_,_,S,_, + _,_,S,S,S,_,_, + + S,S,S,S,S,S,S, + S,_,_,_,_,_,S, + S,_,_,_,_,_,S, + _,S,_,_,_,S,_, + _,_,S,S,S,_,_, + + S,S,S,S,S,S,S, + S,_,_,_,_,_,S, + S,_,_,_,_,_,S, + _,S,_,_,_,S,_, + _,_,S,S,S,_,_, + + _,S,S,S,S,S,_, + _,S,_,_,_,S,_, + _,S,_,_,_,S,_, + _,_,S,S,S,_,_, + _,_,_,_,_,_,_, + + _,_,S,S,S,_,_, + _,_,S,S,S,_,_, + _,_,S,S,S,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/lemon_tree.lua b/mods/ethereal/schematics/lemon_tree.lua new file mode 100644 index 00000000..98ee11d8 --- /dev/null +++ b/mods/ethereal/schematics/lemon_tree.lua @@ -0,0 +1,71 @@ + +local _ = {name = "air", param1 = 0} +local L = {name = "ethereal:lemon_leaves", param1 = 255} +local l = {name = "ethereal:lemon_leaves", param1 = 127} +local t = {name = "default:tree", param1 = 255} +local T = {name = "default:tree", param1 = 255, force_place = true} +local e = {name = "ethereal:lemon", param1 = 100} + +ethereal.lemontree = { + + size = {x = 5, y = 9, z = 5}, + + yslice_prob = { + {ypos = 1, prob = 127}, + {ypos = 3, prob = 127} + }, + + data = { + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,e,_,_, + _,L,L,L,e, + e,L,L,l,_, + _,l,L,L,_, + _,_,l,_,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,L,L,l,_, + l,L,l,L,L, + L,l,L,L,L, + L,L,L,l,L, + _,L,L,L,_, + + _,_,T,_,_, + _,_,T,_,_, + _,_,T,_,_, + _,_,T,_,_, + l,e,T,l,l, + L,L,t,L,l, + l,L,t,L,L, + L,L,L,l,L, + l,L,L,L,l, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,L,L,L,_, + L,l,L,L,L, + L,L,L,L,L, + L,L,L,L,l, + _,l,L,L,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,l,_,_, + e,L,L,l,_, + _,l,L,L,_, + _,L,L,L,e, + _,_,l,_,_, + + } +} diff --git a/mods/ethereal/schematics/meadow_tree_1.mts b/mods/ethereal/schematics/meadow_tree_1.mts new file mode 100644 index 00000000..f87145a7 Binary files /dev/null and b/mods/ethereal/schematics/meadow_tree_1.mts differ diff --git a/mods/ethereal/schematics/meadow_tree_2.mts b/mods/ethereal/schematics/meadow_tree_2.mts new file mode 100644 index 00000000..7c1a0fe5 Binary files /dev/null and b/mods/ethereal/schematics/meadow_tree_2.mts differ diff --git a/mods/ethereal/schematics/mushroomone.lua b/mods/ethereal/schematics/mushroomone.lua new file mode 100644 index 00000000..b30d7d78 --- /dev/null +++ b/mods/ethereal/schematics/mushroomone.lua @@ -0,0 +1,117 @@ + +local _ = {name = "air", prob = 0} +local M = {name = "ethereal:mushroom", prob = 255} +local t = {name = "ethereal:mushroom_trunk", prob = 255} +local T = {name = "ethereal:mushroom_trunk", prob = 255, force_place = true} +local P = {name = "ethereal:mushroom_pore", prob = 255} + +ethereal.mushroomone = { + + size = {x = 8, y = 11, z = 8}, + + yslice_prob = { + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 7, prob = 220} + }, + + data = { + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,M,M,_,_,_, + _,_,_,M,M,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,M,_,_,M,_,_, + _,_,M,_,_,M,_,_, + _,_,_,M,M,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,M,_,_,_,_,M,_, + _,M,_,_,_,_,M,_, + _,_,M,P,P,M,_,_, + _,_,_,M,M,_,_,_, + + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + M,_,_,t,t,_,_,M, + M,_,_,t,t,_,_,M, + _,M,P,P,P,P,M,_, + _,_,M,M,M,M,_,_, + + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + _,_,_,t,t,_,_,_, + M,_,_,t,t,_,_,M, + M,_,_,t,t,_,_,M, + _,M,P,P,P,P,M,_, + _,_,M,M,M,M,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,M,_,_,_,_,M,_, + _,M,_,_,_,_,M,_, + _,_,M,P,P,M,_,_, + _,_,_,M,M,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,M,_,_,M,_,_, + _,_,M,_,_,M,_,_, + _,_,_,M,M,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,M,M,_,_,_, + _,_,_,M,M,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/mushroomtwo.lua b/mods/ethereal/schematics/mushroomtwo.lua new file mode 100644 index 00000000..91f56ab9 --- /dev/null +++ b/mods/ethereal/schematics/mushroomtwo.lua @@ -0,0 +1,60 @@ + +local _ = {name = "air", param1 = 000} +local t = {name = "ethereal:mushroom_trunk", param1 = 255} +local T = {name = "ethereal:mushroom_trunk", param1 = 255, force_place = true} +local M = {name = "ethereal:mushroom_brown", param1 = 255} +local P = {name = "ethereal:mushroom_pore", param1 = 255} +local l = {name = "ethereal:lightstring", param1 = 255, param2 = 10} + +ethereal.mushroomtwo = { + + size = {x = 3, y = 11, z = 3}, + + yslice_prob = { + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 6, prob = 127}, + {ypos = 8, prob = 127}, + }, + + data = { + + _,_,_, + _,_,_, + _,l,_, + _,l,_, + _,l,_, + _,l,_, + M,M,M, + M,M,M, + M,M,M, + M,M,M, + _,M,_, + + _,T,_, + _,T,_, + _,T,_, + _,t,_, + _,t,_, + _,t,_, + M,t,M, + M,t,M, + M,P,M, + M,P,M, + M,M,M, + + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + _,_,_, + M,M,M, + M,M,M, + M,M,M, + M,M,M, + _,M,_, + + } +} diff --git a/mods/ethereal/schematics/olive_tree.lua b/mods/ethereal/schematics/olive_tree.lua new file mode 100644 index 00000000..8b7f8909 --- /dev/null +++ b/mods/ethereal/schematics/olive_tree.lua @@ -0,0 +1,89 @@ + +local _ = {name = "air", param1 = 0} +local L = {name = "ethereal:olive_leaves", param1 = 255} +local t = {name = "ethereal:olive_trunk", param1 = 255} +local T = {name = "ethereal:olive_trunk", param1 = 255, force_place = true} +local o = {name = "ethereal:olive", param1 = 150} + +ethereal.olivetree = { + + size = {x = 8, y = 9, z = 7}, + + yslice_prob = { + {ypos = 2, prob = 127}, + }, + + data = { + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,L,_,_,_,_,L,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,L,_,L,L,o,_, + L,t,L,L,o,L,t,L, + _,L,_,_,_,_,L,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,t,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,L,t,L,_,t,L,_, + _,L,L,_,L,L,L,_, + _,_,_,L,L,_,_,_, + _,_,o,L,L,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,_,T,T,_,_,_, + _,_,L,t,t,_,_,_, + _,o,L,t,t,t,L,_, + _,L,L,t,t,L,o,_, + _,_,L,t,t,L,_,_, + _,_,L,t,t,L,_,_, + _,_,_,L,L,_,_,_, + + _,_,_,_,t,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,L,_,_,_, + _,_,L,t,L,L,_,_, + _,_,L,L,t,L,_,_, + _,_,_,L,L,L,_,_, + _,_,L,L,L,_,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,o,L,_,_,_,_, + _,L,t,L,L,o,_,_, + _,_,L,_,L,t,L,_, + _,_,o,_,_,L,_,_, + _,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + _,_,L,_,_,_,_,_, + _,_,_,_,_,L,_,_, + _,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/orange_tree.lua b/mods/ethereal/schematics/orange_tree.lua new file mode 100644 index 00000000..22269dcb --- /dev/null +++ b/mods/ethereal/schematics/orange_tree.lua @@ -0,0 +1,56 @@ + +local _ = {name = "air", param1 = 0} +local L = {name = "ethereal:orange_leaves", param1 = 255} +local l = {name = "ethereal:orange_leaves", param1 = 200} +local t = {name = "default:tree", param1 = 255} +local T = {name = "default:tree", param1 = 255, force_place = true} +local o = {name = "ethereal:orange", param1 = 200} + +ethereal.orangetree = { + + size = {x = 5, y = 7, z = 5}, + + data = { + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,L,_,_, + _,_,L,_,_, + _,_,_,_,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,o,L,o,_, + _,L,L,L,_, + _,_,L,_,_, + + _,_,T,_,_, + _,_,T,_,_, + _,_,T,_,_, + _,_,T,_,_, + L,L,T,L,L, + L,T,L,T,L, + _,L,L,L,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,o,L,o,_, + _,L,L,L,_, + _,_,L,_,_, + + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,_,_,_, + _,_,L,_,_, + _,_,L,_,_, + _,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/overgrown_tree.mts b/mods/ethereal/schematics/overgrown_tree.mts new file mode 100644 index 00000000..f78d1d63 Binary files /dev/null and b/mods/ethereal/schematics/overgrown_tree.mts differ diff --git a/mods/ethereal/schematics/palmtree.lua b/mods/ethereal/schematics/palmtree.lua new file mode 100644 index 00000000..e2ed3b30 --- /dev/null +++ b/mods/ethereal/schematics/palmtree.lua @@ -0,0 +1,129 @@ + +local _ = {name = "air", param = 0} +local L = {name = "ethereal:palmleaves", param = 255} +local l = {name = "ethereal:palmleaves", param = 191} +local T = {name = "ethereal:palm_trunk", param = 255} +local t = {name = "ethereal:palm_trunk", param = 191} +local M = {name = "ethereal:palm_trunk", param = 255, force_place = true} +local C = {name = "ethereal:coconut", param = 127, prob = 80} + +ethereal.palmtree = { + + size = {x = 9, y = 11, z = 9}, + + yslice_prob = { + {ypos = 3, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,l,_,_,_, + _,_,_,_,_,L,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,_,L,_,L,_, + _,_,_,_,_,L,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,C,_,_,_, + _,_,_,_,L,L,L,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,_,T,t,_,_,_, + _,_,_,_,_,T,_,_,_, + _,_,l,_,_,T,_,_,l, + _,_,L,L,C,T,C,L,L, + _,_,_,L,L,L,L,L,_, + _,_,_,_,_,L,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,C,_,_,_, + _,_,_,_,L,L,L,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,_,L,_,L,_, + _,_,_,_,_,L,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,l,_,_,_, + _,_,_,_,_,L,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/pinetree.lua b/mods/ethereal/schematics/pinetree.lua new file mode 100644 index 00000000..468dc5ff --- /dev/null +++ b/mods/ethereal/schematics/pinetree.lua @@ -0,0 +1,89 @@ + +local _ = {name = "air", prob = 0} +local L = {name = "ethereal:pineleaves", prob = 255} +local t = {name = "default:pinetree", prob = 255} +local T = {name = "default:pinetree", prob = 255, force_place = true} + +ethereal.pinetree = { + + size = {x = 7, y = 9, z = 7}, + + yslice_prob = { + {ypos = 1, prob = 127}, + {ypos = 5, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,L,L,L,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,L,L,L,L,L,_, + _,_,_,L,_,_,_, + _,_,L,L,L,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + _,_,L,T,L,_,_, + L,L,L,T,L,L,L, + _,_,L,t,L,_,_, + _,L,L,t,L,L,_, + _,_,L,t,L,_,_, + _,_,_,L,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,L,L,L,L,L,_, + _,_,_,L,_,_,_, + _,_,L,L,L,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,L,L,L,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,L,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/pond.lua b/mods/ethereal/schematics/pond.lua new file mode 100644 index 00000000..4ee39444 --- /dev/null +++ b/mods/ethereal/schematics/pond.lua @@ -0,0 +1,95 @@ + +local _ = {name = "air", param1 = 0} +local a = {name = "air", param1 = 255, force_place = true} +local w = {name = "default:river_water_source", param1 = 255, force_place = true} +local C = {name = "default:clay", param1 = 255, force_place = true} +local D = {name = "default:dirt", param1 = 255, force_place = true} +local M = {name = "default:mossycobble", param1 = 127, force_place = true} +local e = {name = "ethereal:bush2", param1 = 127, force_place = true} +local f = {name = "default:fern_1", param1 = 127, force_place = true} +local g = {name = "default:fern_2", param1 = 127, force_place = true} +local h = {name = "default:fern_3", param1 = 127, force_place = true} +local i = {name = "default:grass_4", param1 = 127, force_place = true} + + +ethereal.pond = { + + size = {x = 12, y = 4, z = 15}, + + data = { + + _,_,_,_,_,_,_,_,_,_,_,_, _,_,_,_,D,D,D,D,_,_,_,_, _,_,_,_,f,g,i,f,e,_,_,_, + _,_,_,_,a,a,a,a,_,_,_,_, + _,_,_,_,_,C,C,_,_,_,_,_, _,_,D,D,M,w,w,D,M,_,_,_, _,_,f,g,a,a,a,a,a,a,_,_, + _,_,a,a,a,a,a,a,a,_,_,_, + _,_,_,C,C,C,C,C,_,_,_,_, _,M,D,w,w,w,w,w,D,D,_,_, _,_,f,a,a,a,a,a,g,i,_,_, + _,a,a,a,a,a,a,a,a,a,_,_, + _,_,_,C,C,C,C,C,C,C,_,_, _,D,D,w,w,w,w,w,w,w,M,_, e,i,a,a,a,a,a,a,a,a,_,_, + a,a,a,a,a,a,a,a,a,a,a,_, + _,_,_,C,C,C,C,C,C,C,_,_, M,D,M,w,w,w,w,w,w,w,D,_, _,f,a,a,a,a,a,a,a,a,g,_, + a,a,a,a,a,a,a,a,a,a,a,_, + _,_,C,C,C,C,C,C,C,C,_,_, D,D,w,w,w,w,w,w,w,w,D,D, e,i,a,a,a,a,a,a,a,a,h,i, + a,a,a,a,a,a,a,a,a,a,a,a, + _,C,C,C,C,C,C,C,C,C,C,_, D,w,w,w,w,w,w,w,w,w,w,D, h,a,a,a,a,a,a,a,a,a,a,f, + a,a,a,a,a,a,a,a,a,a,a,a, + _,C,C,C,C,C,C,C,C,C,C,_, D,w,w,w,w,w,w,w,w,w,w,M, g,a,a,a,a,a,a,a,a,a,a,_, + a,a,a,a,a,a,a,a,a,a,a,a, + _,C,C,C,C,C,C,C,C,C,C,_, D,w,w,w,w,w,w,w,w,w,w,D, f,a,a,a,a,a,a,a,a,a,a,i, + a,a,a,a,a,a,a,a,a,a,a,a, + _,_,C,C,C,C,C,C,C,C,_,_, _,D,w,w,w,w,w,w,w,w,D,M, i,f,a,a,a,a,a,a,a,a,g,_, + a,a,a,a,a,a,a,a,a,a,a,a, + _,_,C,C,C,C,C,C,C,C,_,_, _,D,w,w,w,w,w,w,w,w,D,_, _,i,a,a,a,a,a,a,a,a,a,_, + _,a,a,a,a,a,a,a,a,a,a,_, + _,_,C,C,C,C,C,C,C,_,_,_, D,D,w,w,w,w,w,w,w,D,D,_, g,h,a,a,a,a,a,a,a,a,f,i, + a,a,a,a,a,a,a,a,a,a,a,_, + _,_,C,C,C,C,C,C,_,_,_,_, D,D,w,w,w,w,w,w,D,D,_,_, _,e,g,a,a,a,a,a,a,g,e,_, + a,a,a,a,a,a,a,a,a,a,_,_, + _,_,_,C,C,C,C,_,_,_,_,_, _,M,D,w,w,w,w,D,M,_,_,_, _,_,i,a,a,a,a,a,a,a,_,_, + _,a,a,a,a,a,a,a,a,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, _,_,D,D,D,D,D,D,D,_,_,_, _,_,e,f,i,g,g,i,h,_,_,_, + _,_,a,a,a,a,a,a,a,_,_,_, + + } +} + +minetest.register_node("ethereal:pond", { + paramtype = "light", + sunlight_propagetes = true, + walkable = false, pointable = false, diggable = false, floodable = false, + drawtype = "airlike", + drops = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, +}) + +local math_random = math.random +local replace_with = { + "air", "air", "air", "air", "default:dry_grass_2", "default:dry_shrub", + "default:grass_2", "default:fern_1", "air", "air", "default:dry_shrub"} + +minetest.register_abm({ + label = "Ethereal pond", + nodenames = {"ethereal:pond"}, + interval = 5, + chance = 1, + action = function(pos, node) + + minetest.swap_node(pos, {name = replace_with[math_random(#replace_with)]}) + + local radius = 7 + + pos.y = pos.y - 1 + + local num = #minetest.find_nodes_in_area( + {x = pos.x - radius, y = pos.y, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y, z = pos.z + radius}, "group:bakedclay") + + if num > 200 then + + pos.y = pos.y - 1 + + minetest.place_schematic(pos, ethereal.pond, "random", nil, false, + "place_center_x, place_center_z") + end + end +}) diff --git a/mods/ethereal/schematics/redwood_small_tree.lua b/mods/ethereal/schematics/redwood_small_tree.lua new file mode 100644 index 00000000..4a556c47 --- /dev/null +++ b/mods/ethereal/schematics/redwood_small_tree.lua @@ -0,0 +1,220 @@ + +local _ = {name = "air", prob = 0} +local t = {name = "ethereal:redwood_trunk", prob = 255} +local T = {name = "ethereal:redwood_trunk", prob = 255, force_place = true} +local L = {name = "ethereal:redwood_leaves", prob = 255} + +ethereal.redwood_small_tree = { + + size = {x = 9, y = 21, z = 9}, + + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 7, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,t,L,L, + _,_,_,_,_,L,L,L,_, + _,_,_,_,_,_,_,_,_, + _,L,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,t,_,_, + _,_,_,_,L,L,t,L,L, + _,_,_,_,_,L,L,L,_, + _,_,_,_,_,_,_,_,_, + L,L,L,L,L,L,_,_,_, + _,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,t,t,_,_, + _,_,_,_,_,L,L,_,L, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + L,L,t,t,L,L,_,_,_, + _,L,L,L,_,_,_,_,_, + _,_,_,_,L,_,_,_,_, + _,L,L,L,L,L,L,_,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,L,L, + _,_,_,_,t,_,_,_,L, + _,_,_,_,t,_,_,_,_, + _,L,L,t,t,_,_,_,_, + _,L,_,_,t,_,_,_,_, + _,_,_,L,t,L,_,_,_, + _,L,L,L,L,L,L,L,_, + _,L,L,L,L,L,L,L,_, + _,_,L,L,L,L,L,_,_, + _,_,_,_,L,_,_,_,_, + + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,t,t,t,t,t,t, + _,_,_,t,t,t,_,L,t, + _,_,_,t,t,t,_,_,L, + L,L,L,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,L,t,t,t,L,_,_, + _,L,L,L,t,L,L,L,_, + _,L,L,L,L,L,L,L,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,T,T,T,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,t,t,t,_,_,_, + _,_,_,t,t,_,_,_,L, + _,t,t,t,t,_,_,_,L, + L,L,L,_,t,_,_,_,_, + L,L,_,_,t,L,L,L,L, + _,_,_,_,t,_,_,_,_, + _,_,_,L,t,L,_,_,_, + _,L,L,L,L,L,L,L,_, + _,L,L,L,L,L,L,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,_,L,L,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,t,_,_,_,_,_,_,_, + t,t,L,L,t,t,t,_,_, + L,L,_,_,L,L,t,L,L, + _,_,_,_,_,L,L,L,_, + _,_,_,_,L,_,_,_,_, + _,_,L,L,L,L,L,_,_, + _,_,L,L,L,L,L,_,_, + _,_,_,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + L,L,L,L,_,_,_,_,_, + L,L,_,_,L,L,t,L,L, + _,_,_,_,_,L,L,L,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,L,L,_,_,_, + _,_,_,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + L,L,L,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,L, + _,_,_,_,_,_,L,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/redwood_tree.lua b/mods/ethereal/schematics/redwood_tree.lua new file mode 100644 index 00000000..742d1c18 --- /dev/null +++ b/mods/ethereal/schematics/redwood_tree.lua @@ -0,0 +1,534 @@ + +local _ = {name = "air", prob = 0} +local t = {name = "ethereal:redwood_trunk", prob = 255} +local T = {name = "ethereal:redwood_trunk", prob = 255, force_place = true} +local L = {name = "ethereal:redwood_leaves", prob = 255} + +ethereal.redwood_tree = { + + size = {x = 15, y = 33, z = 15}, + + yslice_prob = { + {ypos = 1, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 6, prob = 127}, + {ypos = 7, prob = 127}, + {ypos = 14, prob = 127}, + {ypos = 15, prob = 127}, + {ypos = 16, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,_,L,_,_,_,_,_,_, + _,_,_,_,L,L,L,t,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,t,L,L,_,_,_,_,_, + _,_,_,_,L,L,L,t,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,L,L,L,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,t,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,t,L,L,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,_,T,T,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,t,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,t,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,t,L,L,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,L,L,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,_,T,T,T,_,_,_,_,_,_, + _,_,_,_,_,_,T,T,T,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,t,t,_,_,_,_,_, + _,_,_,_,_,_,_,_,L,L,_,L,L,L,L, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,L,L,t,t,L,L,_,_,_,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,_,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,T,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,T,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + L,L,L,L,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,L,L,L,L,L, + _,_,_,_,_,_,_,t,_,_,_,L,L,L,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,L,L,t,t,_,_,_,_,_,_,_, + _,_,_,_,L,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,t,L,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,L,L,L,L,_,_,_,_, + _,_,_,_,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,L,_,_,_,_,_,_,_, + + _,_,_,_,T,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,T,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,T,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,t,t,t,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,L,L,L,L, + _,_,_,_,_,_,t,t,t,_,_,_,L,L,L, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,t,t,t,t,t,t,_,_,_,_,_,_, + L,L,L,L,L,_,t,t,t,_,_,_,_,_,_, + L,L,L,L,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,t,t,t,_,_,_, + _,_,_,_,_,_,t,t,t,_,L,t,t,t,L, + _,_,_,_,_,_,t,t,t,_,_,L,L,L,L, + _,_,L,L,L,L,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,L,t,t,t,L,_,_,_,_,_, + _,_,_,_,L,L,L,t,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,L,L,L,L,_,_,_,_, + _,_,_,_,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,_,_,_,_,_,_, + + _,_,_,_,T,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,T,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,T,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,t,t,_,_, + _,_,_,_,_,_,t,t,t,_,_,L,t,t,L, + _,_,_,_,_,_,t,t,t,_,_,_,L,L,L, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,t,_,_,t,t,t,_,_,_,_,_,_, + L,t,t,t,L,_,t,t,t,_,_,_,_,_,_, + L,L,L,L,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,_,_,_,L,L,L,L, + _,_,_,_,t,t,t,t,_,_,_,L,L,L,_, + _,L,L,L,L,L,_,t,_,_,_,_,_,_,_, + _,_,_,L,L,_,_,t,L,L,L,L,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,t,L,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,_,_,_,_,_,_, + + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,t,t,t,t,t,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,t,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,L,L,L,L, + _,_,_,_,_,_,_,_,_,_,_,_,L,L,L, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,t,t,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,L,_,_,_,_,_, + L,L,L,L,L,_,_,_,L,_,_,_,_,_,_, + L,L,L,L,_,_,t,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,L,L,L,L, + _,_,_,_,t,_,_,_,_,_,_,_,_,_,_, + _,L,L,t,t,L,L,t,t,t,_,_,_,_,_, + _,_,L,L,L,_,_,L,L,t,L,L,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,L,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,T,T,T,T,T,_,_,_,_,_, + _,_,_,_,_,_,T,T,T,_,_,_,_,_,_, + _,_,_,_,_,_,_,T,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,L,L,L,L, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,t,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,L,_,_,_,_,_, + L,L,L,L,_,_,_,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,t,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,L,L,L,L,L,L,_,_,_,_,_,_,_,_, + _,_,_,L,L,_,_,L,L,t,L,L,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,L,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,t,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,L,L,L,L,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,L,L,L,_,_,_, + _,_,_,_,_,_,_,_,_,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,t,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,t,L,L,_,_,_,_,_,_, + _,_,_,_,_,L,L,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,t,L,L,_,_,_,_,_,_, + _,_,_,_,_,L,L,L,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,L,L,L,L,L,_,_,_,_,_,_, + _,_,_,_,_,_,L,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/sakura.lua b/mods/ethereal/schematics/sakura.lua new file mode 100644 index 00000000..967d7765 --- /dev/null +++ b/mods/ethereal/schematics/sakura.lua @@ -0,0 +1,98 @@ + +local t = {name = "ethereal:sakura_trunk", param1 = 255} +local T = {name = "ethereal:sakura_trunk", param1 = 255, force_place = true} +local P = {name = "ethereal:sakura_leaves", param1 = 255} +local W = {name = "ethereal:sakura_leaves2", param1 = 255} +local _ = {name = "air", param1 = 255} + +ethereal.sakura_tree = { + + size = {x=9, y=10, z=7}, + + yslice_prob = { + {ypos = 1, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 8, prob = 127} + }, + + data = { + +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,P,P,_,_,_, +_,_,_,P,P,P,P,_,_, +_,_,_,P,P,P,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, + +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,P,P,P,P,_,_, +_,_,_,P,P,P,P,_,_, +_,_,P,P,t,P,P,P,_, +_,_,P,P,P,P,P,P,_, +_,_,P,_,P,P,P,P,_, +_,_,_,_,_,_,_,_,_, + +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,P,P,P,_,_,_, +_,_,P,P,P,P,P,P,_, +_,_,P,P,t,P,P,P,P, +_,P,P,P,P,P,P,P,P, +_,P,P,P,P,P,P,P,P, +_,P,P,P,P,P,P,P,P, +_,_,P,P,P,P,P,P,_, + +_,_,_,_,T,_,_,_,_, +_,_,_,_,T,_,_,_,_, +_,_,_,_,T,_,_,_,_, +_,_,P,P,T,t,P,_,_, +_,P,P,t,T,t,t,P,P, +_,P,P,t,_,t,P,t,P, +P,P,P,t,P,t,P,t,P, +P,P,t,P,P,P,P,t,P, +P,P,t,P,P,P,P,t,P, +_,P,P,P,P,P,P,P,P, + +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,P,_,P,_,_,_, +_,_,P,P,t,P,P,P,_, +_,_,P,P,_,P,P,P,P, +_,P,P,P,P,P,P,P,P, +_,P,P,P,P,P,P,P,P, +_,P,P,P,P,P,P,P,P, +_,_,P,P,P,P,P,P,_, + +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,P,_,_,_,_, +_,_,_,P,P,P,_,_,_, +_,_,_,P,t,P,_,_,_, +_,_,P,P,t,P,P,P,P, +_,_,P,P,P,P,P,P,P, +_,_,P,P,P,P,_,P,P, +_,_,_,_,P,_,_,_,_, + +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_, +_,_,_,_,P,_,_,_,_, +_,_,_,P,P,P,_,_,_, +_,_,_,P,P,P,_,_,_, +_,_,_,P,P,P,_,_,_, +_,_,_,_,P,_,_,_,_, +_,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/vinetree.lua b/mods/ethereal/schematics/vinetree.lua new file mode 100644 index 00000000..ad677f3f --- /dev/null +++ b/mods/ethereal/schematics/vinetree.lua @@ -0,0 +1,85 @@ + +local _ = {name = "air", prob = 0} +local T = {name = "default:tree", prob = 255} +local l = {name = "default:leaves", prob = 127} +local L = {name = "default:leaves", prob = 255} +local u = {name = "ethereal:vine", prob = 255, param2 = 2} +local U = {name = "ethereal:vine", prob = 255, param2 = 3} +local W = {name = "ethereal:vine", prob = 255, param2 = 4} +local w = {name = "ethereal:vine", prob = 255, param2 = 5} + +ethereal.vinetree = { + + size = {x = 7, y = 8, z = 7}, + + yslice_prob = { + {ypos = 0, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,W,_,W,_,_,_, + _,W,_,W,_,_,_, + _,W,_,W,_,_,_, + _,W,_,_,_,W,_, + _,W,_,_,_,W,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,L,_,l,_,L,_, + _,L,L,L,L,L,U, + _,L,L,L,L,L,U, + _,L,L,L,L,L,U, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,U, + _,_,_,_,_,_,U, + _,_,_,_,_,_,U, + _,L,T,_,T,L,U, + u,L,L,L,L,L,_, + _,L,L,L,L,L,_, + _,_,L,L,L,_,_, + + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + _,_,_,T,_,_,_, + u,l,_,T,_,l,_, + u,L,_,L,_,L,_, + u,L,L,L,L,L,_, + u,L,L,L,L,L,_, + _,_,L,L,L,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,U, + _,_,_,_,_,_,U, + _,L,T,_,T,L,U, + _,L,L,L,L,L,U, + _,L,L,L,L,L,_, + _,_,_,L,L,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + u,_,_,_,_,_,U, + u,L,_,l,_,L,U, + u,L,L,L,L,L,U, + u,L,L,L,L,L,_, + _,l,L,L,L,L,_, + _,_,_,_,_,_,_, + + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + _,_,w,_,_,_,_, + _,_,w,_,_,_,_, + _,_,w,w,_,_,_, + _,_,_,w,w,_,_, + _,_,_,_,_,_,_, + _,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/volcanol.lua b/mods/ethereal/schematics/volcanol.lua new file mode 100644 index 00000000..6cd27762 --- /dev/null +++ b/mods/ethereal/schematics/volcanol.lua @@ -0,0 +1,96 @@ + +local _ = {name = "air", prob = 0} +local d = {name = "ethereal:fiery_dirt", prob = 245} +local s = {name = "default:cobble", prob = 255} +local l = {name = "default:lava_source", prob = 255, force_place = true} +local f = {name = "default:lava_flowing", prob = 255} +local o = {name = "default:obsidian", prob = 215} + +ethereal.volcanol = { + + size = {x = 17, y = 4, z = 15}, + + yslice_prob = { + {ypos = 0, prob = 127}, + {ypos = 1, prob = 127}, + }, + + data = { + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,d,d,d,d,_,_,d,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,d,s,s,s,s,d,d,s,d,d,_,_,_,_, + _,_,_,_,s,s,s,s,_,_,s,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,d,s,o,o,o,o,s,s,o,s,s,d,_,_,_, + _,_,_,s,f,f,s,f,s,s,f,s,s,_,_,_,_, + _,_,_,_,s,s,_,s,_,_,s,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,d,s,o,s,s,s,s,o,o,s,o,o,s,d,_,_, + _,_,s,l,l,l,l,f,s,f,f,l,l,s,_,_,_, + _,_,_,s,f,f,s,s,o,s,o,s,s,_,_,_,_, + _,_,_,_,o,o,o,_,_,_,o,_,_,_,_,_,_, + + _,d,s,o,s,o,o,o,s,s,o,s,s,o,s,d,_, + _,_,s,f,l,l,l,l,l,l,l,l,l,l,s,_,_, + _,_,_,s,f,f,f,f,f,f,l,f,l,s,_,_,_, + _,_,_,_,o,_,_,o,o,o,_,o,o,_,_,_,_, + + _,d,s,o,s,o,s,s,o,o,s,o,s,o,s,d,_, + _,_,s,s,l,l,l,l,l,l,l,l,l,l,s,_,_, + _,_,_,_,o,f,f,f,f,f,f,f,l,s,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,o,_,_,_,_, + + _,_,d,s,o,s,o,s,s,s,s,o,s,o,s,d,_, + _,_,_,s,l,l,l,l,l,l,l,l,l,l,s,_,_, + _,_,_,s,f,f,f,f,f,f,f,f,l,s,_,_,_, + _,_,_,_,o,_,_,_,_,_,_,_,s,_,_,_,_, + + _,d,s,o,s,o,o,o,o,o,o,s,o,s,d,_,_, + _,_,s,l,l,l,l,l,l,l,l,l,l,s,_,_,_, + _,_,_,s,f,f,f,f,f,f,f,l,s,_,_,_,_, + _,_,_,_,o,_,_,_,_,_,_,_,o,_,_,_,_, + + _,d,s,o,s,s,s,s,s,s,o,s,o,s,d,_,_, + _,_,s,l,l,l,l,l,l,l,l,l,l,s,_,_,_, + _,_,_,s,f,f,f,f,l,l,f,l,s,_,_,_,_, + _,_,_,_,o,o,_,_,_,o,_,o,_,_,_,_,_, + + _,_,d,s,o,o,o,o,o,o,s,o,s,d,_,_,_, + _,_,_,s,s,l,f,f,f,f,l,l,s,_,_,_,_, + _,_,_,_,s,s,s,s,s,s,f,s,_,_,_,_,_, + _,_,_,_,_,s,o,o,o,_,s,_,_,_,_,_,_, + + _,_,_,d,s,s,s,s,s,s,o,s,d,_,_,_,_, + _,_,_,_,s,s,s,s,s,s,l,s,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,s,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,d,d,d,d,d,d,s,s,d,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,s,s,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,d,d,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/volcanom.lua b/mods/ethereal/schematics/volcanom.lua new file mode 100644 index 00000000..98e787d4 --- /dev/null +++ b/mods/ethereal/schematics/volcanom.lua @@ -0,0 +1,36 @@ + +local _ = {name = "air", prob = 0} +local l = {name = "default:lava_source", prob = 225, force_place = true} +local s = {name = "default:cobble", prob = 255} +local d = {name = "ethereal:fiery_dirt", prob = 255} + +ethereal.volcanom = { + + size = {x = 6, y = 2, z = 6}, + + yslice_prob = { + {ypos = 0, prob = 127} + }, + + data = { + + _,_,s,_,_,_, + _,_,_,_,_,_, + + _,s,l,s,_,_, + _,_,s,d,_,_, + + _,s,l,l,s,_, + _,s,_,_,s,_, + + s,l,l,l,s,_, + _,s,_,_,d,_, + + _,d,l,l,d,d, + _,_,s,d,_,_, + + _,_,d,d,d,_, + _,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/waterlily.lua b/mods/ethereal/schematics/waterlily.lua new file mode 100644 index 00000000..09391190 --- /dev/null +++ b/mods/ethereal/schematics/waterlily.lua @@ -0,0 +1,24 @@ + +-- waterlily + +ethereal.waterlily = { + + size = {x = 1, y = 3, z = 1}, + + data = { + {name = "default:sand", param1 = 255}, + {name = "default:water_source", param1 = 255}, + {name = "flowers:waterlily", param1 = 255}, + } +} + + +if ethereal.lilywalk == true then + + minetest.override_item("flowers:waterlily", {walkable = true}) + + if minetest.registered_nodes["flowers:waterlily_waving"] then + + minetest.override_item("flowers:waterlily_waving", {walkable = true}) + end +end diff --git a/mods/ethereal/schematics/willow.lua b/mods/ethereal/schematics/willow.lua new file mode 100644 index 00000000..e4bf0888 --- /dev/null +++ b/mods/ethereal/schematics/willow.lua @@ -0,0 +1,200 @@ + +local _ = {name = "air", prob = 0} +local L = {name = "ethereal:willow_twig", prob = 255} +local T = {name = "ethereal:willow_trunk", prob = 255} +local t = {name = "ethereal:willow_trunk", prob = 127} +local M = {name = "ethereal:willow_trunk", prob = 255, force_place = true} + +ethereal.willow = { + + size = {x = 12, y = 14, z = 12}, + + yslice_prob = { + {ypos = 0, prob = 127}, + {ypos = 1, prob = 127} + }, + + data = { + + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,_,_,_,_,_, + _,_,_,_,L,_,L,_,_,_,_,_, + _,_,_,_,L,L,L,L,_,_,_,_, + _,_,_,_,_,_,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,L,L,L,_,_,_, + _,_,L,L,L,L,T,L,L,_,_,_, + _,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,t,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,L,_,_,_,_,_,_,_,_, + _,_,_,L,_,L,_,L,_,_,_,_, + _,_,_,L,L,L,L,L,L,L,_,_, + _,_,L,L,L,T,T,L,L,_,_,_, + _,_,_,L,L,L,L,L,L,_,_,_, + _,_,_,L,L,L,L,L,L,_,_,_, + _,_,_,L,L,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,t,T,T,T,_,_,t,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,L,_,L,_,_,_,_,_,_,_,_, + _,L,L,L,L,L,L,_,L,L,L,_, + _,L,T,T,L,T,L,L,L,L,_,_, + _,_,L,L,L,L,L,L,L,L,_,_, + _,_,L,L,L,L,L,L,T,L,_,_, + _,_,L,L,L,L,L,L,L,_,_,_, + _,_,L,L,L,L,L,_,_,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_, + _,_,_,_,_,L,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,T,_,_,T,_,_,_, + _,_,_,_,_,T,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,L,_,_, + _,_,_,_,_,L,L,_,_,L,_,_, + _,_,L,L,_,L,L,L,L,L,L,_, + L,L,L,T,L,T,L,L,T,L,L,_, + _,L,L,L,L,L,L,L,L,L,L,_, + _,L,L,L,L,L,L,L,T,T,L,_, + _,L,L,L,L,L,L,L,L,L,L,_, + _,L,T,T,T,T,T,L,L,_,_,_, + _,_,L,L,L,L,L,L,_,_,_,_, + _,_,_,_,L,T,L,L,_,_,_,_, + _,_,_,_,_,L,_,_,_,_,_,_, + + _,_,_,_,_,M,M,M,M,t,_,_, + _,_,_,_,_,M,M,_,_,_,_,_, + _,_,_,_,_,M,M,_,_,_,_,_, + _,L,_,_,_,T,T,_,_,_,_,_, + _,L,L,_,_,T,_,_,_,L,L,_, + _,L,L,L,_,T,L,L,L,L,L,L, + L,L,L,T,L,T,T,T,T,T,L,_, + _,L,L,L,L,T,L,L,L,L,L,_, + _,_,L,L,L,T,T,T,T,L,L,_, + _,_,L,L,L,L,L,L,L,L,_,_, + _,_,L,T,L,T,T,L,L,_,_,_, + _,_,_,L,L,T,T,L,_,_,_,_, + _,_,_,L,L,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_, + + _,_,t,M,M,M,M,M,_,_,_,_, + _,_,_,_,_,M,M,M,_,_,_,_, + _,_,_,_,_,M,M,_,_,_,_,_, + _,_,_,_,_,T,T,_,_,_,_,_, + _,L,_,_,_,T,T,_,_,_,_,_, + L,L,L,L,L,T,T,T,L,L,L,L, + L,T,T,T,T,T,T,L,T,L,L,_, + _,L,L,L,L,L,T,L,L,L,L,_, + _,_,L,L,L,L,T,L,L,L,L,_, + _,_,_,L,_,L,T,L,L,_,_,_, + _,_,_,L,L,L,T,L,L,_,_,_, + _,_,_,L,L,L,L,L,L,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_, + + _,_,_,_,_,T,_,_,_,_,_,_, + _,_,_,_,_,T,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,L,_,_,_,_,_,_,_,_, + _,_,_,L,L,_,L,_,L,L,_,_, + _,L,L,L,L,L,L,_,L,L,L,_, + _,L,T,L,L,L,L,L,L,L,_,_, + _,L,L,L,L,L,T,L,L,L,_,_, + _,_,L,L,L,L,L,L,L,L,_,_, + _,_,L,L,L,L,T,L,L,L,_,_, + _,_,_,L,L,L,L,L,L,_,_,_, + _,_,_,L,L,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_, + + _,_,_,_,_,T,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,L,_,_,_,_,_,_,_,_,_, + _,L,L,_,_,L,L,_,L,L,L,_, + _,L,T,L,L,L,L,L,L,L,_,_, + _,_,L,_,L,L,T,L,L,L,_,_, + _,_,L,L,L,L,L,L,L,_,_,_, + _,_,_,_,L,L,T,T,L,_,_,_, + _,_,_,_,L,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,_,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,T,T,t,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,L,_,_,_,_, + _,_,_,_,L,_,_,L,_,L,_,_, + _,_,L,L,L,L,L,L,L,L,_,_, + _,_,L,L,L,L,T,L,L,_,_,_, + _,_,_,L,L,L,T,L,_,_,_,_, + _,_,_,_,L,L,L,L,_,_,_,_, + _,_,_,_,L,L,L,L,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,t,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,L,_,_,_,_,_,_,_,_, + _,_,_,L,_,_,_,_,_,_,_,_, + _,_,_,L,L,L,L,L,L,_,_,_, + _,_,_,L,L,L,T,L,_,_,_,_, + _,_,_,_,_,L,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,L,_,_,_,_,_, + _,_,_,_,_,L,L,_,_,_,_,_, + _,_,_,_,_,_,L,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schematics/yellowtree.lua b/mods/ethereal/schematics/yellowtree.lua new file mode 100644 index 00000000..4df35bcc --- /dev/null +++ b/mods/ethereal/schematics/yellowtree.lua @@ -0,0 +1,202 @@ + +local _ = {name = "air", prob = 0} +local T = {name = "ethereal:yellow_trunk", prob = 255} +local t = {name = "ethereal:yellow_trunk", prob = 127} +local M = {name = "ethereal:yellow_trunk", prob = 255, force_place = true} +local L = {name = "ethereal:yellowleaves", prob = 255} +local A = {name = "ethereal:golden_apple", prob = 115} + +ethereal.yellowtree = { + + size = {x = 9, y = 19, z = 9}, + + yslice_prob = { + {ypos = 1, prob = 254}, + {ypos = 3, prob = 254}, + {ypos = 5, prob = 254} + }, + + data = { + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,L,A,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,L,A,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,t,L,_,_,_, + _,_,_,_,L,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,_,L,L,_,_,_, + _,_,_,_,_,_,L,L,_, + _,_,_,L,_,_,_,_,_, + A,L,L,L,T,L,_,_,_, + _,_,_,_,_,L,_,_,_, + _,_,_,_,L,_,L,L,_, + _,_,L,L,L,_,_,_,_, + A,L,L,L,T,L,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,_,L,_,_,_,_, + + _,_,_,_,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,T,M,_,_,_,_, + _,_,_,_,M,_,_,_,_, + _,_,_,_,T,T,_,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,T,T,_,_,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,_,T,T,t,_,_, + _,_,_,_,T,_,T,T,L, + _,_,t,T,T,_,L,L,_, + L,T,T,_,T,_,_,_,_, + _,L,L,_,T,T,t,_,_, + _,_,_,_,T,L,T,T,L, + _,_,t,T,T,L,L,L,_, + L,T,T,L,T,L,_,_,_, + _,L,L,_,L,A,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,T,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,L,_,_,_, + _,_,_,_,T,L,L,L,A, + _,_,_,L,_,_,_,_,_, + _,L,L,_,_,_,_,_,_, + _,_,_,_,_,L,_,_,_, + _,_,_,L,T,L,L,L,A, + _,_,L,L,L,_,_,_,_, + _,L,L,_,L,_,_,_,_, + _,_,_,_,A,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,t,_,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,t,L,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,L,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,L,T,L,_,_,_, + _,_,_,_,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,A,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,A,L,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_, + + } +} diff --git a/mods/ethereal/schems.lua b/mods/ethereal/schems.lua new file mode 100644 index 00000000..87ae7ece --- /dev/null +++ b/mods/ethereal/schems.lua @@ -0,0 +1,953 @@ + +-- path to default and ethereal schematics + +local path = minetest.get_modpath("ethereal") .. "/schematics/" +local dpath = minetest.get_modpath("default") .. "/schematics/" + +-- load schematic tables + +dofile(path .. "orange_tree.lua") +dofile(path .. "banana_tree.lua") +dofile(path .. "bamboo_tree.lua") +dofile(path .. "birch_tree.lua") +dofile(path .. "bush.lua") +dofile(path .. "waterlily.lua") +dofile(path .. "volcanom.lua") +dofile(path .. "volcanol.lua") +dofile(path .. "frosttrees.lua") +dofile(path .. "palmtree.lua") +dofile(path .. "pinetree.lua") +dofile(path .. "yellowtree.lua") +dofile(path .. "mushroomone.lua") +dofile(path .. "mushroomtwo.lua") +dofile(path .. "willow.lua") +dofile(path .. "bigtree.lua") +dofile(path .. "redwood_tree.lua") +dofile(path .. "redwood_small_tree.lua") +dofile(path .. "vinetree.lua") +dofile(path .. "sakura.lua") +dofile(path .. "igloo.lua") +dofile(path .. "lemon_tree.lua") +dofile(path .. "olive_tree.lua") +dofile(path .. "basandra_bush.lua") +dofile(path .. "desertstone_spike.lua") +dofile(path .. "desertstone_under_spike.lua") +--dofile(path .. "pond.lua") + +-- register decoration helper + +local function register_decoration(enabled, def) + + if enabled ~= 1 then return end + + def.sidelen = def.sidelen or 80 -- some handy defaults + def.deco_type = def.deco_type or "schematic" + def.y_min = def.y_min or 1 + def.y_max = def.y_max or 31000 + def.flags = def.flags or "place_center_x, place_center_z" + def.rotation = def.rotation or "random" + + minetest.register_decoration(def) +end + +-- Special grass in jumble biome which must be place before schematics +register_decoration(ethereal.jumble, { + deco_type = "simple", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 8, + noise_params = { + offset = -0.3125, + scale = -1.25, + spread = {x = 150, y = 100, z = 150}, + seed = 330, + octaves = 3, + persist = 0.95 + }, + biomes = {"jumble"}, + decoration = "default:dirt_with_grass", + place_offset_y = -1, + flags = "force_placement" +}) + +register_decoration(ethereal.bamboo, { + name = "ethereal:small_sakura_tree", + deco_type = "schematic", + place_on = "ethereal:bamboo_dirt", + sidelen = 80, + fill_ratio = 0.00275, + biomes = {"bamboo"}, + y_min = 5, + y_max = 31000, + schematic = path.."cherry_tree_1.mts", + flags = "place_center_x,place_center_z", + rotation = "random", +}) + +register_decoration(ethereal.bamboo, { + name = "ethereal:large_sakura_tree", + deco_type = "schematic", + place_on = "ethereal:bamboo_dirt", + sidelen = 80, + fill_ratio = 0.000285, + biomes = {"bamboo"}, + y_min = 5, + y_max = 31000, + schematic = path.."cherry_tree_2.mts", + flags = "place_center_x,place_center_z", + replacements = { + ["cherry:cherry_tree"] = "ethereal:sakura_trunk", + ["cherry:cherry_leaves"] = "ethereal:sakura_leaves", + }, + rotation = "random", +}) + +if ethereal.bamboo == 1 then + local did_sakura = minetest.get_decoration_id('ethereal:large_sakura_tree') + minetest.set_gen_notify('decoration',{ did_sakura }) + did_sakura = 'decoration#' .. did_sakura + + minetest.register_on_generated(function(minp, maxp) + if maxp.y > 4 then + -- + -- Sakura Tree - fix light + -- + local gennotify = minetest.get_mapgen_object('gennotify') + for _, pos in ipairs(gennotify[did_sakura] or {}) do + minetest.after(0.2,function() minetest.fix_light(pos:offset(-9, -1, -9), pos:offset(9, 20, 9)) end) + end + end + end) + + minetest.register_abm({ + label = "Sakura petals", + nodenames = {"ethereal:sakura_leaves"}, + interval = 6, + chance = 25, + catch_up = false, + action = function(pos) + minetest.add_particlespawner({ + amount = 1, + time = 1, + minpos = {x = pos.x, y = pos.y, z = pos.z}, + maxpos = {x = pos.x, y = pos.y, z = pos.z}, + minvel = {x = -0.75, y = -0.4, z = -0.75}, + maxvel = {x = 0.75, y = -0.2, z = 0.75}, + minacc = {x = -0.2, y = -0.4, z = -0.2}, + maxacc = {x = 0.2, y = -0.1, z = 0.2}, + minexptime = 8, + maxexptime = 10, + minsize = 1.5, + maxsize = 1.75, + texture = "cherry_leaves_particul.png", + collisiondetection = true, + collision_removal = true, + vertical = false, + }) + end, + }) +end + +-- grove trees +for i,tree in ipairs({ + ethereal.bananatree, + ethereal.orangetree, + ethereal.lemontree, +}) do + register_decoration(ethereal.grove, { + deco_type = "schematic", + sidelen = 16, + place_on = {"ethereal:grove_dirt"}, + noise_params = { + offset = -0.005, + scale = 0.01125, + spread = {x = 100, y = 20, z = 100}, + seed = 8888 - i, + octaves = 1, + persistence = 0.75, + lacunarity = 0.9, + }, + y_max = 31000, + y_min = 5, + biomes = {"grove"}, + schematic = tree, + }) +end + +register_decoration(1, { + deco_type = "schematic", + sidelen = 16, + place_on = {"group:soil"}, + noise_params = { + offset = -0.005, + scale = 0.00875, + spread = {x = 100, y = 20, z = 100}, + seed = 76, + octaves = 1, + persistence = 0.75, + lacunarity = 0.9, + }, + y_max = 31000, + y_min = 48, + biomes = { + "frost", + "taiga", + "glacier", + }, + schematic = ethereal.yellowtree, + flags = "place_center_x,place_center_z", +}) + +-- old biome setting (when enabled old heat/humidity values are used) + +local old = minetest.settings:get_bool("ethereal.old_biomes") + +-- desertstone spike + +register_decoration(minetest.get_modpath("stairs") and ethereal.caves, { + place_on = "default:desert_stone", + sidelen = 16, fill_ratio = 0.01, y_min = 5, y_max = 42, + biomes = {"caves"}, + schematic = ethereal.desertstone_spike, + spawn_by = "default:desert_stone", num_spawn_by = 8, + flags = "place_center_x, place_center_z, force_placement", rotation = "random"}) + +-- desertstone under spike + +register_decoration(ethereal.caves, { + place_on = "default:stone", + sidelen = 16, fill_ratio = 0.01, y_min = 5, y_max = 42, + biomes = {"caves"}, + schematic = ethereal.desertstone_under_spike, + flags = "place_center_x, place_center_z, all_floors", rotation = "random"}) + +-- redwood tree + +register_decoration(ethereal.mesa, { + place_on = "default:dirt_with_dry_grass", + fill_ratio = 0.000625, + biomes = {"mesa"}, + schematic = ethereal.redwood_tree, + flags = "place_center_x, place_center_z", + spawn_by = "default:dirt_with_dry_grass", num_spawn_by = 8}) + +register_decoration(ethereal.mesa, { + place_on = "default:dirt_with_dry_grass", + fill_ratio = 0.000325, + biomes = {"mesa"}, + schematic = ethereal.redwood_small_tree, + flags = "place_center_x, place_center_z", + spawn_by = "default:dirt_with_dry_grass", num_spawn_by = 8}) + +-- igloo + +register_decoration(ethereal.glacier, { + place_on = "default:snowblock", + fill_ratio = 0.0005, y_min = 3, y_max = 30, + biomes = {"glacier"}, + schematic = ethereal.igloo, place_offset_y = -1, + spawn_by = "default:snowblock", num_spawn_by = 8, + flags = "place_center_x, place_center_z, force_placement", rotation = "random"}) + +-- crystal frost tree + +register_decoration(ethereal.frost, { + place_on = "ethereal:crystal_dirt", + fill_ratio = 0.01, y_min = 1, y_max = 1750, + biomes = {"frost", "frost_floatland"}, + schematic = ethereal.frosttrees, + spawn_by = "ethereal:crystal_dirt", num_spawn_by = 8}) + +-- giant red mushroom + +register_decoration(ethereal.mushroom, { + place_on = "ethereal:mushroom_dirt", + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.0075, + spread = {x = 100, y = 100, z = 100}, + seed = 328, + octaves = 2, + persist = 0.6 + }, + biomes = {"mushroom"}, + schematic = ethereal.mushroomone, + spawn_by = "ethereal:mushroom_dirt", num_spawn_by = 8}) + +register_decoration(ethereal.jumble, { + place_on = "default:dirt_with_rainforest_litter", + fill_ratio = 0.000275, + biomes = {"jumble"}, + schematic = ethereal.mushroomone, + spawn_by = "default:dirt_with_rainforest_litter", num_spawn_by = 8, + rotation = "random"}) + +-- giant brown mushroom + +register_decoration(ethereal.mushroom, { + place_on = "ethereal:mushroom_dirt", + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.0075, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 2, + persist = 0.9 + }, + biomes = {"mushroom"}, + schematic = ethereal.mushroomtwo, + spawn_by = "ethereal:mushroom_dirt", num_spawn_by = 6, + rotation = "random"}) + +register_decoration(ethereal.jumble, { + place_on = "default:dirt_with_rainforest_litter", + fill_ratio = 0.0001, + biomes = {"jumble"}, + schematic = ethereal.mushroomtwo, + spawn_by = "default:dirt_with_rainforest_litter", num_spawn_by = 8, + rotation = "random"}) + +-- small lava crater + +register_decoration(ethereal.fiery, { + place_on = "ethereal:fiery_dirt", + fill_ratio = 0.00275, + biomes = {"fiery"}, + schematic = ethereal.volcanom, + spawn_by = "ethereal:fiery_dirt", num_spawn_by = 8}) + +-- large lava crater + +register_decoration(ethereal.fiery, { + place_on = "ethereal:fiery_dirt", + fill_ratio = 0.00125, + biomes = {"fiery"}, + schematic = ethereal.volcanol, + spawn_by = "ethereal:fiery_dirt", num_spawn_by = 8, + rotation = "random"}) + +-- basandra bush + +register_decoration(ethereal.fiery, { + place_on = "ethereal:fiery_dirt", + fill_ratio = 0.03, + biomes = {"fiery"}, + schematic = ethereal.basandrabush}) + +-- default jungle tree + +register_decoration(ethereal.junglee, { + place_on = "default:dirt_with_rainforest_litter", + fill_ratio = 0.08, + biomes = {"rainforest"}, + schematic = dpath .. "jungle_tree.mts"}) + +-- special silver sand terrain for grayness which must be placed before trees +register_decoration(ethereal.grayness, { + name = node, + deco_type = "simple", + sidelen = 16, + place_on = {"ethereal:gray_dirt"}, + noise_params = { + offset = -0.25, + scale = 3, + spread = {x = 100, y = 100, z = 100}, + seed = 666, + octaves = 3, + persist = 0.6, + lacunarity = 1.2, + }, + y_max = 31000, + y_min = 1, + biomes = {"grayness"}, + decoration = "default:silver_sand", + place_offset_y = -1, + flags = "force_placement", +}) + +-- willow tree + +register_decoration(ethereal.grayness, { + place_on = "ethereal:gray_dirt", + fill_ratio = 0.015, + biomes = {"grayness"}, + schematic = ethereal.willow, + spawn_by = "ethereal:gray_dirt", num_spawn_by = 6}) + +-- small pine tree for shore elevation +register_decoration(ethereal.snowy, { + place_on = {"default:dirt_with_coniferous_litter"}, + fill_ratio = 0.025, y_min = 3, y_max = 9, + biomes = {"coniferous_forest"}, + schematic = dpath .. "small_pine_tree.mts"}) -- ethereal.pinetree + +-- small pine tree for lower elevation +register_decoration(ethereal.snowy, { + place_on = {"default:dirt_with_coniferous_litter"}, + fill_ratio = 0.03, y_min = 10, y_max = 48, + biomes = {"coniferous_forest"}, + schematic = dpath .. "small_pine_tree.mts"}) -- ethereal.pinetree + +-- default large pine tree for lower elevation +register_decoration(ethereal.snowy, { + place_on = {"default:dirt_with_coniferous_litter"}, + fill_ratio = 0.03, y_min = 10, y_max = 48, + biomes = {"coniferous_forest"}, + schematic = dpath .. "pine_tree.mts"}) + +-- small pine for higher elevation +register_decoration(ethereal.snowy, { + place_on = {"default:dirt_with_snow"}, + fill_ratio = 0.03, y_min = 48, y_max = 31000, + biomes = {"taiga"}, + schematic = dpath .. "snowy_small_pine_tree_from_sapling.mts"}) -- ethereal.pinetree + +register_decoration(ethereal.snowy, { + place_on = {"default:dirt_with_snow"}, + fill_ratio = 0.03, y_min = 48, y_max = 31000, + biomes = {"taiga"}, + schematic = dpath .. "snowy_pine_tree_from_sapling.mts"}) + +-- default apple tree +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + fill_ratio = 0.0005, + biomes = {"jumble"}, + schematic = dpath.."apple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 6, +}) + +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + fill_ratio = 0.000275, + biomes = {"jumble"}, + schematic = path.."gaunt_tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 5, +}) + +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + fill_ratio = 0.0005, + biomes = {"jumble"}, + schematic = path.."gaunt_tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 5, +}) + +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + fill_ratio = 0.0005, + biomes = {"jumble"}, + schematic = path.."gaunt_tree_3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 5, +}) + +-- deciduous forest trees +register_decoration(ethereal.grassy, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.0175, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = path.."meadow_tree_1.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +register_decoration(ethereal.grassy, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.0025, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = path.."meadow_tree_2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +register_decoration(ethereal.grassy, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00275, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = dpath.."apple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- big old tree +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass","default:dirt_with_rainforest_litter"}, + place_offset_y = 1, + fill_ratio = 0.00225, + biomes = {"jumble"}, + schematic = path.."overgrown_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 6, +}) + +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass","default:dirt_with_rainforest_litter"}, + place_offset_y = 1, + fill_ratio = 0.00275, + biomes = {"jumble"}, + schematic = ethereal.bigtree, + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 6, +}) + +-- default aspen tree +register_decoration(ethereal.grassytwo, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + fill_ratio = 0.0025, + y_min = 1, + y_max = 50, + biomes = {"grassytwo"}, + schematic = dpath.."aspen_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- birch tree +register_decoration(ethereal.grassytwo, { + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + fill_ratio = 0.0025, + y_min = 51, + y_max = 31000, + biomes = {"grassytwo"}, + schematic = ethereal.birchtree, + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- orange tree + +register_decoration(ethereal.prairie, { + place_on = "ethereal:prairie_dirt", + fill_ratio = 0.01, + biomes = {"prairie"}, + schematic = ethereal.orangetree}) + +-- default acacia tree + +register_decoration(ethereal.savanna, { + place_on = {"default:dry_dirt_with_dry_grass", "default:dirt_with_dry_grass"}, + fill_ratio = 0.004, + biomes = {"savanna"}, + schematic = dpath .. "acacia_tree.mts"}) + + +-- palm tree + +register_decoration(1, { + place_on = "default:sand", + noise_params = { + offset = 0, + scale = 0.005, + spread = {x = 100, y = 20, z = 100}, + seed = 4444333221, + octaves = 1, + persist = 1.0 + }, y_min = 1, y_max = 3, + biomes = {"desert_shore", "naturalbiomes:mediterranean_shore", "sandstone_desert_shore", + "grove_shore"}, + schematic = ethereal.palmtree}) + +-- bamboo tree + +register_decoration(ethereal.bamboo, { + place_on = "ethereal:bamboo_dirt", + fill_ratio = 0.0025, + biomes = {"bamboo"}, + place_offset_y = 1, + schematic = ethereal.bambootree}) + +-- vine tree + +register_decoration(ethereal.swamp, { + place_on = "default:dirt_with_grass", + fill_ratio = 0.0175, + biomes = {"swamp"}, + schematic = ethereal.vinetree}) + +-- lemon tree + +register_decoration(ethereal.mediterranean, { + place_on = "ethereal:grove_dirt", + fill_ratio = 0.004, y_min = 5, y_max = 50, + biomes = {"mediterranean"}, + schematic = ethereal.lemontree}) + +-- olive tree + +register_decoration(ethereal.mediterranean, { + place_on = "ethereal:grove_dirt", + fill_ratio = 0.004, y_min = 5, y_max = 45, + biomes = {"mediterranean"}, + schematic = ethereal.olivetree}) + +-- default large cactus +register_decoration(ethereal.desert, { + deco_type = "schematic", + place_on = { + "default:desert_sand", + "default:sand", + }, + sidelen = 80, + noise_params = { + offset = -0.0001, + scale = 0.0005, + spread = {x = 100, y = 100, z = 100}, + seed = 230, + octaves = 1, + persist = 0.6 + }, + biomes = { + "desert", + "sandstone_desert", + }, + y_min = 5, + y_max = 31000, + schematic = dpath .. "large_cactus.mts", + flags = "place_center_x", + rotation = "random", +}) + +-- default bush + +register_decoration(1, { + place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest", "grassytwo"}, + y_min = 1, + y_max = 31000, + schematic = dpath .. "bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random" +}) + +-- extra bushes for jumble biome +register_decoration(ethereal.jumble, { + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 3, + sidelen = 16, + noise_params = { + offset = 0.0125, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 34343, + octaves = 2, + persist = 0.6, + }, + biomes = {"jumble"}, + y_min = 1, + y_max = 31000, + schematic = dpath .. "bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random" +}) + +-- default tropical bush +register_decoration(1, { + deco_type = "schematic", + place_on = {"ethereal:grove_dirt", "default:dirt_with_rainforest_litter"}, + replacements = {["default:bush_leaves"] = "default:jungleleaves"}, + --sidelen = 16, + noise_params = { + offset = 0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.5 + }, + biomes = {"grove", "rainforest"}, + y_min = 1, + y_max = 31000, + schematic = dpath .. "bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random" +}) + + +-- default acacia bush +register_decoration(1, { + deco_type = "schematic", + place_on = { + "default:dirt_with_dry_grass", + "default:dry_dirt_with_dry_grass", + "naturalbiomes:savannalitter" + }, + sidelen = 16, + noise_params = { + offset = -0.00525, + scale = 0.0125, + spread = {x = 7, y = 7, z = 7}, + seed = 90155, + octaves = 2, + persist = 0.8, + lacunarity = 1.5, + }, + biomes = {"mesa","savanna"}, + y_min = 1, + y_max = 31000, + schematic = dpath .. "acacia_bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random" +}) + + +-- default pine bush + +register_decoration((minetest.registered_nodes["default:pine_bush"] and 1), { + name = "default:pine_bush", + place_on = {"default:dirt_with_snow", "default:cold_dirt"}, + sidelen = 16, y_min = 4, y_max = 120, + noise_params = { + offset = -0.004, scale = 0.01, spread = {x = 100, y = 100, z = 100}, + seed = 137, octaves = 3, persist = 0.7}, + biomes = {"taiga", "snowy_grassland"}, + schematic = dpath .. "pine_bush.mts"}) + +-- default blueberry bush + +register_decoration((minetest.registered_nodes["default:blueberry_bush_leaves"] and 1), { + name = "default:blueberry_bush", + deco_type = "schematic", + place_on = { + "default:dirt_with_coniferous_litter", "default:dirt_with_snow", "ethereal:grove_dirt"}, + sidelen = 16, + fill_ratio = 0.00075, + biomes = {"coniferous_forest", "taiga", "grove"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = dpath .. "blueberry_bush.mts", + flags = "place_center_x, place_center_z", + rotation = "random" +}) + +-- place waterlily in beach areas + +local sandy_biomes = {} +local desert_biomes = { + desert = true, + sandstone_desert = true, + desert_shore = true, + sandstone_desert_shore = true, + desert_below = true, + sandstone_desert_below = true, +} +for biome,def in pairs(asuna.biomes) do + if def.shore == "default:sand" and + (def.ocean == "temperate" or def.ocean == "tropical") and + not desert_biomes[biome] + then + table.insert(sandy_biomes,biome) + end +end + +register_decoration(1, { + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = sandy_biomes, + y_min = 0, + y_max = 0, + schematic = ethereal.waterlily, + rotation = "random" +}) + +-- coral reef + +if ethereal.reefs == 1 then + + -- override corals so crystal shovel can pick them up intact + minetest.override_item("default:coral_skeleton", {groups = {crumbly = 3}}) + minetest.override_item("default:coral_orange", {groups = {crumbly = 3}}) + minetest.override_item("default:coral_brown", {groups = {crumbly = 3}}) + + --[[register_decoration(1, { + deco_type = "schematic", + place_on = {"default:sand"}, + noise_params = { + offset = -0.15, scale = 0.1, spread = {x = 100, y = 100, z = 100}, + seed = 7013, octaves = 3, persist = 1}, + biomes = {"desert_ocean", "grove_ocean"}, + y_min = -8, y_max = -2, + schematic = path .. "corals.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + })]] +end + +-- tree logs + +if ethereal.logs == 1 then + + register_decoration(ethereal.prairie, { + name = "default:apple_log", + place_on = {"default:dirt_with_grass", "ethereal:prairie_dirt"}, + sidelen = 16, fill_ratio = 0.001, + biomes = {"deciduous_forest", "jumble", "swamp", "prairie"}, + schematic = dpath .. "apple_log.mts", place_offset_y = 1, + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_grass", "ethereal:prairie_dirt"}, num_spawn_by = 8}) + + register_decoration(ethereal.junglee, { + name = "default:jungle_log", + place_on = {"default:dirt_with_rainforest_litter"}, + fill_ratio = 0.005, + biomes = {"rainforest"}, + schematic = dpath .. "jungle_log.mts", place_offset_y = 1, + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", num_spawn_by = 8}) + + register_decoration(ethereal.snowy, { + name = "default:pine_log", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + fill_ratio = 0.0018, y_min = 4, y_max = 100, + biomes = {"taiga", "coniferous_forest"}, + schematic = dpath .. "pine_log.mts", place_offset_y = 1, + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + num_spawn_by = 8}) + + register_decoration(ethereal.savanna, { + name = "default:acacia_log", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = 0, scale = 0.001, spread = {x = 250, y = 250, z = 250}, + seed = 2, octaves = 3, persist = 0.66}, + biomes = {"savanna"}, + schematic = dpath .. "acacia_log.mts", place_offset_y = 1, + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dry_dirt_with_dry_grass", num_spawn_by = 8}) + + register_decoration(ethereal.plains, { + name = "ethereal:scorched_log", + place_on = {"ethereal:dry_dirt"}, + fill_ratio = 0.0018, y_min = 4, y_max = 100, + biomes = {"plains"}, + schematic = { + size = {x = 3, y = 1, z = 1}, + data = { + {name = "ethereal:scorched_tree", param1 = 201, param2 = 16}, + {name = "ethereal:scorched_tree", param1 = 255, param2 = 16}, + {name = "ethereal:scorched_tree", param1 = 255, param2 = 16} + } + }, place_offset_y = 1, + flags = "place_center_x", + rotation = "random", + spawn_by = "ethereal:dry_dirt", num_spawn_by = 8}) + + register_decoration(ethereal.grove, { + name = "ethereal:banana_log", + place_on = {"ethereal:grove_dirt"}, + fill_ratio = 0.0018, y_min = 4, y_max = 100, + biomes = {"grove"}, + schematic = { + size = {x = 3, y = 1, z = 1}, + data = { + {name = "ethereal:banana_trunk", param1 = 255, param2 = 16}, + {name = "ethereal:banana_trunk", param1 = 255, param2 = 16}, + {name = "ethereal:banana_trunk", param1 = 201, param2 = 16} + } + }, place_offset_y = 1, + flags = "place_center_x", + rotation = "random", + spawn_by = "ethereal:grove_dirt", num_spawn_by = 8}) +end + +-- deep see fumerole / vent + +register_decoration(minetest.get_modpath("nether") and 1, { + name = "nether:fumarole", + place_on = {"default:sand"}, + sidelen = 16, y_min = -192, y_max = -45, + fill_ratio = 0.0001, + schematic = { + size = {x = 1, y = 2, z = 2}, + data = { + {name = "default:lava_source", param1 = 255, force_place = true}, + {name = "nether:fumarole", param1 = 255, force_place = true}, + {name = "default:sand", param1 = 192, force_place = true}, + {name = "ethereal:sandy", param1 = 192, force_place = true}, + } + }, + place_offset_y = -1, + spawn_by = {"default:water_source"}, num_spawn_by = 8}) + +if minetest.get_modpath("nether") then + + minetest.register_lbm({ + name = ":nether:extra_fumarole_timer", + nodenames = {"nether:fumarole"}, + run_at_every_load = false, + + action = function(pos) minetest.get_node_timer(pos):start(10) end + }) +end diff --git a/mods/ethereal/screenshot.jpg b/mods/ethereal/screenshot.jpg new file mode 100644 index 00000000..269c417b Binary files /dev/null and b/mods/ethereal/screenshot.jpg differ diff --git a/mods/ethereal/sealife.lua b/mods/ethereal/sealife.lua new file mode 100644 index 00000000..b5b142de --- /dev/null +++ b/mods/ethereal/sealife.lua @@ -0,0 +1,455 @@ + +local S = minetest.get_translator("ethereal") + +-- local math functions + +local math_floor, math_max, math_random = math.floor, math.max, math.random +-- Seaweed + +minetest.register_node("ethereal:seaweed", { + description = S("Seaweed"), + drawtype = "plantlike", + tiles = {"ethereal_seaweed.png"}, + inventory_image = "ethereal_seaweed.png", + wield_image = "ethereal_seaweed.png", + paramtype = "light", + walkable = false, + climbable = true, + drowning = 1, + selection_box = { + type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + post_effect_color = {a = 64, r = 100, g = 100, b = 200}, + groups = {food_seaweed = 1, snappy = 3}, + on_use = minetest.item_eat(1), + sounds = default.node_sound_leaves_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + + local pname = placer:get_player_name() + local pos = pointed_thing.above + local pos_up = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_down = {x = pos.x, y = pos.y - 1, z = pos.z} + local def_up = minetest.registered_nodes[minetest.get_node(pos_up).name] or {} + local def_down = minetest.registered_nodes[minetest.get_node(pos_down).name] or {} + + if def_up.liquidtype == nil or def_up.liquidtype ~= "none" then + + if minetest.is_protected(pos, pname) then return end + + if def_down.name ~= "default:sand" and def_down.name ~= "ethereal:sandy" then + return + end + + if minetest.get_node(pos_up).name == "default:water_source" then + + minetest.set_node(pos_down, {name = "ethereal:seaweed_rooted", + param2 = 16}) + + if not ethereal.check_creative(pname) then + itemstack:take_item() + end + end + + return itemstack + end + + return minetest.item_place_node(itemstack, placer, pointed_thing) + end +}) + +ethereal.add_eatable("ethereal:seaweed", 1) + +-- seaweed rooted in sand + +minetest.register_node("ethereal:seaweed_rooted", { + description = S("Seaweed"), + drop = "ethereal:seaweed", + drawtype = "plantlike_rooted", + tiles = {"default_sand.png"}, + special_tiles = {{name = "ethereal_seaweed.png", tileable_vertical = true}}, + inventory_image = "ethereal_seaweed.png", + wield_image = "ethereal_seaweed.png", + paramtype = "light", + paramtype2 = "leveled", + light_source = 3, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + post_effect_color = {a = 64, r = 100, g = 100, b = 200}, + groups = {food_seaweed = 1, snappy = 3, flammable = 3, not_in_creative_inventory = 1}, + on_use = minetest.item_eat(1), + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + minetest.set_node(pos, {name = "default:sand"}) + end, + + on_place = function(itemstack, placer, pointed_thing) -- do not place rooted seaweed + return itemstack + end, + + on_dig = function(pos, node, digger) + + local p2 = node.param2 or 16 + local num = math_max(1, math_floor(p2 / 16)) + local inv = digger and digger:get_inventory() + + if not inv then return end + + local stack = ItemStack("ethereal:seaweed " .. tonumber(num)) + local leftover = inv:add_item("main", stack) + local count = leftover:get_count() + + minetest.set_node(pos, {name = "default:sand"}) + + if count > 0 then + pos.y = pos.y + 1 + minetest.add_item(pos, "ethereal:seaweed " .. tonumber(count)) + end + end +}) + +-- update old style seaweed nodes to new + +minetest.register_lbm({ + label = "[ethereal] Upgrade seaweed", + name = "ethereal:upgrade_seaweed", + nodenames = {"ethereal:seaweed"}, + run_at_every_load = false, + + action = function(pos, node) + + local pos_up = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_down = {x = pos.x, y = pos.y - 1, z = pos.z} + local def_up = minetest.registered_nodes[minetest.get_node(pos_up).name] or {} + local def_down = minetest.registered_nodes[minetest.get_node(pos_down).name] or {} + + if def_down.name == "default:sand" or def_down.name == "ethereal:sandy" then + + local height = 0 + + while height < 14 and minetest.get_node(pos_up).name == "ethereal:seaweed" do + minetest.remove_node(pos_up) + height = height + 1 + pos_up.y = pos_up.y + 1 + end + + minetest.remove_node(pos) + + minetest.set_node(pos_down, {name = "ethereal:seaweed_rooted", + param2 = (height + 1) * 16}) + end + end +}) + +-- seaweed to dark green dye + +minetest.register_craft( { + output = "dye:dark_green 3", + recipe = {{"ethereal:seaweed"}} +}) + + +-- coral on_place helper function + +local coral_nodes = {} + +local function register_coral(name, description, texture) + + local function plantlike_on_place(itemstack, placer, pointed_thing) + + local pname = placer:get_player_name() + local pos = pointed_thing.above + local pos_up = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_down = {x = pos.x, y = pos.y - 1, z = pos.z} + local def_up = minetest.registered_nodes[minetest.get_node(pos_up).name] or {} + local def_down = minetest.registered_nodes[minetest.get_node(pos_down).name] or {} + + if def_up.liquidtype == nil or def_up.liquidtype ~= "none" then + + if minetest.is_protected(pos, pname) then return end + + if def_down.name ~= "default:sand"and def_down.name ~= "ethereal:sandy" then + return + end + + minetest.set_node(pos_down, {name = "ethereal:" .. name .. "_rooted"}) + + if not ethereal.check_creative(pname) then + itemstack:take_item() + end + + return itemstack + end + + return minetest.item_place_node(itemstack, placer, pointed_thing) + end + + local function rooted_on_dig(pos, node, digger) + + local res = minetest.node_dig(pos, node, digger) + + if res == true then + minetest.set_node(pos, {name = "default:sand"}) + end + + return res + end + + -- decorative coral node + minetest.register_node("ethereal:" .. name, { + description = description, + drawtype = "plantlike", + tiles = {texture}, + inventory_image = texture, + wield_image = texture, + paramtype = "light", + selection_box = { + type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 1 / 4, 6 / 16} + }, + light_source = 3, + groups = {snappy = 3}, + sounds = default.node_sound_leaves_defaults(), + on_place = plantlike_on_place + }) + + -- coral node rooted in sand + minetest.register_node("ethereal:" .. name .. "_rooted", { + description = description, + drop = "ethereal:" .. name, + drawtype = "plantlike_rooted", + tiles = {"default_sand.png"}, + special_tiles = {{name = texture, tileable_vertical = true}}, + inventory_image = texture, + wield_image = texture, + paramtype = "light", + selection_box = { + type = "fixed", fixed = {-6 / 16, 0.5, -6 / 16, 6 / 16, 1.25, 6 / 16} + }, + light_source = 3, + groups = {snappy = 3, not_in_creative_inventory = 1}, + sounds = default.node_sound_leaves_defaults(), + on_dig = rooted_on_dig + }) + + table.insert(coral_nodes, "ethereal:" .. name) +end + +-- update old style coral to new + +minetest.register_lbm({ + label = "[ethereal] Upgrade corals", + name = "ethereal:upgrade_corals", + nodenames = coral_nodes, + run_at_every_load = false, + + action = function(pos, node) + + local pos_up = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_down = {x = pos.x, y = pos.y - 1, z = pos.z} + local def_up = minetest.registered_nodes[minetest.get_node(pos_up).name] or {} + local def_down = minetest.registered_nodes[minetest.get_node(pos_down).name] or {} + + if (def_up.liquidtype == nil or def_up.liquidtype ~= "none") + and (def_down.name == "default:sand" or def_down.name == "ethereal:sandy") then + + minetest.set_node(pos_down, {name = node.name .. "_rooted"}) + + minetest.remove_node(pos) + end + end +}) + +-- Blua Coral + +register_coral("coral2", S("Blue Glow Coral"), "ethereal_coral_blue.png") + +minetest.register_craft({output = "dye:cyan 3", recipe = {{"ethereal:coral2"}}}) + +-- Orange Coral + +register_coral("coral3", S("Orange Glow Coral"), "ethereal_coral_orange.png") + +minetest.register_craft({output = "dye:orange 3", recipe = {{"ethereal:coral3"}}}) + +-- Pink Coral + +register_coral("coral4", S("Pink Glow Coral"), "ethereal_coral_pink.png") + +minetest.register_craft({output = "dye:pink 3", recipe = {{"ethereal:coral4"}}}) + +-- Green Coral + +register_coral("coral5", S("Green Glow Coral"), "ethereal_coral_green.png") + +minetest.register_craft({output = "dye:green 3", recipe = {{"ethereal:coral5"}}}) + +-- Undersea Sand (used for growing seaweed and corals) + +minetest.register_node("ethereal:sandy", { + description = S("Sandy"), + tiles = {"default_sand.png"}, + is_ground_content = true, + groups = { + crumbly = 3, falling_node = 1, sand = 1, not_in_creative_inventory = 1 + }, + drop = "default:sand", + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_craft({ + output = "ethereal:sandy", + recipe = { + {"ethereal:slime_mold", "ethereal:slime_mold", "ethereal:slime_mold"}, + {"ethereal:slime_mold", "group:sand", "ethereal:slime_mold"}, + {"ethereal:slime_mold", "ethereal:slime_mold", "ethereal:slime_mold"}, + } +}) + +-- randomly generate coral or seaweed and have seaweed grow up to 14 high + +if ethereal.sealife == 1 then + + minetest.register_abm({ + label = "Grow coral/seaweed", + nodenames = {"ethereal:sandy", "ethereal:seaweed_rooted"}, + neighbors = {"group:water"}, + interval = 15, + chance = 10, + catch_up = false, + + action = function(pos, node) + + -- grow new seaweed using param2 values + if node.name == "ethereal:seaweed_rooted" then + + local p2 = node.param2 or 16 + local height = math_max(1, math_floor(p2 / 16)) + + if height > 13 then return end + + height = height + 1 + + local tpos = {x = pos.x, y = pos.y + height + 1, z = pos.z} + + if minetest.get_node(tpos).name ~= "default:water_source" then + return + end + + minetest.set_node(pos, {name = "ethereal:seaweed_rooted", + param2 = (height * 16)}) + + return + end + + local sel = math_random(6) + local pos_up = {x = pos.x, y = pos.y + 1, z = pos.z} + local nod = minetest.get_node(pos_up).name + + if nod == "default:water_source" then + + if sel == 1 then + + local height = math_random(6) + + minetest.set_node(pos, {name = "ethereal:seaweed_rooted", + param2 = (height * 16)}) + + elseif sel == 6 then + + minetest.set_node(pos_up, {name = "ethereal:sponge_wet"}) + + elseif sel > 1 then + + minetest.set_node(pos, {name = "ethereal:coral" .. sel .. "_rooted"}) + end + end + end + }) +end + +-- sponge nodes (place dry sponge to suck up all water surrounding it, cook to dry) + +minetest.register_node("ethereal:sponge_air", { + drawtype = "airlike", + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + pointable = false, + drop = "", + groups = {not_in_creative_inventory = 1} +}) + +minetest.register_node("ethereal:sponge_wet", { + description = S("Wet sponge"), + tiles = {"ethereal_sponge_wet.png"}, + groups = {crumbly = 3}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("ethereal:sponge", { + description = S("Sponge"), + tiles = {"ethereal_sponge.png"}, + groups = {crumbly = 3}, + sounds = default.node_sound_sand_defaults(), + + after_place_node = function(pos, placer, itemstack, pointed_thing) + + -- get player name + local name = placer:get_player_name() + + -- is area protected + if minetest.is_protected(pos, name) then return end + + -- get water nodes within range + local num = minetest.find_nodes_in_area( + {x = pos.x - 3, y = pos.y - 3, z = pos.z - 3}, + {x = pos.x + 3, y = pos.y + 3, z = pos.z + 3}, {"group:water"}) + + -- no water + if #num == 0 then return end + + -- replace water nodes with sponge air + for _, w in pairs(num) do + + if not minetest.is_protected(pos, name) then + minetest.set_node(w, {name = "ethereal:sponge_air"}) + end + end + + -- replace dry sponge with wet sponge + minetest.set_node(pos, {name = "ethereal:sponge_wet"}) + end +}) + +-- cook wet sponge into dry sponge + +minetest.register_craft({ + type = "cooking", + recipe = "ethereal:sponge_wet", + output = "ethereal:sponge", + cooktime = 3 +}) + +-- use leaf decay to remove sponge air nodes + +default.register_leafdecay({ + trunks = {"ethereal:sponge_wet"}, + leaves = {"ethereal:sponge_air"}, + radius = 3 +}) + +-- dry sponges can be used as fuel + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:sponge", + burntime = 5 +}) diff --git a/mods/ethereal/settingtypes.txt b/mods/ethereal/settingtypes.txt new file mode 100644 index 00000000..ad78802b --- /dev/null +++ b/mods/ethereal/settingtypes.txt @@ -0,0 +1,51 @@ +ethereal.leaftype (0 for 2D plantlike leaves or 1 for 3D) int 0 +ethereal.leafwalk (Walkable leaves) bool false + +ethereal.cavedirt (Caves cut through dirt) bool true +ethereal.torchdrop (Torches drop when in water) bool true +ethereal.papyruswalk (Papyrus and Bamboo are walkable) bool true +ethereal.lilywalk (Lilypads are walkable) bool true +ethereal.xcraft (Enable X-Craft cheats) bool true +ethereal.flight (Enable Flight Potion) bool true + +ethereal.glacier (Glacier biome, 1 = Enable / 0 = Disable) int 1 +ethereal.bambo (Bamboo biome, 1 = Enable / 0 = Disable) int 1 +ethereal.mesa (Mesa biome, 1 = Enable / 0 = Disable) int 1 +ethereal.alpine (Taiga biome, 1 = Enable / 0 = Disable) int 1 +ethereal.snowy (Coniferous forest biome, 1 = Enable / 0 = Disable) int 1 +ethereal.frost (Crystal biome, 1 = Enable / 0 = Disable) int 1 +ethereal.grassy (Deciduous forest biome, 1 = Enable / 0 = Disable) int 1 +ethereal.caves (Desertstone biome, 1 = Enable / 0 = Disable) int 1 +ethereal.grayness (Grey Willow biome, 1 = Enable / 0 = Disable) int 1 +ethereal.grassytwo (GrassyTwo biome, 1 = Enable / 0 = Disable) int 1 +ethereal.prairie (Prairie biome, 1 = Enable / 0 = Disable) int 1 +ethereal.jumble (Jumble biome, 1 = Enable / 0 = Disable) int 1 +ethereal.junglee (Rainforest biome, 1 = Enable / 0 = Disable) int 1 +ethereal.desert (Desert biome, 1 = Enable / 0 = Disable) int 1 +ethereal.grove (Banana Grove biome, 1 = Enable / 0 = Disable) int 1 +ethereal.mushroom (Mushroom biome, 1 = Enable / 0 = Disable) int 1 +ethereal.sandstone (Sandstone desert biome, 1 = Enable / 0 = Disable) int 1 +ethereal.plains (Scorched Plains biome, 1 = Enable / 0 = Disable) int 1 +ethereal.savanna (Savanna biome, 1 = Enable / 0 = Disable) int 1 +ethereal.fiery (Fiery Lava biome, 1 = Enable / 0 = Disable) int 1 +ethereal.swamp (Swamp biome, 1 = Enable / 0 = Disable) int 1 +ethereal.quicksand (Swamp quicksand, 1 = Enable / 0 = Disable) int 1 +ethereal.tundra (Tundra biome, 1 = Enable / 0 = Disable) int 1 +ethereal.mediterranean (Mediterranean biome, 1 = Enable / 0 = Disable) int 1 +ethereal.cold_desert (Grey sand desert biome, 1 = Enable / 0 = Disable) int 1 +ethereal.snowy_grassland (Snowy grasslands biome, 1 = Enable / 0 = Disable) int 1 +ethereal.sealife (Coral and Seaweed biome, 1 = Enable / 0 = Disable) int 1 +ethereal.reefs (MT5 Coral biome, 1 = Enable / 0 = Disable) int 1 +ethereal.logs (Tree log decor, 1 = Enable / 0 = Disable) int 1 +ethereal.wood_rotate (Enable directional placement of wood) bool false +ethereal.leaf_particles (Enable falling leaf particles) bool false + +ethereal.flightpotion_duration (Flight Potion Duration) int 300 + +ethereal.clear_default_biomes (Clear Default Biomes and Decoration) bool true + +ethereal.abundant_onions (Abundant Onions) bool true + +ethereal.sapling_protection_check (Check for area protection before placing sapling) bool false + +ethereal.old_biomes (Use old biome settings) bool false diff --git a/mods/ethereal/sounds/ethereal_casting_rod.ogg b/mods/ethereal/sounds/ethereal_casting_rod.ogg new file mode 100644 index 00000000..c916dd7c Binary files /dev/null and b/mods/ethereal/sounds/ethereal_casting_rod.ogg differ diff --git a/mods/ethereal/sounds/ethereal_crystal.ogg b/mods/ethereal/sounds/ethereal_crystal.ogg new file mode 100644 index 00000000..3962fa70 Binary files /dev/null and b/mods/ethereal/sounds/ethereal_crystal.ogg differ diff --git a/mods/ethereal/sounds/ethereal_mushroom.ogg b/mods/ethereal/sounds/ethereal_mushroom.ogg new file mode 100644 index 00000000..6fa86d9e Binary files /dev/null and b/mods/ethereal/sounds/ethereal_mushroom.ogg differ diff --git a/mods/ethereal/stairs.lua b/mods/ethereal/stairs.lua new file mode 100644 index 00000000..bc3c2972 --- /dev/null +++ b/mods/ethereal/stairs.lua @@ -0,0 +1,158 @@ + +-- translation and mod check + +local S = minetest.get_translator("ethereal") +local stairs_mod = minetest.get_modpath("stairs") +local stairs_redo = stairs_mod and stairs.mod and stairs.mod == "redo" +local stairs_plus = minetest.global_exists("stairsplus") + +-- register stair function (stair mod will be auto-selected) + +local do_stair = function(description, name, node, groups, texture, sound) + + if stairs_redo then + + stairs.register_all(name, node, groups, texture, S(description), sound, true) + + elseif stairs_plus then + + local mod = "ethereal" + + stairsplus:register_all(mod, name, node, { + description = S(description), + tiles = texture, + groups = groups, + sounds = sound + }) + + -- aliases need to be set for previous stairs to avoid unknown nodes + minetest.register_alias_force("stairs:stair_" .. name, + mod .. ":stair_" .. name) + + minetest.register_alias_force("stairs:stair_outer_" .. name, + mod .. ":stair_" .. name .. "_outer") + + minetest.register_alias_force("stairs:stair_inner_" .. name, + mod .. ":stair_" .. name .. "_inner") + + minetest.register_alias_force("stairs:slab_" .. name, + mod .. ":slab_" .. name) + + else + stairs.register_stair_and_slab(name, node, groups, texture, + S(description .. " Stair"), S(description .. " Slab"), sound, true) + end +end + +-- Register Stairs + +do_stair( + "Blue Marble", "blue_marble", "ethereal:blue_marble", + {cracky = 1}, + {"ethereal_blue_marble.png"}, + default.node_sound_stone_defaults()) + +do_stair( + "Blue Marble Tile", "blue_marble_tile", "ethereal:blue_marble_tile", + {cracky = 1}, + {"ethereal_blue_marble_tile.png"}, + default.node_sound_stone_defaults()) + +do_stair( + "Crystal Block", "crystal_block", "ethereal:crystal_block", + {cracky = 1, level = 2, puts_out_fire = 1, cools_lava = 1}, + {"ethereal_crystal_block.png"}, + default.node_sound_glass_defaults()) + +do_stair( + "Ice Brick", "icebrick", "ethereal:icebrick", + {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, + {"ethereal_brick_ice.png"}, + default.node_sound_glass_defaults()) + +do_stair( + "Snow Brick", "snowbrick", "ethereal:snowbrick", + {crumbly = 3, puts_out_fire = 1, cools_lava = 1}, + {"ethereal_brick_snow.png"}, + default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.25}, + dug = {name = "default_snow_footstep", gain = 0.75}, + })) + +do_stair( + "Dried Dirt", "dry_dirt", "ethereal:dry_dirt", + {crumbly = 3}, + {"ethereal_dry_dirt.png"}, + default.node_sound_dirt_defaults()) + +do_stair( + "Mushroom Trunk", "mushroom_trunk", "ethereal:mushroom_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + {"ethereal_mushroom_trunk.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Mushroom Top", "mushroom", "ethereal:mushroom", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + {"ethereal_mushroom_block.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Frost Wood", "frost_wood", "ethereal:frost_wood", + {choppy = 2, oddly_breakable_by_hand = 1, put_out_fire = 1}, + {"ethereal_frost_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Healing Wood", "yellow_wood", "ethereal:yellow_wood", + {choppy = 2, oddly_breakable_by_hand = 1, put_out_fire = 1}, + {"ethereal_yellow_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Palm Wood", "palm_wood", "ethereal:palm_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"moretrees_palm_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Birch Wood", "birch_wood", "ethereal:birch_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"moretrees_birch_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Banana Wood", "banana_wood", "ethereal:banana_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"ethereal_banana_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Weeping Willow Wood", "willow_wood", "ethereal:willow_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"ethereal_willow_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Redwood", "redwood_wood", "ethereal:redwood_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"ethereal_redwood_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Bamboo", "bamboo_wood", "ethereal:bamboo_block", + {snappy = 3, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"ethereal_bamboo_floor.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Sakura Wood", "sakura_wood", "ethereal:sakura_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"ethereal_sakura_wood.png"}, + default.node_sound_wood_defaults()) + +do_stair( + "Olive Wood", "olive_wood", "ethereal:olive_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"ethereal_olive_wood.png"}, + default.node_sound_wood_defaults()) diff --git a/mods/ethereal/strawberry.lua b/mods/ethereal/strawberry.lua new file mode 100644 index 00000000..523c26a3 --- /dev/null +++ b/mods/ethereal/strawberry.lua @@ -0,0 +1,138 @@ + +local S = minetest.get_translator("ethereal") + +-- Strawberry (can also be planted directly as seed) + +minetest.register_craftitem("ethereal:strawberry", { + description = S("Strawberry"), + inventory_image = "ethereal_strawberry.png", + wield_image = "ethereal_strawberry.png", + groups = {food_strawberry = 1, food_berry = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "ethereal:strawberry_1") + end +}) + +ethereal.add_eatable("ethereal:strawberry", 1) + +-- Strawberry definition + +local def = { + description = S("Strawberry") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"ethereal_strawberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = { + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} + }, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults() +} + +--stage 1 + +minetest.register_node("ethereal:strawberry_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"ethereal_strawberry_2.png"} +minetest.register_node("ethereal:strawberry_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"ethereal_strawberry_3.png"} +minetest.register_node("ethereal:strawberry_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"ethereal_strawberry_4.png"} +minetest.register_node("ethereal:strawberry_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"ethereal_strawberry_5.png"} +minetest.register_node("ethereal:strawberry_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"ethereal_strawberry_6.png"} +def.drop = { + items = { + {items = {"ethereal:strawberry 1"}, rarity = 2}, + {items = {"ethereal:strawberry 2"}, rarity = 3} + } +} +minetest.register_node("ethereal:strawberry_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"ethereal_strawberry_7.png"} +def.drop = { + items = { + {items = {"ethereal:strawberry 1"}, rarity = 1}, + {items = {"ethereal:strawberry 1"}, rarity = 3} + } +} +minetest.register_node("ethereal:strawberry_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"ethereal_strawberry_8.png"} +def.groups.growing = nil +def.selection_box = { + type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -2.5/16, 0.5} +} +def.drop = { + items = { + {items = {"ethereal:strawberry 2"}, rarity = 1}, + {items = {"ethereal:strawberry 3"}, rarity = 3} + } +} +minetest.register_node("ethereal:strawberry_8", table.copy(def)) + +-- register Abm to grow strawberry (this file wont be loaded if farming redo active) + +minetest.register_abm({ + label = "Ethereal grow strawberry", + nodenames = { + "ethereal:strawberry_1", "ethereal:strawberry_2", "ethereal:strawberry_3", + "ethereal:strawberry_4", "ethereal:strawberry_5", "ethereal:strawberry_6", + "ethereal:strawberry_7" + }, + neighbors = {"farming:soil_wet"}, + interval = 9, + chance = 20, + catch_up = false, + + action = function(pos, node) + + -- are we on wet soil? + pos.y = pos.y - 1 + + if minetest.get_item_group(minetest.get_node(pos).name, "soil") < 3 then + return + end + + pos.y = pos.y + 1 + + -- do we have enough light? + local light = minetest.get_node_light(pos) or 0 ; if light < 13 then return end + + -- grow to next stage + local num = node.name:split("_")[2] + + node.name = "ethereal:strawberry_" .. tonumber(num + 1) + + minetest.swap_node(pos, node) + end +}) diff --git a/mods/ethereal/textures/baked_clay_brown.png b/mods/ethereal/textures/baked_clay_brown.png new file mode 100644 index 00000000..f46e3280 Binary files /dev/null and b/mods/ethereal/textures/baked_clay_brown.png differ diff --git a/mods/ethereal/textures/baked_clay_grey.png b/mods/ethereal/textures/baked_clay_grey.png new file mode 100644 index 00000000..deecb6a5 Binary files /dev/null and b/mods/ethereal/textures/baked_clay_grey.png differ diff --git a/mods/ethereal/textures/baked_clay_orange.png b/mods/ethereal/textures/baked_clay_orange.png new file mode 100644 index 00000000..847b7932 Binary files /dev/null and b/mods/ethereal/textures/baked_clay_orange.png differ diff --git a/mods/ethereal/textures/baked_clay_red.png b/mods/ethereal/textures/baked_clay_red.png new file mode 100644 index 00000000..e7162188 Binary files /dev/null and b/mods/ethereal/textures/baked_clay_red.png differ diff --git a/mods/ethereal/textures/bucket_cactus.png b/mods/ethereal/textures/bucket_cactus.png new file mode 100644 index 00000000..7d5fd0bf Binary files /dev/null and b/mods/ethereal/textures/bucket_cactus.png differ diff --git a/mods/ethereal/textures/default_apple_gold.png b/mods/ethereal/textures/default_apple_gold.png new file mode 100644 index 00000000..02c67a7e Binary files /dev/null and b/mods/ethereal/textures/default_apple_gold.png differ diff --git a/mods/ethereal/textures/ethereal_agar_powder.png b/mods/ethereal/textures/ethereal_agar_powder.png new file mode 100644 index 00000000..f1c08885 Binary files /dev/null and b/mods/ethereal/textures/ethereal_agar_powder.png differ diff --git a/mods/ethereal/textures/ethereal_bamboo_floor.png b/mods/ethereal/textures/ethereal_bamboo_floor.png new file mode 100644 index 00000000..db5fa832 Binary files /dev/null and b/mods/ethereal/textures/ethereal_bamboo_floor.png differ diff --git a/mods/ethereal/textures/ethereal_bamboo_leaves.png b/mods/ethereal/textures/ethereal_bamboo_leaves.png new file mode 100644 index 00000000..3af698d0 Binary files /dev/null and b/mods/ethereal/textures/ethereal_bamboo_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_bamboo_sprout.png b/mods/ethereal/textures/ethereal_bamboo_sprout.png new file mode 100644 index 00000000..bd62d681 Binary files /dev/null and b/mods/ethereal/textures/ethereal_bamboo_sprout.png differ diff --git a/mods/ethereal/textures/ethereal_bamboo_trunk.png b/mods/ethereal/textures/ethereal_bamboo_trunk.png new file mode 100644 index 00000000..ba2a2153 Binary files /dev/null and b/mods/ethereal/textures/ethereal_bamboo_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_banana_bread.png b/mods/ethereal/textures/ethereal_banana_bread.png new file mode 100644 index 00000000..ef215875 Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_bread.png differ diff --git a/mods/ethereal/textures/ethereal_banana_bunch.png b/mods/ethereal/textures/ethereal_banana_bunch.png new file mode 100644 index 00000000..9e73cb60 Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_bunch.png differ diff --git a/mods/ethereal/textures/ethereal_banana_dough.png b/mods/ethereal/textures/ethereal_banana_dough.png new file mode 100644 index 00000000..645f7ed3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_dough.png differ diff --git a/mods/ethereal/textures/ethereal_banana_leaf.png b/mods/ethereal/textures/ethereal_banana_leaf.png new file mode 100644 index 00000000..45770dac Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_leaf.png differ diff --git a/mods/ethereal/textures/ethereal_banana_single.png b/mods/ethereal/textures/ethereal_banana_single.png new file mode 100644 index 00000000..b15ed2fa Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_single.png differ diff --git a/mods/ethereal/textures/ethereal_banana_tree_sapling.png b/mods/ethereal/textures/ethereal_banana_tree_sapling.png new file mode 100644 index 00000000..1c3c826d Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_banana_trunk.png b/mods/ethereal/textures/ethereal_banana_trunk.png new file mode 100644 index 00000000..12888ca1 Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_banana_trunk_top.png b/mods/ethereal/textures/ethereal_banana_trunk_top.png new file mode 100644 index 00000000..77679627 Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_trunk_top.png differ diff --git a/mods/ethereal/textures/ethereal_banana_wood.png b/mods/ethereal/textures/ethereal_banana_wood.png new file mode 100644 index 00000000..ef3b16e6 Binary files /dev/null and b/mods/ethereal/textures/ethereal_banana_wood.png differ diff --git a/mods/ethereal/textures/ethereal_basandra_bush_leaves.png b/mods/ethereal/textures/ethereal_basandra_bush_leaves.png new file mode 100644 index 00000000..4ce4b423 Binary files /dev/null and b/mods/ethereal/textures/ethereal_basandra_bush_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_basandra_bush_sapling.png b/mods/ethereal/textures/ethereal_basandra_bush_sapling.png new file mode 100644 index 00000000..5a7a3710 Binary files /dev/null and b/mods/ethereal/textures/ethereal_basandra_bush_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_basandra_bush_stem.png b/mods/ethereal/textures/ethereal_basandra_bush_stem.png new file mode 100644 index 00000000..00ade532 Binary files /dev/null and b/mods/ethereal/textures/ethereal_basandra_bush_stem.png differ diff --git a/mods/ethereal/textures/ethereal_basandra_bush_wood.png b/mods/ethereal/textures/ethereal_basandra_bush_wood.png new file mode 100644 index 00000000..e12fac84 Binary files /dev/null and b/mods/ethereal/textures/ethereal_basandra_bush_wood.png differ diff --git a/mods/ethereal/textures/ethereal_big_tree_sapling.png b/mods/ethereal/textures/ethereal_big_tree_sapling.png new file mode 100644 index 00000000..5ca62104 Binary files /dev/null and b/mods/ethereal/textures/ethereal_big_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_blue_marble.png b/mods/ethereal/textures/ethereal_blue_marble.png new file mode 100644 index 00000000..cc61ff26 Binary files /dev/null and b/mods/ethereal/textures/ethereal_blue_marble.png differ diff --git a/mods/ethereal/textures/ethereal_blue_marble_tile.png b/mods/ethereal/textures/ethereal_blue_marble_tile.png new file mode 100644 index 00000000..4558697f Binary files /dev/null and b/mods/ethereal/textures/ethereal_blue_marble_tile.png differ diff --git a/mods/ethereal/textures/ethereal_bowl.png b/mods/ethereal/textures/ethereal_bowl.png new file mode 100644 index 00000000..627c22ea Binary files /dev/null and b/mods/ethereal/textures/ethereal_bowl.png differ diff --git a/mods/ethereal/textures/ethereal_brick_ice.png b/mods/ethereal/textures/ethereal_brick_ice.png new file mode 100644 index 00000000..8b3bbbbe Binary files /dev/null and b/mods/ethereal/textures/ethereal_brick_ice.png differ diff --git a/mods/ethereal/textures/ethereal_brick_snow.png b/mods/ethereal/textures/ethereal_brick_snow.png new file mode 100644 index 00000000..d76f6e19 Binary files /dev/null and b/mods/ethereal/textures/ethereal_brick_snow.png differ diff --git a/mods/ethereal/textures/ethereal_bush.png b/mods/ethereal/textures/ethereal_bush.png new file mode 100644 index 00000000..08fff94e Binary files /dev/null and b/mods/ethereal/textures/ethereal_bush.png differ diff --git a/mods/ethereal/textures/ethereal_calamari_cooked.png b/mods/ethereal/textures/ethereal_calamari_cooked.png new file mode 100644 index 00000000..174b9369 Binary files /dev/null and b/mods/ethereal/textures/ethereal_calamari_cooked.png differ diff --git a/mods/ethereal/textures/ethereal_calamari_raw.png b/mods/ethereal/textures/ethereal_calamari_raw.png new file mode 100644 index 00000000..24863ea5 Binary files /dev/null and b/mods/ethereal/textures/ethereal_calamari_raw.png differ diff --git a/mods/ethereal/textures/ethereal_candied_lemon.png b/mods/ethereal/textures/ethereal_candied_lemon.png new file mode 100644 index 00000000..6138b5b7 Binary files /dev/null and b/mods/ethereal/textures/ethereal_candied_lemon.png differ diff --git a/mods/ethereal/textures/ethereal_candle_base.png b/mods/ethereal/textures/ethereal_candle_base.png new file mode 100644 index 00000000..eb8d760a Binary files /dev/null and b/mods/ethereal/textures/ethereal_candle_base.png differ diff --git a/mods/ethereal/textures/ethereal_candle_base_inv.png b/mods/ethereal/textures/ethereal_candle_base_inv.png new file mode 100644 index 00000000..d2c8d303 Binary files /dev/null and b/mods/ethereal/textures/ethereal_candle_base_inv.png differ diff --git a/mods/ethereal/textures/ethereal_candle_flame.png b/mods/ethereal/textures/ethereal_candle_flame.png new file mode 100644 index 00000000..4493200e Binary files /dev/null and b/mods/ethereal/textures/ethereal_candle_flame.png differ diff --git a/mods/ethereal/textures/ethereal_candle_flame_inv.png b/mods/ethereal/textures/ethereal_candle_flame_inv.png new file mode 100644 index 00000000..f6e736d3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_candle_flame_inv.png differ diff --git a/mods/ethereal/textures/ethereal_charcoal_lump.png b/mods/ethereal/textures/ethereal_charcoal_lump.png new file mode 100644 index 00000000..44caf806 Binary files /dev/null and b/mods/ethereal/textures/ethereal_charcoal_lump.png differ diff --git a/mods/ethereal/textures/ethereal_coral_blue.png b/mods/ethereal/textures/ethereal_coral_blue.png new file mode 100644 index 00000000..bee95611 Binary files /dev/null and b/mods/ethereal/textures/ethereal_coral_blue.png differ diff --git a/mods/ethereal/textures/ethereal_coral_green.png b/mods/ethereal/textures/ethereal_coral_green.png new file mode 100644 index 00000000..c602bceb Binary files /dev/null and b/mods/ethereal/textures/ethereal_coral_green.png differ diff --git a/mods/ethereal/textures/ethereal_coral_orange.png b/mods/ethereal/textures/ethereal_coral_orange.png new file mode 100644 index 00000000..15d31ac6 Binary files /dev/null and b/mods/ethereal/textures/ethereal_coral_orange.png differ diff --git a/mods/ethereal/textures/ethereal_coral_pink.png b/mods/ethereal/textures/ethereal_coral_pink.png new file mode 100644 index 00000000..4fb343c4 Binary files /dev/null and b/mods/ethereal/textures/ethereal_coral_pink.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_axe.png b/mods/ethereal/textures/ethereal_crystal_axe.png new file mode 100644 index 00000000..747ead42 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_axe.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_block.png b/mods/ethereal/textures/ethereal_crystal_block.png new file mode 100644 index 00000000..0057ce91 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_block.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_gilly_staff.png b/mods/ethereal/textures/ethereal_crystal_gilly_staff.png new file mode 100644 index 00000000..33841c50 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_gilly_staff.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_ingot.png b/mods/ethereal/textures/ethereal_crystal_ingot.png new file mode 100644 index 00000000..ce14a104 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_ingot.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_pick.png b/mods/ethereal/textures/ethereal_crystal_pick.png new file mode 100644 index 00000000..0ebd7e76 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_pick.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_shovel.png b/mods/ethereal/textures/ethereal_crystal_shovel.png new file mode 100644 index 00000000..3448deb3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_shovel.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_spike.png b/mods/ethereal/textures/ethereal_crystal_spike.png new file mode 100644 index 00000000..db07af49 Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_spike.png differ diff --git a/mods/ethereal/textures/ethereal_crystal_sword.png b/mods/ethereal/textures/ethereal_crystal_sword.png new file mode 100644 index 00000000..70dfdbfc Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystal_sword.png differ diff --git a/mods/ethereal/textures/ethereal_crystalgrass.png b/mods/ethereal/textures/ethereal_crystalgrass.png new file mode 100644 index 00000000..c38397cc Binary files /dev/null and b/mods/ethereal/textures/ethereal_crystalgrass.png differ diff --git a/mods/ethereal/textures/ethereal_dry_dirt.png b/mods/ethereal/textures/ethereal_dry_dirt.png new file mode 100644 index 00000000..626e7ef9 Binary files /dev/null and b/mods/ethereal/textures/ethereal_dry_dirt.png differ diff --git a/mods/ethereal/textures/ethereal_dry_shrub.png b/mods/ethereal/textures/ethereal_dry_shrub.png new file mode 100644 index 00000000..57d31d40 Binary files /dev/null and b/mods/ethereal/textures/ethereal_dry_shrub.png differ diff --git a/mods/ethereal/textures/ethereal_etherium_dust.png b/mods/ethereal/textures/ethereal_etherium_dust.png new file mode 100644 index 00000000..65a3e080 Binary files /dev/null and b/mods/ethereal/textures/ethereal_etherium_dust.png differ diff --git a/mods/ethereal/textures/ethereal_etherium_ore.png b/mods/ethereal/textures/ethereal_etherium_ore.png new file mode 100644 index 00000000..19ab81bb Binary files /dev/null and b/mods/ethereal/textures/ethereal_etherium_ore.png differ diff --git a/mods/ethereal/textures/ethereal_falling_leaf.png b/mods/ethereal/textures/ethereal_falling_leaf.png new file mode 100644 index 00000000..afeeaabe Binary files /dev/null and b/mods/ethereal/textures/ethereal_falling_leaf.png differ diff --git a/mods/ethereal/textures/ethereal_fern.png b/mods/ethereal/textures/ethereal_fern.png new file mode 100644 index 00000000..b25d35de Binary files /dev/null and b/mods/ethereal/textures/ethereal_fern.png differ diff --git a/mods/ethereal/textures/ethereal_fern_tubers.png b/mods/ethereal/textures/ethereal_fern_tubers.png new file mode 100644 index 00000000..ddc5a22e Binary files /dev/null and b/mods/ethereal/textures/ethereal_fern_tubers.png differ diff --git a/mods/ethereal/textures/ethereal_fire_dust.png b/mods/ethereal/textures/ethereal_fire_dust.png new file mode 100644 index 00000000..eb72bb92 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fire_dust.png differ diff --git a/mods/ethereal/textures/ethereal_fire_flower.png b/mods/ethereal/textures/ethereal_fire_flower.png new file mode 100644 index 00000000..5f03f7bf Binary files /dev/null and b/mods/ethereal/textures/ethereal_fire_flower.png differ diff --git a/mods/ethereal/textures/ethereal_firethorn.png b/mods/ethereal/textures/ethereal_firethorn.png new file mode 100644 index 00000000..d051e901 Binary files /dev/null and b/mods/ethereal/textures/ethereal_firethorn.png differ diff --git a/mods/ethereal/textures/ethereal_firethorn_jelly.png b/mods/ethereal/textures/ethereal_firethorn_jelly.png new file mode 100644 index 00000000..7ac90b2b Binary files /dev/null and b/mods/ethereal/textures/ethereal_firethorn_jelly.png differ diff --git a/mods/ethereal/textures/ethereal_fish_angler.png b/mods/ethereal/textures/ethereal_fish_angler.png new file mode 100644 index 00000000..8bf0a09e Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_angler.png differ diff --git a/mods/ethereal/textures/ethereal_fish_bluefin.png b/mods/ethereal/textures/ethereal_fish_bluefin.png new file mode 100644 index 00000000..4f14bf0a Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_bluefin.png differ diff --git a/mods/ethereal/textures/ethereal_fish_blueram.png b/mods/ethereal/textures/ethereal_fish_blueram.png new file mode 100644 index 00000000..7bd1e0bb Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_blueram.png differ diff --git a/mods/ethereal/textures/ethereal_fish_carp.png b/mods/ethereal/textures/ethereal_fish_carp.png new file mode 100644 index 00000000..b1df6351 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_carp.png differ diff --git a/mods/ethereal/textures/ethereal_fish_catfish.png b/mods/ethereal/textures/ethereal_fish_catfish.png new file mode 100644 index 00000000..efe90f32 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_catfish.png differ diff --git a/mods/ethereal/textures/ethereal_fish_chips.png b/mods/ethereal/textures/ethereal_fish_chips.png new file mode 100644 index 00000000..60eb496f Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_chips.png differ diff --git a/mods/ethereal/textures/ethereal_fish_cichlid.png b/mods/ethereal/textures/ethereal_fish_cichlid.png new file mode 100644 index 00000000..c5d58322 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_cichlid.png differ diff --git a/mods/ethereal/textures/ethereal_fish_clownfish.png b/mods/ethereal/textures/ethereal_fish_clownfish.png new file mode 100644 index 00000000..a292beb8 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_clownfish.png differ diff --git a/mods/ethereal/textures/ethereal_fish_cod.png b/mods/ethereal/textures/ethereal_fish_cod.png new file mode 100644 index 00000000..53456d41 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_cod.png differ diff --git a/mods/ethereal/textures/ethereal_fish_cooked.png b/mods/ethereal/textures/ethereal_fish_cooked.png new file mode 100644 index 00000000..8e0da594 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_cooked.png differ diff --git a/mods/ethereal/textures/ethereal_fish_coy.png b/mods/ethereal/textures/ethereal_fish_coy.png new file mode 100644 index 00000000..b1509441 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_coy.png differ diff --git a/mods/ethereal/textures/ethereal_fish_flathead.png b/mods/ethereal/textures/ethereal_fish_flathead.png new file mode 100644 index 00000000..7ded538a Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_flathead.png differ diff --git a/mods/ethereal/textures/ethereal_fish_flounder.png b/mods/ethereal/textures/ethereal_fish_flounder.png new file mode 100644 index 00000000..d36d7aa0 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_flounder.png differ diff --git a/mods/ethereal/textures/ethereal_fish_jellyfish.png b/mods/ethereal/textures/ethereal_fish_jellyfish.png new file mode 100644 index 00000000..1b1aa43f Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_jellyfish.png differ diff --git a/mods/ethereal/textures/ethereal_fish_mackerel.png b/mods/ethereal/textures/ethereal_fish_mackerel.png new file mode 100644 index 00000000..d326398a Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_mackerel.png differ diff --git a/mods/ethereal/textures/ethereal_fish_parrot.png b/mods/ethereal/textures/ethereal_fish_parrot.png new file mode 100644 index 00000000..a3353516 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_parrot.png differ diff --git a/mods/ethereal/textures/ethereal_fish_pike.png b/mods/ethereal/textures/ethereal_fish_pike.png new file mode 100644 index 00000000..8166d413 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_pike.png differ diff --git a/mods/ethereal/textures/ethereal_fish_piranha.png b/mods/ethereal/textures/ethereal_fish_piranha.png new file mode 100644 index 00000000..184ee81b Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_piranha.png differ diff --git a/mods/ethereal/textures/ethereal_fish_plaice.png b/mods/ethereal/textures/ethereal_fish_plaice.png new file mode 100644 index 00000000..6b597b2e Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_plaice.png differ diff --git a/mods/ethereal/textures/ethereal_fish_pufferfish.png b/mods/ethereal/textures/ethereal_fish_pufferfish.png new file mode 100644 index 00000000..f7067a36 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_pufferfish.png differ diff --git a/mods/ethereal/textures/ethereal_fish_redsnapper.png b/mods/ethereal/textures/ethereal_fish_redsnapper.png new file mode 100644 index 00000000..6cf44ddd Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_redsnapper.png differ diff --git a/mods/ethereal/textures/ethereal_fish_salmon.png b/mods/ethereal/textures/ethereal_fish_salmon.png new file mode 100644 index 00000000..57f9712b Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_salmon.png differ diff --git a/mods/ethereal/textures/ethereal_fish_seahorse.png b/mods/ethereal/textures/ethereal_fish_seahorse.png new file mode 100644 index 00000000..e6d898da Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_seahorse.png differ diff --git a/mods/ethereal/textures/ethereal_fish_seahorse_blue.png b/mods/ethereal/textures/ethereal_fish_seahorse_blue.png new file mode 100644 index 00000000..e3939dd6 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_seahorse_blue.png differ diff --git a/mods/ethereal/textures/ethereal_fish_seahorse_green.png b/mods/ethereal/textures/ethereal_fish_seahorse_green.png new file mode 100644 index 00000000..4089bf7b Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_seahorse_green.png differ diff --git a/mods/ethereal/textures/ethereal_fish_seahorse_pink.png b/mods/ethereal/textures/ethereal_fish_seahorse_pink.png new file mode 100644 index 00000000..fde8ae35 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_seahorse_pink.png differ diff --git a/mods/ethereal/textures/ethereal_fish_seahorse_yellow.png b/mods/ethereal/textures/ethereal_fish_seahorse_yellow.png new file mode 100644 index 00000000..327c11fa Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_seahorse_yellow.png differ diff --git a/mods/ethereal/textures/ethereal_fish_shrimp.png b/mods/ethereal/textures/ethereal_fish_shrimp.png new file mode 100644 index 00000000..ac963648 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_shrimp.png differ diff --git a/mods/ethereal/textures/ethereal_fish_shrimp_cooked.png b/mods/ethereal/textures/ethereal_fish_shrimp_cooked.png new file mode 100644 index 00000000..8ef098da Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_shrimp_cooked.png differ diff --git a/mods/ethereal/textures/ethereal_fish_squid.png b/mods/ethereal/textures/ethereal_fish_squid.png new file mode 100644 index 00000000..ee9dba02 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_squid.png differ diff --git a/mods/ethereal/textures/ethereal_fish_tetra.png b/mods/ethereal/textures/ethereal_fish_tetra.png new file mode 100644 index 00000000..370ba147 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_tetra.png differ diff --git a/mods/ethereal/textures/ethereal_fish_tilapia.png b/mods/ethereal/textures/ethereal_fish_tilapia.png new file mode 100644 index 00000000..43fb9b41 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_tilapia.png differ diff --git a/mods/ethereal/textures/ethereal_fish_trevally.png b/mods/ethereal/textures/ethereal_fish_trevally.png new file mode 100644 index 00000000..8e957dbe Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_trevally.png differ diff --git a/mods/ethereal/textures/ethereal_fish_trout.png b/mods/ethereal/textures/ethereal_fish_trout.png new file mode 100644 index 00000000..0ac29a80 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_trout.png differ diff --git a/mods/ethereal/textures/ethereal_fish_tuna.png b/mods/ethereal/textures/ethereal_fish_tuna.png new file mode 100644 index 00000000..a7193cad Binary files /dev/null and b/mods/ethereal/textures/ethereal_fish_tuna.png differ diff --git a/mods/ethereal/textures/ethereal_fishing_bob.png b/mods/ethereal/textures/ethereal_fishing_bob.png new file mode 100644 index 00000000..544bff36 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fishing_bob.png differ diff --git a/mods/ethereal/textures/ethereal_fishing_rod.png b/mods/ethereal/textures/ethereal_fishing_rod.png new file mode 100644 index 00000000..061a71df Binary files /dev/null and b/mods/ethereal/textures/ethereal_fishing_rod.png differ diff --git a/mods/ethereal/textures/ethereal_flight_potion.png b/mods/ethereal/textures/ethereal_flight_potion.png new file mode 100644 index 00000000..41d6abb1 Binary files /dev/null and b/mods/ethereal/textures/ethereal_flight_potion.png differ diff --git a/mods/ethereal/textures/ethereal_frost_leaves.png b/mods/ethereal/textures/ethereal_frost_leaves.png new file mode 100644 index 00000000..57e8d8a1 Binary files /dev/null and b/mods/ethereal/textures/ethereal_frost_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_frost_tree.png b/mods/ethereal/textures/ethereal_frost_tree.png new file mode 100644 index 00000000..1f6cbe41 Binary files /dev/null and b/mods/ethereal/textures/ethereal_frost_tree.png differ diff --git a/mods/ethereal/textures/ethereal_frost_tree_sapling.png b/mods/ethereal/textures/ethereal_frost_tree_sapling.png new file mode 100644 index 00000000..793b2261 Binary files /dev/null and b/mods/ethereal/textures/ethereal_frost_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_frost_tree_top.png b/mods/ethereal/textures/ethereal_frost_tree_top.png new file mode 100644 index 00000000..6551d336 Binary files /dev/null and b/mods/ethereal/textures/ethereal_frost_tree_top.png differ diff --git a/mods/ethereal/textures/ethereal_frost_wood.png b/mods/ethereal/textures/ethereal_frost_wood.png new file mode 100644 index 00000000..f91db53c Binary files /dev/null and b/mods/ethereal/textures/ethereal_frost_wood.png differ diff --git a/mods/ethereal/textures/ethereal_fugu.png b/mods/ethereal/textures/ethereal_fugu.png new file mode 100644 index 00000000..3dfef3c8 Binary files /dev/null and b/mods/ethereal/textures/ethereal_fugu.png differ diff --git a/mods/ethereal/textures/ethereal_garlic_butter_shrimp.png b/mods/ethereal/textures/ethereal_garlic_butter_shrimp.png new file mode 100644 index 00000000..3f6deac6 Binary files /dev/null and b/mods/ethereal/textures/ethereal_garlic_butter_shrimp.png differ diff --git a/mods/ethereal/textures/ethereal_giant_redwood_sapling.png b/mods/ethereal/textures/ethereal_giant_redwood_sapling.png new file mode 100644 index 00000000..a802b81e Binary files /dev/null and b/mods/ethereal/textures/ethereal_giant_redwood_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_glostone.png b/mods/ethereal/textures/ethereal_glostone.png new file mode 100644 index 00000000..c4e4c28d Binary files /dev/null and b/mods/ethereal/textures/ethereal_glostone.png differ diff --git a/mods/ethereal/textures/ethereal_grass_bamboo_side.png b/mods/ethereal/textures/ethereal_grass_bamboo_side.png new file mode 100644 index 00000000..4a2548c2 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_bamboo_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_bamboo_top.png b/mods/ethereal/textures/ethereal_grass_bamboo_top.png new file mode 100644 index 00000000..2360d398 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_bamboo_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_cold_side.png b/mods/ethereal/textures/ethereal_grass_cold_side.png new file mode 100644 index 00000000..a92e3a60 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_cold_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_cold_top.png b/mods/ethereal/textures/ethereal_grass_cold_top.png new file mode 100644 index 00000000..fae28eb2 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_cold_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_crystal_side.png b/mods/ethereal/textures/ethereal_grass_crystal_side.png new file mode 100644 index 00000000..3f712b61 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_crystal_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_crystal_top.png b/mods/ethereal/textures/ethereal_grass_crystal_top.png new file mode 100644 index 00000000..78a73720 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_crystal_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_fiery_side.png b/mods/ethereal/textures/ethereal_grass_fiery_side.png new file mode 100644 index 00000000..63987134 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_fiery_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_fiery_top.png b/mods/ethereal/textures/ethereal_grass_fiery_top.png new file mode 100644 index 00000000..67183005 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_fiery_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_gray_side.png b/mods/ethereal/textures/ethereal_grass_gray_side.png new file mode 100644 index 00000000..ebf82c71 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_gray_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_gray_top.png b/mods/ethereal/textures/ethereal_grass_gray_top.png new file mode 100644 index 00000000..10f5ecfd Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_gray_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_grove_side.png b/mods/ethereal/textures/ethereal_grass_grove_side.png new file mode 100644 index 00000000..b09180ae Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_grove_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_grove_top.png b/mods/ethereal/textures/ethereal_grass_grove_top.png new file mode 100644 index 00000000..2e2351a0 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_grove_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_jungle_side.png b/mods/ethereal/textures/ethereal_grass_jungle_side.png new file mode 100644 index 00000000..f772f654 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_jungle_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_jungle_top.png b/mods/ethereal/textures/ethereal_grass_jungle_top.png new file mode 100644 index 00000000..1faeeeeb Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_jungle_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_mushroom_side.png b/mods/ethereal/textures/ethereal_grass_mushroom_side.png new file mode 100644 index 00000000..94973e70 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_mushroom_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_mushroom_top.png b/mods/ethereal/textures/ethereal_grass_mushroom_top.png new file mode 100644 index 00000000..23659013 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_mushroom_top.png differ diff --git a/mods/ethereal/textures/ethereal_grass_prairie_side.png b/mods/ethereal/textures/ethereal_grass_prairie_side.png new file mode 100644 index 00000000..731b08f7 Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_prairie_side.png differ diff --git a/mods/ethereal/textures/ethereal_grass_prairie_top.png b/mods/ethereal/textures/ethereal_grass_prairie_top.png new file mode 100644 index 00000000..2ceecaac Binary files /dev/null and b/mods/ethereal/textures/ethereal_grass_prairie_top.png differ diff --git a/mods/ethereal/textures/ethereal_hearty_stew.png b/mods/ethereal/textures/ethereal_hearty_stew.png new file mode 100644 index 00000000..c6dadd74 Binary files /dev/null and b/mods/ethereal/textures/ethereal_hearty_stew.png differ diff --git a/mods/ethereal/textures/ethereal_illumishroom_cyan.png b/mods/ethereal/textures/ethereal_illumishroom_cyan.png new file mode 100644 index 00000000..f9cf22cc Binary files /dev/null and b/mods/ethereal/textures/ethereal_illumishroom_cyan.png differ diff --git a/mods/ethereal/textures/ethereal_illumishroom_green.png b/mods/ethereal/textures/ethereal_illumishroom_green.png new file mode 100644 index 00000000..693679c0 Binary files /dev/null and b/mods/ethereal/textures/ethereal_illumishroom_green.png differ diff --git a/mods/ethereal/textures/ethereal_illumishroom_red.png b/mods/ethereal/textures/ethereal_illumishroom_red.png new file mode 100644 index 00000000..d03f352a Binary files /dev/null and b/mods/ethereal/textures/ethereal_illumishroom_red.png differ diff --git a/mods/ethereal/textures/ethereal_jellyfish_salad.png b/mods/ethereal/textures/ethereal_jellyfish_salad.png new file mode 100644 index 00000000..5ee80b94 Binary files /dev/null and b/mods/ethereal/textures/ethereal_jellyfish_salad.png differ diff --git a/mods/ethereal/textures/ethereal_lemon.png b/mods/ethereal/textures/ethereal_lemon.png new file mode 100644 index 00000000..f13a31e7 Binary files /dev/null and b/mods/ethereal/textures/ethereal_lemon.png differ diff --git a/mods/ethereal/textures/ethereal_lemon_fruit.png b/mods/ethereal/textures/ethereal_lemon_fruit.png new file mode 100644 index 00000000..45a1336e Binary files /dev/null and b/mods/ethereal/textures/ethereal_lemon_fruit.png differ diff --git a/mods/ethereal/textures/ethereal_lemon_leaves.png b/mods/ethereal/textures/ethereal_lemon_leaves.png new file mode 100644 index 00000000..0d56a0e2 Binary files /dev/null and b/mods/ethereal/textures/ethereal_lemon_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_lemon_tree_sapling.png b/mods/ethereal/textures/ethereal_lemon_tree_sapling.png new file mode 100644 index 00000000..28b257ac Binary files /dev/null and b/mods/ethereal/textures/ethereal_lemon_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_lemonade.png b/mods/ethereal/textures/ethereal_lemonade.png new file mode 100644 index 00000000..710ee2b4 Binary files /dev/null and b/mods/ethereal/textures/ethereal_lemonade.png differ diff --git a/mods/ethereal/textures/ethereal_light_staff.png b/mods/ethereal/textures/ethereal_light_staff.png new file mode 100644 index 00000000..983a3dcf Binary files /dev/null and b/mods/ethereal/textures/ethereal_light_staff.png differ diff --git a/mods/ethereal/textures/ethereal_lightstring.png b/mods/ethereal/textures/ethereal_lightstring.png new file mode 100644 index 00000000..285b5abe Binary files /dev/null and b/mods/ethereal/textures/ethereal_lightstring.png differ diff --git a/mods/ethereal/textures/ethereal_lilac.png b/mods/ethereal/textures/ethereal_lilac.png new file mode 100644 index 00000000..bfc72bff Binary files /dev/null and b/mods/ethereal/textures/ethereal_lilac.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_block.png b/mods/ethereal/textures/ethereal_mushroom_block.png new file mode 100644 index 00000000..ab8042a6 Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_block.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_block_brown.png b/mods/ethereal/textures/ethereal_mushroom_block_brown.png new file mode 100644 index 00000000..4df109b5 Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_block_brown.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_brown_sapling.png b/mods/ethereal/textures/ethereal_mushroom_brown_sapling.png new file mode 100644 index 00000000..3c5666de Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_brown_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_pore.png b/mods/ethereal/textures/ethereal_mushroom_pore.png new file mode 100644 index 00000000..e6440506 Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_pore.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_sapling.png b/mods/ethereal/textures/ethereal_mushroom_sapling.png new file mode 100644 index 00000000..2a802852 Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_soup.png b/mods/ethereal/textures/ethereal_mushroom_soup.png new file mode 100644 index 00000000..648c69cf Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_soup.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_trunk.png b/mods/ethereal/textures/ethereal_mushroom_trunk.png new file mode 100644 index 00000000..16859beb Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_mushroom_trunk_top.png b/mods/ethereal/textures/ethereal_mushroom_trunk_top.png new file mode 100644 index 00000000..c580203d Binary files /dev/null and b/mods/ethereal/textures/ethereal_mushroom_trunk_top.png differ diff --git a/mods/ethereal/textures/ethereal_olive.png b/mods/ethereal/textures/ethereal_olive.png new file mode 100644 index 00000000..d83c94f5 Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive.png differ diff --git a/mods/ethereal/textures/ethereal_olive_fruit.png b/mods/ethereal/textures/ethereal_olive_fruit.png new file mode 100644 index 00000000..408651c9 Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_fruit.png differ diff --git a/mods/ethereal/textures/ethereal_olive_leaves.png b/mods/ethereal/textures/ethereal_olive_leaves.png new file mode 100644 index 00000000..6935b454 Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_olive_oil.png b/mods/ethereal/textures/ethereal_olive_oil.png new file mode 100644 index 00000000..1b5931b3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_oil.png differ diff --git a/mods/ethereal/textures/ethereal_olive_tree_sapling.png b/mods/ethereal/textures/ethereal_olive_tree_sapling.png new file mode 100644 index 00000000..1b7f0f4e Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_olive_trunk.png b/mods/ethereal/textures/ethereal_olive_trunk.png new file mode 100644 index 00000000..167a79ea Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_olive_trunk_top.png b/mods/ethereal/textures/ethereal_olive_trunk_top.png new file mode 100644 index 00000000..f5d76761 Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_trunk_top.png differ diff --git a/mods/ethereal/textures/ethereal_olive_wood.png b/mods/ethereal/textures/ethereal_olive_wood.png new file mode 100644 index 00000000..4fb173b3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_olive_wood.png differ diff --git a/mods/ethereal/textures/ethereal_orange_leaves.png b/mods/ethereal/textures/ethereal_orange_leaves.png new file mode 100644 index 00000000..be4ce148 Binary files /dev/null and b/mods/ethereal/textures/ethereal_orange_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_orange_tree_sapling.png b/mods/ethereal/textures/ethereal_orange_tree_sapling.png new file mode 100644 index 00000000..76cb043b Binary files /dev/null and b/mods/ethereal/textures/ethereal_orange_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_palm_wax.png b/mods/ethereal/textures/ethereal_palm_wax.png new file mode 100644 index 00000000..06468746 Binary files /dev/null and b/mods/ethereal/textures/ethereal_palm_wax.png differ diff --git a/mods/ethereal/textures/ethereal_paper_wall.png b/mods/ethereal/textures/ethereal_paper_wall.png new file mode 100644 index 00000000..1908e487 Binary files /dev/null and b/mods/ethereal/textures/ethereal_paper_wall.png differ diff --git a/mods/ethereal/textures/ethereal_pine_nuts.png b/mods/ethereal/textures/ethereal_pine_nuts.png new file mode 100644 index 00000000..090687ef Binary files /dev/null and b/mods/ethereal/textures/ethereal_pine_nuts.png differ diff --git a/mods/ethereal/textures/ethereal_pine_tree_sapling.png b/mods/ethereal/textures/ethereal_pine_tree_sapling.png new file mode 100644 index 00000000..3d6c0c1b Binary files /dev/null and b/mods/ethereal/textures/ethereal_pine_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_poppy.png b/mods/ethereal/textures/ethereal_poppy.png new file mode 100644 index 00000000..7ba8aa45 Binary files /dev/null and b/mods/ethereal/textures/ethereal_poppy.png differ diff --git a/mods/ethereal/textures/ethereal_redwood_leaves.png b/mods/ethereal/textures/ethereal_redwood_leaves.png new file mode 100644 index 00000000..9cb0799d Binary files /dev/null and b/mods/ethereal/textures/ethereal_redwood_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_redwood_sapling.png b/mods/ethereal/textures/ethereal_redwood_sapling.png new file mode 100644 index 00000000..8015518d Binary files /dev/null and b/mods/ethereal/textures/ethereal_redwood_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_redwood_trunk.png b/mods/ethereal/textures/ethereal_redwood_trunk.png new file mode 100644 index 00000000..9e9f8a2c Binary files /dev/null and b/mods/ethereal/textures/ethereal_redwood_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_redwood_trunk_top.png b/mods/ethereal/textures/ethereal_redwood_trunk_top.png new file mode 100644 index 00000000..0655928e Binary files /dev/null and b/mods/ethereal/textures/ethereal_redwood_trunk_top.png differ diff --git a/mods/ethereal/textures/ethereal_redwood_wood.png b/mods/ethereal/textures/ethereal_redwood_wood.png new file mode 100644 index 00000000..60bc6095 Binary files /dev/null and b/mods/ethereal/textures/ethereal_redwood_wood.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_door.png b/mods/ethereal/textures/ethereal_sakura_door.png new file mode 100644 index 00000000..a24d740c Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_door.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_door_inv.png b/mods/ethereal/textures/ethereal_sakura_door_inv.png new file mode 100644 index 00000000..c6920cee Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_door_inv.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_leaves.png b/mods/ethereal/textures/ethereal_sakura_leaves.png new file mode 100644 index 00000000..cc982b74 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_leaves2.png b/mods/ethereal/textures/ethereal_sakura_leaves2.png new file mode 100644 index 00000000..83fdc10c Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_leaves2.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_sapling.png b/mods/ethereal/textures/ethereal_sakura_sapling.png new file mode 100644 index 00000000..f514b67c Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_trunk.png b/mods/ethereal/textures/ethereal_sakura_trunk.png new file mode 100644 index 00000000..cf710b50 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_trunk_top.png b/mods/ethereal/textures/ethereal_sakura_trunk_top.png new file mode 100644 index 00000000..0dbaaf92 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_trunk_top.png differ diff --git a/mods/ethereal/textures/ethereal_sakura_wood.png b/mods/ethereal/textures/ethereal_sakura_wood.png new file mode 100644 index 00000000..bcff38bc Binary files /dev/null and b/mods/ethereal/textures/ethereal_sakura_wood.png differ diff --git a/mods/ethereal/textures/ethereal_sashimi.png b/mods/ethereal/textures/ethereal_sashimi.png new file mode 100644 index 00000000..ea0cb845 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sashimi.png differ diff --git a/mods/ethereal/textures/ethereal_scorched_tree.png b/mods/ethereal/textures/ethereal_scorched_tree.png new file mode 100644 index 00000000..d4028ed4 Binary files /dev/null and b/mods/ethereal/textures/ethereal_scorched_tree.png differ diff --git a/mods/ethereal/textures/ethereal_scorched_tree_top.png b/mods/ethereal/textures/ethereal_scorched_tree_top.png new file mode 100644 index 00000000..5ea751cf Binary files /dev/null and b/mods/ethereal/textures/ethereal_scorched_tree_top.png differ diff --git a/mods/ethereal/textures/ethereal_seaweed.png b/mods/ethereal/textures/ethereal_seaweed.png new file mode 100644 index 00000000..7e27b729 Binary files /dev/null and b/mods/ethereal/textures/ethereal_seaweed.png differ diff --git a/mods/ethereal/textures/ethereal_slime_block.png b/mods/ethereal/textures/ethereal_slime_block.png new file mode 100644 index 00000000..29703be2 Binary files /dev/null and b/mods/ethereal/textures/ethereal_slime_block.png differ diff --git a/mods/ethereal/textures/ethereal_slime_mold.png b/mods/ethereal/textures/ethereal_slime_mold.png new file mode 100644 index 00000000..05212d8a Binary files /dev/null and b/mods/ethereal/textures/ethereal_slime_mold.png differ diff --git a/mods/ethereal/textures/ethereal_snowygrass.png b/mods/ethereal/textures/ethereal_snowygrass.png new file mode 100644 index 00000000..10374fb4 Binary files /dev/null and b/mods/ethereal/textures/ethereal_snowygrass.png differ diff --git a/mods/ethereal/textures/ethereal_sponge.png b/mods/ethereal/textures/ethereal_sponge.png new file mode 100644 index 00000000..e739ec4c Binary files /dev/null and b/mods/ethereal/textures/ethereal_sponge.png differ diff --git a/mods/ethereal/textures/ethereal_sponge_wet.png b/mods/ethereal/textures/ethereal_sponge_wet.png new file mode 100644 index 00000000..ddf1aac3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sponge_wet.png differ diff --git a/mods/ethereal/textures/ethereal_spore_grass.png b/mods/ethereal/textures/ethereal_spore_grass.png new file mode 100644 index 00000000..1464ba36 Binary files /dev/null and b/mods/ethereal/textures/ethereal_spore_grass.png differ diff --git a/mods/ethereal/textures/ethereal_stone_ladder.png b/mods/ethereal/textures/ethereal_stone_ladder.png new file mode 100644 index 00000000..215c1180 Binary files /dev/null and b/mods/ethereal/textures/ethereal_stone_ladder.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry.png b/mods/ethereal/textures/ethereal_strawberry.png new file mode 100644 index 00000000..b085fd97 Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_1.png b/mods/ethereal/textures/ethereal_strawberry_1.png new file mode 100644 index 00000000..531ff350 Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_1.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_2.png b/mods/ethereal/textures/ethereal_strawberry_2.png new file mode 100644 index 00000000..82fa6725 Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_2.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_3.png b/mods/ethereal/textures/ethereal_strawberry_3.png new file mode 100644 index 00000000..950a57cd Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_3.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_4.png b/mods/ethereal/textures/ethereal_strawberry_4.png new file mode 100644 index 00000000..ed090917 Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_4.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_5.png b/mods/ethereal/textures/ethereal_strawberry_5.png new file mode 100644 index 00000000..8e6c0acd Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_5.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_6.png b/mods/ethereal/textures/ethereal_strawberry_6.png new file mode 100644 index 00000000..c9e97664 Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_6.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_7.png b/mods/ethereal/textures/ethereal_strawberry_7.png new file mode 100644 index 00000000..e35830d6 Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_7.png differ diff --git a/mods/ethereal/textures/ethereal_strawberry_8.png b/mods/ethereal/textures/ethereal_strawberry_8.png new file mode 100644 index 00000000..10ee97dd Binary files /dev/null and b/mods/ethereal/textures/ethereal_strawberry_8.png differ diff --git a/mods/ethereal/textures/ethereal_sushi_kappa_maki.png b/mods/ethereal/textures/ethereal_sushi_kappa_maki.png new file mode 100644 index 00000000..b3ed5137 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sushi_kappa_maki.png differ diff --git a/mods/ethereal/textures/ethereal_sushi_nigiri.png b/mods/ethereal/textures/ethereal_sushi_nigiri.png new file mode 100644 index 00000000..abb7aaa1 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sushi_nigiri.png differ diff --git a/mods/ethereal/textures/ethereal_sushi_tamago.png b/mods/ethereal/textures/ethereal_sushi_tamago.png new file mode 100644 index 00000000..d23020b7 Binary files /dev/null and b/mods/ethereal/textures/ethereal_sushi_tamago.png differ diff --git a/mods/ethereal/textures/ethereal_teriyaki_beef.png b/mods/ethereal/textures/ethereal_teriyaki_beef.png new file mode 100644 index 00000000..dd943449 Binary files /dev/null and b/mods/ethereal/textures/ethereal_teriyaki_beef.png differ diff --git a/mods/ethereal/textures/ethereal_teriyaki_chicken.png b/mods/ethereal/textures/ethereal_teriyaki_chicken.png new file mode 100644 index 00000000..7a50e144 Binary files /dev/null and b/mods/ethereal/textures/ethereal_teriyaki_chicken.png differ diff --git a/mods/ethereal/textures/ethereal_tree_sapling.png b/mods/ethereal/textures/ethereal_tree_sapling.png new file mode 100644 index 00000000..c6c62174 Binary files /dev/null and b/mods/ethereal/textures/ethereal_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_vine.png b/mods/ethereal/textures/ethereal_vine.png new file mode 100644 index 00000000..09948cf3 Binary files /dev/null and b/mods/ethereal/textures/ethereal_vine.png differ diff --git a/mods/ethereal/textures/ethereal_wild_onion.png b/mods/ethereal/textures/ethereal_wild_onion.png new file mode 100644 index 00000000..ed6209f0 Binary files /dev/null and b/mods/ethereal/textures/ethereal_wild_onion.png differ diff --git a/mods/ethereal/textures/ethereal_wild_onion_1.png b/mods/ethereal/textures/ethereal_wild_onion_1.png new file mode 100644 index 00000000..31a61411 Binary files /dev/null and b/mods/ethereal/textures/ethereal_wild_onion_1.png differ diff --git a/mods/ethereal/textures/ethereal_wild_onion_2.png b/mods/ethereal/textures/ethereal_wild_onion_2.png new file mode 100644 index 00000000..58bf2a8a Binary files /dev/null and b/mods/ethereal/textures/ethereal_wild_onion_2.png differ diff --git a/mods/ethereal/textures/ethereal_wild_onion_3.png b/mods/ethereal/textures/ethereal_wild_onion_3.png new file mode 100644 index 00000000..ef7e2bcc Binary files /dev/null and b/mods/ethereal/textures/ethereal_wild_onion_3.png differ diff --git a/mods/ethereal/textures/ethereal_wild_onion_4.png b/mods/ethereal/textures/ethereal_wild_onion_4.png new file mode 100644 index 00000000..5e074ca7 Binary files /dev/null and b/mods/ethereal/textures/ethereal_wild_onion_4.png differ diff --git a/mods/ethereal/textures/ethereal_wild_onion_5.png b/mods/ethereal/textures/ethereal_wild_onion_5.png new file mode 100644 index 00000000..a16250de Binary files /dev/null and b/mods/ethereal/textures/ethereal_wild_onion_5.png differ diff --git a/mods/ethereal/textures/ethereal_willow_sapling.png b/mods/ethereal/textures/ethereal_willow_sapling.png new file mode 100644 index 00000000..28a69a4c Binary files /dev/null and b/mods/ethereal/textures/ethereal_willow_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_willow_trunk.png b/mods/ethereal/textures/ethereal_willow_trunk.png new file mode 100644 index 00000000..46d2ab3b Binary files /dev/null and b/mods/ethereal/textures/ethereal_willow_trunk.png differ diff --git a/mods/ethereal/textures/ethereal_willow_trunk_top.png b/mods/ethereal/textures/ethereal_willow_trunk_top.png new file mode 100644 index 00000000..12edfa6b Binary files /dev/null and b/mods/ethereal/textures/ethereal_willow_trunk_top.png differ diff --git a/mods/ethereal/textures/ethereal_willow_twig.png b/mods/ethereal/textures/ethereal_willow_twig.png new file mode 100644 index 00000000..72dd83e2 Binary files /dev/null and b/mods/ethereal/textures/ethereal_willow_twig.png differ diff --git a/mods/ethereal/textures/ethereal_willow_wood.png b/mods/ethereal/textures/ethereal_willow_wood.png new file mode 100644 index 00000000..34449c7d Binary files /dev/null and b/mods/ethereal/textures/ethereal_willow_wood.png differ diff --git a/mods/ethereal/textures/ethereal_worm.png b/mods/ethereal/textures/ethereal_worm.png new file mode 100644 index 00000000..b7a4f8d5 Binary files /dev/null and b/mods/ethereal/textures/ethereal_worm.png differ diff --git a/mods/ethereal/textures/ethereal_yellow_leaves.png b/mods/ethereal/textures/ethereal_yellow_leaves.png new file mode 100644 index 00000000..47084f40 Binary files /dev/null and b/mods/ethereal/textures/ethereal_yellow_leaves.png differ diff --git a/mods/ethereal/textures/ethereal_yellow_tree.png b/mods/ethereal/textures/ethereal_yellow_tree.png new file mode 100644 index 00000000..f9c8caae Binary files /dev/null and b/mods/ethereal/textures/ethereal_yellow_tree.png differ diff --git a/mods/ethereal/textures/ethereal_yellow_tree_sapling.png b/mods/ethereal/textures/ethereal_yellow_tree_sapling.png new file mode 100644 index 00000000..419dff0b Binary files /dev/null and b/mods/ethereal/textures/ethereal_yellow_tree_sapling.png differ diff --git a/mods/ethereal/textures/ethereal_yellow_tree_top.png b/mods/ethereal/textures/ethereal_yellow_tree_top.png new file mode 100644 index 00000000..2dbb8b43 Binary files /dev/null and b/mods/ethereal/textures/ethereal_yellow_tree_top.png differ diff --git a/mods/ethereal/textures/ethereal_yellow_wood.png b/mods/ethereal/textures/ethereal_yellow_wood.png new file mode 100644 index 00000000..3dea8b6b Binary files /dev/null and b/mods/ethereal/textures/ethereal_yellow_wood.png differ diff --git a/mods/ethereal/textures/farming_orange.png b/mods/ethereal/textures/farming_orange.png new file mode 100644 index 00000000..8b9ec299 Binary files /dev/null and b/mods/ethereal/textures/farming_orange.png differ diff --git a/mods/ethereal/textures/moretrees_birch_leaves.png b/mods/ethereal/textures/moretrees_birch_leaves.png new file mode 100644 index 00000000..547f133b Binary files /dev/null and b/mods/ethereal/textures/moretrees_birch_leaves.png differ diff --git a/mods/ethereal/textures/moretrees_birch_sapling.png b/mods/ethereal/textures/moretrees_birch_sapling.png new file mode 100644 index 00000000..afb03f3b Binary files /dev/null and b/mods/ethereal/textures/moretrees_birch_sapling.png differ diff --git a/mods/ethereal/textures/moretrees_birch_trunk.png b/mods/ethereal/textures/moretrees_birch_trunk.png new file mode 100644 index 00000000..2b222f7b Binary files /dev/null and b/mods/ethereal/textures/moretrees_birch_trunk.png differ diff --git a/mods/ethereal/textures/moretrees_birch_trunk_top.png b/mods/ethereal/textures/moretrees_birch_trunk_top.png new file mode 100644 index 00000000..6e5b3bb2 Binary files /dev/null and b/mods/ethereal/textures/moretrees_birch_trunk_top.png differ diff --git a/mods/ethereal/textures/moretrees_birch_wood.png b/mods/ethereal/textures/moretrees_birch_wood.png new file mode 100644 index 00000000..621f8eec Binary files /dev/null and b/mods/ethereal/textures/moretrees_birch_wood.png differ diff --git a/mods/ethereal/textures/moretrees_coconut.png b/mods/ethereal/textures/moretrees_coconut.png new file mode 100644 index 00000000..1783f6f4 Binary files /dev/null and b/mods/ethereal/textures/moretrees_coconut.png differ diff --git a/mods/ethereal/textures/moretrees_coconut_slice.png b/mods/ethereal/textures/moretrees_coconut_slice.png new file mode 100644 index 00000000..91f957f1 Binary files /dev/null and b/mods/ethereal/textures/moretrees_coconut_slice.png differ diff --git a/mods/ethereal/textures/moretrees_palm_leaves.png b/mods/ethereal/textures/moretrees_palm_leaves.png new file mode 100644 index 00000000..90b07002 Binary files /dev/null and b/mods/ethereal/textures/moretrees_palm_leaves.png differ diff --git a/mods/ethereal/textures/moretrees_palm_sapling.png b/mods/ethereal/textures/moretrees_palm_sapling.png new file mode 100644 index 00000000..48b8cd23 Binary files /dev/null and b/mods/ethereal/textures/moretrees_palm_sapling.png differ diff --git a/mods/ethereal/textures/moretrees_palm_trunk.png b/mods/ethereal/textures/moretrees_palm_trunk.png new file mode 100644 index 00000000..a0641572 Binary files /dev/null and b/mods/ethereal/textures/moretrees_palm_trunk.png differ diff --git a/mods/ethereal/textures/moretrees_palm_trunk_top.png b/mods/ethereal/textures/moretrees_palm_trunk_top.png new file mode 100644 index 00000000..655cd248 Binary files /dev/null and b/mods/ethereal/textures/moretrees_palm_trunk_top.png differ diff --git a/mods/ethereal/textures/moretrees_palm_wood.png b/mods/ethereal/textures/moretrees_palm_wood.png new file mode 100644 index 00000000..c0c0ed64 Binary files /dev/null and b/mods/ethereal/textures/moretrees_palm_wood.png differ diff --git a/mods/ethereal/water.lua b/mods/ethereal/water.lua new file mode 100644 index 00000000..bcc4f95a --- /dev/null +++ b/mods/ethereal/water.lua @@ -0,0 +1,198 @@ + +local S = minetest.get_translator("ethereal") + +-- Thin Ice + +local math_random = math.random + +minetest.register_node("ethereal:thin_ice", { + description = S("Thin Ice"), + tiles = {"default_ice.png^[opacity:80"}, + inventory_image = "default_ice.png^[opacity:80", + wield_image = "default_ice.png^[opacity:80", + use_texture_alpha = "blend", + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + drop = {}, + node_box = { + type = "fixed", fixed = {{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}}, + }, + collision_box = { + type = "fixed", fixed = {{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}}, + }, + groups = {cracky = 3, crumbly = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_glass_defaults(), + + on_walk_over = function(pos, node, player) + + if math_random(50) == 13 then -- ice breaks if player unlucky + + minetest.sound_play("default_ice_dug", + {pos = pos, gain = 0.5, pitch = 1.4, max_hear_distance = 5}, true) + + minetest.remove_node(pos) + end + end +}) + +-- Ice Brick + +minetest.register_node("ethereal:icebrick", { + description = S("Ice Brick"), + tiles = {"ethereal_brick_ice.png"}, + paramtype = "light", + is_ground_content = false, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_glass_defaults() +}) + +minetest.register_craft({ + output = "ethereal:icebrick 4", + recipe = { + {"default:ice", "default:ice"}, + {"default:ice", "default:ice"} + } +}) + +-- Snow Brick + +minetest.register_node("ethereal:snowbrick", { + description = S("Snow Brick"), + tiles = {"ethereal_brick_snow.png"}, + paramtype = "light", + is_ground_content = false, + groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} + }) +}) + +minetest.register_craft({ + output = "ethereal:snowbrick 4", + recipe = { + {"default:snowblock", "default:snowblock"}, + {"default:snowblock", "default:snowblock"} + } +}) + +-- If Crystal Spike or Snowblock near Water, change Water to Ice + +minetest.register_abm({ + label = "Ethereal freeze water", + nodenames = { + "ethereal:crystal_spike", "default:snowblock", "ethereal:snowbrick" + }, + neighbors = {"default:water_source", "default:river_water_source"}, + interval = 15, + chance = 4, + catch_up = false, + + action = function(pos, node) + + local near = minetest.find_node_near(pos, 1, + {"default:water_source", "default:river_water_source"}) + + if near then + minetest.swap_node(near, {name = "default:ice"}) + end + end +}) + +-- If Heat Source near Ice or Snow then melt. + +minetest.register_abm({ + label = "Ethereal melt snow/ice", + nodenames = { + "default:ice", "default:snowblock", "default:snow", "ethereal:thin_ice", + "default:dirt_with_snow", "ethereal:snowbrick", "ethereal:icebrick" + }, + neighbors = { + "fire:basic_flame", "default:lava_source", "default:lava_flowing", + "default:furnace_active", "default:torch", "default:torch_wall", + "default:torch_ceiling", "fire:permanent_flame" + }, + interval = 7, + chance = 4, + catch_up = false, + + action = function(pos, node) + + local water_node = "default:water" + + if pos.y > 2 then + water_node = "default:river_water" + end + + if node.name == "default:ice" + or node.name == "default:snowblock" + or node.name == "ethereal:icebrick" + or node.name == "ethereal:snowbrick" then + minetest.swap_node(pos, {name = water_node .. "_source"}) + + elseif node.name == "default:snow" + or node.name == "ethereal:thin_ice" then + minetest.swap_node(pos, {name = water_node .. "_flowing"}) + + elseif node.name == "default:dirt_with_snow" then + minetest.swap_node(pos, {name = "default:dirt_with_grass"}) + end + + ethereal.check_falling(pos) + end +}) + +-- If Water Source near Dry Dirt, change to normal Dirt + +minetest.register_abm({ + label = "Ethereal wet dry dirt", + nodenames = { + "ethereal:dry_dirt", "default:dirt_with_dry_grass", + "default:dry_dirt", "default:dry_dirt_with_dry_grass" + }, + neighbors = {"group:water"}, + interval = 15, + chance = 3, + catch_up = false, + + action = function(pos, node) + + if node.name == "ethereal:dry_dirt" or node.name == "default:dry_dirt" then + minetest.swap_node(pos, {name = "default:dirt"}) + elseif node.name == "default:dirt_with_dry_grass" then + minetest.swap_node(pos, {name = "default:dirt_with_grass"}) + else + minetest.swap_node(pos, {name = "default:dirt_with_dry_grass"}) + end + end +}) + +-- when enabled, override torches so they drop when touching water + +if ethereal.torchdrop == true and not minetest.get_modpath("real_torch") then + + local function on_flood(pos, oldnode, newnode) + + minetest.add_item(pos, ItemStack("default:torch 1")) + + local def = minetest.registered_items[newnode.name] + + if def and def.groups and def.groups.water and def.groups.water > 0 then + + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 10, gain = 0.1}, true) + end + + return false -- remove node + end + + local function torch_override(name) + minetest.override_item("default:" .. name, {on_flood = on_flood}) + end + + torch_override("torch") + torch_override("torch_wall") + torch_override("torch_ceiling") +end diff --git a/mods/ethereal/wood.lua b/mods/ethereal/wood.lua new file mode 100644 index 00000000..e4c728b4 --- /dev/null +++ b/mods/ethereal/wood.lua @@ -0,0 +1,362 @@ + +local S = minetest.get_translator("ethereal") + +-- register wood and placement helper + +local function add_wood(name, def) + + if ethereal.wood_rotate then + def.on_place = minetest.rotate_node + else + def.place_param2 = 0 + end + + minetest.register_node(name, def) +end + +-- basandra + +add_wood("ethereal:basandra_wood", { + description = S("Basandra Wood"), + tiles = {"ethereal_basandra_bush_wood.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + output = "ethereal:basandra_wood 2", + recipe = {{"ethereal:basandra_bush_stem"}} +}) + +-- sakura + +minetest.register_node("ethereal:sakura_trunk", { + description = S("Sakura Trunk"), + tiles = { + "ethereal_sakura_trunk_top.png", + "ethereal_sakura_trunk_top.png", + "ethereal_sakura_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:sakura_wood", { + description = S("Sakura Wood"), + tiles = {"ethereal_sakura_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:sakura_wood 4", + recipe = {{"ethereal:sakura_trunk"}} +}) + +-- willow + +minetest.register_node("ethereal:willow_trunk", { + description = S("Weeping Willow Trunk"), + tiles = { + "ethereal_willow_trunk_top.png", + "ethereal_willow_trunk_top.png", + "ethereal_willow_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:willow_wood", { + description = S("Weeping Willow Wood"), + tiles = {"ethereal_willow_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:willow_wood 4", + recipe = {{"ethereal:willow_trunk"}} +}) + +-- redwood + +minetest.register_node("ethereal:redwood_trunk", { + description = S("Redwood Trunk"), + tiles = { + "ethereal_redwood_trunk_top.png", + "ethereal_redwood_trunk_top.png", + "ethereal_redwood_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:redwood_wood", { + description = S("Redwood Wood"), + tiles = {"ethereal_redwood_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:redwood_wood 4", + recipe = {{"ethereal:redwood_trunk"}} +}) + +-- frost + +minetest.register_node("ethereal:frost_tree", { + description = S("Frost Tree"), + tiles = { + "ethereal_frost_tree_top.png", + "ethereal_frost_tree_top.png", + "ethereal_frost_tree.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:frost_wood", { + description = S("Frost Wood"), + tiles = {"ethereal_frost_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:frost_wood 4", + recipe = {{"ethereal:frost_tree"}} +}) + +-- healing + +minetest.register_node("ethereal:yellow_trunk", { + description = S("Healing Tree Trunk"), + tiles = { + "ethereal_yellow_tree_top.png", + "ethereal_yellow_tree_top.png", + "ethereal_yellow_tree.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:yellow_wood", { + description = S("Healing Tree Wood"), + tiles = {"ethereal_yellow_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:yellow_wood 4", + recipe = {{"ethereal:yellow_trunk"}} +}) + +-- palm (thanks to VanessaE for palm textures) + +minetest.register_node("ethereal:palm_trunk", { + description = S("Palm Trunk"), + tiles = { + "moretrees_palm_trunk_top.png", + "moretrees_palm_trunk_top.png", + "moretrees_palm_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:palm_wood", { + description = S("Palm Wood"), + tiles = {"moretrees_palm_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:palm_wood 4", + recipe = {{"ethereal:palm_trunk"}} +}) + +-- banana + +minetest.register_node("ethereal:banana_trunk", { + description = S("Banana Trunk"), + tiles = { + "ethereal_banana_trunk_top.png", + "ethereal_banana_trunk_top.png", + "ethereal_banana_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:banana_wood", { + description = S("Banana Wood"), + tiles = {"ethereal_banana_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:banana_wood 4", + recipe = {{"ethereal:banana_trunk"}} +}) + +-- scorched + +minetest.register_node("ethereal:scorched_tree", { + description = S("Scorched Tree"), + tiles = { + "ethereal_scorched_tree_top.png", + "ethereal_scorched_tree_top.png", + "ethereal_scorched_tree.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 1}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +minetest.register_craft({ + output = "ethereal:scorched_tree 8", + recipe = { + {"group:tree", "group:tree", "group:tree"}, + {"group:tree", "default:torch", "group:tree"}, + {"group:tree", "group:tree", "group:tree"} + } +}) + +-- mushroom + +minetest.register_node("ethereal:mushroom_trunk", { + description = S("Mushroom"), + tiles = { + "ethereal_mushroom_trunk_top.png", + "ethereal_mushroom_trunk_top.png", + "ethereal_mushroom_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +-- birch (thanks to VanessaE for birch textures) + +minetest.register_node("ethereal:birch_trunk", { + description = S("Birch Trunk"), + tiles = { + "moretrees_birch_trunk_top.png", + "moretrees_birch_trunk_top.png", + "moretrees_birch_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:birch_wood", { + description = S("Birch Wood"), + tiles = {"moretrees_birch_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:birch_wood 4", + recipe = {{"ethereal:birch_trunk"}} +}) + +-- Bamboo + +minetest.register_node("ethereal:bamboo", { + description = S("Bamboo"), + drawtype = "plantlike", + tiles = {"ethereal_bamboo_trunk.png"}, + inventory_image = "ethereal_bamboo_trunk.png", + wield_image = "ethereal_bamboo_trunk.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15} + }, + collision_box = { + type = "fixed", fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15} + }, + groups = {choppy = 3, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end +}) + +minetest.register_craft({ + type = "fuel", + recipe = "ethereal:bamboo", + burntime = 2 +}) + +-- olive + +minetest.register_node("ethereal:olive_trunk", { + description = S("Olive Trunk"), + tiles = { + "ethereal_olive_trunk_top.png", + "ethereal_olive_trunk_top.png", + "ethereal_olive_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node +}) + +add_wood("ethereal:olive_wood", { + description = S("Olive Wood"), + tiles = {"ethereal_olive_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir" +}) + +minetest.register_craft({ + output = "ethereal:olive_wood 4", + recipe = {{"ethereal:olive_trunk"}} +}) diff --git a/mods/everness/LICENSE.txt b/mods/everness/LICENSE.txt new file mode 100644 index 00000000..a246569c --- /dev/null +++ b/mods/everness/LICENSE.txt @@ -0,0 +1,1734 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 2024 SaKeL + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +### Code + +GNU Lesser General Public License v2.1 or later + +### Textures + +**CC-BY-SA-4.0, by SaKeL** + +- everness_agave_leaf_1.png +- everness_agave_leaf_2.png +- everness_agave_leaf_3.png +- everness_amaranita_lantern_fur.png +- everness_amaranita_lantern_item.png +- everness_amaranita_lantern_light.png +- everness_amaranita_lantern_roots.png +- everness_ancient_emerald_ice.png +- everness_bamboo_block_side.png +- everness_bamboo_block_top.png +- everness_bamboo_forest_sun_tonemap.png +- everness_bamboo_forest_sun.png +- everness_bamboo_forest_sunrisebg.png +- everness_bamboo_item.png +- everness_bamboo_large_1.png +- everness_bamboo_large_2.png +- everness_bamboo_large_3.png +- everness_bamboo_large_bottom.png +- everness_bamboo_large_top.png +- everness_bamboo_mosaic.png +- everness_bamboo_small_1.png +- everness_bamboo_small_2.png +- everness_bamboo_small_top.png +- everness_bamboo_sprout.png +- everness_baobab_savanna_sun.png +- everness_baobab_tree_fruit_roasted.png +- everness_baobab_tree_fruit.png +- everness_baobab_tree_leaves.png +- everness_baobab_tree_sapling.png +- everness_baobab_tree_side.png +- everness_baobab_tree_top.png +- everness_baobab_wood.png +- everness_bloodspore_plant_small.png +- everness_bloodspore_plant.png +- everness_blooming_cooksonia.png +- everness_blue_crying_obsidian.png +- everness_blue_vine_lantern_item.png +- everness_blue_vine_lantern_leaves.png +- everness_blue_vine_lantern_roots.png +- everness_blue_vine_lantern.png +- everness_blue_weeping_obsidian.png +- everness_bone_top.png +- everness_bone.png +- everness_bucket_empty.png +- everness_bucket_mineral_water.png +- everness_bulb_vine_1.png +- everness_bulb_vine_2.png +- everness_bulb_vine_end.png +- everness_cactus_blue_side.png +- everness_cactus_blue_top.png +- everness_cactus_side.png +- everness_cactus_top.png +- everness_candle_flame_animated.png +- everness_cave_barrel_cactus_item.png +- everness_cave_barrel_cactus_mesh.png +- everness_cave_flower_item_particles.png +- everness_cave_flower_item.png +- everness_cave_flower_mesh_particles.png +- everness_cave_flower_mesh.png +- everness_ceramic_pot_blank_mesh.png +- everness_ceramic_pot_flowers_mesh.png +- everness_ceramic_pot_line_mesh.png +- everness_ceramic_pot_tribal_mesh.png +- everness_ceramic_pot_blank_sherd.png +- everness_ceramic_pot_flowers_sherd.png +- everness_ceramic_pot_line_sherd.png +- everness_ceramic_pot_tribal_sherd.png +- everness_chest_front.png +- everness_chest_inside.png +- everness_chest_side.png +- everness_chest_top.png +- everness_chest_ui_bg_hb_slot.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_chest_ui_bg_slot.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_chest_ui_bg.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_cobweb.png +- everness_coconut_bottom.png +- everness_coconut_item.png +- everness_coconut_side_z.png +- everness_coconut_side.png +- everness_coconut_top.png +- everness_coral_bones_block.png +- everness_coral_bones_brick.png +- everness_coral_bones.png +- everness_coral_burdock_1.png +- everness_coral_burdock_2.png +- everness_coral_bush.png +- everness_coral_corals.png +- everness_coral_desert_cobble.png +- everness_coral_desert_mossy_cobble.png +- everness_coral_desert_stone_block.png +- everness_coral_desert_stone_brick.png +- everness_coral_desert_stone.png +- everness_coral_dirt.png +- everness_coral_forest_deep_ocean_lantern_animated.png +- everness_coral_forest_deep_ocean_lantern_bottom.png +- everness_coral_forest_deep_ocean_lantern_top.png +- everness_coral_forest_sun_tonemap.png +- everness_coral_forest_sun.png +- everness_coral_grass_1.png +- everness_coral_grass_2.png +- everness_coral_grass_3.png +- everness_coral_grass_4.png +- everness_coral_grass_5.png +- everness_coral_grass_globulagus.png +- everness_coral_grass_orange.png +- everness_coral_grass_side.png +- everness_coral_grass_tall.png +- everness_coral_grass.png +- everness_coral_jellyfish.png +- everness_coral_leaves.png +- everness_coral_mushrooms_bioluminescent.png +- everness_coral_plant_bioluminescent.png +- everness_coral_sand.png +- everness_coral_sandstone_brick.png +- everness_coral_sandstone_carved_1.png +- everness_coral_sandstone_chiseled.png +- everness_coral_sandstone.png +- everness_coral_shrub.png +- everness_coral_skeleton.png +- everness_coral_stone_with_moss_side.png +- everness_coral_stone_with_moss_top.png +- everness_coral_tree_bioluminescent_sapling.png +- everness_coral_tree_sapling.png +- everness_coral_tree.png +- everness_coral_white_sand.png +- everness_coral_white_sandstone_brick.png +- everness_coral_white_sandstone_pillar.png +- everness_coral_white_sandstone.png +- everness_creeping_moss_spores.png +- everness_crystal_block_cyan_top.png +- everness_crystal_block_cyan.png +- everness_crystal_block_orange_top.png +- everness_crystal_block_orange.png +- everness_crystal_block_purple_top.png +- everness_crystal_block_purple.png +- everness_crystal_bush_leaves.png +- everness_crystal_bush_sapling.png +- everness_crystal_bush_stem.png +- everness_crystal_cave_dirt_side.png +- everness_crystal_cave_dirt_top.png +- everness_crystal_cave_dirt.png +- everness_crystal_cave_moss.png +- everness_crystal_cobble.png +- everness_crystal_coral_dark_block.png +- everness_crystal_coral_light_block.png +- everness_crystal_cyan.png +- everness_crystal_dirt.png +- everness_crystal_forest_moon_tonemap.png +- everness_crystal_forest_moon.png +- everness_crystal_forest_sun_tonemap.png +- everness_crystal_forest_sun.png +- everness_crystal_grass_1.png +- everness_crystal_grass_2.png +- everness_crystal_grass_3.png +- everness_crystal_grass_side.png +- everness_crystal_grass.png +- everness_crystal_leaves.png +- everness_crystal_lily_flower_small.png +- everness_crystal_lily_leaf_small.png +- everness_crystal_mossy_cobble.png +- everness_crystal_mushrooms.png +- everness_crystal_orange.png +- everness_crystal_purple.png +- everness_crystal_sand.png +- everness_crystal_sandstone_brick.png +- everness_crystal_sandstone_chiseled.png +- everness_crystal_sandstone.png +- everness_crystal_stone_brick.png +- everness_crystal_stone.png +- everness_crystal_tree_large_sapling.png +- everness_crystal_tree_sapling.png +- everness_crystal_tree_top.png +- everness_crystal_tree.png +- everness_cursed_bar_top.png +- everness_cursed_bar.png +- everness_cursed_brick_carved.png +- everness_cursed_brick_mixed.png +- everness_cursed_brick_with_growth.png +- everness_cursed_brick.png +- everness_cursed_bush_leaves.png +- everness_cursed_bush_sapling.png +- everness_cursed_bush_stem.png +- everness_cursed_dirt.png +- everness_cursed_dream_stone.png +- everness_cursed_dream_tree_sapling.png +- everness_cursed_dry_pine_leaves.png +- everness_cursed_grass_side.png +- everness_cursed_grass.png +- everness_cursed_lands_moon_tonemap.png +- everness_cursed_lands_moon.png +- everness_cursed_lands_sun_tonemap.png +- everness_cursed_lands_sun.png +- everness_cursed_lands_sunrisebg.png +- everness_cursed_mud.png +- everness_cursed_pumpkin_bottom.png +- everness_cursed_pumpkin_front.png +- everness_cursed_pumpkin_side.png +- everness_cursed_pumpkin_top.png +- everness_cursed_sand.png +- everness_cursed_sandstone_block.png +- everness_cursed_sandstone_brick.png +- everness_cursed_stone_carved.png +- everness_cursed_stone.png +- everness_dense_emerald_ice.png +- everness_dense_vine_1.png +- everness_dense_vine_2.png +- everness_dense_vine_end.png +- everness_dirt_1.png +- everness_dirt.png +- everness_door_bamboo_item.png +- everness_door_bamboo.png +- everness_door_bone_pyrite_item.png +- everness_door_bone_pyrite.png +- everness_door_cursed_steel_bar_item.png +- everness_door_cursed_steel_bar.png +- everness_door_trapdoor_bamboo_side.png +- everness_door_trapdoor_bamboo.png +- everness_door_willow_item.png +- everness_door_willow.png +- everness_dry_bamboo_block_side.png +- everness_dry_bamboo_block_top.png +- everness_dry_branches.png +- everness_dry_dirt.png +- everness_dry_grass_1.png -- thanks to Khaz +- everness_dry_grass_2.png -- thanks to Khaz +- everness_dry_grass_3.png -- thanks to Khaz +- everness_dry_grass_4.png -- thanks to Khaz +- everness_dry_grass_side.png +- everness_dry_grass_top.png +- everness_dry_tree_sapling.png +- everness_dry_tree_top.png +- everness_dry_tree.png +- everness_dry_wood.png +- everness_egg_plant_bottom.png +- everness_egg_plant_item.png +- everness_egg_plant_side.png +- everness_egg_plant_top.png +- everness_emerald_ice.png +- everness_eye_vine_1.png +- everness_eye_vine_2.png +- everness_eye_vine_end_bottom.png +- everness_eye_vine_end_side.png +- everness_eye_vine_end_top.png +- everness_farming_soil_overlay.png -- Derived from texture by PilzAdam (CC BY 3.0) +- everness_farming_soil_wet_overlay.png -- Derived from texture by PilzAdam (CC BY 3.0) +- everness_farming_soil_wet_side_overlay.png -- Derived from texture by PilzAdam (CC BY 3.0) +- everness_fence_bamboo_wood.png +- everness_fence_dry_wood.png +- everness_fence_rail_bamboo_wood.png +- everness_fence_rail_dry_wood.png +- everness_flame_permanent_blue_item.png +- everness_flame_permanent_blue.png +- everness_flame_permanent_item.png +- everness_flame_permanent_purple_item.png +- everness_flame_permanent_purple.png +- everness_flame_permanent.png +- everness_floating_crystal_animated.png +- everness_flowered_vine_1.png +- everness_flowered_vine_2.png +- everness_flowered_vine_end.png +- everness_flowers_magenta_side_x.png +- everness_flowers_magenta_side_z.png +- everness_flowers_magenta.png +- everness_flowers_side_x.png +- everness_flowers_side_z.png +- everness_flowers.png +- everness_forsaken_desert_brick_red.png +- everness_forsaken_desert_brick.png +- everness_forsaken_desert_chiseled_stone_bottom.png +- everness_forsaken_desert_chiseled_stone_side.png +- everness_forsaken_desert_chiseled_stone_top.png +- everness_forsaken_desert_cobble_red.png +- everness_forsaken_desert_cobble.png +- everness_forsaken_desert_dry_ocean_dirt.png +- everness_forsaken_desert_engraved_stone.png +- everness_forsaken_desert_plant_1.png +- everness_forsaken_desert_plant_2.png +- everness_forsaken_desert_plant_3.png +- everness_forsaken_desert_sand.png +- everness_forsaken_desert_stone.png +- everness_forsaken_desert_sun_tonemap.png +- everness_forsaken_desert_sun.png +- everness_forsaken_fire_item.png +- everness_forsaken_fire_mesh.png +- everness_forsaken_tundra_beach_sand_with_shells.png +- everness_forsaken_tundra_beach_sand.png +- everness_forsaken_tundra_brick.png +- everness_forsaken_tundra_cobblestone.png +- everness_forsaken_tundra_dirt.png +- everness_forsaken_tundra_grass_bckp.png +- everness_forsaken_tundra_grass_side_bckp.png +- everness_forsaken_tundra_grass_side.png +- everness_forsaken_tundra_grass.png +- everness_forsaken_tundra_rocks_side.png +- everness_forsaken_tundra_rocks_top.png +- everness_forsaken_tundra_stone.png +- everness_forsaken_tundra_sun_tonemap.png +- everness_forsaken_tundra_sun.png +- everness_forsythia_item.png +- everness_forsythia_mesh.png +- everness_frosted_coral.png +- everness_frosted_ice_translucent.png +- everness_frosted_ice.png +- everness_frosted_icesheet_sun_tonemap.png +- everness_frosted_icesheet_sun.png +- everness_frosted_icicle.png +- everness_frosted_snow.png +- everness_glass_detail.png +- everness_glass.png +- everness_glowing_pillar_item.png +- everness_glowing_pillar_leaves.png +- everness_glowing_pillar_luminophor.png +- everness_glowing_pillar_roots.png +- everness_golden_vine_1.png +- everness_golden_vine_2.png +- everness_golden_vine_end.png +- everness_grass_extras_1.png +- everness_grass_extras_2.png +- everness_grass_side.png +- everness_grass_top.png +- everness_gravel.png +- everness_hammer_item.png +- everness_hammer_mesh.png +- everness_hammer_sharp_item.png +- everness_hammer_sharp_mesh.png +- everness_hollow_tree_side.png +- everness_hollow_tree_top.png +- everness_icecobble.png +- everness_illumi_root.png +- everness_ivis_moss.png +- everness_ivis_vine_end.png +- everness_ivis_vine_1.png +- everness_ivis_vine_2.png +- everness_lootchest_marker_side.png +- everness_lootchest_marker_top.png +- everness_lotus_flower_mesh_not_animated.png +- everness_lotus_flower_pink_item.png +- everness_lotus_flower_pink_mesh_animated.png +- everness_lotus_flower_pink_mesh.png +- everness_lotus_flower_purple_item.png +- everness_lotus_flower_purple_mesh_animated.png +- everness_lotus_flower_purple_mesh.png +- everness_lotus_flower_white_item.png +- everness_lotus_flower_white_mesh_animated.png +- everness_lotus_flower_white_mesh.png +- everness_lotus_leaf_2_item.png +- everness_lotus_leaf_2_y.png +- everness_lotus_leaf_3_item.png +- everness_lotus_leaf_3_y.png +- everness_lotus_leaf_item.png +- everness_lotus_leaf_y.png +- everness_lumabus_bulb_purple.png +- everness_lumabus_leaves.png +- everness_lumabus_vine_end.png +- everness_lumabus_vine_1.png +- everness_lumabus_vine_2.png +- everness_lumecorn_item.png +- everness_lumecorn_leaf.png +- everness_lumecorn_light.png +- everness_lumecorn_root.png +- everness_magmacobble_animated.png +- everness_magmacobble.png +- everness_marsh_grass.png +- everness_mcl_bucket_mineral_water.png +- everness_mcl_doors_door_bamboo_lower.png +- everness_mcl_doors_door_bamboo_side_upper.png +- everness_mcl_doors_door_bamboo_upper.png +- everness_mcl_doors_door_bone_pyrite_lower.png +- everness_mcl_doors_door_bone_pyrite_side_upper.png +- everness_mcl_doors_door_bone_pyrite_upper.png +- everness_mcl_doors_door_crystal_wood_lower.png +- everness_mcl_doors_door_crystal_wood_side_lower.png +- everness_mcl_doors_door_crystal_wood_side_upper.png +- everness_mcl_doors_door_crystal_wood_upper.png +- everness_mcl_doors_door_willow_lower.png +- everness_mcl_doors_door_willow_side_lower.png +- everness_mcl_doors_door_willow_side_upper.png +- everness_mcl_doors_door_willow_upper.png +- everness_mcl_doors_trapdoor_bamboo_side.png +- everness_mcl_doors_trapdoor_crystal_wood_side.png +- everness_mese_leaves.png +- everness_mese_tree_fruit_item.png +- everness_mese_tree_fruit_side.png +- everness_mese_tree_fruit_top.png +- everness_mese_tree_sapling.png +- everness_mese_tree_side_animated.png +- everness_mese_tree_top.png +- everness_mese_wood.png +- everness_mineral_cobblestone.png +- everness_mineral_pyrite.png +- everness_mineral_sand.png +- everness_mineral_sandstone_block.png +- everness_mineral_sandstone.png +- everness_mineral_stone_block.png +- everness_mineral_stone_brick_with_flower_growth.png +- everness_mineral_stone_brick_with_growth.png +- everness_mineral_stone_brick.png +- everness_mineral_stone.png +- everness_mineral_torch_animated.png +- everness_mineral_torch_item.png +- everness_mineral_torch_mesh.png +- everness_mineral_water_flowing_animated.png +- everness_mineral_water_source_animated.png +- everness_mineral_water_weed_1.png +- everness_mineral_water_weed_2.png +- everness_mineral_water_weed_3.png +- everness_mineral_water.png +- everness_mold_stone_with_moss_side.png +- everness_mold_stone_with_moss_top.png +- everness_mold_stone.png +- everness_moss_block.png +- everness_mtg_bucket_mineral_water.png +- everness_mud.png +- everness_ngrass_1.png +- everness_ngrass_2.png +- everness_palm_tree_leaves.png +- everness_palm_tree_sapling.png +- everness_palm_tree_side.png +- everness_palm_tree_top.png +- everness_palm_tree_wood.png +- everness_particle.png +- everness_pick_illuminating.png +- everness_pyrite_block_forged.png +- everness_pyrite_block_polished.png +- everness_pyrite_block_slab_brick.png +- everness_pyrite_block_spiral.png +- everness_pyrite_block.png +- everness_pyrite_glass.png +- everness_pyrite_ingot.png +- everness_pyrite_lantern.png +- everness_pyrite_lump.png +- everness_pyrite_pillar_bottom.png +- everness_pyrite_pillar_middle.png +- everness_pyrite_pillar_small.png +- everness_pyrite_pillar_top.png +- everness_pyriteblock_brick.png +- everness_quartz_block_bottom.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_chiseled_top.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_chiseled.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_lines_top.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_lines.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_side.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_top.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_ore.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_red_castor_1.png +- everness_red_castor_2.png +- everness_red_castor_3.png +- everness_red_castor_4.png +- everness_reeds_vine_1.png +- everness_reeds_vine_2.png +- everness_reeds_vine_end.png +- everness_rose_bush_item.png +- everness_rose_bush_mesh.png +- everness_scull_with_candle_inventory.png +- everness_sequoia_tree_leaves.png +- everness_sequoia_tree_sapling.png +- everness_sequoia_tree_side.png +- everness_sequoia_tree_top.png +- everness_sequoia_wood.png +- everness_shovel_silk.png +- everness_smoke_cloud_particle_animated.png +- everness_snowcobble.png +- everness_soul_sandstone_veined_side.png +- everness_soul_sandstone_veined_top.png +- everness_soul_sandstone.png +- everness_spine_kelp.png +- everness_starfish.png +- everness_stone.png +- everness_sulfur_stone.png +- everness_tenanea_flowers_vine_1.png +- everness_tenanea_flowers_vine_2.png +- everness_tenanea_flowers_vine_end.png +- everness_termite_block.png +- everness_tinted_glass_base.png +- everness_tinted_glass_detail.png +- everness_trapdoor_cursed_steel_bar_side.png +- everness_trapdoor_cursed_steel_bar.png +- everness_twisted_crystal_grass.png +- everness_twisted_vine_1.png +- everness_twisted_vine_2.png +- everness_twisted_vine_end.png +- everness_venus_trap_item.png +- everness_venus_trap_mesh.png +- everness_vine_cave_end.png +- everness_vine_cave_1.png +- everness_vine_cave_2.png +- everness_vine_shears.png +- everness_volcanic_rock_with_magma_animated.png +- everness_volcanic_rock.png +- everness_volcanic_sulfur_stone.png +- everness_weeping_obsidian.png +- everness_whispering_gourd_vine_1.png +- everness_whispering_gourd_vine_2.png +- everness_whispering_gourd_vine_end.png +- everness_willow_leaves.png +- everness_willow_sapling.png +- everness_willow_tree_sapling.png +- everness_willow_tree_side.png +- everness_willow_tree_top.png +- everness_willow_vine_end.png +- everness_willow_vine_1.png +- everness_willow_vine_2.png +- everness_willow_wood.png -- Derived from texture by BlockMen (CC BY-SA 3.0) +- everness_xpanes_edge_pyrite.png +- everness_water_geyser_particle.png +- everness_water_geyser_item.png +- everness_mineral_sandstone_brick.png +- everness_mineral_sandstone_brick_block.png +- everness_mineral_sandstone_brick_block_top.png +- everness_fence_palm_wood.png +- everness_fence_rail_palm_wood.png +- everness_door_palm_wood.png +- everness_door_trapdoor_palm_wood.png +- everness_door_trapdoor_palm_wood_side.png +- everness_door_palm_wood_item.png +- everness_ceramic_pot_lines_sherd.png +- everness_ceramic_pot_blank_sherd.png +- everness_ceramic_pot_tribal_sherd.png +- everness_ceramic_pot_flowers_sherd.png +- everness_ceramic_sherds_ore.png +- everness_pick_archeological.png +- everness_logo.png +- everness_fence_coral_wood.png +- everness_fence_rail_coral_wood.png +- everness_bucket_lava.png +- everness_door_lava_tree_wood.png +- everness_door_lava_tree_wood_item.png +- everness_door_trapdoor_lava_tree_wood.png +- everness_door_trapdoor_lava_tree_wood_side.png +- everness_fence_lava_tree_wood.png +- everness_fence_rail_lava_tree_wood.png +- everness_lava_flowing_animated.png +- everness_lava_source_animated.png +- everness_lava_tree.png +- everness_lava_tree_animated.png +- everness_lava_tree_leaves.png +- everness_lava_tree_sapling.png +- everness_lava_tree_top.png +- everness_lava_tree_wood.png +- everness_mcl_bucket_lava.png +- everness_mineral_cave_moss.png +- everness_mineral_cave_moss_grass.png +- everness_mineral_cave_moss_side.png +- everness_mineral_cobblestone_under.png +- everness_mineral_lava_stone_animated.png +- everness_mineral_lava_stone_bottom.png +- everness_mineral_lava_stone_side.png +- everness_mineral_stone_under.png +- everness_mineral_stone_under_top.png +- everness_mtg_bucket_lava.png +- everness_wall_vine_cave_blue.png +- everness_wall_vine_cave_blue_item.png +- everness_wall_vine_cave_cyan.png +- everness_wall_vine_cave_cyan_item.png +- everness_wall_vine_cave_green.png +- everness_wall_vine_cave_green_item.png +- everness_wall_vine_cave_violet.png +- everness_wall_vine_cave_violet_item.png + +**CC-BY-SA-4.0, Pixel Perfection by XSSheep**, https://minecraft.curseforge.com/projects/pixel-perfection-freshly-updated + +- everness_fire_animated.png +- everness_flame_particle.png +- everness_rising_soul_particle.png + +### Sounds + +**CC0-1.0, by ProdMultimediasHQI**, https://freesound.org/people/ProdMultimediasHQI/sounds/512501/ + +- everness_frosted_snow_footstep.1.ogg +- everness_frosted_snow_footstep.2.ogg +- everness_frosted_snow_footstep.3.ogg +- everness_frosted_snow_footstep.4.ogg +- everness_frosted_snow_footstep.5.ogg + +**CC0-1.0, by patchytherat**, https://freesound.org + +- everness_crystal_chime.1.ogg +- everness_crystal_chime.2.ogg +- everness_crystal_chime.3.ogg +- everness_crystal_chime.4.ogg +- everness_crystal_chime.5.ogg +- everness_crystal_chime.6.ogg + +**CC0-1.0, by afleetingspeck**, https://freesound.org + +- everness_bamboo_hit.1.ogg +- everness_bamboo_hit.2.ogg +- everness_bamboo_hit.3.ogg +- everness_bamboo_hit.4.ogg +- everness_bamboo_hit.5.ogg + +**CC0-1.0, by se2001**, https://freesound.org + +- everness_bamboo_dug.1.ogg + +**CC-BY-4.0, by se2001**, https://www.playonloop.com + +- everness_ambience_graveyard_1.ogg +- everness_ambience_graveyard_7.ogg +- everness_ambience_graveyard_8.ogg +- everness_ambience_graveyard_9.ogg +- everness_ambience_graveyard_10.ogg +- everness_ambience_night_crickets_1.ogg +- everness_ambience_night_crickets_2.ogg +- everness_ambience_night_crickets_3.ogg +- everness_ambience_night_crickets_4.ogg +- everness_ambience_night_crickets_5.ogg +- everness_ambience_snow_storm_1.ogg +- everness_ambience_snow_storm_2.ogg +- everness_ambience_snow_storm_3.ogg +- everness_ambience_snow_storm_4.ogg +- everness_ambience_swamp_1.ogg +- everness_ambience_swamp_2.ogg +- everness_ambience_swamp_3.ogg +- everness_ambience_swamp_4.ogg + +**CC0-1.0, by mistersherlock**, https://freesound.org + +- everness_ambience_graveyard_2.ogg +- everness_ambience_graveyard_3.ogg +- everness_ambience_graveyard_4.ogg +- everness_ambience_graveyard_5.ogg +- everness_ambience_graveyard_6.ogg + +**CC-BY-3.0, by TinTinOko**, https://freesound.org + +- everness_ambience_monster_sigh_cave.ogg + +**CC-BY-4.0, by 150134**, https://freesound.org + +- everness_ambience_rocks_falling_cave.ogg + +**CC-BY-4.0, by tosha73**, https://freesound.org + +- everness_ambience_water_drips_cave_1.ogg + +**CC0-1.0, by SaltedMutton72**, https://freesound.org + +- everness_ambience_wind_cave_1.ogg + +**CC0-1.0, by shelbyshark**, https://freesound.org + +- everness_ambience_wind_cave_2.ogg +- everness_ambience_wind_cave_3.ogg +- everness_ambience_wind_cave_4.ogg +- everness_ambience_wind_cave_5.ogg + +**CC-BY-4.0, by LittleRobotSoundFactory**, https://freesound.org + +- everness_ambience_cave_1.ogg +- everness_ambience_cave_2.ogg +- everness_ambience_cave_6.ogg +- everness_ambience_cave_7.ogg +- everness_ambience_cave_8.ogg +- everness_ambience_cave_9.ogg + +**CC0-1.0, by szegvari**, https://freesound.org + +- everness_ambience_cave_3.ogg + +**CC0-1.0, by Bertsz**, https://freesound.org + +- everness_ambience_cave_4.ogg +- everness_ambience_cave_5.ogg + +**CC-BY-4.0, by erlipresidente**, https://freesound.org + +- everness_ambience_water_drips_cave_2.ogg + +**CC0-1.0, by qubodup**, https://freesound.org + +- everness_ambience_creepy_cave_1.ogg + +**CC0-1.0, by HorrorAudio**, https://freesound.org + +- everness_ambience_ghost_1.ogg + +**CC-BY-4.0, by klankbeeld**, https://freesound.org + +- everness_ambience_ghost_2.ogg +- everness_ambience_ghost_3.ogg +- everness_ambience_ghost_4.ogg +- everness_ambience_ghost_6.ogg + +**CC0-1.0, by Legnalegna55**, https://freesound.org + +- everness_ambience_ghost_5.ogg + +**CC-BY-4.0, by Benboncan**, https://freesound.org + +- everness_ambience_owl_1.ogg + +**CC0-1.0, by Foleyhaven**, https://freesound.org + +- everness_mud_footstep.1.ogg +- everness_mud_footstep.2.ogg +- everness_mud_footstep.3.ogg +- everness_mud_footstep.4.ogg +- everness_mud_footstep.5.ogg + +**CC-BY-4.0, by Peacewaves**, https://freesound.org + +- everness_ambience_sulfur_1.ogg +- everness_ambience_sulfur_2.ogg +- everness_ambience_sulfur_3.ogg +- everness_ambience_sulfur_4.ogg + +**CC0-1.0, by e__**, https://freesound.org + +- everness_ambience_hot_stone_1.ogg +- everness_ambience_hot_stone_2.ogg + +**CC-BY-4.0, by GregorQuendel**, https://freesound.org + +- everness_ambience_ice_cracking_1 +- everness_ambience_ice_cracking_2 +- everness_ambience_ice_cracking_3 + +**CC0-1.0, by onikage22**, https://freesound.org + +- everness_item_drop_pickup.1.ogg +- everness_item_drop_pickup.2.ogg +- everness_item_drop_pickup.3.ogg +- everness_item_drop_pickup.4.ogg + +**CC-BY-3.0, by murraysortz**, https://freesound.org + +- everness_underwater_bubbles.1.ogg +- everness_underwater_bubbles.2.ogg +- everness_underwater_bubbles.3.ogg + +**CC0-1.0, by Yuval**, https://freesound.org + +- everness_grass_footstep.1.ogg +- everness_grass_footstep.2.ogg +- everness_grass_footstep.3.ogg + +**CC0-1.0, by kyles**, https://freesound.org + +- everness_dirt_hit.1.ogg +- everness_dirt_hit.2.ogg +- everness_dirt_hit.3.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org + +- everness_grass_hit.1.ogg +- everness_grass_hit.3.ogg +- everness_grass_hit.2.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org/people/Nox_Sound/sounds/613849/ + +- everness_snow_footstep.1.ogg +- everness_snow_footstep.2.ogg +- everness_snow_footstep.3.ogg +- everness_snow_footstep.4.ogg + +**CC0-1.0, by Fission9**, https://freesound.org + +- everness_dirt_footstep.1.ogg +- everness_dirt_footstep.2.ogg +- everness_dirt_footstep.3.ogg +- everness_dirt_footstep.4.ogg +- everness_wood_footstep.1.ogg +- everness_wood_footstep.2.ogg +- everness_wood_footstep.3.ogg +- everness_wood_footstep.4.ogg +- everness_wood_footstep.5.ogg +- everness_wood_footstep.6.ogg + +**CC-BY-4.0, by InspectorJ**, https://freesound.org + +- everness_ice_footstep.1.ogg +- everness_ice_footstep.2.ogg +- everness_ice_footstep.3.ogg +- everness_ice_footstep.4.ogg + +**CC-BY-4.0, by EminYILDIRIM**, https://freesound.org + +- everness_ice_hit.1.ogg +- everness_ice_hit.2.ogg +- everness_ice_hit.3.ogg +- everness_ice_hit.4.ogg + +**CC-BY-4.0, by SFXAFRIK**, https://freesound.org/people/SFXAFRIK/sounds/584855/ + +- everness_door_glass_close.ogg +- everness_door_glass_open.ogg + +**CC-BY-4.0, by SFXAFRIK**, https://freesound.org/people/SFXAFRIK/sounds/584850/ + +- everness_chest_open.ogg +- everness_chest_close.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org + +- everness_stone_dug.1.ogg +- everness_stone_dug.2.ogg +- everness_stone_dug.3.ogg +- everness_stone_footstep.1.ogg +- everness_stone_footstep.2.ogg +- everness_stone_footstep.3.ogg +- everness_stone_footstep.4.ogg +- everness_stone_footstep.5.ogg + +**CC0-1.0, by lolamadeus**, https://freesound.org + +- everness_stone_hit.1.ogg +- everness_stone_hit.2.ogg +- everness_stone_hit.3.ogg + +**CC-BY-4.0, by F.M.Audio**, https://freesound.org + +- everness_stone_place.1.ogg +- everness_stone_place.2.ogg +- everness_stone_place.3.ogg +- everness_stone_place.4.ogg + +**CC-BY-4.0, by elektroproleter**, https://freesound.org + +- everness_leaves_footstep.1.ogg +- everness_leaves_footstep.2.ogg +- everness_leaves_footstep.3.ogg +- everness_leaves_footstep.4.ogg + +**CC-BY-4.0, by Abacagi**, https://freesound.org + +- everness_leaves_hit.1.ogg +- everness_leaves_hit.2.ogg + +**CC-BY-4.0, by JanKoehl**, https://freesound.org + +- everness_leaves_dug.1.ogg +- everness_leaves_dug.2.ogg + +**CC0-1.0, by vgraham1**, https://freesound.org + +- everness_leaves_place.1.ogg +- everness_leaves_place.2.ogg + +**CC0-1.0, by worthahep88**, https://freesound.org + +- everness_plant_hit.1.ogg +- everness_plant_hit.2.ogg +- everness_plant_hit.3.ogg + +**CC0-1.0, by GiocoSound**, https://freesound.org/people/GiocoSound/ + +- everness_wood_hit.1.ogg +- everness_wood_hit.2.ogg +- everness_wood_hit.3.ogg +- everness_wood_hit.4.ogg +- everness_wood_hit.5.ogg +- everness_wood_hit.6.ogg + +**CC-BY-4.0, by RICHERlandTV**, https://freesound.org + +- everness_wood_place.1.ogg +- everness_wood_place.2.ogg +- everness_wood_place.3.ogg + +**CC0-1.0, by pan14**, https://freesound.org + +- everness_sand_footstep.1.ogg +- everness_sand_footstep.2.ogg +- everness_sand_footstep.3.ogg + +**CC-BY-3.0, by Coral_Island_Studios**, https://freesound.org + +- everness_sand_place.1.ogg +- everness_sand_place.2.ogg +- everness_sand_place.3.ogg +- everness_sand_place.4.ogg +- everness_sand_place.5.ogg + +**CC0-1.0, by schneidi67**, https://freesound.org + +- everness_sand_dug.1.ogg +- everness_sand_dug.2.ogg +- everness_sand_dug.3.ogg + +**CC0-1.0, by Lukeo135**, https://freesound.org + +- everness_sand_hit.1.ogg +- everness_sand_hit.2.ogg +- everness_sand_hit.3.ogg + +**CC0-1.0, by GiocoSound**, https://freesound.org + +- everness_metal_footstep.1.ogg +- everness_metal_footstep.2.ogg +- everness_metal_footstep.3.ogg +- everness_metal_footstep.4.ogg +- everness_metal_footstep.5.ogg + +**CC-BY-4.0, by DasDeer**, https://freesound.org + +- everness_metal_hit.1.ogg +- everness_metal_hit.2.ogg +- everness_metal_hit.3.ogg + +**CC-BY-4.0, by MoveAwayPodcast**, https://freesound.org + +- everness_metal_place.1.ogg +- everness_metal_place.2.ogg +- everness_metal_place.3.ogg + +**CC0-1.0, by craigsmith**, https://freesound.org + +- everness_metal_dug.1.ogg +- everness_metal_dug.2.ogg +- everness_metal_dug.3.ogg + +**CC0-1.0, by courtneyeck**, https://freesound.org + +- everness_glass_footstep.1.ogg +- everness_glass_footstep.2.ogg +- everness_glass_footstep.3.ogg + +**CC0-1.0, by Robson220pl**, https://freesound.org + +- everness_glass_place.1.ogg +- everness_glass_place.2.ogg +- everness_glass_place.3.ogg + +**CC-BY-4.0, by elfgrunge**, https://freesound.org + +- everness_glass_dug.1.ogg +- everness_glass_dug.2.ogg + +**CC-BY-3.0, by Mito551**, https://freesound.org + +- everness_thin_glass_footstep.ogg + +**CC-BY-3.0, by cmusounddesign**, http://www.freesound.org/people/cmusounddesign/sounds/71947/ + +- everness_break_thin_glass.1.ogg + +**CC-BY-3.0, by Tomlija**, http://www.freesound.org/people/Tomlija/sounds/97669/ + +- everness_break_thin_glass.2.ogg + +**CC-BY-3.0, by lsprice**, http://www.freesound.org/people/lsprice/sounds/88808/ + +- everness_break_thin_glass.3.ogg + +**CC-BY-3.0, by alexo400**, https://freesound.org/people/alexo400/sounds/543385/ + +- everness_snow_place.1.ogg +- everness_snow_place.2.ogg +- everness_snow_place.3.ogg + +**CC-BY-3.0, by soundscalpel.com** +https://freesound.org/people/soundscalpel.com/sounds/110619/ +https://freesound.org/people/soundscalpel.com/sounds/110609/ +https://freesound.org/people/soundscalpel.com/sounds/110620/ + +- everness_snow_hit.1.ogg +- everness_snow_hit.2.ogg +- everness_snow_hit.3.ogg + +**CC-BY-3.0, by soundscalpel.com** +https://freesound.org/people/cabled_mess/sounds/384423/ +https://freesound.org/people/cabled_mess/sounds/384422/ +https://freesound.org/people/cabled_mess/sounds/384421/ + +- everness_frosted_snow_place.1.ogg +- everness_frosted_snow_place.2.ogg +- everness_frosted_snow_place.3.ogg + +**CC-BY-3.0, by AtevonHes**, https://freesound.org/people/AtevonHes/sounds/454783/ + +- everness_frosted_snow_hit.1.ogg +- everness_frosted_snow_hit.2.ogg +- everness_frosted_snow_hit.3.ogg +- everness_frosted_snow_hit.4.ogg + +**CC-BY-4.0, by HerbertBoland**, https://freesound.org/people/AtevonHes/sounds/454783/ + +- everness_tool_breaks.1.ogg +- everness_tool_breaks.2.ogg +- everness_tool_breaks.3.ogg + +**CC0-1.0, by Rudmer_Rotteveel** + +https://freesound.org/people/Rudmer_Rotteveel/sounds/590949/ +https://freesound.org/people/Rudmer_Rotteveel/sounds/590948/ +https://freesound.org/people/Rudmer_Rotteveel/sounds/590950/ + +- everness_creaky_door_open.1.ogg +- everness_creaky_door_open.2.ogg +- everness_creaky_door_close.ogg + +**CC-BY-SA-3.0, celeron55, Perttu Ahola** + +- everness_cool_lava.1.ogg +- everness_cool_lava.2.ogg +- everness_cool_lava.3.ogg + +**CC-BY-4.0, by jorickhoofd**, https://freesound.org/people/jorickhoofd/ + +- everness_gravel_hit.1.ogg +- everness_gravel_hit.2.ogg +- everness_gravel_hit.3.ogg +- everness_gravel_place.1.ogg +- everness_gravel_place.2.ogg +- everness_gravel_place.3.ogg + +**CC-BY-3.0, by test_sound**, https://freesound.org/people/test_sound/ + +- everness_gravel_dug.1.ogg +- everness_gravel_dug.2.ogg +- everness_gravel_dug.3.ogg +- everness_gravel_dug.4.ogg + +**CC0-1.0, by Ali_6868**, https://freesound.org/people/Ali_6868/ + +- everness_gravel_footstep.1.ogg +- everness_gravel_footstep.2.ogg +- everness_gravel_footstep.3.ogg +- everness_gravel_footstep.4.ogg +- everness_gravel_footstep.5.ogg +- everness_gravel_footstep.6.ogg + +**CC-BY-4.0, by DelonOW**, https://freesound.org/people/DelonOW/ + +- everness_extinguish_flame.1.ogg + +**CC-BY-4.0, by nuFF3**, https://freesound.org + +- everness_ceramic_footstep.1.ogg +- everness_ceramic_footstep.2.ogg +- everness_ceramic_footstep.3.ogg +- everness_ceramic_footstep.4.ogg +- everness_ceramic_footstep.5.ogg +- everness_ceramic_footstep.6.ogg + +**CC-BY-4.0, by Anikadl**, https://freesound.org + +- everness_ceramic_hit.1.ogg +- everness_ceramic_hit.2.ogg +- everness_ceramic_hit.3.ogg +- everness_ceramic_hit.4.ogg +- everness_ceramic_hit.5.ogg +- everness_ceramic_hit.6.ogg + +**CC0-1.0, by kyles**, https://freesound.org, mixed with default_place_node_hard.1.ogg by Mito551 (CC-BY-SA 3.0) + +- everness_ceramic_place.1.ogg +- everness_ceramic_place.2.ogg +- everness_ceramic_place.3.ogg + +**CC0-1.0, by Kinoton**, https://freesound.org, mixed with default_hard_footstep.1.ogg by Erdie (CC-BY-SA 3.0) + +- everness_ceramic_dug.1.ogg +- everness_ceramic_dug.2.ogg +- everness_ceramic_dug.3.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org/people/Nox_Sound/sounds/576593/ + +- everness_water_footstep.1.ogg +- everness_water_footstep.2.ogg +- everness_water_footstep.3.ogg +- everness_water_footstep.4.ogg + +**CC0-1.0, by adr1911**, https://freesound.org/people/adr1911/sounds/542585/ + +- everness_water_geyser.1.ogg + +**CC0-1.0, by Fission9**, https://freesound.org/people/Fission9/sounds/474850/ + +- everness_lava_1.ogg + +**CC0-1.0, by morganpurkis**, https://freesound.org/people/morganpurkis/sounds/385098/ + +- everness_lava_2.ogg + +### Models + +**CC-BY-SA-4.0, by SaKeL** + +- everness_barrel_cactus.obj +- everness_cave_flower_with_particles.obj +- everness_cave_flower.obj +- everness_ceramic_pot.obj +- everness_chest_open.obj +- everness_forsaken_fire.obj +- everness_forsythia_mesh.obj +- everness_glowing_pillar.obj +- everness_hammer_pick.obj +- everness_lotus_flower.obj +- everness_lumabus.obj +- everness_lumecorn.obj +- everness_mineral_torch_ceiling.obj +- everness_mineral_torch_wall.obj +- everness_mineral_torch.obj +- everness_skull_with_candle.obj +- everness_venus_trap.obj +- everness_water_geyser.obj + +**CC-BY-SA-3.0, by sofar** + +- everness_chest_open + +### Assets + +**CC-BY-SA-4.0, by SaKeL** + +- everness_barrel_cactus.blend +- everness_cave_flower_with_particles.blend +- everness_cave_flower.blend +- everness_ceramic_pot.blend +- everness_forsaken_fire.blend +- everness_glowing_pillar.blend +- everness_hammer_pick.blend +- everness_lotus_flower.blend +- everness_lumabus.blend +- everness_lumecorn.blend +- everness_mesh_bush.blend +- everness_mineral_torch_ceiling.blend +- everness_mineral_torch_wall.blend +- everness_mineral_torch.blend +- everness_skull_with_candle.blend +- everness_venus_trap.blend +- everness_water_geyser.blend + +### Schematics + +**CC-BY-SA-4.0, by SaKeL** + +- everness_baobab_tree.lua +- everness_baobab_tree.mts +- everness_cemetery.lua +- everness_cemetery.mts +- everness_coral_bones_tree.lua +- everness_coral_bones_tree.mts +- everness_coral_forest_deep_ocean_coral_cyan.lua +- everness_coral_forest_deep_ocean_coral_cyan.mts +- everness_coral_forest_deep_ocean_coral_green.lua +- everness_coral_forest_deep_ocean_coral_green.mts +- everness_coral_forest_deep_ocean_coral_pink.lua +- everness_coral_forest_deep_ocean_coral_pink.mts +- everness_coral_forest_deep_ocean_coral_red.lua +- everness_coral_forest_deep_ocean_coral_red.mts +- everness_coral_forest_deep_ocean_coral_reef_cyan.lua +- everness_coral_forest_deep_ocean_coral_reef_cyan.mts +- everness_coral_forest_deep_ocean_coral_reef_green.lua +- everness_coral_forest_deep_ocean_coral_reef_green.mts +- everness_coral_forest_deep_ocean_coral_reef_pink.lua +- everness_coral_forest_deep_ocean_coral_reef_pink.mts +- everness_coral_forest_deep_ocean_coral_reef_red.lua +- everness_coral_forest_deep_ocean_coral_reef_red.mts +- everness_coral_forest_deep_ocean_house.lua +- everness_coral_forest_deep_ocean_house.mts +- everness_coral_tree_bioluminescent_from_sapling.lua +- everness_coral_tree_bioluminescent_from_sapling.mts +- everness_coral_tree_bioluminescent.lua +- everness_coral_tree_bioluminescent.mts +- everness_coral_tree_from_sapling.lua +- everness_coral_tree_from_sapling.mts +- everness_coral_tree.lua +- everness_coral_tree.mts +- everness_coral_volcano_everness.lua +- everness_coral_volcano_everness.mts +- everness_coral_volcano.lua +- everness_coral_volcano.mts +- everness_crystal_bush.lua +- everness_crystal_bush.mts +- everness_crystal_forest_deep_ocean_coral_1.lua +- everness_crystal_forest_deep_ocean_coral_1.mts +- everness_crystal_forest_deep_ocean_coral_2.lua +- everness_crystal_forest_deep_ocean_coral_2.mts +- everness_crystal_forest_deep_ocean_coral_3.lua +- everness_crystal_forest_deep_ocean_coral_3.mts +- everness_crystal_forest_deep_ocean_ruins.lua +- everness_crystal_forest_deep_ocean_ruins.mts +- everness_crystal_forest_ruins_1.lua +- everness_crystal_forest_ruins_1.mts +- everness_crystal_forest_ruins_2.lua +- everness_crystal_forest_ruins_2.mts +- everness_crystal_orange_cluster.lua +- everness_crystal_orange_cluster.mts +- everness_crystal_purple_cluster.lua +- everness_crystal_purple_cluster.mts +- everness_crystal_tree_large.lua +- everness_crystal_tree_large.mts +- everness_crystal_tree.lua +- everness_crystal_tree.mts +- everness_cursed_bush.mts +- everness_cursed_dream_tree_from_sapling.lua +- everness_cursed_dream_tree_from_sapling.mts +- everness_cursed_dream_tree.lua +- everness_cursed_dream_tree.mts +- everness_cursed_lands_deep_ocean_skull.lua +- everness_cursed_lands_deep_ocean_skull.mts +- everness_dry_tree_from_sapling.lua +- everness_dry_tree_from_sapling.mts +- everness_dry_tree.lua +- everness_dry_tree.mts +- everness_forsaken_desert_temple_2.lua +- everness_forsaken_desert_temple_2.mts +- everness_forsaken_desert_temple.lua +- everness_forsaken_desert_temple.mts +- everness_forsaken_lands_deep_ocean_coral_alcyonacea.lua +- everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts +- everness_forsaken_lands_deep_ocean_coral_octocurse.lua +- everness_forsaken_lands_deep_ocean_coral_octocurse.mts +- everness_forsaken_lands_deep_ocean_coral_ostracod.lua +- everness_forsaken_lands_deep_ocean_coral_ostracod.mts +- everness_forsaken_tundra_rocks.lua +- everness_forsaken_tundra_rocks.mts +- everness_forsythia_on_moss.lua +- everness_forsythia_on_moss.mts +- everness_frosted_icesheet_igloo.lua +- everness_frosted_icesheet_igloo.mts +- everness_frosted_icicle_large_ceiling.lua +- everness_frosted_icicle_large_ceiling.mts +- everness_frosted_icicle_large_floor.lua +- everness_frosted_icicle_large_floor.mts +- everness_frosted_lands_fossils.lua +- everness_frosted_lands_fossils.mts +- everness_frosted_lands_stalagmite.lua +- everness_frosted_lands_stalagmite.mts +- everness_frosted_lands_volcanic_rock.lua +- everness_frosted_lands_volcanic_rock.mts +- everness_giant_sequoia_tree_from_sapling.lua +- everness_giant_sequoia_tree_from_sapling.mts +- everness_giant_sequoia_tree.lua +- everness_giant_sequoia_tree.mts +- everness_haunted_house.lua +- everness_haunted_house.mts +- everness_hollow_tree_large.lua +- everness_hollow_tree_large.mts +- everness_hollow_tree.lua +- everness_hollow_tree.mts +- everness_japanese_shrine.lua +- everness_japanese_shrine.mts +- everness_jungle_temple.lua +- everness_jungle_temple.mts +- everness_large_bamboo.lua +- everness_large_bamboo.mts +- everness_marsh_grass.lua +- everness_marsh_grass.mts +- everness_quartz_temple.lua +- everness_quartz_temple.mts +- everness_ruins_1.lua +- everness_ruins_1.mts +- everness_small_bamboo.lua +- everness_small_bamboo.mts +- everness_sulfur_volcano.lua +- everness_sulfur_volcano.mts +- everness_termite_nest.lua +- everness_termite_nest.mts +- everness_willow_tree_from_sapling.lua +- everness_willow_tree_from_sapling.mts +- everness_willow_tree.lua +- everness_willow_tree.mts +- everness_mese_tree.lua +- everness_mese_tree.mts +- everness_palm_tree.lua +- everness_palm_tree.mts +- everness_palm_tree_from_sapling.lua +- everness_palm_tree_from_sapling.mts +- everness_mineral_waters_tower.lua +- everness_mineral_waters_tower.mts +- everness_coral_forest_ocean_fishing_dock.lua +- everness_coral_forest_ocean_fishing_dock.mts +- everness_crystal_forest_ocean_shrine.lua +- everness_crystal_forest_ocean_shrine.mts diff --git a/mods/everness/README.md b/mods/everness/README.md new file mode 100644 index 00000000..0438c363 --- /dev/null +++ b/mods/everness/README.md @@ -0,0 +1,99 @@ +# Everness Mapgen [everness] + +Everness is a mapgen, which aims to provide an endless array of +beautiful biomes from the surface lands to the caverns with custom-painted +textures. It creates both a sense of discovery and of danger when one lands in the wrong biome. +It also adds structures, dungeons with loot chests, and custom skyboxes based on the biome. + +![screenshot](screenshot.png) + +## Features + +* supports MineClone2 - see attached `minetest.example.mcl.conf` for best optimized settings (looking for testing and contributors) +* player name tag will hide when sneaking +* item magnet pickup when holding sneak +* granular biome settings +* custom sounds, biomes +* custom textures +* custom biomes and cavern biomes +* custom tools, blocks +* custom skyboxes based on biome +* inlcudes (not for all) e.g. walls, doors, glass, stairs, vines, tools, panes, trees... +* unique set of tools +* pottery + +## Biomes + +Additionally adds extra biomes to the MT game default biomes: + +* Coral Forest +* Coral Forest Dunes +* Coral Forest Ocean +* Coral Forest Deep Ocean +* Coral Forest Under +* Frosted Icesheet +* Frosted Icesheet Ocean +* Frosted Icesheet Under +* Cursed Lands +* Cursed Lands Dunes +* Cursed Lands Swamp +* Cursed Lands Ocean +* Cursed Lands Deep Ocean +* Cursed Lands Under +* Crystal Forest +* Crystal Forest Dunes +* Crystal Forest Shore +* Crystal Forest Ocean +* Crystal Forest Deep Ocean +* Crystal Forest Under +* Bamboo Forest +* Bamboo Forest Under +* Forsaken Desert +* Forsaken Desert Ocean +* Forsaken Desert Under +* Baobab Savanna +* Forsaken Tundra +* Forsaken Tundra Beach +* Forsaken Tundra Ocean +* Forsaken Tundra Under +* Mineral Waters + +## Wiki + +https://bitbucket.org/minetest_gamers/everness/wiki/Home + +## Report Bugs/Suggestions + +https://bitbucket.org/minetest_gamers/everness/issues + +## Dependencies + +- *none* + +## Optional Dependencies + +- default (MTG) +- xpanes (MTG) +- doors (MTG) +- stairs (MTG) +- walls (MTG) +- x_obsidianmese (for paths) +- x_tumbleweed (adds tumbleweeds to deserts) +- x_farming (bonemeal, recipes...) +- x_clay (mapgen structures, loot chests...) +- mcl_core (MCL) +- mcl_fences (MCL) +- mcl_walls (MCL) +- mcl_stairs (MCL) +- mcl_util (MCL) +- mcl_autogroup (MCL) +- mcl_doors (MCL) +- mcl_mapgen_core (MCL) + +## License + +see included [LICENSE.txt](LICENSE.txt) file for more info + +## Installation + +see: https://wiki.minetest.net/Installing_Mods diff --git a/mods/everness/api.lua b/mods/everness/api.lua new file mode 100644 index 00000000..01ce8849 --- /dev/null +++ b/mods/everness/api.lua @@ -0,0 +1,2179 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local rand_global = PcgRandom(tonumber(tostring(os.time()):reverse():sub(1, 9))) + +--- Base class +---@class Everness +Everness = { + bamboo = { + -- based on height + growth_stages = { + --height + [1] = { + -- next plant + { name = 'everness:bamboo_1' }, + { name = 'everness:bamboo_2' }, + }, + [2] = { + { name = 'everness:bamboo_1' }, + { name = 'everness:bamboo_2' }, + { name = 'everness:bamboo_2' }, + }, + [3] = { + { name = 'everness:bamboo_3' }, + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_5' }, + }, + [4] = { + { name = 'everness:bamboo_3' }, + { name = 'everness:bamboo_3' }, + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_5' }, + { name = 'everness:bamboo_5' }, + }, + }, + top_leaves_schem = { + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_5' }, + { name = 'everness:bamboo_5' }, + } + }, + loot_chest = { + default = {}, + }, + settings = { + biomes = { + everness_coral_forest = { + enabled = minetest.settings:get_bool('everness_coral_forest', true), + y_max = tonumber(minetest.settings:get('everness_coral_forest_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_coral_forest_y_min')) or 4, + }, + everness_coral_forest_dunes = { + enabled = minetest.settings:get_bool('everness_coral_forest_dunes', false), + y_max = tonumber(minetest.settings:get('everness_coral_forest_dunes_y_max')) or 5, + y_min = tonumber(minetest.settings:get('everness_coral_forest_dunes_y_min')) or 4, + }, + everness_coral_forest_ocean = { + enabled = minetest.settings:get_bool('everness_coral_forest_ocean', true), + y_max = tonumber(minetest.settings:get('everness_coral_forest_ocean_y_max')) or -2, + y_min = tonumber(minetest.settings:get('everness_coral_forest_ocean_y_min')) or -10, + }, + everness_coral_forest_deep_ocean = { + enabled = minetest.settings:get_bool('everness_coral_forest_deep_ocean', true), + y_max = tonumber(minetest.settings:get('everness_coral_forest_deep_ocean_y_max')) or -11, + y_min = tonumber(minetest.settings:get('everness_coral_forest_deep_ocean_y_min')) or -36, + }, + everness_coral_forest_under = { + enabled = minetest.settings:get_bool('everness_coral_forest_under', true), + y_max = tonumber(minetest.settings:get('everness_coral_forest_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_coral_forest_under_y_min')) or -31000, + }, + everness_frosted_icesheet = { + enabled = minetest.settings:get_bool('everness_frosted_icesheet', true), + y_max = tonumber(minetest.settings:get('everness_frosted_icesheet_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_frosted_icesheet_y_min')) or -9, + }, + everness_frosted_icesheet_ocean = { + enabled = minetest.settings:get_bool('everness_frosted_icesheet_ocean', true), + y_max = tonumber(minetest.settings:get('everness_frosted_icesheet_ocean_y_max')) or -9, + y_min = tonumber(minetest.settings:get('everness_frosted_icesheet_ocean_y_min')) or -36, + }, + everness_frosted_icesheet_under = { + enabled = minetest.settings:get_bool('everness_frosted_icesheet_under', true), + y_max = tonumber(minetest.settings:get('everness_frosted_icesheet_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_frosted_icesheet_under_y_min')) or -31000, + }, + everness_cursed_lands = { + enabled = minetest.settings:get_bool('everness_cursed_lands', true), + y_max = tonumber(minetest.settings:get('everness_cursed_lands_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_cursed_lands_y_min')) or 4, + }, + everness_cursed_lands_dunes = { + enabled = minetest.settings:get_bool('everness_cursed_lands_dunes', false), + y_max = tonumber(minetest.settings:get('everness_cursed_lands_dunes_y_max')) or 5, + y_min = tonumber(minetest.settings:get('everness_cursed_lands_dunes_y_min')) or 1, + }, + everness_cursed_lands_swamp = { + enabled = minetest.settings:get_bool('everness_cursed_lands_swamp', true), + y_max = tonumber(minetest.settings:get('everness_cursed_lands_swamp_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_cursed_lands_swamp_y_min')) or -1, + }, + everness_cursed_lands_ocean = { + enabled = minetest.settings:get_bool('everness_cursed_lands_ocean', true), + y_max = tonumber(minetest.settings:get('everness_cursed_lands_ocean_y_max')) or -2, + y_min = tonumber(minetest.settings:get('everness_cursed_lands_ocean_y_min')) or -10, + }, + everness_cursed_lands_deep_ocean = { + enabled = minetest.settings:get_bool('everness_cursed_lands_ocean', true), + y_max = tonumber(minetest.settings:get('everness_cursed_lands_ocean_y_max')) or -11, + y_min = tonumber(minetest.settings:get('everness_cursed_lands_ocean_y_min')) or -36, + }, + everness_cursed_lands_under = { + enabled = minetest.settings:get_bool('everness_cursed_lands_under', true), + y_max = tonumber(minetest.settings:get('everness_cursed_lands_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_cursed_lands_under_y_min')) or -31000, + }, + everness_crystal_forest = { + enabled = minetest.settings:get_bool('everness_crystal_forest', true), + y_max = tonumber(minetest.settings:get('everness_crystal_forest_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_crystal_forest_y_min')) or 4, + }, + everness_crystal_forest_dunes = { + enabled = minetest.settings:get_bool('everness_crystal_forest_dunes', false), + y_max = tonumber(minetest.settings:get('everness_crystal_forest_dunes_y_max')) or 5, + y_min = tonumber(minetest.settings:get('everness_crystal_forest_dunes_y_min')) or 1, + }, + everness_crystal_forest_shore = { + enabled = minetest.settings:get_bool('everness_crystal_forest_shore', true), + y_max = tonumber(minetest.settings:get('everness_crystal_forest_shore_y_max')) or 3, + y_min = tonumber(minetest.settings:get('everness_crystal_forest_shore_y_min')) or -1, + }, + everness_crystal_forest_ocean = { + enabled = minetest.settings:get_bool('everness_crystal_forest_ocean', true), + y_max = tonumber(minetest.settings:get('everness_crystal_forest_ocean_y_max')) or -2, + y_min = tonumber(minetest.settings:get('everness_crystal_forest_ocean_y_min')) or -10, + }, + everness_crystal_forest_deep_ocean = { + enabled = minetest.settings:get_bool('everness_crystal_forest_deep_ocean', true), + y_max = tonumber(minetest.settings:get('everness_crystal_forest_deep_ocean_y_max')) or -11, + y_min = tonumber(minetest.settings:get('everness_crystal_forest_deep_ocean_y_min')) or -36, + }, + everness_crystal_forest_under = { + enabled = minetest.settings:get_bool('everness_crystal_forest_under', true), + y_max = tonumber(minetest.settings:get('everness_crystal_forest_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_crystal_forest_under_y_min')) or -31000, + }, + everness_bamboo_forest = { + enabled = minetest.settings:get_bool('everness_bamboo_forest', true), + y_max = tonumber(minetest.settings:get('everness_bamboo_forest_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_bamboo_forest_y_min')) or 4, + }, + everness_bamboo_forest_under = { + enabled = minetest.settings:get_bool('everness_bamboo_forest_under', true), + y_max = tonumber(minetest.settings:get('everness_bamboo_forest_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_bamboo_forest_under_y_min')) or -31000, + }, + everness_forsaken_desert = { + enabled = minetest.settings:get_bool('everness_forsaken_desert', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_desert_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_forsaken_desert_y_min')) or 4, + }, + everness_forsaken_desert_ocean = { + enabled = minetest.settings:get_bool('everness_forsaken_desert_ocean', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_desert_ocean_y_max')) or -2, + y_min = tonumber(minetest.settings:get('everness_forsaken_desert_ocean_y_min')) or -36, + }, + everness_forsaken_desert_under = { + enabled = minetest.settings:get_bool('everness_forsaken_desert_under', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_desert_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_forsaken_desert_under_y_min')) or -31000, + }, + everness_baobab_savanna = { + enabled = minetest.settings:get_bool('everness_baobab_savanna', false), + y_max = tonumber(minetest.settings:get('everness_baobab_savanna_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_baobab_savanna_y_min')) or 4, + }, + everness_forsaken_tundra = { + enabled = minetest.settings:get_bool('everness_forsaken_tundra', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_tundra_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_forsaken_tundra_y_min')) or 4, + }, + everness_forsaken_tundra_beach = { + enabled = minetest.settings:get_bool('everness_forsaken_tundra_beach', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_tundra_beach_y_max')) or 1, + y_min = tonumber(minetest.settings:get('everness_forsaken_tundra_beach_y_min')) or -3, + }, + everness_forsaken_tundra_ocean = { + enabled = minetest.settings:get_bool('everness_forsaken_tundra_ocean', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_tundra_ocean_y_max')) or -2, + y_min = tonumber(minetest.settings:get('everness_forsaken_tundra_ocean_y_min')) or -36, + }, + everness_forsaken_tundra_under = { + enabled = minetest.settings:get_bool('everness_forsaken_tundra_under', true), + y_max = tonumber(minetest.settings:get('everness_forsaken_tundra_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_forsaken_tundra_under_y_min')) or -31000, + }, + everness_mineral_waters = { + enabled = minetest.settings:get_bool('everness_mineral_waters', true), + y_max = tonumber(minetest.settings:get('everness_mineral_waters_y_max')) or 31000, + y_min = tonumber(minetest.settings:get('everness_mineral_waters_y_min')) or 4, + }, + everness_mineral_waters_under = { + enabled = minetest.settings:get_bool('everness_mineral_waters_under', true), + y_max = tonumber(minetest.settings:get('everness_mineral_waters_under_y_max')) or 0, + y_min = tonumber(minetest.settings:get('everness_mineral_waters_under_y_min')) or -31000, + }, + }, + features = { + everness_feature_sneak_pickup = minetest.settings:get_bool('everness_feature_sneak_pickup', false), + everness_feature_skybox = minetest.settings:get_bool('everness_feature_skybox', false), + } + }, + hammer_cid_data = {}, + colors = { + brown = '#DEB887', + }, + registered_nodes = {}, + registered_tools = {}, + registered_abms = {}, + registered_lbms = {}, + registered_craftitems = {}, + registered_biomes = {}, + registered_decorations = {}, + registered_ores = {}, + on_generated_queue = {} +} + +function Everness.grow_cactus(self, pos, node, params) + local node_copy = table.copy(node) + + if node.param2 >= 4 then + return + end + + pos.y = pos.y - 1 + + if minetest.get_item_group(minetest.get_node(pos).name, 'sand') == 0 + and minetest.get_item_group(minetest.get_node(pos).name, 'everness_sand') == 0 + then + return + end + + pos.y = pos.y + 1 + + local height = 0 + + while (node.name == 'everness:cactus_orange' or node.name == 'everness:cactus_blue') and height < 5 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + + if height == 5 or node.name ~= 'air' then + return + end + + if minetest.get_node_light(pos) < 13 then + return + end + + minetest.set_node(pos, { name = node_copy.name }) + + return true +end + +function Everness.emerge_area(self, blockpos, action, calls_remaining, param) + if not param.total then + param.total = calls_remaining + 1 + param.current = 0 + end + + param.current = param.current + 1 + + if param.total == param.current then + param.callback(param.data) + end +end + +-- how often node timers for plants will tick, +/- some random value +function Everness.tick_vine(self, pos) + minetest.get_node_timer(pos):start(math.random(5, 10)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +function Everness.tick_vine_again(self, pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +-- how often node timers for plants will tick, +/- some random value +function Everness.tick_sulfur_stone(self, pos) + minetest.get_node_timer(pos):start(math.random(5, 10)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +function Everness.tick_sulfur_stone_again(self, pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +-- Grows vines +-- @param pos {vector} +function Everness.grow_vine(self, pos, elapsed, params) + local node = minetest.get_node(pos) + local pos_under = vector.new(pos.x, pos.y - 1, pos.z) + local node_under = minetest.get_node(pos_under) + local node_names = params.node_names + local end_node_name = params.end_node_name + local end_node_param2 = params.end_node_param2 + + -- get length + local length = 0 + local temp_node = node + + while minetest.get_item_group(temp_node.name, 'vine') > 0 and length < 16 do + length = length + 1 + temp_node = minetest.get_node(vector.new(pos.x, pos.y + length, pos.z)) + end + + -- stop growing - random height between 12 - 16 nodes + if length > 11 and length < 16 then + if math.random(1, 3) == 2 then + return + end + end + + if length >= 16 then + return + end + + if minetest.get_item_group(node_under.name, 'vine') > 0 then + -- stop timer for gown vine + return + end + + if node_under.name ~= 'air' then + Everness:tick_vine_again(pos) + return + end + + local new_node_name = node_names[math.random(1, #node_names)] + + minetest.set_node(pos, { name = new_node_name, param2 = new_node_name.param2 or 0 }) + -- last hanging vine + minetest.set_node(pos_under, { name = end_node_name, param2 = end_node_param2 and end_node_param2 or node.param2 }) + + Everness:tick_vine(pos_under) +end + +-- +-- Sounds +-- + +function Everness.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = '', gain = 1.0 } + table.dug = table.dug or { name = 'everness_stone_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_stone_dug', gain = 0.6 } + return table +end + +function Everness.node_sound_frosted_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_frosted_snow_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_frosted_snow_hit', gain = 0.2 } + table.dug = table.dug or { name = 'everness_frosted_snow_footstep', gain = 0.3 } + table.place = table.place or { name = 'everness_frosted_snow_place', gain = 0.25 } + return table +end + +function Everness.node_sound_crystal_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_crystal_chime', gain = 0.2 } + table.dig = table.dig or { name = 'everness_crystal_chime', gain = 0.3 } + table.dug = table.dug or { name = 'everness_stone_footstep', gain = 0.3 } + table.place = table.place or { name = 'everness_crystal_chime', gain = 1.0 } + return table +end + +function Everness.node_sound_bamboo_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_bamboo_hit', gain = 0.2 } + table.dig = table.dig or { name = 'everness_bamboo_hit', gain = 0.3 } + table.dug = table.dug or { name = 'everness_bamboo_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_bamboo_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_mud_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_mud_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_mud_footstep', gain = 0.3 } + table.dug = table.dug or { name = 'everness_mud_footstep', gain = 0.1 } + table.place = table.place or { name = 'everness_mud_footstep', gain = 1.0 } + return table +end + +function Everness.node_sound_grass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_grass_footstep', gain = 0.6 } + table.dig = table.dig or { name = 'everness_grass_hit', gain = 1.2 } + table.dug = table.dug or { name = 'everness_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_dirt_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_dirt_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'everness_dirt_hit', gain = 0.4 } + table.dug = table.dug or { name = 'everness_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_dirt_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_ice_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_ice_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_ice_hit', gain = 0.4 } + table.dug = table.dug or { name = 'everness_ice_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_ice_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_stone_footstep', gain = 0.6 } + table.dig = table.dig or { name = 'everness_stone_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_stone_dug', gain = 0.6 } + table.place = table.place or { name = 'everness_stone_place', gain = 1.0 } + return table +end + +function Everness.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_leaves_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_leaves_hit', gain = 0.25 } + table.dug = table.dug or { name = 'everness_leaves_dug', gain = 0.5 } + table.place = table.place or { name = 'everness_leaves_place', gain = 0.4 } + return table +end + +function Everness.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_wood_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'everness_wood_hit', gain = 0.8 } + table.dug = table.dug or { name = 'everness_wood_place', gain = 0.1 } + table.place = table.place or { name = 'everness_wood_place', gain = 0.15 } + return table +end + +function Everness.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_sand_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_sand_hit', gain = 0.5 } + table.dug = table.dug or { name = 'everness_sand_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_sand_place', gain = 0.15 } + return table +end + +function Everness.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_metal_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_metal_hit', gain = 0.5 } + table.dug = table.dug or { name = 'everness_metal_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_metal_place', gain = 0.15 } + return table +end + +function Everness.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_glass_footstep', gain = 0.02 } + table.dig = table.dig or { name = 'everness_glass_footstep', gain = 0.05 } + table.dug = table.dug or { name = 'everness_glass_dug', gain = 0.4 } + table.place = table.place or { name = 'everness_glass_place', gain = 0.2 } + return table +end + +function Everness.node_sound_thin_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_thin_glass_footstep', gain = 0.3 } + table.dig = table.dig or { name = 'everness_thin_glass_footstep', gain = 0.5 } + table.dug = table.dug or { name = 'everness_break_thin_glass', gain = 1.0 } + table.place = table.place or { name = 'everness_glass_place', gain = 0.2 } + return table +end + +function Everness.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_snow_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_snow_hit', gain = 0.2 } + table.dug = table.dug or { name = 'everness_snow_footstep', gain = 0.2 } + table.place = table.place or { name = 'everness_snow_place', gain = 0.3 } + return table +end + +function Everness.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_gravel_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_gravel_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_gravel_dug', gain = 0.6 } + table.place = table.place or { name = 'everness_gravel_place', gain = 1.0 } + return table +end + +function Everness.node_sound_ceramic_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_ceramic_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_ceramic_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_ceramic_dug', gain = 1.0 } + table.place = table.place or { name = 'everness_ceramic_place', gain = 1.0 } + return table +end + +function Everness.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_water_footstep', gain = 0.05 } + Everness.node_sound_defaults(table) + return table +end + +-- +-- Forsted Cave Icicles +-- + +function Everness.stack_icicle_recursive(node, pos_node, incrementer, pos_marker, direction) + local nb = node + local pos = pos_node + local inc = incrementer + local m_pos = pos_marker + + while nb.name == 'air' or nb.name == 'ignore' do + if nb.name == 'ignore' then + Everness.emerge_icicle_area_recursive(pos, inc, m_pos, direction) + break + else + minetest.set_node(pos, { name = 'everness:frosted_cave_ice_illuminating' }) + -- Shift 1 down + inc = inc + 1 + local y_offset = (direction == 'down') and (m_pos.y - inc) or (m_pos.y + inc) + pos = vector.new(m_pos.x, y_offset, m_pos.z) + nb = minetest.get_node(pos) + end + end +end + +function Everness.emerge_icicle_area_recursive(pos_node, incrementer, pos_marker, direction) + local y_offset = (direction == 'down') and (pos_node.y - 16) or (pos_node.y + 16) + + minetest.emerge_area( + vector.new(pos_node.x - 1, pos_node.y, pos_node.z - 1), + vector.new(pos_node.x + 1, y_offset, pos_node.z + 1), + function(blockpos, action, calls_remaining, param) + Everness:emerge_area(blockpos, action, calls_remaining, param) + end, + { + callback = function(data) + local incrementer_cllbck = data.incrementer + local pos_node_cllbck = data.pos_node + local node_cllbck = minetest.get_node(pos_node_cllbck) + + Everness.stack_icicle_recursive(node_cllbck, pos_node_cllbck, incrementer_cllbck, pos_marker, direction) + end, + data = { + incrementer = incrementer, + pos_node = pos_node + } + } + ) +end + +function Everness.use_shell_of_underwater_breathing(self, itemstack, user, pointed_thing) + if not user then + return + end + + local pos_player = user:get_pos() + + if pointed_thing.type == 'node' then + local pos_pt = minetest.get_pointed_thing_position(pointed_thing) + + if not pos_pt then + return itemstack + end + + local pointed_node = minetest.get_node(pos_pt) + local pointed_node_def = minetest.registered_nodes[pointed_node.name] + + if not pointed_node or not pointed_node_def then + return itemstack + end + + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos_pt, pointed_node, user, itemstack, pointed_thing) + end + end + + local node_head = minetest.get_node( + vector.new( + math.floor(pos_player.x + 0.5), + math.ceil(pos_player.y + 1), + math.floor(pos_player.z + 0.5) + ) + ) + local breath = user:get_breath() + + if minetest.get_item_group(node_head.name, 'water') > 0 and breath < 9 then + -- Under water + user:set_breath(9) + + if not minetest.settings:get_bool('creative_mode') + or not minetest.check_player_privs(user:get_player_name(), { creative = true }) + then + local wear_to_add = 65535 / 20 + + if itemstack:get_wear() + wear_to_add > 65535 then + local itemstack_def = itemstack:get_definition() + + -- Break tool + minetest.sound_play(itemstack_def.sound.breaks, { + pos = pos_player, + gain = 0.5 + }, true) + end + + itemstack:add_wear(wear_to_add) + end + + minetest.sound_play('everness_underwater_bubbles', { + object = user, + gain = 1.0, + max_hear_distance = 16 + }) + + minetest.add_particlespawner({ + amount = 40, + time = 0.1, + pos = { + min = vector.new(pos_player.x - 0.25, pos_player.y + 1.25, pos_player.z - 0.25), + max = vector.new(pos_player.x + 0.25, pos_player.y + 1.5, pos_player.z + 0.25) + }, + vel = { + min = vector.new(-0.5, 0, -0.5), + max = vector.new(0.5, 0, 0.5) + }, + acc = { + min = vector.new(-0.5, 4, -0.5), + max = vector.new(0.5, 1, 0.5), + }, + exptime = { + min = 1, + max = 2 + }, + size = { + min = 0.5, + max = 2 + }, + texture = { + name = 'everness_bubble.png', + alpha_tween = { + 1, 0, + start = 0.75 + } + } + }) + end + + return itemstack +end + +-- +-- Sapling 'on place' function to check protection of node and resulting tree volume +-- copy from MTG +-- +function Everness.sapling_on_place(self, itemstack, placer, pointed_thing, props) + if minetest.get_modpath('mcl_util') and minetest.global_exists('mcl_util') then + local on_place_func = mcl_util.generate_on_place_plant_function(function(pos, node) + local node_below = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + + if not node_below then + return false + end + + local nn = node_below.name + + return minetest.get_item_group(nn, 'grass_block') == 1 + or (nn == 'everness:mineral_sand' and itemstack:get_name() == 'everness:palm_tree_sapling') + or nn == 'mcl_core:podzol' + or nn == 'mcl_core:podzol_snow' + or nn == 'mcl_core:dirt' + or nn == 'mcl_core:mycelium' + or nn == 'mcl_core:coarse_dirt' + end) + + return on_place_func(itemstack, placer, pointed_thing) + else + local _props = props or {} + local sapling_name = _props.sapling_name + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + local minp_relative = _props.minp_relative + local maxp_relative = _props.maxp_relative + -- maximum interval of interior volume check + local interval = _props.interval + + -- Position of sapling + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local pdef = node and minetest.registered_nodes[node.name] + + if pdef and node and pdef.on_rightclick + and not (placer and placer:is_player() + and placer:get_player_control().sneak) + then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + if not pdef or not pdef.buildable_to then + pos = pointed_thing.above + node = minetest.get_node_or_nil(pos) + pdef = node and minetest.registered_nodes[node.name] + + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local player_name = placer and placer:get_player_name() or '' + + -- Check sapling position for protection + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + -- Check tree volume for protection + if minetest.is_area_protected( + vector.add(pos, minp_relative), + vector.add(pos, maxp_relative), + player_name, + interval + ) + then + minetest.record_protection_violation(pos, player_name) + minetest.chat_send_player( + player_name, + S('@1 will intersect protection on growth.', itemstack:get_definition().description) + ) + + return itemstack + end + + Everness.log_player_action(placer, 'places node', sapling_name, 'at', pos) + + local take_item = not minetest.is_creative_enabled(player_name) + local newnode = { name = sapling_name } + local ndef = minetest.registered_nodes[sapling_name] + + minetest.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes or {}) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + return itemstack + end +end + +-- +-- Leafdecay - taken from MTG +-- + +-- Prevent decay of placed leaves + +Everness.after_place_leaves = function(self, pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end +end + +-- Leafdecay +local function leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) + do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if node.param2 ~= 1 + and minetest.get_meta(v):get_int('everness_prevent_leafdecay') ~= 1 + and not timer:is_started() + then + timer:start(math.random(20, 120) / 10) + end + end +end + +local movement_gravity = tonumber(minetest.settings:get('movement_gravity')) or 9.81 + +local function leafdecay_on_timer(pos, def) + if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if minetest.get_item_group(item, 'leafdecay_drop') ~= 0 + or not is_leaf + then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) + + -- spawn a few particles for the removed node + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, { x = 0.5, y = 0.5, z = 0.5 }), + maxpos = vector.add(pos, { x = 0.5, y = 0.5, z = 0.5 }), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) +end + +function Everness.register_leafdecay(self, def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + +function Everness.register_node(self, name, def) + local _def = table.copy(def) + local _name = name + + _def.mod_origin = 'everness' + + -- X Farming composter description + if minetest.get_modpath('x_farming') and minetest.global_exists('x_farming') then + -- X Farming + if _def.groups and (_def.groups.compost or 0) > 0 then + _def.description = _def.description .. '\n' .. S('Compost chance') .. ': ' .. def.groups.compost .. '%' + end + end + + self.registered_nodes[_name] = _def + minetest.register_node(_name, _def) +end + +function Everness.register_tool(self, name, def) + local _def = table.copy(def) + local _name = name + + _def.mod_origin = 'everness' + + self.registered_tools[_name] = _def + minetest.register_tool(_name, _def) +end + +function Everness.register_abm(self, def) + local _def = table.copy(def) + local _name = _def.label + + self.registered_abms[_name] = _def + minetest.register_abm(_def) +end + +function Everness.register_lbm(self, def) + local _def = table.copy(def) + local _name = _def.name + + self.registered_lbms[_name] = _def + minetest.register_lbm(_def) +end + +function Everness.register_craftitem(self, name, def) + local _def = table.copy(def) + local _name = name + + _def.mod_origin = 'everness' + + self.registered_craftitems[_name] = _def + minetest.register_craftitem(_name, _def) +end + +function Everness.register_biome(self, def) + local _def = table.copy(def) + local _name = _def.name + + self.registered_biomes[_name] = _def + minetest.register_biome(_def) +end + +function Everness.register_decoration(self, def) + local _def = table.copy(def) + local _name = _def.name + + self.registered_decorations[_name] = _def + minetest.register_decoration(_def) +end + +function Everness.register_ore(self, def) + local _def = table.copy(def) + -- @TOTO using `ore` as name here will override the entry when there are multiple ore registrations for the same ore (different noise) + -- using indexed table would be more appropriate here + local _name = _def.ore + + self.registered_ores[_name] = _def + minetest.register_ore(_def) +end + +-- +-- Log API / helpers - copy from MTG +-- + +local log_non_player_actions = minetest.settings:get_bool('log_non_player_actions', false) + +local is_pos = function(v) + return type(v) == 'table' + and type(v.x) == 'number' + and type(v.y) == 'number' + and type(v.z) == 'number' +end + +function Everness.log_player_action(player, ...) + local msg = player:get_player_name() + if player.is_fake_player or not player:is_player() then + if not log_non_player_actions then + return + end + + msg = msg .. '(' .. (type(player.is_fake_player) == 'string' + and player.is_fake_player or '*') .. ')' + end + for _, v in ipairs({ ... }) do + -- translate pos + local part = is_pos(v) and minetest.pos_to_string(v) or v + -- no leading spaces before punctuation marks + msg = msg .. (string.match(part, '^[;,.]') and '' or ' ') .. part + end + + minetest.log('action', msg) +end + +function Everness.set_inventory_action_loggers(def, name) + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + Everness.log_player_action(player, 'moves stuff in', name, 'at', pos) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + Everness.log_player_action(player, 'moves', stack:get_name(), 'to', name, 'at', pos) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + Everness.log_player_action(player, 'takes', stack:get_name(), 'from', name, 'at', pos) + end +end + +-- 'can grow' function - copy from MTG + +function Everness.can_grow(pos, groups_under) + local node_under = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + + if not node_under then + return false + end + + local _groups_under = groups_under + + if not groups_under then + _groups_under = { 'soil' } + end + + local has_fertile_under = false + + -- Check is one of the `groups_under` are under the sapling + for i, v in ipairs(_groups_under) do + if minetest.get_item_group(node_under.name, v) > 0 then + has_fertile_under = true + break + end + end + + if not has_fertile_under then + return false + end + + local light_level = minetest.get_node_light(pos) + + if not light_level or light_level < 13 then + return false + end + + return true +end + +-- +-- This method may change in future. +-- Copy from MTG +-- + +function Everness.can_interact_with_node(player, pos) + if player and player:is_player() then + if minetest.check_player_privs(player, 'protection_bypass') then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string('owner') + + if not owner or owner == '' or owner == player:get_player_name() then + return true + end + + -- Is player wielding the right key? + local item = player:get_wielded_item() + + if minetest.get_item_group(item:get_name(), 'key') == 1 then + local key_meta = item:get_meta() + + if key_meta:get_string('secret') == '' then + local key_oldmeta = item:get_metadata() + + if key_oldmeta == '' or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string('secret', minetest.parse_json(key_oldmeta).secret) + item:set_metadata('') + end + + return meta:get_string('key_lock_secret') == key_meta:get_string('secret') + end + + return false +end + +-- +-- Optimized helper to put all items in an inventory into a drops list +-- copy from MTG +-- + +function Everness.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end +end + +function Everness.set_loot_chest_items() + local loot_items = {} + + for name, def in pairs(minetest.registered_items) do + local craft_recipe = minetest.get_craft_recipe(name) + local mod_name = name:split(':')[1] + + if def.groups + and next(def.groups) + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + and (craft_recipe.items or mod_name == 'default') + then + table.insert(loot_items, { + name = name, + max_count = 10, + chance = 25 + }) + end + end + + Everness.loot_chest.default = table.copy(loot_items) +end + +function Everness.populate_loot_chests(self, positions, params) + local _params = params or {} + local _loot_chest_items_group = _params.loot_chest_items_group or 'default' + + -- Get inventories + local string_positions = ''; + local inventories = {} + + for i, pos in ipairs(positions) do + local inv = minetest.get_inventory({ type = 'node', pos = pos }) + + if not inv then + local chest_def = minetest.registered_nodes['everness:chest'] + chest_def.on_construct(pos) + inv = minetest.get_inventory({ type = 'node', pos = pos }) + end + + if inv then + table.insert(inventories, inv) + string_positions = string_positions .. ' ' .. pos:to_string() + else + minetest.log('warning', '[Everness] FAILED to populate loot chests inventory at ' .. pos:to_string()) + end + end + + if #inventories > 0 then + for index, value in ipairs(inventories[1]:get_list('main')) do + local rand_idx = rand_global:next(1, #self.loot_chest[_loot_chest_items_group]) + local item_def = self.loot_chest[_loot_chest_items_group][rand_idx] + + if not minetest.registered_items[item_def.name] then + return + end + + if rand_global:next(0, 100) <= item_def.chance then + local stack = ItemStack(item_def.name) + + if minetest.registered_tools[item_def.name] then + stack:set_wear(rand_global:next(1, 65535)) + else + stack:set_count(rand_global:next(1, math.min(item_def.max_count, stack:get_stack_max()))) + end + + local rand_inv = inventories[rand_global:next(1, #inventories)] + rand_inv:set_stack('main', index, stack) + end + end + + minetest.log('action', '[Everness] Loot chests inventory populated at ' .. string_positions) + end +end + +-- +-- Hammer +-- Modified version of default:tnt from MT +-- @license MIT + +local function rand_pos(center, pos, radius) + local def + local reg_nodes = minetest.registered_nodes + local i = 0 + + repeat + -- Give up and use the center if this takes too long + if i > 4 then + pos.x, pos.z = center.x, center.z + break + end + + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) + def = reg_nodes[minetest.get_node(pos).name] + i = i + 1 + until def and not def.walkable +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + + for _, item in pairs(drops) do + local count = math.min(item:get_count(), item:get_stack_max()) + + while count > 0 do + local take = math.max( + 1, + math.min( + radius * radius, + count, + item:get_stack_max() + ) + ) + + -- `drop_pos` is being randomized here + rand_pos(pos, drop_pos, radius) + + local dropitem = ItemStack(item) + + dropitem:set_count(take) + + local obj = minetest.add_item(drop_pos, dropitem) + + if obj then + obj:get_luaentity().collect = true + obj:set_acceleration({ x = 0, y = -10, z = 0 }) + obj:set_velocity({ + x = math.random(-2, 2), + y = math.random(0, 2), + z = math.random(-2, 2) + }) + end + + count = count - take + end + end +end + +-- Populate `drops` table +local function add_drop(drops, item) + item = ItemStack(item) + + local name = item:get_name() + local drop = drops[name] + + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local function destroy(drops, npos, cid, c_air, can_dig, owner) + if minetest.is_protected(npos, owner) then + return cid + end + + local def = Everness.hammer_cid_data[cid] + + if not def then + return cid + elseif def.can_dig and not def.can_dig(npos, minetest.get_player_by_name(owner)) then + return cid + else + local node_drops = minetest.get_node_drops(def.name, '') + + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + + return c_air + end +end + +-- Draw wear bar texture overlay +function Everness.draw_wear_bar(itemstack, wear) + local itemstack_meta = itemstack:get_meta() + local px_width = 14 + local px_one = 65535 / px_width + local px_color = px_width - math.floor(wear / px_one) + + local inventory_overlay = '[combine:16x16' + + for i = 1, px_width do + if i > px_color then + inventory_overlay = inventory_overlay .. ':' .. i .. ',14=[combine\\:1x1\\^[noalpha\\^[colorize\\:#000000\\:255' + else + local color + + if px_color < px_width / 4 then + -- below 25% + color = '#FF0000' + elseif px_color < (px_width / 4) * 2 then + -- below 50% + color = '#FFA500' + elseif px_color < (px_width / 4) * 3 then + -- below 75% + color = '#FFFF00' + else + -- above 75% + color = '#00FF00' + end + + inventory_overlay = inventory_overlay .. ':' .. i .. ',14=[combine\\:1x1\\^[noalpha\\^[colorize\\:' .. color .. '\\:255' + end + end + + itemstack_meta:set_string('inventory_overlay', inventory_overlay) +end + +function Everness.hammer_after_dig_node(pos, node, metadata, digger, can_dig) + if not digger then + return + end + + local wielditem = digger:get_wielded_item() + + if not (wielditem:get_name() == 'everness:hammer' or wielditem:get_name() == 'everness:hammer_sharp') then + return + end + + local radius = 1 + local look_dir = vector.round(digger:get_look_dir()) + local look_dir_multi = vector.round(vector.multiply(look_dir, radius / 2)) + pos = vector.round(vector.add(pos, look_dir_multi)) + local c_air = minetest.CONTENT_AIR + local c_ignore = minetest.CONTENT_IGNORE + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + local p1 = vector.subtract(pos, radius) + local p2 = vector.add(pos, radius) + local minp, maxp = vm:read_from_map(p1, p2) + local voxel_area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + -- `drops` are being populated in `add_drop` method, called from `destroy` method + local drops = {} + local p_name = digger:get_player_name() + + if not minetest.settings:get_bool('creative_mode') then + local wielditem_meta = wielditem:get_meta() + local wielditem_wear = wielditem_meta:get_int('everness_wear') + local node_def = minetest.registered_nodes[node.name] + local wielditem_def = wielditem:get_definition() + local dig_params = minetest.get_dig_params(node_def and node_def.groups, wielditem_def and wielditem_def.tool_capabilities, wielditem:get_wear()) + local new_wear = wielditem_wear + dig_params.wear + + -- Add wear + wielditem_meta:set_int('everness_wear', new_wear) + + -- Draw wear bar texture overlay + Everness.draw_wear_bar(wielditem, new_wear) + + if wielditem_wear > 65535 then + -- Break tool + minetest.sound_play(wielditem_def.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + + if wielditem:get_name() == 'everness:hammer' + or wielditem:get_name() == 'everness:hammer_sharp' + then + digger:set_wielded_item(ItemStack('')) + end + elseif wielditem:get_name() == 'everness:hammer' + or wielditem:get_name() == 'everness:hammer_sharp' + then + -- Save wear + digger:set_wielded_item(wielditem) + end + end + + -- Digging blast + for z = -radius, radius do + for y = -radius, radius do + local vi = voxel_area:index(pos.x + (-radius), pos.y + y, pos.z + z) + + for x = -radius, radius do + local r = vector.length(vector.new(x, y, z)) + + if wielditem:get_name() == 'everness:hammer' then + if (radius * radius) / (r * r) >= (pr:next(30, 60) / 100) then + local cid = data[vi] + local p = vector.new(pos.x + x, pos.y + y, pos.z + z) + + if cid ~= c_air and cid ~= c_ignore then + data[vi] = destroy(drops, p, cid, c_air, can_dig, p_name) + end + end + else + local cid = data[vi] + local p = vector.new(pos.x + x, pos.y + y, pos.z + z) + + if cid ~= c_air and cid ~= c_ignore then + data[vi] = destroy(drops, p, cid, c_air, can_dig, p_name) + end + end + + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() + vm:update_liquids() + + -- Call `check_single_for_falling` for everything within 1.5x blast radius + for y = math.round(-radius * 1.5), math.round(radius * 1.5) do + for z = math.round(-radius * 1.5), math.round(radius * 1.5) do + for x = math.round(-radius * 1.5), math.round(radius * 1.5) do + local rad = vector.new(x, y, z) + local s = vector.add(pos, rad) + + minetest.check_single_for_falling(s) + end + end + end + + eject_drops(drops, pos, radius) + + -- Get texture for particles from majority of the dug nodes + local node_for_particles + local most = 0 + + for name, stack in pairs(drops) do + local count = stack:get_count() + + if count > most then + most = count + local def = minetest.registered_nodes[name] + + if def then + node_for_particles = { name = name } + end + + -- Play sounds + if def and def.sounds and def.sounds.dug then + for i = 1, math.random(2, 5) do + local drop_pos = vector.new(pos) + + -- `drop_pos` is being randomized here + rand_pos(pos, drop_pos, radius) + + minetest.after( + math.random(2, 8) / 10, + function() + minetest.sound_play(def.sounds.dug, { + pos = drop_pos, + pitch = math.random(1, 10) / 10 + }, true) + end + ) + end + end + end + end + + if node_for_particles then + minetest.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -2, y = 0, z = -2}, + maxvel = {x = 2, y = 5, z = 2}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = radius * 0.33, + maxsize = radius, + node = node_for_particles, + collisiondetection = true, + }) + end +end + +-- Function triggered for each qualifying node. +-- `dtime_s` is the in-game time (in seconds) elapsed since the block +-- was last active +function Everness.cool_lava(pos, node, dtime_s, prev_cool_lava_action) + -- Variant Obsidian + if + node.name == 'default:lava_source' + or node.name == 'mcl_core:lava_source' + or node.name == 'everness:lava_source' + then + if math.random(1, 10) == 1 then + local obi_nodes = { + { name = 'everness:blue_crying_obsidian', color = '#2978A6'}, + { name = 'everness:blue_weeping_obsidian', color = '#25B8FF'}, + { name = 'everness:weeping_obsidian', color = '#C90FFF'}, + } + local rand_node = obi_nodes[math.random(1, #obi_nodes)] + + minetest.set_node(pos, { + name = rand_node.name + }) + + minetest.sound_play('everness_cool_lava', + { + pos = pos, + max_hear_distance = 16, + gain = 0.2 + }, + true + ) + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + minetest.add_particlespawner({ + amount = 80, + time = 1, + size = { + min = 0.5, + max = 1, + }, + exptime = 1, + pos = pos, + glow = 7, + attract = { + kind = 'point', + strength = 0.5, + origin = pos, + die_on_contact = true + }, + radius = 3, + texture = { + name = 'everness_particle.png^[colorize:' .. rand_node.color .. ':255', + alpha_tween = { + 0, 1, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 0.25, 1, + style = 'fwd', + reps = 1 + } + } + }) + end + elseif node.name == 'everness:lava_source' then + -- Lava flowing + minetest.set_node(pos, {name = 'default:obsidian'}) + elseif node.name == 'everness:lava_flowing' then + -- Lava flowing + minetest.set_node(pos, {name = 'default:stone'}) + else + prev_cool_lava_action(pos, node, dtime_s) + end + else + prev_cool_lava_action(pos, node, dtime_s) + end +end +function Everness.get_pot_formspec(pos, label, model_texture) + local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z + local hotbar_bg = '' + local list_bg = '' + + for i = 0, 7, 1 do + hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;everness_chest_ui_bg_hb_slot.png]' + end + + for row = 0, 2, 1 do + for i = 0, 7, 1 do + list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + local model = 'model[0,0.5;2.5,2.5;everness_ceramic_pot;everness_ceramic_pot.obj;' .. model_texture .. ';0,0;true;false;]' + + local formspec = { + 'size[8,9]', + 'listcolors[#FFFFFF00;#FFFFFF1A;#5E5957]', + 'background[5,5;1,1;everness_chest_ui_bg.png;true]', + 'list[nodemeta:' .. spos .. ';main;0.5,3;1,1;]', + 'list[current_player;main;0,4.85;8,1;]', + 'list[current_player;main;0,6.08;8,3;8]', + 'listring[nodemeta:' .. spos .. ';main]', + 'listring[current_player;main]', + list_bg, + hotbar_bg, + 'image[0.5,3;1,1;everness_chest_ui_bg_hb_slot.png]', + 'label[2.5,0.5;' .. minetest.formspec_escape(label) .. ']', + model + } + + formspec = table.concat(formspec, '') + + return formspec +end + +-- +-- Encyclopedia +-- + +local ency_data = { + nodes = {}, + tools = {}, + abms = {}, + lbms = {}, + craftitems = {}, + biomes = {}, + decorations = {}, + ores = {}, +} + +-- +-- Encyclopedia Helpers +-- + +local function tchelper(first, rest) + return first:upper()..rest:lower() +end + +local function capitalize(str) + -- Add extra characters to the pattern if you need to. _ and ' are + -- found in the middle of identifiers and English words. + -- We must also put %w_' into [%w_'] to make it handle normal stuff + -- and extra stuff the same. + -- This also turns hex numbers into, eg. 0Xa7d4 + return str:gsub("(%a)([%w_']*)", tchelper) +end + +local function tech_name_to_pretty_name(tech_name) + local short_name = tech_name:split(':')[2] + short_name = short_name:gsub('_', ' ') + short_name = capitalize(short_name) + + return short_name +end + +local function get_model_texture_from_tile_definition(tile_def) + -- Assumptions its a string + local texture = '' + + for i, v in ipairs(tile_def) do + local temp = tile_def[i] + + if type(temp) == 'table' then + if temp.name then + temp = temp.name + else + temp = temp[i] + end + end + + texture = texture .. (i == 1 and '' or ',') .. temp + end + + return texture +end + +local function get_unordered_list(tbl, pos, formspec, lvl) + local _formspec = formspec or {} + local _lvl = lvl or 1 + + for k, v in pairs(tbl) do + if type(v) == 'table' then + -- Label + pos.y = pos.y + 0.25 + _formspec[#_formspec + 1] = ('label[%f,%f;%s]'):format(pos.x + 0.25 * _lvl, pos.y, k .. ':') + get_unordered_list(v, pos, _formspec, _lvl + 1) + else + if minetest.registered_items[v] then + pos.y = pos.y + 0.25 + -- Label + _formspec[#_formspec + 1] = ('label[%f,%f;%s]'):format(pos.x + 0.25 * _lvl, pos.y, k .. ':') + pos.y = pos.y + 0.25 + -- Item image + _formspec[#_formspec + 1] = ('item_image[%f,%f;1,1;%s]'):format(pos.x + 0.25 * _lvl, pos.y, v) + -- Tooltip for description + _formspec[#_formspec + 1] = ('tooltip[%f,%f;1,1;%s]'):format(pos.x + 0.25 * _lvl, pos.y, minetest.formspec_escape(v)) + pos.y = pos.y + 1 + else + pos.y = pos.y + 0.25 + -- List "bullet" + _formspec[#_formspec + 1] = ('label[%f,%f;%s]'):format(pos.x + 0.25 * _lvl, pos.y, k .. ': ' .. v) + end + end + end + + _formspec = table.concat(_formspec, '') + + return _formspec +end + +-- +-- Encyclopedia API +-- + +function Everness.encyclopedia_init(self) + -- Nodes + for name, def in pairs(self.registered_nodes) do + if def.groups + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + then + table.insert(ency_data.nodes, name) + end + end + + -- Tools + for name, def in pairs(self.registered_tools) do + if def.groups + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + then + table.insert(ency_data.tools, name) + end + end + + -- ABMs + for name, def in pairs(self.registered_abms) do + table.insert(ency_data.abms, name) + end + + -- LBMs + for name, def in pairs(self.registered_lbms) do + table.insert(ency_data.lbms, name) + end + + -- Craftitems + for name, def in pairs(self.registered_craftitems) do + if def.groups + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + then + table.insert(ency_data.craftitems, name) + end + end + + -- Biomes + for name, def in pairs(self.registered_biomes) do + table.insert(ency_data.biomes, name) + end + + -- Decorations + for name, def in pairs(self.registered_decorations) do + table.insert(ency_data.decorations, name) + end + + -- Ores + for name, def in pairs(self.registered_ores) do + table.insert(ency_data.ores, name) + end + + -- Sort alphabetically + table.sort(ency_data.nodes, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.tools, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.abms, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.lbms, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.craftitems, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.biomes, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.decorations, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.ores, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + if minetest.get_modpath('unified_inventory') then + self:encyclopedia_ui_register_page() + elseif minetest.get_modpath('i3') then + self:encyclopedia_i3_register_page() + elseif minetest.get_modpath('sfinv') and sfinv.enabled then + self:encyclopedia_sfinv_register_page() + end +end + +function Everness.encyclopedia_get_formspec(self, context) + local pos_primary = vector.new() + local pos_secondary = vector.new() + local pos_secondary_container = vector.new() + local primary_selected_idx = context.everness_ency_primary_selected_idx or 1 + local dropdown_idx = context.everness_ency_dropdown_idx or 1 + + context.everness_ency_primary_selected_idx = primary_selected_idx + context.everness_ency_dropdown_idx = dropdown_idx + + -- Get dropdown items + local ency_dropdown_items = {} + + for k, v in pairs(ency_data) do + table.insert(ency_dropdown_items, k) + end + + table.sort(ency_dropdown_items) + + -- Dropdown string value (main category) + local dropdown_value = ency_dropdown_items[dropdown_idx] + -- Data to show in secondary container (corresponding to selected index in primary item list) + local primary_list_data = ency_data[dropdown_value] + -- Get primary list items (list on the left) + local primary_list_items = {} + + for k, v in ipairs(primary_list_data) do + table.insert(primary_list_items, tech_name_to_pretty_name(v)) + end + + -- Primary list selected item value (item technical name, e.g. 'everness:palm_tree_wood') + local primary_list_selected_value = primary_list_data[primary_selected_idx] + local def = self['registered_' .. dropdown_value][primary_list_selected_value] + + pos_primary.x = pos_primary.x + 0.25 + pos_primary.y = pos_primary.y + 0.5 + + local formspec = { + -- Title + 'real_coordinates[true]', + ('label[%f,%f;%s]'):format(pos_primary.x, pos_primary.y, minetest.formspec_escape(S('Everness Encyclopedia'))), + } + + -- Dropdown (main categories) + pos_primary.y = pos_primary.y + 0.4 + formspec[#formspec + 1] = ('dropdown[%f,%f;4,0.4;everness_ency_dropdown;%s;%d;true]'):format(pos_primary.x, pos_primary.y, table.concat(ency_dropdown_items, ','), dropdown_idx) + -- Primary list + pos_primary.y = pos_primary.y + 0.6 + formspec[#formspec + 1] = ('textlist[%f,%f;4,9;everness_ency_main_list;%s;%d;false]'):format(pos_primary.x, pos_primary.y, table.concat(primary_list_items, ','), primary_selected_idx) + -- Secondary (details on the right) + pos_secondary.x = pos_secondary.x + 4.5 + pos_secondary.y = pos_secondary.y + 1.4 + formspec[#formspec + 1] = ('scroll_container[%f,%f;5.5,9;everness_ency_detail_view_scrollbar;vertical;0.1]'):format(pos_secondary.x, pos_secondary.y) + -- Secondary title + pos_secondary_container.y = pos_secondary_container.y + 0.25 + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, primary_list_selected_value) + -- Margin + pos_secondary_container.y = pos_secondary_container.y + 0.5 + + if minetest['registered_' .. dropdown_value][primary_list_selected_value] + and dropdown_value ~= 'biomes' + and dropdown_value ~= 'decorations' + and dropdown_value ~= 'ores' + then + if def.mesh then + -- Item model + formspec[#formspec + 1] = ('model[%f,%f;2,2;%s;%s;%s;-30,0;true;true;]'):format(pos_secondary_container.x, pos_secondary_container.y, primary_list_selected_value, def.mesh, get_model_texture_from_tile_definition(def.tiles)) + else + -- Item image + formspec[#formspec + 1] = ('item_image[%f,%f;2,2;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, primary_list_selected_value) + end + + if def.description then + -- Tooltip for description + formspec[#formspec + 1] = ('tooltip[%f,%f;2,2;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, minetest.formspec_escape(def.description)) + end + + pos_secondary_container.y = pos_secondary_container.y + 2 + elseif def and def.description then + -- Label description + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, minetest.formspec_escape(def.description)) + end + + if def and def.label then + pos_secondary_container.y = pos_secondary_container.y + 0.25 + -- Label description + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, minetest.formspec_escape(def.label)) + end + + -- Groups + if def and def.groups and next(def.groups) then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Groups:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.groups or {}), pos_secondary_container) + end + + -- Tool capabilities + if def and def.tool_capabilities and next(def.tool_capabilities) then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Tool Capabilities:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.tool_capabilities or {}), pos_secondary_container) + end + + -- ABM/LBM nodenames + if def and def.nodenames then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Apply "action" function to these nodes:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.nodenames or {}), pos_secondary_container) + end + + -- ABM neighbors + if def and def.neighbors and next(def.neighbors) then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Only apply "action" to nodes that have one of, or any combination of, these neighbors:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.neighbors or {}), pos_secondary_container) + end + + if def and def.run_at_every_load then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Run at every load: ' .. (def.run_at_every_load and 'yes' or 'no')) + end + + -- Biomes + if def and dropdown_value == 'biomes' then + -- Unordered list + formspec[#formspec + 1] = get_unordered_list(def, pos_secondary_container) + end + + -- Decorations + if def and dropdown_value == 'decorations' then + -- Unordered list + formspec[#formspec + 1] = get_unordered_list(def, pos_secondary_container) + end + + -- Ores + if def and dropdown_value == 'ores' then + -- Unordered list + formspec[#formspec + 1] = get_unordered_list(def, pos_secondary_container) + end + + -- Close secondary container + formspec[#formspec + 1] = 'scroll_container_end[]' + -- Add scrollbar to secondary container + formspec[#formspec + 1] = ('scrollbaroptions[min=0;max=%d;smallstep=10;largestep=100;thumbsize=10;arrows=default]'):format(math.ceil(pos_secondary_container.y * 10)) + formspec[#formspec + 1] = ('scrollbar[%f,%f;0.15,9;vertical;everness_ency_detail_view_scrollbar;]'):format(pos_secondary.x + 5.5 + 0.15, pos_secondary.y) + + return formspec +end + +function Everness.encyclopedia_i3_register_page(self) + i3.new_tab('everness_encyclopedia', { + description = 'Everness', + image = 'everness_logo.png', + slots = false, + formspec = function(player, data, fs) + local context = data or {} + local formspec = self:encyclopedia_get_formspec(context) + formspec = table.concat(formspec, '') + fs(formspec) + end, + fields = function(player, data, fields) + if fields.everness_ency_main_list then + local main_list_event = minetest.explode_textlist_event(fields.everness_ency_main_list) + + -- Set context data + if main_list_event.type == 'CHG' then + data.everness_ency_primary_selected_idx = main_list_event.index + end + elseif fields.everness_ency_dropdown then + local prev_everness_ency_dropdown_idx = data.everness_ency_dropdown_idx + local new_everness_ency_dropdown_idx = tonumber(fields.everness_ency_dropdown) + data.everness_ency_dropdown_idx = new_everness_ency_dropdown_idx + + -- Change to 1st primary list item index only when changing dropdown + if prev_everness_ency_dropdown_idx ~= new_everness_ency_dropdown_idx then + data.everness_ency_primary_selected_idx = 1 + end + end + end, + access = function(player, data) + return minetest.check_player_privs(player:get_player_name(), 'everness_encyclopedia') + end, + }) +end + +function Everness.encyclopedia_ui_register_page(self) + unified_inventory.register_page('everness:encyclopedia', { + get_formspec = function(player) + local context = unified_inventory.everness_context[player:get_player_name()] + local formspec = self:encyclopedia_get_formspec(context) + + return { + formspec = table.concat(formspec, ''), + draw_inventory = false, + draw_item_list = false + } + end + }) + + minetest.register_on_joinplayer(function(player) + local pname = player:get_player_name() + + unified_inventory.everness_context = {} + unified_inventory.everness_context[pname] = { + everness_ency_dropdown_idx = 1, + everness_ency_primary_selected_idx = 1, + } + end) + + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= '' then + return + end + + local pname = player:get_player_name() + + if fields.everness_ency_main_list then + local main_list_event = minetest.explode_textlist_event(fields.everness_ency_main_list) + + -- Set context data + if main_list_event.type == 'CHG' then + unified_inventory.everness_context[pname].everness_ency_primary_selected_idx = main_list_event.index + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + end + elseif fields.everness_ency_dropdown then + local prev_everness_ency_dropdown_idx = unified_inventory.everness_context[pname].everness_ency_dropdown_idx + local new_everness_ency_dropdown_idx = tonumber(fields.everness_ency_dropdown) + unified_inventory.everness_context[pname].everness_ency_dropdown_idx = new_everness_ency_dropdown_idx + + -- Change to 1st primary list item index only when changing dropdown + if prev_everness_ency_dropdown_idx ~= new_everness_ency_dropdown_idx then + unified_inventory.everness_context[pname].everness_ency_primary_selected_idx = 1 + end + + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + end + end) + + unified_inventory.register_button('everness:encyclopedia', { + type = 'image', + image = 'everness_logo.png', + tooltip = 'Everness Encyclopedia', + condition = function(player) + return minetest.check_player_privs(player:get_player_name(), 'everness_encyclopedia') + end, + action = function(player) + local pname = player:get_player_name() + + if not minetest.check_player_privs(pname, 'everness_encyclopedia') then + minetest.chat_send_player(pname, S('You need "everness_encyclopedia" privilige to access this button.')) + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + return + end + + unified_inventory.current_page[pname] = 'everness:encyclopedia' + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + end, + }) +end + +function Everness.encyclopedia_sfinv_register_page(self) + sfinv.register_page('everness:encyclopedia', { + title = 'Everness', + is_in_nav = function(_self, player, context) + return minetest.check_player_privs(player:get_player_name(), 'everness_encyclopedia') + end, + get = function(_self, player, context) + local formspec = self:encyclopedia_get_formspec(context) + return sfinv.make_formspec(player, context, table.concat(formspec, '')) + end, + on_player_receive_fields = function (_self, player, context, fields) + if fields.everness_ency_main_list then + local main_list_event = minetest.explode_textlist_event(fields.everness_ency_main_list) + + -- Set context data + if main_list_event.type == 'CHG' then + context.everness_ency_primary_selected_idx = main_list_event.index + sfinv.set_player_inventory_formspec(player) + end + end + + if fields.everness_ency_dropdown then + local prev_everness_ency_dropdown_idx = context.everness_ency_dropdown_idx + local new_everness_ency_dropdown_idx = tonumber(fields.everness_ency_dropdown) + context.everness_ency_dropdown_idx = new_everness_ency_dropdown_idx + + -- Change to 1st primary list item index only when changing dropdown + if prev_everness_ency_dropdown_idx ~= new_everness_ency_dropdown_idx then + context.everness_ency_primary_selected_idx = 1 + end + + sfinv.set_player_inventory_formspec(player) + end + end + }) +end + +function Everness.find_content_in_vm_area(minp, maxp, contentIds, data, area) + local indexes = {} + local id_count = {} + + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + + if table.indexof(contentIds, data[ai]) ~= -1 then + id_count[data[ai]] = (id_count[data[ai]] or 0) + 1 + table.insert(indexes, ai) + end + end + end + end + + return indexes, id_count +end + +function Everness.find_content_under_air_in_vm_area(minp, maxp, contentIds, data, area) + local indexes = {} + local id_count = {} + + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + + if table.indexof(contentIds, data[ai]) ~= -1 + and data[ai + area.ystride] == minetest.CONTENT_AIR + then + id_count[data[ai]] = (id_count[data[ai]] or 0) + 1 + table.insert(indexes, ai) + end + end + end + end + + return indexes, id_count +end + + +function Everness.add_to_queue_on_generated(self, def) + -- no-op to preserve function calls and allow abdecor to supersede + if type(def) ~= 'table' then + minetest.log('warning', '[add_to_queue_on_generated] Callback definition is not a table, not adding to queue! It was type of ' .. type(def)) + return + end + + table.insert(self.on_generated_queue, def) +end + +---Merge two tables with key/value pair +---@param t1 table +---@param t2 table +---@return table +function Everness.mergeTables(t1, t2) + for k, v in pairs(t2) do t1[k] = v end + return t1 +end diff --git a/mods/everness/bamboo.lua b/mods/everness/bamboo.lua new file mode 100644 index 00000000..4415a229 --- /dev/null +++ b/mods/everness/bamboo.lua @@ -0,0 +1,180 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- how often node timers for plants will tick, +/- some random value +function Everness.tick_bamboo(self, pos) + minetest.get_node_timer(pos):start(math.random(83, 143)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +function Everness.tick_bamboo_again(self, pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +--- Rotate placed bamboo based on the stem below/above +function Everness.place_bamboo(self, pos, placer, itemstack, pointed_thing) + local node_under = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + local node_above = minetest.get_node(vector.new(pos.x, pos.y + 1, pos.z)) + + if minetest.get_item_group(node_under.name, 'bamboo') > 0 then + minetest.swap_node(pos, { name = itemstack:get_name(), param2 = node_under.param2 }) + return + elseif minetest.get_item_group(node_above.name, 'bamboo') > 0 then + minetest.swap_node(pos, { name = itemstack:get_name(), param2 = node_above.param2 }) + return + end + + local rand_param2 = math.random(0, 3) + minetest.swap_node(pos, { name = itemstack:get_name(), param2 = rand_param2 }) +end + +--- Dig bamboo all the way up and simulate digging particles +function Everness.dig_up_bamboo(self, pos, oldnode, oldmetadata, digger) + if digger == nil then + return + end + + local pos_above = { x = pos.x, y = pos.y + 1, z = pos.z } + local pos_below = { x = pos.x, y = pos.y - 1, z = pos.z } + local node_above = minetest.get_node(pos_above) + local node_below = minetest.get_node(pos_below) + + if minetest.get_item_group(node_below.name, 'bamboo') > 0 then + self:tick_bamboo(pos_below) + end + + if minetest.get_item_group(node_above.name, 'bamboo') > 0 then + minetest.node_dig(pos_above, node_above, digger) + + minetest.add_particlespawner({ + amount = 10, + time = 0.5, + minpos = { x = pos_above.x - 0.7, y = pos_above.y, z = pos_above.z - 0.7 }, + maxpos = { x = pos_above.x + 0.7, y = pos_above.y + 0.75, z = pos_above.z + 0.7 }, + minvel = { x = -0.5, y = -4, z = -0.5 }, + maxvel = { x = 0.5, y = -2, z = 0.5 }, + minacc = { x = -0.5, y = -4, z = -0.5 }, + maxacc = { x = 0.5, y = -2, z = 0.5 }, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + collisiondetection = true, + node = { name = node_above.name } + }) + end +end + +function Everness.grow_bamboo(self, pos, elapsed) + + local _pos = vector.new(pos) + _pos.y = _pos.y - 1 + + -- local name = minetest.get_node(_pos).name + local node_below = minetest.get_node(_pos) + local _node = minetest.get_node(pos) + + if minetest.get_item_group(node_below.name, 'soil') == 0 + and minetest.get_item_group(node_below.name, 'sand') == 0 + and minetest.get_item_group(node_below.name, 'everness_sand') == 0 + then + + if minetest.get_item_group(node_below.name, 'bamboo') > 0 then + self:grow_bamboo(_pos, elapsed) + return + end + + self:tick_bamboo_again(pos) + return + end + + _pos.y = _pos.y + 1 + + local height = 0 + + + while minetest.get_item_group(_node.name, 'bamboo') > 0 and height < 16 do + height = height + 1 + _pos.y = _pos.y + 1 + _node = minetest.get_node(_pos) + end + + -- stop growing - random height between 12 - 16 nodes + if height > 11 and height < 16 then + if math.random(1, 3) == 2 then + return + end + end + + if height >= 16 then + return + end + + if _node.name ~= 'air' then + self:tick_bamboo_again(_pos) + return + end + + + if minetest.get_node_light(_pos) < 9 then + self:tick_bamboo_again(pos) + return + end + + local height_offset = height + + -- variant appearance for this growth stages + local rand_param2 = math.random(0, 3) + + if height < 5 then + local next_plant_schem = self.bamboo.growth_stages[height] + + for i, v in ipairs(next_plant_schem) do + local pos_to_swap = vector.new(_pos.x, _pos.y - height_offset, _pos.z) + local node_to_swap = minetest.get_node(pos_to_swap) + height_offset = height_offset - 1 + + if i == 1 then + if minetest.get_item_group(node_to_swap.name, 'seed') == 0 and node_to_swap.name ~= 'air' then + rand_param2 = node_to_swap.param2 + end + end + + minetest.set_node(pos_to_swap, { name = v.name, param2 = rand_param2 }) + + if i == #next_plant_schem then + self:tick_bamboo(_pos) + return + end + end + end + + -- grow verically while keeping the top 3 nodes with leaves + local start_pos = vector.new(_pos.x, _pos.y - 3, _pos.z) + local prev_node = minetest.get_node(vector.new(start_pos.x, start_pos.y - 1, start_pos.z)) + + minetest.set_node(start_pos, { name = 'everness:bamboo_3', param2 = prev_node.param2 }) + + for k, v in ipairs(self.bamboo.top_leaves_schem) do + minetest.set_node( + vector.new(start_pos.x, start_pos.y + k, start_pos.z), + { name = v.name, param2 = prev_node.param2 } + ) + end + + self:tick_bamboo(_pos) + return false +end diff --git a/mods/everness/buckets.lua b/mods/everness/buckets.lua new file mode 100644 index 00000000..a54ba74c --- /dev/null +++ b/mods/everness/buckets.lua @@ -0,0 +1,238 @@ +--[[ + Authors of original source code + ---------------------- + Kahrl (LGPLv2.1+) + celeron55, Perttu Ahola (LGPLv2.1+) + Various Minetest developers and contributors (LGPLv2.1+) + Everness. Never ending discovery in Everness mapgen. + + Modified by: + + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. +--]] + +-- Load support for MT game translation. +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_craft({ + output = 'everness:bucket_empty 1', + recipe = { + { 'everness:pyrite_ingot', '', 'everness:pyrite_ingot' }, + { '', 'everness:pyrite_ingot', '' }, + } +}) + +local bucket = { + liquids = {} +} + +local function check_protection(pos, name, text) + if minetest.is_protected(pos, name) then + minetest.log('action', (name ~= '' and name or 'A mod') + .. ' tried to ' .. text + .. ' at protected position ' + .. minetest.pos_to_string(pos) + .. ' with a bucket') + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- inventory_image = texture of the new bucket item (ignored if itemname == nil) +-- name = text description of the bucket item +-- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. +-- This function can be called from any mod (that depends on bucket). +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) + bucket.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + force_renew = force_renew, + } + bucket.liquids[flowing] = bucket.liquids[source] + + if itemname ~= nil then + Everness:register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + stack_max = 1, + liquids_pointable = true, + groups = groups, + wield_scale = { x = 2, y = 2, z = 1 }, + + on_place = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= 'node' then + return + end + + local node = minetest.get_node_or_nil(pointed_thing.under) + local ndef = node and minetest.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if ndef and ndef.on_rightclick and + not (user and user:is_player() and + user:get_player_control().sneak) then + return ndef.on_rightclick( + pointed_thing.under, + node, user, + itemstack) + end + + local lpos + + -- Check if pointing to a buildable node + if ndef and ndef.buildable_to then + -- buildable; replace the node + lpos = pointed_thing.under + else + -- not buildable to; place the liquid above + -- check if the node above can be replaced + + lpos = pointed_thing.above + node = minetest.get_node_or_nil(lpos) + local above_ndef = node and minetest.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then + -- do not remove the bucket with the liquid + return itemstack + end + end + + if check_protection(lpos, user + and user:get_player_name() + or '', 'place '..source) then + return + end + + minetest.set_node(lpos, {name = source}) + return ItemStack('everness:bucket_empty') + end + }) + end +end + +Everness:register_craftitem('everness:bucket_empty', { + description = S('Empty Bucket'), + inventory_image = 'everness_bucket_empty.png', + groups = { tool = 1 }, + liquids_pointable = true, + wield_scale = { x = 2, y = 2, z = 1 }, + + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == 'object' then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= 'node' then + -- do nothing if it's neither object nor node + return + end + -- Check if pointing to a liquid source + local node = minetest.get_node(pointed_thing.under) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source + then + if check_protection(pointed_thing.under, + user:get_player_name(), + 'take '.. node.name) then + return + end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + + if inv:room_for_item('main', { name = liquiddef.itemname }) then + inv:add_item('main', liquiddef.itemname) + else + local pos = user:get_pos() + pos.y = math.floor(pos.y + 0.5) + minetest.add_item(pos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = 'everness:bucket_empty '.. tostring(item_count - 1) + end + + -- force_renew requires a source neighbour + local source_neighbor = false + + if liquiddef.force_renew then + source_neighbor = minetest.find_node_near(pointed_thing.under, 1, liquiddef.source) + end + + if not (source_neighbor and liquiddef.force_renew) then + minetest.add_node(pointed_thing.under, { name = 'air' }) + end + + return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = minetest.registered_nodes[node.name] + + if node_def then + node_def.on_punch(pointed_thing.under, node, user, pointed_thing) + end + + return user:get_wielded_item() + end + end, +}) + +-- Mineral water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + +bucket.register_liquid( + 'everness:mineral_water_source', + 'everness:mineral_water_flowing', + 'everness:bucket_mineral_water', + 'everness_bucket_mineral_water.png', + S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'), + { tool = 1, water_bucket = 1 } +) + +bucket.register_liquid( + 'everness:lava_source', + 'everness:lava_flowing', + 'everness:bucket_lava', + 'everness_bucket_lava.png', + S('Lava Bucket'), + { tool = 1 } +) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bucket_lava', + burntime = 370, + replacements = {{ 'everness:bucket_lava', 'everness:bucket_empty' }}, +}) diff --git a/mods/everness/chat_commands.lua b/mods/everness/chat_commands.lua new file mode 100644 index 00000000..92eb2083 --- /dev/null +++ b/mods/everness/chat_commands.lua @@ -0,0 +1,25 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_chatcommand('everness:getbiomename', { + description = S('Get biome name where you are standing.'), + params = '', + privs = { creative = true }, + func = function(name, param) + local player = minetest.get_player_by_name(name) + + if not player then + return false, S('This command can only be executed in-game!') + end + + local p_pos = player:get_pos() + local biome_data = minetest.get_biome_data(p_pos) + + if not biome_data then + return false + end + + local biome_name = minetest.get_biome_name(biome_data.biome) + + minetest.chat_send_player(name, 'Biome name: ' .. biome_name) + end, +}) diff --git a/mods/everness/chests.lua b/mods/everness/chests.lua new file mode 100644 index 00000000..4b7d3877 --- /dev/null +++ b/mods/everness/chests.lua @@ -0,0 +1,382 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + GNU Lesser General Public License, version 2.1 + Copyright (C) 2011-2018 celeron55, Perttu Ahola + Copyright (C) 2011-2018 Various Minetest developers and contributors + Copyright (C) 2022 SaKeL + + This program is free software; you can redistribute it and/or modify it under the terms + of the GNU Lesser General Public License as published by the Free Software Foundation; + either version 2.1 of the License, or (at your option) any later version. + + This program 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 Lesser General Public License for more details: + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +--]] + +Everness.chest = {} + +-- support for MT game translation. +local S = minetest.get_translator(minetest.get_current_modname()) + +function Everness.chest.get_chest_formspec(pos) + local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z + local hotbar_bg = '' + local list_bg = '' + local chest_bg = '' + + for i = 0, 7, 1 do + hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;everness_chest_ui_bg_hb_slot.png]' + end + + for row = 0, 2, 1 do + for i = 0, 7, 1 do + list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + for row = 0, 3, 1 do + for i = 0, 7, 1 do + chest_bg = chest_bg .. 'image[' .. 0 + i .. ',' .. 0.3 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + local formspec = + 'size[8,9]' .. + 'listcolors[#FFFFFF00;#FFFFFF1A;#5E5957]' .. + 'background[5,5;1,1;everness_chest_ui_bg.png;true]' .. + 'list[nodemeta:' .. spos .. ';main;0,0.3;8,4;]' .. + 'list[current_player;main;0,4.85;8,1;]' .. + 'list[current_player;main;0,6.08;8,3;8]' .. + 'listring[nodemeta:' .. spos .. ';main]' .. + 'listring[current_player;main]' .. + list_bg .. + hotbar_bg .. + chest_bg + return formspec +end + +function Everness.chest.chest_lid_obstructed(pos) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local def = minetest.registered_nodes[minetest.get_node(above).name] + + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def and + (def.drawtype == 'airlike' or + def.drawtype == 'signlike' or + def.drawtype == 'torchlike' or + (def.drawtype == 'nodebox' and def.paramtype2 == 'wallmounted')) + then + return false + end + + return true +end + +function Everness.chest.chest_lid_close(pn) + local chest_open_info = Everness.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + Everness.chest.open_chests[pn] = nil + + for _, v in pairs(Everness.chest.open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + + local node = minetest.get_node(pos) + + minetest.after(0.2, minetest.swap_node, pos, { name = swap, param2 = node.param2 }) + minetest.sound_play(sound, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) +end + +Everness.chest.open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local pn = player:get_player_name() + + if formname ~= 'everness:chest' then + if Everness.chest.open_chests[pn] then + Everness.chest.chest_lid_close(pn) + end + + return + end + + if not (fields.quit and Everness.chest.open_chests[pn]) then + return + end + + Everness.chest.chest_lid_close(pn) + + return true +end) + +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + + if Everness.chest.open_chests[pn] then + Everness.chest.chest_lid_close(pn) + end +end) + +function Everness.chest.register_chest(prefixed_name, d) + local name = prefixed_name:sub(1, 1) == ':' and prefixed_name:sub(2, -1) or prefixed_name + local def = table.copy(d) + def.drawtype = 'mesh' + def.visual = 'mesh' + def.paramtype = 'light' + def.paramtype2 = 'facedir' + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + -- Locked chest + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('infotext', S('Locked Chest')) + meta:set_string('owner', '') + local inv = meta:get_inventory() + inv:set_size('main', 8 * 4) + end + + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string('owner', placer:get_player_name() or '') + meta:set_string('infotext', S('Locked Chest (owned by @1)', meta:get_string('owner'))) + end + + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty('main') and Everness.can_interact_with_node(player, pos) + end + + def.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not Everness.can_interact_with_node(player, pos) then + return 0 + end + + return count + end + + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not Everness.can_interact_with_node(player, pos) then + return 0 + end + + return stack:get_count() + end + + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not Everness.can_interact_with_node(player, pos) then + return 0 + end + + return stack:get_count() + end + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not Everness.can_interact_with_node(clicker, pos) then + return itemstack + end + + local cn = clicker:get_player_name() + + if Everness.chest.open_chests[cn] then + Everness.chest.chest_lid_close(cn) + end + + minetest.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + + if not Everness.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { name = name .. '_open', param2 = node.param2 }) + end + + minetest.after( + 0.2, + minetest.show_formspec, + cn, + 'everness:chest', + Everness.chest.get_chest_formspec(pos) + ) + Everness.chest.open_chests[cn] = { pos = pos, sound = def.sound_close, swap = name } + end + + def.on_blast = function() end + + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string('key_lock_secret') + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if itemstack:get_metadata() == '' then + return + end + + if key_meta:get_string('secret') == '' then + key_meta:set_string('secret', minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata('') + end + + if secret ~= key_meta:get_string('secret') then + return + end + + minetest.show_formspec( + player:get_player_name(), + 'everness:chest_locked', + Everness.chest.get_chest_formspec(pos) + ) + end + + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string('owner') + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, S('You do not own this chest.')) + return nil + end + + local secret = meta:get_string('key_lock_secret') + if secret == '' then + secret = newsecret + meta:set_string('key_lock_secret', secret) + end + + return secret, S('a locked chest'), owner + end + else + -- Public (unlocked) chest + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('infotext', S('Chest')) + local inv = meta:get_inventory() + inv:set_size('main', 8 * 4) + end + + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty('main') + end + + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + + if not Everness.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { name = name .. '_open', param2 = node.param2 }) + end + + minetest.after(0.2, minetest.show_formspec, clicker:get_player_name(), 'everness:chest', Everness.chest.get_chest_formspec(pos)) + Everness.chest.open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name } + end + + def.on_blast = function(pos) + local drops = {} + Everness.get_inventory_drops(pos, 'main', drops) + drops[#drops + 1] = name + minetest.remove_node(pos) + return drops + end + end + + Everness.set_inventory_action_loggers(def, 'chest') + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = 'everness_chest_open.obj' + + for i = 1, #def_opened.tiles do + if type(def_opened.tiles[i]) == 'string' then + def_opened.tiles[i] = { name = def_opened.tiles[i], backface_culling = true } + elseif def_opened.tiles[i].backface_culling == nil then + def_opened.tiles[i].backface_culling = true + end + end + + def_opened.drop = name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = 'fixed', + fixed = { -1 / 2, -1 / 2, -1 / 2, 1 / 2, 3 / 16, 1 / 2 }, + } + def_opened.can_dig = function() + return false + end + def_opened.on_blast = function() end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for 'normal' + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3] .. '^[transformFX' + + Everness:register_node(prefixed_name, def_closed) + Everness:register_node(prefixed_name .. '_open', def_opened) + + -- close opened chests on load + Everness:register_lbm({ + label = 'Everness close opened chests on load', + name = 'everness:close_' .. prefixed_name:gsub(':', '_') .. '_open', + nodenames = { prefixed_name .. '_open' }, + run_at_every_load = true, + action = function(pos, node) + node.name = prefixed_name + minetest.swap_node(pos, node) + end + }) +end + +Everness.chest.register_chest('everness:chest', { + description = S('Chest'), + tiles = { + 'everness_chest_top.png', + 'everness_chest_top.png', + 'everness_chest_side.png', + 'everness_chest_side.png', + 'everness_chest_front.png', + 'everness_chest_inside.png' + }, + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_chest_open', + sound_close = 'everness_chest_close', + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + axey = 1, + container = 2, + deco_block = 1, + material_wood = 1, + flammable = -1, + }, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +minetest.register_craft({ + output = 'everness:chest', + recipe = { + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + { 'group:everness_wood', '', 'group:everness_wood' }, + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:chest', + burntime = 30, +}) diff --git a/mods/everness/crafting.lua b/mods/everness/crafting.lua new file mode 100644 index 00000000..2a52db1a --- /dev/null +++ b/mods/everness/crafting.lua @@ -0,0 +1,1101 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Blocks +-- + +if minetest.get_modpath('default') then + minetest.register_craft({ + output = 'everness:snowcobble 9', + recipe = { + { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, + { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, + { 'default:snowblock', 'default:snowblock', 'default:snowblock' }, + } + }) + + minetest.register_craft({ + output = 'everness:icecobble 9', + recipe = { + { 'default:ice', 'default:ice', 'default:ice' }, + { 'default:ice', 'default:ice', 'default:ice' }, + { 'default:ice', 'default:ice', 'default:ice' }, + } + }) +end + +minetest.register_craft({ + output = 'everness:snowcobble 9', + recipe = { + { 'everness:frosted_snowblock', 'everness:frosted_snowblock', 'everness:frosted_snowblock' }, + { 'everness:frosted_snowblock', 'everness:frosted_snowblock', 'everness:frosted_snowblock' }, + { 'everness:frosted_snowblock', 'everness:frosted_snowblock', 'everness:frosted_snowblock' }, + } +}) + +minetest.register_craft({ + output = 'everness:icecobble 9', + recipe = { + { 'everness:frosted_ice', 'everness:frosted_ice', 'everness:frosted_ice' }, + { 'everness:frosted_ice', 'everness:frosted_ice', 'everness:frosted_ice' }, + { 'everness:frosted_ice', 'everness:frosted_ice', 'everness:frosted_ice' }, + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'everness:frosted_ice_translucent', + recipe = { 'everness:frosted_ice' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'everness:frosted_ice', + recipe = { 'everness:frosted_ice_translucent' } +}) + +minetest.register_craft({ + output = 'everness:bamboo_block', + recipe = { + { 'everness:bamboo_item', 'everness:bamboo_item', 'everness:bamboo_item' }, + { 'everness:bamboo_item', 'everness:bamboo_item', 'everness:bamboo_item' }, + { 'everness:bamboo_item', 'everness:bamboo_item', 'everness:bamboo_item' }, + } +}) + +minetest.register_craft({ + output = 'everness:bamboo_wood', + recipe = { + { 'everness:bamboo_item', 'everness:bamboo_item', '' }, + { 'everness:bamboo_item', 'everness:bamboo_item', '' }, + { '', '', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:trapdoor_bamboo 2', + recipe = { + { 'everness:bamboo_wood', 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { '', '', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:trapdoor_crystal_wood 2', + recipe = { + { 'everness:crystal_wood', 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood', 'everness:crystal_wood' }, + { '', '', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:trapdoor_cursed_wood 2', + recipe = { + { 'everness:dry_wood', 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood', 'everness:dry_wood' }, + { '', '', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:trapdoor_palm_wood 2', + recipe = { + { 'everness:palm_tree_wood', 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + { 'everness:palm_tree_wood', 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + { '', '', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:trapdoor_lava_tree 2', + recipe = { + { 'everness:lava_tree_wood', 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + { 'everness:lava_tree_wood', 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + { '', '', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:bamboo_mosaic_wood', + recipe = { + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyriteblock', + recipe = { + { 'everness:pyrite_ingot', 'everness:pyrite_ingot', 'everness:pyrite_ingot' }, + { 'everness:pyrite_ingot', 'everness:pyrite_ingot', 'everness:pyrite_ingot' }, + { 'everness:pyrite_ingot', 'everness:pyrite_ingot', 'everness:pyrite_ingot' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyrite_glass', + recipe = { + { 'group:glass' }, + { 'everness:pyrite_ingot' }, + } +}) + +if minetest.get_modpath('default') then + minetest.register_craft({ + output = 'everness:pyrite_glass', + recipe = { + { 'default:glass' }, + { 'everness:pyrite_ingot' }, + } + }) +end + +minetest.register_craft({ + output = 'everness:pyrite_lantern', + recipe = { + { 'everness:pyrite_glass' }, + { 'everness:pyrite_ingot' }, + } +}) + +minetest.register_craft({ + output = 'everness:tinted_glass_red 8', + recipe = { + { 'everness:glass', 'everness:glass', 'everness:glass' }, + { 'everness:glass', 'everness:bloodspore_plant', 'everness:glass' }, + { 'everness:glass', 'everness:glass', 'everness:glass' }, + } +}) + +minetest.register_craft({ + output = 'everness:tinted_glass_red 8', + recipe = { + { 'everness:glass', 'everness:glass', 'everness:glass' }, + { 'everness:glass', 'everness:bloodspore_plant_small', 'everness:glass' }, + { 'everness:glass', 'everness:glass', 'everness:glass' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyriteblock_brick 4', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyriteblock_slab_brick 2', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyriteblock_spiral 8', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', '', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyrite_roof_tile 6', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyrite_pillar_bottom 5', + recipe = { + { '', 'everness:pyriteblock_forged', '' }, + { '', 'everness:pyriteblock_forged', '' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyrite_pillar_middle 3', + recipe = { + { '', 'everness:pyriteblock_forged', '' }, + { '', 'everness:pyriteblock_forged', '' }, + { '', 'everness:pyriteblock_forged', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyrite_pillar_top 5', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { '', 'everness:pyriteblock_forged', '' }, + { '', 'everness:pyriteblock_forged', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyrite_pillar_small 7', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { '', 'everness:pyriteblock_forged', '' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:pyriteblock_polished 9', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + } +}) + +minetest.register_craft({ + output = 'everness:baobab_wood 4', + recipe = { + { 'everness:baobab_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:dry_wood 4', + recipe = { + { 'everness:dry_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_wood 4', + recipe = { + { 'everness:coral_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:willow_wood 4', + recipe = { + { 'everness:willow_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:sequoia_wood 4', + recipe = { + { 'everness:sequoia_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_wood 4', + recipe = { + { 'everness:crystal_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:mese_wood 4', + recipe = { + { 'everness:mese_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:lava_tree_wood 4', + recipe = { + { 'everness:lava_tree' }, + } +}) + +minetest.register_craft({ + output = 'everness:lava_tree_wood 4', + recipe = { + { 'everness:lava_tree_with_lava' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_sandstone 4', + recipe = { + { 'everness:coral_sand', 'everness:coral_sand' }, + { 'everness:coral_sand', 'everness:coral_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_sandstone_brick 4', + recipe = { + { 'everness:coral_sandstone', 'everness:coral_sandstone' }, + { 'everness:coral_sandstone', 'everness:coral_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_deep_ocean_sandstone_block 4', + recipe = { + { 'everness:coral_forest_deep_ocean_sand', 'everness:coral_forest_deep_ocean_sand' }, + { 'everness:coral_forest_deep_ocean_sand', 'everness:coral_forest_deep_ocean_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_deep_ocean_sandstone_brick 4', + recipe = { + { 'everness:coral_deep_ocean_sandstone_block', 'everness:coral_deep_ocean_sandstone_block' }, + { 'everness:coral_deep_ocean_sandstone_block', 'everness:coral_deep_ocean_sandstone_block' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_sandstone_chiseled 9', + recipe = { + { 'everness:coral_sandstone', 'everness:coral_sandstone', 'everness:coral_sandstone' }, + { 'everness:coral_sandstone', 'everness:coral_sandstone', 'everness:coral_sandstone' }, + { 'everness:coral_sandstone', 'everness:coral_sandstone', 'everness:coral_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_sandstone_carved_1 9', + recipe = { + { 'everness:coral_sandstone_chiseled', 'everness:coral_sandstone_chiseled' }, + { 'everness:coral_sandstone_chiseled', 'everness:coral_sandstone_chiseled' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_white_sandstone 4', + recipe = { + { 'everness:coral_white_sand', 'everness:coral_white_sand' }, + { 'everness:coral_white_sand', 'everness:coral_white_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_white_sandstone_brick 4', + recipe = { + { 'everness:coral_white_sandstone', 'everness:coral_white_sandstone' }, + { 'everness:coral_white_sandstone', 'everness:coral_white_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_white_sandstone_pillar 3', + recipe = { + { '', 'everness:coral_white_sandstone', '' }, + { '', 'everness:coral_white_sandstone', '' }, + { '', 'everness:coral_white_sandstone', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:quartz_block 4', + recipe = { + { 'everness:quartz_crystal', 'everness:quartz_crystal' }, + { 'everness:quartz_crystal', 'everness:quartz_crystal' }, + } +}) + +minetest.register_craft({ + output = 'everness:quartz_chiseled 4', + recipe = { + { 'everness:quartz_block', 'everness:quartz_block' }, + { 'everness:quartz_block', 'everness:quartz_block' }, + } +}) + +minetest.register_craft({ + output = 'everness:quartz_pillar 3', + recipe = { + { '', 'everness:quartz_block', '' }, + { '', 'everness:quartz_block', '' }, + { '', 'everness:quartz_block', '' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_desert_stone_brick 4', + recipe = { + { 'everness:coral_desert_stone', 'everness:coral_desert_stone' }, + { 'everness:coral_desert_stone', 'everness:coral_desert_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_desert_stone_block 9', + recipe = { + { 'everness:coral_desert_stone', 'everness:coral_desert_stone', 'everness:coral_desert_stone' }, + { 'everness:coral_desert_stone', 'everness:coral_desert_stone', 'everness:coral_desert_stone' }, + { 'everness:coral_desert_stone', 'everness:coral_desert_stone', 'everness:coral_desert_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_bones_brick 4', + recipe = { + { 'everness:coral_bones_block', 'everness:coral_bones_block' }, + { 'everness:coral_bones_block', 'everness:coral_bones_block' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_bones_block 9', + recipe = { + { 'everness:coral_bones', 'everness:coral_bones', 'everness:coral_bones' }, + { 'everness:coral_bones', 'everness:coral_bones', 'everness:coral_bones' }, + { 'everness:coral_bones', 'everness:coral_bones', 'everness:coral_bones' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_sandstone 4', + recipe = { + { 'everness:crystal_sand', 'everness:crystal_sand' }, + { 'everness:crystal_sand', 'everness:crystal_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_sandstone_brick 4', + recipe = { + { 'everness:crystal_sandstone', 'everness:crystal_sandstone' }, + { 'everness:crystal_sandstone', 'everness:crystal_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_sandstone_chiseled 9', + recipe = { + { 'everness:crystal_sandstone', 'everness:crystal_sandstone', 'everness:crystal_sandstone' }, + { 'everness:crystal_sandstone', 'everness:crystal_sandstone', 'everness:crystal_sandstone' }, + { 'everness:crystal_sandstone', 'everness:crystal_sandstone', 'everness:crystal_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_brick 4', + recipe = { + { 'everness:cursed_stone', 'everness:cursed_stone' }, + { 'everness:cursed_stone', 'everness:cursed_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_brick_with_growth 4', + recipe = { + { 'everness:cursed_brick', 'group:leaves' } + } +}) + +minetest.register_craft({ + output = 'everness:cursed_brick_mixed 4', + recipe = { + { 'everness:cursed_stone', 'everness:cursed_brick' }, + { 'everness:cursed_brick', 'everness:cursed_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_brick_carved 9', + recipe = { + { 'everness:cursed_brick', 'everness:cursed_brick', 'everness:cursed_brick' }, + { 'everness:cursed_brick', 'everness:cursed_brick', 'everness:cursed_brick' }, + { 'everness:cursed_brick', 'everness:cursed_brick', 'everness:cursed_brick' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_sandstone_block 4', + recipe = { + { 'everness:cursed_sand', 'everness:cursed_sand' }, + { 'everness:cursed_sand', 'everness:cursed_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_sandstone_brick 4', + recipe = { + { 'everness:cursed_sandstone_block', 'everness:cursed_sandstone_block' }, + { 'everness:cursed_sandstone_block', 'everness:cursed_sandstone_block' }, + } +}) + +minetest.register_craft({ + output = 'everness:forsaken_tundra_brick 4', + recipe = { + { 'everness:forsaken_tundra_stone', 'everness:forsaken_tundra_stone' }, + { 'everness:forsaken_tundra_stone', 'everness:forsaken_tundra_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:forsaken_desert_cobble', + recipe = { + { 'everness:forsaken_desert_cobble_red', 'everness:forsaken_desert_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:forsaken_desert_brick_red', + recipe = { + { 'everness:forsaken_desert_stone', 'everness:forsaken_desert_stone' }, + { 'everness:forsaken_desert_stone', 'everness:forsaken_desert_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:forsaken_desert_brick', + recipe = { + { 'everness:forsaken_desert_brick_red', 'everness:forsaken_desert_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:forsaken_desert_chiseled_stone', + recipe = { + { 'everness:forsaken_desert_brick_red' }, + { 'everness:forsaken_desert_brick' }, + } +}) + +minetest.register_craft({ + output = 'everness:forsaken_desert_engraved_stone 4', + recipe = { + { 'everness:forsaken_desert_brick', 'everness:forsaken_desert_brick' }, + { 'everness:forsaken_desert_brick', 'everness:forsaken_desert_brick' }, + } +}) + +minetest.register_craft({ + output = 'everness:coral_forest_deep_ocean_lantern 1', + recipe = { + { 'everness:coral_deep_ocean_sandstone_block', 'group:glass', 'everness:coral_deep_ocean_sandstone_block' }, + { 'group:glass', 'group:torch', 'group:glass' }, + { 'everness:coral_deep_ocean_sandstone_block', 'group:glass', 'everness:coral_deep_ocean_sandstone_block' }, + } +}) + +if minetest.get_modpath('default') then + minetest.register_craft({ + output = 'everness:coral_forest_deep_ocean_lantern 1', + recipe = { + { 'everness:coral_deep_ocean_sandstone_block', 'default:glass', 'everness:coral_deep_ocean_sandstone_block' }, + { 'default:glass', 'group:torch', 'default:glass' }, + { 'everness:coral_deep_ocean_sandstone_block', 'default:glass', 'everness:coral_deep_ocean_sandstone_block' }, + } + }) +end + +minetest.register_craft({ + output = 'everness:cursed_lands_deep_ocean_sandstone_block 4', + recipe = { + { 'everness:cursed_lands_deep_ocean_sand', 'everness:cursed_lands_deep_ocean_sand' }, + { 'everness:cursed_lands_deep_ocean_sand', 'everness:cursed_lands_deep_ocean_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_lands_deep_ocean_sandstone_brick 4', + recipe = { + { 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block' }, + { 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_forest_deep_ocean_sandstone_block 4', + recipe = { + { 'everness:crystal_forest_deep_ocean_sand', 'everness:crystal_forest_deep_ocean_sand' }, + { 'everness:crystal_forest_deep_ocean_sand', 'everness:crystal_forest_deep_ocean_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_forest_deep_ocean_sandstone_brick 4', + recipe = { + { 'everness:crystal_forest_deep_ocean_sandstone_block', 'everness:crystal_forest_deep_ocean_sandstone_block' }, + { 'everness:crystal_forest_deep_ocean_sandstone_block', 'everness:crystal_forest_deep_ocean_sandstone_block' }, + } +}) + +minetest.register_craft({ + output = 'everness:shell_of_underwater_breathing', + recipe = { + { '', '', 'group:everness_crystal_forest_deep_ocean_coral' }, + { '', 'group:everness_cursed_lands_deep_ocean_coral', '' }, + { 'group:everness_coral_forest_deep_ocean_coral', '', '' }, + } +}) + +minetest.register_craft({ + output = 'default:mese_crystal_fragment', + recipe = { + { 'everness:mese_tree_fruit', 'everness:mese_tree_fruit', 'everness:mese_tree_fruit' }, + { 'everness:mese_tree_fruit', 'everness:mese_tree_fruit', 'everness:mese_tree_fruit' }, + { 'everness:mese_tree_fruit', 'everness:mese_tree_fruit', 'everness:mese_tree_fruit' }, + } +}) + +minetest.register_craft({ + output = 'default:paper', + recipe = { + { 'everness:lotus_leaf_3', 'everness:lotus_leaf_3', 'everness:lotus_leaf_3' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_stone_block 9', + recipe = { + { 'everness:mineral_stone', 'everness:mineral_stone', 'everness:mineral_stone' }, + { 'everness:mineral_stone', 'everness:mineral_stone', 'everness:mineral_stone' }, + { 'everness:mineral_stone', 'everness:mineral_stone', 'everness:mineral_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_stone_brick 4', + recipe = { + { 'everness:mineral_stone', 'everness:mineral_stone' }, + { 'everness:mineral_stone', 'everness:mineral_stone' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_sandstone', + recipe = { + { 'everness:mineral_sand', 'everness:mineral_sand' }, + { 'everness:mineral_sand', 'everness:mineral_sand' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_sand 4', + recipe = { + { 'everness:mineral_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_sandstone_brick 4', + recipe = { + { 'everness:mineral_sandstone', 'everness:mineral_sandstone' }, + { 'everness:mineral_sandstone', 'everness:mineral_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_sandstone_block 9', + recipe = { + { 'everness:mineral_sandstone', 'everness:mineral_sandstone', 'everness:mineral_sandstone' }, + { 'everness:mineral_sandstone', 'everness:mineral_sandstone', 'everness:mineral_sandstone' }, + { 'everness:mineral_sandstone', 'everness:mineral_sandstone', 'everness:mineral_sandstone' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_sandstone_brick_block 6', + recipe = { + { 'everness:mineral_sandstone', 'everness:mineral_sandstone', 'everness:mineral_sandstone' }, + { 'everness:mineral_sandstone_brick', 'everness:mineral_sandstone_brick', 'everness:mineral_sandstone_brick' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_stone_brick_with_growth 3', + recipe = { + { 'group:flora', 'group:flora', 'group:flora'}, + { 'everness:mineral_stone_brick', 'everness:mineral_stone_brick', 'everness:mineral_stone_brick'}, + { 'group:flora', 'group:flora', 'group:flora'}, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_stone_brick_with_flower_growth 6', + recipe = { + { 'everness:mineral_stone_brick_with_growth', 'everness:mineral_stone_brick_with_growth', 'everness:mineral_stone_brick_with_growth'}, + { 'group:flower', 'group:flower', 'group:flower'}, + { 'everness:mineral_stone_brick_with_growth', 'everness:mineral_stone_brick_with_growth', 'everness:mineral_stone_brick_with_growth'} + } +}) + +minetest.register_craft({ + output = 'everness:sand_castle_wall 6', + recipe = { + { '', '', '' }, + { 'everness:mineral_sandstone', 'everness:mineral_sandstone', 'everness:mineral_sandstone'}, + { 'everness:mineral_sandstone', 'everness:mineral_sandstone', 'everness:mineral_sandstone'}, + } +}) + +minetest.register_craft({ + output = 'everness:ceramic_pot_blank', + recipe = { + { '', 'everness:ceramic_pot_sherd_blank', ''}, + { 'everness:ceramic_pot_sherd_blank', '', 'everness:ceramic_pot_sherd_blank'}, + { '', 'everness:ceramic_pot_sherd_blank', ''}, + } +}) + +minetest.register_craft({ + output = 'everness:ceramic_pot_sherd_blank 4', + type = 'shapeless', + recipe = { 'everness:ceramic_pot_blank' } +}) + +-- Crystals + +minetest.register_craft({ + output = 'everness:crystal_block_purple', + recipe = { + { 'everness:crystal_purple', 'everness:crystal_purple', 'everness:crystal_purple' }, + { 'everness:crystal_purple', 'everness:crystal_purple', 'everness:crystal_purple' }, + { 'everness:crystal_purple', 'everness:crystal_purple', 'everness:crystal_purple' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_purple 9', + type = 'shapeless', + recipe = { 'everness:crystal_block_purple' } +}) + +minetest.register_craft({ + output = 'everness:crystal_block_orange', + recipe = { + { 'everness:crystal_orange', 'everness:crystal_orange', 'everness:crystal_orange' }, + { 'everness:crystal_orange', 'everness:crystal_orange', 'everness:crystal_orange' }, + { 'everness:crystal_orange', 'everness:crystal_orange', 'everness:crystal_orange' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_orange 9', + type = 'shapeless', + recipe = { 'everness:crystal_block_orange' } +}) + +minetest.register_craft({ + output = 'everness:crystal_block_cyan', + recipe = { + { 'everness:crystal_cyan', 'everness:crystal_cyan', 'everness:crystal_cyan' }, + { 'everness:crystal_cyan', 'everness:crystal_cyan', 'everness:crystal_cyan' }, + { 'everness:crystal_cyan', 'everness:crystal_cyan', 'everness:crystal_cyan' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_cyan 9', + type = 'shapeless', + recipe = { 'everness:crystal_block_cyan' } +}) + +-- +-- Tools +-- + +minetest.register_craft({ + output = 'everness:vine_shears', + recipe = { + { '', 'everness:pyrite_ingot', '' }, + { 'group:stick', 'group:wood', 'everness:pyrite_ingot' }, + { '', '', 'group:stick' } + } +}) + +minetest.register_craft({ + output = 'everness:pick_illuminating', + recipe = { + { 'everness:crystal_purple', 'everness:coral_tree_bioluminescent', 'everness:crystal_purple' }, + { '', 'everness:sulfur_stone', '' }, + { '', 'group:stick', '' } + } +}) + +minetest.register_craft({ + output = 'everness:shovel_silk', + recipe = { + { 'everness:ancient_emerald_ice' }, + { 'everness:glowing_pillar' }, + { 'everness:crystal_purple' } + } +}) + +minetest.register_craft({ + output = 'everness:hammer', + recipe = { + { 'group:everness_obsidian', 'group:everness_obsidian', 'group:everness_obsidian' }, + { 'group:everness_obsidian', 'everness:pyriteblock_forged', 'group:everness_obsidian' }, + { '', 'group:stick', '' } + } +}) + +minetest.register_craft({ + output = 'everness:hammer_sharp', + recipe = { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:hammer', 'everness:pyriteblock_forged' }, + { '', 'everness:hammer', '' } + } +}) + +minetest.register_craft({ + output = 'everness:pick_archeological', + recipe = { + { 'group:stone', 'group:stone', 'group:stone' }, + { '', 'group:stick', '' }, + { 'group:stick', '', '' } + } +}) + +-- +-- Fuels +-- + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:coral_burdock_1', + burntime = 3, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:coral_burdock_2', + burntime = 3, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bamboo_block', + burntime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bamboo_dry_block', + burntime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bamboo_wood', + burntime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:crystal_wood', + burntime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bamboo_mosaic_wood', + burntime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:mese_wood', + burntime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:lava_tree_wood', + burntime = 30, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bamboo_item', + burntime = 3, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:trapdoor_bamboo', + burntime = 7, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:trapdoor_crystal_wood', + burntime = 7, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:door_bamboo', + burntime = 14, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:baobab_wood', + burntime = 8, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:sequoia_wood', + burntime = 6, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:sulfur_stone', + burntime = 370, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:lotus_leaf_3', + burntime = 1, +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = 'cooking', + output = 'everness:glass', + recipe = 'group:everness_sand', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:coral_desert_stone', + recipe = 'everness:coral_desert_cobble', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:coral_desert_stone', + recipe = 'everness:coral_desert_mossy_cobble', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:forsaken_tundra_stone', + recipe = 'everness:forsaken_tundra_cobble', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:mineral_cave_stone', + recipe = 'everness:mineral_cave_cobblestone', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:mineral_lava_stone', + recipe = 'everness:mineral_lava_stone_dry', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:bamboo_dry_block', + recipe = 'everness:bamboo_block', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:baobab_fruit_roasted', + recipe = 'everness:baobab_fruit', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:pyriteblock_forged', + recipe = 'everness:pyriteblock', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:forsaken_desert_stone', + recipe = 'everness:forsaken_desert_cobble_red', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:cursed_stone_carved', + recipe = 'everness:cursed_stone', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:crystal_stone', + recipe = 'everness:crystal_cobble', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:crystal_stone', + recipe = 'everness:crystal_mossy_cobble', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:mineral_stone', + recipe = 'everness:mineral_stone_cobble', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:lotus_leaf_3', + recipe = 'everness:lotus_leaf', +}) + +minetest.register_craft({ + type = 'cooking', + output = 'everness:lotus_leaf_3', + recipe = 'everness:lotus_leaf_2', +}) + +-- +-- Saplings +-- + +minetest.register_craft({ + output = 'everness:coral_tree_bioluminescent_sapling', + recipe = { + { 'group:lantern' }, + { 'everness:coral_tree_sapling' }, + } +}) + +minetest.register_craft({ + output = 'everness:cursed_dream_tree_sapling', + recipe = { + { 'group:lantern' }, + { 'everness:dry_tree_sapling' }, + } +}) + +minetest.register_craft({ + output = 'everness:crystal_tree_large_sapling', + recipe = { + { 'everness:crystal_tree_sapling', 'everness:crystal_tree_sapling' }, + { 'everness:crystal_tree_sapling', 'everness:crystal_tree_sapling' } + } +}) diff --git a/mods/everness/craftitems.lua b/mods/everness/craftitems.lua new file mode 100644 index 00000000..ef2755d4 --- /dev/null +++ b/mods/everness/craftitems.lua @@ -0,0 +1,86 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local tms = minetest.get_modpath("too_many_stones") + +-- +-- Craftitem registry +-- + +-- Quartz Crystal +if tms then + minetest.register_alias("everness:quartz_crystal","too_many_stones:quartz") +else + Everness:register_craftitem('everness:quartz_crystal', { + description = S('Quartz Crystal'), + inventory_image = 'everness_quartz.png', + }) +end + +Everness:register_craftitem('everness:bamboo_item', { + description = S('Bamboo'), + inventory_image = 'everness_bamboo_item.png', +}) + +Everness:register_craftitem('everness:baobab_fruit_roasted', { + description = S('Baobab Roasted Fruit') .. '\n'.. minetest.colorize(Everness.colors.brown, S('Hunger') .. ': 4'), + inventory_image = 'everness_baobab_tree_fruit_roasted.png', + on_use = minetest.item_eat(4), +}) + +Everness:register_craftitem('everness:pyrite_ingot', { + description = S('Pyrite Ingot'), + inventory_image = 'everness_pyrite_ingot.png' +}) + +if tms then + minetest.register_alias("everness:pyrite_lump","too_many_stones:pyrite") +else + Everness:register_craftitem('everness:pyrite_lump', { + description = S('Pyrite Lump'), + inventory_image = 'everness_pyrite_lump.png' + }) +end + +Everness:register_craftitem('everness:coconut_fruit', { + description = S('Coconut') .. '\n'.. minetest.colorize(Everness.colors.brown, S('Hunger') .. ': 4'), + inventory_image = 'everness_coconut_item.png', + wield_scale = { x = 2, y = 2, z = 1 }, + on_use = minetest.item_eat(4), +}) + +-- +-- Crafting recipes +-- + +minetest.register_craft({ + output = 'everness:pyrite_ingot 9', + recipe = { + { 'everness:pyriteblock' }, + } +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = 'cooking', + output = 'everness:pyrite_ingot', + recipe = 'everness:pyrite_lump', +}) + diff --git a/mods/everness/doors.lua b/mods/everness/doors.lua new file mode 100644 index 00000000..4bea2e41 --- /dev/null +++ b/mods/everness/doors.lua @@ -0,0 +1,232 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +doors.register('everness:door_bamboo', { + tiles = { { name = 'everness_door_bamboo.png', backface_culling = true } }, + description = S('Bamboo Door'), + inventory_image = 'everness_door_bamboo_item.png', + groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + sound_open = 'everness_door_bamboo_open', + sound_close = 'everness_door_bamboo_open', + gain_open = 5, + gain_close = 5, + recipe = { + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_bamboo', { + description = S('Bamboo Trapdoor'), + inventory_image = 'everness_door_trapdoor_bamboo.png', + wield_image = 'everness_door_trapdoor_bamboo.png', + tile_front = 'everness_door_trapdoor_bamboo.png', + tile_side = 'everness_door_trapdoor_bamboo_side.png', + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + sound_open = 'everness_door_bamboo_open', + sound_close = 'everness_door_bamboo_open', + gain_open = 5, + gain_close = 5, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, +}) + +doors.register_fencegate('everness:gate_bamboo', { + description = S('Bamboo Wood Fence Gate'), + texture = 'everness_dry_bamboo_block_side.png^[transformR90', + material = 'everness:bamboo_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +doors.register('everness:door_bone_pyrite', { + tiles = { { name = 'everness_door_bone_pyrite.png', backface_culling = true } }, + description = S('Bone Pyrit Door'), + inventory_image = 'everness_door_bone_pyrite_item.png', + groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:pyrite_ingot', 'everness:bone' }, + { 'everness:pyrite_ingot', 'everness:bone' }, + { 'everness:pyrite_ingot', 'everness:bone' }, + } +}) + +doors.register('everness:door_willow', { + tiles = { { name = 'everness_door_willow.png', backface_culling = true } }, + description = S('Willow Door'), + inventory_image = 'everness_door_willow_item.png', + groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:willow_wood', 'everness:willow_wood' }, + { 'everness:willow_wood', 'everness:willow_wood' }, + { 'everness:willow_wood', 'everness:willow_wood' }, + } +}) + +doors.register('everness:door_crystal_wood', { + description = S('Crystal Wood Door'), + tiles = { 'everness_door_crystal_wood.png' }, + inventory_image = 'everness_door_crystal_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_glass_defaults(), + sound_open = 'everness_door_glass_open', + sound_close = 'everness_door_glass_close', + gain_open = 0.2, + gain_close = 0.15, + recipe = { + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_crystal_wood', { + description = S('Crystal Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_crystal_wood.png', + wield_image = 'everness_door_trapdoor_crystal_wood.png', + tile_front = 'everness_door_trapdoor_crystal_wood.png', + tile_side = 'everness_door_trapdoor_crystal_wood_side.png', + use_texture_alpha = 'blend', + sounds = Everness.node_sound_glass_defaults(), + sound_open = 'everness_door_glass_open', + sound_close = 'everness_door_glass_close', + gain_open = 0.2, + gain_close = 0.15, + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +doors.register_fencegate('everness:gate_crystal_wood', { + description = S('Crystal Wood Fence Gate'), + texture = 'everness_crystal_wood.png^[transformR90', + material = 'everness:crystal_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +doors.register('everness:door_cursed_wood', { + description = S('Cursed Wood Door'), + tiles = { 'everness_door_cursed_wood.png' }, + inventory_image = 'everness_door_cursed_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_creaky_door_open', + sound_close = 'everness_creaky_door_close', + gain_open = 0.15, + gain_close = 0.15, + recipe = { + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_cursed_wood', { + description = S('Cursed Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_cursed_wood.png', + wield_image = 'everness_door_trapdoor_cursed_wood.png', + tile_front = 'everness_door_trapdoor_cursed_wood.png', + tile_side = 'everness_door_trapdoor_cursed_wood_side.png', + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_creaky_door_open', + sound_close = 'everness_creaky_door_close', + gain_open = 0.15, + gain_close = 0.15, + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +-- Palm Wood + +doors.register('everness:door_palm_wood', { + description = S('Palm Wood Door'), + tiles = { 'everness_door_palm_wood.png' }, + inventory_image = 'everness_door_palm_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_palm_wood', { + description = S('Palm Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_palm_wood.png', + wield_image = 'everness_door_trapdoor_palm_wood.png', + tile_front = 'everness_door_trapdoor_palm_wood.png', + tile_side = 'everness_door_trapdoor_palm_wood_side.png', + sounds = Everness.node_sound_wood_defaults(), + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +doors.register_fencegate('everness:gate_palm_wood', { + description = S('Palm Wood Fence Gate'), + texture = 'everness_palm_tree_wood.png^[sheet:2x2:1,1', + material = 'everness:palm_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +-- Coral Wood + +doors.register_fencegate('everness:gate_coral_wood', { + description = S('Coral Wood Fence Gate'), + texture = 'everness_coral_wood.png', + material = 'everness:coral_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +-- Lava Tree Wood + +doors.register('everness:door_lava_tree', { + description = S('Lava Tree Wood Door'), + tiles = { 'everness_door_lava_tree_wood.png' }, + inventory_image = 'everness_door_lava_tree_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + { 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + { 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_lava_tree', { + description = S('Lava Tree Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_lava_tree_wood.png', + wield_image = 'everness_door_trapdoor_lava_tree_wood.png', + tile_front = 'everness_door_trapdoor_lava_tree_wood.png', + tile_side = 'everness_door_trapdoor_lava_tree_wood_side.png', + sounds = Everness.node_sound_wood_defaults(), + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +doors.register_fencegate('everness:gate_lava_tree_wood', { + description = S('Lava Tree Wood Fence Gate'), + texture = 'everness_lava_tree.png^[sheet:2x2:1,1', + material = 'everness:lava_tree', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) diff --git a/mods/everness/env_sounds.lua b/mods/everness/env_sounds.lua new file mode 100644 index 00000000..fc831097 --- /dev/null +++ b/mods/everness/env_sounds.lua @@ -0,0 +1,1174 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local SOUND_DEFS = { + ['everness:cursed_lands'] = { + day = { + { + name = 'everness_ambience_graveyard_1', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_7', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_8', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_9', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_10', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_5', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_6', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_1', + length = 1.9, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_2', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_3', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_4', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_5', + length = 14, + gain = 0.6, + }, + }, + night = { + { + name = 'everness_ambience_night_crickets_1', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_2', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_3', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_4', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_5', + length = 6.5, + gain = 0.6, + }, + { + name = 'everness_ambience_owl_1', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_1', + length = 1.9, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_2', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_3', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_4', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_5', + length = 14, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_6', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:cursed_lands_swamp'] = { + day = { + { + name = 'everness_ambience_swamp_1', + length = 6.8, + gain = 0.6, + }, + { + name = 'everness_ambience_swamp_2', + length = 8.8, + gain = 0.6, + }, + { + name = 'everness_ambience_swamp_3', + length = 8.7, + gain = 0.6, + }, + { + name = 'everness_ambience_swamp_4', + length = 12, + gain = 0.6, + }, + } + }, + ['everness:cursed_lands_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_creepy_cave_1', + length = 5.5, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_1', + length = 1.9, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_2', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_3', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_4', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_5', + length = 14, + gain = 0.6, + }, + } + }, + ['everness:coral_forest_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:frosted_icesheet'] = { + day = { + { + name = 'everness_ambience_snow_storm_1', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_ice_cracking_1', + length = 2.4, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_2', + length = 2.5, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_3', + length = 3, + gain = 1.5, + }, + } + }, + ['everness:frosted_icesheet_ocean'] = { + day = { + { + name = 'everness_ambience_snow_storm_1', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_ice_cracking_1', + length = 2.4, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_2', + length = 2.5, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_3', + length = 3, + gain = 1.5, + }, + } + }, + ['everness:frosted_icesheet_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:crystal_forest_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:bamboo_forest_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:forsaken_desert_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:forsaken_tundra'] = { + day = { + { + name = 'everness_ambience_sulfur_1', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_sulfur_2', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_sulfur_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_sulfur_4', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_hot_stone_1', + length = 9, + gain = 1.5, + }, + { + name = 'everness_ambience_hot_stone_2', + length = 9, + gain = 1.5, + }, + } + }, + ['everness:forsaken_tundra_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:mineral_waters_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + { + name = 'everness_lava_1', + length = 10, + gain = 1.0, + }, + { + name = 'everness_lava_2', + length = 10, + gain = 2.0, + }, + } + }, +} + +local PLAYER_SOUNDS = {} + +-- Update sound for player +local function update_sound(player) + local player_name = player:get_player_name() + local player_pos = player:get_pos() + local biome_data = minetest.get_biome_data(player_pos) + + if not biome_data then + return + end + + local biome_name = minetest.get_biome_name(biome_data.biome) + + if not biome_name then + return + end + + if not PLAYER_SOUNDS[player_name] then + local sound_def_biome = SOUND_DEFS[biome_name] + + if not sound_def_biome then + return + end + + local sound_def = sound_def_biome.day[1] + + -- day + if #sound_def_biome.day > 1 then + sound_def = sound_def_biome.day[math.random(1, #sound_def_biome.day)] + end + + -- night between 19:19:12 - 04:48:00 + if sound_def_biome.night then + local tod = minetest.get_timeofday() + + if tod > 0.805 or tod < 0.2 then + sound_def = sound_def_biome.night[1] + + if #sound_def_biome.night > 1 then + sound_def = sound_def_biome.night[math.random(1, #sound_def_biome.night)] + end + end + end + + PLAYER_SOUNDS[player_name] = minetest.sound_play(sound_def.name, { + to_player = player_name, + gain = 0, + }, false) + + -- fade in + minetest.sound_fade(PLAYER_SOUNDS[player_name], (sound_def.gain / sound_def.length) / 2, sound_def.gain) + + minetest.after(sound_def.length / 2, function(v_player_sounds, v_player_name) + -- fade out + if not PLAYER_SOUNDS[player_name] then + return + end + + minetest.sound_fade(v_player_sounds[v_player_name], ((sound_def.gain / sound_def.length) / 2) * -1, 0) + end, PLAYER_SOUNDS, player_name) + + -- remove handle + minetest.after(sound_def.length, function(v_player_sounds, v_player_name) + v_player_sounds[v_player_name] = nil + end, PLAYER_SOUNDS, player_name) + end +end + +-- Update sound when player joins +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + PLAYER_SOUNDS[player_name] = nil + update_sound(player) +end) + +-- Cyclic sound update +local function cyclic_update() + for _, player in pairs(minetest.get_connected_players()) do + update_sound(player) + end + + minetest.after(math.random(30, 180), cyclic_update) +end + +minetest.after(0, cyclic_update) diff --git a/mods/everness/fences.lua b/mods/everness/fences.lua new file mode 100644 index 00000000..94bfadbe --- /dev/null +++ b/mods/everness/fences.lua @@ -0,0 +1,209 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Dry Wood + +default.register_fence('everness:fence_dry_wood', { + description = S('Dry Wood Fence'), + texture = 'everness_fence_dry_wood.png', + inventory_image = 'default_fence_overlay.png^everness_dry_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_dry_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:dry_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_dry_wood', { + description = S('Dry Wood Fence Rail'), + texture = 'everness_fence_rail_dry_wood.png', + inventory_image = 'default_fence_rail_overlay.png^everness_dry_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_dry_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:dry_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_dry_wood', { + description = S('Dry Wood Mese Post Light'), + texture = 'everness_fence_dry_wood.png', + material = 'everness:dry_wood', +}) + +-- Bamboo Wood + +default.register_fence('everness:fence_bamboo_wood', { + description = S('Bamboo Wood Fence'), + texture = 'everness_fence_bamboo_wood.png', + inventory_image = 'default_fence_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:bamboo_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_bamboo_wood', { + description = S('Bamboo Wood Fence Rail'), + texture = 'everness_fence_rail_bamboo_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:bamboo_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_bamboo_wood', { + description = S('Bamboo Wood Mese Post Light'), + texture = 'everness_fence_bamboo_wood.png^[transformFY', + material = 'everness:bamboo_wood', +}) + +-- Crystal Wood + +default.register_fence('everness:fence_crystal_wood', { + description = S('Crystal Wood Fence'), + texture = 'everness_fence_crystal_wood.png', + inventory_image = 'default_fence_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:crystal_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_crystal_wood', { + description = S('Crystal Wood Fence Rail'), + texture = 'everness_fence_rail_crystal_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:crystal_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_crystal_wood', { + description = S('Crystal Wood Mese Post Light'), + texture = 'everness_fence_crystal_wood.png^[transformFY', + material = 'everness:crystal_wood', +}) + +-- Palm Wood + +default.register_fence('everness:fence_palm_wood', { + description = S('Palm Wood Fence'), + texture = 'everness_fence_palm_wood.png', + inventory_image = 'default_fence_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:palm_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_palm_wood', { + description = S('Palm Wood Fence Rail'), + texture = 'everness_fence_rail_palm_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:palm_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_palm_wood', { + description = S('Palm Wood Mese Post Light'), + texture = 'everness_fence_palm_wood.png^[transformFY', + material = 'everness:palm_tree_wood', +}) + +-- Coral Wood + +default.register_fence('everness:fence_coral_wood', { + description = S('Coral Wood Fence'), + texture = 'everness_fence_coral_wood.png', + inventory_image = 'default_fence_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:coral_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_coral_wood', { + description = S('Coral Wood Fence Rail'), + texture = 'everness_fence_rail_coral_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:coral_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_coral_wood', { + description = S('Coral Wood Mese Post Light'), + texture = 'everness_fence_coral_wood.png^[transformFY', + material = 'everness:coral_wood', +}) + +-- Lava Tree Wood + +default.register_fence('everness:fence_lava_tree_wood', { + description = S('Lava Tree Wood Fence'), + texture = 'everness_fence_lava_tree_wood.png', + inventory_image = 'default_fence_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:lava_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_lava_tree_wood', { + description = S('Lava Tree Wood Fence Rail'), + texture = 'everness_fence_rail_lava_tree_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:lava_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_lava_tree_wood', { + description = S('Lava Tree Wood Mese Post Light'), + texture = 'everness_fence_lava_tree_wood.png^[transformFY', + material = 'everness:lava_tree_wood', +}) diff --git a/mods/everness/functions.lua b/mods/everness/functions.lua new file mode 100644 index 00000000..230ae3a3 --- /dev/null +++ b/mods/everness/functions.lua @@ -0,0 +1,1357 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Convert dirt to something that fits the environment +-- + +local grass_covered_mapping = { + ['everness:coral_dirt'] = { 'everness:dirt_with_coral_grass' }, + ['everness:cursed_dirt'] = { 'everness:dirt_with_cursed_grass' }, + ['everness:crystal_dirt'] = { 'everness:dirt_with_crystal_grass' }, + ['everness:dirt_1'] = { + 'everness:dirt_with_grass_1', + 'everness:dirt_with_grass_extras_1', + 'everness:dirt_with_grass_extras_2', + }, + ['everness:dry_dirt'] = { 'everness:dry_dirt_with_dry_grass' } +} + +local grass_covered_mapping_under = { + ['everness:coral_desert_stone'] = { 'everness:coral_desert_stone_with_moss' }, + ['everness:soul_sandstone'] = { 'everness:soul_sandstone_veined' }, + ['everness:crystal_cave_dirt'] = { 'everness:crystal_cave_dirt_with_moss' }, + ['everness:mold_cobble'] = { 'everness:mold_stone_with_moss' }, + ['everness:mineral_lava_stone_dry'] = { 'everness:mineral_lava_stone_with_moss' }, +} + +-- Spread grass on dirt + +Everness:register_abm({ + label = 'everness:grass_spread', + description = 'Spreads grass on neighboring blocks.', + nodenames = { + 'everness:coral_dirt', + 'everness:cursed_dirt', + 'everness:crystal_dirt', + 'everness:dirt_1', + 'everness:dry_dirt', + }, + neighbors = { + 'air', + 'group:coral_grass', + 'group:cursed_grass', + 'group:crystal_grass', + 'group:bamboo_grass', + 'group:everness_dry_grass' + }, + interval = 6, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = minetest.find_node_near(pos, 1, 'group:everness_spreading_dirt_type') + + if p2 then + local n3_def = grass_covered_mapping[node.name] + + if not n3_def then + return + end + + local n3_name = n3_def[1] + + if #n3_def > 1 then + n3_name = n3_def[math.random(1, #n3_def)] + end + + minetest.set_node(pos, { name = n3_name }) + return + end + + -- Else, any seeding nodes on top? + local name = minetest.get_node(above).name + + if minetest.get_item_group(name, 'coral_grass') ~= 0 and node.name == 'everness:coral_dirt' then + minetest.set_node(pos, { name = 'everness:dirt_with_coral_grass' }) + elseif minetest.get_item_group(name, 'cursed_grass') ~= 0 and node.name == 'everness:cursed_dirt' then + minetest.set_node(pos, { name = 'everness:dirt_with_cursed_grass' }) + elseif minetest.get_item_group(name, 'crystal_grass') ~= 0 and node.name == 'everness:crystal_dirt' then + minetest.set_node(pos, { name = 'everness:dirt_with_crystal_grass' }) + elseif minetest.get_item_group(name, 'bamboo_grass') ~= 0 and node.name == 'everness:dirt_1' then + local bamboo_grass_covered_types = { + 'everness:dirt_with_grass_1', + 'everness:dirt_with_grass_extras_1', + 'everness:dirt_with_grass_extras_2' + } + + minetest.set_node(pos, { name = bamboo_grass_covered_types[math.random(1, #bamboo_grass_covered_types)] }) + elseif minetest.get_item_group(name, 'everness_dry_grass') ~= 0 and node.name == 'everness:dry_dirt' then + minetest.set_node(pos, { name = 'everness:dry_dirt_with_dry_grass' }) + end + end +}) + +-- Spread mold/moss on stone/dirt - under + +Everness:register_abm({ + label = 'everness:grass_spread_under', + description = 'Spreads grass on neighboring blocks in caves (under).', + nodenames = { + 'everness:coral_desert_stone', + 'everness:soul_sandstone', + 'everness:crystal_cave_dirt', + 'everness:mold_cobble', + 'everness:mineral_lava_stone_dry', + }, + neighbors = { + 'air', + 'group:coral_grass_under', + 'group:cursed_grass_under', + 'group:crystal_grass_under', + 'group:forsaken_tundra_grass_under', + 'group:mineral_waters_grass_under', + }, + interval = 6, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = minetest.find_node_near(pos, 1, 'group:everness_spreading_dirt_type_under') + + if p2 then + local n3_def = grass_covered_mapping_under[node.name] + + if not n3_def then + return + end + + local n3_name = n3_def[1] + + if #n3_def > 1 then + n3_name = n3_def[math.random(1, #n3_def)] + end + + minetest.set_node(pos, {name = n3_name}) + return + end + + -- Else, any seeding nodes on top? + local name = minetest.get_node(above).name + + if minetest.get_item_group(name, 'coral_grass_under') ~= 0 and node.name == 'everness:coral_desert_stone' then + minetest.set_node(pos, { name = 'everness:coral_desert_stone_with_moss' }) + elseif minetest.get_item_group(name, 'cursed_grass_under') ~= 0 and node.name == 'everness:soul_sandstone' then + minetest.set_node(pos, { name = 'everness:soul_sandstone_veined' }) + elseif minetest.get_item_group(name, 'crystal_grass_under') ~= 0 and node.name == 'everness:crystal_cave_dirt' then + minetest.set_node(pos, { name = 'everness:crystal_cave_dirt_with_moss' }) + elseif minetest.get_item_group(name, 'forsaken_tundra_grass_under') ~= 0 and node.name == 'everness:mold_cobble' then + minetest.set_node(pos, { name = 'everness:mold_stone_with_moss' }) + elseif minetest.get_item_group(name, 'mineral_waters_grass_under') ~= 0 and node.name == 'everness:mineral_lava_stone_dry' then + minetest.set_node(pos, { name = 'everness:mineral_lava_stone_with_moss' }) + end + end +}) + +-- +-- Grass and dry grass removed in darkness +-- + +Everness:register_abm({ + label = 'everness:grass_covered', + description = 'Grass and dry grass removed in darkness.', + nodenames = { + 'group:everness_spreading_dirt_type', + 'group:everness_spreading_dirt_type_under', + }, + interval = 8, + chance = 50, + catch_up = false, + action = function(pos, node) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + + if name ~= 'ignore' + and nodedef + and not ( + (nodedef.sunlight_propagates or nodedef.paramtype == 'light') + and nodedef.liquidtype == 'none' + ) + then + if node.name == 'everness:dirt_with_coral_grass' then + minetest.set_node(pos, { name = 'everness:coral_dirt' }) + elseif node.name == 'everness:dirt_with_cursed_grass' then + minetest.set_node(pos, { name = 'everness:cursed_dirt' }) + elseif node.name == 'everness:dirt_with_crystal_grass' then + minetest.set_node(pos, { name = 'everness:crystal_dirt' }) + elseif node.name == 'everness:dirt_with_grass_1' + or node.name == 'everness:dirt_with_grass_extras_1' + or node.name == 'everness:dirt_with_grass_extras_2' + then + minetest.set_node(pos, { name = 'everness:dirt_1' }) + elseif node.name == 'everness:coral_desert_stone_with_moss' then + minetest.set_node(pos, { name = 'everness:coral_desert_stone' }) + elseif node.name == 'everness:dry_dirt_with_dry_grass' then + minetest.set_node(pos, { name = 'everness:dry_dirt' }) + elseif node.name == 'everness:soul_sandstone_veined' then + minetest.set_node(pos, { name = 'everness:soul_sandstone' }) + elseif node.name == 'everness:crystal_cave_dirt_with_moss' then + minetest.set_node(pos, { name = 'everness:crystal_cave_dirt' }) + elseif node.name == 'everness:mold_stone_with_moss' then + minetest.set_node(pos, { name = 'everness:mold_cobble' }) + elseif node.name == 'everness:mineral_lava_stone_with_moss' then + minetest.set_node(pos, { name = 'everness:mineral_lava_stone_dry' }) + end + end + end +}) + +-- +-- Leafdecay +-- + +Everness:register_leafdecay({ + trunks = { + 'everness:coral_tree', + 'everness:crystal_bush_stem', + 'everness:cursed_bush_stem', + 'everness:willow_tree', + 'everness:sequoia_tree', + 'everness:mese_tree', + 'everness:palm_tree', + 'everness:lava_tree', + 'everness:lava_tree_with_lava' + }, + leaves = { + 'everness:coral_leaves', + 'everness:crystal_bush_leaves', + 'everness:willow_leaves', + 'everness:sequoia_leaves', + 'everness:mese_leaves', + 'everness:mese_tree_fruit', + 'everness:palm_leaves', + 'everness:coconut', + 'everness:lava_tree_leaves' + }, + radius = 3 +}) + +-- Baobab Tree +Everness:register_leafdecay({ + trunks = { + 'everness:baobab_tree', + 'everness:crystal_tree', + 'everness:dry_tree', + }, + leaves = { + 'everness:baobab_leaves', + 'everness:baobab_fruit_renewable', + 'everness:crystal_leaves', + 'everness:dry_branches', + }, + radius = 4, +}) + +-- +-- Moss growth on cobble near water +-- + +local moss_correspondences = { + ['everness:coral_desert_cobble'] = 'everness:coral_desert_mossy_cobble', + ['everness:crystal_cobble'] = 'everness:crystal_mossy_cobble', + ['stairs:slab_crystal_cobble'] = 'stairs:slab_crystal_mossy_cobble', + ['stairs:stair_crystal_cobble'] = 'stairs:stair_crystal_mossy_cobble', + ['stairs:stair_inner_crystal_cobble'] = 'stairs:stair_inner_crystal_mossy_cobble', + ['stairs:stair_outer_crystal_cobble'] = 'stairs:stair_outer_crystal_mossy_cobble', + ['everness:crystal_cobble_wall'] = 'everness:crystal_mossy_cobble_wall' +} + +local moss_nodenames_correspondences = { + 'everness:coral_desert_cobble', + 'everness:crystal_cobble', + 'stairs:slab_crystal_cobble', + 'stairs:stair_crystal_cobble', + 'stairs:stair_inner_crystal_cobble', + 'stairs:stair_outer_crystal_cobble', + 'everness:crystal_cobble_wall' +} + +if minetest.get_modpath('default') then + moss_correspondences['stairs:slab_coral_desert_cobble'] = 'stairs:slab_coral_desert_mossy_cobble' + moss_correspondences['stairs:stair_coral_desert_cobble'] = 'stairs:stair_coral_desert_mossy_cobble' + moss_correspondences['stairs:stair_inner_coral_desert_cobble'] = 'stairs:stair_inner_coral_desert_mossy_cobble' + moss_correspondences['stairs:stair_outer_coral_desert_cobble'] = 'stairs:stair_outer_coral_desert_mossy_cobble' + moss_correspondences['everness:coral_desert_cobble_wall'] = 'everness:coral_desert_mossy_cobble_wall' + + table.insert(moss_nodenames_correspondences, 'stairs:slab_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'stairs:stair_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'stairs:stair_inner_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'stairs:stair_outer_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'everness:coral_desert_cobble_wall') +end + +Everness:register_abm({ + label = 'everness:moss_growth', + description = 'Grows moss on blocks near water.', + nodenames = moss_nodenames_correspondences, + neighbors = { 'group:water' }, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + node.name = moss_correspondences[node.name] + + if node.name then + minetest.set_node(pos, node) + end + end +}) + +-- +-- Magma growth on cobble near lava +-- + +local magma_correspondences = { + ['everness:volcanic_rock'] = 'everness:volcanic_rock_with_magma', +} + +local magma_nodenames_correspondences = { + 'everness:volcanic_rock' +} + +if minetest.get_modpath('default') then + magma_correspondences['default:cobble'] = 'everness:magmacobble' + magma_correspondences['stairs:slab_cobble'] = 'stairs:slab_magmacobble' + magma_correspondences['stairs:stair_cobble'] = 'stairs:stair_magmacobble' + magma_correspondences['stairs:stair_inner_cobble'] = 'stairs:stair_inner_magmacobble' + magma_correspondences['stairs:stair_outer_cobble'] = 'stairs:stair_outer_magmacobble' + magma_correspondences['walls:cobble'] = 'everness:magmacobble_wall' + magma_correspondences['stairs:slab_volcanic_rock'] = 'stairs:slab_volcanic_rock_with_magma' + magma_correspondences['stairs:stair_volcanic_rock'] = 'stairs:stair_volcanic_rock_with_magma' + magma_correspondences['stairs:stair_inner_volcanic_rock'] = 'stairs:stair_inner_volcanic_rock_with_magma' + magma_correspondences['stairs:stair_outer_volcanic_rock'] = 'stairs:stair_outer_volcanic_rock_with_magma' + magma_correspondences['everness:volcanic_rock_wall'] = 'everness:volcanic_rock_with_magma_wall' + + table.insert(magma_nodenames_correspondences, 'default:cobble') + table.insert(magma_nodenames_correspondences, 'stairs:slab_cobble') + table.insert(magma_nodenames_correspondences, 'stairs:stair_cobble') + table.insert(magma_nodenames_correspondences, 'stairs:stair_inner_cobble') + table.insert(magma_nodenames_correspondences, 'stairs:stair_outer_cobble') + table.insert(magma_nodenames_correspondences, 'walls:cobble') + table.insert(magma_nodenames_correspondences, 'stairs:slab_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'stairs:stair_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'stairs:stair_inner_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'stairs:stair_outer_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'everness:volcanic_rock_wall') +end + +Everness:register_abm({ + label = 'everness:magma_growth', + description = 'Grows magma on blocks near lava.', + nodenames = magma_nodenames_correspondences, + neighbors = { 'group:lava' }, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + node.name = magma_correspondences[node.name] + + if node.name then + minetest.set_node(pos, node) + end + end +}) + +-- +-- Falling leaves +-- + +Everness:register_abm({ + label = 'everness:falling_leaves', + description = 'Makes leaves falling particles.', + nodenames = { 'group:falling_leaves' }, + neighbors = { 'air' }, + interval = 16, + chance = 16, + catch_up = false, + action = function(pos, node) + if not minetest.settings:get_bool('enable_particles', true) then + return + end + + local air_below = minetest.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 3, z = pos.z }, { 'air' }) + + if #air_below < 3 then + return + end + + -- particles + local particlespawner_def = { + amount = 5, + time = 1, + minpos = { x = pos.x - 0.5, y = pos.y - 0.5, z = pos.z - 0.5 }, + maxpos = { x = pos.x + 0.5, y = pos.y - 0.5, z = pos.z + 0.5 }, + minvel = { x = -0.25, y = -0.25, z = -0.25 }, + maxvel = { x = 0.25, y = -0.5, z = 0.25 }, + minacc = { x = -0.25, y = -0.25, z = -0.25 }, + maxacc = { x = 0.25, y = -0.5, z = 0.25 }, + minexptime = 3, + maxexptime = 6, + minsize = 0.5, + maxsize = 1.5, + node = node + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 5, + time = 1, + size = { + min = 0.5, + max = 1.5, + }, + exptime = { + min = 3, + max = 6 + }, + pos = { + min = vector.new({ x = pos.x - 0.5, y = pos.y - 0.5, z = pos.z - 0.5 }), + max = vector.new({ x = pos.x + 0.5, y = pos.y - 0.5, z = pos.z + 0.5 }), + }, + vel = { + min = vector.new({ x = -0.25, y = -0.25, z = -0.25 }), + max = vector.new({ x = 0.25, y = -0.5, z = 0.25 }) + }, + acc = { + min = vector.new({ x = -0.25, y = -0.25, z = -0.25 }), + max = vector.new({ x = 0.25, y = -0.5, z = 0.25 }) + }, + node = { + name = node.name + } + } + end + + minetest.add_particlespawner(particlespawner_def) + end +}) + +-- +-- Falling leaves - vines +-- + +Everness:register_abm({ + label = 'everness:falling_vines', + description = 'Makes vines falling particles.', + nodenames = { 'group:falling_vines' }, + neighbors = { 'air' }, + interval = 16, + chance = 16, + catch_up = false, + action = function(pos, node) + if not minetest.settings:get_bool('enable_particles', true) then + return + end + + local air_around = minetest.find_nodes_in_area( + { x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + { x = pos.x + 1, y = pos.y, z = pos.z + 1 }, + { 'air' } + ) + + if #air_around < 3 then + return + end + + -- particles + local particlespawner_def = { + amount = 5, + time = 1, + minpos = { x = pos.x - 0.5, y = pos.y - 0.5, z = pos.z - 0.5 }, + maxpos = { x = pos.x + 0.5, y = pos.y - 0.5, z = pos.z + 0.5 }, + minvel = { x = -0.25, y = -0.25, z = -0.25 }, + maxvel = { x = 0.25, y = -0.5, z = 0.25 }, + minacc = { x = -0.25, y = -0.25, z = -0.25 }, + maxacc = { x = 0.25, y = -0.5, z = 0.25 }, + minexptime = 15, + maxexptime = 30, + minsize = 0.5, + maxsize = 1.5, + node = node, + glow = 7 + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 5, + time = 1, + size = { + min = 0.5, + max = 1.5, + }, + exptime = { + min = 15, + max = 30 + }, + pos = { + min = vector.new(pos.x - 0.5, pos.y - 0.5, pos.z - 0.5), + max = vector.new(pos.x + 0.5, pos.y - 0.5, pos.z + 0.5), + }, + vel = { + min = vector.new(-0.25, -0.15, -0.25), + max = vector.new(0.25, -0.25, 0.25) + }, + acc = { + min = vector.new(-0.25, -0.05, -0.25), + max = vector.new(0.25, -0.1, 0.25) + }, + node = { + name = node.name + }, + glow = 7 + } + end + + minetest.add_particlespawner(particlespawner_def) + end +}) + +Everness:register_abm({ + label = 'everness:grow_orange_cactus', + description = 'Grows orange cactus.', + nodenames = { + 'everness:cactus_orange', + 'everness:cactus_blue' + }, + neighbors = { 'group:sand', 'group:everness_sand' }, + interval = 12, + chance = 83, + action = function(...) + Everness:grow_cactus(...) + end +}) + +-- +-- Bio Bubbles +-- + +Everness:register_abm({ + label = 'everness:bio_bubbles', + description = 'Bubble particles under water.', + nodenames = { 'group:bio_bubbles' }, + neighbors = { 'group:water' }, + interval = 16, + chance = 2, + catch_up = false, + action = function(pos, node) + if not minetest.settings:get_bool('enable_particles', true) then + return + end + + local water_above = minetest.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 10, z = pos.z }, { 'group:water' }) + + if #water_above < 10 then + return + end + + -- particles + local particlespawner_def = { + amount = 50, + time = 10, + minpos = vector.new({ x = pos.x - 0.1, y = pos.y + 0.6, z = pos.z - 0.1 }), + maxpos = vector.new({ x = pos.x + 0.1, y = pos.y + 0.6, z = pos.z + 0.1 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 5, + maxexptime = 7, + minsize = 2, + maxsize = 3.5, + texture = 'everness_bubble.png', + glow = 7 + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 50, + time = 10, + size = { + min = 2, + max = 3.5, + }, + exptime = { + min = 5, + max = 7 + }, + pos = { + min = vector.new({ x = pos.x - 0.1, y = pos.y + 0.6, z = pos.z - 0.1 }), + max = vector.new({ x = pos.x + 0.1, y = pos.y + 0.6, z = pos.z + 0.1 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_bubble.png', + alpha_tween = { + 1, 0, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 0.5, 1, + style = 'fwd', + reps = 1 + } + }, + glow = 7 + } + end + + minetest.add_particlespawner(particlespawner_def) + end +}) + +-- +-- Rising Souls +-- + +Everness:register_abm({ + label = 'everness:rising_souls', + description = 'Rising souls particles under water.', + nodenames = { 'group:rising_souls' }, + neighbors = { 'group:water' }, + interval = 16, + chance = 2, + catch_up = false, + action = function(pos, node) + if not minetest.settings:get_bool('enable_particles', true) then + return + end + + local water_above = minetest.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 10, z = pos.z }, { 'group:water' }) + + if #water_above < 10 then + return + end + + -- particles + local particlespawner_def = { + amount = 17, + time = 10, + minpos = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + maxpos = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 4, + maxexptime = 6, + minsize = 4, + maxsize = 6, + texture = 'everness_rising_soul_particle.png', + glow = 7 + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 17, + time = 10, + size = { + min = 4, + max = 6, + }, + exptime = { + min = 4, + max = 6 + }, + pos = { + min = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + max = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_rising_soul_particle.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 2, + }, + alpha_tween = { + 1, 0, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 0.5, 1, + style = 'fwd', + reps = 1 + } + }, + glow = 7 + } + end + + minetest.add_particlespawner(particlespawner_def) + end +}) + +-- +-- Rising Crystals +-- + +Everness:register_abm({ + label = 'everness:rising_crystals', + description = 'Crystal particles under water.', + nodenames = { 'group:rising_crystals' }, + neighbors = { 'group:water' }, + interval = 16, + chance = 2, + catch_up = false, + action = function(pos, node) + if not minetest.settings:get_bool('enable_particles', true) then + return + end + + local water_above = minetest.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 10, z = pos.z }, { 'group:water' }) + + if #water_above < 10 then + return + end + + -- particles + local particlespawner_def = { + amount = 17, + time = 10, + minpos = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + maxpos = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 4, + maxexptime = 6, + minsize = 4, + maxsize = 6, + texture = 'everness_rising_soul_particle.png', + glow = 7 + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 25, + time = 10, + size = { + min = 6, + max = 8, + }, + exptime = { + min = 4, + max = 6 + }, + pos = { + min = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + max = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_crystal_forest_deep_ocean_sand_bubbles.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1, + }, + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + } + }, + glow = 7 + } + end + + minetest.add_particlespawner(particlespawner_def) + end +}) + +-- Mineral Waters Water Geyser +Everness:register_abm({ + label = 'everness:water_geyser', + description = 'Water geyser water splash.', + nodenames = { 'everness:water_geyser' }, + interval = 16, + chance = 16, + catch_up = false, + action = function(pos, node) + minetest.swap_node(pos, { name = 'everness:water_geyser_active' }) + + local meta = minetest.get_meta(pos) + local partcile_time = math.random(5, 15) + + -- player + for _, object in ipairs(minetest.get_objects_in_area(vector.new(pos.x - 0.5, pos.y - 0.5, pos.z - 0.5), vector.new(pos.x + 0.5, pos.y + 1, pos.z + 0.5))) do + if object:is_player() + and object:get_hp() > 0 + then + object:add_velocity(vector.new(0, math.random(27, 32), 0)) + end + end + + -- particles + local particlespawner_def = { + amount = 80, + time = partcile_time, + minpos = vector.new(pos.x, pos.y + 1.5, pos.z), + maxpos = vector.new(pos.x, pos.y + 2, pos.z), + minvel = vector.new(0, 13, 0), + maxvel = vector.new(0, 15, 0), + minacc = vector.new(0, -1, 1), + maxacc = vector.new(0, -3, 2), + minexptime = 3, + maxexptime = 5, + minsize = 5, + maxsize = 7, + texture = 'everness_water_geyser_particle.png', + vertical = true, + collisiondetection = true, + collision_removal = true + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, above v5.6.0 + particlespawner_def = { + amount = 80, + time = partcile_time, + size = { + min = 5, + max = 7, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x, pos.y + 1.5, pos.z), + max = vector.new(pos.x, pos.y + 2, pos.z) + }, + vel = { + min = vector.new(0, 13, 0), + max = vector.new(0, 15, 0) + }, + acc = { + min = vector.new(0, -1, 1), + max = vector.new(0, -3, 2) + }, + texture = { + name = 'everness_water_geyser_particle.png', + scale_tween = { + 5, 10, + style = 'fwd', + reps = 1 + }, + alpha_tween = { + 1, 0, + style = 'fwd', + reps = 1 + }, + blend = 'alpha', + }, + vertical = true, + collisiondetection = true, + collision_removal = true + } + end + + local particle_id = minetest.add_particlespawner(particlespawner_def) + meta:set_int('particle_id', particle_id) + + minetest.sound_play({ + name = 'everness_water_geyser', + gain = 1.5, + pitch = math.random(10, 30) / 10 + }, { + pos = pos + }) + + minetest.get_node_timer(pos):start(partcile_time) + end +}) + +-- Lava spitting +Everness:register_abm({ + label = 'everness:lava_spitting', + description = 'Lava bursts in to air.', + nodenames = { 'everness:lava_source' }, + neighbors = { 'air' }, + interval = 10, + chance = 200, + catch_up = false, + action = function(pos, node) + local burst_colors = { + '#FF5400', + '#DD2005' + } + local partcile_time = math.random(3, 5) + + -- particles + local particlespawner_def = { + amount = 10, + time = partcile_time, + minpos = vector.new(pos.x - 0.1, pos.y + 0.5, pos.z - 0.1), + maxpos = vector.new(pos.x + 0.1, pos.y + 1, pos.z + 0.1), + minvel = vector.new(0, 1, 0), + maxvel = vector.new(0, 3, 0), + minacc = vector.new(0, -3, 0), + maxacc = vector.new(0, -6, 0), + minexptime = 3, + maxexptime = 5, + minsize = 3, + maxsize = 10, + texture = ('everness_water_geyser_particle.png^[multiply:%s'):format(burst_colors[math.random(1, #burst_colors)]), + vertical = true, + collisiondetection = true, + collision_removal = true + } + local particlespawner_def2 = { + amount = 40, + time = partcile_time, + minpos = vector.new(pos.x, pos.y + 0.5, pos.z), + maxpos = vector.new(pos.x, pos.y + 1, pos.z), + minvel = vector.new(0, 1, 0), + maxvel = vector.new(0, 3, 0), + minacc = vector.new(-1, -3, -1), + maxacc = vector.new(1, -6, 1), + minexptime = 3, + maxexptime = 5, + minsize = 3, + maxsize = 10, + node = node, + vertical = true, + collisiondetection = true, + collision_removal = true + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, above v5.6.0 + particlespawner_def = { + amount = 10, + time = partcile_time, + size = { + min = 1, + max = 2, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x - 0.1, pos.y + 0.5, pos.z - 0.1), + max = vector.new(pos.x + 0.1, pos.y + 1, pos.z + 0.1) + }, + vel = { + min = vector.new(0, 1, 0), + max = vector.new(0, 3, 0) + }, + acc = { + min = vector.new(0, -3, 0), + max = vector.new(0, -6, 0) + }, + texture = { + name = ('everness_water_geyser_particle.png^[multiply:%s'):format(burst_colors[math.random(1, #burst_colors)]), + scale_tween = { + 10, 3, + style = 'fwd', + reps = 1 + } + }, + vertical = true, + collisiondetection = true, + collision_removal = true + } + + particlespawner_def2 = { + amount = 40, + time = partcile_time, + size = { + min = 1, + max = 2, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x, pos.y + 0.5, pos.z), + max = vector.new(pos.x, pos.y + 1, pos.z) + }, + vel = { + min = vector.new(0, 1, 0), + max = vector.new(0, 3, 0) + }, + acc = { + min = vector.new(-1, -3, -1), + max = vector.new(1, -6, 1) + }, + node = node, + vertical = true, + collisiondetection = true, + collision_removal = true + } + end + + if math.random(0, 100) <=50 then + minetest.add_particlespawner(particlespawner_def2) + else + minetest.add_particlespawner(particlespawner_def) + end + end +}) + +-- Generate bamboo tops after mineral waters biome generates decorations +Everness:register_lbm({ + -- Descriptive label for profiling purposes (optional). + -- Definitions with identical labels will be listed as one. + label = 'Generate bamboo tops after mineral waters biome generates decorations', + + -- Identifier of the LBM, should follow the modname: convention + name = 'everness:mineral_waters_bamboo_large', + + -- List of node names to trigger the LBM on. + -- Names of non-registered nodes and groups (as group:groupname) + -- will work as well. + nodenames = { 'everness:bamboo_3' }, + + -- Whether to run the LBM's action every time a block gets activated, + -- and not only the first time the block gets activated after the LBM + -- was introduced. + run_at_every_load = true, + + -- Function triggered for each qualifying node. + -- `dtime_s` is the in-game time (in seconds) elapsed since the block + -- was last active + action = function(pos, node, dtime_s) + if minetest.get_node(vector.new(pos.x, pos.y + 1, pos.z)).name ~= 'air' then + return + end + + local node_below = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + + -- Get bamboo height + local while_counter = 1 + local bamboo_height = 0 + local bamboo_below = node_below + + while bamboo_below.name == 'everness:bamboo_3' do + bamboo_below = minetest.get_node(vector.new(pos.x, pos.y - while_counter, pos.z)) + bamboo_height = bamboo_height + 1 + while_counter = while_counter + 1 + end + + -- Add top bamboo nodes with leaves based on their generated height + if bamboo_height > 4 then + for i = 1, 3 do + local pos_i = vector.new(pos.x, pos.y + i, pos.z) + + if minetest.get_node(pos_i).name == 'air' then + if i == 1 then + minetest.set_node(pos_i, { + name = 'everness:bamboo_4', + param2 = node_below.param2 + }) + else + minetest.set_node(pos_i, { + name = 'everness:bamboo_5', + param2 = node_below.param2 + }) + end + end + end + else + for i = 1, 2 do + local pos_i = vector.new(pos.x, pos.y + i, pos.z) + + if minetest.get_node(pos_i).name == 'air' then + if i == 1 then + minetest.set_node(pos_i, { + name = 'everness:bamboo_4', + param2 = node_below.param2 + }) + else + minetest.set_node(pos_i, { + name = 'everness:bamboo_5', + param2 = node_below.param2 + }) + end + end + end + end + end +}) + +-- Activate timers on lotus flowers +Everness:register_lbm({ + -- Descriptive label for profiling purposes (optional). + -- Definitions with identical labels will be listed as one. + label = 'Activate timers on lotus flowers', + + -- Identifier of the LBM, should follow the modname: convention + name = 'everness:everness_lotus_flower_timers', + + -- List of node names to trigger the LBM on. + -- Names of non-registered nodes and groups (as group:groupname) + -- will work as well. + nodenames = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink' + }, + + -- Whether to run the LBM's action every time a block gets activated, + -- and not only the first time the block gets activated after the LBM + -- was introduced. + run_at_every_load = true, + + -- Function triggered for each qualifying node. + -- `dtime_s` is the in-game time (in seconds) elapsed since the block + -- was last active + action = function(pos, node, dtime_s) + local timer = minetest.get_node_timer(pos) + + if not timer:is_started() then + minetest.get_node_timer(pos):start(1) + end + end +}) + +-- Spread lotus flowers and leafs around them +Everness:register_abm({ + label = 'everness:lotus_flowers_and_leaves_spread', + description = 'Spreads lotus flowers and leaves.', + nodenames = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink', + 'everness:lotus_leaf', + 'everness:lotus_leaf_2', + 'everness:lotus_leaf_3' + }, + neighbors = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink', + 'everness:lotus_leaf', + 'everness:lotus_leaf_2', + 'everness:lotus_leaf_3' + }, + max_y = Everness.settings.biomes.everness_mineral_waters.y_max, + min_y = Everness.settings.biomes.everness_mineral_waters.y_min, + interval = 13, + chance = 300, + action = function(pos, node) + local under = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + local def = minetest.registered_nodes[under.name] or {} + + if def.liquidtype ~= 'source' and minetest.get_item_group(under.name, 'water') == 0 then + return + end + + local light = minetest.get_node_light(pos) + + if not light or light < 13 then + return + end + + local pos0 = vector.subtract(pos, 4) + local pos1 = vector.add(pos, 4) + local flower_node_names = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink' + } + local leaf_node_names = { + 'everness:lotus_leaf', + 'everness:lotus_leaf_2', + 'everness:lotus_leaf_3' + } + local node_name = flower_node_names[math.random(1, #flower_node_names)] + local found_flower_positions = minetest.find_nodes_in_area(pos0, pos1, flower_node_names) + + -- Testing shows that a threshold of 1 result in an appropriate maximum + -- density of approximately 7 flowers per 9x9 area. + if #found_flower_positions > 1 then + -- Spread leafs + local rand_flower_pos = found_flower_positions[math.random(1, #found_flower_positions)] + pos0 = vector.subtract(rand_flower_pos, 4) + pos1 = vector.add(rand_flower_pos, 4) + local found_leaf_positions = minetest.find_nodes_in_area(pos0, pos1, leaf_node_names) + + if #found_leaf_positions > 25 then + return + end + + node_name = leaf_node_names[math.random(1, #leaf_node_names)] + end + + local water_positions = minetest.find_nodes_in_area_under_air(pos0, pos1, 'group:water') + + table.shuffle(water_positions) + -- Sort with the closest first + table.sort(water_positions, function(a, b) + return vector.distance(a, pos) < vector.distance(b, pos) + end) + + local water_pos + + -- find water source since we are looking only for `group:water` + for _, p in ipairs(water_positions) do + local n = minetest.get_node(p) + local d = minetest.registered_nodes[n.name] or {} + + if d.liquidtype == 'source' then + water_pos = p + break + end + end + + if not water_pos then + return + end + + local water_above = vector.new(water_pos.x, water_pos.y + 1, water_pos.z) + light = minetest.get_node_light(water_above) + + if light and light >= 13 then + minetest.set_node(water_above, { name = node_name }) + end + end +}) + +-- +-- Lavacooling +-- + +-- Override lava cooling to include some variations of obsidian +minetest.register_on_mods_loaded(function() + for _, abm in pairs(minetest.registered_abms) do + if abm.label == 'Lava cooling' and abm.action ~= nil then + local prev_cool_lava_action = abm.action + + table.insert_all(abm.nodenames, { 'everness:lava_source', 'everness:lava_flowing' }) + + abm.action = function(pos, node, dtime_s) + Everness.cool_lava(pos, node, dtime_s, prev_cool_lava_action) + end + end + end +end) + +-- Calculates `everness:hammer_sharp` wear when crafting +minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack and itemstack:get_name() == 'everness:hammer_sharp' then + local stack_meta = itemstack:get_meta() + local hammers = 0 + local wear_total = 0 + + for k, stack in pairs(old_craft_grid) do + if stack:get_name() == 'everness:hammer' then + local meta = stack:get_meta() + wear_total = wear_total + meta:get_int('everness_wear') + hammers = hammers + 1 + end + end + + local average_wear = wear_total / hammers + + stack_meta:set_int('everness_wear', math.ceil(average_wear)) + + -- Draw wear bar texture overlay + if average_wear > 0 then + Everness.draw_wear_bar(itemstack, average_wear) + end + + return itemstack + end +end) + +-- Calculates `everness:hammer_sharp` wear when crafting +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack and itemstack:get_name() == 'everness:hammer_sharp' then + local stack_meta = itemstack:get_meta() + local hammers = 0 + local wear_total = 0 + + for k, stack in pairs(old_craft_grid) do + if stack:get_name() == 'everness:hammer' then + local meta = stack:get_meta() + wear_total = wear_total + meta:get_int('everness_wear') + hammers = hammers + 1 + end + end + + local average_wear = wear_total / hammers + + stack_meta:set_int('everness_wear', math.ceil(average_wear)) + + -- Draw wear bar texture overlay + if average_wear > 0 then + Everness.draw_wear_bar(itemstack, average_wear) + end + + return itemstack + end +end) diff --git a/mods/everness/init.lua b/mods/everness/init.lua new file mode 100644 index 00000000..e581ecd4 --- /dev/null +++ b/mods/everness/init.lua @@ -0,0 +1,259 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +minetest = minetest.global_exists('minetest') and minetest --[[@as Minetest]] + +local path = minetest.get_modpath('everness') +local mod_start_time = minetest.get_us_time() + +-- Legacy backwards compatibility +minetest.register_alias('everness:dirt_with_grass_2', 'everness:dirt_with_grass_1') +minetest.register_alias('everness:path_dirt_with_grass_2', 'everness:path_dirt_with_grass_1') + +-- MineClone2 support +if minetest.get_modpath('mcl_core') and minetest.global_exists('mcl_core') then + dofile(path .. '/mod_support_mcl_aliases.lua') +end + +dofile(path .. '/api.lua') +dofile(path .. '/nodes.lua') +dofile(path .. '/nodes_farming.lua') +if Everness.settings.biomes.everness_mineral_waters_under.enabled then + dofile(path .. '/nodes_mineral_waters_under.lua') +end +dofile(path .. '/bamboo.lua') +dofile(path .. '/functions.lua') +dofile(path .. '/trees.lua') +dofile(path .. '/vines.lua') +dofile(path .. '/vines_wall.lua') +dofile(path .. '/chests.lua') +dofile(path .. '/torches.lua') + +dofile(path .. '/mapgen.lua') + +if Everness.settings.biomes.everness_bamboo_forest_under.enabled then + dofile(path .. '/mapgen_bamboo_forest_under.lua') +end + +if Everness.settings.biomes.everness_bamboo_forest.enabled then + dofile(path .. '/mapgen_bamboo_forest.lua') +end + +if Everness.settings.biomes.everness_baobab_savanna.enabled then + dofile(path .. '/mapgen_baobab_savanna.lua') +end + +if Everness.settings.biomes.everness_coral_forest_dunes.enabled then + dofile(path .. '/mapgen_coral_forest_dunes.lua') +end + +if Everness.settings.biomes.everness_coral_forest_ocean.enabled then + dofile(path .. '/mapgen_coral_forest_ocean.lua') +end + +if Everness.settings.biomes.everness_coral_forest_deep_ocean.enabled then + dofile(path .. '/mapgen_coral_forest_deep_ocean.lua') +end + +if Everness.settings.biomes.everness_coral_forest_under.enabled then + dofile(path .. '/mapgen_coral_forest_under.lua') +end + +if Everness.settings.biomes.everness_coral_forest.enabled then + dofile(path .. '/mapgen_coral_forest.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then + dofile(path .. '/mapgen_crystal_forest_dunes.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then + dofile(path .. '/mapgen_crystal_forest_ocean.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_deep_ocean.enabled then + dofile(path .. '/mapgen_crystal_forest_deep_ocean.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_shore.enabled then + dofile(path .. '/mapgen_crystal_forest_shore.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_under.enabled then + dofile(path .. '/mapgen_crystal_forest_under.lua') +end + +if Everness.settings.biomes.everness_crystal_forest.enabled then + dofile(path .. '/mapgen_crystal_forest.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_dunes.enabled then + dofile(path .. '/mapgen_cursed_lands_dunes.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_ocean.enabled then + dofile(path .. '/mapgen_cursed_lands_ocean.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_deep_ocean.enabled then + dofile(path .. '/mapgen_cursed_lands_deep_ocean.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_swamp.enabled then + dofile(path .. '/mapgen_cursed_lands_swamp.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_under.enabled then + dofile(path .. '/mapgen_cursed_lands_under.lua') +end + +if Everness.settings.biomes.everness_cursed_lands.enabled then + dofile(path .. '/mapgen_cursed_lands.lua') +end + +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + dofile(path .. '/mapgen_forsaken_desert_ocean.lua') +end + +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + dofile(path .. '/mapgen_forsaken_desert_under.lua') +end + +if Everness.settings.biomes.everness_forsaken_desert.enabled then + dofile(path .. '/mapgen_forsaken_desert.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then + dofile(path .. '/mapgen_forsaken_tundra_beach.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then + dofile(path .. '/mapgen_forsaken_tundra_ocean.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra_under.enabled then + dofile(path .. '/mapgen_forsaken_tundra_under.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra.enabled then + dofile(path .. '/mapgen_forsaken_tundra.lua') +end + +if Everness.settings.biomes.everness_frosted_icesheet_ocean.enabled then + dofile(path .. '/mapgen_frosted_icesheet_ocean.lua') +end + +if Everness.settings.biomes.everness_frosted_icesheet_under.enabled then + dofile(path .. '/mapgen_frosted_icesheet_under.lua') +end + +if Everness.settings.biomes.everness_frosted_icesheet.enabled then + dofile(path .. '/mapgen_frosted_icesheet.lua') +end + +if Everness.settings.biomes.everness_mineral_waters.enabled then + dofile(path .. '/mapgen_mineral_waters.lua') +end + +if Everness.settings.biomes.everness_mineral_waters_under.enabled then + dofile(path .. '/mapgen_mineral_waters_under.lua') +end + +dofile(path .. '/mapgen_after.lua') + +if minetest.get_modpath('xpanes') and minetest.global_exists('xpanes') then + dofile(path .. '/panes.lua') +end + +if minetest.get_modpath('stairs') and minetest.global_exists('stairs') then + dofile(path .. '/stairs.lua') +end + +if minetest.get_modpath('walls') and minetest.global_exists('walls') then + dofile(path .. '/walls.lua') +end + +if minetest.get_modpath('default') or minetest.global_exists('default') then + if default.register_fence + and default.register_fence_rail + and default.register_mesepost + then + dofile(path .. '/fences.lua') + end +end + +if minetest.get_modpath('doors') and minetest.global_exists('doors') then + dofile(path .. '/doors.lua') +end + +if not minetest.get_modpath('bucket') and not minetest.get_modpath('mcl_buckets') then + dofile(path .. '/buckets.lua') +end + +dofile(path .. '/tools.lua') +dofile(path .. '/craftitems.lua') +dofile(path .. '/crafting.lua') + +if Everness.settings.features.everness_feature_skybox then + dofile(path .. '/skybox.lua') +end + +dofile(path .. '/env_sounds.lua') + +if Everness.settings.features.everness_feature_sneak_pickup then + dofile(path .. '/sneak_pickup.lua') +end + +dofile(path .. '/privileges.lua') +dofile(path .. '/chat_commands.lua') + +Everness:encyclopedia_init() + +minetest.register_on_mods_loaded(function() + Everness.set_loot_chest_items() +end) + +-- +-- Mod Support +-- + +if minetest.get_modpath('x_farming') and minetest.global_exists('x_farming') then + dofile(path .. '/mod_support_x_farming.lua') +end + +if minetest.get_modpath('x_tumbleweed') and minetest.global_exists('XTumbleweed') then + dofile(path .. '/mod_support_x_tumbleweed.lua') +end + +if minetest.get_modpath('x_obsidianmese') + and minetest.global_exists('x_obsidianmese') + -- backwards compatibility check + and x_obsidianmese.register_path_node +then + dofile(path .. '/mod_support_x_obsidianmese.lua') +end + +-- MineClone2 +if minetest.get_modpath('mcl_core') and minetest.global_exists('mcl_core') then + dofile(path .. '/mod_support_mcl.lua') +end + +-- Minetest Game +dofile(path .. '/mod_support_mtg.lua') + +local mod_end_time = (minetest.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] everness loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/everness/locale/everness.fr.tr b/mods/everness/locale/everness.fr.tr new file mode 100644 index 00000000..7714c0ba --- /dev/null +++ b/mods/everness/locale/everness.fr.tr @@ -0,0 +1,251 @@ +# textdomain: everness +Agave Leaf=Feuille d'agave +Amaranita Lantern=Lanterne Amarante +Ancient Emerald Ice=Glace d'émeraude ancienne +Bamboo Block=Bloc de bambou +Bamboo Door=Porte en Bambou +Bamboo Mosaic Wood Slab=Dalle en mosaïque de bambou +Bamboo Mosaic Wood Stair=Escalier en mosaïque de bambou +Bamboo Mosaic=Mosaïque de bambou +Bamboo Planks=Planches de bambou +Bamboo Sprout=Pousse de bambou +Bamboo Trapdoor=Trappe en Bambou +Bamboo Wood Fence Gate=Portillon en bois de bambou +Bamboo Wood Fence Rail=Rail de clôture en bois de bambou +Bamboo Wood Fence=Clôture en bois de bambou +Bamboo Wood Mese Post Light=Lampadaire de Mese en bois de bambou +Bamboo Wood Slab=Dalle en bois de bambou +Bamboo Wood Stair=Escalier en bois de bambou +Bamboo=Bambou +Baobab Fruit Marker=Marqueur du fruit du Baobab +Baobab Fruit=Fruit du Baobab +Baobab Roasted Fruit=Fruit de Baobab Rôti +Baobab Sapling=Plant de Baobab +Baobab Tree Leaves=Feuilles de Baobab +Baobab Tree Trunk=Tronc de Baobab +Baobab Wood Planks=Planches en bois de Baobab +Baobab Wood Slab=Dalle en bois de baobab +Baobab Wood Stair=Escalier en bois de baobab +Blood Spoore Plant Small=Petite plante spore sanglante +Blood Spoore Plant=Plante spore sanglante +Blooming Cooksonia=Cooksonia en fleur +Blue Cactus=Cactus bleu +Blue Crying Obsidian=Obsidienne pleureuse bleue +Blue Vine Lantern=Lanterne de vigne bleue +Blue Weeping Obsidian=Obsidienne larmoyante bleue +Bone Pyrit Door=Porte en os de pyrite +Bone=Os +Bulb Vine=Vigne bulbeuse +Cave Barrel Cactus=Cactus baril des cavernes +Cave Flower with Particles=Fleur des cavernes avec particules +Cave Flower=Fleur des cavernes +Cave Vine with Mese Leaves=Vigne des cavernes avec des feuille de Mese +Cave Vine=Vigne des cavernes +Chiseled Quartz=Quartz ciselé +Cobweb=Toile d'araignée +Coral Bones=Os coraliens +Coral Burdock=Bardane coralienne +Coral Bush=Buisson coralien +Coral Cobblestone Wall=Mur de pavés coraliens +Coral Corals=Coraux coraliens +Coral Desert Cobblestone=Pavé de désert coralien +Coral Desert Stone with Moss=Pierre de désert coralien avec de la mousse +Coral Desert Stone=Pierre de désert coralien +Coral Dirt=Terre coralienne +Coral Frosted=Givré coralien +Coral Grass=Herbe coralienne +Coral Mossy Cobblestone Wall=Mur de pavés coraliens moussus +Coral Mossy Cobblestone=Pavé de mousse coralienne +Coral Plant Bioluminescent=Plante coralienne bioluminescente +Coral Sand=Sable coralien +Coral Shrub=Arbuste coralien +Coral Starfish=Étoile de mer coralienne +Coral Tree Bioluminescent Sapling=Plant d'arbre coralien luminescent +Coral Tree Bioluminescent=Arbre coralien luminescent +Coral Tree Leaves=Feuille d'arbre coralien +Coral Tree Sapling=Plant d'arbre coralien +Coral Tree Trunk=Tronc d'arbre coralien +Coral White Sand=Sable coralien blanc +Creeping Moss Spores=Spores de mousse grimpante +Crystal Bush Leaves=Feuilles de buisson de cristal +Crystal Bush Sapling=Plant de buisson de cristal +Crystal Bush Stem=Tige de buisson de cristal +Crystal Cave Dirt with Moss=Terre de caverne de cristal avec de l'herbe +Crystal Cave Dirt=Terre de caverne de cristal +Crystal Coral Dark=Cristal coralien sombre +Crystal Coral Light=Cristal coralien clair +Crystal Dirt=Terre de cristal +Crystal Grass=Herbe de cristal +Crystal Moss Block=Bloc de mousse de cristal +Crystal Mushrooms=Champigons de cristal +Crystal Sand=Sable de cristal +Crystal Tree Large Sapling=Grand plant d'arbre de cristal +Crystal Tree Leaves=Feuille d'arbre de cristal +Crystal Tree Sapling=Plant d'arbre de cristal +Crystal Tree Trunk=Tronc d'arbre de cristal +Crystal Waterlily=Nénuphar de cristal +Cursed Brick Wall=Mur de briques maudites +Cursed Brick=Brique maudite +Cursed Bush Leaves=Feuilles de buisson maudit +Cursed Bush Sapling=Plant de buisson maudit +Cursed Bush Stem=Tige de buisson maudit +Cursed Dirt=Terre maudite +Cursed Dream Stone=Pierre de rêve maudite +Cursed Dream Tree Sapling=Plant d'arbre des rêves maudit +Cursed Mud=Boue maudite +Cursed Pumpkin Lantern=Lanterne citrouille maudite +Cursed Sand=Sable maudit +Cursed Stone=Pierre maudite +Cyan Crystal=Cristal cyan +Dense Emerald Ice=Glace d'émeraude dense +Dense Vine=Vigne dense +Dirt with Coral Grass=Terre avec de l'herbe coralienne +Dirt with Crystal Grass=Terre avec de l'herbe de cristal +Dirt with Cursed Grass=Terre avec de l'herbe maudite +Dirt with Grass=Terre avec de l'herbe +Dirt=Terre +Dry Ocean Dirt=Terre de l'océan sec +Dry Tree Branches=Branches d'arbre sec +Dry Tree Sapling=Plant d'arbre sec +Dry Tree Trunk=Tronc d'arbre sec +Dry Wood Fence Rail=Rail de clôture en bois sec +Dry Wood Fence=Clôture en bois sec +Dry Wood Mese Post Light=Lampadaire de Mese en bois sec +Dry Wood Planks=Planches en bois sec +Dry Wood Slab=Dalle en bois sec +Dry Wood Stair=Escalier en bois sec +Egg plant=Aubergine +Emerald Ice=Glace d'émeraude +Eye Vine Lantern=Lanterne de vigne oculaire +Eye Vine=Vigne oculaire +Floating Crystal=Cristal flottant +Flowered Vine=Vigne florissante +Forged Pyrite Block=Bloc de pyrite forgé +Forsaken Desert Brick Red Slab=Dalle en brique rouge de désert abandonné +Forsaken Desert Brick Red Stair=Escalier en brique rouge de désert abandonné +Forsaken Desert Brick Red=Brique rouge de désert abandonné +Forsaken Desert Brick Slab=Dalle en brique de désert abandonné +Forsaken Desert Brick Stair=Escalier en brique de désert abandonné +Forsaken Desert Brick=Brique de désert abandonné +Forsaken Desert Chiseled Stone Slab=Dalle en pierre ciselée de désert abandonné +Forsaken Desert Chiseled Stone Stair=Escalier en pierre ciselée de désert abandonné +Forsaken Desert Chiseled Stone=Pierre ciselée de désert abandonné +Forsaken Desert Cobblestone Red=Pavé rouge de désert abandonné +Forsaken Desert Cobblestone=Pavé de désert abandonné +Forsaken Desert Engraved Stone=Pierre gravée de désert abandonné +Forsaken Desert Sand=Sable de désert abandonné +Forsaken Desert Stone=Pierre de désert abandonné +Forsaken Fire=Feu abandonné +Forsaken Plant=Plante abandonnée +Forsaken Tundra Beach Sand with Shells=Sable de plage de toundra abandonnée avec des coquillages +Forsaken Tundra Beach Sand=Sable de plage de toundra abandonnée +Forsaken Tundra Brick Slab=Dalle en brique de toundra abandonnée +Forsaken Tundra Brick Stair=Escalier en brique de toundra abandonnée +Forsaken Tundra Brick Wall=Mur de briques de toundra abandonnée +Forsaken Tundra Brick=Brique de toundra abandonnée +Forsaken Tundra Cobblestone Slab=Dalle en pavé de toundra abandonnée +Forsaken Tundra Cobblestone Stair=Escalier en pavé de toundra abandonnée +Forsaken Tundra Cobblestone Wall=Mur de pavés de toundra abandonnée +Forsaken Tundra Cobblestone=Pavé de toundra abandonnée +Forsaken Tundra Dirt with Grass=Terre de toundra abandonnée avec de l'herbe +Forsaken Tundra Dirt=Terre de toundra abandonnée +Forsaken Tundra Rocks=Roche de toundra abandonnée +Forsaken Tundra Stone Slab=Dalle en pierre de toundra abandonnée +Forsaken Tundra Stone Stair=Escalier en pierre de toundra abandonnée +Forsaken Tundra Stone Wall=Mur de pierre de toundra abandonnée +Forsaken Tundra Stone=Pierre de toundra abandonnée +Forsythia Bush=Buisson de Forsythia +Frosted Cave Ice=Glace de caverne givrée +Frosted Ice Translucent=Glace givrée transparente +Frosted Ice=Glace givrée +Frosted Icicle Floor=Sol de glaçon givré +Frosted Icicle=Glaçon givré +Frosted Snow Block=Bloc de neige givré +Globulagus=Eucalyptus Globulus +Glowing Pillar=Pilier rayonnant +Golden Vine=Vigne d'or +Hollow Tree Trunk=Tronc d'arbre creux +Illumi Root=Illumi Racine +Ivis Moss=Mousse d'Ivis +Ivis Vine=Vigne d'ivis +Lumabus Vine Lantern=Lanterne de vigne luminescente +Lumabus Vine=Vigne luminescente +Lumecorn=Blé luminescent +Magma Cobblestone Slab=Dalle en pavé magmatique +Magma Cobblestone Stair=Escalier en pavé magmatique +Magma Cobblestone Wall=Mur de pavé magmatique +Marsh Grass=Herbe des marais +Mese Tree Trunk=Tronc d'arbre à Mese +Mold Cobble=Galet de moule +Mold Stone=Pierre de moule +Moss Block=Bloc de mousse +Ngrass=N-Herbe +Orange Cactus=Cactus orange +Orange Coral Grass=Herbe coralienne orange +Orange Crystal Block=Bloc de cristal orange +Orange Crystal=Cristal orange +Polished Pyrite Block=Bloc de pyrite poli +Purple Crystal Block=Bloc de cristal pourpre +Purple Crystal=Cristal pourpre +Pyrite Block=Bloc de pyrite +Pyrite Brick=Brique de pyrite +Pyrite Glass Pane=Panneau de verre de pyrite +Pyrite Glass=Verre de pyrite +Pyrite Ingot=Lingot de Pyrite +Pyrite Lantern=Lanterne en pyrite +Pyrite Lump=Morceau de Pyrite +Pyrite Ore=Minerai de pyrite +Pyrite Pillar Bottom=Pied de pilier en pyrite +Pyrite Pillar Middle=Colonne de pilier en pyrite +Pyrite Pillar Small=Petit pilier en pyrite +Pyrite Pillar Top=Tête de pilier en pyrite +Pyrite Slab Brick=Dalle de brique de pyrite +Pyrite Spiral=Spirale de pyrite +Quartz Block Slab=Dalle en bloc de quartz +Quartz Block Stair=Escalier en bloc de quartz +Quartz Block=Bloc de quartz +Quartz Chiseled Slab=Dalle en quartz ciselé +Quartz Chiseled Stair=Escalier en quartz ciselé +Quartz Crystal=Cristal de Quartz +Quartz Ore=Minerai de quartz +Quartz Pillar Slab=Dalle en pilier de quarte +Quartz Pillar Stair=Escalier en pilier de quartz +Quartz Pillar=Pilier de quartz +Red Castor=Ricin rouge +Reeds Vine=Vigne de roseaux +Sequoia Tree Leaves=Feuilles de Séquoia +Sequoia Tree Sapling=Plant de Séquoia +Sequoia Tree Trunk=Tronc de Séquoia +Sequoia Wood Planks=Planches en bois de Séquoia +Sequoia Wood Slab=Dalle en bois de Séquoia +Sequoia Wood Stair=Escalier en bois de Séquoia +Skull with Candle=Squelette avec bougie +Soul Sandstone Veined=Grès des âmes veiné +Soul Sandstone=Grès des âmes +Spine Kelp=Varch épineux +Sulfur Stone=Pierre de soufre +Tall Coral Grass=Grande Herbe coralienne +Termite Block=Bloc de termitière +Tinted Glass Red=Verre teinté rouge +Twisted Crystal Grass=Herbe de cristal tordue +Twisted Vine=Vigne tordue +Venus Trap Plant=Dionée attrape-mouche +Vine Shears=Cisailles à vigne +Volcanic Rock Slab=Dalle en roche volcanique +Volcanic Rock Stair=Escalier en roche volcanique +Volcanic Rock Wall=Mur de roches volcaniques +Volcanic Rock with Magma Slab=Dalle en roche volcanique avec du magma +Volcanic Rock with Magma Stair=Escalier en roche volcanique avec du magma +Volcanic Rock with Magma Wall=Mur de roches volcaniques avec du magma +Volcanic Rock with Magma=Roche volcanique avec du magma +Volcanic Rock=Roche volcanique +Volcanic Sulfur Stone=Pierre volcanique sulfurée +Weeping Obsidian=Obsidienne larmoyante +Whispering Gourd Vine=Gourde de vigne chuchotante +Willow Door=Porte en Saule +Willow Tree Leaves=Feuilles de saule +Willow Tree Trunk=Tronc de Saule +Willow Vine=Vigne de saule +Willow Wood Planks=Planches en bois de saule +Willow Wood Slab=Dalle en bois de saule +Willow Wood Stair=Escalier en bois de saule diff --git a/mods/everness/locale/everness.hu.tr b/mods/everness/locale/everness.hu.tr new file mode 100644 index 00000000..9efa8cf4 --- /dev/null +++ b/mods/everness/locale/everness.hu.tr @@ -0,0 +1,251 @@ +# textdomain: everness +Quartz Crystal=Kvarckristály +Baobab Roasted Fruit=Sült baobabgyümölcs +Pyrite Ingot=Piritrúd +Pyrite Lump=Piritrög +Bamboo Door=Bambuszajtó +Bamboo Trapdoor=Bambusz csapóajtó +Bamboo Wood Fence Gate=Bambusz kerítésajtó +Bone Pyrit Door=Csont-pirit ajtó +Willow Door=Fűzfaajtó +Dry Wood Fence=Elszáradt fakerítés +Dry Wood Fence Rail=Elszáradt fakerítés-rács +Dry Wood Mese Post Light=Elszáradt fa-mese-lámpa +Bamboo Wood Fence=Bambusz fakerítés +Bamboo Wood Fence Rail=Bambusz fakerítés-rács +Bamboo Wood Mese Post Light=Bambusz fa-mese-lámpa +Pyrite Ore=Piritérc +Pyrite Block=Piritblokk +Forged Pyrite Block=Kovácsolt piritblokk +Pyrite Brick=Pirittégla +Pyrite Slab Brick=Pirit lap-tégla +Pyrite Spiral=Pirit spirál +Pyrite Pillar Bottom=Pirit oszloptalapzat +Pyrite Pillar Middle=Piritoszlop +Pyrite Pillar Top=Pirit oszlopfÅ‘ +Pyrite Pillar Small=Kis piritoszlop +Polished Pyrite Block=Csiszolt piritblokk +Quartz Ore=Kvarcérc +Coral Desert Stone=Korallsivatagi kÅ‘ +Coral Bones=Korallsivatagi csont +Coral Desert Cobblestone=Korallsivatagi macskakÅ‘ +Coral Mossy Cobblestone=Korallsivatagi macskakÅ‘, mohos +Coral Desert Stone with Moss=Korallsivatagi kÅ‘, mohos +Forsaken Desert Stone=Elhagyatott sivatagi kÅ‘ +Forsaken Desert Cobblestone Red=Elhagyatott sivatagi macskakÅ‘, vörös +Forsaken Desert Cobblestone=Elhagyatott sivatagi macskakÅ‘ +Volcanic Rock=Vulkanikus kÅ‘zet +Volcanic Rock with Magma=Vulkanikus kÅ‘zet magmával +Cursed Stone=Elátkozott kÅ‘ +Cursed Brick=Elátkozott tégla +Volcanic Sulfur Stone=Vulkanikus kénkÅ‘ +Sulfur Stone=KénkÅ‘ +Forsaken Tundra Cobblestone=Elhagyatott tundrai macskakÅ‘ +Forsaken Tundra Stone=Elhagyatott tundrai kÅ‘ +Mold Cobble=Penészes macskakÅ‘ +Forsaken Tundra Brick=Elhagyatott tundrai tégla +Forsaken Tundra Rocks=Elhagyatott tundrai kÅ‘zet +Blue Crying Obsidian=Sikoltó obszidián, kék +Blue Weeping Obsidian=KönnyezÅ‘ obszidián, kék +Weeping Obsidian=KönnyezÅ‘ obszidián +Mold Stone=Penészes kÅ‘ +Soul Sandstone=Lélek-homokkÅ‘ +Soul Sandstone Veined=Lélek-homokkÅ‘, erezett +Purple Crystal Block=Lila kristályblokk +Orange Crystal Block=Narancs kristályblokk +Quartz Block=Kvarckristály-blokk +Chiseled Quartz=Csiszolt kvarc +Quartz Pillar=Kvarcoszlop +Forsaken Desert Brick=Elhagyatott sivatagi tégla +Forsaken Desert Brick Red=Elhagyatott sivatagi tégla, vörös +Forsaken Desert Chiseled Stone=Elhagyatott sivatagi kÅ‘, csiszolt +Forsaken Desert Engraved Stone=Elhagyatott sivatagi kÅ‘, vésett +Coral Dirt=Korallföld +Cursed Dirt=Elátkozott föld +Crystal Dirt=Kristályföld +Forsaken Tundra Dirt=Elhagyatott tundraföld +Forsaken Tundra Dirt with Grass=Elhagyatott tundraföld, füves +Dirt with Coral Grass=Föld, korallfüves +Dirt with Cursed Grass=Föld, elátkozott füves +Dirt with Crystal Grass=Föld, kristályfüves +Dry Ocean Dirt=Száraz óceánfenék-talaj +Dirt=Föld +Dirt with Grass=Föld, fűvel +Crystal Cave Dirt=Kristálybarlangi föld +Crystal Cave Dirt with Moss=Kristálybarlangi föld, mohos +Moss Block=Mohablokk +Crystal Moss Block=Kristálymoha-blokk +Coral Sand=Korallhomok +Coral White Sand=Korallhomok, fehér +Cursed Sand=Elátkozott homok +Crystal Sand=Kristályhomok +Forsaken Tundra Beach Sand=Elhagyatott tundraparti homok +Forsaken Tundra Beach Sand with Shells=Elhagyatott tundraparti homok, kagylós +Forsaken Desert Sand=Elhagyatott sivatagi homok +Frosted Snow Block=Fagyalt hóblokk +Frosted Ice=Fagyalt jég +Frosted Ice Translucent=Fagyalt jég, átlátszó +Frosted Cave Ice=Fagyalt jég, barlangi +Bone=Csont +Ancient Emerald Ice=Åsi smaragdjég +Dense Emerald Ice=Sűrű smaragdjég +Emerald Ice=Smaragdjég +Cursed Mud=Elátkozott sár +Cobweb=Pókháló +Cave Flower=Barlangi virág +Cave Flower with Particles=Barlangi virág, szemcsés +Forsaken Fire=Elhagyatott tűz +Coral Tree Trunk=Korallfa-törzs +Coral Tree Bioluminescent=Korallfa, biolumineszcens +Cursed Dream Stone=Elátkozott álomkÅ‘ +Dry Tree Trunk=Elszáradt fatörzs +Baobab Tree Trunk=Baobabfa-törzs +Sequoia Tree Trunk=MammutfenyÅ‘-törzs +Willow Tree Trunk=Fűzfa-törzs +Willow Wood Planks=Fűzfa-palánk +Dry Wood Planks=Elszáradt palánk +Hollow Tree Trunk=Üregesfa-törzs +Crystal Tree Trunk=Kristályfa-törzs +Mese Tree Trunk=Mesefa-törzs +Baobab Tree Leaves=Baobabfa-lomb +Sequoia Tree Leaves=MammutfenyÅ‘-lomb +Baobab Fruit=baobabgyümölcs +Baobab Fruit Marker=baobabgyümölcs-jelölÅ‘ +Baobab Sapling=Baobab-palánta +Willow Tree Leaves=Fűzfa-lomb +Coral Tree Leaves=Korallfa-lomb +Dry Tree Branches=Elszáradt faág +Crystal Tree Leaves=Kristályfa-lomb +Coral Tree Sapling=Korallfa-palánta +Coral Tree Bioluminescent Sapling=Korallfa-palánta, biolumineszcens +Dry Tree Sapling=Elszáradt fa-palánta +Cursed Dream Tree Sapling=Elátkozott álomfa-palánta +Sequoia Tree Sapling=MammutfenyÅ‘-palánta +Crystal Tree Sapling=Kristályfa-palánta +Crystal Tree Large Sapling=Kristályfa-palánta, nagy +Crystal Bush Stem=Kristálybokor-törzs +Crystal Bush Leaves=Kristálybokor-lomb +Crystal Bush Sapling=Kristálybokor-palánta +Cursed Bush Stem=Elátkozott bokor-törzs +Cursed Bush Leaves=Elátkozott bokor-lomb +Cursed Bush Sapling=Elátkozott bokor-palánta +Coral Burdock=Korallbojtorján +Coral Bush=Korallbokor +Coral Shrub=Korallbozót +Orange Coral Grass=Narancs korallfű +Globulagus=Golyós eukaliptusz +Tall Coral Grass=Magas korallfű +Purple Crystal=Lila kristály +Orange Crystal=Narancs kristály +Cyan Crystal=Cián kristály +Coral Plant Bioluminescent=Korallnövény, biolumineszcens +Blooming Cooksonia=Virágzó májmoha +Creeping Moss Spores=Kúszómoha-spóra +Frosted Icicle=Fagyalt jégcsap +Frosted Icicle Floor=Fagyalt jégcsap-padló +Coral Grass=Korallfű +Red Castor=Vörös ricinus +Crystal Mushrooms=Kristálygomba +Twisted Crystal Grass=Csavarodott kristályfű +Crystal Grass=Kristályfű +Marsh Grass=Mocsári fű +Forsaken Plant=Elhagyatott növény +Blue Cactus=Kék kaktusz +Cave Barrel Cactus=Barlangi hordókaktusz +Venus Trap Plant=Vénusz légycsapó +Illumi Root=Illumi-gyökér +Crystal Waterlily=Kristály-vízililiom +Orange Cactus=Narancssárga kaktusz +Agave Leaf=Agave-lomb +Egg plant=Padlizsán +Ivis Moss=Ivis-moha +Ngrass=N-fű +Bamboo Sprout=Bambuszrügy +Blood Spoore Plant=Vérspóra-növény +Blood Spoore Plant Small=Vérspóra-növény, kicsi +Termite Block=Termeszblokk +Bamboo Block=Bambuszblokk +Bamboo Planks=Bambuszpalánk +Bamboo Mosaic=Bambuszmozaik +Baobab Wood Planks=Baobabfa-palánk +Sequoia Wood Planks=MammutfenyÅ‘-palánk +Coral Corals=Korall +Coral Frosted=Korall, fagyalt +Coral Starfish=Korall-csillaghal +Spine Kelp=Gerinchínár +Crystal Coral Dark=Kristálykorall, sötét +Crystal Coral Light=Kristálykorall, világos +Skull with Candle=Koponya gyertyával +Forsythia Bush=Forsythia-bokor +Glowing Pillar=Izzó oszlop +Blue Vine Lantern=Kék inda-lámpás +Amaranita Lantern=Amaranita-lámpás +Lumecorn=Lume-mag +Tinted Glass Red=Színezett üveg, vörös +Pyrite Lantern=Piritlámpás +Pyrite Glass=Piritüveg +Lumabus Vine Lantern=Lumabus-inda lámpás +Eye Vine Lantern=Szem-inda lámpás +Cursed Pumpkin Lantern=Elátkozott töklámpás +Floating Crystal=LebegÅ‘ kristály +Bamboo=Bambusz +Pyrite Glass Pane=Piritüveg-lap +Quartz Block Stair=Csiszolt blokk-lépcsÅ‘ +Quartz Block Slab=Csiszolt blokk-kÅ‘ +Quartz Chiseled Stair=Csiszolt kvarc-lépcsÅ‘ +Quartz Chiseled Slab=Csiszolt kvarc-lap +Quartz Pillar Stair=Kvarcoszlop-lépcsÅ‘ +Quartz Pillar Slab=Kvarcoszlop-lap +Dry Wood Stair=Elszáradt fa-lépcsÅ‘ +Dry Wood Slab=Elszáradt fa-lap +Bamboo Wood Stair=Bambusz fa-lépcsÅ‘ +Bamboo Wood Slab=Bambusz fa-lap +Bamboo Mosaic Wood Stair=Bambuszmozaik fa-lépcsÅ‘ +Bamboo Mosaic Wood Slab=Bambuszmozaik fa-lap +Forsaken Desert Brick Stair=Elhagyatott sivatagi tégla-lépcsÅ‘ +Forsaken Desert Brick Slab=Elhagyatott sivatagi tégla-lap +Forsaken Desert Brick Red Stair=Elhagyatott sivatagi tégla-lépcsÅ‘, vörös +Forsaken Desert Brick Red Slab=Elhagyatott sivatagi tégla-lap, vörös +Forsaken Desert Chiseled Stone Stair=Elhagyatott sivatagi csiszolt kÅ‘-lépcsÅ‘ +Forsaken Desert Chiseled Stone Slab=Elhagyatott sivatagi csiszolt kÅ‘-lap +Baobab Wood Stair=Baobabfa-lépcsÅ‘ +Baobab Wood Slab=Baobabfa-lap +Sequoia Wood Stair=MammutfenyÅ‘-lépcsÅ‘ +Sequoia Wood Slab=MammutfenyÅ‘-lap +Forsaken Tundra Cobblestone Stair=Elhagyatott tundrai macskakÅ‘-lépcs +Forsaken Tundra Cobblestone Slab=Elhagyatott tundrai macskakÅ‘-lap +Forsaken Tundra Stone Stair=Elhagyatott tundrai kÅ‘-lépcsÅ‘ +Forsaken Tundra Stone Slab=Elhagyatott tundrai kÅ‘-lap +Forsaken Tundra Brick Stair=Elhagyatott tundrai tégla-lépcsÅ‘ +Forsaken Tundra Brick Slab=Elhagyatott tundrai tégla-lap +Willow Wood Stair=Fűzfa-lépcsÅ‘ +Willow Wood Slab=Fűzfa-lap +Magma Cobblestone Stair=Magmás macskakÅ‘-lépcsÅ‘ +Magma Cobblestone Slab=Magmás macskakÅ‘-lap +Volcanic Rock Stair=Vulkanikus kÅ‘zet-lépcsÅ‘ +Volcanic Rock Slab=Vulkanikus kÅ‘zet-lap +Volcanic Rock with Magma Stair=Magmás vulkanikus kÅ‘zet-lépcsÅ‘ +Volcanic Rock with Magma Slab=Magmás vulkanikus kÅ‘zet-lap +Vine Shears=Inda-metszÅ‘olló +Cave Vine=Barlangi inda +Cave Vine with Mese Leaves=Barlangi inda mese-levelekkel +Whispering Gourd Vine=Suttogó tök-inda +Bulb Vine=RügyezÅ‘ inda +Willow Vine=Fűzfainda +Eye Vine=Szem-inda +Lumabus Vine=Lumabus-inda +Ivis Vine=Ivis-inda +Flowered Vine=Virágzó inda +Reeds Vine=Nádinda +Twisted Vine=Csavarodott inda +Golden Vine=Arany inda +Dense Vine=Sűrű inda +Coral Cobblestone Wall=Korall macskakÅ‘-fal +Coral Mossy Cobblestone Wall=Korall macskakÅ‘-fal, mohos +Cursed Brick Wall=Elátkozott tégla-fal +Forsaken Tundra Cobblestone Wall=Elhagyatott tundrai macskakÅ‘-fal +Forsaken Tundra Stone Wall=Elhagyatott tundrai kÅ‘fal +Forsaken Tundra Brick Wall=Elhagyatott tundrai téglafal +Magma Cobblestone Wall=Magmás macskakÅ‘-fal +Volcanic Rock Wall=Vulkanikus kÅ‘zetfal +Volcanic Rock with Magma Wall=Magmás vulkanikus kÅ‘zetfal diff --git a/mods/everness/locale/template.txt b/mods/everness/locale/template.txt new file mode 100644 index 00000000..3877ceff --- /dev/null +++ b/mods/everness/locale/template.txt @@ -0,0 +1,251 @@ +# textdomain: everness +Quartz Crystal= +Baobab Roasted Fruit= +Pyrite Ingot= +Pyrite Lump= +Bamboo Door= +Bamboo Trapdoor= +Bamboo Wood Fence Gate= +Bone Pyrit Door= +Willow Door= +Dry Wood Fence= +Dry Wood Fence Rail= +Dry Wood Mese Post Light= +Bamboo Wood Fence= +Bamboo Wood Fence Rail= +Bamboo Wood Mese Post Light= +Pyrite Ore= +Pyrite Block= +Forged Pyrite Block= +Pyrite Brick= +Pyrite Slab Brick= +Pyrite Spiral= +Pyrite Pillar Bottom= +Pyrite Pillar Middle= +Pyrite Pillar Top= +Pyrite Pillar Small= +Polished Pyrite Block= +Quartz Ore= +Coral Desert Stone= +Coral Bones= +Coral Desert Cobblestone= +Coral Mossy Cobblestone= +Coral Desert Stone with Moss= +Forsaken Desert Stone= +Forsaken Desert Cobblestone Red= +Forsaken Desert Cobblestone= +Volcanic Rock= +Volcanic Rock with Magma= +Cursed Stone= +Cursed Brick= +Volcanic Sulfur Stone= +Sulfur Stone= +Forsaken Tundra Cobblestone= +Forsaken Tundra Stone= +Mold Cobble= +Forsaken Tundra Brick= +Forsaken Tundra Rocks= +Blue Crying Obsidian= +Blue Weeping Obsidian= +Weeping Obsidian= +Mold Stone= +Soul Sandstone= +Soul Sandstone Veined= +Purple Crystal Block= +Orange Crystal Block= +Quartz Block= +Chiseled Quartz= +Quartz Pillar= +Forsaken Desert Brick= +Forsaken Desert Brick Red= +Forsaken Desert Chiseled Stone= +Forsaken Desert Engraved Stone= +Coral Dirt= +Cursed Dirt= +Crystal Dirt= +Forsaken Tundra Dirt= +Forsaken Tundra Dirt with Grass= +Dirt with Coral Grass= +Dirt with Cursed Grass= +Dirt with Crystal Grass= +Dry Ocean Dirt= +Dirt= +Dirt with Grass= +Crystal Cave Dirt= +Crystal Cave Dirt with Moss= +Moss Block= +Crystal Moss Block= +Coral Sand= +Coral White Sand= +Cursed Sand= +Crystal Sand= +Forsaken Tundra Beach Sand= +Forsaken Tundra Beach Sand with Shells= +Forsaken Desert Sand= +Frosted Snow Block= +Frosted Ice= +Frosted Ice Translucent= +Frosted Cave Ice= +Bone= +Ancient Emerald Ice= +Dense Emerald Ice= +Emerald Ice= +Cursed Mud= +Cobweb= +Cave Flower= +Cave Flower with Particles= +Forsaken Fire= +Coral Tree Trunk= +Coral Tree Bioluminescent= +Cursed Dream Stone= +Dry Tree Trunk= +Baobab Tree Trunk= +Sequoia Tree Trunk= +Willow Tree Trunk= +Willow Wood Planks= +Dry Wood Planks= +Hollow Tree Trunk= +Crystal Tree Trunk= +Mese Tree Trunk= +Baobab Tree Leaves= +Sequoia Tree Leaves= +Baobab Fruit= +Baobab Fruit Marker= +Baobab Sapling= +Willow Tree Leaves= +Coral Tree Leaves= +Dry Tree Branches= +Crystal Tree Leaves= +Coral Tree Sapling= +Coral Tree Bioluminescent Sapling= +Dry Tree Sapling= +Cursed Dream Tree Sapling= +Sequoia Tree Sapling= +Crystal Tree Sapling= +Crystal Tree Large Sapling= +Crystal Bush Stem= +Crystal Bush Leaves= +Crystal Bush Sapling= +Cursed Bush Stem= +Cursed Bush Leaves= +Cursed Bush Sapling= +Coral Burdock= +Coral Bush= +Coral Shrub= +Orange Coral Grass= +Globulagus= +Tall Coral Grass= +Purple Crystal= +Orange Crystal= +Cyan Crystal= +Coral Plant Bioluminescent= +Blooming Cooksonia= +Creeping Moss Spores= +Frosted Icicle= +Frosted Icicle Floor= +Coral Grass= +Red Castor= +Crystal Mushrooms= +Twisted Crystal Grass= +Crystal Grass= +Marsh Grass= +Forsaken Plant= +Blue Cactus= +Cave Barrel Cactus= +Venus Trap Plant= +Illumi Root= +Crystal Waterlily= +Orange Cactus= +Agave Leaf= +Egg plant= +Ivis Moss= +Ngrass= +Bamboo Sprout= +Blood Spoore Plant= +Blood Spoore Plant Small= +Termite Block= +Bamboo Block= +Bamboo Planks= +Bamboo Mosaic= +Baobab Wood Planks= +Sequoia Wood Planks= +Coral Corals= +Coral Frosted= +Coral Starfish= +Spine Kelp= +Crystal Coral Dark= +Crystal Coral Light= +Skull with Candle= +Forsythia Bush= +Glowing Pillar= +Blue Vine Lantern= +Amaranita Lantern= +Lumecorn= +Tinted Glass Red= +Pyrite Lantern= +Pyrite Glass= +Lumabus Vine Lantern= +Eye Vine Lantern= +Cursed Pumpkin Lantern= +Floating Crystal= +Bamboo= +Pyrite Glass Pane= +Quartz Block Stair= +Quartz Block Slab= +Quartz Chiseled Stair= +Quartz Chiseled Slab= +Quartz Pillar Stair= +Quartz Pillar Slab= +Dry Wood Stair= +Dry Wood Slab= +Bamboo Wood Stair= +Bamboo Wood Slab= +Bamboo Mosaic Wood Stair= +Bamboo Mosaic Wood Slab= +Forsaken Desert Brick Stair= +Forsaken Desert Brick Slab= +Forsaken Desert Brick Red Stair= +Forsaken Desert Brick Red Slab= +Forsaken Desert Chiseled Stone Stair= +Forsaken Desert Chiseled Stone Slab= +Baobab Wood Stair= +Baobab Wood Slab= +Sequoia Wood Stair= +Sequoia Wood Slab= +Forsaken Tundra Cobblestone Stair= +Forsaken Tundra Cobblestone Slab= +Forsaken Tundra Stone Stair= +Forsaken Tundra Stone Slab= +Forsaken Tundra Brick Stair= +Forsaken Tundra Brick Slab= +Willow Wood Stair= +Willow Wood Slab= +Magma Cobblestone Stair= +Magma Cobblestone Slab= +Volcanic Rock Stair= +Volcanic Rock Slab= +Volcanic Rock with Magma Stair= +Volcanic Rock with Magma Slab= +Vine Shears= +Cave Vine= +Cave Vine with Mese Leaves= +Whispering Gourd Vine= +Bulb Vine= +Willow Vine= +Eye Vine= +Lumabus Vine= +Ivis Vine= +Flowered Vine= +Reeds Vine= +Twisted Vine= +Golden Vine= +Dense Vine= +Coral Cobblestone Wall= +Coral Mossy Cobblestone Wall= +Cursed Brick Wall= +Forsaken Tundra Cobblestone Wall= +Forsaken Tundra Stone Wall= +Forsaken Tundra Brick Wall= +Magma Cobblestone Wall= +Volcanic Rock Wall= +Volcanic Rock with Magma Wall= diff --git a/mods/everness/mapgen.lua b/mods/everness/mapgen.lua new file mode 100644 index 00000000..8a2fbd74 --- /dev/null +++ b/mods/everness/mapgen.lua @@ -0,0 +1,150 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register ores +-- + +-- Scatter ores + +-- Pyrite + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:stone_with_pyrite', + wherein = 'default:stone', + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, +}) + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:stone_with_pyrite', + wherein = 'default:stone', + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -256, + y_min = -511, +}) + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:stone_with_pyrite', + wherein = 'default:stone', + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -512, + y_min = -31000, +}) + +-- Quartz + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:quartz_ore', + wherein = { 'default:stone' }, + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 6, + clust_size = 5, + y_max = -5, + y_min = -31000, +}) + +-- +-- Decorations +-- + +local all_biomes_mese_tree_place_on = { + 'group:soil', + 'everness:coral_desert_stone_with_moss', + 'everness:coral_sand', + 'everness:crystal_moss_block', + 'everness:crystal_sand', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone', + 'everness:dirt_with_coral_grass', + 'everness:dirt_with_crystal_grass', + 'everness:dirt_with_cursed_grass', + 'everness:dirt_with_grass_1', + 'everness:dry_dirt', + 'everness:dry_dirt_with_dry_grass', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_engraved_stone', + 'everness:forsaken_desert_sand', + 'everness:forsaken_tundra_beach_sand', + 'everness:forsaken_tundra_dirt', + 'everness:forsaken_tundra_dirt_with_grass', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + 'everness:frosted_snowblock', + 'everness:sulfur_stone', + 'everness:volcanic_sulfur' +} + +if minetest.get_modpath('default') then + table.insert_all(all_biomes_mese_tree_place_on, { + 'default:desert_sand', + 'default:dirt', + 'default:dirt_with_coniferous_litter', + 'default:dirt_with_grass', + 'default:dirt_with_rainforest_litter', + 'default:dirt_with_snow', + 'default:dry_dirt', + 'default:dry_dirt_with_dry_grass', + 'default:gravel', + 'default:permafrost_with_moss', + 'default:permafrost_with_stones', + 'default:sand', + 'default:silver_sand', + 'default:stone' + }) +end + +if minetest.get_modpath('asuna_core') then + for name,def in pairs(asuna.biomes) do + if def.nodes[1] ~= 'default:stone' then + table.insert(all_biomes_mese_tree_place_on,def.nodes[1]) + end + end +end + +minetest.register_decoration({ + name = 'everness:all_biomes_mese_tree_2', + deco_type = 'schematic', + place_on = all_biomes_mese_tree_place_on, + sidelen = 8, + noise_params = { + offset = -0.00675, + scale = 0.0087125, + spread = { x = 5, y = 5, z = 5 }, + seed = 137, + octaves = 2, + persist = 0.675, + lacunarity = 1.36, + }, + y_max = 31000, + y_min = 80, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_mese_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random' +}) \ No newline at end of file diff --git a/mods/everness/mapgen_after.lua b/mods/everness/mapgen_after.lua new file mode 100644 index 00000000..28e1c2ef --- /dev/null +++ b/mods/everness/mapgen_after.lua @@ -0,0 +1,247 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- Localize data buffer table outside the loop, to be re-used for all +-- mapchunks, therefore minimising memory use. +local data = {} +local p2data = {} + +minetest.register_on_generated(function(minp, maxp, blockseed) + -- Start time of mapchunk generation. + -- local t0 = os.clock() + local rand = PcgRandom(blockseed) + -- Array containing the biome IDs of nodes in the most recently generated chunk by the current mapgen + local biomemap = minetest.get_mapgen_object('biomemap') + -- Table mapping requested generation notification types to arrays of positions at which the corresponding generated structures are located within the current chunk + local gennotify = minetest.get_mapgen_object('gennotify') + -- Load the voxelmanip with the result of engine mapgen + local vm, emin, emax = minetest.get_mapgen_object('voxelmanip') + -- 'area' is used later to get the voxelmanip indexes for positions + local area = VoxelArea:new({ MinEdge = emin, MaxEdge = emax }) + -- Get the content ID data from the voxelmanip in the form of a flat array. + -- Set the buffer parameter to use and reuse 'data' for this. + vm:get_data(data) + -- Raw `param2` data read into the `VoxelManip` object + vm:get_param2_data(p2data) + -- Side length of mapchunk + local shared_args = {} + + -- + -- on_data + -- + -- read/write to `data` what will be eventually saved (set_data) + -- used for voxelmanip `data` manipulation + for _, def in ipairs(Everness.on_generated_queue) do + if def.can_run(biomemap) and def.on_data then + shared_args[def.name] = shared_args[def.name] or {} + def.on_data(minp, maxp, area, data, p2data, gennotify, rand, shared_args[def.name]) + end + end + + -- set data after they have been manipulated (from above) + vm:set_data(data) + vm:set_param2_data(p2data) + + -- + -- after_set_data + -- + -- read-only (but cant and should not manipulate) voxelmanip `data` + -- used for `place_schematic_on_vmanip` which will invalidate `data` + -- therefore we are doing it after we set the data + for _, def in ipairs(Everness.on_generated_queue) do + if def.can_run(biomemap) and def.after_set_data then + shared_args[def.name] = shared_args[def.name] or {} + def.after_set_data(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args[def.name]) + end + end + + -- Set the lighting within the `VoxelManip` to a uniform value + vm:set_lighting({ day = 0, night = 0 }, minp, maxp) + -- Calculate lighting for what has been created. + vm:calc_lighting() + -- Liquid nodes were placed so set them flowing. + vm:update_liquids() + -- Write what has been created to the world. + vm:write_to_map() + + -- + -- after_write_to_map + -- + -- Cannot read/write voxelmanip or its data + -- Used for direct manipulation of the world chunk nodes where the + -- definitions of nodes are available and node callback can be executed + -- or e.g. for `minetest.fix_light` + for _, def in ipairs(Everness.on_generated_queue) do + if def.can_run(biomemap) and def.after_write_to_map then + shared_args[def.name] = shared_args[def.name] or {} + def.after_write_to_map(shared_args[def.name], gennotify, rand) + end + end + + -- Print generation time of this mapchunk. + -- local chugent = math.ceil((os.clock() - t0) * 1000) + -- print('[Everness] Mapchunk generation time ' .. chugent .. ' ms') +end) + +local mpath = minetest.get_modpath('everness') + +-- +-- Giant Sequoia Tree +-- + +local sequoia_tree_schem = minetest.get_modpath('everness') .. '/schematics/everness_giant_sequoia_tree.mts' + +abdecor.register_advanced_decoration('everness_giant_sequoia_tree',{ + target = { + place_on = { + 'default:dirt_with_coniferous_litter', + 'default:dirt_with_snow', + 'default:dirt_with_dry_grass', + }, + spawn_by = { + 'default:dirt_with_coniferous_litter', + 'default:dirt_with_snow', + 'default:dirt_with_dry_grass', + }, + num_spawn_by = 8, + sidelen = 80, + fill_ratio = 0.000095, + y_max = 31000, + y_min = 8, + biomes = { + 'mesa', + 'taiga', + 'coniferous_forest', + }, + }, + fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + local ystride = va.ystride + local zstride = va.zstride + + -- Check that there is likely enough space to place a tree + local vpos = va:index(pos.x,pos.y,pos.z) + for i = 2, 20 do -- y + if vdata[vpos + ystride * i] ~= minetest.CONTENT_AIR then + return -- not enough ceiling clearance + end + end + for i = -6, 6 do -- x + if vdata[vpos + i] == minetest.CONTENT_AIR then + return -- not enough space in the x dimension + end + end + for i = -6, 6 do -- z + if vdata[vpos + i * zstride] == minetest.CONTENT_AIR then + return -- not enough space in the z dimension + end + end + + -- Roughly enough space, emerge mapchunks and place a sequoia tree + minetest.emerge_area( + vector.new(pos.x - 12, pos.y, pos.z - 12), + vector.new(pos.x + 12, pos.y + 75, pos.z + 12), + function(blockpos, action, calls_remaining, param) + Everness:emerge_area(blockpos, action, calls_remaining, param) + end, + { + callback = function() + -- Place sequoia tree + minetest.place_schematic( + pos, + sequoia_tree_schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- Fix lighting + minetest.fix_light( + { x = pos.x - 12, y = pos.y, z = pos.z - 12}, + { x = pos.x + 12, y = pos.y + 75, z = pos.z + 12}, + true + ) + end + } + ) + end, +}) + +-- +-- Underground Mese Tree +-- + +local mese_tree_schem = minetest.get_modpath('everness') .. '/schematics/everness_mese_tree.mts' + +abdecor.register_advanced_decoration('everness_mese_tree_underground',{ + target = { + place_on = 'everness:moss_block', + sidelen = 80, + fill_ratio = 0.0000125, + y_max = -300, + y_min = -31000, + biomes = asuna.features.cave.bamboo, + flags = 'all_floors', + }, + fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + local ystride = va.ystride + local zstride = va.zstride + + -- Check that there is likely enough space to place a tree + local vpos = va:index(pos.x,pos.y,pos.z) + for i = 2, 10 do -- y + if vdata[vpos + ystride * i] ~= minetest.CONTENT_AIR then + return -- not enough ceiling clearance + end + end + vpos = vpos + ystride * 5 + for i = -3, 3 do -- x + if vdata[vpos + i] ~= minetest.CONTENT_AIR then + return -- not enough space in the x dimension + end + end + for i = -3, 3 do -- z + if vdata[vpos + i * zstride] ~= minetest.CONTENT_AIR then + return -- not enough space in the z dimension + end + end + + -- Roughly enough space, place a mese tree + mapgen.place_schematic({ + pos = pos, + schematic = mese_tree_schem, + flags = 'place_center_x,place_center_z', + }) + + -- Fix lighting + mapgen.calc_lighting( + { x = pos.x - 3, y = pos.y, z = pos.z - 3 }, + { x = pos.x + 3, y = pos.y + 10, z = pos.z + 3 }, + true + ) + end, + flags = { + schematic = true, + } +}) \ No newline at end of file diff --git a/mods/everness/mapgen_bamboo_forest.lua b/mods/everness/mapgen_bamboo_forest.lua new file mode 100644 index 00000000..459b183a --- /dev/null +++ b/mods/everness/mapgen_bamboo_forest.lua @@ -0,0 +1,448 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_bamboo_forest.y_max +local y_min = Everness.settings.biomes.everness_bamboo_forest.y_min + +-- Bamboo Forest + +Everness:register_biome({ + name = 'everness:bamboo_forest', + node_top = 'everness:dirt_with_grass_1', + depth_top = 1, + node_filler = 'everness:dirt_1', + depth_filler = 1, + node_riverbed = 'default:sand', + depth_riverbed = 2, + node_dungeon = 'everness:bamboo_wood', + node_dungeon_alt = 'everness:bamboo_mosaic_wood', + node_dungeon_stair = 'stairs:stair_bamboo_wood', + y_max = y_max, + y_min = y_min, + heat_point = 80, + humidity_point = 60, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:bamboo_forest_small_bamboo', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 80, + fill_ratio = 0.1, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_small_bamboo.mts', + flags = 'place_center_x, place_center_z, force_placement', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_large_bamboo', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 80, + fill_ratio = 0.1, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_large_bamboo.mts', + flags = 'place_center_x, place_center_z, force_placement', + rotation = 'random', +}) + +-- Jungle tree and log + +local jungle_tree_schem +local jungle_log_schem + +if minetest.get_modpath('default') then + jungle_tree_schem = minetest.get_modpath('default') .. '/schematics/jungle_tree.mts' + jungle_log_schem = minetest.get_modpath('default') .. '/schematics/jungle_log.mts' +elseif minetest.get_modpath('mcl_core') then + jungle_tree_schem = minetest.get_modpath('mcl_core') .. '/schematics/mcl_core_jungle_tree.mts' + jungle_log_schem = { + size = { x = 3, y = 3, z = 1 }, + data = { + { name = 'air', prob = 0 }, + { name = 'air', prob = 0 }, + { name = 'air', prob = 0 }, + { name = 'mcl_core:jungletree', param2 = 12 }, + { name = 'mcl_core:jungletree', param2 = 12 }, + { name = 'mcl_core:jungletree', param2 = 12, prob = 127 }, + { name = 'air', prob = 0 }, + { name = 'mcl_mushrooms:mushroom_brown', prob = 50 }, + { name = 'air', prob = 0 }, + }, + } +end + +if jungle_tree_schem then + Everness:register_decoration({ + name = 'everness:bamboo_forest_jungle_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + fill_ratio = 0.0125, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = jungle_tree_schem, + flags = 'place_center_x, place_center_z', + rotation = 'random', + }) +end + +if jungle_log_schem then + Everness:register_decoration({ + name = 'everness:bamboo_forest_jungle_log', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = jungle_log_schem, + flags = 'place_center_x', + rotation = 'random', + spawn_by = 'everness:dirt_with_grass_1', + num_spawn_by = 8, + }) +end + +-- Bush + +if minetest.get_modpath('default') then + Everness:register_decoration({ + name = 'everness:bamboo_forest_grass', + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 80, + fill_ratio = 0.4, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'default:grass_4', + 'default:grass_5', + }, + }) + + Everness:register_decoration({ + name = 'everness:bamboo_forest_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('default') .. '/schematics/bush.mts', + flags = 'place_center_x, place_center_z', + }) + + -- Blueberry bush + + Everness:register_decoration({ + name = 'everness:bamboo_forest_blueberry_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + place_offset_y = 1, + schematic = minetest.get_modpath('default') .. '/schematics/blueberry_bush.mts', + flags = 'place_center_x, place_center_z', + }) +end + +-- Flowers +local function register_flower_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_flowers_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:flowers_' .. length, + }) +end + +register_flower_decoration(-0.03, 0.09, 4) +register_flower_decoration(-0.015, 0.075, 3) +register_flower_decoration(0, 0.06, 2) +register_flower_decoration(0.015, 0.045, 1) + +local function register_flower_magenta_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_flowers_magenta' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:flowers_magenta_' .. length, + }) +end + +register_flower_magenta_decoration(-0.03, 0.09, 4) +register_flower_magenta_decoration(-0.015, 0.075, 3) +register_flower_magenta_decoration(0, 0.06, 2) +register_flower_magenta_decoration(0.015, 0.045, 1) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 20 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_japanese_shrine.mts' + +local c_everness_bamboo_1 = minetest.get_content_id('everness:bamboo_1') +local c_everness_bamboo_3 = minetest.get_content_id('everness:bamboo_3') +local c_everness_bamboo_4 = minetest.get_content_id('everness:bamboo_4') +local c_everness_bamboo_5 = minetest.get_content_id('everness:bamboo_5') +local c_dirt_with_grass_1 = minetest.get_content_id('everness:dirt_with_grass_1') +local c_dirt_with_grass_extras_1 = minetest.get_content_id('everness:dirt_with_grass_extras_1') +local c_dirt_with_grass_extras_2 = minetest.get_content_id('everness:dirt_with_grass_extras_2') + +local biome_id_bamboo_forest = minetest.get_biome_id('everness:bamboo_forest') + +local d_everness_bamboo_forest_large_bamboo = minetest.get_decoration_id('everness:bamboo_forest_large_bamboo') + +minetest.set_gen_notify({ decoration = true }, { d_everness_bamboo_forest_large_bamboo }) + +Everness:add_to_queue_on_generated({ + name = 'everness:bamboo_forest', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_bamboo_forest) ~= -1 + end, + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + -- + -- Bamboo + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_bamboo_forest_large_bamboo or '')] or {}) do + -- For bamboo large this is position of the 'place_on' node, e.g. 'everness:dirt_with_grass_extras_2' + local vi = area:indexp(pos) + local while_counter = 1 + local bamboo_height = 0 + local last_vi = vi + area.ystride * while_counter + + -- Get bamboo height + while data[last_vi] == c_everness_bamboo_3 do + last_vi = vi + area.ystride * while_counter + bamboo_height = bamboo_height + 1 + while_counter = while_counter + 1 + end + + -- Back up the last from `while_counter` + last_vi = last_vi - area.ystride + + -- Add top bamboo nodes with leaves based on their generated height + if bamboo_height > 4 then + for i = 1, 3 do + if data[last_vi + area.ystride * i] == minetest.CONTENT_AIR then + if i == 1 then + data[last_vi + area.ystride * i] = c_everness_bamboo_4 + else + data[last_vi + area.ystride * i] = c_everness_bamboo_5 + end + + p2data[last_vi + area.ystride * i] = p2data[vi + area.ystride] + end + end + else + for i = 1, 2 do + if data[last_vi + area.ystride * i] == minetest.CONTENT_AIR then + if i == 1 then + data[last_vi + area.ystride * i] = c_everness_bamboo_4 + else + data[last_vi + area.ystride * i] = c_everness_bamboo_5 + end + + p2data[last_vi + area.ystride * i] = p2data[vi + area.ystride] + end + end + end + end + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if + ( + data[vi + area.ystride] == minetest.CONTENT_AIR + or data[vi + area.ystride] == c_everness_bamboo_1 + or data[vi + area.ystride] == c_everness_bamboo_3 + ) + and ( + data[vi] == c_dirt_with_grass_1 + or data[vi] == c_dirt_with_grass_extras_1 + or data[vi] == c_dirt_with_grass_extras_2 + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Japanese Shrine + -- + + local size = { x = 11, y = 19, z = 15 } + local size_x = math.round(size.x / 2) + local size_z = math.round(size.z / 2) + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_grass_1' + } + ) + -- Can force over these blocks + local force_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_grass_extras_1', + 'everness:dirt_with_grass_extras_2', + 'group:bamboo', + 'group:flower', + 'group:leaves' + } + ) + + if #positions + #force_positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air', + 'group:bamboo', + 'group:flower', + 'group:leaves' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_japanese_shrine = shared_args.schem_positions.everness_japanese_shrine or {} + + table.insert(shared_args.schem_positions.everness_japanese_shrine, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Japanese Shrine was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_bamboo_forest_under.lua b/mods/everness/mapgen_bamboo_forest_under.lua new file mode 100644 index 00000000..8cbc8da8 --- /dev/null +++ b/mods/everness/mapgen_bamboo_forest_under.lua @@ -0,0 +1,173 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_bamboo_forest_under.y_max +local y_min = Everness.settings.biomes.everness_bamboo_forest_under.y_min + +-- Bamboo Forest Under + +Everness:register_biome({ + name = 'everness:bamboo_forest_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:bamboo_wood', + node_dungeon_alt = 'everness:bamboo_mosaic_wood', + node_dungeon_stair = 'stairs:stair_bamboo_wood', + y_max = y_max, + y_min = y_min, + heat_point = 80, + humidity_point = 60, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 10, + biomes = asuna.features.cave.bamboo, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'all_floors,force_placement', + decoration = { + 'everness:moss_block', + 'default:clay' + }, +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_ceiling', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.bamboo, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { 'everness:moss_block' }, +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_forsythia_bush', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.bamboo, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { 'everness:forsythia_bush' }, +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + decoration = { + 'everness:vine_cave', + 'everness:vine_cave_with_mese_leaves' + }, + biomes = asuna.features.cave.bamboo, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_plants', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + param2 = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.bamboo, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:cave_flower' }, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_plants_2', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + param2 = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.bamboo, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = { 'everness:cave_flower_with_particles' }, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_blue_vine_lantern', + deco_type = 'simple', + place_on = { + 'everness:moss_block', + 'default:clay' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.bamboo, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + decoration = { 'everness:blue_vine_lantern' }, + flags = 'all_floors', +}) diff --git a/mods/everness/mapgen_baobab_savanna.lua b/mods/everness/mapgen_baobab_savanna.lua new file mode 100644 index 00000000..7368217e --- /dev/null +++ b/mods/everness/mapgen_baobab_savanna.lua @@ -0,0 +1,289 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_baobab_savanna.y_max +local y_min = Everness.settings.biomes.everness_baobab_savanna.y_min + +-- Baobab Savanna + +Everness:register_biome({ + name = 'everness:baobab_savanna', + node_top = 'everness:dry_dirt_with_dry_grass', + depth_top = 1, + node_filler = 'everness:dry_dirt', + depth_filler = 1, + node_riverbed = 'default:sand', + depth_riverbed = 2, + node_dungeon = 'default:cobble', + node_dungeon_alt = 'default:mossycobble', + node_dungeon_stair = 'stairs:stair_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 80, + humidity_point = 30, +}) + +-- +-- Register decorations +-- + +-- Savanna bare dirt patches. +-- Must come before all savanna decorations that are placed on dry grass. +-- Noise is similar to long dry grass noise, but scale inverted, to appear +-- where long dry grass is least dense and shortest. + +Everness:register_decoration({ + name = 'everness:baobab_savanna_dry_dirt_with_dry_grass', + deco_type = 'simple', + place_on = { 'everness:dry_dirt_with_dry_grass' }, + sidelen = 4, + noise_params = { + offset = -1.5, + scale = -1.5, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 4, + persist = 1.0 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:dry_dirt', + place_offset_y = -1, + flags = 'force_placement', +}) + +Everness:register_decoration({ + name = 'everness:baobab_savanna_baobab_tree_1', + deco_type = 'schematic', + place_on = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + spawn_by = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:baobab_savanna_baobab_tree_2', + deco_type = 'schematic', + place_on = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + spawn_by = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 90155, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:baobab_savanna_baobab_log', + deco_type = 'schematic', + place_on = { 'everness:dry_dirt_with_dry_grass' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = 0, + scale = 0.001, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_baobab_log.mts', + flags = 'place_center_x', + rotation = 'random', + spawn_by = 'everness:dry_dirt_with_dry_grass', + num_spawn_by = 8, +}) + +-- Dry grasses + +local function register_dry_grass_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:dry_grass_' .. length, + deco_type = 'simple', + place_on = { 'everness:dry_dirt_with_dry_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:dry_grass_' .. length, + }) +end + +register_dry_grass_decoration(0.01, 0.05, 4) +register_dry_grass_decoration(0.03, 0.03, 3) +register_dry_grass_decoration(0.05, 0.01, 2) +register_dry_grass_decoration(0.07, -0.01, 1) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 100 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_giant_sequoia_tree.mts' +local size = { x = 25, y = 75, z = 25 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local baobab_tree_size = { x = 24, y = 39, z = 24 } +local baobab_tree_size_x = math.round(size.x / 2) +local baobab_tree_size_z = math.round(size.z / 2) + +local c_everness_dry_dirt_with_dry_grass = minetest.get_content_id('everness:dry_dirt_with_dry_grass') +local c_everness_dry_dirt = minetest.get_content_id('everness:dry_dirt') +local c_everness_dry_grass_1 = minetest.get_content_id('everness:dry_grass_1') +local c_everness_dry_grass_2 = minetest.get_content_id('everness:dry_grass_2') +local c_everness_dry_grass_3 = minetest.get_content_id('everness:dry_grass_3') +local c_everness_dry_grass_4 = minetest.get_content_id('everness:dry_grass_4') + +local biome_id_baobab_savanna = minetest.get_biome_id('everness:baobab_savanna') + +local deco_ids_baobab = { + minetest.get_decoration_id('everness:baobab_savanna_baobab_tree_1'), + minetest.get_decoration_id('everness:baobab_savanna_baobab_tree_2') +} + +if #deco_ids_baobab > 1 then + minetest.set_gen_notify({ decoration = true }, deco_ids_baobab) +end + +Everness:add_to_queue_on_generated({ + name = 'everness:baobab_savanna', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_baobab_savanna) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if ( + data[vi + area.ystride] == minetest.CONTENT_AIR + or data[vi + area.ystride] == c_everness_dry_grass_1 + or data[vi + area.ystride] == c_everness_dry_grass_2 + or data[vi + area.ystride] == c_everness_dry_grass_3 + or data[vi + area.ystride] == c_everness_dry_grass_4 + ) + and ( + data[vi] == c_everness_dry_dirt_with_dry_grass + or data[vi] == c_everness_dry_dirt + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Giant Sequoia + -- + + minetest.emerge_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + function(blockpos, action, calls_remaining, param) + Everness:emerge_area(blockpos, action, calls_remaining, param) + end, + { + callback = function() + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dry_dirt_with_dry_grass', + 'everness:dry_dirt', + 'group:flora', + 'group:flower' + }) + + if #positions < size.x * size.z then + -- not enough space + return + end + + minetest.place_schematic( + s_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + minetest.log('action', '[Everness] Giant Sequoia was placed at ' .. s_pos:to_string()) + end + } + ) + end + end + end, + after_write_to_map = function(shared_args, gennotify) + -- + -- Baobab Tree - fix light + -- + for _, deco_id in ipairs(deco_ids_baobab) do + for _, pos in ipairs(gennotify['decoration#' .. (deco_id or '')] or {}) do + minetest.fix_light( + vector.new(pos.x - baobab_tree_size_x, pos.y - 1, pos.z - baobab_tree_size_z), + vector.new(pos.x + baobab_tree_size_x, pos.y + baobab_tree_size.y, pos.z + baobab_tree_size_z) + ) + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest.lua b/mods/everness/mapgen_coral_forest.lua new file mode 100644 index 00000000..37add94e --- /dev/null +++ b/mods/everness/mapgen_coral_forest.lua @@ -0,0 +1,299 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest.y_max +local y_min = Everness.settings.biomes.everness_coral_forest.y_min + +-- Coral Forest + +Everness:register_biome({ + name = 'everness:coral_forest', + node_top = 'everness:dirt_with_coral_grass', + depth_top = 1, + node_filler = 'everness:coral_dirt', + depth_filler = 1, + node_riverbed = 'everness:coral_dirt', + depth_riverbed = 2, + node_stone = 'everness:coral_desert_stone', + node_dungeon = 'everness:coral_desert_stone_block', + node_dungeon_alt = 'everness:coral_desert_stone_brick', + node_dungeon_stair = 'stairs:stair_coral_desert_stone_block', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_sand', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_dirt', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:coral_desert_stone_with_coal', + wherein = 'everness:coral_desert_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:coral_forest' } +}) + +-- +-- Register decorations +-- + +-- Coral Forest + +local chunksize = tonumber(minetest.get_mapgen_setting('chunksize')) + +if chunksize >= 5 then + Everness:register_decoration({ + name = 'everness:coral_forest_coral_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_coral_grass' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:dirt_with_coral_grass', + num_spawn_by = 8, + }) +end + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_bones_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + place_offset_y = -1, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_bones_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_burdock', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:coral_burdock_1', 'everness:coral_burdock_2' }, + spawn_by = 'everness:coral_tree', + param2 = 8 +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_bush', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_bush' +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_shrub', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_shrub' +}) + +local function register_coral_grass_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:coral_forest_coral_grass_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_grass_' .. length, + }) +end + +-- Grasses + +register_coral_grass_decoration(-0.03, 0.09, 5) +--register_coral_grass_decoration(-0.015, 0.075, 4) +--register_coral_grass_decoration(0, 0.06, 3) +--register_coral_grass_decoration(0.015, 0.045, 2) +--register_coral_grass_decoration(0.03, 0.03, 1) + +minetest.register_decoration({ + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + fill_ratio = 0.6, + biomes = { 'everness_coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:coral_grass_1', + 'everness:coral_grass_2', + 'everness:coral_grass_3', + 'everness:coral_grass_4', + }, +}) + +-- +-- On Generated +-- + +local deco_id_coral_bones_tree = minetest.get_decoration_id('everness:coral_forest_coral_bones_tree') + +local biome_id_coral_forest = minetest.get_biome_id('everness:coral_forest') + +local coral_bones_tree_size = { x = 16, y = 35, z = 16 } + +minetest.set_gen_notify({ decoration = true }, { deco_id_coral_bones_tree }) + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_coral_forest) ~= -1 + end, + after_write_to_map = function(shared_args, gennotify) + -- + -- Coral bone tree - fix light + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_coral_bones_tree or '')] or {}) do + minetest.fix_light( + vector.round(vector.new(pos.x - (coral_bones_tree_size.x / 2), pos.y, pos.z - (coral_bones_tree_size.z / 2))), + vector.round(vector.new(pos.x + (coral_bones_tree_size.x / 2), pos.y + coral_bones_tree_size.y, pos.z + (coral_bones_tree_size.z / 2))) + ) + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_deep_ocean.lua b/mods/everness/mapgen_coral_forest_deep_ocean.lua new file mode 100644 index 00000000..be76c0da --- /dev/null +++ b/mods/everness/mapgen_coral_forest_deep_ocean.lua @@ -0,0 +1,457 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_deep_ocean.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_deep_ocean.y_min + +-- Coral Forest Ocean + +Everness:register_biome({ + name = 'everness:coral_forest_deep_ocean', + node_top = 'everness:coral_forest_deep_ocean_sand', + depth_top = 1, + node_filler = 'everness:coral_forest_deep_ocean_sand', + depth_filler = 3, + node_riverbed = 'everness:coral_forest_deep_ocean_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:coral_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:coral_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_coral_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral Desert Stone + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_desert_stone', + wherein = { 'default:stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.coral_forest, +}) + +-- +-- Register decorations +-- + +-- Coral reef + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_pink', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_cyan', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_green', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_red', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_pink', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_pink.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_cyan', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_green', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_green.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_red', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_red.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_mud', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + fill_ratio = 0.002, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_deep_ocean_mud' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_plants_1', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_forest_deep_ocean_coral_plant_1' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_plants_2', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_forest_deep_ocean_coral_plant_2' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_plants_3', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_forest_deep_ocean_coral_plant_3' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local c_water_source = minetest.get_content_id('mapgen_water_source') +local c_everness_coral_forest_deep_ocean_sand = minetest.get_content_id('everness:coral_forest_deep_ocean_sand') +local c_everness_coral_forest_deep_ocean_coral_plant_1 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_plant_1') +local c_everness_coral_forest_deep_ocean_coral_plant_2 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_plant_2') +local c_everness_coral_forest_deep_ocean_coral_plant_3 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_plant_3') +local c_everness_coral_forest_deep_ocean_coral_1 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_1') +local c_everness_coral_forest_deep_ocean_coral_2 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_2') +local c_everness_coral_forest_deep_ocean_coral_3 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_3') +local c_everness_coral_forest_deep_ocean_coral_4 = minetest.get_content_id('everness:coral_forest_deep_ocean_coral_4') +-- Biome IDs +local biome_id_everness_coral_forest_deep_ocean = {} +for _,biome in ipairs(asuna.features.ocean.coral_forest) do + table.insert(biome_id_everness_coral_forest_deep_ocean,minetest.get_biome_id(biome)) +end + +local chance = 30 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_house.mts' +local size = { x = 11, y = 17, z = 12 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_deep_ocean', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_coral_forest_deep_ocean) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + shared_args.schem_positions = {} + local schem_placed = false + + if rand:next(0, 100) < chance then + for y = maxp.y, minp.y, -1 do + if schem_placed then + break + end + + for z = minp.z, maxp.z do + if schem_placed then + break + end + + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == c_everness_coral_forest_deep_ocean_sand + and data[vi + area.ystride] == c_water_source + then + local s_pos = area:position(vi) + + -- + -- Coral Forest Deep Ocean House + -- + + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_everness_coral_forest_deep_ocean_sand, + c_everness_coral_forest_deep_ocean_coral_plant_1, + c_everness_coral_forest_deep_ocean_coral_plant_2, + c_everness_coral_forest_deep_ocean_coral_plant_3, + c_everness_coral_forest_deep_ocean_coral_1, + c_everness_coral_forest_deep_ocean_coral_2, + c_everness_coral_forest_deep_ocean_coral_3, + c_everness_coral_forest_deep_ocean_coral_4 + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough water to place structure ? + local water_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source + }, + data, + area + ) + + if #water_indexes > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + schem_placed = true + + shared_args.schem_positions.everness_coral_forest_deep_ocean_house = shared_args.schem_positions.everness_coral_forest_deep_ocean_house or {} + + table.insert(shared_args.schem_positions.everness_coral_forest_deep_ocean_house, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Coral Forest Deep Ocean House was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_dunes.lua b/mods/everness/mapgen_coral_forest_dunes.lua new file mode 100644 index 00000000..93122dd7 --- /dev/null +++ b/mods/everness/mapgen_coral_forest_dunes.lua @@ -0,0 +1,303 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_dunes.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_dunes.y_min + +-- Coral Forest Dunes + +Everness:register_biome({ + name = 'everness:coral_forest_dunes', + node_top = 'everness:coral_sand', + depth_top = 1, + node_filler = 'everness:coral_sand', + depth_filler = 3, + node_riverbed = 'everness:coral_sand', + depth_riverbed = 2, + node_stone = 'everness:coral_desert_stone', + node_dungeon = 'everness:coral_sandstone', + node_dungeon_alt = 'everness:coral_sandstone_brick', + node_dungeon_stair = 'stairs:stair_coral_sandstone', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_sand', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_dunes' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_dirt', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_dunes' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:coral_desert_stone_with_coal', + wherein = 'everness:coral_desert_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:coral_forest_dunes' } +}) + +-- +-- Register decorations +-- + +-- Coral Forest Dunes + +Everness:register_decoration({ + name = 'everness:coral_forest_dunes_coral_volcano', + deco_type = 'schematic', + place_on = { 'everness:coral_sand' }, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = { x = 100, y = 100, z = 100 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('x_clay') + and minetest.get_modpath('everness') .. '/schematics/everness_coral_volcano_x_clay.mts' + or minetest.get_modpath('everness') .. '/schematics/everness_coral_volcano.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:coral_sand', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_dunes_coral_bush', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_dunes' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_bush' +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_dunes_coral_shrub', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_dunes' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_shrub' +}) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 5 +local water_level = tonumber(minetest.settings:get('water_level')) or 1 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_ocean_fishing_dock.mts' +local size = { x = 26, y = 10, z = 23 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_water_source = minetest.get_content_id('mapgen_water_source') + +local biome_id_everness_coral_forest_dunes = minetest.get_biome_id('everness:coral_forest_dunes') + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_dunes', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_coral_forest_dunes) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + if rand:next(0, 100) < chance then + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and data[vi] == c_water_source + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + local s_pos = area:position(vi) + + -- + -- Coral Forest Ocean Fishing Dock + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock = shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock or {} + + table.insert(shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Coral Forest Ocean Fishing Dock was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_ocean.lua b/mods/everness/mapgen_coral_forest_ocean.lua new file mode 100644 index 00000000..f22ff99a --- /dev/null +++ b/mods/everness/mapgen_coral_forest_ocean.lua @@ -0,0 +1,284 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_ocean.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_ocean.y_min + +-- Coral Forest Ocean + +Everness:register_biome({ + name = 'everness:coral_forest_ocean', + node_top = 'everness:coral_white_sand', + depth_top = 1, + node_filler = 'everness:coral_white_sand', + depth_filler = 3, + node_riverbed = 'everness:coral_white_sand', + depth_riverbed = 2, + node_stone = 'everness:coral_desert_stone', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:coral_desert_cobble', + node_dungeon_alt = 'everness:coral_desert_mossy_cobble', + node_dungeon_stair = 'stairs:stair_coral_desert_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Clay + +Everness:register_ore({ + ore_type = 'blob', + ore = 'default:clay', + wherein = { 'everness:coral_white_sand' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.coral_forest +}) + +-- Coral sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_sand', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.coral_forest +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_dirt', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.coral_forest +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:coral_desert_stone_with_coal', + wherein = 'everness:coral_desert_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = asuna.features.ocean.coral_forest +}) + +-- +-- Register decorations +-- + +-- Coral Forest Under + +-- Coral reef + +Everness:register_decoration({ + name = 'everness:coral_forest_ocean_corals', + deco_type = 'simple', + place_on = { 'everness:coral_white_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.coral_forest, + y_max = y_max - 5 > y_min and y_max - 5 or y_max, + y_min = y_max - 11 > y_min and y_max - 11 or y_min, + flags = 'force_placement', + decoration = { + 'everness:coral_corals', + 'everness:coral_jellyfish', + 'everness:coral_skeleton' + }, +}) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 5 +local water_level = tonumber(minetest.settings:get('water_level')) or 1 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_coral_forest_ocean_fishing_dock.mts' +local size = { x = 26, y = 10, z = 23 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_water_source = minetest.get_content_id('mapgen_water_source') + +local biome_id_everness_coral_forest_ocean = minetest.get_biome_id('everness:coral_forest_ocean') + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_ocean', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_coral_forest_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + if rand:next(0, 100) < chance then + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and data[vi] == c_water_source + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + local s_pos = area:position(vi) + + -- + -- Coral Forest Ocean Fishing Dock + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock = shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock or {} + + table.insert(shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Coral Forest Ocean Fishing Dock was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_under.lua b/mods/everness/mapgen_coral_forest_under.lua new file mode 100644 index 00000000..4ea14465 --- /dev/null +++ b/mods/everness/mapgen_coral_forest_under.lua @@ -0,0 +1,299 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_under.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_under.y_min + +-- Coral Forest Under + +Everness:register_biome({ + name = 'everness:coral_forest_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:coral_desert_cobble', + node_dungeon_alt = 'everness:coral_desert_mossy_cobble', + node_dungeon_stair = 'stairs:stair_coral_desert_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral Desert Stone + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_desert_stone', + wherein = { 'default:stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.cave.coral_forest +}) + +-- +-- Register decorations +-- + +-- Coral Forest Under + +Everness:register_decoration({ + name = 'everness:coral_forest_under_desert_stone_with_moss_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 10, + biomes = asuna.features.cave.coral_forest, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:coral_desert_stone_with_moss' + }, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_mold_stone_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.coral_forest, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_coral_tree_bioluminescent', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.coral_forest, + y_max = y_max - 1000, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_coral_plant_bioluminescent', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + param2 = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.coral_forest, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_plant_bioluminescent', + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_lumecorn', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.coral_forest, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = 'everness:lumecorn', + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = asuna.features.cave.coral_forest, + param2 = 8, + decoration = { + 'everness:lumabus_vine_1', + 'everness:lumabus_vine_2', + 'everness:flowered_vine_1', + 'everness:flowered_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_plants', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.coral_forest, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:coral_grass_orange', + 'everness:globulagus', + 'everness:coral_grass_tall', + }, + flags = 'all_floors', +}) + +-- +-- On Generated +-- + +local biome_id_everness_coral_forest_under = {} +for _,biome in ipairs(asuna.features.cave.coral_forest) do + table.insert(biome_id_everness_coral_forest_under,minetest.get_biome_id(biome)) +end + +local deco_id_coral_forest_under_coral_tree_bioluminescent = minetest.get_decoration_id('everness:coral_forest_under_coral_tree_bioluminescent') + +local schem_bioluminescent_tree = minetest.get_modpath('everness') .. '/schematics/everness_coral_tree_bioluminescent.mts' +local coral_bioluminescent_tree_size = { x = 15, y = 17, z = 15 } +local bioluminescent_tree_size_x = math.round(coral_bioluminescent_tree_size.x / 2) +local bioluminescent_tree_size_z = math.round(coral_bioluminescent_tree_size.z / 2) +local bioluminescent_tree_safe_volume = (coral_bioluminescent_tree_size.x * coral_bioluminescent_tree_size.y * coral_bioluminescent_tree_size.z) / 1.5 +local bioluminescent_tree_y_dis = 1 +local bioluminescent_tree_place_on = minetest.registered_decorations['everness:coral_forest_under_coral_tree_bioluminescent'].place_on +bioluminescent_tree_place_on = type(bioluminescent_tree_place_on) == 'string' and { bioluminescent_tree_place_on } or bioluminescent_tree_place_on + +minetest.set_gen_notify({ decoration = true }, { deco_id_coral_forest_under_coral_tree_bioluminescent }) + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_coral_forest_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Coral Tree Bioluminescent + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_coral_forest_under_coral_tree_bioluminescent or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = minetest.get_node(marker_pos) + local place_on_node = minetest.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + minetest.remove_node(marker_pos) + + if table.indexof(bioluminescent_tree_place_on, place_on_node.name) ~= -1 then + -- enough air to place structure ? + local positions = minetest.find_nodes_in_area( + vector.new( + pos.x - bioluminescent_tree_size_x, + pos.y - bioluminescent_tree_y_dis, + pos.z - bioluminescent_tree_size_z + ), + vector.new( + pos.x + bioluminescent_tree_size_x, + pos.y - bioluminescent_tree_y_dis + coral_bioluminescent_tree_size.y, + pos.z + bioluminescent_tree_size_z + ), + { + 'air', + 'everness:coral_tree' + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:coral_tree'] or {} + + -- do not overlap another tree + if #tree == 0 and #air > bioluminescent_tree_safe_volume then + minetest.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - bioluminescent_tree_y_dis, marker_pos.z), + schem_bioluminescent_tree, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- minetest.log('action', '[Everness] Coral Tree Bioluminescent was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest.lua b/mods/everness/mapgen_crystal_forest.lua new file mode 100644 index 00000000..c146acff --- /dev/null +++ b/mods/everness/mapgen_crystal_forest.lua @@ -0,0 +1,378 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest.y_min + +-- Crystal Forest + +Everness:register_biome({ + name = 'everness:crystal_forest', + node_top = 'everness:dirt_with_crystal_grass', + depth_top = 1, + node_filler = 'everness:crystal_dirt', + depth_filler = 1, + node_riverbed = 'everness:crystal_dirt', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:crystal_stone_with_coal', + wherein = 'everness:crystal_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:crystal_forest' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_mushrooms', + deco_type = 'simple', + place_on = { 'everness:dirt_with_crystal_grass' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:crystal_mushrooms', + param2 = 40 +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_crystal_grass' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_tree_large', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_crystal_grass' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_tree_large.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_crystal_grass' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_bush.mts', + flags = 'place_center_x, place_center_z', +}) + +local function register_crystal_grass_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_grass_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_crystal_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:crystal_grass_' .. length, + }) +end + +-- Crystal Grasses + +register_crystal_grass_decoration(-0.03, 0.09, 3) +register_crystal_grass_decoration(-0.015, 0.075, 2) +register_crystal_grass_decoration(0, 0.06, 1) + +minetest.register_decoration({ + name = 'everness:crystal_forest_sparkling_crystal_grass', + deco_type = 'simple', + place_on = { 'everness:dirt_with_crystal_grass' }, + biomes = { 'everness_crystal_forest' }, + sidelen = 16, + fill_ratio = 0.4, + y_min = 2, + y_max = 31000, + decoration = 'everness:sparkling_crystal_grass', +}) + +-- +-- On Generated +-- + +local dids = {} +for decoration,size in pairs({ + ['everness:crystal_forest_crystal_tree'] = { x = 12, y = 13, z = 12 }, + ['everness:crystal_forest_crystal_tree_large'] = { x = 20, y = 14, z = 20 }, +}) do + local did = minetest.get_decoration_id(decoration) + minetest.set_gen_notify('decoration',{ did }) + dids['decoration#' .. did] = { x = size.x / 2, y = size.y, z = size.z / 2 } +end + +minetest.register_on_generated(function(minp, maxp, blockseed) + if maxp.y > 8 then + -- + -- Crystal trees - fix light + -- + local gennotify = minetest.get_mapgen_object('gennotify') + for did,size in pairs(dids) do + for _, pos in ipairs(gennotify[did] or {}) do + minetest.fix_light( + { x = pos.x - size.x, y = pos.y, z = pos.z - size.z }, + { x = pos.x + size.x, y = pos.y + size.y, z = pos.z + size.z }, + true + ) + end + end + end +end) + +--- + +local chance = 20 +local disp = 16 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_quartz_temple.mts' +local size = { x = 16, y = 13, z = 16 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_dirt_with_crystal_grass = minetest.get_content_id('everness:dirt_with_crystal_grass') + +local biome_id_everness_crystal_forest = minetest.get_biome_id('everness:crystal_forest') + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_crystal_forest) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and data[vi] == c_dirt_with_crystal_grass + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Quartz Temple + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_crystal_grass' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_quartz_temple = shared_args.schem_positions.everness_quartz_temple or {} + + table.insert(shared_args.schem_positions.everness_quartz_temple, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Quartz Temple was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest_deep_ocean.lua b/mods/everness/mapgen_crystal_forest_deep_ocean.lua new file mode 100644 index 00000000..c4723c5b --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_deep_ocean.lua @@ -0,0 +1,325 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_deep_ocean.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_deep_ocean.y_min + +-- Coral Forest Ocean + +Everness:register_biome({ + name = 'everness:crystal_forest_deep_ocean', + node_top = 'everness:crystal_forest_deep_ocean_sand', + depth_top = 1, + node_filler = 'everness:crystal_forest_deep_ocean_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_forest_deep_ocean_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:crystal_forest_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:crystal_forest_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_crystal_forest_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_1', + deco_type = 'schematic', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.003, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_1.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_2', + deco_type = 'schematic', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.003, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_2.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_3', + deco_type = 'schematic', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.003, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_3.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_sand_with_crack', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + fill_ratio = 0.002, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_sand_with_crack' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_plant_1', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_1' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_plant_2', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_2' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_plant_3', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_3' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local c_water_source = minetest.get_content_id('mapgen_water_source') +local c_everness_crystal_forest_deep_ocean_sand = minetest.get_content_id('everness:crystal_forest_deep_ocean_sand') +local c_everness_crystal_forest_deep_ocean_coral_plant_1 = minetest.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_1') +local c_everness_crystal_forest_deep_ocean_coral_plant_2 = minetest.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_2') +local c_everness_crystal_forest_deep_ocean_coral_plant_3 = minetest.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_3') +local c_everness_crystal_forest_deep_ocean_coral_1 = minetest.get_content_id('everness:crystal_forest_deep_ocean_coral_1') +local c_everness_crystal_forest_deep_ocean_coral_2 = minetest.get_content_id('everness:crystal_forest_deep_ocean_coral_2') +local c_everness_crystal_forest_deep_ocean_coral_3 = minetest.get_content_id('everness:crystal_forest_deep_ocean_coral_3') +-- Biome IDs +local biome_id_everness_crystal_forest_deep_ocean = {} +for _,biome in ipairs(asuna.features.ocean.crystal_forest) do + table.insert(biome_id_everness_crystal_forest_deep_ocean,minetest.get_biome_id(biome)) +end + +local chance = 30 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_ruins.mts' +local size = { x = 14, y = 12, z = 9 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest_deep_ocean', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_crystal_forest_deep_ocean) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + shared_args.schem_positions = {} + local schem_placed = false + + if rand:next(0, 100) < chance then + for y = maxp.y, minp.y, -1 do + if schem_placed then + break + end + + for z = minp.z, maxp.z do + if schem_placed then + break + end + + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == c_everness_crystal_forest_deep_ocean_sand + and data[vi + area.ystride] == c_water_source + then + local s_pos = area:position(vi) + + -- + -- Crystal Forest Deep Ocean Ruins + -- + + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_everness_crystal_forest_deep_ocean_sand, + c_everness_crystal_forest_deep_ocean_coral_plant_1, + c_everness_crystal_forest_deep_ocean_coral_plant_2, + c_everness_crystal_forest_deep_ocean_coral_plant_3, + c_everness_crystal_forest_deep_ocean_coral_1, + c_everness_crystal_forest_deep_ocean_coral_2, + c_everness_crystal_forest_deep_ocean_coral_3 + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough water to place structure ? + local water_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source + }, + data, + area + ) + + if #water_indexes > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + schem_placed = true + + shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins = shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins or {} + + table.insert(shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Crystal Forest Deep Ocean Ruins was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest_dunes.lua b/mods/everness/mapgen_crystal_forest_dunes.lua new file mode 100644 index 00000000..eefd7762 --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_dunes.lua @@ -0,0 +1,337 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_dunes.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_dunes.y_min + +-- Crystal Forest Dunes + +Everness:register_biome({ + name = 'everness:crystal_forest_dunes', + node_top = 'everness:crystal_sand', + depth_top = 1, + node_filler = 'everness:crystal_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_sand', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_dunes' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_dunes' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_dunes_ruins_1', + deco_type = 'schematic', + place_on = { 'everness:crystal_sand' }, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_ruins_1.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_dunes_ruins_2', + deco_type = 'schematic', + place_on = { 'everness:crystal_sand' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_ruins_2.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- +-- On Generated +-- + +local chance = 20 +local chance_water = 10 +local disp = 16 +local water_level = tonumber(minetest.settings:get('water_level')) or 1 + +local schem = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_quartz_fountain.mts', {}) +local size = { x = 11, y = 10, z = 11 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local schem_shrine = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_crystal_forest_ocean_shrine.mts', {}) +local size_shrine = { x = 13, y = 16, z = 13 } +local size_x_shrine = math.round(size.x / 2) +local size_z_shrine = math.round(size.z / 2) +local y_dis_shrine = 8 + +local c_everness_crystal_sand = minetest.get_content_id('everness:crystal_sand') +local c_water_source = minetest.get_content_id('mapgen_water_source') + +local biome_id_everness_crystal_forest_dunes = minetest.get_biome_id('everness:crystal_forest_dunes') + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest_dunes', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_crystal_forest_dunes) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR then + local s_pos = area:position(vi) + + if + data[vi] == c_everness_crystal_sand + and rand:next(0, 100) < chance + then + -- + -- Quartz Fountain + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:crystal_sand' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + local replacements + + if rand:next(0, 100) < 50 then + replacements = { + ['everness:chest'] = 'everness:quartz_pillar' + } + end + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + replacements, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_quartz_fountain = shared_args.schem_positions.everness_quartz_fountain or {} + + table.insert(shared_args.schem_positions.everness_quartz_fountain, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Quartz Fountain was placed at ' .. schem_pos:to_string()) + end + end + + if data[vi] == c_water_source + and rand:next(0, 100) < chance_water + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + -- + -- Crystal Forest Ocean Shrine + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis_shrine, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_shrine, s_pos.y - 1, s_pos.z - size_z_shrine), + vector.new(s_pos.x + size_x_shrine, s_pos.y + 1, s_pos.z + size_z_shrine), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size_shrine.x * size_shrine.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_shrine, s_pos.y, s_pos.z - size_z_shrine), + vector.new(s_pos.x + size_x_shrine, s_pos.y + size_shrine.y, s_pos.z + size_z_shrine), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size_shrine.x * size_shrine.y * size_shrine.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem_shrine, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_crystal_forest_ocean_shrine = shared_args.schem_positions.everness_crystal_forest_ocean_shrine or {} + + table.insert(shared_args.schem_positions.everness_crystal_forest_ocean_shrine, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x_shrine, s_pos.y - y_dis_shrine, s_pos.z - size_z_shrine), + maxp = vector.new(s_pos.x + size_x_shrine, s_pos.y - y_dis_shrine + size_shrine.y, s_pos.z + size_z_shrine) + }) + + minetest.log('action', '[Everness] Crystal Forest Ocean Shrine was placed at ' .. schem_pos:to_string()) + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest_ocean.lua b/mods/everness/mapgen_crystal_forest_ocean.lua new file mode 100644 index 00000000..59a8cab0 --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_ocean.lua @@ -0,0 +1,147 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_ocean.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_ocean.y_min + +-- Crystal Forest Ocean + +Everness:register_biome({ + name = 'everness:crystal_forest_ocean', + node_top = 'everness:crystal_sand', + depth_top = 1, + node_filler = 'everness:crystal_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_sand', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Clay + +Everness:register_ore({ + ore_type = 'blob', + ore = 'default:clay', + wherein = { 'everness:crystal_sand' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.crystal_forest +}) + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.crystal_forest +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.crystal_forest +}) + +-- +-- Register decorations +-- + +-- Coral reef + +Everness:register_decoration({ + name = 'everness:crystal_forest_ocean_corals', + deco_type = 'simple', + place_on = { 'everness:crystal_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.crystal_forest, + y_max = y_max, + y_min = y_max - 10 > y_min and y_max - 10 or y_min, + flags = 'force_placement', + decoration = { + 'everness:crystal_coral_dark', + 'everness:crystal_coral_light', + 'everness:coral_skeleton' + }, +}) diff --git a/mods/everness/mapgen_crystal_forest_shore.lua b/mods/everness/mapgen_crystal_forest_shore.lua new file mode 100644 index 00000000..cdeebf96 --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_shore.lua @@ -0,0 +1,136 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_shore.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_shore.y_min + +-- Crystal Forest Shore + +Everness:register_biome({ + name = 'everness:crystal_forest_shore', + node_top = 'everness:crystal_sand', + depth_top = 1, + node_filler = 'everness:crystal_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_sand', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.biome_groups.shore +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.biome_groups.shore +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:crystal_stone_with_coal', + wherein = 'everness:crystal_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = asuna.biome_groups.shore +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_shore_crystal_waterlily', + deco_type = 'simple', + place_on = { 'mapgen_water_source' }, + sidelen = 16, + noise_params = { + offset = 0.0125, + scale = 0.05, + spread = { x = 100, y = 100, z = 100 }, + seed = 33, + octaves = 2, + persist = 0.7 + }, + biomes = 'everness:crystal_forest_shore', + y_max = 1, + y_min = 0, + decoration = 'everness:crystal_waterlily', + param2 = 0, + param2_max = 3, + flags = "liquid_surface", +}) diff --git a/mods/everness/mapgen_crystal_forest_under.lua b/mods/everness/mapgen_crystal_forest_under.lua new file mode 100644 index 00000000..ec281949 --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_under.lua @@ -0,0 +1,413 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_under.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_under.y_min + +-- Crystal Forest Under + +Everness:register_biome({ + name = 'everness:crystal_forest_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:crystal_moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_vines', + deco_type = 'simple', + place_on = { 'everness:crystal_moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = asuna.features.cave.crystal_forest, + param2 = 8, + decoration = { + 'everness:twisted_vine_1', + 'everness:twisted_vine_2', + 'everness:golden_vine_1', + 'everness:golden_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_cluster', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_sphere_cluster', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.0005, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_cyan', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:crystal_cyan', + 'everness:crystal_purple', + 'everness:crystal_orange' + }, + flags = 'all_floors', + param2 = 1 +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_twisted_crystal_grass', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.2, + spread = { x = 100, y = 100, z = 100 }, + seed = 801, + octaves = 3, + persist = 0.7 + }, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:twisted_crystal_grass', + flags = 'all_floors', + param2 = 40 +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_cyan_ceiling', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.crystal_forest, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:crystal_cyan', + 'everness:crystal_purple', + 'everness:crystal_orange' + }, + flags = 'all_ceilings', +}) + +-- +-- On Generated +-- + +local biome_id_everness_crystal_forest_under = {} +for _,biome in ipairs(asuna.features.cave.crystal_forest) do + table.insert(biome_id_everness_crystal_forest_under,minetest.get_biome_id(biome)) +end + +local deco_id_crystal_forest_under_crystal_cluster = minetest.get_decoration_id('everness:crystal_forest_under_crystal_cluster') +local deco_id_crystal_forest_under_crystal_sphere_cluster = minetest.get_decoration_id('everness:crystal_forest_under_crystal_sphere_cluster') + +-- `minetest.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work +local schem_crystal_cluster = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_crystal_orange_cluster.mts', {}) +local crystal_cluster_size = { x = 8, y = 4, z = 7} +local crystal_cluster_size_x = math.round(crystal_cluster_size.x / 2) +local crystal_cluster_size_z = math.round(crystal_cluster_size.z / 2) +local crystal_cluster_safe_volume = (crystal_cluster_size.x * crystal_cluster_size.y * crystal_cluster_size.z) / 2 +local crystal_cluster_place_on = minetest.registered_decorations['everness:crystal_forest_under_crystal_cluster'].place_on +crystal_cluster_place_on = type(crystal_cluster_place_on) == 'string' and { crystal_cluster_place_on } or crystal_cluster_place_on + +-- `minetest.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work +local schem_crystal_sphere_cluster = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_crystal_purple_cluster.mts', {}) +local crystal_sphere_cluster_size = { x = 20, y = 19, z = 19 } +local crystal_sphere_cluster_size_x = math.round(crystal_sphere_cluster_size.x / 2) +local crystal_sphere_cluster_size_z = math.round(crystal_sphere_cluster_size.z / 2) +local crystal_sphere_cluster_safe_volume = (crystal_sphere_cluster_size.x * crystal_sphere_cluster_size.y * crystal_sphere_cluster_size.z) / 2 +local crystal_sphere_cluster_place_on = minetest.registered_decorations['everness:crystal_forest_under_crystal_sphere_cluster'].place_on +crystal_sphere_cluster_place_on = type(crystal_sphere_cluster_place_on) == 'string' and { crystal_sphere_cluster_place_on } or crystal_sphere_cluster_place_on + +minetest.set_gen_notify({ decoration = true }, { + deco_id_crystal_forest_under_crystal_cluster, + deco_id_crystal_forest_under_crystal_sphere_cluster +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_crystal_forest_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Crystal Cluster + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_crystal_forest_under_crystal_cluster or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = minetest.get_node(marker_pos) + local place_on_node = minetest.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + minetest.remove_node(marker_pos) + + if table.indexof(crystal_cluster_place_on, place_on_node.name) ~= -1 then + -- enough air to place structure ? + local positions = minetest.find_nodes_in_area( + vector.new( + pos.x - crystal_cluster_size_x, + pos.y, + pos.z - crystal_cluster_size_z + ), + vector.new( + pos.x + crystal_cluster_size_x, + pos.y + crystal_cluster_size.y, + pos.z + crystal_cluster_size_z + ), + { + 'air' + }, + true + ) + + local air = positions.air or {} + + if #air > crystal_cluster_safe_volume then + local replacements + local rand_color + + if rand:next(0, 100) < 25 then + local colors = { 'purple', 'cyan' } + rand_color = colors[rand:next(1, #colors)] + + replacements = { + ['everness:crystal_block_orange'] = 'everness:crystal_block_' .. rand_color, + ['everness:crystal_orange'] = 'everness:crystal_' .. rand_color + } + end + + minetest.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y, marker_pos.z), + schem_crystal_cluster, + 'random', + replacements, + true, + 'place_center_x, place_center_z' + ) + + -- minetest.log('action', '[Everness] Crystal Cluster ' .. (rand_color or 'orange') .. ' was placed at ' .. pos:to_string()) + end + end + end + end + + -- + -- Crystal Sphere Cluster + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_crystal_forest_under_crystal_sphere_cluster or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = minetest.get_node(marker_pos) + local place_on_node = minetest.get_node(pos) + local crystal_sphere_cluster_y_dis = rand:next(5, 9) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + minetest.remove_node(marker_pos) + + if table.indexof(crystal_sphere_cluster_place_on, place_on_node.name) ~= -1 then + -- enough air to place structure ? + local positions = minetest.find_nodes_in_area( + vector.new( + pos.x - crystal_sphere_cluster_size_x, + pos.y - crystal_sphere_cluster_y_dis, + pos.z - crystal_sphere_cluster_size_z + ), + vector.new( + pos.x + crystal_sphere_cluster_size_x, + pos.y - crystal_sphere_cluster_y_dis + crystal_sphere_cluster_size.y, + pos.z + crystal_sphere_cluster_size_z + ), + { + 'air', + 'everness:coral_tree', + 'everness:crystal_block_orange', + 'everness:crystal_block_purple', + 'everness:crystal_block_cyan', + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:coral_tree'] or {} + local block_orange = positions['everness:crystal_block_orange'] or {} + local block_purple = positions['everness:crystal_block_purple'] or {} + local block_cyan = positions['everness:crystal_block_cyan'] or {} + + if + #air > crystal_sphere_cluster_safe_volume + -- do not overlap + and not ( + #tree > 0 + or #block_orange > 0 + or #block_purple > 0 + or #block_cyan > 0 + ) + then + local replacements + local rand_color + + if rand:next(0, 100) < 25 then + local colors = { 'orange', 'cyan' } + rand_color = colors[rand:next(1, #colors)] + + replacements = { + ['everness:crystal_block_purple'] = 'everness:crystal_block_' .. rand_color, + ['everness:crystal_purple'] = 'everness:crystal_' .. rand_color + } + end + + minetest.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - crystal_sphere_cluster_y_dis, marker_pos.z), + schem_crystal_sphere_cluster, + 'random', + replacements, + true, + 'place_center_x, place_center_z' + ) + + -- minetest.log('action', '[Everness] Crystal Sphere Cluster ' .. (rand_color or 'orange') .. ' was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands.lua b/mods/everness/mapgen_cursed_lands.lua new file mode 100644 index 00000000..ea2697d3 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands.lua @@ -0,0 +1,492 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands.y_min + +-- Cursed Lands + +Everness:register_biome({ + name = 'everness:cursed_lands', + node_top = 'everness:dirt_with_cursed_grass', + depth_top = 1, + node_filler = 'everness:cursed_dirt', + depth_filler = 1, + node_riverbed = 'everness:cursed_dirt', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_dungeon = 'everness:cursed_brick', + node_dungeon_alt = 'everness:cursed_brick_with_growth', + node_dungeon_stair = 'stairs:stair_cursed_brick', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Stratum ores. +-- These obviously first. + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:cursed_stone', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 46, + y_min = (y_max - y_max) + 4, + noise_params = { + offset = 28, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = { 'everness:cursed_lands' }, +}) + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:cursed_stone', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 42, + y_min = (y_max - y_max) + 6, + noise_params = { + offset = 24, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = { 'everness:cursed_lands' }, +}) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_cursed_mud', + deco_type = 'simple', + place_on = { 'everness:dirt_with_cursed_grass', 'everness:cursed_dirt', 'everness:cursed_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_mud' }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_cemetery', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 8, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_cemetery.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_ruins_1', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 8, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_ruins_1.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +local function register_red_castor_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:cursed_lands_red_castor_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:red_castor_' .. length, + }) +end + +-- Red Castor Grasses + +register_red_castor_decoration(-0.03, 0.09, 4) +register_red_castor_decoration(-0.015, 0.075, 3) +register_red_castor_decoration(0, 0.06, 2) +register_red_castor_decoration(0.015, 0.045, 1) + +Everness:register_decoration({ + name = 'everness:cursed_lands_dry_tree', + deco_type = 'schematic', + place_on = { + 'everness:dirt_with_cursed_grass', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone' + }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_cursed_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_cursed_bush.mts', + flags = 'place_center_x, place_center_z', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_ferns', + deco_type = "simple", + place_on = { + "everness:dirt_with_cursed_grass", + }, + sidelen = 16, + fill_ratio = 0.2, + biomes = {"everness_cursed_lands"}, + y_max = 31000, + y_min = 1, + decoration = { + "default:grass_1", + "default:fern_1", + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_junglegrass', + deco_type = "simple", + place_on = { + "everness:dirt_with_cursed_grass", + }, + sidelen = 16, + fill_ratio = 0.0075, + biomes = {"everness_cursed_lands"}, + y_max = 31000, + y_min = 1, + decoration = { + "default:junglegrass", + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_dry_shrub', + deco_type = "simple", + place_on = { + "everness:dirt_with_cursed_grass", + }, + sidelen = 16, + fill_ratio = 0.0225, + biomes = {"everness_cursed_lands"}, + y_max = 31000, + y_min = 1, + decoration = { + "default:dry_shrub", + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_dry_tree_stumps', + deco_type = "simple", + place_on = { + "everness:dirt_with_cursed_grass", + }, + sidelen = 16, + fill_ratio = 0.000175, + biomes = {"everness_cursed_lands"}, + y_max = 31000, + y_min = 1, + decoration = { + "everness:dry_tree", + }, + height = 2, + height_max = 4, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_haunted_house.mts' +local size = { x = 11, y = 22, z = 10 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_dirt_with_cursed_grass = minetest.get_content_id('everness:dirt_with_cursed_grass') + +local biome_id_everness_cursed_lands = minetest.get_biome_id('everness:cursed_lands') + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_cursed_lands) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and data[vi] == c_dirt_with_cursed_grass + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Haunted House + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- ensure there are no trees in the area + local tree_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'group:tree', + 'group:leaves', + } + ) + + if #tree_positions > 0 then + -- trees in the way + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_haunted_house = shared_args.schem_positions.everness_haunted_house or {} + + table.insert(shared_args.schem_positions.everness_haunted_house, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Haunted House was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_deep_ocean.lua b/mods/everness/mapgen_cursed_lands_deep_ocean.lua new file mode 100644 index 00000000..1837697a --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_deep_ocean.lua @@ -0,0 +1,325 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_deep_ocean.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_deep_ocean.y_min + +-- Cursed Lands Deep Ocean + +Everness:register_biome({ + name = 'everness:cursed_lands_deep_ocean', + node_top = 'everness:cursed_lands_deep_ocean_sand', + depth_top = 1, + node_filler = 'everness:cursed_lands_deep_ocean_sand', + depth_filler = 3, + node_riverbed = 'everness:cursed_lands_deep_ocean_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:cursed_lands_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:cursed_lands_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_cursed_lands_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_lands_deep_ocean_coral_alcyonacea', + deco_type = 'schematic', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_lands_deep_ocean_coral_ostracod', + deco_type = 'schematic', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_lands_deep_ocean_coral_octocurse', + deco_type = 'schematic', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_mud', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + fill_ratio = 0.002, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_sand_with_crack' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_plants_1', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_anemone' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_plants_2', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_darkilluma' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_plants_3', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_demon' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local c_water_source = minetest.get_content_id('mapgen_water_source') +local c_everness_cursed_lands_deep_ocean_sand = minetest.get_content_id('everness:cursed_lands_deep_ocean_sand') +local c_everness_cursed_lands_deep_ocean_coral_plant_anemone = minetest.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_anemone') +local c_everness_cursed_lands_deep_ocean_coral_plant_darkilluma = minetest.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_darkilluma') +local c_everness_cursed_lands_deep_ocean_coral_plant_demon = minetest.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_demon') +local c_everness_cursed_lands_deep_ocean_coral_alcyonacea = minetest.get_content_id('everness:cursed_lands_deep_ocean_coral_alcyonacea') +local c_everness_cursed_lands_deep_ocean_coral_ostracod = minetest.get_content_id('everness:cursed_lands_deep_ocean_coral_ostracod') +local c_everness_cursed_lands_deep_ocean_coral_octocurse = minetest.get_content_id('everness:cursed_lands_deep_ocean_coral_octocurse') +-- Biome IDs +local biome_id_everness_cursed_lands_deep_ocean = {} +for _,biome in ipairs(asuna.features.ocean.cursed_lands) do + table.insert(biome_id_everness_cursed_lands_deep_ocean,minetest.get_biome_id(biome)) +end + +local chance = 30 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_cursed_lands_deep_ocean_skull.mts' +local size = { x = 10, y = 11, z = 11 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_deep_ocean', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_cursed_lands_deep_ocean) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + shared_args.schem_positions = {} + local schem_placed = false + + if rand:next(0, 100) < chance then + for y = maxp.y, minp.y, -1 do + if schem_placed then + break + end + + for z = minp.z, maxp.z do + if schem_placed then + break + end + + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == c_everness_cursed_lands_deep_ocean_sand + and data[vi + area.ystride] == c_water_source + then + local s_pos = area:position(vi) + + -- + -- Cursed Lands Deep Ocean Skull + -- + + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_everness_cursed_lands_deep_ocean_sand, + c_everness_cursed_lands_deep_ocean_coral_plant_anemone, + c_everness_cursed_lands_deep_ocean_coral_plant_darkilluma, + c_everness_cursed_lands_deep_ocean_coral_plant_demon, + c_everness_cursed_lands_deep_ocean_coral_alcyonacea, + c_everness_cursed_lands_deep_ocean_coral_ostracod, + c_everness_cursed_lands_deep_ocean_coral_octocurse + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough water to place structure ? + local water_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source + }, + data, + area + ) + + if #water_indexes > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + schem_placed = true + + shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull = shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull or {} + + table.insert(shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Cursed Lands Deep Ocean Skull was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_dunes.lua b/mods/everness/mapgen_cursed_lands_dunes.lua new file mode 100644 index 00000000..fcfa2fc3 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_dunes.lua @@ -0,0 +1,348 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_dunes.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_dunes.y_min + +-- Cursed Lands Dunes + +Everness:register_biome({ + name = 'everness:cursed_lands_dunes', + node_top = 'everness:cursed_sand', + depth_top = 1, + node_filler = 'everness:cursed_sand', + depth_filler = 3, + node_riverbed = 'everness:cursed_sand', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_dungeon = 'everness:cursed_sandstone_brick', + node_dungeon_alt = 'everness:cursed_sandstone_block', + node_dungeon_stair = 'stairs:stair_cursed_sandstone_brick', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_dunes_dry_tree', + deco_type = 'schematic', + place_on = { + 'everness:dirt_with_cursed_grass', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone' + }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- +-- On Generated +-- + +local chance = 30 +local chance_water = 10 +local disp = 16 +local water_level = tonumber(minetest.settings:get('water_level')) or 1 + +local schem_cursed_cabin = minetest.get_modpath('everness') .. '/schematics/everness_cursed_cabin.mts' +local size = { x = 7, y = 7, z = 12 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local schem_ocean_island = minetest.get_modpath('everness') .. '/schematics/everness_cursed_lands_deep_ocean_island.mts' +local size_ocean_island = { x = 25, y = 23, z = 23 } +local size_x_ocean_island = math.round(size.x / 2) +local size_z_ocean_island = math.round(size.z / 2) +local y_dis_ocean_island = 7 + +local c_cursed_sand = minetest.get_content_id('everness:cursed_sand') +local c_water_source = minetest.get_content_id('mapgen_water_source') + +local biome_id_everness_cursed_lands_dunes = minetest.get_biome_id('everness:cursed_lands_dunes') + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_dunes', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_cursed_lands_dunes) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR then + local s_pos = area:position(vi) + + if data[vi] == c_cursed_sand + and rand:next(0, 100) < chance + then + -- + -- Cursed Cabin + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:cursed_sand' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem_cursed_cabin, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_cursed_cabin = shared_args.schem_positions.everness_cursed_cabin or {} + + table.insert(shared_args.schem_positions.everness_cursed_cabin, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Cursed Cabin was placed at ' .. schem_pos:to_string()) + end + end + + if data[vi] == c_water_source + and rand:next(0, 100) < chance_water + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + -- + -- Cursed Lands Deep Ocean Island + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis_ocean_island, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_ocean_island, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x_ocean_island, s_pos.y + 1, s_pos.z + size_z), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size_ocean_island.x * size_ocean_island.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_ocean_island, s_pos.y, s_pos.z - size_z_ocean_island), + vector.new(s_pos.x + size_x_ocean_island, s_pos.y + size_ocean_island.y, s_pos.z + size_z_ocean_island), + { + c_water_source, + minetest.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size_ocean_island.x * size_ocean_island.y * size_ocean_island.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem_ocean_island, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_cursed_lands_deep_ocean_island = shared_args.schem_positions.everness_cursed_lands_deep_ocean_island or {} + + table.insert(shared_args.schem_positions.everness_cursed_lands_deep_ocean_island, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x_ocean_island, s_pos.y - y_dis_ocean_island, s_pos.z - size_z_ocean_island), + maxp = vector.new(s_pos.x + size_x_ocean_island, s_pos.y - y_dis_ocean_island + size_ocean_island.y, s_pos.z + size_z_ocean_island) + }) + + minetest.log('action', '[Everness] Cursed Lands Deep Ocean Island was placed at ' .. schem_pos:to_string()) + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_ocean.lua b/mods/everness/mapgen_cursed_lands_ocean.lua new file mode 100644 index 00000000..b87867a3 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_ocean.lua @@ -0,0 +1,213 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_ocean.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_ocean.y_min + +-- Cursed Lands Ocean + +Everness:register_biome({ + name = 'everness:cursed_lands_ocean', + node_top = 'everness:cursed_stone', + depth_top = 1, + node_filler = 'everness:cursed_stone', + depth_filler = 3, + node_riverbed = 'everness:cursed_stone', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:cursed_lands_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:cursed_lands_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_cursed_lands_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Clay + +Everness:register_ore({ + ore_type = 'blob', + ore = 'default:clay', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.cursed_lands +}) + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.cursed_lands +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.cursed_lands +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.cursed_lands +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = asuna.features.ocean.cursed_lands +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_ocean_dry_tree', + deco_type = 'schematic', + place_on = { + 'everness:dirt_with_cursed_grass', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone' + }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max, + y_min = y_max - (y_max + 1), + schematic = minetest.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- Spine Kelp + +Everness:register_decoration({ + name = 'everness:sand_with_spine_kelp', + deco_type = 'simple', + place_on = { 'everness:cursed_stone' }, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = { x = 200, y = 200, z = 200 }, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = asuna.features.ocean.cursed_lands, + y_max = y_max - (y_max + 5), + y_min = y_max - (y_max + 10), + flags = 'force_placement', + decoration = { + 'everness:sand_with_spine_kelp', + 'everness:coral_skeleton' + }, + param2 = 48, + param2_max = 96, +}) diff --git a/mods/everness/mapgen_cursed_lands_swamp.lua b/mods/everness/mapgen_cursed_lands_swamp.lua new file mode 100644 index 00000000..e25aeb66 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_swamp.lua @@ -0,0 +1,293 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_swamp.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_swamp.y_min + +-- Cursed Lands Swamp + +Everness:register_biome({ + name = 'everness:cursed_lands_swamp', + node_top = 'everness:cursed_stone', + depth_top = 1, + node_filler = 'everness:cursed_stone', + depth_filler = 3, + node_riverbed = 'everness:cursed_stone', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_dungeon = 'everness:cursed_sandstone_brick', + node_dungeon_alt = 'everness:cursed_sandstone_block', + node_dungeon_stair = 'stairs:stair_cursed_sandstone_brick', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_swamp_dry_tree', + deco_type = 'schematic', + place_on = { 'everness:cursed_stone' }, + place_offset_y = 0, + sidelen = 16, + -- Noise tuned to place swamp trees where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = { x = 200, y = 200, z = 200 }, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = { 'everness:cursed_lands_swamp' }, + y_max = y_min, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_swamp_marsh_grass', + deco_type = 'schematic', + place_on = { 'everness:cursed_stone' }, + place_offset_y = 1, + sidelen = 16, + -- Noise tuned to place where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = { x = 200, y = 200, z = 200 }, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = { 'everness:cursed_lands_swamp' }, + y_max = y_max, + y_min = y_max, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_marsh_grass.mts', +}) + +-- +-- On Generated +-- + +local chance = 30 +local disp = 16 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_cursed_cabin.mts' +local size = { x = 7, y = 7, z = 12 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = -1 + +local c_cursed_stone = minetest.get_content_id('everness:cursed_stone') +local c_water_source = minetest.get_content_id('mapgen_water_source') + +local biome_id_everness_cursed_lands_swamp = minetest.get_biome_id('everness:cursed_lands_swamp') + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_swamp', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_cursed_lands_swamp) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == c_water_source + and data[vi] == c_cursed_stone + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Cursed Cabin + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:cursed_stone', + 'mapgen_water_source' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air', + 'mapgen_water_source' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_cursed_cabin = shared_args.schem_positions.everness_cursed_cabin or {} + + table.insert(shared_args.schem_positions.everness_cursed_cabin, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Cursed Cabin was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_under.lua b/mods/everness/mapgen_cursed_lands_under.lua new file mode 100644 index 00000000..4b1f2159 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_under.lua @@ -0,0 +1,304 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_under.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_under.y_min + +-- Cursed Lands Under + +Everness:register_biome({ + name = 'everness:cursed_lands_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:cursed_brick', + node_dungeon_alt = 'everness:cursed_brick_with_growth', + node_dungeon_stair = 'stairs:stair_cursed_brick', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_soul_sandstone_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 10, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:soul_sandstone_veined' + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_mold_stone_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_skull_with_candle', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = 'everness:skull_with_candle', + flags = 'all_floors', + param2_max = 3 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = asuna.features.cave.cursed_lands, + param2 = 8, + decoration = { + 'everness:eye_vine_1', + 'everness:eye_vine_2', + 'everness:ivis_vine_1', + 'everness:ivis_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_pumpkin_lantern', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { 'everness:cursed_pumpkin_lantern' }, + flags = 'all_floors', + param2_max = 3 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_cursed_dream_tree', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max - 1000, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_plants', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:egg_plant', + 'everness:ngrass_1', + 'everness:ngrass_2', + }, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_ivis_moss', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:ivis_moss', + }, + flags = 'all_floors', + param2 = 3 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_cobweb_floors', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + fill_ratio = 0.02, + biomes = asuna.features.cave.cursed_lands, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:cobweb' }, + flags = 'all_floors' +}) + +-- +-- On Generated +-- + +local biome_id_everness_cursed_lands_under = {} +for _,biome in ipairs(asuna.features.cave.cursed_lands) do + table.insert(biome_id_everness_cursed_lands_under,minetest.get_biome_id(biome)) +end + +local deco_id_cursed_lands_under_cursed_dream_tree = minetest.get_decoration_id('everness:cursed_lands_under_cursed_dream_tree') + +local schem_cursed_dream_tree = minetest.get_modpath('everness') .. '/schematics/everness_cursed_dream_tree.mts' +local cursed_dream_tree_size = { x = 17, y = 15, z = 17 } +local cursed_dream_tree_size_x = math.round(cursed_dream_tree_size.x / 2) +local cursed_dream_tree_size_z = math.round(cursed_dream_tree_size.z / 2) +local cursed_dream_tree_safe_volume = (cursed_dream_tree_size.x * cursed_dream_tree_size.y * cursed_dream_tree_size.z) / 1.5 +local cursed_dream_tree_y_dis = 1 +local cursed_dream_tree_place_on = minetest.registered_decorations['everness:cursed_lands_under_cursed_dream_tree'].place_on +cursed_dream_tree_place_on = type(cursed_dream_tree_place_on) == 'string' and { cursed_dream_tree_place_on } or cursed_dream_tree_place_on + +minetest.set_gen_notify({ decoration = true }, { deco_id_cursed_lands_under_cursed_dream_tree }) + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_cursed_lands_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Cursed Dream Tree + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_cursed_lands_under_cursed_dream_tree or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = minetest.get_node(marker_pos) + local place_on_node = minetest.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + minetest.remove_node(marker_pos) + + if table.indexof(cursed_dream_tree_place_on, place_on_node.name) ~= -1 then + -- enough air to place structure ? + local positions = minetest.find_nodes_in_area( + vector.new( + pos.x - cursed_dream_tree_size_x, + pos.y - cursed_dream_tree_y_dis, + pos.z - cursed_dream_tree_size_z + ), + vector.new( + pos.x + cursed_dream_tree_size_x, + pos.y - cursed_dream_tree_y_dis + cursed_dream_tree_size.y, + pos.z + cursed_dream_tree_size_z + ), + { + 'air', + 'everness:dry_tree' + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:dry_tree'] or {} + + if #air > cursed_dream_tree_safe_volume and #tree <= 1 then + minetest.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - cursed_dream_tree_y_dis, marker_pos.z), + schem_cursed_dream_tree, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- minetest.log('action', '[Everness] Cursed Dream Tree was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_desert.lua b/mods/everness/mapgen_forsaken_desert.lua new file mode 100644 index 00000000..87ecde89 --- /dev/null +++ b/mods/everness/mapgen_forsaken_desert.lua @@ -0,0 +1,304 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_desert.y_max +local y_min = Everness.settings.biomes.everness_forsaken_desert.y_min + +-- Forsaken Desert + +Everness:register_biome({ + name = 'everness:forsaken_desert', + node_top = 'everness:forsaken_desert_sand', + depth_top = 1, + node_stone = 'everness:forsaken_desert_stone', + node_filler = 'everness:forsaken_desert_sand', + depth_filler = 1, + node_riverbed = 'everness:forsaken_desert_sand', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_desert_brick', + node_dungeon_alt = 'everness:forsaken_desert_brick_red', + node_dungeon_stair = 'stairs:stair_forsaken_desert_brick', + y_max = y_max, + y_min = y_min, + heat_point = 100, + humidity_point = 30, +}) + +-- +-- Register ores +-- + +-- Stratum ores. +-- These obviously first. + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:forsaken_desert_cobble', + wherein = { 'everness:forsaken_desert_stone' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 46, + y_min = (y_max - y_max) + 4, + noise_params = { + offset = 28, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = { 'everness:forsaken_desert' }, +}) + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:forsaken_desert_cobble', + wherein = { 'everness:forsaken_desert_stone' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 42, + y_min = (y_max - y_max) + 6, + noise_params = { + offset = 24, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = { 'everness:forsaken_desert' }, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_desert_sand_plants_1', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:forsaken_desert_plant_1' }, + param2 = 11, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_sand_plants_2', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:forsaken_desert_plant_2', + 'everness:forsaken_desert_plant_3' + }, + param2 = 8, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_termite_nest', + deco_type = 'schematic', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_termite_nest.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_hollow_tree', + deco_type = 'schematic', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_hollow_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_hollow_tree_large', + deco_type = 'schematic', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_hollow_tree_large.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple.mts' +local size = { x = 9, y = 16, z = 9 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local c_forsaken_desert_sand = minetest.get_content_id('everness:forsaken_desert_sand') + +local biome_id_everness_forsaken_desert = minetest.get_biome_id('everness:forsaken_desert') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_desert', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_forsaken_desert) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and data[vi] == c_forsaken_desert_sand + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Forsaken Desert Temple + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:forsaken_desert_sand' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_forsaken_desert_temple = shared_args.schem_positions.everness_forsaken_desert_temple or {} + + table.insert(shared_args.schem_positions.everness_forsaken_desert_temple, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Forsaken Desert Temple was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_desert_ocean.lua b/mods/everness/mapgen_forsaken_desert_ocean.lua new file mode 100644 index 00000000..2d9cb2cd --- /dev/null +++ b/mods/everness/mapgen_forsaken_desert_ocean.lua @@ -0,0 +1,155 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_desert_ocean.y_max +local y_min = Everness.settings.biomes.everness_forsaken_desert_ocean.y_min + +-- Forsaken Desert Ocean + +Everness:register_biome({ + name = 'everness:forsaken_desert_ocean', + node_top = 'everness:dry_ocean_dirt', + depth_top = 1, + node_stone = 'everness:forsaken_desert_stone', + node_filler = 'everness:dry_ocean_dirt', + depth_filler = 3, + node_water_top = 'everness:dry_ocean_dirt', + depth_water_top = 10, + node_river_water = 'everness:dry_ocean_dirt', + node_riverbed = 'everness:dry_ocean_dirt', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_desert_brick', + node_dungeon_alt = 'everness:forsaken_desert_brick_red', + node_dungeon_stair = 'stairs:stair_forsaken_desert_brick', + y_max = y_max, + y_min = y_min, + heat_point = 100, + humidity_point = 30, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple_3.mts' +local size = { x = 11, y = 13, z = 13 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = -1 + +local c_dry_ocean_dirt = minetest.get_content_id('everness:dry_ocean_dirt') + +local biome_id_everness_forsaken_desert_ocean = minetest.get_biome_id('everness:forsaken_desert_ocean') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_desert_ocean', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_forsaken_desert_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and data[vi] == c_dry_ocean_dirt + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Forsaken Desert Temple 3 + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dry_ocean_dirt' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_forsaken_desert_temple_3 = shared_args.schem_positions.everness_forsaken_desert_temple_3 or {} + + table.insert(shared_args.schem_positions.everness_forsaken_desert_temple_3, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Forsaken Desert Temple 3 was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_desert_under.lua b/mods/everness/mapgen_forsaken_desert_under.lua new file mode 100644 index 00000000..3928f53a --- /dev/null +++ b/mods/everness/mapgen_forsaken_desert_under.lua @@ -0,0 +1,338 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_desert_under.y_max +local y_min = Everness.settings.biomes.everness_forsaken_desert_under.y_min + +-- Forsaken Desert Under + +Everness:register_biome({ + name = 'everness:forsaken_desert_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'default:cobble', + node_dungeon_alt = 'default:mossycobble', + node_dungeon_stair = 'stairs:stair_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 100, + humidity_point = 30, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:forsaken_desert_sand' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_floors_chiseled', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.2, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_brick_red', + 'everness:forsaken_desert_engraved_stone', + 'everness:forsaken_desert_cobble_red', + 'everness:forsaken_desert_cobble', + }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_ceilings', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_cactus_blue', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:cactus_blue', + height = 2, + height_max = 6, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_cave_barrel_cactus', + deco_type = 'simple', + place_on = { + 'everness:forsaken_desert_sand', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_engraved_stone' + }, + sidelen = 16, + fill_ratio = 0.005, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max - 250 > y_min and y_max - 250 or y_max, + y_min = y_min, + decoration = { + 'everness:cave_barrel_cactus', + 'everness:venus_trap' + }, + flags = 'all_floors', + param2_max = 3 +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_cave_illumi_root', + deco_type = 'simple', + place_on = { + 'everness:forsaken_desert_sand', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_engraved_stone' + }, + sidelen = 16, + fill_ratio = 0.005, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:illumi_root' }, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = asuna.features.cave.forsaken_desert, + param2 = 8, + decoration = { + 'everness:dense_vine_1', + 'everness:dense_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_hollow_tree', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.forsaken_desert, + y_max = y_max, + y_min = y_min, + decoration = 'everness:hollow_tree', + height = 3, + height_max = 7, + flags = 'all_floors' +}) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 20 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple_2.mts' +local size = { x = 16, y = 17, z = 15 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local c_forsaken_desert_sand = minetest.get_content_id('everness:forsaken_desert_sand') +local c_forsaken_desert_chiseled_stone = minetest.get_content_id('everness:forsaken_desert_chiseled_stone') +local c_forsaken_desert_brick = minetest.get_content_id('everness:forsaken_desert_brick') +local c_forsaken_desert_engraved_stone = minetest.get_content_id('everness:forsaken_desert_engraved_stone') + +local biome_id_everness_forsaken_desert_under = {} +for _,biome in ipairs(asuna.features.cave.forsaken_desert) do + table.insert(biome_id_everness_forsaken_desert_under,minetest.get_biome_id(biome)) +end + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_desert_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_forsaken_desert_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if + ( + data[vi] == c_forsaken_desert_sand + or data[vi] == c_forsaken_desert_chiseled_stone + or data[vi] == c_forsaken_desert_brick + or data[vi] == c_forsaken_desert_engraved_stone + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Forsaken Desert Temple 2 + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:forsaken_desert_sand', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_engraved_stone', + 'group:stone', + 'group:sand', + 'group:everness_sand', + 'default:gravel', + 'default:stone_with_coal', + 'default:stone_with_iron', + 'default:stone_with_tin', + 'default:stone_with_gold', + 'default:stone_with_mese', + 'default:stone_with_diamond', + 'everness:cave_barrel_cactus', + 'everness:venus_trap', + 'group:flora', + 'everness:quartz_ore', + 'everness:stone_with_pyrite', + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_forsaken_desert_temple_2 = shared_args.schem_positions.everness_forsaken_desert_temple_2 or {} + + table.insert(shared_args.schem_positions.everness_forsaken_desert_temple_2, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Forsaken Desert Temple 2 was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_tundra.lua b/mods/everness/mapgen_forsaken_tundra.lua new file mode 100644 index 00000000..66fa5fc3 --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra.lua @@ -0,0 +1,368 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra.y_min + +-- Forsaken Tundra + +Everness:register_biome({ + name = 'everness:forsaken_tundra', + node_top = 'everness:forsaken_tundra_dirt', + depth_top = 1, + node_stone = 'everness:forsaken_tundra_stone', + node_filler = 'everness:forsaken_tundra_dirt', + depth_filler = 1, + node_riverbed = 'everness:forsaken_tundra_beach_sand', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = {'everness:forsaken_tundra' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_volcanic_sulfur', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_dirt' }, + sidelen = 4, + noise_params = { + offset = -0.7, + scale = 4.0, + spread = { x = 16, y = 16, z = 16 }, + seed = 513337, + octaves = 1, + persist = 0.0, + flags = 'absvalue, eased' + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:volcanic_sulfur' }, + place_offset_y = -1, + flags = 'force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_sulfur_stone', + deco_type = 'simple', + place_on = { + 'everness:forsaken_tundra_dirt', + 'everness:volcanic_sulfur' + }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'force_placement', + decoration = { 'everness:sulfur_stone' }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_dirt_with_grass', + deco_type = 'simple', + place_on = { + 'everness:forsaken_tundra_dirt', + 'everness:volcanic_sulfur' + }, + sidelen = 4, + noise_params = { + offset = -0.8, + scale = 2.0, + spread = { x = 100, y = 100, z = 100 }, + seed = 53995, + octaves = 3, + persist = 1.0 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:forsaken_tundra_dirt_with_grass', + place_offset_y = -1, + flags = 'force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_volcanic_sulfur_on_top_of_sulfur_stone', + deco_type = 'simple', + place_on = { 'everness:sulfur_stone' }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:volcanic_sulfur' }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_rocks', + deco_type = 'schematic', + place_on = { 'everness:forsaken_tundra_dirt', 'everness:forsaken_tundra_dirt_with_grass' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_forsaken_tundra_rocks.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_sulfur_volcano', + deco_type = 'schematic', + place_on = { 'everness:forsaken_tundra_dirt', 'everness:volcanic_sulfur' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_sulfur_volcano.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = { 'everness:forsaken_tundra_dirt', 'everness:volcanic_sulfur' }, + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_bloodpore_plant', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_dirt_with_grass' }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:bloodspore_plant', + param2 = 8, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_bloodspore_plant_on_dirt', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_dirt' }, + spawn_by = 'everness:forsaken_tundra_dirt_with_grass', + num_spawn_by = 1, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:bloodspore_plant', + param2 = 8, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_jungle_temple.mts', {}) +local size = { x = 12, y = 14, z = 15 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 3 + +local c_everness_forsaken_tundra_dirt = minetest.get_content_id('everness:forsaken_tundra_dirt') +local c_everness_forsaken_tundra_dirt_with_grass = minetest.get_content_id('everness:forsaken_tundra_dirt_with_grass') +local c_everness_volcanic_sulfur = minetest.get_content_id('everness:volcanic_sulfur') + +local biome_id_everness_forsaken_tundra = minetest.get_biome_id('everness:forsaken_tundra') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_tundra', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_forsaken_tundra) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and ( + data[vi] == c_everness_forsaken_tundra_dirt + or data[vi] == c_everness_forsaken_tundra_dirt_with_grass + or data[vi] == c_everness_volcanic_sulfur + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Jungle Temple + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:forsaken_tundra_dirt', + 'everness:forsaken_tundra_dirt_with_grass', + 'everness:volcanic_sulfur' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_jungle_temple = shared_args.schem_positions.everness_jungle_temple or {} + + table.insert(shared_args.schem_positions.everness_jungle_temple, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Jungle Temple was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) + diff --git a/mods/everness/mapgen_forsaken_tundra_beach.lua b/mods/everness/mapgen_forsaken_tundra_beach.lua new file mode 100644 index 00000000..4e59768d --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra_beach.lua @@ -0,0 +1,94 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra_beach.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra_beach.y_min + +-- Forsaken Tundra Beach + +Everness:register_biome({ + name = 'everness:forsaken_tundra_beach', + node_top = 'everness:forsaken_tundra_beach_sand', + depth_top = 1, + node_filler = 'everness:forsaken_tundra_beach_sand', + depth_filler = 2, + node_riverbed = 'everness:forsaken_tundra_beach_sand', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:forsaken_tundra_shore' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_beach_sand_with_shells', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_beach_sand' }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra_shore' }, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'force_placement', + decoration = { 'everness:forsaken_tundra_beach_sand_with_shells' }, +}) diff --git a/mods/everness/mapgen_forsaken_tundra_ocean.lua b/mods/everness/mapgen_forsaken_tundra_ocean.lua new file mode 100644 index 00000000..af099c4e --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra_ocean.lua @@ -0,0 +1,96 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra_ocean.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra_ocean.y_min + +-- Forsaken Tundra Ocean + +Everness:register_biome({ + name = 'everness:forsaken_tundra_ocean', + node_top = 'everness:forsaken_tundra_beach_sand', + depth_top = 1, + node_stone = 'everness:forsaken_tundra_stone', + node_filler = 'everness:forsaken_tundra_beach_sand', + depth_filler = 3, + node_riverbed = 'everness:forsaken_tundra_beach_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.ocean.forsaken_tundra +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_beach_sand_with_shells', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_beach_sand' }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.ocean.forsaken_tundra, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'force_placement', + decoration = { 'everness:forsaken_tundra_beach_sand_with_shells' }, +}) diff --git a/mods/everness/mapgen_forsaken_tundra_under.lua b/mods/everness/mapgen_forsaken_tundra_under.lua new file mode 100644 index 00000000..6d221f18 --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra_under.lua @@ -0,0 +1,363 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra_under.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra_under.y_min + +-- Forsaken Tundra Under + +Everness:register_biome({ + name = 'everness:forsaken_tundra_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.cave.forsaken_tundra +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_mold_stone_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:mold_stone_with_moss' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_mold_stone_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_obsidian_floors', + deco_type = 'simple', + place_on = { 'default:stone', 'everness:mold_stone_with_moss' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.02, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:blue_crying_obsidian', + 'everness:blue_weeping_obsidian', + 'everness:weeping_obsidian' + }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_obsidian_ceilings', + deco_type = 'simple', + place_on = { 'default:stone', 'everness:moss_block' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.02, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:blue_crying_obsidian', + 'everness:blue_weeping_obsidian', + 'everness:weeping_obsidian' + }, + flags = 'all_ceilings, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_cactus_orange', + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:cactus_orange', + height = 2, + height_max = 6, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_willow_tree', + deco_type = 'simple', + place_on = { + 'everness:mold_stone_with_moss', + 'everness:blue_crying_obsidian', + 'everness:blue_weeping_obsidian', + 'everness:weeping_obsidian' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_bloodspore_plant_small', + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max, + y_min = y_min, + decoration = 'everness:bloodspore_plant_small', + param2 = 8, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = asuna.features.cave.forsaken_tundra, + param2 = 8, + decoration = { + 'everness:whispering_gourd_vine_1', + 'everness:whispering_gourd_vine_2', + 'everness:bulb_vine_1', + 'everness:bulb_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_glowing_pillar', + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = { 'everness:glowing_pillar' }, + flags = 'all_floors', +}) + +local function register_agave_leaf_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_agave_leaf_' .. length, + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + param2 = 8, + biomes = asuna.features.cave.forsaken_tundra, + y_max = y_max, + y_min = y_min, + decoration = 'everness:agave_leaf_' .. length, + flags = 'all_floors' + }) +end + +-- Grasses + +register_agave_leaf_decoration(-0.03, 0.09, 3) +register_agave_leaf_decoration(-0.015, 0.075, 2) +register_agave_leaf_decoration(0, 0.06, 1) + +-- +-- On Generated +-- + +local biome_id_everness_forsaken_tundra_under = {} +for _,biome in ipairs(asuna.features.cave.forsaken_tundra) do + table.insert(biome_id_everness_forsaken_tundra_under,minetest.get_biome_id(biome)) +end + +local deco_id_everness_forsaken_tundra_under_willow_tree = minetest.get_decoration_id('everness:forsaken_tundra_under_willow_tree') + +local willow_tree_schem = minetest.get_modpath('everness') .. '/schematics/everness_willow_tree.mts' +local size = { x = 39, y = 28, z = 39 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local safe_volume = (size.x * size.y * size.z) / 1.5 +local y_dis = 1 +local willow_tree_place_on = minetest.registered_decorations['everness:forsaken_tundra_under_willow_tree'].place_on +willow_tree_place_on = type(willow_tree_place_on) == 'string' and { willow_tree_place_on } or willow_tree_place_on + +minetest.set_gen_notify({ decoration = true }, { deco_id_everness_forsaken_tundra_under_willow_tree }) + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_tundra_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_forsaken_tundra_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Willow Tree + -- + + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_everness_forsaken_tundra_under_willow_tree or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = minetest.get_node(marker_pos) + local place_on_node = minetest.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + minetest.remove_node(marker_pos) + + if table.indexof(willow_tree_place_on, place_on_node.name) ~= -1 then + -- enough air to place structure ? + local positions = minetest.find_nodes_in_area( + vector.new( + pos.x - size_x, + pos.y - y_dis, + pos.z - size_z + ), + vector.new( + pos.x + size_x, + pos.y - y_dis + size.y, + pos.z + size_z + ), + { + 'air', + 'everness:willow_tree' + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:willow_tree'] or {} + + if #air > safe_volume and #tree == 0 then + minetest.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - y_dis, marker_pos.z), + willow_tree_schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- minetest.log('action', '[Everness] Willow Tree was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_frosted_icesheet.lua b/mods/everness/mapgen_frosted_icesheet.lua new file mode 100644 index 00000000..6e3c1183 --- /dev/null +++ b/mods/everness/mapgen_frosted_icesheet.lua @@ -0,0 +1,238 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_frosted_icesheet.y_max +local y_min = Everness.settings.biomes.everness_frosted_icesheet.y_min + +-- Frosted Icesheet + +Everness:register_biome({ + name = 'everness:frosted_icesheet', + node_dust = 'everness:frosted_snowblock', + node_top = 'everness:frosted_snowblock', + depth_top = 1, + node_filler = 'everness:frosted_snowblock', + depth_filler = 3, + node_stone = 'everness:frosted_cave_ice', + node_water_top = 'everness:frosted_ice', + depth_water_top = 2, + node_river_water = 'everness:frosted_ice', + node_riverbed = 'everness:gravel', + depth_riverbed = 2, + node_dungeon = 'everness:icecobble', + node_dungeon_alt = 'everness:snowcobble', + node_dungeon_stair = 'stairs:stair_ice', + y_max = y_max, + y_min = y_min, + heat_point = 0, + humidity_point = 93, +}) + +-- +-- Register decorations +-- + +-- Frosted Icesheet + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_stalagmite', + deco_type = 'schematic', + schematic = minetest.get_modpath('everness') .. '/schematics/everness_frosted_lands_stalagmite.mts', + place_on = { 'everness:frosted_snowblock' }, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0008, + scale = 0.0007, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:frosted_icesheet' }, + y_max = y_max, + y_min = (y_max - y_max) + 4, + flags = 'place_center_x, place_center_z', + spawn_by = 'everness:frosted_snowblock', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_volcanic_rock', + deco_type = 'schematic', + schematic = minetest.get_modpath('everness') .. '/schematics/everness_frosted_lands_volcanic_rock.mts', + place_on = { 'everness:frosted_snowblock' }, + sidelen = 16, + noise_params = { + offset = 0.0008, + scale = 0.0007, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:frosted_icesheet' }, + y_max = y_max, + y_min = (y_max - y_max) + 2, + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:frosted_snowblock', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_fossils', + deco_type = 'schematic', + schematic = minetest.get_modpath('everness') .. '/schematics/everness_frosted_lands_fossils.mts', + place_on = { 'everness:frosted_snowblock' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = 0.0008, + scale = 0.0007, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:frosted_icesheet' }, + y_max = y_max, + y_min = (y_max - y_max) + 1, + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:frosted_snowblock', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_frosted_icesheet_igloo.mts', {}) +local size = { x = 16, y = 13, z = 16 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 8 + +local c_frosted_snowblock = minetest.get_content_id('everness:frosted_snowblock') +local c_frosted_ice = minetest.get_content_id('everness:frosted_ice') + +local biome_id_everness_frosted_icesheet = minetest.get_biome_id('everness:frosted_icesheet') + +Everness:add_to_queue_on_generated({ + name = 'everness:frosted_icesheet', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_frosted_icesheet) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and ( + data[vi] == c_frosted_snowblock + or data[vi] == c_frosted_ice + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Igloo + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:frosted_snowblock', + 'everness:frosted_ice' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_frosted_icesheet_igloo = shared_args.schem_positions.everness_frosted_icesheet_igloo or {} + + table.insert(shared_args.schem_positions.everness_frosted_icesheet_igloo, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Igloo was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_frosted_icesheet_ocean.lua b/mods/everness/mapgen_frosted_icesheet_ocean.lua new file mode 100644 index 00000000..00f486b6 --- /dev/null +++ b/mods/everness/mapgen_frosted_icesheet_ocean.lua @@ -0,0 +1,83 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_frosted_icesheet_ocean.y_max +local y_min = Everness.settings.biomes.everness_frosted_icesheet_ocean.y_min + +-- Frosted Icesheet Ocean + +Everness:register_biome({ + name = 'everness:frosted_icesheet_ocean', + node_top = 'default:sand', + depth_top = 1, + node_filler = 'default:sand', + depth_filler = 3, + node_water_top = 'everness:frosted_ice', + depth_water_top = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:icecobble', + node_dungeon_alt = 'everness:snowcobble', + node_dungeon_stair = 'stairs:stair_ice', + y_max = y_max, + y_min = y_min, + heat_point = 0, + humidity_point = 93, +}) + +-- +-- Register decorations +-- + +-- Frosted Icesheet Ocean + +local starfish_oceans = {} +for _,oceans in ipairs({ + asuna.features.ocean.tropical, + asuna.features.ocean.frozen, +}) do + for _,ocean in ipairs(oceans) do + table.insert(starfish_oceans,ocean) + end +end + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_ocean_corals', + deco_type = 'simple', + place_on = { 'default:sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = starfish_oceans, + y_max = y_max - (y_max + 2), -- -2 + y_min = y_max - (y_max + 50), -- -50 + flags = 'force_placement', + decoration = { + 'everness:coral_starfish', + 'everness:coral_frosted', + 'everness:coral_skeleton' + }, +}) diff --git a/mods/everness/mapgen_frosted_icesheet_under.lua b/mods/everness/mapgen_frosted_icesheet_under.lua new file mode 100644 index 00000000..5b8e2590 --- /dev/null +++ b/mods/everness/mapgen_frosted_icesheet_under.lua @@ -0,0 +1,413 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_frosted_icesheet_under.y_max +local y_min = Everness.settings.biomes.everness_frosted_icesheet_under.y_min + +-- Frosted Icesheet Under + +Everness:register_biome({ + name = 'everness:frosted_icesheet_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:icecobble', + node_dungeon_alt = 'everness:snowcobble', + node_dungeon_stair = 'stairs:stair_ice', + y_max = y_max, + y_min = y_min, + heat_point = 0, + humidity_point = 93, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:bone', + wherein = { 'default:stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.cave.frosted_icesheet +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 10, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_illuminating_floors', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.01, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:frosted_cave_ice_illuminating' }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_illuminating_ceilings', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.01, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:frosted_cave_ice_illuminating' }, + flags = 'all_ceilings, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_amaranita_lantern', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { 'everness:amaranita_lantern' }, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_vines', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + fill_ratio = 0.09, + biomes = asuna.features.cave.frosted_icesheet, + param2 = 8, + decoration = { + 'everness:tenanea_flowers_vine_1', + 'everness:tenanea_flowers_vine_2', + 'everness:reeds_vine_1', + 'everness:reeds_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:frosted_icicle_large_ceiling', + deco_type = 'schematic', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max - 64, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_frosted_icicle_large_ceiling.mts', + flags = 'place_center_x, place_center_z, all_ceilings', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icicle_large_floor', + deco_type = 'schematic', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max - 64, + y_min = y_min, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_frosted_icicle_large_floor.mts', + flags = 'place_center_x, place_center_z, all_floors', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_plants', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + param2 = 8, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:blooming_cooksonia', + 'everness:frosted_icicle_floor', + }, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_plants_2', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.frosted_icesheet, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:creeping_moss_spores' }, + flags = 'all_floors', + param2 = 26 +}) + +-- +-- On Generated +-- + +local size_ceiling = { x = 2, y = 19, z = 2 } +local size_ceiling_x = math.round(size_ceiling.x / 2) +local size_ceiling_z = math.round(size_ceiling.z / 2) +local size_floor = { x = 2, y = 20, z = 2 } +local size_floor_x = math.round(size_floor.x / 2) +local size_floor_z = math.round(size_floor.z / 2) + +local deco_id_frosted_icicle_large_ceiling = minetest.get_decoration_id('everness:frosted_icicle_large_ceiling') +local deco_id_frosted_icicle_large_floor = minetest.get_decoration_id('everness:frosted_icicle_large_floor') + +local biome_id_everness_frosted_icesheet_under = {} +for _,biome in ipairs(asuna.features.cave.frosted_icesheet) do + table.insert(biome_id_everness_frosted_icesheet_under,minetest.get_biome_id(biome)) +end + +minetest.set_gen_notify( + { decoration = true }, + { + deco_id_frosted_icicle_large_ceiling, + deco_id_frosted_icicle_large_floor + } +) + +Everness:add_to_queue_on_generated({ + name = 'everness:frosted_icesheet_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_frosted_icesheet_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + after_write_to_map = function(shared_args, gennotify) + -- + -- Frosted Large Icicle Ceiling + -- + for _, pos in ipairs(gennotify['decoration#' .. deco_id_frosted_icicle_large_ceiling] or {}) do + local markers = minetest.find_nodes_in_area( + vector.new(pos.x - size_ceiling_x, pos.y - size_ceiling.y + 2, pos.z - size_ceiling_z), + vector.new(pos.x + size_ceiling_x, pos.y - size_ceiling.y, pos.z + size_ceiling_z), + { 'everness:marker' } + ) + + if #markers > 0 then + local pos_marker = markers[1] + local air_below = minetest.find_nodes_in_area( + vector.new(pos_marker.x, pos_marker.y, pos_marker.z), + vector.new(pos_marker.x, pos_marker.y - 7, pos_marker.z), + {'air'} + ) + + -- Replace marker + minetest.set_node(pos_marker, { name = 'everness:frosted_cave_ice_illuminating' }) + + if #air_below == 7 then + local incrementer = 1 + local pos_below = vector.new(pos_marker.x, pos_marker.y - incrementer, pos_marker.z) + local node_below = minetest.get_node(pos_below) + + Everness.stack_icicle_recursive(node_below, pos_below, incrementer, pos_marker, 'down') + end + end + end + + -- + -- Frosted Large Icicle Floor + -- + for _, pos in ipairs(gennotify['decoration#' .. deco_id_frosted_icicle_large_floor] or {}) do + local markers = minetest.find_nodes_in_area( + vector.new(pos.x - size_floor_x, pos.y + size_floor.y - 2, pos.z - size_floor_z), + vector.new(pos.x + size_floor_x, pos.y + size_floor.y, pos.z + size_floor_z), + { 'everness:marker' } + ) + + if #markers > 0 then + local pos_marker = markers[1] + local air_above = minetest.find_nodes_in_area( + vector.new(pos_marker.x, pos_marker.y, pos_marker.z), + vector.new(pos_marker.x, pos_marker.y + 7, pos_marker.z), + {'air'} + ) + + -- Replace marker + minetest.set_node(pos_marker, { name = 'everness:frosted_cave_ice_illuminating' }) + + -- Make sure we have some space + if #air_above == 7 then + local incrementer = 1 + local pos_above = vector.new(pos_marker.x, pos_marker.y + incrementer, pos_marker.z) + local node_above = minetest.get_node(pos_above) + + Everness.stack_icicle_recursive(node_above, pos_above, incrementer, pos_marker, 'up') + end + end + end + end +}) diff --git a/mods/everness/mapgen_mineral_waters.lua b/mods/everness/mapgen_mineral_waters.lua new file mode 100644 index 00000000..bff987af --- /dev/null +++ b/mods/everness/mapgen_mineral_waters.lua @@ -0,0 +1,911 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_mineral_waters.y_max +local y_min = Everness.settings.biomes.everness_mineral_waters.y_min + +-- Mineral Waters + +Everness:register_biome({ + name = 'everness:mineral_waters', + node_top = 'everness:mineral_sand', + depth_top = 1, + node_filler = 'everness:mineral_stone', + depth_filler = 1, + node_stone = 'everness:mineral_stone', + node_riverbed = 'everness:mineral_sand', + depth_riverbed = 2, + node_dungeon = 'everness:mineral_stone_brick', + node_dungeon_alt = 'everness:mineral_stone_brick_with_growth', + node_dungeon_stair = 'stairs:stair_mineral_stone_brick', + y_max = y_max, + y_min = y_min, + vertical_blend = 16, + heat_point = 78, + humidity_point = 58, +}) + +-- +-- Register ores +-- + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:mineral_stone_with_coal', + wherein = 'everness:mineral_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:mineral_waters' } +}) + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:mineral_stone_with_ceramic_sherds', + wherein = 'everness:mineral_stone', + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:mineral_waters' } +}) + +-- +-- Register decorations +-- placeholder node `everness:crystal_stone` will be replaced in VM +-- + +Everness:register_decoration({ + name = 'everness:palm_trees', + deco_type = 'simple', + place_on = { 'everness:mineral_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.005, + spread = { x = 250, y = 250, z = 250 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:mineral_waters' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:crystal_stone' }, +}) + +Everness:register_decoration({ + name = 'everness:pots', + deco_type = 'simple', + place_on = { 'everness:mineral_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:mineral_waters' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:crystal_stone' }, + _decoration = { + 'everness:ceramic_pot_blank', + 'everness:ceramic_pot_flowers', + 'everness:ceramic_pot_lines', + 'everness:ceramic_pot_tribal' + } +}) + +Everness:register_decoration({ + name = 'everness:water_geyser', + deco_type = 'simple', + place_on = { 'everness:mineral_sand' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.02, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:mineral_waters' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:crystal_stone' }, + spawn_by = { 'air' }, + num_spawn_by = 16, + check_offset = 1, +}) + +Everness:register_decoration({ + name = 'everness:rose_bush', + deco_type = 'simple', + place_on = { 'everness:mineral_sand' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:mineral_waters' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:crystal_stone' }, + _decoration = { 'everness:rose_bush' }, + spawn_by = { 'air' }, + num_spawn_by = 16, + check_offset = 1, +}) + +-- +-- On Generated +-- + +local function find_irecursive(table, c_id) + local found = false + + for i, v in ipairs(table) do + if type(v) == 'table' then + find_irecursive(v, c_id) + end + + if c_id == v then + found = true + break + end + end + + return found +end + +-- Get the content IDs for the nodes used +local c_everness_mineral_water_source = minetest.get_content_id('everness:mineral_water_source') +local c_everness_mineral_stone = minetest.get_content_id('everness:mineral_stone') +local c_everness_mineral_stone_brick = minetest.get_content_id('everness:mineral_stone_brick') +local c_everness_mineral_stone_brick_with_growth = minetest.get_content_id('everness:mineral_stone_brick_with_growth') +local c_everness_mineral_stone_brick_with_flower_growth = minetest.get_content_id('everness:mineral_stone_brick_with_flower_growth') +local c_everness_mineral_sand = minetest.get_content_id('everness:mineral_sand') +local c_everness_mineral_sandstone = minetest.get_content_id('everness:mineral_sandstone') +local c_everness_mineral_sandstone_block = minetest.get_content_id('everness:mineral_sandstone_block') +local c_everness_chest = minetest.get_content_id('everness:chest') +local c_everness_mineral_stone_with_coal = minetest.get_content_id('everness:mineral_stone_with_coal') +local c_everness_mineral_stone_with_ceramic_sherds = minetest.get_content_id('everness:mineral_stone_with_ceramic_sherds') +local c_everness_lotus_flower_white = minetest.get_content_id('everness:lotus_flower_white') +local c_everness_lotus_flower_purple = minetest.get_content_id('everness:lotus_flower_purple') +local c_everness_lotus_flower_pink = minetest.get_content_id('everness:lotus_flower_pink') +local c_everness_lotus_lotus_leaf = minetest.get_content_id('everness:lotus_leaf') +local c_everness_lotus_lotus_leaf_2 = minetest.get_content_id('everness:lotus_leaf_2') +local c_everness_lotus_lotus_leaf_3 = minetest.get_content_id('everness:lotus_leaf_3') +local c_everness_ceramic_pot_blank = minetest.get_content_id('everness:ceramic_pot_blank') +local c_everness_ceramic_pot_flowers = minetest.get_content_id('everness:ceramic_pot_flowers') +local c_everness_ceramic_pot_lines = minetest.get_content_id('everness:ceramic_pot_lines') +local c_everness_ceramic_pot_tribal = minetest.get_content_id('everness:ceramic_pot_tribal') +local c_everness_mineral_water_weed_1 = minetest.get_content_id('everness:mineral_water_weed_1') +local c_everness_mineral_water_weed_2 = minetest.get_content_id('everness:mineral_water_weed_2') +local c_everness_mineral_water_weed_3 = minetest.get_content_id('everness:mineral_water_weed_3') +-- Biome IDs +local biome_id_everness_mineral_waters = minetest.get_biome_id('everness:mineral_waters') +-- Decoration IDs +local d_everness_palm_trees = minetest.get_decoration_id('everness:palm_trees') +local d_everness_water_geyser = minetest.get_decoration_id('everness:water_geyser') +local d_everness_pots = minetest.get_decoration_id('everness:pots') +local d_rose_bush = minetest.get_decoration_id('everness:rose_bush') + +-- Pool building blocks variations +local pool_build_nodes = { + { + c_everness_mineral_stone, + c_everness_mineral_stone_brick, + c_everness_mineral_stone_brick_with_growth, + c_everness_mineral_stone_brick_with_flower_growth + }, + { + c_everness_mineral_sandstone, + c_everness_mineral_sandstone_block + } +} +local c_lotus_flowers = { + c_everness_lotus_flower_white, + c_everness_lotus_flower_purple, + c_everness_lotus_flower_pink +} +local c_lotus_leaves = { + c_everness_lotus_lotus_leaf, + c_everness_lotus_lotus_leaf_2, + c_everness_lotus_lotus_leaf_3 +} +local c_pots = { + c_everness_ceramic_pot_blank, + c_everness_ceramic_pot_flowers, + c_everness_ceramic_pot_lines, + c_everness_ceramic_pot_tribal +} +local c_water_weeds = { + c_everness_mineral_water_weed_1, + c_everness_mineral_water_weed_2 +} + +local chance = 20 +local disp = 16 +local schem = minetest.get_modpath('everness') .. '/schematics/everness_mineral_waters_tower.mts' +local size = { x = 7, y = 16, z = 9 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local function place_decoration(pos, vm, area, data, deco_id, callback) + local deco_def = minetest.registered_decorations[deco_id] + + if not deco_def then + return + end + + -- Position of the 'place_on' node + local vi = area:indexp(pos) + local place_on_valid = false + local data_node_name = minetest.get_name_from_content_id(data[vi]) + local placeholder_node_name = type(deco_def.decoration) == 'string' and deco_def.decoration or deco_def.decoration[1] + + if type(deco_def.place_on) == 'string' then + if deco_def.place_on == data_node_name and data[vi + area.ystride * 2] == minetest.CONTENT_AIR then + place_on_valid = true + end + else + for i, v in ipairs(deco_def.place_on) do + if v == data_node_name and data[vi + area.ystride * 2] == minetest.CONTENT_AIR then + place_on_valid = true + break + end + end + end + + local pos_above = vector.new(pos.x, pos.y + 1, pos.z) + local node_above = vm:get_node_at(pos_above) + + if node_above.name == placeholder_node_name then + if place_on_valid then + callback(pos_above, deco_def) + else + vm:set_node_at(pos_above, { name = 'air' }) + end + end +end + +minetest.set_gen_notify({ decoration = true }, { + d_everness_palm_trees, + d_everness_water_geyser, + d_everness_pots, + d_rose_bush +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:mineral_waters', + can_run = function(biomemap) + return table.indexof(biomemap, biome_id_everness_mineral_waters) ~= -1 + end, + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + local rand_version = rand:next(1, 2) + local chest_positions = {} + local pot_pos = {} + + if rand_version == 1 then + -- + -- Pools + -- + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + local precision_perc = 75 + + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + local node_name = minetest.get_name_from_content_id(data[ai]) + local node_def = minetest.registered_nodes[node_name] + + if + data[ai + area.ystride] == minetest.CONTENT_AIR + and node_def + and node_def.walkable + then + local length = 5 + rand:next(0, 10) + local width = 5 + rand:next(0, 10) + local height = 3 + rand:next(0, 4) + local walkable_nodes = 0 + + -- find space for lake (walkable rectangle) + for li = 1, length do + for wi = 1, width do + local ai_rec = (ai + li) + (area.zstride * wi) + local n_name = minetest.get_name_from_content_id(data[ai_rec]) + local n_def = minetest.registered_nodes[n_name] + local b_data = minetest.get_biome_data(area:position(ai_rec)) + + if not b_data then + return + end + + local b_name = minetest.get_biome_name(b_data.biome) + + if not b_name then + return + end + + if b_name ~= 'everness:mineral_waters' + -- for mese trees, they dont have specific biome + or minetest.get_item_group(n_name, 'tree') > 0 + or minetest.get_item_group(n_name, 'leaves') > 0 + then + -- bordering with anohter biome, be more precise in placing + precision_perc = 100 + end + + if n_def + and n_def.walkable + and data[ai_rec + area.ystride] == minetest.CONTENT_AIR + then + walkable_nodes = walkable_nodes + 1 + end + end + end + + -- build pool (cuboid) + local pool_build_nodes_group = pool_build_nodes[rand:next(1, #pool_build_nodes)] + + if walkable_nodes >= (width * length / 100) * precision_perc then + -- offset y so the pools are sticking out / sinking in from the ground vertically + local ai_offset_y = ai - (area.ystride * height) + (area.ystride * rand:next(0, math.ceil(height / 2))) + + for hi = 1, height do + for li = 1, length do + for wi = 1, width do + local mineral_stone = pool_build_nodes_group[rand:next(1, #pool_build_nodes_group)] + local ai_cub = (ai_offset_y + li) + (area.ystride * hi) + (area.zstride * wi) + local current_c_id = data[ai_cub] + + -- Check for water and build nodes before replacing, this will make pools connected and will not replace already built walls from another pool near by + if hi == 1 + and current_c_id ~= c_everness_mineral_water_source + and not find_irecursive(pool_build_nodes, current_c_id) + then + -- build pool floor + data[ai_cub] = mineral_stone + elseif hi ~= 1 + and (wi == 1 or wi == width) + and current_c_id ~= c_everness_mineral_water_source + and not find_irecursive(pool_build_nodes, current_c_id) + then + -- build pool wall + data[ai_cub] = mineral_stone + elseif hi ~= 1 + and (li == 1 or li == length) + and (wi ~= 1 or wi ~= width) + and current_c_id ~= c_everness_mineral_water_source + and not find_irecursive(pool_build_nodes, current_c_id) + then + -- build pool wall + data[ai_cub] = mineral_stone + else + -- fill in the pool with water + data[ai_cub] = c_everness_mineral_water_source + end + + -- place loot chest in the middle of the pool floor + if hi == 2 + and height > 4 + and math.ceil(length / 2) == li + and math.ceil(width / 2) == wi + and data[ai_cub - area.ystride] ~= c_everness_mineral_water_source + and rand:next(0, 100) < 3 + then + data[ai_cub] = c_everness_chest + table.insert(chest_positions, vector.new(area:position(ai_cub))) + end + end + end + end + end + end + end + end + end + elseif rand_version == 2 then + -- + -- Lakes + -- + for z = minp.z, maxp.z do + for y = minp.y, maxp.y do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + local c_current = data[ai] + + -- +Y, -Y, +X, -X, +Z, -Z + -- top, bottom, right, left, front, back + -- right + local c_right = data[ai + 1] + -- left + local c_left = data[ai - 1] + -- front + local c_front = data[ai + (area.zstride * 2)] + -- back + local c_back = data[ai - (area.zstride * 2)] + + local keep_going = true + local while_count = 1 + local max_dig_depth = 11 + + if + c_current == c_everness_mineral_sand + and ( + c_right == c_everness_mineral_sand + or c_right == c_everness_mineral_water_source + or c_right == c_everness_mineral_stone + or c_right == c_everness_mineral_stone_with_coal + or c_right == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + c_left == c_everness_mineral_sand + or c_left == c_everness_mineral_water_source + or c_left == c_everness_mineral_stone + or c_left == c_everness_mineral_stone_with_coal + or c_left == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + c_front == c_everness_mineral_sand + or c_front == c_everness_mineral_water_source + or c_front == c_everness_mineral_stone + or c_front == c_everness_mineral_stone_with_coal + or c_front == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + c_back == c_everness_mineral_sand + or c_back == c_everness_mineral_water_source + or c_back == c_everness_mineral_stone + or c_back == c_everness_mineral_stone_with_coal + or c_back == c_everness_mineral_stone_with_ceramic_sherds + ) + then + -- dig below + while keep_going and while_count <= max_dig_depth do + local while_index = ai - area.ystride * while_count + + if + -- below + ( + data[while_index] == c_everness_mineral_stone + or data[while_index] == c_everness_mineral_stone_with_coal + or data[while_index] == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + -- right + data[while_index + 1 + area.ystride] == c_everness_mineral_sand + or data[while_index + 1 + area.ystride] == c_everness_mineral_water_source + or data[while_index + 1 + area.ystride] == c_everness_mineral_stone + or data[while_index + 1 + area.ystride] == c_everness_mineral_stone_with_coal + or data[while_index + 1 + area.ystride] == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + -- left + data[while_index - 1 + area.ystride] == c_everness_mineral_sand + or data[while_index - 1 + area.ystride] == c_everness_mineral_water_source + or data[while_index - 1 + area.ystride] == c_everness_mineral_stone + or data[while_index - 1 + area.ystride] == c_everness_mineral_stone_with_coal + or data[while_index - 1 + area.ystride] == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + -- front + data[while_index + area.zstride + area.ystride] == c_everness_mineral_sand + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_water_source + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_stone + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_stone_with_coal + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_stone_with_ceramic_sherds + ) + and ( + -- back + data[while_index - area.zstride + area.ystride] == c_everness_mineral_sand + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_water_source + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_stone + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_stone_with_coal + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_stone_with_ceramic_sherds + ) + then + data[while_index + area.ystride] = c_everness_mineral_water_source + else + keep_going = false + end + + while_count = while_count + 1 + end + end + end + end + end + end + + -- Place decorations after generating (2nd pass) + -- luacheck: ignore 512 + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + -- + -- Place Lotus Flowers and Leaves + -- + if + data[ai] == c_everness_mineral_water_source + -- spawn around water + and data[ai + 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + 1] == c_everness_mineral_water_source + and data[ai - 1] == c_everness_mineral_water_source + and data[ai - 1 + area.zstride] == c_everness_mineral_water_source + and data[ai - 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.zstride] == c_everness_mineral_water_source + and data[ai - area.zstride] == c_everness_mineral_water_source + -- make sure there is space above + and data[ai + area.ystride] == minetest.CONTENT_AIR + -- spawn around air above + and data[ai + area.ystride + 1] == minetest.CONTENT_AIR + and data[ai + area.ystride + 1 + area.zstride] == minetest.CONTENT_AIR + and data[ai + area.ystride + 1 - area.zstride] == minetest.CONTENT_AIR + and data[ai + area.ystride - 1] == minetest.CONTENT_AIR + and data[ai + area.ystride - 1 + area.zstride] == minetest.CONTENT_AIR + and data[ai + area.ystride - 1 - area.zstride] == minetest.CONTENT_AIR + and data[ai + area.ystride + area.zstride] == minetest.CONTENT_AIR + and data[ai + area.ystride - area.zstride] == minetest.CONTENT_AIR + then + if rand:next(0, 100) < 2 then + data[ai + area.ystride] = c_lotus_flowers[rand:next(1, #c_lotus_flowers)] + + -- Place Lotus Leaves around Flowers + local radius = 3 + local chance_max = 80 + + for i = -radius, radius do + for j = -radius, radius do + local idx = ai + i + (area.zstride * j) + area.ystride + local distance = math.round(vector.distance(area:position(ai), area:position(idx))) + local chance_lotus_leaf = math.round(chance_max / distance) + + if chance_lotus_leaf > chance_max then + chance_lotus_leaf = chance_max + end + + if + rand:next(0, 100) < chance_lotus_leaf + and data[idx] == minetest.CONTENT_AIR + and data[idx - area.ystride] == c_everness_mineral_water_source + then + data[idx] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)] + p2data[idx] = rand:next(0, 3) + end + end + end + elseif rand:next(0, 100) < 4 then + data[ai + area.ystride] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)] + p2data[ai + area.ystride] = rand:next(0, 3) + + -- add some more leaves around the leaf + for i = -1, 1 do + for j = -1, 1 do + local idx = ai + i + (area.zstride * j) + area.ystride + + if + rand:next(0, 100) < 25 + and data[idx] == minetest.CONTENT_AIR + and data[idx - area.ystride] == c_everness_mineral_water_source + then + data[idx] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)] + p2data[idx] = rand:next(0, 3) + end + end + end + end + end + + -- + -- Place Seaweed + -- + if + data[ai] == c_everness_mineral_water_source + and data[ai + area.ystride] == c_everness_mineral_water_source + and rand:next(0, 100) < 33 + then + local c_weed = c_water_weeds[rand:next(1, #c_water_weeds)] + + if rand:next(0, 100) < 5 then + -- Weed with light source with a bit less probability + c_weed = c_everness_mineral_water_weed_3 + end + + if data[ai + 1] == c_everness_mineral_stone then + data[ai + 1] = c_weed + data[ai + 1] = c_weed + data[ai + 1] = c_weed + p2data[ai + 1] = 2 + elseif data[ai - 1] == c_everness_mineral_stone then + data[ai - 1] = c_weed + data[ai - 1] = c_weed + data[ai - 1] = c_weed + p2data[ai - 1] = 3 + elseif data[ai + area.zstride] == c_everness_mineral_stone then + data[ai + area.zstride] = c_weed + data[ai + area.zstride] = c_weed + data[ai + area.zstride] = c_weed + p2data[ai + area.zstride] = 4 + elseif data[ai - area.zstride] == c_everness_mineral_stone then + data[ai - area.zstride] = c_weed + data[ai - area.zstride] = c_weed + data[ai - area.zstride] = c_weed + p2data[ai - area.zstride] = 5 + elseif data[ai - area.ystride] == c_everness_mineral_stone then + data[ai - area.ystride] = c_weed + data[ai - area.ystride] = c_weed + data[ai - area.ystride] = c_weed + p2data[ai - area.ystride] = 1 + end + end + + -- + -- Place pots under water + -- + if + data[ai] == c_everness_mineral_water_source + -- spawn around water + and data[ai + 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + 1] == c_everness_mineral_water_source + and data[ai - 1] == c_everness_mineral_water_source + and data[ai - 1 + area.zstride] == c_everness_mineral_water_source + and data[ai - 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.zstride] == c_everness_mineral_water_source + and data[ai - area.zstride] == c_everness_mineral_water_source + -- spawn around water above + and data[ai + area.ystride] == c_everness_mineral_water_source + and data[ai + area.ystride + 1] == c_everness_mineral_water_source + and data[ai + area.ystride + 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride + 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride - 1] == c_everness_mineral_water_source + and data[ai + area.ystride - 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride - 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride + area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride - area.zstride] == c_everness_mineral_water_source + -- spawn on solid node below + and data[ai - area.ystride] ~= c_everness_mineral_water_source + then + if rand:next(0, 100) < 1 then + table.insert(pot_pos, vector.new(area:position(ai))) + end + end + end + end + end + + -- Set `shared_args` + shared_args.chest_positions = chest_positions + shared_args.pot_pos = pot_pos + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == minetest.CONTENT_AIR + and ( + data[vi] == c_everness_mineral_water_source + or data[vi] == c_everness_mineral_sand + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Mineral Waters Tower + -- + + -- find floor big enough + local positions = minetest.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:mineral_sand', + 'everness:mineral_water_source' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = minetest.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + minetest.place_schematic_on_vmanip( + vm, + s_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_mineral_waters_tower = shared_args.schem_positions.everness_mineral_waters_tower or {} + + table.insert(shared_args.schem_positions.everness_mineral_waters_tower, { + pos = s_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + minetest.log('action', '[Everness] Mineral Waters Tower was placed at ' .. s_pos:to_string()) + end + end + end + + -- + -- Place Decorations + -- + local pot_pos = shared_args.pot_pos or {} + + -- + -- Palm Trees + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_palm_trees or '')] or {}) do + place_decoration(pos, vm, area, data, 'everness:palm_trees', function(p) + minetest.place_schematic_on_vmanip( + vm, + p, + minetest.get_modpath('everness') .. '/schematics/everness_palm_tree.mts', + nil, + nil, + true, + 'place_center_x, place_center_z' + ) + end) + end + + -- + -- Water Geyser + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_water_geyser or '')] or {}) do + place_decoration(pos, vm, area, data, 'everness:water_geyser', function(p) + vm:set_node_at(p, { name = 'everness:water_geyser' }) + end) + end + + -- + -- Rose Bush + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_rose_bush or '')] or {}) do + place_decoration(pos, vm, area, data, 'everness:rose_bush', function(p) + vm:set_node_at(p, { name = 'everness:rose_bush' }) + end) + end + + -- + -- Pots (above water) + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_pots or '')] or {}) do + place_decoration(pos, vm, area, data, 'everness:pots', function(p, deco_def) + if deco_def._decoration then + -- Use `minetest.set_node` so we can set inventory on node construct + minetest.set_node(p, { name = deco_def._decoration[rand:next(1, #deco_def._decoration)] }) + + local inv = minetest.get_inventory({ type = 'node', pos = p }) + local item_def = Everness.loot_chest.default[rand:next(1, #Everness.loot_chest.default)] + + if not minetest.registered_items[item_def.name] then + return + end + + if rand:next(0, 100) <= item_def.chance then + local stack = ItemStack(item_def.name) + + if minetest.registered_tools[item_def.name] then + stack:set_wear(rand:next(1, 65535)) + else + stack:set_count(rand:next(1, math.min(item_def.max_count, stack:get_stack_max()))) + end + + inv:set_stack('main', 1, stack) + end + end + end) + end + + -- + -- Pots (under water) + -- + for _, v in ipairs(pot_pos) do + -- Use `minetest.set_node` so we can set inventory on node construct + minetest.set_node(v, { name = minetest.get_name_from_content_id(c_pots[rand:next(1, #c_pots)]) }) + + local inv = minetest.get_inventory({ type = 'node', pos = v }) + local item_def = Everness.loot_chest.default[rand:next(1, #Everness.loot_chest.default)] + + if not minetest.registered_items[item_def.name] then + return + end + + if rand:next(0, 100) <= item_def.chance then + local stack = ItemStack(item_def.name) + + if minetest.registered_tools[item_def.name] then + stack:set_wear(rand:next(1, 65535)) + else + stack:set_count(rand:next(1, math.min(item_def.max_count, stack:get_stack_max()))) + end + + inv:set_stack('main', 1, stack) + end + end + end, + after_write_to_map = function(shared_args) + -- Populate loot chest inventory + local chest_positions = shared_args.chest_positions or {} + + if next(chest_positions) then + Everness:populate_loot_chests(chest_positions) + end + + -- Populate loot chest inventory for schematics + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions2 = minetest.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions2 > 0 then + Everness:populate_loot_chests(chest_positions2) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_mineral_waters_under.lua b/mods/everness/mapgen_mineral_waters_under.lua new file mode 100644 index 00000000..209166fa --- /dev/null +++ b/mods/everness/mapgen_mineral_waters_under.lua @@ -0,0 +1,766 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_mineral_waters_under.y_max +local y_min = Everness.settings.biomes.everness_mineral_waters_under.y_min + +-- Mineral Waters + +Everness:register_biome({ + name = 'everness:mineral_waters_under', + node_stone = 'everness:mineral_cave_stone', + node_filler = 'everness:mineral_cave_stone', + node_cave_liquid = 'everness:lava_source', + node_water = 'air', + node_dungeon = 'everness:mineral_stone_brick', + node_dungeon_alt = 'everness:mineral_stone_brick_with_growth', + node_dungeon_stair = 'stairs:stair_mineral_stone_brick', + y_max = y_max, + y_min = y_min, + vertical_blend = 16, + heat_point = 78, + humidity_point = 58, +}) + +-- +-- Ores +-- + +minetest.register_on_mods_loaded(function() + local c_mapgen_stone = minetest.get_content_id('mapgen_stone') + local mapgen_stone_itemstring = minetest.get_name_from_content_id(c_mapgen_stone) + + for name, def in pairs(minetest.registered_ores) do + local wherein = def.wherein + local biomes = def.biomes + + if type(def.wherein) == 'string' then + wherein = { wherein } + end + + -- Register the same ores what are defined for `mapgen_stone` + if + table.indexof(wherein, mapgen_stone_itemstring) > -1 + and not biomes + and def.clust_scarcity ~= 1 -- ignore ores that replace everything + and (def.y_min <= y_max or def.y_max >= y_min) + then + def = table.copy(def) + def.wherein = { 'everness:mineral_cave_stone' } + def.biomes = asuna.features.cave.mineral_waters + + Everness:register_ore(def) + end + end +end) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:mineral_stone', + wherein = { 'everness:mineral_cave_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = asuna.features.cave.mineral_waters +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_floors', + deco_type = 'simple', + place_on = { + 'mapgen_stone', + 'everness:mineral_cave_stone', + }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = asuna.features.cave.mineral_waters, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:mineral_lava_stone' + }, +}) + +-- +-- Floors +-- + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_volcanic_spike', + deco_type = 'simple', + place_on = { + 'mapgen_stone', + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.mineral_waters, + spawn_by = 'air', + check_offset = 0, + num_spawn_by = 1, + decoration = { + 'everness:marker' + }, + y_max = y_max - 64, + y_min = y_min, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_lava_stone_spike', + deco_type = 'simple', + place_on = { + 'mapgen_stone', + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.075, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.mineral_waters, + decoration = { + 'everness:marker' + }, + y_max = y_max - 64, + y_min = y_min, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_lava_tree', + deco_type = 'simple', + place_on = { + 'mapgen_stone', + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone', + 'everness:mineral_lava_stone_with_moss' + }, + sidelen = 16, + fill_ratio = 0.025, + biomes = asuna.features.cave.mineral_waters, + decoration = { + 'everness:marker' + }, + y_max = y_max - 64, + y_min = y_min, + flags = 'all_floors', +}) + +-- +-- Ceilings +-- + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_volcanic_spike_ceiling', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = asuna.features.cave.mineral_waters, + decoration = { + 'everness:marker' + }, + y_max = y_max - 64, + y_min = y_min, + flags = 'all_ceilings', +}) + +-- +-- On Generated +-- + +-- Get the content IDs for the nodes used +local c_everness_wall_vine_cave_cyan = minetest.get_content_id('everness:wall_vine_cave_cyan') +local c_everness_wall_vine_cave_violet = minetest.get_content_id('everness:wall_vine_cave_violet') +local c_everness_wall_vine_cave_blue = minetest.get_content_id('everness:wall_vine_cave_blue') +local c_everness_mineral_lava_stone = minetest.get_content_id('everness:mineral_lava_stone') +local c_everness_mineral_cave_stone = minetest.get_content_id('everness:mineral_cave_stone') +local c_everness_mineral_cave_cobblestone = minetest.get_content_id('everness:mineral_cave_cobblestone') +local c_everness_lava_source = minetest.get_content_id('everness:lava_source') +local c_everness_marker = minetest.get_content_id('everness:marker') +local c_everness_volcanic_rock = minetest.get_content_id('everness:volcanic_rock') +local c_everness_volcanic_spike_1 = minetest.get_content_id('everness:volcanic_spike_1') +local c_everness_volcanic_spike_2 = minetest.get_content_id('everness:volcanic_spike_2') +local c_everness_volcanic_spike_3 = minetest.get_content_id('everness:volcanic_spike_3') +local c_everness_volcanic_spike_4 = minetest.get_content_id('everness:volcanic_spike_4') +local c_everness_volcanic_spike_5 = minetest.get_content_id('everness:volcanic_spike_5') +local c_everness_volcanic_spike_6 = minetest.get_content_id('everness:volcanic_spike_6') +local c_everness_volcanic_spike_7 = minetest.get_content_id('everness:volcanic_spike_7') +local c_everness_mineral_cave_stone_spike_1 = minetest.get_content_id('everness:mineral_cave_stone_spike_1') +local c_everness_mineral_cave_stone_spike_2 = minetest.get_content_id('everness:mineral_cave_stone_spike_2') +local c_everness_mineral_cave_stone_spike_3 = minetest.get_content_id('everness:mineral_cave_stone_spike_3') +local c_everness_mineral_cave_stone_spike_4 = minetest.get_content_id('everness:mineral_cave_stone_spike_4') +local c_everness_mineral_cave_stone_spike_5 = minetest.get_content_id('everness:mineral_cave_stone_spike_5') +local c_everness_mineral_cave_stone_spike_6 = minetest.get_content_id('everness:mineral_cave_stone_spike_6') +local c_everness_mineral_cave_stone_spike_7 = minetest.get_content_id('everness:mineral_cave_stone_spike_7') +local c_everness_mineral_lava_stone_spike_1 = minetest.get_content_id('everness:mineral_lava_stone_spike_1') +local c_everness_mineral_lava_stone_spike_2 = minetest.get_content_id('everness:mineral_lava_stone_spike_2') +local c_everness_mineral_lava_stone_spike_3 = minetest.get_content_id('everness:mineral_lava_stone_spike_3') +local c_everness_mineral_lava_stone_spike_4 = minetest.get_content_id('everness:mineral_lava_stone_spike_4') +local c_everness_mineral_lava_stone_spike_5 = minetest.get_content_id('everness:mineral_lava_stone_spike_5') +local c_everness_mineral_lava_stone_spike_6 = minetest.get_content_id('everness:mineral_lava_stone_spike_6') +local c_everness_mineral_lava_stone_spike_7 = minetest.get_content_id('everness:mineral_lava_stone_spike_7') +local c_everness_mineral_lava_stone_with_moss = minetest.get_content_id('everness:mineral_lava_stone_with_moss') +-- Biome IDs +local biome_id_everness_mineral_waters_under = {} +for _,biome in ipairs(asuna.features.cave.mineral_waters) do + table.insert(biome_id_everness_mineral_waters_under,minetest.get_biome_id(biome)) +end +-- Decoration IDs +local d_everness_mineral_waters_under_volcanic_spike = minetest.get_decoration_id('everness:mineral_waters_under_volcanic_spike') +local d_everness_mineral_waters_under_volcanic_spike_ceiling = minetest.get_decoration_id('everness:mineral_waters_under_volcanic_spike_ceiling') +local d_everness_mineral_waters_under_lava_stone_spike = minetest.get_decoration_id('everness:mineral_waters_under_lava_stone_spike') +local d_everness_mineral_waters_under_lava_tree = minetest.get_decoration_id('everness:mineral_waters_under_lava_tree') + +local volcanic_spike_place_on = minetest.registered_decorations['everness:mineral_waters_under_volcanic_spike'].place_on +volcanic_spike_place_on = type(volcanic_spike_place_on) == 'string' and { volcanic_spike_place_on } or volcanic_spike_place_on + +local volcanic_spike_ceiling_place_on = minetest.registered_decorations['everness:mineral_waters_under_volcanic_spike_ceiling'].place_on +volcanic_spike_ceiling_place_on = type(volcanic_spike_ceiling_place_on) == 'string' and { volcanic_spike_ceiling_place_on } or volcanic_spike_ceiling_place_on + +local lava_stone_spike_place_on = minetest.registered_decorations['everness:mineral_waters_under_lava_stone_spike'].place_on +lava_stone_spike_place_on = type(lava_stone_spike_place_on) == 'string' and { lava_stone_spike_place_on } or lava_stone_spike_place_on + +local lava_tree_place_on = minetest.registered_decorations['everness:mineral_waters_under_lava_tree'].place_on +lava_tree_place_on = type(lava_tree_place_on) == 'string' and { lava_tree_place_on } or lava_tree_place_on + +-- `minetest.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work +local schem_everness_lava_tree = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_lava_tree.mts', {}) +local lava_tree_size = { x = 7, y = 13, z = 7 } +local lava_tree_size_x = math.round(lava_tree_size.x / 2) +local lava_tree_size_z = math.round(lava_tree_size.z / 2) +local lava_tree_safe_volume = lava_tree_size.x * lava_tree_size.y * lava_tree_size.z + +local wall_vines = { + c_everness_wall_vine_cave_cyan, + c_everness_wall_vine_cave_violet, + c_everness_wall_vine_cave_blue +} + +local volcanic_spike_map = { + c_everness_volcanic_rock, + c_everness_volcanic_spike_1, + c_everness_volcanic_spike_2, + c_everness_volcanic_spike_3, + c_everness_volcanic_spike_4, + c_everness_volcanic_spike_5, + c_everness_volcanic_spike_6, + c_everness_volcanic_spike_7 +} + +local cave_stone_spike_map = { + c_everness_mineral_cave_cobblestone, + c_everness_mineral_cave_stone_spike_1, + c_everness_mineral_cave_stone_spike_2, + c_everness_mineral_cave_stone_spike_3, + c_everness_mineral_cave_stone_spike_4, + c_everness_mineral_cave_stone_spike_5, + c_everness_mineral_cave_stone_spike_6, + c_everness_mineral_cave_stone_spike_7 +} + +local lava_stone_spike_map = { + c_everness_mineral_lava_stone, + c_everness_mineral_lava_stone_spike_1, + c_everness_mineral_lava_stone_spike_2, + c_everness_mineral_lava_stone_spike_3, + c_everness_mineral_lava_stone_spike_4, + c_everness_mineral_lava_stone_spike_5, + c_everness_mineral_lava_stone_spike_6, + c_everness_mineral_lava_stone_spike_7 +} + +minetest.set_gen_notify({ decoration = true }, { + d_everness_mineral_waters_under_volcanic_spike, + d_everness_mineral_waters_under_lava_stone_spike, + d_everness_mineral_waters_under_volcanic_spike_ceiling, + d_everness_mineral_waters_under_lava_tree +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:mineral_waters_under', + can_run = function(biomemap) + for _,biome in ipairs(biome_id_everness_mineral_waters_under) do + if table.indexof(biomemap, biome) ~= -1 then + return true + end + end + return false + end, + -- read/write to `data` what will be eventually saved (set_data) + -- used for voxelmanip `data` manipulation + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + local rand_version = rand:next(1, 5) + shared_args.rand_version = rand_version + + if rand_version < 3 then + -- + -- Lakes + -- + for z = minp.z, maxp.z do + for y = minp.y, maxp.y do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + local c_current = data[ai] + + -- +Y, -Y, +X, -X, +Z, -Z + -- top, bottom, right, left, front, back + -- right + local c_right = data[ai + 1] + -- left + local c_left = data[ai - 1] + -- front + local c_front = data[ai + area.zstride] + -- back + local c_back = data[ai - area.zstride] + + local keep_going = true + local while_count = 1 + local max_dig_depth = 11 + + if + y <= -64 and -- spawn lava in deeper caves only + rand:next(1,5) == 1 and -- reduce lava lakes + c_current == c_everness_mineral_lava_stone + and ( + c_right == c_everness_mineral_lava_stone + or c_right == c_everness_mineral_cave_stone + or c_right == c_everness_lava_source + ) + and ( + c_left == c_everness_mineral_lava_stone + or c_left == c_everness_mineral_cave_stone + or c_left == c_everness_lava_source + ) + and ( + c_front == c_everness_mineral_lava_stone + or c_front == c_everness_mineral_cave_stone + or c_front == c_everness_lava_source + ) + and ( + c_back == c_everness_mineral_lava_stone + or c_back == c_everness_mineral_cave_stone + or c_back == c_everness_lava_source + ) + then + -- dig below + while keep_going and while_count <= max_dig_depth do + local while_index = ai - area.ystride * while_count + + if + -- below + data[while_index] == c_everness_mineral_cave_stone + and ( + -- right + data[while_index + 1 + area.ystride] == c_everness_mineral_lava_stone + or data[while_index + 1 + area.ystride] == c_everness_lava_source + or data[while_index + 1 + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- left + data[while_index - 1 + area.ystride] == c_everness_mineral_lava_stone + or data[while_index - 1 + area.ystride] == c_everness_lava_source + or data[while_index - 1 + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- front + data[while_index + area.zstride + area.ystride] == c_everness_mineral_lava_stone + or data[while_index + area.zstride + area.ystride] == c_everness_lava_source + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- back + data[while_index - area.zstride + area.ystride] == c_everness_mineral_lava_stone + or data[while_index - area.zstride + area.ystride] == c_everness_lava_source + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_cave_stone + ) + then + data[while_index + area.ystride] = c_everness_lava_source + else + keep_going = false + end + + while_count = while_count + 1 + end + end + end + end + end + else + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + + if + data[ai] == c_everness_mineral_lava_stone + and data[ai + area.ystride] == minetest.CONTENT_AIR + and rand:next(0, 100) <= 10 + then + local radius = 7 + local chance_max = 80 + + for h = -3, 3 do + for i = -radius, radius do + for j = -radius, radius do + local idx = ai + i + (area.zstride * j) + (area.ystride * h) + local distance = math.round(vector.distance(area:position(ai), area:position(idx))) + local chance_moss = math.round(chance_max / distance) + + if chance_moss > chance_max then + chance_moss = chance_max + end + + if + data[idx] == c_everness_mineral_lava_stone + and rand:next(0, 100) < chance_moss + then + data[idx] = c_everness_mineral_lava_stone_with_moss + end + end + end + end + end + end + end + end + end + + -- + -- Decorations + -- + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == minetest.CONTENT_AIR + and ( + data[vi + 1] == c_everness_mineral_cave_stone + or data[vi - 1] == c_everness_mineral_cave_stone + or data[vi + area.zstride] == c_everness_mineral_cave_stone + or data[vi - area.zstride] == c_everness_mineral_cave_stone + ) + and rand:next(0, 100) <= 15 + then + -- Decorate Walls + local dir = vector.zero() + + if data[vi + 1] == c_everness_mineral_cave_stone then + dir.x = 1 + end + + if data[vi - 1] == c_everness_mineral_cave_stone then + dir.x = -1 + end + + if data[vi + area.zstride] == c_everness_mineral_cave_stone then + dir.z = 1 + end + + if data[vi - area.zstride] == c_everness_mineral_cave_stone then + dir.z = -1 + end + + local rand_wall_vine = wall_vines[rand:next(1, #wall_vines)] + data[vi] = rand_wall_vine + p2data[vi] = minetest.dir_to_wallmounted(dir) + end + end + end + end + + -- + -- Spikes Floor + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_volcanic_spike or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx + area.ystride + local place_on_node_name = minetest.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = minetest.CONTENT_AIR + + if table.indexof(volcanic_spike_place_on, place_on_node_name) ~= -1 then + local min_height = 3 + local max_height = 8 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y + 1, pos.z), + vector.new(pos.x, pos.y + max_height, pos.z), + { + minetest.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local height = rand:next(min_height, #indexes) + local start_index = #volcanic_spike_map - height + 1 + local count = 0 + + for i = start_index, #volcanic_spike_map do + data[idx_marker + area.ystride * count] = volcanic_spike_map[i] + count = count + 1 + end + end + end + end + end + + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_lava_stone_spike or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx + area.ystride + local place_on_node_name = minetest.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = minetest.CONTENT_AIR + + if table.indexof(lava_stone_spike_place_on, place_on_node_name) ~= -1 then + local min_height = 3 + local max_height = 8 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y + 1, pos.z), + vector.new(pos.x, pos.y + max_height, pos.z), + { + minetest.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local height = rand:next(min_height, #indexes) + local start_index = #cave_stone_spike_map - height + 1 + local count = 0 + + for i = start_index, #cave_stone_spike_map do + data[idx_marker + area.ystride * count] = cave_stone_spike_map[i] + count = count + 1 + end + end + end + end + end + + -- + -- Spikes Ceiling + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_volcanic_spike_ceiling or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx - area.ystride + local place_on_node_name = minetest.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = minetest.CONTENT_AIR + -- data[idx_marker] = minetest.get_content_id('everness:pyrite_lantern') + + if table.indexof(volcanic_spike_ceiling_place_on, place_on_node_name) ~= -1 then + local min_height = 3 + local max_height = 16 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y - max_height, pos.z), + vector.new(pos.x, pos.y - 1, pos.z), + { + minetest.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local remainder = 0 + local height = rand:next(min_height, #indexes) + + if height > #lava_stone_spike_map then + remainder = height - #lava_stone_spike_map + height = height - remainder + end + + local start_index = #lava_stone_spike_map - height + 1 + local count = 0 + + if remainder > 0 then + for i = 1, remainder do + data[idx_marker - area.ystride * count] = c_everness_mineral_cave_cobblestone + count = count + 1 + end + end + + for i = start_index, #lava_stone_spike_map do + data[idx_marker - area.ystride * count] = lava_stone_spike_map[i] + count = count + 1 + end + end + end + end + end + end, + -- read-only (but cant and should not manipulate) voxelmanip `data` + -- used for `place_schematic_on_vmanip` which will invalidate `data` + -- therefore we are doing it after we set the data + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Lava Trees + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_lava_tree or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = minetest.get_node(marker_pos) + local place_on_node = minetest.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + minetest.remove_node(marker_pos) + + if shared_args.rand_version > 2 + and table.indexof(lava_tree_place_on, place_on_node.name) ~= -1 + then + -- enough air to place structure ? + local positions = minetest.find_nodes_in_area( + vector.new( + pos.x - lava_tree_size_x, + pos.y, + pos.z - lava_tree_size_z + ), + vector.new( + pos.x + lava_tree_size_x, + pos.y + lava_tree_size.y, + pos.z + lava_tree_size_z + ), + { + 'air', + 'everness:lava_tree', + 'everness:lava_tree_with_lava' + }, + true + ) + + local air = positions.air or {} + local tree1 = positions['everness:lava_tree'] or {} + local tree2 = positions['everness:lava_tree_with_lava'] or {} + + -- do not overlap another tree + if + #tree1 == 0 + and #tree2 == 0 + and #air > lava_tree_safe_volume + then + local replacements + + if rand:next(0, 100) <= 25 then + replacements = { + ['everness:lava_tree'] = 'everness:lava_tree_with_lava', + } + end + + shared_args.lava_tree_positions = shared_args.lava_tree_positions or {} + table.insert(shared_args.lava_tree_positions, marker_pos) + + minetest.place_schematic_on_vmanip( + vm, + marker_pos, + schem_everness_lava_tree, + 'random', + replacements, + false, + 'place_center_x, place_center_z' + ) + end + end + end + end + end, + -- Cannot read/write voxelmanip or its data + -- Used for direct manipulation of the world chunk nodes where the + -- definitions of nodes are available and node callback can be executed + -- or e.g. for `minetest.fix_light` + after_write_to_map = function(shared_args, gennotify, rand) + local lava_tree_positions = shared_args.lava_tree_positions or {} + + for _, p in ipairs(lava_tree_positions) do + local grass_positions = minetest.find_nodes_in_area_under_air( + vector.subtract(p, { x = 3, y = 1, z = 3 }), + vector.add(p, { x = 3, y = 1, z = 3 }), + 'everness:mineral_lava_stone_with_moss' + ) + + if #grass_positions > 1 then + for i = 1, rand:next(1, 3) do + local rand_p = grass_positions[rand:next(1, #grass_positions)] + + if not vector.equals(p, rand_p) then + minetest.set_node(vector.new(rand_p.x, rand_p.y + 1, rand_p.z), { name = 'everness:mineral_cave_moss_grass' }) + end + end + end + end + end +}) diff --git a/mods/everness/minetest.example.mcl.conf b/mods/everness/minetest.example.mcl.conf new file mode 100644 index 00000000..68bb0358 --- /dev/null +++ b/mods/everness/minetest.example.mcl.conf @@ -0,0 +1,92 @@ +everness_coral_forest = true +everness_coral_forest_y_max = 194 +everness_coral_forest_y_min = 6 +everness_coral_forest_dunes = true +everness_coral_forest_dunes_y_max = 5 +everness_coral_forest_dunes_y_min = 4 +everness_coral_forest_ocean = true +everness_coral_forest_ocean_y_max = 3 +everness_coral_forest_ocean_y_min = -10 +everness_coral_forest_deep_ocean = true +everness_coral_forest_deep_ocean_y_max = -11 +everness_coral_forest_deep_ocean_y_min = -62 +everness_coral_forest_under = true +everness_coral_forest_under_y_max = -28939 +everness_coral_forest_under_y_min = -29067 +everness_frosted_icesheet = true +everness_frosted_icesheet_y_max = 194 +everness_frosted_icesheet_y_min = -8 +everness_frosted_icesheet_ocean = true +everness_frosted_icesheet_ocean_y_max = -9 +everness_frosted_icesheet_ocean_y_min = -62 +everness_frosted_icesheet_under = true +everness_frosted_icesheet_under_y_max = -28939 +everness_frosted_icesheet_under_y_min = -29067 +everness_cursed_lands = true +everness_cursed_lands_y_max = 194 +everness_cursed_lands_y_min = 6 +everness_cursed_lands_dunes = true +everness_cursed_lands_dunes_y_max = 5 +everness_cursed_lands_dunes_y_min = 1 +everness_cursed_lands_swamp = true +everness_cursed_lands_swamp_y_max = 0 +everness_cursed_lands_swamp_y_min = -1 +everness_cursed_lands_ocean = true +everness_cursed_lands_ocean_y_max = -2 +everness_cursed_lands_ocean_y_min = -10 +everness_cursed_lands_deep_ocean = true +everness_cursed_lands_deep_ocean_y_max = -11 +everness_cursed_lands_deep_ocean_y_min = -62 +everness_cursed_lands_under = true +everness_cursed_lands_under_y_max = -28939 +everness_cursed_lands_under_y_min = -29067 +everness_crystal_forest = true +everness_crystal_forest_y_max = 194 +everness_crystal_forest_y_min = 6 +everness_crystal_forest_dunes = true +everness_crystal_forest_dunes_y_max = 5 +everness_crystal_forest_dunes_y_min = 1 +everness_crystal_forest_shore = true +everness_crystal_forest_shore_y_max = 0 +everness_crystal_forest_shore_y_min = -1 +everness_crystal_forest_ocean = true +everness_crystal_forest_ocean_y_max = 2 +everness_crystal_forest_ocean_y_min = -10 +everness_crystal_forest_deep_ocean = true +everness_crystal_forest_deep_ocean_y_max = -11 +everness_crystal_forest_deep_ocean_y_min = -62 +everness_crystal_forest_under = true +everness_crystal_forest_under_y_max = -28939 +everness_crystal_forest_under_y_min = -29067 +everness_bamboo_forest = true +everness_bamboo_forest_y_max = 194 +everness_bamboo_forest_y_min = 1 +everness_bamboo_forest_under = true +everness_bamboo_forest_under_y_max = -28939 +everness_bamboo_forest_under_y_min = -29067 +everness_forsaken_desert = true +everness_forsaken_desert_y_max = 194 +everness_forsaken_desert_y_min = 4 +everness_forsaken_desert_ocean = true +everness_forsaken_desert_ocean_y_max = 3 +everness_forsaken_desert_ocean_y_min = -8 +everness_forsaken_desert_under = true +everness_forsaken_desert_under_y_max = -28939 +everness_forsaken_desert_under_y_min = -29067 +everness_baobab_savanna = true +everness_baobab_savanna_y_max = 194 +everness_baobab_savanna_y_min = 1 +everness_forsaken_tundra = true +everness_forsaken_tundra_y_max = 194 +everness_forsaken_tundra_y_min = 2 +everness_forsaken_tundra_beach = true +everness_forsaken_tundra_beach_y_max = 1 +everness_forsaken_tundra_beach_y_min = -3 +everness_forsaken_tundra_ocean = true +everness_forsaken_tundra_ocean_y_max = -4 +everness_forsaken_tundra_ocean_y_min = -15 +everness_forsaken_tundra_under = true +everness_forsaken_tundra_under_y_max = -28939 +everness_forsaken_tundra_under_y_min = -29067 +everness_feature_sneak_pickup = false +everness_feature_skybox = true diff --git a/mods/everness/mod.conf b/mods/everness/mod.conf new file mode 100644 index 00000000..2708aee2 --- /dev/null +++ b/mods/everness/mod.conf @@ -0,0 +1,5 @@ +name = everness +description = Never ending discovery in Everness mapgen. +depends = +optional_depends = default, xpanes, doors, stairs, walls, x_obsidianmese, x_tumbleweed, x_farming, x_clay, mcl_core, mcl_fences, mcl_walls, mcl_stairs, mcl_util, mcl_autogroup, mcl_doors, mcl_mapgen_core, rp_default, i3, unified_inventory, sfinv +min_minetest_version = 5.6.1 diff --git a/mods/everness/mod_support_mcl.lua b/mods/everness/mod_support_mcl.lua new file mode 100644 index 00000000..2b6cd292 --- /dev/null +++ b/mods/everness/mod_support_mcl.lua @@ -0,0 +1,1351 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +--- +-- Fence / Gates +--- + +-- Dry Wood + +mcl_fences.register_fence_and_fence_gate( + 'fence_dry_wood', + S('Dry Wood Fence'), + S('Dry Wood Fence Gate'), + 'everness_fence_dry_wood.png', + { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }, + 2, + 15, + { 'group:fence_wood' }, + Everness.node_sound_wood_defaults() +) + +-- Bamboo Wood + +mcl_fences.register_fence_and_fence_gate( + 'fence_bamboo_wood', + S('Bamboo Wood Fence'), + S('Bamboo Wood Fence Gate'), + 'everness_fence_bamboo_wood.png', + { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }, + 2, + 15, + { 'group:fence_wood' }, + Everness.node_sound_wood_defaults() +) + +-- Crystal Wood + +mcl_fences.register_fence_and_fence_gate( + 'gate_crystal_wood', + S('Crystal Wood Fence'), + S('Crystal Wood Fence Gate'), + 'everness_crystal_wood.png', + { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }, + 2, + 15, + { 'group:fence_wood' }, + Everness.node_sound_wood_defaults() +) + +-- Palm Wood + +mcl_fences.register_fence_and_fence_gate( + 'gate_palm_tree_wood', + S('Palm Wood Fence'), + S('Palm Wood Fence Gate'), + 'everness_palm_tree_wood.png', + { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }, + 2, + 15, + { 'group:fence_wood' }, + Everness.node_sound_wood_defaults() +) + +--- +-- Walls +--- + +mcl_walls.register_wall( + 'everness:coraldesertcobblewall', + S('Coral Cobblestone Wall'), + 'everness:coral_desert_cobble', + { 'everness_coral_desert_cobble.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:coraldesertmossycobblewall', + S('Coral Mossy Cobblestone Wall'), + 'everness:coral_desert_mossy_cobble', + { 'everness_coral_desert_mossy_cobble.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:cursedbrickwall', + S('Cursed Brick Wall'), + 'everness:cursed_brick', + { 'everness_cursed_brick.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:cursedbrickwithgrowthwall', + S('Cursed Brick with Growth Wall'), + 'everness:cursed_brick_with_growth', + { 'everness_cursed_brick_with_growth.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:forsakentundracobblewall', + S('Forsaken Tundra Cobblestone Wall'), + 'everness:forsaken_tundra_cobble', + { 'everness_forsaken_tundra_cobblestone.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:forsakentundrastonewall', + S('Forsaken Tundra Stone Wall'), + 'everness:forsaken_tundra_stone', + { 'everness_forsaken_tundra_stone.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:forsakentundrabrickwall', + S('Forsaken Tundra Brick Wall'), + 'everness:forsaken_tundra_brick', + { 'everness_forsaken_tundra_brick.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:magmacobblewall', + S('Magma Cobblestone Wall'), + 'everness:magmacobble', + { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:volcanicrockwall', + S('Volcanic Rock Wall'), + 'everness:volcanic_rock', + { 'everness_volcanic_rock.png' }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +mcl_walls.register_wall( + 'everness:volcanicrockwithmagmawall', + S('Volcanic Rock with Magma Wall'), + 'everness:volcanic_rock_with_magma', + { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + nil, + nil, + Everness.node_sound_stone_defaults() +) + +--- +-- Stairs and Slabs +--- + +mcl_stairs.register_stair_and_slab( + 'coral_desert_stone', + 'everness:coral_desert_stone', + { pickaxey = 3 }, + { 'everness_coral_desert_stone.png' }, + S('Coral Desert Stone Stair'), + S('Coral Desert Stone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Desert Stone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_desert_cobble', + 'everness:coral_desert_cobble', + { pickaxey = 3 }, + { 'everness_coral_desert_cobble.png' }, + S('Coral Desert Cobblestone Stair'), + S('Coral Desert Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Desert Cobblestone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_desert_mossy_cobble', + 'everness:coral_desert_mossy_cobble', + { pickaxey = 3 }, + { 'everness_coral_desert_mossy_cobble.png' }, + S('Coral Mossy Cobblestone Stair'), + S('Coral Mossy Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Mossy Cobblestone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'cursed_brick', + 'everness:cursed_brick', + { pickaxey = 1 }, + { 'everness_cursed_brick.png' }, + S('Cursed Brick Stair'), + S('Cursed Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Cursed Brick Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'cursed_brick_with_growth', + 'everness:cursed_brick_with_growth', + { pickaxey = 1 }, + { 'everness_cursed_brick_with_growth.png' }, + S('Cursed Brick with Growth Stair'), + S('Cursed Brick with Growth Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Cursed Brick with Growth Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_bones_block', + 'everness:coral_bones_block', + { pickaxey = 1 }, + { 'everness_coral_bones_block.png' }, + S('Coral Bones Block Stair'), + S('Coral Bones Block Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Bones Block Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_bones_brick', + 'everness:coral_bones_brick', + { pickaxey = 1 }, + { 'everness_coral_bones_brick.png' }, + S('Coral Bones Brick Stair'), + S('Coral Bones Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Bones Brick Slab'), + nil +) + +-- Quartz + +mcl_stairs.register_stair_and_slab( + 'quartz_block', + 'everness:quartz_block', + { pickaxey = 2 }, + { + 'everness_quartz_block_top.png', + 'everness_quartz_block_bottom.png', + 'everness_quartz_block_side.png', + }, + S('Quartz Block Stair'), + S('Quartz Block Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Quartz Block Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'quartz_chiseled', + 'everness:quartz_chiseled', + { pickaxey = 2 }, + { + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled.png', + }, + S('Quartz Chiseled Stair'), + S('Quartz Chiseled Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Quartz Chiseled Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'quartz_pillar', + 'everness:quartz_pillar', + { pickaxey = 2 }, + { + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines.png', + }, + S('Quartz Pillar Stair'), + S('Quartz Pillar Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Quartz Pillar Slab'), + nil +) + +-- Dry Wood + +mcl_stairs.register_stair_and_slab( + 'dry_wood', + 'everness:dry_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_dry_wood.png' }, + S('Dry Wood Stair'), + S('Dry Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Dry Wood Slab'), + nil +) + +-- Coral Wood + +mcl_stairs.register_stair_and_slab( + 'coral_wood', + 'everness:coral_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_coral_wood.png' }, + S('Coral Wood Stair'), + S('Coral Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Coral Wood Slab'), + nil +) + +-- Bamboo Wood + +mcl_stairs.register_stair_and_slab( + 'bamboo_wood', + 'everness:bamboo_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_dry_bamboo_block_side.png' }, + S('Bamboo Wood Stair'), + S('Bamboo Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Bamboo Wood Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'bamboo_mosaic_wood', + 'everness:bamboo_mosaic_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_bamboo_mosaic.png' }, + S('Bamboo Mosaic Wood Stair'), + S('Bamboo Mosaic Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Bamboo Mosaic Wood Slab'), + nil +) + +-- Forsaken stone + +mcl_stairs.register_stair_and_slab( + 'forsaken_desert_brick', + 'everness:forsaken_desert_brick', + { pickaxey = 2, stone = 1 }, + { 'everness_forsaken_desert_brick.png' }, + S('Forsaken Desert Brick Stair'), + S('Forsaken Desert Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Forsaken Desert Brick Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'forsaken_desert_brick_red', + 'everness:forsaken_desert_brick_red', + { pickaxey = 2, stone = 1 }, + { 'everness_forsaken_desert_brick_red.png' }, + S('Forsaken Desert Brick Red Stair'), + S('Forsaken Desert Brick Red Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Forsaken Desert Brick Red Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_chiseled_stone', + { pickaxey = 2, stone = 1 }, + { 'everness_forsaken_desert_chiseled_stone_side.png' }, + S('Forsaken Desert Chiseled Stone Stair'), + S('Forsaken Desert Chiseled Stone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Forsaken Desert Chiseled Stone Slab'), + nil +) + +-- Baobab Wood + +mcl_stairs.register_stair_and_slab( + 'baobab_wood', + 'everness:baobab_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_baobab_wood.png' }, + S('Baobab Wood Stair'), + S('Baobab Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Baobab Wood Slab'), + nil +) + +-- Sequoia Wood + +mcl_stairs.register_stair_and_slab( + 'sequoia_wood', + 'everness:sequoia_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_sequoia_wood.png' }, + S('Sequoia Wood Stair'), + S('Sequoia Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Sequoia Wood Slab'), + nil +) + +-- Forsaken Tundra + +mcl_stairs.register_stair_and_slab( + 'forsaken_tundra_cobble', + 'everness:forsaken_tundra_cobble', + { pickaxey = 3, stone = 2 }, + { 'everness_forsaken_tundra_cobblestone.png' }, + S('Forsaken Tundra Cobblestone Stair'), + S('Forsaken Tundra Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Forsaken Tundra Cobblestone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'forsaken_tundra_stone', + 'everness:forsaken_tundra_stone', + { pickaxey = 3, stone = 1 }, + { 'everness_forsaken_tundra_stone.png' }, + S('Forsaken Tundra Stone Stair'), + S('Forsaken Tundra Stone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Forsaken Tundra Stone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'forsaken_tundra_brick', + 'everness:forsaken_tundra_brick', + { pickaxey = 2, stone = 1 }, + { 'everness_forsaken_tundra_brick.png' }, + S('Forsaken Tundra Brick Stair'), + S('Forsaken Tundra Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Forsaken Tundra Brick Slab'), + nil +) + +-- Willow Wood + +mcl_stairs.register_stair_and_slab( + 'willow_wood', + 'everness:willow_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_willow_wood.png' }, + S('Willow Wood Stair'), + S('Willow Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Willow Wood Slab'), + nil +) + + +-- Magma Cobble + +mcl_stairs.register_stair_and_slab( + 'magmacobble', + 'everness:magmacobble', + { pickaxey = 3, stone = 1 }, + { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + } + }, + S('Magma Cobblestone Stair'), + S('Magma Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Magma Cobblestone Slab'), + nil +) + +-- Volcanic rock + +mcl_stairs.register_stair_and_slab( + 'volcanic_rock', + 'everness:volcanic_rock', + { pickaxey = 1, stone = 2 }, + { 'everness_volcanic_rock.png' }, + S('Volcanic Rock Stair'), + S('Volcanic Rock Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Volcanic Rock Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'volcanic_rock_with_magma', + 'everness:volcanic_rock_with_magma', + { pickaxey = 1, stone = 2 }, + { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + S('Volcanic Rock with Magma Stair'), + S('Volcanic Rock with Magma Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Volcanic Rock with Magma Slab'), + nil +) + +-- Coral Forest Deep Ocean + +mcl_stairs.register_stair_and_slab( + 'coral_deep_ocean_sandstone_block', + 'everness:coral_deep_ocean_sandstone_block', + { pickaxey = 2 }, + { 'everness_deep_ocean_sandstone_block.png' }, + S('Coral Depp Ocean Sandstone Block Stair'), + S('Coral Depp Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Depp Ocean Sandstone Block Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_deep_ocean_sandstone_brick', + 'everness:coral_deep_ocean_sandstone_brick', + { pickaxey = 2 }, + { 'everness_deep_ocean_sandstone_brick.png' }, + S('Coral Depp Ocean Sandstone Brick Stair'), + S('Coral Depp Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Depp Ocean Sandstone Brick Slab'), + nil +) + +-- Coral White Sandstone + +mcl_stairs.register_stair_and_slab( + 'coral_white_sandstone', + 'everness:coral_white_sandstone', + { pickaxey = 2 }, + { 'everness_coral_white_sandstone.png' }, + S('Coral White Sandstone Stair'), + S('Coral White Sandstone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral White Sandstone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_white_sandstone_pillar', + 'everness:coral_white_sandstone_pillar', + { pickaxey = 2 }, + { + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone_pillar.png', + }, + S('Coral White Sandstone Pillar Stair'), + S('Coral White Sandstone Pillar Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral White Sandstone Pillar Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_white_sandstone_brick', + 'everness:coral_white_sandstone_brick', + { pickaxey = 2 }, + { 'everness_coral_white_sandstone_brick.png' }, + S('Coral White Sandstone Brick Stair'), + S('Coral White Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral White Sandstone Brick Slab'), + nil +) + +-- Coral Desert Stone + +mcl_stairs.register_stair_and_slab( + 'coral_desert_stone_block', + 'everness:coral_desert_stone_block', + { pickaxey = 2 }, + { 'everness_coral_desert_stone_block.png' }, + S('Coral Desert Stone Block Stair'), + S('Coral Desert Stone Block Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Desert Stone Block Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_desert_stone_brick', + 'everness:coral_desert_stone_brick', + { pickaxey = 2 }, + { 'everness_coral_desert_stone_brick.png' }, + S('Coral Desert Stone Brick Stair'), + S('Coral Desert Stone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Desert Stone Brick Slab'), + nil +) + +-- Coral Sandstone + +mcl_stairs.register_stair_and_slab( + 'coral_sandstone', + 'everness:coral_sandstone', + { pickaxey = 2 }, + { 'everness_coral_sandstone.png' }, + S('Coral Sandstone Stair'), + S('Coral Sandstone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Sandstone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_sandstone_brick', + 'everness:coral_sandstone_brick', + { pickaxey = 2 }, + { 'everness_coral_sandstone_brick.png' }, + S('Coral Sandstone Brick Stair'), + S('Coral Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Sandstone Brick Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_sandstone_chiseled', + 'everness:coral_sandstone_chiseled', + { pickaxey = 2 }, + { 'everness_coral_sandstone_chiseled.png' }, + S('Coral Sandstone Chiseled Stair'), + S('Coral Sandstone Chiseled Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Sandstone Chiseled Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'coral_sandstone_carved_1', + 'everness:coral_sandstone_carved_1', + { pickaxey = 2 }, + { 'everness_coral_sandstone_carved_1.png' }, + S('Coral Sandstone Carved Stair'), + S('Coral Sandstone Carved Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Coral Sandstone Carved Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'cursed_lands_deep_ocean_sandstone_block', + 'everness:cursed_lands_deep_ocean_sandstone_block', + { pickaxey = 2 }, + { 'everness_cursed_lands_deep_ocean_sandblock.png' }, + S('Cursed Lands Deep Ocean Sandstone Block Stair'), + S('Cursed Lands Deep Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Cursed Lands Deep Ocean Sandstone Block Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'cursed_lands_deep_ocean_sandstone_brick', + 'everness:cursed_lands_deep_ocean_sandstone_brick', + { pickaxey = 2 }, + { 'everness_cursed_lands_deep_ocean_sand_brick.png' }, + S('Cursed Lands Deep Ocean Sandstone Brick Stair'), + S('Cursed Lands Deep Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Cursed Lands Deep Ocean Sandstone Brick Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'crystal_forest_deep_ocean_sandstone_block', + 'everness:crystal_forest_deep_ocean_sandstone_block', + { pickaxey = 2 }, + { 'everness_crystal_forest_deep_ocean_sandstone_block.png' }, + S('Crystal Forest Deep Ocean Sandstone Block Stair'), + S('Crystal Forest Deep Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Crystal Forest Deep Ocean Sandstone Block Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'crystal_forest_deep_ocean_sandstone_brick', + 'everness:crystal_forest_deep_ocean_sandstone_brick', + { pickaxey = 2 }, + { 'everness_crystal_forest_deep_ocean_sandstone_brick.png' }, + S('Crystal Forest Deep Ocean Sandstone Brick Stair'), + S('Crystal Forest Deep Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Crystal Forest Deep Ocean Sandstone Brick Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'crystal_cobble', + 'everness:crystal_cobble', + { pickaxey = 2 }, + { 'everness_crystal_cobble.png' }, + S('Crystal Cobblestone Stair'), + S('Crystal Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Crystal Cobblestone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'crystal_mossy_cobble', + 'everness:crystal_mossy_cobble', + { pickaxey = 2 }, + { 'everness_crystal_mossy_cobble.png' }, + S('Crystal Mossy Cobblestone Stair'), + S('Crystal Mossy Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Crystal Mossy Cobblestone Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'crystal_stone_brick', + 'everness:crystal_stone_brick', + { pickaxey = 2 }, + { 'everness_crystal_stone_brick.png' }, + S('Crystal Stone Brick Stair'), + S('Crystal Stone Brick Slab'), + Everness.node_sound_stone_defaults(), + 6, + 2, + S('Double Crystal Stone Brick Slab'), + nil +) + +-- Crystal Wood + +mcl_stairs.register_stair_and_slab( + 'crystal_wood', + 'everness:crystal_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_crystal_wood.png' }, + S('Crystal Wood Stair'), + S('Crystal Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Crystal Wood Slab'), + nil +) + +-- Mese Wood + +mcl_stairs.register_stair_and_slab( + 'mese_wood', + 'everness:mese_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'everness_mese_wood.png' }, + S('Mese Wood Stair'), + S('Mese Wood Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double Mese Wood Slab'), + nil +) + +-- Mineral Waters + +mcl_stairs.register_stair_and_slab( + 'mineral_stone', + 'everness:mineral_stone', + { pickaxey = 3, stone = 1 }, + {{ + name = 'everness_mineral_stone.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_stone_cobble', + 'everness:mineral_stone_cobble', + { pickaxey = 3, stone = 2 }, + {{ + name = 'everness_mineral_cobblestone.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_stone_block', + 'everness:mineral_stone_block', + { pickaxey = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_stone_brick', + 'everness:mineral_stone_brick', + { pickaxey = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_sandstone', + 'everness:mineral_sandstone', + { pickaxey = 3 }, + { 'everness_mineral_sandstone.png' }, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_sandstone_block', + 'everness:mineral_sandstone_block', + { pickaxey = 2 }, + {{ + name = 'everness_mineral_sandstone_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_sandstone_brick', + 'everness:mineral_sandstone_brick', + { pickaxey = 2 }, + {{ + name = 'everness_mineral_sandstone_brick.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_sandstone_brick_block', + 'everness:mineral_sandstone_brick_block', + { pickaxey = 2 }, + {{ + name = 'everness_mineral_sandstone_brick_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_stone_brick_with_growth', + 'everness:mineral_stone_brick_with_growth', + { pickaxey = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick_with_growth.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Slab'), + nil +) + +mcl_stairs.register_stair_and_slab( + 'mineral_stone_brick_with_flower_growth', + 'everness:mineral_stone_brick_with_flower_growth', + { pickaxey = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick_with_flower_growth.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + 6, + 1.5, + S('Double') .. ' ' .. S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Slab'), + nil +) + +-- Palm Wood +mcl_stairs.register_stair_and_slab( + 'palm_tree_wood', + 'everness:palm_tree_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + {{ + name = 'everness_palm_tree_wood.png', + align_style = 'world', + scale = 2 + }}, + S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Stair'), + S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Slab'), + Everness.node_sound_wood_defaults(), + 6, + 2, + S('Double') .. ' ' .. S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Slab'), + nil +) + +--- +-- Doors +--- + +mcl_doors:register_door('everness:door_bamboo', { + description = S('Bamboo Door'), + inventory_image = 'everness_door_bamboo_item.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + tiles_bottom = 'everness_mcl_doors_door_bamboo_lower.png', + tiles_top = 'everness_mcl_doors_door_bamboo_upper.png', + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + sound_open = 'everness_door_bamboo_open', + sound_close = 'everness_door_bamboo_open', + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:door_bamboo 3', + recipe = { + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' } + } +}) + +mcl_doors:register_trapdoor('everness:trapdoor_bamboo', { + description = S('Bamboo Trapdoor'), + tile_front = 'everness_door_trapdoor_bamboo.png', + tile_side = 'everness_mcl_doors_trapdoor_bamboo_side.png', + wield_image = 'everness_door_trapdoor_bamboo.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + sound_open = 'everness_door_bamboo_open', + sound_close = 'everness_door_bamboo_open', + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:trapdoor_bamboo', + recipe = { + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + } +}) + +mcl_doors:register_door('everness:door_bone_pyrite', { + description = S('Bone Pyrit Door'), + inventory_image = 'everness_door_bone_pyrite_item.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + tiles_bottom = 'everness_mcl_doors_door_bone_pyrite_lower.png', + tiles_top = 'everness_mcl_doors_door_bone_pyrite_upper.png', + sounds = Everness.node_sound_wood_defaults(), + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:door_bone_pyrite 3', + recipe = { + { 'everness:pyrite_ingot', 'everness:bone' }, + { 'everness:pyrite_ingot', 'everness:bone' }, + { 'everness:pyrite_ingot', 'everness:bone' } + } +}) + +mcl_doors:register_door('everness:door_willow', { + description = S('Willow Door'), + inventory_image = 'everness_door_willow_item.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + tiles_bottom = 'everness_mcl_doors_door_willow_lower.png', + tiles_top = 'everness_mcl_doors_door_willow_upper.png', + sounds = Everness.node_sound_wood_defaults(), + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:door_willow 3', + recipe = { + { 'everness:willow_wood', 'everness:willow_wood' }, + { 'everness:willow_wood', 'everness:willow_wood' }, + { 'everness:willow_wood', 'everness:willow_wood' } + } +}) + +mcl_doors:register_door('everness:door_crystal_wood', { + description = S('Crystal Wood Door'), + inventory_image = 'everness_door_crystal_wood_item.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + tiles_bottom = 'everness_mcl_doors_door_crystal_wood_lower.png', + tiles_top = 'everness_mcl_doors_door_crystal_wood_upper.png', + sounds = Everness.node_sound_glass_defaults(), + sound_open = 'everness_door_glass_open', + sound_close = 'everness_door_glass_close', + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:door_crystal_wood 3', + recipe = { + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' } + } +}) + +mcl_doors:register_trapdoor('everness:trapdoor_crystal_wood', { + description = S('Crystal Wood Trapdoor'), + tile_front = 'everness_door_trapdoor_crystal_wood.png', + tile_side = 'everness_mcl_doors_trapdoor_crystal_wood_side.png', + wield_image = 'everness_door_trapdoor_crystal_wood.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + sounds = Everness.node_sound_glass_defaults(), + sound_open = 'everness_door_glass_open', + sound_close = 'everness_door_glass_close', + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:trapdoor_crystal_wood', + recipe = { + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' }, + } +}) + +mcl_doors:register_door('everness:door_cursed_wood', { + description = S('Cursed Wood Door'), + inventory_image = 'everness_door_cursed_wood_item.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + tiles_bottom = 'everness_mcl_doors_door_cursed_wood_lower.png', + tiles_top = 'everness_mcl_doors_door_cursed_wood_upper.png', + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_creaky_door_open', + sound_close = 'everness_creaky_door_close', + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:door_cursed_wood 3', + recipe = { + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' } + } +}) + +mcl_doors:register_trapdoor('everness:trapdoor_cursed_wood', { + description = S('Cursed Wood Trapdoor'), + tile_front = 'everness_door_trapdoor_cursed_wood.png', + tile_side = 'everness_mcl_doors_trapdoor_cursed_wood_side.png', + wield_image = 'everness_door_trapdoor_cursed_wood.png', + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_creaky_door_open', + sound_close = 'everness_creaky_door_close', + _mcl_hardness = 3, + _mcl_blast_resistance = 3, +}) + +minetest.register_craft({ + output = 'everness:trapdoor_cursed_wood', + recipe = { + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' }, + } +}) + +-- Palm Wood + +-- mcl_doors:register_door('everness:door_palm_wood', { +-- description = S('Palm Wood Door'), +-- inventory_image = 'everness_door_palm_wood_item.png', +-- groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, +-- tiles_bottom = 'everness_mcl_doors_door_cursed_wood_lower.png', +-- tiles_top = 'everness_mcl_doors_door_cursed_wood_upper.png', +-- sounds = Everness.node_sound_wood_defaults(), +-- _mcl_hardness = 3, +-- _mcl_blast_resistance = 3, +-- }) + +-- minetest.register_craft({ +-- output = 'everness:door_palm_wood 3', +-- recipe = { +-- { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, +-- { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, +-- { 'everness:palm_tree_wood', 'everness:palm_tree_wood' } +-- } +-- }) + +-- mcl_doors:register_trapdoor('everness:trapdoor_palm_wood', { +-- description = S('Palm Wood Trapdoor'), +-- tile_front = 'everness_door_trapdoor_cursed_wood.png', +-- tile_side = 'everness_mcl_doors_trapdoor_cursed_wood_side.png', +-- wield_image = 'everness_door_trapdoor_palm_wood.png', +-- groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, +-- sounds = Everness.node_sound_wood_defaults(), +-- _mcl_hardness = 3, +-- _mcl_blast_resistance = 3, +-- }) + +-- minetest.register_craft({ +-- output = 'everness:trapdoor_palm_wood', +-- recipe = { +-- { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, +-- { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, +-- } +-- }) + +-- +-- Buckets +-- + +mcl_buckets.register_liquid({ + source_place = 'everness:mineral_water_source', + source_take = { 'everness:mineral_water_source' }, + bucketname = 'everness:bucket_mineral_water', + inventory_image = 'everness_mcl_bucket_mineral_water.png', + name = S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'), + longdesc = S('A bucket can be used to collect and release liquids. This one is filled with mineral water.'), + usagehelp = S('Place it to empty the bucket and create a mineral water source.'), + tt_help = S('Places a mineral water source'), + groups = { water_bucket = 1 }, +}) diff --git a/mods/everness/mod_support_mcl_aliases.lua b/mods/everness/mod_support_mcl_aliases.lua new file mode 100644 index 00000000..6430263b --- /dev/null +++ b/mods/everness/mod_support_mcl_aliases.lua @@ -0,0 +1,178 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +minetest.register_alias('mapgen_water_source', 'mcl_core:water_source') +minetest.register_alias('default:dirt_with_rainforest_litter', 'mcl_core:dirt_with_grass') +minetest.register_alias('default:dirt_with_snow', 'mcl_core:dirt_with_grass_snow') +minetest.register_alias('default:dirt_with_coniferous_litter', 'mcl_core:podzol') +minetest.register_alias('default:dirt_with_grass', 'mcl_core:dirt_with_grass') +minetest.register_alias('default:stick', 'mcl_core:stick') +minetest.register_alias('default:paper', 'mcl_core:paper') +minetest.register_alias('default:book', 'mcl_books:book') +minetest.register_alias('default:skeleton_key', 'mcl_core:gold_nugget') +minetest.register_alias('default:flint', 'mcl_core:flint') +minetest.register_alias('default:obsidian_shard', 'mcl_core:prismarine_shard') +minetest.register_alias('default:clay_brick', 'mcl_core:brick') +minetest.register_alias('default:mese_crystal_fragment', 'mcl_amethyst:amethyst_shard') +-- Ingots +minetest.register_alias('default:gold_ingot', 'mcl_core:gold_ingot') +minetest.register_alias('default:bronze_ingot', 'mcl_copper:copper_ingot') +minetest.register_alias('default:tin_ingot', 'mcl_core:iron_ingot') +minetest.register_alias('default:copper_ingot', 'mcl_copper:copper_ingot') +minetest.register_alias('default:steel_ingot', 'mcl_core:iron_ingot') +minetest.register_alias('default:coal_lump', 'mcl_core:coal_lump') +-- Tools +minetest.register_alias('default:pick_stone', 'mcl_tools:pick_stone') +minetest.register_alias('default:pick_bronze', 'mcl_tools:pick_gold') +minetest.register_alias('default:pick_steel', 'mcl_tools:pick_iron') +minetest.register_alias('default:shovel_stone', 'mcl_tools:shovel_stone') +minetest.register_alias('default:shovel_bronze', 'mcl_tools:shovel_gold') +minetest.register_alias('default:shovel_steel', 'mcl_tools:shovel_iron') +minetest.register_alias('default:axe_stone', 'mcl_tools:axe_stone') +minetest.register_alias('default:axe_bronze', 'mcl_tools:axe_gold') +minetest.register_alias('default:axe_steel', 'mcl_tools:axe_iron') +minetest.register_alias('default:sword_stone', 'mcl_tools:sword_stone') +minetest.register_alias('default:sword_bronze', 'mcl_tools:sword_gold') +minetest.register_alias('default:sword_steel', 'mcl_tools:sword_iron') +-- Items / Nodes +minetest.register_alias('default:bookshelf', 'mcl_books:bookshelf') +minetest.register_alias('default:sign_wall_wood', 'mcl_signs:wall_sign') +minetest.register_alias('default:ladder_wood', 'mcl_core:ladder') +minetest.register_alias('default:ladder_steel', 'mcl_core:ladder') +minetest.register_alias('default:glass', 'mcl_core:glass') +minetest.register_alias('default:obsidian_glass', 'mcl_core:glass') +-- Trees +minetest.register_alias('default:tree', 'mcl_core:tree') +minetest.register_alias('default:jungletree', 'mcl_core:jungletree') +minetest.register_alias('default:pine_tree', 'mcl_core:sprucetree') +minetest.register_alias('default:cactus', 'mcl_core:cactus') +minetest.register_alias('default:large_cactus_seedling', 'mcl_core:cactus') +minetest.register_alias('default:papyrus', 'mcl_core:reeds') +minetest.register_alias('default:junglegrass', 'mcl_flowers:double_grass') +minetest.register_alias('default:blueberry_bush_sapling', 'mcl_flowers:rose_bush') +minetest.register_alias('default:sapling', 'mcl_core:sapling') +minetest.register_alias('default:junglesapling', 'mcl_core:junglesapling') +minetest.register_alias('default:pine_sapling', 'mcl_core:sprucesapling') +minetest.register_alias('default:acacia_sapling', 'mcl_core:acaciasapling') +minetest.register_alias('default:aspen_sapling', 'mcl_core:birchsapling') + +minetest.register_alias('default:clay_lump', 'mcl_core:clay_lump') +minetest.register_alias('default:tin_lump', 'mcl_raw_ores:raw_gold') +minetest.register_alias('default:copper_lump', 'mcl_copper:raw_copper') +minetest.register_alias('default:iron_lump', 'mcl_raw_ores:raw_iron') +minetest.register_alias('default:coalblock', 'mcl_core:coalblock') +minetest.register_alias('default:steelblock', 'mcl_core:ironblock') +minetest.register_alias('default:copperblock', 'mcl_copper:block') +minetest.register_alias('default:tinblock', 'mcl_core:goldblock') +minetest.register_alias('default:bronzeblock', 'mcl_copper:block') +minetest.register_alias('default:mese', 'mesecons_torch:redstoneblock') +minetest.register_alias('default:meselamp', 'mesecons_lightstone:lightstone_off') +minetest.register_alias('default:obsidian', 'mcl_core:obsidian') +minetest.register_alias('default:mese_crystal', 'mcl_ocean:prismarine_crystals') +minetest.register_alias('default:diamond', 'mcl_core:diamond') +minetest.register_alias('default:pick_mese', 'mcl_tools:pick_diamond') +minetest.register_alias('default:shovel_mese', 'mcl_tools:shovel_diamond') +minetest.register_alias('default:axe_mese', 'mcl_tools:axe_diamond') +minetest.register_alias('default:sword_mese', 'mcl_tools:sword_diamond') + +minetest.register_alias('default:snowblock', 'mcl_core:snowblock') +minetest.register_alias('default:ice', 'mcl_core:ice') +minetest.register_alias('default:torch', 'mcl_torches:torch') +minetest.register_alias('default:cobble', 'mcl_core:cobble') +minetest.register_alias('default:chest', 'mcl_chests:chest') +minetest.register_alias('default:snow', 'mcl_core:snow') +minetest.register_alias('default:stone', 'mcl_core:stone') +minetest.register_alias('default:sand', 'mcl_core:sand') +minetest.register_alias('default:gravel', 'mcl_core:gravel') +minetest.register_alias('default:stone_with_coal', 'mcl_core:stone_with_coal') +minetest.register_alias('default:stone_with_iron', 'mcl_core:stone_with_iron') +minetest.register_alias('default:stone_with_tin', 'mcl_core:stone_with_copper') +minetest.register_alias('default:stone_with_gold', 'mcl_core:stone_with_gold') +minetest.register_alias('default:stone_with_mese', 'mcl_core:stone_with_redstone') +minetest.register_alias('default:stone_with_diamond', 'mcl_core:stone_with_diamond') +minetest.register_alias('mapgen_lava_source', 'mcl_core:lava_source') +minetest.register_alias('default:mossycobble', 'mcl_core:mossycobble') +minetest.register_alias('default:clay', 'mcl_colorblocks:hardened_clay') +minetest.register_alias('default:dry_dirt_with_dry_grass', 'mcl_core:dirt_with_grass') +minetest.register_alias('default:dry_dirt', 'mcl_core:coarse_dirt') +minetest.register_alias('default:coral_skeleton', 'mcl_core:bone_block') +minetest.register_alias('default:lava_flowing', 'mcl_core:lava_flowing') +minetest.register_alias('everness:cursed_brick_with_growth_wall', 'everness:cursedbrickwithgrowthwall') +minetest.register_alias('stairs:slab_cursed_brick_with_growth', 'mcl_stairs:slab_cursed_brick_with_growth') +minetest.register_alias('default:fence_wood', 'mcl_fences:fence') +minetest.register_alias('default:torch_wall', 'mcl_torches:torch_wall') +minetest.register_alias('default:wood', 'mcl_core:wood') +minetest.register_alias('default:junglewood', 'mcl_core:junglewood') +minetest.register_alias('default:pine_wood', 'mcl_core:sprucewood') +minetest.register_alias('default:mese_post_light_pine_wood', 'mcl_torches:torch') +minetest.register_alias_force('default:acacia_tree', 'mcl_core:acaciatree') +minetest.register_alias('default:dry_grass_4', 'mcl_core:deadbush') +minetest.register_alias('default:dry_grass_2', 'mcl_core:deadbush') +minetest.register_alias('default:dry_shrub', 'mcl_core:deadbush') +minetest.register_alias('default:stonebrick', 'mcl_core:stonebrick') +minetest.register_alias('default:jungleleaves', 'mcl_core:jungleleaves') +minetest.register_alias('default:torch_ceiling', 'mcl_torches:torch_wall') +minetest.register_alias('default:goldblock', 'mcl_core:goldblock') +minetest.register_alias('stairs:stair_coral_white_sandstone', 'mcl_stairs:stair_coral_white_sandstone') +minetest.register_alias('stairs:slab_coral_white_sandstone', 'mcl_stairs:slab_coral_white_sandstone') +minetest.register_alias('stairs:stair_coral_deep_ocean_sandstone_block', 'mcl_stairs:stair_coral_deep_ocean_sandstone_block') +minetest.register_alias('stairs:slab_coral_deep_ocean_sandstone_block', 'mcl_stairs:slab_coral_deep_ocean_sandstone_block') +minetest.register_alias('stairs:slab_coral_deep_ocean_sandstone_brick', 'mcl_stairs:slab_coral_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:slab_coral_sandstone_brick', 'mcl_stairs:slab_coral_sandstone_brick') +minetest.register_alias('stairs:stair_coral_deep_ocean_sandstone_brick', 'mcl_stairs:stair_coral_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_block') +minetest.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_block') +minetest.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:stair_forsaken_desert_brick_red', 'mcl_stairs:stair_forsaken_desert_brick_red') +minetest.register_alias('stairs:stair_forsaken_desert_chiseled_stone', 'mcl_stairs:stair_forsaken_desert_chiseled_stone') +minetest.register_alias('stairs:slab_forsaken_desert_chiseled_stone', 'mcl_stairs:slab_forsaken_desert_chiseled_stone') +minetest.register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood') +minetest.register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood') +minetest.register_alias('stairs:slab_dry_wood', 'mcl_stairs:slab_dry_wood') +minetest.register_alias('stairs:stair_dry_wood', 'mcl_stairs:stair_dry_wood') +minetest.register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood') +minetest.register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick') +minetest.register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner') +minetest.register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer') +minetest.register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick') +-- minetest.register_alias('stairs:stair_cobble', 'mcl_stairs:stair_cobble') +minetest.register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble') +minetest.register_alias('stairs:stair_outer_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_outer') +minetest.register_alias('stairs:stair_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled') +minetest.register_alias('stairs:stair_inner_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_inner') +minetest.register_alias('stairs:slab_quartz_chiseled', 'mcl_stairs:slab_quartz_chiseled') +minetest.register_alias('stairs:stair_coral_desert_stone_block', 'mcl_stairs:stair_coral_desert_stone_block') + +minetest.register_alias('everness:cursed_brick_wall', 'everness:cursedbrickwall') +minetest.register_alias('walls:cobble', 'mcl_walls:cobble') +minetest.register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor') +minetest.register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open') +minetest.register_alias('doors:trapdoor', 'mcl_doors:trapdoor') +minetest.register_alias('doors:door_wood_a', 'mcl_doors:wooden_door') +minetest.register_alias('doors:hidden', 'air') +minetest.register_alias('everness:cobweb', 'mcl_core:cobweb') + + +-- Legacy - was replaced by everness:flowers_* +minetest.register_alias('flowers:rose', 'mcl_flowers:wither_rose') +minetest.register_alias('flowers:tulip', 'mcl_flowers:tulip_orange') +minetest.register_alias('flowers:dandelion_yellow', 'mcl_flowers:dandelion') +minetest.register_alias('flowers:geranium', 'mcl_flowers:allium') +minetest.register_alias('flowers:viola', 'mcl_flowers:azure_bluet') +minetest.register_alias('flowers:tulip_black', 'mcl_flowers:tulip_white') +minetest.register_alias('flowers:dandelion_white', 'mcl_flowers:tulip_pink') +minetest.register_alias('flowers:chrysanthemum_green', 'mcl_flowers:tulip_white') diff --git a/mods/everness/mod_support_mtg.lua b/mods/everness/mod_support_mtg.lua new file mode 100644 index 00000000..80cb6f71 --- /dev/null +++ b/mods/everness/mod_support_mtg.lua @@ -0,0 +1,48 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- +-- Buckets +-- + +if minetest.get_modpath('bucket') then + bucket.register_liquid( + 'everness:mineral_water_source', + 'everness:mineral_water_flowing', + 'everness:bucket_mineral_water', + 'everness_mtg_bucket_mineral_water.png', + S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'), + { tool = 1, water_bucket = 1 } + ) + + bucket.register_liquid( + 'everness:lava_source', + 'everness:lava_flowing', + 'everness:bucket_lava', + 'everness_mtg_bucket_lava.png', + S('Lava Bucket'), + { tool = 1 } + ) + + minetest.register_craft({ + type = 'fuel', + recipe = 'everness:bucket_lava', + burntime = 370, + replacements = {{ 'everness:bucket_lava', 'bucket:bucket_empty' }}, + }) +end diff --git a/mods/everness/mod_support_rp_aliases.lua b/mods/everness/mod_support_rp_aliases.lua new file mode 100644 index 00000000..9a72fc5b --- /dev/null +++ b/mods/everness/mod_support_rp_aliases.lua @@ -0,0 +1,169 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +minetest.register_alias('mapgen_water_source', 'rp_mapgen_water_source') +minetest.register_alias('default:dirt_with_rainforest_litter', 'rp_default:dirt_with_grass') +minetest.register_alias('default:dirt_with_snow', 'rp_default:dirt_with_grass') +minetest.register_alias('default:dirt_with_coniferous_litter', 'rp_default:dirt_with_grass') +minetest.register_alias('default:dirt_with_grass', 'rp_default:dirt_with_grass') +minetest.register_alias('default:stick', 'rp_default:stick') +minetest.register_alias('default:paper', 'rp_default:paper') +minetest.register_alias('default:book', 'rp_default:book') +minetest.register_alias('default:skeleton_key', 'rp_default:skeleton_key') +minetest.register_alias('default:flint', 'rp_default:flint') +minetest.register_alias('default:obsidian_shard', 'rp_default:obsidian_shard') +minetest.register_alias('default:clay_brick', 'rp_default:clay_brick') +minetest.register_alias('default:mese_crystal_fragment', 'rp_default:mese_crystal_fragment') +-- Ingots +minetest.register_alias('default:gold_ingot', 'rp_default:gold_ingot') +minetest.register_alias('default:bronze_ingot', 'rp_default:bronze_ingot') +minetest.register_alias('default:tin_ingot', 'rp_default:tin_ingot') +minetest.register_alias('default:copper_ingot', 'rp_default:copper_ingot') +minetest.register_alias('default:steel_ingot', 'rp_default:steel_ingot') +minetest.register_alias('default:coal_lump', 'rp_default:coal_lump') +-- Tools +minetest.register_alias('default:pick_stone', 'rp_default:pick_stone') +minetest.register_alias('default:pick_bronze', 'rp_default:pick_bronze') +minetest.register_alias('default:pick_steel', 'rp_default:pick_steel') +minetest.register_alias('default:shovel_stone', 'rp_default:shovel_stone') +minetest.register_alias('default:shovel_bronze', 'rp_default:shovel_bronze') +minetest.register_alias('default:shovel_steel', 'rp_default:shovel_steel') +minetest.register_alias('default:axe_stone', 'rp_default:axe_stone') +minetest.register_alias('default:axe_bronze', 'rp_default:axe_bronze') +minetest.register_alias('default:axe_steel', 'rp_default:axe_steel') +minetest.register_alias('default:sword_stone', 'rp_default:sword_stone') +minetest.register_alias('default:sword_bronze', 'rp_default:sword_bronze') +minetest.register_alias('default:sword_steel', 'rp_default:sword_steel') +-- Items / Nodes +minetest.register_alias('default:bookshelf', 'rp_default:bookshelf') +minetest.register_alias('default:sign_wall_wood', 'rp_default:sign_wall_wood') +minetest.register_alias('default:ladder_wood', 'rp_default:ladder_wood') +minetest.register_alias('default:ladder_steel', 'rp_default:ladder_steel') +minetest.register_alias('default:glass', 'rp_default:glass') +minetest.register_alias('default:obsidian_glass', 'rp_default:obsidian_glass') +-- Trees +minetest.register_alias('default:tree', 'rp_default:tree') +minetest.register_alias('default:jungletree', 'rp_default:jungletree') +minetest.register_alias('default:pine_tree', 'rp_default:pine_tree') +minetest.register_alias('default:cactus', 'rp_default:cactus') +minetest.register_alias('default:large_cactus_seedling', 'rp_default:large_cactus_seedling') +minetest.register_alias('default:papyrus', 'rp_default:papyrus') +minetest.register_alias('default:junglegrass', 'rp_default:junglegrass') +minetest.register_alias('default:blueberry_bush_sapling', 'rp_default:blueberry_bush_sapling') +minetest.register_alias('default:sapling', 'rp_default:sapling') +minetest.register_alias('default:junglesapling', 'rp_default:junglesapling') +minetest.register_alias('default:pine_sapling', 'rp_default:pine_sapling') +minetest.register_alias('default:acacia_sapling', 'rp_default:acacia_sapling') +minetest.register_alias('default:aspen_sapling', 'rp_default:aspen_sapling') + +minetest.register_alias('default:clay_lump', 'rp_default:clay_lump') +minetest.register_alias('default:tin_lump', 'rp_default:tin_lump') +minetest.register_alias('default:copper_lump', 'rp_default:copper_lump') +minetest.register_alias('default:iron_lump', 'rp_default:iron_lump') +minetest.register_alias('default:coalblock', 'rp_default:block_coal') +minetest.register_alias('default:steelblock', 'rp_default:steelblock') +minetest.register_alias('default:copperblock', 'rp_default:copperblock') +minetest.register_alias('default:tinblock', 'rp_default:tinblock') +minetest.register_alias('default:bronzeblock', 'rp_default:bronzeblock') +minetest.register_alias('default:mese', 'rp_default:mese') +minetest.register_alias('default:meselamp', 'rp_default:meselamp') +minetest.register_alias('default:obsidian', 'rp_default:obsidian') +minetest.register_alias('default:mese_crystal', 'rp_default:mese_crystal') +minetest.register_alias('default:diamond', 'rp_default:diamond') +minetest.register_alias('default:pick_mese', 'rp_default:pick_mese') +minetest.register_alias('default:shovel_mese', 'rp_default:shovel_mese') +minetest.register_alias('default:axe_mese', 'rp_default:axe_mese') +minetest.register_alias('default:sword_mese', 'rp_default:sword_mese') + +minetest.register_alias('default:snowblock', 'rp_default:snowblock') +minetest.register_alias('default:ice', 'rp_default:ice') +minetest.register_alias('default:torch', 'rp_default:torch') +minetest.register_alias('default:cobble', 'rp_default:cobble') +minetest.register_alias('default:chest', 'rp_default:chest') +minetest.register_alias('default:snow', 'rp_default:snow') +minetest.register_alias('default:stone', 'rp_default:stone') +minetest.register_alias('default:sand', 'rp_default:sand') +minetest.register_alias('default:gravel', 'rp_default:gravel') +minetest.register_alias('default:stone_with_coal', 'rp_default:stone_with_coal') +minetest.register_alias('default:stone_with_iron', 'rp_default:stone_with_iron') +minetest.register_alias('default:stone_with_tin', 'rp_default:stone_with_tin') +minetest.register_alias('default:stone_with_gold', 'rp_default:stone_with_gold') +minetest.register_alias('default:stone_with_mese', 'rp_default:stone_with_mese') +minetest.register_alias('default:stone_with_diamond', 'rp_default:stone_with_diamond') +minetest.register_alias('mapgen_lava_source', 'rp_mapgen_water_source') +minetest.register_alias('default:mossycobble', 'rp_default:mossycobble') +minetest.register_alias('default:clay', 'rp_default:clay') +minetest.register_alias('default:dry_dirt_with_dry_grass', 'rp_default:dry_dirt_with_dry_grass') +minetest.register_alias('default:dry_dirt', 'rp_default:dry_dirt') +minetest.register_alias('default:coral_skeleton', 'everness:coral_skeleton') +minetest.register_alias('default:lava_flowing', 'rp_default:water_flowing') +minetest.register_alias('everness:cursed_brick_with_growth_wall', 'air') +minetest.register_alias('stairs:slab_cursed_brick_with_growth', 'air') +minetest.register_alias('default:fence_wood', 'rp_default:fence') +minetest.register_alias('default:torch_wall', 'rp_default:torch_wall') +minetest.register_alias('default:wood', 'rp_default:planks') +minetest.register_alias('default:junglewood', 'rp_default:junglewood') +minetest.register_alias('default:pine_wood', 'rp_default:pine_wood') +minetest.register_alias('default:mese_post_light_pine_wood', 'rp_default:mese_post_light_pine_wood') +minetest.register_alias_force('default:acacia_tree', 'rp_default:acacia_tree') +minetest.register_alias('default:dry_grass_4', 'rp_default:dry_grass_4') +minetest.register_alias('default:dry_grass_2', 'rp_default:dry_grass_2') +minetest.register_alias('default:dry_shrub', 'rp_default:dry_shrub') +minetest.register_alias('default:stonebrick', 'rp_default:stonebrick') +minetest.register_alias('default:jungleleaves', 'rp_default:jungleleaves') +minetest.register_alias('default:torch_ceiling', 'rp_default:torch_ceiling') +minetest.register_alias('default:goldblock', 'rp_default:goldblock') +minetest.register_alias('stairs:stair_coral_white_sandstone', 'mcl_stairs:stair_coral_white_sandstone') +minetest.register_alias('stairs:slab_coral_white_sandstone', 'mcl_stairs:slab_coral_white_sandstone') +minetest.register_alias('stairs:stair_coral_deep_ocean_sandstone_block', 'mcl_stairs:stair_coral_deep_ocean_sandstone_block') +minetest.register_alias('stairs:slab_coral_deep_ocean_sandstone_block', 'mcl_stairs:slab_coral_deep_ocean_sandstone_block') +minetest.register_alias('stairs:slab_coral_deep_ocean_sandstone_brick', 'mcl_stairs:slab_coral_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:slab_coral_sandstone_brick', 'mcl_stairs:slab_coral_sandstone_brick') +minetest.register_alias('stairs:stair_coral_deep_ocean_sandstone_brick', 'mcl_stairs:stair_coral_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_block') +minetest.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_block') +minetest.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_brick') +minetest.register_alias('stairs:stair_forsaken_desert_brick_red', 'mcl_stairs:stair_forsaken_desert_brick_red') +minetest.register_alias('stairs:stair_forsaken_desert_chiseled_stone', 'mcl_stairs:stair_forsaken_desert_chiseled_stone') +minetest.register_alias('stairs:slab_forsaken_desert_chiseled_stone', 'mcl_stairs:slab_forsaken_desert_chiseled_stone') +minetest.register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood') +minetest.register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood') +minetest.register_alias('stairs:slab_dry_wood', 'mcl_stairs:slab_dry_wood') +minetest.register_alias('stairs:stair_dry_wood', 'mcl_stairs:stair_dry_wood') +minetest.register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood') +minetest.register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick') +minetest.register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner') +minetest.register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer') +minetest.register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick') +-- minetest.register_alias('stairs:stair_cobble', 'mcl_stairs:stair_cobble') +minetest.register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble') +minetest.register_alias('stairs:stair_outer_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_outer') +minetest.register_alias('stairs:stair_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled') +minetest.register_alias('stairs:stair_inner_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_inner') +minetest.register_alias('stairs:slab_quartz_chiseled', 'mcl_stairs:slab_quartz_chiseled') +minetest.register_alias('stairs:stair_coral_desert_stone_block', 'mcl_stairs:stair_coral_desert_stone_block') + +minetest.register_alias('everness:cursed_brick_wall', 'everness:cursedbrickwall') +minetest.register_alias('walls:cobble', 'mcl_walls:cobble') +minetest.register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor') +minetest.register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open') +minetest.register_alias('doors:trapdoor', 'mcl_doors:trapdoor') +minetest.register_alias('doors:door_wood_a', 'mcl_doors:wooden_door') +minetest.register_alias('doors:hidden', 'air') +minetest.register_alias('everness:cobweb', 'mcl_core:cobweb') + +minetest.register_alias('fire:permanent_flame', 'air') diff --git a/mods/everness/mod_support_x_farming.lua b/mods/everness/mod_support_x_farming.lua new file mode 100644 index 00000000..5944b44a --- /dev/null +++ b/mods/everness/mod_support_x_farming.lua @@ -0,0 +1,257 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +-- +-- Bonemeal Trees +-- + +x_farming.x_bonemeal:register_tree_defs({ + { + -- sapling name + name = 'everness:coral_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_coral_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:coral_tree_bioluminescent_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.coral_tree_bioluminescent(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:crystal_bush_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_crystal_bush(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:cursed_bush_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_cursed_bush(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:baobab_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_baobab_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:dry_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_dry_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:willow_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_willow_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:sequoia_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_sequoia_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:crystal_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_crystal_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:crystal_tree_large_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_crystal_large_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:cursed_dream_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_cursed_dream_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:mese_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 4, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_mese_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:palm_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 4, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_sand(pos) then + return false + end + + Everness.grow_palm_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:lava_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 4, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_lava_tree(pos) + + return true + end + }, +}) + +-- +-- Recipes +-- + +minetest.register_craft({ + output = 'x_farming:bonemeal 4', + recipe = { + { 'everness:bone' } + } +}) diff --git a/mods/everness/mod_support_x_obsidianmese.lua b/mods/everness/mod_support_x_obsidianmese.lua new file mode 100644 index 00000000..3f77f280 --- /dev/null +++ b/mods/everness/mod_support_x_obsidianmese.lua @@ -0,0 +1,582 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local mod_start_time = minetest.get_us_time() + +-- Bamboo Forest + +local path_nodes_bamboo_forest = { + ['everness:dirt_with_grass_1'] = { + name = 'dirt_with_grass_1', + mod_origin = 'everness', + descritption = 'Dirt with Grass Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dirt_with_grass_extras_1'] = { + name = 'dirt_with_grass_extras_1', + mod_origin = 'everness', + descritption = 'Dirt with Grass Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dirt_with_grass_extras_2'] = { + name = 'dirt_with_grass_extras_2', + mod_origin = 'everness', + descritption = 'Dirt with Grass Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dirt_1'] = { + name = 'dirt_1', + mod_origin = 'everness', + descritption = 'Dirt Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + } +} + +local path_nodes_baobab_savanna = { + ['everness:dry_dirt_with_dry_grass'] = { + name = 'dry_dirt_with_dry_grass', + mod_origin = 'everness', + descritption = 'Dry Dirt with Dry Grass Path', + drop = 'everness:dry_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127^(everness_dry_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#B88C5E:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dry_dirt'] = { + name = 'dry_dirt', + mod_origin = 'everness', + descritption = 'Dry Dirt Path', + drop = 'everness:dry_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127^(everness_dry_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#B88C5E:127' + }, + sounds = Everness.node_sound_dirt_defaults() + } +} + +-- Crystal Forest + +local path_nodes_crystal_forest = { + ['everness:dirt_with_crystal_grass'] = { + name = 'dirt_with_crystal_grass', + mod_origin = 'everness', + descritption = 'Dirt with Crystal Grass Path', + drop = 'everness:crystal_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127^(everness_crystal_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#755069:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:crystal_dirt'] = { + name = 'crystal_dirt', + mod_origin = 'everness', + descritption = 'Crystal Dirt Path', + drop = 'everness:crystal_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127^(everness_crystal_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#755069:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, +} + +local path_nodes_crystal_forest_dunes = { + ['everness:crystal_sand'] = { + name = 'crystal_sand', + mod_origin = 'everness', + descritption = 'Crystal Sand Path', + drop = 'everness:crystal_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_crystal_forest_shore = { + ['everness:crystal_sand'] = { + name = 'crystal_sand', + mod_origin = 'everness', + descritption = 'Crystal Sand Path', + drop = 'everness:crystal_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_crystal_forest_ocean = { + ['everness:crystal_sand'] = { + name = 'crystal_sand', + mod_origin = 'everness', + descritption = 'Crystal Sand Path', + drop = 'everness:crystal_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_crystal_forest_under = { + ['everness:crystal_cave_dirt_with_moss'] = { + name = 'crystal_cave_dirt_with_moss', + mod_origin = 'everness', + descritption = 'Crystal Cave Dirt with Moss Path', + drop = 'everness:crystal_cave_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127^(everness_crystal_cave_dirt_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#EEDDB2:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:crystal_cave_dirt'] = { + name = 'crystal_cave_dirt', + mod_origin = 'everness', + descritption = 'Crystal Cave Dirt', + drop = 'everness:crystal_cave_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127^(everness_crystal_cave_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#EEDDB2:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, +} + +-- Forsaken Tundra + +local path_nodes_forsaken_tundra = { + ['everness:forsaken_tundra_dirt_with_grass'] = { + name = 'forsaken_tundra_dirt_with_grass', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Dirt with Grass Path', + drop = 'everness:forsaken_tundra_dirt_with_grass', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170^(everness_forsaken_tundra_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#151611:170' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:forsaken_tundra_dirt'] = { + name = 'forsaken_tundra_dirt', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Dirt Path', + drop = 'everness:forsaken_tundra_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170^(everness_forsaken_tundra_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#151611:170' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:forsaken_tundra_beach_sand'] = { + name = 'forsaken_tundra_beach_sand', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand Path', + drop = 'everness:forsaken_tundra_beach_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_forsaken_tundra_beach = { + ['everness:forsaken_tundra_beach_sand'] = { + name = 'forsaken_tundra_beach_sand', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand Path', + drop = 'everness:forsaken_tundra_beach_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, + ['everness:forsaken_tundra_beach_sand_with_shells'] = { + name = 'forsaken_tundra_beach_sand_with_shells', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand with Shells', + drop = 'everness:forsaken_tundra_beach_sand_with_shells', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand_with_shells.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_forsaken_tundra_ocean = { + ['everness:forsaken_tundra_beach_sand'] = { + name = 'forsaken_tundra_beach_sand', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand Path', + drop = 'everness:forsaken_tundra_beach_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, + ['everness:forsaken_tundra_beach_sand_with_shells'] = { + name = 'forsaken_tundra_beach_sand_with_shells', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand with Shells', + drop = 'everness:forsaken_tundra_beach_sand_with_shells', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand_with_shells.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Forsaken Desert + +local path_nodes_forsaken_desert = { + ['everness:forsaken_desert_sand'] = { + name = 'forsaken_desert_sand', + mod_origin = 'everness', + descritption = 'Forsaken Desert Sand Path', + drop = 'everness:forsaken_desert_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170^(everness_forsaken_desert_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#D1906A:170' + }, + sounds = Everness.node_sound_sand_defaults() + } +} + +local path_nodes_forsaken_desert_ocean = { + ['everness:dry_ocean_dirt'] = { + name = 'dry_ocean_dirt', + mod_origin = 'everness', + descritption = 'Dry Ocean Dirt Path', + drop = 'everness:dry_ocean_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB7D54:127^(everness_forsaken_desert_dry_ocean_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB7D54:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AB7D54:127' + }, + sounds = Everness.node_sound_dirt_defaults() + } +} + +local path_nodes_forsaken_desert_under = { + ['everness:forsaken_desert_sand'] = { + name = 'forsaken_desert_sand', + mod_origin = 'everness', + descritption = 'Forsaken Desert Sand Path', + drop = 'everness:forsaken_desert_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170^(everness_forsaken_desert_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#D1906A:170' + }, + sounds = Everness.node_sound_sand_defaults() + } +} + +-- Cursed Lands + +local path_nodes_cursed_lands_and_dunes_ocean = { + ['everness:dirt_with_cursed_grass'] = { + name = 'dirt_with_cursed_grass', + mod_origin = 'everness', + descritption = 'Dirt with Cursed Grass Path', + drop = 'everness:cursed_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170^(everness_cursed_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#696151:170' + }, + sounds = Everness.node_sound_mud_defaults() + }, + ['everness:cursed_dirt'] = { + name = 'cursed_dirt', + mod_origin = 'everness', + descritption = 'Cursed Dirt Path', + drop = 'everness:cursed_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170^(everness_cursed_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#696151:170' + }, + sounds = Everness.node_sound_mud_defaults() + }, + ['everness:cursed_sand'] = { + name = 'cursed_sand', + mod_origin = 'everness', + descritption = 'Cursed Sand Path', + drop = 'everness:cursed_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#856F58:170^(everness_cursed_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#856F58:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#856F58:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Coral Forest + +local path_nodes_coral_forest_and_dunes = { + ['everness:dirt_with_coral_grass'] = { + name = 'dirt_with_coral_grass', + mod_origin = 'everness', + descritption = 'Dirt with Coral Grass Path', + drop = 'everness:coral_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127^(everness_coral_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AA683F:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:coral_dirt'] = { + name = 'coral_dirt', + mod_origin = 'everness', + descritption = 'Coral Dirt Path', + drop = 'everness:coral_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127^(everness_coral_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AA683F:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:coral_sand'] = { + name = 'coral_sand', + mod_origin = 'everness', + descritption = 'Coral Sand Path', + drop = 'everness:coral_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB633D:170^(everness_coral_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB633D:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AB633D:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, + ['everness:coral_white_sand'] = { + name = 'coral_white_sand', + mod_origin = 'everness', + descritption = 'Coral White Sand Path', + drop = 'everness:coral_white_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170^(everness_coral_white_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#F9F4FB:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_coral_forest_ocean = { + ['everness:coral_white_sand'] = { + name = 'coral_white_sand', + mod_origin = 'everness', + descritption = 'Coral White Sand Path', + drop = 'everness:coral_white_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170^(everness_coral_white_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#F9F4FB:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Frosted Icesheet + +local path_nodes_frosted_icesheet = { + ['everness:frosted_snowblock'] = { + name = 'frosted_snowblock', + mod_origin = 'everness', + descritption = 'Frosted Snow Block Path', + drop = 'everness:frosted_snowblock', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#FCFCFC:170^(everness_frosted_snow.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#FCFCFC:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#FCFCFC:170' + }, + sounds = Everness.node_sound_snow_defaults() + }, +} + +-- Mineral Waters + +local path_nodes_mineral_waters = { + ['everness:mineral_sand'] = { + name = 'mineral_sand', + mod_origin = 'everness', + descritption = 'Mineral Sand Path', + drop = 'everness:mineral_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#E0CEBB:170^(everness_mineral_sand.png^[sheet:2x2:1,1^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#E0CEBB:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#E0CEBB:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Bamboo Forest + +if Everness.settings.biomes.everness_bamboo_forest.enabled then + x_obsidianmese:register_path_node(path_nodes_bamboo_forest) +end + +-- Baobab Savanna + +if Everness.settings.biomes.everness_baobab_savanna.enabled then + x_obsidianmese:register_path_node(path_nodes_baobab_savanna) +end + +-- Crystal Forest + +if Everness.settings.biomes.everness_crystal_forest.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest) +end + +if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_dunes) +end + +if Everness.settings.biomes.everness_crystal_forest_shore.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_shore) +end + +if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_ocean) +end + +if Everness.settings.biomes.everness_crystal_forest_under.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_under) +end + +-- Forsaken Tundra + +if Everness.settings.biomes.everness_forsaken_tundra.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_tundra) +end + +if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_tundra_beach) +end + +if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_tundra_ocean) +end + +-- Cursed Lands + +if Everness.settings.biomes.everness_cursed_lands.enabled + or Everness.settings.biomes.everness_cursed_lands_dunes.enabled + or Everness.settings.biomes.everness_cursed_lands_ocean.enabled +then + x_obsidianmese:register_path_node(path_nodes_cursed_lands_and_dunes_ocean) +end + +-- Coral Forest + +if Everness.settings.biomes.everness_coral_forest.enabled + or Everness.settings.biomes.everness_coral_forest_dunes.enabled +then + x_obsidianmese:register_path_node(path_nodes_coral_forest_and_dunes) +end + +if Everness.settings.biomes.everness_coral_forest_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_coral_forest_ocean) +end + +-- Forsaken Desert + +if Everness.settings.biomes.everness_forsaken_desert.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_desert) +end + +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_desert_ocean) +end + +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_desert_under) +end + +-- Frosted Icesheet + +if Everness.settings.biomes.everness_frosted_icesheet.enabled then + x_obsidianmese:register_path_node(path_nodes_frosted_icesheet) +end + +-- Mineral Waters + +if Everness.settings.biomes.everness_mineral_waters.enabled then + x_obsidianmese:register_path_node(path_nodes_mineral_waters) +end + +local mod_end_time = (minetest.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] everness: x_obsidianmese support loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/everness/mod_support_x_tumbleweed.lua b/mods/everness/mod_support_x_tumbleweed.lua new file mode 100644 index 00000000..68862f86 --- /dev/null +++ b/mods/everness/mod_support_x_tumbleweed.lua @@ -0,0 +1,43 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local mod_start_time = minetest.get_us_time() + +local allowed_biomes = {} + +if Everness.settings.biomes.everness_forsaken_desert.enabled then + table.insert(allowed_biomes, 'everness:forsaken_desert') +end + +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + table.insert(allowed_biomes, 'everness:forsaken_desert_ocean') +end + +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + table.insert(allowed_biomes, 'everness:forsaken_desert_under') +end + +if Everness.settings.biomes.everness_baobab_savanna.enabled then + table.insert(allowed_biomes, 'everness:baobab_savanna') +end + +if #allowed_biomes > 0 then + XTumbleweed:add_allowed_biomes(allowed_biomes) +end + +local mod_end_time = (minetest.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] everness: x_tumbleweed support loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/everness/models/everness_barrel_cactus.obj b/mods/everness/models/everness_barrel_cactus.obj new file mode 100644 index 00000000..9e39b806 --- /dev/null +++ b/mods/everness/models/everness_barrel_cactus.obj @@ -0,0 +1,555 @@ +# Blender v2.83.20 OBJ File: 'everness_barrel_cactus.blend' +# www.blender.org +mtllib everness_barrel_cactus.mtl +o barrel_cactus.vox +v -0.312500 -0.499000 0.312500 +v -0.250000 -0.374000 0.500000 +v -0.250000 -0.374000 0.375000 +v -0.375000 -0.374000 0.375000 +v -0.375000 -0.374000 -0.375000 +v -0.250000 -0.249000 0.500000 +v -0.375000 -0.249000 0.375000 +v -0.500000 -0.249000 -0.250000 +v -0.250000 -0.249000 -0.500000 +v -0.500000 -0.249000 0.250000 +v -0.375000 -0.249000 -0.500000 +v -0.375000 0.126000 0.500000 +v -0.500000 0.126000 0.375000 +v -0.500000 0.126000 0.250000 +v -0.500000 0.126000 -0.375000 +v -0.375000 0.126000 -0.375000 +v -0.500000 0.251000 -0.250000 +v -0.375000 0.251000 -0.250000 +v -0.375000 0.251000 -0.375000 +v -0.312500 0.376000 0.312500 +v 0.312500 -0.374000 -0.312500 +v 0.250000 -0.374000 0.500000 +v 0.250000 -0.374000 0.375000 +v 0.500000 -0.374000 -0.250000 +v 0.250000 -0.374000 -0.500000 +v 0.375000 -0.249000 0.250000 +v 0.375000 -0.249000 -0.250000 +v 0.250000 -0.249000 -0.500000 +v 0.375000 -0.249000 0.375000 +v 0.500000 -0.249000 -0.250000 +v 0.375000 -0.249000 -0.375000 +v 0.375000 -0.249000 -0.500000 +v 0.500000 0.126000 0.250000 +v 0.250000 0.126000 0.500000 +v 0.250000 0.126000 0.375000 +v 0.375000 0.126000 0.375000 +v 0.500000 0.126000 -0.250000 +v 0.375000 0.126000 -0.250000 +v 0.250000 0.126000 -0.375000 +v 0.250000 0.251000 0.500000 +v 0.375000 0.251000 0.375000 +v 0.375000 0.251000 0.250000 +v 0.500000 0.251000 0.250000 +v 0.500000 0.251000 -0.250000 +v 0.375000 0.251000 -0.375000 +v 0.250000 0.251000 -0.500000 +v 0.312500 0.251000 0.312500 +v 0.312500 0.376000 0.312500 +v 0.312500 0.376000 -0.312500 +v 0.312500 -0.374000 0.312500 +v 0.375000 -0.374000 0.375000 +v 0.375000 -0.374000 0.250000 +v 0.500000 -0.374000 0.250000 +v 0.250000 -0.249000 0.375000 +v -0.375000 -0.249000 0.250000 +v 0.500000 -0.249000 0.250000 +v 0.375000 -0.249000 0.500000 +v -0.500000 -0.249000 0.375000 +v -0.250000 0.126000 0.500000 +v -0.375000 0.126000 0.375000 +v 0.500000 0.126000 0.375000 +v 0.375000 0.126000 0.250000 +v -0.250000 0.251000 0.500000 +v -0.250000 0.251000 0.375000 +v -0.500000 0.251000 0.250000 +v 0.312500 -0.499000 -0.312500 +v -0.375000 -0.374000 -0.250000 +v 0.375000 -0.374000 -0.375000 +v -0.250000 -0.249000 -0.375000 +v 0.250000 -0.249000 -0.375000 +v -0.500000 -0.249000 -0.375000 +v -0.375000 0.126000 -0.500000 +v 0.250000 0.126000 -0.500000 +v 0.375000 0.126000 -0.500000 +v -0.250000 0.126000 -0.375000 +v -0.250000 0.126000 -0.500000 +v -0.312500 0.251000 -0.312500 +v 0.312500 0.251000 -0.312500 +v -0.312500 0.376000 -0.312500 +v 0.312500 -0.499000 0.312500 +v -0.312500 -0.499000 -0.312500 +v -0.312500 -0.374000 0.312500 +v -0.500000 -0.374000 0.250000 +v -0.375000 -0.374000 0.250000 +v -0.500000 -0.374000 -0.250000 +v 0.375000 -0.374000 -0.250000 +v -0.312500 -0.374000 -0.312500 +v -0.250000 -0.374000 -0.375000 +v 0.250000 -0.374000 -0.375000 +v -0.250000 -0.374000 -0.500000 +v -0.375000 -0.249000 0.500000 +v 0.250000 -0.249000 0.500000 +v -0.250000 -0.249000 0.375000 +v 0.500000 -0.249000 0.375000 +v -0.375000 -0.249000 -0.250000 +v 0.500000 -0.249000 -0.375000 +v -0.375000 -0.249000 -0.375000 +v 0.375000 0.126000 0.500000 +v -0.250000 0.126000 0.375000 +v -0.375000 0.126000 0.250000 +v -0.500000 0.126000 -0.250000 +v -0.375000 0.126000 -0.250000 +v 0.375000 0.126000 -0.375000 +v 0.500000 0.126000 -0.375000 +v 0.250000 0.251000 0.375000 +v -0.375000 0.251000 0.375000 +v -0.312500 0.251000 0.312500 +v -0.375000 0.251000 0.250000 +v 0.375000 0.251000 -0.250000 +v 0.250000 0.251000 -0.375000 +v -0.250000 0.251000 -0.375000 +v -0.250000 0.251000 -0.500000 +v 0.353553 1.375998 0.353553 +v 0.353553 0.375999 0.353553 +v -0.353553 1.375998 -0.353553 +v -0.353553 0.375998 -0.353553 +v 0.353553 1.375998 -0.353553 +v 0.353553 0.375998 -0.353553 +v -0.353553 1.375998 0.353553 +v -0.353553 0.375998 0.353553 +vt 0.000000 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.437500 +vt 0.000000 0.437500 +vt 0.093750 0.406250 +vt 0.406250 0.406250 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.062500 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.062500 0.062500 +vt 0.000000 0.062500 +vt 0.062500 0.125000 +vt 0.000000 0.125000 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.625000 +vt 0.406250 0.093750 +vt 0.406250 0.406250 +vt 0.093750 0.406250 +vt 0.093750 0.093750 +vt 0.500000 0.125000 +vt 0.437500 0.125000 +vt 0.437500 0.062500 +vt 0.500000 0.062500 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.625000 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.125000 +vt 0.437500 0.062500 +vt 0.500000 0.062500 +vt 0.500000 0.125000 +vt 0.093750 0.406250 +vt 0.406250 0.406250 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.125000 +vt 0.062500 0.125000 +vt 0.093750 0.093750 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.062500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.437500 +vt 0.125000 0.437500 +vt 0.125000 0.500000 +vt 0.062500 0.500000 +vt -0.000000 0.875000 +vt -0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.062500 0.375000 +vt 0.000000 0.437500 +vt 0.000000 0.375000 +vt 0.437500 0.375000 +vt 0.500000 0.375000 +vt 0.500000 0.437500 +vt 0.437500 0.437500 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.062500 0.562500 +vt 0.062500 0.625000 +vt -0.000000 0.625000 +vt -0.000000 0.562500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.500000 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.375000 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.875000 +vt 0.406250 0.562500 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.406250 0.875000 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.125000 0.062500 +vt 0.125000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.062500 +vt 0.437500 0.062500 +vt 0.437500 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.437500 +vt 0.406250 0.093750 +vt 0.062500 0.062500 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.062500 0.062500 +vt 0.062500 0.000000 +vt 0.062500 0.500000 +vt 0.125000 0.437500 +vt 0.125000 0.500000 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.562500 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.437500 0.437500 +vt 0.437500 0.375000 +vt 0.500000 0.375000 +vt 0.500000 0.437500 +vt 0.093750 0.875000 +vt 0.406250 0.875000 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.062500 0.125000 +vt 0.000000 0.125000 +vt 0.000000 0.062500 +vt 0.406250 0.500000 +vt 0.406250 0.562500 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.375000 0.000000 +vt 0.437500 0.000000 +vt 0.375000 0.062500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.437500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.375000 0.062500 +vt 0.375000 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.062500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.625000 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.406250 0.093750 +vt 0.406250 0.406250 +vt 0.093750 0.406250 +vt 0.093750 0.093750 +vt 0.406250 0.875000 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.437500 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.406250 0.093750 +vt 0.093750 0.093750 +vt 0.000000 0.375000 +vt 0.000000 0.125000 +vt 0.062500 0.125000 +vt 0.062500 0.062500 +vt 0.125000 0.062500 +vt 0.125000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.062500 +vt 0.437500 0.062500 +vt 0.437500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.437500 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt -0.000000 0.812500 +vt -0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.406250 0.875000 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.562500 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 -0.0000 -0.7071 +g barrel_cactus.vox_barrel_cactus.vox_cactus +usemtl cactus +s off +f 101/1/1 102/2/1 16/3/1 15/4/1 +f 77/5/1 78/6/1 45/7/1 110/8/1 46/9/1 112/10/1 111/11/1 19/12/1 18/13/1 +f 11/14/2 9/15/2 69/16/2 97/17/2 +f 71/18/2 97/17/2 95/19/2 8/20/2 +f 6/21/3 93/22/3 3/23/3 2/24/3 +f 28/25/4 70/26/4 89/27/4 25/28/4 +f 94/29/5 61/30/5 36/31/5 29/32/5 +f 66/33/2 80/34/2 1/35/2 81/36/2 +f 30/37/2 27/38/2 31/39/2 96/40/2 +f 31/41/6 68/42/6 89/43/6 70/44/6 +f 102/45/3 18/46/3 19/47/3 16/48/3 +f 33/49/5 43/50/5 42/51/5 62/52/5 +f 62/53/1 36/54/1 61/55/1 33/56/1 +f 82/57/2 50/58/2 23/59/2 22/60/2 2/61/2 3/62/2 4/63/2 84/64/2 83/65/2 85/66/2 67/67/2 87/68/2 +f 38/69/6 109/70/6 44/71/6 37/72/6 +f 100/73/5 108/74/5 65/75/5 14/76/5 +f 106/77/3 108/78/3 100/79/3 60/80/3 +f 31/81/4 27/82/4 86/83/4 68/84/4 +f 52/85/4 26/86/4 29/87/4 51/88/4 +f 55/89/5 10/90/5 83/91/5 84/92/5 +f 7/93/2 93/94/2 6/95/2 91/96/2 +f 40/97/4 34/98/4 35/99/4 105/100/4 +f 55/101/2 7/93/2 58/102/2 10/103/2 +f 26/104/2 56/105/2 94/106/2 29/107/2 +f 112/108/3 76/109/3 75/110/3 111/111/3 +f 23/112/4 54/113/4 92/114/4 22/115/4 +f 63/116/3 64/117/3 99/118/3 59/119/3 +f 92/120/2 54/121/2 29/107/2 57/122/2 +f 39/123/6 110/124/6 45/125/6 103/126/6 +f 35/127/5 36/31/5 41/128/5 105/129/5 +f 87/130/6 21/131/6 66/132/6 81/133/6 +f 48/134/5 20/135/5 107/136/5 47/137/5 +f 91/138/5 6/139/5 2/140/5 22/141/5 92/142/5 57/143/5 98/144/5 34/145/5 40/146/5 63/147/5 59/148/5 12/149/5 +f 109/150/4 38/151/4 103/152/4 45/153/4 +f 103/152/4 31/81/4 32/154/4 74/155/4 +f 88/156/2 90/157/2 25/158/2 89/159/2 68/160/2 86/161/2 24/162/2 53/163/2 52/164/2 51/165/2 23/59/2 50/58/2 21/166/2 87/68/2 67/67/2 5/167/2 +f 59/168/1 99/169/1 60/170/1 12/171/1 +f 72/172/1 16/3/1 75/173/1 76/174/1 +f 82/175/5 1/176/5 80/177/5 50/178/5 +f 99/179/5 64/180/5 106/181/5 60/182/5 +f 54/183/5 23/184/5 51/185/5 29/32/5 +f 101/186/6 17/187/6 18/188/6 102/189/6 +f 16/48/3 72/190/3 11/191/3 97/192/3 +f 93/193/5 7/194/5 4/195/5 3/196/5 +f 103/197/1 38/198/1 37/199/1 104/200/1 +f 78/201/6 77/202/6 79/203/6 49/204/6 +f 100/205/1 14/206/1 13/207/1 60/170/1 +f 66/208/4 21/209/4 50/210/4 80/211/4 +f 28/212/2 32/213/2 31/39/2 70/214/2 +f 56/215/5 26/216/5 52/217/5 53/218/5 +f 8/219/6 95/220/6 67/221/6 85/222/6 +f 13/223/5 58/224/5 7/194/5 60/182/5 +f 103/197/1 74/225/1 73/226/1 39/227/1 +f 62/228/4 42/229/4 41/230/4 36/231/4 +f 35/232/1 34/233/1 98/234/1 36/54/1 +f 110/235/4 39/236/4 73/237/4 46/238/4 +f 27/239/6 30/240/6 24/241/6 86/242/6 +f 103/126/6 104/243/6 96/244/6 31/41/6 +f 83/245/3 10/246/3 58/247/3 13/248/3 14/249/3 65/250/3 17/251/3 101/252/3 15/253/3 71/254/3 8/255/3 85/256/3 +f 71/257/6 15/258/6 16/259/6 97/260/6 +f 76/261/6 112/262/6 46/263/6 73/264/6 74/265/6 32/266/6 28/267/6 25/268/6 90/269/6 9/270/6 11/271/6 72/272/6 +f 48/273/1 49/274/1 79/275/1 20/276/1 +f 78/277/4 49/278/4 48/279/4 47/280/4 +f 95/281/3 97/192/3 5/282/3 67/283/3 +f 42/284/1 43/285/1 44/286/1 109/287/1 45/7/1 78/6/1 47/288/1 107/289/1 77/5/1 18/13/1 17/290/1 65/291/1 108/292/1 106/293/1 64/294/1 63/295/1 40/296/1 105/297/1 41/298/1 +f 7/299/3 55/300/3 84/301/3 4/302/3 +f 16/259/6 19/303/6 111/304/6 75/305/6 +f 91/306/3 12/307/3 60/80/3 7/299/3 +f 98/308/4 57/309/4 29/87/4 36/231/4 +f 69/310/3 9/311/3 90/312/3 88/313/3 +f 97/260/6 69/314/6 88/315/6 5/316/6 +f 20/317/3 79/318/3 77/319/3 107/320/3 +f 37/321/4 44/322/4 43/323/4 33/324/4 61/325/4 94/326/4 56/327/4 53/328/4 24/329/4 30/330/4 96/331/4 104/332/4 +f 87/333/3 81/334/3 1/335/3 82/336/3 +f 113/337/7 114/338/7 116/339/7 115/340/7 +f 117/341/8 118/342/8 120/343/8 119/344/8 diff --git a/mods/everness/models/everness_cave_flower.obj b/mods/everness/models/everness_cave_flower.obj new file mode 100644 index 00000000..814a0997 --- /dev/null +++ b/mods/everness/models/everness_cave_flower.obj @@ -0,0 +1,38 @@ +# Blender 3.3.1 +# www.blender.org +mtllib everness_cave_flower.mtl +o Cube +v 0.000000 -0.499000 0.000000 +v -0.500000 -0.499000 0.500000 +v 0.500000 -0.229136 -0.500000 +v 0.500000 -0.499000 0.500000 +v -0.500000 -0.229136 -0.500000 +v -0.500000 -0.499000 -0.500000 +v 0.500000 -0.229136 0.500000 +v 0.500000 -0.499000 -0.500000 +v -0.500000 -0.229136 0.500000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 0.8800 -0.4750 +vn 0.4750 0.8800 -0.0000 +vn -0.0000 0.8800 0.4750 +vn -0.4750 0.8800 -0.0000 +vt 0.250000 1.000000 +vt 1.000000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 0.500000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 1.000000 -0.000000 +vt 0.500000 0.187500 +vt -0.000000 0.187500 +vt 0.500000 -0.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +s 0 +usemtl flower +f 8/11/1 6/8/1 2/2/1 4/5/1 +f 9/12/2 7/9/2 1/1/2 +f 5/6/3 9/13/3 1/1/3 +f 3/3/4 5/7/4 1/1/4 +f 7/10/5 3/4/5 1/1/5 diff --git a/mods/everness/models/everness_cave_flower_with_particles.obj b/mods/everness/models/everness_cave_flower_with_particles.obj new file mode 100644 index 00000000..1dc8c8b0 --- /dev/null +++ b/mods/everness/models/everness_cave_flower_with_particles.obj @@ -0,0 +1,61 @@ +# Blender v2.83.20 OBJ File: 'everness_cave_flower_with_particles.blend' +# www.blender.org +mtllib everness_cave_flower_with_particles.mtl +o Cube +v 0.000000 -0.499000 0.000000 +v -0.500000 -0.499000 0.500000 +v 0.500000 -0.229136 -0.500000 +v 0.500000 -0.499000 0.500000 +v -0.500000 -0.229136 -0.500000 +v -0.500000 -0.499000 -0.500000 +v 0.500000 -0.229136 0.500000 +v 0.500000 -0.499000 -0.500000 +v -0.500000 -0.229136 0.500000 +v 0.353553 -0.499000 0.353553 +v -0.353553 -0.499000 -0.353553 +v 0.353553 1.501000 0.353553 +v -0.353553 1.501000 -0.353553 +v -0.353553 -0.499000 0.353553 +v 0.353553 -0.499000 -0.353553 +v -0.353553 1.501000 0.353553 +v 0.353553 1.501000 -0.353553 +vt 0.500000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 0.250000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.8800 -0.4750 +vn 0.4750 0.8800 0.0000 +vn 0.0000 0.8800 0.4750 +vn -0.4750 0.8800 0.0000 +vn 0.7071 -0.0000 -0.7071 +vn 0.7071 -0.0000 0.7071 +g Cube_Cube_flower +usemtl flower +s off +f 8/1/1 6/2/1 2/3/1 4/4/1 +f 9/5/2 7/6/2 1/7/2 +f 5/8/3 9/9/3 1/7/3 +f 3/10/4 5/11/4 1/7/4 +f 7/12/5 3/13/5 1/7/5 +g Cube_Cube_particles +usemtl particles +f 13/14/6 12/15/6 10/16/6 11/17/6 +f 17/18/7 16/19/7 14/20/7 15/21/7 diff --git a/mods/everness/models/everness_ceramic_pot.obj b/mods/everness/models/everness_ceramic_pot.obj new file mode 100644 index 00000000..6755b363 --- /dev/null +++ b/mods/everness/models/everness_ceramic_pot.obj @@ -0,0 +1,375 @@ +# Blender v2.83.20 OBJ File: 'everness_ceramic_pot.blend' +# www.blender.org +mtllib everness_ceramic_pot.mtl +o everness_ceramic_pot.vox +v -0.375000 -0.499000 0.375000 +v -0.437500 -0.436500 0.437500 +v -0.437500 0.501000 0.125000 +v -0.250000 0.501000 0.125000 +v -0.250000 0.501000 -0.250000 +v -0.312500 0.563500 0.312500 +v -0.312500 0.751000 -0.312500 +v 0.375000 -0.499000 0.375000 +v 0.437500 -0.436500 0.437500 +v 0.437500 0.501000 0.437500 +v 0.312500 0.563500 0.312500 +v -0.375000 -0.436500 0.375000 +v 0.375000 -0.436500 0.375000 +v -0.250000 0.501000 0.437500 +v -0.250000 0.501000 0.250000 +v -0.250000 0.563500 0.250000 +v 0.250000 0.563500 0.250000 +v -0.312500 0.751000 0.312500 +v -0.187500 0.751000 0.312500 +v 0.312500 0.751000 0.312500 +v -0.187500 0.751000 -0.187500 +v 0.187500 0.751000 -0.187500 +v -0.375000 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.375000 +v 0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 -0.437500 +v -0.312500 0.563500 -0.312500 +v 0.062500 0.563500 -0.312500 +v -0.062500 0.751000 0.187500 +v 0.312500 0.751000 -0.312500 +v -0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.437500 +v 0.375000 -0.436500 -0.375000 +v 0.437500 -0.436500 -0.437500 +v -0.312500 0.563500 -0.250000 +v -0.250000 0.563500 -0.250000 +v 0.062500 0.563500 -0.250000 +v 0.250000 0.563500 -0.250000 +v 0.312500 0.563500 -0.312500 +v -0.437500 0.501000 0.437500 +v 0.250000 0.501000 0.250000 +v 0.250000 0.501000 -0.250000 +v -0.437500 0.501000 -0.437500 +v -0.062500 0.751000 0.312500 +v -0.187500 0.751000 0.187500 +v 0.187500 0.751000 0.187500 +v 0.437500 -0.436500 0.437500 +v 0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 0.437500 +v 0.437500 0.501000 -0.437500 +v -0.375000 -0.499000 0.375000 +v -0.437500 -0.436500 0.437500 +v -0.437500 0.501000 0.125000 +v -0.250000 0.501000 0.125000 +v -0.250000 0.501000 -0.250000 +v -0.312500 0.563500 0.312500 +v -0.312500 0.751000 -0.312500 +v 0.375000 -0.499000 0.375000 +v 0.437500 -0.436500 0.437500 +v 0.437500 0.501000 0.437500 +v 0.312500 0.563500 0.312500 +v -0.187500 0.626000 -0.187500 +v -0.375000 -0.436500 0.375000 +v 0.375000 -0.436500 0.375000 +v -0.250000 0.501000 0.437500 +v -0.250000 0.501000 0.250000 +v -0.250000 0.563500 0.250000 +v 0.250000 0.563500 0.250000 +v 0.187500 0.626000 -0.187500 +v -0.312500 0.751000 0.312500 +v -0.187500 0.751000 0.312500 +v 0.312500 0.751000 0.312500 +v -0.187500 0.751000 -0.187500 +v 0.187500 0.751000 -0.187500 +v -0.375000 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.375000 +v 0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 -0.437500 +v -0.312500 0.563500 -0.312500 +v 0.062500 0.563500 -0.312500 +v -0.187500 0.626000 0.187500 +v -0.062500 0.751000 0.187500 +v 0.312500 0.751000 -0.312500 +v -0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.437500 +v 0.375000 -0.436500 -0.375000 +v 0.437500 -0.436500 -0.437500 +v -0.312500 0.563500 -0.250000 +v -0.250000 0.563500 -0.250000 +v 0.062500 0.563500 -0.250000 +v 0.250000 0.563500 -0.250000 +v 0.312500 0.563500 -0.312500 +v -0.437500 0.501000 0.437500 +v 0.250000 0.501000 0.250000 +v 0.250000 0.501000 -0.250000 +v -0.437500 0.501000 -0.437500 +v 0.187500 0.626000 0.187500 +v -0.062500 0.751000 0.312500 +v -0.187500 0.751000 0.187500 +v 0.187500 0.751000 0.187500 +v 0.437500 -0.436500 0.437500 +v 0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 0.437500 +v 0.437500 0.501000 -0.437500 +vt 0.437500 0.250000 +vt 0.375000 0.218750 +vt 0.437500 0.218750 +vt 0.000000 0.000000 +vt 0.093750 0.000000 +vt 0.093750 0.046875 +vt 0.437500 0.000000 +vt 0.437500 0.218750 +vt 0.343750 0.171875 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.843750 0.218750 +vt 0.843750 0.015625 +vt 0.812500 0.031250 +vt 0.625000 0.375000 +vt 0.312500 0.375000 +vt 0.562500 0.343750 +vt 0.468750 0.203125 +vt 0.812500 0.031250 +vt 0.468750 0.031250 +vt 0.531250 0.218750 +vt 0.531250 0.203125 +vt 0.468750 0.203125 +vt 0.906250 0.234375 +vt 0.937500 0.375000 +vt 0.937500 0.218750 +vt 0.812500 0.375000 +vt 0.812500 0.359375 +vt 0.656250 0.359375 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.031250 0.390625 +vt 0.437500 0.390625 +vt 0.281250 0.625000 +vt 0.093750 0.640625 +vt 0.093750 0.625000 +vt 0.281250 0.625000 +vt 0.062500 0.687500 +vt 0.062500 0.640625 +vt 0.093750 0.640625 +vt 0.062500 0.218750 +vt 0.250000 0.250000 +vt 0.250000 0.218750 +vt 0.843750 0.687500 +vt 0.781250 0.703125 +vt 0.468750 0.687500 +vt 0.343750 0.937500 +vt 0.093750 0.953125 +vt 0.093750 0.937500 +vt 0.062500 0.343750 +vt 0.250000 0.375000 +vt 0.062500 0.375000 +vt 0.875000 0.390625 +vt 0.531250 0.625000 +vt 0.031250 0.375000 +vt 0.406250 0.390625 +vt 0.031250 0.390625 +vt 0.781250 0.625000 +vt 0.531250 0.640625 +vt 0.531250 0.625000 +vt 0.406250 0.687500 +vt 0.031250 0.703125 +vt 0.031250 0.687500 +vt 0.312500 0.343750 +vt 0.250000 0.250000 +vt 0.312500 0.250000 +vt 0.812500 0.640625 +vt 0.812500 0.687500 +vt 0.625000 0.687500 +vt 0.437500 0.937500 +vt 0.437500 0.703125 +vt 0.781250 0.703125 +vt 0.625000 0.953125 +vt 0.531250 0.937500 +vt 0.781250 0.937500 +vt 0.500000 1.000000 +vt 0.500000 0.953125 +vt 0.625000 0.953125 +vt 0.062500 0.250000 +vt 0.000000 0.281250 +vt 0.062500 0.343750 +vt 0.375000 0.953125 +vt 0.062500 1.000000 +vt 0.062500 0.953125 +vt 0.250000 0.343750 +vt 0.062500 0.343750 +vt 0.843750 0.375000 +vt 0.468750 0.390625 +vt 0.468750 0.375000 +vt 0.437500 0.937500 +vt 0.000000 0.703125 +vt 0.437500 0.703125 +vt 0.375000 0.250000 +vt 0.093750 0.078125 +vt 0.000000 0.078125 +vt 0.343750 0.046875 +vt 0.000000 0.218750 +vt 0.093750 0.171875 +vt 0.812500 0.203125 +vt 0.437500 0.015625 +vt 0.437500 0.203125 +vt 0.468750 0.031250 +vt 0.312500 0.218750 +vt 0.375000 0.343750 +vt 0.562500 0.250000 +vt 0.625000 0.218750 +vt 0.812500 0.203125 +vt 0.437500 0.218750 +vt 0.625000 0.218750 +vt 0.625000 0.359375 +vt 0.656250 0.234375 +vt 0.906250 0.359375 +vt 0.625000 0.375000 +vt 0.437500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.390625 +vt 0.343750 0.625000 +vt 0.343750 0.640625 +vt 0.375000 0.640625 +vt 0.375000 0.687500 +vt 0.062500 0.250000 +vt 0.843750 0.703125 +vt 0.468750 0.703125 +vt 0.343750 0.953125 +vt 0.250000 0.343750 +vt 0.875000 0.625000 +vt 0.406250 0.375000 +vt 0.781250 0.640625 +vt 0.406250 0.703125 +vt 0.562500 0.687500 +vt 0.500000 0.640625 +vt 0.500000 0.687500 +vt 0.875000 0.703125 +vt 0.875000 0.937500 +vt 0.781250 0.953125 +vt 0.531250 0.953125 +vt 0.812500 0.953125 +vt 0.812500 1.000000 +vt -0.000000 0.250000 +vt 0.000000 0.343750 +vt 0.375000 1.000000 +vt 0.843750 0.390625 +vt 0.000000 0.937500 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +usemtl pot +s off +f 30/1/1 19/2/1 46/3/1 +f 42/4/1 14/5/1 15/6/1 +f 10/7/1 27/8/1 44/9/1 +f 27/10/2 51/11/2 52/12/2 +f 36/13/3 9/14/3 13/15/3 +f 31/16/1 7/17/1 22/18/1 +f 32/19/3 8/20/3 1/21/3 +f 34/22/3 24/23/3 23/24/3 +f 17/25/3 41/26/3 11/27/3 +f 29/28/3 39/29/3 38/30/3 +f 10/31/2 49/32/2 51/11/2 +f 36/33/2 52/12/2 50/34/2 +f 9/35/2 50/34/2 49/32/2 +f 88/36/4 54/37/4 55/38/4 +f 93/39/4 57/40/4 56/41/4 +f 59/42/4 82/43/4 92/44/4 +f 76/45/4 101/46/4 104/47/4 +f 87/48/5 78/49/5 79/50/5 +f 99/51/6 70/52/6 98/53/6 +f 84/54/6 75/55/6 103/56/6 +f 61/57/2 67/58/2 54/37/2 +f 87/59/4 65/60/4 77/61/4 +f 98/62/2 69/63/2 68/64/2 +f 79/65/6 66/66/6 60/67/6 +f 75/68/2 71/69/2 76/70/2 +f 63/71/2 74/72/2 102/73/2 +f 81/74/5 91/75/5 89/76/5 +f 94/77/5 99/78/5 57/79/5 +f 86/80/5 96/81/5 83/82/5 +f 84/83/5 85/84/5 101/85/5 +f 96/86/6 74/87/6 63/88/6 +f 84/83/1 71/89/1 64/90/1 +f 60/91/2 65/92/2 53/93/2 +f 108/94/6 105/95/6 106/96/6 +f 30/1/1 47/97/1 19/2/1 +f 4/98/1 3/99/1 15/6/1 +f 3/99/1 42/4/1 15/6/1 +f 43/100/1 15/6/1 14/5/1 +f 45/101/1 3/99/1 5/102/1 +f 3/99/1 4/98/1 5/102/1 +f 43/100/1 14/5/1 10/7/1 +f 45/101/1 5/102/1 44/9/1 +f 44/9/1 43/100/1 10/7/1 +f 27/8/1 45/101/1 44/9/1 +f 27/10/2 10/31/2 51/11/2 +f 24/23/3 34/22/3 35/103/3 +f 34/22/3 36/13/3 35/103/3 +f 2/104/3 33/105/3 12/106/3 +f 33/105/3 23/24/3 12/106/3 +f 2/104/3 12/106/3 13/15/3 +f 13/15/3 35/103/3 36/13/3 +f 9/14/3 2/104/3 13/15/3 +f 7/17/1 18/107/1 47/97/1 +f 18/107/1 19/2/1 47/97/1 +f 47/97/1 21/108/1 7/17/1 +f 30/1/1 46/3/1 48/109/1 +f 46/3/1 20/110/1 48/109/1 +f 22/18/1 48/109/1 20/110/1 +f 7/17/1 21/108/1 22/18/1 +f 22/18/1 20/110/1 31/16/1 +f 32/19/3 25/111/3 8/20/3 +f 33/105/3 26/112/3 23/24/3 +f 26/112/3 34/22/3 23/24/3 +f 6/113/3 37/114/3 16/115/3 +f 37/114/3 38/30/3 16/115/3 +f 39/29/3 29/28/3 40/116/3 +f 29/28/3 41/26/3 40/116/3 +f 11/27/3 6/113/3 16/115/3 +f 17/25/3 40/116/3 41/26/3 +f 11/27/3 16/115/3 17/25/3 +f 37/114/3 28/117/3 38/30/3 +f 28/117/3 29/28/3 38/30/3 +f 10/31/2 9/35/2 49/32/2 +f 36/33/2 27/10/2 52/12/2 +f 9/35/2 36/33/2 50/34/2 +f 97/118/4 55/38/4 54/37/4 +f 55/38/4 100/119/4 88/36/4 +f 100/119/4 80/120/4 88/36/4 +f 68/121/4 69/122/4 56/41/4 +f 69/122/4 93/39/4 56/41/4 +f 58/123/4 72/124/4 92/44/4 +f 72/124/4 59/42/4 92/44/4 +f 76/45/4 71/125/4 101/46/4 +f 77/126/5 78/49/5 87/48/5 +f 78/49/5 90/127/5 79/50/5 +f 99/51/6 95/128/6 70/52/6 +f 84/54/6 64/129/6 75/55/6 +f 62/130/2 67/58/2 61/57/2 +f 67/58/2 97/118/2 54/37/2 +f 87/59/4 53/131/4 65/60/4 +f 98/62/2 70/132/2 69/63/2 +f 79/65/6 90/133/6 66/66/6 +f 75/68/2 64/129/2 71/69/2 +f 102/73/2 73/134/2 58/135/2 +f 73/134/2 72/136/2 58/135/2 +f 102/73/2 58/135/2 63/71/2 +f 89/76/5 80/137/5 100/138/5 +f 100/138/5 81/74/5 89/76/5 +f 57/79/5 93/139/5 94/77/5 +f 94/77/5 95/140/5 99/78/5 +f 82/141/5 59/142/5 83/82/5 +f 59/142/5 86/80/5 83/82/5 +f 103/143/5 85/84/5 84/83/5 +f 85/84/5 104/144/5 101/85/5 +f 96/86/6 86/145/6 74/87/6 +f 84/83/1 101/46/1 71/89/1 +f 60/91/2 66/146/2 65/92/2 +f 108/94/6 107/147/6 105/95/6 diff --git a/mods/everness/models/everness_chest_open.obj b/mods/everness/models/everness_chest_open.obj new file mode 100644 index 00000000..72ba175a --- /dev/null +++ b/mods/everness/models/everness_chest_open.obj @@ -0,0 +1,79 @@ +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' +# www.blender.org +o Top_Cube.002_None_Top_Cube.002_None_bottom +v -0.500000 0.408471 0.720970 +v -0.500000 1.115578 0.013863 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 +v 0.500000 1.115578 0.013863 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top +s off +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/mods/everness/models/everness_forsaken_fire.obj b/mods/everness/models/everness_forsaken_fire.obj new file mode 100644 index 00000000..77d58cdc --- /dev/null +++ b/mods/everness/models/everness_forsaken_fire.obj @@ -0,0 +1,1646 @@ +# Blender v2.83.20 OBJ File: 'everness_forsaken_fire.blend' +# www.blender.org +mtllib everness_forsaken_fire.mtl +o forsaken_fire.vox +v -0.312500 -0.499000 0.312500 +v -0.312500 -0.436500 0.312500 +v -0.375000 -0.374000 0.312500 +v -0.437500 -0.374000 0.437500 +v 0.312500 -0.374000 0.437500 +v -0.437500 -0.374000 0.312500 +v 0.375000 -0.374000 0.312500 +v -0.437500 -0.374000 -0.312500 +v 0.375000 -0.374000 -0.312500 +v 0.312500 -0.249000 0.437500 +v 0.375000 -0.249000 0.375000 +v -0.375000 -0.249000 0.312500 +v -0.500000 -0.249000 0.062500 +v 0.437500 -0.311500 0.062500 +v -0.500000 -0.249000 0.125000 +v -0.500000 -0.249000 -0.125000 +v -0.437500 -0.249000 -0.312500 +v -0.437500 -0.249000 -0.375000 +v 0.062500 -0.249000 -0.437500 +v -0.437500 -0.124000 0.125000 +v -0.500000 -0.124000 0.125000 +v -0.500000 -0.124000 -0.125000 +v -0.062500 -0.061500 0.500000 +v 0.437500 -0.061500 0.437500 +v -0.437500 -0.061500 0.375000 +v -0.437500 -0.124000 -0.062500 +v 0.437500 -0.061500 -0.375000 +v 0.375000 -0.061500 0.437500 +v 0.375000 -0.061500 0.375000 +v -0.375000 0.001000 0.312500 +v 0.375000 0.063500 0.500000 +v -0.437500 0.001000 0.375000 +v -0.312500 0.063500 0.312500 +v -0.312500 0.001000 0.312500 +v 0.375000 0.063500 0.375000 +v -0.500000 0.063500 -0.375000 +v 0.437500 0.001000 -0.437500 +v 0.312500 0.063500 0.437500 +v -0.437500 0.063500 0.312500 +v -0.437500 0.063500 -0.312500 +v -0.437500 0.188500 0.312500 +v 0.312500 0.188500 0.375000 +v -0.437500 0.188500 -0.312500 +v 0.250000 0.188500 0.375000 +v -0.375000 0.188500 0.250000 +v -0.375000 0.188500 -0.250000 +v 0.250000 0.251000 -0.375000 +v 0.250000 0.188500 -0.375000 +v 0.312500 -0.499000 0.312500 +v 0.312500 -0.436500 0.312500 +v -0.312500 -0.374000 0.375000 +v 0.437500 -0.374000 0.312500 +v 0.437500 -0.374000 -0.312500 +v 0.437500 -0.374000 -0.437500 +v 0.062500 -0.311500 0.500000 +v 0.062500 -0.311500 0.437500 +v 0.437500 -0.249000 0.375000 +v 0.375000 -0.249000 -0.312500 +v -0.375000 -0.249000 -0.375000 +v 0.312500 -0.249000 -0.375000 +v -0.312500 -0.249000 -0.437500 +v -0.312500 -0.249000 -0.375000 +v 0.125000 -0.249000 0.437500 +v 0.437500 -0.249000 0.312500 +v 0.500000 -0.249000 0.125000 +v 0.500000 -0.249000 -0.125000 +v 0.437500 -0.249000 -0.125000 +v 0.375000 -0.249000 -0.437500 +v 0.500000 -0.249000 -0.375000 +v -0.062500 -0.249000 -0.437500 +v 0.125000 -0.249000 -0.500000 +v 0.125000 -0.124000 0.437500 +v 0.500000 -0.124000 0.062500 +v 0.125000 -0.124000 -0.500000 +v -0.375000 -0.061500 -0.375000 +v 0.375000 -0.061500 -0.437500 +v -0.375000 0.001000 0.437500 +v 0.375000 0.001000 0.312500 +v 0.375000 0.001000 -0.312500 +v -0.437500 0.001000 0.437500 +v 0.375000 0.063500 0.437500 +v 0.312500 0.063500 0.312500 +v 0.437500 0.063500 -0.312500 +v 0.500000 0.063500 -0.375000 +v -0.375000 0.063500 -0.500000 +v -0.312500 0.063500 0.375000 +v -0.312500 0.063500 -0.312500 +v -0.312500 0.063500 -0.375000 +v -0.312500 0.063500 -0.437500 +v -0.312500 0.188500 0.437500 +v -0.312500 0.188500 0.312500 +v 0.437500 0.188500 0.312500 +v -0.312500 0.188500 -0.312500 +v 0.437500 0.188500 -0.312500 +v -0.250000 0.188500 0.375000 +v 0.375000 0.188500 0.312500 +v 0.375000 0.188500 -0.312500 +v -0.250000 0.188500 -0.375000 +v -0.250000 0.251000 -0.375000 +v 0.375000 0.251000 -0.375000 +v -0.375000 -0.436500 0.375000 +v 0.375000 -0.436500 0.375000 +v 0.312500 -0.374000 0.375000 +v -0.312500 -0.374000 -0.312500 +v -0.312500 -0.374000 0.437500 +v 0.437500 -0.374000 0.437500 +v -0.062500 -0.311500 0.500000 +v -0.312500 -0.249000 0.312500 +v 0.312500 -0.249000 0.312500 +v 0.500000 -0.311500 0.062500 +v -0.312500 -0.249000 -0.312500 +v 0.437500 -0.249000 -0.312500 +v 0.375000 -0.249000 -0.375000 +v -0.062500 -0.311500 -0.437500 +v 0.062500 -0.311500 -0.437500 +v -0.125000 -0.249000 0.500000 +v 0.125000 -0.249000 0.500000 +v 0.375000 -0.249000 0.500000 +v 0.500000 -0.249000 0.500000 +v -0.312500 -0.249000 0.437500 +v -0.125000 -0.249000 0.437500 +v -0.062500 -0.249000 0.437500 +v -0.437500 -0.249000 0.125000 +v -0.500000 -0.249000 -0.062500 +v -0.500000 -0.249000 -0.375000 +v 0.437500 -0.249000 -0.375000 +v -0.375000 -0.249000 -0.437500 +v 0.437500 -0.249000 -0.437500 +v -0.125000 -0.124000 0.500000 +v 0.125000 -0.124000 0.500000 +v -0.125000 -0.124000 0.437500 +v -0.062500 -0.124000 0.437500 +v 0.500000 -0.124000 0.125000 +v 0.437500 -0.124000 0.125000 +v 0.062500 -0.061500 0.500000 +v -0.375000 -0.061500 0.375000 +v 0.437500 -0.061500 0.375000 +v -0.500000 -0.124000 0.062500 +v -0.500000 -0.061500 0.062500 +v 0.437500 -0.124000 0.062500 +v -0.437500 -0.061500 -0.375000 +v -0.437500 -0.061500 -0.437500 +v 0.437500 -0.061500 -0.437500 +v -0.312500 0.001000 0.375000 +v 0.375000 0.001000 0.375000 +v -0.437500 0.001000 -0.375000 +v -0.500000 0.063500 0.500000 +v -0.312500 0.063500 0.437500 +v 0.437500 0.001000 0.375000 +v 0.437500 0.063500 0.375000 +v -0.375000 0.063500 0.312500 +v -0.375000 0.063500 -0.375000 +v 0.312500 0.063500 -0.375000 +v -0.375000 0.063500 -0.437500 +v 0.375000 0.063500 -0.437500 +v -0.375000 0.063500 -0.312500 +v -0.437500 0.188500 0.437500 +v 0.312500 0.188500 0.437500 +v -0.375000 0.188500 -0.312500 +v -0.312500 0.188500 0.375000 +v -0.250000 0.251000 0.375000 +v 0.250000 0.251000 0.375000 +v -0.250000 0.188500 -0.250000 +v 0.250000 0.251000 -0.250000 +v 0.312500 -0.374000 0.312500 +v -0.375000 -0.436500 -0.375000 +v -0.312500 -0.374000 -0.375000 +v 0.375000 -0.436500 -0.375000 +v -0.437500 -0.374000 -0.437500 +v 0.312500 -0.374000 -0.437500 +v 0.062500 -0.249000 0.437500 +v 0.312500 -0.249000 0.375000 +v 0.375000 -0.249000 0.312500 +v -0.437500 -0.249000 -0.062500 +v 0.437500 -0.311500 -0.062500 +v -0.437500 -0.249000 -0.437500 +v -0.062500 -0.311500 -0.500000 +v 0.062500 -0.249000 -0.500000 +v 0.062500 -0.311500 -0.500000 +v -0.437500 -0.249000 0.437500 +v -0.375000 -0.249000 0.437500 +v -0.500000 -0.249000 0.375000 +v -0.437500 -0.249000 0.375000 +v -0.375000 -0.249000 0.375000 +v 0.500000 -0.249000 0.375000 +v -0.437500 -0.249000 0.062500 +v 0.125000 -0.249000 -0.437500 +v 0.312500 -0.249000 -0.437500 +v -0.375000 -0.249000 -0.500000 +v -0.062500 -0.249000 -0.500000 +v 0.375000 -0.249000 -0.500000 +v 0.500000 -0.249000 -0.500000 +v -0.437500 -0.124000 0.062500 +v -0.437500 -0.124000 -0.125000 +v 0.437500 -0.124000 -0.125000 +v 0.500000 -0.124000 -0.125000 +v 0.500000 -0.061500 -0.062500 +v -0.062500 -0.061500 -0.500000 +v -0.312500 0.001000 -0.375000 +v -0.375000 0.063500 0.375000 +v -0.375000 0.001000 -0.312500 +v 0.312500 0.001000 -0.312500 +v 0.375000 0.001000 -0.375000 +v -0.375000 0.001000 -0.437500 +v 0.375000 0.001000 -0.437500 +v -0.500000 0.063500 -0.500000 +v 0.375000 0.063500 -0.500000 +v 0.500000 0.063500 -0.500000 +v 0.375000 0.063500 0.312500 +v 0.312500 0.063500 -0.437500 +v 0.312500 0.188500 0.312500 +v -0.437500 0.188500 -0.437500 +v -0.312500 0.188500 -0.437500 +v 0.312500 0.188500 -0.437500 +v -0.250000 0.188500 0.250000 +v -0.375000 0.251000 -0.375000 +v -0.312500 0.188500 -0.375000 +v -0.312500 -0.499000 -0.312500 +v 0.312500 -0.499000 -0.312500 +v -0.312500 -0.436500 -0.312500 +v 0.312500 -0.436500 -0.312500 +v 0.375000 -0.374000 0.375000 +v -0.312500 -0.374000 -0.437500 +v 0.375000 -0.374000 -0.375000 +v -0.062500 -0.311500 0.437500 +v -0.500000 -0.311500 0.062500 +v -0.437500 -0.311500 0.062500 +v -0.500000 -0.311500 -0.062500 +v -0.437500 -0.311500 -0.062500 +v 0.500000 -0.311500 -0.062500 +v -0.500000 -0.249000 0.500000 +v -0.375000 -0.249000 0.500000 +v 0.375000 -0.249000 0.437500 +v -0.437500 -0.249000 0.312500 +v 0.437500 -0.249000 0.125000 +v 0.500000 -0.249000 0.062500 +v 0.437500 -0.249000 0.062500 +v 0.500000 -0.249000 -0.062500 +v -0.437500 -0.249000 -0.125000 +v -0.125000 -0.249000 -0.437500 +v -0.500000 -0.249000 -0.500000 +v -0.125000 -0.249000 -0.500000 +v -0.062500 -0.124000 0.500000 +v 0.062500 -0.124000 0.500000 +v -0.500000 -0.124000 -0.062500 +v 0.437500 -0.124000 -0.062500 +v 0.500000 -0.124000 -0.062500 +v -0.437500 -0.061500 0.437500 +v -0.375000 -0.061500 0.437500 +v -0.375000 -0.061500 -0.437500 +v 0.375000 -0.061500 -0.375000 +v 0.312500 0.001000 0.375000 +v 0.375000 0.001000 0.437500 +v 0.437500 0.001000 -0.375000 +v -0.375000 0.001000 -0.375000 +v 0.312500 0.001000 -0.375000 +v -0.437500 0.063500 0.437500 +v 0.312500 0.063500 -0.312500 +v 0.375000 0.063500 -0.375000 +v -0.437500 0.063500 -0.375000 +v -0.437500 0.063500 -0.437500 +v 0.437500 0.063500 -0.375000 +v -0.375000 0.188500 0.312500 +v 0.250000 0.188500 0.250000 +v 0.375000 0.188500 0.250000 +v 0.250000 0.188500 -0.250000 +v 0.312500 0.188500 -0.312500 +v 0.375000 0.188500 -0.250000 +v -0.375000 -0.374000 0.375000 +v -0.312500 -0.374000 0.312500 +v -0.375000 -0.374000 -0.312500 +v -0.375000 -0.374000 -0.375000 +v 0.312500 -0.374000 -0.312500 +v 0.312500 -0.374000 -0.375000 +v -0.062500 -0.249000 0.500000 +v 0.062500 -0.249000 0.500000 +v 0.437500 -0.249000 0.437500 +v -0.312500 -0.249000 0.375000 +v 0.437500 -0.249000 -0.062500 +v -0.375000 -0.249000 -0.312500 +v 0.312500 -0.249000 -0.312500 +v 0.062500 -0.124000 0.437500 +v -0.125000 -0.124000 -0.437500 +v -0.062500 -0.124000 -0.437500 +v -0.062500 -0.124000 -0.500000 +v -0.125000 -0.124000 -0.500000 +v 0.062500 -0.124000 -0.437500 +v 0.125000 -0.124000 -0.437500 +v 0.062500 -0.124000 -0.500000 +v -0.062500 -0.061500 0.437500 +v 0.062500 -0.061500 0.437500 +v -0.437500 -0.061500 0.062500 +v 0.437500 -0.061500 0.062500 +v 0.500000 -0.061500 0.062500 +v -0.437500 -0.061500 -0.062500 +v -0.500000 -0.061500 -0.062500 +v 0.437500 -0.061500 -0.062500 +v -0.062500 -0.061500 -0.437500 +v 0.062500 -0.061500 -0.437500 +v 0.062500 -0.061500 -0.500000 +v -0.375000 0.001000 0.375000 +v 0.437500 0.001000 0.437500 +v 0.312500 0.001000 0.312500 +v -0.312500 0.001000 -0.312500 +v -0.437500 0.001000 -0.437500 +v -0.375000 0.063500 0.500000 +v -0.375000 0.063500 0.437500 +v 0.500000 0.063500 0.500000 +v 0.437500 0.063500 0.437500 +v -0.437500 0.063500 0.375000 +v -0.500000 0.063500 0.375000 +v 0.500000 0.063500 0.375000 +v 0.312500 0.063500 0.375000 +v 0.437500 0.063500 0.312500 +v 0.375000 0.063500 -0.312500 +v 0.437500 0.063500 -0.437500 +v 0.375000 0.188500 0.375000 +v 0.437500 0.188500 0.437500 +v -0.375000 0.188500 0.375000 +v -0.375000 0.188500 -0.375000 +v 0.312500 0.188500 -0.375000 +v 0.375000 0.188500 -0.375000 +v 0.437500 0.188500 -0.437500 +v -0.375000 0.251000 0.375000 +v 0.375000 0.251000 0.375000 +v -0.375000 0.251000 0.250000 +v -0.250000 0.251000 0.250000 +v 0.250000 0.251000 0.250000 +v 0.375000 0.251000 0.250000 +v -0.375000 0.251000 -0.250000 +v -0.250000 0.251000 -0.250000 +v 0.375000 0.251000 -0.250000 +v -0.310485 0.001000 0.310485 +v 0.310485 0.001000 -0.310485 +v -0.310485 0.879183 0.310485 +v 0.310485 0.879183 -0.310485 +v 0.310485 0.001000 0.310485 +v -0.310485 0.001000 -0.310485 +v 0.310485 0.879183 0.310485 +v -0.310485 0.879183 -0.310485 +vt 0.958333 0.333333 +vt 0.958333 0.375000 +vt 0.979167 0.375000 +vt 0.979167 0.333333 +vt 0.833333 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.520833 +vt 0.833333 0.520833 +vt 0.708333 0.687500 +vt 0.750000 0.687500 +vt 0.750000 0.708333 +vt 0.708333 0.708333 +vt 0.854167 0.750000 +vt 0.854167 0.770833 +vt 0.875000 0.770833 +vt 0.875000 0.750000 +vt 0.270833 0.625000 +vt 0.291667 0.625000 +vt 0.291667 0.645833 +vt 0.270833 0.645833 +vt 0.333333 0.937500 +vt 0.333333 0.958333 +vt 0.291667 0.958333 +vt 0.291667 0.937500 +vt 0.729167 0.958333 +vt 0.687500 0.958333 +vt 0.687500 0.937500 +vt 0.708333 0.937500 +vt 0.729167 0.937500 +vt 0.375000 0.937500 +vt 0.416667 0.937500 +vt 0.416667 0.958333 +vt 0.375000 0.958333 +vt 0.104167 0.979167 +vt 0.083333 0.979167 +vt 0.083333 0.937500 +vt 0.104167 0.937500 +vt 0.250000 0.604167 +vt 0.041667 0.604167 +vt 0.020833 0.604167 +vt 0.020833 0.625000 +vt 0.270833 0.625000 +vt 0.270833 0.604167 +vt 0.916666 0.687500 +vt 0.937500 0.687500 +vt 0.937500 0.708333 +vt 0.916666 0.708333 +vt 0.312500 0.833333 +vt 0.333333 0.833333 +vt 0.333333 0.854167 +vt 0.312500 0.854167 +vt 0.979167 0.208333 +vt 0.958333 0.208333 +vt 0.958333 0.166667 +vt 0.979167 0.166667 +vt 0.041667 0.937500 +vt 0.041667 0.958333 +vt 0.020833 0.958333 +vt 0.020833 0.979166 +vt 0.000000 0.979166 +vt 0.000000 0.937500 +vt 0.937500 0.208333 +vt 0.958333 0.208333 +vt 0.958333 0.229167 +vt 0.937500 0.229167 +vt 0.979167 0.041667 +vt 0.958333 0.041667 +vt 0.958333 0.000000 +vt 0.979167 0.000000 +vt 0.020833 0.354167 +vt 0.041667 0.354167 +vt 0.041667 0.375000 +vt 0.020833 0.375000 +vt 0.437500 0.937500 +vt 0.416667 0.937500 +vt 0.416667 0.958333 +vt 0.458333 0.958333 +vt 0.458333 0.937500 +vt 0.916666 0.625000 +vt 0.937500 0.625000 +vt 0.937500 0.645833 +vt 0.916666 0.645833 +vt 0.875000 0.395833 +vt 0.875000 0.500000 +vt 0.854167 0.500000 +vt 0.854167 0.479167 +vt 0.833333 0.479167 +vt 0.833333 0.458333 +vt 0.854167 0.458333 +vt 0.854167 0.395833 +vt 0.958333 0.125000 +vt 0.958333 0.166667 +vt 0.979167 0.166667 +vt 0.979167 0.125000 +vt 0.937500 0.812500 +vt 0.916667 0.812500 +vt 0.916667 0.770833 +vt 0.937500 0.770833 +vt 0.583333 0.708333 +vt 0.604167 0.708333 +vt 0.604167 0.645833 +vt 0.583333 0.645833 +vt 0.250000 0.583333 +vt 0.270833 0.583333 +vt 0.854167 0.145833 +vt 0.854167 0.208333 +vt 0.833333 0.208333 +vt 0.833333 0.145833 +vt 0.583333 0.458333 +vt 0.562500 0.458333 +vt 0.562500 0.395833 +vt 0.541667 0.395833 +vt 0.541667 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.479167 +vt 0.583333 0.479167 +vt 0.875000 0.750000 +vt 0.916667 0.750000 +vt 0.916667 0.854167 +vt 0.875000 0.854167 +vt 0.000000 0.333333 +vt 0.020833 0.333333 +vt 0.000000 0.354167 +vt 0.062500 0.979167 +vt 0.083333 0.979167 +vt 0.083333 0.937500 +vt 0.062500 0.937500 +vt 0.333333 0.729167 +vt 0.354167 0.729167 +vt 0.354167 0.750000 +vt 0.333333 0.750000 +vt 0.250000 0.833333 +vt 0.250000 0.854167 +vt 0.270833 0.854167 +vt 0.270833 0.833333 +vt 0.583333 0.812500 +vt 0.604167 0.812500 +vt 0.604167 0.833333 +vt 0.583333 0.833333 +vt 0.500000 0.895833 +vt 0.541667 0.895833 +vt 0.541667 0.937500 +vt 0.500000 0.937500 +vt 0.041667 0.979166 +vt 0.312500 0.645833 +vt 0.312500 0.708333 +vt 0.333333 0.708333 +vt 0.333333 0.645833 +vt 0.291667 0.291667 +vt 0.291667 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.291667 +vt 0.562500 0.895833 +vt 0.562500 0.937500 +vt 0.541667 0.937500 +vt 0.541667 0.895833 +vt 0.041667 0.041667 +vt 0.041667 0.020833 +vt 0.145833 0.020833 +vt 0.145833 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.020833 +vt 0.291667 0.020833 +vt 0.291667 0.041667 +vt 0.562500 0.791667 +vt 0.562500 0.833333 +vt 0.583333 0.833333 +vt 0.583333 0.791667 +vt 0.916667 0.958333 +vt 0.916667 0.916667 +vt 0.958333 0.916667 +vt 0.958333 0.937500 +vt 0.937500 0.937500 +vt 0.937500 0.958333 +vt 0.708333 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.333333 +vt 0.708333 0.333333 +vt 0.000000 0.604167 +vt 0.020833 0.583333 +vt 0.250000 0.354167 +vt 0.270833 0.354167 +vt 0.270833 0.375000 +vt 0.250000 0.375000 +vt 0.583333 0.583333 +vt 0.583333 0.604167 +vt 0.562500 0.604167 +vt 0.562500 0.645833 +vt 0.354167 0.645833 +vt 0.354167 0.604167 +vt 0.333333 0.604167 +vt 0.333333 0.583333 +vt 0.916667 0.916667 +vt 0.916667 0.875000 +vt 0.875000 0.875000 +vt 0.875000 0.916667 +vt 0.583333 0.479167 +vt 0.604167 0.479167 +vt 0.604167 0.500000 +vt 0.583333 0.500000 +vt 0.583333 0.750000 +vt 0.583333 0.770833 +vt 0.604167 0.770833 +vt 0.604167 0.750000 +vt 0.541667 0.833333 +vt 0.562500 0.833333 +vt 0.562500 0.791667 +vt 0.541667 0.791667 +vt 0.875000 0.500000 +vt 0.875000 0.395833 +vt 0.854167 0.395833 +vt 0.854167 0.458333 +vt 0.854167 0.479167 +vt 0.854167 0.500000 +vt 0.270833 0.833333 +vt 0.270833 0.854167 +vt 0.583333 0.354167 +vt 0.583333 0.395833 +vt 0.833333 0.395833 +vt 0.833333 0.354167 +vt 0.812500 0.354167 +vt 0.812500 0.395833 +vt 0.604167 0.395833 +vt 0.604167 0.354167 +vt 0.833333 0.583333 +vt 0.875000 0.583333 +vt 0.875000 0.562500 +vt 0.833333 0.562500 +vt 0.291667 0.937500 +vt 0.291667 0.895833 +vt 0.250000 0.895833 +vt 0.250000 0.916667 +vt 0.270833 0.916667 +vt 0.270833 0.937500 +vt 0.541667 0.833333 +vt 0.541667 0.854167 +vt 0.562500 0.854167 +vt 0.562500 0.833333 +vt 0.562500 0.604167 +vt 0.583333 0.604167 +vt 0.583333 0.583333 +vt 0.354167 0.604167 +vt 0.354167 0.645833 +vt 0.562500 0.645833 +vt 0.937500 0.270833 +vt 0.958333 0.270833 +vt 0.083333 0.937500 +vt 0.104167 0.937500 +vt 0.104167 0.916667 +vt 0.125000 0.916667 +vt 0.125000 0.895833 +vt 0.083333 0.895833 +vt 0.791667 0.520833 +vt 0.791667 0.500000 +vt 0.583333 0.500000 +vt 0.583333 0.520833 +vt 0.458333 0.312500 +vt 0.479167 0.312500 +vt 0.479167 0.333333 +vt 0.458333 0.333333 +vt 0.895833 0.416667 +vt 0.875000 0.416667 +vt 0.875000 0.208333 +vt 0.895833 0.208333 +vt 0.375000 0.020833 +vt 0.375000 0.000000 +vt 0.583333 0.000000 +vt 0.583333 0.020833 +vt 0.583333 0.041667 +vt 0.375000 0.041667 +vt 0.291667 0.854167 +vt 0.250000 0.895833 +vt 0.270833 0.895833 +vt 0.291667 0.895833 +vt 0.562500 0.395833 +vt 0.562500 0.458333 +vt 0.583333 0.458333 +vt 0.583333 0.395833 +vt 0.020833 0.291667 +vt 0.020833 0.312500 +vt 0.041667 0.312500 +vt 0.041667 0.291667 +vt 0.937500 0.291667 +vt 0.937500 0.333333 +vt 0.916666 0.333333 +vt 0.916666 0.291667 +vt 0.854167 0.750000 +vt 0.854167 0.770833 +vt 0.729167 0.958333 +vt 0.729167 0.937500 +vt 0.708333 0.937500 +vt 0.541667 0.833333 +vt 0.562500 0.833333 +vt 0.562500 0.854167 +vt 0.541667 0.854167 +vt 0.583333 0.333333 +vt 0.833333 0.333333 +vt 0.312500 0.729167 +vt 0.312500 0.750000 +vt 0.166667 0.937500 +vt 0.166667 0.895833 +vt 0.208333 0.895833 +vt 0.208333 0.937500 +vt 0.958333 0.750000 +vt 0.958333 0.708333 +vt 0.937500 0.708333 +vt 0.937500 0.729167 +vt 0.916666 0.729167 +vt 0.916666 0.750000 +vt 0.604167 0.479167 +vt 0.812500 0.479167 +vt 0.875000 0.854167 +vt 0.916667 0.854167 +vt 0.833333 0.500000 +vt 0.958333 0.250000 +vt 0.979167 0.250000 +vt 0.979167 0.208333 +vt 0.958333 0.208333 +vt 0.354167 0.250000 +vt 0.354167 0.270833 +vt 0.375000 0.270833 +vt 0.375000 0.250000 +vt 0.750000 0.312500 +vt 0.645833 0.312500 +vt 0.645833 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.208333 +vt 0.666667 0.208333 +vt 0.666667 0.250000 +vt 0.729167 0.250000 +vt 0.729167 0.291667 +vt 0.750000 0.291667 +vt 0.000000 0.625000 +vt 0.208333 0.625000 +vt 0.208333 0.833333 +vt 0.000000 0.833333 +vt 0.020833 0.020833 +vt 0.020833 0.041667 +vt 0.041667 0.583333 +vt 0.333333 0.291667 +vt 0.354167 0.291667 +vt 0.354167 0.312500 +vt 0.333333 0.312500 +vt 0.375000 0.895833 +vt 0.375000 0.916667 +vt 0.395833 0.916667 +vt 0.395833 0.937500 +vt 0.416667 0.937500 +vt 0.416667 0.895833 +vt 0.583333 0.333333 +vt 0.583333 0.312500 +vt 0.604167 0.312500 +vt 0.604167 0.291667 +vt 0.625000 0.291667 +vt 0.625000 0.333333 +vt 0.562500 0.583333 +vt 0.541667 0.583333 +vt 0.541667 0.541667 +vt 0.562500 0.541667 +vt 0.916666 0.416667 +vt 0.916666 0.520833 +vt 0.875000 0.520833 +vt 0.875000 0.416667 +vt 0.270833 0.687500 +vt 0.291667 0.687500 +vt 0.291667 0.708333 +vt 0.270833 0.708333 +vt 0.854167 0.812500 +vt 0.854167 0.833333 +vt 0.875000 0.833333 +vt 0.875000 0.812500 +vt 0.583333 0.750000 +vt 0.604167 0.750000 +vt 0.604167 0.770833 +vt 0.583333 0.770833 +vt 0.541667 0.312500 +vt 0.541667 0.333333 +vt 0.562500 0.333333 +vt 0.562500 0.312500 +vt 0.812500 0.583333 +vt 0.833333 0.583333 +vt 0.833333 0.541667 +vt 0.812500 0.541667 +vt 0.583333 0.291667 +vt 0.583333 0.583333 +vt 0.583333 0.541667 +vt 0.791667 0.541667 +vt 0.791667 0.583333 +vt 0.604167 0.395833 +vt 0.812500 0.395833 +vt 0.812500 0.354167 +vt 0.583333 0.354167 +vt 0.604167 0.354167 +vt 0.750000 0.312500 +vt 0.791667 0.312500 +vt 0.791667 0.333333 +vt 0.750000 0.333333 +vt 0.541667 0.770833 +vt 0.541667 0.750000 +vt 0.333333 0.750000 +vt 0.333333 0.770833 +vt 0.333333 0.312500 +vt 0.354167 0.312500 +vt 0.354167 0.333333 +vt 0.333333 0.333333 +vt 0.645833 0.687500 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.645833 0.625000 +vt 0.291667 0.958333 +vt 0.250000 0.958333 +vt 0.250000 0.937500 +vt 0.270833 0.937500 +vt 0.291667 0.937500 +vt 0.208333 0.937500 +vt 0.208333 0.958333 +vt 0.166667 0.958333 +vt 0.166667 0.937500 +vt 0.958333 0.812500 +vt 0.937500 0.812500 +vt 0.937500 0.770833 +vt 0.958333 0.770833 +vt 0.583333 0.541667 +vt 0.583333 0.583333 +vt 0.583333 0.520833 +vt 0.541667 0.395833 +vt 0.562500 0.479167 +vt 0.562500 0.500000 +vt 0.541667 0.500000 +vt 0.666667 0.333333 +vt 0.708333 0.333333 +vt 0.708333 0.312500 +vt 0.666667 0.312500 +vt 0.916666 0.708333 +vt 0.958333 0.645833 +vt 0.958333 0.687500 +vt 0.937500 0.687500 +vt 0.937500 0.645833 +vt 0.500000 0.958333 +vt 0.541667 0.958333 +vt 0.541667 0.937500 +vt 0.500000 0.937500 +vt 0.750000 0.687500 +vt 0.750000 0.666667 +vt 0.729167 0.666667 +vt 0.729167 0.625000 +vt 0.666667 0.625000 +vt 0.666667 0.583333 +vt 0.625000 0.583333 +vt 0.937500 0.708333 +vt 0.958333 0.708333 +vt 0.583333 0.791667 +vt 0.583333 0.833333 +vt 0.833333 0.875000 +vt 0.854167 0.875000 +vt 0.854167 0.895833 +vt 0.833333 0.895833 +vt 0.291667 0.854167 +vt 0.291667 0.895833 +vt 0.312500 0.895833 +vt 0.333333 0.895833 +vt 0.041667 0.854167 +vt 0.041667 0.833333 +vt 0.312500 0.729167 +vt 0.312500 0.750000 +vt 0.166667 0.979167 +vt 0.145833 0.979167 +vt 0.145833 0.937500 +vt 0.166667 0.937500 +vt 0.854167 0.812500 +vt 0.875000 0.812500 +vt 0.875000 0.833333 +vt 0.854167 0.833333 +vt 0.104167 0.937500 +vt 0.104167 0.979167 +vt 0.125000 0.979167 +vt 0.125000 0.937500 +vt 0.833333 0.895833 +vt 0.833333 0.937500 +vt 0.791667 0.937500 +vt 0.791667 0.895833 +vt 0.937500 0.625000 +vt 0.958333 0.625000 +vt 0.916667 0.833333 +vt 0.937500 0.833333 +vt 0.937500 0.854167 +vt 0.916667 0.854167 +vt 0.625000 0.333333 +vt 0.666667 0.333333 +vt 0.666667 0.312500 +vt 0.625000 0.312500 +vt 0.395833 0.291667 +vt 0.416667 0.291667 +vt 0.416667 0.312500 +vt 0.395833 0.312500 +vt 0.604167 0.708333 +vt 0.583333 0.708333 +vt 0.583333 0.645833 +vt 0.604167 0.645833 +vt 0.416667 0.895833 +vt 0.458333 0.895833 +vt 0.458333 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.916667 +vt 0.416667 0.916667 +vt 0.666667 0.916667 +vt 0.708333 0.916667 +vt 0.708333 0.937500 +vt 0.666667 0.937500 +vt 0.312500 0.833333 +vt 0.333333 0.833333 +vt 0.333333 0.791667 +vt 0.312500 0.791667 +vt 0.312500 0.895833 +vt 0.291667 0.895833 +vt 0.291667 0.854167 +vt 0.312500 0.854167 +vt 0.375000 0.291667 +vt 0.583333 0.250000 +vt 0.583333 0.270833 +vt 0.583333 0.291667 +vt 0.458333 0.333333 +vt 0.458333 0.312500 +vt 0.437500 0.312500 +vt 0.437500 0.291667 +vt 0.416667 0.291667 +vt 0.416667 0.333333 +vt 0.250000 0.937500 +vt 0.208333 0.937500 +vt 0.208333 0.895833 +vt 0.250000 0.895833 +vt 0.937500 0.895833 +vt 0.958333 0.895833 +vt 0.958333 0.916667 +vt 0.937500 0.916667 +vt 0.583333 0.875000 +vt 0.791667 0.875000 +vt 0.791667 0.895833 +vt 0.583333 0.895833 +vt 0.937500 0.104167 +vt 0.958333 0.104167 +vt 0.958333 0.041667 +vt 0.937500 0.041667 +vt 0.291667 0.729167 +vt 0.291667 0.770833 +vt 0.270833 0.770833 +vt 0.270833 0.729167 +vt 0.875000 0.520833 +vt 0.875000 0.625000 +vt 0.916666 0.625000 +vt 0.916666 0.520833 +vt 0.687500 0.958333 +vt 0.687500 0.937500 +vt 0.645833 0.937500 +vt 0.645833 0.958333 +vt 0.583333 0.729167 +vt 0.583333 0.750000 +vt 0.604167 0.750000 +vt 0.604167 0.729167 +vt 0.958333 0.375000 +vt 0.958333 0.416667 +vt 0.937500 0.416667 +vt 0.937500 0.375000 +vt 0.854167 0.937500 +vt 0.875000 0.937500 +vt 0.875000 0.958333 +vt 0.854167 0.958333 +vt 0.583333 0.500000 +vt 0.604167 0.500000 +vt 0.270833 0.833333 +vt 0.250000 0.833333 +vt 0.250000 0.625000 +vt 0.270833 0.625000 +vt 0.312500 0.041667 +vt 0.312500 0.145833 +vt 0.333333 0.145833 +vt 0.333333 0.187500 +vt 0.312500 0.187500 +vt 0.937500 0.354167 +vt 0.958333 0.354167 +vt 0.958333 0.312500 +vt 0.937500 0.312500 +vt 0.541667 0.750000 +vt 0.541667 0.770833 +vt 0.291667 0.604167 +vt 0.291667 0.625000 +vt 0.604167 0.958333 +vt 0.604167 0.937500 +vt 0.583333 0.937500 +vt 0.562500 0.937500 +vt 0.562500 0.958333 +vt 0.875000 0.625000 +vt 0.875000 0.687500 +vt 0.854167 0.687500 +vt 0.854167 0.625000 +vt 0.020833 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.145833 +vt 0.020833 0.145833 +vt 0.833333 0.333333 +vt 0.875000 0.333333 +vt 0.875000 0.312500 +vt 0.833333 0.312500 +vt 0.958333 0.041667 +vt 0.958333 0.083333 +vt 0.979167 0.083333 +vt 0.979167 0.041667 +vt 0.687500 0.687500 +vt 0.687500 0.708333 +vt 0.625000 0.708333 +vt 0.625000 0.729167 +vt 0.833333 0.729167 +vt 0.833333 0.708333 +vt 0.770833 0.708333 +vt 0.770833 0.687500 +vt 0.354167 0.750000 +vt 0.354167 0.729167 +vt 0.500000 0.291667 +vt 0.520833 0.291667 +vt 0.520833 0.312500 +vt 0.541667 0.312500 +vt 0.541667 0.333333 +vt 0.500000 0.333333 +vt 0.625000 0.312500 +vt 0.645833 0.687500 +vt 0.645833 0.625000 +vt 0.541667 0.833333 +vt 0.541667 0.791667 +vt 0.500000 0.958333 +vt 0.458333 0.958333 +vt 0.458333 0.937500 +vt 0.479167 0.937500 +vt 0.500000 0.937500 +vt 0.270833 0.791667 +vt 0.291667 0.791667 +vt 0.625000 0.250000 +vt 0.604167 0.250000 +vt 0.604167 0.041667 +vt 0.625000 0.041667 +vt 0.750000 0.687500 +vt 0.666667 0.583333 +vt 0.666667 0.625000 +vt 0.729167 0.625000 +vt 0.729167 0.666667 +vt 0.750000 0.666667 +vt 0.041667 0.937500 +vt 0.041667 0.979167 +vt 0.062500 0.979167 +vt 0.062500 0.937500 +vt 0.583333 0.729167 +vt 0.562500 0.729167 +vt 0.916667 0.916667 +vt 0.875000 0.916667 +vt 0.875000 0.958333 +vt 0.895833 0.958333 +vt 0.895833 0.937500 +vt 0.916667 0.937500 +vt 0.916666 0.520833 +vt 0.958333 0.520833 +vt 0.958333 0.416667 +vt 0.916666 0.416667 +vt 0.937500 0.270833 +vt 0.916666 0.270833 +vt 0.916666 0.208333 +vt 0.916666 0.416667 +vt 0.916666 0.354167 +vt 0.937500 0.354167 +vt 0.354167 0.020833 +vt 0.354167 0.041667 +vt 0.312500 0.708333 +vt 0.312500 0.645833 +vt 0.291667 0.645833 +vt 0.291667 0.750000 +vt 0.270833 0.791667 +vt 0.270833 0.833333 +vt 0.291667 0.833333 +vt 0.291667 0.791667 +vt 0.875000 0.875000 +vt 0.833333 0.916667 +vt 0.875000 0.916667 +vt 0.958333 0.375000 +vt 0.937500 0.375000 +vt 0.583333 0.333333 +vt 0.583333 0.500000 +vt 0.875000 0.708333 +vt 0.875000 0.750000 +vt 0.833333 0.750000 +vt 0.833333 0.708333 +vt 0.312500 0.020833 +vt 0.916667 0.750000 +vt 0.937500 0.750000 +vt 0.979167 0.125000 +vt 0.958333 0.125000 +vt 0.958333 0.083333 +vt 0.979167 0.083333 +vt 0.833333 0.833333 +vt 0.833333 0.875000 +vt 0.875000 0.875000 +vt 0.583333 0.875000 +vt 0.625000 0.875000 +vt 0.625000 0.833333 +vt 0.812500 0.479167 +vt 0.812500 0.500000 +vt 0.020833 0.895833 +vt 0.041667 0.895833 +vt 0.020833 0.854167 +vt 0.000000 0.854167 +vt 0.000000 0.895833 +vt 0.020833 0.895833 +vt 0.000000 0.895833 +vt 0.000000 0.854167 +vt 0.020833 0.854167 +vt 0.041667 0.854167 +vt 0.041667 0.895833 +vt 0.270833 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.958333 +vt 0.416667 0.958333 +vt 0.416667 0.937500 +vt 0.541667 0.291667 +vt 0.291667 0.833333 +vt 0.291667 0.791667 +vt 0.604167 0.937500 +vt 0.645833 0.937500 +vt 0.645833 0.958333 +vt 0.604167 0.958333 +vt 0.937500 0.750000 +vt 0.958333 0.750000 +vt 0.833333 0.750000 +vt 0.625000 0.750000 +vt 0.916667 0.958333 +vt 0.395833 0.312500 +vt 0.416667 0.312500 +vt 0.416667 0.333333 +vt 0.395833 0.333333 +vt 0.604167 0.729167 +vt 0.604167 0.750000 +vt 0.583333 0.750000 +vt 0.250000 0.958333 +vt 0.208333 0.958333 +vt 0.208333 0.937500 +vt 0.229167 0.937500 +vt 0.250000 0.937500 +vt 0.916666 0.520833 +vt 0.916666 0.416667 +vt 0.604167 0.270833 +vt 0.958333 0.208333 +vt 0.958333 0.187500 +vt 0.937500 0.187500 +vt 0.937500 0.145833 +vt 0.875000 0.145833 +vt 0.875000 0.104167 +vt 0.833333 0.104167 +vt 0.541667 0.583333 +vt 0.541667 0.333333 +vt 0.520833 0.354167 +vt 0.520833 0.562500 +vt 0.625000 0.750000 +vt 0.625000 0.645833 +vt 0.458333 0.291667 +vt 0.500000 0.333333 +vt 0.500000 0.291667 +vt 0.562500 0.750000 +vt 0.583333 0.854167 +vt 0.583333 0.895833 +vt 0.562500 0.895833 +vt 0.541667 0.895833 +vt 0.833333 0.958333 +vt 0.875000 0.916667 +vt 0.833333 0.916667 +vt 0.750000 0.687500 +vt 0.750000 0.666667 +vt 0.770833 0.666667 +vt 0.770833 0.625000 +vt 0.833333 0.625000 +vt 0.833333 0.583333 +vt 0.875000 0.583333 +vt 0.854167 0.625000 +vt 0.854167 0.687500 +vt 0.000000 0.937500 +vt 0.000000 0.895833 +vt 0.041667 0.895833 +vt 0.041667 0.937500 +vt 0.625000 0.645833 +vt 0.625000 0.750000 +vt 0.291667 0.791667 +vt 0.291667 0.833333 +vt 0.312500 0.833333 +vt 0.312500 0.791667 +vt 0.229167 0.708333 +vt 0.229167 0.750000 +vt 0.208333 0.750000 +vt 0.208333 0.708333 +vt 0.333333 0.041667 +vt 0.333333 0.250000 +vt 0.937500 0.833333 +vt 0.958333 0.833333 +vt 0.958333 0.854167 +vt 0.937500 0.854167 +vt 0.604167 0.020833 +vt 0.916667 0.833333 +vt 0.937500 0.833333 +vt 0.875000 0.687500 +vt 0.833333 0.687500 +vt 0.541667 0.583333 +vt 0.562500 0.583333 +vt 0.562500 0.541667 +vt 0.541667 0.541667 +vt 0.333333 0.958333 +vt 0.375000 0.958333 +vt 0.375000 0.937500 +vt 0.333333 0.937500 +vt 0.916666 0.729167 +vt 0.875000 0.729167 +vt 0.875000 0.625000 +vt 0.916666 0.625000 +vt 0.750000 0.312500 +vt 0.854167 0.312500 +vt 0.854167 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.208333 +vt 0.833333 0.208333 +vt 0.833333 0.250000 +vt 0.770833 0.250000 +vt 0.770833 0.291667 +vt 0.750000 0.291667 +vt 0.020833 0.833333 +vt 0.041667 0.833333 +vt 0.312500 0.562500 +vt 0.312500 0.354167 +vt 0.916667 0.000000 +vt 0.958333 0.000000 +vt 0.833333 0.104167 +vt 0.833333 0.083333 +vt 0.854167 0.083333 +vt 0.854167 0.041667 +vt 0.916667 0.041667 +vt 0.833333 0.208333 +vt 0.833333 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.208333 +vt 0.583333 0.812500 +vt 0.875000 0.812500 +vt 0.833333 0.812500 +vt 0.833333 0.770833 +vt 0.625000 0.770833 +vt 0.625000 0.812500 +vt 0.916667 0.895833 +vt 0.937500 0.895833 +vt 0.000000 0.625000 +vt 0.270833 0.333333 +vt 0.291667 0.333333 +vt 0.291667 0.354167 +vt 0.937500 0.291667 +vt 0.958333 0.291667 +vt 0.958333 0.520833 +vt 0.916666 0.520833 +vt 0.916666 0.625000 +vt 0.958333 0.625000 +vt 0.937500 0.833333 +vt 0.958333 0.833333 +vt 0.770833 0.958333 +vt 0.770833 0.937500 +vt 0.562500 0.729167 +vt 0.562500 0.750000 +vt 0.312500 0.833333 +vt 0.291667 0.750000 +vt 0.291667 0.645833 +vt 0.875000 0.729167 +vt 0.916666 0.729167 +vt 0.916666 0.750000 +vt 0.875000 0.750000 +vt 0.916666 0.625000 +vt 0.916666 0.520833 +vt 0.833333 0.875000 +vt 0.833333 0.833333 +vt 0.625000 0.833333 +vt 0.625000 0.875000 +vt 0.604167 0.833333 +vt 0.604167 0.812500 +vt 0.875000 0.875000 +vt 0.833333 0.583333 +vt 0.812500 0.583333 +vt 0.812500 0.541667 +vt 0.833333 0.541667 +vt 0.791667 0.333333 +vt 0.833333 0.333333 +vt 0.833333 0.312500 +vt 0.791667 0.312500 +vt 0.041667 0.937500 +vt 0.041667 0.916667 +vt 0.062500 0.916667 +vt 0.062500 0.895833 +vt 0.083333 0.895833 +vt 0.083333 0.937500 +vt 0.125000 0.895833 +vt 0.125000 0.937500 +vt 0.166667 0.937500 +vt 0.166667 0.916667 +vt 0.145833 0.916667 +vt 0.145833 0.895833 +vt 0.333333 0.937500 +vt 0.375000 0.937500 +vt 0.375000 0.916667 +vt 0.354167 0.916667 +vt 0.354167 0.895833 +vt 0.333333 0.895833 +vt 0.958333 0.291667 +vt 0.958333 0.333333 +vt 0.979167 0.333333 +vt 0.979167 0.291667 +vt 0.375000 0.895833 +vt 0.312500 0.916667 +vt 0.291667 0.916667 +vt 0.291667 0.937500 +vt 0.333333 0.937500 +vt 0.333333 0.895833 +vt 0.583333 0.333333 +vt 0.541667 0.291667 +vt 0.583333 0.291667 +vt 0.458333 0.895833 +vt 0.479167 0.895833 +vt 0.479167 0.916667 +vt 0.500000 0.916667 +vt 0.500000 0.937500 +vt 0.458333 0.937500 +vt 0.937500 0.916667 +vt 0.916667 0.916667 +vt 0.375000 0.937500 +vt 0.270833 0.708333 +vt 0.291667 0.708333 +vt 0.208333 0.770833 +vt 0.229167 0.770833 +vt 0.229167 0.833333 +vt 0.229167 0.625000 +vt 0.229167 0.687500 +vt 0.208333 0.687500 +vt 0.833333 0.562500 +vt 0.875000 0.562500 +vt 0.833333 0.875000 +vt 0.791667 0.875000 +vt 0.958333 0.291667 +vt 0.937500 0.291667 +vt 0.979167 0.291667 +vt 0.958333 0.291667 +vt 0.958333 0.250000 +vt 0.979167 0.250000 +vt 0.812500 0.500000 +vt 0.145833 0.333333 +vt 0.145833 0.312500 +vt 0.187500 0.312500 +vt 0.187500 0.333333 +vt 0.291667 0.333333 +vt 0.291667 0.583333 +vt 0.875000 0.312500 +vt 0.020833 0.833333 +vt 0.291667 0.895833 +vt 0.270833 0.895833 +vt 0.291667 0.854167 +vt 0.125000 0.937500 +vt 0.125000 0.979167 +vt 0.145833 0.979167 +vt 0.145833 0.937500 +vt 0.583333 0.812500 +vt 0.625000 0.812500 +vt 0.625000 0.770833 +vt 0.833333 0.770833 +vt 0.833333 0.812500 +vt 0.729167 0.937500 +vt 0.729167 0.916667 +vt 0.791667 0.916667 +vt 0.583333 0.916667 +vt 0.645833 0.916667 +vt 0.645833 0.937500 +vt 0.583333 0.854167 +vt 0.541667 0.895833 +vt 0.562500 0.895833 +vt 0.583333 0.895833 +vt 0.833333 0.583333 +vt 0.833333 0.625000 +vt 0.770833 0.625000 +vt 0.770833 0.666667 +vt 0.750000 0.666667 +vt 0.750000 0.687500 +vt 0.458333 0.291667 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +g forsaken_fire.vox_forsaken_fire.vox_forsaken_fire.vox_Material +usemtl forsaken_fire.vox_Material +s off +f 67/1/1 195/2/1 196/3/1 66/4/1 +f 114/5/2 115/6/2 19/7/2 70/8/2 +f 275/9/3 276/10/3 171/11/3 122/12/3 +f 254/13/4 262/14/4 316/15/4 37/16/4 +f 21/17/3 20/18/3 193/19/3 138/20/3 +f 98/21/5 99/22/5 331/23/5 163/24/5 +f 161/25/2 324/26/2 319/27/2 160/28/2 95/29/2 +f 266/30/2 268/31/2 332/32/2 164/33/2 +f 73/34/5 133/35/5 65/36/5 236/37/5 +f 256/38/6 199/39/6 255/40/6 204/41/6 205/42/6 203/43/6 +f 138/44/2 193/45/2 292/46/2 139/47/2 +f 30/48/2 34/49/2 33/50/2 151/51/2 +f 74/52/5 288/53/5 187/54/5 71/55/5 +f 306/56/3 307/57/3 257/58/3 310/59/3 311/60/3 147/61/3 +f 134/62/3 133/63/3 73/64/3 140/65/3 +f 20/66/2 21/67/2 15/68/2 123/69/2 +f 301/70/3 144/71/3 34/72/3 30/73/3 +f 159/74/4 46/75/4 330/76/4 216/77/4 320/78/4 +f 226/79/2 227/80/2 186/81/2 13/82/2 +f 69/83/2 84/84/2 262/85/2 254/86/2 203/87/2 251/88/2 27/89/2 126/90/2 +f 242/91/1 286/92/1 285/93/1 190/94/1 +f 132/95/5 243/96/5 275/97/5 122/98/5 +f 75/99/4 250/100/4 127/101/4 59/102/4 +f 202/103/3 79/104/3 203/43/3 256/38/3 +f 127/105/2 250/106/2 142/107/2 176/108/2 +f 29/109/4 28/110/4 233/111/4 118/112/4 31/113/4 81/114/4 253/115/4 145/116/4 +f 118/117/2 119/118/2 308/119/2 31/120/2 +f 80/121/3 77/122/3 301/70/3 32/123/3 +f 228/124/6 229/125/6 227/126/6 226/127/6 +f 301/128/5 30/129/5 151/130/5 200/131/5 +f 202/132/1 258/133/1 315/134/1 79/135/1 +f 80/136/5 32/137/5 310/138/5 257/139/5 +f 324/140/3 161/141/3 327/142/3 326/143/3 +f 257/58/6 310/59/6 200/144/6 307/57/6 +f 181/145/4 249/146/4 136/147/4 184/148/4 +f 251/149/6 76/150/6 143/151/6 27/152/6 +f 63/153/5 72/154/5 130/155/5 117/156/5 +f 136/157/3 249/158/3 290/159/3 23/160/3 135/161/3 291/162/3 28/163/3 29/164/3 +f 7/165/1 173/166/1 64/167/1 52/168/1 +f 41/169/3 157/170/3 90/171/3 160/172/3 319/173/3 263/174/3 +f 107/175/2 55/176/2 276/177/2 275/178/2 +f 32/123/6 146/179/6 255/40/6 201/180/6 30/73/6 301/70/6 +f 252/181/3 145/182/3 78/183/3 303/184/3 +f 102/185/2 222/186/2 103/187/2 172/188/2 278/189/2 51/190/2 269/191/2 101/192/2 +f 26/193/4 174/194/4 186/195/4 193/196/4 +f 255/197/2 199/198/2 88/199/2 152/200/2 +f 302/201/4 309/202/4 150/203/4 149/204/4 +f 111/205/4 62/206/4 167/207/4 104/208/4 +f 207/209/4 191/210/4 68/211/4 76/212/4 251/88/4 203/87/4 205/213/4 155/214/4 +f 202/132/5 256/215/5 153/216/5 258/133/5 +f 222/217/4 11/218/4 29/109/4 251/88/4 113/219/4 224/220/4 9/221/4 58/222/4 173/223/4 7/224/4 +f 198/225/1 300/226/1 289/227/1 285/228/1 +f 98/229/6 163/230/6 46/231/6 159/232/6 93/233/6 217/234/6 +f 304/235/4 87/236/4 88/237/4 199/238/4 +f 271/239/4 272/240/4 166/241/4 101/192/4 269/191/4 3/242/4 12/243/4 280/244/4 +f 140/65/6 246/245/6 247/246/6 73/64/6 +f 48/247/6 321/248/6 267/249/6 97/250/6 268/251/6 266/252/6 +f 221/253/1 219/254/1 218/255/1 220/256/1 +f 233/257/3 277/258/3 57/259/3 11/260/3 +f 58/261/3 281/262/3 109/263/3 173/264/3 +f 86/265/3 148/266/3 38/267/3 313/268/3 82/269/3 33/270/3 +f 113/219/1 251/88/1 27/89/1 126/90/1 +f 210/271/4 153/216/4 258/133/4 267/272/4 321/273/4 214/274/4 +f 18/275/1 141/276/1 75/277/1 59/278/1 +f 141/279/6 142/280/6 250/281/6 75/282/6 +f 236/283/3 238/284/3 279/285/3 237/286/3 +f 205/287/2 37/16/2 316/15/2 155/288/2 +f 324/26/4 326/289/4 45/290/4 263/291/4 319/27/4 +f 303/292/2 78/293/2 209/294/2 82/295/2 +f 102/296/5 168/297/5 224/220/5 9/221/5 58/222/5 173/223/5 7/224/5 222/217/5 +f 77/298/4 307/299/4 200/131/4 301/128/4 +f 328/300/3 162/301/3 325/302/3 329/303/3 +f 192/304/6 69/305/6 126/306/6 128/307/6 68/308/6 191/309/6 +f 78/310/5 145/116/5 29/109/5 251/88/5 203/87/5 79/311/5 +f 227/312/5 229/313/5 174/194/5 186/195/5 +f 203/87/5 205/213/5 155/214/5 259/314/5 +f 283/315/4 286/316/4 242/317/4 240/318/4 +f 156/319/6 152/320/6 88/321/6 87/322/6 +f 293/323/5 137/324/5 57/325/5 277/326/5 106/327/5 52/328/5 64/329/5 235/330/5 134/331/5 140/332/5 +f 34/333/3 303/334/3 202/335/3 304/336/3 +f 248/337/6 25/338/6 136/157/6 249/158/6 +f 201/180/3 304/339/3 199/39/3 255/40/3 +f 129/340/3 243/341/3 132/342/3 131/343/3 +f 5/344/6 103/345/6 222/346/6 7/347/6 52/348/6 106/349/6 +f 207/350/3 155/351/3 316/352/3 262/353/3 84/354/3 208/355/3 +f 280/356/2 17/357/2 8/358/2 271/359/2 +f 232/360/2 306/361/2 147/362/2 231/363/2 +f 245/364/3 26/365/3 194/366/3 22/367/3 +f 253/368/1 81/369/1 309/370/1 302/371/1 +f 245/364/6 26/365/6 193/19/6 138/20/6 +f 305/372/2 204/373/2 154/374/2 261/375/2 +f 81/376/6 35/377/6 150/378/6 309/379/6 +f 60/380/4 188/381/4 170/382/4 274/383/4 +f 259/384/6 155/351/6 316/352/6 262/353/6 +f 111/385/2 104/386/2 220/256/2 221/253/2 273/387/2 281/388/2 +f 62/389/2 60/390/2 274/391/2 224/220/2 113/219/2 251/88/2 75/277/2 59/278/2 272/392/2 167/393/2 +f 110/394/5 230/395/5 238/396/5 236/397/5 +f 220/398/4 218/399/4 1/400/4 2/401/4 +f 29/109/5 28/110/5 233/111/5 11/218/5 +f 283/402/3 284/403/3 285/404/3 286/405/3 +f 25/406/5 248/407/5 180/408/5 183/409/5 +f 100/410/5 332/411/5 268/412/5 97/413/5 322/414/5 +f 247/415/5 197/416/5 294/417/5 73/418/5 +f 247/419/2 246/420/2 279/421/2 238/422/2 +f 165/423/4 109/424/4 281/388/4 273/387/4 221/253/4 50/425/4 +f 33/50/1 82/295/1 303/292/1 34/49/1 +f 125/426/2 18/275/2 141/276/2 75/277/2 255/197/2 146/427/2 260/428/2 36/429/2 +f 13/430/4 124/431/4 228/432/4 226/433/4 +f 113/434/3 126/306/3 128/307/3 68/308/3 +f 190/435/5 285/436/5 284/437/5 70/438/5 +f 60/380/5 281/388/5 273/387/5 274/383/5 +f 177/439/6 179/440/6 115/441/6 114/442/6 +f 292/443/4 193/444/4 20/445/4 123/446/4 234/447/4 6/448/4 4/449/4 180/408/4 183/409/4 25/406/4 +f 284/437/4 298/450/4 198/451/4 285/436/4 +f 223/452/5 61/453/5 62/206/5 167/207/5 +f 273/454/3 9/455/3 224/456/3 274/457/3 +f 151/51/1 39/458/1 41/459/1 263/460/1 91/461/1 33/50/1 +f 82/462/4 258/133/4 202/132/4 303/463/4 +f 32/464/2 301/128/2 200/131/2 310/465/2 +f 130/466/2 244/467/2 276/468/2 117/469/2 +f 146/470/5 305/471/5 261/472/5 260/473/5 +f 15/474/4 21/475/4 138/476/4 13/477/4 +f 171/478/2 282/479/2 132/480/2 122/481/2 +f 114/482/4 70/438/4 190/435/4 177/483/4 +f 55/484/5 56/485/5 171/486/5 276/487/5 +f 225/488/6 56/489/6 55/490/6 107/491/6 +f 244/492/3 130/493/3 72/494/3 282/495/3 +f 137/496/2 29/497/2 11/498/2 57/499/2 +f 158/500/3 318/501/3 92/502/3 96/503/3 317/504/3 42/505/3 +f 70/506/3 19/507/3 178/508/3 190/509/3 +f 278/510/4 108/511/4 270/512/4 51/513/4 +f 160/514/5 90/515/5 148/516/5 86/517/5 33/50/5 91/461/5 +f 89/518/3 88/321/3 87/322/3 258/519/3 153/520/3 210/521/3 +f 189/522/6 127/523/6 176/524/6 18/525/6 125/526/6 241/527/6 +f 99/528/3 216/529/3 330/530/3 331/531/3 +f 287/532/5 289/533/5 300/534/5 299/535/5 +f 111/536/3 281/537/3 60/538/3 62/539/3 +f 28/540/1 24/541/1 277/542/1 233/543/1 +f 174/544/2 26/545/2 245/546/2 124/547/2 +f 241/548/1 206/549/1 85/550/1 189/551/1 +f 328/552/4 264/553/4 44/554/4 162/555/4 +f 255/556/4 152/557/4 154/558/4 204/559/4 +f 66/560/5 196/561/5 247/562/5 238/563/5 +f 269/564/3 51/565/3 270/566/3 3/567/3 +f 132/342/6 282/495/6 244/492/6 243/341/6 +f 145/116/4 35/568/4 209/569/4 78/310/4 +f 111/570/3 280/571/3 12/572/3 108/573/3 +f 251/149/3 29/164/3 137/574/3 293/575/3 294/576/3 197/577/3 297/578/3 27/152/3 +f 140/579/1 73/580/1 236/581/1 237/582/1 +f 1/400/2 49/583/2 50/584/2 2/401/2 +f 203/43/3 254/585/3 37/586/3 205/42/3 +f 99/587/1 98/588/1 217/589/1 320/590/1 216/591/1 +f 128/592/2 143/593/2 76/594/2 68/595/2 +f 136/157/3 75/282/3 141/279/3 295/596/3 296/597/3 139/598/3 292/599/3 25/338/3 +f 139/600/4 296/601/4 245/602/4 138/603/4 +f 116/604/4 129/605/4 131/606/4 121/607/4 +f 13/82/1 138/44/1 193/45/1 186/81/1 +f 171/11/6 122/12/6 275/9/6 116/608/6 121/609/6 120/610/6 278/611/6 172/612/6 10/613/6 63/614/6 117/615/6 276/10/6 +f 301/128/1 200/131/1 86/616/1 144/617/1 +f 36/618/3 260/619/3 261/620/3 154/621/3 85/622/3 206/623/3 +f 277/326/4 24/624/4 137/324/4 57/325/4 +f 180/408/1 248/407/1 249/625/1 181/626/1 +f 270/512/1 108/511/1 109/627/1 165/628/1 50/584/1 2/401/1 +f 329/629/5 325/630/5 317/631/5 96/632/5 265/633/5 +f 245/546/1 296/634/1 295/635/1 26/545/1 +f 83/636/3 315/637/3 258/519/3 82/269/3 209/638/3 314/639/3 +f 290/640/2 249/625/2 181/626/2 180/408/2 4/449/2 105/641/2 120/642/2 121/643/2 131/644/2 132/645/2 +f 16/646/1 22/647/1 194/648/1 239/649/1 +f 144/617/2 301/128/2 136/147/2 29/497/2 145/650/2 252/651/2 +f 232/652/6 231/653/6 182/654/6 183/655/6 180/656/6 181/657/6 +f 36/658/4 206/659/4 241/660/4 125/661/4 +f 279/285/6 237/286/6 236/283/6 65/662/6 235/663/6 64/664/6 173/264/6 58/261/6 112/665/6 67/666/6 66/667/6 238/284/6 +f 200/668/6 151/669/6 33/270/6 86/265/6 +f 32/464/1 301/128/1 136/147/1 25/670/1 183/671/1 182/672/1 311/673/1 310/465/1 +f 124/674/4 245/675/4 22/676/4 16/677/4 +f 53/678/6 9/455/6 224/456/6 274/457/6 170/679/6 54/680/6 +f 140/579/2 73/580/2 294/681/2 293/682/2 +f 166/683/1 272/392/1 167/393/1 62/389/1 60/390/1 274/391/1 224/220/1 168/297/1 +f 219/254/5 221/253/5 50/425/5 49/684/5 +f 279/685/5 246/686/5 140/687/5 237/688/5 +f 280/356/1 111/385/1 104/386/1 271/359/1 +f 28/163/6 29/164/6 137/574/6 24/689/6 +f 107/690/4 275/97/4 122/98/4 225/691/4 +f 243/692/2 129/693/2 116/694/2 275/695/2 +f 40/696/4 43/697/4 212/698/4 261/472/4 260/473/4 146/470/4 32/137/4 310/138/4 257/139/4 157/699/4 41/700/4 39/701/4 +f 256/702/2 203/87/2 259/314/2 153/703/2 +f 42/704/4 211/705/4 82/462/4 313/706/4 38/707/4 158/708/4 +f 159/709/2 43/710/2 40/711/2 156/712/2 87/713/2 93/714/2 +f 100/410/1 322/414/1 321/715/1 48/716/1 47/717/1 +f 47/718/4 48/719/4 266/30/4 164/33/4 +f 260/619/6 261/620/6 154/621/6 152/720/6 +f 278/510/5 120/721/5 105/722/5 51/513/5 +f 46/723/2 163/724/2 331/725/2 330/726/2 +f 175/727/1 279/421/1 238/422/1 230/728/1 +f 278/611/3 172/612/3 109/729/3 108/730/3 +f 180/656/3 181/657/3 184/731/3 183/655/3 +f 287/732/3 288/733/3 74/734/3 289/735/3 +f 278/189/1 51/190/1 269/191/1 184/148/1 136/147/1 29/497/1 11/498/1 222/186/1 103/187/1 172/188/1 +f 145/650/2 149/736/2 150/737/2 35/738/2 +f 251/88/1 75/277/1 255/197/1 199/198/1 256/702/1 203/87/1 +f 325/739/2 162/740/2 44/741/2 42/742/2 317/743/2 +f 231/363/4 147/362/4 311/744/4 182/745/4 +f 203/87/1 259/314/1 262/85/1 254/86/1 +f 258/519/6 153/520/6 259/746/6 315/637/6 +f 298/747/1 284/748/1 283/749/1 240/750/1 61/751/1 223/752/1 169/753/1 176/108/1 127/105/1 250/106/1 +f 168/754/6 102/755/6 50/756/6 221/757/6 +f 220/398/5 104/208/5 111/205/5 108/511/5 270/512/5 2/401/5 +f 145/650/1 149/736/1 150/737/1 312/758/1 185/759/1 57/499/1 137/496/1 29/497/1 +f 34/49/5 304/235/5 87/236/5 33/50/5 +f 118/760/6 233/257/6 277/258/6 57/259/6 185/761/6 119/762/6 +f 285/404/6 289/735/6 287/732/6 284/403/6 +f 252/651/1 313/763/1 35/738/1 145/650/1 +f 7/165/2 173/166/2 109/627/2 165/628/2 +f 87/236/5 88/237/5 89/764/5 213/765/5 217/766/5 93/767/5 +f 6/768/6 3/567/6 269/564/6 51/565/6 105/769/6 4/770/6 +f 297/771/5 246/772/5 195/773/5 67/774/5 112/775/5 53/776/5 54/777/5 128/592/5 126/778/5 27/779/5 +f 47/780/3 164/781/3 332/782/3 100/783/3 +f 189/784/5 85/785/5 154/558/5 204/559/5 255/556/5 75/99/5 250/100/5 127/101/5 +f 6/786/1 234/787/1 12/788/1 3/789/1 +f 186/790/3 174/791/3 124/792/3 13/793/3 +f 39/794/3 151/669/3 33/270/3 87/322/3 156/319/3 40/795/3 +f 115/796/5 179/797/5 178/798/5 19/799/5 +f 313/268/6 82/269/6 209/638/6 35/800/6 +f 243/96/4 23/801/4 290/802/4 132/95/4 +f 279/685/4 175/803/4 14/804/4 237/688/4 +f 10/805/4 172/806/4 103/807/4 5/808/4 +f 76/212/5 251/88/5 113/219/5 68/211/5 +f 328/809/1 329/810/1 265/811/1 264/812/1 +f 312/813/5 308/814/5 119/815/5 185/816/5 +f 295/817/4 141/818/4 18/819/4 176/820/4 169/821/4 8/822/4 17/823/4 239/824/4 194/825/4 26/826/4 +f 201/827/1 156/712/1 87/713/1 304/828/1 +f 220/829/3 2/830/3 50/756/3 221/757/3 +f 5/831/2 106/832/2 277/542/2 233/543/2 28/540/2 291/833/2 282/834/2 72/835/2 63/836/2 10/837/2 +f 219/838/6 49/839/6 1/840/6 218/841/6 +f 318/842/5 309/202/5 150/203/5 149/204/5 254/13/5 262/14/5 316/15/5 323/843/5 94/844/5 83/845/5 314/846/5 92/847/5 +f 244/848/4 282/849/4 171/486/4 276/487/4 +f 146/179/3 255/40/3 204/41/3 305/850/3 +f 253/851/3 302/852/3 149/853/3 145/182/3 +f 14/854/2 110/855/2 236/581/2 237/582/2 +f 192/856/1 191/857/1 207/858/1 208/859/1 +f 246/420/1 297/860/1 197/861/1 247/419/1 +f 326/289/1 327/862/1 215/863/1 45/290/1 +f 201/864/5 255/556/5 152/557/5 156/865/5 +f 144/866/4 86/517/4 33/50/4 34/49/4 +f 301/128/5 77/298/5 307/299/5 306/867/5 232/868/5 181/145/5 249/146/5 136/147/5 +f 243/869/2 244/870/2 135/871/2 23/872/2 +f 192/856/5 208/859/5 84/873/5 69/874/5 +f 158/875/2 38/876/2 148/877/2 90/878/2 157/699/2 257/139/2 307/879/2 77/880/2 253/368/2 81/369/2 309/370/2 318/881/2 +f 112/882/2 58/883/2 9/884/2 53/885/2 +f 190/886/1 178/887/1 179/888/1 177/889/1 +f 214/890/3 321/891/3 322/892/3 97/893/3 94/894/3 323/895/3 +f 44/896/6 264/897/6 265/898/6 96/899/6 211/900/6 42/901/6 +f 253/115/5 145/116/5 35/568/5 81/114/5 +f 304/828/2 202/132/2 258/133/2 87/713/2 +f 169/902/6 223/903/6 167/904/6 272/905/6 271/906/6 8/907/6 +f 126/778/4 27/779/4 143/593/4 128/592/4 +f 14/908/6 175/909/6 230/910/6 110/911/6 +f 271/906/3 104/912/3 167/904/3 272/905/3 +f 91/913/6 263/914/6 45/915/6 215/916/6 95/917/6 160/514/6 +f 312/918/3 150/378/3 309/379/3 81/376/3 31/919/3 308/920/3 +f 43/921/3 159/922/3 320/923/3 217/924/3 213/925/3 212/926/3 +f 244/848/5 282/849/5 291/927/5 135/928/5 +f 78/183/6 79/104/6 203/43/6 254/585/6 149/853/6 145/182/6 +f 165/423/5 109/424/5 172/806/5 103/807/5 +f 103/345/3 222/346/3 7/347/3 165/929/3 +f 146/427/1 260/428/1 152/200/1 255/197/1 +f 80/136/1 257/139/1 307/879/1 77/880/1 +f 228/930/1 124/547/1 174/544/1 229/931/1 +f 108/511/2 12/788/2 3/789/2 270/512/2 +f 186/790/6 174/791/6 124/792/6 16/932/6 239/933/6 17/934/6 280/571/6 12/572/6 234/935/6 123/936/6 15/937/6 13/793/6 +f 273/387/1 281/388/1 58/883/1 9/884/1 +f 284/938/1 287/939/1 19/7/1 70/8/1 +f 215/863/5 327/862/5 161/25/5 95/29/5 +f 122/481/1 171/478/1 56/940/1 225/941/1 +f 246/245/3 247/246/3 196/942/3 195/943/3 +f 287/532/4 289/533/4 178/798/4 19/799/4 +f 253/851/6 77/122/6 301/70/6 144/71/6 252/181/6 145/182/6 +f 133/944/2 134/945/2 235/946/2 65/947/2 +f 12/243/5 280/244/5 271/239/5 272/240/5 59/102/5 75/99/5 136/147/5 184/148/5 269/191/5 3/242/5 +f 79/311/4 315/948/4 259/314/4 203/87/4 +f 198/949/3 298/950/3 250/281/3 75/282/3 251/149/3 76/150/3 299/951/3 300/952/3 +f 221/757/6 220/829/6 2/830/6 50/756/6 102/755/6 101/953/6 166/954/6 168/754/6 +f 142/955/5 141/818/5 18/819/5 176/820/5 +f 252/956/5 303/463/5 82/462/5 313/706/5 +f 201/864/4 255/556/4 75/99/4 136/147/4 301/128/4 30/129/4 +f 94/957/2 97/958/2 267/272/2 258/133/2 315/134/2 83/959/2 +f 178/960/1 289/961/1 74/962/1 71/963/1 +f 29/164/6 136/157/6 75/282/6 251/149/6 +f 323/843/1 316/15/1 155/288/1 205/287/1 204/373/1 154/374/1 261/375/1 212/964/1 213/965/1 89/966/1 210/967/1 214/968/1 +f 70/506/6 19/507/6 178/508/6 71/969/6 187/970/6 188/971/6 60/538/6 62/539/6 61/972/6 240/973/6 242/974/6 190/509/6 +f 314/975/1 209/294/1 82/295/1 211/976/1 96/977/1 92/978/1 +f 136/147/2 25/670/2 183/671/2 184/148/2 +f 170/979/1 188/980/1 187/981/1 288/982/1 287/983/1 299/984/1 76/594/1 68/595/1 128/592/1 54/777/1 +f 18/525/3 59/985/3 127/523/3 176/524/3 +g forsaken_fire.vox_forsaken_fire.vox_fire +usemtl fire +f 333/986/7 334/987/7 336/988/7 335/989/7 +f 337/990/8 338/991/8 340/992/8 339/993/8 diff --git a/mods/everness/models/everness_forsythia_mesh.obj b/mods/everness/models/everness_forsythia_mesh.obj new file mode 100644 index 00000000..7f30b8f2 --- /dev/null +++ b/mods/everness/models/everness_forsythia_mesh.obj @@ -0,0 +1,62 @@ +# Blender v2.83.20 OBJ File: 'everness_mesh_bush.blend' +# www.blender.org +mtllib everness_forsythia_mesh.mtl +o Cube +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.353553 0.500000 -0.353553 +v 0.353553 -0.500000 -0.353553 +v -0.353553 0.500000 0.353553 +v -0.353553 -0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v -0.353553 -0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +v 0.353553 -0.500000 0.353553 +vt 0.333333 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.333333 0.500000 +vt 0.666667 0.500000 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.500000 +vt 0.666667 0.000000 +vt 0.666667 0.500000 +vt 0.333333 0.500000 +vt 0.333333 0.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.312500 0.000000 +vt 0.312500 0.500000 +vt -0.000000 0.500000 +vt -0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.666667 0.500000 +vt 0.666667 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.666667 0.500000 +vt 0.666667 0.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +usemtl Material +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 2/13/4 1/14/4 3/6/4 4/5/4 +f 6/15/5 5/16/5 1/17/5 2/18/5 +f 10/19/6 9/20/6 11/21/6 12/22/6 +f 14/23/7 13/24/7 15/25/7 16/26/7 diff --git a/mods/everness/models/everness_glowing_pillar.obj b/mods/everness/models/everness_glowing_pillar.obj new file mode 100644 index 00000000..f75e70ca --- /dev/null +++ b/mods/everness/models/everness_glowing_pillar.obj @@ -0,0 +1,292 @@ +# Blender v2.83.20 OBJ File: 'everness_glowing_pillar.blend' +# www.blender.org +mtllib everness_glowing_pillar.mtl +o Cube +v 0.625000 -0.500000 -0.625000 +v -0.625000 -0.500000 0.625000 +v -0.625000 -0.500000 -0.625000 +v 0.625000 -0.500000 0.625000 +v 0.625000 2.000000 -0.625000 +v -0.625000 2.000000 0.625000 +v -0.625000 2.000000 -0.625000 +v 0.625000 2.000000 0.625000 +v 0.625000 3.250000 -0.625000 +v 0.625000 2.000000 -0.625000 +v 0.625000 3.250000 0.625000 +v 0.625000 2.000000 0.625000 +v -0.625000 3.250000 -0.625000 +v -0.625000 2.000000 -0.625000 +v -0.625000 3.250000 0.625000 +v -0.625000 2.000000 0.625000 +v -1.250000 2.167468 0.625000 +v -0.625000 3.250000 0.625000 +v -1.250000 2.167468 -0.625000 +v -0.625000 3.250000 -0.625000 +v -0.625000 0.750000 0.625000 +v -0.625000 2.000000 0.625000 +v -0.625000 0.750000 -0.625000 +v -0.625000 2.000000 -0.625000 +v -1.250000 0.917468 0.625000 +v -0.625000 2.000000 0.625000 +v -1.250000 0.917468 -0.625000 +v -0.625000 2.000000 -0.625000 +v -1.250000 1.698712 0.625000 +v -0.625000 2.781244 0.625000 +v -1.250000 1.698712 -0.625000 +v -0.625000 2.781244 -0.625000 +v -1.250000 1.304804 0.625000 +v -0.625000 2.387336 0.625000 +v -1.250000 1.304804 -0.625000 +v -0.625000 2.387336 -0.625000 +v 1.249999 2.167468 -0.625000 +v 0.624999 3.250000 -0.625000 +v 1.250000 2.167468 0.625000 +v 0.625000 3.250000 0.625000 +v 0.624999 0.750000 -0.625000 +v 0.625000 2.000000 -0.625000 +v 0.625000 0.750000 0.625000 +v 0.625000 2.000000 0.625000 +v 1.250000 0.917468 -0.625000 +v 0.625000 2.000000 -0.625000 +v 1.250000 0.917468 0.625000 +v 0.625000 2.000000 0.625000 +v 1.249999 1.698713 -0.625000 +v 0.625000 2.781244 -0.625000 +v 1.250000 1.698712 0.625000 +v 0.625000 2.781244 0.625000 +v 1.250000 1.304805 -0.625000 +v 0.624999 2.387336 -0.625000 +v 1.250000 1.304805 0.625000 +v 0.625000 2.387336 0.625000 +v -0.625000 2.167468 -1.250000 +v -0.625000 3.250000 -0.625000 +v 0.625000 2.167468 -1.250001 +v 0.625000 3.250000 -0.625001 +v -0.625000 0.750000 -0.625000 +v -0.625000 2.000000 -0.625000 +v 0.625000 0.750000 -0.625001 +v 0.625000 2.000000 -0.625001 +v -0.625000 0.917468 -1.250000 +v -0.625000 2.000000 -0.625000 +v 0.625000 0.917468 -1.250001 +v 0.625000 2.000000 -0.625001 +v -0.625000 1.698712 -1.250000 +v -0.625000 2.781244 -0.625000 +v 0.625000 1.698712 -1.250001 +v 0.625000 2.781244 -0.625001 +v -0.625000 1.304804 -1.250000 +v -0.625000 2.387336 -0.625000 +v 0.625000 1.304805 -1.250001 +v 0.625000 2.387336 -0.625001 +v 0.625000 2.167468 1.250000 +v 0.625000 3.250000 0.625000 +v -0.625000 2.167468 1.250001 +v -0.625000 3.250000 0.625001 +v 0.625000 0.750000 0.625000 +v 0.625000 2.000000 0.625000 +v -0.625000 0.750000 0.625001 +v -0.625000 2.000000 0.625001 +v 0.625000 0.917468 1.250000 +v 0.625000 2.000000 0.625000 +v -0.624999 0.917468 1.250001 +v -0.625000 2.000000 0.625001 +v 0.625000 1.698712 1.250000 +v 0.625000 2.781244 0.625000 +v -0.624999 1.698712 1.250001 +v -0.625000 2.781244 0.625001 +v 0.625000 1.304805 1.250000 +v 0.625000 2.387336 0.625000 +v -0.624999 1.304804 1.250001 +v -0.625000 2.387336 0.625001 +v 0.625001 3.562500 0.625000 +v 0.625000 3.562500 -0.625000 +v -0.624999 3.562500 0.625001 +v -0.625000 3.562500 -0.624999 +v 0.000001 3.250000 0.000000 +v -0.624269 3.250000 0.625000 +v -0.624269 5.016733 0.625000 +v 0.624999 3.250000 -0.624269 +v 0.624999 5.016733 -0.624269 +v 0.625000 5.016734 0.625000 +v 0.625000 3.250000 0.625000 +v -0.624269 5.016734 -0.624268 +v -0.624269 3.250000 -0.624268 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.500000 0.000000 +vt 1.000000 0.500000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 0.5000 -0.0000 +vn -0.0000 0.5000 -0.8660 +vn 0.0000 0.5000 0.8660 +vn -0.4472 0.8944 0.0000 +vn 0.0000 0.8944 0.4472 +vn 0.4472 0.8944 0.0000 +vn -0.0000 0.8944 -0.4472 +vn -0.7071 0.0000 -0.7071 +g Cube_Cube_Roots +usemtl Roots +s off +f 3/1/1 7/2/1 8/3/1 4/4/1 +f 1/5/2 5/6/2 6/7/2 2/8/2 +g Cube_Cube_Luminophor +usemtl Luminophor +f 9/9/3 13/10/3 15/11/3 11/12/3 +f 12/13/4 11/14/4 15/15/4 16/16/4 +f 16/16/5 15/15/5 13/17/5 14/18/5 +f 14/19/6 10/20/6 12/13/6 16/16/6 +f 10/21/7 9/9/7 11/22/7 12/23/7 +f 14/24/8 13/10/8 9/9/8 10/21/8 +g Cube_Cube_Leaves +usemtl Leaves +f 17/25/9 18/26/9 20/27/9 19/28/9 +f 21/29/5 22/30/5 24/31/5 23/32/5 +f 25/33/9 26/34/9 28/35/9 27/36/9 +f 29/37/9 30/38/9 32/39/9 31/40/9 +f 33/41/9 34/42/9 36/43/9 35/44/9 +f 37/45/10 38/46/10 40/47/10 39/48/10 +f 41/49/7 42/50/7 44/51/7 43/52/7 +f 45/53/10 46/54/10 48/55/10 47/56/10 +f 49/57/10 50/58/10 52/59/10 51/60/10 +f 53/61/10 54/62/10 56/63/10 55/64/10 +f 57/65/11 58/66/11 60/67/11 59/68/11 +f 61/69/8 62/70/8 64/71/8 63/72/8 +f 65/73/11 66/74/11 68/75/11 67/76/11 +f 69/77/11 70/78/11 72/79/11 71/80/11 +f 73/81/11 74/82/11 76/83/11 75/84/11 +f 77/85/12 78/86/12 80/87/12 79/88/12 +f 81/89/4 82/90/4 84/91/4 83/92/4 +f 85/93/12 86/94/12 88/95/12 87/96/12 +f 89/97/12 90/98/12 92/99/12 91/100/12 +f 93/101/12 94/102/12 96/103/12 95/104/12 +f 97/105/13 98/106/13 101/107/13 +f 98/108/14 100/109/14 101/107/14 +f 100/110/15 99/111/15 101/107/15 +f 99/112/16 97/113/16 101/107/16 +f 105/114/17 104/115/17 102/116/17 103/117/17 +f 106/118/1 107/119/1 109/120/1 108/121/1 diff --git a/mods/everness/models/everness_hammer_pick.obj b/mods/everness/models/everness_hammer_pick.obj new file mode 100644 index 00000000..7026ab07 --- /dev/null +++ b/mods/everness/models/everness_hammer_pick.obj @@ -0,0 +1,478 @@ +# Blender v2.83.20 OBJ File: 'everness_hammer_pick.blend' +# www.blender.org +mtllib everness_hammer_pick.mtl +o hammer_head.vox +v 0.117043 0.562218 -0.240000 +v 0.117043 0.562218 0.240000 +v -0.222369 0.901630 -0.240000 +v -0.561780 -0.116604 -0.240000 +v -0.901191 0.222807 0.240000 +v -0.561780 -0.116604 0.240000 +v -0.222369 0.901630 0.240000 +v -0.901191 0.222807 -0.240000 +v 0.097391 -0.177433 0.040000 +v -0.142609 -0.017433 -0.040000 +v -0.222609 0.062567 0.040000 +v -0.222609 0.062567 -0.040000 +v -0.142609 0.062567 -0.040000 +v -0.382609 0.222567 -0.040000 +v 0.577391 -0.337433 -0.040000 +v 0.417391 -0.337433 -0.040000 +v 0.417391 -0.337433 0.040000 +v 0.417391 -0.257433 -0.040000 +v 0.337391 -0.257433 0.040000 +v 0.337391 -0.177433 0.040000 +v 0.337391 -0.177433 -0.040000 +v 0.257391 -0.177433 0.040000 +v 0.257391 -0.097433 0.040000 +v 0.177391 -0.017433 -0.040000 +v 0.017391 0.062567 -0.040000 +v -0.062609 0.222567 0.040000 +v -0.142609 0.302567 -0.040000 +v -0.222609 0.302567 0.040000 +v -0.222609 0.382567 0.040000 +v 0.577391 -0.577433 0.040000 +v 0.417391 -0.257433 0.040000 +v 0.257391 -0.417433 0.040000 +v 0.257391 -0.337433 0.040000 +v 0.177391 -0.257433 0.040000 +v 0.177391 -0.337433 0.040000 +v 0.097391 -0.257433 0.040000 +v 0.177391 -0.097433 0.040000 +v 0.097391 -0.017433 0.040000 +v 0.017391 0.062567 0.040000 +v -0.062609 -0.017433 0.040000 +v -0.062609 0.142567 0.040000 +v -0.142609 -0.017433 0.040000 +v -0.142609 0.062567 0.040000 +v -0.142609 0.222567 0.040000 +v -0.222609 0.142567 0.040000 +v -0.142609 0.302567 0.040000 +v -0.302609 0.302567 0.040000 +v -0.302609 0.222567 0.040000 +v -0.382609 0.222567 0.040000 +v 0.257391 -0.337433 -0.040000 +v 0.257391 -0.177433 -0.040000 +v 0.257391 -0.097433 -0.040000 +v 0.177391 -0.257433 -0.040000 +v 0.097391 -0.257433 -0.040000 +v 0.097391 -0.177433 -0.040000 +v 0.017391 -0.177433 -0.040000 +v 0.017391 -0.097433 -0.040000 +v 0.097391 -0.017433 -0.040000 +v -0.062609 -0.017433 -0.040000 +v 0.017391 0.142567 -0.040000 +v -0.062609 0.222567 -0.040000 +v -0.222609 0.142567 -0.040000 +v -0.302609 0.222567 -0.040000 +v -0.302609 0.302567 -0.040000 +v -0.222609 0.302567 -0.040000 +v -0.222609 0.382567 -0.040000 +v 0.577391 -0.577433 -0.040000 +v 0.577391 -0.337433 0.040000 +v 0.337391 -0.257433 -0.040000 +v 0.177391 -0.097433 -0.040000 +v 0.177391 -0.017433 0.040000 +v 0.097391 0.062567 -0.040000 +v 0.097391 0.062567 0.040000 +v 0.017391 0.142567 0.040000 +v -0.062609 0.142567 -0.040000 +v -0.142609 0.222567 -0.040000 +v 0.337391 -0.577433 0.040000 +v 0.337391 -0.577433 -0.040000 +v 0.337391 -0.417433 0.040000 +v 0.337391 -0.417433 -0.040000 +v 0.257391 -0.417433 -0.040000 +v 0.177391 -0.337433 -0.040000 +v 0.017391 -0.177433 0.040000 +v 0.017391 -0.097433 0.040000 +v -0.062609 -0.097433 0.040000 +v -0.062609 -0.097433 -0.040000 +v -0.302609 0.142567 0.040000 +v -0.302609 0.142567 -0.040000 +v -0.302609 0.382567 0.040000 +v -0.302609 0.382567 -0.040000 +v -0.382609 0.302567 0.040000 +v -0.382609 0.302567 -0.040000 +vt 0.375000 1.000000 +vt 0.000000 0.812500 +vt 0.000000 1.000000 +vt 0.375000 0.812500 +vt 0.562500 1.000000 +vt 0.375000 1.000000 +vt 0.750000 0.812500 +vt 0.562500 1.000000 +vt 0.750000 1.000000 +vt 0.000000 0.250000 +vt 0.375000 0.437500 +vt 0.375000 0.250000 +vt 0.000000 0.812500 +vt 0.375000 0.625000 +vt 0.375000 0.812500 +vt 0.375000 0.625000 +vt 0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.718750 +vt 0.406250 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.625000 +vt 0.406250 0.656250 +vt 0.375000 0.656250 +vt 0.375000 0.531250 +vt 0.406250 0.593750 +vt 0.375000 0.593750 +vt 0.375000 0.468750 +vt 0.406250 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.406250 +vt 0.406250 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.343750 +vt 0.406250 0.375000 +vt 0.375000 0.375000 +vt 0.375000 0.281250 +vt 0.406250 0.312500 +vt 0.375000 0.312500 +vt 0.375000 0.218750 +vt 0.406250 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.156250 +vt 0.406250 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.093750 +vt 0.406250 0.125000 +vt 0.375000 0.125000 +vt 0.406250 0.625000 +vt 0.437500 0.593750 +vt 0.437500 0.625000 +vt 0.406250 0.531250 +vt 0.437500 0.500000 +vt 0.437500 0.531250 +vt 0.406250 0.468750 +vt 0.437500 0.437500 +vt 0.437500 0.468750 +vt 0.406250 0.406250 +vt 0.437500 0.375000 +vt 0.437500 0.406250 +vt 0.406250 0.343750 +vt 0.437500 0.312500 +vt 0.437500 0.343750 +vt 0.406250 0.281250 +vt 0.437500 0.250000 +vt 0.437500 0.281250 +vt 0.406250 0.218750 +vt 0.437500 0.187500 +vt 0.437500 0.218750 +vt 0.406250 0.156250 +vt 0.437500 0.125000 +vt 0.437500 0.156250 +vt 0.406250 0.093750 +vt 0.437500 0.062500 +vt 0.437500 0.093750 +vt 0.406250 0.031250 +vt 0.375000 0.062500 +vt 0.375000 0.031250 +vt 0.718750 0.687500 +vt 0.750000 0.718750 +vt 0.718750 0.750000 +vt 0.593750 0.562500 +vt 0.562500 0.531250 +vt 0.531250 0.562500 +vt 0.406250 0.656250 +vt 0.437500 0.718750 +vt 0.406250 0.718750 +vt 0.437500 0.812500 +vt 0.437500 0.656250 +vt 0.406250 0.593750 +vt 0.406250 0.500000 +vt 0.406250 0.437500 +vt 0.406250 0.375000 +vt 0.406250 0.312500 +vt 0.406250 0.250000 +vt 0.406250 0.187500 +vt 0.406250 0.125000 +vt 0.406250 0.625000 +vt 0.406250 0.531250 +vt 0.406250 0.468750 +vt 0.406250 0.406250 +vt 0.406250 0.343750 +vt 0.406250 0.281250 +vt 0.406250 0.218750 +vt 0.406250 0.156250 +vt 0.437500 0.031250 +vt 0.406250 0.093750 +vt 0.375000 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.812500 +vt 0.000000 0.437500 +vt 0.000000 0.625000 +vt 0.000000 0.625000 +vt 0.406250 0.718750 +vt 0.406250 0.062500 +vt 0.406250 0.062500 +vt 0.531250 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.531250 +vt 0.437500 0.531250 +vt 0.437500 0.437500 +vt 0.531250 0.437500 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.531250 +vt 0.593750 0.531250 +vt 0.593750 0.562500 +vt 0.625000 0.562500 +vt 0.625000 0.593750 +vt 0.656250 0.593750 +vt 0.656250 0.625000 +vt 0.687500 0.625000 +vt 0.687500 0.656250 +vt 0.718750 0.656250 +vt 0.750000 0.687500 +vt 0.781250 0.718750 +vt 0.781250 0.750000 +vt 0.812500 0.750000 +vt 0.812500 0.781250 +vt 0.781250 0.781250 +vt 0.781250 0.812500 +vt 0.750000 0.781250 +vt 0.750000 0.812500 +vt 0.718750 0.781250 +vt 0.687500 0.750000 +vt 0.687500 0.718750 +vt 0.656250 0.718750 +vt 0.656250 0.687500 +vt 0.625000 0.687500 +vt 0.625000 0.656250 +vt 0.593750 0.656250 +vt 0.593750 0.625000 +vt 0.562500 0.625000 +vt 0.562500 0.593750 +vt 0.531250 0.593750 +vt 0.625000 0.656250 +vt 0.625000 0.687500 +vt 0.656250 0.687500 +vt 0.656250 0.718750 +vt 0.687500 0.718750 +vt 0.687500 0.750000 +vt 0.718750 0.750000 +vt 0.718750 0.781250 +vt 0.750000 0.781250 +vt 0.750000 0.812500 +vt 0.781250 0.812500 +vt 0.781250 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.750000 +vt 0.750000 0.718750 +vt 0.687500 0.656250 +vt 0.718750 0.687500 +vt 0.593750 0.625000 +vt 0.593750 0.656250 +vt 0.562500 0.593750 +vt 0.562500 0.625000 +vt 0.531250 0.593750 +vt 0.500000 0.531250 +vt 0.500000 0.562500 +vt 0.437500 0.437500 +vt 0.437500 0.531250 +vt 0.531250 0.500000 +vt 0.531250 0.437500 +vt 0.562500 0.500000 +vt 0.593750 0.531250 +vt 0.625000 0.593750 +vt 0.625000 0.562500 +vt 0.656250 0.625000 +vt 0.656250 0.593750 +vt 0.687500 0.625000 +vt 0.718750 0.656250 +vt 0.750000 0.687500 +vt 0.781250 0.750000 +vt 0.781250 0.718750 +vn 0.0000 0.0000 1.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +usemtl hammer +s off +f 5/1/1 2/2/1 7/3/1 +f 2/4/2 3/5/2 7/6/2 +f 4/7/3 5/8/3 8/9/3 +f 6/10/4 1/11/4 2/12/4 +f 3/13/5 4/14/5 8/15/5 +f 3/16/6 5/17/6 7/18/6 +f 77/19/7 67/20/7 30/21/7 +f 32/22/7 80/23/7 79/24/7 +f 35/25/7 50/26/7 33/27/7 +f 36/28/7 53/29/7 34/30/7 +f 83/31/7 55/32/7 9/33/7 +f 85/34/7 57/35/7 84/36/7 +f 42/37/7 59/38/7 40/39/7 +f 11/40/7 13/41/7 43/42/7 +f 87/43/7 62/44/7 45/45/7 +f 49/46/7 63/47/7 48/48/7 +f 18/49/8 19/50/8 31/51/8 +f 21/52/8 22/53/8 20/54/8 +f 52/55/8 37/56/8 23/57/8 +f 24/58/8 38/59/8 71/60/8 +f 72/61/8 39/62/8 73/63/8 +f 60/64/8 41/65/8 74/66/8 +f 61/67/8 44/68/8 26/69/8 +f 27/70/8 28/71/8 46/72/8 +f 66/73/8 89/74/8 29/75/8 +f 64/76/8 91/77/8 47/78/8 +f 13/79/5 62/80/5 76/81/5 +f 34/82/1 33/83/1 19/84/1 +f 16/85/8 68/86/8 15/87/8 +f 15/87/9 30/88/9 67/20/9 +f 16/85/9 31/51/9 17/89/9 +f 69/90/9 20/54/9 19/50/9 +f 51/91/9 23/57/9 22/53/9 +f 70/92/9 71/60/9 37/56/9 +f 58/93/9 73/63/9 38/59/9 +f 25/94/9 74/66/9 39/62/9 +f 75/95/9 26/69/9 41/65/9 +f 76/96/9 46/72/9 44/68/9 +f 65/97/9 29/75/9 28/71/9 +f 33/27/10 81/98/10 32/22/10 +f 34/30/10 82/99/10 35/25/10 +f 9/33/10 54/100/10 36/28/10 +f 84/36/10 56/101/10 83/31/10 +f 40/39/10 86/102/10 85/34/10 +f 42/37/10 13/41/10 10/103/10 +f 45/45/10 12/104/10 11/40/10 +f 48/48/10 88/105/10 87/43/10 +f 89/74/10 64/76/10 47/106/10 +f 91/77/10 14/107/10 49/46/10 +f 80/23/10 77/19/10 79/24/10 +f 5/1/1 6/108/1 2/2/1 +f 2/4/2 1/109/2 3/5/2 +f 4/7/3 6/110/3 5/8/3 +f 6/10/4 4/111/4 1/11/4 +f 3/13/5 1/112/5 4/14/5 +f 3/16/6 8/113/6 5/17/6 +f 77/19/7 78/114/7 67/20/7 +f 32/22/7 81/98/7 80/23/7 +f 35/25/7 82/99/7 50/26/7 +f 36/28/7 54/100/7 53/29/7 +f 83/31/7 56/101/7 55/32/7 +f 85/34/7 86/102/7 57/35/7 +f 42/37/7 10/103/7 59/38/7 +f 11/40/7 12/104/7 13/41/7 +f 87/43/7 88/105/7 62/44/7 +f 49/46/7 14/107/7 63/47/7 +f 18/49/8 69/90/8 19/50/8 +f 21/52/8 51/91/8 22/53/8 +f 52/55/8 70/92/8 37/56/8 +f 24/58/8 58/93/8 38/59/8 +f 72/61/8 25/94/8 39/62/8 +f 60/64/8 75/95/8 41/65/8 +f 61/67/8 76/96/8 44/68/8 +f 27/70/8 65/97/8 28/71/8 +f 66/73/8 90/115/8 89/74/8 +f 64/76/8 92/116/8 91/77/8 +f 69/117/5 18/118/5 16/119/5 +f 16/119/5 15/120/5 67/121/5 +f 67/121/5 78/122/5 80/123/5 +f 80/123/5 81/124/5 50/125/5 +f 50/125/5 82/126/5 53/127/5 +f 53/127/5 54/128/5 55/129/5 +f 55/129/5 56/130/5 57/131/5 +f 57/131/5 86/132/5 59/133/5 +f 59/133/5 10/134/5 13/79/5 +f 13/79/5 12/135/5 62/80/5 +f 62/80/5 88/136/5 63/137/5 +f 63/137/5 14/138/5 92/139/5 +f 64/140/5 90/141/5 65/142/5 +f 90/141/5 66/143/5 65/142/5 +f 63/137/5 92/139/5 64/140/5 +f 62/80/5 63/137/5 65/142/5 +f 63/137/5 64/140/5 65/142/5 +f 65/142/5 27/144/5 76/81/5 +f 76/81/5 61/145/5 75/146/5 +f 75/146/5 60/147/5 25/148/5 +f 25/148/5 72/149/5 58/150/5 +f 58/150/5 24/151/5 70/152/5 +f 70/152/5 52/153/5 51/154/5 +f 51/154/5 21/155/5 69/117/5 +f 69/117/5 16/119/5 80/123/5 +f 16/119/5 67/121/5 80/123/5 +f 80/123/5 50/125/5 69/117/5 +f 53/127/5 55/129/5 51/154/5 +f 55/129/5 57/131/5 70/152/5 +f 51/154/5 55/129/5 70/152/5 +f 50/125/5 53/127/5 51/154/5 +f 51/154/5 69/117/5 50/125/5 +f 58/150/5 70/152/5 57/131/5 +f 75/146/5 25/148/5 59/133/5 +f 25/148/5 58/150/5 57/131/5 +f 65/142/5 76/81/5 62/80/5 +f 76/81/5 75/146/5 13/79/5 +f 57/131/5 59/133/5 25/148/5 +f 59/133/5 13/79/5 75/146/5 +f 38/156/1 73/157/1 39/158/1 +f 39/158/1 74/159/1 41/160/1 +f 41/160/1 26/161/1 44/162/1 +f 44/162/1 46/163/1 28/164/1 +f 28/164/1 29/165/1 89/166/1 +f 47/167/1 91/168/1 49/169/1 +f 28/164/1 89/166/1 47/167/1 +f 41/160/1 44/162/1 45/170/1 +f 44/162/1 28/164/1 45/170/1 +f 38/156/1 39/158/1 40/171/1 +f 39/158/1 41/160/1 43/172/1 +f 37/173/1 71/174/1 38/156/1 +f 22/175/1 23/176/1 37/173/1 +f 19/84/1 20/177/1 22/175/1 +f 17/178/1 31/179/1 19/84/1 +f 30/180/1 68/181/1 17/178/1 +f 79/182/1 77/183/1 30/180/1 +f 33/83/1 32/184/1 79/182/1 +f 34/82/1 35/185/1 33/83/1 +f 9/186/1 36/187/1 34/82/1 +f 84/188/1 83/189/1 9/186/1 +f 40/171/1 85/190/1 84/188/1 +f 43/172/1 42/191/1 40/171/1 +f 45/170/1 11/192/1 43/172/1 +f 48/193/1 87/194/1 45/170/1 +f 47/167/1 49/169/1 48/193/1 +f 28/164/1 47/167/1 48/193/1 +f 45/170/1 28/164/1 48/193/1 +f 22/175/1 37/173/1 9/186/1 +f 37/173/1 38/156/1 84/188/1 +f 39/158/1 43/172/1 40/171/1 +f 43/172/1 41/160/1 45/170/1 +f 40/171/1 84/188/1 38/156/1 +f 37/173/1 84/188/1 9/186/1 +f 30/180/1 17/178/1 79/182/1 +f 17/178/1 19/84/1 33/83/1 +f 19/84/1 22/175/1 34/82/1 +f 9/186/1 34/82/1 22/175/1 +f 33/83/1 79/182/1 17/178/1 +f 16/85/8 17/89/8 68/86/8 +f 15/87/9 68/86/9 30/88/9 +f 16/85/9 18/49/9 31/51/9 +f 69/90/9 21/52/9 20/54/9 +f 51/91/9 52/55/9 23/57/9 +f 70/92/9 24/58/9 71/60/9 +f 58/93/9 72/61/9 73/63/9 +f 25/94/9 60/64/9 74/66/9 +f 75/95/9 61/67/9 26/69/9 +f 76/96/9 27/70/9 46/72/9 +f 65/97/9 66/73/9 29/75/9 +f 33/27/10 50/26/10 81/98/10 +f 34/30/10 53/29/10 82/99/10 +f 9/33/10 55/32/10 54/100/10 +f 84/36/10 57/35/10 56/101/10 +f 40/39/10 59/38/10 86/102/10 +f 42/37/10 43/42/10 13/41/10 +f 45/45/10 62/44/10 12/104/10 +f 48/48/10 63/47/10 88/105/10 +f 89/74/10 90/115/10 64/76/10 +f 91/77/10 92/116/10 14/107/10 +f 80/23/10 78/114/10 77/19/10 diff --git a/mods/everness/models/everness_lotus_flower.obj b/mods/everness/models/everness_lotus_flower.obj new file mode 100644 index 00000000..ad1ed263 --- /dev/null +++ b/mods/everness/models/everness_lotus_flower.obj @@ -0,0 +1,235 @@ +# Blender v2.83.20 OBJ File: 'everness_lotus_flower.blend' +# www.blender.org +mtllib everness_lotus_flower.mtl +o Cube +v -0.308107 -0.055472 -0.746216 +v -0.009900 -0.499000 -0.342751 +v 0.655918 0.011755 -0.265300 +v -0.732371 -0.055472 -0.321952 +v -0.328906 -0.499000 -0.023745 +v -0.308107 -0.055472 0.698725 +v 0.231654 0.011755 -0.689564 +v 0.288417 -0.055942 0.698836 +v 0.712681 -0.055942 0.274572 +v -0.732371 -0.055472 0.274461 +v -0.486053 -0.100909 -0.211530 +v -0.160819 -0.498639 -0.160819 +v 0.211530 -0.100909 -0.486054 +v 0.160819 -0.498639 -0.160819 +v -0.486053 -0.100909 0.211530 +v -0.160819 -0.498639 0.160819 +v 0.211530 -0.100909 0.486053 +v 0.160819 -0.498639 0.160819 +v -0.211530 -0.100909 -0.486054 +v 0.486054 -0.100909 0.211530 +v 0.486054 -0.100909 -0.211530 +v -0.211530 -0.100909 0.486053 +v 0.160592 -0.498186 0.160592 +v 0.160592 -0.177003 0.160592 +v -0.160592 -0.498186 0.160592 +v -0.160592 -0.177003 0.160592 +v 0.160592 -0.498186 -0.160592 +v 0.160592 -0.177003 -0.160592 +v -0.160592 -0.498186 -0.160592 +v -0.160592 -0.177003 -0.160592 +v 0.309302 -0.499453 -0.023720 +v -0.009875 -0.499453 0.295457 +v 0.000000 -0.330263 0.355694 +v 0.000000 0.589835 0.355694 +v -0.355694 -0.330263 -0.000000 +v -0.355694 0.589835 -0.000000 +v 0.355694 -0.330263 -0.000000 +v 0.355694 0.589835 -0.000000 +v 0.000000 -0.330263 -0.355694 +v 0.000000 0.589835 -0.355694 +v 0.500438 -0.055472 -0.534084 +v 0.149602 -0.499000 -0.183248 +v 0.548643 -0.154723 -0.000000 +v 0.160819 -0.498639 -0.000000 +v 0.000000 -0.154723 -0.548643 +v 0.000000 -0.498639 -0.160819 +v -0.160819 -0.498639 -0.000000 +v -0.548642 -0.154723 -0.000000 +v 0.000000 -0.498639 0.160819 +v 0.000000 -0.154723 0.548642 +v -0.169403 -0.499000 0.135758 +v -0.567776 -0.135591 0.534130 +v -0.169403 -0.499000 -0.183248 +v -0.567776 -0.135591 -0.581621 +v 0.548086 -0.136060 0.534241 +v 0.150919 -0.498639 0.137074 +vt 0.500000 0.750000 +vt -0.000000 0.500000 +vt 0.000000 0.750000 +vt 0.500000 0.750000 +vt -0.000000 0.500000 +vt 0.000000 0.750000 +vt 0.000000 0.250000 +vt 0.500000 0.250000 +vt 0.250000 0.000000 +vt 0.500000 0.750000 +vt 0.000000 0.500000 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.875000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.875000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.000000 1.000000 +vt 0.875000 0.812500 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt -0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.875000 0.625000 +vt 0.875000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 1.000000 +vt 0.875000 0.625000 +vt 0.875000 0.625000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.000000 +vn -0.3842 0.8402 -0.3827 +vn 0.3847 0.8403 -0.3819 +vn 0.0000 1.0000 0.0000 +vn -0.4713 0.7455 0.4713 +vn 0.3833 0.8403 -0.3833 +vn 0.0000 0.7482 0.6635 +vn 0.6635 0.7482 -0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -0.4699 0.7455 0.4726 +vn -0.6979 0.6171 -0.3635 +vn -0.6635 0.7482 -0.0000 +vn 0.6979 0.6171 0.3635 +vn -0.0000 0.7482 -0.6635 +vn 0.3635 0.6171 -0.6979 +vn -0.3635 0.6171 0.6979 +vn -0.1925 0.7280 -0.6580 +vn 0.3833 0.8403 0.3833 +vn -0.6580 0.7280 -0.1925 +vn 0.1928 0.7276 -0.6584 +vn 0.0014 1.0000 0.0014 +vn -0.2680 0.6247 0.7334 +vn 0.6580 0.7280 -0.1925 +vn 0.3635 0.6171 0.6979 +vn 0.6979 0.6171 -0.3635 +vn -0.7337 0.6243 0.2683 +vn -0.6979 0.6171 0.3635 +vn -0.3635 0.6171 -0.6979 +vn -0.3827 0.8402 -0.3842 +vn 0.1925 0.7280 0.6580 +vn 0.6580 0.7280 0.1925 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +g Cube_Cube_lotus +usemtl lotus +s off +f 55/1/1 31/2/1 56/3/1 +f 52/4/2 32/5/2 51/6/2 +f 51/7/3 42/8/3 53/9/3 +f 41/10/4 2/11/4 42/12/4 +f 5/13/5 52/4/5 51/6/5 +f 45/14/6 12/15/6 46/16/6 +f 48/17/7 16/18/7 47/19/7 +f 24/20/8 25/21/8 23/22/8 +f 26/23/9 29/24/9 25/25/9 +f 30/26/10 27/27/10 29/28/10 +f 28/29/11 23/30/11 27/31/11 +f 26/23/3 28/32/3 30/33/3 +f 31/34/12 41/10/12 42/12/12 +f 43/35/13 18/36/13 20/37/13 +f 43/35/14 14/38/14 44/39/14 +f 48/17/15 12/40/15 11/41/15 +f 50/42/16 18/43/16 49/44/16 +f 50/42/17 16/45/17 22/46/17 +f 45/14/18 14/47/18 13/48/18 +f 55/1/19 32/49/19 8/50/19 +f 2/51/20 54/52/20 53/53/20 +f 54/52/20 5/54/20 53/53/20 +f 55/1/21 9/55/21 31/2/21 +f 52/4/22 6/56/22 32/5/22 +f 53/9/3 5/57/3 51/7/3 +f 51/7/23 32/5/23 31/58/23 +f 42/8/3 2/59/3 53/9/3 +f 51/7/23 31/58/23 42/8/23 +f 41/10/24 7/60/24 2/11/24 +f 5/13/25 10/61/25 52/4/25 +f 45/14/26 19/62/26 12/15/26 +f 48/17/27 15/63/27 16/18/27 +f 24/20/8 26/64/8 25/21/8 +f 26/23/9 30/65/9 29/24/9 +f 30/26/10 28/66/10 27/27/10 +f 28/29/11 24/67/11 23/30/11 +f 26/23/3 24/67/3 28/32/3 +f 31/34/28 3/68/28 41/10/28 +f 43/35/14 44/39/14 18/36/14 +f 43/35/29 21/69/29 14/38/29 +f 48/17/7 47/19/7 12/40/7 +f 50/42/30 17/70/30 18/43/30 +f 50/42/16 49/44/16 16/45/16 +f 45/14/6 46/16/6 14/47/6 +f 55/1/31 56/3/31 32/49/31 +f 2/51/32 1/71/32 54/52/32 +f 54/52/33 4/72/33 5/54/33 +g Cube_Cube_flies +usemtl flies +f 33/73/34 34/74/34 36/75/34 35/76/34 +f 35/76/35 36/75/35 40/77/35 39/78/35 +f 39/79/36 40/80/36 38/81/36 37/82/36 +f 37/82/37 38/81/37 34/74/37 33/73/37 diff --git a/mods/everness/models/everness_lumabus.obj b/mods/everness/models/everness_lumabus.obj new file mode 100644 index 00000000..2cab5696 --- /dev/null +++ b/mods/everness/models/everness_lumabus.obj @@ -0,0 +1,88 @@ +# Blender v2.83.20 OBJ File: 'everness_lumabus.blend' +# www.blender.org +mtllib everness_lumabus.mtl +o Cube +v 0.312500 -0.499500 0.312500 +v 0.312500 0.125500 0.312500 +v 0.312500 -0.499500 -0.312500 +v 0.312500 0.125500 -0.312500 +v -0.312500 -0.499500 0.312500 +v -0.312500 0.125500 0.312500 +v -0.312500 -0.499500 -0.312500 +v -0.312500 0.125500 -0.312500 +v 0.312500 -0.499828 0.312500 +v 0.791278 -0.098086 0.312500 +v 0.312500 -0.499828 -0.312500 +v 0.312500 -0.098086 -0.791278 +v -0.312500 -0.499828 0.312500 +v -0.312500 -0.098086 0.791278 +v -0.312500 -0.499828 -0.312500 +v -0.312500 -0.098086 -0.791278 +v -0.791278 -0.098086 -0.312500 +v 0.791278 -0.098086 -0.312500 +v 0.312500 -0.098086 0.791278 +v -0.791278 -0.098086 0.312500 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.000000 +vt 0.250000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.681818 0.681818 +vt 0.318182 0.681818 +vt 0.318182 0.318182 +vt 0.681818 0.318182 +vt 0.681818 -0.000000 +vt 0.681818 0.363636 +vt 0.318182 0.363636 +vt 0.318182 -0.000000 +vt -0.000000 0.318182 +vt 0.363636 0.318182 +vt 0.363636 0.681818 +vt -0.000000 0.681818 +vt 1.000000 0.681818 +vt 0.636364 0.681818 +vt 0.636364 0.318182 +vt 1.000000 0.318182 +vt 0.318182 1.000000 +vt 0.318182 0.636364 +vt 0.681818 0.636364 +vt 0.681818 1.000000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -0.7660 -0.6428 +vn -0.6428 -0.7660 -0.0000 +vn 0.6428 -0.7660 -0.0000 +vn 0.0000 -0.7660 0.6428 +g Cube_Cube_bulb +usemtl bulb +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/8/3 7/7/3 5/9/3 6/10/3 +f 6/11/4 2/12/4 4/13/4 8/14/4 +f 2/12/5 1/15/5 3/16/5 4/17/5 +f 6/11/6 5/18/6 1/15/6 2/12/6 +g Cube_Cube_leaves +usemtl leaves +f 9/19/1 13/20/1 15/21/1 11/22/1 +f 12/23/7 11/24/7 15/25/7 16/26/7 +f 17/27/8 15/28/8 13/29/8 20/30/8 +f 10/31/9 9/32/9 11/33/9 18/34/9 +f 14/35/10 13/36/10 9/37/10 19/38/10 diff --git a/mods/everness/models/everness_lumecorn.obj b/mods/everness/models/everness_lumecorn.obj new file mode 100644 index 00000000..a13dc765 --- /dev/null +++ b/mods/everness/models/everness_lumecorn.obj @@ -0,0 +1,84 @@ +# Blender v2.83.20 OBJ File: 'everness_lumecorn.blend' +# www.blender.org +mtllib everness_lumecorn.mtl +o Cube +v 0.441942 0.750000 -0.441942 +v 0.441942 -0.500000 -0.441942 +v -0.441942 0.750000 0.441942 +v -0.441942 -0.500000 0.441942 +v -0.441942 0.750000 -0.441942 +v -0.441942 -0.500000 -0.441942 +v 0.441942 0.750000 0.441942 +v 0.441942 -0.500000 0.441942 +v 1.767767 0.350000 0.000000 +v -0.000000 0.350000 -1.767767 +v 0.000000 0.350000 1.767767 +v -1.767767 0.350000 -0.000000 +v -0.883883 0.750000 -0.883883 +v 0.883883 0.750000 0.883883 +v -0.883883 0.750000 0.883883 +v 0.883883 0.750000 -0.883883 +v 0.000000 0.750000 0.000000 +v -0.441942 5.750000 -0.441942 +v -0.441942 0.750000 -0.441942 +v 0.441942 5.750000 0.441942 +v 0.441942 0.750000 0.441942 +v -0.441942 5.750000 0.441942 +v -0.441942 0.750000 0.441942 +v 0.441942 5.750000 -0.441942 +v 0.441942 0.750000 -0.441942 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.500000 0.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 1.000000 0.500000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.0000 -0.9111 -0.4123 +vn 0.0000 -1.0000 0.0000 +vn -0.4123 -0.9111 0.0000 +vn -0.0000 -0.9111 0.4123 +vn 0.4123 -0.9111 -0.0000 +g Cube_Cube_root +usemtl root +s off +f 8/1/1 7/2/1 5/3/1 6/4/1 +f 2/5/2 1/6/2 3/7/2 4/8/2 +g Cube_Cube_leaves +usemtl leaves +f 14/9/3 11/10/3 15/11/3 +f 13/12/4 17/13/4 15/14/4 +f 16/15/4 17/13/4 13/16/4 +f 16/17/5 9/18/5 14/19/5 +f 17/13/4 14/9/4 15/11/4 +f 17/13/4 16/17/4 14/19/4 +f 10/20/6 16/15/6 13/16/6 +f 12/21/7 13/12/7 15/14/7 +g Cube_Cube_light +usemtl light +f 21/22/1 20/23/1 18/24/1 19/25/1 +f 25/26/2 24/27/2 22/28/2 23/29/2 diff --git a/mods/everness/models/everness_mineral_torch.obj b/mods/everness/models/everness_mineral_torch.obj new file mode 100644 index 00000000..5d96b5df --- /dev/null +++ b/mods/everness/models/everness_mineral_torch.obj @@ -0,0 +1,243 @@ +# Blender v2.83.20 OBJ File: 'everness_mineral_torch.blend' +# www.blender.org +mtllib everness_mineral_torch.mtl +o everness_mineral_torch.vox +v -0.062500 -0.490000 0.062500 +v -0.062500 0.135000 0.062500 +v -0.125000 0.135000 -0.125000 +v -0.125000 0.385000 0.125000 +v -0.000000 0.510000 0.062500 +v -0.000000 0.447500 0.062500 +v 0.000000 0.447500 0.250000 +v 0.125000 0.385000 -0.125000 +v -0.000000 -0.052500 0.062500 +v 0.062500 -0.490000 0.062500 +v 0.000000 0.447500 0.187500 +v -0.000000 0.010000 0.062500 +v 0.000000 0.135000 0.187500 +v 0.125000 0.385000 0.125000 +v 0.000000 0.385000 -0.187500 +v -0.000000 0.072500 0.125000 +v 0.000000 0.447500 -0.062500 +v 0.000000 0.385000 0.250000 +v -0.000000 0.010000 0.125000 +v 0.000000 -0.052500 -0.125000 +v 0.000000 0.010000 -0.125000 +v -0.000000 -0.052500 0.125000 +v 0.000000 0.010000 -0.187500 +v 0.000000 0.072500 -0.187500 +v 0.000000 0.072500 -0.250000 +v 0.000000 0.135000 -0.250000 +v 0.000000 0.510000 0.187500 +v 0.062500 0.135000 -0.125000 +v 0.000000 0.135000 -0.312500 +v -0.125000 0.385000 -0.125000 +v 0.000000 0.385000 -0.312500 +v 0.000000 0.385000 0.312500 +v 0.000000 0.510000 -0.187500 +v 0.000000 0.135000 0.312500 +v -0.062500 -0.490000 -0.062500 +v 0.000000 0.385000 0.187500 +v 0.062500 -0.490000 -0.062500 +v 0.000000 0.135000 0.250000 +v 0.000000 0.072500 0.250000 +v 0.000000 0.072500 0.187500 +v -0.125000 0.135000 0.125000 +v 0.062500 0.135000 0.062500 +v 0.125000 0.135000 0.125000 +v -0.125000 0.135000 -0.062500 +v -0.062500 0.135000 -0.062500 +v 0.062500 0.135000 -0.062500 +v 0.125000 0.135000 -0.125000 +v 0.000000 0.385000 -0.250000 +v 0.000000 0.072500 -0.125000 +v 0.000000 0.135000 -0.187500 +v 0.000000 0.010000 0.187500 +v 0.000000 0.010000 -0.062500 +v 0.000000 0.447500 -0.187500 +v 0.000000 -0.052500 -0.062500 +v 0.000000 0.447500 -0.250000 +v 0.000000 0.510000 -0.062500 +v 0.196875 0.072500 0.187500 +v -0.178125 0.072500 0.187500 +v -0.178125 0.447500 -0.187500 +v 0.196875 0.447500 0.187500 +v 0.196875 0.447500 -0.187500 +v -0.178125 0.447500 0.187500 +v -0.178125 0.072500 -0.187500 +v 0.196875 0.072500 -0.187500 +vt 0.250000 0.500000 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.187500 0.562500 +vt 0.125000 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.125000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.625000 +vt 0.187500 0.875000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.437500 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.250000 -0.000000 +vt 0.125000 0.125000 +vt 0.125000 -0.000000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.250000 0.687500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.500000 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.187500 0.625000 +vt 0.062500 0.937500 +vt 0.375000 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.000000 0.875000 +vt 0.625000 0.875000 +vt 0.562500 0.937500 +vt 0.250000 0.125000 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.375000 0.687500 +vt 0.333333 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.666667 -0.000000 +vt 0.166667 -0.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 0.666667 1.000000 +vt 0.666667 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.833333 1.000000 +vt 0.833333 -0.000000 +vt 0.333333 -0.000000 +vt 0.666667 1.000000 +vt 0.833333 1.000000 +vt 1.000000 1.000000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +g everness_mineral_torch.vox_everness_mineral_torch.vox_torch +usemtl torch +s off +f 52/1/1 20/2/1 54/3/1 +f 49/4/1 23/5/1 21/6/1 +f 44/7/1 4/8/1 30/9/1 +f 50/10/1 25/11/1 24/12/1 +f 53/13/1 48/14/1 15/15/1 +f 1/16/1 45/17/1 35/18/1 +f 37/19/2 42/20/2 10/21/2 +f 33/22/1 17/23/1 56/24/1 +f 8/25/3 4/26/3 14/27/3 +f 42/20/4 1/16/4 10/21/4 +f 41/28/4 14/27/4 4/29/4 +f 46/30/5 35/18/5 45/17/5 +f 13/31/2 39/32/2 40/33/2 +f 28/34/5 30/35/5 8/25/5 +f 48/14/1 29/36/1 26/37/1 +f 14/38/2 47/39/2 8/40/2 +f 18/41/2 34/42/2 38/43/2 +f 11/44/2 18/41/2 36/45/2 +f 16/46/2 51/47/2 19/48/2 +f 1/49/6 37/50/6 10/51/6 +f 43/52/6 41/53/6 42/54/6 +f 45/55/6 44/56/6 3/57/6 +f 12/58/2 22/59/2 9/60/2 +f 27/61/2 6/62/2 5/63/2 +f 52/1/1 21/6/1 20/2/1 +f 49/4/1 24/12/1 23/5/1 +f 30/9/1 3/64/1 44/7/1 +f 44/7/1 41/53/1 4/8/1 +f 50/10/1 26/37/1 25/11/1 +f 53/13/1 55/65/1 48/14/1 +f 1/16/1 2/66/1 45/17/1 +f 37/19/2 46/30/2 42/20/2 +f 33/22/1 53/13/1 17/23/1 +f 8/25/3 30/67/3 4/26/3 +f 42/20/4 2/66/4 1/16/4 +f 41/28/4 43/68/4 14/27/4 +f 46/30/5 37/19/5 35/18/5 +f 13/31/2 38/43/2 39/32/2 +f 8/25/5 47/69/5 28/34/5 +f 28/34/5 3/70/5 30/35/5 +f 48/14/1 31/71/1 29/36/1 +f 14/38/2 43/52/2 47/39/2 +f 18/41/2 32/72/2 34/42/2 +f 11/44/2 7/73/2 18/41/2 +f 16/46/2 40/33/2 51/47/2 +f 1/49/6 35/74/6 37/50/6 +f 42/54/6 46/75/6 43/52/6 +f 46/75/6 28/76/6 47/77/6 +f 43/52/6 46/75/6 47/77/6 +f 41/53/6 44/56/6 2/78/6 +f 44/56/6 45/55/6 2/78/6 +f 41/53/6 2/78/6 42/54/6 +f 3/57/6 28/76/6 45/55/6 +f 28/76/6 46/75/6 45/55/6 +f 12/58/2 19/48/2 22/59/2 +f 27/61/2 11/44/2 6/62/2 +g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube +usemtl particle_cube +f 60/79/2 64/80/2 61/81/2 +f 63/82/5 61/81/5 64/80/5 +f 58/83/4 60/79/4 62/84/4 +f 61/85/3 62/86/3 60/87/3 +f 58/83/1 59/88/1 63/89/1 +f 58/90/6 64/91/6 57/92/6 +f 60/79/2 57/93/2 64/80/2 +f 63/82/5 59/94/5 61/81/5 +f 58/83/4 57/93/4 60/79/4 +f 61/85/3 59/95/3 62/86/3 +f 58/83/1 62/84/1 59/88/1 +f 58/90/6 63/96/6 64/91/6 diff --git a/mods/everness/models/everness_mineral_torch_ceiling.obj b/mods/everness/models/everness_mineral_torch_ceiling.obj new file mode 100644 index 00000000..81581ab0 --- /dev/null +++ b/mods/everness/models/everness_mineral_torch_ceiling.obj @@ -0,0 +1,243 @@ +# Blender v2.83.20 OBJ File: 'everness_mineral_torch_wall.blend' +# www.blender.org +mtllib everness_mineral_torch_ceiling.mtl +o everness_mineral_torch.vox +v 0.062500 -0.561250 -0.170873 +v 0.062500 -0.019984 0.141627 +v -0.125000 -0.051234 0.195753 +v 0.125000 0.165272 0.320753 +v 0.062500 0.336025 0.275000 +v 0.062500 0.281899 0.243750 +v 0.250000 0.281899 0.243750 +v -0.125000 0.290272 0.104247 +v 0.062500 -0.151114 -0.006250 +v 0.062500 -0.498750 -0.279127 +v 0.187500 0.281899 0.243750 +v 0.062500 -0.096987 0.025000 +v 0.187500 0.011266 0.087500 +v 0.125000 0.290272 0.104247 +v -0.187500 0.227772 0.212500 +v 0.125000 -0.042861 0.056250 +v -0.062500 0.281899 0.243750 +v 0.250000 0.227772 0.212500 +v 0.125000 -0.096987 0.025000 +v -0.125000 -0.151114 -0.006250 +v -0.125000 -0.096987 0.025000 +v 0.125000 -0.151114 -0.006250 +v -0.187500 -0.096987 0.025000 +v -0.187500 -0.042861 0.056250 +v -0.250000 -0.042861 0.056250 +v -0.250000 0.011266 0.087500 +v 0.187500 0.336025 0.275000 +v -0.125000 0.042516 0.033373 +v -0.312500 0.011266 0.087500 +v -0.125000 0.165272 0.320753 +v -0.312500 0.227772 0.212500 +v 0.312500 0.227772 0.212500 +v -0.187500 0.336025 0.275000 +v 0.312500 0.011266 0.087500 +v -0.062500 -0.561250 -0.170873 +v 0.187500 0.227772 0.212500 +v -0.062500 -0.498750 -0.279127 +v 0.250000 0.011266 0.087500 +v 0.250000 -0.042861 0.056250 +v 0.187500 -0.042861 0.056250 +v 0.125000 -0.051234 0.195753 +v 0.062500 0.042516 0.033373 +v 0.125000 0.073766 -0.020753 +v -0.062500 -0.051234 0.195753 +v -0.062500 -0.019984 0.141627 +v -0.062500 0.042516 0.033373 +v -0.125000 0.073766 -0.020753 +v -0.250000 0.227772 0.212500 +v -0.125000 -0.042861 0.056250 +v -0.187500 0.011266 0.087500 +v 0.187500 -0.096987 0.025000 +v -0.062500 -0.096987 0.025000 +v -0.187500 0.281899 0.243750 +v -0.062500 -0.151114 -0.006250 +v -0.250000 0.281899 0.243750 +v -0.062500 0.336025 0.275000 +v 0.187500 0.055577 -0.114249 +v 0.187500 -0.131923 0.210511 +v -0.187500 0.192836 0.398011 +v 0.187500 0.380336 0.073251 +v -0.187500 0.380336 0.073251 +v 0.187500 0.192836 0.398011 +v -0.187500 -0.131923 0.210511 +v -0.187500 0.055577 -0.114249 +vt 0.250000 0.500000 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.187500 0.562500 +vt 0.125000 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.125000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.625000 +vt 0.187500 0.875000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.437500 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.250000 -0.000000 +vt 0.125000 0.125000 +vt 0.125000 -0.000000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.250000 0.687500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.500000 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.187500 0.625000 +vt 0.062500 0.937500 +vt 0.375000 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.000000 0.875000 +vt 0.625000 0.875000 +vt 0.562500 0.937500 +vt 0.250000 0.125000 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.375000 0.687500 +vt 0.333333 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.666667 -0.000000 +vt 0.166667 -0.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 0.666667 1.000000 +vt 0.666667 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.833333 1.000000 +vt 0.833333 -0.000000 +vt 0.333333 -0.000000 +vt 0.666667 1.000000 +vt 0.833333 1.000000 +vt 1.000000 1.000000 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 0.8660 0.5000 +vn 1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.8660 -0.5000 +g everness_mineral_torch.vox_everness_mineral_torch.vox_torch +usemtl torch +s off +f 52/1/1 20/2/1 54/3/1 +f 49/4/1 23/5/1 21/6/1 +f 44/7/1 4/8/1 30/9/1 +f 50/10/1 25/11/1 24/12/1 +f 53/13/1 48/14/1 15/15/1 +f 1/16/1 45/17/1 35/18/1 +f 37/19/2 42/20/2 10/21/2 +f 33/22/1 17/23/1 56/24/1 +f 8/25/3 4/26/3 14/27/3 +f 42/20/4 1/16/4 10/21/4 +f 41/28/4 14/27/4 4/29/4 +f 46/30/5 35/18/5 45/17/5 +f 13/31/2 39/32/2 40/33/2 +f 28/34/5 30/35/5 8/25/5 +f 48/14/1 29/36/1 26/37/1 +f 14/38/2 47/39/2 8/40/2 +f 18/41/2 34/42/2 38/43/2 +f 11/44/2 18/41/2 36/45/2 +f 16/46/2 51/47/2 19/48/2 +f 1/49/6 37/50/6 10/51/6 +f 43/52/6 41/53/6 42/54/6 +f 45/55/6 44/56/6 3/57/6 +f 12/58/2 22/59/2 9/60/2 +f 27/61/2 6/62/2 5/63/2 +f 52/1/1 21/6/1 20/2/1 +f 49/4/1 24/12/1 23/5/1 +f 30/9/1 3/64/1 44/7/1 +f 44/7/1 41/53/1 4/8/1 +f 50/10/1 26/37/1 25/11/1 +f 53/13/1 55/65/1 48/14/1 +f 1/16/1 2/66/1 45/17/1 +f 37/19/2 46/30/2 42/20/2 +f 33/22/1 53/13/1 17/23/1 +f 8/25/3 30/67/3 4/26/3 +f 42/20/4 2/66/4 1/16/4 +f 41/28/4 43/68/4 14/27/4 +f 46/30/5 37/19/5 35/18/5 +f 13/31/2 38/43/2 39/32/2 +f 8/25/5 47/69/5 28/34/5 +f 28/34/5 3/70/5 30/35/5 +f 48/14/1 31/71/1 29/36/1 +f 14/38/2 43/52/2 47/39/2 +f 18/41/2 32/72/2 34/42/2 +f 11/44/2 7/73/2 18/41/2 +f 16/46/2 40/33/2 51/47/2 +f 1/49/6 35/74/6 37/50/6 +f 42/54/6 46/75/6 43/52/6 +f 46/75/6 28/76/6 47/77/6 +f 43/52/6 46/75/6 47/77/6 +f 41/53/6 44/56/6 2/78/6 +f 44/56/6 45/55/6 2/78/6 +f 41/53/6 2/78/6 42/54/6 +f 3/57/6 28/76/6 45/55/6 +f 28/76/6 46/75/6 45/55/6 +f 12/58/2 19/48/2 22/59/2 +f 27/61/2 11/44/2 6/62/2 +g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube +usemtl particle_cube +f 60/79/2 64/80/2 61/81/2 +f 63/82/5 61/81/5 64/80/5 +f 58/83/4 60/79/4 62/84/4 +f 61/85/3 62/86/3 60/87/3 +f 58/83/1 59/88/1 63/89/1 +f 58/90/6 64/91/6 57/92/6 +f 60/79/2 57/93/2 64/80/2 +f 63/82/5 59/94/5 61/81/5 +f 58/83/4 57/93/4 60/79/4 +f 61/85/3 59/95/3 62/86/3 +f 58/83/1 62/84/1 59/88/1 +f 58/90/6 63/96/6 64/91/6 diff --git a/mods/everness/models/everness_mineral_torch_wall.obj b/mods/everness/models/everness_mineral_torch_wall.obj new file mode 100644 index 00000000..2f9d978d --- /dev/null +++ b/mods/everness/models/everness_mineral_torch_wall.obj @@ -0,0 +1,243 @@ +# Blender v2.83.20 OBJ File: 'everness_mineral_torch.blend' +# www.blender.org +mtllib everness_mineral_torch_wall.mtl +o everness_mineral_torch.vox +v 0.062500 -0.594127 -0.408750 +v 0.062500 -0.281627 0.132516 +v -0.125000 -0.335753 0.163766 +v 0.125000 -0.210753 0.380272 +v 0.062500 -0.040000 0.426025 +v 0.062500 -0.071250 0.371899 +v 0.250000 -0.071250 0.371899 +v -0.125000 0.005753 0.255272 +v 0.062500 -0.321250 -0.061114 +v 0.062500 -0.485873 -0.471250 +v 0.187500 -0.071250 0.371899 +v 0.062500 -0.290000 -0.006987 +v 0.187500 -0.227500 0.101266 +v 0.125000 0.005753 0.255272 +v -0.187500 -0.102500 0.317772 +v 0.125000 -0.258750 0.047139 +v -0.062500 -0.071250 0.371899 +v 0.250000 -0.102500 0.317772 +v 0.125000 -0.290000 -0.006987 +v -0.125000 -0.321250 -0.061114 +v -0.125000 -0.290000 -0.006987 +v 0.125000 -0.321250 -0.061114 +v -0.187500 -0.290000 -0.006987 +v -0.187500 -0.258750 0.047139 +v -0.250000 -0.258750 0.047139 +v -0.250000 -0.227500 0.101266 +v 0.187500 -0.040000 0.426025 +v -0.125000 -0.173373 0.070016 +v -0.312500 -0.227500 0.101266 +v -0.125000 -0.210753 0.380272 +v -0.312500 -0.102500 0.317772 +v 0.312500 -0.102500 0.317772 +v -0.187500 -0.040000 0.426025 +v 0.312500 -0.227500 0.101266 +v -0.062500 -0.594127 -0.408750 +v 0.187500 -0.102500 0.317772 +v -0.062500 -0.485873 -0.471250 +v 0.250000 -0.227500 0.101266 +v 0.250000 -0.258750 0.047139 +v 0.187500 -0.258750 0.047139 +v 0.125000 -0.335753 0.163766 +v 0.062500 -0.173373 0.070016 +v 0.125000 -0.119247 0.038766 +v -0.062500 -0.335753 0.163766 +v -0.062500 -0.281627 0.132516 +v -0.062500 -0.173373 0.070016 +v -0.125000 -0.119247 0.038766 +v -0.250000 -0.102500 0.317772 +v -0.125000 -0.258750 0.047139 +v -0.187500 -0.227500 0.101266 +v 0.187500 -0.290000 -0.006987 +v -0.062500 -0.290000 -0.006987 +v -0.187500 -0.071250 0.371899 +v -0.062500 -0.321250 -0.061114 +v -0.250000 -0.071250 0.371899 +v -0.062500 -0.040000 0.426025 +v 0.187500 -0.088251 -0.051298 +v 0.187500 -0.413011 0.136202 +v -0.187500 -0.225511 0.460961 +v 0.187500 0.099249 0.273461 +v -0.187500 0.099249 0.273461 +v 0.187500 -0.225511 0.460961 +v -0.187500 -0.413011 0.136202 +v -0.187500 -0.088251 -0.051298 +vt 0.250000 0.500000 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.187500 0.562500 +vt 0.125000 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.125000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.625000 +vt 0.187500 0.875000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.437500 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.250000 -0.000000 +vt 0.125000 0.125000 +vt 0.125000 -0.000000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.250000 0.687500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.500000 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.187500 0.625000 +vt 0.062500 0.937500 +vt 0.375000 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.000000 0.875000 +vt 0.625000 0.875000 +vt 0.562500 0.937500 +vt 0.250000 0.125000 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.375000 0.687500 +vt 0.333333 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.666667 -0.000000 +vt 0.166667 -0.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 0.666667 1.000000 +vt 0.666667 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.833333 1.000000 +vt 0.833333 -0.000000 +vt 0.333333 -0.000000 +vt 0.666667 1.000000 +vt 0.833333 1.000000 +vt 1.000000 1.000000 +vn 0.0000 -0.8660 0.5000 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 0.5000 0.8660 +vn 1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.5000 -0.8660 +g everness_mineral_torch.vox_everness_mineral_torch.vox_torch +usemtl torch +s off +f 52/1/1 20/2/1 54/3/1 +f 49/4/1 23/5/1 21/6/1 +f 44/7/1 4/8/1 30/9/1 +f 50/10/1 25/11/1 24/12/1 +f 53/13/1 48/14/1 15/15/1 +f 1/16/1 45/17/1 35/18/1 +f 37/19/2 42/20/2 10/21/2 +f 33/22/1 17/23/1 56/24/1 +f 8/25/3 4/26/3 14/27/3 +f 42/20/4 1/16/4 10/21/4 +f 41/28/4 14/27/4 4/29/4 +f 46/30/5 35/18/5 45/17/5 +f 13/31/2 39/32/2 40/33/2 +f 28/34/5 30/35/5 8/25/5 +f 48/14/1 29/36/1 26/37/1 +f 14/38/2 47/39/2 8/40/2 +f 18/41/2 34/42/2 38/43/2 +f 11/44/2 18/41/2 36/45/2 +f 16/46/2 51/47/2 19/48/2 +f 1/49/6 37/50/6 10/51/6 +f 43/52/6 41/53/6 42/54/6 +f 45/55/6 44/56/6 3/57/6 +f 12/58/2 22/59/2 9/60/2 +f 27/61/2 6/62/2 5/63/2 +f 52/1/1 21/6/1 20/2/1 +f 49/4/1 24/12/1 23/5/1 +f 30/9/1 3/64/1 44/7/1 +f 44/7/1 41/53/1 4/8/1 +f 50/10/1 26/37/1 25/11/1 +f 53/13/1 55/65/1 48/14/1 +f 1/16/1 2/66/1 45/17/1 +f 37/19/2 46/30/2 42/20/2 +f 33/22/1 53/13/1 17/23/1 +f 8/25/3 30/67/3 4/26/3 +f 42/20/4 2/66/4 1/16/4 +f 41/28/4 43/68/4 14/27/4 +f 46/30/5 37/19/5 35/18/5 +f 13/31/2 38/43/2 39/32/2 +f 8/25/5 47/69/5 28/34/5 +f 28/34/5 3/70/5 30/35/5 +f 48/14/1 31/71/1 29/36/1 +f 14/38/2 43/52/2 47/39/2 +f 18/41/2 32/72/2 34/42/2 +f 11/44/2 7/73/2 18/41/2 +f 16/46/2 40/33/2 51/47/2 +f 1/49/6 35/74/6 37/50/6 +f 42/54/6 46/75/6 43/52/6 +f 46/75/6 28/76/6 47/77/6 +f 43/52/6 46/75/6 47/77/6 +f 41/53/6 44/56/6 2/78/6 +f 44/56/6 45/55/6 2/78/6 +f 41/53/6 2/78/6 42/54/6 +f 3/57/6 28/76/6 45/55/6 +f 28/76/6 46/75/6 45/55/6 +f 12/58/2 19/48/2 22/59/2 +f 27/61/2 11/44/2 6/62/2 +g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube +usemtl particle_cube +f 60/79/2 64/80/2 61/81/2 +f 63/82/5 61/81/5 64/80/5 +f 58/83/4 60/79/4 62/84/4 +f 61/85/3 62/86/3 60/87/3 +f 58/83/1 59/88/1 63/89/1 +f 58/90/6 64/91/6 57/92/6 +f 60/79/2 57/93/2 64/80/2 +f 63/82/5 59/94/5 61/81/5 +f 58/83/4 57/93/4 60/79/4 +f 61/85/3 59/95/3 62/86/3 +f 58/83/1 62/84/1 59/88/1 +f 58/90/6 63/96/6 64/91/6 diff --git a/mods/everness/models/everness_skull_with_candle.obj b/mods/everness/models/everness_skull_with_candle.obj new file mode 100644 index 00000000..415343ac --- /dev/null +++ b/mods/everness/models/everness_skull_with_candle.obj @@ -0,0 +1,170 @@ +# Blender v2.83.20 OBJ File: 'everness_skull_with_candle.blend' +# www.blender.org +mtllib scull_with_candle.vox.mtl +o scull_with_candle.vox +v -0.225000 0.026000 0.225000 +v -0.075000 0.026000 0.000000 +v -0.075000 0.026000 0.075000 +v 0.075000 0.551000 -0.075000 +v -0.300000 -0.499000 0.300000 +v 0.225000 -0.424000 0.225000 +v -0.300000 0.101000 -0.300000 +v 0.075000 0.026000 0.075000 +v 0.075000 0.101000 0.075000 +v -0.300000 0.101000 0.300000 +v -0.075000 0.101000 -0.075000 +v -0.300000 -0.499000 -0.300000 +v 0.300000 0.101000 -0.300000 +v -0.075000 0.101000 0.075000 +v -0.075000 0.551000 -0.075000 +v 0.300000 -0.499000 0.300000 +v 0.225000 -0.424000 -0.225000 +v 0.225000 0.026000 -0.225000 +v -0.225000 0.026000 -0.225000 +v 0.075000 0.026000 -0.075000 +v 0.300000 0.101000 0.300000 +v 0.075000 0.551000 0.075000 +v 0.300000 -0.499000 -0.300000 +v -0.075000 0.026000 -0.075000 +v 0.225000 0.026000 0.225000 +v -0.225000 -0.424000 -0.225000 +v -0.225000 -0.424000 0.225000 +v 0.075000 0.101000 -0.075000 +v -0.075000 0.551000 0.075000 +v 0.075000 0.551000 -0.000000 +v -0.075000 0.551000 -0.000000 +v 0.075000 0.701000 -0.000000 +v -0.075000 0.701000 -0.000000 +v -0.000000 0.551000 -0.075000 +v -0.000000 0.701000 -0.075000 +v 0.000000 0.551000 0.075000 +v 0.000000 0.701000 0.075000 +vt 0.866667 0.233333 +vt 0.866667 0.033333 +vt 0.800000 0.033333 +vt 0.800000 0.233333 +vt 0.466667 0.533333 +vt 0.266667 0.533333 +vt 0.333333 0.666667 +vt 0.333333 0.600000 +vt 0.400000 0.600000 +vt 0.400000 0.633333 +vt 0.533333 0.266667 +vt 0.733333 0.266667 +vt 0.733333 0.466667 +vt 0.533333 0.466667 +vt 0.600000 0.733333 +vt 0.600000 0.800000 +vt 0.533333 0.800000 +vt 0.533333 0.733333 +vt 0.000000 0.800000 +vt 0.000000 0.533333 +vt 0.266667 0.533333 +vt 0.266667 0.800000 +vt 0.533333 0.766667 +vt 0.533333 0.966667 +vt 0.466667 0.966667 +vt 0.466667 0.766667 +vt 0.533333 0.266667 +vt 0.266667 0.266667 +vt 0.266667 0.533333 +vt 0.533333 0.533333 +vt 0.466667 0.933333 +vt 0.266667 0.933333 +vt 0.266667 0.733333 +vt 0.466667 0.733333 +vt 0.666667 0.533333 +vt 0.666667 0.733333 +vt 0.866667 0.733333 +vt 0.866667 0.533333 +vt 0.266667 0.733333 +vt 0.466667 0.733333 +vt 0.400000 0.666667 +vt 0.266667 0.266667 +vt 0.266667 0.000000 +vt 0.433333 0.100000 +vt 0.366667 0.100000 +vt 0.366667 0.166667 +vt 0.433333 0.166667 +vt 0.933333 0.566667 +vt 0.866667 0.566667 +vt 0.866667 0.766667 +vt 0.933333 0.766667 +vt 0.533333 0.000000 +vt 0.533333 0.266667 +vt 0.800000 0.266667 +vt 0.800000 0.000000 +vt 0.800000 0.000000 +vt 0.866667 0.000000 +vt 0.000000 0.266667 +vt 0.000000 0.000000 +vt 0.266667 0.000000 +vt 0.266667 0.266667 +vt 0.266667 0.266667 +vt 0.000000 0.266667 +vt 0.000000 0.533333 +vt 0.266667 0.533333 +vt 0.933333 0.033333 +vt 0.933333 0.233333 +vt 0.866667 0.233333 +vt 0.866667 0.033333 +vt 0.933333 0.533333 +vt 0.866667 0.533333 +vt 0.533333 0.000000 +vt 0.533333 0.266667 +vt 0.933333 0.000000 +vt 0.900000 0.000000 +vt 0.866667 0.000000 +vt 0.533333 0.733333 +vt 0.466667 0.733333 +vt 0.733333 0.466667 +vt 0.933333 0.466667 +vt 0.933333 0.266667 +vt 0.733333 0.266667 +vt 0.466667 0.733333 +vt 0.466667 0.533333 +vt 0.666667 0.533333 +vt 0.666667 0.733333 +vt 0.866667 0.733333 +vt 0.866667 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.733333 +vt 0.866667 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.733333 +vt 0.866667 0.733333 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +usemtl scull_with_candle.vox_Material +s off +f 29/1/1 14/2/1 9/3/1 22/4/1 +f 19/5/2 18/6/2 8/7/2 20/8/2 24/9/2 2/10/2 +f 17/11/3 26/12/3 27/13/3 6/14/3 +f 15/15/3 29/16/3 22/17/3 4/18/3 +f 13/19/4 23/20/4 12/21/4 7/22/4 +f 11/23/4 15/24/4 4/25/4 28/26/4 +f 12/27/2 23/28/2 16/29/2 5/30/2 +f 25/31/5 18/32/5 17/33/5 6/34/5 +f 26/35/6 19/36/6 1/37/6 27/38/6 +f 25/39/2 1/40/2 19/5/2 2/10/2 3/41/2 8/7/2 18/6/2 +f 21/42/3 13/43/3 11/44/3 28/45/3 9/46/3 14/47/3 +f 9/48/6 28/49/6 4/50/6 22/51/6 +f 28/45/2 9/46/2 14/47/2 11/44/2 +f 16/52/1 21/53/1 10/54/1 5/55/1 +f 14/2/4 9/3/4 8/56/4 3/57/4 +f 7/58/5 12/59/5 5/60/5 10/61/5 +f 16/62/6 23/63/6 13/64/6 21/65/6 +f 14/66/5 29/67/5 15/68/5 11/69/5 +f 8/70/5 9/48/5 28/49/5 20/71/5 +f 7/72/3 10/73/3 21/42/3 14/47/3 11/44/3 13/43/3 +f 11/69/6 14/66/6 3/74/6 2/75/6 24/76/6 +f 28/26/1 11/23/1 24/77/1 20/78/1 +f 18/79/1 19/80/1 26/81/1 17/82/1 +f 25/83/4 6/84/4 27/85/4 1/86/4 +usemtl candle_fire.001 +f 31/87/4 33/88/4 32/89/4 30/90/4 +f 35/91/6 37/92/6 36/93/6 34/94/6 diff --git a/mods/everness/models/everness_venus_trap.obj b/mods/everness/models/everness_venus_trap.obj new file mode 100644 index 00000000..0701327e --- /dev/null +++ b/mods/everness/models/everness_venus_trap.obj @@ -0,0 +1,149 @@ +# Blender v2.83.20 OBJ File: 'everness_venus_trap.blend' +# www.blender.org +mtllib everness_venus_trap.mtl +o Plane +v -0.625000 -0.499000 0.625000 +v 0.625000 -0.499000 0.625000 +v -0.625000 -0.499000 -0.625000 +v 0.625000 -0.499000 -0.625000 +v 0.000000 -0.499000 0.000000 +v -0.625000 -0.405250 0.000000 +v 0.000000 -0.405250 0.625000 +v 0.625000 -0.405250 0.000000 +v 0.000000 -0.405250 -0.625000 +vt 0.875000 0.125000 +vt 0.875000 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.125000 +vt 0.875000 0.500000 +vt 0.687500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.312500 +vt 0.500000 0.125000 +vn -0.1467 0.9782 0.1467 +vn 0.1467 0.9782 -0.1467 +vn -0.1467 0.9782 -0.1467 +vn 0.1467 0.9782 0.1467 +usemtl flower +s off +f 2/1/1 8/2/1 5/3/1 +f 7/4/2 2/1/2 5/3/2 +f 8/2/3 4/5/3 5/3/3 +f 9/6/1 3/7/1 5/3/1 +f 6/8/4 1/9/4 5/3/4 +f 3/7/2 6/8/2 5/3/2 +f 4/5/4 9/6/4 5/3/4 +f 1/9/3 7/4/3 5/3/3 +o Cube_Cube.001 +v 0.071372 -0.499000 0.442448 +v -0.214282 0.200707 0.728103 +v -0.442448 -0.499000 -0.071372 +v -0.728103 0.200707 0.214282 +v -0.674071 0.244824 0.160250 +v -0.542565 0.352199 0.028744 +v -0.160250 0.244824 0.674071 +v -0.028744 0.352199 0.542565 +v 0.125404 -0.454883 0.388416 +v -0.388416 -0.454883 -0.125404 +v -0.071372 -0.499000 -0.442448 +v 0.214282 0.200707 -0.728103 +v 0.442448 -0.499000 0.071372 +v 0.728103 0.200707 -0.214282 +v 0.674071 0.244824 -0.160250 +v 0.542565 0.352199 -0.028744 +v -0.256910 -0.347509 -0.256910 +v 0.388416 -0.454883 0.125404 +v 0.028744 0.352199 -0.542565 +v 0.256910 -0.347509 0.256910 +v 0.160250 0.244824 -0.674070 +v -0.125404 -0.454883 -0.388416 +vt 0.265625 0.187500 +vt 0.265625 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.375000 0.687500 +vt 0.375000 1.000000 +vt 0.281250 1.000000 +vt 0.281250 0.687500 +vt 0.000000 0.890625 +vt 0.000000 0.968750 +vt 0.250000 0.968750 +vt 0.250000 0.890625 +vt 0.250000 1.000000 +vt 0.250000 0.687500 +vt 0.000000 1.000000 +vt 0.281250 1.000000 +vt 0.281250 0.687500 +vt 0.375000 0.687500 +vt 0.375000 1.000000 +vt 0.765625 0.687500 +vt 0.765625 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.687500 +vt 0.000000 0.890625 +vt 0.000000 0.859375 +vt 0.250000 0.859375 +vt 0.250000 0.890625 +vt 0.250000 1.000000 +vt 0.250000 0.687500 +vt 0.000000 0.781250 +vt 0.250000 0.781250 +vt -0.000000 0.500000 +vt -0.000000 0.187500 +vt 0.265625 0.187500 +vt 0.265625 0.500000 +vt 0.375000 0.687500 +vt 0.281250 0.687500 +vt 0.281250 1.000000 +vt 0.250000 0.890625 +vt 0.250000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.890625 +vt 0.250000 0.687500 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.281250 0.687500 +vt 0.281250 1.000000 +vt 0.375000 1.000000 +vt 0.765625 0.687500 +vt 0.765625 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.687500 +vt 0.000000 0.890625 +vt 0.000000 0.859375 +vt 0.250000 0.859375 +vt 0.250000 0.890625 +vt 0.250000 0.687500 +vt 0.000000 0.781250 +vt 0.250000 0.781250 +vn -0.6124 -0.5000 0.6124 +vn 0.7071 0.0000 0.7071 +vn -0.3536 0.8660 0.3536 +vn -0.7071 0.0000 -0.7071 +vn 0.3536 -0.8660 -0.3536 +vn 0.6124 -0.5000 -0.6124 +vn 0.3536 0.8660 -0.3536 +vn -0.3536 -0.8660 0.3536 +usemtl flower +s off +f 10/10/5 11/11/5 13/12/5 12/13/5 +f 29/14/6 17/15/6 16/16/6 18/17/6 +f 15/18/7 14/19/7 16/20/7 17/21/7 +f 18/17/6 16/16/6 11/22/6 10/23/6 +f 14/19/7 13/24/7 11/22/7 16/20/7 +f 19/25/8 14/26/8 15/27/8 26/28/8 +f 18/29/5 16/30/5 14/31/5 19/32/5 +f 12/33/9 19/34/9 18/35/9 10/36/9 +f 12/37/8 13/38/8 14/26/8 19/25/8 +f 19/34/9 26/39/9 29/40/9 18/35/9 +f 20/41/10 21/42/10 23/43/10 22/44/10 +f 26/28/8 28/45/8 30/46/8 31/47/8 +f 25/48/11 24/49/11 30/50/11 28/51/11 +f 31/47/8 30/46/8 21/52/8 20/53/8 +f 24/49/11 23/54/11 21/55/11 30/50/11 +f 27/56/6 24/57/6 25/58/6 29/14/6 +f 31/59/10 30/60/10 24/61/10 27/62/10 +f 22/63/12 27/64/12 31/65/12 20/66/12 +f 22/67/6 23/54/6 24/57/6 27/56/6 +f 27/64/12 29/68/12 26/69/12 31/65/12 diff --git a/mods/everness/models/everness_vine_wall.obj b/mods/everness/models/everness_vine_wall.obj new file mode 100644 index 00000000..a099a6a3 --- /dev/null +++ b/mods/everness/models/everness_vine_wall.obj @@ -0,0 +1,109 @@ +# Blender v2.83.20 OBJ File: 'everness_better_vine_1.blend' +# www.blender.org +mtllib everness_vine_wall.mtl +o Plane +v 0.470000 -0.490000 -0.470000 +v -0.470000 -0.490000 -0.470000 +v 0.470000 -0.490000 0.470000 +v -0.470000 -0.490000 0.470000 +v -0.752156 -0.490000 0.461451 +v 0.751842 -0.492615 0.461221 +v -0.751842 -0.272978 0.044555 +v 0.752156 -0.275593 0.044326 +v 0.752156 -0.275593 -0.073174 +v -0.751842 -0.272978 -0.072945 +v 0.751842 -0.492615 0.343721 +v -0.752156 -0.490000 0.343951 +v -0.752156 -0.490000 0.226451 +v 0.751842 -0.492615 0.226221 +v -0.751842 -0.272978 -0.190445 +v 0.752156 -0.275593 -0.190674 +v 0.752156 -0.275593 -0.308174 +v -0.751842 -0.272978 -0.307945 +v 0.751842 -0.492615 0.108721 +v -0.752156 -0.490000 0.108951 +v -0.752156 -0.490000 -0.008549 +v 0.751842 -0.492615 -0.008779 +v -0.751842 -0.272978 -0.425445 +v 0.752156 -0.275593 -0.425674 +v 0.752156 -0.275593 -0.543174 +v -0.751842 -0.272978 -0.542945 +v 0.751842 -0.492615 -0.126279 +v -0.752156 -0.490000 -0.126049 +v -0.752156 -0.490000 -0.243549 +v 0.751842 -0.492615 -0.243779 +v -0.751842 -0.272978 -0.660445 +v 0.752156 -0.275593 -0.660674 +v 0.752156 -0.275593 -0.778174 +v -0.751842 -0.272978 -0.777945 +v 0.751842 -0.492615 -0.361279 +v -0.752156 -0.490000 -0.361050 +v 0.752149 -0.315254 -0.905760 +v -0.751849 -0.312629 -0.905760 +v 0.751848 -0.487510 -0.468464 +v -0.752149 -0.484885 -0.468463 +vt -0.000000 0.727273 +vt 1.000000 0.818182 +vt -0.000000 0.818182 +vt 1.000000 0.636364 +vt 0.000000 0.727273 +vt 0.000000 0.636364 +vt 1.000000 0.545455 +vt 0.000000 0.636364 +vt 0.000000 0.545455 +vt 1.000000 0.454546 +vt 0.000000 0.545455 +vt 0.000000 0.454546 +vt 0.000000 0.363636 +vt 1.000000 0.454546 +vt 0.000000 0.454546 +vt 0.000000 0.272727 +vt 1.000000 0.363636 +vt 0.000000 0.363636 +vt 1.000000 0.181818 +vt 0.000000 0.272727 +vt 0.000000 0.181818 +vt 1.000000 0.090909 +vt 0.000000 0.181818 +vt 0.000000 0.090909 +vt 0.000000 -0.000000 +vt 1.000000 0.090909 +vt 0.000000 0.090909 +vt 0.166667 0.818182 +vt 0.833333 1.000000 +vt 0.833333 0.818182 +vt 1.000000 0.727273 +vt 1.000000 0.727273 +vt 1.000000 0.636364 +vt 1.000000 0.545455 +vt 1.000000 0.363636 +vt 1.000000 0.272727 +vt 1.000000 0.272727 +vt 1.000000 0.181818 +vt 1.000000 0.000000 +vt 0.166667 1.000000 +vn 0.0016 0.8870 0.4617 +vn 0.0016 0.9304 0.3665 +vn 0.0000 1.0000 -0.0000 +usemtl leaves +s off +f 8/1/1 5/2/1 6/3/1 +f 10/4/1 11/5/1 9/6/1 +f 15/7/1 14/8/1 16/9/1 +f 18/10/1 19/11/1 17/12/1 +f 24/13/1 21/14/1 22/15/1 +f 25/16/1 28/17/1 27/18/1 +f 31/19/1 30/20/1 32/21/1 +f 34/22/1 35/23/1 33/24/1 +f 37/25/2 40/26/2 39/27/2 +f 3/28/3 2/29/3 4/30/3 +f 8/1/1 7/31/1 5/2/1 +f 10/4/1 12/32/1 11/5/1 +f 15/7/1 13/33/1 14/8/1 +f 18/10/1 20/34/1 19/11/1 +f 24/13/1 23/35/1 21/14/1 +f 25/16/1 26/36/1 28/17/1 +f 31/19/1 29/37/1 30/20/1 +f 34/22/1 36/38/1 35/23/1 +f 37/25/2 38/39/2 40/26/2 +f 3/28/3 1/40/3 2/29/3 diff --git a/mods/everness/models/everness_water_geyser.obj b/mods/everness/models/everness_water_geyser.obj new file mode 100644 index 00000000..e927d598 --- /dev/null +++ b/mods/everness/models/everness_water_geyser.obj @@ -0,0 +1,4924 @@ +# Blender v2.83.20 OBJ File: 'everness_water_geyser.blend' +# www.blender.org +mtllib everness_water_geyser.mtl +o everness_water_geyser.vox +v -0.062500 -0.499000 0.500000 +v 0.375000 -0.436500 0.437500 +v 0.312500 -0.436500 0.062500 +v -0.500000 -0.499000 0.000000 +v 0.250000 -0.499000 -0.187500 +v 0.312500 -0.436500 -0.312500 +v 0.437500 -0.436500 0.437500 +v -0.125000 -0.436500 0.312500 +v -0.125000 -0.436500 0.250000 +v 0.375000 -0.436500 0.250000 +v -0.187500 -0.436500 0.250000 +v -0.187500 -0.436500 0.187500 +v -0.437500 -0.374000 0.187500 +v 0.437500 -0.374000 0.187500 +v -0.312500 -0.374000 0.125000 +v -0.437500 -0.436500 0.000000 +v -0.312500 -0.374000 0.000000 +v 0.437500 -0.436500 -0.187500 +v -0.312500 -0.436500 -0.250000 +v -0.250000 -0.436500 -0.312500 +v 0.437500 -0.436500 -0.250000 +v -0.437500 -0.311500 0.500000 +v 0.187500 -0.311500 0.437500 +v -0.500000 -0.311500 0.375000 +v 0.187500 -0.374000 0.312500 +v 0.437500 -0.374000 0.375000 +v -0.125000 -0.374000 0.312500 +v 0.312500 -0.311500 0.187500 +v -0.437500 -0.311500 0.187500 +v -0.250000 -0.311500 0.125000 +v 0.250000 -0.311500 0.062500 +v 0.375000 -0.311500 -0.187500 +v 0.312500 -0.311500 -0.312500 +v 0.312500 -0.311500 -0.375000 +v -0.062500 -0.249000 0.500000 +v 0.062500 -0.311500 0.375000 +v -0.062500 -0.249000 0.312500 +v 0.125000 -0.249000 0.312500 +v 0.375000 -0.311500 0.312500 +v -0.187500 -0.311500 0.187500 +v 0.250000 -0.249000 0.187500 +v -0.312500 -0.311500 0.125000 +v -0.312500 -0.311500 0.000000 +v -0.500000 -0.249000 0.000000 +v -0.250000 -0.249000 0.000000 +v -0.312500 -0.249000 -0.187500 +v -0.437500 -0.311500 -0.312500 +v 0.250000 -0.249000 -0.312500 +v -0.062500 -0.311500 -0.375000 +v -0.125000 -0.186500 0.375000 +v 0.375000 -0.186500 0.312500 +v 0.062500 -0.249000 0.187500 +v 0.312500 -0.249000 0.187500 +v 0.312500 -0.186500 0.062500 +v -0.187500 -0.249000 0.000000 +v 0.312500 -0.249000 0.062500 +v -0.375000 -0.249000 -0.062500 +v 0.312500 -0.249000 -0.062500 +v -0.437500 -0.249000 -0.187500 +v -0.437500 -0.249000 -0.250000 +v -0.062500 -0.249000 -0.187500 +v -0.250000 -0.186500 -0.375000 +v 0.125000 -0.249000 -0.375000 +v -0.187500 -0.124000 0.187500 +v -0.187500 -0.186500 0.125000 +v 0.187500 -0.124000 0.062500 +v -0.375000 -0.124000 0.000000 +v -0.375000 -0.124000 -0.187500 +v -0.375000 -0.186500 -0.187500 +v -0.437500 -0.124000 -0.187500 +v -0.250000 -0.124000 -0.437500 +v 0.125000 -0.124000 -0.375000 +v -0.125000 -0.061500 0.437500 +v -0.125000 -0.061500 0.375000 +v -0.125000 -0.061500 0.250000 +v -0.125000 -0.061500 0.187500 +v -0.375000 -0.061500 0.125000 +v -0.125000 -0.124000 0.125000 +v 0.250000 -0.061500 0.187500 +v 0.125000 -0.124000 0.062500 +v -0.312500 -0.124000 0.000000 +v 0.250000 -0.061500 -0.125000 +v 0.125000 -0.061500 -0.187500 +v 0.312500 -0.124000 -0.250000 +v -0.062500 -0.124000 -0.312500 +v 0.125000 -0.061500 -0.312500 +v 0.062500 -0.061500 0.250000 +v -0.125000 -0.061500 -0.062500 +v -0.062500 -0.061500 -0.187500 +v 0.125000 0.001000 -0.187500 +v -0.312500 0.001000 -0.312500 +v 0.125000 0.001000 0.250000 +v -0.125000 0.063500 0.125000 +v -0.062500 0.063500 0.062500 +v -0.187500 0.001000 0.000000 +v 0.187500 0.063500 0.062500 +v -0.187500 0.063500 0.000000 +v -0.250000 0.001000 -0.062500 +v 0.000000 0.001000 -0.125000 +v -0.250000 0.001000 -0.187500 +v -0.250000 0.063500 -0.250000 +v -0.250000 0.001000 -0.250000 +v -0.062500 0.126000 0.375000 +v -0.062500 0.126000 0.312500 +v -0.062500 0.063500 0.312500 +v -0.250000 0.126000 0.312500 +v 0.125000 0.126000 0.187500 +v 0.062500 0.063500 0.000000 +v 0.000000 0.063500 -0.187500 +v -0.187500 0.126000 0.250000 +v 0.062500 0.188500 0.187500 +v -0.062500 0.188500 0.062500 +v 0.000000 0.188500 -0.062500 +v 0.187500 0.188500 -0.125000 +v 0.000000 0.251000 0.125000 +v -0.187500 0.251000 0.062500 +v -0.125000 0.188500 0.000000 +v 0.125000 0.188500 0.062500 +v 0.125000 0.251000 0.000000 +v 0.187500 0.251000 0.000000 +v 0.187500 0.251000 -0.062500 +v 0.187500 0.188500 -0.062500 +v 0.125000 0.188500 -0.062500 +v 0.125000 0.251000 -0.062500 +v -0.062500 0.251000 0.062500 +v 0.062500 0.251000 0.062500 +v 0.000000 0.251000 -0.062500 +v 0.062500 0.376000 0.000000 +v 0.062500 0.376000 -0.062500 +v 0.000000 0.376000 -0.062500 +v 0.000000 0.376000 -0.187500 +v 0.187500 -0.436500 0.437500 +v 0.437500 -0.436500 0.312500 +v -0.125000 -0.499000 0.125000 +v 0.500000 -0.499000 -0.187500 +v 0.125000 -0.499000 -0.250000 +v 0.125000 -0.436500 -0.312500 +v 0.500000 -0.499000 -0.250000 +v -0.062500 -0.436500 0.375000 +v -0.062500 -0.374000 0.375000 +v -0.437500 -0.374000 0.375000 +v -0.375000 -0.436500 0.187500 +v -0.375000 -0.436500 0.000000 +v 0.312500 -0.436500 -0.125000 +v 0.375000 -0.436500 -0.250000 +v -0.437500 -0.436500 -0.312500 +v 0.312500 -0.374000 -0.375000 +v 0.312500 -0.374000 -0.312500 +v -0.437500 -0.436500 -0.437500 +v -0.125000 -0.436500 -0.437500 +v -0.375000 -0.374000 0.375000 +v 0.250000 -0.374000 0.375000 +v 0.250000 -0.374000 0.312500 +v -0.375000 -0.374000 0.125000 +v 0.500000 -0.311500 0.062500 +v -0.250000 -0.311500 0.000000 +v -0.437500 -0.311500 -0.187500 +v 0.375000 -0.311500 -0.125000 +v 0.500000 -0.311500 -0.250000 +v -0.312500 -0.374000 -0.437500 +v 0.187500 -0.249000 0.375000 +v 0.000000 -0.311500 0.312500 +v 0.187500 -0.249000 0.312500 +v 0.250000 -0.311500 0.250000 +v -0.125000 -0.311500 0.125000 +v 0.250000 -0.249000 0.062500 +v 0.250000 -0.249000 -0.125000 +v -0.375000 -0.311500 -0.312500 +v 0.375000 -0.311500 -0.250000 +v -0.125000 -0.249000 -0.437500 +v 0.125000 -0.311500 -0.437500 +v 0.125000 -0.249000 -0.500000 +v 0.250000 -0.186500 0.000000 +v 0.375000 -0.249000 0.000000 +v -0.312500 -0.249000 -0.062500 +v -0.312500 -0.186500 -0.125000 +v -0.375000 -0.249000 -0.187500 +v -0.375000 -0.249000 -0.250000 +v -0.125000 -0.186500 0.312500 +v 0.187500 -0.186500 0.250000 +v 0.187500 -0.124000 0.250000 +v 0.250000 -0.124000 0.187500 +v 0.375000 -0.186500 0.187500 +v 0.250000 -0.186500 0.062500 +v 0.375000 -0.124000 0.000000 +v -0.062500 -0.186500 -0.062500 +v 0.312500 -0.124000 0.000000 +v 0.250000 -0.124000 -0.125000 +v -0.250000 -0.124000 -0.187500 +v -0.062500 -0.186500 -0.187500 +v -0.062500 -0.124000 -0.125000 +v 0.187500 -0.124000 -0.125000 +v -0.062500 -0.124000 -0.250000 +v -0.062500 -0.124000 -0.437500 +v 0.312500 -0.124000 -0.437500 +v 0.062500 -0.061500 0.375000 +v 0.062500 -0.061500 0.437500 +v -0.250000 -0.061500 0.312500 +v -0.250000 -0.061500 0.187500 +v 0.187500 -0.124000 0.187500 +v 0.250000 -0.124000 0.000000 +v -0.062500 -0.124000 -0.062500 +v -0.062500 -0.061500 -0.125000 +v 0.375000 -0.061500 -0.312500 +v -0.187500 -0.061500 0.187500 +v -0.062500 -0.061500 0.187500 +v 0.187500 -0.061500 0.187500 +v -0.187500 0.001000 -0.062500 +v -0.062500 0.001000 -0.125000 +v 0.125000 -0.061500 -0.125000 +v -0.062500 -0.061500 -0.250000 +v -0.062500 0.001000 -0.187500 +v 0.250000 0.063500 0.000000 +v -0.125000 0.063500 -0.062500 +v -0.187500 0.063500 -0.062500 +v 0.125000 0.001000 -0.125000 +v -0.187500 0.001000 -0.125000 +v -0.187500 0.001000 -0.187500 +v -0.187500 0.063500 -0.187500 +v 0.062500 0.001000 -0.125000 +v 0.187500 0.063500 0.000000 +v 0.125000 0.063500 0.000000 +v 0.125000 0.126000 -0.062500 +v 0.312500 0.126000 -0.062500 +v 0.062500 0.126000 -0.187500 +v 0.062500 0.126000 -0.125000 +v -0.125000 0.188500 0.125000 +v 0.062500 0.126000 0.125000 +v 0.062500 0.188500 0.125000 +v 0.187500 0.188500 0.062500 +v 0.000000 0.188500 -0.125000 +v 0.000000 0.251000 0.187500 +v 0.000000 0.251000 0.250000 +v -0.125000 0.188500 -0.062500 +v 0.062500 0.251000 -0.125000 +v 0.000000 0.251000 -0.187500 +v 0.062500 0.251000 0.125000 +v 0.125000 0.251000 -0.125000 +v 0.062500 0.376000 0.187500 +v 0.000000 0.376000 0.062500 +v 0.187500 0.376000 -0.062500 +v -0.437500 -0.499000 0.500000 +v -0.250000 -0.499000 0.500000 +v -0.062500 -0.499000 0.437500 +v -0.062500 -0.436500 0.437500 +v 0.187500 -0.499000 0.437500 +v -0.437500 -0.499000 0.375000 +v -0.500000 -0.499000 -0.312500 +v -0.250000 -0.436500 0.437500 +v 0.437500 -0.436500 0.250000 +v -0.375000 -0.374000 0.187500 +v -0.375000 -0.436500 -0.250000 +v -0.312500 -0.436500 -0.375000 +v -0.125000 -0.436500 -0.375000 +v 0.437500 -0.436500 -0.375000 +v -0.312500 -0.436500 -0.437500 +v 0.375000 -0.311500 0.500000 +v -0.062500 -0.311500 0.437500 +v -0.062500 -0.374000 0.312500 +v 0.437500 -0.311500 0.312500 +v 0.500000 -0.311500 0.250000 +v -0.250000 -0.311500 0.187500 +v 0.375000 -0.374000 0.187500 +v 0.437500 -0.311500 0.187500 +v 0.312500 -0.311500 -0.125000 +v 0.437500 -0.311500 -0.250000 +v -0.312500 -0.374000 -0.375000 +v -0.062500 -0.311500 -0.437500 +v 0.312500 -0.311500 -0.437500 +v 0.312500 -0.249000 0.250000 +v 0.250000 -0.249000 0.250000 +v 0.187500 -0.311500 0.187500 +v 0.187500 -0.249000 0.187500 +v -0.187500 -0.249000 0.125000 +v 0.375000 -0.311500 0.062500 +v 0.500000 -0.249000 0.062500 +v -0.375000 -0.249000 0.000000 +v 0.312500 -0.249000 -0.187500 +v -0.062500 -0.249000 -0.250000 +v 0.125000 -0.311500 -0.250000 +v 0.125000 -0.311500 -0.375000 +v -0.125000 -0.249000 0.437500 +v -0.062500 -0.249000 0.437500 +v 0.000000 -0.249000 0.437500 +v -0.125000 -0.249000 0.375000 +v 0.062500 -0.249000 0.375000 +v 0.250000 -0.249000 0.375000 +v -0.062500 -0.186500 0.312500 +v 0.312500 -0.186500 0.187500 +v -0.250000 -0.249000 0.125000 +v -0.250000 -0.186500 0.000000 +v 0.125000 -0.249000 -0.187500 +v -0.312500 -0.186500 -0.312500 +v -0.375000 -0.186500 -0.312500 +v 0.312500 -0.249000 -0.312500 +v 0.250000 -0.186500 -0.312500 +v -0.125000 -0.249000 -0.375000 +v 0.125000 -0.186500 -0.375000 +v 0.250000 -0.186500 -0.375000 +v 0.437500 -0.124000 0.375000 +v 0.062500 -0.124000 0.250000 +v 0.250000 -0.186500 0.187500 +v -0.250000 -0.186500 0.125000 +v -0.125000 -0.186500 0.125000 +v -0.062500 -0.186500 0.125000 +v -0.250000 -0.186500 -0.062500 +v 0.250000 -0.124000 -0.062500 +v -0.062500 -0.186500 -0.125000 +v -0.250000 -0.186500 -0.312500 +v 0.000000 -0.124000 -0.312500 +v 0.125000 -0.186500 -0.312500 +v -0.062500 -0.061500 0.250000 +v 0.125000 -0.061500 0.250000 +v 0.250000 -0.124000 0.250000 +v 0.187500 -0.061500 0.062500 +v -0.187500 -0.061500 -0.062500 +v 0.312500 -0.061500 -0.062500 +v 0.187500 -0.061500 -0.125000 +v -0.187500 -0.124000 -0.250000 +v 0.062500 0.001000 0.250000 +v 0.125000 0.001000 0.062500 +v 0.062500 0.001000 0.062500 +v -0.187500 -0.061500 -0.125000 +v -0.250000 0.001000 -0.125000 +v 0.062500 -0.061500 -0.125000 +v -0.125000 -0.061500 -0.187500 +v 0.187500 -0.061500 -0.187500 +v 0.250000 0.063500 0.250000 +v 0.312500 0.063500 0.250000 +v -0.125000 0.063500 0.187500 +v 0.125000 0.001000 0.187500 +v -0.062500 0.063500 0.125000 +v -0.125000 0.001000 0.062500 +v -0.062500 0.001000 0.062500 +v 0.187500 0.001000 0.062500 +v 0.250000 0.063500 0.062500 +v -0.062500 0.063500 0.187500 +v 0.000000 0.063500 0.187500 +v -0.125000 0.126000 0.125000 +v -0.125000 0.063500 0.000000 +v -0.062500 0.063500 0.000000 +v -0.062500 0.063500 -0.125000 +v -0.062500 0.126000 -0.125000 +v 0.250000 0.126000 -0.187500 +v 0.125000 0.126000 0.250000 +v -0.062500 0.126000 0.125000 +v 0.000000 0.126000 0.125000 +v 0.062500 0.126000 -0.062500 +v -0.125000 0.188500 -0.125000 +v 0.125000 0.188500 -0.125000 +v -0.187500 0.251000 0.250000 +v 0.062500 0.251000 0.250000 +v -0.062500 0.188500 0.125000 +v 0.250000 0.251000 0.000000 +v 0.062500 0.251000 -0.062500 +v -0.125000 0.251000 0.062500 +v 0.125000 0.251000 0.062500 +v -0.062500 0.376000 0.062500 +v -0.125000 0.376000 0.062500 +v 0.187500 0.376000 0.062500 +v 0.500000 -0.499000 0.312500 +v -0.500000 -0.499000 0.187500 +v -0.250000 -0.436500 0.125000 +v 0.375000 -0.436500 -0.187500 +v 0.500000 -0.499000 -0.437500 +v -0.500000 -0.499000 -0.500000 +v -0.125000 -0.499000 -0.500000 +v -0.250000 -0.374000 0.437500 +v 0.437500 -0.374000 0.437500 +v -0.437500 -0.436500 0.375000 +v -0.375000 -0.436500 0.375000 +v -0.250000 -0.374000 0.375000 +v 0.187500 -0.374000 0.375000 +v 0.375000 -0.374000 0.375000 +v 0.375000 -0.436500 0.375000 +v 0.375000 -0.374000 0.062500 +v -0.250000 -0.436500 -0.250000 +v 0.375000 -0.436500 -0.312500 +v 0.000000 -0.311500 0.437500 +v 0.062500 -0.311500 0.437500 +v -0.125000 -0.311500 0.375000 +v 0.500000 -0.311500 0.312500 +v 0.437500 -0.311500 0.250000 +v -0.187500 -0.311500 0.125000 +v -0.375000 -0.374000 0.000000 +v -0.250000 -0.311500 -0.312500 +v -0.250000 -0.311500 -0.437500 +v 0.500000 -0.311500 -0.437500 +v -0.500000 -0.311500 -0.500000 +v 0.125000 -0.311500 -0.500000 +v 0.125000 -0.249000 0.375000 +v -0.125000 -0.249000 0.312500 +v -0.125000 -0.311500 0.312500 +v 0.062500 -0.249000 0.250000 +v 0.312500 -0.311500 -0.062500 +v 0.375000 -0.249000 -0.062500 +v -0.375000 -0.311500 -0.187500 +v -0.187500 -0.311500 -0.187500 +v 0.437500 -0.311500 -0.187500 +v -0.500000 -0.249000 -0.250000 +v 0.125000 -0.311500 -0.312500 +v 0.125000 -0.249000 -0.312500 +v 0.250000 -0.311500 -0.312500 +v 0.000000 -0.249000 0.375000 +v 0.062500 -0.249000 0.312500 +v 0.250000 -0.186500 0.312500 +v -0.250000 -0.186500 -0.250000 +v -0.062500 -0.186500 -0.250000 +v -0.062500 -0.186500 -0.375000 +v -0.062500 -0.249000 -0.437500 +v 0.125000 -0.249000 -0.437500 +v -0.125000 -0.124000 0.312500 +v 0.250000 -0.124000 0.312500 +v -0.125000 -0.124000 0.250000 +v 0.312500 -0.186500 0.250000 +v 0.125000 -0.124000 0.187500 +v 0.187500 -0.186500 0.187500 +v 0.437500 -0.124000 0.187500 +v -0.312500 -0.124000 0.125000 +v -0.187500 -0.124000 0.000000 +v 0.312500 -0.124000 -0.062500 +v 0.125000 -0.124000 -0.250000 +v -0.437500 -0.124000 -0.375000 +v -0.062500 -0.124000 0.375000 +v 0.062500 -0.124000 0.312500 +v 0.125000 -0.124000 0.312500 +v -0.062500 -0.124000 0.187500 +v 0.062500 -0.124000 0.187500 +v -0.062500 -0.124000 0.125000 +v 0.312500 -0.124000 0.062500 +v 0.125000 -0.124000 -0.062500 +v 0.125000 -0.061500 -0.062500 +v -0.125000 -0.061500 -0.125000 +v -0.125000 -0.124000 -0.125000 +v 0.062500 -0.124000 -0.125000 +v 0.125000 -0.061500 -0.250000 +v 0.312500 -0.124000 -0.312500 +v 0.125000 -0.061500 -0.375000 +v 0.062500 -0.061500 0.312500 +v 0.062500 0.001000 0.187500 +v 0.125000 -0.061500 0.187500 +v -0.250000 -0.061500 0.125000 +v -0.125000 0.001000 0.000000 +v -0.062500 0.001000 -0.062500 +v 0.000000 0.001000 -0.187500 +v -0.062500 -0.061500 -0.312500 +v 0.187500 0.001000 0.187500 +v 0.312500 0.063500 0.062500 +v -0.062500 0.001000 0.000000 +v -0.062500 0.063500 -0.250000 +v 0.062500 0.063500 0.250000 +v 0.062500 0.126000 0.250000 +v 0.187500 0.063500 0.187500 +v -0.250000 0.126000 0.125000 +v -0.187500 0.126000 0.125000 +v 0.062500 0.063500 0.062500 +v 0.187500 0.126000 -0.062500 +v 0.250000 0.126000 -0.062500 +v -0.125000 0.126000 0.187500 +v -0.125000 0.188500 0.187500 +v 0.187500 0.188500 0.187500 +v -0.062500 0.188500 -0.062500 +v -0.062500 0.126000 -0.187500 +v 0.187500 0.251000 0.062500 +v 0.250000 0.251000 0.062500 +v -0.125000 0.251000 0.000000 +v -0.187500 0.251000 -0.187500 +v 0.125000 0.251000 -0.187500 +v 0.187500 -0.499000 0.500000 +v 0.375000 -0.499000 0.500000 +v 0.375000 -0.499000 0.437500 +v 0.500000 -0.499000 0.500000 +v -0.375000 -0.499000 0.375000 +v -0.250000 -0.499000 0.437500 +v -0.500000 -0.499000 0.375000 +v 0.312500 -0.499000 0.250000 +v 0.437500 -0.499000 0.312500 +v -0.437500 -0.499000 0.187500 +v -0.375000 -0.499000 0.250000 +v -0.125000 -0.499000 0.250000 +v 0.437500 -0.499000 0.250000 +v 0.500000 -0.499000 0.250000 +v -0.250000 -0.499000 0.125000 +v 0.250000 -0.499000 0.062500 +v 0.312500 -0.499000 0.062500 +v -0.437500 -0.499000 0.000000 +v 0.375000 -0.499000 -0.187500 +v -0.500000 -0.499000 -0.250000 +v -0.437500 -0.499000 -0.250000 +v 0.437500 -0.499000 -0.187500 +v -0.437500 -0.499000 -0.312500 +v -0.250000 -0.499000 -0.250000 +v 0.125000 -0.499000 -0.312500 +v 0.312500 -0.499000 -0.250000 +v 0.375000 -0.499000 -0.250000 +v 0.437500 -0.499000 -0.250000 +v 0.312500 -0.499000 -0.312500 +v -0.125000 -0.499000 -0.437500 +v 0.312500 -0.499000 -0.437500 +v -0.312500 -0.499000 -0.500000 +v -0.312500 -0.499000 -0.437500 +v 0.312500 -0.499000 -0.500000 +v -0.375000 -0.374000 0.437500 +v 0.375000 -0.374000 0.437500 +v -0.125000 -0.374000 0.375000 +v 0.437500 -0.374000 0.062500 +v 0.375000 -0.374000 -0.250000 +v 0.437500 -0.374000 -0.250000 +v 0.375000 -0.374000 -0.312500 +v 0.437500 -0.374000 -0.375000 +v -0.437500 -0.374000 -0.375000 +v -0.437500 -0.374000 -0.437500 +v 0.125000 -0.311500 0.375000 +v -0.312500 -0.311500 0.312500 +v 0.125000 -0.311500 0.312500 +v 0.250000 -0.311500 0.187500 +v -0.187500 -0.311500 0.000000 +v -0.125000 -0.311500 0.000000 +v 0.187500 -0.311500 0.000000 +v 0.250000 -0.311500 0.000000 +v 0.437500 -0.311500 0.062500 +v -0.437500 -0.311500 0.000000 +v -0.375000 -0.311500 -0.062500 +v 0.375000 -0.311500 0.000000 +v 0.125000 -0.311500 -0.062500 +v 0.250000 -0.311500 -0.062500 +v 0.375000 -0.311500 -0.062500 +v -0.250000 -0.311500 -0.187500 +v 0.250000 -0.311500 -0.187500 +v 0.312500 -0.311500 -0.250000 +v 0.250000 -0.311500 -0.375000 +v 0.062500 -0.249000 0.437500 +v -0.062500 -0.249000 0.375000 +v 0.375000 -0.249000 -0.187500 +v -0.062500 -0.249000 -0.312500 +v -0.062500 -0.249000 -0.375000 +v 0.312500 -0.186500 0.000000 +v -0.187500 -0.186500 -0.062500 +v -0.187500 -0.186500 -0.125000 +v -0.312500 -0.186500 -0.187500 +v -0.250000 -0.186500 -0.187500 +v -0.187500 -0.186500 -0.250000 +v -0.187500 -0.186500 -0.187500 +v -0.062500 -0.186500 -0.312500 +v -0.125000 -0.124000 0.375000 +v -0.312500 -0.124000 0.312500 +v -0.250000 -0.124000 0.312500 +v 0.125000 -0.124000 0.250000 +v -0.250000 -0.124000 0.187500 +v -0.187500 -0.124000 0.125000 +v 0.000000 -0.124000 0.125000 +v -0.125000 -0.124000 0.000000 +v 0.062500 -0.124000 0.062500 +v -0.250000 -0.124000 -0.062500 +v 0.000000 -0.124000 -0.062500 +v 0.187500 -0.124000 0.000000 +v -0.312500 -0.124000 -0.125000 +v -0.187500 -0.124000 -0.125000 +v 0.125000 -0.124000 -0.125000 +v 0.312500 -0.124000 -0.125000 +v -0.250000 -0.124000 -0.250000 +v 0.000000 -0.124000 -0.250000 +v 0.125000 -0.124000 -0.312500 +v 0.125000 -0.061500 0.312500 +v -0.187500 -0.061500 0.250000 +v 0.250000 -0.061500 -0.187500 +v 0.000000 0.001000 -0.062500 +v -0.187500 0.001000 -0.250000 +v 0.062500 0.063500 0.312500 +v 0.000000 0.063500 0.125000 +v -0.125000 0.063500 0.062500 +v 0.125000 0.063500 0.062500 +v -0.062500 0.063500 -0.062500 +v -0.125000 0.063500 -0.125000 +v -0.062500 0.063500 -0.187500 +v 0.062500 0.063500 -0.187500 +v 0.125000 0.063500 -0.250000 +v 0.125000 0.063500 -0.187500 +v 0.000000 0.126000 0.187500 +v 0.062500 0.126000 0.187500 +v 0.000000 0.126000 -0.062500 +v 0.000000 0.126000 -0.125000 +v 0.187500 0.126000 -0.125000 +v -0.062500 0.188500 0.187500 +v 0.125000 0.188500 0.125000 +v -0.125000 0.188500 0.062500 +v 0.000000 0.251000 0.062500 +v 0.062500 0.251000 0.000000 +v -0.125000 0.251000 -0.062500 +v -0.062500 0.251000 0.000000 +v 0.062500 0.251000 -0.187500 +v -0.375000 -0.436500 0.437500 +v -0.250000 -0.436500 0.375000 +v 0.187500 -0.436500 0.375000 +v 0.375000 -0.436500 0.312500 +v 0.312500 -0.436500 0.312500 +v 0.312500 -0.436500 0.250000 +v -0.437500 -0.436500 0.187500 +v -0.250000 -0.436500 0.187500 +v -0.312500 -0.436500 0.125000 +v 0.375000 -0.436500 0.062500 +v 0.375000 -0.436500 -0.125000 +v -0.437500 -0.436500 -0.250000 +v -0.375000 -0.436500 -0.312500 +v 0.125000 -0.436500 -0.375000 +v 0.312500 -0.436500 -0.375000 +v 0.312500 -0.436500 -0.437500 +v -0.250000 -0.311500 0.500000 +v 0.375000 -0.311500 0.437500 +v 0.500000 -0.311500 0.500000 +v -0.375000 -0.311500 0.375000 +v -0.250000 -0.311500 0.437500 +v 0.250000 -0.311500 0.375000 +v -0.437500 -0.311500 0.375000 +v -0.062500 -0.311500 0.312500 +v 0.187500 -0.311500 0.312500 +v 0.437500 -0.311500 0.375000 +v 0.250000 -0.311500 0.312500 +v 0.312500 -0.311500 0.312500 +v -0.500000 -0.311500 0.187500 +v 0.312500 -0.311500 0.250000 +v 0.375000 -0.311500 0.250000 +v -0.375000 -0.311500 0.125000 +v 0.375000 -0.311500 0.187500 +v 0.312500 -0.311500 0.062500 +v 0.312500 -0.311500 0.000000 +v -0.312500 -0.311500 -0.062500 +v -0.312500 -0.311500 -0.187500 +v -0.500000 -0.311500 -0.312500 +v 0.375000 -0.311500 -0.312500 +v -0.437500 -0.311500 -0.375000 +v -0.312500 -0.311500 -0.437500 +v -0.250000 -0.311500 -0.375000 +v -0.312500 -0.311500 -0.500000 +v 0.312500 -0.311500 -0.500000 +v 0.187500 -0.249000 0.500000 +v 0.000000 -0.249000 0.312500 +v 0.250000 -0.249000 0.312500 +v 0.375000 -0.249000 0.062500 +v 0.312500 -0.249000 0.000000 +v 0.187500 -0.249000 -0.125000 +v 0.500000 -0.249000 -0.187500 +v 0.187500 -0.249000 -0.187500 +v 0.250000 -0.249000 -0.187500 +v 0.125000 -0.249000 -0.250000 +v -0.125000 -0.249000 -0.500000 +v -0.062500 -0.186500 0.375000 +v 0.250000 -0.186500 0.250000 +v -0.125000 -0.186500 0.000000 +v -0.187500 -0.186500 0.000000 +v -0.250000 -0.186500 -0.125000 +v -0.312500 -0.186500 -0.250000 +v -0.187500 -0.186500 -0.312500 +v 0.250000 -0.124000 0.375000 +v -0.062500 -0.124000 0.312500 +v 0.312500 -0.124000 0.250000 +v -0.187500 -0.124000 0.250000 +v 0.375000 -0.124000 0.187500 +v 0.250000 -0.124000 0.062500 +v -0.187500 -0.124000 -0.062500 +v -0.250000 -0.124000 -0.125000 +v -0.125000 -0.124000 -0.187500 +v -0.312500 -0.124000 -0.187500 +v -0.187500 -0.124000 -0.187500 +v -0.312500 -0.124000 -0.312500 +v -0.250000 -0.124000 -0.375000 +v -0.187500 -0.124000 -0.312500 +v -0.062500 -0.124000 -0.375000 +v 0.125000 -0.124000 -0.437500 +v -0.062500 -0.061500 0.375000 +v -0.375000 -0.061500 0.375000 +v -0.062500 -0.061500 0.312500 +v 0.125000 -0.061500 0.375000 +v 0.250000 -0.061500 0.375000 +v 0.250000 -0.061500 0.250000 +v 0.125000 -0.061500 0.062500 +v 0.187500 -0.061500 -0.062500 +v 0.375000 -0.061500 -0.062500 +v 0.312500 -0.061500 -0.125000 +v 0.000000 -0.061500 -0.250000 +v 0.312500 -0.061500 -0.250000 +v -0.062500 -0.061500 -0.375000 +v 0.000000 -0.061500 -0.312500 +v -0.312500 0.001000 0.000000 +v -0.312500 0.001000 -0.125000 +v -0.125000 0.001000 -0.062500 +v -0.125000 0.001000 -0.125000 +v 0.062500 0.001000 -0.187500 +v -0.312500 0.001000 -0.187500 +v -0.187500 0.001000 -0.312500 +v -0.062500 0.063500 0.250000 +v 0.000000 0.063500 0.250000 +v 0.250000 0.063500 0.187500 +v -0.187500 0.063500 0.062500 +v -0.250000 0.063500 -0.062500 +v 0.125000 0.126000 0.375000 +v 0.000000 0.126000 0.250000 +v -0.062500 0.126000 0.187500 +v 0.125000 0.126000 0.125000 +v -0.062500 0.126000 -0.062500 +v 0.125000 0.126000 -0.125000 +v 0.000000 0.126000 -0.187500 +v 0.125000 0.126000 -0.250000 +v 0.312500 0.126000 -0.250000 +v -0.062500 0.126000 -0.312500 +v 0.125000 0.126000 -0.312500 +v -0.062500 0.188500 0.000000 +v -0.062500 0.251000 0.187500 +v 0.062500 0.251000 0.187500 +v 0.250000 0.251000 0.250000 +v -0.062500 0.251000 0.125000 +v -0.187500 0.251000 0.000000 +v -0.062500 0.251000 -0.062500 +v 0.000000 0.251000 -0.125000 +v 0.250000 0.251000 -0.187500 +v -0.062500 0.376000 0.187500 +v 0.062500 0.376000 0.062500 +v -0.125000 0.376000 -0.062500 +v 0.125000 0.376000 -0.062500 +v 0.125000 0.376000 -0.187500 +vt 0.531250 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.468750 +vt 0.625000 0.312500 +vt 0.625000 0.343750 +vt 0.656250 0.343750 +vt 0.343750 0.437500 +vt 0.375000 0.406250 +vt 0.343750 0.343750 +vt 0.656250 0.375000 +vt 0.656250 0.406250 +vt 0.687500 0.406250 +vt 0.562500 0.593750 +vt 0.562500 0.562500 +vt 0.531250 0.562500 +vt 0.687500 0.656250 +vt 0.718750 0.625000 +vt 0.750000 0.718750 +vt 0.281250 0.375000 +vt 0.312500 0.343750 +vt 0.281250 0.343750 +vt 0.656250 0.625000 +vt 0.625000 0.625000 +vt 0.625000 0.593750 +vt 0.406250 0.375000 +vt 0.406250 0.406250 +vt 0.500000 0.406250 +vt 0.625000 0.468750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.625000 0.312500 +vt 0.656250 0.343750 +vt 0.625000 0.406250 +vt 0.437500 0.500000 +vt 0.406250 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.343750 +vt 0.500000 0.375000 +vt 0.531250 0.343750 +vt 0.343750 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.375000 0.593750 +vt 0.343750 0.593750 +vt 0.343750 0.531250 +vt 0.375000 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.593750 +vt 0.687500 0.375000 +vt 0.718750 0.343750 +vt 0.687500 0.343750 +vt 0.250000 0.437500 +vt 0.281250 0.437500 +vt 0.281250 0.406250 +vt 0.468750 0.437500 +vt 0.468750 0.468750 +vt 0.406250 0.468750 +vt 0.562500 0.625000 +vt 0.593750 0.625000 +vt 0.593750 0.593750 +vt 0.312500 0.312500 +vt 0.406250 0.406250 +vt 0.406250 0.312500 +vt 0.250000 0.312500 +vt 0.281250 0.343750 +vt 0.250000 0.406250 +vt 0.468750 0.343750 +vt 0.468750 0.312500 +vt 0.375000 0.312500 +vt 0.656250 0.312500 +vt 0.750000 0.406250 +vt 0.750000 0.312500 +vt 0.750000 0.312500 +vt 0.718750 0.343750 +vt 0.750000 0.437500 +vt 0.281250 0.437500 +vt 0.312500 0.406250 +vt 0.281250 0.406250 +vt 0.312500 0.437500 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.312500 0.437500 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.687500 0.343750 +vt 0.625000 0.375000 +vt 0.687500 0.375000 +vt 0.375000 0.437500 +vt 0.406250 0.406250 +vt 0.375000 0.406250 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.531250 0.656250 +vt 0.375000 0.406250 +vt 0.343750 0.343750 +vt 0.375000 0.343750 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.468750 0.406250 +vt 0.375000 0.625000 +vt 0.406250 0.562500 +vt 0.375000 0.562500 +vt 0.687500 0.437500 +vt 0.718750 0.406250 +vt 0.687500 0.406250 +vt 0.312500 0.375000 +vt 0.312500 0.406250 +vt 0.343750 0.406250 +vt 0.531250 0.625000 +vt 0.562500 0.562500 +vt 0.531250 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.468750 +vt 0.437500 0.500000 +vt 0.281250 0.406250 +vt 0.312500 0.312500 +vt 0.281250 0.312500 +vt 0.468750 0.562500 +vt 0.500000 0.500000 +vt 0.468750 0.500000 +vt 0.593750 0.468750 +vt 0.593750 0.437500 +vt 0.468750 0.531250 +vt 0.500000 0.437500 +vt 0.468750 0.437500 +vt 0.500000 0.500000 +vt 0.531250 0.531250 +vt 0.500000 0.562500 +vt 0.656250 0.468750 +vt 0.437500 0.406250 +vt 0.375000 0.500000 +vt 0.500000 0.687500 +vt 0.468750 0.687500 +vt 0.468750 0.750000 +vt 0.343750 0.500000 +vt 0.375000 0.468750 +vt 0.343750 0.468750 +vt 0.406250 0.437500 +vt 0.437500 0.437500 +vt 0.437500 0.406250 +vt 0.437500 0.406250 +vt 0.343750 0.500000 +vt 0.343750 0.406250 +vt 0.406250 0.750000 +vt 0.437500 0.687500 +vt 0.468750 0.750000 +vt 0.468750 0.468750 +vt 0.468750 0.437500 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.406250 0.437500 +vt 0.375000 0.437500 +vt 0.531250 0.468750 +vt 0.500000 0.468750 +vt 0.562500 0.687500 +vt 0.562500 0.656250 +vt 0.656250 0.656250 +vt 0.562500 0.500000 +vt 0.593750 0.468750 +vt 0.562500 0.468750 +vt 0.562500 0.500000 +vt 0.593750 0.437500 +vt 0.531250 0.406250 +vt 0.625000 0.500000 +vt 0.593750 0.437500 +vt 0.562500 0.500000 +vt 0.343750 0.656250 +vt 0.375000 0.625000 +vt 0.343750 0.593750 +vt 0.593750 0.500000 +vt 0.625000 0.468750 +vt 0.593750 0.468750 +vt 0.625000 0.500000 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.343750 0.531250 +vt 0.375000 0.500000 +vt 0.343750 0.500000 +vt 0.531250 0.687500 +vt 0.500000 0.750000 +vt 0.500000 0.687500 +vt 0.531250 0.500000 +vt 0.500000 0.406250 +vt 0.406250 0.437500 +vt 0.468750 0.500000 +vt 0.562500 0.562500 +vt 0.531250 0.593750 +vt 0.593750 0.562500 +vt 0.562500 0.531250 +vt 0.593750 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.625000 0.531250 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.718750 0.406250 +vt 0.687500 0.343750 +vt 0.718750 0.343750 +vt 0.468750 0.312500 +vt 0.593750 0.437500 +vt 0.468750 0.437500 +vt 0.406250 0.531250 +vt 0.437500 0.593750 +vt 0.468750 0.531250 +vt 0.406250 0.500000 +vt 0.406250 0.531250 +vt 0.562500 0.750000 +vt 0.593750 0.687500 +vt 0.562500 0.687500 +vt 0.562500 0.562500 +vt 0.531250 0.593750 +vt 0.562500 0.625000 +vt 0.656250 0.562500 +vt 0.593750 0.500000 +vt 0.593750 0.562500 +vt 0.531250 0.562500 +vt 0.531250 0.531250 +vt 0.562500 0.562500 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.687500 0.375000 +vt 0.687500 0.406250 +vt 0.593750 0.406250 +vt 0.375000 0.468750 +vt 0.343750 0.468750 +vt 0.343750 0.437500 +vt 0.531250 0.625000 +vt 0.531250 0.531250 +vt 0.562500 0.531250 +vt 0.343750 0.593750 +vt 0.375000 0.593750 +vt 0.375000 0.562500 +vt 0.375000 0.500000 +vt 0.406250 0.531250 +vt 0.375000 0.562500 +vt 0.531250 0.500000 +vt 0.437500 0.500000 +vt 0.500000 0.562500 +vt 0.562500 0.500000 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.281250 0.437500 +vt 0.312500 0.468750 +vt 0.281250 0.500000 +vt 0.437500 0.562500 +vt 0.437500 0.531250 +vt 0.375000 0.625000 +vt 0.406250 0.593750 +vt 0.375000 0.593750 +vt 0.281250 0.343750 +vt 0.312500 0.343750 +vt 0.312500 0.375000 +vt 0.406250 0.625000 +vt 0.437500 0.593750 +vt 0.406250 0.593750 +vt 0.468750 0.656250 +vt 0.406250 0.593750 +vt 0.406250 0.656250 +vt 0.468750 0.687500 +vt 0.437500 0.750000 +vt 0.468750 0.687500 +vt 0.468750 0.718750 +vt 0.562500 0.718750 +vt 0.562500 0.687500 +vt 0.593750 0.625000 +vt 0.562500 0.625000 +vt 0.531250 0.656250 +vt 0.531250 0.625000 +vt 0.750000 0.406250 +vt 0.718750 0.375000 +vt 0.500000 0.593750 +vt 0.531250 0.593750 +vt 0.437500 0.406250 +vt 0.437500 0.375000 +vt 0.375000 0.375000 +vt 0.500000 0.687500 +vt 0.531250 0.656250 +vt 0.500000 0.656250 +vt 0.500000 0.687500 +vt 0.468750 0.687500 +vt 0.531250 0.687500 +vt 0.562500 0.656250 +vt 0.531250 0.656250 +vt 0.437500 0.687500 +vt 0.406250 0.687500 +vt 0.406250 0.750000 +vt 0.375000 0.500000 +vt 0.406250 0.437500 +vt 0.375000 0.437500 +vt 0.718750 0.406250 +vt 0.625000 0.312500 +vt 0.718750 0.312500 +vt 0.375000 0.406250 +vt 0.343750 0.343750 +vt 0.343750 0.406250 +vt 0.312500 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.312500 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.406250 0.375000 +vt 0.375000 0.343750 +vt 0.531250 0.468750 +vt 0.562500 0.468750 +vt 0.593750 0.406250 +vt 0.656250 0.343750 +vt 0.625000 0.375000 +vt 0.625000 0.343750 +vt 0.687500 0.343750 +vt 0.656250 0.375000 +vt 0.656250 0.343750 +vt 0.718750 0.500000 +vt 0.656250 0.437500 +vt 0.687500 0.406250 +vt 0.281250 0.406250 +vt 0.250000 0.437500 +vt 0.250000 0.312500 +vt 0.593750 0.656250 +vt 0.562500 0.593750 +vt 0.593750 0.593750 +vt 0.437500 0.625000 +vt 0.437500 0.656250 +vt 0.468750 0.593750 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.656250 0.406250 +vt 0.562500 0.406250 +vt 0.562500 0.437500 +vt 0.531250 0.437500 +vt 0.625000 0.406250 +vt 0.656250 0.343750 +vt 0.468750 0.468750 +vt 0.468750 0.500000 +vt 0.562500 0.500000 +vt 0.593750 0.406250 +vt 0.562500 0.343750 +vt 0.593750 0.343750 +vt 0.250000 0.406250 +vt 0.312500 0.375000 +vt 0.312500 0.343750 +vt 0.437500 0.312500 +vt 0.375000 0.312500 +vt 0.375000 0.343750 +vt 0.468750 0.625000 +vt 0.437500 0.593750 +vt 0.437500 0.656250 +vt 0.343750 0.406250 +vt 0.312500 0.437500 +vt 0.312500 0.406250 +vt 0.343750 0.406250 +vt 0.343750 0.437500 +vt 0.312500 0.437500 +vt 0.343750 0.437500 +vt 0.750000 0.312500 +vt 0.718750 0.343750 +vt 0.750000 0.406250 +vt 0.406250 0.406250 +vt 0.375000 0.437500 +vt 0.375000 0.406250 +vt 0.406250 0.500000 +vt 0.531250 0.687500 +vt 0.562500 0.687500 +vt 0.562500 0.656250 +vt 0.437500 0.406250 +vt 0.406250 0.437500 +vt 0.437500 0.468750 +vt 0.562500 0.437500 +vt 0.531250 0.500000 +vt 0.531250 0.406250 +vt 0.656250 0.406250 +vt 0.656250 0.468750 +vt 0.625000 0.437500 +vt 0.531250 0.593750 +vt 0.531250 0.531250 +vt 0.562500 0.625000 +vt 0.625000 0.593750 +vt 0.656250 0.625000 +vt 0.593750 0.406250 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.343750 0.500000 +vt 0.312500 0.531250 +vt 0.375000 0.531250 +vt 0.343750 0.500000 +vt 0.406250 0.562500 +vt 0.343750 0.562500 +vt 0.750000 0.406250 +vt 0.718750 0.437500 +vt 0.718750 0.406250 +vt 0.343750 0.437500 +vt 0.312500 0.468750 +vt 0.312500 0.437500 +vt 0.531250 0.281250 +vt 0.500000 0.281250 +vt 0.468750 0.250000 +vt 0.593750 0.531250 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.687500 0.437500 +vt 0.656250 0.468750 +vt 0.656250 0.437500 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.343750 0.468750 +vt 0.312500 0.500000 +vt 0.312500 0.468750 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.375000 0.468750 +vt 0.437500 0.437500 +vt 0.375000 0.500000 +vt 0.437500 0.531250 +vt 0.500000 0.562500 +vt 0.500000 0.593750 +vt 0.562500 0.343750 +vt 0.593750 0.375000 +vt 0.625000 0.343750 +vt 0.593750 0.437500 +vt 0.625000 0.406250 +vt 0.687500 0.468750 +vt 0.718750 0.500000 +vt 0.343750 0.500000 +vt 0.312500 0.531250 +vt 0.312500 0.500000 +vt 0.375000 0.531250 +vt 0.718750 0.687500 +vt 0.687500 0.656250 +vt 0.656250 0.687500 +vt 0.375000 0.625000 +vt 0.375000 0.531250 +vt 0.406250 0.531250 +vt 0.656250 0.750000 +vt 0.656250 0.718750 +vt 0.593750 0.281250 +vt 0.687500 0.281250 +vt 0.625000 0.593750 +vt 0.593750 0.593750 +vt 0.656250 0.625000 +vt 0.500000 0.343750 +vt 0.468750 0.281250 +vt 0.468750 0.343750 +vt 0.593750 0.562500 +vt 0.562500 0.562500 +vt 0.562500 0.531250 +vt 0.656250 0.500000 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.687500 0.500000 +vt 0.656250 0.531250 +vt 0.406250 0.531250 +vt 0.375000 0.500000 +vt 0.468750 0.593750 +vt 0.375000 0.593750 +vt 0.375000 0.312500 +vt 0.312500 0.281250 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.406250 +vt 0.437500 0.343750 +vt 0.406250 0.343750 +vt 0.312500 0.625000 +vt 0.312500 0.531250 +vt 0.500000 0.593750 +vt 0.500000 0.562500 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.406250 +vt 0.656250 0.531250 +vt 0.625000 0.593750 +vt 0.656250 0.625000 +vt 0.687500 0.500000 +vt 0.656250 0.406250 +vt 0.625000 0.437500 +vt 0.562500 0.687500 +vt 0.531250 0.687500 +vt 0.531250 0.750000 +vt 0.437500 0.593750 +vt 0.531250 0.562500 +vt 0.687500 0.406250 +vt 0.656250 0.343750 +vt 0.687500 0.343750 +vt 0.312500 0.312500 +vt 0.343750 0.343750 +vt 0.437500 0.312500 +vt 0.593750 0.593750 +vt 0.562500 0.625000 +vt 0.562500 0.593750 +vt 0.500000 0.500000 +vt 0.531250 0.437500 +vt 0.562500 0.468750 +vt 0.437500 0.625000 +vt 0.406250 0.656250 +vt 0.406250 0.625000 +vt 0.406250 0.656250 +vt 0.406250 0.625000 +vt 0.656250 0.406250 +vt 0.656250 0.312500 +vt 0.687500 0.343750 +vt 0.500000 0.687500 +vt 0.500000 0.593750 +vt 0.531250 0.625000 +vt 0.562500 0.656250 +vt 0.531250 0.593750 +vt 0.562500 0.593750 +vt 0.437500 0.656250 +vt 0.406250 0.656250 +vt 0.406250 0.593750 +vt 0.468750 0.593750 +vt 0.468750 0.687500 +vt 0.531250 0.656250 +vt 0.500000 0.656250 +vt 0.531250 0.750000 +vt 0.562500 0.687500 +vt 0.593750 0.750000 +vt 0.312500 0.437500 +vt 0.281250 0.343750 +vt 0.312500 0.343750 +vt 0.343750 0.500000 +vt 0.343750 0.468750 +vt 0.375000 0.468750 +vt 0.625000 0.593750 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.312500 0.531250 +vt 0.343750 0.531250 +vt 0.343750 0.500000 +vt 0.500000 0.562500 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.406250 0.343750 +vt 0.437500 0.343750 +vt 0.750000 0.406250 +vt 0.718750 0.406250 +vt 0.718750 0.343750 +vt 0.312500 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.375000 0.343750 +vt 0.468750 0.312500 +vt 0.468750 0.343750 +vt 0.406250 0.406250 +vt 0.375000 0.343750 +vt 0.406250 0.343750 +vt 0.718750 0.406250 +vt 0.687500 0.343750 +vt 0.312500 0.625000 +vt 0.343750 0.625000 +vt 0.343750 0.593750 +vt 0.718750 0.375000 +vt 0.656250 0.343750 +vt 0.718750 0.343750 +vt 0.375000 0.406250 +vt 0.281250 0.312500 +vt 0.375000 0.312500 +vt 0.593750 0.500000 +vt 0.687500 0.406250 +vt 0.687500 0.343750 +vt 0.718750 0.375000 +vt 0.687500 0.406250 +vt 0.687500 0.375000 +vt 0.593750 0.625000 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.406250 0.625000 +vt 0.375000 0.687500 +vt 0.375000 0.500000 +vt 0.468750 0.500000 +vt 0.437500 0.437500 +vt 0.750000 0.406250 +vt 0.718750 0.375000 +vt 0.718750 0.343750 +vt 0.375000 0.593750 +vt 0.375000 0.531250 +vt 0.375000 0.406250 +vt 0.281250 0.406250 +vt 0.343750 0.375000 +vt 0.312500 0.406250 +vt 0.437500 0.437500 +vt 0.437500 0.468750 +vt 0.468750 0.406250 +vt 0.437500 0.406250 +vt 0.593750 0.562500 +vt 0.625000 0.406250 +vt 0.593750 0.437500 +vt 0.593750 0.406250 +vt 0.656250 0.406250 +vt 0.625000 0.437500 +vt 0.625000 0.406250 +vt 0.593750 0.437500 +vt 0.593750 0.406250 +vt 0.656250 0.437500 +vt 0.656250 0.406250 +vt 0.687500 0.437500 +vt 0.343750 0.406250 +vt 0.375000 0.406250 +vt 0.375000 0.437500 +vt 0.343750 0.437500 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.406250 0.531250 +vt 0.468750 0.437500 +vt 0.406250 0.468750 +vt 0.375000 0.343750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.687500 0.468750 +vt 0.656250 0.468750 +vt 0.656250 0.437500 +vt 0.656250 0.468750 +vt 0.687500 0.500000 +vt 0.437500 0.343750 +vt 0.468750 0.406250 +vt 0.687500 0.562500 +vt 0.687500 0.468750 +vt 0.718750 0.593750 +vt 0.375000 0.468750 +vt 0.375000 0.437500 +vt 0.562500 0.437500 +vt 0.468750 0.437500 +vt 0.468750 0.406250 +vt 0.687500 0.531250 +vt 0.687500 0.656250 +vt 0.625000 0.468750 +vt 0.593750 0.500000 +vt 0.593750 0.468750 +vt 0.468750 0.468750 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.406250 0.468750 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.375000 0.468750 +vt 0.406250 0.593750 +vt 0.437500 0.593750 +vt 0.437500 0.656250 +vt 0.375000 0.468750 +vt 0.343750 0.500000 +vt 0.343750 0.468750 +vt 0.375000 0.343750 +vt 0.406250 0.375000 +vt 0.468750 0.375000 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.531250 0.531250 +vt 0.437500 0.531250 +vt 0.468750 0.437500 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.343750 0.375000 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.375000 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.500000 0.593750 +vt 0.500000 0.687500 +vt 0.656250 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.593750 0.500000 +vt 0.562500 0.531250 +vt 0.625000 0.437500 +vt 0.500000 0.312500 +vt 0.500000 0.437500 +vt 0.406250 0.562500 +vt 0.437500 0.531250 +vt 0.468750 0.562500 +vt 0.562500 0.531250 +vt 0.468750 0.468750 +vt 0.562500 0.437500 +vt 0.468750 0.656250 +vt 0.500000 0.593750 +vt 0.468750 0.593750 +vt 0.500000 0.406250 +vt 0.406250 0.562500 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.375000 0.562500 +vt 0.343750 0.500000 +vt 0.531250 0.500000 +vt 0.562500 0.531250 +vt 0.531250 0.562500 +vt 0.625000 0.500000 +vt 0.562500 0.531250 +vt 0.593750 0.437500 +vt 0.562500 0.500000 +vt 0.625000 0.468750 +vt 0.500000 0.406250 +vt 0.531250 0.437500 +vt 0.531250 0.406250 +vt 0.656250 0.406250 +vt 0.687500 0.343750 +vt 0.656250 0.343750 +vt 0.562500 0.312500 +vt 0.593750 0.343750 +vt 0.500000 0.593750 +vt 0.468750 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.406250 +vt 0.250000 0.312500 +vt 0.281250 0.343750 +vt 0.500000 0.531250 +vt 0.562500 0.593750 +vt 0.468750 0.593750 +vt 0.437500 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.562500 +vt 0.437500 0.593750 +vt 0.437500 0.562500 +vt 0.406250 0.562500 +vt 0.375000 0.593750 +vt 0.375000 0.562500 +vt 0.593750 0.562500 +vt 0.593750 0.531250 +vt 0.656250 0.531250 +vt 0.656250 0.500000 +vt 0.562500 0.625000 +vt 0.531250 0.562500 +vt 0.562500 0.562500 +vt 0.531250 0.656250 +vt 0.531250 0.625000 +vt 0.281250 0.406250 +vt 0.312500 0.437500 +vt 0.250000 0.437500 +vt 0.500000 0.500000 +vt 0.468750 0.468750 +vt 0.562500 0.468750 +vt 0.500000 0.593750 +vt 0.468750 0.625000 +vt 0.468750 0.656250 +vt 0.468750 0.625000 +vt 0.593750 0.687500 +vt 0.562500 0.593750 +vt 0.562500 0.687500 +vt 0.562500 0.343750 +vt 0.531250 0.687500 +vt 0.500000 0.593750 +vt 0.468750 0.625000 +vt 0.468750 0.593750 +vt 0.625000 0.625000 +vt 0.562500 0.562500 +vt 0.562500 0.625000 +vt 0.531250 0.656250 +vt 0.531250 0.625000 +vt 0.625000 0.687500 +vt 0.593750 0.593750 +vt 0.625000 0.593750 +vt 0.562500 0.625000 +vt 0.531250 0.593750 +vt 0.531250 0.750000 +vt 0.593750 0.750000 +vt 0.406250 0.625000 +vt 0.500000 0.687500 +vt 0.406250 0.687500 +vt 0.656250 0.593750 +vt 0.625000 0.593750 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.562500 0.625000 +vt 0.593750 0.656250 +vt 0.750000 0.406250 +vt 0.718750 0.406250 +vt 0.718750 0.343750 +vt 0.468750 0.656250 +vt 0.437500 0.687500 +vt 0.593750 0.656250 +vt 0.562500 0.656250 +vt 0.468750 0.593750 +vt 0.406250 0.562500 +vt 0.406250 0.593750 +vt 0.437500 0.687500 +vt 0.406250 0.687500 +vt 0.625000 0.406250 +vt 0.468750 0.562500 +vt 0.468750 0.593750 +vt 0.625000 0.406250 +vt 0.625000 0.312500 +vt 0.312500 0.375000 +vt 0.375000 0.375000 +vt 0.718750 0.343750 +vt 0.687500 0.343750 +vt 0.281250 0.375000 +vt 0.625000 0.312500 +vt 0.500000 0.406250 +vt 0.437500 0.312500 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.343750 0.718750 +vt 0.281250 0.687500 +vt 0.281250 0.718750 +vt 0.687500 0.406250 +vt 0.687500 0.437500 +vt 0.656250 0.437500 +vt 0.656250 0.468750 +vt 0.656250 0.375000 +vt 0.687500 0.406250 +vt 0.687500 0.375000 +vt 0.281250 0.406250 +vt 0.312500 0.343750 +vt 0.687500 0.343750 +vt 0.625000 0.406250 +vt 0.656250 0.375000 +vt 0.562500 0.343750 +vt 0.531250 0.531250 +vt 0.500000 0.562500 +vt 0.437500 0.437500 +vt 0.562500 0.437500 +vt 0.562500 0.406250 +vt 0.593750 0.437500 +vt 0.468750 0.437500 +vt 0.468750 0.406250 +vt 0.593750 0.343750 +vt 0.593750 0.375000 +vt 0.625000 0.375000 +vt 0.656250 0.468750 +vt 0.656250 0.406250 +vt 0.656250 0.406250 +vt 0.687500 0.406250 +vt 0.687500 0.375000 +vt 0.250000 0.406250 +vt 0.750000 0.437500 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.468750 0.656250 +vt 0.500000 0.687500 +vt 0.500000 0.593750 +vt 0.656250 0.343750 +vt 0.750000 0.406250 +vt 0.625000 0.656250 +vt 0.562500 0.687500 +vt 0.562500 0.656250 +vt 0.343750 0.406250 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.437500 0.750000 +vt 0.468750 0.687500 +vt 0.468750 0.750000 +vt 0.625000 0.312500 +vt 0.625000 0.406250 +vt 0.531250 0.437500 +vt 0.562500 0.406250 +vt 0.531250 0.406250 +vt 0.687500 0.375000 +vt 0.718750 0.437500 +vt 0.687500 0.343750 +vt 0.406250 0.343750 +vt 0.468750 0.625000 +vt 0.500000 0.656250 +vt 0.437500 0.656250 +vt 0.312500 0.437500 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.312500 0.406250 +vt 0.281250 0.406250 +vt 0.468750 0.406250 +vt 0.406250 0.375000 +vt 0.500000 0.375000 +vt 0.437500 0.500000 +vt 0.437500 0.468750 +vt 0.406250 0.468750 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.468750 0.406250 +vt 0.343750 0.468750 +vt 0.343750 0.343750 +vt 0.656250 0.437500 +vt 0.312500 0.437500 +vt 0.593750 0.437500 +vt 0.687500 0.437500 +vt 0.718750 0.406250 +vt 0.750000 0.437500 +vt 0.406250 0.375000 +vt 0.375000 0.343750 +vt 0.468750 0.343750 +vt 0.343750 0.312500 +vt 0.250000 0.406250 +vt 0.250000 0.312500 +vt 0.625000 0.500000 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.250000 0.406250 +vt 0.250000 0.312500 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.625000 0.437500 +vt 0.593750 0.437500 +vt 0.656250 0.500000 +vt 0.562500 0.531250 +vt 0.687500 0.531250 +vt 0.312500 0.375000 +vt 0.406250 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.468750 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.468750 +vt 0.687500 0.312500 +vt 0.750000 0.406250 +vt 0.687500 0.406250 +vt 0.468750 0.468750 +vt 0.468750 0.500000 +vt 0.531250 0.531250 +vt 0.406250 0.500000 +vt 0.562500 0.406250 +vt 0.281250 0.500000 +vt 0.375000 0.468750 +vt 0.593750 0.500000 +vt 0.406250 0.531250 +vt 0.531250 0.500000 +vt 0.625000 0.531250 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.531250 0.625000 +vt 0.687500 0.375000 +vt 0.687500 0.406250 +vt 0.593750 0.531250 +vt 0.625000 0.625000 +vt 0.562500 0.562500 +vt 0.406250 0.500000 +vt 0.343750 0.562500 +vt 0.406250 0.562500 +vt 0.437500 0.562500 +vt 0.468750 0.531250 +vt 0.437500 0.531250 +vt 0.500000 0.406250 +vt 0.593750 0.375000 +vt 0.562500 0.406250 +vt 0.468750 0.593750 +vt 0.468750 0.531250 +vt 0.718750 0.406250 +vt 0.687500 0.468750 +vt 0.718750 0.500000 +vt 0.562500 0.625000 +vt 0.500000 0.625000 +vt 0.687500 0.406250 +vt 0.656250 0.437500 +vt 0.687500 0.468750 +vt 0.281250 0.437500 +vt 0.593750 0.406250 +vt 0.500000 0.343750 +vt 0.625000 0.343750 +vt 0.468750 0.562500 +vt 0.437500 0.562500 +vt 0.406250 0.593750 +vt 0.468750 0.593750 +vt 0.500000 0.625000 +vt 0.500000 0.562500 +vt 0.531250 0.562500 +vt 0.468750 0.531250 +vt 0.500000 0.625000 +vt 0.500000 0.593750 +vt 0.468750 0.593750 +vt 0.531250 0.500000 +vt 0.437500 0.656250 +vt 0.625000 0.687500 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.500000 0.437500 +vt 0.562500 0.625000 +vt 0.500000 0.531250 +vt 0.500000 0.687500 +vt 0.531250 0.687500 +vt 0.468750 0.656250 +vt 0.437500 0.656250 +vt 0.593750 0.593750 +vt 0.593750 0.656250 +vt 0.562500 0.656250 +vt 0.406250 0.593750 +vt 0.500000 0.687500 +vt 0.500000 0.750000 +vt 0.437500 0.687500 +vt 0.468750 0.656250 +vt 0.531250 0.687500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 0.687500 0.406250 +vt 0.562500 0.562500 +vt 0.593750 0.593750 +vt 0.406250 0.500000 +vt 0.593750 0.406250 +vt 0.531250 0.437500 +vt 0.531250 0.406250 +vt 0.312500 0.593750 +vt 0.343750 0.531250 +vt 0.312500 0.531250 +vt 0.593750 0.406250 +vt 0.593750 0.343750 +vt 0.375000 0.625000 +vt 0.375000 0.437500 +vt 0.281250 0.500000 +vt 0.718750 0.343750 +vt 0.750000 0.250000 +vt 0.687500 0.281250 +vt 0.562500 0.468750 +vt 0.593750 0.468750 +vt 0.531250 0.687500 +vt 0.625000 0.562500 +vt 0.625000 0.500000 +vt 0.500000 0.437500 +vt 0.437500 0.468750 +vt 0.437500 0.437500 +vt 0.406250 0.406250 +vt 0.375000 0.406250 +vt 0.593750 0.562500 +vt 0.625000 0.531250 +vt 0.375000 0.687500 +vt 0.406250 0.687500 +vt 0.687500 0.312500 +vt 0.718750 0.281250 +vt 0.687500 0.281250 +vt 0.437500 0.343750 +vt 0.468750 0.312500 +vt 0.437500 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.312500 0.500000 +vt 0.343750 0.437500 +vt 0.312500 0.437500 +vt 0.687500 0.468750 +vt 0.718750 0.406250 +vt 0.687500 0.406250 +vt 0.406250 0.500000 +vt 0.406250 0.437500 +vt 0.625000 0.593750 +vt 0.656250 0.562500 +vt 0.687500 0.593750 +vt 0.625000 0.468750 +vt 0.656250 0.406250 +vt 0.718750 0.375000 +vt 0.687500 0.375000 +vt 0.406250 0.500000 +vt 0.343750 0.531250 +vt 0.343750 0.500000 +vt 0.687500 0.531250 +vt 0.718750 0.468750 +vt 0.687500 0.500000 +vt 0.281250 0.500000 +vt 0.312500 0.531250 +vt 0.343750 0.500000 +vt 0.468750 0.312500 +vt 0.468750 0.281250 +vt 0.437500 0.281250 +vt 0.656250 0.625000 +vt 0.375000 0.687500 +vt 0.375000 0.656250 +vt 0.312500 0.656250 +vt 0.312500 0.656250 +vt 0.343750 0.656250 +vt 0.343750 0.625000 +vt 0.500000 0.312500 +vt 0.531250 0.343750 +vt 0.562500 0.312500 +vt 0.531250 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.593750 0.406250 +vt 0.562500 0.406250 +vt 0.562500 0.468750 +vt 0.656250 0.500000 +vt 0.687500 0.468750 +vt 0.656250 0.468750 +vt 0.656250 0.593750 +vt 0.687500 0.531250 +vt 0.656250 0.531250 +vt 0.375000 0.500000 +vt 0.281250 0.625000 +vt 0.281250 0.593750 +vt 0.437500 0.718750 +vt 0.468750 0.687500 +vt 0.437500 0.687500 +vt 0.625000 0.500000 +vt 0.562500 0.375000 +vt 0.593750 0.406250 +vt 0.625000 0.375000 +vt 0.343750 0.593750 +vt 0.375000 0.562500 +vt 0.343750 0.562500 +vt 0.468750 0.687500 +vt 0.468750 0.656250 +vt 0.406250 0.656250 +vt 0.562500 0.687500 +vt 0.468750 0.656250 +vt 0.312500 0.531250 +vt 0.437500 0.406250 +vt 0.437500 0.343750 +vt 0.468750 0.312500 +vt 0.437500 0.312500 +vt 0.750000 0.468750 +vt 0.687500 0.500000 +vt 0.468750 0.406250 +vt 0.531250 0.375000 +vt 0.437500 0.375000 +vt 0.531250 0.468750 +vt 0.562500 0.406250 +vt 0.531250 0.406250 +vt 0.625000 0.406250 +vt 0.375000 0.406250 +vt 0.406250 0.406250 +vt 0.406250 0.375000 +vt 0.375000 0.531250 +vt 0.625000 0.562500 +vt 0.656250 0.531250 +vt 0.625000 0.531250 +vt 0.375000 0.593750 +vt 0.406250 0.562500 +vt 0.375000 0.562500 +vt 0.406250 0.531250 +vt 0.437500 0.562500 +vt 0.468750 0.656250 +vt 0.500000 0.625000 +vt 0.468750 0.625000 +vt 0.531250 0.312500 +vt 0.468750 0.343750 +vt 0.531250 0.343750 +vt 0.437500 0.437500 +vt 0.406250 0.437500 +vt 0.531250 0.375000 +vt 0.562500 0.343750 +vt 0.562500 0.625000 +vt 0.656250 0.500000 +vt 0.687500 0.468750 +vt 0.718750 0.437500 +vt 0.437500 0.500000 +vt 0.468750 0.468750 +vt 0.437500 0.468750 +vt 0.406250 0.531250 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.468750 0.562500 +vt 0.500000 0.531250 +vt 0.468750 0.531250 +vt 0.375000 0.625000 +vt 0.406250 0.593750 +vt 0.375000 0.593750 +vt 0.437500 0.562500 +vt 0.437500 0.531250 +vt 0.406250 0.531250 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.468750 0.406250 +vt 0.437500 0.468750 +vt 0.437500 0.437500 +vt 0.562500 0.500000 +vt 0.593750 0.468750 +vt 0.562500 0.468750 +vt 0.468750 0.500000 +vt 0.593750 0.406250 +vt 0.562500 0.656250 +vt 0.500000 0.656250 +vt 0.531250 0.406250 +vt 0.562500 0.375000 +vt 0.531250 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.406250 +vt 0.500000 0.562500 +vt 0.531250 0.531250 +vt 0.500000 0.531250 +vt 0.468750 0.593750 +vt 0.468750 0.562500 +vt 0.593750 0.562500 +vt 0.562500 0.562500 +vt 0.312500 0.437500 +vt 0.437500 0.437500 +vt 0.468750 0.406250 +vt 0.437500 0.406250 +vt 0.531250 0.406250 +vt 0.531250 0.437500 +vt 0.562500 0.437500 +vt 0.437500 0.500000 +vt 0.468750 0.468750 +vt 0.437500 0.468750 +vt 0.562500 0.562500 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.500000 0.468750 +vt 0.531250 0.437500 +vt 0.500000 0.437500 +vt 0.531250 0.500000 +vt 0.562500 0.468750 +vt 0.531250 0.468750 +vt 0.468750 0.500000 +vt 0.437500 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.531250 0.562500 +vt 0.531250 0.531250 +vt 0.500000 0.562500 +vt 0.500000 0.531250 +vt 0.468750 0.531250 +vt 0.562500 0.625000 +vt 0.468750 0.593750 +vt 0.468750 0.625000 +vt 0.593750 0.406250 +vt 0.625000 0.375000 +vt 0.531250 0.375000 +vt 0.531250 0.468750 +vt 0.437500 0.468750 +vt 0.625000 0.656250 +vt 0.562500 0.687500 +vt 0.625000 0.687500 +vt 0.468750 0.562500 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.343750 0.625000 +vt 0.656250 0.687500 +vt 0.656250 0.656250 +vt 0.687500 0.656250 +vt 0.312500 0.531250 +vt 0.281250 0.312500 +vt 0.281250 0.406250 +vt 0.593750 0.531250 +vt 0.625000 0.375000 +vt 0.656250 0.375000 +vt 0.375000 0.437500 +vt 0.375000 0.406250 +vt 0.718750 0.406250 +vt 0.750000 0.375000 +vt 0.656250 0.468750 +vt 0.625000 0.500000 +vt 0.468750 0.312500 +vt 0.500000 0.406250 +vt 0.250000 0.406250 +vt 0.343750 0.312500 +vt 0.250000 0.312500 +vt 0.562500 0.500000 +vt 0.250000 0.750000 +vt 0.281250 0.687500 +vt 0.343750 0.718750 +vt 0.468750 0.625000 +vt 0.375000 0.625000 +vt 0.468750 0.343750 +vt 0.625000 0.406250 +vt 0.656250 0.375000 +vt 0.562500 0.343750 +vt 0.250000 0.625000 +vt 0.250000 0.500000 +vt 0.593750 0.593750 +vt 0.593750 0.562500 +vt 0.625000 0.593750 +vt 0.406250 0.531250 +vt 0.406250 0.500000 +vt 0.468750 0.312500 +vt 0.437500 0.343750 +vt 0.437500 0.312500 +vt 0.625000 0.375000 +vt 0.593750 0.406250 +vt 0.593750 0.375000 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.375000 0.593750 +vt 0.406250 0.625000 +vt 0.375000 0.656250 +vt 0.375000 0.625000 +vt 0.625000 0.468750 +vt 0.437500 0.437500 +vt 0.718750 0.500000 +vt 0.562500 0.375000 +vt 0.406250 0.406250 +vt 0.406250 0.375000 +vt 0.468750 0.718750 +vt 0.562500 0.718750 +vt 0.562500 0.750000 +vt 0.468750 0.343750 +vt 0.656250 0.562500 +vt 0.656250 0.500000 +vt 0.593750 0.562500 +vt 0.406250 0.593750 +vt 0.343750 0.531250 +vt 0.250000 0.406250 +vt 0.468750 0.687500 +vt 0.375000 0.687500 +vt 0.406250 0.656250 +vt 0.375000 0.625000 +vt 0.375000 0.343750 +vt 0.312500 0.312500 +vt 0.437500 0.312500 +vt 0.406250 0.656250 +vt 0.343750 0.656250 +vt 0.500000 0.500000 +vt 0.593750 0.500000 +vt 0.468750 0.375000 +vt 0.437500 0.406250 +vt 0.437500 0.375000 +vt 0.406250 0.562500 +vt 0.343750 0.406250 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.468750 0.562500 +vt 0.437500 0.593750 +vt 0.437500 0.562500 +vt 0.593750 0.562500 +vt 0.343750 0.562500 +vt 0.343750 0.500000 +vt 0.437500 0.625000 +vt 0.406250 0.531250 +vt 0.343750 0.625000 +vt 0.593750 0.468750 +vt 0.593750 0.406250 +vt 0.562500 0.375000 +vt 0.531250 0.375000 +vt 0.468750 0.687500 +vt 0.562500 0.687500 +vt 0.437500 0.531250 +vt 0.468750 0.593750 +vt 0.531250 0.593750 +vt 0.468750 0.375000 +vt 0.437500 0.406250 +vt 0.531250 0.500000 +vt 0.531250 0.468750 +vt 0.593750 0.500000 +vt 0.468750 0.437500 +vt 0.468750 0.406250 +vt 0.562500 0.406250 +vt 0.531250 0.437500 +vt 0.468750 0.531250 +vt 0.562500 0.531250 +vt 0.531250 0.562500 +vt 0.468750 0.500000 +vt 0.437500 0.531250 +vt 0.531250 0.406250 +vt 0.531250 0.468750 +vt 0.500000 0.468750 +vt 0.593750 0.468750 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.500000 0.437500 +vt 0.531250 0.437500 +vt 0.687500 0.343750 +vt 0.718750 0.343750 +vt 0.718750 0.312500 +vt 0.375000 0.343750 +vt 0.687500 0.343750 +vt 0.625000 0.343750 +vt 0.468750 0.593750 +vt 0.656250 0.687500 +vt 0.656250 0.656250 +vt 0.687500 0.625000 +vt 0.718750 0.593750 +vt 0.750000 0.625000 +vt 0.312500 0.375000 +vt 0.500000 0.312500 +vt 0.406250 0.312500 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.312500 +vt 0.468750 0.437500 +vt 0.531250 0.375000 +vt 0.343750 0.375000 +vt 0.468750 0.625000 +vt 0.375000 0.625000 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.343750 0.406250 +vt 0.406250 0.437500 +vt 0.468750 0.406250 +vt 0.500000 0.468750 +vt 0.468750 0.500000 +vt 0.593750 0.562500 +vt 0.562500 0.562500 +vt 0.312500 0.406250 +vt 0.281250 0.312500 +vt 0.656250 0.406250 +vt 0.718750 0.312500 +vt 0.343750 0.437500 +vt 0.625000 0.343750 +vt 0.531250 0.625000 +vt 0.531250 0.687500 +vt 0.531250 0.750000 +vt 0.468750 0.750000 +vt 0.468750 0.687500 +vt 0.343750 0.406250 +vt 0.500000 0.437500 +vt 0.406250 0.625000 +vt 0.343750 0.343750 +vt 0.281250 0.343750 +vt 0.281250 0.375000 +vt 0.500000 0.468750 +vt 0.312500 0.406250 +vt 0.500000 0.562500 +vt 0.500000 0.531250 +vt 0.531250 0.562500 +vt 0.375000 0.343750 +vt 0.375000 0.312500 +vt 0.500000 0.406250 +vt 0.531250 0.750000 +vt 0.531250 0.687500 +vt 0.468750 0.656250 +vt 0.375000 0.500000 +vt 0.500000 0.375000 +vt 0.437500 0.500000 +vt 0.406250 0.437500 +vt 0.468750 0.500000 +vt 0.375000 0.468750 +vt 0.406250 0.500000 +vt 0.656250 0.718750 +vt 0.562500 0.718750 +vt 0.625000 0.437500 +vt 0.531250 0.500000 +vt 0.625000 0.531250 +vt 0.406250 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.656250 +vt 0.531250 0.750000 +vt 0.500000 0.500000 +vt 0.406250 0.406250 +vt 0.531250 0.562500 +vt 0.625000 0.593750 +vt 0.593750 0.531250 +vt 0.468750 0.468750 +vt 0.593750 0.312500 +vt 0.375000 0.531250 +vt 0.406250 0.593750 +vt 0.468750 0.500000 +vt 0.593750 0.750000 +vt 0.531250 0.562500 +vt 0.531250 0.625000 +vt 0.562500 0.562500 +vt 0.593750 0.343750 +vt 0.593750 0.312500 +vt 0.687500 0.312500 +vt 0.343750 0.406250 +vt 0.625000 0.625000 +vt 0.375000 0.531250 +vt 0.406250 0.562500 +vt 0.531250 0.593750 +vt 0.531250 0.625000 +vt 0.531250 0.562500 +vt 0.468750 0.531250 +vt 0.437500 0.531250 +vt 0.593750 0.468750 +vt 0.562500 0.531250 +vt 0.312500 0.500000 +vt 0.343750 0.375000 +vt 0.437500 0.625000 +vt 0.468750 0.593750 +vt 0.625000 0.687500 +vt 0.593750 0.687500 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.718750 0.406250 +vt 0.375000 0.687500 +vt 0.437500 0.625000 +vt 0.468750 0.687500 +vt 0.468750 0.593750 +vt 0.500000 0.687500 +vt 0.593750 0.687500 +vt 0.593750 0.593750 +vt 0.468750 0.375000 +vt 0.468750 0.343750 +vt 0.375000 0.343750 +vt 0.531250 0.687500 +vt 0.500000 0.750000 +vt 0.625000 0.406250 +vt 0.343750 0.468750 +vt 0.406250 0.406250 +vt 0.312500 0.375000 +vt 0.468750 0.343750 +vt 0.468750 0.375000 +vt 0.500000 0.468750 +vt 0.656250 0.375000 +vt 0.656250 0.406250 +vt 0.281250 0.312500 +vt 0.281250 0.343750 +vt 0.312500 0.437500 +vt 0.343750 0.437500 +vt 0.500000 0.593750 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.562500 +vt 0.406250 0.562500 +vt 0.562500 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.312500 +vt 0.437500 0.312500 +vt 0.468750 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.468750 +vt 0.312500 0.312500 +vt 0.250000 0.312500 +vt 0.312500 0.406250 +vt 0.406250 0.406250 +vt 0.468750 0.593750 +vt 0.343750 0.437500 +vt 0.281250 0.437500 +vt 0.281250 0.406250 +vt 0.718750 0.312500 +vt 0.406250 0.406250 +vt 0.312500 0.500000 +vt 0.343750 0.312500 +vt 0.375000 0.312500 +vt 0.531250 0.593750 +vt 0.406250 0.406250 +vt 0.562500 0.500000 +vt 0.593750 0.406250 +vt 0.593750 0.437500 +vt 0.625000 0.343750 +vt 0.656250 0.343750 +vt 0.593750 0.468750 +vt 0.593750 0.437500 +vt 0.562500 0.656250 +vt 0.468750 0.656250 +vt 0.500000 0.593750 +vt 0.531250 0.593750 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.531250 0.406250 +vt 0.500000 0.375000 +vt 0.593750 0.437500 +vt 0.593750 0.468750 +vt 0.437500 0.343750 +vt 0.437500 0.375000 +vt 0.375000 0.625000 +vt 0.406250 0.625000 +vt 0.312500 0.406250 +vt 0.750000 0.437500 +vt 0.343750 0.468750 +vt 0.593750 0.250000 +vt 0.625000 0.593750 +vt 0.562500 0.593750 +vt 0.562500 0.562500 +vt 0.562500 0.437500 +vt 0.343750 0.500000 +vt 0.437500 0.500000 +vt 0.468750 0.500000 +vt 0.437500 0.468750 +vt 0.406250 0.593750 +vt 0.406250 0.500000 +vt 0.468750 0.531250 +vt 0.500000 0.531250 +vt 0.625000 0.375000 +vt 0.656250 0.406250 +vt 0.656250 0.531250 +vt 0.531250 0.531250 +vt 0.531250 0.437500 +vt 0.718750 0.625000 +vt 0.687500 0.625000 +vt 0.656250 0.656250 +vt 0.562500 0.750000 +vt 0.687500 0.250000 +vt 0.750000 0.250000 +vt 0.750000 0.343750 +vt 0.656250 0.562500 +vt 0.625000 0.562500 +vt 0.500000 0.281250 +vt 0.656250 0.531250 +vt 0.687500 0.531250 +vt 0.406250 0.500000 +vt 0.375000 0.281250 +vt 0.437500 0.406250 +vt 0.625000 0.375000 +vt 0.656250 0.375000 +vt 0.687500 0.531250 +vt 0.687500 0.500000 +vt 0.593750 0.625000 +vt 0.625000 0.312500 +vt 0.656250 0.312500 +vt 0.656250 0.343750 +vt 0.593750 0.437500 +vt 0.593750 0.500000 +vt 0.593750 0.750000 +vt 0.593750 0.687500 +vt 0.468750 0.687500 +vt 0.437500 0.625000 +vt 0.468750 0.750000 +vt 0.437500 0.500000 +vt 0.531250 0.500000 +vt 0.656250 0.406250 +vt 0.312500 0.437500 +vt 0.343750 0.437500 +vt 0.437500 0.343750 +vt 0.437500 0.656250 +vt 0.687500 0.312500 +vt 0.687500 0.406250 +vt 0.593750 0.687500 +vt 0.500000 0.500000 +vt 0.375000 0.687500 +vt 0.375000 0.593750 +vt 0.593750 0.687500 +vt 0.281250 0.437500 +vt 0.312500 0.468750 +vt 0.312500 0.406250 +vt 0.375000 0.406250 +vt 0.656250 0.593750 +vt 0.562500 0.562500 +vt 0.406250 0.500000 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.312500 0.375000 +vt 0.375000 0.406250 +vt 0.468750 0.406250 +vt 0.375000 0.312500 +vt 0.687500 0.406250 +vt 0.281250 0.406250 +vt 0.625000 0.562500 +vt 0.375000 0.406250 +vt 0.437500 0.312500 +vt 0.343750 0.312500 +vt 0.343750 0.406250 +vt 0.468750 0.437500 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.718750 0.406250 +vt 0.343750 0.343750 +vt 0.437500 0.343750 +vt 0.437500 0.437500 +vt 0.281250 0.375000 +vt 0.437500 0.531250 +vt 0.437500 0.500000 +vt 0.468750 0.437500 +vt 0.593750 0.593750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.625000 0.437500 +vt 0.625000 0.406250 +vt 0.687500 0.406250 +vt 0.375000 0.468750 +vt 0.312500 0.375000 +vt 0.343750 0.375000 +vt 0.343750 0.343750 +vt 0.375000 0.312500 +vt 0.562500 0.312500 +vt 0.562500 0.406250 +vt 0.562500 0.437500 +vt 0.468750 0.468750 +vt 0.656250 0.500000 +vt 0.656250 0.562500 +vt 0.656250 0.468750 +vt 0.687500 0.375000 +vt 0.718750 0.375000 +vt 0.687500 0.593750 +vt 0.562500 0.406250 +vt 0.625000 0.468750 +vt 0.625000 0.500000 +vt 0.468750 0.593750 +vt 0.406250 0.687500 +vt 0.468750 0.406250 +vt 0.437500 0.437500 +vt 0.500000 0.437500 +vt 0.468750 0.468750 +vt 0.468750 0.500000 +vt 0.343750 0.343750 +vt 0.312500 0.375000 +vt 0.593750 0.531250 +vt 0.531250 0.750000 +vt 0.468750 0.750000 +vt 0.468750 0.687500 +vt 0.531250 0.687500 +vt 0.656250 0.531250 +vt 0.593750 0.531250 +vt 0.625000 0.312500 +vt 0.437500 0.500000 +vt 0.468750 0.437500 +vt 0.375000 0.562500 +vt 0.343750 0.562500 +vt 0.562500 0.500000 +vt 0.625000 0.531250 +vt 0.562500 0.625000 +vt 0.468750 0.625000 +vt 0.468750 0.531250 +vt 0.562500 0.437500 +vt 0.625000 0.437500 +vt 0.625000 0.406250 +vt 0.718750 0.406250 +vt 0.718750 0.500000 +vt 0.687500 0.468750 +vt 0.656250 0.406250 +vt 0.625000 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.437500 +vt 0.531250 0.437500 +vt 0.531250 0.500000 +vt 0.687500 0.406250 +vt 0.531250 0.281250 +vt 0.531250 0.312500 +vt 0.562500 0.343750 +vt 0.468750 0.593750 +vt 0.281250 0.312500 +vt 0.281250 0.406250 +vt 0.437500 0.593750 +vt 0.593750 0.500000 +vt 0.656250 0.625000 +vt 0.687500 0.437500 +vt 0.468750 0.531250 +vt 0.468750 0.562500 +vt 0.531250 0.531250 +vt 0.562500 0.656250 +vt 0.562500 0.625000 +vt 0.281250 0.312500 +vt 0.281250 0.343750 +vt 0.250000 0.312500 +vt 0.312500 0.500000 +vt 0.625000 0.437500 +vt 0.625000 0.468750 +vt 0.562500 0.500000 +vt 0.562500 0.437500 +vt 0.468750 0.500000 +vt 0.500000 0.625000 +vt 0.468750 0.687500 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.562500 0.312500 +vt 0.656250 0.312500 +vt 0.531250 0.593750 +vt 0.500000 0.625000 +vt 0.625000 0.531250 +vt 0.531250 0.625000 +vt 0.562500 0.593750 +vt 0.562500 0.656250 +vt 0.593750 0.687500 +vt 0.656250 0.500000 +vt 0.531250 0.687500 +vt 0.625000 0.687500 +vt 0.562500 0.500000 +vt 0.593750 0.625000 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.468750 0.625000 +vt 0.468750 0.562500 +vt 0.625000 0.312500 +vt 0.531250 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.656250 +vt 0.531250 0.531250 +vt 0.687500 0.312500 +vt 0.312500 0.343750 +vt 0.718750 0.375000 +vt 0.625000 0.343750 +vt 0.437500 0.500000 +vt 0.437500 0.437500 +vt 0.406250 0.437500 +vt 0.406250 0.593750 +vt 0.343750 0.687500 +vt 0.625000 0.437500 +vt 0.625000 0.312500 +vt 0.718750 0.312500 +vt 0.718750 0.406250 +vt 0.687500 0.375000 +vt 0.656250 0.406250 +vt 0.656250 0.406250 +vt 0.656250 0.312500 +vt 0.437500 0.312500 +vt 0.375000 0.406250 +vt 0.375000 0.312500 +vt 0.593750 0.312500 +vt 0.687500 0.375000 +vt 0.718750 0.375000 +vt 0.687500 0.343750 +vt 0.656250 0.343750 +vt 0.687500 0.343750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.718750 0.375000 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.250000 0.437500 +vt 0.468750 0.687500 +vt 0.750000 0.312500 +vt 0.656250 0.312500 +vt 0.312500 0.343750 +vt 0.437500 0.687500 +vt 0.656250 0.312500 +vt 0.687500 0.437500 +vt 0.437500 0.593750 +vt 0.343750 0.437500 +vt 0.437500 0.468750 +vt 0.468750 0.468750 +vt 0.406250 0.468750 +vt 0.375000 0.343750 +vt 0.562500 0.343750 +vt 0.531250 0.406250 +vt 0.562500 0.406250 +vt 0.687500 0.406250 +vt 0.656250 0.406250 +vt 0.750000 0.406250 +vt 0.375000 0.437500 +vt 0.468750 0.312500 +vt 0.562500 0.312500 +vt 0.343750 0.406250 +vt 0.375000 0.406250 +vt 0.281250 0.312500 +vt 0.281250 0.406250 +vt 0.687500 0.406250 +vt 0.406250 0.343750 +vt 0.437500 0.375000 +vt 0.500000 0.343750 +vt 0.500000 0.375000 +vt 0.468750 0.500000 +vt 0.593750 0.406250 +vt 0.750000 0.312500 +vt 0.500000 0.437500 +vt 0.468750 0.437500 +vt 0.468750 0.468750 +vt 0.531250 0.406250 +vt 0.375000 0.500000 +vt 0.656250 0.531250 +vt 0.718750 0.343750 +vt 0.718750 0.375000 +vt 0.562500 0.531250 +vt 0.593750 0.625000 +vt 0.468750 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.343750 +vt 0.656250 0.343750 +vt 0.625000 0.375000 +vt 0.500000 0.437500 +vt 0.468750 0.468750 +vt 0.375000 0.593750 +vt 0.687500 0.500000 +vt 0.468750 0.625000 +vt 0.656250 0.406250 +vt 0.656250 0.468750 +vt 0.281250 0.531250 +vt 0.312500 0.531250 +vt 0.406250 0.531250 +vt 0.562500 0.625000 +vt 0.468750 0.500000 +vt 0.531250 0.437500 +vt 0.406250 0.593750 +vt 0.406250 0.687500 +vt 0.500000 0.500000 +vt 0.500000 0.406250 +vt 0.593750 0.406250 +vt 0.468750 0.531250 +vt 0.468750 0.625000 +vt 0.437500 0.625000 +vt 0.625000 0.593750 +vt 0.593750 0.562500 +vt 0.625000 0.531250 +vt 0.406250 0.687500 +vt 0.500000 0.687500 +vt 0.468750 0.687500 +vt 0.500000 0.750000 +vt 0.625000 0.687500 +vt 0.593750 0.562500 +vt 0.343750 0.593750 +vt 0.625000 0.312500 +vt 0.625000 0.406250 +vt 0.593750 0.312500 +vt 0.437500 0.718750 +vt 0.437500 0.750000 +vt 0.562500 0.656250 +vt 0.656250 0.750000 +vt 0.656250 0.718750 +vt 0.750000 0.718750 +vt 0.656250 0.656250 +vt 0.750000 0.625000 +vt 0.718750 0.625000 +vt 0.250000 0.750000 +vt 0.343750 0.750000 +vt 0.343750 0.718750 +vt 0.281250 0.656250 +vt 0.250000 0.656250 +vt 0.687500 0.625000 +vt 0.656250 0.625000 +vt 0.281250 0.625000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.562500 0.625000 +vt 0.250000 0.406250 +vt 0.281250 0.406250 +vt 0.312500 0.375000 +vt 0.312500 0.312500 +vt 0.437500 0.437500 +vt 0.437500 0.375000 +vt 0.687500 0.593750 +vt 0.718750 0.593750 +vt 0.750000 0.593750 +vt 0.656250 0.468750 +vt 0.750000 0.375000 +vt 0.625000 0.468750 +vt 0.625000 0.593750 +vt 0.718750 0.375000 +vt 0.656250 0.375000 +vt 0.375000 0.281250 +vt 0.593750 0.281250 +vt 0.281250 0.250000 +vt 0.375000 0.250000 +vt 0.593750 0.250000 +vt 0.468750 0.250000 +vt 0.468750 0.281250 +vt 0.750000 0.343750 +vt 0.687500 0.250000 +vt 0.500000 0.687500 +vt 0.718750 0.312500 +vt 0.468750 0.343750 +vt 0.625000 0.343750 +vt 0.343750 0.500000 +vt 0.718750 0.468750 +vt 0.375000 0.500000 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.687500 0.562500 +vt 0.593750 0.500000 +vt 0.687500 0.468750 +vt 0.656250 0.500000 +vt 0.281250 0.593750 +vt 0.312500 0.593750 +vt 0.437500 0.312500 +vt 0.437500 0.343750 +vt 0.562500 0.625000 +vt 0.562500 0.531250 +vt 0.281250 0.656250 +vt 0.312500 0.593750 +vt 0.625000 0.343750 +vt 0.562500 0.531250 +vt 0.593750 0.468750 +vt 0.531250 0.562500 +vt 0.562500 0.562500 +vt 0.531250 0.468750 +vt 0.687500 0.593750 +vt 0.375000 0.343750 +vt 0.437500 0.437500 +vt 0.437500 0.406250 +vt 0.312500 0.625000 +vt 0.656250 0.500000 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.375000 0.687500 +vt 0.562500 0.656250 +vt 0.437500 0.531250 +vt 0.750000 0.593750 +vt 0.531250 0.406250 +vt 0.562500 0.468750 +vt 0.343750 0.562500 +vt 0.656250 0.562500 +vt 0.468750 0.562500 +vt 0.500000 0.656250 +vt 0.468750 0.312500 +vt 0.656250 0.625000 +vt 0.656250 0.468750 +vt 0.718750 0.500000 +vt 0.468750 0.500000 +vt 0.406250 0.625000 +vt 0.468750 0.562500 +vt 0.500000 0.437500 +vt 0.468750 0.531250 +vt 0.593750 0.531250 +vt 0.281250 0.531250 +vt 0.468750 0.437500 +vt 0.562500 0.468750 +vt 0.593750 0.468750 +vt 0.593750 0.406250 +vt 0.593750 0.562500 +vt 0.531250 0.593750 +vt 0.437500 0.562500 +vt 0.562500 0.593750 +vt 0.531250 0.406250 +vt 0.562500 0.656250 +vt 0.468750 0.593750 +vt 0.656250 0.375000 +vt 0.718750 0.281250 +vt 0.687500 0.312500 +vt 0.687500 0.281250 +vt 0.468750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.312500 +vt 0.468750 0.312500 +vt 0.375000 0.312500 +vt 0.312500 0.281250 +vt 0.375000 0.281250 +vt 0.437500 0.375000 +vt 0.406250 0.375000 +vt 0.312500 0.312500 +vt 0.281250 0.406250 +vt 0.281250 0.312500 +vt 0.312500 0.406250 +vt 0.375000 0.406250 +vt 0.406250 0.406250 +vt 0.343750 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.625000 +vt 0.375000 0.656250 +vt 0.281250 0.625000 +vt 0.281250 0.500000 +vt 0.562500 0.656250 +vt 0.437500 0.687500 +vt 0.562500 0.687500 +vt 0.656250 0.718750 +vt 0.437500 0.718750 +vt 0.343750 0.687500 +vt 0.343750 0.718750 +vt 0.281250 0.718750 +vt 0.312500 0.656250 +vt 0.281250 0.656250 +vt 0.687500 0.625000 +vt 0.718750 0.625000 +vt 0.718750 0.687500 +vt 0.312500 0.500000 +vt 0.281250 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.281250 +vt 0.250000 0.312500 +vt 0.750000 0.468750 +vt 0.593750 0.312500 +vt 0.343750 0.406250 +vt 0.562500 0.468750 +vt 0.250000 0.656250 +vt 0.375000 0.718750 +vt 0.343750 0.750000 +vt 0.375000 0.531250 +vt 0.500000 0.343750 +vt 0.656250 0.406250 +vt 0.625000 0.468750 +vt 0.312500 0.500000 +vt 0.656250 0.656250 +vt 0.625000 0.656250 +vt 0.625000 0.562500 +vt 0.406250 0.562500 +vt 0.468750 0.343750 +vt 0.625000 0.406250 +vt 0.687500 0.500000 +vt 0.437500 0.750000 +vt 0.531250 0.343750 +vt 0.437500 0.593750 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.281250 0.406250 +vt 0.281250 0.687500 +vt 0.281250 0.593750 +vt 0.312500 0.593750 +vt 0.468750 0.718750 +vt 0.375000 0.718750 +vt 0.562500 0.312500 +vt 0.625000 0.312500 +vt 0.375000 0.437500 +vt 0.312500 0.437500 +vt 0.437500 0.281250 +vt 0.531250 0.281250 +vt 0.343750 0.593750 +vt 0.500000 0.437500 +vt 0.468750 0.406250 +vt 0.312500 0.343750 +vt 0.437500 0.531250 +vt 0.468750 0.656250 +vt 0.500000 0.593750 +vt 0.562500 0.593750 +vt 0.625000 0.500000 +vt 0.531250 0.406250 +vt 0.593750 0.468750 +vt 0.531250 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.562500 0.437500 +vt 0.500000 0.531250 +vt 0.468750 0.468750 +vt 0.437500 0.531250 +vt 0.437500 0.468750 +vt 0.468750 0.406250 +vt 0.562500 0.593750 +vt 0.531250 0.531250 +vt 0.500000 0.593750 +vt 0.531250 0.500000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +usemtl geyser +s off +f 421/1/1 187/2/1 537/3/1 +f 613/4/2 618/5/2 619/6/2 +f 419/7/2 549/8/2 546/9/2 +f 415/10/2 289/11/2 183/12/2 +f 83/13/2 210/14/2 325/15/2 +f 630/16/3 266/17/3 388/18/3 +f 368/19/4 593/20/4 249/21/4 +f 706/22/1 703/23/1 577/24/1 +f 13/25/4 29/26/4 522/27/4 +f 408/28/1 279/29/1 535/30/1 +f 484/31/5 3/32/5 31/33/5 +f 649/34/2 538/35/2 186/36/2 +f 105/37/2 692/38/2 569/39/2 +f 256/40/5 512/41/5 149/42/5 +f 528/43/3 628/44/3 627/45/3 +f 198/46/5 672/47/5 105/48/5 +f 267/49/4 256/50/4 253/51/4 +f 35/52/4 283/53/4 258/54/4 +f 166/55/1 184/56/1 302/57/1 +f 582/58/4 702/59/4 109/60/4 +f 475/61/4 620/62/4 362/63/4 +f 248/64/5 146/65/5 629/66/5 +f 3/67/4 485/68/4 476/69/4 +f 248/70/4 389/71/4 366/72/4 +f 367/73/4 150/74/4 646/75/4 +f 532/76/4 36/77/4 380/78/4 +f 391/79/4 515/80/4 513/81/4 +f 287/82/4 618/83/4 613/84/4 +f 255/85/4 508/86/4 510/87/4 +f 271/88/4 516/89/4 164/90/4 +f 232/91/5 579/92/5 111/93/5 +f 621/94/1 596/95/1 597/96/1 +f 639/97/4 524/98/4 275/99/4 +f 345/100/4 331/101/4 92/102/4 +f 536/103/4 268/104/4 49/105/4 +f 26/106/4 617/107/4 260/108/4 +f 226/109/6 216/110/6 220/111/6 +f 552/112/4 304/113/4 78/114/4 +f 13/115/2 151/116/2 141/117/2 +f 444/118/6 555/119/6 202/120/6 +f 190/121/4 279/29/4 61/122/4 +f 202/123/2 551/124/2 429/125/2 +f 420/126/1 316/127/1 95/128/1 +f 544/129/4 536/103/4 535/30/4 +f 165/130/1 304/113/1 414/131/1 +f 466/132/4 356/133/4 359/134/4 +f 413/135/4 648/136/4 406/137/4 +f 455/138/2 339/139/2 459/140/2 +f 42/141/1 546/142/1 514/143/1 +f 239/144/1 237/145/1 717/146/1 +f 54/147/4 56/148/4 289/149/4 +f 301/150/4 52/151/4 394/152/4 +f 420/126/4 538/153/4 650/154/4 +f 72/155/3 563/156/3 437/157/3 +f 558/158/4 543/159/4 539/160/4 +f 559/161/4 292/162/4 525/163/4 +f 84/164/4 278/165/4 560/166/4 +f 665/167/2 561/168/2 663/169/2 +f 189/170/4 407/171/4 541/172/4 +f 319/173/4 653/174/4 542/175/4 +f 564/176/4 548/177/4 426/178/4 +f 355/179/5 130/180/5 127/181/5 +f 316/127/4 558/158/4 660/182/4 +f 519/183/4 273/184/4 66/185/4 +f 324/186/4 695/187/4 100/188/4 +f 433/189/4 662/190/4 434/191/4 +f 340/192/3 97/193/3 694/194/3 +f 436/195/4 563/196/4 422/197/4 +f 399/198/5 364/199/5 18/200/5 +f 1/201/5 636/202/5 35/203/5 +f 78/114/4 76/204/4 93/205/4 +f 676/206/4 416/207/4 441/208/4 +f 719/209/6 121/210/6 124/211/6 +f 92/212/6 451/213/6 345/214/6 +f 91/215/4 663/216/4 689/217/4 +f 686/218/4 433/189/4 88/219/4 +f 209/220/4 89/221/4 203/222/4 +f 504/223/5 609/224/5 23/225/5 +f 541/226/5 540/227/5 46/228/5 +f 224/229/1 317/230/1 679/231/1 +f 569/232/4 451/233/4 320/234/4 +f 661/235/5 323/236/5 324/237/5 +f 202/238/4 429/239/4 449/240/4 +f 548/241/5 87/242/5 301/243/5 +f 59/244/5 69/245/5 70/246/5 +f 444/118/5 686/247/5 88/248/5 +f 697/249/4 338/250/4 692/251/4 +f 245/252/1 139/253/1 140/254/1 +f 698/255/4 332/256/4 337/257/4 +f 230/258/4 453/259/4 461/260/4 +f 713/261/6 718/262/6 130/180/6 +f 49/263/2 268/264/2 171/265/2 +f 235/266/4 225/267/4 226/268/4 +f 113/269/4 582/58/4 581/270/4 +f 634/271/1 160/272/1 256/50/1 +f 97/273/4 215/274/4 95/128/4 +f 381/275/6 505/276/6 372/277/6 +f 590/278/4 462/279/4 707/280/4 +f 717/146/4 588/281/4 126/282/4 +f 124/283/4 350/284/4 123/285/4 +f 711/286/4 708/287/4 716/288/4 +f 291/289/2 65/290/2 303/291/2 +f 388/292/1 138/293/1 365/294/1 +f 622/295/4 595/296/4 39/297/4 +f 371/298/1 503/299/1 592/300/1 +f 375/301/1 504/302/1 2/303/1 +f 263/304/1 622/295/1 10/305/1 +f 306/306/4 651/307/4 528/308/4 +f 378/309/1 507/310/1 145/311/1 +f 606/312/1 148/313/1 6/314/1 +f 195/315/1 295/316/1 34/317/1 +f 23/318/1 636/319/1 469/320/1 +f 230/321/5 572/322/5 96/323/5 +f 228/324/4 229/325/4 456/326/4 +f 153/327/1 613/84/1 152/328/1 +f 269/329/6 171/330/6 411/331/6 +f 394/332/6 164/333/6 597/334/6 +f 409/335/6 668/336/6 72/337/6 +f 32/338/1 602/339/1 364/340/1 +f 22/341/4 141/342/4 370/343/4 +f 134/344/6 483/345/6 363/346/6 +f 700/347/6 214/348/6 234/349/6 +f 393/350/1 285/351/1 381/352/1 +f 162/353/1 637/354/1 404/355/1 +f 164/90/1 638/356/1 618/83/1 +f 361/357/6 133/358/6 382/359/6 +f 28/360/1 270/361/1 621/94/1 +f 383/362/1 418/363/1 260/108/1 +f 126/364/6 357/365/6 118/366/6 +f 518/367/6 55/368/6 649/369/6 +f 167/370/1 307/371/1 526/372/1 +f 168/373/1 294/374/1 178/375/1 +f 672/47/6 569/376/6 439/377/6 +f 703/378/3 344/379/3 704/380/3 +f 628/381/4 652/382/4 19/383/4 +f 419/384/6 77/385/6 442/386/6 +f 81/387/5 95/388/5 684/389/5 +f 390/390/1 411/391/1 171/392/1 +f 37/393/1 647/394/1 533/395/1 +f 532/396/3 284/397/3 35/398/3 +f 121/399/3 120/400/3 354/401/3 +f 327/402/1 318/403/1 192/404/1 +f 63/405/1 311/406/1 402/407/1 +f 324/186/1 554/408/1 661/409/1 +f 179/410/1 545/411/1 50/412/1 +f 417/413/1 181/414/1 180/415/1 +f 392/416/6 514/143/6 547/417/6 +f 589/418/3 714/419/3 236/420/3 +f 426/421/2 181/422/2 413/423/2 +f 541/172/1 661/409/1 651/307/1 +f 534/424/1 32/338/1 169/425/1 +f 411/391/4 298/426/4 669/427/4 +f 655/428/1 670/429/1 424/430/1 +f 416/207/1 313/431/1 548/177/1 +f 510/432/2 509/433/2 147/434/2 +f 110/435/1 565/436/1 205/437/1 +f 635/438/3 171/265/3 269/439/3 +f 23/440/3 609/441/3 613/4/3 +f 566/442/2 327/443/2 681/444/2 +f 162/445/2 258/446/2 615/447/2 +f 218/448/1 217/449/1 323/450/1 +f 310/451/1 680/452/1 562/453/1 +f 72/454/1 86/455/1 563/196/1 +f 332/256/1 337/257/1 206/456/1 +f 656/457/1 448/458/1 329/459/1 +f 372/460/2 503/461/2 151/116/2 +f 95/388/6 552/462/6 420/463/6 +f 262/464/4 363/465/4 599/466/4 +f 92/102/1 696/467/1 673/468/1 +f 686/218/1 340/469/1 443/470/1 +f 448/471/3 336/472/3 693/473/3 +f 446/474/4 450/475/4 705/476/4 +f 423/477/4 47/478/4 60/479/4 +f 714/480/4 127/481/4 130/482/4 +f 570/483/1 567/484/1 581/270/1 +f 158/485/5 144/486/5 602/487/5 +f 611/488/2 514/489/2 381/490/2 +f 575/491/1 343/492/1 342/493/1 +f 81/494/1 175/495/1 176/496/1 +f 339/497/1 460/498/1 459/499/1 +f 228/324/1 111/500/1 580/501/1 +f 530/502/5 494/503/5 145/504/5 +f 354/505/1 213/506/1 458/507/1 +f 349/508/1 214/509/1 574/510/1 +f 353/511/1 708/287/1 584/512/1 +f 693/513/1 336/514/1 465/515/1 +f 234/516/1 466/132/1 117/517/1 +f 719/518/1 238/519/1 720/520/1 +f 178/521/5 603/522/5 252/523/5 +f 665/524/5 293/525/5 309/526/5 +f 336/527/6 430/528/6 659/529/6 +f 196/530/4 439/531/4 425/532/4 +f 684/533/4 557/534/4 81/494/4 +f 414/535/5 11/536/5 9/537/5 +f 261/538/5 383/539/5 250/540/5 +f 142/541/5 13/542/5 598/543/5 +f 249/544/5 244/545/5 245/546/5 +f 40/547/5 599/548/5 12/549/5 +f 260/550/5 595/551/5 133/358/5 +f 103/552/4 104/553/4 105/554/4 +f 510/555/5 606/556/5 255/557/5 +f 608/558/5 242/559/5 243/560/5 +f 218/448/4 319/173/4 664/561/4 +f 622/562/5 597/334/5 10/563/5 +f 14/564/5 624/565/5 263/566/5 +f 344/567/4 566/568/4 82/569/4 +f 579/570/1 233/571/1 697/249/1 +f 71/572/6 194/573/6 170/574/6 +f 159/575/5 508/576/5 21/577/5 +f 691/578/4 206/456/4 312/579/4 +f 633/580/5 631/581/5 267/582/5 +f 611/583/5 285/584/5 50/585/5 +f 615/586/5 392/416/5 393/587/5 +f 436/195/4 90/588/4 577/24/4 +f 618/589/5 163/590/5 616/591/5 +f 621/592/5 271/593/5 164/333/5 +f 516/594/5 273/595/5 272/596/5 +f 640/597/5 626/598/5 174/599/5 +f 42/600/5 30/601/5 290/602/5 +f 301/150/1 405/603/1 394/152/1 +f 182/604/4 675/605/4 79/606/4 +f 279/607/5 542/608/5 377/609/5 +f 145/311/4 495/610/4 487/611/4 +f 183/612/5 289/613/5 53/614/5 +f 174/599/6 537/615/6 185/616/6 +f 170/574/5 150/617/5 268/618/5 +f 602/619/3 601/620/3 18/621/3 +f 55/368/5 291/622/5 45/623/5 +f 63/624/5 536/625/5 49/626/5 +f 681/444/3 678/627/3 204/628/3 +f 302/629/5 200/630/5 417/631/5 +f 305/632/5 78/114/5 304/113/5 +f 54/633/5 659/529/5 184/634/5 +f 649/369/5 420/463/5 650/635/5 +f 538/636/5 554/637/5 306/638/5 +f 97/639/5 340/640/5 117/641/5 +f 651/642/5 557/643/5 176/644/5 +f 250/645/4 14/646/4 506/647/4 +f 543/648/5 189/649/5 541/226/5 +f 197/650/5 73/651/5 283/652/5 +f 434/653/5 558/654/5 539/655/5 +f 27/656/4 381/352/4 393/350/4 +f 64/657/5 199/658/5 549/659/5 +f 200/630/5 441/660/5 416/661/5 +f 230/258/1 221/662/1 120/663/1 +f 84/664/5 436/665/5 422/666/5 +f 192/667/5 210/668/5 559/161/5 +f 400/669/4 4/670/4 44/671/4 +f 218/672/5 326/673/5 212/674/5 +f 83/675/5 190/676/5 292/677/5 +f 112/678/4 341/679/4 94/680/4 +f 42/141/4 81/494/4 43/681/4 +f 568/682/5 561/683/5 319/684/5 +f 100/685/5 663/686/5 189/649/5 +f 553/687/5 676/688/5 322/689/5 +f 654/690/5 673/691/5 161/692/5 +f 426/693/6 406/694/6 163/590/6 +f 379/695/6 532/696/6 380/697/6 +f 401/698/4 605/699/4 137/700/4 +f 23/440/2 513/701/2 616/702/2 +f 570/703/5 429/704/5 551/705/5 +f 24/706/5 475/707/5 370/708/5 +f 680/709/5 436/665/5 577/710/5 +f 337/711/5 76/712/5 206/713/5 +f 334/714/5 571/715/5 333/716/5 +f 208/717/5 695/718/5 98/719/5 +f 336/527/5 335/720/5 315/721/5 +f 678/627/5 317/722/5 421/723/5 +f 107/724/5 440/725/5 331/726/5 +f 221/662/4 122/727/4 457/728/4 +f 522/729/5 277/730/5 44/731/5 +f 310/732/5 544/733/5 311/734/5 +f 338/735/5 698/736/5 337/711/5 +f 353/737/5 339/497/5 346/738/5 +f 120/739/6 222/740/6 119/741/6 +f 6/314/5 148/313/5 137/742/5 +f 588/743/5 222/740/5 119/741/5 +f 109/744/5 463/745/5 575/746/5 +f 344/747/5 90/748/5 327/402/5 +f 699/749/5 229/750/5 228/751/5 +f 354/752/5 221/753/5 213/754/5 +f 577/755/2 576/756/2 109/744/2 +f 717/757/5 357/365/5 360/758/5 +f 110/759/5 233/760/5 351/761/5 +f 329/762/5 328/763/5 675/764/5 +f 307/765/5 525/766/5 526/767/5 +f 350/284/5 701/768/5 114/769/5 +f 635/770/1 269/771/1 607/772/1 +f 462/773/5 589/774/5 234/349/5 +f 122/775/5 124/211/5 123/776/5 +f 190/777/2 539/778/2 543/779/2 +f 115/780/4 579/570/4 232/781/4 +f 530/782/4 148/313/4 6/314/4 +f 331/101/1 321/783/1 572/784/1 +f 529/785/6 364/199/6 5/786/6 +f 249/544/6 503/787/6 368/788/6 +f 504/223/6 7/789/6 2/790/6 +f 141/791/6 371/298/6 370/708/6 +f 492/792/1 156/793/1 483/794/1 +f 156/795/2 528/43/2 517/796/2 +f 160/797/2 511/798/2 512/799/2 +f 32/800/5 534/801/5 278/802/5 +f 430/803/3 656/804/3 658/805/3 +f 507/806/6 21/577/6 145/504/6 +f 47/807/6 604/808/6 146/65/6 +f 148/313/6 378/809/6 6/314/6 +f 531/810/6 147/811/6 605/812/6 +f 325/813/5 220/111/5 99/814/5 +f 646/815/6 172/816/6 390/817/6 +f 642/818/1 276/819/1 155/820/1 +f 594/821/6 373/822/6 152/823/6 +f 407/171/4 309/824/4 386/825/4 +f 625/826/6 275/827/6 376/828/6 +f 620/829/6 13/542/6 598/543/6 +f 399/198/6 534/801/6 642/830/6 +f 603/522/6 489/831/6 488/832/6 +f 118/833/4 119/834/4 222/835/4 +f 607/836/6 269/329/6 388/837/6 +f 403/838/3 281/839/3 401/840/3 +f 43/841/6 17/842/6 385/843/6 +f 359/844/5 125/845/5 358/846/5 +f 136/847/1 137/700/1 280/848/1 +f 286/849/6 513/850/6 36/851/6 +f 607/772/4 147/852/4 269/771/4 +f 170/853/1 254/854/1 150/74/1 +f 598/855/1 141/342/1 370/343/1 +f 343/856/5 231/857/5 349/858/5 +f 57/859/6 627/860/6 523/861/6 +f 59/244/6 397/862/6 157/863/6 +f 708/864/3 351/865/3 233/866/3 +f 650/154/1 550/867/1 65/868/1 +f 653/869/6 544/733/6 535/870/6 +f 626/871/1 625/872/1 3/67/1 +f 652/873/6 377/609/6 19/874/6 +f 307/765/6 421/723/6 58/875/6 +f 69/245/6 46/228/6 177/876/6 +f 83/675/6 643/877/6 292/677/6 +f 639/878/5 521/879/5 276/880/5 +f 110/881/3 106/882/3 104/883/3 +f 361/884/1 610/885/1 472/886/1 +f 291/622/6 45/623/6 81/387/6 +f 314/887/6 415/888/6 648/889/6 +f 608/890/1 243/891/1 249/21/1 +f 550/892/6 304/113/6 65/893/6 +f 192/667/6 167/894/6 641/895/6 +f 437/896/6 86/897/6 204/898/6 +f 611/583/1 151/899/1 251/900/1 +f 562/901/6 680/709/6 422/666/6 +f 661/235/6 539/655/6 651/642/6 +f 663/686/6 541/226/6 540/227/6 +f 561/683/6 542/608/6 407/902/6 +f 556/903/6 201/904/6 173/905/6 +f 470/906/5 610/907/5 257/908/5 +f 647/909/6 424/910/6 196/911/6 +f 202/120/6 538/636/6 660/912/6 +f 534/424/4 32/338/4 158/913/4 +f 423/914/6 62/915/6 631/581/6 +f 675/764/6 314/887/6 181/916/6 +f 98/719/6 208/717/6 316/917/6 +f 323/236/6 434/653/6 558/654/6 +f 325/813/6 559/161/6 435/918/6 +f 82/919/6 560/920/6 188/921/6 +f 235/266/1 348/922/1 226/268/1 +f 511/923/1 631/924/1 47/478/1 +f 307/765/6 677/925/6 458/926/6 +f 321/927/6 315/721/6 676/688/6 +f 667/928/6 91/929/6 690/930/6 +f 687/931/6 203/932/6 433/933/6 +f 162/934/5 25/935/5 515/936/5 +f 450/937/6 211/938/6 568/682/6 +f 387/939/4 62/940/4 71/941/4 +f 83/13/3 436/942/3 680/943/3 +f 531/944/4 48/945/4 299/946/4 +f 50/412/4 285/351/4 282/947/4 +f 157/948/1 16/949/1 603/950/1 +f 93/205/6 429/704/6 78/114/6 +f 340/640/6 449/951/6 443/952/6 +f 215/953/6 686/247/6 208/717/6 +f 99/814/6 342/954/6 582/955/6 +f 445/956/6 688/957/6 89/958/6 +f 697/959/6 692/960/6 691/961/6 +f 577/710/6 703/378/6 704/380/6 +f 355/179/6 124/211/6 123/776/6 +f 441/660/6 416/661/6 428/962/6 +f 94/680/6 571/715/6 586/963/6 +f 230/321/6 465/964/6 336/527/6 +f 658/965/1 183/966/1 639/97/1 +f 539/160/1 538/153/1 55/967/1 +f 706/968/6 86/897/6 683/969/6 +f 115/970/6 237/971/6 229/750/6 +f 584/972/6 698/736/6 460/973/6 +f 453/974/6 107/724/6 461/975/6 +f 231/976/1 582/58/1 702/59/1 +f 463/745/6 575/746/6 219/977/6 +f 717/757/6 587/978/6 240/979/6 +f 466/980/6 707/981/6 117/641/6 +f 591/982/6 720/983/6 468/984/6 +f 62/940/1 386/825/1 633/985/1 +f 220/986/1 576/987/1 226/268/1 +f 100/685/6 664/988/6 189/649/6 +f 397/989/1 57/990/1 523/991/1 +f 177/992/2 175/993/2 57/994/2 +f 508/86/1 399/995/1 18/996/1 +f 492/997/2 483/998/2 486/999/2 +f 477/1000/2 472/1001/2 471/1002/2 +f 677/925/3 676/1003/3 315/1004/3 +f 226/109/6 231/857/6 235/1005/6 +f 102/1006/1 189/170/1 561/1007/1 +f 45/1008/1 303/1009/1 290/1010/1 +f 541/226/6 398/1011/6 528/1012/6 +f 212/1013/1 89/221/1 211/1014/1 +f 352/1015/4 709/1016/4 111/500/4 +f 374/1017/2 369/1018/2 504/1019/2 +f 27/1020/2 140/1021/2 505/1022/2 +f 25/1023/2 152/1024/2 373/1025/2 +f 385/1026/2 15/1027/2 154/1028/2 +f 376/1029/2 14/1030/2 263/1031/2 +f 55/1032/3 290/602/3 274/1033/3 +f 529/1034/3 265/1035/3 32/1036/3 +f 31/1037/2 28/1038/2 516/594/2 +f 624/565/2 383/1039/2 622/1040/2 +f 549/1041/1 198/1042/1 547/1043/1 +f 527/1044/2 521/1045/2 524/1046/2 +f 522/1047/2 523/1048/2 43/1049/2 +f 533/1050/2 283/1051/2 282/1052/2 +f 530/1053/2 32/1036/2 529/1034/2 +f 633/1054/2 386/1055/2 168/1056/2 +f 294/1057/2 293/1058/2 652/1059/2 +f 404/1060/2 532/396/2 284/397/2 +f 405/1061/2 391/1062/2 286/1063/2 +f 163/1064/2 287/1065/2 161/1066/2 +f 200/1067/2 416/1068/2 80/1069/2 +f 640/1070/2 639/1071/2 56/1072/2 +f 278/1073/2 396/1074/2 58/1075/2 +f 40/547/4 657/1076/4 65/868/4 +f 60/1077/2 177/992/2 59/1078/2 +f 170/1079/2 536/1080/2 297/1081/2 +f 173/1082/2 54/633/2 184/634/2 +f 313/1083/2 207/1084/2 675/1085/2 +f 540/1086/2 651/1087/2 176/1088/2 +f 409/1089/2 544/1090/2 653/1091/2 +f 63/1092/2 535/1093/2 536/1080/2 +f 671/1094/4 623/1095/4 611/583/4 +f 412/1096/2 424/1097/2 545/1098/2 +f 276/1099/3 396/1074/3 174/1100/3 +f 427/1101/2 301/1102/2 414/1103/2 +f 322/1104/2 331/1105/2 440/1106/2 +f 656/804/2 182/1107/2 430/803/2 +f 199/1108/2 205/1109/2 565/1110/2 +f 81/387/2 554/1111/2 420/463/2 +f 188/1112/2 421/1113/2 307/1114/2 +f 189/1115/2 558/1116/2 661/1117/2 +f 660/1118/2 434/1119/2 202/123/2 +f 85/1120/2 562/1121/2 193/1122/2 +f 196/1123/2 672/1124/2 439/1125/2 +f 420/463/2 78/1126/2 550/1127/2 +f 87/1128/2 564/1129/2 439/1125/2 +f 437/157/2 422/1130/2 563/156/2 +f 663/216/1 652/382/1 665/1131/1 +f 409/1132/1 536/103/1 410/1133/1 +f 443/1134/2 334/1135/2 333/1136/2 +f 208/1137/2 443/1134/2 95/1138/2 +f 324/237/2 208/1137/2 98/1139/2 +f 209/1140/2 567/1141/2 444/1142/2 +f 102/1143/2 218/1144/2 100/1145/2 +f 574/1146/2 214/1147/2 215/1148/2 +f 332/1149/2 338/1150/2 337/1151/2 +f 571/1152/2 332/1149/2 93/1153/2 +f 222/1154/2 96/1155/2 572/1156/2 +f 214/1147/2 341/1157/2 340/192/2 +f 96/1155/2 693/473/2 453/1158/2 +f 86/1159/2 680/943/2 683/1160/2 +f 580/1161/2 345/1162/2 452/1163/2 +f 347/1164/2 580/1161/2 579/1165/2 +f 582/1166/2 348/1167/2 581/1168/2 +f 463/1169/2 582/1166/2 343/1170/2 +f 583/1171/2 701/1172/2 344/379/2 +f 196/530/1 532/76/1 286/1173/1 +f 227/1174/2 584/1175/2 460/1176/2 +f 111/1177/2 229/1178/2 585/1179/2 +f 117/1180/2 112/1181/2 586/1182/2 +f 350/1183/2 122/1184/2 123/1185/2 +f 711/1186/2 232/1187/2 708/864/2 +f 587/1188/2 237/1189/2 115/1190/2 +f 588/1191/2 357/1192/2 126/1193/2 +f 589/418/2 590/1194/2 466/1195/2 +f 124/1196/2 120/400/2 119/1197/2 +f 235/1198/2 124/1196/2 355/1199/2 +f 236/420/2 235/1198/2 714/419/2 +f 231/1200/2 113/1201/2 462/1202/2 +f 645/1203/2 61/1204/2 279/1205/2 +f 273/1206/2 271/1207/2 394/1208/2 +f 186/1209/1 429/239/1 305/1210/1 +f 296/1211/2 298/1212/2 299/1213/2 +f 333/1214/1 93/205/1 78/114/1 +f 252/1215/3 143/1216/3 19/1217/3 +f 606/1218/3 6/1219/3 378/1220/3 +f 674/1221/1 413/135/1 675/605/1 +f 614/1222/3 611/488/3 29/1223/3 +f 422/197/1 83/1224/1 292/162/1 +f 619/6/3 164/1225/3 618/5/3 +f 622/1040/3 28/1038/3 621/1226/3 +f 40/547/3 30/1227/3 262/1228/3 +f 264/1229/3 383/1039/3 261/1230/3 +f 625/1231/3 520/1232/3 31/1037/3 +f 484/1233/4 520/1234/4 526/372/4 +f 389/1235/6 500/1236/6 366/1237/6 +f 89/221/1 203/222/1 191/1238/1 +f 389/1239/3 631/1240/3 632/1241/3 +f 219/977/3 450/1242/3 101/1243/3 +f 404/1060/3 37/1244/3 533/1050/3 +f 41/1245/3 271/1207/3 270/1246/3 +f 394/1208/3 405/1061/3 38/1247/3 +f 400/1248/3 44/1249/3 59/1078/3 +f 643/1250/3 641/1251/3 644/1252/3 +f 207/1253/1 200/1254/1 66/185/1 +f 647/1255/3 179/1256/3 50/1257/3 +f 648/1258/3 417/1259/3 180/1260/3 +f 650/1261/3 306/1262/3 291/289/3 +f 539/778/3 541/1263/3 651/1087/3 +f 541/1263/3 652/1059/3 540/1086/3 +f 542/1264/3 309/1265/3 407/1266/3 +f 659/1267/3 200/1067/3 182/1107/3 +f 650/1261/3 304/1268/3 649/34/3 +f 183/612/6 418/1269/6 264/1229/6 +f 622/562/6 250/540/6 10/563/6 +f 181/422/3 416/1068/3 548/1270/3 +f 64/1271/3 657/1272/3 414/1103/3 +f 410/1273/3 411/1274/3 172/1275/3 +f 414/1103/3 655/1276/3 301/1102/3 +f 419/7/3 420/463/3 81/387/3 +f 690/1277/1 319/173/1 667/1278/1 +f 307/1114/3 188/1112/3 192/1279/3 +f 660/1118/3 420/463/3 552/462/3 +f 660/1118/3 661/1117/3 554/1111/3 +f 434/1119/3 664/1280/3 558/1116/3 +f 664/1280/3 561/168/3 189/1115/3 +f 691/578/1 672/1281/1 312/579/1 +f 257/1282/4 504/302/4 2/303/4 +f 668/1283/3 666/1284/3 667/1285/3 +f 580/501/1 452/1286/1 451/233/1 +f 675/1085/3 313/1083/3 564/1129/3 +f 198/1287/3 671/1288/3 74/1289/3 +f 102/1143/3 690/1290/3 91/1291/3 +f 57/990/4 67/1292/4 68/1293/4 +f 312/1294/3 76/1295/3 75/1296/3 +f 88/248/3 323/1297/3 316/917/3 +f 616/1298/4 25/1299/4 373/1300/4 +f 203/1301/3 326/1302/3 433/1303/3 +f 318/1304/3 83/13/3 210/14/3 +f 98/1139/3 685/1305/3 684/1306/3 +f 685/1305/6 661/235/6 557/643/6 +f 454/1307/4 199/1308/4 106/1309/4 +f 335/1310/3 331/1105/3 447/1311/3 +f 92/1312/3 440/1106/3 320/1313/3 +f 682/1314/3 683/1160/3 438/1315/3 +f 444/1142/3 687/931/3 686/1316/3 +f 99/814/3 212/1317/3 209/1140/3 +f 216/110/3 688/1318/3 220/111/3 +f 692/38/3 337/1151/3 691/1319/3 +f 337/1151/3 93/1153/3 330/1320/3 +f 572/1156/3 108/1321/3 456/1322/3 +f 336/472/3 221/1323/3 96/1155/3 +f 357/1192/3 126/1193/3 237/1189/3 +f 579/1165/3 346/1324/3 698/1325/3 +f 107/1326/3 228/1327/3 580/1161/3 +f 581/1168/3 343/1170/3 700/1328/3 +f 223/1329/3 226/1330/3 348/1167/3 +f 707/1331/3 234/1332/3 117/1180/3 +f 239/1333/3 717/1334/3 240/1335/3 +f 360/1336/3 241/1337/3 719/1338/3 +f 640/1339/1 58/1340/1 537/3/1 +f 58/1340/1 421/1/1 537/3/1 +f 619/6/2 39/1341/2 613/4/2 +f 39/1341/2 260/1342/2 617/1343/2 +f 613/4/2 39/1341/2 617/1343/2 +f 419/7/2 550/1127/2 549/8/2 +f 550/1127/2 64/1271/2 549/8/2 +f 549/8/2 547/1344/2 546/9/2 +f 183/12/2 51/1345/2 415/10/2 +f 51/1345/2 406/1346/2 415/10/2 +f 406/1346/2 648/1258/2 415/10/2 +f 203/1301/2 89/1347/2 325/15/2 +f 89/1347/2 83/13/2 325/15/2 +f 388/18/3 269/439/3 34/1348/3 +f 34/1348/3 33/1349/3 630/16/3 +f 169/1350/3 32/1036/3 399/1351/3 +f 388/18/3 34/1348/3 630/16/3 +f 630/16/3 169/1350/3 266/17/3 +f 169/1350/3 399/1351/3 266/17/3 +f 266/17/3 159/1352/3 388/18/3 +f 368/19/4 372/1353/4 593/20/4 +f 436/195/1 86/455/1 577/24/1 +f 86/455/1 706/22/1 577/24/1 +f 522/27/4 16/949/4 13/25/4 +f 16/949/4 486/1354/4 598/855/4 +f 13/25/4 16/949/4 598/855/4 +f 486/1354/4 478/1355/4 598/855/4 +f 535/30/1 544/129/1 408/28/1 +f 544/129/1 85/1356/1 408/28/1 +f 85/1356/1 193/1357/1 408/28/1 +f 485/1358/5 3/32/5 484/31/5 +f 3/32/5 625/826/5 31/33/5 +f 649/34/2 650/1261/2 538/35/2 +f 186/36/2 305/1359/2 649/34/2 +f 305/1359/2 304/1268/2 649/34/2 +f 691/1319/2 692/38/2 105/37/2 +f 692/38/2 451/1360/2 569/39/2 +f 256/40/5 160/1361/5 512/41/5 +f 43/1049/3 156/795/3 627/45/3 +f 156/795/3 528/43/3 627/45/3 +f 104/1362/5 106/1363/5 105/48/5 +f 106/1363/5 198/46/5 105/48/5 +f 267/49/4 160/272/4 256/50/4 +f 244/1364/4 1/1365/4 245/252/4 +f 1/1365/4 35/52/4 245/252/4 +f 283/53/4 533/395/4 258/54/4 +f 533/395/4 37/393/4 615/1366/4 +f 258/54/4 533/395/4 615/1366/4 +f 258/54/4 245/252/4 35/52/4 +f 271/88/1 41/1367/1 302/57/1 +f 41/1367/1 166/55/1 302/57/1 +f 166/55/1 31/1368/1 520/1234/1 +f 520/1234/1 173/1369/1 166/55/1 +f 173/1369/1 184/56/1 166/55/1 +f 184/56/1 659/1370/1 182/604/1 +f 302/57/1 648/136/1 271/88/1 +f 184/56/1 182/604/1 302/57/1 +f 445/1371/4 99/1372/4 109/60/4 +f 99/1372/4 582/58/4 109/60/4 +f 475/61/4 24/1373/4 620/62/4 +f 491/1374/5 146/65/5 248/64/5 +f 146/65/5 47/807/5 629/66/5 +f 476/69/4 597/96/4 3/67/4 +f 597/96/4 621/94/4 28/360/4 +f 28/360/4 625/872/4 3/67/4 +f 597/96/4 28/360/4 3/67/4 +f 248/70/4 629/1375/4 389/71/4 +f 498/1376/4 150/74/4 367/73/4 +f 150/74/4 170/853/4 646/75/4 +f 532/76/4 286/1173/4 36/77/4 +f 391/79/4 38/1377/4 515/80/4 +f 287/82/4 638/356/4 618/83/4 +f 255/85/4 21/1378/4 508/86/4 +f 271/88/4 41/1367/4 516/89/4 +f 580/1379/5 111/93/5 579/92/5 +f 111/93/5 709/1380/5 232/91/5 +f 709/1380/5 239/1381/5 232/91/5 +f 239/1381/5 716/1382/5 232/91/5 +f 716/1382/5 708/1383/5 232/91/5 +f 621/94/1 619/1384/1 596/95/1 +f 639/97/4 174/1385/4 524/98/4 +f 345/100/4 107/1386/4 331/101/4 +f 536/103/4 410/1133/4 268/104/4 +f 260/108/4 133/1387/4 26/106/4 +f 133/1387/4 7/1388/4 26/106/4 +f 7/1388/4 369/1389/4 26/106/4 +f 226/109/6 701/768/6 216/110/6 +f 552/112/4 649/1390/4 304/113/4 +f 13/115/2 251/1391/2 151/116/2 +f 444/118/6 567/1392/6 555/119/6 +f 190/121/4 408/28/4 279/29/4 +f 202/123/2 555/1393/2 551/124/2 +f 660/182/1 316/127/1 420/126/1 +f 316/127/1 208/1394/1 95/128/1 +f 544/129/4 409/1132/4 536/103/4 +f 414/131/1 9/1395/1 165/130/1 +f 9/1395/1 480/1396/1 134/344/1 +f 165/130/1 9/1395/1 134/344/1 +f 165/130/1 518/1397/1 649/1390/1 +f 304/113/1 78/114/1 414/131/1 +f 165/130/1 649/1390/1 304/113/1 +f 359/134/4 718/1398/4 466/132/4 +f 718/1398/4 589/1399/4 466/132/4 +f 466/132/4 117/517/4 586/1400/4 +f 466/132/4 586/1400/4 356/133/4 +f 413/135/4 314/1401/4 648/136/4 +f 459/140/2 698/1325/2 110/881/2 +f 698/1325/2 579/1165/2 697/1402/2 +f 110/881/2 698/1325/2 697/1402/2 +f 110/881/2 455/138/2 459/140/2 +f 42/141/1 419/1403/1 546/142/1 +f 709/1016/1 237/145/1 239/144/1 +f 237/145/1 126/282/1 717/146/1 +f 54/147/4 537/3/4 640/1339/4 +f 56/148/4 53/1404/4 289/149/4 +f 54/147/4 640/1339/4 56/148/4 +f 656/457/4 430/1405/4 289/149/4 +f 430/1405/4 54/147/4 289/149/4 +f 289/149/4 415/1406/4 656/457/4 +f 301/150/4 428/1407/4 52/151/4 +f 420/126/4 660/182/4 538/153/4 +f 437/157/3 195/1408/3 72/155/3 +f 195/1408/3 669/1409/3 72/155/3 +f 558/158/4 664/561/4 543/159/4 +f 559/161/4 210/668/4 83/1224/4 +f 292/162/4 645/1410/4 280/848/4 +f 559/161/4 83/1224/4 292/162/4 +f 525/163/4 431/1411/4 559/161/4 +f 292/162/4 280/848/4 525/163/4 +f 84/164/4 437/896/4 295/316/4 +f 278/165/4 58/1340/4 560/166/4 +f 58/1340/4 421/1/4 560/166/4 +f 84/164/4 295/316/4 278/165/4 +f 679/231/4 681/1412/4 84/164/4 +f 560/166/4 679/231/4 84/164/4 +f 665/167/2 667/1285/2 561/168/2 +f 667/1285/2 319/1413/2 561/168/2 +f 561/168/2 189/1115/2 663/169/2 +f 189/170/4 561/1007/4 407/171/4 +f 319/173/4 667/1278/4 653/174/4 +f 564/176/4 313/431/4 548/177/4 +f 581/1414/5 348/922/5 113/1415/5 +f 348/922/5 355/179/5 113/1415/5 +f 355/179/5 129/1416/5 130/180/5 +f 127/181/5 113/1415/5 355/179/5 +f 316/127/4 323/450/4 558/158/4 +f 556/1417/4 519/183/4 66/185/4 +f 519/183/4 272/1418/4 273/184/4 +f 273/184/4 417/413/4 66/185/4 +f 417/413/4 200/1254/4 66/185/4 +f 189/170/4 661/409/4 324/186/4 +f 324/186/4 98/1419/4 695/187/4 +f 695/187/4 101/1420/4 100/188/4 +f 101/1420/4 102/1006/4 100/188/4 +f 100/188/4 189/170/4 324/186/4 +f 433/189/4 326/1421/4 662/190/4 +f 694/194/3 571/1152/3 340/192/3 +f 571/1152/3 94/1422/3 340/192/3 +f 94/1422/3 341/1157/3 340/192/3 +f 436/195/4 86/455/4 563/196/4 +f 399/198/5 32/800/5 364/199/5 +f 1/201/5 469/1423/5 636/202/5 +f 78/114/4 414/131/4 76/204/4 +f 414/131/4 75/1424/4 76/204/4 +f 76/204/4 330/1425/4 93/205/4 +f 441/208/4 331/101/4 321/783/4 +f 676/206/4 80/1426/4 416/207/4 +f 441/208/4 321/783/4 676/206/4 +f 719/209/6 241/1427/6 121/210/6 +f 320/1428/6 451/213/6 92/212/6 +f 451/213/6 452/1429/6 345/214/6 +f 91/215/4 665/1131/4 663/216/4 +f 686/218/4 687/1430/4 433/189/4 +f 209/220/4 212/1013/4 89/221/4 +f 23/225/5 132/1431/5 504/223/5 +f 132/1431/5 246/1432/5 2/790/5 +f 504/223/5 132/1431/5 2/790/5 +f 246/1432/5 471/1433/5 2/790/5 +f 628/1434/5 528/1012/5 46/228/5 +f 528/1012/5 541/226/5 46/228/5 +f 679/231/1 681/1412/1 704/1435/1 +f 704/1435/1 224/229/1 679/231/1 +f 87/1436/4 439/531/4 320/234/4 +f 439/531/4 569/232/4 320/234/4 +f 558/654/5 323/236/5 661/235/5 +f 323/236/5 217/1437/5 324/237/5 +f 573/1438/4 700/1439/4 343/492/4 +f 342/493/4 209/220/4 444/1440/4 +f 573/1438/4 343/492/4 342/493/4 +f 449/240/4 341/679/4 573/1438/4 +f 332/256/4 94/680/4 334/714/4 +f 449/240/4 573/1438/4 444/1440/4 +f 573/1438/4 342/493/4 444/1440/4 +f 429/239/4 332/256/4 334/714/4 +f 429/239/4 334/714/4 449/240/4 +f 444/1440/4 202/238/4 449/240/4 +f 312/1441/5 75/1442/5 414/535/5 +f 301/243/5 394/332/5 548/241/5 +f 394/332/5 271/593/5 180/1443/5 +f 312/1441/5 414/535/5 301/243/5 +f 692/960/5 691/961/5 312/1441/5 +f 320/1428/5 451/213/5 692/960/5 +f 548/241/5 313/1444/5 87/242/5 +f 87/242/5 320/1428/5 312/1441/5 +f 320/1428/5 692/960/5 312/1441/5 +f 312/1441/5 301/243/5 87/242/5 +f 271/593/5 648/889/5 180/1443/5 +f 180/1443/5 181/916/5 548/241/5 +f 180/1443/5 548/241/5 394/332/5 +f 177/876/5 69/245/5 59/244/5 +f 69/245/5 68/1445/5 70/246/5 +f 316/917/5 660/912/5 88/248/5 +f 660/912/5 202/120/5 88/248/5 +f 202/120/5 444/118/5 88/248/5 +f 697/249/4 579/570/4 338/250/4 +f 259/1446/1 615/1366/1 140/254/1 +f 615/1366/1 258/54/1 140/254/1 +f 258/54/1 245/252/1 140/254/1 +f 698/255/4 346/1447/4 332/256/4 +f 230/258/4 96/1448/4 453/259/4 +f 130/180/6 127/181/6 713/261/6 +f 713/261/6 589/774/6 718/262/6 +f 171/265/2 269/439/2 531/1449/2 +f 269/439/2 34/1348/2 531/1449/2 +f 531/1449/2 281/839/2 171/265/2 +f 281/839/2 49/263/2 171/265/2 +f 235/266/4 591/1450/4 225/267/4 +f 113/269/4 231/976/4 582/58/4 +f 501/1451/1 500/1452/1 256/50/1 +f 500/1452/1 634/271/1 256/50/1 +f 634/271/1 632/1453/1 160/272/1 +f 110/435/4 351/1454/4 455/1455/4 +f 351/1454/4 116/1456/4 455/1455/4 +f 420/126/4 550/867/4 95/128/4 +f 550/867/4 455/1455/4 694/1457/4 +f 215/274/4 208/1394/4 95/128/4 +f 455/1455/4 116/1456/4 694/1457/4 +f 97/273/4 712/1458/4 215/274/4 +f 712/1458/4 467/1459/4 215/274/4 +f 550/867/4 694/1457/4 95/128/4 +f 467/1459/4 219/1460/4 215/274/4 +f 95/128/4 694/1457/4 97/273/4 +f 505/276/6 140/1461/6 139/1462/6 +f 139/1462/6 593/1463/6 505/276/6 +f 593/1463/6 372/277/6 505/276/6 +f 372/277/6 151/899/6 611/583/6 +f 611/583/6 381/275/6 372/277/6 +f 590/278/4 713/1464/4 462/279/4 +f 717/146/4 128/1465/4 588/281/4 +f 124/283/4 238/519/4 350/284/4 +f 716/288/4 358/846/4 711/286/4 +f 358/846/4 125/845/4 711/286/4 +f 291/289/2 650/1261/2 65/290/2 +f 388/292/1 159/1466/1 138/293/1 +f 39/297/4 51/1467/4 622/295/4 +f 51/1467/4 183/966/4 622/295/4 +f 183/966/4 624/1468/4 622/295/4 +f 622/295/4 10/305/4 595/296/4 +f 371/298/1 151/899/1 503/299/1 +f 375/301/1 374/1469/1 504/302/1 +f 263/304/1 624/1468/1 622/295/1 +f 10/305/1 601/1470/1 263/304/1 +f 601/1470/1 376/1471/1 263/304/1 +f 528/308/4 156/793/4 45/1008/4 +f 45/1008/4 291/1472/4 306/306/4 +f 306/306/4 554/408/4 661/409/4 +f 651/307/4 541/172/4 528/308/4 +f 306/306/4 661/409/4 651/307/4 +f 528/308/4 45/1008/4 306/306/4 +f 378/309/1 509/1473/1 507/310/1 +f 606/312/1 147/852/1 148/313/1 +f 34/317/1 269/771/1 195/315/1 +f 195/315/1 437/896/1 295/316/1 +f 295/316/1 33/1474/1 34/317/1 +f 246/1475/1 132/1476/1 469/320/1 +f 132/1476/1 23/318/1 469/320/1 +f 23/318/1 616/1298/1 161/1477/1 +f 616/1298/1 163/1478/1 161/1477/1 +f 161/1477/1 636/319/1 23/318/1 +f 230/321/5 118/366/5 572/322/5 +f 108/1479/4 588/281/4 348/922/4 +f 588/281/4 128/1465/4 355/179/4 +f 348/922/4 588/281/4 355/179/4 +f 128/1465/4 129/1416/4 355/179/4 +f 348/922/4 226/268/4 220/986/4 +f 348/922/4 220/986/4 108/1479/4 +f 220/986/4 325/1480/4 108/1479/4 +f 325/1480/4 435/1481/4 553/1482/4 +f 322/1483/4 440/1484/4 456/326/4 +f 440/1484/4 580/501/4 228/324/4 +f 456/326/4 440/1484/4 228/324/4 +f 325/1480/4 553/1482/4 322/1483/4 +f 237/145/4 126/282/4 229/325/4 +f 126/282/4 456/326/4 229/325/4 +f 456/326/4 108/1479/4 322/1483/4 +f 108/1479/4 325/1480/4 322/1483/4 +f 153/327/1 618/83/1 613/84/1 +f 411/331/6 669/1485/6 195/1486/6 +f 195/1486/6 269/329/6 411/331/6 +f 9/537/6 414/535/6 394/332/6 +f 414/535/6 301/243/6 394/332/6 +f 394/332/6 271/593/6 164/333/6 +f 476/1487/6 480/1488/6 9/537/6 +f 164/333/6 621/592/6 597/334/6 +f 597/334/6 476/1487/6 9/537/6 +f 9/537/6 394/332/6 597/334/6 +f 668/336/6 682/1489/6 438/1490/6 +f 72/337/6 298/1491/6 409/335/6 +f 298/1491/6 63/624/6 409/335/6 +f 668/336/6 438/1490/6 72/337/6 +f 63/624/6 536/625/6 409/335/6 +f 32/338/1 158/913/1 602/339/1 +f 247/1492/4 242/1493/4 370/343/4 +f 242/1493/4 22/341/4 370/343/4 +f 22/341/4 614/1494/4 141/342/4 +f 30/601/6 384/1495/6 363/346/6 +f 384/1495/6 165/130/6 363/346/6 +f 165/130/6 134/344/6 363/346/6 +f 234/349/6 462/773/6 700/347/6 +f 462/773/6 113/1415/6 700/347/6 +f 113/1415/6 581/1414/6 700/347/6 +f 700/347/6 573/1496/6 214/348/6 +f 393/350/1 392/1497/1 285/351/1 +f 284/1498/1 379/1499/1 404/355/1 +f 379/1499/1 162/353/1 404/355/1 +f 164/90/1 271/88/1 638/356/1 +f 477/1500/6 133/358/6 361/357/6 +f 133/358/6 260/550/6 382/359/6 +f 28/360/1 53/1404/1 270/361/1 +f 383/362/1 264/1501/1 418/363/1 +f 418/363/1 300/1502/1 260/108/1 +f 300/1502/1 617/107/1 260/108/1 +f 260/108/1 133/1387/1 250/645/1 +f 133/1387/1 477/1503/1 481/1504/1 +f 481/1504/1 250/645/1 133/1387/1 +f 250/645/1 383/362/1 260/108/1 +f 572/322/6 456/1505/6 118/366/6 +f 456/1505/6 126/364/6 118/366/6 +f 517/1506/6 55/368/6 518/367/6 +f 55/368/6 650/635/6 649/369/6 +f 167/370/1 188/1507/1 307/371/1 +f 526/372/1 529/1508/1 167/370/1 +f 529/1508/1 644/1509/1 167/370/1 +f 252/1510/1 604/1511/1 168/373/1 +f 294/374/1 69/1512/1 178/375/1 +f 69/1512/1 177/1513/1 178/375/1 +f 178/375/1 252/1510/1 168/373/1 +f 672/47/6 105/48/6 569/376/6 +f 703/378/3 706/1514/3 705/1515/3 +f 705/1515/3 463/1169/3 702/1516/3 +f 702/1516/3 582/1166/3 226/1330/3 +f 702/1516/3 226/1330/3 225/1517/3 +f 703/378/3 705/1515/3 702/1516/3 +f 458/1518/3 224/1519/3 344/379/3 +f 224/1519/3 704/380/3 344/379/3 +f 702/1516/3 225/1517/3 703/378/3 +f 225/1517/3 344/379/3 703/378/3 +f 43/681/4 627/1520/4 17/1521/4 +f 627/1520/4 628/381/4 19/383/4 +f 17/1521/4 627/1520/4 19/383/4 +f 46/1522/4 540/1523/4 652/382/4 +f 628/381/4 46/1522/4 652/382/4 +f 19/383/4 600/1524/4 17/1521/4 +f 600/1524/4 15/1525/4 17/1521/4 +f 442/386/6 454/1526/6 455/1527/6 +f 419/384/6 42/600/6 623/1528/6 +f 442/386/6 455/1527/6 550/892/6 +f 419/384/6 623/1528/6 77/385/6 +f 442/386/6 550/892/6 419/384/6 +f 81/387/5 420/463/5 95/388/5 +f 390/390/1 172/1529/1 411/391/1 +f 37/393/1 288/1530/1 647/394/1 +f 35/398/3 636/1531/3 532/396/3 +f 636/1531/3 161/1066/3 391/1062/3 +f 532/396/3 636/1531/3 391/1062/3 +f 391/1062/3 286/1063/3 532/396/3 +f 284/397/3 283/1051/3 35/398/3 +f 354/401/3 715/1532/3 121/399/3 +f 715/1532/3 468/1533/3 238/1534/3 +f 121/399/3 715/1532/3 238/1534/3 +f 238/1534/3 124/1196/3 121/399/3 +f 641/1535/1 643/877/1 192/404/1 +f 643/877/1 327/402/1 192/404/1 +f 63/405/1 298/426/1 311/406/1 +f 324/186/1 98/1419/1 554/408/1 +f 179/410/1 412/1536/1 545/411/1 +f 417/413/1 200/1254/1 181/414/1 +f 198/46/6 672/47/6 412/1537/6 +f 672/47/6 655/1538/6 412/1537/6 +f 412/1537/6 179/1539/6 547/417/6 +f 179/1539/6 392/416/6 547/417/6 +f 514/143/6 546/142/6 547/417/6 +f 547/417/6 198/46/6 412/1537/6 +f 392/416/6 393/587/6 514/143/6 +f 236/420/3 467/1540/3 589/418/3 +f 467/1540/3 712/1541/3 589/418/3 +f 712/1541/3 466/1195/3 589/418/3 +f 713/1542/3 127/1543/3 714/419/3 +f 589/418/3 713/1542/3 714/419/3 +f 548/1270/2 181/422/2 426/421/2 +f 181/422/2 314/1544/2 413/423/2 +f 541/172/1 189/170/1 661/409/1 +f 169/425/1 630/1545/1 534/424/1 +f 630/1545/1 204/1546/1 534/424/1 +f 204/1546/1 678/1547/1 534/424/1 +f 678/1547/1 396/1548/1 534/424/1 +f 63/405/4 298/426/4 411/391/4 +f 298/426/4 72/454/4 669/427/4 +f 655/428/1 672/1281/1 670/429/1 +f 416/207/1 441/208/1 313/431/1 +f 510/432/2 508/1549/2 509/433/2 +f 508/1549/2 507/1550/2 509/433/2 +f 509/433/2 148/1551/2 147/434/2 +f 64/657/1 550/867/1 205/437/1 +f 550/867/1 455/1455/1 205/437/1 +f 455/1455/1 110/435/1 205/437/1 +f 635/438/3 390/1552/3 171/265/3 +f 609/441/3 257/1553/3 610/1554/3 +f 610/1554/3 382/1555/3 617/1343/3 +f 382/1555/3 260/1342/3 617/1343/3 +f 609/441/3 610/1554/3 617/1343/3 +f 613/4/3 618/5/3 616/702/3 +f 609/441/3 617/1343/3 613/4/3 +f 613/4/3 616/702/3 23/440/3 +f 83/13/2 436/942/2 327/443/2 +f 436/942/2 681/444/2 327/443/2 +f 681/444/2 679/1556/2 566/442/2 +f 679/1556/2 82/1557/2 566/442/2 +f 162/445/2 379/1558/2 258/446/2 +f 558/158/1 664/561/1 323/450/1 +f 664/561/1 218/448/1 323/450/1 +f 218/448/1 219/1460/1 217/449/1 +f 219/1460/1 215/274/1 217/449/1 +f 215/274/1 208/1394/1 217/449/1 +f 310/451/1 683/1559/1 680/452/1 +f 72/454/1 438/1560/1 86/455/1 +f 427/1561/1 429/239/1 206/456/1 +f 429/239/1 332/256/1 206/456/1 +f 656/457/1 430/1405/1 448/458/1 +f 372/460/2 368/1562/2 503/461/2 +f 95/388/6 443/952/6 552/462/6 +f 262/464/4 30/1563/4 363/465/4 +f 673/468/1 564/176/1 92/102/1 +f 564/176/1 313/431/1 92/102/1 +f 92/102/1 345/100/1 696/467/1 +f 686/218/1 214/509/1 340/469/1 +f 328/1564/3 329/1565/3 693/473/3 +f 329/1565/3 448/471/3 693/473/3 +f 446/474/4 682/1566/4 668/1567/4 +f 85/1356/4 193/1357/4 211/1014/4 +f 446/474/4 668/1567/4 85/1356/4 +f 575/491/4 463/1568/4 450/475/4 +f 463/1568/4 705/476/4 450/475/4 +f 85/1356/4 211/1014/4 446/474/4 +f 211/1014/4 450/475/4 446/474/4 +f 489/1569/4 603/950/4 491/1570/4 +f 603/950/4 60/479/4 47/478/4 +f 491/1570/4 603/950/4 146/1571/4 +f 60/479/4 59/1572/4 70/1573/4 +f 70/1573/4 423/477/4 60/479/4 +f 423/477/4 631/924/4 47/478/4 +f 47/478/4 146/1571/4 603/950/4 +f 130/482/4 131/1574/4 714/480/4 +f 131/1574/4 236/1575/4 714/480/4 +f 113/269/1 127/481/1 587/1576/1 +f 127/481/1 130/482/1 587/1576/1 +f 113/269/1 347/1577/1 581/270/1 +f 130/482/1 240/1578/1 587/1576/1 +f 587/1576/1 115/780/1 347/1577/1 +f 347/1577/1 579/570/1 338/250/1 +f 570/483/1 551/1579/1 567/484/1 +f 551/1579/1 555/1580/1 567/484/1 +f 347/1577/1 338/250/1 570/483/1 +f 587/1576/1 347/1577/1 113/269/1 +f 581/270/1 347/1577/1 570/483/1 +f 567/484/1 99/1372/1 582/58/1 +f 567/484/1 582/58/1 581/270/1 +f 158/485/5 265/1581/5 144/486/5 +f 611/488/2 623/1582/2 514/489/2 +f 623/1582/2 42/1583/2 514/489/2 +f 514/489/2 393/1584/2 381/490/2 +f 575/491/1 463/1568/1 343/492/1 +f 557/534/1 81/494/1 176/496/1 +f 81/494/1 43/681/1 175/495/1 +f 43/681/1 627/1520/1 175/495/1 +f 175/495/1 46/1522/1 176/496/1 +f 46/1522/1 540/1523/1 176/496/1 +f 339/497/1 227/1585/1 460/498/1 +f 228/324/1 229/325/1 111/500/1 +f 495/1586/5 145/504/5 494/503/5 +f 145/504/5 507/806/5 530/502/5 +f 507/806/5 169/1587/5 530/502/5 +f 458/507/1 344/567/1 715/1588/1 +f 213/506/1 336/514/1 659/1370/1 +f 201/1589/1 307/371/1 213/506/1 +f 307/371/1 458/507/1 213/506/1 +f 213/506/1 659/1370/1 201/1589/1 +f 458/507/1 715/1588/1 354/505/1 +f 349/508/1 234/516/1 214/509/1 +f 353/511/1 711/286/1 708/287/1 +f 465/515/1 710/1590/1 693/513/1 +f 710/1590/1 328/1591/1 693/513/1 +f 234/516/1 589/1399/1 466/132/1 +f 124/283/1 238/519/1 719/518/1 +f 238/519/1 468/1592/1 720/520/1 +f 178/521/5 60/1593/5 603/522/5 +f 293/525/5 294/1594/5 168/1595/5 +f 168/1595/5 386/1596/5 293/525/5 +f 386/1596/5 309/526/5 293/525/5 +f 309/526/5 653/869/5 667/928/5 +f 667/928/5 665/524/5 309/526/5 +f 336/527/6 448/1597/6 430/528/6 +f 405/603/4 286/1173/4 425/532/4 +f 286/1173/4 196/530/4 425/532/4 +f 684/533/4 685/1598/4 557/534/4 +f 414/535/5 657/1599/5 11/536/5 +f 481/1600/5 482/1601/5 250/540/5 +f 482/1601/5 261/538/5 250/540/5 +f 142/541/5 251/1602/5 13/542/5 +f 612/1603/5 368/788/5 258/1604/5 +f 368/788/5 249/544/5 245/546/5 +f 249/544/5 474/1605/5 244/545/5 +f 245/546/5 258/1604/5 368/788/5 +f 40/547/5 262/1228/5 599/548/5 +f 260/550/5 39/1606/5 595/551/5 +f 672/1281/4 670/429/4 105/554/4 +f 670/429/4 103/552/4 105/554/4 +f 510/555/5 147/811/5 606/556/5 +f 608/558/5 22/1607/5 242/559/5 +f 218/448/4 568/1608/4 319/173/4 +f 622/562/5 621/592/5 597/334/5 +f 14/564/5 264/1229/5 624/565/5 +f 188/1507/4 307/371/4 82/569/4 +f 307/371/4 458/507/4 82/569/4 +f 458/507/4 344/567/4 82/569/4 +f 579/570/1 232/781/1 233/571/1 +f 170/574/6 150/617/6 387/1609/6 +f 150/617/6 498/1610/6 256/40/6 +f 160/1361/6 150/617/6 256/40/6 +f 498/1610/6 501/1611/6 256/40/6 +f 160/1361/6 632/1612/6 387/1609/6 +f 194/573/6 410/1613/6 170/574/6 +f 150/617/6 160/1361/6 387/1609/6 +f 387/1609/6 71/572/6 170/574/6 +f 496/1614/5 138/1615/5 21/577/5 +f 138/1615/5 159/575/5 21/577/5 +f 159/575/5 266/1616/5 508/576/5 +f 691/578/4 337/257/4 206/456/4 +f 267/582/5 253/1617/5 254/1618/5 +f 297/1619/5 536/625/5 409/335/5 +f 267/582/5 254/1618/5 633/580/5 +f 254/1618/5 297/1619/5 633/580/5 +f 631/581/5 511/1620/5 267/582/5 +f 409/335/5 62/915/5 297/1619/5 +f 62/915/5 633/580/5 297/1619/5 +f 74/1621/5 671/1094/5 545/1622/5 +f 671/1094/5 611/583/5 50/585/5 +f 545/1622/5 671/1094/5 50/585/5 +f 611/583/5 381/275/5 285/584/5 +f 615/586/5 37/1623/5 392/416/5 +f 83/1224/4 90/588/4 436/195/4 +f 90/588/4 578/1624/4 577/24/4 +f 618/589/5 638/1625/5 163/590/5 +f 621/592/5 270/1626/5 271/593/5 +f 516/594/5 41/1627/5 273/595/5 +f 640/597/5 537/615/5 173/905/5 +f 173/905/5 520/1628/5 640/597/5 +f 520/1628/5 626/598/5 640/597/5 +f 626/598/5 524/1629/5 174/599/5 +f 303/1630/5 65/893/5 550/892/5 +f 42/600/5 623/1528/5 154/1631/5 +f 15/1632/5 600/1633/5 363/346/5 +f 42/600/5 154/1631/5 15/1632/5 +f 303/1630/5 550/892/5 419/384/5 +f 384/1495/5 274/1033/5 290/602/5 +f 290/602/5 303/1630/5 419/384/5 +f 42/600/5 15/1632/5 30/601/5 +f 15/1632/5 363/346/5 30/601/5 +f 290/602/5 419/384/5 42/600/5 +f 30/601/5 384/1495/5 290/602/5 +f 301/150/1 425/532/1 405/603/1 +f 336/514/4 659/1370/4 79/606/4 +f 659/1370/4 182/604/4 79/606/4 +f 182/604/4 314/1401/4 675/605/4 +f 79/606/4 693/513/4 336/514/4 +f 377/609/5 492/1634/5 136/1635/5 +f 280/1636/5 645/1637/5 279/607/5 +f 377/609/5 136/1635/5 279/607/5 +f 136/1635/5 280/1636/5 279/607/5 +f 542/608/5 407/902/5 377/609/5 +f 279/607/5 408/1638/5 542/608/5 +f 487/611/4 364/340/4 145/311/4 +f 364/340/4 32/338/4 507/310/4 +f 145/311/4 364/340/4 507/310/4 +f 32/338/4 169/425/4 507/310/4 +f 28/1038/5 624/565/5 53/614/5 +f 624/565/5 183/612/5 53/614/5 +f 640/597/6 537/615/6 174/599/6 +f 537/615/6 187/1639/6 185/616/6 +f 150/617/5 607/836/5 171/330/5 +f 607/836/5 269/329/5 171/330/5 +f 171/330/5 268/618/5 150/617/5 +f 410/1613/5 170/574/5 268/618/5 +f 602/619/3 144/1640/3 3/1641/3 +f 601/620/3 10/1642/3 250/1643/3 +f 602/619/3 3/1641/3 601/620/3 +f 18/621/3 364/1644/3 602/619/3 +f 601/620/3 250/1643/3 18/621/3 +f 55/368/5 650/635/5 291/622/5 +f 49/626/5 281/1645/5 63/624/5 +f 281/1645/5 531/810/5 63/624/5 +f 531/810/5 299/1646/5 63/624/5 +f 299/1646/5 298/1491/5 63/624/5 +f 86/1159/3 436/942/3 681/444/3 +f 679/1556/3 317/722/3 678/627/3 +f 204/628/3 86/1159/3 681/444/3 +f 681/444/3 679/1556/3 678/627/3 +f 302/629/5 182/1647/5 200/630/5 +f 305/632/5 429/704/5 78/114/5 +f 54/633/5 430/528/5 659/529/5 +f 649/369/5 552/462/5 420/463/5 +f 538/636/5 660/912/5 554/637/5 +f 340/640/5 341/1648/5 707/981/5 +f 117/641/5 466/980/5 712/1649/5 +f 340/640/5 707/981/5 117/641/5 +f 712/1649/5 97/639/5 117/641/5 +f 651/642/5 661/235/5 557/643/5 +f 506/647/4 521/1650/4 399/995/4 +f 399/995/4 18/996/4 506/647/4 +f 18/996/4 250/645/4 506/647/4 +f 250/645/4 383/362/4 14/646/4 +f 383/362/4 264/1501/4 14/646/4 +f 543/648/5 664/988/5 189/649/5 +f 282/1651/5 283/652/5 73/651/5 +f 283/652/5 284/1652/5 197/650/5 +f 284/1652/5 532/696/5 197/650/5 +f 539/655/5 308/1653/5 434/653/5 +f 308/1653/5 191/1654/5 434/653/5 +f 393/350/4 392/1497/4 414/131/4 +f 392/1497/4 179/410/4 414/131/4 +f 179/410/4 412/1536/4 414/131/4 +f 414/131/4 9/1395/4 393/350/4 +f 9/1395/4 8/1655/4 27/656/4 +f 27/656/4 505/1656/4 381/352/4 +f 9/1395/4 27/656/4 393/350/4 +f 64/657/5 205/437/5 199/658/5 +f 200/630/5 207/1657/5 441/660/5 +f 241/1658/1 360/1659/1 120/663/1 +f 360/1659/1 464/1660/1 120/663/1 +f 230/258/1 96/1448/1 221/662/1 +f 464/1660/1 230/258/1 120/663/1 +f 120/663/1 121/1661/1 241/1658/1 +f 84/664/5 681/1662/5 436/665/5 +f 192/667/5 318/1663/5 210/668/5 +f 400/669/4 488/1664/4 4/670/4 +f 219/977/5 218/672/5 212/674/5 +f 218/672/5 664/988/5 326/673/5 +f 664/988/5 662/1665/5 326/673/5 +f 326/673/5 89/958/5 212/674/5 +f 212/674/5 575/746/5 219/977/5 +f 89/958/5 190/676/5 83/675/5 +f 190/676/5 61/1666/5 292/677/5 +f 112/678/4 707/280/4 341/679/4 +f 42/141/4 419/1403/4 81/494/4 +f 568/682/5 102/1667/5 561/683/5 +f 100/685/5 689/1668/5 663/686/5 +f 80/1669/5 676/688/5 553/687/5 +f 676/688/5 321/927/5 322/689/5 +f 654/690/5 674/1670/5 673/691/5 +f 673/691/5 696/1671/5 196/911/5 +f 696/1671/5 103/1672/5 196/911/5 +f 103/1672/5 670/1673/5 196/911/5 +f 196/911/5 286/849/5 391/1674/5 +f 391/1674/5 161/692/5 673/691/5 +f 161/692/5 287/1675/5 654/690/5 +f 391/1674/5 673/691/5 196/911/5 +f 287/1675/5 613/1676/5 617/1677/5 +f 617/1677/5 300/1678/5 287/1675/5 +f 300/1678/5 654/690/5 287/1675/5 +f 406/694/6 51/1679/6 638/1625/6 +f 51/1679/6 39/1606/6 619/1680/6 +f 619/1680/6 618/589/6 638/1625/6 +f 51/1679/6 619/1680/6 638/1625/6 +f 426/693/6 413/1681/6 406/694/6 +f 439/377/6 564/1682/6 426/693/6 +f 38/1683/6 405/1684/6 425/1685/6 +f 425/1685/6 439/377/6 426/693/6 +f 163/590/6 38/1683/6 426/693/6 +f 38/1683/6 425/1685/6 426/693/6 +f 406/694/6 638/1625/6 163/590/6 +f 380/697/6 23/225/6 132/1431/6 +f 132/1431/6 245/546/6 380/697/6 +f 245/546/6 258/1604/6 379/695/6 +f 379/695/6 284/1652/6 532/696/6 +f 245/546/6 379/695/6 380/697/6 +f 401/698/4 281/1686/4 605/699/4 +f 23/440/2 380/1687/2 513/701/2 +f 380/1687/2 36/1688/2 513/701/2 +f 513/701/2 515/1689/2 616/702/2 +f 570/703/5 332/1690/5 429/704/5 +f 247/1691/5 370/708/5 475/707/5 +f 370/708/5 141/791/5 24/706/5 +f 141/791/5 614/1692/5 24/706/5 +f 577/710/5 450/937/5 680/709/5 +f 450/937/5 211/938/5 680/709/5 +f 337/711/5 330/1693/5 76/712/5 +f 334/714/5 94/680/5 571/715/5 +f 208/717/5 215/953/5 695/718/5 +f 66/1694/5 659/529/5 315/721/5 +f 659/529/5 336/527/5 315/721/5 +f 336/527/5 96/323/5 335/720/5 +f 317/722/5 224/1695/5 458/926/5 +f 458/926/5 307/765/5 317/722/5 +f 307/765/5 421/723/5 317/722/5 +f 421/723/5 58/875/5 396/1696/5 +f 396/1696/5 678/627/5 421/723/5 +f 107/724/5 580/1379/5 440/725/5 +f 315/1697/4 335/1698/4 677/1699/4 +f 335/1698/4 96/1448/4 221/662/4 +f 221/662/4 120/663/4 122/727/4 +f 120/663/4 121/1661/4 122/727/4 +f 335/1698/4 221/662/4 677/1699/4 +f 457/728/4 677/1699/4 221/662/4 +f 114/1700/4 583/1701/4 457/728/4 +f 122/727/4 114/1700/4 457/728/4 +f 486/1702/5 16/1703/5 4/1704/5 +f 16/1703/5 522/729/5 4/1704/5 +f 43/841/5 81/387/5 277/730/5 +f 81/387/5 67/1705/5 277/730/5 +f 522/729/5 43/841/5 277/730/5 +f 44/731/5 4/1704/5 522/729/5 +f 48/1706/5 295/316/5 296/1707/5 +f 295/316/5 437/896/5 296/1707/5 +f 563/1708/5 86/897/5 683/969/5 +f 535/870/5 402/1709/5 311/734/5 +f 311/734/5 296/1707/5 563/1708/5 +f 296/1707/5 437/896/5 563/1708/5 +f 563/1708/5 683/969/5 310/732/5 +f 544/733/5 535/870/5 311/734/5 +f 310/732/5 85/1710/5 544/733/5 +f 311/734/5 563/1708/5 310/732/5 +f 338/735/5 579/92/5 698/736/5 +f 93/205/5 332/1690/5 346/738/5 +f 346/738/5 347/1711/5 353/737/5 +f 347/1711/5 115/970/5 353/737/5 +f 115/970/5 711/1712/5 353/737/5 +f 353/737/5 227/1585/5 339/497/5 +f 339/497/5 455/1527/5 93/205/5 +f 455/1527/5 550/892/5 93/205/5 +f 550/892/5 78/114/5 93/205/5 +f 93/205/5 346/738/5 339/497/5 +f 120/739/6 221/753/6 222/740/6 +f 401/1713/5 137/742/5 403/1714/5 +f 137/742/5 493/1715/5 6/314/5 +f 403/1714/5 137/742/5 148/313/5 +f 493/1715/5 497/1716/5 6/314/5 +f 148/313/5 33/1474/5 403/1714/5 +f 588/743/5 108/1717/5 222/740/5 +f 109/744/5 702/1718/5 463/745/5 +f 327/402/5 566/1719/5 344/747/5 +f 344/747/5 225/1720/5 578/1721/5 +f 225/1720/5 576/756/5 578/1721/5 +f 578/1721/5 90/748/5 344/747/5 +f 90/748/5 83/675/5 327/402/5 +f 699/749/5 585/1722/5 229/750/5 +f 354/752/5 120/739/5 221/753/5 +f 575/746/2 450/1242/2 109/744/2 +f 450/1242/2 577/755/2 109/744/2 +f 577/755/2 578/1721/2 576/756/2 +f 126/364/5 357/365/5 717/757/5 +f 357/365/5 464/1723/5 360/758/5 +f 110/759/5 697/959/5 233/760/5 +f 345/214/5 92/212/5 328/763/5 +f 92/212/5 313/1444/5 675/764/5 +f 675/764/5 314/887/5 656/1724/5 +f 92/212/5 675/764/5 328/763/5 +f 352/1725/5 452/1429/5 345/214/5 +f 328/763/5 710/1726/5 345/214/5 +f 710/1726/5 352/1725/5 345/214/5 +f 656/1724/5 329/762/5 675/764/5 +f 307/765/5 431/1727/5 525/766/5 +f 350/284/5 238/519/5 235/1005/5 +f 235/1005/5 226/109/5 350/284/5 +f 226/109/5 701/768/5 350/284/5 +f 701/768/5 583/1728/5 114/769/5 +f 499/1729/1 502/1730/1 607/772/1 +f 502/1730/1 635/770/1 607/772/1 +f 462/773/5 713/261/5 589/774/5 +f 122/775/5 121/210/5 124/211/5 +f 407/1266/2 542/1264/2 543/779/2 +f 542/1264/2 408/1731/2 190/777/2 +f 190/777/2 308/1732/2 539/778/2 +f 542/1264/2 190/777/2 543/779/2 +f 543/779/2 541/1263/2 407/1266/2 +f 115/780/4 347/1577/4 579/570/4 +f 497/1716/4 494/1733/4 6/314/4 +f 494/1733/4 530/782/4 6/314/4 +f 530/782/4 33/1474/4 148/313/4 +f 216/110/1 701/768/1 223/1734/1 +f 123/285/1 124/283/1 119/834/1 +f 223/1734/1 123/285/1 222/835/1 +f 123/285/1 119/834/1 222/835/1 +f 83/1224/1 90/588/1 216/110/1 +f 216/110/1 223/1734/1 222/835/1 +f 572/784/1 118/833/1 699/1735/1 +f 118/833/1 585/1736/1 699/1735/1 +f 216/110/1 222/835/1 432/1737/1 +f 222/835/1 572/784/1 321/783/1 +f 210/668/1 83/1224/1 216/110/1 +f 431/1411/1 559/161/1 210/668/1 +f 321/783/1 676/206/1 432/1737/1 +f 432/1737/1 431/1411/1 210/668/1 +f 210/668/1 216/110/1 432/1737/1 +f 222/835/1 321/783/1 432/1737/1 +f 699/1735/1 107/1386/1 331/101/1 +f 699/1735/1 331/101/1 572/784/1 +f 32/800/6 364/199/6 529/785/6 +f 364/199/6 487/1738/6 5/786/6 +f 249/544/6 592/1739/6 503/787/6 +f 504/223/6 369/1740/6 7/789/6 +f 141/791/6 151/899/6 371/298/6 +f 492/792/1 377/1741/1 156/793/1 +f 377/1741/1 407/171/1 528/308/1 +f 407/171/1 541/172/1 528/308/1 +f 156/793/1 30/1563/1 363/465/1 +f 377/1741/1 528/308/1 156/793/1 +f 156/793/1 363/465/1 483/794/1 +f 517/796/2 518/1742/2 165/1743/2 +f 384/1744/2 30/1227/2 156/795/2 +f 517/796/2 165/1743/2 384/1744/2 +f 528/43/2 398/1745/2 517/796/2 +f 384/1744/2 156/795/2 517/796/2 +f 160/797/2 267/1746/2 511/798/2 +f 644/1747/5 529/785/5 278/802/5 +f 529/785/5 32/800/5 278/802/5 +f 656/804/3 314/1544/3 413/423/3 +f 413/423/3 654/1748/3 300/1749/3 +f 300/1749/3 418/1750/3 658/805/3 +f 658/805/3 185/616/3 430/803/3 +f 185/616/3 187/1639/3 430/803/3 +f 187/1639/3 421/1113/3 307/1114/3 +f 201/904/3 659/1267/3 430/803/3 +f 187/1639/3 307/1114/3 201/904/3 +f 300/1749/3 658/805/3 656/804/3 +f 656/804/3 413/423/3 300/1749/3 +f 187/1639/3 201/904/3 430/803/3 +f 507/806/6 508/576/6 21/577/6 +f 47/807/6 168/1595/6 604/808/6 +f 148/313/6 509/1751/6 378/809/6 +f 281/1645/6 531/810/6 605/812/6 +f 531/810/6 34/1752/6 147/811/6 +f 147/811/6 606/556/6 605/812/6 +f 209/1140/5 203/932/5 99/814/5 +f 203/932/5 325/813/5 99/814/5 +f 220/111/5 226/109/5 582/955/5 +f 220/111/5 582/955/5 99/814/5 +f 390/817/6 635/1753/6 502/1754/6 +f 502/1754/6 367/1755/6 390/817/6 +f 367/1755/6 646/815/6 390/817/6 +f 261/1756/1 482/1757/1 155/820/1 +f 482/1757/1 135/1758/1 155/820/1 +f 135/1758/1 642/818/1 155/820/1 +f 152/823/6 613/1676/6 374/1759/6 +f 613/1676/6 617/1677/6 374/1759/6 +f 617/1677/6 26/1760/6 374/1759/6 +f 374/1759/6 375/1761/6 152/823/6 +f 375/1761/6 594/821/6 152/823/6 +f 20/1762/4 377/1741/4 386/825/4 +f 377/1741/4 407/171/4 386/825/4 +f 601/1763/6 3/32/6 376/828/6 +f 3/32/6 625/826/6 376/828/6 +f 625/826/6 31/33/6 166/1764/6 +f 56/1765/6 639/878/6 275/827/6 +f 625/826/6 166/1764/6 56/1765/6 +f 521/879/6 506/1766/6 376/828/6 +f 625/826/6 56/1765/6 275/827/6 +f 275/827/6 521/879/6 376/828/6 +f 478/1767/6 362/1768/6 598/543/6 +f 362/1768/6 620/829/6 598/543/6 +f 620/829/6 29/1223/6 13/542/6 +f 490/1769/6 18/200/6 135/1770/6 +f 18/200/6 399/198/6 642/830/6 +f 399/198/6 32/800/6 534/801/6 +f 642/830/6 135/1770/6 18/200/6 +f 488/832/6 400/1771/6 603/522/6 +f 400/1771/6 60/1593/6 603/522/6 +f 222/835/4 572/784/4 118/833/4 +f 118/833/4 357/1772/4 119/834/4 +f 388/837/6 365/1773/6 607/836/6 +f 365/1773/6 499/1774/6 607/836/6 +f 403/838/3 531/1449/3 281/839/3 +f 143/1775/6 16/1703/6 385/843/6 +f 16/1703/6 522/729/6 385/843/6 +f 522/729/6 43/841/6 385/843/6 +f 359/844/5 356/1776/5 125/845/5 +f 493/1777/1 137/700/1 136/847/1 +f 137/700/1 401/698/1 280/848/1 +f 286/849/6 391/1674/6 513/850/6 +f 606/312/4 147/852/4 607/772/4 +f 147/852/4 34/317/4 269/771/4 +f 170/853/1 297/1778/1 254/854/1 +f 598/855/1 13/25/1 141/342/1 +f 343/856/5 582/955/5 231/857/5 +f 349/858/5 574/1779/5 343/856/5 +f 574/1779/5 342/954/5 343/856/5 +f 57/859/6 175/1780/6 627/860/6 +f 59/244/6 177/876/6 397/862/6 +f 708/864/3 711/1186/3 356/1781/3 +f 711/1186/3 125/1782/3 356/1781/3 +f 356/1781/3 116/1783/3 708/864/3 +f 116/1783/3 351/865/3 708/864/3 +f 233/866/3 232/1187/3 708/864/3 +f 650/154/1 420/126/1 550/867/1 +f 401/1713/6 137/742/6 535/870/6 +f 137/742/6 20/1784/6 535/870/6 +f 386/1596/6 309/526/6 653/869/6 +f 20/1784/6 386/1596/6 535/870/6 +f 48/1706/6 403/1714/6 401/1713/6 +f 535/870/6 402/1709/6 401/1713/6 +f 402/1709/6 48/1706/6 401/1713/6 +f 386/1596/6 653/869/6 535/870/6 +f 3/67/1 144/1785/1 395/1786/1 +f 144/1785/1 265/1787/1 395/1786/1 +f 395/1786/1 626/871/1 3/67/1 +f 652/873/6 407/902/6 377/609/6 +f 58/875/6 396/1696/6 527/1788/6 +f 395/1789/6 526/767/6 58/875/6 +f 526/767/6 307/765/6 58/875/6 +f 58/875/6 527/1788/6 395/1789/6 +f 69/245/6 540/227/6 46/228/6 +f 83/675/6 327/402/6 643/877/6 +f 275/827/5 521/879/5 639/878/5 +f 521/879/5 155/1790/5 276/880/5 +f 110/881/3 455/138/3 454/1791/3 +f 104/883/3 103/1792/3 696/1793/3 +f 696/1793/3 345/1162/3 452/1163/3 +f 452/1163/3 580/1161/3 579/1165/3 +f 452/1163/3 579/1165/3 697/1402/3 +f 104/883/3 696/1793/3 452/1163/3 +f 110/881/3 454/1791/3 106/882/3 +f 104/883/3 452/1163/3 697/1402/3 +f 697/1402/3 110/881/3 104/883/3 +f 361/884/1 382/1794/1 610/885/1 +f 156/1795/6 43/841/6 45/623/6 +f 43/841/6 81/387/6 45/623/6 +f 81/387/6 420/463/6 291/622/6 +f 420/463/6 650/635/6 291/622/6 +f 314/887/6 656/1724/6 415/888/6 +f 474/1796/1 249/21/1 243/891/1 +f 249/21/1 368/19/1 608/890/1 +f 368/19/1 612/1797/1 608/890/1 +f 550/892/6 78/114/6 304/113/6 +f 192/667/6 188/921/6 167/894/6 +f 33/1474/6 295/316/6 630/1798/6 +f 295/316/6 437/896/6 204/898/6 +f 437/896/6 563/1708/6 86/897/6 +f 204/898/6 630/1798/6 295/316/6 +f 251/900/1 142/1799/1 154/1800/1 +f 142/1799/1 143/1801/1 154/1800/1 +f 143/1801/1 385/1802/1 154/1800/1 +f 154/1800/1 623/1095/1 251/900/1 +f 623/1095/1 611/583/1 251/900/1 +f 680/709/6 436/665/6 422/666/6 +f 422/666/6 645/1637/6 562/901/6 +f 645/1637/6 279/607/6 408/1638/6 +f 408/1638/6 193/1803/6 562/901/6 +f 645/1637/6 408/1638/6 562/901/6 +f 661/235/6 558/654/6 539/655/6 +f 663/686/6 189/649/6 541/226/6 +f 561/683/6 319/684/6 542/608/6 +f 520/1628/6 519/1804/6 173/905/6 +f 519/1804/6 556/903/6 173/905/6 +f 470/906/5 472/1805/5 610/907/5 +f 196/911/6 286/849/6 404/1806/6 +f 404/1806/6 533/1807/6 647/909/6 +f 647/909/6 50/585/6 545/1622/6 +f 424/910/6 670/1673/6 196/911/6 +f 647/909/6 545/1622/6 424/910/6 +f 196/911/6 404/1806/6 647/909/6 +f 202/120/6 186/1808/6 538/636/6 +f 527/1809/4 396/1548/4 158/913/4 +f 396/1548/4 534/424/4 158/913/4 +f 666/1810/6 62/915/6 423/914/6 +f 62/915/6 633/580/6 631/581/6 +f 548/241/6 313/1444/6 181/916/6 +f 313/1444/6 675/764/6 181/916/6 +f 660/912/6 554/637/6 316/917/6 +f 554/637/6 98/719/6 316/917/6 +f 323/236/6 433/933/6 434/653/6 +f 325/813/6 210/668/6 559/161/6 +f 82/919/6 679/1811/6 560/920/6 +f 235/266/1 355/179/1 348/922/1 +f 47/478/1 146/1571/1 511/923/1 +f 146/1571/1 149/1812/1 511/923/1 +f 149/1812/1 512/1813/1 511/923/1 +f 307/765/6 431/1727/6 677/925/6 +f 431/1727/6 432/1814/6 677/925/6 +f 677/925/6 457/1815/6 458/926/6 +f 321/927/6 335/720/6 315/721/6 +f 667/928/6 665/524/6 91/929/6 +f 687/931/6 209/1140/6 203/932/6 +f 162/934/5 615/586/5 259/1816/5 +f 259/1816/5 27/1817/5 8/1818/5 +f 596/1819/5 619/1680/5 153/1820/5 +f 619/1680/5 618/589/5 153/1820/5 +f 259/1816/5 8/1818/5 25/935/5 +f 8/1818/5 596/1819/5 25/935/5 +f 162/934/5 259/1816/5 25/935/5 +f 596/1819/5 153/1820/5 25/935/5 +f 25/935/5 616/591/5 515/936/5 +f 515/936/5 38/1683/5 405/1684/5 +f 405/1684/5 425/1685/5 637/1821/5 +f 425/1685/5 655/1538/5 288/1822/5 +f 637/1821/5 425/1685/5 288/1822/5 +f 655/1538/5 412/1537/5 179/1539/5 +f 288/1822/5 37/1623/5 637/1821/5 +f 655/1538/5 179/1539/5 288/1822/5 +f 515/936/5 405/1684/5 162/934/5 +f 405/1684/5 637/1821/5 162/934/5 +f 102/1667/6 101/1823/6 568/682/6 +f 101/1823/6 450/937/6 568/682/6 +f 211/938/6 193/1803/6 319/684/6 +f 211/938/6 319/684/6 568/682/6 +f 633/985/4 62/940/4 387/939/4 +f 62/940/4 666/1824/4 71/941/4 +f 211/1825/3 89/1347/3 680/943/3 +f 89/1347/3 83/13/3 680/943/3 +f 403/1826/4 48/945/4 531/944/4 +f 48/945/4 296/1827/4 299/946/4 +f 282/947/4 73/1828/4 545/411/4 +f 73/1828/4 74/1829/4 545/411/4 +f 545/411/4 50/412/4 282/947/4 +f 157/948/1 522/27/1 16/949/1 +f 603/950/1 60/479/1 157/948/1 +f 60/479/1 59/1572/1 157/948/1 +f 93/205/6 332/1690/6 429/704/6 +f 340/640/6 341/1648/6 449/951/6 +f 215/953/6 214/348/6 686/247/6 +f 209/1140/6 342/954/6 99/814/6 +f 342/954/6 343/856/6 582/955/6 +f 445/956/6 109/744/6 576/756/6 +f 688/957/6 90/748/6 83/675/6 +f 445/956/6 576/756/6 688/957/6 +f 89/958/6 212/674/6 445/956/6 +f 688/957/6 83/675/6 89/958/6 +f 691/961/6 312/1441/6 75/1442/6 +f 75/1442/6 565/1830/6 691/961/6 +f 565/1830/6 110/759/6 691/961/6 +f 110/759/6 697/959/6 691/961/6 +f 704/380/6 681/1662/6 577/710/6 +f 681/1662/6 436/665/6 577/710/6 +f 223/1831/6 348/922/6 123/776/6 +f 348/922/6 355/179/6 123/776/6 +f 427/1832/6 206/713/6 428/962/6 +f 206/713/6 337/711/6 338/735/6 +f 338/735/6 579/92/6 580/1379/6 +f 206/713/6 338/735/6 440/725/6 +f 428/962/6 206/713/6 440/725/6 +f 273/595/6 52/1833/6 417/631/6 +f 52/1833/6 428/962/6 416/661/6 +f 417/631/6 52/1833/6 416/661/6 +f 338/735/6 580/1379/6 440/725/6 +f 440/725/6 331/726/6 441/660/6 +f 416/661/6 200/630/6 417/631/6 +f 440/725/6 441/660/6 428/962/6 +f 571/715/6 694/1834/6 586/963/6 +f 694/1834/6 116/1835/6 586/963/6 +f 116/1835/6 356/1776/6 586/963/6 +f 586/963/6 112/678/6 94/680/6 +f 336/527/6 96/323/6 230/321/6 +f 230/321/6 464/1723/6 465/964/6 +f 174/1385/1 185/1836/1 639/97/1 +f 185/1836/1 658/965/1 639/97/1 +f 183/966/1 624/1468/1 639/97/1 +f 624/1468/1 275/99/1 639/97/1 +f 517/1837/1 398/1838/1 539/160/1 +f 398/1838/1 543/159/1 539/160/1 +f 539/160/1 558/158/1 660/182/1 +f 538/153/1 650/154/1 55/967/1 +f 55/967/1 517/1837/1 539/160/1 +f 539/160/1 660/182/1 538/153/1 +f 446/1839/6 705/1840/6 683/969/6 +f 705/1840/6 706/968/6 683/969/6 +f 228/751/6 347/1711/6 229/750/6 +f 347/1711/6 115/970/6 229/750/6 +f 584/972/6 708/1383/6 232/91/6 +f 232/91/6 579/92/6 584/972/6 +f 579/92/6 698/736/6 584/972/6 +f 698/736/6 459/1841/6 460/973/6 +f 453/974/6 693/1842/6 447/1843/6 +f 693/1842/6 79/1844/6 447/1843/6 +f 79/1844/6 207/1657/6 447/1843/6 +f 447/1843/6 331/726/6 453/974/6 +f 331/726/6 107/724/6 453/974/6 +f 107/724/6 580/1379/6 111/93/6 +f 107/724/6 111/93/6 461/975/6 +f 702/59/1 236/1575/1 231/976/1 +f 236/1575/1 714/480/1 231/976/1 +f 219/977/6 467/1845/6 463/745/6 +f 467/1845/6 236/1846/6 463/745/6 +f 236/1846/6 702/1718/6 463/745/6 +f 717/757/6 126/364/6 587/978/6 +f 466/980/6 590/1847/6 707/981/6 +f 236/1846/6 131/1848/6 591/982/6 +f 131/1848/6 720/983/6 591/982/6 +f 468/984/6 715/1849/6 344/747/6 +f 344/747/6 225/1720/6 468/984/6 +f 225/1720/6 591/982/6 468/984/6 +f 62/940/1 309/824/1 386/825/1 +f 688/1850/1 576/987/1 220/986/1 +f 576/987/1 225/267/1 226/268/1 +f 100/685/6 218/672/6 664/988/6 +f 397/989/1 177/1513/1 57/990/1 +f 177/992/2 46/1851/2 175/993/2 +f 496/1852/1 21/1378/1 18/996/1 +f 21/1378/1 508/86/1 18/996/1 +f 508/86/1 266/1853/1 399/995/1 +f 18/996/1 490/1854/1 496/1852/1 +f 498/1855/2 367/1856/2 493/1857/2 +f 367/1856/2 502/1858/2 493/1857/2 +f 499/1859/2 365/1860/2 497/1861/2 +f 365/1860/2 138/1862/2 496/1863/2 +f 502/1858/2 499/1859/2 493/1857/2 +f 366/1864/2 500/1865/2 501/1866/2 +f 501/1866/2 498/1855/2 492/997/2 +f 501/1866/2 492/997/2 491/1867/2 +f 248/1868/2 366/1864/2 491/1867/2 +f 366/1864/2 501/1866/2 491/1867/2 +f 365/1860/2 496/1863/2 497/1861/2 +f 495/1869/2 494/1870/2 497/1861/2 +f 496/1863/2 495/1869/2 497/1861/2 +f 491/1867/2 492/997/2 489/1871/2 +f 4/1872/2 488/1873/2 489/1871/2 +f 493/1857/2 136/1874/2 498/1855/2 +f 136/1874/2 492/997/2 498/1855/2 +f 499/1859/2 497/1861/2 493/1857/2 +f 486/999/2 4/1872/2 489/1871/2 +f 475/707/2 362/1875/2 478/1876/2 +f 478/1876/2 486/999/2 483/998/2 +f 486/999/2 489/1871/2 492/997/2 +f 478/1876/2 483/998/2 479/1877/2 +f 247/1691/2 475/707/2 479/1877/2 +f 475/707/2 478/1876/2 479/1877/2 +f 479/1877/2 473/1878/2 247/1691/2 +f 134/1879/2 480/1880/2 483/998/2 +f 480/1880/2 479/1877/2 483/998/2 +f 487/1881/2 495/1869/2 496/1863/2 +f 490/1882/2 135/1883/2 485/1884/2 +f 135/1883/2 482/1885/2 485/1884/2 +f 487/1881/2 496/1863/2 490/1882/2 +f 484/1886/2 5/1887/2 485/1884/2 +f 5/1887/2 487/1881/2 485/1884/2 +f 487/1881/2 490/1882/2 485/1884/2 +f 482/1885/2 481/1888/2 485/1884/2 +f 476/1889/2 485/1884/2 481/1888/2 +f 473/1878/2 479/1877/2 474/1890/2 +f 479/1877/2 480/1880/2 474/1890/2 +f 480/1880/2 476/1889/2 246/1891/2 +f 242/1892/2 247/1691/2 473/1878/2 +f 474/1890/2 243/1893/2 242/1892/2 +f 469/1894/2 1/1895/2 244/1896/2 +f 474/1890/2 242/1892/2 473/1878/2 +f 246/1891/2 469/1894/2 244/1896/2 +f 244/1896/2 474/1890/2 480/1880/2 +f 480/1880/2 246/1891/2 244/1896/2 +f 476/1889/2 481/1888/2 477/1000/2 +f 477/1000/2 361/1897/2 472/1001/2 +f 476/1889/2 477/1000/2 471/1002/2 +f 246/1891/2 476/1889/2 471/1002/2 +f 472/1001/2 470/1898/2 471/1002/2 +f 677/925/3 432/1814/3 676/1003/3 +f 582/955/6 231/857/6 226/109/6 +f 231/857/6 714/1899/6 235/1005/6 +f 102/1006/1 100/188/1 189/170/1 +f 45/1008/1 291/1472/1 303/1009/1 +f 541/226/6 543/648/6 398/1011/6 +f 211/1014/1 450/475/1 212/1013/1 +f 450/475/1 575/491/1 212/1013/1 +f 580/501/4 452/1286/4 111/500/4 +f 452/1286/4 352/1015/4 111/500/4 +f 374/1017/2 26/1900/2 369/1018/2 +f 27/1020/2 259/1901/2 140/1021/2 +f 25/1023/2 153/1902/2 152/1024/2 +f 385/1026/2 17/1903/2 15/1027/2 +f 376/1029/2 506/1904/2 14/1030/2 +f 55/1032/3 45/1905/3 290/602/3 +f 529/1034/3 526/1906/3 265/1035/3 +f 526/1906/3 395/1907/3 265/1035/3 +f 265/1035/3 158/1908/3 32/1036/3 +f 31/1037/2 625/1231/2 28/1038/2 +f 28/1038/2 621/1226/2 164/1225/2 +f 516/594/2 272/596/2 31/1037/2 +f 272/596/2 519/1909/2 31/1037/2 +f 28/1038/2 164/1225/2 516/594/2 +f 519/1909/2 520/1232/2 31/1037/2 +f 624/565/2 264/1229/2 383/1039/2 +f 549/1041/1 199/1308/1 198/1042/1 +f 527/1044/2 158/1908/2 399/1351/2 +f 158/1908/2 32/1036/2 399/1351/2 +f 527/1044/2 399/1351/2 521/1045/2 +f 521/1045/2 275/1910/2 524/1046/2 +f 524/1046/2 626/1911/2 395/1907/2 +f 524/1046/2 395/1907/2 527/1044/2 +f 522/1047/2 157/1912/2 523/1048/2 +f 157/1912/2 397/1913/2 523/1048/2 +f 523/1048/2 627/45/2 43/1049/2 +f 282/1052/2 285/1914/2 533/1050/2 +f 285/1914/2 392/1915/2 533/1050/2 +f 392/1915/2 37/1244/2 533/1050/2 +f 401/840/2 403/838/2 280/1916/2 +f 403/838/2 33/1349/2 530/1053/2 +f 530/1053/2 169/1350/2 32/1036/2 +f 403/838/2 530/1053/2 529/1034/2 +f 280/1916/2 403/838/2 529/1034/2 +f 526/1906/2 525/1917/2 529/1034/2 +f 525/1917/2 280/1916/2 529/1034/2 +f 47/1918/2 631/1240/2 168/1056/2 +f 631/1240/2 633/1054/2 168/1056/2 +f 540/1086/2 69/1919/2 652/1059/2 +f 69/1919/2 294/1057/2 652/1059/2 +f 404/1060/2 286/1063/2 532/396/2 +f 405/1061/2 38/1247/2 391/1062/2 +f 163/1064/2 638/1920/2 287/1065/2 +f 431/1921/2 307/1114/2 556/903/2 +f 307/1114/2 201/904/2 556/903/2 +f 556/903/2 66/1922/2 80/1069/2 +f 66/1922/2 200/1067/2 80/1069/2 +f 556/903/2 80/1069/2 431/1921/2 +f 435/1923/2 559/1924/2 431/1921/2 +f 80/1069/2 553/1925/2 431/1921/2 +f 553/1925/2 435/1923/2 431/1921/2 +f 640/1070/2 174/1100/2 639/1071/2 +f 278/1073/2 534/1926/2 396/1074/2 +f 12/549/4 11/1927/4 40/547/4 +f 11/1927/4 657/1076/4 40/547/4 +f 64/657/4 550/867/4 65/868/4 +f 274/1928/4 384/1929/4 40/547/4 +f 650/154/4 55/967/4 274/1928/4 +f 657/1076/4 64/657/4 65/868/4 +f 65/868/4 650/154/4 274/1928/4 +f 274/1928/4 40/547/4 65/868/4 +f 60/1077/2 178/1930/2 177/992/2 +f 170/1079/2 410/1273/2 536/1080/2 +f 173/1082/2 537/1931/2 54/633/2 +f 441/1932/2 207/1084/2 313/1083/2 +f 207/1084/2 79/1933/2 675/1085/2 +f 540/1086/2 541/1263/2 651/1087/2 +f 309/1265/2 62/1934/2 653/1091/2 +f 62/1934/2 409/1089/2 653/1091/2 +f 63/1092/2 402/1935/2 535/1093/2 +f 671/1094/4 77/1936/4 623/1095/4 +f 412/1096/2 655/1276/2 424/1097/2 +f 174/1100/3 639/1071/3 276/1099/3 +f 276/1099/3 642/1937/3 396/1074/3 +f 642/1937/3 534/1926/3 396/1074/3 +f 396/1074/3 58/1075/3 640/1070/3 +f 396/1074/3 640/1070/3 174/1100/3 +f 427/1101/2 428/1938/2 301/1102/2 +f 414/1103/2 78/1126/2 427/1101/2 +f 78/1126/2 429/125/2 427/1101/2 +f 322/1104/2 321/1939/2 331/1105/2 +f 314/1544/2 182/1107/2 656/804/2 +f 182/1107/2 659/1267/2 430/803/2 +f 565/1110/2 75/1296/2 198/1287/2 +f 75/1296/2 312/1294/2 672/1124/2 +f 198/1287/2 75/1296/2 672/1124/2 +f 198/1287/2 199/1108/2 565/1110/2 +f 81/387/2 557/1940/2 554/1111/2 +f 557/1940/2 661/1117/2 554/1111/2 +f 554/1111/2 660/1118/2 420/463/2 +f 188/1112/2 560/1941/2 421/1113/2 +f 189/1115/2 664/1280/2 558/1116/2 +f 558/1116/2 434/1119/2 660/1118/2 +f 434/1119/2 191/1942/2 202/123/2 +f 85/1120/2 310/1943/2 562/1121/2 +f 196/1123/2 670/1944/2 672/1124/2 +f 420/463/2 552/462/2 78/1126/2 +f 87/1128/2 313/1083/2 564/1129/2 +f 437/157/2 84/1945/2 422/1130/2 +f 540/1523/1 652/382/1 663/216/1 +f 652/382/1 293/1946/1 665/1131/1 +f 410/1133/1 194/1947/1 409/1132/1 +f 194/1947/1 668/1567/1 409/1132/1 +f 443/1134/2 449/1948/2 334/1135/2 +f 208/1137/2 686/1316/2 443/1134/2 +f 324/237/2 217/1437/2 208/1137/2 +f 209/1140/2 99/814/2 567/1141/2 +f 102/1143/2 568/1949/2 218/1144/2 +f 215/1148/2 219/977/2 574/1146/2 +f 219/977/2 575/746/2 574/1146/2 +f 575/746/2 342/1950/2 574/1146/2 +f 332/1149/2 570/1951/2 338/1150/2 +f 571/1152/2 94/1422/2 332/1149/2 +f 222/1154/2 221/1323/2 96/1155/2 +f 214/1147/2 573/1952/2 341/1157/2 +f 96/1155/2 336/472/2 693/473/2 +f 86/1159/2 436/942/2 680/943/2 +f 580/1161/2 107/1326/2 345/1162/2 +f 347/1164/2 228/1327/2 580/1161/2 +f 582/1166/2 226/1330/2 348/1167/2 +f 463/1169/2 702/1516/2 582/1166/2 +f 226/1330/2 225/1517/2 701/1172/2 +f 225/1517/2 344/379/2 701/1172/2 +f 344/379/2 458/1518/2 583/1171/2 +f 458/1518/2 457/1953/2 583/1171/2 +f 196/530/1 197/1954/1 532/76/1 +f 227/1174/2 353/1955/2 584/1175/2 +f 585/1179/2 118/1956/2 230/1957/2 +f 230/1957/2 461/1958/2 585/1179/2 +f 461/1958/2 111/1177/2 585/1179/2 +f 117/1180/2 707/1331/2 112/1181/2 +f 350/1183/2 114/1959/2 122/1184/2 +f 711/1186/2 115/1190/2 232/1187/2 +f 587/1188/2 126/1193/2 237/1189/2 +f 588/1191/2 119/1197/2 357/1192/2 +f 589/418/2 713/1542/2 590/1194/2 +f 124/1196/2 121/399/2 120/400/2 +f 235/1198/2 238/1534/2 124/1196/2 +f 236/420/2 591/1960/2 235/1198/2 +f 234/1332/2 349/1961/2 462/1202/2 +f 349/1961/2 231/1200/2 462/1202/2 +f 645/1203/2 292/1962/2 61/1204/2 +f 394/1208/2 52/1963/2 273/1206/2 +f 273/1206/2 41/1245/2 271/1207/2 +f 186/1209/1 202/238/1 429/239/1 +f 296/1211/2 311/1964/2 298/1212/2 +f 78/114/1 552/112/1 333/1214/1 +f 552/112/1 443/470/1 333/1214/1 +f 333/1214/1 571/1965/1 93/205/1 +f 595/551/3 10/1642/3 597/1966/3 +f 595/551/3 597/1966/3 596/1819/3 +f 7/1967/3 133/358/3 375/1968/3 +f 133/358/3 595/551/3 375/1968/3 +f 375/1968/3 2/1969/3 7/1967/3 +f 245/1970/3 132/1971/3 594/1972/3 +f 139/1973/3 245/1970/3 594/1972/3 +f 594/1972/3 375/1968/3 596/1819/3 +f 375/1968/3 595/551/3 596/1819/3 +f 596/1819/3 8/1818/3 594/1972/3 +f 139/1973/3 8/1818/3 593/1974/3 +f 139/1973/3 594/1972/3 8/1818/3 +f 592/1975/3 249/1976/3 593/1974/3 +f 8/1818/3 9/1977/3 11/1978/3 +f 371/1979/3 592/1975/3 593/1974/3 +f 598/1980/3 370/1981/3 371/1979/3 +f 142/1982/3 598/1980/3 371/1979/3 +f 371/1979/3 593/1974/3 599/1983/3 +f 593/1974/3 8/1818/3 11/1978/3 +f 11/1978/3 12/1984/3 599/1983/3 +f 593/1974/3 11/1978/3 599/1983/3 +f 143/1216/3 142/1982/3 600/1985/3 +f 142/1982/3 371/1979/3 599/1983/3 +f 143/1216/3 600/1985/3 19/1217/3 +f 599/1983/3 363/1986/3 600/1985/3 +f 19/1217/3 377/1987/3 20/1988/3 +f 599/1983/3 600/1985/3 142/1982/3 +f 603/1989/3 16/1990/3 143/1216/3 +f 20/1988/3 137/1991/3 254/1992/3 +f 137/1991/3 605/1993/3 254/1992/3 +f 605/1993/3 606/1218/3 607/1994/3 +f 607/1994/3 150/1995/3 605/1993/3 +f 150/1995/3 254/1992/3 605/1993/3 +f 253/1996/3 256/1997/3 149/1998/3 +f 253/1996/3 149/1998/3 604/1999/3 +f 149/1998/3 146/2000/3 604/1999/3 +f 254/1992/3 253/1996/3 20/1988/3 +f 253/1996/3 604/1999/3 20/1988/3 +f 252/1215/3 603/1989/3 143/1216/3 +f 20/1988/3 604/1999/3 19/1217/3 +f 604/1999/3 252/1215/3 19/1217/3 +f 145/2001/3 21/2002/3 378/1220/3 +f 21/2002/3 255/2003/3 378/1220/3 +f 255/2003/3 606/1218/3 378/1220/3 +f 654/2004/1 413/135/1 674/1221/1 +f 413/135/1 314/1401/1 675/605/1 +f 614/1222/3 22/2005/3 611/488/3 +f 22/2005/3 608/2006/3 611/488/3 +f 608/2006/3 612/2007/3 611/488/3 +f 620/829/3 24/2008/3 614/1222/3 +f 43/1049/3 522/1047/3 623/1582/3 +f 522/1047/3 29/1223/3 623/1582/3 +f 29/1223/3 620/829/3 614/1222/3 +f 612/2007/3 258/446/3 381/490/3 +f 611/488/3 612/2007/3 381/490/3 +f 258/446/3 615/447/3 381/490/3 +f 615/447/3 393/1584/3 381/490/3 +f 623/1582/3 42/1583/3 43/1049/3 +f 611/488/3 623/1582/3 29/1223/3 +f 292/162/1 645/1410/1 422/197/1 +f 422/197/1 436/195/1 83/1224/1 +f 619/6/3 621/1226/3 164/1225/3 +f 622/1040/3 624/565/3 28/1038/3 +f 40/547/3 384/1744/3 30/1227/3 +f 155/2009/3 521/1045/3 264/1229/3 +f 521/1045/3 275/1910/3 264/1229/3 +f 155/2009/3 264/1229/3 261/1230/3 +f 275/1910/3 624/565/3 264/1229/3 +f 625/1231/3 626/1911/3 520/1232/3 +f 526/372/4 529/1508/4 5/2010/4 +f 5/2010/4 484/1233/4 526/372/4 +f 484/1233/4 31/1368/4 520/1234/4 +f 520/1234/4 173/1369/4 526/372/4 +f 173/1369/4 201/1589/4 307/371/4 +f 526/372/4 173/1369/4 307/371/4 +f 389/1235/6 634/2011/6 500/1236/6 +f 203/222/1 209/220/1 444/1440/1 +f 444/1440/1 202/238/1 203/222/1 +f 202/238/1 191/1238/1 203/222/1 +f 191/1238/1 308/2012/1 190/121/1 +f 190/121/1 89/221/1 191/1238/1 +f 389/1239/3 629/2013/3 631/1240/3 +f 629/2013/3 47/1918/3 631/1240/3 +f 631/1240/3 633/1054/3 632/1241/3 +f 633/1054/3 387/2014/3 632/1241/3 +f 632/1241/3 634/2015/3 389/1239/3 +f 695/2016/3 215/1148/3 219/977/3 +f 219/977/3 575/746/3 450/1242/3 +f 101/1243/3 695/2016/3 219/977/3 +f 404/1060/3 637/2017/3 37/1244/3 +f 270/1246/3 53/2018/3 41/1245/3 +f 53/2018/3 56/1072/3 41/1245/3 +f 56/1072/3 166/2019/3 41/1245/3 +f 38/1247/3 163/1064/3 394/1208/3 +f 163/1064/3 638/1920/3 271/1207/3 +f 394/1208/3 163/1064/3 271/1207/3 +f 277/2020/3 57/994/3 44/1249/3 +f 57/994/3 177/992/3 59/1078/3 +f 59/1078/3 60/1077/3 400/1248/3 +f 57/994/3 59/1078/3 44/1249/3 +f 295/2021/3 48/2022/3 278/1073/3 +f 48/2022/3 402/1935/3 645/1203/3 +f 278/1073/3 48/2022/3 644/1252/3 +f 402/1935/3 535/1093/3 279/1205/3 +f 645/1203/3 292/1962/3 643/1250/3 +f 402/1935/3 279/1205/3 645/1203/3 +f 644/1252/3 48/2022/3 643/1250/3 +f 641/1251/3 167/2023/3 644/1252/3 +f 643/1250/3 48/2022/3 645/1203/3 +f 66/185/1 315/1697/1 207/1253/1 +f 315/1697/1 335/1698/1 207/1253/1 +f 335/1698/1 447/2024/1 207/1253/1 +f 647/1255/3 288/2025/3 179/1256/3 +f 648/1258/3 302/2026/3 417/1259/3 +f 650/1261/3 538/35/3 306/1262/3 +f 539/778/3 543/779/3 541/1263/3 +f 541/1263/3 407/1266/3 652/1059/3 +f 542/1264/3 653/1091/3 309/1265/3 +f 659/1267/3 66/1922/3 200/1067/3 +f 650/1261/3 65/290/3 304/1268/3 +f 264/1229/6 624/565/6 183/612/6 +f 183/612/6 658/2027/6 418/1269/6 +f 622/562/6 383/539/6 250/540/6 +f 181/422/3 200/1067/3 416/1068/3 +f 414/1103/3 78/1126/3 64/1271/3 +f 78/1126/3 550/1127/3 64/1271/3 +f 172/1275/3 646/2028/3 410/1273/3 +f 646/2028/3 170/1079/3 410/1273/3 +f 410/1273/3 536/1080/3 63/1092/3 +f 410/1273/3 63/1092/3 411/1274/3 +f 412/1096/3 655/1276/3 414/1103/3 +f 655/1276/3 425/2029/3 301/1102/3 +f 419/7/3 550/1127/3 420/463/3 +f 690/1277/1 568/1608/1 319/173/1 +f 559/1924/3 431/1921/3 192/1279/3 +f 431/1921/3 307/1114/3 192/1279/3 +f 78/1126/3 429/125/3 552/462/3 +f 429/125/3 202/123/3 552/462/3 +f 202/123/3 660/1118/3 552/462/3 +f 660/1118/3 558/1116/3 661/1117/3 +f 434/1119/3 662/2030/3 664/1280/3 +f 664/1280/3 319/1413/3 561/168/3 +f 691/578/1 105/554/1 672/1281/1 +f 471/2031/4 470/2032/4 2/303/4 +f 470/2032/4 257/1282/4 2/303/4 +f 257/1282/4 609/2033/4 504/302/4 +f 557/1940/3 661/1117/3 189/1115/3 +f 557/1940/3 189/1115/3 663/169/3 +f 67/1705/3 81/387/3 557/1940/3 +f 423/2034/3 70/2035/3 68/2036/3 +f 68/2036/3 67/1705/3 557/1940/3 +f 557/1940/3 663/169/3 68/2036/3 +f 663/169/3 665/167/3 68/2036/3 +f 68/2036/3 665/167/3 423/2034/3 +f 194/2037/3 71/2038/3 666/1284/3 +f 667/1285/3 319/1413/3 193/1122/3 +f 423/2034/3 665/167/3 666/1284/3 +f 665/167/3 667/1285/3 666/1284/3 +f 668/1283/3 194/2037/3 666/1284/3 +f 667/1285/3 193/1122/3 85/1120/3 +f 85/1120/3 668/1283/3 667/1285/3 +f 320/234/1 440/1484/1 451/233/1 +f 440/1484/1 580/501/1 451/233/1 +f 673/2039/3 674/2040/3 564/1129/3 +f 674/2040/3 675/1085/3 564/1129/3 +f 198/1287/3 199/1108/3 671/1288/3 +f 199/1108/3 442/2041/3 77/2042/3 +f 671/1288/3 199/1108/3 77/2042/3 +f 74/1289/3 73/2043/3 670/1944/3 +f 73/2043/3 197/2044/3 670/1944/3 +f 670/1944/3 672/1124/3 74/1289/3 +f 672/1124/3 198/1287/3 74/1289/3 +f 197/2044/3 196/1123/3 670/1944/3 +f 102/1143/3 568/1949/3 690/1290/3 +f 91/1291/3 689/2045/3 102/1143/3 +f 689/2045/3 100/1145/3 102/1143/3 +f 68/1293/4 69/1512/4 57/990/4 +f 69/1512/4 177/1513/4 57/990/4 +f 57/990/4 277/2046/4 67/1292/4 +f 312/1294/3 206/2047/3 76/1295/3 +f 88/248/3 433/1303/3 323/1297/3 +f 594/2048/4 132/1476/4 373/1300/4 +f 132/1476/4 23/318/4 373/1300/4 +f 23/318/4 616/1298/4 373/1300/4 +f 203/1301/3 89/1347/3 326/1302/3 +f 318/1304/3 327/443/3 83/13/3 +f 98/1139/3 324/237/3 685/1305/3 +f 684/1306/3 95/1138/3 98/1139/3 +f 95/1138/3 208/1137/3 98/1139/3 +f 685/1305/6 324/237/6 661/235/6 +f 442/2049/4 199/1308/4 454/1307/4 +f 199/1308/4 198/1042/4 106/1309/4 +f 335/1310/3 321/1939/3 331/1105/3 +f 92/1312/3 331/1105/3 440/1106/3 +f 446/2050/3 683/1160/3 682/1314/3 +f 683/1160/3 86/1159/3 438/1315/3 +f 444/1142/3 209/1140/3 687/931/3 +f 99/814/3 445/2051/3 212/1317/3 +f 216/110/3 90/2052/3 688/1318/3 +f 692/38/3 338/1150/3 337/1151/3 +f 337/1151/3 332/1149/3 93/1153/3 +f 572/1156/3 222/1154/3 108/1321/3 +f 336/472/3 213/2053/3 221/1323/3 +f 237/1189/3 709/2054/3 464/2055/3 +f 709/2054/3 352/2056/3 710/2057/3 +f 464/2055/3 709/2054/3 710/2057/3 +f 710/2057/3 465/2058/3 464/2055/3 +f 464/2055/3 357/1192/3 237/1189/3 +f 579/1165/3 347/1164/3 346/1324/3 +f 107/1326/3 699/2059/3 228/1327/3 +f 581/1168/3 582/1166/3 343/1170/3 +f 223/1329/3 701/1172/3 226/1330/3 +f 707/1331/3 462/1202/3 234/1332/3 +f 240/1335/3 130/2060/3 358/2061/3 +f 130/2060/3 718/2062/3 358/2061/3 +f 718/2062/3 359/2063/3 358/2061/3 +f 358/2061/3 716/2064/3 240/1335/3 +f 716/2064/3 239/1333/3 240/1335/3 +f 719/1338/3 720/2065/3 129/2066/3 +f 720/2065/3 131/2067/3 129/2066/3 +f 131/2067/3 130/2060/3 129/2066/3 +f 128/2068/3 717/1334/3 360/1336/3 +f 129/2066/3 128/2068/3 719/1338/3 +f 128/2068/3 360/1336/3 719/1338/3 diff --git a/mods/everness/nodes.lua b/mods/everness/nodes.lua new file mode 100644 index 00000000..3a8abf58 --- /dev/null +++ b/mods/everness/nodes.lua @@ -0,0 +1,12053 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2022 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- +-- Ores +-- + +Everness:register_node('everness:coral_desert_stone_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_coral_desert_stone.png^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:crystal_stone_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_crystal_stone.png^[sheet:2x2:1,1^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:cursed_stone_carved_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_cursed_stone_carved.png^[sheet:2x2:1,1^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:mineral_stone_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:stone_with_pyrite', { + description = S('Pyrite Ore'), + tiles = { 'everness_stone.png^everness_mineral_pyrite.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1, + material_stone = 1, + blast_furnace_smeltable = 1 + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + drop = 'everness:pyrite_lump', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_with_ceramic_sherds', { + description = S('Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.'), + short_description = S('Ceramic Sherds'), + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1^everness_ceramic_sherds_ore.png' }, + groups = { + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = { + max_items = 1, + items = { + { + tool_groups = { 'archeological_drop' }, + items = { 'everness:ceramic_pot_sherd_flowers' }, + rarity = 20 + }, + { + tool_groups = { 'archeological_drop' }, + items = { 'everness:ceramic_pot_sherd_lines' }, + rarity = 10 + }, + { + tool_groups = { 'archeological_drop' }, + items = { 'everness:ceramic_pot_sherd_tribal' }, + rarity = 5 + }, + { + items = { 'everness:ceramic_pot_sherd_blank' } + } + } + }, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:pyriteblock', { + description = S('Pyrite Block'), + tiles = { 'everness_pyrite_block.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_forged', { + description = S('Forged Pyrite Block'), + tiles = { 'everness_pyrite_block_forged.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_brick', { + description = S('Pyrite Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyriteblock_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_slab_brick', { + description = S('Pyrite Slab Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_block_slab_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_spiral', { + description = S('Pyrite Spiral'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_block_spiral.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_bottom', { + description = S('Pyrite Pillar Bottom'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_bottom.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_middle', { + description = S('Pyrite Pillar Middle'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_middle.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_top', { + description = S('Pyrite Pillar Top'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_top.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_small', { + description = S('Pyrite Pillar Small'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_small.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_polished', { + description = S('Polished Pyrite Block'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_block_polished.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:quartz_ore', { + description = S('Quartz Ore'), + tiles = { 'everness_stone.png^everness_quartz_ore.png' }, + groups = { + -- MTG + cracky = 3, + stone = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 3 + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + drop = 'everness:quartz_crystal', + sounds = Everness.node_sound_stone_defaults(), +}) + +-- +-- Stone +-- + +Everness:register_node('everness:coral_desert_stone', { + description = S('Coral Desert Stone'), + tiles = { 'everness_coral_desert_stone.png' }, + drop = 'everness:coral_desert_cobble', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_stone', { + description = S('Crystal Stone'), + tiles = { + { + name = 'everness_crystal_stone.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:crystal_cobble', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone', { + description = S('Coral Sandstone'), + tiles = { 'everness_coral_sandstone.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1, + -- Everness + everness_sandstone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone_brick', { + description = S('Coral Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone_chiseled', { + description = S('Coral Sandstone Chiseled Block'), + tiles = { 'everness_coral_sandstone_chiseled.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone_carved_1', { + description = S('Coral Sandstone Carved Block'), + tiles = { 'everness_coral_sandstone_carved_1.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_white_sandstone', { + description = S('Coral White Sandstone'), + tiles = { 'everness_coral_white_sandstone.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_white_sandstone_brick', { + description = S('Coral White Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_white_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_white_sandstone_pillar', { + description = S('Coral White Sandstone Pillar'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone_pillar.png', + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_stone_block', { + description = S('Coral Desert Stone Block'), + tiles = { 'everness_coral_desert_stone_block.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_stone_brick', { + description = S('Coral Desert Stone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_desert_stone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_bones', { + description = S('Coral Bones'), + tiles = { 'everness_coral_bones.png' }, + groups = { + -- MTG + cracky = 3, + stone = 1, + -- MCL + pickaxey = 1, + building_block = 1 + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_bones_block', { + description = S('Coral Bones Block'), + tiles = { 'everness_coral_bones_block.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_bones_brick', { + description = S('Coral Bones Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_bones_brick.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_cobble', { + description = S('Crystal Cobblestone'), + tiles = { 'everness_crystal_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_mossy_cobble', { + description = S('Crystal Mossy Cobblestone'), + tiles = { 'everness_crystal_mossy_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_stone_brick', { + description = S('Crystal Stone Brick'), + paramtype2 = 'facedir', + drawtype = 'allfaces', + place_param2 = 0, + tiles = { 'everness_crystal_stone_brick.png' }, + use_texture_alpha = 'blend', + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_cobble', { + description = S('Coral Desert Cobblestone'), + tiles = { 'everness_coral_desert_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_mossy_cobble', { + description = S('Coral Mossy Cobblestone'), + tiles = { 'everness_coral_desert_mossy_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_stone_with_moss', { + description = S('Coral Desert Stone with Moss'), + tiles = { + 'everness_coral_stone_with_moss_top.png', + 'everness_coral_desert_stone.png', + { + name = 'everness_coral_desert_stone.png^everness_coral_stone_with_moss_side.png', + tileable_vertical = false + } + }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + drop = 'everness:coral_desert_cobble', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_deep_ocean_sandstone_block', { + description = S('Coral Deep Ocean Sandstone Block'), + tiles = { 'everness_deep_ocean_sandstone_block.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_deep_ocean_sandstone_brick', { + description = S('Coral Deep Ocean Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_deep_ocean_sandstone_brick.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sandstone_block', { + description = S('Cursed Lands Deep Ocean Sandstone Block'), + tiles = { 'everness_cursed_lands_deep_ocean_sandblock.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sandstone_brick', { + description = S('Cursed Lands Deep Ocean Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_lands_deep_ocean_sand_brick.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sandstone_block', { + description = S('Crystal Forest Deep Ocean Sandstone Block'), + tiles = { 'everness_crystal_forest_deep_ocean_sandstone_block.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sandstone_brick', { + description = S('Crystal Forest Deep Ocean Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_crystal_forest_deep_ocean_sandstone_brick.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_stone', { + description = S('Forsaken Desert Stone'), + tiles = { 'everness_forsaken_desert_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + drop = 'everness:forsaken_desert_cobble_red', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_cobble_red', { + description = S('Forsaken Desert Cobblestone Red'), + tiles = { 'everness_forsaken_desert_cobble_red.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_cobble', { + description = S('Forsaken Desert Cobblestone'), + tiles = { 'everness_forsaken_desert_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:volcanic_rock', { + description = S('Volcanic Rock'), + tiles = { 'everness_volcanic_rock.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + is_ground_content = false, +}) + +Everness:register_node('everness:volcanic_rock_with_magma', { + description = S('Volcanic Rock with Magma'), + tiles = { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + paramtype = 'light', + light_source = 3, +}) + +Everness:register_node('everness:magmacobble', { + description = 'Magma Cobblestone', + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), + tiles = { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = 'light', + light_source = 3, +}) + +Everness:register_node('everness:cursed_stone', { + description = S('Cursed Stone'), + tiles = { + { name = 'everness_cursed_stone.png' } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults() +}) + +Everness:register_node('everness:cursed_stone_carved', { + description = S('Cursed Stone Carved'), + tiles = { + { + name = 'everness_cursed_stone_carved.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:cursed_stone', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults() +}) + +Everness:register_node('everness:cursed_brick', { + description = S('Cursed Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_brick_with_growth', { + description = S('Cursed Brick with Growth'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick_with_growth.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_brick_mixed', { + description = S('Cursed Brick Mixed'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick_mixed.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_brick_carved', { + description = S('Cursed Brick Carved'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick_carved.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:volcanic_sulfur', { + description = S('Volcanic Sulfur Stone'), + tiles = { 'everness_volcanic_sulfur_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:sulfur_stone', { + description = S('Sulfur Stone'), + tiles = { 'everness_sulfur_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + on_construct = function(pos) + Everness:tick_sulfur_stone(pos) + end, + on_timer = function(pos, elapsed) + local _, node_counts = minetest.find_nodes_in_area( + vector.offset(pos, -1, 1, -1), + vector.offset(pos, 1, 1, 1), + 'everness:volcanic_sulfur', + false + ) + + if node_counts['everness:volcanic_sulfur'] < 4 + or minetest.get_node(vector.new(pos.x, pos.y + 1, pos.z)).name ~= 'air' + then + -- stop timer, to restart timer: dig/place again + -- Everness:tick_sulfur_stone_again(pos) + return + end + + local particlespawner_def = { + amount = 1, + time = 4, + minpos = vector.new({ x = pos.x - 0.25, y = pos.y + 0.6, z = pos.z - 0.25 }), + maxpos = vector.new({ x = pos.x + 0.25, y = pos.y + 0.6, z = pos.z + 0.25 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 7.5, + maxexptime = 7.5, + minsize = 16, + maxsize = 24, + texture = 'everness_smoke_cloud_particle_static.png', + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + particlespawner_def = { + amount = 1, + time = 4, + size = { + min = 16, + max = 24, + }, + exptime = 7.5, + pos = { + min = vector.new({ x = pos.x - 0.25, y = pos.y + 0.6, z = pos.z - 0.25 }), + max = vector.new({ x = pos.x + 0.25, y = pos.y + 0.6, z = pos.z + 0.25 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_smoke_cloud_particle_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 8, + aspect_h = 8, + length = 8 + } + } + } + end + + minetest.add_particlespawner(particlespawner_def) + + Everness:tick_sulfur_stone(pos) + end, + after_destruct = function(pos, oldnode) + pos.y = pos.y + 1 + + if minetest.get_node(pos).name == 'everness:flame_permanent' then + minetest.remove_node(pos) + end + end, + on_ignite = function(pos, igniter) + local flame_pos = { x = pos.x, y = pos.y + 1, z = pos.z } + + if minetest.get_node(flame_pos).name == 'air' then + minetest.set_node(flame_pos, {name = 'everness:flame_permanent'}) + end + end, + -- MCL + _on_ignite = function(player, pointed_thing) + local pos = pointed_thing.under + local flame_pos = { x = pos.x, y = pos.y + 1, z = pos.z } + + if minetest.get_node(flame_pos).name == 'air' then + minetest.set_node(flame_pos, {name = 'everness:flame_permanent'}) + return true + end + + return false + end +}) + +Everness:register_node('everness:forsaken_tundra_cobble', { + description = S('Forsaken Tundra Cobblestone'), + tiles = { 'everness_forsaken_tundra_cobblestone.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_stone', { + description = S('Forsaken Tundra Stone'), + tiles = { 'everness_forsaken_tundra_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + drop = 'everness:forsaken_tundra_cobble', + legacy_mineral = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mold_cobble', { + description = S('Mold Cobble'), + tiles = { 'everness_mold_stone.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + sounds = Everness.node_sound_stone_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 2, +}) + +Everness:register_node('everness:forsaken_tundra_brick', { + description = S('Forsaken Tundra Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_forsaken_tundra_brick.png' }, + is_ground_content = false, + groups = { + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_rocks', { + description = S('Forsaken Tundra Rocks'), + tiles = { + 'everness_forsaken_tundra_rocks_top.png', + 'everness_forsaken_tundra_rocks_top.png', + 'everness_forsaken_tundra_rocks_side.png', + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + legacy_mineral = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:blue_crying_obsidian', { + description = S('Blue Crying Obsidian'), + tiles = { 'everness_blue_crying_obsidian.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + -- Everness + everness_obsidian = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, +}) + +Everness:register_node('everness:blue_weeping_obsidian', { + description = S('Blue Weeping Obsidian'), + tiles = { 'everness_blue_weeping_obsidian.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + -- Everness + everness_obsidian = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + paramtype = 'light', + light_source = 7, +}) + +Everness:register_node('everness:weeping_obsidian', { + description = S('Weeping Obsidian'), + tiles = { 'everness_weeping_obsidian.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + -- Everness + everness_obsidian = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + paramtype = 'light', + light_source = 7, +}) + +Everness:register_node('everness:mold_stone_with_moss', { + description = S('Mold Stone'), + tiles = { + 'everness_mold_stone_with_moss_top.png', + 'everness_mold_stone.png', + 'everness_mold_stone_with_moss_side.png' + }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + is_ground_content = false, + drop = 'everness:mold_cobble', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:soul_sandstone', { + description = S('Soul Sandstone'), + tiles = { 'everness_soul_sandstone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), + after_destruct = function(pos) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == 'everness:flame_permanent_blue' then + minetest.remove_node(pos) + end + end, + on_ignite = function(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node(flame_pos).name == 'air' then + minetest.set_node(flame_pos, {name = 'everness:flame_permanent_blue'}) + end + end +}) + +Everness:register_node('everness:soul_sandstone_veined', { + description = S('Soul Sandstone Veined'), + tiles = { + 'everness_soul_sandstone_veined_top.png', + 'everness_soul_sandstone.png', + 'everness_soul_sandstone_veined_side.png' + }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + drop = 'everness:soul_sandstone', + sounds = Everness.node_sound_stone_defaults(), + after_destruct = function(pos) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == 'everness:flame_permanent_purple' then + minetest.remove_node(pos) + end + end, + on_ignite = function(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node(flame_pos).name == 'air' then + minetest.set_node(flame_pos, {name = 'everness:flame_permanent_purple'}) + end + end +}) + +Everness:register_node('everness:crystal_block_purple', { + description = S('Purple Crystal Block'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_crystal_block_purple_top.png', + 'everness_crystal_block_purple_top.png', + 'everness_crystal_block_purple.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + light_source = 7, + sounds = Everness.node_sound_crystal_defaults(), +}) + +Everness:register_node('everness:crystal_block_orange', { + description = S('Orange Crystal Block'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_crystal_block_orange_top.png', + 'everness_crystal_block_orange_top.png', + 'everness_crystal_block_orange.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + light_source = 7, + sounds = Everness.node_sound_crystal_defaults(), +}) + +Everness:register_node('everness:crystal_block_cyan', { + description = S('Cyan Crystal Block'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_crystal_block_cyan_top.png', + 'everness_crystal_block_cyan_top.png', + 'everness_crystal_block_cyan.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + light_source = 7, + sounds = Everness.node_sound_crystal_defaults(), +}) + +-- Quartz + +-- Quartz Block +Everness:register_node('everness:quartz_block', { + description = S('Quartz Block'), + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_quartz_block_top.png', + 'everness_quartz_block_bottom.png', + 'everness_quartz_block_side.png', + }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + quartz_block = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +-- Chiseled Quartz +Everness:register_node('everness:quartz_chiseled', { + description = S('Chiseled Quartz'), + tiles = { + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled.png', + }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + quartz_block = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +-- Quartz Pillar +Everness:register_node('everness:quartz_pillar', { + description = S('Quartz Pillar'), + paramtype2 = 'facedir', + tiles = { + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines.png', + }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + quartz_block = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:forsaken_desert_brick', { + description = S('Forsaken Desert Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_forsaken_desert_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_brick_red', { + description = S('Forsaken Desert Brick Red'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_forsaken_desert_brick_red.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_chiseled_stone', { + description = S('Forsaken Desert Chiseled Stone'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_forsaken_desert_chiseled_stone_top.png', + 'everness_forsaken_desert_chiseled_stone_bottom.png', + 'everness_forsaken_desert_chiseled_stone_side.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_engraved_stone', { + description = S('Forsaken Desert Engraved Stone'), + tiles = { 'everness_forsaken_desert_engraved_stone.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_sandstone', { + description = S('Crystal Sandstone'), + tiles = { 'everness_crystal_sandstone.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_sandstone_brick', { + description = S('Crystal Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_crystal_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_sandstone_chiseled', { + description = S('Crystal Sandstone Chiseled'), + tiles = { 'everness_crystal_sandstone_chiseled.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_sandstone_block', { + description = S('Cursed Sandstone Block'), + tiles = { 'everness_cursed_sandstone_block.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_sandstone_brick', { + description = S('Cursed Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone', { + description = S('Mineral') .. ' ' .. S('Stone'), + tiles = { + { + name = 'everness_mineral_stone.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_stone_cobble', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_cobble', { + description = S('Mineral') .. ' ' .. S('Cobblestone'), + tiles = { + { + name = 'everness_mineral_cobblestone.png', + align_style = 'world', + scale = 2 + } + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_block', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block'), + tiles = { + { + name = 'everness_mineral_stone_block.png', + align_style = 'world', + scale = 2 + } + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_brick', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_stone_brick.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone', { + description = S('Mineral') .. ' ' .. S('Sandstone'), + tiles = { 'everness_mineral_sandstone.png' }, + groups = { + -- MTG + cracky = 3, + crumbly = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- Everness + everness_sandstone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone_block', { + description = S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block'), + tiles = { + { + name = 'everness_mineral_sandstone_block.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_brick_with_growth', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_stone_brick_with_growth.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_brick_with_flower_growth', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_stone_brick_with_flower_growth.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone_brick', { + description = S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_sandstone_brick.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone_brick_block', { + description = S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { + name = 'everness_mineral_sandstone_brick_block.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +-- +-- Soft / Non-Stone +-- + +Everness:register_node('everness:coral_dirt', { + description = S('Coral Dirt'), + short_description = S('Coral Dirt'), + tiles = { 'everness_coral_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:coral_deep_ocean_mud', { + description = S('Coral Deep Ocean Mud'), + short_description = S('Coral Deep Ocean Mud'), + tiles = { 'everness_mud_2.png' }, + groups = { crumbly = 3, bio_bubbles = 1 }, + sounds = Everness.node_sound_mud_defaults(), +}) + +Everness:register_node('everness:cursed_dirt', { + description = S('Cursed Dirt'), + short_description = S('Cursed Dirt'), + tiles = { 'everness_cursed_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_mud_defaults(), +}) + +Everness:register_node('everness:crystal_dirt', { + description = S('Crystal Dirt'), + short_description = S('Crystal Dirt'), + tiles = { 'everness_crystal_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_dirt', { + description = S('Forsaken Tundra Dirt'), + short_description = S('Forsaken Tundra Dirt'), + tiles = { 'everness_forsaken_tundra_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_dirt_with_grass', { + description = S('Forsaken Tundra Dirt with Grass'), + short_description = S('Forsaken Tundra Dirt with Grass'), + tiles = { + 'everness_forsaken_tundra_grass.png', + 'everness_forsaken_tundra_dirt.png', + { name = 'everness_forsaken_tundra_dirt.png^everness_forsaken_tundra_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + -- drop = 'everness:forsaken_tundra_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_coral_grass', { + description = S('Dirt with Coral Grass'), + short_description = S('Dirt with Coral Grass'), + tiles = { + 'everness_coral_grass.png', + 'everness_coral_dirt.png', + { name = 'everness_coral_dirt.png^everness_coral_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:coral_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_cursed_grass', { + description = S('Dirt with Cursed Grass'), + short_description = S('Dirt with Cursed Grass'), + tiles = { + 'everness_cursed_grass.png', + 'everness_cursed_dirt.png', + { name = 'everness_cursed_dirt.png^everness_cursed_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:cursed_dirt', + sounds = Everness.node_sound_mud_defaults(), +}) + +Everness:register_node('everness:dirt_with_crystal_grass', { + description = S('Dirt with Crystal Grass'), + short_description = S('Dirt with Crystal Grass'), + tiles = { + 'everness_crystal_grass.png', + 'everness_crystal_dirt.png', + { name = 'everness_crystal_dirt.png^everness_crystal_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:crystal_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dry_ocean_dirt', { + description = S('Dry Ocean Dirt'), + short_description = S('Dry Ocean Dirt'), + tiles = { 'everness_forsaken_desert_dry_ocean_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +if minetest.get_modpath("default") then + minetest.register_alias("everness:gravel","default:gravel") +else + Everness:register_node('everness:gravel', { + description = 'Everness ' .. S('Gravel'), + tiles = { 'everness_gravel.png' }, + groups = { + -- MTG + crumbly = 2, + -- MCL + handy = 1, + shovely = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- All + falling_node = 1, + }, + -- MCL + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + -- { items = { 'default:flint' }, rarity = 16 }, + { items = { 'everness:gravel' } } + } + } + }) +end + +Everness:register_node('everness:flame_permanent', { + description = S('Permanent Fire'), + drawtype = 'firelike', + use_texture_alpha = 'blend', + tiles = { + { + name = 'everness_flame_permanent.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 4 + } + } + }, + inventory_image = 'everness_flame_permanent_item.png', + paramtype = 'light', + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = { + igniter = 2, + dig_immediate = 3, + fire = 1 + }, + drop = '', + on_flood = function(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if minetest.get_item_group(newnode.name, 'igniter') == 0 then + minetest.sound_play('everness_extinguish_flame', + { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + pitch = math.random(5, 20) / 10 + }, + true + ) + end + + -- Remove the flame + return false + end +}) + +Everness:register_node('everness:flame_permanent_purple', { + description = S('Permanent Fire'), + drawtype = 'firelike', + use_texture_alpha = 'blend', + tiles = { + { + name = 'everness_flame_permanent_purple.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 4 + } + } + }, + inventory_image = 'everness_flame_permanent_purple_item.png', + paramtype = 'light', + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = { + igniter = 2, + dig_immediate = 3, + fire = 1 + }, + drop = '', + on_flood = function(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if minetest.get_item_group(newnode.name, 'igniter') == 0 then + minetest.sound_play('everness_extinguish_flame', + { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + pitch = math.random(5, 20) / 10 + }, + true + ) + end + + -- Remove the flame + return false + end +}) + +Everness:register_node('everness:flame_permanent_blue', { + description = S('Permanent Fire'), + drawtype = 'firelike', + use_texture_alpha = 'blend', + tiles = { + { + name = 'everness_flame_permanent_blue.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 4 + } + } + }, + inventory_image = 'everness_flame_permanent_blue_item.png', + paramtype = 'light', + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = { + igniter = 2, + dig_immediate = 3, + fire = 1 + }, + drop = '', + on_flood = function(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if minetest.get_item_group(newnode.name, 'igniter') == 0 then + minetest.sound_play('everness_extinguish_flame', + { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + pitch = math.random(5, 20) / 10 + }, + true + ) + end + + -- Remove the flame + return false + end +}) + +-- Mapgen Marker + +Everness:register_node('everness:marker', { + drawtype = 'airlike', + description = 'Marker for mapgen', + tiles = { 'everness_lootchest_marker_top.png', 'everness_lootchest_marker_side.png' }, + groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, + _mcl_hardness = 0.2, + paramtype2 = 'facedir', + drop = '' +}) + +-- Everness default blocks + +if minetest.get_modpath("default") then + minetest.register_alias("everness:dirt_1","default:dirt") + minetest.register_alias("everness:dry_dirt","default:dry_dirt") + minetest.register_alias("everness:dry_dirt_with_dry_grass","default:dry_dirt_with_dry_grass") + minetest.register_alias("everness:dirt_with_grass_1","default:dirt_with_rainforest_litter") + minetest.register_alias("everness:dirt_with_grass_extras_1","default:dirt_with_rainforest_litter") + minetest.register_alias("everness:dirt_with_grass_extras_2","default:dirt_with_rainforest_litter") +else + Everness:register_node('everness:dirt_1', { + description = S('Dirt'), + short_description = S('Dirt'), + tiles = { 'everness_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + }) + + Everness:register_node('everness:dry_dirt', { + description = S('Dry Dirt'), + short_description = S('Dry Dirt'), + tiles = { 'everness_dry_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + }) + + Everness:register_node('everness:dry_dirt_with_dry_grass', { + description = S('Dirt with Dry Grass'), + short_description = S('Dirt with Dry Grass'), + tiles = { + 'everness_dry_grass_top.png', + 'everness_dry_dirt.png', + { name = 'everness_dry_dirt.png^everness_dry_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dry_dirt', + sounds = Everness.node_sound_grass_defaults(), + }) + + Everness:register_node('everness:dirt_with_grass_1', { + description = S('Dirt with Grass'), + short_description = S('Dirt with Grass'), + tiles = { + 'everness_grass_top.png', + 'everness_dirt.png', + { name = 'everness_dirt.png^everness_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dirt_1', + sounds = Everness.node_sound_grass_defaults(), + }) + + Everness:register_node('everness:dirt_with_grass_extras_1', { + description = S('Dirt with Grass'), + short_description = S('Dirt with Grass'), + tiles = { + { name = 'everness_grass_top.png^everness_grass_extras_1.png', tileable_vertical = false }, + 'everness_dirt.png', + { name = 'everness_dirt.png^everness_grass_side.png', tileable_vertical = false } + }, + use_texture_alpha = 'clip', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dirt_1', + sounds = Everness.node_sound_grass_defaults(), + }) + + Everness:register_node('everness:dirt_with_grass_extras_2', { + description = S('Dirt with Grass'), + short_description = S('Dirt with Grass'), + tiles = { + { name = 'everness_grass_top.png^everness_grass_extras_2.png', tileable_vertical = false }, + 'everness_dirt.png', + { name = 'everness_dirt.png^everness_grass_side.png', tileable_vertical = false } + }, + use_texture_alpha = 'clip', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dirt_1', + sounds = Everness.node_sound_grass_defaults(), + }) +end + +Everness:register_node('everness:crystal_cave_dirt', { + description = S('Crystal Cave Dirt'), + short_description = S('Crystal Cave Dirt'), + tiles = { 'everness_crystal_cave_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:crystal_cave_dirt_with_moss', { + description = S('Crystal Cave Dirt with Moss'), + short_description = S('Crystal Cave Dirt with Moss'), + tiles = { + 'everness_crystal_cave_dirt_top.png', + 'everness_crystal_cave_dirt.png', + 'everness_crystal_cave_dirt_side.png' + }, + drop = 'everness:crystal_cave_dirt', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type_under = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:moss_block', { + description = S('Moss Block'), + tiles = { 'everness_moss_block.png' }, + groups = { + -- MTG + crumbly = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:crystal_moss_block', { + description = S('Crystal Moss Block'), + tiles = { 'everness_crystal_cave_moss.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:coral_sand', { + description = S('Coral Sand'), + short_description = S('Coral Sand'), + tiles = { 'everness_coral_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:coral_white_sand', { + description = S('Coral White Sand'), + short_description = S('Coral White Sand'), + tiles = { 'everness_coral_white_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cursed_sand', { + description = S('Cursed Sand'), + short_description = S('Cursed Sand'), + tiles = { 'everness_cursed_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:crystal_sand', { + description = S('Crystal Sand'), + short_description = S('Crystal Sand'), + tiles = { 'everness_crystal_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sand_with_crack', { + description = S('Crystal Forest Deep Ocean Sand with Crack'), + short_description = S('Crystal Forest Deep Ocean Sand with Crack'), + tiles = { 'everness_crystal_forest_deep_ocean_sand_with_crack.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + rising_crystals = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:forsaken_tundra_beach_sand', { + description = S('Forsaken Tundra Beach Sand'), + short_description = S('Forsaken Tundra Beach Sand'), + tiles = { 'everness_forsaken_tundra_beach_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:forsaken_tundra_beach_sand_with_shells', { + description = S('Forsaken Tundra Beach Sand with Shells'), + short_description = S('Forsaken Tundra Beach Sand'), + tiles = { 'everness_forsaken_tundra_beach_sand_with_shells.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:forsaken_desert_sand', { + description = S('Forsaken Desert Sand'), + short_description = S('Forsaken Desert Sand'), + tiles = { 'everness_forsaken_desert_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:coral_forest_deep_ocean_sand', { + description = S('Coral Forest Deep Ocean Sand'), + short_description = S('Coral Forest Deep Ocean Sand'), + tiles = { 'everness_deep_ocean_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sand', { + description = S('Cursed Lands Deep Ocean Sand'), + short_description = S('Cursed Lands Deep Ocean Sand'), + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sand_with_crack', { + description = S('Cursed Lands Deep Ocean Sand with Crack'), + short_description = S('Cursed Lands Deep Ocean Sand with Crack'), + tiles = { 'everness_cursed_lands_deep_ocean_sand_with_crack.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + rising_souls = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sand', { + description = S('Crystal Forest Deep Ocean Sand'), + short_description = S('Crystal Forest Deep Ocean Sand'), + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:mineral_sand', { + description = S('Mineral Sand'), + short_description = S('Mineral Sand'), + tiles = { + { + name = 'everness_mineral_sand.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + soil_sapling = 2, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:frosted_snowblock', { + description = S('Frosted Snow Block'), + tiles = { 'everness_frosted_snow.png' }, + groups = { + -- MTG + crumbly = 3, + cools_lava = 1, + snowy = 1, + -- MCL + shovely = 2, + building_block = 1, + snow_cover = 1 + }, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_frosted_snow_defaults(), + on_construct = function(pos) + pos.y = pos.y - 1 + + local alias_dirt_with_grass = minetest.registered_aliases['default:dirt_with_grass'] + local alias_dirt_with_snow = minetest.registered_aliases['default:dirt_with_snow'] + + if minetest.get_node(pos).name == alias_dirt_with_grass then + minetest.set_node(pos, { name = alias_dirt_with_snow }) + end + end, +}) + +-- 'is ground content = false' to avoid tunnels in sea ice or ice rivers +Everness:register_node('everness:frosted_ice', { + description = S('Frosted Ice'), + tiles = { 'everness_frosted_ice.png' }, + is_ground_content = false, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:frosted_ice_translucent', { + description = S('Frosted Ice Translucent'), + tiles = { 'everness_frosted_ice_translucent.png' }, + is_ground_content = false, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), + drawtype = 'glasslike', + -- opaque, clip, blend + use_texture_alpha = 'blend' +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +Everness:register_node('everness:frosted_cave_ice', { + description = S('Frosted Cave Ice'), + tiles = { 'everness_frosted_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3, + not_in_creative_inventory = 1 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + drop = 'everness:frosted_ice', + sounds = Everness.node_sound_ice_defaults(), +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +Everness:register_node('everness:frosted_cave_ice_illuminating', { + description = S('Frosted Cave Ice'), + tiles = { 'everness_frosted_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3, + not_in_creative_inventory = 1 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + drop = 'everness:frosted_ice', + sounds = Everness.node_sound_ice_defaults(), + light_source = 9, + is_ground_content = false +}) + +Everness:register_node('everness:bone', { + description = S('Bone'), + tiles = { 'everness_bone_top.png', 'everness_bone_top.png', 'everness_bone.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:ancient_emerald_ice', { + description = S('Ancient Emerald Ice'), + tiles = { 'everness_ancient_emerald_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:dense_emerald_ice', { + description = S('Dense Emerald Ice'), + tiles = { 'everness_dense_emerald_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:emerald_ice', { + description = S('Emerald Ice'), + tiles = { 'everness_emerald_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:snowcobble', { + description = 'Snow Cobble', + tiles = { 'everness_snowcobble.png' }, + groups = { + -- MTG + puts_out_fire = 1, + cools_lava = 1, + snowy = 1, + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_snow_defaults(), + is_ground_content = false, + + on_construct = function(pos) + pos.y = pos.y - 1 + + local alias_dirt_with_grass = minetest.registered_aliases['default:dirt_with_grass'] + local alias_dirt_with_snow = minetest.registered_aliases['default:dirt_with_snow'] + + if minetest.get_node(pos).name == alias_dirt_with_grass then + minetest.set_node(pos, { name = alias_dirt_with_snow }) + end + end, +}) + +Everness:register_node('everness:icecobble', { + description = 'Ice Cobble', + tiles = { 'everness_icecobble.png' }, + groups = { + -- MTG + puts_out_fire = 1, + cools_lava = 1, + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_ice_defaults(), + is_ground_content = false, +}) + +Everness:register_node('everness:cursed_mud', { + description = S('Cursed Mud'), + tiles = { 'everness_cursed_mud.png' }, + drawtype = 'glasslike', + paramtype = 'light', + move_resistance = 7, + drowning = 2, + walkable = false, + climbable = false, + post_effect_color = { r = 49, g = 51, b = 57, a = 245 }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + liquid = 3, + disable_jump = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cobweb', { + description = S('Cobweb'), + tiles = { 'everness_cobweb.png' }, + inventory_image = 'everness_cobweb.png', + drawtype = 'plantlike', + paramtype2 = 'meshoptions', + place_param2 = 8, + visual_scale = 1.1, + paramtype = 'light', + move_resistance = 7, + drowning = 2, + walkable = false, + groups = { + -- MTG + crumbly = 3, + liquid = 3, + -- MCL + swordy_cobweb = 1, + shearsy_cobweb = 1, + fake_liquid = 1, + deco_block = 1, + dig_by_piston = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + -- ALL + disable_jump = 1, + }, + sounds = Everness.node_sound_leaves_defaults() +}) + +Everness:register_node('everness:cave_flower', { + description = S('Cave Flower'), + short_description = S('Cave Flower'), + drawtype = 'mesh', + mesh = 'everness_cave_flower.obj', + tiles = { 'everness_cave_flower_mesh.png' }, + inventory_image = 'everness_cave_flower_item.png', + wield_image = 'everness_cave_flower_item.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + is_ground_content = false, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + bamboo_grass_under = 1, + -- X Farming + compost = 65, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + plant = 1, + flower = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + compostability = 65, + -- ALL + flammable = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_wood_defaults(), + sunlight_propagates = true, + light_source = 7, + liquids_pointable = false, + use_texture_alpha = 'clip', +}) + +Everness:register_node('everness:cave_flower_with_particles', { + description = S('Cave Flower with Particles'), + short_description = S('Cave Flower with Particles'), + drawtype = 'mesh', + mesh = 'everness_cave_flower_with_particles.obj', + tiles = { + { name = 'everness_cave_flower_mesh.png' }, + { + name = 'everness_cave_flower_mesh_particles.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 32, + length = 5 + }, + backface_culling = false + } + }, + inventory_image = 'everness_cave_flower_item_particles.png', + wield_image = 'everness_cave_flower_item_particles.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + is_ground_content = false, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 65, + -- Everness + bamboo_grass_under = 1, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + plant = 1, + flower = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + compostability = 65, + -- ALL + flammable = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + light_source = 12, + liquids_pointable = false, + -- opaque, clip, blend + use_texture_alpha = 'blend', +}) + +local lotus_flower_def = { + drawtype = 'mesh', + mesh = 'everness_lotus_flower.obj', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + compostability = 30, + -- ALL + flower = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + light_source = 3, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'blend' +} + +for _, color in ipairs({ 'pink', 'purple', 'white' }) do + local def = table.copy(lotus_flower_def) + + def.description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) + def.short_description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) + def.tiles = { + { name = 'everness_lotus_flower_' .. color .. '_mesh.png' }, + { name = 'everness_lotus_flower_mesh_not_animated.png' } + } + def.inventory_image = 'everness_lotus_flower_' .. color .. '_item.png' + def.wield_image = 'everness_lotus_flower_' .. color .. '_item.png' + + def.on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local node_def = minetest.registered_nodes[node.name] + + if node_def and node_def.on_rightclick then + return node_def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if node_def + and node_def.liquidtype == 'source' + and minetest.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, { name = 'everness:lotus_flower_' .. color, param2 = math.random(0, 3) }) + minetest.get_node_timer(pos):start(1) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, 'Node is protected') + minetest.record_protection_violation(pos, player_name) + end + else + itemstack = minetest.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end + + def.on_flood = function(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack('everness:lotus_flower_' .. color .. ' 1')) + -- Remove the node + return false + end + + def.on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, { name = 'everness:lotus_flower_' .. color .. '_animated' }) + end + + minetest.get_node_timer(pos):start(math.random(25, 35)) + end + + -- Animated Def + local def_anim = table.copy(def) + + def_anim.description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) .. ' ' .. S('Animated') + def_anim.short_description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) .. ' ' .. S('Animated') + def_anim.tiles = { + { name = 'everness_lotus_flower_' .. color .. '_mesh.png' }, + { + name = 'everness_lotus_flower_' .. color .. '_mesh_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 64, + aspect_h = 32, + length = 2 + }, + backface_culling = false + } + } + def_anim.light_source = 6 + def_anim.groups = { + -- MTG + snappy = 3, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- ALL + flammable = 1, + not_in_creative_inventory = 1 + } + def_anim.drop = 'everness:lotus_flower_' .. color + + def_anim.on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, { name = 'everness:lotus_flower_' .. color }) + end + + minetest.get_node_timer(pos):start(math.random(25, 35)) + end + + Everness:register_node('everness:lotus_flower_' .. color, def) + Everness:register_node('everness:lotus_flower_' .. color .. '_animated', def_anim) +end + +Everness:register_node('everness:lotus_leaf', { + description = S('Lotus') .. ' ' .. S('Leaf'), + short_description = S('Lotus') .. ' ' .. S('Leaf'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_lotus_leaf_y.png', + 'everness_lotus_leaf_y.png^[transformFY' + }, + inventory_image = 'everness_lotus_leaf_item.png', + wield_image = 'everness_lotus_leaf_item.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + node_box = { + type = 'fixed', + fixed = { + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4688, 0.4375 }, + { -0.4375, -0.4688, -0.4375, -0.4375, -0.4063, 0.4375 }, + { 0.4375, -0.4688, -0.4375, 0.4375, -0.4063, 0.4375 }, + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4063, -0.4375 }, + { -0.4375, -0.4688, 0.4375, -0.0625, -0.4063, 0.4375 }, + { 0.0625, -0.4688, 0.4375, 0.4375, -0.4063, 0.4375 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- X Farming + compostability = 30, + -- ALL + flora = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'clip', + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def + and def.liquidtype == 'source' + and minetest.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = 'everness:lotus_leaf', param2 = math.random(0, 3)}) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, 'Node is protected') + minetest.record_protection_violation(pos, player_name) + end + else + itemstack = minetest.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end, + + on_flood = function(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack('everness:lotus_leaf 1')) + -- Remove the node + return false + end +}) + +Everness:register_node('everness:lotus_leaf_2', { + description = S('Lotus') .. ' ' .. S('Leaf'), + short_description = S('Lotus') .. ' ' .. S('Leaf'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_lotus_leaf_2_y.png', + 'everness_lotus_leaf_2_y.png^[transformFY' + }, + inventory_image = 'everness_lotus_leaf_2_item.png', + wield_image = 'everness_lotus_leaf_2_item.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + node_box = { + type = 'fixed', + fixed = { + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4688, 0.4375 }, + { -0.4375, -0.4688, -0.4375, -0.4375, -0.4063, 0.4375 }, + { 0.4375, -0.4688, -0.4375, 0.4375, -0.4063, 0.4375 }, + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4063, -0.4375 }, + { -0.4375, -0.4688, 0.4375, -0.0625, -0.4063, 0.4375 }, + { 0.0625, -0.4688, 0.4375, 0.4375, -0.4063, 0.4375 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- X Farming + compostability = 30, + -- ALL + flora = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'clip', + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def + and def.liquidtype == 'source' + and minetest.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = 'everness:lotus_leaf_2', param2 = math.random(0, 3)}) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, 'Node is protected') + minetest.record_protection_violation(pos, player_name) + end + else + itemstack = minetest.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end, + + on_flood = function(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack('everness:lotus_leaf_2 1')) + -- Remove the node + return false + end +}) + +Everness:register_node('everness:lotus_leaf_3', { + description = S('Lotus') .. ' ' .. S('Leaf') .. ' ' .. S('Dry'), + short_description = S('Lotus') .. ' ' .. S('Leaf') .. ' ' .. S('Dry'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_lotus_leaf_3_y.png', + 'everness_lotus_leaf_3_y.png^[transformFY' + }, + inventory_image = 'everness_lotus_leaf_3_item.png', + wield_image = 'everness_lotus_leaf_3_item.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + node_box = { + type = 'fixed', + fixed = { + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4688, 0.4375 }, + { -0.4375, -0.4688, -0.4375, -0.4375, -0.4063, 0.4375 }, + { 0.4375, -0.4688, -0.4375, 0.4375, -0.4063, 0.4375 }, + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4063, -0.4375 }, + { -0.4375, -0.4688, 0.4375, -0.0625, -0.4063, 0.4375 }, + { 0.0625, -0.4688, 0.4375, 0.4375, -0.4063, 0.4375 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- X Farming + compostability = 30, + -- ALL + flora = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'clip', + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def + and def.liquidtype == 'source' + and minetest.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = 'everness:lotus_leaf_3', param2 = math.random(0, 3)}) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, 'Node is protected') + minetest.record_protection_violation(pos, player_name) + end + else + itemstack = minetest.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end, + + on_flood = function(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack('everness:lotus_leaf_3 1')) + -- Remove the node + return false + end +}) + +Everness:register_node('everness:forsaken_fire', { + description = S('Forsaken Fire'), + short_description = S('Forsaken Fire'), + drawtype = 'mesh', + mesh = 'everness_forsaken_fire.obj', + tiles = { + { name = 'everness_forsaken_fire_mesh.png' }, + { + name = 'everness_fire_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1 + }, + backface_culling = false + } + }, + inventory_image = 'everness_forsaken_fire_item.png', + wield_image = 'everness_forsaken_fire_item.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.25, 0.5 } + }, + groups = { + -- MTG + cracky = 3, + level = 2, + -- MCL + pickaxey = 2, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + sounds = Everness.node_sound_metal_defaults(), + light_source = 13, + liquids_pointable = false, + -- opaque, clip, blend + use_texture_alpha = 'clip', +}) + +-- +-- Trees +-- + +Everness:register_node('everness:coral_tree', { + description = S('Coral Tree Trunk'), + short_description = S('Coral Tree Trunk'), + tiles = { 'everness_coral_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:coral_wood', { + description = S('Coral Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_wood.png' }, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:coral_tree_bioluminescent', { + description = S('Coral Tree Bioluminescent'), + short_description = S('Coral Tree Bioluminescent'), + tiles = { 'everness_coral_mushrooms_bioluminescent.png' }, + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:cursed_dream_stone', { + description = S('Cursed Dream Stone'), + short_description = S('Cursed Dream Stone'), + tiles = { 'everness_cursed_dream_stone.png' }, + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:dry_tree', { + description = S('Dry Tree Trunk'), + short_description = S('Dry Tree Trunk'), + tiles = { 'everness_dry_tree_top.png', 'everness_dry_tree_top.png', 'everness_dry_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:baobab_tree', { + description = S('Baobab Tree Trunk'), + short_description = S('Baobab Tree Trunk'), + tiles = { 'everness_baobab_tree_top.png', 'everness_baobab_tree_top.png', 'everness_baobab_tree_side.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:sequoia_tree', { + description = S('Sequoia Tree Trunk'), + short_description = S('Sequoia Tree Trunk'), + tiles = { 'everness_sequoia_tree_top.png', 'everness_sequoia_tree_top.png', 'everness_sequoia_tree_side.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:willow_tree', { + description = S('Willow Tree Trunk'), + short_description = S('Sequoia Tree Trunk'), + tiles = { 'everness_willow_tree_top.png', 'everness_willow_tree_top.png', 'everness_willow_tree_side.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:willow_wood', { + description = S('Willow Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_willow_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:dry_wood', { + description = S('Dry Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_dry_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:hollow_tree', { + description = S('Hollow Tree Trunk'), + short_description = S('Hollow Tree Trunk'), + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.5000, -0.5000, 0.3125, 0.5000, 0.5000, 0.5000 }, + { 0.3125, -0.5000, -0.5000, 0.5000, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.5000, -0.3125, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.5000, 0.5000, 0.5000, -0.3125 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = { + 'everness_hollow_tree_top.png', + 'everness_hollow_tree_top.png', + 'everness_hollow_tree_side.png' + }, + use_texture_alpha = 'clip', + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:crystal_tree', { + description = S('Crystal Tree Trunk'), + short_description = S('Crystal Tree Trunk'), + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + }, + }, + tiles = { 'everness_crystal_tree_top.png', 'everness_crystal_tree_top.png', 'everness_crystal_tree.png' }, + paramtype2 = 'facedir', + use_texture_alpha = 'blend', -- only needed for stairs API + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_glass_defaults(), + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:crystal_wood', { + description = S('Crystal Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_crystal_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:mese_tree', { + description = S('Mese Tree Trunk'), + short_description = S('Mese Tree Trunk'), + tiles = { + { name = 'everness_mese_tree_top.png' }, + { name = 'everness_mese_tree_top.png' }, + { + name = 'everness_mese_tree_side_animated.png', + align_style = 'world', + scale = 8, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 8 + } + }, + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:palm_tree', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Trunk'), + short_description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Trunk'), + tiles = { 'everness_palm_tree_top.png', 'everness_palm_tree_top.png', 'everness_palm_tree_side.png' }, + paramtype2 = 'facedir', + use_texture_alpha = 'blend', -- only needed for stairs API + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:palm_leaves', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + short_description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_palm_tree_leaves.png' }, + special_tiles = { 'everness_palm_tree_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/100 chance + items = { 'everness:palm_tree_sapling' }, + rarity = 100, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:palm_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:palm_tree_wood', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + { + name = 'everness_palm_tree_wood.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:mese_leaves', { + description = S('Mese Tree Leaves'), + short_description = S('Mese Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_mese_leaves.png' }, + special_tiles = { 'everness_mese_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/30 chance + items = { 'everness:mese_tree_sapling' }, + rarity = 60, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:mese_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:baobab_leaves', { + description = S('Baobab Tree Leaves'), + short_description = S('Baobab Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_baobab_tree_leaves.png' }, + special_tiles = { 'everness_baobab_tree_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:baobab_sapling' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:baobab_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:sequoia_leaves', { + description = S('Sequoia Tree Leaves'), + short_description = S('Sequoia Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_sequoia_tree_leaves.png' }, + special_tiles = { 'everness_sequoia_tree_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:sequoia_tree_sapling' }, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:sequoia_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +-- for marker only +Everness:register_node('everness:baobab_fruit_renewable', { + description = S('Baobab Fruit'), + short_description = S('Baobab Fruit'), + drawtype = 'plantlike', + paramtype2 = 'wallmounted', + visual_scale = 1.69, + tiles = { 'everness_baobab_tree_fruit.png^[transformFY' }, + inventory_image = 'everness_baobab_tree_fruit.png^[transformFY', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + waving = 1, + drop = { + max_items = 1, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'everness:baobab_fruit' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + } + }, + }, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 1, 0.25 } + }, + groups = { + -- MTG + fleshy = 3, + dig_immediate = 3, + leafdecay = 3, + leafdecay_drop = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + -- ALL + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + place_param2 = 0, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, { name = 'everness:baobab_fruit_mark' }) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +Everness:register_node('everness:baobab_fruit_mark', { + description = S('Baobab Fruit Marker'), + short_description = S('Baobab Fruit Marker'), + inventory_image = 'everness_baobab_tree_fruit.png^[transformFY^everness_invisible_node_overlay.png', + wield_image = 'everness_baobab_tree_fruit.png^[transformFY^everness_invisible_node_overlay.png', + drawtype = 'airlike', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = '', + groups = { not_in_creative_inventory = 1 }, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, 'everness:baobab_leaves') then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, { name = 'everness:baobab_fruit_renewable' }) + end + end +}) + +Everness:register_node('everness:baobab_fruit', { + description = S('Baobab Fruit') .. '\n'.. minetest.colorize(Everness.colors.brown, S('Hunger') .. ': 2'), + short_description = S('Baobab Fruit'), + drawtype = 'plantlike', + paramtype2 = 'wallmounted', + visual_scale = 1.69, + tiles = { 'everness_baobab_tree_fruit.png^[transformFY' }, + inventory_image = 'everness_baobab_tree_fruit.png^[transformFY', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + waving = 1, + on_use = minetest.item_eat(2), + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 1, 0.25 } + }, + groups = { + -- MTG + dig_immediate = 3, + -- X Farming + compost = 65, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 65, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), +}) + +Everness:register_node('everness:baobab_sapling', { + description = S('Baobab Sapling'), + short_description = S('Baobab Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_baobab_tree_sapling.png' }, + inventory_image = 'everness_baobab_tree_sapling.png', + wield_image = 'everness_baobab_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:baobab_sapling', + minp_relative = { x = -12, y = 1, z = -12 }, + maxp_relative = { x = 12, y = 39, z = 12 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:willow_leaves', { + description = S('Willow Tree Leaves'), + short_description = S('Willow Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_willow_leaves.png' }, + special_tiles = { 'everness_willow_leaves.png^[transformFX' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:willow_tree_sapling' }, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:willow_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:coral_leaves', { + description = S('Coral Tree Leaves'), + short_description = S('Coral Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_coral_leaves.png' }, + special_tiles = { 'everness_coral_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- Everness + falling_leaves = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:coral_tree_sapling' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:coral_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:dry_branches', { + description = S('Dry Tree Branches'), + short_description = S('Dry Tree Branches'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_dry_branches.png' }, + special_tiles = { 'everness_dry_branches.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- Everness + falling_leaves = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:dry_tree_sapling' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:dry_branches' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:crystal_leaves', { + description = S('Crystal Tree Leaves'), + short_description = S('Crystal Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_crystal_leaves.png' }, + special_tiles = { 'everness_crystal_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- Everness + falling_leaves = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:crystal_tree_sapling' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:crystal_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 2, + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:coral_tree_sapling', { + description = S('Coral Tree Sapling'), + short_description = S('Coral Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_coral_tree_sapling.png' }, + inventory_image = 'everness_coral_tree_sapling.png', + wield_image = 'everness_coral_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:coral_tree_sapling', + minp_relative = { x = -3, y = 1, z = -3 }, + maxp_relative = { x = 3, y = 6, z = 3 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:coral_tree_bioluminescent_sapling', { + description = S('Coral Tree Bioluminescent Sapling'), + short_description = S('Coral Tree Bioluminescent Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_coral_tree_bioluminescent_sapling.png' }, + inventory_image = 'everness_coral_tree_bioluminescent_sapling.png', + wield_image = 'everness_coral_tree_bioluminescent_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:coral_tree_bioluminescent_sapling', + minp_relative = { x = -7, y = 1, z = -7 }, + maxp_relative = { x = 7, y = 17, z = 7 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:dry_tree_sapling', { + description = S('Dry Tree Sapling'), + short_description = S('Dry Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_dry_tree_sapling.png' }, + inventory_image = 'everness_dry_tree_sapling.png', + wield_image = 'everness_dry_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:dry_tree_sapling', + minp_relative = { x = -3, y = 1, z = -3 }, + maxp_relative = { x = 3, y = 8, z = 3 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:cursed_dream_tree_sapling', { + description = S('Cursed Dream Tree Sapling'), + short_description = S('Cursed Dream Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_cursed_dream_tree_sapling.png' }, + inventory_image = 'everness_cursed_dream_tree_sapling.png', + wield_image = 'everness_cursed_dream_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:cursed_dream_tree_sapling', + minp_relative = { x = -8, y = 1, z = -8 }, + maxp_relative = { x = 8, y = 15, z = 8 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:willow_tree_sapling', { + description = S('Willow Tree Sapling'), + short_description = S('Willow Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_willow_tree_sapling.png' }, + inventory_image = 'everness_willow_tree_sapling.png', + wield_image = 'everness_willow_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:willow_tree_sapling', + minp_relative = { x = -19, y = 1, z = -19 }, + maxp_relative = { x = 19, y = 28, z = 19 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:sequoia_tree_sapling', { + description = S('Sequoia Tree Sapling'), + short_description = S('Sequoia Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_sequoia_tree_sapling.png' }, + inventory_image = 'everness_sequoia_tree_sapling.png', + wield_image = 'everness_sequoia_tree_sapling.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 24, + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:sequoia_tree_sapling', + minp_relative = { x = -12, y = 1, z = -12 }, + maxp_relative = { x = 12, y = 75, z = 12 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:crystal_tree_sapling', { + description = S('Crystal Tree Sapling'), + short_description = S('Crystal Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_tree_sapling.png' }, + inventory_image = 'everness_crystal_tree_sapling.png', + wield_image = 'everness_crystal_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 2, + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:crystal_tree_sapling', + minp_relative = { x = -6, y = 1, z = -6 }, + maxp_relative = { x = 6, y = 14, z = 6 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:crystal_tree_large_sapling', { + description = S('Crystal Tree Large Sapling'), + short_description = S('Crystal Tree Large Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_tree_large_sapling.png' }, + inventory_image = 'everness_crystal_tree_large_sapling.png', + wield_image = 'everness_crystal_tree_large_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:crystal_tree_large_sapling', + minp_relative = { x = -10, y = 1, z = -10 }, + maxp_relative = { x = 10, y = 14, z = 10 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- Crystal Bush + +Everness:register_node('everness:crystal_bush_stem', { + description = S('Crystal Bush Stem'), + drawtype = 'plantlike', + visual_scale = 1.41, + tiles = { 'everness_crystal_bush_stem.png' }, + inventory_image = 'everness_crystal_bush_stem.png', + wield_image = 'everness_crystal_bush_stem.png', + paramtype = 'light', + sunlight_propagates = true, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_bush_leaves', { + description = S('Crystal Bush Leaves'), + drawtype = 'allfaces_optional', + tiles = { 'everness_crystal_bush_leaves.png' }, + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { items = { 'everness:crystal_bush_sapling' }, rarity = 5 }, + { items = { 'everness:crystal_bush_leaves' } } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 2, + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:crystal_bush_sapling', { + description = S('Crystal Bush Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_bush_sapling.png' }, + inventory_image = 'everness_crystal_bush_sapling.png', + wield_image = 'everness_crystal_bush_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 2, + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:crystal_bush_sapling', + minp_relative = { x = -1, y = 0, z = -1 }, + maxp_relative = { x = 1, y = 1, z = 1 }, + interval = 2, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- Cursed Bush + +Everness:register_node('everness:cursed_bush_stem', { + description = S('Cursed Bush Stem'), + drawtype = 'plantlike', + visual_scale = 1.21, + tiles = { 'everness_cursed_bush_stem.png' }, + inventory_image = 'everness_cursed_bush_stem.png', + wield_image = 'everness_cursed_bush_stem.png', + paramtype = 'light', + sunlight_propagates = true, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16 }, + }, +}) + +Everness:register_node('everness:cursed_bush_leaves', { + description = S('Cursed Bush Leaves'), + drawtype = 'allfaces_optional', + tiles = { 'everness_cursed_bush_leaves.png' }, + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { items = { 'everness:cursed_bush_sapling' }, rarity = 5 }, + { items = { 'everness:cursed_bush_leaves' } } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:cursed_bush_sapling', { + description = S('Cursed Bush Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_cursed_bush_sapling.png' }, + inventory_image = 'everness_cursed_bush_sapling.png', + wield_image = 'everness_cursed_bush_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:cursed_bush_sapling', + minp_relative = { x = -1, y = 0, z = -1 }, + maxp_relative = { x = 1, y = 1, z = 1 }, + interval = 2, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- +-- Plantlife (non-cubic) +-- + +Everness:register_node('everness:flowers_1', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + bamboo_grass = 1, + flower = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:flowers_' .. math.random(1, 4)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:flowers_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:flowers_2', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:flowers_3', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + } + } +}) + +Everness:register_node('everness:flowers_4', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { 0, -0.375, -0.5, 0.5, -0.375, -0.0625 }, -- 1 big flower top (B) + { 0.1875, -0.5, -0.3125, 0.25, -0.375, -0.25 }, -- stem B + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +-- Magenta Flowers + +Everness:register_node('everness:flowers_magenta_1', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:flowers_magenta_' .. math.random(1, 4)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:flowers_magenta_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:flowers_magenta_2', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_magenta_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:flowers_magenta_3', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_magenta_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + } + } +}) + +Everness:register_node('everness:flowers_magenta_4', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_magenta_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { 0, -0.375, -0.5, 0.5, -0.375, -0.0625 }, -- 1 big flower top (B) + { 0.1875, -0.5, -0.3125, 0.25, -0.375, -0.25 }, -- stem B + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:coral_burdock_1', { + description = S('Coral Burdock'), + short_description = S('Coral Burdock'), + drawtype = 'plantlike', + waving = 1, + visual_scale = 1.69, + tiles = { 'everness_coral_burdock_1.png' }, + inventory_image = 'everness_coral_burdock_1.png', + wield_image = 'everness_coral_burdock_1.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16 }, + }, + on_place = function(itemstack, placer, pointed_thing) + -- place a random burdock node + local stack = ItemStack('everness:coral_burdock_' .. math.random(1, 2)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:coral_burdock_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:coral_burdock_2', { + description = S('Coral Burdock'), + short_description = S('Coral Burdock'), + drawtype = 'plantlike', + waving = 1, + visual_scale = 1.69, + tiles = { 'everness_coral_burdock_2.png' }, + inventory_image = 'everness_coral_burdock_2.png', + wield_image = 'everness_coral_burdock_2.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16 }, + }, + drop = 'everness:coral_burdock_1', +}) + +Everness:register_node('everness:coral_bush', { + description = S('Coral Bush'), + short_description = S('Coral Bush'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_bush.png' }, + inventory_image = 'everness_coral_bush.png', + wield_image = 'everness_coral_bush.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 0, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + } +}) + +Everness:register_node('everness:coral_shrub', { + description = S('Coral Shrub'), + short_description = S('Coral Shrub'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_shrub.png' }, + inventory_image = 'everness_coral_shrub.png', + wield_image = 'everness_coral_shrub.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:coral_grass_orange', { + description = S('Orange Coral Grass'), + short_description = S('Orange Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_orange.png' }, + inventory_image = 'everness_coral_grass_orange.png', + wield_image = 'everness_coral_grass_orange.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 6 +}) + +Everness:register_node('everness:globulagus', { + description = S('Globulagus'), + short_description = S('Globulagus'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_globulagus.png' }, + inventory_image = 'everness_coral_grass_globulagus.png', + wield_image = 'everness_coral_grass_globulagus.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 7 +}) + +Everness:register_node('everness:coral_grass_tall', { + description = S('Tall Coral Grass'), + short_description = S('Tall Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_tall.png' }, + inventory_image = 'everness_coral_grass_tall.png', + wield_image = 'everness_coral_grass_tall.png', + visual_scale = 1.69, + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 7 +}) + +Everness:register_node('everness:crystal_purple', { + description = S('Purple Crystal'), + short_description = S('Purple Crystal'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_crystal_purple.png' }, + inventory_image = 'everness_crystal_purple.png', + wield_image = 'everness_crystal_purple.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + groups = { + -- MTG + cracky = 3, + crystal_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- glass = 1, + -- building_block = 1, + material_glass = 1, + -- ALL + flora = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_crystal_defaults(), + light_source = 7, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_orange', { + description = S('Orange Crystal'), + short_description = S('Orange Crystal'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_crystal_orange.png' }, + inventory_image = 'everness_crystal_orange.png', + wield_image = 'everness_crystal_orange.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + groups = { + -- MTG + cracky = 3, + crystal_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- glass = 1, + -- building_block = 1, + material_glass = 1, + -- ALL + flora = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_crystal_defaults(), + light_source = 7, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_cyan', { + description = S('Cyan Crystal'), + short_description = S('Cyan Crystal'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_crystal_cyan.png' }, + inventory_image = 'everness_crystal_cyan.png', + wield_image = 'everness_crystal_cyan.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + groups = { + -- MTG + cracky = 3, + crystal_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- glass = 1, + -- building_block = 1, + material_glass = 1, + -- ALL + flora = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_crystal_defaults(), + light_source = 12, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:coral_plant_bioluminescent', { + description = S('Coral Plant Bioluminescent'), + short_description = S('Coral Plant Bioluminescent'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_plant_bioluminescent.png' }, + inventory_image = 'everness_coral_plant_bioluminescent.png', + wield_image = 'everness_coral_plant_bioluminescent.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:blooming_cooksonia', { + description = S('Blooming Cooksonia'), + short_description = S('Blooming Cooksonia'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_blooming_cooksonia.png' }, + inventory_image = 'everness_blooming_cooksonia.png', + wield_image = 'everness_blooming_cooksonia.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + frosted_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:creeping_moss_spores', { + description = S('Creeping Moss Spores'), + short_description = S('Creeping Moss Spores'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_creeping_moss_spores.png' }, + inventory_image = 'everness_creeping_moss_spores.png', + wield_image = 'everness_creeping_moss_spores.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 26, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + frosted_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:frosted_icicle', { + description = S('Frosted Icicle'), + short_description = S('Frosted Icicle'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_frosted_icicle.png' }, + inventory_image = 'everness_frosted_icicle.png', + wield_image = 'everness_frosted_icicle.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + oddly_breakable_by_hand = 3, + -- MCL + handy = 1, + deco_block = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_ice_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:frosted_icicle_floor', { + description = S('Frosted Icicle Floor'), + short_description = S('Frosted Icicle Floor'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_frosted_icicle.png^[transformFY' }, + inventory_image = 'everness_frosted_icicle.png^[transformFY', + wield_image = 'everness_frosted_icicle.png^[transformFY', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 24, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + snappy = 3, + frosted_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- ALL + attached_node = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_ice_defaults(), + light_source = 9, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1, 0.5 }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1, 0.5 }, + }, +}) + +Everness:register_node('everness:coral_grass_1', { + description = S('Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_coral_grass_3.png', + wield_image = 'everness_coral_grass_3.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 1, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack('everness:coral_grass_' .. math.random(1, 5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:coral_grass_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + Everness:register_node('everness:coral_grass_' .. i, { + description = S('Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_' .. i .. '.png' }, + inventory_image = 'everness_coral_grass_' .. i .. '.png', + wield_image = 'everness_coral_grass_' .. i .. '.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:coral_grass_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + }) +end + +Everness:register_node('everness:dry_grass_1', { + description = S('Baobab Savanna Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_dry_grass_1.png' }, + inventory_image = 'everness_dry_grass_3.png', + wield_image = 'everness_dry_grass_3.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + everness_dry_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + on_place = function(itemstack, placer, pointed_thing) + -- place a random dry grass node + local stack = ItemStack('everness:dry_grass_' .. math.random(1, 4)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:dry_grass_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 4 do + Everness:register_node('everness:dry_grass_' .. i, { + description = S('Baobab Savanna Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_dry_grass_' .. i .. '.png' }, + inventory_image = 'everness_dry_grass_' .. i .. '.png', + wield_image = 'everness_dry_grass_' .. i .. '.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + everness_dry_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + not_in_creative_inventory = 1 + }, + drop = 'everness:dry_grass_1', + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16 }, + }, + }) +end + +Everness:register_node('everness:red_castor_1', { + description = S('Red Castor'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_red_castor_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_red_castor_3.png', + wield_image = 'everness_red_castor_3.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 1, + damage_per_second = 1, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack('everness:red_castor_' .. math.random(1, 4)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:red_castor_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 4 do + Everness:register_node('everness:red_castor_' .. i, { + description = S('Red Castor'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_red_castor_' .. i .. '.png' }, + inventory_image = 'everness_red_castor_' .. i .. '.png', + wield_image = 'everness_red_castor_' .. i .. '.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:red_castor_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + damage_per_second = i, + }) +end + +Everness:register_node('everness:crystal_mushrooms', { + description = S('Crystal Mushrooms') .. '\n'.. minetest.colorize(Everness.colors.brown, S('Hunger') .. ': 1'), + tiles = { 'everness_crystal_mushrooms.png' }, + inventory_image = 'everness_crystal_mushrooms.png', + wield_image = 'everness_crystal_mushrooms.png', + drawtype = 'plantlike', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 40, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + mushroom = 1, + food_mushroom = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_use = minetest.item_eat(1), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + light_source = 3, +}) + +Everness:register_node('everness:twisted_crystal_grass', { + description = S('Twisted Crystal Grass'), + short_description = S('Twisted Crystal Grass'), + drawtype = 'plantlike', + tiles = { 'everness_twisted_crystal_grass.png' }, + inventory_image = 'everness_twisted_crystal_grass.png', + wield_image = 'everness_twisted_crystal_grass.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 40, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + crystal_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + waving = 1 +}) + +Everness:register_node('everness:sparkling_crystal_grass', { + description = S('Sparkling Crystal Grass'), + drawtype = 'plantlike', + tiles = { 'everness_sparkling_crystal_grass.png' }, + use_texture_alpha = 'blend', + inventory_image = 'everness_sparkling_crystal_grass.png', + wield_image = 'everness_sparkling_crystal_grass.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_thin_glass_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 1, +}) + +Everness:register_node('everness:crystal_grass_1', { + description = S('Crystal Grass'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_grass_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_crystal_grass_2.png', + wield_image = 'everness_crystal_grass_2.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_thin_glass_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 2, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack('everness:crystal_grass_' .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:crystal_grass_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + Everness:register_node('everness:crystal_grass_' .. i, { + description = S('Crystal Grass'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_grass_' .. i .. '.png' }, + inventory_image = 'everness_crystal_grass_' .. i .. '.png', + wield_image = 'everness_crystal_grass_' .. i .. '.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:crystal_grass_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_thin_glass_defaults(), + light_source = i + 1, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + }) +end + +Everness:register_node('everness:marsh_grass', { + description = S('Marsh Grass'), + drawtype = 'plantlike', + waving = 1, + visual_scale = 1.69, + tiles = { 'everness_marsh_grass.png' }, + inventory_image = 'everness_marsh_grass.png', + wield_image = 'everness_marsh_grass.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + cursed_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16 }, + }, +}) + +-- Forsaken desert plants + +Everness:register_node('everness:forsaken_desert_plant_1', { + description = S('Forsaken Plant'), + short_description = S('Forsaken Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_forsaken_desert_plant_1.png' }, + inventory_image = 'everness_forsaken_desert_plant_1.png', + wield_image = 'everness_forsaken_desert_plant_1.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 11, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:forsaken_desert_plant_2', { + description = S('Forsaken Plant'), + short_description = S('Forsaken Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_forsaken_desert_plant_2.png' }, + inventory_image = 'everness_forsaken_desert_plant_2.png', + wield_image = 'everness_forsaken_desert_plant_2.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:forsaken_desert_plant_3', { + description = S('Forsaken Plant'), + short_description = S('Forsaken Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_forsaken_desert_plant_3.png' }, + inventory_image = 'everness_forsaken_desert_plant_3.png', + wield_image = 'everness_forsaken_desert_plant_3.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:cactus_blue', { + description = S('Blue Cactus'), + tiles = { + 'everness_cactus_blue_top.png', + 'everness_cactus_blue_top.png', + 'everness_cactus_blue_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + paramtype2 = 'facedir', + light_source = 7, + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + damage_per_second = 1, + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.5, 0.25 }, + { -0.25, -0.5, -0.5, -0.25, 0.5, 0.5 }, + { 0.25, -0.5, -0.5, 0.25, 0.5, 0.5 }, + { -0.5, -0.5, -0.25, 0.5, 0.5, -0.25 }, + { -0.5, -0.5, 0.25, 0.5, 0.5, 0.25 }, + { -0.5, 0.5, -0.5, 0.5, 0.5, 0.5 } + }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.19, -0.5, -0.19, 0.19, 0.39, 0.19 }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, 0.3125, 0.5000, 0.3125 }, + }, + }, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:cave_barrel_cactus', { + description = S('Cave Barrel Cactus'), + paramtype = 'light', + light_source = 7, + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + drawtype = 'mesh', + mesh = 'everness_barrel_cactus.obj', + tiles = { 'everness_cave_barrel_cactus_mesh.png' }, + inventory_image = 'everness_cave_barrel_cactus_item.png', + wield_image = 'everness_cave_barrel_cactus_item.png', + is_ground_content = false, + walkable = true, + use_texture_alpha = 'clip', + sounds = Everness.node_sound_wood_defaults() +}) + +Everness:register_node('everness:venus_trap', { + description = S('Venus Trap Plant'), + paramtype = 'light', + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + drawtype = 'mesh', + mesh = 'everness_venus_trap.obj', + tiles = { 'everness_venus_trap_mesh.png' }, + inventory_image = 'everness_venus_trap_item.png', + wield_image = 'everness_venus_trap_item.png', + is_ground_content = false, + walkable = false, + damage_per_second = 2, + use_texture_alpha = 'clip', + sounds = Everness.node_sound_leaves_defaults() +}) + +Everness:register_node('everness:illumi_root', { + description = S('Illumi Root'), + short_description = S('Illumi Root'), + drawtype = 'plantlike', + tiles = { 'everness_illumi_root.png' }, + inventory_image = 'everness_illumi_root.png', + wield_image = 'everness_illumi_root.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + light_source = 7, + visual_scale = 1.69, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_waterlily', { + description = S('Crystal Waterlily'), + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'facedir', + tiles = { + 'everness_crystal_lily_leaf_small.png', + 'everness_crystal_lily_leaf_small.png', + 'everness_crystal_lily_flower_small.png' + }, + inventory_image = 'everness_crystal_lily_flower_small.png', + wield_image = 'everness_crystal_lily_flower_small.png', + use_texture_alpha = 'clip', + liquids_pointable = true, + walkable = true, + buildable_to = true, + floodable = true, + groups = { + -- MTG + snappy = 3, + flower = 1, + flammable = 1, + flora = 1, + -- X Farming + compost = 65, + -- MCL + deco_block = 1, + plant = 1, + compostability = 65, + destroy_by_lava_flow = 1, + dig_immediate = 3, + dig_by_water = 1, + dig_by_piston = 1, + }, + sounds = Everness.node_sound_leaves_defaults(), + node_placement_prediction = '', + node_box = { + type = 'fixed', + fixed = { + { 0, -31 / 64, -0.5, 0, 0.5, 0.5 }, + { -0.5, -31 / 64, 0, 0.5, 0.5, 0 }, + { -0.5, -31 / 64, -0.5, 0.5, -31 / 64, 0.5 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16 } + }, + collision_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16 } + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def and def.liquidtype == 'source' and + minetest.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, { name = 'everness:crystal_waterlily' }) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, 'Node is protected') + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +}) + +-- Forsaken Tundra Plants + +Everness:register_node('everness:cactus_orange', { + description = S('Orange Cactus'), + tiles = { + 'everness_cactus_top.png', + 'everness_cactus_top.png', + 'everness_cactus_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + paramtype2 = 'facedir', + light_source = 4, + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + damage_per_second = 1, + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.5, 0.25 }, + { -0.25, -0.5, -0.5, -0.25, 0.5, 0.5 }, + { 0.25, -0.5, -0.5, 0.25, 0.5, 0.5 }, + { -0.5, -0.5, -0.25, 0.5, 0.5, -0.25 }, + { -0.5, -0.5, 0.25, 0.5, 0.5, 0.25 }, + { -0.5, 0.5, -0.5, 0.5, 0.5, 0.5 } + }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.19, -0.5, -0.19, 0.19, 0.39, 0.19 }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, 0.3125, 0.5000, 0.3125 }, + }, + }, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:agave_leaf_1', { + description = S('Agave Leaf'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_agave_leaf_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_agave_leaf_2.png', + wield_image = 'everness_agave_leaf_2.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 5, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack('everness:agave_leaf_' .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack('everness:agave_leaf_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + Everness:register_node('everness:agave_leaf_' .. i, { + description = S('Agave Leaf'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_agave_leaf_' .. i .. '.png' }, + inventory_image = 'everness_agave_leaf_' .. i .. '.png', + wield_image = 'everness_agave_leaf_' .. i .. '.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:agave_leaf_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 4 + i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + }) +end + +-- Mese Fruit + +Everness:register_node('everness:mese_tree_fruit', { + description = S('Mese Fruit'), + drawtype = 'nodebox', + tiles = { + 'everness_mese_tree_fruit_top.png', + 'everness_mese_tree_fruit_top.png', + 'everness_mese_tree_fruit_side.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_mese_tree_fruit_item.png', + wield_image = 'everness_mese_tree_fruit_item.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + buildable_to = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + leafdecay_drop = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + -- attached_node = 1, + flammable = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + sounds = Everness.node_sound_leaves_defaults(), + node_box = { + type = 'fixed', + fixed = { + -- bottom + { -8 / 16, -7 / 16, -8 / 16, 8 / 16, -7 / 16, 8 / 16 }, + -- body (middle) + { -4 / 16, -8 / 16, -4 / 16, 4 / 16, -1 / 16, 4 / 16 }, + -- top + { -3 / 16, -1 / 16, -3 / 16, 3 / 16, 0, 3 / 16 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + light_source = 14, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.get_meta(pos):set_int('everness_prevent_leafdecay', 1) + end +}) + +Everness:register_node('everness:mese_tree_sapling', { + description = S('Mese Tree Sapling'), + short_description = S('Mese Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_mese_tree_sapling.png' }, + inventory_image = 'everness_mese_tree_sapling.png', + wield_image = 'everness_mese_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:mese_tree_sapling', + minp_relative = { x = -3, y = 1, z = -3 }, + maxp_relative = { x = 3, y = 11, z = 3 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:palm_tree_sapling', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + short_description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_palm_tree_sapling.png' }, + inventory_image = 'everness_palm_tree_sapling.png', + wield_image = 'everness_palm_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos) + Everness.grow_sapling(pos, { 'sand', 'everness_sand' }) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:palm_tree_sapling', + minp_relative = { x = -7, y = 1, z = -7 }, + maxp_relative = { x = 7, y = 13, z = 7 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- Cursed Lands Plants + +Everness:register_node('everness:egg_plant', { + description = S('Egg plant'), + drawtype = 'nodebox', + tiles = { + 'everness_egg_plant_top.png', + 'everness_egg_plant_bottom.png', + 'everness_egg_plant_side.png', + }, + use_texture_alpha = 'clip', + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_egg_plant_item.png', + wield_image = 'everness_egg_plant_item.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5 }, + { -0.25, -0.5, -0.25, 0.25, -0.06250, 0.25 }, + { -0.1875, -0.06250, -0.1875, 0.1875, 0, 0.1875 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 8, + damage_per_second = 1, + move_resistance = 7, +}) + +Everness:register_node('everness:ivis_moss', { + description = S('Ivis Moss'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_ivis_moss.png' }, + inventory_image = 'everness_ivis_moss.png', + wield_image = 'everness_ivis_moss.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 7, + paramtype2 = 'meshoptions', + place_param2 = 3 +}) + +Everness:register_node('everness:ngrass_1', { + description = S('Ngrass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_ngrass_1.png' }, + inventory_image = 'everness_ngrass_1.png', + wield_image = 'everness_ngrass_1.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 5, +}) + +Everness:register_node('everness:ngrass_2', { + description = S('Ngrass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_ngrass_2.png' }, + inventory_image = 'everness_ngrass_2.png', + wield_image = 'everness_ngrass_2.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 6 +}) + +-- Bamboo + +-- small bamboo +Everness:register_node('everness:bamboo_1', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_small_top.png', + 'everness_bamboo_small_top.png^[transformFY', + 'everness_bamboo_small_1.png^[transformFX', + 'everness_bamboo_small_1.png', + 'everness_bamboo_small_1.png', + 'everness_bamboo_small_1.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + -- offset 4, size 2x2 + fixed = { + { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 }, + { -0.1875, -0.5000, -0.5000, -0.1875, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1875, 0.5000, 0.5000, -0.1875 } + }, + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/30 chance + items = { 'everness:bamboo_sprout' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_small = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, -0.06250, 0.5000, -0.06250 }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 } + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_2', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_small_top.png', + 'everness_bamboo_small_top.png^[transformFY', + 'everness_bamboo_small_2.png^[transformFX', + 'everness_bamboo_small_2.png', + 'everness_bamboo_small_2.png', + 'everness_bamboo_small_2.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + -- offset 4, size 2x2 + fixed = { + { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 }, + { -0.1875, -0.5000, -0.5000, -0.1875, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1875, 0.5000, 0.5000, -0.1875 } + }, + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/30 chance + items = { 'everness:bamboo_sprout' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_small = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, -0.06250, 0.5000, -0.06250 }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 } + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +-- large bamboo + +Everness:register_node('everness:bamboo_3', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_large_top.png', + 'everness_bamboo_large_bottom.png^[transformFY', + 'everness_bamboo_large_1.png^[transformFX', + 'everness_bamboo_large_1.png', + 'everness_bamboo_large_1.png', + 'everness_bamboo_large_1.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + -- offset 4, size 4x4 + fixed = { + { -0.2500, -0.5000, -0.2500, 0.000, 0.5000, 0.000 }, + { -0.1250, -0.5000, -0.5000, -0.1250, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1250, 0.5000, 0.5000, -0.1250 } + } + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:bamboo_sprout' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_large = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, 0.06250, 0.5000, 0.06250 }, + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_4', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_large_top.png', + 'everness_bamboo_large_bottom.png^[transformFY', + 'everness_bamboo_large_2.png^[transformFX', + 'everness_bamboo_large_2.png', + 'everness_bamboo_large_2.png', + 'everness_bamboo_large_2.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + -- offset 4, size 4x4 + fixed = { + { -0.2500, -0.5000, -0.2500, 0.000, 0.5000, 0.000 }, + { -0.1250, -0.5000, -0.5000, -0.1250, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1250, 0.5000, 0.5000, -0.1250 } + } + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:bamboo_sprout' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_large = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, 0.06250, 0.5000, 0.06250 }, + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_5', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_large_top.png', + 'everness_bamboo_large_bottom.png^[transformFY', + 'everness_bamboo_large_3.png^[transformFX', + 'everness_bamboo_large_3.png', + 'everness_bamboo_large_3.png', + 'everness_bamboo_large_3.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + -- offset 4, size 4x4 + fixed = { + { -0.2500, -0.5000, -0.2500, 0.000, 0.5000, 0.000 }, + { -0.1250, -0.5000, -0.5000, -0.1250, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1250, 0.5000, 0.5000, -0.1250 } + } + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:bamboo_sprout' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_large = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, 0.06250, 0.5000, 0.06250 }, + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_sprout', { + description = S('Bamboo Sprout'), + tiles = { 'everness_bamboo_sprout.png' }, + inventory_image = 'everness_bamboo_sprout.png', + wield_image = 'everness_bamboo_sprout.png', + drawtype = 'plantlike', + groups = { + -- MTG + seed = 1, + snappy = 3, + flammable = 2, + -- Everness + bamboo = 1, + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + paramtype = 'light', + paramtype2 = 'meshoptions', + walkable = false, + sunlight_propagates = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -5 / 16, 0.5 }, + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + Everness:tick_bamboo_again(pos) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:coconut', { + description = S('Coconut'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_coconut_top.png', + 'everness_coconut_bottom.png^[transformFY', + 'everness_coconut_side.png^[transformFX', + 'everness_coconut_side.png', + 'everness_coconut_side_z.png', + 'everness_coconut_side_z.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.5, 0.25, 0, 0 } + } + }, + selection_box = { + type = 'fixed', + fixed = { + { + -4 / 16 - 1 / 16, + - 8 / 16 - 1 / 16, + -8 / 16 - 1 / 16, + 4 / 16 + 1 / 16, + 0 + 1 / 16, + 0 + 1 / 16 + }, + }, + }, + collision_box = { + type = 'fixed', + fixed = { -4 / 16, - 8 / 16, -8 / 16, 4 / 16, 0, 0 }, + }, + drop = { + max_items = 1, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'everness:coconut_fruit' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + } + }, + }, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_wood_defaults() +}) + +-- Forsaken Tundra Plants + +Everness:register_node('everness:bloodspore_plant', { + description = S('Blood Spoore Plant'), + short_description = S('Blood Spoore Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_bloodspore_plant.png' }, + inventory_image = 'everness_bloodspore_plant.png', + wield_image = 'everness_bloodspore_plant.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:bloodspore_plant_small', { + description = S('Blood Spoore Plant Small'), + short_description = S('Blood Spoore Plant Small'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_bloodspore_plant_small.png' }, + inventory_image = 'everness_bloodspore_plant_small.png', + wield_image = 'everness_bloodspore_plant_small.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:termite_block', { + description = S('Termite Block'), + tiles = { 'everness_termite_block.png' }, + drawtype = 'glasslike', + paramtype = 'light', + move_resistance = 7, + drowning = 2, + walkable = false, + climbable = false, + post_effect_color = { r = 47, g = 28, b = 18, a = 255 }, + damage_per_second = 1, + groups = { + -- MTG + crumbly = 3, + disable_jump = 1, + -- MCL + handy = 1, + shovely = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:bamboo_block', { + description = S('Bamboo Block'), + tiles = { + 'everness_bamboo_block_top.png', + 'everness_bamboo_block_top.png', + 'everness_bamboo_block_side.png' + }, + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:bamboo_dry_block', { + description = S('Bamboo Block'), + tiles = { + 'everness_dry_bamboo_block_top.png', + 'everness_dry_bamboo_block_top.png', + 'everness_dry_bamboo_block_side.png' + }, + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:bamboo_wood', { + description = S('Bamboo Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_dry_bamboo_block_side.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + building_block = 1, + material_wood = 1, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:bamboo_mosaic_wood', { + description = S('Bamboo Mosaic'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_bamboo_mosaic.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:baobab_wood', { + description = S('Baobab Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_baobab_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:sequoia_wood', { + description = S('Sequoia Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_sequoia_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:mese_wood', { + description = S('Mese Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_mese_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +-- +-- Corals +-- + +local function coral_on_place(itemstack, placer, pointed_thing, params) + if pointed_thing.type ~= 'node' or not placer then + return itemstack + end + + local _params = params or {} + local ignore_water = _params.ignore_water or false + local node_under_name = _params.node_under_name or 'everness:coral_skeleton' + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + local node_under = minetest.get_node(pos_under) + local def_under = minetest.registered_nodes[node_under.name] + + if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then + return def_under.on_rightclick(pos_under, node_under, + placer, itemstack, pointed_thing) or itemstack + end + + if node_under.name ~= node_under_name + or (minetest.get_item_group(minetest.get_node(pos_above).name, 'water') == 0 and not ignore_water) + then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + + if minetest.get_modpath('default') or minetest.global_exists('default') then + Everness.log_player_action(placer, + 'tried to place', itemstack:get_name(), + 'at protected position', pos_under) + end + + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + node_under.name = itemstack:get_name() + minetest.set_node(pos_under, { name = node_under.name, param2 = params.param2 or node_under.param2}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack +end + +Everness:register_node('everness:coral_corals', { + description = S('Coral Corals'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_coral_corals.png', tileable_vertical = true } }, + inventory_image = 'everness_coral_corals.png', + wield_image = 'everness_coral_corals.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:coral_jellyfish', { + description = S('Coral Corals'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_coral_jellyfish.png', tileable_vertical = true } }, + inventory_image = 'everness_coral_jellyfish.png', + wield_image = 'everness_coral_jellyfish.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:coral_frosted', { + description = S('Coral Frosted'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_frosted_coral.png', tileable_vertical = true } }, + inventory_image = 'everness_frosted_coral.png', + wield_image = 'everness_frosted_coral.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:coral_starfish', { + description = S('Coral Starfish'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_starfish.png', tileable_vertical = true } }, + inventory_image = 'everness_starfish.png', + wield_image = 'everness_starfish.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:sand_with_spine_kelp', { + description = S('Spine Kelp'), + drawtype = 'plantlike_rooted', + waving = 1, + tiles = { 'everness_cursed_stone.png' }, + special_tiles = { { name = 'everness_spine_kelp.png', tileable_vertical = true } }, + inventory_image = 'everness_spine_kelp.png', + wield_image = 'everness_spine_kelp.png', + paramtype = 'light', + paramtype2 = 'leveled', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -2 / 16, 0.5, -2 / 16, 2 / 16, 3.5, 2 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_sand_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == 'node' and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= 'everness:cursed_stone' then + return itemstack + end + + local height = math.random(4, 6) + local pos_top = { x = pos.x, y = pos.y + height, z = pos.z } + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == 'source' and + minetest.get_item_group(node_top.name, 'water') > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, { name = 'everness:sand_with_spine_kelp', + param2 = height * 16 }) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, 'Node is protected') + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:cursed_stone' }) + end +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_plant_1', { + description = S('Coral Bulbs'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_deep_ocean_coral_plant_1.png', tileable_vertical = true } }, + inventory_image = 'everness_deep_ocean_coral_plant_1.png', + wield_image = 'everness_deep_ocean_coral_plant_1.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:coral_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_plant_2', { + description = S('Coral Tree'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_deep_ocean_coral_plant_2.png', tileable_vertical = true } }, + inventory_image = 'everness_deep_ocean_coral_plant_2.png', + wield_image = 'everness_deep_ocean_coral_plant_2.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:coral_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_plant_3', { + description = S('Coral Palm'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_deep_ocean_coral_plant_3.png', tileable_vertical = true } }, + inventory_image = 'everness_deep_ocean_coral_plant_3.png', + wield_image = 'everness_deep_ocean_coral_plant_3.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:coral_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:coral_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_plant_anemone', { + description = S('Coral Anemone'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_cursed_lands_deep_ocean_coral_anemone.png', tileable_vertical = true } }, + inventory_image = 'everness_cursed_lands_deep_ocean_coral_anemone.png', + wield_image = 'everness_cursed_lands_deep_ocean_coral_anemone.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_lands_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:cursed_lands_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:cursed_lands_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_plant_darkilluma', { + description = S('Coral Darkilluma'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_cursed_lands_deep_ocean_coral_darkilluma.png', tileable_vertical = true } }, + inventory_image = 'everness_cursed_lands_deep_ocean_coral_darkilluma.png', + wield_image = 'everness_cursed_lands_deep_ocean_coral_darkilluma.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_lands_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:cursed_lands_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:cursed_lands_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_plant_demon', { + description = S('Coral Demon'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_cursed_lands_deep_ocean_coral_demon.png', tileable_vertical = true } }, + inventory_image = 'everness_cursed_lands_deep_ocean_coral_demon.png', + wield_image = 'everness_cursed_lands_deep_ocean_coral_demon.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_lands_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:cursed_lands_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:cursed_lands_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_plant_1', { + description = S('Crystal Forest Deep Ocean Coral Plant Cyan'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_crystal_forest_deep_ocean_coral_plant_1.png', tileable_vertical = true } }, + inventory_image = 'everness_crystal_forest_deep_ocean_coral_plant_1.png', + wield_image = 'everness_crystal_forest_deep_ocean_coral_plant_1.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:crystal_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:crystal_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:crystal_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_plant_2', { + description = S('Crystal Forest Deep Ocean Coral Plant Orange'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_crystal_forest_deep_ocean_coral_plant_2.png', tileable_vertical = true } }, + inventory_image = 'everness_crystal_forest_deep_ocean_coral_plant_2.png', + wield_image = 'everness_crystal_forest_deep_ocean_coral_plant_2.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:crystal_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:crystal_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:crystal_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_plant_3', { + description = S('Crystal Forest Deep Ocean Coral Plant Pink'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_crystal_forest_deep_ocean_coral_plant_3.png', tileable_vertical = true } }, + inventory_image = 'everness_crystal_forest_deep_ocean_coral_plant_3.png', + wield_image = 'everness_crystal_forest_deep_ocean_coral_plant_3.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:crystal_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:crystal_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:crystal_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_coral_dark', { + description = S('Crystal Coral Dark'), + tiles = { 'everness_crystal_coral_dark_block.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_coral_light', { + description = S('Crystal Coral Light'), + tiles = { 'everness_crystal_coral_light_block.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_1', { + description = S('Coral Forest Deep Ocean Coral Pink'), + tiles = { 'everness_deep_ocean_coral_1.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_2', { + description = S('Coral Forest Deep Ocean Coral Cyan'), + tiles = { 'everness_deep_ocean_coral_2.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_3', { + description = S('Coral Forest Deep Ocean Coral Green'), + tiles = { 'everness_deep_ocean_coral_3.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_4', { + description = S('Coral Forest Deep Ocean Coral Red'), + tiles = { 'everness_deep_ocean_coral_4.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_alcyonacea', { + description = S('Coral Alcyonacea'), + tiles = { 'everness_cursed_lands_deep_ocean_coral_alcyonacea.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_cursed_lands_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_ostracod', { + description = S('Coral Ostracod'), + tiles = { 'everness_cursed_lands_deep_ocean_coral_ostracod.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_cursed_lands_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_octocurse', { + description = S('Coral Octocurse'), + tiles = { 'everness_cursed_lands_deep_ocean_coral_octocurse.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_cursed_lands_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_1', { + description = S('Crystal Forest Deep Ocean Coral Green'), + tiles = { 'everness_crystal_forest_deep_ocean_coral_1.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_crystal_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_2', { + description = S('Crystal Forest Deep Ocean Coral Orange'), + tiles = { 'everness_crystal_forest_deep_ocean_coral_2.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_crystal_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_3', { + description = S('Crystal Forest Deep Ocean Coral Cyan'), + tiles = { 'everness_crystal_forest_deep_ocean_coral_3.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_crystal_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_skeleton', { + description = S('Coral Skeleton'), + tiles = { 'everness_coral_skeleton.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_water_weed_1', { + description = S('Mineral Water Weed'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1' }, + special_tiles = { { name = 'everness_mineral_water_weed_1.png', tileable_vertical = true } }, + inventory_image = 'everness_mineral_water_weed_1.png', + wield_image = 'everness_mineral_water_weed_1.png', + paramtype2 = 'wallmounted', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1 + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -1 / 2 + 1 / 16, 0.5, -1 / 2 + 1 / 16, 1 / 2 - 1 / 16, 1, 1 / 2 - 1 / 16 } + }, + }, + node_dig_prediction = 'everness:mineral_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + local fdir = placer and minetest.dir_to_wallmounted(placer:get_look_dir()) or 0 + + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:mineral_stone', + param2 = fdir + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:mineral_stone' }) + end, +}) + +Everness:register_node('everness:mineral_water_weed_2', { + description = S('Mineral Water Weed'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1' }, + special_tiles = { { name = 'everness_mineral_water_weed_2.png', tileable_vertical = true } }, + inventory_image = 'everness_mineral_water_weed_2.png', + wield_image = 'everness_mineral_water_weed_2.png', + paramtype2 = 'wallmounted', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1 + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -1 / 2 + 1 / 16, 0.5, -1 / 2 + 1 / 16, 1 / 2 - 1 / 16, 1, 1 / 2 - 1 / 16 } + }, + }, + node_dig_prediction = 'everness:mineral_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + local fdir = placer and minetest.dir_to_wallmounted(placer:get_look_dir()) or 0 + + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:mineral_stone', + param2 = fdir + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:mineral_stone' }) + end, +}) + +Everness:register_node('everness:mineral_water_weed_3', { + description = S('Mineral Water Weed'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 7, + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1' }, + special_tiles = { { name = 'everness_mineral_water_weed_3.png', tileable_vertical = true } }, + inventory_image = 'everness_mineral_water_weed_3.png', + wield_image = 'everness_mineral_water_weed_3.png', + paramtype2 = 'wallmounted', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1 + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -1 / 2 + 1 / 16, 0.5, -1 / 2 + 1 / 16, 1 / 2 - 1 / 16, 1, 1 / 2 - 1 / 16 } + }, + }, + node_dig_prediction = 'everness:mineral_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + local fdir = placer and minetest.dir_to_wallmounted(placer:get_look_dir()) or 0 + + coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:mineral_stone', + param2 = fdir + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, { name = 'everness:mineral_stone' }) + end, +}) + +-- +-- Meshes +-- + +-- Skull with candle + +Everness:register_node('everness:skull_with_candle', { + description = S('Skull with Candle'), + short_description = S('Skull with Candle'), + drawtype = 'mesh', + mesh = 'everness_skull_with_candle.obj', + tiles = { + { + name = 'everness_candle_flame_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 8, + aspect_h = 8, + length = 2 + }, + backface_culling = false + }, + }, + inventory_image = 'everness_scull_with_candle_inventory.png', + wield_image = 'everness_scull_with_candle_inventory.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -1 / 2 + 3 / 16, -1 / 2, -1 / 2 + 3 / 16, 1 / 2 - 3 / 16, 1 / 2, 1 / 2 - 3 / 16 } + }, + collision_box = { + type = 'fixed', + fixed = { -1 / 2 + 3 / 16, -1 / 2, -1 / 2 + 3 / 16, 1 / 2 - 3 / 16, 0.1, 1 / 2 - 3 / 16 } + }, + groups = { + -- MTG + choppy = 2, + dig_immediate = 3, + torch = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + attached_node = 1 + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + sunlight_propagates = true, + light_source = 12, + liquids_pointable = false, + use_texture_alpha = 'clip', +}) + +-- Forsythia Bush + +Everness:register_node('everness:forsythia_bush', { + description = S('Forsythia Bush'), + short_description = S('Forsythia Bush'), + drawtype = 'mesh', + mesh = 'everness_forsythia_mesh.obj', + tiles = { 'everness_forsythia_mesh.png' }, + inventory_image = 'everness_forsythia_item.png', + wield_image = 'everness_forsythia_item.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', +}) + +-- Rose Bush + +Everness:register_node('everness:rose_bush', { + description = S('Rose Bush'), + short_description = S('Rose Bush'), + drawtype = 'mesh', + mesh = 'everness_forsythia_mesh.obj', + tiles = { 'everness_rose_bush_mesh.png' }, + inventory_image = 'everness_rose_bush_item.png', + wield_image = 'everness_rose_bush_item.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', +}) + +-- Glowing Pillar + +Everness:register_node('everness:glowing_pillar', { + description = S('Glowing Pillar'), + short_description = S('Glowing Pillar'), + drawtype = 'mesh', + mesh = 'everness_glowing_pillar.obj', + tiles = { + 'everness_glowing_pillar_roots.png', + 'everness_glowing_pillar_luminophor.png', + 'everness_glowing_pillar_leaves.png', + }, + inventory_image = 'everness_glowing_pillar_item.png', + wield_image = 'everness_glowing_pillar_item.png', + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +-- Blue Vine Lantern + +Everness:register_node('everness:blue_vine_lantern', { + description = S('Blue Vine Lantern'), + short_description = S('Blue Vine Lantern'), + drawtype = 'mesh', + mesh = 'everness_glowing_pillar.obj', + tiles = { + 'everness_blue_vine_lantern_roots.png', + 'everness_blue_vine_lantern.png', + 'everness_blue_vine_lantern_leaves.png', + }, + inventory_image = 'everness_blue_vine_lantern_item.png', + wield_image = 'everness_blue_vine_lantern_item.png', + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass_under = 1, + lantern = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +-- Amaranita Lantern + +Everness:register_node('everness:amaranita_lantern', { + description = S('Amaranita Lantern'), + short_description = S('Amaranita Lantern'), + drawtype = 'mesh', + mesh = 'everness_glowing_pillar.obj', + tiles = { + 'everness_amaranita_lantern_roots.png', + 'everness_amaranita_lantern_light.png', + 'everness_amaranita_lantern_fur.png', + }, + inventory_image = 'everness_amaranita_lantern_item.png', + wield_image = 'everness_amaranita_lantern_item.png', + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + frosted_grass_under = 1, + lantern = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +Everness:register_node('everness:lumecorn', { + description = S('Lumecorn'), + short_description = S('Lumecorn'), + drawtype = 'mesh', + mesh = 'everness_lumecorn.obj', + tiles = { + { + name = 'everness_lumecorn_root.png', + backface_culling = false + }, + { + name = 'everness_lumecorn_leaf.png', + backface_culling = false + }, + { + name = 'everness_lumecorn_light.png', + backface_culling = false + }, + }, + inventory_image = 'everness_lumecorn_item.png', + wield_image = 'everness_lumecorn_item.png', + paramtype = 'light', + waving = 1, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + lantern = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +-- +-- Tools / 'Advanced' crafting / Non-'natural' +-- + +Everness:register_node('everness:glass', { + description = S('Everness Glass'), + drawtype = 'glasslike_framed_optional', + tiles = { 'everness_glass.png', 'everness_glass_detail.png' }, + use_texture_alpha = 'clip', -- only needed for stairs API + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + glass = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), +}) + +Everness:register_node('everness:tinted_glass_red', { + description = S('Tinted Glass Red'), + drawtype = 'glasslike_framed_optional', + tiles = { 'everness_tinted_glass_base.png^[colorize:#3A0907:122', 'everness_tinted_glass_detail.png^[colorize:#3A0907:122' }, + use_texture_alpha = 'blend', -- 'clip' needed for stairs API + -- paramtype = 'light', + is_ground_content = false, + sunlight_propagates = false, + sounds = Everness.node_sound_glass_defaults(), + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + glass = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, +}) + +Everness:register_lbm({ + label = 'Grows bamboo', + name = 'everness:bamboo', + nodenames = { 'group:bamboo' }, + run_at_every_load = false, + action = function(pos, node) + Everness:tick_bamboo_again(pos) + end, +}) + +Everness:register_lbm({ + label = 'Makes clouds from sulfur stone', + name = 'everness:sulfur_stone', + nodenames = { 'everness:sulfur_stone' }, + run_at_every_load = true, + action = function(pos, node) + Everness:tick_sulfur_stone(pos) + end, +}) + +Everness:register_node('everness:pyrite_lantern', { + description = S('Pyrite Lantern'), + drawtype = 'glasslike', + tiles = { 'everness_pyrite_lantern.png' }, + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), + light_source = 12, +}) + +Everness:register_node('everness:pyrite_glass', { + description = S('Pyrite Glass'), + drawtype = 'glasslike_framed_optional', + tiles = { 'everness_pyrite_glass.png' }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + glass = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), +}) + +Everness:register_node('everness:lumabus_vine_lantern', { + description = S('Lumabus Vine Lantern'), + drawtype = 'mesh', + mesh = 'everness_lumabus.obj', + tiles = { + 'everness_lumabus_bulb_purple.png', + { + name = 'everness_lumabus_leaves.png', + backface_culling = false + } + }, + use_texture_alpha = 'clip', + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), + light_source = 7, + paramtype2 = 'wallmounted', + selection_box = { + type = 'fixed', + fixed = { -1 / 2 + 3 / 16, -1 / 2, -1 / 2 + 3 / 16, 1 / 2 - 3 / 16, 1 / 2 - 6 / 16, 1 / 2 - 3 / 16 } + }, +}) + +Everness:register_node('everness:eye_vine_lantern', { + description = S('Eye Vine Lantern'), + paramtype = 'light', + tiles = { + 'everness_eye_vine_end_top.png', + 'everness_eye_vine_end_bottom.png', + 'everness_eye_vine_end_side.png', + }, + drawtype = 'normal', + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7, + paramtype2 = 'facedir', + on_place = minetest.rotate_node, +}) + +Everness:register_node('everness:cursed_pumpkin_lantern', { + description = S('Cursed Pumpkin Lantern'), + short_description = S('Cursed Pumpkin Lantern'), + tiles = { + 'everness_cursed_pumpkin_top.png', + 'everness_cursed_pumpkin_bottom.png', + 'everness_cursed_pumpkin_side.png', + 'everness_cursed_pumpkin_side.png', + 'everness_cursed_pumpkin_side.png', + 'everness_cursed_pumpkin_front.png' + }, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = Everness.node_sound_wood_defaults(), + is_ground_content = false, + light_source = 12, + groups = { + -- MTG + snappy = 3, + lantern = 1, + fall_damage_add_percent = -30, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1, + -- ALL + flammable = 4, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, +}) + +Everness:register_node('everness:floating_crystal', { + description = S('Floating Crystal'), + drawtype = 'plantlike', + tiles = { + { + name = 'everness_floating_crystal_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3 + }, + } + }, + waving = 3, + paramtype = 'light', + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = { + -- MTG + snappy = 3, + not_in_creative_inventory = 1, + -- MLC + handy = 1, + building_block = 1, + material_glass = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.25, -0.25, 0.25, 0.25, 0.25 }, + }, + drop = '', + sounds = Everness.node_sound_thin_glass_defaults(), + on_rotate = function() + return false + end, + light_source = 12, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + + if meta:get_int('activated') == 1 then + return itemstack + end + + meta:set_int('activated', 1) + + minetest.sound_play( + 'everness_thin_glass_footstep', + { + gain = 0.7, + max_hear_distance = 16, + pos = pos + }, + true + ) + + -- Initial values + local position = vector.new(pos.x, pos.y, pos.z) + local position_prev = vector.new(pos.x, pos.y, pos.z) + + -- For 'number' of crystals do.. + for i = 1, math.random(2, 6), 1 do + -- Only air positions + local positions = minetest.find_nodes_in_area( + { x = position.x - 3, y = position.y - 1, z = position.z - 3 }, + { x = position.x + 3, y = position.y + 1, z = position.z + 3 }, + { 'air' } + ) + + if #positions == 0 then + -- No positions available/found + break + end + + -- Get light for `positions` + local positions_with_light = {} + + for k, v in ipairs(positions) do + table.insert(positions_with_light, { + pos = v, + light = minetest.get_node_light(v) + }) + end + + table.shuffle(positions_with_light) + + -- Sort with the lowest light first + table.sort(positions_with_light, function(a, b) + return a.light < b.light + end) + + local temp_pos + + -- Find next position + for j, v in ipairs(positions_with_light) do + temp_pos = v.pos + local blocking_sight = false + local ray = minetest.raycast(position_prev, temp_pos, false, false) + + for pt in ray do + if pt.type == 'node' then + local node_under = minetest.get_node(pt.under) + local node_def = minetest.registered_nodes[node_under.name] + + if node_def then + if node_def.walkable then + blocking_sight = node_def.walkable + break + end + end + end + end + + if vector.distance(position_prev, temp_pos) > 1 + and not vector.equals(position_prev, temp_pos) + and not blocking_sight + then + break + else + temp_pos = nil + end + end + + if not temp_pos then + -- No suitable next position found + break + end + + position_prev = position + position = temp_pos + + minetest.after(i - 1, function(v_position, v_position_prev) + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + minetest.add_particlespawner({ + amount = 50, + time = 1, + size = { + min = 0.5, + max = 1, + }, + exptime = 2, + pos = v_position_prev, + texture = { + name = 'everness_particle.png^[colorize:#FFEE83:255', + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + } + }, + radius = { min = 0.2, max = 0.4 }, + attract = { + kind = 'point', + strength = 1, + origin = v_position, + }, + glow = 12 + }) + end + + minetest.after(1, function(v_position2, v_position_prev2) + minetest.set_node(v_position2, { name = 'everness:floating_crystal' }) + minetest.get_node_timer(v_position2):start(math.random(85, 95)) + end, v_position, v_position_prev) + end, position, position_prev) + end + + return itemstack + end +}) + +Everness:register_node('everness:coral_forest_deep_ocean_lantern', { + description = S('Coral Forest Deep Ocean Lantern'), + tiles = { + { name = 'everness_coral_forest_deep_ocean_lantern_top.png' }, + { name = 'everness_coral_forest_deep_ocean_lantern_bottom.png' }, + { + name = 'everness_coral_forest_deep_ocean_lantern_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 2, + }, + }, + }, + sunlight_propagates = true, + is_ground_content = false, + sounds = Everness.node_sound_glass_defaults(), + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + paramtype = 'light', + light_source = 14, +}) + +-- +-- Liquids +-- + +Everness:register_node('everness:mineral_water_source', { + description = S('Mineral Water Source'), + drawtype = 'liquid', + waving = 3, + tiles = { + { + name = 'everness_mineral_water_source_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + { + name = 'everness_mineral_water_source_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + use_texture_alpha = 'blend', + paramtype = 'light', + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'source', + liquid_alternative_flowing = 'everness:mineral_water_flowing', + liquid_alternative_source = 'everness:mineral_water_source', + liquid_viscosity = 1, + post_effect_color = { a = 103, r = 15, g = 212, b = 203 }, + groups = { + water = 3, + liquid = 3, + cools_lava = 1 + }, + liquid_renewable = false, + liquid_range = 2, + sounds = Everness.node_sound_water_defaults(), +}) + +Everness:register_node('everness:mineral_water_flowing', { + description = S('Flowing Mineral Water'), + drawtype = 'flowingliquid', + tiles = {'everness_mineral_water.png'}, + special_tiles = { + { + name = 'everness_mineral_water_flowing_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = 'everness_mineral_water_flowing_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'flowingliquid', + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'flowing', + liquid_alternative_flowing = 'everness:mineral_water_flowing', + liquid_alternative_source = 'everness:mineral_water_source', + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = { a = 103, r = 15, g = 212, b = 203 }, + groups = { + water = 3, + liquid = 3, + not_in_creative_inventory = 1, + cools_lava = 1 + }, + sounds = Everness.node_sound_water_defaults(), +}) + +if minetest.get_modpath("default") then + minetest.register_alias("everness:lava_source","default:lava_source") + minetest.register_alias("everness:lava_flowing","default:lava_flowing") +else + minetest.register_node('everness:lava_source', { + description = S('Lava Source'), + drawtype = 'liquid', + tiles = { + { + name = 'everness_lava_source_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6, + }, + align_style = 'world', + scale = 2 + }, + { + name = 'everness_lava_source_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6, + }, + align_style = 'world', + scale = 2 + }, + }, + paramtype = 'light', + light_source = 13, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'source', + liquid_alternative_flowing = 'everness:lava_flowing', + liquid_alternative_source = 'everness:lava_source', + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = { a = 191, r = 255, g = 64, b = 0 }, + groups = { + lava = 3, + liquid = 2, + igniter = 1 + }, + liquid_range = 2, + }) + + minetest.register_node('everness:lava_flowing', { + description = S('Flowing Lava'), + drawtype = 'flowingliquid', + tiles = { + { + name = 'everness_lava_flowing_animated.png', + align_style = 'world', + scale = 2 + } + }, + special_tiles = { + { + name = 'everness_lava_flowing_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + align_style = 'world', + scale = 2 + }, + { + name = 'everness_lava_flowing_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + align_style = 'world', + scale = 2 + }, + }, + paramtype = 'light', + paramtype2 = 'flowingliquid', + light_source = 13, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'flowing', + liquid_alternative_flowing = 'everness:lava_flowing', + liquid_alternative_source = 'everness:lava_source', + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = { a = 191, r = 255, g = 64, b = 0 }, + groups = { + lava = 3, + liquid = 2, + igniter = 1, + not_in_creative_inventory = 1 + }, + liquid_range = 2, + }) +end + +Everness:register_node('everness:water_geyser', { + description = S('Water') .. ' ' .. S('Geyser'), + drawtype = 'mesh', + mesh = 'everness_water_geyser.obj', + tiles = { + 'everness_mineral_stone.png^[multiply:#E0D3DC:127' + }, + paramtype = 'light', + wield_image = 'everness_water_geyser_item.png', + inventory_image = 'everness_water_geyser_item.png', + stack_max = 1, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + walkable = false, + climbable = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:water_geyser_active', { + description = S('Water') .. ' ' .. S('Geyser') .. ' ' .. S('Active'), + drawtype = 'mesh', + mesh = 'everness_water_geyser.obj', + tiles = { + 'everness_mineral_stone.png^[colorize:#E0D3DC:127' + }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + -- ALL + not_in_creative_inventory = 1 + }, + drop = 'everness:water_geyser', + walkable = false, + climbable = false, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + move_resistance = 2, + damage_per_second = 1, + sounds = Everness.node_sound_stone_defaults(), + on_timer = function(pos, elapsed) + local n = minetest.get_node(pos) + + if n and n.name == 'everness:water_geyser_active' then + minetest.swap_node(pos, { name = 'everness:water_geyser' }) + end + + return false + end, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local particle_id = meta:get_int('particle_id') + + if particle_id > 0 then + minetest.delete_particlespawner(particle_id) + meta:set_int('particle_id', 0) + end + end +}) + +for i, v in ipairs({ 'blank', 'flowers', 'lines', 'tribal' }) do + Everness:register_node('everness:ceramic_pot_' .. v, { + description = S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) .. '. ' .. S('If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.'), + short_description = S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v), + drawtype = 'mesh', + mesh = 'everness_ceramic_pot.obj', + tiles = { 'everness_ceramic_pot_' .. v .. '_mesh.png' }, + is_ground_content = false, + paramtype = 'light', + sunlight_propagates = true, + use_texture_alpha = 'clip', + paramtype2 = '4dir', + stack_max = 1, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + oddly_breakable_by_hand = 3 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ceramic_defaults(), + drop = { + max_items = 1, + items = { + { + tool_groups = { 'archeological_drop' }, + items = { + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_' .. v, + } + }, + { + items = { 'everness:ceramic_pot_' .. v } + } + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + meta:set_string('infotext', S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v)) + meta:set_string('owner', '') + inv:set_size('main', 1) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + + meta:set_string('owner', placer:get_player_name() or '') + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local p_name = clicker:get_player_name() + + if minetest.is_protected(pos, p_name) then + return itemstack + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = { + S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) + } + + if meta:get_string('owner') ~= '' then + label_copy[#label_copy + 1] = ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')' + end + + label_copy[#label_copy + 1] = '\n' .. inv_stack:get_description() + + label_copy = table.concat(label_copy, '') + + minetest.show_formspec(p_name, 'everness:ceramic_pot_' .. v, Everness.get_pot_formspec(pos, label_copy, 'everness_ceramic_pot_' .. v .. '_mesh.png')) + + minetest.sound_play('everness_ceramic_hit', { gain = 1.0, pos = pos, max_hear_distance = 10 }, true) + end, + on_blast = function(pos, intensity) + if minetest.is_protected(pos, '') then + return + end + + local drops = {} + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + + for j = 1, inv:get_size('main') do + local stack = inv:get_stack('main', j) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end + + drops[#drops + 1] = 'everness:ceramic_pot_' .. v + minetest.remove_node(pos) + return drops + end, + on_destruct = function(pos) + local inv = minetest.get_meta(pos):get_inventory() + + for j = 1, inv:get_size('main') do + local stack = inv:get_stack('main', j) + + if stack:get_count() > 0 then + local obj = minetest.add_item(pos, stack) + + if obj then + obj:get_luaentity().collect = true + obj:set_acceleration({ x = 0, y = -10, z = 0 }) + obj:set_velocity({ + x = 0, + y = 5, + z = 0 + }) + end + end + end + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = { + S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) + } + + if meta:get_string('owner') ~= '' then + label_copy[#label_copy + 1] = ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')' + end + + label_copy[#label_copy + 1] = '\n' .. inv_stack:get_description() + + label_copy = table.concat(label_copy, '') + + minetest.show_formspec(player:get_player_name(), 'everness:ceramic_pot_' .. v, Everness.get_pot_formspec(pos, label_copy, 'everness_ceramic_pot_' .. v .. '_mesh.png')) + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = { + S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) + } + + if meta:get_string('owner') ~= '' then + label_copy[#label_copy + 1] = ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')' + end + + label_copy[#label_copy + 1] = '\n' .. inv_stack:get_description() + + label_copy = table.concat(label_copy, '') + + minetest.show_formspec(player:get_player_name(), 'everness:ceramic_pot_' .. v, Everness.get_pot_formspec(pos, label_copy, 'everness_ceramic_pot_' .. v .. '_mesh.png')) + end + }) + + Everness:register_craftitem('everness:ceramic_pot_sherd_' .. v, { + description = S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) .. ' ' .. S('Sherd'), + inventory_image = 'everness_ceramic_pot_' .. v .. '_sherd.png', + }) + + if v ~= 'blank' then + -- recipes for 'blank' are in `crafting.lua` + minetest.register_craft({ + output = 'everness:ceramic_pot_' .. v, + recipe = { + { '', 'everness:ceramic_pot_sherd_blank', ''}, + { 'everness:ceramic_pot_sherd_blank', 'everness:ceramic_pot_sherd_' .. v, 'everness:ceramic_pot_sherd_blank'}, + { '', 'everness:ceramic_pot_sherd_blank', ''}, + } + }) + + minetest.register_craft({ + output = 'everness:ceramic_pot_' .. v, + type = 'shapeless', + recipe = { 'everness:ceramic_pot_blank', 'everness:ceramic_pot_sherd_' .. v } + }) + end +end + +local fence_collision_extra = minetest.settings:get_bool('enable_fence_tall') and 3/8 or 0 + +Everness:register_node('everness:sand_castle_wall', { + description = S('Sand') .. ' ' .. S('Castle') .. ' ' .. S('Wall'), + drawtype = 'nodebox', + node_box = { + type = 'connected', + fixed = { + -- Main pillar + { -0.2500, -0.5000, -0.2500, 0.2500, 0.3750, 0.2500 }, + -- Main pillar tops + { -0.2500, 0.3750, -0.2500, -0.1875, 0.4375, 0.2500 }, + { 0.1875, 0.3750, -0.2500, 0.2500, 0.4375, 0.2500 }, + { -0.1875, 0.3750, -0.2500, 0.1875, 0.4375, -0.1875 }, + { -0.1875, 0.3750, 0.1875, 0.1875, 0.4375, 0.2500 }, + { -0.2500, 0.4375, 0.1875, -0.1875, 0.5000, 0.2500 }, + { -0.1250, 0.4375, 0.1875, -0.06250, 0.5000, 0.2500 }, + { 0.06250, 0.4375, 0.1875, 0.1250, 0.5000, 0.2500 }, + { 0.1875, 0.4375, 0.1875, 0.2500, 0.5000, 0.2500 }, + { 0.1875, 0.4375, -0.2500, 0.2500, 0.5000, -0.1875 }, + { 0.1875, 0.4375, -0.1250, 0.2500, 0.5000, -0.06250 }, + { 0.1875, 0.4375, 0.06250, 0.2500, 0.5000, 0.1250 }, + { -0.2500, 0.4375, -0.2500, -0.1875, 0.5000, -0.1875 }, + { -0.2500, 0.4375, -0.1250, -0.1875, 0.5000, -0.06250 }, + { -0.2500, 0.4375, 0.06250, -0.1875, 0.5000, 0.1250 }, + { -0.1250, 0.4375, -0.2500, -0.06250, 0.5000, -0.1875 }, + { 0.06250, 0.4375, -0.2500, 0.1250, 0.5000, -0.1875 }, + }, + connect_front = { + -- Connected side + { -0.1875, -0.5000, -0.5000, 0.1875, 0.3125, -0.2500 }, + -- Connected side tops + { -0.1875, 0.3750, -0.5000, -0.1250, 0.4375, -0.4375 }, + { -0.1875, 0.3750, -0.3750, -0.1250, 0.4375, -0.3125 }, + { -0.1875, 0.3125, -0.5000, -0.1250, 0.3750, -0.2500 }, + { 0.1250, 0.3750, -0.3750, 0.1875, 0.4375, -0.3125 }, + { 0.1250, 0.3750, -0.5000, 0.1875, 0.4375, -0.4375 }, + { 0.1250, 0.3125, -0.5000, 0.1875, 0.3750, -0.2500 }, + }, + + connect_back = { + -- Connected side + { -0.1875, -0.5000, 0.2500, 0.1875, 0.3125, 0.5000 }, + -- Connected side tops + { -0.1875, 0.3750, 0.4375, -0.1250, 0.4375, 0.5000 }, + { -0.1875, 0.3750, 0.3125, -0.1250, 0.4375, 0.3750 }, + { -0.1875, 0.3125, 0.2500, -0.1250, 0.3750, 0.5000 }, + { 0.1250, 0.3750, 0.3125, 0.1875, 0.4375, 0.3750 }, + { 0.1250, 0.3750, 0.4375, 0.1875, 0.4375, 0.5000 }, + { 0.1250, 0.3125, 0.2500, 0.1875, 0.3750, 0.5000 }, + }, + + connect_left = { + -- Connected side + { -0.2500, 0.3125, 0.1875, -0.5000, -0.5000, -0.1875 }, + -- Connected side tops + { -0.4375, 0.4375, -0.1250, -0.5000, 0.3750, -0.1875 }, + { -0.3125, 0.4375, -0.1250, -0.3750, 0.3750, -0.1875 }, + { -0.2500, 0.3750, -0.1250, -0.5000, 0.3125, -0.1875 }, + { -0.3125, 0.4375, 0.1875, -0.3750, 0.3750, 0.1250 }, + { -0.4375, 0.4375, 0.1875, -0.5000, 0.3750, 0.1250 }, + { -0.2500, 0.3750, 0.1875, -0.5000, 0.3125, 0.1250 }, + }, + connect_right = { + -- Connected side + { 0.2500, -0.5000, -0.1875, 0.5000, 0.3125, 0.1875 }, + -- Connected side tops + { 0.4375, 0.3750, 0.1250, 0.5000, 0.4375, 0.1875 }, + { 0.3125, 0.3750, 0.1250, 0.3750, 0.4375, 0.1875 }, + { 0.2500, 0.3125, 0.1250, 0.5000, 0.3750, 0.1875 }, + { 0.3125, 0.3750, -0.1875, 0.3750, 0.4375, -0.1250 }, + { 0.4375, 0.3750, -0.1875, 0.5000, 0.4375, -0.1250 }, + { 0.2500, 0.3125, -0.1875, 0.5000, 0.3750, -0.1250 }, + }, + }, + selection_box = { + type = 'connected', + fixed = { -1/4, -1/2, -1/4, 1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_front = { -1/4, -1/2, -1/2, 1/4, 1/2 + fence_collision_extra, -1/4 }, + connect_left = { -1/2, -1/2, -1/4, -1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_back = { -1/4, -1/2, 1/4, 1/4, 1/2 + fence_collision_extra, 1/2 }, + connect_right = { 1/4, -1/2, -1/4, 1/2, 1/2 + fence_collision_extra, 1/4 }, + }, + collision_box = { + type = 'connected', + fixed = { -1/4, -1/2, -1/4, 1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_front = { -1/4, -1/2, -1/2, 1/4, 1/2 + fence_collision_extra, -1/4 }, + connect_left = { -1/2, -1/2, -1/4, -1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_back = { -1/4, -1/2, 1/4, 1/4, 1/2 + fence_collision_extra, 1/2 }, + connect_right = { 1/4, -1/2, -1/4, 1/2, 1/2 + fence_collision_extra, 1/4 }, + }, + connects_to = { + 'group:wall', + 'group:stone', + 'group:fence', + 'group:everness_sandstone' + }, + paramtype = 'light', + is_ground_content = false, + tiles = { 'everness_mineral_sandstone.png' }, + walkable = true, + groups = { + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + deco_block = 1, + }, + -- MCL + _mcl_hardness = 2, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) diff --git a/mods/everness/nodes_farming.lua b/mods/everness/nodes_farming.lua new file mode 100644 index 00000000..027c11d3 --- /dev/null +++ b/mods/everness/nodes_farming.lua @@ -0,0 +1,561 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.override_item('everness:coral_dirt', { + soil = { + base = 'everness:coral_dirt', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +minetest.override_item('everness:dirt_with_coral_grass', { + soil = { + base = 'everness:dirt_with_coral_grass', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +minetest.override_item('everness:dirt_1', { + soil = { + base = 'everness:dirt_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +minetest.override_item('everness:dirt_with_grass_1', { + soil = { + base = 'everness:dirt_with_grass_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +minetest.override_item('everness:dry_dirt', { + soil = { + base = 'everness:dry_dirt', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } +}) + +minetest.override_item('everness:dry_dirt_with_dry_grass', { + soil = { + base = 'everness:dry_dirt_with_dry_grass', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } +}) + +minetest.override_item('everness:dirt_with_grass_extras_1', { + soil = { + base = 'everness:dirt_with_grass_extras_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +minetest.override_item('everness:dirt_with_grass_extras_2', { + soil = { + base = 'everness:dirt_with_grass_extras_2', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +minetest.override_item('everness:crystal_dirt', { + soil = { + base = 'everness:crystal_dirt', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +minetest.override_item('everness:dirt_with_crystal_grass', { + soil = { + base = 'everness:dirt_with_crystal_grass', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +minetest.override_item('everness:crystal_cave_dirt', { + soil = { + base = 'everness:crystal_cave_dirt', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +minetest.override_item('everness:crystal_cave_dirt_with_moss', { + soil = { + base = 'everness:crystal_cave_dirt_with_moss', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +minetest.override_item('everness:cursed_dirt', { + soil = { + base = 'everness:cursed_dirt', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +minetest.override_item('everness:dirt_with_cursed_grass', { + soil = { + base = 'everness:dirt_with_cursed_grass', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +-- normal soil +Everness:register_node('everness:coral_dirt_soil', { + description = S('Coral Dirt Soil'), + tiles = { + 'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#A05F3A80)', + 'everness_coral_dirt.png' + }, + drop = 'everness:coral_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:coral_dirt', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +if minetest.registered_nodes["farming:soil"] then + minetest.register_alias("everness:dirt_1_soil","farming:soil") +else + Everness:register_node('everness:dirt_1_soil', { + description = S('Dirt Soil'), + tiles = { + 'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#51341E80)', + 'everness_dirt.png' + }, + drop = 'everness:dirt_1', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dirt_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } + }) +end + +Everness:register_node('everness:crystal_dirt_soil', { + description = S('Crystal Dirt Soil'), + tiles = { + 'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#75506980)', + 'everness_crystal_dirt.png' + }, + drop = 'everness:crystal_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_dirt', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +Everness:register_node('everness:crystal_cave_dirt_soil', { + description = S('Crystal Cave Dirt Soil'), + tiles = { + 'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#CCB17E80)', + 'everness_crystal_cave_dirt.png' + }, + drop = 'everness:crystal_cave_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_cave_dirt', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +Everness:register_node('everness:cursed_dirt_soil', { + description = S('Cursed Dirt Soil'), + tiles = { + 'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#625B4B80)', + 'everness_cursed_dirt.png' + }, + drop = 'everness:cursed_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:cursed_dirt', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +if minetest.registered_nodes["farming:dry_soil"] then + minetest.register_alias("everness:dry_dirt_soil","farming:dry_soil") +else + Everness:register_node('everness:dry_dirt_soil', { + description = S('Dry Dirt Soil'), + tiles = { + 'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#9F754780)', + 'everness_dry_dirt.png' + }, + drop = 'everness:dry_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dry_dirt', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } + }) +end + +-- wet soil +Everness:register_node('everness:coral_dirt_soil_wet', { + description = S('Coral Dirt Wet Soil'), + tiles = { + 'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#A05F3A80)', + 'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#A05F3A80)', + }, + drop = 'everness:coral_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:coral_dirt', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +if minetest.registered_nodes["farming:soil_wet"] then + minetest.register_alias("everness:dirt_1_soil_wet","farming:soil_wet") +else + Everness:register_node('everness:dirt_1_soil_wet', { + description = S('Coral Dirt Wet Soil'), + tiles = { + 'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#51341E80)', + 'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#51341E80)', + }, + drop = 'everness:dirt_1', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dirt_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } + }) +end + +Everness:register_node('everness:crystal_dirt_soil_wet', { + description = S('Crystal Dirt Wet Soil'), + tiles = { + 'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#75506980)', + 'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#75506980)', + }, + drop = 'everness:crystal_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_dirt', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +Everness:register_node('everness:crystal_cave_dirt_soil_wet', { + description = S('Crystal Cave Dirt Wet Soil'), + tiles = { + 'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#CCB17E80)', + 'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#CCB17E80)', + }, + drop = 'everness:crystal_cave_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_cave_dirt', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +Everness:register_node('everness:cursed_dirt_soil_wet', { + description = S('Cursed Dirt Wet Soil'), + tiles = { + 'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#625B4B80)', + 'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#625B4B80)', + }, + drop = 'everness:cursed_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:cursed_dirt', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +if minetest.registered_nodes["farming:dry_soil_wet"] then + minetest.register_alias("everness:dry_dirt_soil_wet","farming:dry_soil_wet") +else + Everness:register_node('everness:dry_dirt_soil_wet', { + description = S('Cursed Dirt Wet Soil'), + tiles = { + 'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#9F754780)', + 'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#9F754780)', + }, + drop = 'everness:dry_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dry_dirt', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } + }) +end \ No newline at end of file diff --git a/mods/everness/nodes_mineral_waters_under.lua b/mods/everness/nodes_mineral_waters_under.lua new file mode 100644 index 00000000..d1c6b47c --- /dev/null +++ b/mods/everness/nodes_mineral_waters_under.lua @@ -0,0 +1,685 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +Everness:register_node('everness:mineral_cave_stone', { + description = S('Mineral Cave Stone'), + tiles = { + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_cave_cobblestone', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_cave_cobblestone', { + description = S('Mineral Cave Cobblestone'), + is_ground_content = false, + tiles = { + { + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 2, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone', { + description = S('Mineral Lava Stone with lava'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }, + { + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_lava_stone_side.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_lava_stone_dry', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + light_source = 3, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone_dry', { + description = S('Mineral Lava Stone without lava'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone_with_moss', { + description = S('Mineral Lava Stone with moss'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_cave_moss.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_cave_moss.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_cave_moss_side.png', + align_style = 'world', + scale = 2 + }, + }, + drop = 'everness:mineral_lava_stone_dry', + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + light_source = 3, + sounds = Everness.node_sound_grass_defaults(), +}) + +for i = 1, 7 do + local last = i == 7 + + Everness:register_node('everness:volcanic_spike_' .. i, { + description = S('Volcanic Spike') .. ' ' .. i, + tiles = { 'everness_volcanic_rock.png' }, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + move_resistance = last and 7 or 0, + damage_per_second = last and 4 or 0, + drowning = last and 1 or 0, + walkable = not last, + climbable = last, + }) + + Everness:register_node('everness:mineral_cave_stone_spike_' .. i, { + description = S('Mineral Lava Stone Spike') .. ' ' .. i, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + move_resistance = last and 7 or 0, + damage_per_second = last and 4 or 0, + drowning = last and 1 or 0, + walkable = not last, + climbable = last, + }) + + Everness:register_node('everness:mineral_lava_stone_spike_' .. i, { + description = S('Mineral Lava Stone Spike') .. ' ' .. i, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }, + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + light_source = 12, + move_resistance = last and 7 or 0, + damage_per_second = last and 4 or 0, + drowning = last and 1 or 0, + walkable = not last, + climbable = last, + }) +end + +Everness:register_node('everness:lava_tree', { + description = S('Lava Tree Trunk'), + short_description = S('Lava Tree Trunk'), + tiles = { + { name = 'everness_lava_tree_top.png' }, + { name = 'everness_lava_tree_top.png' }, + { + name = 'everness_lava_tree.png', + align_style = 'world', + scale = 2, + }, + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +Everness:register_node('everness:lava_tree_with_lava', { + description = S('Lava Tree Trunk with Lava Veins'), + short_description = S('Lava Tree Trunk with Lava Veins'), + tiles = { + { name = 'everness_lava_tree_top.png' }, + { name = 'everness_lava_tree_top.png' }, + { + name = 'everness_lava_tree_animated.png', + align_style = 'world', + scale = 8, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 8, + }, + }, + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + light_source = 3, +}) + +Everness:register_node('everness:lava_tree_wood', { + description = S('Lava Tree Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + { + name = 'everness_lava_tree_wood.png', + align_style = 'world', + scale = 2 + }, + }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:lava_tree_sapling', { + description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + short_description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_lava_tree_sapling.png' }, + inventory_image = 'everness_lava_tree_sapling.png', + wield_image = 'everness_lava_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:lava_tree_sapling', + minp_relative = { x = -7, y = 1, z = -7 }, + maxp_relative = { x = 7, y = 13, z = 7 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:lava_tree_leaves', { + description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + short_description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + drawtype = 'allfaces_optional', + tiles = { + { + name = 'everness_lava_tree_leaves.png', + align_style = 'world', + scale = 2, + }, + }, + special_tiles = { + { + name = 'everness_lava_tree_leaves.png', + align_style = 'world', + scale = 2, + }, + }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/100 chance + items = { 'everness:lava_tree_sapling' }, + rarity = 100, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:lava_tree_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:mineral_cave_moss_grass', { + description = S('Mineral Cave Moss Grass'), + short_description = S('Mineral Cave Moss Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_mineral_cave_moss_grass.png' }, + inventory_image = 'everness_mineral_cave_moss_grass.png', + wield_image = 'everness_mineral_cave_moss_grass.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + mineral_waters_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 7 +}) diff --git a/mods/everness/panes.lua b/mods/everness/panes.lua new file mode 100644 index 00000000..3ac57235 --- /dev/null +++ b/mods/everness/panes.lua @@ -0,0 +1,105 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +xpanes.register_pane('pyrite_pane', { + description = S('Pyrite Glass Pane'), + textures = { 'everness_pyrite_glass.png', '', 'everness_xpanes_edge_pyrite.png' }, + use_texture_alpha = 'clip', + inventory_image = 'everness_pyrite_glass.png', + wield_image = 'everness_pyrite_glass.png', + sounds = Everness.node_sound_glass_defaults(), + groups = { snappy = 2, cracky = 3, oddly_breakable_by_hand = 3 }, + recipe = { + { 'everness:pyrite_glass', 'everness:pyrite_glass', 'everness:pyrite_glass' }, + { 'everness:pyrite_glass', 'everness:pyrite_glass', 'everness:pyrite_glass' } + } +}) + +xpanes.register_pane('cursed_bar', { + description = S('Cursed Steel Bars'), + textures = {'everness_cursed_bar.png', '', 'everness_cursed_bar_top.png'}, + inventory_image = 'everness_cursed_bar.png', + wield_image = 'everness_cursed_bar.png', + groups = { cracky = 2 }, + sounds = Everness.node_sound_metal_defaults(), + recipe = { + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' }, + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' }, + { 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block' } + } +}) + +-- Register steel bar doors and trapdoors + +if minetest.get_modpath('doors') then + + doors.register('everness:door_cursed_steel_bar', { + tiles = { + { + name = 'everness_door_cursed_steel_bar.png', + backface_culling = true + } + }, + description = S('Cursed Steel Bar Door'), + inventory_image = 'everness_door_cursed_steel_bar_item.png', + protected = true, + groups = { + node = 1, + cracky = 1, + level = 2 + }, + sounds = Everness.node_sound_metal_defaults(), + sound_open = 'xpanes_steel_bar_door_open', + sound_close = 'xpanes_steel_bar_door_close', + gain_open = 0.15, + gain_close = 0.13, + recipe = { + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + }, + }) + + doors.register_trapdoor('everness:trapdoor_cursed_steel_bar', { + description = S('Steel Bar Trapdoor'), + inventory_image = 'everness_trapdoor_cursed_steel_bar.png', + wield_image = 'everness_trapdoor_cursed_steel_bar.png', + tile_front = 'everness_trapdoor_cursed_steel_bar.png', + tile_side = 'everness_trapdoor_cursed_steel_bar_side.png', + protected = true, + groups = { + node = 1, + cracky = 1, + level = 2, + door = 1 + }, + sounds = Everness.node_sound_metal_defaults(), + sound_open = 'xpanes_steel_bar_door_open', + sound_close = 'xpanes_steel_bar_door_close', + gain_open = 0.15, + gain_close = 0.13, + }) + + minetest.register_craft({ + output = 'everness:trapdoor_cursed_steel_bar', + recipe = { + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + } + }) +end diff --git a/mods/everness/privileges.lua b/mods/everness/privileges.lua new file mode 100644 index 00000000..c31edbb0 --- /dev/null +++ b/mods/everness/privileges.lua @@ -0,0 +1,85 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local function update_sfinv(name) + minetest.after(0, function() + local player = minetest.get_player_by_name(name) + + if player then + if sfinv.get_page(player) == 'everness:encyclopedia' then + sfinv.set_page(player, sfinv.get_homepage_name(player)) + else + sfinv.set_player_inventory_formspec(player) + end + end + end) +end + +local function update_ui(name) + minetest.after(0, function() + local player = minetest.get_player_by_name(name) + + if player then + if unified_inventory.current_page[name] == 'everness:encyclopedia' then + unified_inventory.current_page[name] = 'craft' + end + + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[name]) + end + end) +end + +minetest.register_privilege('everness_encyclopedia', { + -- Privilege description + description = 'Collection of registered items and functions with some information about them. Used for testing not for gameplay. Works only with SFINV!', + + -- Whether to grant the privilege to singleplayer. + give_to_singleplayer = false, + + -- Whether to grant the privilege to the server admin. + -- Uses value of 'give_to_singleplayer' by default. + give_to_admin = false, + + -- Called when given to player 'name' by 'granter_name'. + -- 'granter_name' will be nil if the priv was granted by a mod. + on_grant = function(name, granter_name) + if minetest.get_modpath('sfinv') and sfinv.enabled then + update_sfinv(name) + elseif minetest.get_modpath('unified_inventory') then + update_ui(name) + else + minetest.chat_send_player(name, 'Compatible inventory not found. Everness encyclopedia will not be shown.') + end + end, + + -- Called when taken from player 'name' by 'revoker_name'. + -- 'revoker_name' will be nil if the priv was revoked by a mod. + + -- Note that the above two callbacks will be called twice if a player is + -- responsible, once with the player name, and then with a nil player + -- name. + -- Return true in the above callbacks to stop register_on_priv_grant or + -- revoke being called. + on_revoke = function(name, revoker_name) + if minetest.get_modpath('sfinv') and sfinv.enabled then + update_sfinv(name) + elseif minetest.get_modpath('unified_inventory') then + update_ui(name) + else + minetest.chat_send_player(name, 'Compatible inventory not found. Everness encyclopedia will not be shown.') + end + end, +}) diff --git a/mods/everness/schematics/everness_baobab_log.mts b/mods/everness/schematics/everness_baobab_log.mts new file mode 100644 index 00000000..210d852b Binary files /dev/null and b/mods/everness/schematics/everness_baobab_log.mts differ diff --git a/mods/everness/schematics/everness_baobab_tree.mts b/mods/everness/schematics/everness_baobab_tree.mts new file mode 100644 index 00000000..32f881bf Binary files /dev/null and b/mods/everness/schematics/everness_baobab_tree.mts differ diff --git a/mods/everness/schematics/everness_cemetery.mts b/mods/everness/schematics/everness_cemetery.mts new file mode 100644 index 00000000..037b2913 Binary files /dev/null and b/mods/everness/schematics/everness_cemetery.mts differ diff --git a/mods/everness/schematics/everness_coral_bones_tree.mts b/mods/everness/schematics/everness_coral_bones_tree.mts new file mode 100644 index 00000000..7173ebcc Binary files /dev/null and b/mods/everness/schematics/everness_coral_bones_tree.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts new file mode 100644 index 00000000..a51d9fc9 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_green.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_green.mts new file mode 100644 index 00000000..1fa53e9a Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_green.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_pink.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_pink.mts new file mode 100644 index 00000000..833635ac Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_pink.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_red.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_red.mts new file mode 100644 index 00000000..967b949d Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_red.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts new file mode 100644 index 00000000..7f2fee37 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts new file mode 100644 index 00000000..684209ec Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts new file mode 100644 index 00000000..602b3163 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts new file mode 100644 index 00000000..92b0f836 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_house.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_house.mts new file mode 100644 index 00000000..5ad6c9bc Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_house.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_ocean_fishing_dock.mts b/mods/everness/schematics/everness_coral_forest_ocean_fishing_dock.mts new file mode 100644 index 00000000..18025e8f Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_ocean_fishing_dock.mts differ diff --git a/mods/everness/schematics/everness_coral_tree.mts b/mods/everness/schematics/everness_coral_tree.mts new file mode 100644 index 00000000..8af6d279 Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree.mts differ diff --git a/mods/everness/schematics/everness_coral_tree_bioluminescent.mts b/mods/everness/schematics/everness_coral_tree_bioluminescent.mts new file mode 100644 index 00000000..d178c5e6 Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree_bioluminescent.mts differ diff --git a/mods/everness/schematics/everness_coral_tree_bioluminescent_from_sapling.mts b/mods/everness/schematics/everness_coral_tree_bioluminescent_from_sapling.mts new file mode 100644 index 00000000..ddbe5a19 Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree_bioluminescent_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_coral_tree_from_sapling.mts b/mods/everness/schematics/everness_coral_tree_from_sapling.mts new file mode 100644 index 00000000..6d1119ee Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_coral_volcano.mts b/mods/everness/schematics/everness_coral_volcano.mts new file mode 100644 index 00000000..2837bae0 Binary files /dev/null and b/mods/everness/schematics/everness_coral_volcano.mts differ diff --git a/mods/everness/schematics/everness_coral_volcano_x_clay.mts b/mods/everness/schematics/everness_coral_volcano_x_clay.mts new file mode 100644 index 00000000..3680cf8f Binary files /dev/null and b/mods/everness/schematics/everness_coral_volcano_x_clay.mts differ diff --git a/mods/everness/schematics/everness_crystal_bush.mts b/mods/everness/schematics/everness_crystal_bush.mts new file mode 100644 index 00000000..a8def3a5 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_bush.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_1.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_1.mts new file mode 100644 index 00000000..67ae3cc3 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_1.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_2.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_2.mts new file mode 100644 index 00000000..a8491f66 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_2.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_3.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_3.mts new file mode 100644 index 00000000..5b234697 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_3.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_ruins.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_ruins.mts new file mode 100644 index 00000000..12a4f229 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_ruins.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_ocean_shrine.mts b/mods/everness/schematics/everness_crystal_forest_ocean_shrine.mts new file mode 100644 index 00000000..79693d46 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_ocean_shrine.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_ruins_1.mts b/mods/everness/schematics/everness_crystal_forest_ruins_1.mts new file mode 100644 index 00000000..d12481ae Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_ruins_1.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_ruins_2.mts b/mods/everness/schematics/everness_crystal_forest_ruins_2.mts new file mode 100644 index 00000000..d19eeef5 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_ruins_2.mts differ diff --git a/mods/everness/schematics/everness_crystal_orange_cluster.mts b/mods/everness/schematics/everness_crystal_orange_cluster.mts new file mode 100644 index 00000000..1f8c6a62 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_orange_cluster.mts differ diff --git a/mods/everness/schematics/everness_crystal_purple_cluster.mts b/mods/everness/schematics/everness_crystal_purple_cluster.mts new file mode 100644 index 00000000..46614b9a Binary files /dev/null and b/mods/everness/schematics/everness_crystal_purple_cluster.mts differ diff --git a/mods/everness/schematics/everness_crystal_tree.mts b/mods/everness/schematics/everness_crystal_tree.mts new file mode 100644 index 00000000..d9f3887e Binary files /dev/null and b/mods/everness/schematics/everness_crystal_tree.mts differ diff --git a/mods/everness/schematics/everness_crystal_tree_large.mts b/mods/everness/schematics/everness_crystal_tree_large.mts new file mode 100644 index 00000000..3272f5cb Binary files /dev/null and b/mods/everness/schematics/everness_crystal_tree_large.mts differ diff --git a/mods/everness/schematics/everness_cursed_bush.mts b/mods/everness/schematics/everness_cursed_bush.mts new file mode 100644 index 00000000..960208d9 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_bush.mts differ diff --git a/mods/everness/schematics/everness_cursed_cabin.mts b/mods/everness/schematics/everness_cursed_cabin.mts new file mode 100644 index 00000000..cf445ad0 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_cabin.mts differ diff --git a/mods/everness/schematics/everness_cursed_dream_tree.mts b/mods/everness/schematics/everness_cursed_dream_tree.mts new file mode 100644 index 00000000..70673e5c Binary files /dev/null and b/mods/everness/schematics/everness_cursed_dream_tree.mts differ diff --git a/mods/everness/schematics/everness_cursed_dream_tree_from_sapling.mts b/mods/everness/schematics/everness_cursed_dream_tree_from_sapling.mts new file mode 100644 index 00000000..0f142352 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_dream_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_cursed_lands_deep_ocean_island.mts b/mods/everness/schematics/everness_cursed_lands_deep_ocean_island.mts new file mode 100644 index 00000000..de4473c5 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_lands_deep_ocean_island.mts differ diff --git a/mods/everness/schematics/everness_cursed_lands_deep_ocean_skull.mts b/mods/everness/schematics/everness_cursed_lands_deep_ocean_skull.mts new file mode 100644 index 00000000..f7a59a2b Binary files /dev/null and b/mods/everness/schematics/everness_cursed_lands_deep_ocean_skull.mts differ diff --git a/mods/everness/schematics/everness_dry_tree.mts b/mods/everness/schematics/everness_dry_tree.mts new file mode 100644 index 00000000..f7927cd6 Binary files /dev/null and b/mods/everness/schematics/everness_dry_tree.mts differ diff --git a/mods/everness/schematics/everness_dry_tree_from_sapling.mts b/mods/everness/schematics/everness_dry_tree_from_sapling.mts new file mode 100644 index 00000000..b5013801 Binary files /dev/null and b/mods/everness/schematics/everness_dry_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_forsaken_desert_temple.mts b/mods/everness/schematics/everness_forsaken_desert_temple.mts new file mode 100644 index 00000000..86e96132 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_desert_temple.mts differ diff --git a/mods/everness/schematics/everness_forsaken_desert_temple_2.mts b/mods/everness/schematics/everness_forsaken_desert_temple_2.mts new file mode 100644 index 00000000..7243a0e9 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_desert_temple_2.mts differ diff --git a/mods/everness/schematics/everness_forsaken_desert_temple_3.mts b/mods/everness/schematics/everness_forsaken_desert_temple_3.mts new file mode 100644 index 00000000..e6e00a42 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_desert_temple_3.mts differ diff --git a/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts new file mode 100644 index 00000000..ef300fb9 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts differ diff --git a/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts new file mode 100644 index 00000000..5188a62f Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts differ diff --git a/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts new file mode 100644 index 00000000..37d36eed Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts differ diff --git a/mods/everness/schematics/everness_forsaken_tundra_rocks.mts b/mods/everness/schematics/everness_forsaken_tundra_rocks.mts new file mode 100644 index 00000000..9207bfc8 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_tundra_rocks.mts differ diff --git a/mods/everness/schematics/everness_forsythia_on_moss.mts b/mods/everness/schematics/everness_forsythia_on_moss.mts new file mode 100644 index 00000000..8c6b1bad Binary files /dev/null and b/mods/everness/schematics/everness_forsythia_on_moss.mts differ diff --git a/mods/everness/schematics/everness_frosted_icesheet_igloo.mts b/mods/everness/schematics/everness_frosted_icesheet_igloo.mts new file mode 100644 index 00000000..8602a82e Binary files /dev/null and b/mods/everness/schematics/everness_frosted_icesheet_igloo.mts differ diff --git a/mods/everness/schematics/everness_frosted_icicle_large_ceiling.mts b/mods/everness/schematics/everness_frosted_icicle_large_ceiling.mts new file mode 100644 index 00000000..adf6e0ba Binary files /dev/null and b/mods/everness/schematics/everness_frosted_icicle_large_ceiling.mts differ diff --git a/mods/everness/schematics/everness_frosted_icicle_large_floor.mts b/mods/everness/schematics/everness_frosted_icicle_large_floor.mts new file mode 100644 index 00000000..809cb30a Binary files /dev/null and b/mods/everness/schematics/everness_frosted_icicle_large_floor.mts differ diff --git a/mods/everness/schematics/everness_frosted_lands_fossils.mts b/mods/everness/schematics/everness_frosted_lands_fossils.mts new file mode 100644 index 00000000..fda815ff Binary files /dev/null and b/mods/everness/schematics/everness_frosted_lands_fossils.mts differ diff --git a/mods/everness/schematics/everness_frosted_lands_stalagmite.mts b/mods/everness/schematics/everness_frosted_lands_stalagmite.mts new file mode 100644 index 00000000..af701df4 Binary files /dev/null and b/mods/everness/schematics/everness_frosted_lands_stalagmite.mts differ diff --git a/mods/everness/schematics/everness_frosted_lands_volcanic_rock.mts b/mods/everness/schematics/everness_frosted_lands_volcanic_rock.mts new file mode 100644 index 00000000..f178e786 Binary files /dev/null and b/mods/everness/schematics/everness_frosted_lands_volcanic_rock.mts differ diff --git a/mods/everness/schematics/everness_giant_sequoia_tree.mts b/mods/everness/schematics/everness_giant_sequoia_tree.mts new file mode 100644 index 00000000..957c8148 Binary files /dev/null and b/mods/everness/schematics/everness_giant_sequoia_tree.mts differ diff --git a/mods/everness/schematics/everness_giant_sequoia_tree_from_sapling.mts b/mods/everness/schematics/everness_giant_sequoia_tree_from_sapling.mts new file mode 100644 index 00000000..7bdb6174 Binary files /dev/null and b/mods/everness/schematics/everness_giant_sequoia_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_haunted_house.mts b/mods/everness/schematics/everness_haunted_house.mts new file mode 100644 index 00000000..956be9b2 Binary files /dev/null and b/mods/everness/schematics/everness_haunted_house.mts differ diff --git a/mods/everness/schematics/everness_hollow_tree.mts b/mods/everness/schematics/everness_hollow_tree.mts new file mode 100644 index 00000000..cee8c93c Binary files /dev/null and b/mods/everness/schematics/everness_hollow_tree.mts differ diff --git a/mods/everness/schematics/everness_hollow_tree_large.mts b/mods/everness/schematics/everness_hollow_tree_large.mts new file mode 100644 index 00000000..fdf85e2d Binary files /dev/null and b/mods/everness/schematics/everness_hollow_tree_large.mts differ diff --git a/mods/everness/schematics/everness_japanese_shrine.mts b/mods/everness/schematics/everness_japanese_shrine.mts new file mode 100644 index 00000000..b7dee64c Binary files /dev/null and b/mods/everness/schematics/everness_japanese_shrine.mts differ diff --git a/mods/everness/schematics/everness_jungle_temple.mts b/mods/everness/schematics/everness_jungle_temple.mts new file mode 100644 index 00000000..ba2addfb Binary files /dev/null and b/mods/everness/schematics/everness_jungle_temple.mts differ diff --git a/mods/everness/schematics/everness_large_bamboo.mts b/mods/everness/schematics/everness_large_bamboo.mts new file mode 100644 index 00000000..04ee49a1 Binary files /dev/null and b/mods/everness/schematics/everness_large_bamboo.mts differ diff --git a/mods/everness/schematics/everness_lava_tree.mts b/mods/everness/schematics/everness_lava_tree.mts new file mode 100644 index 00000000..c0d18851 Binary files /dev/null and b/mods/everness/schematics/everness_lava_tree.mts differ diff --git a/mods/everness/schematics/everness_marsh_grass.mts b/mods/everness/schematics/everness_marsh_grass.mts new file mode 100644 index 00000000..40544490 Binary files /dev/null and b/mods/everness/schematics/everness_marsh_grass.mts differ diff --git a/mods/everness/schematics/everness_mese_tree.mts b/mods/everness/schematics/everness_mese_tree.mts new file mode 100644 index 00000000..9828b615 Binary files /dev/null and b/mods/everness/schematics/everness_mese_tree.mts differ diff --git a/mods/everness/schematics/everness_mineral_waters_tower.mts b/mods/everness/schematics/everness_mineral_waters_tower.mts new file mode 100644 index 00000000..b7d67e44 Binary files /dev/null and b/mods/everness/schematics/everness_mineral_waters_tower.mts differ diff --git a/mods/everness/schematics/everness_palm_tree.mts b/mods/everness/schematics/everness_palm_tree.mts new file mode 100644 index 00000000..368f718e Binary files /dev/null and b/mods/everness/schematics/everness_palm_tree.mts differ diff --git a/mods/everness/schematics/everness_palm_tree_from_sapling.mts b/mods/everness/schematics/everness_palm_tree_from_sapling.mts new file mode 100644 index 00000000..ad10edba Binary files /dev/null and b/mods/everness/schematics/everness_palm_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_quartz_fountain.mts b/mods/everness/schematics/everness_quartz_fountain.mts new file mode 100644 index 00000000..3e85d65b Binary files /dev/null and b/mods/everness/schematics/everness_quartz_fountain.mts differ diff --git a/mods/everness/schematics/everness_quartz_temple.mts b/mods/everness/schematics/everness_quartz_temple.mts new file mode 100644 index 00000000..d08f47cf Binary files /dev/null and b/mods/everness/schematics/everness_quartz_temple.mts differ diff --git a/mods/everness/schematics/everness_ruins_1.mts b/mods/everness/schematics/everness_ruins_1.mts new file mode 100644 index 00000000..c8703299 Binary files /dev/null and b/mods/everness/schematics/everness_ruins_1.mts differ diff --git a/mods/everness/schematics/everness_small_bamboo.mts b/mods/everness/schematics/everness_small_bamboo.mts new file mode 100644 index 00000000..dea10f2d Binary files /dev/null and b/mods/everness/schematics/everness_small_bamboo.mts differ diff --git a/mods/everness/schematics/everness_sulfur_volcano.mts b/mods/everness/schematics/everness_sulfur_volcano.mts new file mode 100644 index 00000000..ef4e222e Binary files /dev/null and b/mods/everness/schematics/everness_sulfur_volcano.mts differ diff --git a/mods/everness/schematics/everness_termite_nest.mts b/mods/everness/schematics/everness_termite_nest.mts new file mode 100644 index 00000000..68a57489 Binary files /dev/null and b/mods/everness/schematics/everness_termite_nest.mts differ diff --git a/mods/everness/schematics/everness_willow_tree.mts b/mods/everness/schematics/everness_willow_tree.mts new file mode 100644 index 00000000..899e8af9 Binary files /dev/null and b/mods/everness/schematics/everness_willow_tree.mts differ diff --git a/mods/everness/schematics/everness_willow_tree_from_sapling.mts b/mods/everness/schematics/everness_willow_tree_from_sapling.mts new file mode 100644 index 00000000..fecbc5ab Binary files /dev/null and b/mods/everness/schematics/everness_willow_tree_from_sapling.mts differ diff --git a/mods/everness/settingtypes.txt b/mods/everness/settingtypes.txt new file mode 100644 index 00000000..c5cc0206 --- /dev/null +++ b/mods/everness/settingtypes.txt @@ -0,0 +1,397 @@ +[Biomes] + +[*Coral Forest] + +# Enable/ Disable Coral Forest Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest (Coral Forest) bool true + +# Upper limit for biome. +everness_coral_forest_y_max (y max) int 31000 + +# Lower limit for biome. +everness_coral_forest_y_min (y min) int 6 + +[*Coral Forest Dunes] + +# Enable/ Disable Coral Forest Dunes Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_dunes (Coral Forest Dunes) bool true + +# Upper limit for biome. +everness_coral_forest_dunes_y_max (y max) int 5 + +# Lower limit for biome. +everness_coral_forest_dunes_y_min (y min) int 4 + +[*Coral Forest Ocean] + +# Enable/ Disable Coral Forest Ocean Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_ocean (Coral Forest Ocean) bool true + +# Upper limit for biome. +everness_coral_forest_ocean_y_max (y max) int 3 + +# Lower limit for biome. +everness_coral_forest_ocean_y_min (y min) int -10 + +[*Coral Forest Deep Ocean] + +# Enable/ Disable Coral Forest Deep Ocean Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_deep_ocean (Coral Forest Deep Ocean) bool true + +# Upper limit for biome. +everness_coral_forest_deep_ocean_y_max (y max) int -11 + +# Lower limit for biome. +everness_coral_forest_deep_ocean_y_min (y min) int -255 + +[*Coral Forest Under] + +# Enable/ Disable Coral Forest Under Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_under (Coral Forest Under) bool true + +# Upper limit for biome. +everness_coral_forest_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_coral_forest_under_y_min (y min) int -31000 + +[*Frosted Icesheet] + +# Enable/ Disable Frosted Icesheet Biome +# Disabling this biome might result in missing recipes. +everness_frosted_icesheet (Frosted Icesheet) bool true + +# Upper limit for biome. +everness_frosted_icesheet_y_max (y max) int 31000 + +# Lower limit for biome. +everness_frosted_icesheet_y_min (y min) int -8 + +[*Frosted Icesheet Ocean] + +# Enable/ Disable Frosted Icesheet Ocean Biome +# Disabling this biome might result in missing recipes. +everness_frosted_icesheet_ocean (Frosted Icesheet Ocean) bool true + +# Upper limit for biome. +everness_frosted_icesheet_ocean_y_max (y max) int -9 + +# Lower limit for biome. +everness_frosted_icesheet_ocean_y_min (y min) int -255 + +[*Frosted Icesheet Under] + +# Enable/ Disable Frosted Icesheet Under Biome +# Disabling this biome might result in missing recipes. +everness_frosted_icesheet_under (Frosted Icesheet Under) bool true + +# Upper limit for biome. +everness_frosted_icesheet_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_frosted_icesheet_under_y_min (y min) int -31000 + +[*Cursed Lands] + +# Enable/ Disable Cursed Lands Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands (Cursed Lands) bool true + +# Upper limit for biome. +everness_cursed_lands_y_max (y max) int 31000 + +# Lower limit for biome. +everness_cursed_lands_y_min (y min) int 6 + +[*Cursed Lands Dunes] + +# Enable/ Disable Cursed Lands Dunes Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_dunes (Cursed Lands Dunes) bool true + +# Upper limit for biome. +everness_cursed_lands_dunes_y_max (y max) int 5 + +# Lower limit for biome. +everness_cursed_lands_dunes_y_min (y min) int 1 + +[*Cursed Lands Swamp] + +# Enable/ Disable Cursed Lands Swamp Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_swamp (Cursed Lands Swamp) bool true + +# Upper limit for biome. +everness_cursed_lands_swamp_y_max (y max) int 0 + +# Lower limit for biome. +everness_cursed_lands_swamp_y_min (y min) int -1 + +[*Cursed Lands Ocean] + +# Enable/ Disable Cursed Lands Ocean Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_ocean (Cursed Lands Ocean) bool true + +# Upper limit for biome. +everness_cursed_lands_ocean_y_max (y max) int -2 + +# Lower limit for biome. +everness_cursed_lands_ocean_y_min (y min) int -10 + +[*Cursed Lands Deep Ocean] + +# Enable/ Disable Cursed Lands Deep Ocean Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_deep_ocean (Cursed Lands Deep Ocean) bool true + +# Upper limit for biome. +everness_cursed_lands_deep_ocean_y_max (y max) int -11 + +# Lower limit for biome. +everness_cursed_lands_deep_ocean_y_min (y min) int -255 + +[*Cursed Lands Under] + +# Enable/ Disable Cursed Lands Under Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_under (Cursed Lands Under) bool true + +# Upper limit for biome. +everness_cursed_lands_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_cursed_lands_under_y_min (y min) int -31000 + +[*Crystal Forest] + +# Enable/ Disable Crystal Forest Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest (Crystal Forest) bool true + +# Upper limit for biome. +everness_crystal_forest_y_max (y max) int 31000 + +# Lower limit for biome. +everness_crystal_forest_y_min (y min) int 6 + +[*Crystal Forest Dunes] + +# Enable/ Disable Crystal Forest Dunes Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_dunes (Crystal Forest Dunes) bool true + +# Upper limit for biome. +everness_crystal_forest_dunes_y_max (y max) int 5 + +# Lower limit for biome. +everness_crystal_forest_dunes_y_min (y min) int 1 + +[*Crystal Forest Shore] + +# Enable/ Disable Crystal Forest Shore Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_shore (Crystal Forest Shore) bool true + +# Upper limit for biome. +everness_crystal_forest_shore_y_max (y max) int 0 + +# Lower limit for biome. +everness_crystal_forest_shore_y_min (y min) int -1 + +[*Crystal Forest Ocean] + +# Enable/ Disable Crystal Forest Ocean Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_ocean (Crystal Forest Ocean) bool true + +# Upper limit for biome. +everness_crystal_forest_ocean_y_max (y max) int -2 + +# Lower limit for biome. +everness_crystal_forest_ocean_y_min (y min) int -10 + +[*Crystal Forest Deep Ocean] + +# Enable/ Disable Crystal Forest Deep Ocean Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_deep_ocean (Crystal Forest Deep Ocean) bool true + +# Upper limit for biome. +everness_crystal_forest_deep_ocean_y_max (y max) int -11 + +# Lower limit for biome. +everness_crystal_forest_deep_ocean_y_min (y min) int -255 + +[*Crystal Forest Under] + +# Enable/ Disable Crystal Forest Under Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_under (Crystal Forest Under) bool true + +# Upper limit for biome. +everness_crystal_forest_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_crystal_forest_under_y_min (y min) int -31000 + +[*Bamboo Forest] + +# Enable/ Disable Bamboo Forest Biome +# Disabling this biome might result in missing recipes. +everness_bamboo_forest (Bamboo Forest) bool true + +# Upper limit for biome. +everness_bamboo_forest_y_max (y max) int 31000 + +# Lower limit for biome. +everness_bamboo_forest_y_min (y min) int 1 + +[*Bamboo Forest Under] + +# Enable/ Disable Bamboo Forest Under Biome +# Disabling this biome might result in missing recipes. +everness_bamboo_forest_under (Bamboo Forest Under) bool true + +# Upper limit for biome. +everness_bamboo_forest_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_bamboo_forest_under_y_min (y min) int -31000 + +[*Forsaken Desert] + +# Enable/ Disable Forsaken Desert Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_desert (Forsaken Desert) bool true + +# Upper limit for biome. +everness_forsaken_desert_y_max (y max) int 31000 + +# Lower limit for biome. +everness_forsaken_desert_y_min (y min) int 4 + +[*Forsaken Desert Ocean] + +# Enable/ Disable Forsaken Desert Ocean Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_desert_ocean (Forsaken Desert Ocean) bool true + +# Upper limit for biome. +everness_forsaken_desert_ocean_y_max (y max) int 3 + +# Lower limit for biome. +everness_forsaken_desert_ocean_y_min (y min) int -8 + +[*Forsaken Desert Under] + +# Enable/ Disable Forsaken Desert Under Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_desert_under (Forsaken Desert Under) bool true + +# Upper limit for biome. +everness_forsaken_desert_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_forsaken_desert_under_y_min (y min) int -31000 + +[*Baobab Savanna] + +# Enable/ Disable Baobab Savanna Biome +# Disabling this biome might result in missing recipes. +everness_baobab_savanna (Baobab Savanna) bool true + +# Upper limit for biome. +everness_baobab_savanna_y_max (y max) int 31000 + +# Lower limit for biome. +everness_baobab_savanna_y_min (y min) int 1 + +[*Forsaken Tundra] + +# Enable/ Disable Forsaken Tundra Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra (Forsaken Tundra) bool true + +# Upper limit for biome. +everness_forsaken_tundra_y_max (y max) int 31000 + +# Lower limit for biome. +everness_forsaken_tundra_y_min (y min) int 2 + +[*Forsaken Tundra Beach] + +# Enable/ Disable Forsaken Tundra Beach Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra_beach (Forsaken Tundra Beach) bool true + +# Upper limit for biome. +everness_forsaken_tundra_beach_y_max (y max) int 1 + +# Lower limit for biome. +everness_forsaken_tundra_beach_y_min (y min) int -3 + +[*Forsaken Tundra Ocean] + +# Enable/ Disable Forsaken Tundra Ocean Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra_ocean (Forsaken Tundra Ocean) bool true + +# Upper limit for biome. +everness_forsaken_tundra_ocean_y_max (y max) int -4 + +# Lower limit for biome. +everness_forsaken_tundra_ocean_y_min (y min) int -255 + +[*Forsaken Tundra Under] + +# Enable/ Disable Forsaken Tundra Under Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra_under (Forsaken Tundra Under) bool true + +# Upper limit for biome. +everness_forsaken_tundra_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_forsaken_tundra_under_y_min (y min) int -31000 + +[*Mineral Waters] + +# Enable/ Disable Mineral Waters Biome +# Disabling this biome might result in missing recipes. +everness_mineral_waters (Mineral Waters) bool true + +# Upper limit for biome. +everness_mineral_waters_y_max (y max) int 31000 + +# Lower limit for biome. +everness_mineral_waters_y_min (y min) int 1 + +[*Mineral Waters Under] + +# Enable/ Disable Mineral Waters Under Biome +# Disabling this biome might result in missing recipes. +everness_mineral_waters_under (Mineral Waters) bool false + +# Upper limit for biome. +everness_mineral_waters_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_mineral_waters_under_y_min (y min) int -31000 + +[Features] + +# Enable/ Disable Item pick up with sneak key +# [Shift + E + Q] single drop item +everness_feature_sneak_pickup (Sneak Pickup) bool true + +# Enable/ Disable Skybox +# This shows custom sun/moon/sky colors/stars/clouds... +# based on the biome, so each new biome has +# unique feeling and experience. +everness_feature_skybox (Skybox) bool true diff --git a/mods/everness/skybox.lua b/mods/everness/skybox.lua new file mode 100644 index 00000000..6923af28 --- /dev/null +++ b/mods/everness/skybox.lua @@ -0,0 +1,1008 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2022 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local skybox_defs = { + ['everness:cursed_lands'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + scale = 1.57, + texture = 'everness_cursed_lands_sun.png', + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + scale = 1.57, + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_dunes'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_swamp'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:coral_forest'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + sun_parameters = { + texture = 'everness_coral_forest_sun.png', + scale = 1.57, + tonemap = 'everness_coral_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:coral_forest_dunes'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + sun_parameters = { + texture = 'everness_coral_forest_sun.png', + scale = 1.57, + tonemap = 'everness_coral_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:coral_forest_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + sun_parameters = { + texture = 'everness_coral_forest_sun.png', + scale = 1.57, + tonemap = 'everness_coral_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:coral_forest_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + }, + ['everness:bamboo_forest'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#5DD35D', + day_sky = '#61B5F5', + day_horizon = '#BFFFBF', + -- dawn_sky = '#79EF79', + dawn_sky = '#B4BAFA', + dawn_horizon = '#7EF47E', + -- night_sky = '#158B15', + night_sky = '#006BFF', + night_horizon = '#3EB43E', + indoors = '#1E941E', + fog_sun_tint = '#50C650', + fog_moon_tint = '#51C751' + } + }, + sun_parameters = { + texture = 'everness_bamboo_forest_sun.png', + scale = 1.57, + tonemap = 'everness_bamboo_forest_sun_tonemap.png', + sunrise = 'everness_bamboo_forest_sunrisebg.png', + }, + }, + ['everness:bamboo_forest_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#5DD35D', + day_sky = '#61B5F5', + day_horizon = '#BFFFBF', + -- dawn_sky = '#79EF79', + dawn_sky = '#B4BAFA', + dawn_horizon = '#7EF47E', + -- night_sky = '#158B15', + night_sky = '#006BFF', + night_horizon = '#3EB43E', + indoors = '#1E941E', + fog_sun_tint = '#50C650', + fog_moon_tint = '#51C751' + } + }, + }, + ['everness:frosted_icesheet'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#9DA4AA', + day_horizon = '#BDC4CA', + dawn_sky = '#B9C0C6', + dawn_horizon = '#BEC5CB', + night_sky = '#555C62', + night_horizon = '#7E858B', + indoors = '#5E656B', + fog_sun_tint = '#90979D', + fog_moon_tint = '#91989E' + } + }, + sun_parameters = { + texture = 'everness_frosted_icesheet_sun.png', + scale = 1.57, + tonemap = 'everness_frosted_icesheet_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:frosted_icesheet_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#9DA4AA', + day_horizon = '#BDC4CA', + dawn_sky = '#B9C0C6', + dawn_horizon = '#BEC5CB', + night_sky = '#555C62', + night_horizon = '#7E858B', + indoors = '#5E656B', + fog_sun_tint = '#90979D', + fog_moon_tint = '#91989E' + } + }, + sun_parameters = { + texture = 'everness_frosted_icesheet_sun.png', + scale = 1.57, + tonemap = 'everness_frosted_icesheet_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:frosted_icesheet_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#9DA4AA', + day_horizon = '#BDC4CA', + dawn_sky = '#B9C0C6', + dawn_horizon = '#BEC5CB', + night_sky = '#555C62', + night_horizon = '#7E858B', + indoors = '#5E656B', + fog_sun_tint = '#90979D', + fog_moon_tint = '#91989E' + } + }, + }, + ['everness:crystal_forest'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_dunes'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_shore'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + star_parameters = { + count = 6000, + scale = 0.5 + } + }, + ['everness:forsaken_desert'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#D5946E', + day_horizon = '#F5B48E', + dawn_sky = '#F1B08A', + dawn_horizon = '#F6B58F', + night_sky = '#8D4C26', + night_horizon = '#B6754F', + indoors = '#96552F', + fog_sun_tint = '#C88761', + fog_moon_tint = '#C98862' + } + }, + sun_parameters = { + texture = 'everness_forsaken_desert_sun.png', + scale = 3.14, + tonemap = 'everness_forsaken_desert_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_desert_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#D5946E', + day_horizon = '#F5B48E', + dawn_sky = '#F1B08A', + dawn_horizon = '#F6B58F', + night_sky = '#8D4C26', + night_horizon = '#B6754F', + indoors = '#96552F', + fog_sun_tint = '#C88761', + fog_moon_tint = '#C98862' + } + }, + sun_parameters = { + texture = 'everness_forsaken_desert_sun.png', + scale = 3.14, + tonemap = 'everness_forsaken_desert_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_desert_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#D5946E', + day_horizon = '#F5B48E', + dawn_sky = '#F1B08A', + dawn_horizon = '#F6B58F', + night_sky = '#8D4C26', + night_horizon = '#B6754F', + indoors = '#96552F', + fog_sun_tint = '#C88761', + fog_moon_tint = '#C98862' + } + } + }, + ['everness:baobab_savanna'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#C4A156', + day_horizon = '#E4C176', + dawn_sky = '#E0BD72', + dawn_horizon = '#E5C277', + night_sky = '#7C590E', + night_horizon = '#A58237', + indoors = '#856217', + fog_sun_tint = '#B79449', + fog_moon_tint = '#B8954A' + } + }, + sun_parameters = { + texture = 'everness_baobab_savanna_sun.png', + scale = 1.57, + tonemap = '', + sunrise = '' + }, + }, + ['everness:forsaken_tundra'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + }, + sun_parameters = { + texture = 'everness_forsaken_tundra_sun.png', + scale = 1.57, + tonemap = 'everness_forsaken_tundra_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_tundra_beach'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + }, + sun_parameters = { + texture = 'everness_forsaken_tundra_sun.png', + scale = 1.57, + tonemap = 'everness_forsaken_tundra_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_tundra_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + }, + sun_parameters = { + texture = 'everness_forsaken_tundra_sun.png', + scale = 1.57, + tonemap = 'everness_forsaken_tundra_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_tundra_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + } + }, + ['everness:mineral_waters'] = { + sky_parameters = { + -- type = 'regular', + -- sky_color = { + -- day_sky = '#264890', + -- day_horizon = '#3884CF', + -- dawn_sky = '#B4BAFA', + -- dawn_horizon = '#FDA47E', + -- night_sky = '#A3609E', + -- night_horizon = '#C7A8D9', + -- fog_sun_tint = '#FDA47E', + -- fog_moon_tint = '#FAE0EB' + -- }, + type = 'skybox', + base_color = '#8099CC', + _day_base_color = '#8099CC', + _night_base_color = '#000714', + _textures_base = { + -- Y+ (top) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,0', + -- Y- (bottom) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,2', + -- X- (west) + 'everness_mineral_waters_skybox.png^[sheet:4x3:0,1', + -- X+ (east) + 'everness_mineral_waters_skybox.png^[sheet:4x3:2,1', + -- Z+ (north) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,1', + -- Z- (south) + 'everness_mineral_waters_skybox.png^[sheet:4x3:3,1', + }, + textures = { + -- Y+ (top) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,0', + -- Y- (bottom) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,2', + -- X- (west) + 'everness_mineral_waters_skybox.png^[sheet:4x3:0,1', + -- X+ (east) + 'everness_mineral_waters_skybox.png^[sheet:4x3:2,1', + -- Z+ (north) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,1', + -- Z- (south) + 'everness_mineral_waters_skybox.png^[sheet:4x3:3,1', + }, + clouds = false + }, + star_parameters = { + count = 12000, + scale = 0.5 + }, + }, + ['everness:mineral_waters_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#8B1408', + day_horizon = '#b2380a', + dawn_sky = '#8B1408', + dawn_horizon = '#b2380a', + night_sky = '#A3609E', + night_horizon = '#C7A8D9', + fog_sun_tint = '#8B1408', + fog_moon_tint = '#520E49' + } + }, + particlespawner = { + amount = 100, + time = 0, + size = { + min = 1, + max = 2 + }, + node = { name = 'everness:mineral_lava_stone' }, + node_tile = 1, + glow = 100, + pos = { + min = vector.new(-50, -50, -50), + max = vector.new(50, 50, 50) + }, + jitter = { + min = vector.new(-1, -1, -1), + max = vector.new(1, 1, 1) + }, + vel = { + min = vector.new(-1, -1, -1), + max = vector.new(1, 1, 1) + }, + exptime = { + min = 5, + max = 10 + }, + collisiondetection = true, + collision_removal = true + } + }, +} + +local function should_flip(player) + local player_meta = player:get_meta() + local player_time = player_meta:get_int('everness_timeofday') + -- 0 not defined (for player meta) + -- 1 morning + -- 2 afternoon + local current_time = minetest.get_timeofday() < 0.5 and 1 or 2 + local flip = current_time ~= player_time + + player_meta:set_int('everness_timeofday', current_time) + + return { + should_flip = flip, + current_time = current_time + } +end + +local timer = 0 + +minetest.register_globalstep(function(dtime) + timer = timer + dtime + + if timer > 5 then + local players = minetest.get_connected_players() + local tod = minetest.get_timeofday() + local is_day = false + + if tod > 0.2 and tod < 0.805 then + is_day = true + end + + for _, player in ipairs(players) do + if not player then + return + end + + local player_meta = player:get_meta() + local player_pos = player:get_pos() + local biome_data = minetest.get_biome_data(player_pos) + local player_biome_name = player_meta:get_string('everness_biome_name') + local is_underground = player_meta:get_int('everness_is_underground') + local player_is_day = player_meta:get_int('everness_is_day') == 1 + + if not biome_data then + return + end + + local biome_name = minetest.get_biome_name(biome_data.biome) + + if not biome_name then + return + end + + local should_flip_data = should_flip(player) + + -- flip sun/moon when morning/afternoon + if player_biome_name == biome_name and should_flip_data.should_flip then + if skybox_defs[biome_name] then + if skybox_defs[biome_name].sun_parameters then + local sun_params = table.copy(skybox_defs[biome_name].sun_parameters) + + if should_flip_data.current_time == 2 then + sun_params.texture = sun_params.texture .. '^[transformFY' + end + + player:set_sun(sun_params) + end + + -- if skybox_defs[biome_name].moon_parameters then + -- player:set_moon(skybox_defs[biome_name].moon_parameters) + -- else + -- player:set_moon() + -- end + end + end + + -- Change skybox params + if player_biome_name ~= biome_name then + player_meta:set_string('everness_biome_name', biome_name) + player_biome_name = biome_name + + if skybox_defs[biome_name] then + if skybox_defs[biome_name].sun_parameters then + local sun_params = table.copy(skybox_defs[biome_name].sun_parameters) + + -- flip sun when afternoon + if should_flip_data.current_time == 2 then + sun_params.texture = sun_params.texture .. '^[transformFY' + end + + player:set_sun(sun_params) + else + player:set_sun() + end + + if skybox_defs[biome_name].moon_parameters then + player:set_moon(skybox_defs[biome_name].moon_parameters) + else + player:set_moon() + end + + if skybox_defs[biome_name].star_parameters then + player:set_stars(skybox_defs[biome_name].star_parameters) + else + player:set_stars() + end + + if skybox_defs[biome_name].sky_parameters then + player:set_sky(skybox_defs[biome_name].sky_parameters) + else + player:set_sky() + end + + if skybox_defs[biome_name].cloud_parameters then + player:set_clouds(skybox_defs[biome_name].cloud_parameters) + else + player:set_clouds() + end + + if skybox_defs[biome_name].particlespawner then + local pdef = table.copy(skybox_defs[biome_name].particlespawner) + + pdef.attached = player + pdef.playername = player:get_player_name() + + local pid = minetest.add_particlespawner(pdef) + player_meta:set_int('everness_biome_particlespawner_id', pid) + else + local pid = player_meta:get_int('everness_biome_particlespawner_id') + + if pid ~= 0 then + minetest.delete_particlespawner(pid) + player_meta:set_int('everness_biome_particlespawner_id', 0) + end + end + else + player:set_sun() + player:set_moon() + player:set_stars() + player:set_sky() + player:set_clouds() + + local pid = player_meta:get_int('everness_biome_particlespawner_id') + + if pid ~= 0 then + minetest.delete_particlespawner(pid) + player_meta:set_int('everness_biome_particlespawner_id', 0) + end + end + end + + -- change day/night params + if player_biome_name == biome_name and player_is_day ~= is_day then + if skybox_defs[biome_name] then + if skybox_defs[biome_name].sky_parameters then + if skybox_defs[biome_name].sky_parameters.type == 'skybox' then + player_meta:set_int('everness_is_day', is_day and 1 or 0) + + if is_day then + for i, v in ipairs(skybox_defs[biome_name].sky_parameters.textures) do + skybox_defs[biome_name].sky_parameters.base_color = skybox_defs[biome_name].sky_parameters._day_base_color + skybox_defs[biome_name].sky_parameters.textures[i] = skybox_defs[biome_name].sky_parameters._textures_base[i] + end + else + for i, v in ipairs(skybox_defs[biome_name].sky_parameters.textures) do + skybox_defs[biome_name].sky_parameters.base_color = skybox_defs[biome_name].sky_parameters._night_base_color + skybox_defs[biome_name].sky_parameters.textures[i] = skybox_defs[biome_name].sky_parameters._textures_base[i] .. '^[contrast:0:-85' + end + end + + player:set_sky(skybox_defs[biome_name].sky_parameters) + end + end + end + end + + if player_pos.y <= -256 and is_underground == 0 or (is_underground ~= 0 and player_meta:get_string('everness_biome_name') ~= biome_name) then + -- hide sun, moon, stars ... underground + player_meta:set_int('everness_is_underground', 1) + + player:set_sun({ + visible = false, + sunrise_visible = false + }) + + player:set_moon({ + visible = false + }) + + player:set_stars({ + visible = false + }) + + elseif player_pos.y > -256 and is_underground ~= 0 or (is_underground == 0 and player_meta:get_string('everness_biome_name') ~= biome_name) then + -- show sun, moon, stars ... underground + player_meta:set_int('everness_is_underground', 0) + + player:set_sun({ + visible = true + }) + + player:set_moon({ + visible = true + }) + + player:set_stars({ + visible = true, + sunrise_visible = true + }) + end + end + + timer = 0 + end +end) + +minetest.register_on_joinplayer(function(player, last_login) + local player_meta = player:get_meta() + + player_meta:set_string('everness_biome_name', '') + player_meta:set_int('everness_is_underground', 0) + player_meta:set_int('everness_timeofday', 0) + player_meta:set_int('everness_is_day', 1) +end) + +minetest.register_on_leaveplayer(function(player, timed_out) + local player_meta = player:get_meta() + + player_meta:set_int('everness_biome_particlespawner_id', 0) +end) diff --git a/mods/everness/sneak_pickup.lua b/mods/everness/sneak_pickup.lua new file mode 100644 index 00000000..3c2d9d2e --- /dev/null +++ b/mods/everness/sneak_pickup.lua @@ -0,0 +1,163 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local DELAY = 0 +local TIMER = 0 + +local function pick_dropped_items(player) + local pos = player:get_pos() + local inv = player:get_inventory() + + if not inv then + return + end + + local objects = minetest.get_objects_inside_radius(pos, 3) + local objects_to_collect = {} + + -- filter - leave only builtin items + for _, object in ipairs(objects) do + local luaentity = object:get_luaentity() + + if not object:is_player() + and luaentity + and luaentity.name == '__builtin:item' + and luaentity.itemstring ~= '' + then + table.insert(objects_to_collect, object) + end + end + + -- sort with the oldest objects first + table.sort(objects_to_collect, function(a, b) + return b:get_luaentity().age < a:get_luaentity().age + end) + + for _, object in ipairs(objects_to_collect) do + local luaentity = object:get_luaentity() + local itemstack = ItemStack(luaentity.itemstring) + + if not luaentity._being_collected then + -- Invoke global on_item_pickup callbacks. + -- for _, callback in ipairs(minetest.registered_on_item_pickups) do + -- local result = callback(itemstack, player, { type = 'object', ref = object }) + + -- if result then + -- itemstack = ItemStack(result) + -- end + -- end + + local leftover_stack = inv:add_item('main', itemstack) + local stack_count_prev = itemstack:get_count() + local stack_count_leftover = leftover_stack:get_count() + + if leftover_stack and stack_count_prev ~= stack_count_leftover then + -- Collect item / Item fits in the inventory + local pos_obj = object:get_pos() + + if leftover_stack ~= 0 then + minetest.spawn_item(pos_obj, leftover_stack:to_string()) + end + + luaentity._being_collected = true + object:set_acceleration({ x = 0, y = 0, z = 0 }) + object:set_velocity({ x = 0, y = 0, z = 0 }) + luaentity.physical_state = false + luaentity.object:set_properties({ + physical = false, + -- prevent picking up items while they are moving to the player + -- since the items are in the players inventory already this would + -- duplicate the itemstack + selectionbox = { 0, 0, 0, 0, 0, 0 }, + collisionbox = { 0, 0, 0, 0, 0, 0 } + }) + + object:move_to(vector.new( + (pos.x - pos_obj.x) + pos_obj.x, + (pos.y - pos_obj.y) + pos_obj.y + 1.25, + (pos.z - pos_obj.z) + pos_obj.z + )) + + minetest.sound_play('everness_item_drop_pickup', { + pos = pos, + max_hear_distance = 16, + gain = 0.4, + }) + + minetest.after(0.25, function(v_object) + if v_object and v_object:get_luaentity() then + v_object:remove() + end + end, object) + end + end + end +end + +minetest.register_on_joinplayer(function(player) + local player_meta = player:get_meta() + player_meta:set_int('everness_is_sneaking', 0) +end) + +minetest.register_globalstep(function(dtime) + TIMER = TIMER + dtime + + if DELAY > 0 then + DELAY = DELAY - dtime + elseif DELAY < 0 then + DELAY = 0 + end + + if TIMER > 0.5 then + for _, player in ipairs(minetest.get_connected_players()) do + local player_meta = player:get_meta() + local control = player:get_player_control() + local player_hp = player:get_hp() + local is_sneaking = player_meta:get_int('everness_is_sneaking') > 0 + + if control.sneak and (player_hp > 0 or not minetest.settings:get_bool('enable_damage')) then + -- [Shift + E + Q] single drop item + -- Autopickup after DELAY + if control.aux1 then + DELAY = 1.5 + end + + if DELAY == 0 then + pick_dropped_items(player) + end + end + + -- Hide nametag when sneaking + if control.sneak ~= is_sneaking then + if control.sneak and player_hp > 0 then + local nametag_tbl = player:get_nametag_attributes() + nametag_tbl.color.a = 0 + player:set_nametag_attributes(nametag_tbl) + player:set_properties{makes_footstep_sound = false} + else + local nametag_tbl = player:get_nametag_attributes() + nametag_tbl.color.a = 255 + player:set_nametag_attributes(nametag_tbl) + player:set_properties{makes_footstep_sound = true} + end + + player_meta:set_int('everness_is_sneaking', control.sneak and 1 or 0) + end + end + + TIMER = 0 + end +end) diff --git a/mods/everness/sounds/everness_ambience_cave_1.ogg b/mods/everness/sounds/everness_ambience_cave_1.ogg new file mode 100644 index 00000000..f000e4e8 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_2.ogg b/mods/everness/sounds/everness_ambience_cave_2.ogg new file mode 100644 index 00000000..92658542 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_3.ogg b/mods/everness/sounds/everness_ambience_cave_3.ogg new file mode 100644 index 00000000..df946079 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_4.ogg b/mods/everness/sounds/everness_ambience_cave_4.ogg new file mode 100644 index 00000000..5f7cd3b0 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_5.ogg b/mods/everness/sounds/everness_ambience_cave_5.ogg new file mode 100644 index 00000000..dfdf8bd8 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_6.ogg b/mods/everness/sounds/everness_ambience_cave_6.ogg new file mode 100644 index 00000000..286e78b5 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_6.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_7.ogg b/mods/everness/sounds/everness_ambience_cave_7.ogg new file mode 100644 index 00000000..d9852e62 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_7.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_8.ogg b/mods/everness/sounds/everness_ambience_cave_8.ogg new file mode 100644 index 00000000..ef4eaa0d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_8.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_9.ogg b/mods/everness/sounds/everness_ambience_cave_9.ogg new file mode 100644 index 00000000..0b53eca6 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_9.ogg differ diff --git a/mods/everness/sounds/everness_ambience_creepy_cave_1.ogg b/mods/everness/sounds/everness_ambience_creepy_cave_1.ogg new file mode 100644 index 00000000..ae098478 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_creepy_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_1.ogg b/mods/everness/sounds/everness_ambience_ghost_1.ogg new file mode 100644 index 00000000..4de66e78 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_2.ogg b/mods/everness/sounds/everness_ambience_ghost_2.ogg new file mode 100644 index 00000000..e3f65718 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_3.ogg b/mods/everness/sounds/everness_ambience_ghost_3.ogg new file mode 100644 index 00000000..cb055661 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_4.ogg b/mods/everness/sounds/everness_ambience_ghost_4.ogg new file mode 100644 index 00000000..2c37e53e Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_5.ogg b/mods/everness/sounds/everness_ambience_ghost_5.ogg new file mode 100644 index 00000000..39bee108 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_6.ogg b/mods/everness/sounds/everness_ambience_ghost_6.ogg new file mode 100644 index 00000000..13205383 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_6.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_1.ogg b/mods/everness/sounds/everness_ambience_graveyard_1.ogg new file mode 100644 index 00000000..e182d8e9 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_10.ogg b/mods/everness/sounds/everness_ambience_graveyard_10.ogg new file mode 100644 index 00000000..7e61b978 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_10.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_2.ogg b/mods/everness/sounds/everness_ambience_graveyard_2.ogg new file mode 100644 index 00000000..d6a906c7 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_3.ogg b/mods/everness/sounds/everness_ambience_graveyard_3.ogg new file mode 100644 index 00000000..628796fd Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_4.ogg b/mods/everness/sounds/everness_ambience_graveyard_4.ogg new file mode 100644 index 00000000..b866c4d9 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_5.ogg b/mods/everness/sounds/everness_ambience_graveyard_5.ogg new file mode 100644 index 00000000..9233a9a7 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_6.ogg b/mods/everness/sounds/everness_ambience_graveyard_6.ogg new file mode 100644 index 00000000..ad1719c1 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_6.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_7.ogg b/mods/everness/sounds/everness_ambience_graveyard_7.ogg new file mode 100644 index 00000000..91bc0c5c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_7.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_8.ogg b/mods/everness/sounds/everness_ambience_graveyard_8.ogg new file mode 100644 index 00000000..91e57af1 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_8.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_9.ogg b/mods/everness/sounds/everness_ambience_graveyard_9.ogg new file mode 100644 index 00000000..d6360d82 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_9.ogg differ diff --git a/mods/everness/sounds/everness_ambience_hot_stone_1.ogg b/mods/everness/sounds/everness_ambience_hot_stone_1.ogg new file mode 100644 index 00000000..cee19947 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_hot_stone_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_hot_stone_2.ogg b/mods/everness/sounds/everness_ambience_hot_stone_2.ogg new file mode 100644 index 00000000..e5c5e618 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_hot_stone_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ice_cracking_1.ogg b/mods/everness/sounds/everness_ambience_ice_cracking_1.ogg new file mode 100644 index 00000000..523e04b7 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ice_cracking_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ice_cracking_2.ogg b/mods/everness/sounds/everness_ambience_ice_cracking_2.ogg new file mode 100644 index 00000000..f6229802 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ice_cracking_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ice_cracking_3.ogg b/mods/everness/sounds/everness_ambience_ice_cracking_3.ogg new file mode 100644 index 00000000..428dc5ff Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ice_cracking_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_monster_sigh_cave.ogg b/mods/everness/sounds/everness_ambience_monster_sigh_cave.ogg new file mode 100644 index 00000000..684feb1b Binary files /dev/null and b/mods/everness/sounds/everness_ambience_monster_sigh_cave.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_1.ogg b/mods/everness/sounds/everness_ambience_night_crickets_1.ogg new file mode 100644 index 00000000..1cb58a8e Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_2.ogg b/mods/everness/sounds/everness_ambience_night_crickets_2.ogg new file mode 100644 index 00000000..62283fc7 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_3.ogg b/mods/everness/sounds/everness_ambience_night_crickets_3.ogg new file mode 100644 index 00000000..df45c6c9 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_4.ogg b/mods/everness/sounds/everness_ambience_night_crickets_4.ogg new file mode 100644 index 00000000..501d520d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_5.ogg b/mods/everness/sounds/everness_ambience_night_crickets_5.ogg new file mode 100644 index 00000000..ffdaa5ea Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_owl_1.ogg b/mods/everness/sounds/everness_ambience_owl_1.ogg new file mode 100644 index 00000000..529f61a9 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_owl_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_rocks_falling_cave.ogg b/mods/everness/sounds/everness_ambience_rocks_falling_cave.ogg new file mode 100644 index 00000000..d4e57fc8 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_rocks_falling_cave.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_1.ogg b/mods/everness/sounds/everness_ambience_snow_storm_1.ogg new file mode 100644 index 00000000..bf685cc9 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_2.ogg b/mods/everness/sounds/everness_ambience_snow_storm_2.ogg new file mode 100644 index 00000000..12dd47ec Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_3.ogg b/mods/everness/sounds/everness_ambience_snow_storm_3.ogg new file mode 100644 index 00000000..982f8bb7 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_4.ogg b/mods/everness/sounds/everness_ambience_snow_storm_4.ogg new file mode 100644 index 00000000..83cf51ce Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_1.ogg b/mods/everness/sounds/everness_ambience_sulfur_1.ogg new file mode 100644 index 00000000..560ee0a3 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_2.ogg b/mods/everness/sounds/everness_ambience_sulfur_2.ogg new file mode 100644 index 00000000..32f42227 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_3.ogg b/mods/everness/sounds/everness_ambience_sulfur_3.ogg new file mode 100644 index 00000000..d71142f0 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_4.ogg b/mods/everness/sounds/everness_ambience_sulfur_4.ogg new file mode 100644 index 00000000..367a5fb0 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_1.ogg b/mods/everness/sounds/everness_ambience_swamp_1.ogg new file mode 100644 index 00000000..8bc1a80d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_2.ogg b/mods/everness/sounds/everness_ambience_swamp_2.ogg new file mode 100644 index 00000000..592fb2d5 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_3.ogg b/mods/everness/sounds/everness_ambience_swamp_3.ogg new file mode 100644 index 00000000..50636500 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_4.ogg b/mods/everness/sounds/everness_ambience_swamp_4.ogg new file mode 100644 index 00000000..7476d7ca Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_water_drips_cave_1.ogg b/mods/everness/sounds/everness_ambience_water_drips_cave_1.ogg new file mode 100644 index 00000000..d9093497 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_water_drips_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_water_drips_cave_2.ogg b/mods/everness/sounds/everness_ambience_water_drips_cave_2.ogg new file mode 100644 index 00000000..2a38050c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_water_drips_cave_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_1.ogg b/mods/everness/sounds/everness_ambience_wind_cave_1.ogg new file mode 100644 index 00000000..c4fefc3d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_2.ogg b/mods/everness/sounds/everness_ambience_wind_cave_2.ogg new file mode 100644 index 00000000..13966fef Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_3.ogg b/mods/everness/sounds/everness_ambience_wind_cave_3.ogg new file mode 100644 index 00000000..07763056 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_4.ogg b/mods/everness/sounds/everness_ambience_wind_cave_4.ogg new file mode 100644 index 00000000..3a2355d6 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_5.ogg b/mods/everness/sounds/everness_ambience_wind_cave_5.ogg new file mode 100644 index 00000000..353c9474 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_5.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_dug.1.ogg b/mods/everness/sounds/everness_bamboo_dug.1.ogg new file mode 100644 index 00000000..46bc01dd Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.1.ogg b/mods/everness/sounds/everness_bamboo_hit.1.ogg new file mode 100644 index 00000000..19456ca9 Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.2.ogg b/mods/everness/sounds/everness_bamboo_hit.2.ogg new file mode 100644 index 00000000..3491730d Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.3.ogg b/mods/everness/sounds/everness_bamboo_hit.3.ogg new file mode 100644 index 00000000..b552c8ce Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.4.ogg b/mods/everness/sounds/everness_bamboo_hit.4.ogg new file mode 100644 index 00000000..92b868d6 Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.5.ogg b/mods/everness/sounds/everness_bamboo_hit.5.ogg new file mode 100644 index 00000000..6706d153 Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.5.ogg differ diff --git a/mods/everness/sounds/everness_break_thin_glass.1.ogg b/mods/everness/sounds/everness_break_thin_glass.1.ogg new file mode 100644 index 00000000..b1ccc5fa Binary files /dev/null and b/mods/everness/sounds/everness_break_thin_glass.1.ogg differ diff --git a/mods/everness/sounds/everness_break_thin_glass.2.ogg b/mods/everness/sounds/everness_break_thin_glass.2.ogg new file mode 100644 index 00000000..b6cc9e85 Binary files /dev/null and b/mods/everness/sounds/everness_break_thin_glass.2.ogg differ diff --git a/mods/everness/sounds/everness_break_thin_glass.3.ogg b/mods/everness/sounds/everness_break_thin_glass.3.ogg new file mode 100644 index 00000000..ae6a6bfc Binary files /dev/null and b/mods/everness/sounds/everness_break_thin_glass.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_dug.1.ogg b/mods/everness/sounds/everness_ceramic_dug.1.ogg new file mode 100644 index 00000000..bbb4f3c0 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_dug.2.ogg b/mods/everness/sounds/everness_ceramic_dug.2.ogg new file mode 100644 index 00000000..abdf27ba Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_dug.3.ogg b/mods/everness/sounds/everness_ceramic_dug.3.ogg new file mode 100644 index 00000000..6a5c78f3 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.1.ogg b/mods/everness/sounds/everness_ceramic_footstep.1.ogg new file mode 100644 index 00000000..93eb0800 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.2.ogg b/mods/everness/sounds/everness_ceramic_footstep.2.ogg new file mode 100644 index 00000000..be874a93 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.3.ogg b/mods/everness/sounds/everness_ceramic_footstep.3.ogg new file mode 100644 index 00000000..da82c89b Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.4.ogg b/mods/everness/sounds/everness_ceramic_footstep.4.ogg new file mode 100644 index 00000000..6d60785d Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.5.ogg b/mods/everness/sounds/everness_ceramic_footstep.5.ogg new file mode 100644 index 00000000..2e97fbaf Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.6.ogg b/mods/everness/sounds/everness_ceramic_footstep.6.ogg new file mode 100644 index 00000000..21f04f63 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.6.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.1.ogg b/mods/everness/sounds/everness_ceramic_hit.1.ogg new file mode 100644 index 00000000..7e2d85f8 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.2.ogg b/mods/everness/sounds/everness_ceramic_hit.2.ogg new file mode 100644 index 00000000..93423d2f Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.3.ogg b/mods/everness/sounds/everness_ceramic_hit.3.ogg new file mode 100644 index 00000000..41a41d9c Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.4.ogg b/mods/everness/sounds/everness_ceramic_hit.4.ogg new file mode 100644 index 00000000..c1f332fa Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.5.ogg b/mods/everness/sounds/everness_ceramic_hit.5.ogg new file mode 100644 index 00000000..bfafaf4a Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.5.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.6.ogg b/mods/everness/sounds/everness_ceramic_hit.6.ogg new file mode 100644 index 00000000..8a45d51c Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.6.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_place.1.ogg b/mods/everness/sounds/everness_ceramic_place.1.ogg new file mode 100644 index 00000000..644628a2 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_place.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_place.2.ogg b/mods/everness/sounds/everness_ceramic_place.2.ogg new file mode 100644 index 00000000..f5f41e20 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_place.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_place.3.ogg b/mods/everness/sounds/everness_ceramic_place.3.ogg new file mode 100644 index 00000000..8c244472 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_place.3.ogg differ diff --git a/mods/everness/sounds/everness_chest_close.ogg b/mods/everness/sounds/everness_chest_close.ogg new file mode 100644 index 00000000..78471659 Binary files /dev/null and b/mods/everness/sounds/everness_chest_close.ogg differ diff --git a/mods/everness/sounds/everness_chest_open.ogg b/mods/everness/sounds/everness_chest_open.ogg new file mode 100644 index 00000000..bb21a2a9 Binary files /dev/null and b/mods/everness/sounds/everness_chest_open.ogg differ diff --git a/mods/everness/sounds/everness_cool_lava.1.ogg b/mods/everness/sounds/everness_cool_lava.1.ogg new file mode 100644 index 00000000..42506ddf Binary files /dev/null and b/mods/everness/sounds/everness_cool_lava.1.ogg differ diff --git a/mods/everness/sounds/everness_cool_lava.2.ogg b/mods/everness/sounds/everness_cool_lava.2.ogg new file mode 100644 index 00000000..2747ab81 Binary files /dev/null and b/mods/everness/sounds/everness_cool_lava.2.ogg differ diff --git a/mods/everness/sounds/everness_cool_lava.3.ogg b/mods/everness/sounds/everness_cool_lava.3.ogg new file mode 100644 index 00000000..8baeac32 Binary files /dev/null and b/mods/everness/sounds/everness_cool_lava.3.ogg differ diff --git a/mods/everness/sounds/everness_creaky_door_close.ogg b/mods/everness/sounds/everness_creaky_door_close.ogg new file mode 100644 index 00000000..ac3464db Binary files /dev/null and b/mods/everness/sounds/everness_creaky_door_close.ogg differ diff --git a/mods/everness/sounds/everness_creaky_door_open.1.ogg b/mods/everness/sounds/everness_creaky_door_open.1.ogg new file mode 100644 index 00000000..62647136 Binary files /dev/null and b/mods/everness/sounds/everness_creaky_door_open.1.ogg differ diff --git a/mods/everness/sounds/everness_creaky_door_open.2.ogg b/mods/everness/sounds/everness_creaky_door_open.2.ogg new file mode 100644 index 00000000..4254e2d6 Binary files /dev/null and b/mods/everness/sounds/everness_creaky_door_open.2.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.1.ogg b/mods/everness/sounds/everness_crystal_chime.1.ogg new file mode 100644 index 00000000..08c4df07 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.1.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.2.ogg b/mods/everness/sounds/everness_crystal_chime.2.ogg new file mode 100644 index 00000000..963c52e5 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.2.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.3.ogg b/mods/everness/sounds/everness_crystal_chime.3.ogg new file mode 100644 index 00000000..7315084c Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.3.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.4.ogg b/mods/everness/sounds/everness_crystal_chime.4.ogg new file mode 100644 index 00000000..d6bf0d30 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.4.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.5.ogg b/mods/everness/sounds/everness_crystal_chime.5.ogg new file mode 100644 index 00000000..b327e161 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.5.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.6.ogg b/mods/everness/sounds/everness_crystal_chime.6.ogg new file mode 100644 index 00000000..390723cf Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.6.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.1.ogg b/mods/everness/sounds/everness_dirt_footstep.1.ogg new file mode 100644 index 00000000..86c0822e Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.2.ogg b/mods/everness/sounds/everness_dirt_footstep.2.ogg new file mode 100644 index 00000000..d505aa75 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.3.ogg b/mods/everness/sounds/everness_dirt_footstep.3.ogg new file mode 100644 index 00000000..98d60c1f Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.4.ogg b/mods/everness/sounds/everness_dirt_footstep.4.ogg new file mode 100644 index 00000000..ec507f41 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_dirt_hit.1.ogg b/mods/everness/sounds/everness_dirt_hit.1.ogg new file mode 100644 index 00000000..4ef4f291 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_dirt_hit.2.ogg b/mods/everness/sounds/everness_dirt_hit.2.ogg new file mode 100644 index 00000000..2ee8f6b5 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_dirt_hit.3.ogg b/mods/everness/sounds/everness_dirt_hit.3.ogg new file mode 100644 index 00000000..34fff6ba Binary files /dev/null and b/mods/everness/sounds/everness_dirt_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_door_bamboo_open.ogg b/mods/everness/sounds/everness_door_bamboo_open.ogg new file mode 100644 index 00000000..ee44a2ea Binary files /dev/null and b/mods/everness/sounds/everness_door_bamboo_open.ogg differ diff --git a/mods/everness/sounds/everness_door_glass_close.ogg b/mods/everness/sounds/everness_door_glass_close.ogg new file mode 100644 index 00000000..eb8495c0 Binary files /dev/null and b/mods/everness/sounds/everness_door_glass_close.ogg differ diff --git a/mods/everness/sounds/everness_door_glass_open.ogg b/mods/everness/sounds/everness_door_glass_open.ogg new file mode 100644 index 00000000..e63c8416 Binary files /dev/null and b/mods/everness/sounds/everness_door_glass_open.ogg differ diff --git a/mods/everness/sounds/everness_extinguish_flame.1.ogg b/mods/everness/sounds/everness_extinguish_flame.1.ogg new file mode 100644 index 00000000..1bb5b078 Binary files /dev/null and b/mods/everness/sounds/everness_extinguish_flame.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.1.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.1.ogg new file mode 100644 index 00000000..eb4bc5f9 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.2.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.2.ogg new file mode 100644 index 00000000..57fedb1e Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.3.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.3.ogg new file mode 100644 index 00000000..1b496fcd Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.4.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.4.ogg new file mode 100644 index 00000000..fad8692b Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.5.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.5.ogg new file mode 100644 index 00000000..689336bd Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.1.ogg b/mods/everness/sounds/everness_frosted_snow_hit.1.ogg new file mode 100644 index 00000000..eeac81ae Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.2.ogg b/mods/everness/sounds/everness_frosted_snow_hit.2.ogg new file mode 100644 index 00000000..f0dbb5f8 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.3.ogg b/mods/everness/sounds/everness_frosted_snow_hit.3.ogg new file mode 100644 index 00000000..8a7f51b4 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.4.ogg b/mods/everness/sounds/everness_frosted_snow_hit.4.ogg new file mode 100644 index 00000000..c5d68b3f Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_place.1.ogg b/mods/everness/sounds/everness_frosted_snow_place.1.ogg new file mode 100644 index 00000000..ebf316ec Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_place.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_place.2.ogg b/mods/everness/sounds/everness_frosted_snow_place.2.ogg new file mode 100644 index 00000000..381a6975 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_place.2.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_place.3.ogg b/mods/everness/sounds/everness_frosted_snow_place.3.ogg new file mode 100644 index 00000000..e9497e80 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_place.3.ogg differ diff --git a/mods/everness/sounds/everness_glass_dug.1.ogg b/mods/everness/sounds/everness_glass_dug.1.ogg new file mode 100644 index 00000000..dbcbd50a Binary files /dev/null and b/mods/everness/sounds/everness_glass_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_glass_dug.2.ogg b/mods/everness/sounds/everness_glass_dug.2.ogg new file mode 100644 index 00000000..b0c8aa70 Binary files /dev/null and b/mods/everness/sounds/everness_glass_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_glass_footstep.1.ogg b/mods/everness/sounds/everness_glass_footstep.1.ogg new file mode 100644 index 00000000..adffad97 Binary files /dev/null and b/mods/everness/sounds/everness_glass_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_glass_footstep.2.ogg b/mods/everness/sounds/everness_glass_footstep.2.ogg new file mode 100644 index 00000000..c425d5fa Binary files /dev/null and b/mods/everness/sounds/everness_glass_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_glass_footstep.3.ogg b/mods/everness/sounds/everness_glass_footstep.3.ogg new file mode 100644 index 00000000..18175634 Binary files /dev/null and b/mods/everness/sounds/everness_glass_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_glass_place.1.ogg b/mods/everness/sounds/everness_glass_place.1.ogg new file mode 100644 index 00000000..14ae30de Binary files /dev/null and b/mods/everness/sounds/everness_glass_place.1.ogg differ diff --git a/mods/everness/sounds/everness_glass_place.2.ogg b/mods/everness/sounds/everness_glass_place.2.ogg new file mode 100644 index 00000000..7e3b2186 Binary files /dev/null and b/mods/everness/sounds/everness_glass_place.2.ogg differ diff --git a/mods/everness/sounds/everness_glass_place.3.ogg b/mods/everness/sounds/everness_glass_place.3.ogg new file mode 100644 index 00000000..6cbafbf1 Binary files /dev/null and b/mods/everness/sounds/everness_glass_place.3.ogg differ diff --git a/mods/everness/sounds/everness_grass_footstep.1.ogg b/mods/everness/sounds/everness_grass_footstep.1.ogg new file mode 100644 index 00000000..e38cbd3e Binary files /dev/null and b/mods/everness/sounds/everness_grass_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_grass_footstep.2.ogg b/mods/everness/sounds/everness_grass_footstep.2.ogg new file mode 100644 index 00000000..4a5f2998 Binary files /dev/null and b/mods/everness/sounds/everness_grass_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_grass_footstep.3.ogg b/mods/everness/sounds/everness_grass_footstep.3.ogg new file mode 100644 index 00000000..d4ff286f Binary files /dev/null and b/mods/everness/sounds/everness_grass_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_grass_hit.1.ogg b/mods/everness/sounds/everness_grass_hit.1.ogg new file mode 100644 index 00000000..b26df594 Binary files /dev/null and b/mods/everness/sounds/everness_grass_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_grass_hit.2.ogg b/mods/everness/sounds/everness_grass_hit.2.ogg new file mode 100644 index 00000000..31ffa28c Binary files /dev/null and b/mods/everness/sounds/everness_grass_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_grass_hit.3.ogg b/mods/everness/sounds/everness_grass_hit.3.ogg new file mode 100644 index 00000000..d52bca1d Binary files /dev/null and b/mods/everness/sounds/everness_grass_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.1.ogg b/mods/everness/sounds/everness_gravel_dug.1.ogg new file mode 100644 index 00000000..4d9a85a2 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.2.ogg b/mods/everness/sounds/everness_gravel_dug.2.ogg new file mode 100644 index 00000000..083e99be Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.3.ogg b/mods/everness/sounds/everness_gravel_dug.3.ogg new file mode 100644 index 00000000..992eccbc Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.4.ogg b/mods/everness/sounds/everness_gravel_dug.4.ogg new file mode 100644 index 00000000..0b4a71b4 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.4.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.1.ogg b/mods/everness/sounds/everness_gravel_footstep.1.ogg new file mode 100644 index 00000000..3c67d425 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.2.ogg b/mods/everness/sounds/everness_gravel_footstep.2.ogg new file mode 100644 index 00000000..0615b3fd Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.3.ogg b/mods/everness/sounds/everness_gravel_footstep.3.ogg new file mode 100644 index 00000000..8864e588 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.4.ogg b/mods/everness/sounds/everness_gravel_footstep.4.ogg new file mode 100644 index 00000000..465d140b Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.5.ogg b/mods/everness/sounds/everness_gravel_footstep.5.ogg new file mode 100644 index 00000000..8df8f768 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.6.ogg b/mods/everness/sounds/everness_gravel_footstep.6.ogg new file mode 100644 index 00000000..f37aa14d Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.6.ogg differ diff --git a/mods/everness/sounds/everness_gravel_hit.1.ogg b/mods/everness/sounds/everness_gravel_hit.1.ogg new file mode 100644 index 00000000..44c8273e Binary files /dev/null and b/mods/everness/sounds/everness_gravel_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_hit.2.ogg b/mods/everness/sounds/everness_gravel_hit.2.ogg new file mode 100644 index 00000000..43cb0056 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_hit.3.ogg b/mods/everness/sounds/everness_gravel_hit.3.ogg new file mode 100644 index 00000000..e91ae41d Binary files /dev/null and b/mods/everness/sounds/everness_gravel_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_place.1.ogg b/mods/everness/sounds/everness_gravel_place.1.ogg new file mode 100644 index 00000000..8c5a4722 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_place.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_place.2.ogg b/mods/everness/sounds/everness_gravel_place.2.ogg new file mode 100644 index 00000000..574ba778 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_place.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_place.3.ogg b/mods/everness/sounds/everness_gravel_place.3.ogg new file mode 100644 index 00000000..c0ed86d1 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_place.3.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.1.ogg b/mods/everness/sounds/everness_ice_footstep.1.ogg new file mode 100644 index 00000000..5445c0b9 Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.2.ogg b/mods/everness/sounds/everness_ice_footstep.2.ogg new file mode 100644 index 00000000..d49fa7bb Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.3.ogg b/mods/everness/sounds/everness_ice_footstep.3.ogg new file mode 100644 index 00000000..5c1feb9f Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.4.ogg b/mods/everness/sounds/everness_ice_footstep.4.ogg new file mode 100644 index 00000000..78994f58 Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.1.ogg b/mods/everness/sounds/everness_ice_hit.1.ogg new file mode 100644 index 00000000..448328a0 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.2.ogg b/mods/everness/sounds/everness_ice_hit.2.ogg new file mode 100644 index 00000000..97e6ad66 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.3.ogg b/mods/everness/sounds/everness_ice_hit.3.ogg new file mode 100644 index 00000000..5416bd00 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.4.ogg b/mods/everness/sounds/everness_ice_hit.4.ogg new file mode 100644 index 00000000..a57fdc63 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.1.ogg b/mods/everness/sounds/everness_item_drop_pickup.1.ogg new file mode 100644 index 00000000..93f4a238 Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.1.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.2.ogg b/mods/everness/sounds/everness_item_drop_pickup.2.ogg new file mode 100644 index 00000000..95a665ee Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.2.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.3.ogg b/mods/everness/sounds/everness_item_drop_pickup.3.ogg new file mode 100644 index 00000000..921d08ef Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.3.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.4.ogg b/mods/everness/sounds/everness_item_drop_pickup.4.ogg new file mode 100644 index 00000000..93b3a217 Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.4.ogg differ diff --git a/mods/everness/sounds/everness_lava_1.ogg b/mods/everness/sounds/everness_lava_1.ogg new file mode 100644 index 00000000..7993d797 Binary files /dev/null and b/mods/everness/sounds/everness_lava_1.ogg differ diff --git a/mods/everness/sounds/everness_lava_2.ogg b/mods/everness/sounds/everness_lava_2.ogg new file mode 100644 index 00000000..3646372a Binary files /dev/null and b/mods/everness/sounds/everness_lava_2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_dug.1.ogg b/mods/everness/sounds/everness_leaves_dug.1.ogg new file mode 100644 index 00000000..61ff7352 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_dug.2.ogg b/mods/everness/sounds/everness_leaves_dug.2.ogg new file mode 100644 index 00000000..03fbc87c Binary files /dev/null and b/mods/everness/sounds/everness_leaves_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.1.ogg b/mods/everness/sounds/everness_leaves_footstep.1.ogg new file mode 100644 index 00000000..4479f8d8 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.2.ogg b/mods/everness/sounds/everness_leaves_footstep.2.ogg new file mode 100644 index 00000000..bda1195b Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.3.ogg b/mods/everness/sounds/everness_leaves_footstep.3.ogg new file mode 100644 index 00000000..ddc0dc27 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.4.ogg b/mods/everness/sounds/everness_leaves_footstep.4.ogg new file mode 100644 index 00000000..eb7a6096 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_leaves_hit.1.ogg b/mods/everness/sounds/everness_leaves_hit.1.ogg new file mode 100644 index 00000000..3160d1d3 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_hit.2.ogg b/mods/everness/sounds/everness_leaves_hit.2.ogg new file mode 100644 index 00000000..ccc9475b Binary files /dev/null and b/mods/everness/sounds/everness_leaves_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_place.1.ogg b/mods/everness/sounds/everness_leaves_place.1.ogg new file mode 100644 index 00000000..7fd7b645 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_place.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_place.2.ogg b/mods/everness/sounds/everness_leaves_place.2.ogg new file mode 100644 index 00000000..00b7c224 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_place.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_dug.1.ogg b/mods/everness/sounds/everness_metal_dug.1.ogg new file mode 100644 index 00000000..49d675ff Binary files /dev/null and b/mods/everness/sounds/everness_metal_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_dug.2.ogg b/mods/everness/sounds/everness_metal_dug.2.ogg new file mode 100644 index 00000000..017a8ed7 Binary files /dev/null and b/mods/everness/sounds/everness_metal_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_dug.3.ogg b/mods/everness/sounds/everness_metal_dug.3.ogg new file mode 100644 index 00000000..19d6e8e4 Binary files /dev/null and b/mods/everness/sounds/everness_metal_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.1.ogg b/mods/everness/sounds/everness_metal_footstep.1.ogg new file mode 100644 index 00000000..caf1670d Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.2.ogg b/mods/everness/sounds/everness_metal_footstep.2.ogg new file mode 100644 index 00000000..0d4be6a0 Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.3.ogg b/mods/everness/sounds/everness_metal_footstep.3.ogg new file mode 100644 index 00000000..557ce7b9 Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.4.ogg b/mods/everness/sounds/everness_metal_footstep.4.ogg new file mode 100644 index 00000000..d452f987 Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.5.ogg b/mods/everness/sounds/everness_metal_footstep.5.ogg new file mode 100644 index 00000000..6914415b Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_metal_hit.1.ogg b/mods/everness/sounds/everness_metal_hit.1.ogg new file mode 100644 index 00000000..f923a9f2 Binary files /dev/null and b/mods/everness/sounds/everness_metal_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_hit.2.ogg b/mods/everness/sounds/everness_metal_hit.2.ogg new file mode 100644 index 00000000..8c0636c6 Binary files /dev/null and b/mods/everness/sounds/everness_metal_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_hit.3.ogg b/mods/everness/sounds/everness_metal_hit.3.ogg new file mode 100644 index 00000000..f0337efc Binary files /dev/null and b/mods/everness/sounds/everness_metal_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_metal_place.1.ogg b/mods/everness/sounds/everness_metal_place.1.ogg new file mode 100644 index 00000000..a48d817e Binary files /dev/null and b/mods/everness/sounds/everness_metal_place.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_place.2.ogg b/mods/everness/sounds/everness_metal_place.2.ogg new file mode 100644 index 00000000..aaf06e2b Binary files /dev/null and b/mods/everness/sounds/everness_metal_place.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_place.3.ogg b/mods/everness/sounds/everness_metal_place.3.ogg new file mode 100644 index 00000000..ab154d26 Binary files /dev/null and b/mods/everness/sounds/everness_metal_place.3.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.1.ogg b/mods/everness/sounds/everness_mud_footstep.1.ogg new file mode 100644 index 00000000..925d3eda Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.2.ogg b/mods/everness/sounds/everness_mud_footstep.2.ogg new file mode 100644 index 00000000..3c2d1fce Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.3.ogg b/mods/everness/sounds/everness_mud_footstep.3.ogg new file mode 100644 index 00000000..f96496e6 Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.4.ogg b/mods/everness/sounds/everness_mud_footstep.4.ogg new file mode 100644 index 00000000..9d77d413 Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.5.ogg b/mods/everness/sounds/everness_mud_footstep.5.ogg new file mode 100644 index 00000000..6f2a9ee0 Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_plant_hit.1.ogg b/mods/everness/sounds/everness_plant_hit.1.ogg new file mode 100644 index 00000000..8073087f Binary files /dev/null and b/mods/everness/sounds/everness_plant_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_plant_hit.2.ogg b/mods/everness/sounds/everness_plant_hit.2.ogg new file mode 100644 index 00000000..0964cb81 Binary files /dev/null and b/mods/everness/sounds/everness_plant_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_plant_hit.3.ogg b/mods/everness/sounds/everness_plant_hit.3.ogg new file mode 100644 index 00000000..4bcd9b13 Binary files /dev/null and b/mods/everness/sounds/everness_plant_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_dug.1.ogg b/mods/everness/sounds/everness_sand_dug.1.ogg new file mode 100644 index 00000000..648b998e Binary files /dev/null and b/mods/everness/sounds/everness_sand_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_dug.2.ogg b/mods/everness/sounds/everness_sand_dug.2.ogg new file mode 100644 index 00000000..bfb6a386 Binary files /dev/null and b/mods/everness/sounds/everness_sand_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_dug.3.ogg b/mods/everness/sounds/everness_sand_dug.3.ogg new file mode 100644 index 00000000..4cdfc821 Binary files /dev/null and b/mods/everness/sounds/everness_sand_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_footstep.1.ogg b/mods/everness/sounds/everness_sand_footstep.1.ogg new file mode 100644 index 00000000..c5331b38 Binary files /dev/null and b/mods/everness/sounds/everness_sand_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_footstep.2.ogg b/mods/everness/sounds/everness_sand_footstep.2.ogg new file mode 100644 index 00000000..e6e019d7 Binary files /dev/null and b/mods/everness/sounds/everness_sand_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_footstep.3.ogg b/mods/everness/sounds/everness_sand_footstep.3.ogg new file mode 100644 index 00000000..9da9245c Binary files /dev/null and b/mods/everness/sounds/everness_sand_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_hit.1.ogg b/mods/everness/sounds/everness_sand_hit.1.ogg new file mode 100644 index 00000000..2175d5a0 Binary files /dev/null and b/mods/everness/sounds/everness_sand_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_hit.2.ogg b/mods/everness/sounds/everness_sand_hit.2.ogg new file mode 100644 index 00000000..9393691b Binary files /dev/null and b/mods/everness/sounds/everness_sand_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_hit.3.ogg b/mods/everness/sounds/everness_sand_hit.3.ogg new file mode 100644 index 00000000..05f4863a Binary files /dev/null and b/mods/everness/sounds/everness_sand_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.1.ogg b/mods/everness/sounds/everness_sand_place.1.ogg new file mode 100644 index 00000000..4101051d Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.2.ogg b/mods/everness/sounds/everness_sand_place.2.ogg new file mode 100644 index 00000000..5aef765e Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.3.ogg b/mods/everness/sounds/everness_sand_place.3.ogg new file mode 100644 index 00000000..15f139ac Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.4.ogg b/mods/everness/sounds/everness_sand_place.4.ogg new file mode 100644 index 00000000..e307eafc Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.4.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.5.ogg b/mods/everness/sounds/everness_sand_place.5.ogg new file mode 100644 index 00000000..0f17bd07 Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.5.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.1.ogg b/mods/everness/sounds/everness_snow_footstep.1.ogg new file mode 100644 index 00000000..51d1e99d Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.2.ogg b/mods/everness/sounds/everness_snow_footstep.2.ogg new file mode 100644 index 00000000..29b4a281 Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.3.ogg b/mods/everness/sounds/everness_snow_footstep.3.ogg new file mode 100644 index 00000000..2dbdec00 Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.4.ogg b/mods/everness/sounds/everness_snow_footstep.4.ogg new file mode 100644 index 00000000..2746f28c Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_snow_hit.1.ogg b/mods/everness/sounds/everness_snow_hit.1.ogg new file mode 100644 index 00000000..147baba1 Binary files /dev/null and b/mods/everness/sounds/everness_snow_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_snow_hit.2.ogg b/mods/everness/sounds/everness_snow_hit.2.ogg new file mode 100644 index 00000000..22cc66de Binary files /dev/null and b/mods/everness/sounds/everness_snow_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_snow_hit.3.ogg b/mods/everness/sounds/everness_snow_hit.3.ogg new file mode 100644 index 00000000..bf7190d6 Binary files /dev/null and b/mods/everness/sounds/everness_snow_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_snow_place.1.ogg b/mods/everness/sounds/everness_snow_place.1.ogg new file mode 100644 index 00000000..1f109d95 Binary files /dev/null and b/mods/everness/sounds/everness_snow_place.1.ogg differ diff --git a/mods/everness/sounds/everness_snow_place.2.ogg b/mods/everness/sounds/everness_snow_place.2.ogg new file mode 100644 index 00000000..2108373a Binary files /dev/null and b/mods/everness/sounds/everness_snow_place.2.ogg differ diff --git a/mods/everness/sounds/everness_snow_place.3.ogg b/mods/everness/sounds/everness_snow_place.3.ogg new file mode 100644 index 00000000..97b28a20 Binary files /dev/null and b/mods/everness/sounds/everness_snow_place.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_dug.1.ogg b/mods/everness/sounds/everness_stone_dug.1.ogg new file mode 100644 index 00000000..b34e0f5a Binary files /dev/null and b/mods/everness/sounds/everness_stone_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_dug.2.ogg b/mods/everness/sounds/everness_stone_dug.2.ogg new file mode 100644 index 00000000..d4eaf15c Binary files /dev/null and b/mods/everness/sounds/everness_stone_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_dug.3.ogg b/mods/everness/sounds/everness_stone_dug.3.ogg new file mode 100644 index 00000000..b19b449f Binary files /dev/null and b/mods/everness/sounds/everness_stone_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.1.ogg b/mods/everness/sounds/everness_stone_footstep.1.ogg new file mode 100644 index 00000000..6ecd9a23 Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.2.ogg b/mods/everness/sounds/everness_stone_footstep.2.ogg new file mode 100644 index 00000000..d3f9ebf5 Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.3.ogg b/mods/everness/sounds/everness_stone_footstep.3.ogg new file mode 100644 index 00000000..abafae2f Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.4.ogg b/mods/everness/sounds/everness_stone_footstep.4.ogg new file mode 100644 index 00000000..653e236f Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.5.ogg b/mods/everness/sounds/everness_stone_footstep.5.ogg new file mode 100644 index 00000000..07b1b74c Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_stone_hit.1.ogg b/mods/everness/sounds/everness_stone_hit.1.ogg new file mode 100644 index 00000000..5cfbbecd Binary files /dev/null and b/mods/everness/sounds/everness_stone_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_hit.2.ogg b/mods/everness/sounds/everness_stone_hit.2.ogg new file mode 100644 index 00000000..414a35ee Binary files /dev/null and b/mods/everness/sounds/everness_stone_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_hit.3.ogg b/mods/everness/sounds/everness_stone_hit.3.ogg new file mode 100644 index 00000000..4116ce10 Binary files /dev/null and b/mods/everness/sounds/everness_stone_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.1.ogg b/mods/everness/sounds/everness_stone_place.1.ogg new file mode 100644 index 00000000..726c5141 Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.2.ogg b/mods/everness/sounds/everness_stone_place.2.ogg new file mode 100644 index 00000000..237cf37d Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.3.ogg b/mods/everness/sounds/everness_stone_place.3.ogg new file mode 100644 index 00000000..848ea5f2 Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.4.ogg b/mods/everness/sounds/everness_stone_place.4.ogg new file mode 100644 index 00000000..1c235690 Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.4.ogg differ diff --git a/mods/everness/sounds/everness_thin_glass_footstep.ogg b/mods/everness/sounds/everness_thin_glass_footstep.ogg new file mode 100644 index 00000000..191287a3 Binary files /dev/null and b/mods/everness/sounds/everness_thin_glass_footstep.ogg differ diff --git a/mods/everness/sounds/everness_tool_breaks.1.ogg b/mods/everness/sounds/everness_tool_breaks.1.ogg new file mode 100644 index 00000000..2a571ae2 Binary files /dev/null and b/mods/everness/sounds/everness_tool_breaks.1.ogg differ diff --git a/mods/everness/sounds/everness_tool_breaks.2.ogg b/mods/everness/sounds/everness_tool_breaks.2.ogg new file mode 100644 index 00000000..17893520 Binary files /dev/null and b/mods/everness/sounds/everness_tool_breaks.2.ogg differ diff --git a/mods/everness/sounds/everness_tool_breaks.3.ogg b/mods/everness/sounds/everness_tool_breaks.3.ogg new file mode 100644 index 00000000..a99c4b7e Binary files /dev/null and b/mods/everness/sounds/everness_tool_breaks.3.ogg differ diff --git a/mods/everness/sounds/everness_underwater_bubbles.1.ogg b/mods/everness/sounds/everness_underwater_bubbles.1.ogg new file mode 100644 index 00000000..dcb8abfd Binary files /dev/null and b/mods/everness/sounds/everness_underwater_bubbles.1.ogg differ diff --git a/mods/everness/sounds/everness_underwater_bubbles.2.ogg b/mods/everness/sounds/everness_underwater_bubbles.2.ogg new file mode 100644 index 00000000..2801af9d Binary files /dev/null and b/mods/everness/sounds/everness_underwater_bubbles.2.ogg differ diff --git a/mods/everness/sounds/everness_underwater_bubbles.3.ogg b/mods/everness/sounds/everness_underwater_bubbles.3.ogg new file mode 100644 index 00000000..df494c3e Binary files /dev/null and b/mods/everness/sounds/everness_underwater_bubbles.3.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.1.ogg b/mods/everness/sounds/everness_water_footstep.1.ogg new file mode 100644 index 00000000..22b340dc Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.2.ogg b/mods/everness/sounds/everness_water_footstep.2.ogg new file mode 100644 index 00000000..30f0dedd Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.3.ogg b/mods/everness/sounds/everness_water_footstep.3.ogg new file mode 100644 index 00000000..f4cc3da3 Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.4.ogg b/mods/everness/sounds/everness_water_footstep.4.ogg new file mode 100644 index 00000000..7ab3524b Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_water_geyser.1.ogg b/mods/everness/sounds/everness_water_geyser.1.ogg new file mode 100644 index 00000000..80da2efa Binary files /dev/null and b/mods/everness/sounds/everness_water_geyser.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.1.ogg b/mods/everness/sounds/everness_wood_footstep.1.ogg new file mode 100644 index 00000000..0ed642bc Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.2.ogg b/mods/everness/sounds/everness_wood_footstep.2.ogg new file mode 100644 index 00000000..f1ad2e60 Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.3.ogg b/mods/everness/sounds/everness_wood_footstep.3.ogg new file mode 100644 index 00000000..17a89a3b Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.4.ogg b/mods/everness/sounds/everness_wood_footstep.4.ogg new file mode 100644 index 00000000..8ced7cbe Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.5.ogg b/mods/everness/sounds/everness_wood_footstep.5.ogg new file mode 100644 index 00000000..bee6a53a Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.6.ogg b/mods/everness/sounds/everness_wood_footstep.6.ogg new file mode 100644 index 00000000..f317c984 Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.6.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.1.ogg b/mods/everness/sounds/everness_wood_hit.1.ogg new file mode 100644 index 00000000..14d74ded Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.2.ogg b/mods/everness/sounds/everness_wood_hit.2.ogg new file mode 100644 index 00000000..f53638df Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.3.ogg b/mods/everness/sounds/everness_wood_hit.3.ogg new file mode 100644 index 00000000..a13d46e6 Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.4.ogg b/mods/everness/sounds/everness_wood_hit.4.ogg new file mode 100644 index 00000000..4a7d8fa0 Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.5.ogg b/mods/everness/sounds/everness_wood_hit.5.ogg new file mode 100644 index 00000000..0d16f4ed Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.5.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.6.ogg b/mods/everness/sounds/everness_wood_hit.6.ogg new file mode 100644 index 00000000..411bd8b1 Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.6.ogg differ diff --git a/mods/everness/sounds/everness_wood_place.1.ogg b/mods/everness/sounds/everness_wood_place.1.ogg new file mode 100644 index 00000000..f3a5f351 Binary files /dev/null and b/mods/everness/sounds/everness_wood_place.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_place.2.ogg b/mods/everness/sounds/everness_wood_place.2.ogg new file mode 100644 index 00000000..eab96e13 Binary files /dev/null and b/mods/everness/sounds/everness_wood_place.2.ogg differ diff --git a/mods/everness/sounds/everness_wood_place.3.ogg b/mods/everness/sounds/everness_wood_place.3.ogg new file mode 100644 index 00000000..9f62083c Binary files /dev/null and b/mods/everness/sounds/everness_wood_place.3.ogg differ diff --git a/mods/everness/stairs.lua b/mods/everness/stairs.lua new file mode 100644 index 00000000..5c40e518 --- /dev/null +++ b/mods/everness/stairs.lua @@ -0,0 +1,925 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +stairs.register_stair_and_slab( + 'coral_desert_stone', + 'everness:coral_desert_stone', + { cracky = 3 }, + { 'everness_coral_desert_stone.png' }, + 'Coral Desert Stone Stair', + 'Coral Desert Stone Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_desert_cobble', + 'everness:coral_desert_cobble', + { cracky = 3 }, + { 'everness_coral_desert_cobble.png' }, + 'Coral Desert Cobblestone Stair', + 'Coral Desert Cobblestone Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_desert_mossy_cobble', + 'everness:coral_desert_mossy_cobble', + { cracky = 3 }, + { 'everness_coral_desert_mossy_cobble.png' }, + 'Coral Mossy Cobblestone Stair', + 'Coral Mossy Cobblestone Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_brick', + 'everness:cursed_brick', + { cracky = 2 }, + { 'everness_cursed_brick.png' }, + 'Cursed Brick Stair', + 'Cursed Brick Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_brick_with_growth', + 'everness:cursed_brick_with_growth', + { cracky = 2 }, + { 'everness_cursed_brick_with_growth.png' }, + 'Cursed Brick with Growth Stair', + 'Cursed Brick with Growth Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_sandstone_block', + 'everness:cursed_sandstone_block', + { cracky = 2 }, + { 'everness_cursed_sandstone_block.png' }, + 'Cursed Sandstone Block Stair', + 'Cursed Sandstone Block Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_sandstone_brick', + 'everness:cursed_sandstone_brick', + { cracky = 2 }, + { 'everness_cursed_sandstone_brick.png' }, + 'Cursed Sandstone Brick Stair', + 'Cursed Sandstone Brick Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_stone_carved', + 'everness:cursed_stone_carved', + { cracky = 2 }, + { + { + name = 'everness_cursed_stone_carved.png', + align_style = 'world', + scale = 2 + } + }, + 'Cursed Stone Carved Stair', + 'Cursed Stone Carved Slab', + Everness.node_sound_stone_defaults(), + true +) + +-- Quartz + +stairs.register_stair_and_slab( + 'quartz_block', + 'everness:quartz_block', + { cracky = 2 }, + { + 'everness_quartz_block_top.png', + 'everness_quartz_block_bottom.png', + 'everness_quartz_block_side.png', + }, + S('Quartz Block Stair'), + S('Quartz Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'quartz_chiseled', + 'everness:quartz_chiseled', + { cracky = 2 }, + { + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled.png', + }, + S('Quartz Chiseled Stair'), + S('Quartz Chiseled Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'quartz_pillar', + 'everness:quartz_pillar', + { cracky = 2 }, + { + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines.png', + }, + S('Quartz Pillar Stair'), + S('Quartz Pillar Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Dry Wood + +stairs.register_stair_and_slab( + 'dry_wood', + 'everness:dry_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_dry_wood.png' }, + S('Dry Wood Stair'), + S('Dry Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +stairs.register_stair_and_slab( + 'dry_tree', + 'everness:dry_tree', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_dry_tree_top.png', 'everness_dry_tree_top.png', 'everness_dry_tree.png' }, + S('Dry Tree Trunk Stair'), + S('Dry Tree Trunk Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Coral Wood + +stairs.register_stair_and_slab( + 'coral_wood', + 'everness:coral_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 3 }, + { 'everness_coral_wood.png' }, + S('Coral Wood Stair'), + S('Coral Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Bamboo Wood + +stairs.register_stair_and_slab( + 'bamboo_wood', + 'everness:bamboo_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_dry_bamboo_block_side.png' }, + S('Bamboo Wood Stair'), + S('Bamboo Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +stairs.register_stair_and_slab( + 'bamboo_mosaic_wood', + 'everness:bamboo_mosaic_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_bamboo_mosaic.png' }, + S('Bamboo Mosaic Wood Stair'), + S('Bamboo Mosaic Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Forsaken stone + +stairs.register_stair_and_slab( + 'forsaken_desert_brick', + 'everness:forsaken_desert_brick', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_brick.png' }, + S('Forsaken Desert Brick Stair'), + S('Forsaken Desert Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_brick_red', + 'everness:forsaken_desert_brick_red', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_brick_red.png' }, + S('Forsaken Desert Brick Red Stair'), + S('Forsaken Desert Brick Red Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_chiseled_stone', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_chiseled_stone_side.png' }, + S('Forsaken Desert Chiseled Stone Stair'), + S('Forsaken Desert Chiseled Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_engraved_stone', + 'everness:forsaken_desert_engraved_stone', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_engraved_stone.png' }, + S('Forsaken Desert Engraved Stone Stair'), + S('Forsaken Desert Engraved Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_cobble', + 'everness:forsaken_desert_cobble', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_cobble.png' }, + S('Forsaken Desert Cobblestone Stair'), + S('Forsaken Desert Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_cobble_red', + 'everness:forsaken_desert_cobble_red', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_cobble_red.png' }, + S('Forsaken Desert Cobblestone Red Stair'), + S('Forsaken Desert Cobblestone Red Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Baobab Wood + +stairs.register_stair_and_slab( + 'baobab_wood', + 'everness:baobab_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_baobab_wood.png' }, + S('Baobab Wood Stair'), + S('Baobab Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Sequoia Wood + +stairs.register_stair_and_slab( + 'sequoia_wood', + 'everness:sequoia_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_sequoia_wood.png' }, + S('Sequoia Wood Stair'), + S('Sequoia Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Forsaken Tundra + +stairs.register_stair_and_slab( + 'forsaken_tundra_cobble', + 'everness:forsaken_tundra_cobble', + { cracky = 3, stone = 2 }, + { 'everness_forsaken_tundra_cobblestone.png' }, + S('Forsaken Tundra Cobblestone Stair'), + S('Forsaken Tundra Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_tundra_stone', + 'everness:forsaken_tundra_stone', + { cracky = 3, stone = 1 }, + { 'everness_forsaken_tundra_stone.png' }, + S('Forsaken Tundra Stone Stair'), + S('Forsaken Tundra Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_tundra_brick', + 'everness:forsaken_tundra_brick', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_tundra_brick.png' }, + S('Forsaken Tundra Brick Stair'), + S('Forsaken Tundra Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Willow Wood + +stairs.register_stair_and_slab( + 'willow_wood', + 'everness:willow_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_willow_wood.png' }, + S('Willow Wood Stair'), + S('Willow Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Crystal Wood + +stairs.register_stair_and_slab( + 'crystal_wood', + 'everness:crystal_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_crystal_wood.png' }, + S('Crystal Wood Stair'), + S('Crystal Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Mese Wood + +stairs.register_stair_and_slab( + 'mese_wood', + 'everness:mese_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_mese_wood.png' }, + S('Mese Wood Stair'), + S('Mese Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Magma Cobble + +stairs.register_stair_and_slab( + 'magmacobble', + 'everness:magmacobble', + { cracky = 3, stone = 1 }, + { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + } + }, + S('Magma Cobblestone Stair'), + S('Magma Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Volcanic rock + +stairs.register_stair_and_slab( + 'volcanic_rock', + 'everness:volcanic_rock', + { cracky = 1, stone = 2 }, + { 'everness_volcanic_rock.png' }, + S('Volcanic Rock Stair'), + S('Volcanic Rock Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'volcanic_rock_with_magma', + 'everness:volcanic_rock_with_magma', + { cracky = 1, stone = 2 }, + { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + S('Volcanic Rock with Magma Stair'), + S('Volcanic Rock with Magma Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral Forest Deep Ocean + +stairs.register_stair_and_slab( + 'coral_deep_ocean_sandstone_block', + 'everness:coral_deep_ocean_sandstone_block', + { cracky = 2 }, + { 'everness_deep_ocean_sandstone_block.png' }, + S('Coral Depp Ocean Sandstone Block Stair'), + S('Coral Depp Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_deep_ocean_sandstone_brick', + 'everness:coral_deep_ocean_sandstone_brick', + { cracky = 2 }, + { 'everness_deep_ocean_sandstone_brick.png' }, + S('Coral Depp Ocean Sandstone Brick Stair'), + S('Coral Depp Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral White Sandstone + +stairs.register_stair_and_slab( + 'coral_white_sandstone', + 'everness:coral_white_sandstone', + { cracky = 2 }, + { 'everness_coral_white_sandstone.png' }, + S('Coral White Sandstone Stair'), + S('Coral White Sandstone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_white_sandstone_pillar', + 'everness:coral_white_sandstone_pillar', + { cracky = 2 }, + { + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone_pillar.png', + }, + S('Coral White Sandstone Pillar Stair'), + S('Coral White Sandstone Pillar Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_white_sandstone_brick', + 'everness:coral_white_sandstone_brick', + { cracky = 2 }, + { 'everness_coral_white_sandstone_brick.png' }, + S('Coral White Sandstone Brick Stair'), + S('Coral White Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral Desert Stone + +stairs.register_stair_and_slab( + 'coral_desert_stone_block', + 'everness:coral_desert_stone_block', + { cracky = 2 }, + { 'everness_coral_desert_stone_block.png' }, + S('Coral Desert Stone Block Stair'), + S('Coral Desert Stone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_desert_stone_brick', + 'everness:coral_desert_stone_brick', + { cracky = 2 }, + { 'everness_coral_desert_stone_brick.png' }, + S('Coral Desert Stone Brick Stair'), + S('Coral Desert Stone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral Sandstone + +stairs.register_stair_and_slab( + 'coral_sandstone', + 'everness:coral_sandstone', + { cracky = 2 }, + { 'everness_coral_sandstone.png' }, + S('Coral Sandstone Stair'), + S('Coral Sandstone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_sandstone_brick', + 'everness:coral_sandstone_brick', + { cracky = 2 }, + { 'everness_coral_sandstone_brick.png' }, + S('Coral Sandstone Brick Stair'), + S('Coral Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_sandstone_chiseled', + 'everness:coral_sandstone_chiseled', + { cracky = 2 }, + { 'everness_coral_sandstone_chiseled.png' }, + S('Coral Sandstone Chiseled Stair'), + S('Coral Sandstone Chiseled Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_sandstone_carved_1', + 'everness:coral_sandstone_carved_1', + { cracky = 2 }, + { 'everness_coral_sandstone_carved_1.png' }, + S('Coral Sandstone Carved Stair'), + S('Coral Sandstone Carved Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_lands_deep_ocean_sandstone_block', + 'everness:cursed_lands_deep_ocean_sandstone_block', + { cracky = 2 }, + { 'everness_cursed_lands_deep_ocean_sandblock.png' }, + S('Cursed Lands Deep Ocean Sandstone Block Stair'), + S('Cursed Lands Deep Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_lands_deep_ocean_sandstone_brick', + 'everness:cursed_lands_deep_ocean_sandstone_brick', + { cracky = 2 }, + { 'everness_cursed_lands_deep_ocean_sand_brick.png' }, + S('Cursed Lands Deep Ocean Sandstone Brick Stair'), + S('Cursed Lands Deep Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Crystal +stairs.register_stair_and_slab( + 'crystal_forest_deep_ocean_sandstone_block', + 'everness:crystal_forest_deep_ocean_sandstone_block', + { cracky = 2 }, + { 'everness_crystal_forest_deep_ocean_sandstone_block.png' }, + S('Crystal Forest Deep Ocean Sandstone Block Stair'), + S('Crystal Forest Deep Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_forest_deep_ocean_sandstone_brick', + 'everness:crystal_forest_deep_ocean_sandstone_brick', + { cracky = 2 }, + { 'everness_crystal_forest_deep_ocean_sandstone_brick.png' }, + S('Crystal Forest Deep Ocean Sandstone Brick Stair'), + S('Crystal Forest Deep Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_cobble', + 'everness:crystal_cobble', + { cracky = 2 }, + { 'everness_crystal_cobble.png' }, + S('Crystal Cobblestone Stair'), + S('Crystal Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_mossy_cobble', + 'everness:crystal_mossy_cobble', + { cracky = 2 }, + { 'everness_crystal_mossy_cobble.png' }, + S('Crystal Mossy Cobblestone Stair'), + S('Crystal Mossy Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_stone_brick', + 'everness:crystal_stone_brick', + { cracky = 2 }, + { 'everness_crystal_stone_brick.png' }, + S('Crystal Stone Brick Stair'), + S('Crystal Stone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'everness_glass', + 'everness:glass', + { cracky = 3, oddly_breakable_by_hand = 3 }, + { 'everness_glass.png' }, + S('Everness Glass Stair'), + S('Everness Glass Slab'), + Everness.node_sound_glass_defaults(), + true +) + +-- Coral Bones + +stairs.register_stair_and_slab( + 'coral_bones_block', + 'everness:coral_bones_block', + { cracky = 2, stone = 1 }, + { 'everness_coral_bones_block.png' }, + S('Coral Bones Block Stair'), + S('Coral Bones Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_bones_brick', + 'everness:coral_bones_brick', + { cracky = 2, stone = 1 }, + { 'everness_coral_bones_brick.png' }, + S('Coral Bones Brick Stair'), + S('Coral Bones Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Mineral Waters + +stairs.register_stair_and_slab( + 'mineral_stone', + 'everness:mineral_stone', + { cracky = 3, stone = 1 }, + {{ + name = 'everness_mineral_stone.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_cobble', + 'everness:mineral_stone_cobble', + { cracky = 3, stone = 2 }, + {{ + name = 'everness_mineral_cobblestone.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_block', + 'everness:mineral_stone_block', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_brick', + 'everness:mineral_stone_brick', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone', + 'everness:mineral_sandstone', + { cracky = 3 }, + { 'everness_mineral_sandstone.png' }, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone_block', + 'everness:mineral_sandstone_block', + { cracky = 2 }, + {{ + name = 'everness_mineral_sandstone_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone_brick', + 'everness:mineral_sandstone_brick', + { cracky = 2 }, + {{ + name = 'everness_mineral_sandstone_brick.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone_brick_block', + 'everness:mineral_sandstone_brick_block', + { cracky = 2 }, + { + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { + name = 'everness_mineral_sandstone_brick_block.png', + align_style = 'world', + scale = 2 + } + }, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_brick_with_growth', + 'everness:mineral_stone_brick_with_growth', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick_with_growth.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_brick_with_flower_growth', + 'everness:mineral_stone_brick_with_flower_growth', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick_with_flower_growth.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Palm Wood +stairs.register_stair_and_slab( + 'palm_tree_wood', + 'everness:palm_tree_wood', + { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3 }, + {{ + name = 'everness_palm_tree_wood.png', + align_style = 'world', + scale = 2 + }}, + S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Stair'), + S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Mineral Waters Under +stairs.register_stair_and_slab( + 'mineral_cave_stone', + 'everness:mineral_cave_stone', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral Cave Stone Stair'), + S('Mineral Cave Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_cave_cobblestone', + 'everness:mineral_cave_cobblestone', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral Cave Cobblestone Stair'), + S('Mineral Cave Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_lava_stone', + 'everness:mineral_lava_stone', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }}, + S('Mineral Lava Stone with lava Stair'), + S('Mineral Lava Stone with lava Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_lava_stone_dry', + 'everness:mineral_lava_stone_dry', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral Lava Stone without lava Stair'), + S('Mineral Lava Stone without lava Slab'), + Everness.node_sound_stone_defaults(), + true +) diff --git a/mods/everness/textures/everness_agave_leaf_1.png b/mods/everness/textures/everness_agave_leaf_1.png new file mode 100644 index 00000000..79162dbf Binary files /dev/null and b/mods/everness/textures/everness_agave_leaf_1.png differ diff --git a/mods/everness/textures/everness_agave_leaf_2.png b/mods/everness/textures/everness_agave_leaf_2.png new file mode 100644 index 00000000..bb34eb47 Binary files /dev/null and b/mods/everness/textures/everness_agave_leaf_2.png differ diff --git a/mods/everness/textures/everness_agave_leaf_3.png b/mods/everness/textures/everness_agave_leaf_3.png new file mode 100644 index 00000000..45603593 Binary files /dev/null and b/mods/everness/textures/everness_agave_leaf_3.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_fur.png b/mods/everness/textures/everness_amaranita_lantern_fur.png new file mode 100644 index 00000000..9903a8b9 Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_fur.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_item.png b/mods/everness/textures/everness_amaranita_lantern_item.png new file mode 100644 index 00000000..8586f5da Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_item.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_light.png b/mods/everness/textures/everness_amaranita_lantern_light.png new file mode 100644 index 00000000..6966d652 Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_light.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_roots.png b/mods/everness/textures/everness_amaranita_lantern_roots.png new file mode 100644 index 00000000..4b0fc43e Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_roots.png differ diff --git a/mods/everness/textures/everness_ancient_emerald_ice.png b/mods/everness/textures/everness_ancient_emerald_ice.png new file mode 100644 index 00000000..22bc21e5 Binary files /dev/null and b/mods/everness/textures/everness_ancient_emerald_ice.png differ diff --git a/mods/everness/textures/everness_bamboo_block_side.png b/mods/everness/textures/everness_bamboo_block_side.png new file mode 100644 index 00000000..24842496 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_block_side.png differ diff --git a/mods/everness/textures/everness_bamboo_block_top.png b/mods/everness/textures/everness_bamboo_block_top.png new file mode 100644 index 00000000..b6cbf4a9 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_block_top.png differ diff --git a/mods/everness/textures/everness_bamboo_forest_sun.png b/mods/everness/textures/everness_bamboo_forest_sun.png new file mode 100644 index 00000000..6818c096 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_forest_sun.png differ diff --git a/mods/everness/textures/everness_bamboo_forest_sun_tonemap.png b/mods/everness/textures/everness_bamboo_forest_sun_tonemap.png new file mode 100644 index 00000000..6a9f4439 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_forest_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_bamboo_forest_sunrisebg.png b/mods/everness/textures/everness_bamboo_forest_sunrisebg.png new file mode 100644 index 00000000..0d435aeb Binary files /dev/null and b/mods/everness/textures/everness_bamboo_forest_sunrisebg.png differ diff --git a/mods/everness/textures/everness_bamboo_item.png b/mods/everness/textures/everness_bamboo_item.png new file mode 100644 index 00000000..dee737c8 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_item.png differ diff --git a/mods/everness/textures/everness_bamboo_large_1.png b/mods/everness/textures/everness_bamboo_large_1.png new file mode 100644 index 00000000..920e1bce Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_1.png differ diff --git a/mods/everness/textures/everness_bamboo_large_2.png b/mods/everness/textures/everness_bamboo_large_2.png new file mode 100644 index 00000000..462d4554 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_2.png differ diff --git a/mods/everness/textures/everness_bamboo_large_3.png b/mods/everness/textures/everness_bamboo_large_3.png new file mode 100644 index 00000000..d2cb0b2e Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_3.png differ diff --git a/mods/everness/textures/everness_bamboo_large_bottom.png b/mods/everness/textures/everness_bamboo_large_bottom.png new file mode 100644 index 00000000..5677ffc7 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_bottom.png differ diff --git a/mods/everness/textures/everness_bamboo_large_top.png b/mods/everness/textures/everness_bamboo_large_top.png new file mode 100644 index 00000000..ba132408 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_top.png differ diff --git a/mods/everness/textures/everness_bamboo_mosaic.png b/mods/everness/textures/everness_bamboo_mosaic.png new file mode 100644 index 00000000..832b3538 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_mosaic.png differ diff --git a/mods/everness/textures/everness_bamboo_small_1.png b/mods/everness/textures/everness_bamboo_small_1.png new file mode 100644 index 00000000..c8a9e64b Binary files /dev/null and b/mods/everness/textures/everness_bamboo_small_1.png differ diff --git a/mods/everness/textures/everness_bamboo_small_2.png b/mods/everness/textures/everness_bamboo_small_2.png new file mode 100644 index 00000000..2f93da62 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_small_2.png differ diff --git a/mods/everness/textures/everness_bamboo_small_top.png b/mods/everness/textures/everness_bamboo_small_top.png new file mode 100644 index 00000000..04120a5c Binary files /dev/null and b/mods/everness/textures/everness_bamboo_small_top.png differ diff --git a/mods/everness/textures/everness_bamboo_sprout.png b/mods/everness/textures/everness_bamboo_sprout.png new file mode 100644 index 00000000..fcd6d51f Binary files /dev/null and b/mods/everness/textures/everness_bamboo_sprout.png differ diff --git a/mods/everness/textures/everness_baobab_savanna_sun.png b/mods/everness/textures/everness_baobab_savanna_sun.png new file mode 100644 index 00000000..ad45d71d Binary files /dev/null and b/mods/everness/textures/everness_baobab_savanna_sun.png differ diff --git a/mods/everness/textures/everness_baobab_tree_fruit.png b/mods/everness/textures/everness_baobab_tree_fruit.png new file mode 100644 index 00000000..6708fea1 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_fruit.png differ diff --git a/mods/everness/textures/everness_baobab_tree_fruit_roasted.png b/mods/everness/textures/everness_baobab_tree_fruit_roasted.png new file mode 100644 index 00000000..52b6ba10 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_fruit_roasted.png differ diff --git a/mods/everness/textures/everness_baobab_tree_leaves.png b/mods/everness/textures/everness_baobab_tree_leaves.png new file mode 100644 index 00000000..af945c95 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_leaves.png differ diff --git a/mods/everness/textures/everness_baobab_tree_sapling.png b/mods/everness/textures/everness_baobab_tree_sapling.png new file mode 100644 index 00000000..c4fb7b09 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_sapling.png differ diff --git a/mods/everness/textures/everness_baobab_tree_side.png b/mods/everness/textures/everness_baobab_tree_side.png new file mode 100644 index 00000000..afef95a9 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_side.png differ diff --git a/mods/everness/textures/everness_baobab_tree_top.png b/mods/everness/textures/everness_baobab_tree_top.png new file mode 100644 index 00000000..e484c7f1 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_top.png differ diff --git a/mods/everness/textures/everness_baobab_wood.png b/mods/everness/textures/everness_baobab_wood.png new file mode 100644 index 00000000..8e163141 Binary files /dev/null and b/mods/everness/textures/everness_baobab_wood.png differ diff --git a/mods/everness/textures/everness_bloodspore_plant.png b/mods/everness/textures/everness_bloodspore_plant.png new file mode 100644 index 00000000..b8b31c65 Binary files /dev/null and b/mods/everness/textures/everness_bloodspore_plant.png differ diff --git a/mods/everness/textures/everness_bloodspore_plant_small.png b/mods/everness/textures/everness_bloodspore_plant_small.png new file mode 100644 index 00000000..34ae437a Binary files /dev/null and b/mods/everness/textures/everness_bloodspore_plant_small.png differ diff --git a/mods/everness/textures/everness_blooming_cooksonia.png b/mods/everness/textures/everness_blooming_cooksonia.png new file mode 100644 index 00000000..98ee3cc1 Binary files /dev/null and b/mods/everness/textures/everness_blooming_cooksonia.png differ diff --git a/mods/everness/textures/everness_blue_crying_obsidian.png b/mods/everness/textures/everness_blue_crying_obsidian.png new file mode 100644 index 00000000..23847fc2 Binary files /dev/null and b/mods/everness/textures/everness_blue_crying_obsidian.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern.png b/mods/everness/textures/everness_blue_vine_lantern.png new file mode 100644 index 00000000..e497a5e4 Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern_item.png b/mods/everness/textures/everness_blue_vine_lantern_item.png new file mode 100644 index 00000000..c582a606 Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern_item.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern_leaves.png b/mods/everness/textures/everness_blue_vine_lantern_leaves.png new file mode 100644 index 00000000..9354758d Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern_leaves.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern_roots.png b/mods/everness/textures/everness_blue_vine_lantern_roots.png new file mode 100644 index 00000000..6c00369c Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern_roots.png differ diff --git a/mods/everness/textures/everness_blue_weeping_obsidian.png b/mods/everness/textures/everness_blue_weeping_obsidian.png new file mode 100644 index 00000000..02ad34c2 Binary files /dev/null and b/mods/everness/textures/everness_blue_weeping_obsidian.png differ diff --git a/mods/everness/textures/everness_bone.png b/mods/everness/textures/everness_bone.png new file mode 100644 index 00000000..b6ff784b Binary files /dev/null and b/mods/everness/textures/everness_bone.png differ diff --git a/mods/everness/textures/everness_bone_top.png b/mods/everness/textures/everness_bone_top.png new file mode 100644 index 00000000..7208e8e8 Binary files /dev/null and b/mods/everness/textures/everness_bone_top.png differ diff --git a/mods/everness/textures/everness_bubble.png b/mods/everness/textures/everness_bubble.png new file mode 100644 index 00000000..e937bd9e Binary files /dev/null and b/mods/everness/textures/everness_bubble.png differ diff --git a/mods/everness/textures/everness_bucket_empty.png b/mods/everness/textures/everness_bucket_empty.png new file mode 100644 index 00000000..994cbaa7 Binary files /dev/null and b/mods/everness/textures/everness_bucket_empty.png differ diff --git a/mods/everness/textures/everness_bucket_lava.png b/mods/everness/textures/everness_bucket_lava.png new file mode 100644 index 00000000..06da103b Binary files /dev/null and b/mods/everness/textures/everness_bucket_lava.png differ diff --git a/mods/everness/textures/everness_bucket_mineral_water.png b/mods/everness/textures/everness_bucket_mineral_water.png new file mode 100644 index 00000000..a2761b8d Binary files /dev/null and b/mods/everness/textures/everness_bucket_mineral_water.png differ diff --git a/mods/everness/textures/everness_bulb_vine_1.png b/mods/everness/textures/everness_bulb_vine_1.png new file mode 100644 index 00000000..b0811d4b Binary files /dev/null and b/mods/everness/textures/everness_bulb_vine_1.png differ diff --git a/mods/everness/textures/everness_bulb_vine_2.png b/mods/everness/textures/everness_bulb_vine_2.png new file mode 100644 index 00000000..b8955c07 Binary files /dev/null and b/mods/everness/textures/everness_bulb_vine_2.png differ diff --git a/mods/everness/textures/everness_bulb_vine_end.png b/mods/everness/textures/everness_bulb_vine_end.png new file mode 100644 index 00000000..3243d668 Binary files /dev/null and b/mods/everness/textures/everness_bulb_vine_end.png differ diff --git a/mods/everness/textures/everness_cactus_blue_side.png b/mods/everness/textures/everness_cactus_blue_side.png new file mode 100644 index 00000000..74bf9064 Binary files /dev/null and b/mods/everness/textures/everness_cactus_blue_side.png differ diff --git a/mods/everness/textures/everness_cactus_blue_top.png b/mods/everness/textures/everness_cactus_blue_top.png new file mode 100644 index 00000000..e16454f1 Binary files /dev/null and b/mods/everness/textures/everness_cactus_blue_top.png differ diff --git a/mods/everness/textures/everness_cactus_side.png b/mods/everness/textures/everness_cactus_side.png new file mode 100644 index 00000000..6d5edde9 Binary files /dev/null and b/mods/everness/textures/everness_cactus_side.png differ diff --git a/mods/everness/textures/everness_cactus_top.png b/mods/everness/textures/everness_cactus_top.png new file mode 100644 index 00000000..7321a79c Binary files /dev/null and b/mods/everness/textures/everness_cactus_top.png differ diff --git a/mods/everness/textures/everness_candle_flame_animated.png b/mods/everness/textures/everness_candle_flame_animated.png new file mode 100644 index 00000000..f9dfc870 Binary files /dev/null and b/mods/everness/textures/everness_candle_flame_animated.png differ diff --git a/mods/everness/textures/everness_cave_barrel_cactus_item.png b/mods/everness/textures/everness_cave_barrel_cactus_item.png new file mode 100644 index 00000000..1c716cd6 Binary files /dev/null and b/mods/everness/textures/everness_cave_barrel_cactus_item.png differ diff --git a/mods/everness/textures/everness_cave_barrel_cactus_mesh.png b/mods/everness/textures/everness_cave_barrel_cactus_mesh.png new file mode 100644 index 00000000..7994ad89 Binary files /dev/null and b/mods/everness/textures/everness_cave_barrel_cactus_mesh.png differ diff --git a/mods/everness/textures/everness_cave_flower_item.png b/mods/everness/textures/everness_cave_flower_item.png new file mode 100644 index 00000000..bed46f07 Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_item.png differ diff --git a/mods/everness/textures/everness_cave_flower_item_particles.png b/mods/everness/textures/everness_cave_flower_item_particles.png new file mode 100644 index 00000000..958adb25 Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_item_particles.png differ diff --git a/mods/everness/textures/everness_cave_flower_mesh.png b/mods/everness/textures/everness_cave_flower_mesh.png new file mode 100644 index 00000000..de6694c3 Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_mesh.png differ diff --git a/mods/everness/textures/everness_cave_flower_mesh_particles.png b/mods/everness/textures/everness_cave_flower_mesh_particles.png new file mode 100644 index 00000000..55772a4d Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_mesh_particles.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_blank_mesh.png b/mods/everness/textures/everness_ceramic_pot_blank_mesh.png new file mode 100644 index 00000000..7a3c4281 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_blank_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_blank_sherd.png b/mods/everness/textures/everness_ceramic_pot_blank_sherd.png new file mode 100644 index 00000000..3e44cf1c Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_blank_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_flowers_mesh.png b/mods/everness/textures/everness_ceramic_pot_flowers_mesh.png new file mode 100644 index 00000000..b41d0e19 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_flowers_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_flowers_sherd.png b/mods/everness/textures/everness_ceramic_pot_flowers_sherd.png new file mode 100644 index 00000000..bbdfc4d7 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_flowers_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_lines_mesh.png b/mods/everness/textures/everness_ceramic_pot_lines_mesh.png new file mode 100644 index 00000000..60d43938 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_lines_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_lines_sherd.png b/mods/everness/textures/everness_ceramic_pot_lines_sherd.png new file mode 100644 index 00000000..7207e324 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_lines_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_tribal_mesh.png b/mods/everness/textures/everness_ceramic_pot_tribal_mesh.png new file mode 100644 index 00000000..19b72492 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_tribal_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_tribal_sherd.png b/mods/everness/textures/everness_ceramic_pot_tribal_sherd.png new file mode 100644 index 00000000..412bef13 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_tribal_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_sherds_ore.png b/mods/everness/textures/everness_ceramic_sherds_ore.png new file mode 100644 index 00000000..351d85af Binary files /dev/null and b/mods/everness/textures/everness_ceramic_sherds_ore.png differ diff --git a/mods/everness/textures/everness_chest_front.png b/mods/everness/textures/everness_chest_front.png new file mode 100644 index 00000000..46c5b742 Binary files /dev/null and b/mods/everness/textures/everness_chest_front.png differ diff --git a/mods/everness/textures/everness_chest_inside.png b/mods/everness/textures/everness_chest_inside.png new file mode 100644 index 00000000..3a05d109 Binary files /dev/null and b/mods/everness/textures/everness_chest_inside.png differ diff --git a/mods/everness/textures/everness_chest_side.png b/mods/everness/textures/everness_chest_side.png new file mode 100644 index 00000000..211195d1 Binary files /dev/null and b/mods/everness/textures/everness_chest_side.png differ diff --git a/mods/everness/textures/everness_chest_top.png b/mods/everness/textures/everness_chest_top.png new file mode 100644 index 00000000..2c24e9d0 Binary files /dev/null and b/mods/everness/textures/everness_chest_top.png differ diff --git a/mods/everness/textures/everness_chest_ui_bg.png b/mods/everness/textures/everness_chest_ui_bg.png new file mode 100644 index 00000000..c6cc3a79 Binary files /dev/null and b/mods/everness/textures/everness_chest_ui_bg.png differ diff --git a/mods/everness/textures/everness_chest_ui_bg_hb_slot.png b/mods/everness/textures/everness_chest_ui_bg_hb_slot.png new file mode 100644 index 00000000..4d562448 Binary files /dev/null and b/mods/everness/textures/everness_chest_ui_bg_hb_slot.png differ diff --git a/mods/everness/textures/everness_chest_ui_bg_slot.png b/mods/everness/textures/everness_chest_ui_bg_slot.png new file mode 100644 index 00000000..a1f9fa83 Binary files /dev/null and b/mods/everness/textures/everness_chest_ui_bg_slot.png differ diff --git a/mods/everness/textures/everness_cobweb.png b/mods/everness/textures/everness_cobweb.png new file mode 100644 index 00000000..18a34ce5 Binary files /dev/null and b/mods/everness/textures/everness_cobweb.png differ diff --git a/mods/everness/textures/everness_coconut_bottom.png b/mods/everness/textures/everness_coconut_bottom.png new file mode 100644 index 00000000..e6d19b26 Binary files /dev/null and b/mods/everness/textures/everness_coconut_bottom.png differ diff --git a/mods/everness/textures/everness_coconut_item.png b/mods/everness/textures/everness_coconut_item.png new file mode 100644 index 00000000..d8aae4f1 Binary files /dev/null and b/mods/everness/textures/everness_coconut_item.png differ diff --git a/mods/everness/textures/everness_coconut_side.png b/mods/everness/textures/everness_coconut_side.png new file mode 100644 index 00000000..a298f014 Binary files /dev/null and b/mods/everness/textures/everness_coconut_side.png differ diff --git a/mods/everness/textures/everness_coconut_side_z.png b/mods/everness/textures/everness_coconut_side_z.png new file mode 100644 index 00000000..f184841d Binary files /dev/null and b/mods/everness/textures/everness_coconut_side_z.png differ diff --git a/mods/everness/textures/everness_coconut_top.png b/mods/everness/textures/everness_coconut_top.png new file mode 100644 index 00000000..567e6b0a Binary files /dev/null and b/mods/everness/textures/everness_coconut_top.png differ diff --git a/mods/everness/textures/everness_coral_bones.png b/mods/everness/textures/everness_coral_bones.png new file mode 100644 index 00000000..c6a050db Binary files /dev/null and b/mods/everness/textures/everness_coral_bones.png differ diff --git a/mods/everness/textures/everness_coral_bones_block.png b/mods/everness/textures/everness_coral_bones_block.png new file mode 100644 index 00000000..5057e4be Binary files /dev/null and b/mods/everness/textures/everness_coral_bones_block.png differ diff --git a/mods/everness/textures/everness_coral_bones_brick.png b/mods/everness/textures/everness_coral_bones_brick.png new file mode 100644 index 00000000..05858686 Binary files /dev/null and b/mods/everness/textures/everness_coral_bones_brick.png differ diff --git a/mods/everness/textures/everness_coral_burdock_1.png b/mods/everness/textures/everness_coral_burdock_1.png new file mode 100644 index 00000000..5b5316c9 Binary files /dev/null and b/mods/everness/textures/everness_coral_burdock_1.png differ diff --git a/mods/everness/textures/everness_coral_burdock_2.png b/mods/everness/textures/everness_coral_burdock_2.png new file mode 100644 index 00000000..9648a76e Binary files /dev/null and b/mods/everness/textures/everness_coral_burdock_2.png differ diff --git a/mods/everness/textures/everness_coral_bush.png b/mods/everness/textures/everness_coral_bush.png new file mode 100644 index 00000000..cd6d4e32 Binary files /dev/null and b/mods/everness/textures/everness_coral_bush.png differ diff --git a/mods/everness/textures/everness_coral_corals.png b/mods/everness/textures/everness_coral_corals.png new file mode 100644 index 00000000..04d4a5c0 Binary files /dev/null and b/mods/everness/textures/everness_coral_corals.png differ diff --git a/mods/everness/textures/everness_coral_desert_cobble.png b/mods/everness/textures/everness_coral_desert_cobble.png new file mode 100644 index 00000000..a3085d9f Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_cobble.png differ diff --git a/mods/everness/textures/everness_coral_desert_mossy_cobble.png b/mods/everness/textures/everness_coral_desert_mossy_cobble.png new file mode 100644 index 00000000..9a836729 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_mossy_cobble.png differ diff --git a/mods/everness/textures/everness_coral_desert_stone.png b/mods/everness/textures/everness_coral_desert_stone.png new file mode 100644 index 00000000..e65571f4 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_stone.png differ diff --git a/mods/everness/textures/everness_coral_desert_stone_block.png b/mods/everness/textures/everness_coral_desert_stone_block.png new file mode 100644 index 00000000..469d3448 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_stone_block.png differ diff --git a/mods/everness/textures/everness_coral_desert_stone_brick.png b/mods/everness/textures/everness_coral_desert_stone_brick.png new file mode 100644 index 00000000..9c66db64 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_stone_brick.png differ diff --git a/mods/everness/textures/everness_coral_dirt.png b/mods/everness/textures/everness_coral_dirt.png new file mode 100644 index 00000000..854c59f8 Binary files /dev/null and b/mods/everness/textures/everness_coral_dirt.png differ diff --git a/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_animated.png b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_animated.png new file mode 100644 index 00000000..b4781c89 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_animated.png differ diff --git a/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_bottom.png b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_bottom.png new file mode 100644 index 00000000..33fb0bad Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_bottom.png differ diff --git a/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_top.png b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_top.png new file mode 100644 index 00000000..24261103 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_top.png differ diff --git a/mods/everness/textures/everness_coral_forest_sun.png b/mods/everness/textures/everness_coral_forest_sun.png new file mode 100644 index 00000000..f00c5331 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_sun.png differ diff --git a/mods/everness/textures/everness_coral_forest_sun_tonemap.png b/mods/everness/textures/everness_coral_forest_sun_tonemap.png new file mode 100644 index 00000000..ed95167e Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_coral_grass.png b/mods/everness/textures/everness_coral_grass.png new file mode 100644 index 00000000..39f664ec Binary files /dev/null and b/mods/everness/textures/everness_coral_grass.png differ diff --git a/mods/everness/textures/everness_coral_grass_1.png b/mods/everness/textures/everness_coral_grass_1.png new file mode 100644 index 00000000..f47503d7 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_1.png differ diff --git a/mods/everness/textures/everness_coral_grass_2.png b/mods/everness/textures/everness_coral_grass_2.png new file mode 100644 index 00000000..92c2dcce Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_2.png differ diff --git a/mods/everness/textures/everness_coral_grass_3.png b/mods/everness/textures/everness_coral_grass_3.png new file mode 100644 index 00000000..6fa6f8c3 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_3.png differ diff --git a/mods/everness/textures/everness_coral_grass_4.png b/mods/everness/textures/everness_coral_grass_4.png new file mode 100644 index 00000000..3166150c Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_4.png differ diff --git a/mods/everness/textures/everness_coral_grass_5.png b/mods/everness/textures/everness_coral_grass_5.png new file mode 100644 index 00000000..8bb46eeb Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_5.png differ diff --git a/mods/everness/textures/everness_coral_grass_globulagus.png b/mods/everness/textures/everness_coral_grass_globulagus.png new file mode 100644 index 00000000..a44be628 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_globulagus.png differ diff --git a/mods/everness/textures/everness_coral_grass_orange.png b/mods/everness/textures/everness_coral_grass_orange.png new file mode 100644 index 00000000..07056085 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_orange.png differ diff --git a/mods/everness/textures/everness_coral_grass_side.png b/mods/everness/textures/everness_coral_grass_side.png new file mode 100644 index 00000000..d6ffe4f7 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_side.png differ diff --git a/mods/everness/textures/everness_coral_grass_tall.png b/mods/everness/textures/everness_coral_grass_tall.png new file mode 100644 index 00000000..deafd7ab Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_tall.png differ diff --git a/mods/everness/textures/everness_coral_jellyfish.png b/mods/everness/textures/everness_coral_jellyfish.png new file mode 100644 index 00000000..7cdd2497 Binary files /dev/null and b/mods/everness/textures/everness_coral_jellyfish.png differ diff --git a/mods/everness/textures/everness_coral_leaves.png b/mods/everness/textures/everness_coral_leaves.png new file mode 100644 index 00000000..33ae883c Binary files /dev/null and b/mods/everness/textures/everness_coral_leaves.png differ diff --git a/mods/everness/textures/everness_coral_mushrooms_bioluminescent.png b/mods/everness/textures/everness_coral_mushrooms_bioluminescent.png new file mode 100644 index 00000000..1f3705be Binary files /dev/null and b/mods/everness/textures/everness_coral_mushrooms_bioluminescent.png differ diff --git a/mods/everness/textures/everness_coral_plant_bioluminescent.png b/mods/everness/textures/everness_coral_plant_bioluminescent.png new file mode 100644 index 00000000..d444a21d Binary files /dev/null and b/mods/everness/textures/everness_coral_plant_bioluminescent.png differ diff --git a/mods/everness/textures/everness_coral_sand.png b/mods/everness/textures/everness_coral_sand.png new file mode 100644 index 00000000..a36eb31b Binary files /dev/null and b/mods/everness/textures/everness_coral_sand.png differ diff --git a/mods/everness/textures/everness_coral_sandstone.png b/mods/everness/textures/everness_coral_sandstone.png new file mode 100644 index 00000000..b9458b89 Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone.png differ diff --git a/mods/everness/textures/everness_coral_sandstone_brick.png b/mods/everness/textures/everness_coral_sandstone_brick.png new file mode 100644 index 00000000..cf29b5bd Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_coral_sandstone_carved_1.png b/mods/everness/textures/everness_coral_sandstone_carved_1.png new file mode 100644 index 00000000..a46c22db Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone_carved_1.png differ diff --git a/mods/everness/textures/everness_coral_sandstone_chiseled.png b/mods/everness/textures/everness_coral_sandstone_chiseled.png new file mode 100644 index 00000000..b5e2a90d Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone_chiseled.png differ diff --git a/mods/everness/textures/everness_coral_shrub.png b/mods/everness/textures/everness_coral_shrub.png new file mode 100644 index 00000000..722cc00c Binary files /dev/null and b/mods/everness/textures/everness_coral_shrub.png differ diff --git a/mods/everness/textures/everness_coral_skeleton.png b/mods/everness/textures/everness_coral_skeleton.png new file mode 100644 index 00000000..9a541400 Binary files /dev/null and b/mods/everness/textures/everness_coral_skeleton.png differ diff --git a/mods/everness/textures/everness_coral_stone_with_moss_side.png b/mods/everness/textures/everness_coral_stone_with_moss_side.png new file mode 100644 index 00000000..821b79b6 Binary files /dev/null and b/mods/everness/textures/everness_coral_stone_with_moss_side.png differ diff --git a/mods/everness/textures/everness_coral_stone_with_moss_top.png b/mods/everness/textures/everness_coral_stone_with_moss_top.png new file mode 100644 index 00000000..2a290088 Binary files /dev/null and b/mods/everness/textures/everness_coral_stone_with_moss_top.png differ diff --git a/mods/everness/textures/everness_coral_tree.png b/mods/everness/textures/everness_coral_tree.png new file mode 100644 index 00000000..61c19214 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree.png differ diff --git a/mods/everness/textures/everness_coral_tree_bioluminescent_sapling.png b/mods/everness/textures/everness_coral_tree_bioluminescent_sapling.png new file mode 100644 index 00000000..25f21212 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree_bioluminescent_sapling.png differ diff --git a/mods/everness/textures/everness_coral_tree_sapling.png b/mods/everness/textures/everness_coral_tree_sapling.png new file mode 100644 index 00000000..6440e686 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree_sapling.png differ diff --git a/mods/everness/textures/everness_coral_white_sand.png b/mods/everness/textures/everness_coral_white_sand.png new file mode 100644 index 00000000..81008462 Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sand.png differ diff --git a/mods/everness/textures/everness_coral_white_sandstone.png b/mods/everness/textures/everness_coral_white_sandstone.png new file mode 100644 index 00000000..c17bdbfa Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sandstone.png differ diff --git a/mods/everness/textures/everness_coral_white_sandstone_brick.png b/mods/everness/textures/everness_coral_white_sandstone_brick.png new file mode 100644 index 00000000..9477ab98 Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_coral_white_sandstone_pillar.png b/mods/everness/textures/everness_coral_white_sandstone_pillar.png new file mode 100644 index 00000000..f79cda25 Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sandstone_pillar.png differ diff --git a/mods/everness/textures/everness_coral_wood.png b/mods/everness/textures/everness_coral_wood.png new file mode 100644 index 00000000..60df5c78 Binary files /dev/null and b/mods/everness/textures/everness_coral_wood.png differ diff --git a/mods/everness/textures/everness_creeping_moss_spores.png b/mods/everness/textures/everness_creeping_moss_spores.png new file mode 100644 index 00000000..672cc162 Binary files /dev/null and b/mods/everness/textures/everness_creeping_moss_spores.png differ diff --git a/mods/everness/textures/everness_crystal_block_cyan.png b/mods/everness/textures/everness_crystal_block_cyan.png new file mode 100644 index 00000000..9a8599fb Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_cyan.png differ diff --git a/mods/everness/textures/everness_crystal_block_cyan_top.png b/mods/everness/textures/everness_crystal_block_cyan_top.png new file mode 100644 index 00000000..cd706978 Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_cyan_top.png differ diff --git a/mods/everness/textures/everness_crystal_block_orange.png b/mods/everness/textures/everness_crystal_block_orange.png new file mode 100644 index 00000000..938893e3 Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_orange.png differ diff --git a/mods/everness/textures/everness_crystal_block_orange_top.png b/mods/everness/textures/everness_crystal_block_orange_top.png new file mode 100644 index 00000000..b21581c1 Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_orange_top.png differ diff --git a/mods/everness/textures/everness_crystal_block_purple.png b/mods/everness/textures/everness_crystal_block_purple.png new file mode 100644 index 00000000..477ff36f Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_purple.png differ diff --git a/mods/everness/textures/everness_crystal_block_purple_top.png b/mods/everness/textures/everness_crystal_block_purple_top.png new file mode 100644 index 00000000..e66b00e8 Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_purple_top.png differ diff --git a/mods/everness/textures/everness_crystal_bush_leaves.png b/mods/everness/textures/everness_crystal_bush_leaves.png new file mode 100644 index 00000000..eee47120 Binary files /dev/null and b/mods/everness/textures/everness_crystal_bush_leaves.png differ diff --git a/mods/everness/textures/everness_crystal_bush_sapling.png b/mods/everness/textures/everness_crystal_bush_sapling.png new file mode 100644 index 00000000..c416d83b Binary files /dev/null and b/mods/everness/textures/everness_crystal_bush_sapling.png differ diff --git a/mods/everness/textures/everness_crystal_bush_stem.png b/mods/everness/textures/everness_crystal_bush_stem.png new file mode 100644 index 00000000..6c144eb2 Binary files /dev/null and b/mods/everness/textures/everness_crystal_bush_stem.png differ diff --git a/mods/everness/textures/everness_crystal_cave_dirt.png b/mods/everness/textures/everness_crystal_cave_dirt.png new file mode 100644 index 00000000..63e7195e Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_dirt.png differ diff --git a/mods/everness/textures/everness_crystal_cave_dirt_side.png b/mods/everness/textures/everness_crystal_cave_dirt_side.png new file mode 100644 index 00000000..bf1c497c Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_dirt_side.png differ diff --git a/mods/everness/textures/everness_crystal_cave_dirt_top.png b/mods/everness/textures/everness_crystal_cave_dirt_top.png new file mode 100644 index 00000000..c8b5a1e5 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_dirt_top.png differ diff --git a/mods/everness/textures/everness_crystal_cave_moss.png b/mods/everness/textures/everness_crystal_cave_moss.png new file mode 100644 index 00000000..d54cc74f Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_moss.png differ diff --git a/mods/everness/textures/everness_crystal_cobble.png b/mods/everness/textures/everness_crystal_cobble.png new file mode 100644 index 00000000..957d8cf9 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cobble.png differ diff --git a/mods/everness/textures/everness_crystal_coral_dark_block.png b/mods/everness/textures/everness_crystal_coral_dark_block.png new file mode 100644 index 00000000..442e22ba Binary files /dev/null and b/mods/everness/textures/everness_crystal_coral_dark_block.png differ diff --git a/mods/everness/textures/everness_crystal_coral_light_block.png b/mods/everness/textures/everness_crystal_coral_light_block.png new file mode 100644 index 00000000..da2a0a1c Binary files /dev/null and b/mods/everness/textures/everness_crystal_coral_light_block.png differ diff --git a/mods/everness/textures/everness_crystal_cyan.png b/mods/everness/textures/everness_crystal_cyan.png new file mode 100644 index 00000000..c8fea2ee Binary files /dev/null and b/mods/everness/textures/everness_crystal_cyan.png differ diff --git a/mods/everness/textures/everness_crystal_dirt.png b/mods/everness/textures/everness_crystal_dirt.png new file mode 100644 index 00000000..4cc3c5b6 Binary files /dev/null and b/mods/everness/textures/everness_crystal_dirt.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_1.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_1.png new file mode 100644 index 00000000..00aae1d1 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_1.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_2.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_2.png new file mode 100644 index 00000000..16fcba8f Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_2.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_3.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_3.png new file mode 100644 index 00000000..b3524fc6 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_3.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_1.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_1.png new file mode 100644 index 00000000..de66c80f Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_1.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_2.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_2.png new file mode 100644 index 00000000..dd3683f1 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_2.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_3.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_3.png new file mode 100644 index 00000000..79ac4428 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_3.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sand.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand.png new file mode 100644 index 00000000..d4fa1647 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_bubbles.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_bubbles.png new file mode 100644 index 00000000..8fa03d75 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_bubbles.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_with_crack.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_with_crack.png new file mode 100644 index 00000000..20930c54 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_with_crack.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_block.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_block.png new file mode 100644 index 00000000..f0e5cdeb Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_block.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_brick.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_brick.png new file mode 100644 index 00000000..8126b459 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_crystal_forest_moon.png b/mods/everness/textures/everness_crystal_forest_moon.png new file mode 100644 index 00000000..3331ead5 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_moon.png differ diff --git a/mods/everness/textures/everness_crystal_forest_moon_tonemap.png b/mods/everness/textures/everness_crystal_forest_moon_tonemap.png new file mode 100644 index 00000000..437fcf7a Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_moon_tonemap.png differ diff --git a/mods/everness/textures/everness_crystal_forest_sun.png b/mods/everness/textures/everness_crystal_forest_sun.png new file mode 100644 index 00000000..b33167b7 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_sun.png differ diff --git a/mods/everness/textures/everness_crystal_forest_sun_tonemap.png b/mods/everness/textures/everness_crystal_forest_sun_tonemap.png new file mode 100644 index 00000000..70afecba Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_crystal_grass.png b/mods/everness/textures/everness_crystal_grass.png new file mode 100644 index 00000000..b7345caa Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass.png differ diff --git a/mods/everness/textures/everness_crystal_grass_1.png b/mods/everness/textures/everness_crystal_grass_1.png new file mode 100644 index 00000000..43cf9a28 Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_1.png differ diff --git a/mods/everness/textures/everness_crystal_grass_2.png b/mods/everness/textures/everness_crystal_grass_2.png new file mode 100644 index 00000000..386f57ac Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_2.png differ diff --git a/mods/everness/textures/everness_crystal_grass_3.png b/mods/everness/textures/everness_crystal_grass_3.png new file mode 100644 index 00000000..fd8748ff Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_3.png differ diff --git a/mods/everness/textures/everness_crystal_grass_side.png b/mods/everness/textures/everness_crystal_grass_side.png new file mode 100644 index 00000000..a0f91f8e Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_side.png differ diff --git a/mods/everness/textures/everness_crystal_leaves.png b/mods/everness/textures/everness_crystal_leaves.png new file mode 100644 index 00000000..226efc03 Binary files /dev/null and b/mods/everness/textures/everness_crystal_leaves.png differ diff --git a/mods/everness/textures/everness_crystal_lily_flower_small.png b/mods/everness/textures/everness_crystal_lily_flower_small.png new file mode 100644 index 00000000..22c52175 Binary files /dev/null and b/mods/everness/textures/everness_crystal_lily_flower_small.png differ diff --git a/mods/everness/textures/everness_crystal_lily_leaf_small.png b/mods/everness/textures/everness_crystal_lily_leaf_small.png new file mode 100644 index 00000000..b4a3bbef Binary files /dev/null and b/mods/everness/textures/everness_crystal_lily_leaf_small.png differ diff --git a/mods/everness/textures/everness_crystal_mossy_cobble.png b/mods/everness/textures/everness_crystal_mossy_cobble.png new file mode 100644 index 00000000..2e42e5a9 Binary files /dev/null and b/mods/everness/textures/everness_crystal_mossy_cobble.png differ diff --git a/mods/everness/textures/everness_crystal_mushrooms.png b/mods/everness/textures/everness_crystal_mushrooms.png new file mode 100644 index 00000000..3528e36d Binary files /dev/null and b/mods/everness/textures/everness_crystal_mushrooms.png differ diff --git a/mods/everness/textures/everness_crystal_orange.png b/mods/everness/textures/everness_crystal_orange.png new file mode 100644 index 00000000..eedae91d Binary files /dev/null and b/mods/everness/textures/everness_crystal_orange.png differ diff --git a/mods/everness/textures/everness_crystal_purple.png b/mods/everness/textures/everness_crystal_purple.png new file mode 100644 index 00000000..bce95b64 Binary files /dev/null and b/mods/everness/textures/everness_crystal_purple.png differ diff --git a/mods/everness/textures/everness_crystal_sand.png b/mods/everness/textures/everness_crystal_sand.png new file mode 100644 index 00000000..614af515 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sand.png differ diff --git a/mods/everness/textures/everness_crystal_sandstone.png b/mods/everness/textures/everness_crystal_sandstone.png new file mode 100644 index 00000000..05e5afc5 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sandstone.png differ diff --git a/mods/everness/textures/everness_crystal_sandstone_brick.png b/mods/everness/textures/everness_crystal_sandstone_brick.png new file mode 100644 index 00000000..8f844284 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_crystal_sandstone_chiseled.png b/mods/everness/textures/everness_crystal_sandstone_chiseled.png new file mode 100644 index 00000000..908ce938 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sandstone_chiseled.png differ diff --git a/mods/everness/textures/everness_crystal_stone.png b/mods/everness/textures/everness_crystal_stone.png new file mode 100644 index 00000000..a57d060c Binary files /dev/null and b/mods/everness/textures/everness_crystal_stone.png differ diff --git a/mods/everness/textures/everness_crystal_stone_brick.png b/mods/everness/textures/everness_crystal_stone_brick.png new file mode 100644 index 00000000..aa19ecf7 Binary files /dev/null and b/mods/everness/textures/everness_crystal_stone_brick.png differ diff --git a/mods/everness/textures/everness_crystal_tree.png b/mods/everness/textures/everness_crystal_tree.png new file mode 100644 index 00000000..8b6c8b58 Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree.png differ diff --git a/mods/everness/textures/everness_crystal_tree_large_sapling.png b/mods/everness/textures/everness_crystal_tree_large_sapling.png new file mode 100644 index 00000000..97d45ed3 Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree_large_sapling.png differ diff --git a/mods/everness/textures/everness_crystal_tree_sapling.png b/mods/everness/textures/everness_crystal_tree_sapling.png new file mode 100644 index 00000000..a9d2da7e Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree_sapling.png differ diff --git a/mods/everness/textures/everness_crystal_tree_top.png b/mods/everness/textures/everness_crystal_tree_top.png new file mode 100644 index 00000000..509af61f Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree_top.png differ diff --git a/mods/everness/textures/everness_crystal_wood.png b/mods/everness/textures/everness_crystal_wood.png new file mode 100644 index 00000000..62050c7e Binary files /dev/null and b/mods/everness/textures/everness_crystal_wood.png differ diff --git a/mods/everness/textures/everness_cursed_bar.png b/mods/everness/textures/everness_cursed_bar.png new file mode 100644 index 00000000..a40c661d Binary files /dev/null and b/mods/everness/textures/everness_cursed_bar.png differ diff --git a/mods/everness/textures/everness_cursed_bar_top.png b/mods/everness/textures/everness_cursed_bar_top.png new file mode 100644 index 00000000..8230e883 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bar_top.png differ diff --git a/mods/everness/textures/everness_cursed_brick.png b/mods/everness/textures/everness_cursed_brick.png new file mode 100644 index 00000000..b3a085f4 Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick.png differ diff --git a/mods/everness/textures/everness_cursed_brick_carved.png b/mods/everness/textures/everness_cursed_brick_carved.png new file mode 100644 index 00000000..2beba646 Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick_carved.png differ diff --git a/mods/everness/textures/everness_cursed_brick_mixed.png b/mods/everness/textures/everness_cursed_brick_mixed.png new file mode 100644 index 00000000..251bfb1a Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick_mixed.png differ diff --git a/mods/everness/textures/everness_cursed_brick_with_growth.png b/mods/everness/textures/everness_cursed_brick_with_growth.png new file mode 100644 index 00000000..e16a26e8 Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick_with_growth.png differ diff --git a/mods/everness/textures/everness_cursed_bush_leaves.png b/mods/everness/textures/everness_cursed_bush_leaves.png new file mode 100644 index 00000000..510f0eb9 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bush_leaves.png differ diff --git a/mods/everness/textures/everness_cursed_bush_sapling.png b/mods/everness/textures/everness_cursed_bush_sapling.png new file mode 100644 index 00000000..55c4c06e Binary files /dev/null and b/mods/everness/textures/everness_cursed_bush_sapling.png differ diff --git a/mods/everness/textures/everness_cursed_bush_stem.png b/mods/everness/textures/everness_cursed_bush_stem.png new file mode 100644 index 00000000..8b82ab12 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bush_stem.png differ diff --git a/mods/everness/textures/everness_cursed_dirt.png b/mods/everness/textures/everness_cursed_dirt.png new file mode 100644 index 00000000..c6085fbc Binary files /dev/null and b/mods/everness/textures/everness_cursed_dirt.png differ diff --git a/mods/everness/textures/everness_cursed_dream_stone.png b/mods/everness/textures/everness_cursed_dream_stone.png new file mode 100644 index 00000000..f32c6c8b Binary files /dev/null and b/mods/everness/textures/everness_cursed_dream_stone.png differ diff --git a/mods/everness/textures/everness_cursed_dream_tree_sapling.png b/mods/everness/textures/everness_cursed_dream_tree_sapling.png new file mode 100644 index 00000000..ebe7388e Binary files /dev/null and b/mods/everness/textures/everness_cursed_dream_tree_sapling.png differ diff --git a/mods/everness/textures/everness_cursed_dry_pine_leaves.png b/mods/everness/textures/everness_cursed_dry_pine_leaves.png new file mode 100644 index 00000000..3b7a16e6 Binary files /dev/null and b/mods/everness/textures/everness_cursed_dry_pine_leaves.png differ diff --git a/mods/everness/textures/everness_cursed_grass.png b/mods/everness/textures/everness_cursed_grass.png new file mode 100644 index 00000000..0b1762df Binary files /dev/null and b/mods/everness/textures/everness_cursed_grass.png differ diff --git a/mods/everness/textures/everness_cursed_grass_side.png b/mods/everness/textures/everness_cursed_grass_side.png new file mode 100644 index 00000000..e9fed197 Binary files /dev/null and b/mods/everness/textures/everness_cursed_grass_side.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_alcyonacea.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_alcyonacea.png new file mode 100644 index 00000000..b8bf9da3 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_alcyonacea.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_anemone.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_anemone.png new file mode 100644 index 00000000..571775d0 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_anemone.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_darkilluma.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_darkilluma.png new file mode 100644 index 00000000..c0ec4f41 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_darkilluma.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_demon.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_demon.png new file mode 100644 index 00000000..41a0a885 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_demon.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_octocurse.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_octocurse.png new file mode 100644 index 00000000..a3cac629 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_octocurse.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_ostracod.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_ostracod.png new file mode 100644 index 00000000..b04681ee Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_ostracod.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sand.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand.png new file mode 100644 index 00000000..59c6bd7c Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_brick.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_brick.png new file mode 100644 index 00000000..3a685b2d Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_brick.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_with_crack.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_with_crack.png new file mode 100644 index 00000000..6c437437 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_with_crack.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sandblock.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sandblock.png new file mode 100644 index 00000000..16a236f2 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sandblock.png differ diff --git a/mods/everness/textures/everness_cursed_lands_moon.png b/mods/everness/textures/everness_cursed_lands_moon.png new file mode 100644 index 00000000..703492a9 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_moon.png differ diff --git a/mods/everness/textures/everness_cursed_lands_moon_tonemap.png b/mods/everness/textures/everness_cursed_lands_moon_tonemap.png new file mode 100644 index 00000000..388de379 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_moon_tonemap.png differ diff --git a/mods/everness/textures/everness_cursed_lands_sun.png b/mods/everness/textures/everness_cursed_lands_sun.png new file mode 100644 index 00000000..614f6bfb Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_sun.png differ diff --git a/mods/everness/textures/everness_cursed_lands_sun_tonemap.png b/mods/everness/textures/everness_cursed_lands_sun_tonemap.png new file mode 100644 index 00000000..2eb1178e Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_cursed_lands_sunrisebg.png b/mods/everness/textures/everness_cursed_lands_sunrisebg.png new file mode 100644 index 00000000..2c845cb8 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_sunrisebg.png differ diff --git a/mods/everness/textures/everness_cursed_mud.png b/mods/everness/textures/everness_cursed_mud.png new file mode 100644 index 00000000..18002ffd Binary files /dev/null and b/mods/everness/textures/everness_cursed_mud.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_bottom.png b/mods/everness/textures/everness_cursed_pumpkin_bottom.png new file mode 100644 index 00000000..477b4d65 Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_bottom.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_front.png b/mods/everness/textures/everness_cursed_pumpkin_front.png new file mode 100644 index 00000000..ce7f1360 Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_front.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_side.png b/mods/everness/textures/everness_cursed_pumpkin_side.png new file mode 100644 index 00000000..3b0df674 Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_side.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_top.png b/mods/everness/textures/everness_cursed_pumpkin_top.png new file mode 100644 index 00000000..3e2815fd Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_top.png differ diff --git a/mods/everness/textures/everness_cursed_sand.png b/mods/everness/textures/everness_cursed_sand.png new file mode 100644 index 00000000..eadbb034 Binary files /dev/null and b/mods/everness/textures/everness_cursed_sand.png differ diff --git a/mods/everness/textures/everness_cursed_sandstone_block.png b/mods/everness/textures/everness_cursed_sandstone_block.png new file mode 100644 index 00000000..a3686e34 Binary files /dev/null and b/mods/everness/textures/everness_cursed_sandstone_block.png differ diff --git a/mods/everness/textures/everness_cursed_sandstone_brick.png b/mods/everness/textures/everness_cursed_sandstone_brick.png new file mode 100644 index 00000000..4973cc6a Binary files /dev/null and b/mods/everness/textures/everness_cursed_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_cursed_stone.png b/mods/everness/textures/everness_cursed_stone.png new file mode 100644 index 00000000..91d9b333 Binary files /dev/null and b/mods/everness/textures/everness_cursed_stone.png differ diff --git a/mods/everness/textures/everness_cursed_stone_carved.png b/mods/everness/textures/everness_cursed_stone_carved.png new file mode 100644 index 00000000..58364bf3 Binary files /dev/null and b/mods/everness/textures/everness_cursed_stone_carved.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_1.png b/mods/everness/textures/everness_deep_ocean_coral_1.png new file mode 100644 index 00000000..3a2859c6 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_1.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_2.png b/mods/everness/textures/everness_deep_ocean_coral_2.png new file mode 100644 index 00000000..b027e96b Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_2.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_3.png b/mods/everness/textures/everness_deep_ocean_coral_3.png new file mode 100644 index 00000000..e8a3ba1b Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_3.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_4.png b/mods/everness/textures/everness_deep_ocean_coral_4.png new file mode 100644 index 00000000..7c5ca471 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_4.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_plant_1.png b/mods/everness/textures/everness_deep_ocean_coral_plant_1.png new file mode 100644 index 00000000..5d6ab4f7 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_plant_1.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_plant_2.png b/mods/everness/textures/everness_deep_ocean_coral_plant_2.png new file mode 100644 index 00000000..c49c9a44 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_plant_2.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_plant_3.png b/mods/everness/textures/everness_deep_ocean_coral_plant_3.png new file mode 100644 index 00000000..f4bf2a75 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_plant_3.png differ diff --git a/mods/everness/textures/everness_deep_ocean_sand.png b/mods/everness/textures/everness_deep_ocean_sand.png new file mode 100644 index 00000000..2e830752 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_sand.png differ diff --git a/mods/everness/textures/everness_deep_ocean_sandstone_block.png b/mods/everness/textures/everness_deep_ocean_sandstone_block.png new file mode 100644 index 00000000..57e9eabb Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_sandstone_block.png differ diff --git a/mods/everness/textures/everness_deep_ocean_sandstone_brick.png b/mods/everness/textures/everness_deep_ocean_sandstone_brick.png new file mode 100644 index 00000000..2db2db2f Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_dense_emerald_ice.png b/mods/everness/textures/everness_dense_emerald_ice.png new file mode 100644 index 00000000..958191d0 Binary files /dev/null and b/mods/everness/textures/everness_dense_emerald_ice.png differ diff --git a/mods/everness/textures/everness_dense_vine_1.png b/mods/everness/textures/everness_dense_vine_1.png new file mode 100644 index 00000000..6714bd76 Binary files /dev/null and b/mods/everness/textures/everness_dense_vine_1.png differ diff --git a/mods/everness/textures/everness_dense_vine_2.png b/mods/everness/textures/everness_dense_vine_2.png new file mode 100644 index 00000000..db4af1b7 Binary files /dev/null and b/mods/everness/textures/everness_dense_vine_2.png differ diff --git a/mods/everness/textures/everness_dense_vine_end.png b/mods/everness/textures/everness_dense_vine_end.png new file mode 100644 index 00000000..67479275 Binary files /dev/null and b/mods/everness/textures/everness_dense_vine_end.png differ diff --git a/mods/everness/textures/everness_dirt.png b/mods/everness/textures/everness_dirt.png new file mode 100644 index 00000000..1c226397 Binary files /dev/null and b/mods/everness/textures/everness_dirt.png differ diff --git a/mods/everness/textures/everness_door_bamboo.png b/mods/everness/textures/everness_door_bamboo.png new file mode 100644 index 00000000..58e218dd Binary files /dev/null and b/mods/everness/textures/everness_door_bamboo.png differ diff --git a/mods/everness/textures/everness_door_bamboo_item.png b/mods/everness/textures/everness_door_bamboo_item.png new file mode 100644 index 00000000..7d8e02c9 Binary files /dev/null and b/mods/everness/textures/everness_door_bamboo_item.png differ diff --git a/mods/everness/textures/everness_door_bone_pyrite.png b/mods/everness/textures/everness_door_bone_pyrite.png new file mode 100644 index 00000000..fa18a1b8 Binary files /dev/null and b/mods/everness/textures/everness_door_bone_pyrite.png differ diff --git a/mods/everness/textures/everness_door_bone_pyrite_item.png b/mods/everness/textures/everness_door_bone_pyrite_item.png new file mode 100644 index 00000000..31618ee4 Binary files /dev/null and b/mods/everness/textures/everness_door_bone_pyrite_item.png differ diff --git a/mods/everness/textures/everness_door_crystal_wood.png b/mods/everness/textures/everness_door_crystal_wood.png new file mode 100644 index 00000000..fc2c3061 Binary files /dev/null and b/mods/everness/textures/everness_door_crystal_wood.png differ diff --git a/mods/everness/textures/everness_door_crystal_wood_item.png b/mods/everness/textures/everness_door_crystal_wood_item.png new file mode 100644 index 00000000..1d7bf500 Binary files /dev/null and b/mods/everness/textures/everness_door_crystal_wood_item.png differ diff --git a/mods/everness/textures/everness_door_cursed_steel_bar.png b/mods/everness/textures/everness_door_cursed_steel_bar.png new file mode 100644 index 00000000..303b9509 Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_steel_bar.png differ diff --git a/mods/everness/textures/everness_door_cursed_steel_bar_item.png b/mods/everness/textures/everness_door_cursed_steel_bar_item.png new file mode 100644 index 00000000..af539fb9 Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_steel_bar_item.png differ diff --git a/mods/everness/textures/everness_door_cursed_wood.png b/mods/everness/textures/everness_door_cursed_wood.png new file mode 100644 index 00000000..f559b9ba Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_wood.png differ diff --git a/mods/everness/textures/everness_door_cursed_wood_item.png b/mods/everness/textures/everness_door_cursed_wood_item.png new file mode 100644 index 00000000..bcc6ecb3 Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_wood_item.png differ diff --git a/mods/everness/textures/everness_door_lava_tree_wood.png b/mods/everness/textures/everness_door_lava_tree_wood.png new file mode 100644 index 00000000..1cfac4bd Binary files /dev/null and b/mods/everness/textures/everness_door_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_door_lava_tree_wood_item.png b/mods/everness/textures/everness_door_lava_tree_wood_item.png new file mode 100644 index 00000000..a3450aaa Binary files /dev/null and b/mods/everness/textures/everness_door_lava_tree_wood_item.png differ diff --git a/mods/everness/textures/everness_door_palm_wood.png b/mods/everness/textures/everness_door_palm_wood.png new file mode 100644 index 00000000..9a9499fc Binary files /dev/null and b/mods/everness/textures/everness_door_palm_wood.png differ diff --git a/mods/everness/textures/everness_door_palm_wood_item.png b/mods/everness/textures/everness_door_palm_wood_item.png new file mode 100644 index 00000000..f553aa25 Binary files /dev/null and b/mods/everness/textures/everness_door_palm_wood_item.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_bamboo.png b/mods/everness/textures/everness_door_trapdoor_bamboo.png new file mode 100644 index 00000000..49586573 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_bamboo.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_bamboo_side.png b/mods/everness/textures/everness_door_trapdoor_bamboo_side.png new file mode 100644 index 00000000..9d4d8191 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_bamboo_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_crystal_wood.png b/mods/everness/textures/everness_door_trapdoor_crystal_wood.png new file mode 100644 index 00000000..5e2e605f Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_crystal_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_crystal_wood_side.png b/mods/everness/textures/everness_door_trapdoor_crystal_wood_side.png new file mode 100644 index 00000000..6d152524 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_crystal_wood_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_cursed_wood.png b/mods/everness/textures/everness_door_trapdoor_cursed_wood.png new file mode 100644 index 00000000..b2a4d622 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_cursed_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_cursed_wood_side.png b/mods/everness/textures/everness_door_trapdoor_cursed_wood_side.png new file mode 100644 index 00000000..c355e447 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_cursed_wood_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_lava_tree_wood.png b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood.png new file mode 100644 index 00000000..99d35227 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_lava_tree_wood_side.png b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood_side.png new file mode 100644 index 00000000..ca1719b3 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_palm_wood.png b/mods/everness/textures/everness_door_trapdoor_palm_wood.png new file mode 100644 index 00000000..17ea6c66 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_palm_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_palm_wood_side.png b/mods/everness/textures/everness_door_trapdoor_palm_wood_side.png new file mode 100644 index 00000000..6e96c4d8 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_palm_wood_side.png differ diff --git a/mods/everness/textures/everness_door_willow.png b/mods/everness/textures/everness_door_willow.png new file mode 100644 index 00000000..fd73c895 Binary files /dev/null and b/mods/everness/textures/everness_door_willow.png differ diff --git a/mods/everness/textures/everness_door_willow_item.png b/mods/everness/textures/everness_door_willow_item.png new file mode 100644 index 00000000..d59abda9 Binary files /dev/null and b/mods/everness/textures/everness_door_willow_item.png differ diff --git a/mods/everness/textures/everness_dry_bamboo_block_side.png b/mods/everness/textures/everness_dry_bamboo_block_side.png new file mode 100644 index 00000000..da19f4fb Binary files /dev/null and b/mods/everness/textures/everness_dry_bamboo_block_side.png differ diff --git a/mods/everness/textures/everness_dry_bamboo_block_top.png b/mods/everness/textures/everness_dry_bamboo_block_top.png new file mode 100644 index 00000000..40632f4d Binary files /dev/null and b/mods/everness/textures/everness_dry_bamboo_block_top.png differ diff --git a/mods/everness/textures/everness_dry_branches.png b/mods/everness/textures/everness_dry_branches.png new file mode 100644 index 00000000..9ee26a58 Binary files /dev/null and b/mods/everness/textures/everness_dry_branches.png differ diff --git a/mods/everness/textures/everness_dry_dirt.png b/mods/everness/textures/everness_dry_dirt.png new file mode 100644 index 00000000..5bd5a115 Binary files /dev/null and b/mods/everness/textures/everness_dry_dirt.png differ diff --git a/mods/everness/textures/everness_dry_grass_1.png b/mods/everness/textures/everness_dry_grass_1.png new file mode 100644 index 00000000..4c69f61d Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_1.png differ diff --git a/mods/everness/textures/everness_dry_grass_2.png b/mods/everness/textures/everness_dry_grass_2.png new file mode 100644 index 00000000..52504bf9 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_2.png differ diff --git a/mods/everness/textures/everness_dry_grass_3.png b/mods/everness/textures/everness_dry_grass_3.png new file mode 100644 index 00000000..b8403820 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_3.png differ diff --git a/mods/everness/textures/everness_dry_grass_4.png b/mods/everness/textures/everness_dry_grass_4.png new file mode 100644 index 00000000..32d5ad5f Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_4.png differ diff --git a/mods/everness/textures/everness_dry_grass_side.png b/mods/everness/textures/everness_dry_grass_side.png new file mode 100644 index 00000000..2bcc742d Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_side.png differ diff --git a/mods/everness/textures/everness_dry_grass_top.png b/mods/everness/textures/everness_dry_grass_top.png new file mode 100644 index 00000000..8b0e4f1b Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_top.png differ diff --git a/mods/everness/textures/everness_dry_tree.png b/mods/everness/textures/everness_dry_tree.png new file mode 100644 index 00000000..0b9a5d8e Binary files /dev/null and b/mods/everness/textures/everness_dry_tree.png differ diff --git a/mods/everness/textures/everness_dry_tree_sapling.png b/mods/everness/textures/everness_dry_tree_sapling.png new file mode 100644 index 00000000..7637fa39 Binary files /dev/null and b/mods/everness/textures/everness_dry_tree_sapling.png differ diff --git a/mods/everness/textures/everness_dry_tree_top.png b/mods/everness/textures/everness_dry_tree_top.png new file mode 100644 index 00000000..06577002 Binary files /dev/null and b/mods/everness/textures/everness_dry_tree_top.png differ diff --git a/mods/everness/textures/everness_dry_wood.png b/mods/everness/textures/everness_dry_wood.png new file mode 100644 index 00000000..4998783f Binary files /dev/null and b/mods/everness/textures/everness_dry_wood.png differ diff --git a/mods/everness/textures/everness_egg_plant_bottom.png b/mods/everness/textures/everness_egg_plant_bottom.png new file mode 100644 index 00000000..74f39449 Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_bottom.png differ diff --git a/mods/everness/textures/everness_egg_plant_item.png b/mods/everness/textures/everness_egg_plant_item.png new file mode 100644 index 00000000..ed51a3cf Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_item.png differ diff --git a/mods/everness/textures/everness_egg_plant_side.png b/mods/everness/textures/everness_egg_plant_side.png new file mode 100644 index 00000000..8eb1a782 Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_side.png differ diff --git a/mods/everness/textures/everness_egg_plant_top.png b/mods/everness/textures/everness_egg_plant_top.png new file mode 100644 index 00000000..c36f4f20 Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_top.png differ diff --git a/mods/everness/textures/everness_emerald_ice.png b/mods/everness/textures/everness_emerald_ice.png new file mode 100644 index 00000000..413fe0ff Binary files /dev/null and b/mods/everness/textures/everness_emerald_ice.png differ diff --git a/mods/everness/textures/everness_eye_vine_1.png b/mods/everness/textures/everness_eye_vine_1.png new file mode 100644 index 00000000..9f5a579a Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_1.png differ diff --git a/mods/everness/textures/everness_eye_vine_2.png b/mods/everness/textures/everness_eye_vine_2.png new file mode 100644 index 00000000..a14d3c42 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_2.png differ diff --git a/mods/everness/textures/everness_eye_vine_end_bottom.png b/mods/everness/textures/everness_eye_vine_end_bottom.png new file mode 100644 index 00000000..eb774119 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_end_bottom.png differ diff --git a/mods/everness/textures/everness_eye_vine_end_side.png b/mods/everness/textures/everness_eye_vine_end_side.png new file mode 100644 index 00000000..bdda94d4 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_end_side.png differ diff --git a/mods/everness/textures/everness_eye_vine_end_top.png b/mods/everness/textures/everness_eye_vine_end_top.png new file mode 100644 index 00000000..9dea5050 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_end_top.png differ diff --git a/mods/everness/textures/everness_farming_soil_overlay.png b/mods/everness/textures/everness_farming_soil_overlay.png new file mode 100644 index 00000000..6a38a128 Binary files /dev/null and b/mods/everness/textures/everness_farming_soil_overlay.png differ diff --git a/mods/everness/textures/everness_farming_soil_wet_overlay.png b/mods/everness/textures/everness_farming_soil_wet_overlay.png new file mode 100644 index 00000000..63791b7b Binary files /dev/null and b/mods/everness/textures/everness_farming_soil_wet_overlay.png differ diff --git a/mods/everness/textures/everness_farming_soil_wet_side_overlay.png b/mods/everness/textures/everness_farming_soil_wet_side_overlay.png new file mode 100644 index 00000000..33aa8935 Binary files /dev/null and b/mods/everness/textures/everness_farming_soil_wet_side_overlay.png differ diff --git a/mods/everness/textures/everness_fence_bamboo_wood.png b/mods/everness/textures/everness_fence_bamboo_wood.png new file mode 100644 index 00000000..31d907d0 Binary files /dev/null and b/mods/everness/textures/everness_fence_bamboo_wood.png differ diff --git a/mods/everness/textures/everness_fence_coral_wood.png b/mods/everness/textures/everness_fence_coral_wood.png new file mode 100644 index 00000000..71a5b1d0 Binary files /dev/null and b/mods/everness/textures/everness_fence_coral_wood.png differ diff --git a/mods/everness/textures/everness_fence_crystal_wood.png b/mods/everness/textures/everness_fence_crystal_wood.png new file mode 100644 index 00000000..9d960af8 Binary files /dev/null and b/mods/everness/textures/everness_fence_crystal_wood.png differ diff --git a/mods/everness/textures/everness_fence_dry_wood.png b/mods/everness/textures/everness_fence_dry_wood.png new file mode 100644 index 00000000..c23b6d8f Binary files /dev/null and b/mods/everness/textures/everness_fence_dry_wood.png differ diff --git a/mods/everness/textures/everness_fence_lava_tree_wood.png b/mods/everness/textures/everness_fence_lava_tree_wood.png new file mode 100644 index 00000000..27afd413 Binary files /dev/null and b/mods/everness/textures/everness_fence_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_fence_palm_wood.png b/mods/everness/textures/everness_fence_palm_wood.png new file mode 100644 index 00000000..596605d7 Binary files /dev/null and b/mods/everness/textures/everness_fence_palm_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_bamboo_wood.png b/mods/everness/textures/everness_fence_rail_bamboo_wood.png new file mode 100644 index 00000000..6cd42a0e Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_bamboo_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_coral_wood.png b/mods/everness/textures/everness_fence_rail_coral_wood.png new file mode 100644 index 00000000..c362c024 Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_coral_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_crystal_wood.png b/mods/everness/textures/everness_fence_rail_crystal_wood.png new file mode 100644 index 00000000..7dba1b3e Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_crystal_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_dry_wood.png b/mods/everness/textures/everness_fence_rail_dry_wood.png new file mode 100644 index 00000000..9ea22b55 Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_dry_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_lava_tree_wood.png b/mods/everness/textures/everness_fence_rail_lava_tree_wood.png new file mode 100644 index 00000000..c1a1ceea Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_palm_wood.png b/mods/everness/textures/everness_fence_rail_palm_wood.png new file mode 100644 index 00000000..21339afb Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_palm_wood.png differ diff --git a/mods/everness/textures/everness_fire_animated.png b/mods/everness/textures/everness_fire_animated.png new file mode 100644 index 00000000..046e5ba8 Binary files /dev/null and b/mods/everness/textures/everness_fire_animated.png differ diff --git a/mods/everness/textures/everness_flame_particle.png b/mods/everness/textures/everness_flame_particle.png new file mode 100644 index 00000000..5f9d72d7 Binary files /dev/null and b/mods/everness/textures/everness_flame_particle.png differ diff --git a/mods/everness/textures/everness_flame_permanent.png b/mods/everness/textures/everness_flame_permanent.png new file mode 100644 index 00000000..a5f857d5 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent.png differ diff --git a/mods/everness/textures/everness_flame_permanent_blue.png b/mods/everness/textures/everness_flame_permanent_blue.png new file mode 100644 index 00000000..8fa03382 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_blue.png differ diff --git a/mods/everness/textures/everness_flame_permanent_blue_item.png b/mods/everness/textures/everness_flame_permanent_blue_item.png new file mode 100644 index 00000000..caf90b79 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_blue_item.png differ diff --git a/mods/everness/textures/everness_flame_permanent_item.png b/mods/everness/textures/everness_flame_permanent_item.png new file mode 100644 index 00000000..20b637c0 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_item.png differ diff --git a/mods/everness/textures/everness_flame_permanent_purple.png b/mods/everness/textures/everness_flame_permanent_purple.png new file mode 100644 index 00000000..1c2cb2ac Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_purple.png differ diff --git a/mods/everness/textures/everness_flame_permanent_purple_item.png b/mods/everness/textures/everness_flame_permanent_purple_item.png new file mode 100644 index 00000000..ac2343b0 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_purple_item.png differ diff --git a/mods/everness/textures/everness_floating_crystal_animated.png b/mods/everness/textures/everness_floating_crystal_animated.png new file mode 100644 index 00000000..00665ac7 Binary files /dev/null and b/mods/everness/textures/everness_floating_crystal_animated.png differ diff --git a/mods/everness/textures/everness_flowered_vine_1.png b/mods/everness/textures/everness_flowered_vine_1.png new file mode 100644 index 00000000..214e236c Binary files /dev/null and b/mods/everness/textures/everness_flowered_vine_1.png differ diff --git a/mods/everness/textures/everness_flowered_vine_2.png b/mods/everness/textures/everness_flowered_vine_2.png new file mode 100644 index 00000000..26711892 Binary files /dev/null and b/mods/everness/textures/everness_flowered_vine_2.png differ diff --git a/mods/everness/textures/everness_flowered_vine_end.png b/mods/everness/textures/everness_flowered_vine_end.png new file mode 100644 index 00000000..2c7a7e95 Binary files /dev/null and b/mods/everness/textures/everness_flowered_vine_end.png differ diff --git a/mods/everness/textures/everness_flowers.png b/mods/everness/textures/everness_flowers.png new file mode 100644 index 00000000..f142aa0b Binary files /dev/null and b/mods/everness/textures/everness_flowers.png differ diff --git a/mods/everness/textures/everness_flowers_magenta.png b/mods/everness/textures/everness_flowers_magenta.png new file mode 100644 index 00000000..46523fec Binary files /dev/null and b/mods/everness/textures/everness_flowers_magenta.png differ diff --git a/mods/everness/textures/everness_flowers_magenta_side_x.png b/mods/everness/textures/everness_flowers_magenta_side_x.png new file mode 100644 index 00000000..b180cc7d Binary files /dev/null and b/mods/everness/textures/everness_flowers_magenta_side_x.png differ diff --git a/mods/everness/textures/everness_flowers_magenta_side_z.png b/mods/everness/textures/everness_flowers_magenta_side_z.png new file mode 100644 index 00000000..6cfdbc53 Binary files /dev/null and b/mods/everness/textures/everness_flowers_magenta_side_z.png differ diff --git a/mods/everness/textures/everness_flowers_side_x.png b/mods/everness/textures/everness_flowers_side_x.png new file mode 100644 index 00000000..674e02ce Binary files /dev/null and b/mods/everness/textures/everness_flowers_side_x.png differ diff --git a/mods/everness/textures/everness_flowers_side_z.png b/mods/everness/textures/everness_flowers_side_z.png new file mode 100644 index 00000000..6e3a45a5 Binary files /dev/null and b/mods/everness/textures/everness_flowers_side_z.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_brick.png b/mods/everness/textures/everness_forsaken_desert_brick.png new file mode 100644 index 00000000..0a67cf22 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_brick.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_brick_red.png b/mods/everness/textures/everness_forsaken_desert_brick_red.png new file mode 100644 index 00000000..cf57a2ed Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_brick_red.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_chiseled_stone_bottom.png b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_bottom.png new file mode 100644 index 00000000..244b4c17 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_bottom.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_chiseled_stone_side.png b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_side.png new file mode 100644 index 00000000..177c9eb5 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_side.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_chiseled_stone_top.png b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_top.png new file mode 100644 index 00000000..7fb7da23 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_top.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_cobble.png b/mods/everness/textures/everness_forsaken_desert_cobble.png new file mode 100644 index 00000000..a3700049 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_cobble.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_cobble_red.png b/mods/everness/textures/everness_forsaken_desert_cobble_red.png new file mode 100644 index 00000000..c61cf205 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_cobble_red.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_dry_ocean_dirt.png b/mods/everness/textures/everness_forsaken_desert_dry_ocean_dirt.png new file mode 100644 index 00000000..54954e1c Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_dry_ocean_dirt.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_engraved_stone.png b/mods/everness/textures/everness_forsaken_desert_engraved_stone.png new file mode 100644 index 00000000..dc2f9aa8 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_engraved_stone.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_plant_1.png b/mods/everness/textures/everness_forsaken_desert_plant_1.png new file mode 100644 index 00000000..2c7844ed Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_plant_1.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_plant_2.png b/mods/everness/textures/everness_forsaken_desert_plant_2.png new file mode 100644 index 00000000..70777422 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_plant_2.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_plant_3.png b/mods/everness/textures/everness_forsaken_desert_plant_3.png new file mode 100644 index 00000000..a9f52584 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_plant_3.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_sand.png b/mods/everness/textures/everness_forsaken_desert_sand.png new file mode 100644 index 00000000..9b1e1d5c Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_sand.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_stone.png b/mods/everness/textures/everness_forsaken_desert_stone.png new file mode 100644 index 00000000..b326f299 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_stone.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_sun.png b/mods/everness/textures/everness_forsaken_desert_sun.png new file mode 100644 index 00000000..7141472a Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_sun.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_sun_tonemap.png b/mods/everness/textures/everness_forsaken_desert_sun_tonemap.png new file mode 100644 index 00000000..706d5c90 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_forsaken_fire_item.png b/mods/everness/textures/everness_forsaken_fire_item.png new file mode 100644 index 00000000..2128db15 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_fire_item.png differ diff --git a/mods/everness/textures/everness_forsaken_fire_mesh.png b/mods/everness/textures/everness_forsaken_fire_mesh.png new file mode 100644 index 00000000..2d1df3ae Binary files /dev/null and b/mods/everness/textures/everness_forsaken_fire_mesh.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_beach_sand.png b/mods/everness/textures/everness_forsaken_tundra_beach_sand.png new file mode 100644 index 00000000..6babf7fb Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_beach_sand.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_beach_sand_with_shells.png b/mods/everness/textures/everness_forsaken_tundra_beach_sand_with_shells.png new file mode 100644 index 00000000..f1fb61cc Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_beach_sand_with_shells.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_brick.png b/mods/everness/textures/everness_forsaken_tundra_brick.png new file mode 100644 index 00000000..70330e02 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_brick.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_cobblestone.png b/mods/everness/textures/everness_forsaken_tundra_cobblestone.png new file mode 100644 index 00000000..9879b56d Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_cobblestone.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_dirt.png b/mods/everness/textures/everness_forsaken_tundra_dirt.png new file mode 100644 index 00000000..03c2d866 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_dirt.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_grass.png b/mods/everness/textures/everness_forsaken_tundra_grass.png new file mode 100644 index 00000000..bc4610de Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_grass.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_grass_bckp.png b/mods/everness/textures/everness_forsaken_tundra_grass_bckp.png new file mode 100644 index 00000000..491b8abe Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_grass_bckp.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_grass_side.png b/mods/everness/textures/everness_forsaken_tundra_grass_side.png new file mode 100644 index 00000000..0d230cac Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_grass_side.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_grass_side_bckp.png b/mods/everness/textures/everness_forsaken_tundra_grass_side_bckp.png new file mode 100644 index 00000000..ddfaa19c Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_grass_side_bckp.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_rocks_side.png b/mods/everness/textures/everness_forsaken_tundra_rocks_side.png new file mode 100644 index 00000000..b3c17663 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_rocks_side.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_rocks_top.png b/mods/everness/textures/everness_forsaken_tundra_rocks_top.png new file mode 100644 index 00000000..6f617716 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_rocks_top.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_stone.png b/mods/everness/textures/everness_forsaken_tundra_stone.png new file mode 100644 index 00000000..a1d9d650 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_stone.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_sun.png b/mods/everness/textures/everness_forsaken_tundra_sun.png new file mode 100644 index 00000000..c90a4b82 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_sun.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_sun_tonemap.png b/mods/everness/textures/everness_forsaken_tundra_sun_tonemap.png new file mode 100644 index 00000000..b136f553 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_forsythia_item.png b/mods/everness/textures/everness_forsythia_item.png new file mode 100644 index 00000000..c1be02e2 Binary files /dev/null and b/mods/everness/textures/everness_forsythia_item.png differ diff --git a/mods/everness/textures/everness_forsythia_mesh.png b/mods/everness/textures/everness_forsythia_mesh.png new file mode 100644 index 00000000..948b8a8b Binary files /dev/null and b/mods/everness/textures/everness_forsythia_mesh.png differ diff --git a/mods/everness/textures/everness_frosted_coral.png b/mods/everness/textures/everness_frosted_coral.png new file mode 100644 index 00000000..7ece478d Binary files /dev/null and b/mods/everness/textures/everness_frosted_coral.png differ diff --git a/mods/everness/textures/everness_frosted_ice.png b/mods/everness/textures/everness_frosted_ice.png new file mode 100644 index 00000000..53979078 Binary files /dev/null and b/mods/everness/textures/everness_frosted_ice.png differ diff --git a/mods/everness/textures/everness_frosted_ice_translucent.png b/mods/everness/textures/everness_frosted_ice_translucent.png new file mode 100644 index 00000000..66a7c479 Binary files /dev/null and b/mods/everness/textures/everness_frosted_ice_translucent.png differ diff --git a/mods/everness/textures/everness_frosted_icesheet_sun.png b/mods/everness/textures/everness_frosted_icesheet_sun.png new file mode 100644 index 00000000..cd846746 Binary files /dev/null and b/mods/everness/textures/everness_frosted_icesheet_sun.png differ diff --git a/mods/everness/textures/everness_frosted_icesheet_sun_tonemap.png b/mods/everness/textures/everness_frosted_icesheet_sun_tonemap.png new file mode 100644 index 00000000..209c9258 Binary files /dev/null and b/mods/everness/textures/everness_frosted_icesheet_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_frosted_icicle.png b/mods/everness/textures/everness_frosted_icicle.png new file mode 100644 index 00000000..4b2d36e6 Binary files /dev/null and b/mods/everness/textures/everness_frosted_icicle.png differ diff --git a/mods/everness/textures/everness_frosted_snow.png b/mods/everness/textures/everness_frosted_snow.png new file mode 100644 index 00000000..dc52ca0f Binary files /dev/null and b/mods/everness/textures/everness_frosted_snow.png differ diff --git a/mods/everness/textures/everness_glass.png b/mods/everness/textures/everness_glass.png new file mode 100644 index 00000000..296a076a Binary files /dev/null and b/mods/everness/textures/everness_glass.png differ diff --git a/mods/everness/textures/everness_glass_detail.png b/mods/everness/textures/everness_glass_detail.png new file mode 100644 index 00000000..2f71c56d Binary files /dev/null and b/mods/everness/textures/everness_glass_detail.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_item.png b/mods/everness/textures/everness_glowing_pillar_item.png new file mode 100644 index 00000000..e3211e45 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_item.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_leaves.png b/mods/everness/textures/everness_glowing_pillar_leaves.png new file mode 100644 index 00000000..2c995d10 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_leaves.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_luminophor.png b/mods/everness/textures/everness_glowing_pillar_luminophor.png new file mode 100644 index 00000000..0f46b6b6 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_luminophor.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_roots.png b/mods/everness/textures/everness_glowing_pillar_roots.png new file mode 100644 index 00000000..73bb5635 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_roots.png differ diff --git a/mods/everness/textures/everness_golden_vine_1.png b/mods/everness/textures/everness_golden_vine_1.png new file mode 100644 index 00000000..5aece8d5 Binary files /dev/null and b/mods/everness/textures/everness_golden_vine_1.png differ diff --git a/mods/everness/textures/everness_golden_vine_2.png b/mods/everness/textures/everness_golden_vine_2.png new file mode 100644 index 00000000..954963d3 Binary files /dev/null and b/mods/everness/textures/everness_golden_vine_2.png differ diff --git a/mods/everness/textures/everness_golden_vine_end.png b/mods/everness/textures/everness_golden_vine_end.png new file mode 100644 index 00000000..93a5237b Binary files /dev/null and b/mods/everness/textures/everness_golden_vine_end.png differ diff --git a/mods/everness/textures/everness_grass_extras_1.png b/mods/everness/textures/everness_grass_extras_1.png new file mode 100644 index 00000000..bc4fff78 Binary files /dev/null and b/mods/everness/textures/everness_grass_extras_1.png differ diff --git a/mods/everness/textures/everness_grass_extras_2.png b/mods/everness/textures/everness_grass_extras_2.png new file mode 100644 index 00000000..7cd81b00 Binary files /dev/null and b/mods/everness/textures/everness_grass_extras_2.png differ diff --git a/mods/everness/textures/everness_grass_side.png b/mods/everness/textures/everness_grass_side.png new file mode 100644 index 00000000..4ca59348 Binary files /dev/null and b/mods/everness/textures/everness_grass_side.png differ diff --git a/mods/everness/textures/everness_grass_top.png b/mods/everness/textures/everness_grass_top.png new file mode 100644 index 00000000..8bcfb27d Binary files /dev/null and b/mods/everness/textures/everness_grass_top.png differ diff --git a/mods/everness/textures/everness_gravel.png b/mods/everness/textures/everness_gravel.png new file mode 100644 index 00000000..d9ba4f99 Binary files /dev/null and b/mods/everness/textures/everness_gravel.png differ diff --git a/mods/everness/textures/everness_hammer_item.png b/mods/everness/textures/everness_hammer_item.png new file mode 100644 index 00000000..1f472629 Binary files /dev/null and b/mods/everness/textures/everness_hammer_item.png differ diff --git a/mods/everness/textures/everness_hammer_mesh.png b/mods/everness/textures/everness_hammer_mesh.png new file mode 100644 index 00000000..74736ebf Binary files /dev/null and b/mods/everness/textures/everness_hammer_mesh.png differ diff --git a/mods/everness/textures/everness_hammer_sharp_item.png b/mods/everness/textures/everness_hammer_sharp_item.png new file mode 100644 index 00000000..1fecdba4 Binary files /dev/null and b/mods/everness/textures/everness_hammer_sharp_item.png differ diff --git a/mods/everness/textures/everness_hammer_sharp_mesh.png b/mods/everness/textures/everness_hammer_sharp_mesh.png new file mode 100644 index 00000000..e36ef139 Binary files /dev/null and b/mods/everness/textures/everness_hammer_sharp_mesh.png differ diff --git a/mods/everness/textures/everness_hollow_tree_side.png b/mods/everness/textures/everness_hollow_tree_side.png new file mode 100644 index 00000000..ff9874b1 Binary files /dev/null and b/mods/everness/textures/everness_hollow_tree_side.png differ diff --git a/mods/everness/textures/everness_hollow_tree_top.png b/mods/everness/textures/everness_hollow_tree_top.png new file mode 100644 index 00000000..550b3570 Binary files /dev/null and b/mods/everness/textures/everness_hollow_tree_top.png differ diff --git a/mods/everness/textures/everness_icecobble.png b/mods/everness/textures/everness_icecobble.png new file mode 100644 index 00000000..da3cdc76 Binary files /dev/null and b/mods/everness/textures/everness_icecobble.png differ diff --git a/mods/everness/textures/everness_illumi_root.png b/mods/everness/textures/everness_illumi_root.png new file mode 100644 index 00000000..86d109ad Binary files /dev/null and b/mods/everness/textures/everness_illumi_root.png differ diff --git a/mods/everness/textures/everness_invisible_node_overlay.png b/mods/everness/textures/everness_invisible_node_overlay.png new file mode 100644 index 00000000..7fc88061 Binary files /dev/null and b/mods/everness/textures/everness_invisible_node_overlay.png differ diff --git a/mods/everness/textures/everness_ivis_moss.png b/mods/everness/textures/everness_ivis_moss.png new file mode 100644 index 00000000..0ccbdcf1 Binary files /dev/null and b/mods/everness/textures/everness_ivis_moss.png differ diff --git a/mods/everness/textures/everness_ivis_vine_1.png b/mods/everness/textures/everness_ivis_vine_1.png new file mode 100644 index 00000000..014d54b1 Binary files /dev/null and b/mods/everness/textures/everness_ivis_vine_1.png differ diff --git a/mods/everness/textures/everness_ivis_vine_2.png b/mods/everness/textures/everness_ivis_vine_2.png new file mode 100644 index 00000000..fe3cbc54 Binary files /dev/null and b/mods/everness/textures/everness_ivis_vine_2.png differ diff --git a/mods/everness/textures/everness_ivis_vine_end.png b/mods/everness/textures/everness_ivis_vine_end.png new file mode 100644 index 00000000..cb8572f1 Binary files /dev/null and b/mods/everness/textures/everness_ivis_vine_end.png differ diff --git a/mods/everness/textures/everness_lava_flowing_animated.png b/mods/everness/textures/everness_lava_flowing_animated.png new file mode 100644 index 00000000..aaef22e5 Binary files /dev/null and b/mods/everness/textures/everness_lava_flowing_animated.png differ diff --git a/mods/everness/textures/everness_lava_source_animated.png b/mods/everness/textures/everness_lava_source_animated.png new file mode 100644 index 00000000..9b02ec34 Binary files /dev/null and b/mods/everness/textures/everness_lava_source_animated.png differ diff --git a/mods/everness/textures/everness_lava_tree.png b/mods/everness/textures/everness_lava_tree.png new file mode 100644 index 00000000..455bc8f3 Binary files /dev/null and b/mods/everness/textures/everness_lava_tree.png differ diff --git a/mods/everness/textures/everness_lava_tree_animated.png b/mods/everness/textures/everness_lava_tree_animated.png new file mode 100644 index 00000000..afc5fb5e Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_animated.png differ diff --git a/mods/everness/textures/everness_lava_tree_leaves.png b/mods/everness/textures/everness_lava_tree_leaves.png new file mode 100644 index 00000000..2f440af7 Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_leaves.png differ diff --git a/mods/everness/textures/everness_lava_tree_sapling.png b/mods/everness/textures/everness_lava_tree_sapling.png new file mode 100644 index 00000000..a01889e4 Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_sapling.png differ diff --git a/mods/everness/textures/everness_lava_tree_top.png b/mods/everness/textures/everness_lava_tree_top.png new file mode 100644 index 00000000..0f942f46 Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_top.png differ diff --git a/mods/everness/textures/everness_lava_tree_wood.png b/mods/everness/textures/everness_lava_tree_wood.png new file mode 100644 index 00000000..d070eefd Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_logo.png b/mods/everness/textures/everness_logo.png new file mode 100644 index 00000000..ff7a0518 Binary files /dev/null and b/mods/everness/textures/everness_logo.png differ diff --git a/mods/everness/textures/everness_lootchest_marker_side.png b/mods/everness/textures/everness_lootchest_marker_side.png new file mode 100644 index 00000000..6f69ca2c Binary files /dev/null and b/mods/everness/textures/everness_lootchest_marker_side.png differ diff --git a/mods/everness/textures/everness_lootchest_marker_top.png b/mods/everness/textures/everness_lootchest_marker_top.png new file mode 100644 index 00000000..c3650d92 Binary files /dev/null and b/mods/everness/textures/everness_lootchest_marker_top.png differ diff --git a/mods/everness/textures/everness_lotus_flower_mesh_not_animated.png b/mods/everness/textures/everness_lotus_flower_mesh_not_animated.png new file mode 100644 index 00000000..4f305b60 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_mesh_not_animated.png differ diff --git a/mods/everness/textures/everness_lotus_flower_pink_item.png b/mods/everness/textures/everness_lotus_flower_pink_item.png new file mode 100644 index 00000000..f186dcfc Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_pink_item.png differ diff --git a/mods/everness/textures/everness_lotus_flower_pink_mesh.png b/mods/everness/textures/everness_lotus_flower_pink_mesh.png new file mode 100644 index 00000000..d57a9904 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_pink_mesh.png differ diff --git a/mods/everness/textures/everness_lotus_flower_pink_mesh_animated.png b/mods/everness/textures/everness_lotus_flower_pink_mesh_animated.png new file mode 100644 index 00000000..33bccc33 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_pink_mesh_animated.png differ diff --git a/mods/everness/textures/everness_lotus_flower_purple_item.png b/mods/everness/textures/everness_lotus_flower_purple_item.png new file mode 100644 index 00000000..75483b9f Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_purple_item.png differ diff --git a/mods/everness/textures/everness_lotus_flower_purple_mesh.png b/mods/everness/textures/everness_lotus_flower_purple_mesh.png new file mode 100644 index 00000000..5901af6c Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_purple_mesh.png differ diff --git a/mods/everness/textures/everness_lotus_flower_purple_mesh_animated.png b/mods/everness/textures/everness_lotus_flower_purple_mesh_animated.png new file mode 100644 index 00000000..be97d39e Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_purple_mesh_animated.png differ diff --git a/mods/everness/textures/everness_lotus_flower_white_item.png b/mods/everness/textures/everness_lotus_flower_white_item.png new file mode 100644 index 00000000..97ebafa6 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_white_item.png differ diff --git a/mods/everness/textures/everness_lotus_flower_white_mesh.png b/mods/everness/textures/everness_lotus_flower_white_mesh.png new file mode 100644 index 00000000..741ed7fa Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_white_mesh.png differ diff --git a/mods/everness/textures/everness_lotus_flower_white_mesh_animated.png b/mods/everness/textures/everness_lotus_flower_white_mesh_animated.png new file mode 100644 index 00000000..69dba1c6 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_white_mesh_animated.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_2_item.png b/mods/everness/textures/everness_lotus_leaf_2_item.png new file mode 100644 index 00000000..01f01fd7 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_2_item.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_2_y.png b/mods/everness/textures/everness_lotus_leaf_2_y.png new file mode 100644 index 00000000..2d812d43 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_2_y.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_3_item.png b/mods/everness/textures/everness_lotus_leaf_3_item.png new file mode 100644 index 00000000..4fd9160c Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_3_item.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_3_y.png b/mods/everness/textures/everness_lotus_leaf_3_y.png new file mode 100644 index 00000000..7e097f13 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_3_y.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_item.png b/mods/everness/textures/everness_lotus_leaf_item.png new file mode 100644 index 00000000..5dbcc659 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_item.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_y.png b/mods/everness/textures/everness_lotus_leaf_y.png new file mode 100644 index 00000000..386145ea Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_y.png differ diff --git a/mods/everness/textures/everness_lumabus_bulb_purple.png b/mods/everness/textures/everness_lumabus_bulb_purple.png new file mode 100644 index 00000000..0bffd346 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_bulb_purple.png differ diff --git a/mods/everness/textures/everness_lumabus_leaves.png b/mods/everness/textures/everness_lumabus_leaves.png new file mode 100644 index 00000000..02bbfd55 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_leaves.png differ diff --git a/mods/everness/textures/everness_lumabus_vine_1.png b/mods/everness/textures/everness_lumabus_vine_1.png new file mode 100644 index 00000000..7eb189e9 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_vine_1.png differ diff --git a/mods/everness/textures/everness_lumabus_vine_2.png b/mods/everness/textures/everness_lumabus_vine_2.png new file mode 100644 index 00000000..67bbc8f1 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_vine_2.png differ diff --git a/mods/everness/textures/everness_lumabus_vine_end.png b/mods/everness/textures/everness_lumabus_vine_end.png new file mode 100644 index 00000000..e5694e9b Binary files /dev/null and b/mods/everness/textures/everness_lumabus_vine_end.png differ diff --git a/mods/everness/textures/everness_lumecorn_item.png b/mods/everness/textures/everness_lumecorn_item.png new file mode 100644 index 00000000..912046df Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_item.png differ diff --git a/mods/everness/textures/everness_lumecorn_leaf.png b/mods/everness/textures/everness_lumecorn_leaf.png new file mode 100644 index 00000000..584c0596 Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_leaf.png differ diff --git a/mods/everness/textures/everness_lumecorn_light.png b/mods/everness/textures/everness_lumecorn_light.png new file mode 100644 index 00000000..a7801c2d Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_light.png differ diff --git a/mods/everness/textures/everness_lumecorn_root.png b/mods/everness/textures/everness_lumecorn_root.png new file mode 100644 index 00000000..abe79059 Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_root.png differ diff --git a/mods/everness/textures/everness_magmacobble.png b/mods/everness/textures/everness_magmacobble.png new file mode 100644 index 00000000..4dae6f5a Binary files /dev/null and b/mods/everness/textures/everness_magmacobble.png differ diff --git a/mods/everness/textures/everness_magmacobble_animated.png b/mods/everness/textures/everness_magmacobble_animated.png new file mode 100644 index 00000000..be276a34 Binary files /dev/null and b/mods/everness/textures/everness_magmacobble_animated.png differ diff --git a/mods/everness/textures/everness_marsh_grass.png b/mods/everness/textures/everness_marsh_grass.png new file mode 100644 index 00000000..82d1845c Binary files /dev/null and b/mods/everness/textures/everness_marsh_grass.png differ diff --git a/mods/everness/textures/everness_mcl_bucket_lava.png b/mods/everness/textures/everness_mcl_bucket_lava.png new file mode 100644 index 00000000..0e87a0a2 Binary files /dev/null and b/mods/everness/textures/everness_mcl_bucket_lava.png differ diff --git a/mods/everness/textures/everness_mcl_bucket_mineral_water.png b/mods/everness/textures/everness_mcl_bucket_mineral_water.png new file mode 100644 index 00000000..8819a7b7 Binary files /dev/null and b/mods/everness/textures/everness_mcl_bucket_mineral_water.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_lower.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower.png new file mode 100644 index 00000000..e99e1558 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_bottompart.png new file mode 100644 index 00000000..919616fc Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_side.png new file mode 100644 index 00000000..334d1a27 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_upper.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper.png new file mode 100644 index 00000000..2bc9ed5d Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_side.png new file mode 100644 index 00000000..334d1a27 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_toppart.png new file mode 100644 index 00000000..919616fc Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower.png new file mode 100644 index 00000000..a4e47912 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_bottompart.png new file mode 100644 index 00000000..b34352ae Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_side.png new file mode 100644 index 00000000..c301fac4 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper.png new file mode 100644 index 00000000..6042fe19 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_side.png new file mode 100644 index 00000000..c301fac4 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_toppart.png new file mode 100644 index 00000000..b34352ae Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower.png new file mode 100644 index 00000000..8aa5e60b Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_bottompart.png new file mode 100644 index 00000000..41b12e12 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_side.png new file mode 100644 index 00000000..cfe2ece0 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper.png new file mode 100644 index 00000000..08cecb25 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_side.png new file mode 100644 index 00000000..cfe2ece0 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_toppart.png new file mode 100644 index 00000000..41b12e12 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower.png new file mode 100644 index 00000000..57f9cabb Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_bottompart.png new file mode 100644 index 00000000..9f240c87 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_side.png new file mode 100644 index 00000000..c0978258 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper.png new file mode 100644 index 00000000..5aeb3e3e Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_side.png new file mode 100644 index 00000000..c0978258 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_toppart.png new file mode 100644 index 00000000..9f240c87 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_lower.png b/mods/everness/textures/everness_mcl_doors_door_willow_lower.png new file mode 100644 index 00000000..ecdab334 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_willow_lower_bottompart.png new file mode 100644 index 00000000..3ec3f8dc Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_willow_lower_side.png new file mode 100644 index 00000000..476c6f62 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_upper.png b/mods/everness/textures/everness_mcl_doors_door_willow_upper.png new file mode 100644 index 00000000..af7a280f Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_willow_upper_side.png new file mode 100644 index 00000000..338d42f7 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_willow_upper_toppart.png new file mode 100644 index 00000000..3ec3f8dc Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_trapdoor_bamboo_side.png b/mods/everness/textures/everness_mcl_doors_trapdoor_bamboo_side.png new file mode 100644 index 00000000..57e431b9 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_trapdoor_bamboo_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_trapdoor_crystal_wood_side.png b/mods/everness/textures/everness_mcl_doors_trapdoor_crystal_wood_side.png new file mode 100644 index 00000000..7de4f63b Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_trapdoor_crystal_wood_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_trapdoor_cursed_wood_side.png b/mods/everness/textures/everness_mcl_doors_trapdoor_cursed_wood_side.png new file mode 100644 index 00000000..e4fd6560 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_trapdoor_cursed_wood_side.png differ diff --git a/mods/everness/textures/everness_mese_leaves.png b/mods/everness/textures/everness_mese_leaves.png new file mode 100644 index 00000000..e8b1785d Binary files /dev/null and b/mods/everness/textures/everness_mese_leaves.png differ diff --git a/mods/everness/textures/everness_mese_tree_fruit_item.png b/mods/everness/textures/everness_mese_tree_fruit_item.png new file mode 100644 index 00000000..b19295d5 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_fruit_item.png differ diff --git a/mods/everness/textures/everness_mese_tree_fruit_side.png b/mods/everness/textures/everness_mese_tree_fruit_side.png new file mode 100644 index 00000000..f6232558 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_fruit_side.png differ diff --git a/mods/everness/textures/everness_mese_tree_fruit_top.png b/mods/everness/textures/everness_mese_tree_fruit_top.png new file mode 100644 index 00000000..51b97833 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_fruit_top.png differ diff --git a/mods/everness/textures/everness_mese_tree_sapling.png b/mods/everness/textures/everness_mese_tree_sapling.png new file mode 100644 index 00000000..34a69714 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_sapling.png differ diff --git a/mods/everness/textures/everness_mese_tree_side_animated.png b/mods/everness/textures/everness_mese_tree_side_animated.png new file mode 100644 index 00000000..80b387bb Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_side_animated.png differ diff --git a/mods/everness/textures/everness_mese_tree_top.png b/mods/everness/textures/everness_mese_tree_top.png new file mode 100644 index 00000000..eea2c5f1 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_top.png differ diff --git a/mods/everness/textures/everness_mese_wood.png b/mods/everness/textures/everness_mese_wood.png new file mode 100644 index 00000000..f9745209 Binary files /dev/null and b/mods/everness/textures/everness_mese_wood.png differ diff --git a/mods/everness/textures/everness_mineral_cave_moss.png b/mods/everness/textures/everness_mineral_cave_moss.png new file mode 100644 index 00000000..592978d5 Binary files /dev/null and b/mods/everness/textures/everness_mineral_cave_moss.png differ diff --git a/mods/everness/textures/everness_mineral_cave_moss_grass.png b/mods/everness/textures/everness_mineral_cave_moss_grass.png new file mode 100644 index 00000000..abe5a674 Binary files /dev/null and b/mods/everness/textures/everness_mineral_cave_moss_grass.png differ diff --git a/mods/everness/textures/everness_mineral_cave_moss_side.png b/mods/everness/textures/everness_mineral_cave_moss_side.png new file mode 100644 index 00000000..2831a53e Binary files /dev/null and b/mods/everness/textures/everness_mineral_cave_moss_side.png differ diff --git a/mods/everness/textures/everness_mineral_coal.png b/mods/everness/textures/everness_mineral_coal.png new file mode 100644 index 00000000..6d1386b9 Binary files /dev/null and b/mods/everness/textures/everness_mineral_coal.png differ diff --git a/mods/everness/textures/everness_mineral_cobblestone.png b/mods/everness/textures/everness_mineral_cobblestone.png new file mode 100644 index 00000000..7f5193ee Binary files /dev/null and b/mods/everness/textures/everness_mineral_cobblestone.png differ diff --git a/mods/everness/textures/everness_mineral_cobblestone_under.png b/mods/everness/textures/everness_mineral_cobblestone_under.png new file mode 100644 index 00000000..f5558444 Binary files /dev/null and b/mods/everness/textures/everness_mineral_cobblestone_under.png differ diff --git a/mods/everness/textures/everness_mineral_lava_stone_animated.png b/mods/everness/textures/everness_mineral_lava_stone_animated.png new file mode 100644 index 00000000..8fd6416e Binary files /dev/null and b/mods/everness/textures/everness_mineral_lava_stone_animated.png differ diff --git a/mods/everness/textures/everness_mineral_lava_stone_bottom.png b/mods/everness/textures/everness_mineral_lava_stone_bottom.png new file mode 100644 index 00000000..7daef6c5 Binary files /dev/null and b/mods/everness/textures/everness_mineral_lava_stone_bottom.png differ diff --git a/mods/everness/textures/everness_mineral_lava_stone_side.png b/mods/everness/textures/everness_mineral_lava_stone_side.png new file mode 100644 index 00000000..4964dace Binary files /dev/null and b/mods/everness/textures/everness_mineral_lava_stone_side.png differ diff --git a/mods/everness/textures/everness_mineral_pyrite.png b/mods/everness/textures/everness_mineral_pyrite.png new file mode 100644 index 00000000..9ffed6da Binary files /dev/null and b/mods/everness/textures/everness_mineral_pyrite.png differ diff --git a/mods/everness/textures/everness_mineral_sand.png b/mods/everness/textures/everness_mineral_sand.png new file mode 100644 index 00000000..050d2f13 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sand.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone.png b/mods/everness/textures/everness_mineral_sandstone.png new file mode 100644 index 00000000..97b34817 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_block.png b/mods/everness/textures/everness_mineral_sandstone_block.png new file mode 100644 index 00000000..65be9d43 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_block.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_brick.png b/mods/everness/textures/everness_mineral_sandstone_brick.png new file mode 100644 index 00000000..24df3e2c Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_brick_block.png b/mods/everness/textures/everness_mineral_sandstone_brick_block.png new file mode 100644 index 00000000..eb1f1b6b Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_brick_block.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_brick_block_top.png b/mods/everness/textures/everness_mineral_sandstone_brick_block_top.png new file mode 100644 index 00000000..4640748f Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_brick_block_top.png differ diff --git a/mods/everness/textures/everness_mineral_stone.png b/mods/everness/textures/everness_mineral_stone.png new file mode 100644 index 00000000..a80064c6 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone.png differ diff --git a/mods/everness/textures/everness_mineral_stone_block.png b/mods/everness/textures/everness_mineral_stone_block.png new file mode 100644 index 00000000..60bcd917 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_block.png differ diff --git a/mods/everness/textures/everness_mineral_stone_brick.png b/mods/everness/textures/everness_mineral_stone_brick.png new file mode 100644 index 00000000..71b61c3e Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_brick.png differ diff --git a/mods/everness/textures/everness_mineral_stone_brick_with_flower_growth.png b/mods/everness/textures/everness_mineral_stone_brick_with_flower_growth.png new file mode 100644 index 00000000..c0afa723 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_brick_with_flower_growth.png differ diff --git a/mods/everness/textures/everness_mineral_stone_brick_with_growth.png b/mods/everness/textures/everness_mineral_stone_brick_with_growth.png new file mode 100644 index 00000000..3d1ff2f3 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_brick_with_growth.png differ diff --git a/mods/everness/textures/everness_mineral_stone_under.png b/mods/everness/textures/everness_mineral_stone_under.png new file mode 100644 index 00000000..49bb611d Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_under.png differ diff --git a/mods/everness/textures/everness_mineral_stone_under_top.png b/mods/everness/textures/everness_mineral_stone_under_top.png new file mode 100644 index 00000000..2ed666da Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_under_top.png differ diff --git a/mods/everness/textures/everness_mineral_torch_animated.png b/mods/everness/textures/everness_mineral_torch_animated.png new file mode 100644 index 00000000..f0369a28 Binary files /dev/null and b/mods/everness/textures/everness_mineral_torch_animated.png differ diff --git a/mods/everness/textures/everness_mineral_torch_item.png b/mods/everness/textures/everness_mineral_torch_item.png new file mode 100644 index 00000000..7cbba887 Binary files /dev/null and b/mods/everness/textures/everness_mineral_torch_item.png differ diff --git a/mods/everness/textures/everness_mineral_torch_mesh.png b/mods/everness/textures/everness_mineral_torch_mesh.png new file mode 100644 index 00000000..d03cef41 Binary files /dev/null and b/mods/everness/textures/everness_mineral_torch_mesh.png differ diff --git a/mods/everness/textures/everness_mineral_water.png b/mods/everness/textures/everness_mineral_water.png new file mode 100644 index 00000000..3127c5e2 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water.png differ diff --git a/mods/everness/textures/everness_mineral_water_flowing_animated.png b/mods/everness/textures/everness_mineral_water_flowing_animated.png new file mode 100644 index 00000000..c969db1c Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_flowing_animated.png differ diff --git a/mods/everness/textures/everness_mineral_water_source_animated.png b/mods/everness/textures/everness_mineral_water_source_animated.png new file mode 100644 index 00000000..2610d444 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_source_animated.png differ diff --git a/mods/everness/textures/everness_mineral_water_weed_1.png b/mods/everness/textures/everness_mineral_water_weed_1.png new file mode 100644 index 00000000..9ff88fd6 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_weed_1.png differ diff --git a/mods/everness/textures/everness_mineral_water_weed_2.png b/mods/everness/textures/everness_mineral_water_weed_2.png new file mode 100644 index 00000000..e1c9b880 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_weed_2.png differ diff --git a/mods/everness/textures/everness_mineral_water_weed_3.png b/mods/everness/textures/everness_mineral_water_weed_3.png new file mode 100644 index 00000000..fe87dcdc Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_weed_3.png differ diff --git a/mods/everness/textures/everness_mineral_waters_skybox.png b/mods/everness/textures/everness_mineral_waters_skybox.png new file mode 100644 index 00000000..9d9002b1 Binary files /dev/null and b/mods/everness/textures/everness_mineral_waters_skybox.png differ diff --git a/mods/everness/textures/everness_mold_stone.png b/mods/everness/textures/everness_mold_stone.png new file mode 100644 index 00000000..8686605c Binary files /dev/null and b/mods/everness/textures/everness_mold_stone.png differ diff --git a/mods/everness/textures/everness_mold_stone_with_moss_side.png b/mods/everness/textures/everness_mold_stone_with_moss_side.png new file mode 100644 index 00000000..288d30ff Binary files /dev/null and b/mods/everness/textures/everness_mold_stone_with_moss_side.png differ diff --git a/mods/everness/textures/everness_mold_stone_with_moss_top.png b/mods/everness/textures/everness_mold_stone_with_moss_top.png new file mode 100644 index 00000000..aa030f48 Binary files /dev/null and b/mods/everness/textures/everness_mold_stone_with_moss_top.png differ diff --git a/mods/everness/textures/everness_moss_block.png b/mods/everness/textures/everness_moss_block.png new file mode 100644 index 00000000..884b259e Binary files /dev/null and b/mods/everness/textures/everness_moss_block.png differ diff --git a/mods/everness/textures/everness_mtg_bucket_lava.png b/mods/everness/textures/everness_mtg_bucket_lava.png new file mode 100644 index 00000000..17b2a60d Binary files /dev/null and b/mods/everness/textures/everness_mtg_bucket_lava.png differ diff --git a/mods/everness/textures/everness_mtg_bucket_mineral_water.png b/mods/everness/textures/everness_mtg_bucket_mineral_water.png new file mode 100644 index 00000000..f8fcaef1 Binary files /dev/null and b/mods/everness/textures/everness_mtg_bucket_mineral_water.png differ diff --git a/mods/everness/textures/everness_mud.png b/mods/everness/textures/everness_mud.png new file mode 100644 index 00000000..a818be24 Binary files /dev/null and b/mods/everness/textures/everness_mud.png differ diff --git a/mods/everness/textures/everness_mud_2.png b/mods/everness/textures/everness_mud_2.png new file mode 100644 index 00000000..b199c378 Binary files /dev/null and b/mods/everness/textures/everness_mud_2.png differ diff --git a/mods/everness/textures/everness_ngrass_1.png b/mods/everness/textures/everness_ngrass_1.png new file mode 100644 index 00000000..795ec99a Binary files /dev/null and b/mods/everness/textures/everness_ngrass_1.png differ diff --git a/mods/everness/textures/everness_ngrass_2.png b/mods/everness/textures/everness_ngrass_2.png new file mode 100644 index 00000000..96bd4d63 Binary files /dev/null and b/mods/everness/textures/everness_ngrass_2.png differ diff --git a/mods/everness/textures/everness_palm_tree_leaves.png b/mods/everness/textures/everness_palm_tree_leaves.png new file mode 100644 index 00000000..75680f82 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_leaves.png differ diff --git a/mods/everness/textures/everness_palm_tree_sapling.png b/mods/everness/textures/everness_palm_tree_sapling.png new file mode 100644 index 00000000..86ff9dd2 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_sapling.png differ diff --git a/mods/everness/textures/everness_palm_tree_side.png b/mods/everness/textures/everness_palm_tree_side.png new file mode 100644 index 00000000..5aa9434e Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_side.png differ diff --git a/mods/everness/textures/everness_palm_tree_top.png b/mods/everness/textures/everness_palm_tree_top.png new file mode 100644 index 00000000..e9f14023 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_top.png differ diff --git a/mods/everness/textures/everness_palm_tree_wood.png b/mods/everness/textures/everness_palm_tree_wood.png new file mode 100644 index 00000000..2af89a84 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_wood.png differ diff --git a/mods/everness/textures/everness_particle.png b/mods/everness/textures/everness_particle.png new file mode 100644 index 00000000..63f34960 Binary files /dev/null and b/mods/everness/textures/everness_particle.png differ diff --git a/mods/everness/textures/everness_pick_archeological.png b/mods/everness/textures/everness_pick_archeological.png new file mode 100644 index 00000000..b304bad2 Binary files /dev/null and b/mods/everness/textures/everness_pick_archeological.png differ diff --git a/mods/everness/textures/everness_pick_illuminating.png b/mods/everness/textures/everness_pick_illuminating.png new file mode 100644 index 00000000..3ed46475 Binary files /dev/null and b/mods/everness/textures/everness_pick_illuminating.png differ diff --git a/mods/everness/textures/everness_pyrite_block.png b/mods/everness/textures/everness_pyrite_block.png new file mode 100644 index 00000000..c1ddc0a2 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block.png differ diff --git a/mods/everness/textures/everness_pyrite_block_forged.png b/mods/everness/textures/everness_pyrite_block_forged.png new file mode 100644 index 00000000..73b3ff36 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_forged.png differ diff --git a/mods/everness/textures/everness_pyrite_block_polished.png b/mods/everness/textures/everness_pyrite_block_polished.png new file mode 100644 index 00000000..917ff749 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_polished.png differ diff --git a/mods/everness/textures/everness_pyrite_block_slab_brick.png b/mods/everness/textures/everness_pyrite_block_slab_brick.png new file mode 100644 index 00000000..a274c33a Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_slab_brick.png differ diff --git a/mods/everness/textures/everness_pyrite_block_spiral.png b/mods/everness/textures/everness_pyrite_block_spiral.png new file mode 100644 index 00000000..caae4cff Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_spiral.png differ diff --git a/mods/everness/textures/everness_pyrite_glass.png b/mods/everness/textures/everness_pyrite_glass.png new file mode 100644 index 00000000..514aa91f Binary files /dev/null and b/mods/everness/textures/everness_pyrite_glass.png differ diff --git a/mods/everness/textures/everness_pyrite_ingot.png b/mods/everness/textures/everness_pyrite_ingot.png new file mode 100644 index 00000000..4ecd1495 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_ingot.png differ diff --git a/mods/everness/textures/everness_pyrite_lantern.png b/mods/everness/textures/everness_pyrite_lantern.png new file mode 100644 index 00000000..08607ac2 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_lantern.png differ diff --git a/mods/everness/textures/everness_pyrite_lump.png b/mods/everness/textures/everness_pyrite_lump.png new file mode 100644 index 00000000..ad0179a4 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_lump.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_bottom.png b/mods/everness/textures/everness_pyrite_pillar_bottom.png new file mode 100644 index 00000000..a304fd0c Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_bottom.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_middle.png b/mods/everness/textures/everness_pyrite_pillar_middle.png new file mode 100644 index 00000000..280a9dc8 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_middle.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_small.png b/mods/everness/textures/everness_pyrite_pillar_small.png new file mode 100644 index 00000000..4ebbd56f Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_small.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_top.png b/mods/everness/textures/everness_pyrite_pillar_top.png new file mode 100644 index 00000000..967afc9d Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_top.png differ diff --git a/mods/everness/textures/everness_pyriteblock_brick.png b/mods/everness/textures/everness_pyriteblock_brick.png new file mode 100644 index 00000000..36df0b45 Binary files /dev/null and b/mods/everness/textures/everness_pyriteblock_brick.png differ diff --git a/mods/everness/textures/everness_quartz.png b/mods/everness/textures/everness_quartz.png new file mode 100644 index 00000000..0e809482 Binary files /dev/null and b/mods/everness/textures/everness_quartz.png differ diff --git a/mods/everness/textures/everness_quartz_block_bottom.png b/mods/everness/textures/everness_quartz_block_bottom.png new file mode 100644 index 00000000..2f3098a5 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_bottom.png differ diff --git a/mods/everness/textures/everness_quartz_block_chiseled.png b/mods/everness/textures/everness_quartz_block_chiseled.png new file mode 100644 index 00000000..88deb47d Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_chiseled.png differ diff --git a/mods/everness/textures/everness_quartz_block_chiseled_top.png b/mods/everness/textures/everness_quartz_block_chiseled_top.png new file mode 100644 index 00000000..b656447f Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_chiseled_top.png differ diff --git a/mods/everness/textures/everness_quartz_block_lines.png b/mods/everness/textures/everness_quartz_block_lines.png new file mode 100644 index 00000000..129d7455 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_lines.png differ diff --git a/mods/everness/textures/everness_quartz_block_lines_top.png b/mods/everness/textures/everness_quartz_block_lines_top.png new file mode 100644 index 00000000..fc573e0f Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_lines_top.png differ diff --git a/mods/everness/textures/everness_quartz_block_side.png b/mods/everness/textures/everness_quartz_block_side.png new file mode 100644 index 00000000..c6740509 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_side.png differ diff --git a/mods/everness/textures/everness_quartz_block_top.png b/mods/everness/textures/everness_quartz_block_top.png new file mode 100644 index 00000000..aff4bd75 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_top.png differ diff --git a/mods/everness/textures/everness_quartz_ore.png b/mods/everness/textures/everness_quartz_ore.png new file mode 100644 index 00000000..6d2b9393 Binary files /dev/null and b/mods/everness/textures/everness_quartz_ore.png differ diff --git a/mods/everness/textures/everness_red_castor_1.png b/mods/everness/textures/everness_red_castor_1.png new file mode 100644 index 00000000..2b44d7c7 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_1.png differ diff --git a/mods/everness/textures/everness_red_castor_2.png b/mods/everness/textures/everness_red_castor_2.png new file mode 100644 index 00000000..1dc3a824 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_2.png differ diff --git a/mods/everness/textures/everness_red_castor_3.png b/mods/everness/textures/everness_red_castor_3.png new file mode 100644 index 00000000..41d4e801 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_3.png differ diff --git a/mods/everness/textures/everness_red_castor_4.png b/mods/everness/textures/everness_red_castor_4.png new file mode 100644 index 00000000..cf276c74 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_4.png differ diff --git a/mods/everness/textures/everness_reeds_vine_1.png b/mods/everness/textures/everness_reeds_vine_1.png new file mode 100644 index 00000000..f19eb0c4 Binary files /dev/null and b/mods/everness/textures/everness_reeds_vine_1.png differ diff --git a/mods/everness/textures/everness_reeds_vine_2.png b/mods/everness/textures/everness_reeds_vine_2.png new file mode 100644 index 00000000..9817eb33 Binary files /dev/null and b/mods/everness/textures/everness_reeds_vine_2.png differ diff --git a/mods/everness/textures/everness_reeds_vine_end.png b/mods/everness/textures/everness_reeds_vine_end.png new file mode 100644 index 00000000..5f75f4e0 Binary files /dev/null and b/mods/everness/textures/everness_reeds_vine_end.png differ diff --git a/mods/everness/textures/everness_rising_soul_particle.png b/mods/everness/textures/everness_rising_soul_particle.png new file mode 100644 index 00000000..dd1b8b54 Binary files /dev/null and b/mods/everness/textures/everness_rising_soul_particle.png differ diff --git a/mods/everness/textures/everness_rose_bush_item.png b/mods/everness/textures/everness_rose_bush_item.png new file mode 100644 index 00000000..104811ba Binary files /dev/null and b/mods/everness/textures/everness_rose_bush_item.png differ diff --git a/mods/everness/textures/everness_rose_bush_mesh.png b/mods/everness/textures/everness_rose_bush_mesh.png new file mode 100644 index 00000000..0ea633e7 Binary files /dev/null and b/mods/everness/textures/everness_rose_bush_mesh.png differ diff --git a/mods/everness/textures/everness_scull_with_candle_inventory.png b/mods/everness/textures/everness_scull_with_candle_inventory.png new file mode 100644 index 00000000..cc1001da Binary files /dev/null and b/mods/everness/textures/everness_scull_with_candle_inventory.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_leaves.png b/mods/everness/textures/everness_sequoia_tree_leaves.png new file mode 100644 index 00000000..a22a6542 Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_leaves.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_sapling.png b/mods/everness/textures/everness_sequoia_tree_sapling.png new file mode 100644 index 00000000..882f8fd2 Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_sapling.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_side.png b/mods/everness/textures/everness_sequoia_tree_side.png new file mode 100644 index 00000000..a48c52f2 Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_side.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_top.png b/mods/everness/textures/everness_sequoia_tree_top.png new file mode 100644 index 00000000..1e9149e6 Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_top.png differ diff --git a/mods/everness/textures/everness_sequoia_wood.png b/mods/everness/textures/everness_sequoia_wood.png new file mode 100644 index 00000000..57d949ac Binary files /dev/null and b/mods/everness/textures/everness_sequoia_wood.png differ diff --git a/mods/everness/textures/everness_shell_of_underwarer_breathing.png b/mods/everness/textures/everness_shell_of_underwarer_breathing.png new file mode 100644 index 00000000..ba74cf4f Binary files /dev/null and b/mods/everness/textures/everness_shell_of_underwarer_breathing.png differ diff --git a/mods/everness/textures/everness_shovel_silk.png b/mods/everness/textures/everness_shovel_silk.png new file mode 100644 index 00000000..9620a38c Binary files /dev/null and b/mods/everness/textures/everness_shovel_silk.png differ diff --git a/mods/everness/textures/everness_smoke_cloud_particle_animated.png b/mods/everness/textures/everness_smoke_cloud_particle_animated.png new file mode 100644 index 00000000..84a8e267 Binary files /dev/null and b/mods/everness/textures/everness_smoke_cloud_particle_animated.png differ diff --git a/mods/everness/textures/everness_smoke_cloud_particle_static.png b/mods/everness/textures/everness_smoke_cloud_particle_static.png new file mode 100644 index 00000000..54c775c2 Binary files /dev/null and b/mods/everness/textures/everness_smoke_cloud_particle_static.png differ diff --git a/mods/everness/textures/everness_snowcobble.png b/mods/everness/textures/everness_snowcobble.png new file mode 100644 index 00000000..73b8c4ea Binary files /dev/null and b/mods/everness/textures/everness_snowcobble.png differ diff --git a/mods/everness/textures/everness_soul_sandstone.png b/mods/everness/textures/everness_soul_sandstone.png new file mode 100644 index 00000000..133f3d87 Binary files /dev/null and b/mods/everness/textures/everness_soul_sandstone.png differ diff --git a/mods/everness/textures/everness_soul_sandstone_veined_side.png b/mods/everness/textures/everness_soul_sandstone_veined_side.png new file mode 100644 index 00000000..6b5c41c4 Binary files /dev/null and b/mods/everness/textures/everness_soul_sandstone_veined_side.png differ diff --git a/mods/everness/textures/everness_soul_sandstone_veined_top.png b/mods/everness/textures/everness_soul_sandstone_veined_top.png new file mode 100644 index 00000000..8fd3ad43 Binary files /dev/null and b/mods/everness/textures/everness_soul_sandstone_veined_top.png differ diff --git a/mods/everness/textures/everness_spine_kelp.png b/mods/everness/textures/everness_spine_kelp.png new file mode 100644 index 00000000..b64a592f Binary files /dev/null and b/mods/everness/textures/everness_spine_kelp.png differ diff --git a/mods/everness/textures/everness_starfish.png b/mods/everness/textures/everness_starfish.png new file mode 100644 index 00000000..41ff6750 Binary files /dev/null and b/mods/everness/textures/everness_starfish.png differ diff --git a/mods/everness/textures/everness_stone.png b/mods/everness/textures/everness_stone.png new file mode 100644 index 00000000..6085b8c1 Binary files /dev/null and b/mods/everness/textures/everness_stone.png differ diff --git a/mods/everness/textures/everness_sulfur_stone.png b/mods/everness/textures/everness_sulfur_stone.png new file mode 100644 index 00000000..731ee2bc Binary files /dev/null and b/mods/everness/textures/everness_sulfur_stone.png differ diff --git a/mods/everness/textures/everness_tenanea_flowers_vine_1.png b/mods/everness/textures/everness_tenanea_flowers_vine_1.png new file mode 100644 index 00000000..7c1d0c37 Binary files /dev/null and b/mods/everness/textures/everness_tenanea_flowers_vine_1.png differ diff --git a/mods/everness/textures/everness_tenanea_flowers_vine_2.png b/mods/everness/textures/everness_tenanea_flowers_vine_2.png new file mode 100644 index 00000000..c0e20e58 Binary files /dev/null and b/mods/everness/textures/everness_tenanea_flowers_vine_2.png differ diff --git a/mods/everness/textures/everness_tenanea_flowers_vine_end.png b/mods/everness/textures/everness_tenanea_flowers_vine_end.png new file mode 100644 index 00000000..847e6f8d Binary files /dev/null and b/mods/everness/textures/everness_tenanea_flowers_vine_end.png differ diff --git a/mods/everness/textures/everness_termite_block.png b/mods/everness/textures/everness_termite_block.png new file mode 100644 index 00000000..17d85c2b Binary files /dev/null and b/mods/everness/textures/everness_termite_block.png differ diff --git a/mods/everness/textures/everness_tinted_glass_base.png b/mods/everness/textures/everness_tinted_glass_base.png new file mode 100644 index 00000000..0339e8a9 Binary files /dev/null and b/mods/everness/textures/everness_tinted_glass_base.png differ diff --git a/mods/everness/textures/everness_tinted_glass_detail.png b/mods/everness/textures/everness_tinted_glass_detail.png new file mode 100644 index 00000000..4c4deca7 Binary files /dev/null and b/mods/everness/textures/everness_tinted_glass_detail.png differ diff --git a/mods/everness/textures/everness_trapdoor_cursed_steel_bar.png b/mods/everness/textures/everness_trapdoor_cursed_steel_bar.png new file mode 100644 index 00000000..e8d54d39 Binary files /dev/null and b/mods/everness/textures/everness_trapdoor_cursed_steel_bar.png differ diff --git a/mods/everness/textures/everness_trapdoor_cursed_steel_bar_side.png b/mods/everness/textures/everness_trapdoor_cursed_steel_bar_side.png new file mode 100644 index 00000000..b6424ff2 Binary files /dev/null and b/mods/everness/textures/everness_trapdoor_cursed_steel_bar_side.png differ diff --git a/mods/everness/textures/everness_twisted_crystal_grass.png b/mods/everness/textures/everness_twisted_crystal_grass.png new file mode 100644 index 00000000..3430cce2 Binary files /dev/null and b/mods/everness/textures/everness_twisted_crystal_grass.png differ diff --git a/mods/everness/textures/everness_twisted_vine_1.png b/mods/everness/textures/everness_twisted_vine_1.png new file mode 100644 index 00000000..57ff10d9 Binary files /dev/null and b/mods/everness/textures/everness_twisted_vine_1.png differ diff --git a/mods/everness/textures/everness_twisted_vine_2.png b/mods/everness/textures/everness_twisted_vine_2.png new file mode 100644 index 00000000..bad978d3 Binary files /dev/null and b/mods/everness/textures/everness_twisted_vine_2.png differ diff --git a/mods/everness/textures/everness_twisted_vine_end.png b/mods/everness/textures/everness_twisted_vine_end.png new file mode 100644 index 00000000..c4ca5d24 Binary files /dev/null and b/mods/everness/textures/everness_twisted_vine_end.png differ diff --git a/mods/everness/textures/everness_venus_trap_item.png b/mods/everness/textures/everness_venus_trap_item.png new file mode 100644 index 00000000..a165206e Binary files /dev/null and b/mods/everness/textures/everness_venus_trap_item.png differ diff --git a/mods/everness/textures/everness_venus_trap_mesh.png b/mods/everness/textures/everness_venus_trap_mesh.png new file mode 100644 index 00000000..59e3641a Binary files /dev/null and b/mods/everness/textures/everness_venus_trap_mesh.png differ diff --git a/mods/everness/textures/everness_vine_cave_1.png b/mods/everness/textures/everness_vine_cave_1.png new file mode 100644 index 00000000..b3beb2c3 Binary files /dev/null and b/mods/everness/textures/everness_vine_cave_1.png differ diff --git a/mods/everness/textures/everness_vine_cave_2.png b/mods/everness/textures/everness_vine_cave_2.png new file mode 100644 index 00000000..52493058 Binary files /dev/null and b/mods/everness/textures/everness_vine_cave_2.png differ diff --git a/mods/everness/textures/everness_vine_cave_end.png b/mods/everness/textures/everness_vine_cave_end.png new file mode 100644 index 00000000..549fff6e Binary files /dev/null and b/mods/everness/textures/everness_vine_cave_end.png differ diff --git a/mods/everness/textures/everness_vine_shears.png b/mods/everness/textures/everness_vine_shears.png new file mode 100644 index 00000000..85bc9bee Binary files /dev/null and b/mods/everness/textures/everness_vine_shears.png differ diff --git a/mods/everness/textures/everness_volcanic_rock.png b/mods/everness/textures/everness_volcanic_rock.png new file mode 100644 index 00000000..fc2eddf9 Binary files /dev/null and b/mods/everness/textures/everness_volcanic_rock.png differ diff --git a/mods/everness/textures/everness_volcanic_rock_with_magma_animated.png b/mods/everness/textures/everness_volcanic_rock_with_magma_animated.png new file mode 100644 index 00000000..1148155f Binary files /dev/null and b/mods/everness/textures/everness_volcanic_rock_with_magma_animated.png differ diff --git a/mods/everness/textures/everness_volcanic_sulfur_stone.png b/mods/everness/textures/everness_volcanic_sulfur_stone.png new file mode 100644 index 00000000..f6889b6c Binary files /dev/null and b/mods/everness/textures/everness_volcanic_sulfur_stone.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_blue.png b/mods/everness/textures/everness_wall_vine_cave_blue.png new file mode 100644 index 00000000..39df69fa Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_blue.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_blue_item.png b/mods/everness/textures/everness_wall_vine_cave_blue_item.png new file mode 100644 index 00000000..b345b260 Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_blue_item.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_cyan.png b/mods/everness/textures/everness_wall_vine_cave_cyan.png new file mode 100644 index 00000000..0e8e79cb Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_cyan.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_cyan_item.png b/mods/everness/textures/everness_wall_vine_cave_cyan_item.png new file mode 100644 index 00000000..6660801a Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_cyan_item.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_green.png b/mods/everness/textures/everness_wall_vine_cave_green.png new file mode 100644 index 00000000..e42458f1 Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_green.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_green_item.png b/mods/everness/textures/everness_wall_vine_cave_green_item.png new file mode 100644 index 00000000..e68e45c0 Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_green_item.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_violet.png b/mods/everness/textures/everness_wall_vine_cave_violet.png new file mode 100644 index 00000000..741887ed Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_violet.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_violet_item.png b/mods/everness/textures/everness_wall_vine_cave_violet_item.png new file mode 100644 index 00000000..80ca072f Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_violet_item.png differ diff --git a/mods/everness/textures/everness_water_geyser_item.png b/mods/everness/textures/everness_water_geyser_item.png new file mode 100644 index 00000000..5d966c1d Binary files /dev/null and b/mods/everness/textures/everness_water_geyser_item.png differ diff --git a/mods/everness/textures/everness_water_geyser_particle.png b/mods/everness/textures/everness_water_geyser_particle.png new file mode 100644 index 00000000..27787289 Binary files /dev/null and b/mods/everness/textures/everness_water_geyser_particle.png differ diff --git a/mods/everness/textures/everness_weeping_obsidian.png b/mods/everness/textures/everness_weeping_obsidian.png new file mode 100644 index 00000000..c1a5931b Binary files /dev/null and b/mods/everness/textures/everness_weeping_obsidian.png differ diff --git a/mods/everness/textures/everness_whispering_gourd_vine_1.png b/mods/everness/textures/everness_whispering_gourd_vine_1.png new file mode 100644 index 00000000..5fa9128c Binary files /dev/null and b/mods/everness/textures/everness_whispering_gourd_vine_1.png differ diff --git a/mods/everness/textures/everness_whispering_gourd_vine_2.png b/mods/everness/textures/everness_whispering_gourd_vine_2.png new file mode 100644 index 00000000..f1a3e194 Binary files /dev/null and b/mods/everness/textures/everness_whispering_gourd_vine_2.png differ diff --git a/mods/everness/textures/everness_whispering_gourd_vine_end.png b/mods/everness/textures/everness_whispering_gourd_vine_end.png new file mode 100644 index 00000000..c4440528 Binary files /dev/null and b/mods/everness/textures/everness_whispering_gourd_vine_end.png differ diff --git a/mods/everness/textures/everness_willow_leaves.png b/mods/everness/textures/everness_willow_leaves.png new file mode 100644 index 00000000..e0234ff2 Binary files /dev/null and b/mods/everness/textures/everness_willow_leaves.png differ diff --git a/mods/everness/textures/everness_willow_sapling.png b/mods/everness/textures/everness_willow_sapling.png new file mode 100644 index 00000000..0b20ff39 Binary files /dev/null and b/mods/everness/textures/everness_willow_sapling.png differ diff --git a/mods/everness/textures/everness_willow_tree_sapling.png b/mods/everness/textures/everness_willow_tree_sapling.png new file mode 100644 index 00000000..433a55e9 Binary files /dev/null and b/mods/everness/textures/everness_willow_tree_sapling.png differ diff --git a/mods/everness/textures/everness_willow_tree_side.png b/mods/everness/textures/everness_willow_tree_side.png new file mode 100644 index 00000000..d928294c Binary files /dev/null and b/mods/everness/textures/everness_willow_tree_side.png differ diff --git a/mods/everness/textures/everness_willow_tree_top.png b/mods/everness/textures/everness_willow_tree_top.png new file mode 100644 index 00000000..2bc50d00 Binary files /dev/null and b/mods/everness/textures/everness_willow_tree_top.png differ diff --git a/mods/everness/textures/everness_willow_vine_1.png b/mods/everness/textures/everness_willow_vine_1.png new file mode 100644 index 00000000..b0fce664 Binary files /dev/null and b/mods/everness/textures/everness_willow_vine_1.png differ diff --git a/mods/everness/textures/everness_willow_vine_2.png b/mods/everness/textures/everness_willow_vine_2.png new file mode 100644 index 00000000..61af58cd Binary files /dev/null and b/mods/everness/textures/everness_willow_vine_2.png differ diff --git a/mods/everness/textures/everness_willow_vine_end.png b/mods/everness/textures/everness_willow_vine_end.png new file mode 100644 index 00000000..ec68967b Binary files /dev/null and b/mods/everness/textures/everness_willow_vine_end.png differ diff --git a/mods/everness/textures/everness_willow_wood.png b/mods/everness/textures/everness_willow_wood.png new file mode 100644 index 00000000..826a77b8 Binary files /dev/null and b/mods/everness/textures/everness_willow_wood.png differ diff --git a/mods/everness/textures/everness_xpanes_edge_pyrite.png b/mods/everness/textures/everness_xpanes_edge_pyrite.png new file mode 100644 index 00000000..458e78e9 Binary files /dev/null and b/mods/everness/textures/everness_xpanes_edge_pyrite.png differ diff --git a/mods/everness/tools.lua b/mods/everness/tools.lua new file mode 100644 index 00000000..7f0e30cb --- /dev/null +++ b/mods/everness/tools.lua @@ -0,0 +1,404 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +Everness:register_tool('everness:vine_shears', { + description = S('Vine Shears'), + inventory_image = 'everness_vine_shears.png', + wield_image = 'everness_vine_shears.png', + wield_scale = { x = 2, y = 2, z = 1 }, + sound = { breaks = 'everness_tool_breaks' }, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 0, + groupcaps = { + snappy = { times = { [3] = 0.2 }, uses = 30, maxlevel = 3 }, + wool = { times = { [3] = 0.2 }, uses = 30, maxlevel = 3 } + } + }, + groups = { + -- Everness + vine_shears = 1 + }, + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + shearsy = { speed = 1.5, level = 1, uses = 238 }, + shearsy_wool = { speed = 5, level = 1, uses = 238 }, + shearsy_cobweb = { speed = 15, level = 1, uses = 238 } + }, +}) + +Everness:register_tool('everness:pick_illuminating', { + description = 'Illuminating Pickaxe (secondary use to place temporary illuminating crystal)', + short_description = 'Illuminating Pickaxe', + inventory_image = 'everness_pick_illuminating.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 3, + groupcaps = { + cracky = { times = { [1] = 2.0, [2] = 1.0, [3] = 0.50 }, uses = 60, maxlevel = 3 } + }, + damage_groups = { fleshy = 5 }, + }, + sound = { breaks = 'everness_tool_breaks' }, + groups = { pickaxe = 1, enchantability = 10 }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == 'node' then + local pos = minetest.get_pointed_thing_position(pointed_thing) + + if not pos or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pointed_node = minetest.get_node(pos) + local pointed_node_def = minetest.registered_nodes[pointed_node.name] + local pos_placer = placer:get_pos() + + if not pointed_node then + return itemstack + end + + -- check if we have to use default on_place first + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos, pointed_node, placer, itemstack, pointed_thing) + end + + if not minetest.is_protected(pointed_thing.above, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) + and minetest.get_node(pointed_thing.above).name == 'air' + then + -- place crystal + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + minetest.add_particlespawner({ + amount = 50, + time = 1, + size = { + min = 0.5, + max = 1, + }, + exptime = 2, + pos = vector.new(pos_placer.x, pos_placer.y, pos_placer.z), + texture = { + name = 'everness_particle.png^[colorize:#FFEE83:255', + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + } + }, + radius = { min = 0.5, max = 0.7 }, + attract = { + kind = 'point', + strength = 1, + origin = vector.new(pointed_thing.above.x, pointed_thing.above.y, pointed_thing.above.z), + }, + glow = 12 + }) + end + + minetest.set_node(pointed_thing.above, { name = 'everness:floating_crystal' }) + minetest.get_node_timer(pointed_thing.above):start(math.random(85, 95)) + + if not minetest.settings:get_bool('creative_mode') + or not minetest.check_player_privs(placer:get_player_name(), { creative = true }) + then + local wear_to_add = 65535 / (150 - 1) + + if itemstack:get_wear() + wear_to_add > 65535 then + local itemstack_def = itemstack:get_definition() + -- Break tool + minetest.sound_play(itemstack_def.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + end + + itemstack:add_wear(wear_to_add) + end + + return itemstack + end + end + + return itemstack + end, + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 1562 } + }, +}) + +Everness:register_tool('everness:pick_archeological', { + description = 'Archeological pickaxe has the ability to get rare items from certain ores. (Use to get different kinds of ceramic sherds from ores with ceramic sherds)', + short_description = 'Archeological pickaxe', + inventory_image = 'everness_pick_archeological.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level = 0, + groupcaps = { + cracky = { times = { [3] = 1.60 }, uses = 20, maxlevel = 1 } + }, + damage_groups = { fleshy = 2 }, + }, + sound = { breaks = 'everness_tool_breaks' }, + groups = { + -- MTG + pickaxe = 1, + -- X Enchanting + enchantability = 10, + -- Everness + archeological_drop = 1 + }, + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + pickaxey = { speed = 2, level = 2, uses = 500 } + }, +}) + +Everness:register_tool('everness:shovel_silk', { + description = S('Silk Shovel'), + inventory_image = 'everness_shovel_silk.png', + wield_image = 'everness_shovel_silk.png^[transformR90', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 1, + groupcaps = { + crumbly = { times = { [1] = 1.10,[2] = 0.50,[3] = 0.30 }, uses = 30, maxlevel = 3 }, + }, + damage_groups = { fleshy = 4 }, + }, + sound = { + breaks = 'everness_tool_breaks' + }, + -- no `shovel` group so it cannot be enchanted + -- groups = { shovel = 1 } + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + shovely = { speed = 8, level = 5, uses = 1562 } + }, +}) + +local old_handle_node_drops = minetest.handle_node_drops + +function minetest.handle_node_drops(pos, drops, digger) + if not digger + or not digger:is_player() + or digger:get_wielded_item():get_name() ~= 'everness:shovel_silk' + then + return old_handle_node_drops(pos, drops, digger) + end + + local node = minetest.get_node(pos) + + -- Silk Touch + if minetest.get_item_group(node.name, 'crumbly') > 0 + and minetest.get_item_group(node.name, 'no_silktouch') == 0 + then + -- drop raw item/node + return old_handle_node_drops(pos, { ItemStack(node.name) }, digger) + end + + return old_handle_node_drops(pos, drops, digger) +end + +Everness:register_tool('everness:shell_of_underwater_breathing', { + description = S('Shell of Underwater Breating'), + inventory_image = 'everness_shell_of_underwarer_breathing.png', + wield_image = 'everness_shell_of_underwarer_breathing.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = { times = { [2] = 3.00,[3] = 0.70 }, uses = 0, maxlevel = 1 }, + snappy = { times = { [3] = 0.40 }, uses = 0, maxlevel = 1 }, + oddly_breakable_by_hand = { times = { [1] = 3.50,[2] = 2.00,[3] = 0.70 }, uses = 0 } + }, + damage_groups = { fleshy = 1 }, + }, + sound = { breaks = 'everness_tool_breaks' }, + on_place = function(itemstack, placer, pointed_thing) + return Everness:use_shell_of_underwater_breathing(itemstack, placer, pointed_thing) + end, + on_secondary_use = function(itemstack, user, pointed_thing) + return Everness:use_shell_of_underwater_breathing(itemstack, user, pointed_thing) + end, + -- MCL + _mcl_toollike_wield = true, +}) + +-- +-- Hammer +-- + +minetest.register_on_mods_loaded(function() + -- Hammer functionality and populating `cid_data` for lated VoxelManipulation + for name, def in pairs(minetest.registered_nodes) do + if def.walkable and def.pointable and def.diggable then + local prev_after_dig = def.after_dig_node + + local func = function(pos, node, metadata, digger) + Everness.hammer_after_dig_node(pos, node, metadata, digger, def.can_dig) + end + + if prev_after_dig then + func = function(pos, node, metadata, digger) + prev_after_dig(pos, node, metadata, digger) + Everness.hammer_after_dig_node(pos, node, metadata, digger, def.can_dig) + end + end + + minetest.override_item(name, { after_dig_node = func }) + + Everness.hammer_cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + can_dig = def.can_dig, + sounds = def.sounds + } + end + end +end) + +Everness:register_node('everness:hammer', { + description = S('Hammer'), + mod_origin = 'evermess', + inventory_image = 'everness_hammer_item.png', + use_texture_alpha = 'clip', + drawtype = 'mesh', + mesh = 'everness_hammer_pick.obj', + tiles = { 'everness_hammer_mesh.png' }, + wield_scale = { x = 2, y = 2, z = 2 }, + node_placement_prediction = '', + range = 4.0, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 3, + groupcaps = { + cracky = { times = { [1] = 2.0, [2] = 1.0, [3] = 0.50 }, uses = 30, maxlevel = 3 }, + }, + damage_groups = { fleshy = 5 }, + -- MCL + punch_attack_uses = 781, + }, + stack_max = 1, + sound = { breaks = 'everness_tool_breaks' }, + -- MCL + _mcl_toollike_wield = true, + groups = { + -- MCL + tool = 1, + dig_speed_class = 5 + }, + -- MCL + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 1562 } + }, + on_place = function(itemstack, placer, pointed_thing) + -- disable placing (returns `nil`) + if pointed_thing.type == 'node' then + local pos = minetest.get_pointed_thing_position(pointed_thing) + + if not pos or not placer then + return + end + + local pointed_node = minetest.get_node(pos) + local pointed_node_def = minetest.registered_nodes[pointed_node.name] + + if not pointed_node then + return + end + + -- check if we have to use default on_place first + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos, pointed_node, placer, itemstack, pointed_thing) + end + end + end +}) + +Everness:register_node('everness:hammer_sharp', { + description = S('Sharp') .. ' ' .. S('Hammer'), + mod_origin = 'evermess', + inventory_image = 'everness_hammer_sharp_item.png', + use_texture_alpha = 'clip', + drawtype = 'mesh', + mesh = 'everness_hammer_pick.obj', + tiles = { 'everness_hammer_sharp_mesh.png' }, + wield_scale = { x = 2, y = 2, z = 2 }, + node_placement_prediction = '', + range = 4.0, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 3, + groupcaps = { + cracky = { times = { [1] = 2.0, [2] = 1.0, [3] = 0.50 }, uses = 30, maxlevel = 3 }, + }, + damage_groups = { fleshy = 5 }, + -- MCL + punch_attack_uses = 781, + }, + stack_max = 1, + sound = { breaks = 'everness_tool_breaks' }, + -- MCL + _mcl_toollike_wield = true, + groups = { + -- MCL + tool = 1, + dig_speed_class = 5 + }, + -- MCL + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 1562 } + }, + on_place = function(itemstack, placer, pointed_thing) + -- disable placing (returns `nil`) + if pointed_thing.type == 'node' then + local pos = minetest.get_pointed_thing_position(pointed_thing) + + if not pos or not placer then + return + end + + local pointed_node = minetest.get_node(pos) + local pointed_node_def = minetest.registered_nodes[pointed_node.name] + + if not pointed_node then + return + end + + -- check if we have to use default on_place first + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos, pointed_node, placer, itemstack, pointed_thing) + end + end + end +}) diff --git a/mods/everness/torches.lua b/mods/everness/torches.lua new file mode 100644 index 00000000..e14ae3bc --- /dev/null +++ b/mods/everness/torches.lua @@ -0,0 +1,242 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + + Authors of source code + ---------------------- + Originally by celeron55, Perttu Ahola (LGPLv2.1+) + Various Minetest developers and contributors (LGPLv2.1+) + + The torch code was derived by sofar from the 'torches' mod by + BlockMen (LGPLv2.1+) +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local function on_flood(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack('everness:mineral_torch 1')) + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + + if not ( + nodedef + and nodedef.groups + and nodedef.groups.igniter + and nodedef.groups.igniter > 0 + ) then + minetest.sound_play('default_cool_lava', + { + pos = pos, + max_hear_distance = 16, + gain = 0.07 + }, + true + ) + end + -- Remove the torch node + return false +end + +Everness:register_node('everness:mineral_torch', { + description = S('Mineral') .. ' ' .. S('Torch'), + drawtype = 'mesh', + mesh = 'everness_mineral_torch.obj', + inventory_image = 'everness_mineral_torch_item.png', + wield_image = 'everness_mineral_torch_item.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tiles = { + { name = 'everness_mineral_torch_mesh.png' }, + { + name = 'everness_mineral_torch_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 36, + aspect_h = 6, + length = 1 + }, + backface_culling = false + } + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + light_source = 12, + groups = { + choppy = 2, + dig_immediate = 3, + flammable = 1, + attached_node = 1, + torch = 1 + }, + drop = 'everness:mineral_torch', + selection_box = { + type = 'wallmounted', + wall_bottom = { -1 / 8, -1 / 2, -1 / 8, 1 / 8, 2 / 16, 1 / 8 }, + }, + sounds = Everness.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + + if def + and def.on_rightclick + and not ( + placer + and placer:is_player() + and placer:get_player_control().sneak + ) + then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local above = pointed_thing.above + local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) + + local fakestack = itemstack + + if wdir == 0 then + fakestack:set_name('everness:mineral_torch_ceiling') + elseif wdir == 1 then + fakestack:set_name('everness:mineral_torch') + else + fakestack:set_name('everness:mineral_torch_wall') + end + + itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir) + + itemstack:set_name('everness:mineral_torch') + + return itemstack + end, + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +Everness:register_node('everness:mineral_torch_wall', { + drawtype = 'mesh', + mesh = 'everness_mineral_torch_wall.obj', + tiles = { + { name = 'everness_mineral_torch_mesh.png' }, + { + name = 'everness_mineral_torch_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 36, + aspect_h = 6, + length = 1 + }, + backface_culling = false + } + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = { + choppy = 2, + dig_immediate = 3, + flammable = 1, + not_in_creative_inventory = 1, + attached_node = 1, + torch = 1 + }, + drop = 'everness:mineral_torch', + selection_box = { + type = 'wallmounted', + wall_side = { -1 / 2, -1 / 2, -1 / 8, -1 / 8, 1 / 8, 1 / 8 }, + }, + sounds = Everness.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +Everness:register_node('everness:mineral_torch_ceiling', { + drawtype = 'mesh', + mesh = 'everness_mineral_torch_ceiling.obj', + tiles = { + { name = 'everness_mineral_torch_mesh.png' }, + { + name = 'everness_mineral_torch_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 36, + aspect_h = 6, + length = 1 + }, + backface_culling = false + } + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = { + choppy = 2, + dig_immediate = 3, + flammable = 1, + not_in_creative_inventory = 1, + attached_node = 1, + torch = 1 + }, + drop = 'everness:mineral_torch', + selection_box = { + type = 'wallmounted', + wall_top = { -1 / 8, -1 / 16, -5 / 16, 1 / 8, 1 / 2, 1 / 8 }, + }, + sounds = Everness.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_craft({ + output = 'everness:mineral_torch 16', + recipe = { + { 'everness:lotus_flower_pink' }, + { 'everness:palm_tree_wood' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_torch 16', + recipe = { + { 'everness:lotus_flower_purple' }, + { 'everness:palm_tree_wood' }, + } +}) + +minetest.register_craft({ + output = 'everness:mineral_torch 16', + recipe = { + { 'everness:lotus_flower_white' }, + { 'everness:palm_tree_wood' }, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'everness:mineral_torch', + burntime = 4, +}) diff --git a/mods/everness/trees.lua b/mods/everness/trees.lua new file mode 100644 index 00000000..d69643e9 --- /dev/null +++ b/mods/everness/trees.lua @@ -0,0 +1,184 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +function Everness.grow_coral_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_coral_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 14, y = pos.y, z = pos.z - 14 }, path, 'random', nil, false) +end + +function Everness.coral_tree_bioluminescent(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_coral_tree_bioluminescent_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 7, y = pos.y, z = pos.z - 7 }, path, 'random', nil, false) +end + +function Everness.grow_crystal_bush(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_crystal_bush.mts' + minetest.place_schematic({ x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + path, '0', nil, false) +end + +function Everness.grow_cursed_bush(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_cursed_bush.mts' + minetest.place_schematic({ x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + path, '0', nil, false) +end + +function Everness.grow_baobab_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts' + minetest.place_schematic({ x = pos.x - 12, y = pos.y, z = pos.z - 12 }, + path, 'random', nil, false) +end + +function Everness.grow_dry_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_dry_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 3, y = pos.y, z = pos.z - 3 }, + path, 'random', nil, false) +end + +function Everness.grow_willow_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_willow_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 19, y = pos.y, z = pos.z - 19 }, + path, 'random', nil, false) + + -- trigger vines + minetest.after(1, function(v_pos) + local size = { x = 39, y = 27, z = 39 } + local positions = minetest.find_nodes_in_area( + vector.round(vector.new(v_pos.x - (size.x / 2), v_pos.y, v_pos.z - (size.z / 2))), + vector.round(vector.new(v_pos.x + (size.x / 2), v_pos.y + size.y, v_pos.z + (size.z / 2))), + { 'group:vine' } + ) + + for _, vine_pos in ipairs(positions) do + Everness:tick_vine(vine_pos) + end + end, pos) +end + +function Everness.grow_sequoia_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_giant_sequoia_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 12, y = pos.y, z = pos.z - 12 }, + path, 'random', nil, false) +end + +function Everness.grow_crystal_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_crystal_tree.mts' + minetest.place_schematic({ x = pos.x - 6, y = pos.y, z = pos.z - 6 }, + path, 'random', nil, false) +end + +function Everness.grow_crystal_large_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_crystal_tree_large.mts' + minetest.place_schematic({ x = pos.x - 10, y = pos.y, z = pos.z - 10 }, + path, 'random', nil, false) +end + +function Everness.grow_cursed_dream_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_cursed_dream_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 8, y = pos.y, z = pos.z - 8 }, + path, 'random', nil, false) +end + +function Everness.grow_mese_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_mese_tree.mts' + minetest.place_schematic({ x = pos.x - 3, y = pos.y, z = pos.z - 3 }, + path, 'random', nil, false) +end + +function Everness.grow_palm_tree(pos) + local path = minetest.get_modpath('everness') .. '/schematics/everness_palm_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 7, y = pos.y, z = pos.z - 7 }, + path, '0', nil, false) +end + +function Everness.grow_lava_tree(pos) + local schem_everness_lava_tree = minetest.read_schematic(minetest.get_modpath('everness') .. '/schematics/everness_lava_tree.mts', {}) + local lava_nodes = minetest.find_nodes_in_area_under_air( + vector.subtract(pos, 1), + vector.add(pos, 1), + { 'group:lava' } + ) + local replacements + + if #lava_nodes > 0 then + replacements = { + ['everness:lava_tree'] = 'everness:lava_tree_with_lava', + } + end + + minetest.place_schematic( + pos, + schem_everness_lava_tree, + 'random', + replacements, + false, + 'place_center_x, place_center_z' + ) +end + +function Everness.grow_sapling(pos, groups_under) + if not Everness.can_grow(pos, groups_under) then + -- try again 5 min later + minetest.get_node_timer(pos):start(300) + return + end + + local node = minetest.get_node(pos) + + if node.name == 'everness:coral_tree_sapling' then + minetest.log('action', 'A coral tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_coral_tree(pos) + elseif node.name == 'everness:coral_tree_bioluminescent_sapling' then + minetest.log('action', 'A coral tree bioluminescent sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.coral_tree_bioluminescent(pos) + elseif node.name == 'everness:crystal_bush_sapling' then + minetest.log('action', 'A crystal bush sapling grows into a bush at ' .. minetest.pos_to_string(pos)) + Everness.grow_crystal_bush(pos) + elseif node.name == 'everness:cursed_bush_sapling' then + minetest.log('action', 'A cursed bush sapling grows into a bush at ' .. minetest.pos_to_string(pos)) + Everness.grow_cursed_bush(pos) + elseif node.name == 'everness:baobab_sapling' then + minetest.log('action', 'A baobab sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_baobab_tree(pos) + elseif node.name == 'everness:dry_tree_sapling' then + minetest.log('action', 'A dry tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_dry_tree(pos) + elseif node.name == 'everness:willow_tree_sapling' then + minetest.log('action', 'A willow tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_willow_tree(pos) + elseif node.name == 'everness:sequoia_tree_sapling' then + minetest.log('action', 'A sequoia tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_sequoia_tree(pos) + elseif node.name == 'everness:crystal_tree_sapling' then + minetest.log('action', 'A crystal tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_crystal_tree(pos) + elseif node.name == 'everness:crystal_tree_large_sapling' then + minetest.log('action', 'A crystal tree large sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_crystal_large_tree(pos) + elseif node.name == 'everness:cursed_dream_tree_sapling' then + minetest.log('action', 'A cursed dream tree large sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_cursed_dream_tree(pos) + elseif node.name == 'everness:mese_tree_sapling' then + minetest.log('action', 'A mese tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_mese_tree(pos) + elseif node.name == 'everness:palm_tree_sapling' then + minetest.log('action', 'A palm tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_palm_tree(pos) + elseif node.name == 'everness:lava_tree_sapling' then + minetest.log('action', 'A lava tree sapling grows into a tree at ' .. minetest.pos_to_string(pos)) + Everness.grow_lava_tree(pos) + end +end diff --git a/mods/everness/vines.lua b/mods/everness/vines.lua new file mode 100644 index 00000000..d93aaead --- /dev/null +++ b/mods/everness/vines.lua @@ -0,0 +1,332 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local function register_vine(name, def, overrides) + local _overrides = overrides and table.copy(overrides) or {} + local _def = table.copy(def) + local _name = name + + _def.walkable = false + _def.climbable = true + _def.sunlight_propagates = true + _def.paramtype = 'light' + _def.buildable_to = false + _def.drawtype = 'plantlike' + _def.paramtype2 = 'meshoptions' + _def.place_param2 = 8 + _def.visual_scale = 1.1 + _def.light_source = 7 + _def.selection_box = def.selection_box or { + type = 'fixed', + fixed = { -4 / 16, -8 / 16, -4 / 16, 4 / 16, 8 / 16, 4 / 16 } + } + _def.groups = { + -- MTG + vine = 1, + snappy = 3, + -- Everness + falling_vines = 1, + no_silktouch = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + fire_encouragement = 15, + fire_flammability = 100, + -- ALL + flammable = 2, + } + + if _overrides.groups then + Everness.mergeTables(_def.groups, _overrides.groups) + end + + -- MCL + _def._mcl_shears_drop = true + _def._mcl_blast_resistance = 0.2 + _def._mcl_hardness = 0.2 + _def.on_rotate = function() + return false + end + _def.sounds = Everness.node_sound_leaves_defaults() + _def.waving = 1 + _def.on_destruct = function(pos) + local pos_below = vector.new(pos.x, pos.y - 1, pos.z) + local node_below = minetest.get_node(pos_below) + + if minetest.get_item_group(node_below.name, 'vine') > 0 then + minetest.remove_node(pos_below) + end + end + _def.after_dig_node = function(pos, oldnode, oldmetadata, digger) + local pos_above = vector.new(pos.x, pos.y + 1, pos.z) + Everness:tick_vine(pos_above) + end + _def.on_construct = function(pos) + Everness:tick_vine(pos) + end + + local grow_vine_node_names = {} + local grow_vine_end_node_name = '' + + for i = 1, 3 do + local _d = table.copy(_def) + local _n = _name + local first = i == 1 + local last = i == 3 + + if last then + -- end + _n = _n .. '_end' + _d.groups.vine_end = 1 + grow_vine_end_node_name = 'everness:' .. _n + _d.tiles = { 'everness_' .. _n .. '.png' } + _d.wield_image = 'everness_' .. _n .. '.png' + _d.inventory_image = 'everness_' .. _n .. '.png' + + _d.drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:' .. _n } + } + } + } + + if _overrides.last_def then + -- custom, not 'plantlike' drawtype + for k, v in pairs(_overrides.last_def) do + _d[k] = v + end + + if not _overrides.last_def.place_param2 then + _d.place_param2 = nil + end + end + else + -- 1, 2.. + _n = _n .. '_' .. i + _d.tiles = { 'everness_' .. _n .. '.png' } + _d.wield_image = 'everness_' .. _n .. '.png' + _d.inventory_image = 'everness_' .. _n .. '.png' + + _d.drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:' .. _n } + } + } + } + + table.insert(grow_vine_node_names, 'everness:' .. _n) + end + + if not first then + -- 2.., end + _d.light_source = 12 + end + + _d.on_timer = function(pos, elapsed) + Everness:grow_vine(pos, elapsed, { + node_names = grow_vine_node_names, + end_node_name = grow_vine_end_node_name, + end_node_param2 = _overrides.end_node_param2 and _overrides.end_node_param2 or nil + }) + end + + Everness:register_node('everness:' .. _n, _d) + end +end + +-- Cave vine + +register_vine('vine_cave', { + description = S('Cave Vine') +}) + +minetest.register_alias('everness:vine_cave', 'everness:vine_cave_1') +minetest.register_alias('everness:vine_cave_with_mese_leaves', 'everness:vine_cave_2') + +-- Whispering Gourd Vine + +register_vine('whispering_gourd_vine', { + description = S('Whispering Gourd Vine') +}) + +-- Bulb Vine + +register_vine('bulb_vine', { + description = S('Bulb Vine') +}) + +-- Willow Vine + +register_vine('willow_vine', { + description = S('Willow Vine') +}, { + groups = { + falling_vines = 0 + } +}) + +-- Eye Vine + +register_vine('eye_vine', + { + description = S('Eye Vine'), + }, + { + end_node_param2 = 0, + last_def = { + tiles = { + 'everness_eye_vine_end_top.png', + 'everness_eye_vine_end_bottom.png', + 'everness_eye_vine_end_side.png', + }, + wield_image = 'everness_eye_vine_end_bottom.png', + inventory_image = 'everness_eye_vine_end_bottom.png', + drawtype = 'normal', + paramtype2 = 'facedir', + sunlight_propagates = false, + visual_scale = 1, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:eye_vine_lantern' } + } + } + } + } + } +) + +-- Lumabus Vine + +register_vine('lumabus_vine', + { + description = S('Lumabus Vine') + }, + { + end_node_param2 = 0, + last_def = { + tiles = { + 'everness_lumabus_bulb_purple.png', + { + name = 'everness_lumabus_leaves.png', + backface_culling = false + } + }, + use_texture_alpha = 'clip', + drawtype = 'mesh', + mesh = 'everness_lumabus.obj', + paramtype2 = 'wallmounted', + sunlight_propagates = false, + visual_scale = 1, + selection_box = { + type = 'fixed', + fixed = { + -1 / 2 + 3 / 16, + -1 / 2, + -1 / 2 + 3 / 16, + 1 / 2 - 3 / 16, + 1 / 2 - 6 / 16, + 1 / 2 - 3 / 16 + } + }, + drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:lumabus_vine_lantern' } + } + } + } + }, + } +) + +-- Ivis Vine + +register_vine('ivis_vine', { + description = S('Ivis Vine') +}) + +-- Flowered vine + +register_vine('flowered_vine', { + description = S('Flowered Vine') +}) + +-- Reeds vine + +register_vine('reeds_vine', { + description = S('Reeds Vine') +}) + +-- Tenanea Flowers vine + +register_vine('tenanea_flowers_vine', { + description = S('Tenanea Flowers Vine') +}) + +-- Twisted vine + +register_vine('twisted_vine', { + description = S('Twisted Vine') +}) + +-- Golden vine + +register_vine('golden_vine', { + description = S('Golden Vine') +}) + +-- Dense vine + +register_vine('dense_vine', { + description = S('Dense Vine') +}) + +-- LBMs + +Everness:register_lbm({ + label = 'Grows vines', + name = 'everness:vines', + nodenames = { 'group:vine' }, + run_at_every_load = true, + action = function(pos, node) + Everness:tick_vine(pos) + end, +}) diff --git a/mods/everness/vines_wall.lua b/mods/everness/vines_wall.lua new file mode 100644 index 00000000..d3b028ee --- /dev/null +++ b/mods/everness/vines_wall.lua @@ -0,0 +1,113 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local function register_vine_wall(name, def, overrides) + local _def = table.copy(def) + local _name = name + + _def.short_description = _def.short_description or _def.description + _def.drawtype = 'mesh' + _def.tiles = _def.tiles or { + { name = 'everness_' .. _name .. '.png' } + } + _def.inventory_image = 'everness_' .. _name .. '_item.png' + _def.wield_image = 'everness_' .. _name .. '_item.png' + _def.mesh = 'everness_vine_wall.obj' + _def.use_texture_alpha = 'clip' + _def.paramtype = 'light' + _def.paramtype2 = 'wallmounted' + _def.sunlight_propagates = true + _def.walkable = false + _def.climbable = true + _def.buildable_to = false + _def.sounds = Everness.node_sound_leaves_defaults() + _def.groups = { + -- MTG + vine = 1, + snappy = 3, + -- Everness + -- falling_vines = 1, + no_silktouch = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + fire_encouragement = 15, + fire_flammability = 100, + -- ALL + flammable = 2, + attached_node = 1, + } + _def._mcl_blast_resistance = 0.2 + _def._mcl_hardness = 0.2 + _def.selection_box = { + type = 'fixed', + fixed = { + -8 / 16, + -8 / 16, + -8 / 16, + 8 / 16, + -5 / 16, + 8 / 16 + } + } + _def.collision_box = { + type = 'fixed', + fixed = { + -8 / 16, + -8 / 16, + -8 / 16, + 8 / 16, + -5 / 16, + 8 / 16 + } + } + _def.waving = 3 + _def.light_source = _def.light_source or 4 + + _def.on_rotate = function() + return false + end + + Everness:register_node('everness:' .. _name, _def) +end + +-- Cave vine + +-- register_vine_wall('wall_vine_cave_green', { +-- description = S('Wall Cave Vine Green'), +-- }) + +register_vine_wall('wall_vine_cave_blue', { + description = S('Wall Cave Vine Blue'), +}) + +register_vine_wall('wall_vine_cave_cyan', { + description = S('Wall Cave Vine Cyan'), +}) + +register_vine_wall('wall_vine_cave_violet', { + description = S('Wall Cave Vine Violet'), +}) diff --git a/mods/everness/walls.lua b/mods/everness/walls.lua new file mode 100644 index 00000000..f303c6ac --- /dev/null +++ b/mods/everness/walls.lua @@ -0,0 +1,302 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +walls.register( + 'everness:coral_desert_cobble_wall', + S('Coral Cobblestone Wall'), + { 'everness_coral_desert_cobble.png' }, + 'everness:coral_desert_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_desert_mossy_cobble_wall', + S('Coral Mossy Cobblestone Wall'), + { 'everness_coral_desert_mossy_cobble.png' }, + 'everness:coral_desert_mossy_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_brick_wall', + S('Cursed Brick Wall'), + { 'everness_cursed_brick.png' }, + 'everness:cursed_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_brick_with_growth_wall', + S('Cursed Brick with Growth Wall'), + { 'everness_cursed_brick_with_growth.png' }, + 'everness:cursed_brick_with_growth', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_tundra_cobble_wall', + S('Forsaken Tundra Cobblestone Wall'), + { 'everness_forsaken_tundra_cobblestone.png' }, + 'everness:forsaken_tundra_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_tundra_stone_wall', + S('Forsaken Tundra Stone Wall'), + { 'everness_forsaken_tundra_stone.png' }, + 'everness:forsaken_tundra_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_tundra_brick_wall', + S('Forsaken Tundra Brick Wall'), + { 'everness_forsaken_tundra_brick.png' }, + 'everness:forsaken_tundra_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:magmacobble_wall', + S('Magma Cobblestone Wall'), + { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + 'everness:magmacobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:volcanic_rock_wall', + S('Volcanic Rock Wall'), + { 'everness_volcanic_rock.png' }, + 'everness:volcanic_rock', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:volcanic_rock_with_magma_wall', + S('Volcanic Rock with Magma Wall'), + { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + 'everness:volcanic_rock_with_magma', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_bones_block_wall', + S('Coral Bones Block Wall'), + { 'everness_coral_bones_block.png' }, + 'everness:coral_bones_block', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_bones_brick_wall', + S('Coral Bones Brick Wall'), + { 'everness_coral_bones_brick.png' }, + 'everness:coral_bones_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_deep_ocean_sandstone_brick_wall', + S('Coral Bones Brick Wall'), + { 'everness_deep_ocean_sandstone_brick.png' }, + 'everness:coral_deep_ocean_sandstone_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_deep_ocean_sandstone_block_wall', + S('Coral Bones Brick Wall'), + { 'everness_deep_ocean_sandstone_block.png' }, + 'everness:coral_deep_ocean_sandstone_block', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:crystal_cobble_wall', + S('Crystal Cobblestone Wall'), + { 'everness_crystal_cobble.png' }, + 'everness:crystal_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:crystal_mossy_cobble_wall', + S('Crystal Mossy Cobblestone Wall'), + { 'everness_crystal_mossy_cobble.png' }, + 'everness:crystal_mossy_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_sandstone_brick_wall', + S('Cursed Sandstone Brick Wall'), + { 'everness_cursed_sandstone_brick.png' }, + 'everness:cursed_sandstone_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_sandstone_block_wall', + S('Cursed Sandstone Block Wall'), + { 'everness_cursed_sandstone_block.png' }, + 'everness:cursed_sandstone_block', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_stone_carved_wall', + S('Cursed Stone Carved Wall'), + { + { + name = 'everness_cursed_stone_carved.png', + align_style = 'world', + scale = 2 + } + }, + 'everness:cursed_stone_carved', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_cobble_wall', + S('Forsaken Desert Cobblestone Wall'), + { 'everness_forsaken_desert_cobble.png' }, + 'everness:forsaken_desert_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_cobble_red_wall', + S('Forsaken Desert Cobblestone Red Wall'), + { 'everness_forsaken_desert_cobble_red.png' }, + 'everness:forsaken_desert_cobble_red', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_brick_wall', + S('Forsaken Desert Brick Wall'), + { 'everness_forsaken_desert_brick.png' }, + 'everness:forsaken_desert_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_brick_red_wall', + S('Forsaken Desert Brick Red Wall'), + { 'everness_forsaken_desert_brick_red.png' }, + 'everness:forsaken_desert_brick_red', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_chiseled_stone_wall', + S('Forsaken Desert Chiseled Stone'), + { + 'everness_forsaken_desert_chiseled_stone_top.png', + 'everness_forsaken_desert_chiseled_stone_bottom.png', + 'everness_forsaken_desert_chiseled_stone_side.png' + }, + 'everness:forsaken_desert_chiseled_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_engraved_stone_wall', + S('Forsaken Desert Engraved Stone Wall'), + { 'everness_forsaken_desert_engraved_stone.png' }, + 'everness:forsaken_desert_engraved_stone', + Everness.node_sound_stone_defaults() +) + +-- Mineral Waters Under +walls.register( + 'everness:mineral_cave_stone_wall', + S('Mineral Cave Stone Wall'), + {{ + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + }}, + 'everness:mineral_cave_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:mineral_cave_cobblestone_wall', + S('Mineral Cave Cobblestone Wall'), + {{ + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + }}, + 'everness:mineral_cave_cobblestone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:mineral_lava_stone_wall', + S('Mineral Lava Stone with lava Wall'), + {{ + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }}, + 'everness:mineral_lava_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:mineral_lava_stone_dry_wall', + S('Mineral Lava Stone without lava Wall'), + {{ + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + }}, + 'everness:mineral_lava_stone_dry', + Everness.node_sound_stone_defaults() +) diff --git a/mods/farming/README.md b/mods/farming/README.md new file mode 100644 index 00000000..ec4143e1 --- /dev/null +++ b/mods/farming/README.md @@ -0,0 +1,276 @@ +Farming Redo mod for Minetest +============================= + +Information +----------- + +This mod replaces the default `farming` mod with a fully compatible API that allows +players to grow crops even when they are not nearby. It also includes many new foods +and crops which can be planted directly onto tilled soil without seeds. Crops that do +require seeds like wheat and cotton are found when digging in long grasses, and will +require player to stay nearby until they germinate before growing normally. + +![screenshot.png](screenshot.png) + +Tech information +---------------- + +Crops grow by adding your new plant to the {growing = 1} group and numbering the stages from _1 to as many stages as you like, but the underscore MUST be used only once in the node name to separate plant from stage number e.g. + +* "farming:cotton_1" through to "farming:cotton_8" +* "farming:wheat_1" through to "farming:wheat_8" +* "farming:cucumber_1" through to "farming:cucumber_4" + +https://forum.minetest.net/viewtopic.php?id=9019 + +Farming Redo also works with Bonemeal mod for quick growing crops and saplings which can +be found at https://notabug.org/TenPlus1/bonemeal + +#### Optional dependences: + +* default +* mcl_core, mcl_sounds, mcl_farming, mcl_stairs +* stairs +* lucky_block (adds 47 lucky blocks) +* toolranks + +#### Configuration + +`farming.conf` is used to load custom settings for each crop and can be found in either the +farming mod folder or the world folder. Also `minetest.conf` contains a setting for crop growth speed. + + +| Configuration | type | default | file | Notes | +| -------------------- | ----- | ------- | ------------ | ----------------------------------------- | +| farming_stage_length | float | 160.0 | minetest.conf | Contains a value used for speed of crop growth in seconds | +| farming.min_light | int | 12 | farming.conf | default minimum light levels crops need to grow | +| farming.max_light | int | 15 | farming.conf | default maximum light levels crops need to grow | +| farming_use_utensils | bool | True | farming.conf | When True uses utensils in craft recipes | +| farming.carrot | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.potato | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.tomato | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.cucumber | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.corn | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.coffee | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.melon | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.pumpkin | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.cocoa | bool | true | farming.conf | true to enable crop/food or false to disable | +| farming.raspberry | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.blueberry | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.rhubarb | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.beans | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.grapes | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.barley | bool | true | farming.conf | true to enable crop/food, false to disable | +| farming.chili | float | 0.003 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.hemp | float | 0.003 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.garlic | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.onion | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.pepper | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.pineapple | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.peas | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.beetroot | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.mint | float | 0.005 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.cabbage | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.blackberry | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.lettuce | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.soy | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.vanilla | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.artichoke | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.parsley | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.sunflower | float | 0.001 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.grains | bool | true | farming.conf | true to enable crop/food or false to disable | +| farming.rice | bool | true | farming.conf | true to enable crop/food or false to disable | +| farming.asparagus | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.eggplant | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.spinach | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | +| farming.strawberry | float | 0.002 | farming.conf | rarety value to enable crop/food in-game, false to disable | + +#### Nodes and food + +This farming mod provides a large selection of craftable food and items: + +| Node name | Description name | +| ----------------------- | --------------------- | +| farming:salt | Salt | +| farming:salt_crystal | Salt Crystal | +| farming:chili_powder | Chili Powder | +| farming:rose_water | Rose Water | +| farming:glass_water | Glass of Water | +| farming:sugar | Sugar | +| farming:sugar_cube | Sugar Cube | +| farming:caramel | Caramel | +| farming:turkish_delight | Turkish Delight | +| farming:garlic_bread | Garlic Bread | +| farming:donut | Donut | +| farming:donut_chocolate | Chocolate Donut | +| farming:donut_apple | Apple Donut | +| farming:porridge | Porridge | +| farming:jaffa_cake | Jaffa Cake | +| farming:apple_pie | Apple Pie | +| farming:cactus_juice | Cactus Juice | +| farming:pasta | Pasta | +| farming:mac_and_cheese | Mac & Cheese | +| farming:spaghetti | Spaghetti | +| farming:bibimbap | Bibimbap | +| farming:burger | Burger | +| farming:salad | Salad | +| farming:smoothie_berry | Triple Berry Smoothie | +| farming:spanish_potatoes | Spanish Potatoes | +| farming:potato_omelet | Potato omelet | +| farming:paella | Paella | +| farming:flan | Vanilla Flan | +| farming:cheese_vegan | Vegan Cheese | +| farming:onigiri | Onigiri | +| farming:gyoza | Gyoza | +| farming:mochi | Mochi | +| farming:beetroot_soup | Beetroot Soup | +| farming:muffin_blueberry | Blueberry Muffin | +| farming:blueberry_pie | Blueberry Pie | +| farming:carrot_juice | Carrot Juice | +| farming:carrot_gold | Golden Carrot (revives) | +| farming:chili_bowl | Bowl or Chili | +| farming:cocoa_beans | Cocoa Beans | +| farming:cookie | Chocolate Cookie | +| farming:chocolate_dark | Bar of Dark Chocolate | +| farming:chocolate_block | Chocolate Block | +| farming:coffee_cup | Cup of Coffee | +| farming:corn_cob | Corn on the Cob | +| farming:popcorn | Popcorn | +| farming:cornstarch | Cornstarch | +| farming:ethanol | Bottle of Ethanol (fuel) | +| farming:string | String | +| farming:garlic_braid | Garlic Braid | +| farming:garlic_clove | Garlic Clove | +| farming:hemp_oil | Hemp Oil | +| farming:hemp_fibre | Hemp Fibre | +| farming:hemp_block | Hemp Block | +| farming:hemp_rope | Hemp Rope | +| farming:mint_tea | Mint Tea | +| farming:onion_soup | Onion Soup | +| farming:pea_soup | Pea Soup | +| farming:pepper_ground | Ground Pepper | +| farming:pineapple_ring | Pineapple Ring | +| farming:pineapple_juice | Pineapple Juice | +| farming:baked_potato | Baked Potato | +| farming:potato_salad | Cucumber & Potato Salad | +| farming:jackolantern | Jack 'O Lantern | +| farming:scarecrow_bottom | Scarecrow Bottom | +| farming:pumpkin_dough | Pumpkin Dough | +| farming:pumpkin_bread | Pumpkin Bread | +| farming:smoothie_raspberry | Raspberry Smoothie | +| farming:rhubarb_pie | Rhybarb Pie | +| farming:rice_flour | Rice Flour | +| farming:rice_bread | Rice Bread | +| farming:flour_multigrain | Multigrain Rice | +| farming:bread_multigrain | Multigrain Bread | +| farming:soy_sauce | Soy Sauce | +| farming:soy_milk | Soy Milk | +| farming:tofu | Tofu | +| farming:tofu_cooked | Cooked Tofu | +| farming:sunflower_seeds_toasted | Toasted Sunflower Seeds | +| farming:sunflower_oil | Sunflower Oil | +| farming:sunflower_bread | Sunflower Bread | +| farming:tomato_soup | Tomato Soup | +| farming:vanilla_extract | Vanilla Extract | +| farming:flour | Flour | +| farming:bread | Bread | +| farming:straw | Straw Block | +| farming:bread_slice | Bread Slice | +| farming:toast | Toast | +| farming:toast_sandwich | Toast Sandwich | + +#### Item and Tools + +| node name | Description | +| ----------------------- | --------------------- | +| farming:trellis | Trellis (for growing grapes) | +| farming:beanpole | Bean Pole (for growing beans) | +| farming:scythe_mithril | Mithril Scythe (Use to harvest and replant crops) | +| farming:hoe_bomb | Hoe Bomb (use or throw on grassy areas to hoe land) | +| farming:hoe_wood | Wooden Hoe | +| farming:hoe_stone | Stone Hoe | +| farming:hoe_steel | Steel Hoe | +| farming:hoe_bronze | Bronze Hoe | +| farming:hoe_mese | Mese Hoe | +| farming:hoe_diamond | Diamond Hoe | +| farming:bowl | Wooden Bowl | +| farming:saucepan | Saucepan | +| farming:pot | Cooking Pot | +| farming:baking_tray | Baking Tray | +| farming:skillet | Skillet | +| farming:mortar_pestle | Mortar and Pestle | +| farming:cutting_board | Cutting Board | +| farming:juicer | Juicer | +| farming:mixing_bowl | Glass Mixing Bowl | +| moreores:hoe_silver | Silver Hoe | +| moreores:hoe_mithril | Mitril Hoe | + +#### Nodes and Aliasing + +This mod is also a direct replacement for the older Farming Plus mod and will replace all +of it's nodes and items with one's found within Farming Redo. + +#### ABM + +The ABM checks every 5 minutes to make sure crops in `group:growing` that were planted +on an older map are enabled and growing properly. + +### Changelog: + +- 1.49 - Added {eatable=1} groups to food items with the value giving HP when eaten, improved mineclone support, separated foods from crop files., hoes can deal damage. +- 1.48 - added 'farming_use_utensils' setting to enable/disable utensils in recipes, added mayonnaise (thx felfa), added gingerbread man, Added MineClone2 compatibility +- 1.47 - Now blueberries can make blue dye, tweak soil types to work better with older 0.4.x clients and add spanish translation (thx mckaygerhard), add trellis setting to registered_crops and fix pea and soy crop names (thx nixnoxus), add strawberries if ethereal mod not active, added asparagus; spinach; eggplant (thx Atlante for new textures), Sugar Cube +- 1.46 - Added min/max default light settings, added lettuce and blackberries with food items (thanks OgelGames), added soya, vanilla and sunflowers (thanks Felfa), added tofu, added salt crystals (thanks gorlock) +- 1.45 - Dirt and Hoes are more in line with default by using dry/wet/base, added cactus juice, added pasta, spaghetti, cabbage, korean bibimbap, code tidy +options, onion soup added (thanks edcrypt), Added apple pie, added wild cotton to savanna +- 1.44 - Added 'farming_stage_length' in mod settings for speed of crop growth, also thanks to TheDarkTiger for translation updates +- 1.43 - Scythe works on use instead of right-click, added seed=1 groups to actual seeds and seed=2 group for plantable food items. +- 1.42 - Soil needs water to be present within 3 blocks horizontally and 1 below to make wet soil, Jack 'o Lanterns now check protection, add chocolate block. +- 1.41 - Each crop has it's own spawn rate (can be changed in farming.conf) +- 1.40 - Added Mithril Scythe to quick harvest and replant crops on right-click. Added Hoe's for MoreOres with Toolrank support. +- 1.39 - Added Rice, Rye and Oats thanks to Ademants Grains mod. Added Jaffa Cake and multigrain bread. +- 1.38 - Pumpkin grows into block, use chopping board to cut into 4x slices, same with melon block, 2x2 slices makes a block, cocoa pods are no longer walkable +- 1.37 - Added custom 'growth_check(pos, nodename) function for crop nodes to use (check cocoa.lua for example) +- 1.36 - Added Beetroot, Beetroot Soup (6x beetroot, 1x bowl), fix register_plant() issue, add new recipes +- 1.35 - Deprecated bronze/mese/diamond hoe's, added hoe bomb and deprecated hoe's as lucky block prizes +- 1.34 - Added scarecrow Base (5x sticks in a cross shape) +- 1.33 - Added cooking utensils (wooden bowl, saucepan, cooking pot, baking tray, skillet, cutting board, mortar & pestle, juicer, glass mixing bowl) for easier food crafts. +- 1.32 - Added Pea plant (textures by Andrey01) - also added Wooden Bowl and Pea Soup crafts +- 1.31 - Added Pineapple which can be found growing in savannah areas (place pineapple in crafting to obtain 5x rings to eat and a top for re-planting), also Salt which is made from cooking a bucket of water, added food groups so it's more compatible with Ruben's food mods. +- 1.30 - Added Garlic, Pepper and Onions thanks to Grizzly Adam for sharing textures +- 1.29 - Updating functions so requires Minetest 0.4.16 and above to run +- 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. +- 1.23 - Huge code tweak and tidy done and added barley seeds to be found in dry grass, barley can make flour for bread also. +- 1.22 - Added grape bushes at high climates which can be cultivated into grape vines using trellis (9 sticks). +- 1.21 - Added auto-refill code for planting crops (thanks crabman77), also fixed a few bugs +- 1.20b - Tidied code, made api compatible with new 0.4.13 changes and changed to soil texture overlays +- 1.20 - NEW growing routine added that allows crops to grow while player is away doing other things (thanks prestidigitator) +- 1.14 - Added Green Beans from Crops mod (thanks sofar), little bushels in the wild but need to be grown using beanpoles crafted with 4 sticks (2 either side) +- 1.13 - Fixed seed double-placement glitch. Mapgen now uses 0.4.12+ for plant generation +- 1.12 - Player cannot place seeds in protected area, also growing speeds changed to match defaults +- 1.11 - Added Straw Bale, streamlined growing abm a little, fixed melon rotation bug with screwdriver +- 1.10 - Added Blueberry Bush and Blueberry Muffins, also Pumpkin/Melon easier to pick up, added check for unloaded map +- 1.09 - Corn now uses single nodes instead of 1 ontop of the other, Ethanol recipe is more expensive (requires 5 corn) and some code cleanup. +- 1.08 - Added Farming Plus compatibility, plus can be removed and no more missing nodes +- 1.07 - Added Rhubarb and Rhubarb Pie +- 1.06 - register_hoe and register_plant added for compatibility with default farming mod, although any plants registered will use farming redo to grow +- 1.05 - Added Raspberry Bushels and Raspberry Smoothie +- 1.04 - Added Donuts... normal, chocolate and apple... and a few code cleanups and now compatible with jungletree's from MoreTrees mod +- 1.03 - Bug fixes and more compatibility as drop-in replacement for built-in farming mod +- 1.02 - Added farming.mod string to help other mods identify which farming mod is running, if it returns "redo" then you're using this one, "" empty is built-in mod +- 1.01 - Crafting coffee or ethanol returns empty bucket/bottle, also Cocoa spawns a little rarer +- 1.0 - Added Cocoa which randomly grows on jungle tree's, pods give cocoa beans which can be used to farm more pods on a jungle trunk or make Cookies which have been added (or other treats) +- 0.9 - Added Pumpkin, Jack 'O Lantern, Pumpkin Slice and Sugar (a huge thanks to painterly.net for allowing me to use their textures) +- 0.8 - Added Watermelon and Melon Slice +- 0.7 - Added Coffee, Coffee Beans, Drinking Cup, Cold and Hot Cup of Coffee +- 0.6 - Added Corn, Corn on the Cob... Also reworked Abm +- 0.5 - Added Carrot, Cucumber, Potato (and Baked Potato), Tomato +- 0.4 - Checks for Protection, also performance changes +- 0.3 - Added Diamond and Mese hoe +- 0.2 - Fixed check for wet soil +- 0.1 - Fixed growing bug +- 0.0 - Initial release diff --git a/mods/farming/alt_textures/ethereal_banana_leaf_32px.png b/mods/farming/alt_textures/ethereal_banana_leaf_32px.png new file mode 100644 index 00000000..5800cbfc Binary files /dev/null and b/mods/farming/alt_textures/ethereal_banana_leaf_32px.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry.png b/mods/farming/alt_textures/ethereal_strawberry.png new file mode 100644 index 00000000..5b43e6bc Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_1.png b/mods/farming/alt_textures/ethereal_strawberry_1.png new file mode 100644 index 00000000..3fa21edc Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_1.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_2.png b/mods/farming/alt_textures/ethereal_strawberry_2.png new file mode 100644 index 00000000..751115e9 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_2.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_3.png b/mods/farming/alt_textures/ethereal_strawberry_3.png new file mode 100644 index 00000000..8b7a7b8c Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_3.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_4.png b/mods/farming/alt_textures/ethereal_strawberry_4.png new file mode 100644 index 00000000..dcf00175 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_4.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_5.png b/mods/farming/alt_textures/ethereal_strawberry_5.png new file mode 100644 index 00000000..a2decaae Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_5.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_6.png b/mods/farming/alt_textures/ethereal_strawberry_6.png new file mode 100644 index 00000000..a4d0d603 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_6.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_7.png b/mods/farming/alt_textures/ethereal_strawberry_7.png new file mode 100644 index 00000000..ace223cd Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_7.png differ diff --git a/mods/farming/alt_textures/ethereal_strawberry_8.png b/mods/farming/alt_textures/ethereal_strawberry_8.png new file mode 100644 index 00000000..6d7280b6 Binary files /dev/null and b/mods/farming/alt_textures/ethereal_strawberry_8.png differ diff --git a/mods/farming/alt_textures/farming_burger_32px.png b/mods/farming/alt_textures/farming_burger_32px.png new file mode 100644 index 00000000..43ab6d49 Binary files /dev/null and b/mods/farming/alt_textures/farming_burger_32px.png differ diff --git a/mods/farming/alt_textures/farming_mayo_32px.png b/mods/farming/alt_textures/farming_mayo_32px.png new file mode 100644 index 00000000..c8e773b9 Binary files /dev/null and b/mods/farming/alt_textures/farming_mayo_32px.png differ diff --git a/mods/farming/alt_textures/farming_paella_32px.png b/mods/farming/alt_textures/farming_paella_32px.png new file mode 100644 index 00000000..1362ac74 Binary files /dev/null and b/mods/farming/alt_textures/farming_paella_32px.png differ diff --git a/mods/farming/alt_textures/farming_popcorn_32px.png b/mods/farming/alt_textures/farming_popcorn_32px.png new file mode 100644 index 00000000..846399e3 Binary files /dev/null and b/mods/farming/alt_textures/farming_popcorn_32px.png differ diff --git a/mods/farming/alt_textures/farming_potato_omelet_32px.png b/mods/farming/alt_textures/farming_potato_omelet_32px.png new file mode 100644 index 00000000..abdacada Binary files /dev/null and b/mods/farming/alt_textures/farming_potato_omelet_32px.png differ diff --git a/mods/farming/alt_textures/farming_potato_salad_32px.png b/mods/farming/alt_textures/farming_potato_salad_32px.png new file mode 100644 index 00000000..0028c91e Binary files /dev/null and b/mods/farming/alt_textures/farming_potato_salad_32px.png differ diff --git a/mods/farming/alt_textures/farming_spaghetti_24px.png b/mods/farming/alt_textures/farming_spaghetti_24px.png new file mode 100644 index 00000000..a401281b Binary files /dev/null and b/mods/farming/alt_textures/farming_spaghetti_24px.png differ diff --git a/mods/farming/alt_textures/farming_spanish_potatoes_32px.png b/mods/farming/alt_textures/farming_spanish_potatoes_32px.png new file mode 100644 index 00000000..198b50e4 Binary files /dev/null and b/mods/farming/alt_textures/farming_spanish_potatoes_32px.png differ diff --git a/mods/farming/alt_textures/farming_sunflower_32px.png b/mods/farming/alt_textures/farming_sunflower_32px.png new file mode 100644 index 00000000..06b9387d Binary files /dev/null and b/mods/farming/alt_textures/farming_sunflower_32px.png differ diff --git a/mods/farming/alt_textures/farming_sunflower_bread_32px.png b/mods/farming/alt_textures/farming_sunflower_bread_32px.png new file mode 100644 index 00000000..112e8c63 Binary files /dev/null and b/mods/farming/alt_textures/farming_sunflower_bread_32px.png differ diff --git a/mods/farming/alt_textures/farming_vanilla_flan_32px.png b/mods/farming/alt_textures/farming_vanilla_flan_32px.png new file mode 100644 index 00000000..c8b9ff06 Binary files /dev/null and b/mods/farming/alt_textures/farming_vanilla_flan_32px.png differ diff --git a/mods/farming/api.txt b/mods/farming/api.txt new file mode 100644 index 00000000..19481f44 --- /dev/null +++ b/mods/farming/api.txt @@ -0,0 +1,93 @@ +Farming API +----------- + +The farming API allows you to easily register plants and hoes. + +`farming.register_hoe(name, hoe definition)` + * Register a new hoe, see [#hoe definition] + +`farming.register_plant(name, Plant definition)` + * Register a new growing plant, see [#Plant definition] + +`farming.registered_plants[name] = definition` + * Table of registered plants, indexed by plant name + 'crop' holds name of growing crop node minus _step-number at end + 'seed' has name of seed required to plant crop + 'minlight' min light level needed to grow + 'maxlight' max light level needed to grow + 'steps' number of steps crop has in growth cycle + 'trellis' name of trellis node (e.g. "farming:trellis"), default: nil + +### Hoe Definition + + { + description = "My Hoe", -- Description for tooltip + inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image + max_uses = 30, -- Uses until destroyed + material = "", -- Material for recipes + recipe = { -- Craft recipe, if material isn't used + {"air", "air", "air"}, + {"", "group:stick"}, + {"", "group:stick"}, + } + } + +### Plant definition + + { + description = "My Plant", -- Description of seed item + inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image + steps = 8, -- How many steps the plant has to grow, until it can be harvested + -- ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) + minlight = 13, -- Minimum light to grow + maxlight = minetest.LIGHT_MAX -- Maximum light to grow + can_grow = function(pos) -- Called every growth tick to check if plant can grow returning True if needs are met (optional, defaults to checking for wet soil below plant). + } + +Note: Any crops registered with the above function will use the new growing routines, also if crops are manually added with the {growing=1} group they will also grow. + +### Crop functions + +If a mod registers nodes to be used as crops using the {growing=1} group then an additional function can be used for custom growth checks instead of the standard 'are we above wet soil'. + +growth_check = function(pos, [node_name]) [DEPRECATED for above can_grow function] + -- check surrounding for jungle tree + if minetest.find_node_near(pos, 1, {"default:jungletree"}) then + return true -- place next growth stage + end + return false -- condition not met, skip next growth stage until next check +end, + +### Scythe items that will not drop + +This is a function to add items to a list that scythes will not drop, e.g. farming:trellis or farming:beanpole. + +farming.add_to_scythe_not_drops(item_name) + +### Start timer function + +A handy function that starts a crops timer with a randomly selected time set by using +stage_length setting. This is mostly used for special functions or 3rd party mods. + +farming.start_seed_timer(pos) + + +Node Sounds +----------- + +Farming Redo will detect wether the Default mod or MineClone/VoxeLibre mod is active and +store whichever sound set is available inside the following to save any other farming +mods from having to detect it themselves: + +farming.node_sound_defaults() +farming.node_sound_stone_defaults() +farming.node_sound_dirt_defaults() +farming.node_sound_sand_defaults() +farming.node_sound_gravel_defaults() +farming.node_sound_wood_defaults() +farming.node_sound_leaves_defaults() +farming.node_sound_ice_defaults() +farming.node_sound_metal_defaults() +farming.node_sound_water_defaults() +farming.node_sound_snow_defaults() +farming.node_sound_glass_defaults() diff --git a/mods/farming/compatibility.lua b/mods/farming/compatibility.lua new file mode 100644 index 00000000..6895326e --- /dev/null +++ b/mods/farming/compatibility.lua @@ -0,0 +1,171 @@ + +local S = minetest.get_translator("farming") + +--= Helpers + +local eth = minetest.get_modpath("ethereal") +local alias = function(orig, new) + minetest.register_alias(orig, new) +end + +--= Add {eatable} group to default food items if found + +farming.add_eatable("default:apple", 2) +farming.add_eatable("default:blueberries", 1) +farming.add_eatable("flowers:mushroom_brown", 1) +farming.add_eatable("flowers:mushroom_red", -5) + +--= Aliases + +-- Banana + +if eth then + alias("farming_plus:banana_sapling", "ethereal:banana_tree_sapling") + alias("farming_plus:banana_leaves", "ethereal:bananaleaves") + alias("farming_plus:banana", "ethereal:banana") +else + minetest.register_node(":ethereal:banana", { + description = S("Banana"), + drawtype = "torchlike", + tiles = {"farming_banana_single.png"}, + inventory_image = "farming_banana_single.png", + wield_image = "farming_banana_single.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0.2, 0.2} + }, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3 + }, + is_ground_content = false, + on_use = minetest.item_eat(2), + sounds = farming.node_sound_leaves_defaults() + }) + + farming.add_eatable("ethereal:banana", 2) + + minetest.register_node(":ethereal:bananaleaves", { + description = S("Banana Leaves"), + tiles = {"ethereal_banana_leaf.png"}, + inventory_image = "ethereal_banana_leaf.png", + wield_image = "ethereal_banana_leaf.png", + paramtype = "light", + waving = 1, + groups = {snappy = 3, leafdecay = 3, leaves = 1, flammable = 2}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() + }) + + alias("farming_plus:banana_sapling", "default:sapling") + alias("farming_plus:banana_leaves", "ethereal:bananaleaves") + alias("farming_plus:banana", "ethereal:banana") +end + +-- Carrot + +alias("farming_plus:carrot_seed", "farming:carrot") +alias("farming_plus:carrot_1", "farming:carrot_1") +alias("farming_plus:carrot_2", "farming:carrot_4") +alias("farming_plus:carrot_3", "farming:carrot_6") +alias("farming_plus:carrot", "farming:carrot_8") +alias("farming_plus:carrot_item", "farming:carrot") + +-- Cocoa + +alias("farming_plus:cocoa_sapling", "farming:cocoa_beans") +alias("farming_plus:cocoa_leaves", "default:leaves") +alias("farming_plus:cocoa", "default:apple") +alias("farming_plus:cocoa_bean", "farming:cocoa_beans") + +-- Orange + +alias("farming_plus:orange_1", "farming:tomato_1") +alias("farming_plus:orange_2", "farming:tomato_4") +alias("farming_plus:orange_3", "farming:tomato_6") + +if eth then + alias("farming_plus:orange_item", "ethereal:orange") + alias("farming_plus:orange", "ethereal:orange") + alias("farming_plus:orange_seed", "ethereal:orange_tree_sapling") +else + minetest.register_node(":ethereal:orange", { + description = S("Orange"), + drawtype = "plantlike", + tiles = {"farming_orange.png"}, + inventory_image = "farming_orange.png", + wield_image = "farming_orange.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.3, -0.2, 0.2, 0.2, 0.2} + }, + groups = { + food_orange = 1, fleshy = 3, dig_immediate = 3, flammable = 2 + }, + is_ground_content = false, + on_use = minetest.item_eat(4), + sounds = farming.node_sound_leaves_defaults() + }) + + farming.add_eatable("ethereal:orange", 4) + + alias("farming_plus:orange_item", "ethereal:orange") + alias("farming_plus:orange", "ethereal:orange") + alias("farming_plus:orange_seed", "default:sapling") +end + +-- Potato + +alias("farming_plus:potato_item", "farming:potato") +alias("farming_plus:potato_1", "farming:potato_1") +alias("farming_plus:potato_2", "farming:potato_2") +alias("farming_plus:potato", "farming:potato_3") +alias("farming_plus:potato_seed", "farming:potato") + +-- Pumpkin + +alias("farming:pumpkin_seed", "farming:pumpkin_slice") +alias("farming:pumpkin_face", "farming:jackolantern") +alias("farming:pumpkin_face_light", "farming:jackolantern_on") +alias("farming:big_pumpkin", "farming:jackolantern") +alias("farming:big_pumpkin_side", "air") +alias("farming:big_pumpkin_top", "air") +alias("farming:big_pumpkin_corner", "air") +alias("farming:scarecrow", "farming:jackolantern") +alias("farming:scarecrow_light", "farming:jackolantern_on") +alias("farming:pumpkin_flour", "farming:pumpkin_dough") + +-- Rhubarb + +alias("farming_plus:rhubarb_seed", "farming:rhubarb") +alias("farming_plus:rhubarb_1", "farming:rhubarb_1") +alias("farming_plus:rhubarb_2", "farming:rhubarb_2") +alias("farming_plus:rhubarb", "farming:rhubarb_3") +alias("farming_plus:rhubarb_item", "farming:rhubarb") + +-- Strawberry + +alias("farming_plus:strawberry_item", "ethereal:strawberry") +alias("farming_plus:strawberry_seed", "ethereal:strawberry") +alias("farming_plus:strawberry_1", "ethereal:strawberry_1") +alias("farming_plus:strawberry_2", "ethereal:strawberry_3") +alias("farming_plus:strawberry_3", "ethereal:strawberry_5") +alias("farming_plus:strawberry", "ethereal:strawberry_7") + +-- Tomato + +alias("farming_plus:tomato_seed", "farming:tomato") +alias("farming_plus:tomato_item", "farming:tomato") +alias("farming_plus:tomato_1", "farming:tomato_2") +alias("farming_plus:tomato_2", "farming:tomato_4") +alias("farming_plus:tomato_3", "farming:tomato_6") +alias("farming_plus:tomato", "farming:tomato_8") + +-- Weeds + +alias("farming:weed", "default:grass_2") diff --git a/mods/farming/crops/artichoke.lua b/mods/farming/crops/artichoke.lua new file mode 100644 index 00000000..43e8d9dc --- /dev/null +++ b/mods/farming/crops/artichoke.lua @@ -0,0 +1,84 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:artichoke", { + description = S("Artichoke"), + inventory_image = "farming_artichoke.png", + groups = {compostability = 48, seed = 2, food_artichoke = 1}, + on_use = minetest.item_eat(4), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:artichoke_1") + end +}) + +farming.add_eatable("farming:artichoke", 4) + +-- crop definition + +local def = { + description = S("Artichoke") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_artichoke_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:artichoke_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_artichoke_2.png"} +minetest.register_node("farming:artichoke_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_artichoke_3.png"} +minetest.register_node("farming:artichoke_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_artichoke_4.png"} +minetest.register_node("farming:artichoke_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_artichoke_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:artichoke 2"}, rarity = 1}, + {items = {"farming:artichoke"}, rarity = 2} + } +} +minetest.register_node("farming:artichoke_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:artichoke"] = { + crop = "farming:artichoke", + seed = "farming:artichoke", + minlight = 13, + maxlight = 15, + steps = 5 +} + +-- mapgen +farming.register_decoration("artichoke",5) diff --git a/mods/farming/crops/asparagus.lua b/mods/farming/crops/asparagus.lua new file mode 100644 index 00000000..6f31f00d --- /dev/null +++ b/mods/farming/crops/asparagus.lua @@ -0,0 +1,91 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:asparagus", { + description = S("Asparagus"), + inventory_image = "farming_asparagus.png", + groups = {compostability = 48, seed = 2, food_asparagus = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:asparagus_1") + end +}) + +farming.add_eatable("farming:asparagus", 1) + +-- crop definition + +local def = { + description = S("Asparagus") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_asparagus_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:asparagus_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_asparagus_2.png"} +minetest.register_node("farming:asparagus_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_asparagus_3.png"} +minetest.register_node("farming:asparagus_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_asparagus_4.png"} +def.drop = { + items = { + {items = {"farming:asparagus"}, rarity = 2} + } +} +minetest.register_node("farming:asparagus_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_asparagus_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:asparagus"}, rarity = 1}, + {items = {"farming:asparagus 2"}, rarity = 2} + } +} +minetest.register_node("farming:asparagus_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:asparagus"] = { + crop = "farming:asparagus", + seed = "farming:asparagus", + minlight = 7, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen +farming.register_decoration("asparagus",5) diff --git a/mods/farming/crops/barley.lua b/mods/farming/crops/barley.lua new file mode 100644 index 00000000..ca654565 --- /dev/null +++ b/mods/farming/crops/barley.lua @@ -0,0 +1,135 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_barley", { + description = S("Barley Seed"), + tiles = {"farming_barley_seed.png"}, + inventory_image = "farming_barley_seed.png", + wield_image = "farming_barley_seed.png", + drawtype = "signlike", + groups = { + handy = 1, compostability = 48, seed = 1, snappy = 3, attached_node = 1, + growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + next_plant = "farming:barley_1", + selection_box = farming.select, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_barley") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:barley_1", param2 = 3}) + end +}) + +-- item + +minetest.register_craftitem("farming:barley", { + description = S("Barley"), + inventory_image = "farming_barley.png", + groups = {food_barley = 1, flammable = 2, compostability = 65} +}) + +-- crop definition + +local def = { + description = S("Barley") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_barley_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:barley_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_barley_2.png"} +minetest.register_node("farming:barley_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_barley_3.png"} +minetest.register_node("farming:barley_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_barley_4.png"} +minetest.register_node("farming:barley_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_barley_5.png"} +minetest.register_node("farming:barley_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_barley_6.png"} +def.drop = { + items = { + {items = {"farming:barley"}, rarity = 2}, + {items = {"farming:seed_barley"}, rarity = 2} + } +} +minetest.register_node("farming:barley_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_barley_7.png"} +def.drop = { + items = { + {items = {"farming:barley"}, rarity = 2}, + {items = {"farming:seed_barley"}, rarity = 1} + } +} +minetest.register_node("farming:barley_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_barley_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:barley"}, rarity = 1}, + {items = {"farming:barley"}, rarity = 3}, + {items = {"farming:seed_barley"}, rarity = 1}, + {items = {"farming:seed_barley"}, rarity = 3} + } +} +minetest.register_node("farming:barley_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:barley"] = { + crop = "farming:barley", + seed = "farming:seed_barley", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} diff --git a/mods/farming/crops/beans.lua b/mods/farming/crops/beans.lua new file mode 100644 index 00000000..78a1513b --- /dev/null +++ b/mods/farming/crops/beans.lua @@ -0,0 +1,237 @@ + +-- All textures by (C) Auke Kok CC-BY-SA-3.0 + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- place beans helper + +local function place_beans(itemstack, placer, pointed_thing, plantname) + + local pt = pointed_thing + + -- check if pointing at a node + if not pt or pt.type ~= "node" then return end + + local under = minetest.get_node(pt.under) + + -- return if any of the nodes are not registered + if not minetest.registered_nodes[under.name] then return end + + -- am I right-clicking on something that has a custom on_place set? + -- thanks to Krock for helping with this issue :) + local def = minetest.registered_nodes[under.name] + + if placer and itemstack and def and def.on_rightclick then + return def.on_rightclick(pt.under, under, placer, itemstack, pt) + end + + -- is player planting crop? + local name = placer and placer:get_player_name() or "" + + -- check for protection + if minetest.is_protected(pt.under, name) then return end + + -- check if pointing at bean pole + if under.name ~= "farming:beanpole" then return end + + -- add the node and remove 1 item from the itemstack + minetest.set_node(pt.under, {name = plantname}) + + minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0}, true) + + if placer or not farming.is_creative(placer:get_player_name()) then + + itemstack:take_item() + + -- check for refill + if itemstack:get_count() == 0 then + + minetest.after(0.20, + farming.refill_plant, placer, "farming:beans", placer:get_wield_index()) + end + end + + return itemstack +end + +-- item/seed + +minetest.register_craftitem("farming:beans", { + description = S("Green Beans"), + inventory_image = "farming_beans.png", + groups = {compostability = 48, seed = 2, food_beans = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return place_beans(itemstack, placer, pointed_thing, "farming:beanpole_1") + end +}) + +farming.add_eatable("farming:beans", 1) + +-- beanpole + +minetest.register_node("farming:beanpole", { + description = S("Bean Pole (place on soil before planting beans)"), + drawtype = "plantlike", + tiles = {"farming_beanpole.png"}, + inventory_image = "farming_beanpole.png", + visual_scale = 1.90, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = "farming:beanpole", + selection_box = farming.select, + groups = {handy = 1, snappy = 3, flammable = 2, attached_node = 1}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + + local pt = pointed_thing + + -- check if pointing at a node + if not pt or pt.type ~= "node" then return end + + local under = minetest.get_node(pt.under) + + -- return if any of the nodes are not registered + if not minetest.registered_nodes[under.name] then return end + + -- am I right-clicking on something that has a custom on_place set? + -- thanks to Krock for helping with this issue :) + local def = minetest.registered_nodes[under.name] + + if def and def.on_rightclick then + return def.on_rightclick(pt.under, under, placer, itemstack, pt) + end + + if minetest.is_protected(pt.above, placer:get_player_name()) then + return + end + + local nodename = under.name + + if minetest.get_item_group(nodename, "soil") < 2 then return end + + local top = { + x = pointed_thing.above.x, + y = pointed_thing.above.y + 1, + z = pointed_thing.above.z + } + + nodename = minetest.get_node(top).name + + if nodename ~= "air" then return end + + minetest.set_node(pointed_thing.above, {name = "farming:beanpole"}) + + if not farming.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + + return itemstack + end +}) + +-- crop definition + +local def = { + description = S("Green Beans") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_beanpole_1.png"}, + visual_scale = 1.90, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {"farming:beanpole"}, rarity = 1} + } + }, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 3, not_in_creative_inventory = 1, + attached_node = 1, growing = 1, plant = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:beanpole_1", table.copy(def)) + +-- stage2 + +def.tiles = {"farming_beanpole_2.png"} +minetest.register_node("farming:beanpole_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_beanpole_3.png"} +minetest.register_node("farming:beanpole_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_beanpole_4.png"} +minetest.register_node("farming:beanpole_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_beanpole_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:beanpole"}, rarity = 1}, + {items = {"farming:beans 3"}, rarity = 1}, + {items = {"farming:beans 2"}, rarity = 2}, + {items = {"farming:beans 2"}, rarity = 3} + } +} +minetest.register_node("farming:beanpole_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:beans"] = { + trellis = "farming:beanpole", + crop = "farming:beanpole", + seed = "farming:beans", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- wild green bean bush (this is what you find on the map) + +minetest.register_node("farming:beanbush", { + drawtype = "plantlike", + tiles = {"farming_beanbush.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {"farming:beans 1"}, rarity = 1}, + {items = {"farming:beans 1"}, rarity = 2}, + {items = {"farming:beans 1"}, rarity = 3} + } + }, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + compostability = 35, not_in_creative_inventory = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +}) + +-- mapgen +farming.register_decoration("beans",5,"farming:beanbush") diff --git a/mods/farming/crops/beetroot.lua b/mods/farming/crops/beetroot.lua new file mode 100644 index 00000000..6804c29d --- /dev/null +++ b/mods/farming/crops/beetroot.lua @@ -0,0 +1,87 @@ + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- item/seed + +minetest.register_craftitem("farming:beetroot", { + description = S("Beetroot"), + inventory_image = "farming_beetroot.png", + groups = {compostability = 48, seed = 2, food_beetroot = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:beetroot_1") + end +}) + +farming.add_eatable("farming:beetroot", 1) + +-- crop definition + +local def = { + description = S("Beetroot") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_beetroot_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:beetroot_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_beetroot_2.png"} +minetest.register_node("farming:beetroot_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_beetroot_3.png"} +minetest.register_node("farming:beetroot_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_beetroot_4.png"} +minetest.register_node("farming:beetroot_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_beetroot_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + max_items = 4, items = { + {items = {"farming:beetroot"}, rarity = 1}, + {items = {"farming:beetroot"}, rarity = 2}, + {items = {"farming:beetroot"}, rarity = 3}, + {items = {"farming:beetroot"}, rarity = 4} + } +} +minetest.register_node("farming:beetroot_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:beetroot"] = { + crop = "farming:beetroot", + seed = "farming:beetroot", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen +farming.register_decoration("beetroot",5) diff --git a/mods/farming/crops/blackberry.lua b/mods/farming/crops/blackberry.lua new file mode 100644 index 00000000..e9d63bd4 --- /dev/null +++ b/mods/farming/crops/blackberry.lua @@ -0,0 +1,82 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:blackberry", { + description = S("Blackberries"), + inventory_image = "farming_blackberry.png", + groups = { + compostability = 48, seed = 2, food_blackberries = 1, food_blackberry = 1, + food_berry = 1 + }, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:blackberry_1") + end +}) + +farming.add_eatable("farming:blackberry", 1) + +-- crop definition + +local def = { + description = S("Blackberry") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_blackberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:blackberry_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_blackberry_2.png"} +minetest.register_node("farming:blackberry_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_blackberry_3.png"} +minetest.register_node("farming:blackberry_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_blackberry_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {'farming:blackberry 2'}, rarity = 1}, + {items = {'farming:blackberry'}, rarity = 2}, + {items = {'farming:blackberry'}, rarity = 3}, + } +} +minetest.register_node("farming:blackberry_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:blackberry"] = { + crop = "farming:blackberry", + seed = "farming:blackberry", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("blackberry",4) diff --git a/mods/farming/crops/blueberry.lua b/mods/farming/crops/blueberry.lua new file mode 100644 index 00000000..d37b0a0c --- /dev/null +++ b/mods/farming/crops/blueberry.lua @@ -0,0 +1,81 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:blueberries", { + description = S("Wild Blueberries"), + inventory_image = "farming_blueberries.png", + groups = { + compostability = 48,seed = 2, food_blueberries = 1, food_blueberry = 1, + food_berry = 1 + }, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:blueberry_1") + end +}) + +farming.add_eatable("farming:blueberries", 1) + +-- ctop definition +local def = { + description = S("Blueberry") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_blueberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:blueberry_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_blueberry_2.png"} +minetest.register_node("farming:blueberry_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_blueberry_3.png"} +minetest.register_node("farming:blueberry_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_blueberry_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:blueberries 2"}, rarity = 1}, + {items = {"farming:blueberries"}, rarity = 2}, + {items = {"farming:blueberries"}, rarity = 3} + } +} +minetest.register_node("farming:blueberry_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:blueberries"] = { + crop = "farming:blueberry", + seed = "farming:blueberries", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("blueberry",4) diff --git a/mods/farming/crops/cabbage.lua b/mods/farming/crops/cabbage.lua new file mode 100644 index 00000000..1d24d853 --- /dev/null +++ b/mods/farming/crops/cabbage.lua @@ -0,0 +1,89 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:cabbage", { + description = S("Cabbage"), + inventory_image = "farming_cabbage.png", + groups = {compostability = 48, seed = 2, food_cabbage = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:cabbage_1") + end +}) + +farming.add_eatable("farming:cabbage", 1) + +-- crop definition + +local def = { + description = S("Cabbage") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_cabbage_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:cabbage_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_cabbage_2.png"} +minetest.register_node("farming:cabbage_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_cabbage_3.png"} +minetest.register_node("farming:cabbage_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_cabbage_4.png"} +minetest.register_node("farming:cabbage_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_cabbage_5.png"} +minetest.register_node("farming:cabbage_5", table.copy(def)) + +-- stage 6 (final) + +def.tiles = {"farming_cabbage_6.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + max_items = 2, items = { + {items = {"farming:cabbage 2"}, rarity = 1}, + {items = {"farming:cabbage 1"}, rarity = 2} + } +} +minetest.register_node("farming:cabbage_6", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:cabbage"] = { + crop = "farming:cabbage", + seed = "farming:cabbage", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 6 +} + +-- mapgen +farming.register_decoration("cabbage",6) diff --git a/mods/farming/crops/carrot.lua b/mods/farming/crops/carrot.lua new file mode 100644 index 00000000..6b1c65d2 --- /dev/null +++ b/mods/farming/crops/carrot.lua @@ -0,0 +1,109 @@ + +-- Original textures from PixelBox texture pack +-- https://forum.minetest.net/viewtopic.php?id=4990 + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- item/seed + +minetest.register_craftitem("farming:carrot", { + description = S("Carrot"), + inventory_image = "farming_carrot.png", + groups = {compostability = 48, seed = 2, food_carrot = 1}, + on_use = minetest.item_eat(4), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:carrot_1") + end +}) + +farming.add_eatable("farming:carrot", 4) + +-- crop definition + +local def = { + description = S("Carrot") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_carrot_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:carrot_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_carrot_2.png"} +minetest.register_node("farming:carrot_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_carrot_3.png"} +minetest.register_node("farming:carrot_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_carrot_4.png"} +minetest.register_node("farming:carrot_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_carrot_5.png"} +minetest.register_node("farming:carrot_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_carrot_6.png"} +minetest.register_node("farming:carrot_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_carrot_7.png"} +def.drop = { + items = { + {items = {"farming:carrot"}, rarity = 1}, + {items = {"farming:carrot 2"}, rarity = 3} + } +} +minetest.register_node("farming:carrot_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_carrot_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:carrot 2"}, rarity = 1}, + {items = {"farming:carrot 3"}, rarity = 2} + } +} +minetest.register_node("farming:carrot_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:carrot"] = { + crop = "farming:carrot", + seed = "farming:carrot", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("carrot",8) diff --git a/mods/farming/crops/chili.lua b/mods/farming/crops/chili.lua new file mode 100644 index 00000000..a875fa94 --- /dev/null +++ b/mods/farming/crops/chili.lua @@ -0,0 +1,100 @@ + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +-- item/seed + +minetest.register_craftitem("farming:chili_pepper", { + description = S("Chili Pepper"), + inventory_image = "farming_chili_pepper.png", + groups = {compostability = 48, seed = 2, food_chili_pepper = 1}, + on_use = minetest.item_eat(2), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:chili_1") + end +}) + +farming.add_eatable("farming:chili_pepper", 2) + +-- crop definition + +local def = { + description = S("Chili Pepper") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_chili_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 4, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:chili_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_chili_2.png"} +minetest.register_node("farming:chili_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_chili_3.png"} +minetest.register_node("farming:chili_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_chili_4.png"} +minetest.register_node("farming:chili_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_chili_5.png"} +minetest.register_node("farming:chili_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_chili_6.png"} +minetest.register_node("farming:chili_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_chili_7.png"} +minetest.register_node("farming:chili_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_chili_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +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(def)) + +-- add to registered_plants + +farming.registered_plants["farming:chili_pepper"] = { + crop = "farming:chili", + seed = "farming:chili_pepper", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("chili",8) diff --git a/mods/farming/crops/cocoa.lua b/mods/farming/crops/cocoa.lua new file mode 100644 index 00000000..ee1cfce4 --- /dev/null +++ b/mods/farming/crops/cocoa.lua @@ -0,0 +1,186 @@ + +local S = minetest.get_translator("farming") + +-- place cocoa +local function place_cocoa(itemstack, placer, pointed_thing, plantname) + + local pt = pointed_thing + + -- check if pointing at a node + if not pt or pt.type ~= "node" then return end + + local under = minetest.get_node(pt.under) + + -- return if any of the nodes are not registered + if not minetest.registered_nodes[under.name] then return end + + -- am I right-clicking on something that has a custom on_place set? + -- thanks to Krock for helping with this issue :) + local def = minetest.registered_nodes[under.name] + + if placer and itemstack and def and def.on_rightclick then + return def.on_rightclick(pt.under, under, placer, itemstack, pt) + end + + -- check if pointing at jungletree + if (under.name ~= "default:jungletree" and under.name ~= "mcl_core:jungletree") + or minetest.get_node(pt.above).name ~= "air" then + return + end + + -- is player planting crop? + local name = placer and placer:get_player_name() or "" + + -- check for protection + if minetest.is_protected(pt.above, name) then return end + + -- add the node and remove 1 item from the itemstack + minetest.set_node(pt.above, {name = plantname}) + + minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}, true) + + if placer and not farming.is_creative(placer:get_player_name()) then + + itemstack:take_item() + + -- check for refill + if itemstack:get_count() == 0 then + + minetest.after(0.20, farming.refill_plant, placer, + "farming:cocoa_beans_raw", placer:get_wield_index()) + end + end + + return itemstack +end + +-- item/seed + +minetest.register_craftitem("farming:cocoa_beans_raw", { + description = S("Raw Cocoa Beans"), + inventory_image = "farming_cocoa_beans.png^[brighten", + groups = {compostability = 48, seed = 1, flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + return place_cocoa(itemstack, placer, pointed_thing, "farming:cocoa_1") + end +}) + +-- crop definition + +local def = { + description = S("Cocoa Beans") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_cocoa_1.png"}, + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + drop = {}, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, growing = 1, + not_in_creative_inventory = 1, leafdecay = 1, leafdecay_drop = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + + -- custom function that returns True when conditions are met + growth_check = function(pos, node_name) + + if minetest.find_node_near(pos, 1, + {"default:jungletree", "mcl_core:jungletree"}) then + return true -- place next growth stage + end + + return false -- condition not met, skip growth stage until next check + end +} + +-- stage 1 + +minetest.register_node("farming:cocoa_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_cocoa_2.png"} +minetest.register_node("farming:cocoa_2", table.copy(def)) + +-- stage3 + +def.tiles = {"farming_cocoa_3.png"} +def.drop = { + items = { + {items = {"farming:cocoa_beans_raw 1"}, rarity = 1} + } +} +minetest.register_node("farming:cocoa_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_cocoa_4.png"} +def.groups.growing = nil +def.growth_check = nil +def.drop = { + items = { + {items = {"farming:cocoa_beans_raw 2"}, rarity = 1}, + {items = {"farming:cocoa_beans_raw 1"}, rarity = 2}, + {items = {"farming:cocoa_beans_raw 1"}, rarity = 4} + } +} +minetest.register_node("farming:cocoa_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:cocoa_beans"] = { + trellis = "default:jungletree", + crop = "farming:cocoa", + seed = "farming:cocoa_beans_raw", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- add random cocoa pods to jungle tree's + +local random = math.random -- localise for speed + +minetest.register_on_generated(function(minp, maxp) + + if maxp.y < 0 then return end + + local pos, dir + local cocoa = minetest.find_nodes_in_area(minp, maxp, + {"default:jungletree", "mcl_core:jungletree"}) + + for n = 1, #cocoa do + + pos = cocoa[n] + + if minetest.find_node_near(pos, 1, + {"default:jungleleaves", "moretrees:jungletree_leaves_green", + "mcl_core:jungleleaves"}) then + + dir = random(80) + + if dir == 1 then pos.x = pos.x + 1 + elseif dir == 2 then pos.x = pos.x - 1 + elseif dir == 3 then pos.z = pos.z + 1 + elseif dir == 4 then pos.z = pos.z - 1 + end + + if dir < 5 + and minetest.get_node(pos).name == "air" + and minetest.get_node_light(pos) > 12 then + +--print ("Cocoa Pod added at " .. minetest.pos_to_string(pos)) + + minetest.set_node(pos, { + name = "farming:cocoa_" .. tostring(random(4)) + }) + end + end + end +end) diff --git a/mods/farming/crops/coffee.lua b/mods/farming/crops/coffee.lua new file mode 100644 index 00000000..6b9f024b --- /dev/null +++ b/mods/farming/crops/coffee.lua @@ -0,0 +1,107 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:coffee_beans", { + description = S("Coffee Beans"), + inventory_image = "farming_coffee_beans.png", + groups = {compostability = 48, seed = 2, food_coffee = 1, flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:coffee_1") + end +}) + +-- crop definition + +local def = { + description = S("Coffee") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_coffee_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:coffee_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_coffee_2.png"} +minetest.register_node("farming:coffee_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_coffee_3.png"} +minetest.register_node("farming:coffee_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_coffee_4.png"} +minetest.register_node("farming:coffee_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_coffee_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:coffee_beans 2"}, rarity = 1}, + {items = {"farming:coffee_beans 2"}, rarity = 2}, + {items = {"farming:coffee_beans 2"}, rarity = 3} + } +} +minetest.register_node("farming:coffee_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:coffee"] = { + crop = "farming:coffee", + seed = "farming:coffee_beans", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen + +local spawn_on = { + "default:dirt_with_dry_grass", "default:dirt_with_rainforest_litter", + "default:dry_dirt_with_dry_grass", "mcl_core:dirt_with_grass", + "ethereal:prairie_dirt" +} + +if farming.mapgen == "v6" then + spawn_on = {"default:dirt_with_grass"} +end + +minetest.register_decoration({ + deco_type = "simple", + place_on = spawn_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.coffee, + spread = {x = 100, y = 100, z = 100}, + seed = 12, + octaves = 3, + persist = 0.6 + }, + y_min = 20, y_max = 55, + decoration = "farming:coffee_5" +}) diff --git a/mods/farming/crops/corn.lua b/mods/farming/crops/corn.lua new file mode 100644 index 00000000..7dcbbb24 --- /dev/null +++ b/mods/farming/crops/corn.lua @@ -0,0 +1,130 @@ + +--[[ + Original textures from GeMinecraft + http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/1440575-1-2-5-generation-minecraft-beta-1-2-farming-and +]] + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:corn", { + description = S("Corn"), + inventory_image = "farming_corn.png", + groups = {compostability = 45, seed = 2, food_corn = 1}, + on_use = minetest.item_eat(3), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:corn_1") + end +}) + +farming.add_eatable("farming:corn", 3) + +-- crop definition + +local def = { + description = S("Corn") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_corn_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:corn_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_corn_2.png"} +minetest.register_node("farming:corn_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_corn_3.png"} +minetest.register_node("farming:corn_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_corn_4.png"} +minetest.register_node("farming:corn_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_corn_5.png"} +minetest.register_node("farming:corn_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_corn_6.png"} +def.visual_scale = 1.9 +minetest.register_node("farming:corn_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_corn_7.png"} +def.drop = { + items = { + {items = {"farming:corn"}, rarity = 1}, + {items = {"farming:corn"}, rarity = 2}, + {items = {"farming:corn"}, rarity = 3} + } +} +minetest.register_node("farming:corn_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_corn_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:corn 2"}, rarity = 1}, + {items = {"farming:corn 2"}, rarity = 2}, + {items = {"farming:corn 2"}, rarity = 2} + } +} +minetest.register_node("farming:corn_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:corn"] = { + crop = "farming:corn", + seed = "farming:corn", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", "mcl_core:dirt_with_grass", "ethereal:prairie_dirt" + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = farming.corn, + spread = {x = 100, y = 100, z = 100}, + seed = 134, + octaves = 3, + persist = 0.6 + }, + y_min = 12, y_max = 27, + decoration = "farming:corn_7" +}) diff --git a/mods/farming/crops/cotton.lua b/mods/farming/crops/cotton.lua new file mode 100644 index 00000000..13e170fa --- /dev/null +++ b/mods/farming/crops/cotton.lua @@ -0,0 +1,174 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_cotton", { + description = S("Cotton Seed"), + tiles = {"farming_cotton_seed.png"}, + inventory_image = "farming_cotton_seed.png", + wield_image = "farming_cotton_seed.png", + drawtype = "signlike", + groups = { + compostability = 48, seed = 1, snappy = 3, attached_node = 1, + flammable = 4, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:cotton_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_cotton") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:cotton_1", param2 = 1}) + end +}) + +-- item + +minetest.register_craftitem("farming:cotton", { + description = S("Cotton"), + inventory_image = "farming_cotton.png", + groups = {flammable = 4, compostability = 50} +}) + +-- crop definition + +local def = { + description = S("Cotton") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_cotton_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 4, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:cotton_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_cotton_2.png"} +minetest.register_node("farming:cotton_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_cotton_3.png"} +minetest.register_node("farming:cotton_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_cotton_4.png"} +minetest.register_node("farming:cotton_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_cotton_5.png"} +def.drop = { + items = { + {items = {"farming:seed_cotton"}, rarity = 1} + } +} +minetest.register_node("farming:cotton_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_cotton_6.png"} +def.drop = { + items = { + {items = {"farming:cotton"}, rarity = 1}, + {items = {"farming:cotton"}, rarity = 2} + } +} +minetest.register_node("farming:cotton_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_cotton_7.png"} +def.drop = { + items = { + {items = {"farming:cotton"}, rarity = 1}, + {items = {"farming:cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 1}, + {items = {"farming:seed_cotton"}, rarity = 2} + } +} +minetest.register_node("farming:cotton_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_cotton_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {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} + } +} +minetest.register_node("farming:cotton_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:cotton"] = { + crop = "farming:cotton", + seed = "farming:seed_cotton", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- wild cotton (this is what you find on the map) + +minetest.register_node("farming:cotton_wild", { + description = S("Wild Cotton"), + drawtype = "plantlike", + waving = 1, + tiles = {"farming_cotton_wild.png"}, + inventory_image = "farming_cotton_wild.png", + wield_image = "farming_cotton_wild.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {handy = 1, snappy = 3, attached_node = 1, flammable = 4, compostability = 60}, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + drop = { + items = { + {items = {"farming:cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 1} + } + }, + sounds = farming.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16} + } +}) + +-- mapgen +farming.register_decoration("cotton",8) diff --git a/mods/farming/crops/cucumber.lua b/mods/farming/crops/cucumber.lua new file mode 100644 index 00000000..d37ec42f --- /dev/null +++ b/mods/farming/crops/cucumber.lua @@ -0,0 +1,82 @@ + +--[[ + Original textures from DocFarming mod + https://forum.minetest.net/viewtopic.php?id=3948 +]] + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:cucumber", { + description = S("Cucumber"), + inventory_image = "farming_cucumber.png", + groups = {compostability = 48, seed = 2, food_cucumber = 1}, + on_use = minetest.item_eat(4), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:cucumber_1") + end +}) + +farming.add_eatable("farming:cucumber", 4) + +-- crop definition + +local def = { + description = S("Cucumber") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_cucumber_1.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:cucumber_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_cucumber_2.png"} +minetest.register_node("farming:cucumber_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_cucumber_3.png"} +minetest.register_node("farming:cucumber_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_cucumber_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:cucumber 2"}, rarity = 1}, + {items = {"farming:cucumber 2"}, rarity = 2} + } +} +minetest.register_node("farming:cucumber_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:cucumber"] = { + crop = "farming:cucumber", + seed = "farming:cucumber", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("cucumber",4) diff --git a/mods/farming/crops/eggplant.lua b/mods/farming/crops/eggplant.lua new file mode 100644 index 00000000..6e60259f --- /dev/null +++ b/mods/farming/crops/eggplant.lua @@ -0,0 +1,86 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:eggplant", { + description = S("Eggplant"), + inventory_image = "farming_eggplant.png", + groups = {compostability = 48, seed = 2, food_eggplant = 1}, + on_use = minetest.item_eat(3), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:eggplant_1") + end +}) + +farming.add_eatable("farming:eggplant", 3) + +-- crop definition + +local def = { + description = S("Eggplant") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_eggplant_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:eggplant_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_eggplant_2.png"} +minetest.register_node("farming:eggplant_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_eggplant_3.png"} +def.drop = { + items = { + {items = {"farming:eggplant"}, rarity = 1}, + {items = {"farming:eggplant"}, rarity = 3} + } +} +minetest.register_node("farming:eggplant_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_eggplant_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:eggplant 2"}, rarity = 1}, + {items = {"farming:eggplant 2"}, rarity = 2} + } +} +minetest.register_node("farming:eggplant_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:eggplant"] = { + crop = "farming:eggplant", + seed = "farming:eggplant", + minlight = 7, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("eggplant",4) diff --git a/mods/farming/crops/garlic.lua b/mods/farming/crops/garlic.lua new file mode 100644 index 00000000..58af259c --- /dev/null +++ b/mods/farming/crops/garlic.lua @@ -0,0 +1,84 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:garlic_clove", { + description = S("Garlic clove"), + inventory_image = "crops_garlic_clove.png", + groups = {compostability = 35, seed = 2, food_garlic_clove = 1, flammable = 3}, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:garlic_1") + end +}) + +-- crop definition + +local def = { + description = S("Garlic") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"crops_garlic_plant_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 3, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:garlic_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"crops_garlic_plant_2.png"} +minetest.register_node("farming:garlic_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"crops_garlic_plant_3.png"} +minetest.register_node("farming:garlic_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"crops_garlic_plant_4.png"} +minetest.register_node("farming:garlic_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"crops_garlic_plant_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:garlic 3"}, rarity = 1}, + {items = {"farming:garlic"}, rarity = 2}, + {items = {"farming:garlic"}, rarity = 5} + } +} +minetest.register_node("farming:garlic_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:garlic"] = { + crop = "farming:garlic", + seed = "farming:garlic_clove", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen +farming.register_decoration("garlic",5) diff --git a/mods/farming/crops/ginger.lua b/mods/farming/crops/ginger.lua new file mode 100644 index 00000000..dfab19a3 --- /dev/null +++ b/mods/farming/crops/ginger.lua @@ -0,0 +1,85 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:ginger", { + description = S("Ginger"), + inventory_image = "farming_ginger.png", + groups = {compostability = 48, seed = 2, food_ginger = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:ginger_1") + end +}) + +farming.add_eatable("farming:ginger", 1) + +-- crop definition + +local def = { + description = S("Ginger") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_ginger_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:ginger_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_ginger_2.png"} +minetest.register_node("farming:ginger_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_ginger_3.png"} +def.drop = { + items = { + {items = {"farming:ginger"}, rarity = 1}, + {items = {"farming:ginger"}, rarity = 3} + } +} +minetest.register_node("farming:ginger_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_ginger_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:ginger 2"}, rarity = 1}, + {items = {"farming:ginger 2"}, rarity = 2} + } +} +minetest.register_node("farming:ginger_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:ginger"] = { + crop = "farming:ginger", + seed = "farming:ginger", + minlight = 5, + maxlight = minetest.LIGHT_MAX, + steps = 4 +} + +-- mapgen +farming.register_decoration("ginger",5) diff --git a/mods/farming/crops/grapes.lua b/mods/farming/crops/grapes.lua new file mode 100644 index 00000000..f94b1439 --- /dev/null +++ b/mods/farming/crops/grapes.lua @@ -0,0 +1,250 @@ + +local S = minetest.get_translator("farming") + +-- place trellis helper + +local function place_grapes(itemstack, placer, pointed_thing, plantname) + + local pt = pointed_thing + + -- check if pointing at a node + if not pt or pt.type ~= "node" then return end + + local under = minetest.get_node(pt.under) + + -- return if any of the nodes are not registered + if not minetest.registered_nodes[under.name] then return end + + -- am I right-clicking on something that has a custom on_place set? + -- thanks to Krock for helping with this issue :) + local def = minetest.registered_nodes[under.name] + + if placer and itemstack and def and def.on_rightclick then + return def.on_rightclick(pt.under, under, placer, itemstack, pt) + end + + -- is player planting seed? + local name = placer and placer:get_player_name() or "" + + -- check for protection + if minetest.is_protected(pt.under, name) then return end + + -- check if pointing at trellis + if under.name ~= "farming:trellis" then return end + + -- add the node and remove 1 item from the itemstack + minetest.set_node(pt.under, {name = plantname}) + + minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0}, true) + + if placer and not farming.is_creative(placer:get_player_name()) then + + itemstack:take_item() + + -- check for refill + if itemstack:get_count() == 0 then + + minetest.after(0.20, farming.refill_plant, placer, + "farming:grapes", placer:get_wield_index() + ) + end + end + + return itemstack +end + +-- item/seed + +minetest.register_craftitem("farming:grapes", { + description = S("Grapes"), + inventory_image = "farming_grapes.png", + groups = {compostability = 48, seed = 2, food_grapes = 1}, + on_use = minetest.item_eat(2), + + on_place = function(itemstack, placer, pointed_thing) + return place_grapes(itemstack, placer, pointed_thing, "farming:grapes_1") + end +}) + +farming.add_eatable("farming:grapes", 2) + +-- trellis + +minetest.register_node("farming:trellis", { + description = S("Trellis (place on soil before planting grapes)"), + drawtype = "plantlike", + tiles = {"farming_trellis.png"}, + inventory_image = "farming_trellis.png", + visual_scale = 1.9, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = "farming:trellis", + selection_box = farming.select, + groups = {handy = 1, snappy = 3, flammable = 2, attached_node = 1}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + + local pt = pointed_thing + + -- check if pointing at a node + if not pt or pt.type ~= "node" then return end + + local under = minetest.get_node(pt.under) + + -- return if any of the nodes are not registered + if not minetest.registered_nodes[under.name] then return end + + -- am I right-clicking on something that has a custom on_place set? + -- thanks to Krock for helping with this issue :) + local def = minetest.registered_nodes[under.name] + + if def and def.on_rightclick then + return def.on_rightclick(pt.under, under, placer, itemstack, pt) + end + + if minetest.is_protected(pt.above, placer:get_player_name()) then + return + end + + local nodename = under.name + + if minetest.get_item_group(nodename, "soil") < 2 then return end + + local top = { + x = pointed_thing.above.x, + y = pointed_thing.above.y + 1, + z = pointed_thing.above.z + } + + nodename = minetest.get_node(top).name + + if nodename ~= "air" then return end + + minetest.set_node(pointed_thing.above, {name = "farming:trellis"}) + + if not farming.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + + return itemstack + end +}) + +-- crop definition + +local def = { + description = S("Grapes") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_grapes_1.png"}, + visual_scale = 1.9, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {"farming:trellis"}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 3, not_in_creative_inventory = 1, + attached_node = 1, growing = 1, plant = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:grapes_1", table.copy(def)) + +-- stage2 + +def.tiles = {"farming_grapes_2.png"} +minetest.register_node("farming:grapes_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_grapes_3.png"} +minetest.register_node("farming:grapes_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_grapes_4.png"} +minetest.register_node("farming:grapes_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_grapes_5.png"} +minetest.register_node("farming:grapes_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_grapes_6.png"} +minetest.register_node("farming:grapes_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_grapes_7.png"} +minetest.register_node("farming:grapes_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_grapes_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:trellis"}, rarity = 1}, + {items = {"farming:grapes 3"}, rarity = 1}, + {items = {"farming:grapes 1"}, rarity = 2}, + {items = {"farming:grapes 1"}, rarity = 3} + } +} +minetest.register_node("farming:grapes_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:grapes"] = { + trellis = "farming:trellis", + crop = "farming:grapes", + seed = "farming:grapes", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- wild grape vine (this is what you find on the map) + +minetest.register_node("farming:grapebush", { + drawtype = "plantlike", + tiles = {"farming_grapebush.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {"farming:grapes 1"}, rarity = 1}, + {items = {"farming:grapes 1"}, rarity = 2}, + {items = {"farming:grapes 1"}, rarity = 3} + } + }, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, compostability = 35 + }, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +}) + +-- mapgen +farming.register_decoration("grapes",8,"farming:grapebush") diff --git a/mods/farming/crops/hemp.lua b/mods/farming/crops/hemp.lua new file mode 100644 index 00000000..1ab9c998 --- /dev/null +++ b/mods/farming/crops/hemp.lua @@ -0,0 +1,138 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_hemp", { + description = S("Hemp Seed"), + tiles = {"farming_hemp_seed.png"}, + inventory_image = "farming_hemp_seed.png", + wield_image = "farming_hemp_seed.png", + drawtype = "signlike", + groups = { + handy = 1, compostability = 38, seed = 1, snappy = 3, attached_node = 1, + growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:hemp_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_hemp") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:hemp_1", param2 = 1}) + end +}) + +-- item + +minetest.register_craftitem("farming:hemp_leaf", { + description = S("Hemp Leaf"), + inventory_image = "farming_hemp_leaf.png", + groups = {compostability = 35} +}) + +-- crop definition + +local def = { + description = S("Hemp") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_hemp_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:hemp_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_hemp_2.png"} +minetest.register_node("farming:hemp_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_hemp_3.png"} +minetest.register_node("farming:hemp_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_hemp_4.png"} +minetest.register_node("farming:hemp_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_hemp_5.png"} +minetest.register_node("farming:hemp_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_hemp_6.png"} +def.drop = { + items = { + {items = {"farming:hemp_leaf"}, rarity = 2}, + {items = {"farming:seed_hemp"}, rarity = 1} + } +} +minetest.register_node("farming:hemp_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_hemp_7.png"} +def.drop = { + items = { + {items = {"farming:hemp_leaf"}, rarity = 1}, + {items = {"farming:hemp_leaf"}, rarity = 3}, + {items = {"farming:seed_hemp"}, rarity = 1}, + {items = {"farming:seed_hemp"}, rarity = 3} + } +} +minetest.register_node("farming:hemp_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_hemp_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:hemp_leaf 2"}, rarity = 1}, + {items = {"farming:hemp_leaf"}, rarity = 2}, + {items = {"farming:seed_hemp"}, rarity = 1}, + {items = {"farming:seed_hemp"}, rarity = 2} + } +} +minetest.register_node("farming:hemp_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:hemp"] = { + crop = "farming:hemp", + seed = "farming:seed_hemp", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("hemp",7) diff --git a/mods/farming/crops/lettuce.lua b/mods/farming/crops/lettuce.lua new file mode 100644 index 00000000..f0ff998c --- /dev/null +++ b/mods/farming/crops/lettuce.lua @@ -0,0 +1,83 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:lettuce", { + description = S("Lettuce"), + inventory_image = "farming_lettuce.png", + groups = {compostability = 48, seed = 2, food_lettuce = 1}, + on_use = minetest.item_eat(2), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:lettuce_1") + end +}) + +farming.add_eatable("farming:lettuce", 2) + +-- crop definition + +local def = { + description = S("Lettuce") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_lettuce_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:lettuce_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_lettuce_2.png"} +minetest.register_node("farming:lettuce_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_lettuce_3.png"} +minetest.register_node("farming:lettuce_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_lettuce_4.png"} +minetest.register_node("farming:lettuce_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_lettuce_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:lettuce 2"}, rarity = 1}, + {items = {"farming:lettuce 1"}, rarity = 2} + } +} +minetest.register_node("farming:lettuce_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:lettuce"] = { + crop = "farming:lettuce", + seed = "farming:lettuce", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen +farming.register_decoration("lettuce",5) diff --git a/mods/farming/crops/melon.lua b/mods/farming/crops/melon.lua new file mode 100644 index 00000000..c21e40d2 --- /dev/null +++ b/mods/farming/crops/melon.lua @@ -0,0 +1,108 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:melon_slice", { + description = S("Melon Slice"), + inventory_image = "farming_melon_slice.png", + groups = {compostability = 48, seed = 2, food_melon_slice = 1}, + on_use = minetest.item_eat(2), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:melon_1") + end +}) + +farming.add_eatable("farming:melon_slice", 2) + +-- crop definition + +local def = { + description = S("Melon") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_melon_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:melon_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_melon_2.png"} +minetest.register_node("farming:melon_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_melon_3.png"} +minetest.register_node("farming:melon_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_melon_4.png"} +minetest.register_node("farming:melon_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_melon_5.png"} +minetest.register_node("farming:melon_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_melon_6.png"} +minetest.register_node("farming:melon_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_melon_7.png"} +minetest.register_node("farming:melon_7", table.copy(def)) + +-- stage 8 (final) + +minetest.register_node("farming:melon_8", { + description = S("Melon"), + tiles = { + "farming_melon_top.png", + "farming_melon_bottom.png", + "farming_melon_side.png" + }, + groups = { + food_melon = 1, handy = 1, snappy = 3, choppy = 3, oddly_breakable_by_hand = 2, + flammable = 2, plant = 1, compostability = 65 + }, + is_ground_content = false, + drop = "farming:melon_8", + sounds = farming.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- add to registered_plants + +farming.registered_plants["farming:melon"] = { + crop = "farming:melon", + seed = "farming:melon_slice", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen + +farming.register_decoration("melon",8) diff --git a/mods/farming/crops/mint.lua b/mods/farming/crops/mint.lua new file mode 100644 index 00000000..ac875946 --- /dev/null +++ b/mods/farming/crops/mint.lua @@ -0,0 +1,103 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_mint", { + description = S("Mint Seeds"), + tiles = {"farming_mint_seeds.png"}, + inventory_image = "farming_mint_seeds.png", + wield_image = "farming_mint_seeds.png", + drawtype = "signlike", + groups = { + compostability = 48, seed = 1, snappy = 3, attached_node = 1, growing = 1, + handy = 1, flammable = 2 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:mint_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_mint") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:mint_1", param2 = 1}) + end +}) + +-- item + +minetest.register_craftitem("farming:mint_leaf", { + description = S("Mint Leaf"), + inventory_image = "farming_mint_leaf.png", + groups = {food_mint = 1, flammable = 4, compostability = 48} +}) + +-- crop definition + +local def = { + description = S("Mint") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_mint_1.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:mint_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_mint_2.png"} +minetest.register_node("farming:mint_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_mint_3.png"} +minetest.register_node("farming:mint_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_mint_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:mint_leaf 2"}, rarity = 1}, + {items = {"farming:mint_leaf 2"}, rarity = 2}, + {items = {"farming:seed_mint 1"}, rarity = 1}, + {items = {"farming:seed_mint 2"}, rarity = 2} + } +} +minetest.register_node("farming:mint_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:mint"] = { + crop = "farming:mint", + seed = "farming:seed_mint", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("mint",4) diff --git a/mods/farming/crops/onion.lua b/mods/farming/crops/onion.lua new file mode 100644 index 00000000..7473464e --- /dev/null +++ b/mods/farming/crops/onion.lua @@ -0,0 +1,96 @@ + +--[[ + Original textures from Crops Plus mod + Copyright (C) 2018 Grizzly Adam + https://forum.minetest.net/viewtopic.php?f=9&t=19488 +]] + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:onion", { + description = S("Onion"), + inventory_image = "crops_onion.png", + groups = {compostability = 48, seed = 2, food_onion = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:onion_1") + end +}) + +farming.add_eatable("farming:onion", 1) + +-- crop definition + +local def = { + description = S("Onion") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"crops_onion_plant_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 3, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:onion_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"crops_onion_plant_2.png"} +minetest.register_node("farming:onion_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"crops_onion_plant_3.png"} +minetest.register_node("farming:onion_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"crops_onion_plant_4.png"} +minetest.register_node("farming:onion_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"crops_onion_plant_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + max_items = 5, items = { + {items = {"farming:onion"}, rarity = 1}, + {items = {"farming:onion"}, rarity = 1}, + {items = {"farming:onion"}, rarity = 2}, + {items = {"farming:onion"}, rarity = 2}, + {items = {"farming:onion"}, rarity = 5} + } +} +minetest.register_node("farming:onion_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:onion"] = { + crop = "farming:onion", + seed = "farming:onion", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen +farming.register_decoration("onion",5) diff --git a/mods/farming/crops/parsley.lua b/mods/farming/crops/parsley.lua new file mode 100644 index 00000000..6c7a2d16 --- /dev/null +++ b/mods/farming/crops/parsley.lua @@ -0,0 +1,75 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:parsley", { + description = S("Parsley"), + inventory_image = "farming_parsley.png", + groups = {compostability = 48, seed = 2, food_parsley = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:parsley_1") + end +}) + +farming.add_eatable("farming:parsley", 1) + +-- crop definition + +local def = { + description = S("Parsley") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_parsley_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:parsley_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_parsley_2.png"} +minetest.register_node("farming:parsley_2", table.copy(def)) + +-- stage 3 (final) + +def.tiles = {"farming_parsley_3.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:parsley 2"}, rarity = 1}, + {items = {"farming:parsley"}, rarity = 2}, + {items = {"farming:parsley"}, rarity = 3} + } +} +minetest.register_node("farming:parsley_3", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:parsley"] = { + crop = "farming:parsley", + seed = "farming:parsley", + minlight = 13, + maxlight = 15, + steps = 3 +} + +-- mapgen +farming.register_decoration("parsley",5) diff --git a/mods/farming/crops/peas.lua b/mods/farming/crops/peas.lua new file mode 100644 index 00000000..85605a7f --- /dev/null +++ b/mods/farming/crops/peas.lua @@ -0,0 +1,94 @@ + +-- Textures for peas and their crop were done by Andrey01 + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:pea_pod", { + description = S("Pea Pod"), + inventory_image = "farming_pea_pod.png", + groups = {compostability = 48, seed = 2, food_peas = 1, food_pea_pod = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:pea_1") + end +}) + +farming.add_eatable("farming:pea_pod", 1) + +-- replacement for separate peas item that was removed + +minetest.register_alias("farming:peas", "farming:pea_pod") + +-- crop definition + +local def = { + description = S("Pea") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_pea_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:pea_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_pea_2.png"} +minetest.register_node("farming:pea_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_pea_3.png"} +minetest.register_node("farming:pea_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_pea_4.png"} +minetest.register_node("farming:pea_4", table.copy(def)) + +-- stage 5 (final) + +def.tiles = {"farming_pea_5.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + max_items = 5, items = { + {items = {"farming:pea_pod"}, rarity = 1}, + {items = {"farming:pea_pod"}, rarity = 2}, + {items = {"farming:pea_pod"}, rarity = 3}, + {items = {"farming:pea_pod"}, rarity = 5} + } +} +minetest.register_node("farming:pea_5", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:pea_pod"] = { + crop = "farming:pea", + seed = "farming:pea_pod", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 5 +} + +-- mapgen +farming.register_decoration("pea",5) diff --git a/mods/farming/crops/pepper.lua b/mods/farming/crops/pepper.lua new file mode 100644 index 00000000..a5cf9021 --- /dev/null +++ b/mods/farming/crops/pepper.lua @@ -0,0 +1,154 @@ + +--[[ + Original textures from Crops Plus mod + Copyright (C) 2018 Grizzly Adam + https://forum.minetest.net/viewtopic.php?f=9&t=19488 +]] + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_craftitem("farming:peppercorn", { + description = S("Peppercorn"), + inventory_image = "crops_peppercorn.png", + groups = {compostability = 48, seed = 1, food_peppercorn = 1, flammable = 3}, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:pepper_1") + end +}) + +-- green pepper + +minetest.register_craftitem("farming:pepper", { + description = S("Green Pepper"), + inventory_image = "crops_pepper.png", + on_use = minetest.item_eat(2), + groups = {food_pepper = 1, compostability = 55} +}) + +farming.add_eatable("farming:pepper", 2) + +-- yellow pepper + +minetest.register_craftitem("farming:pepper_yellow", { + description = S("Yellow Pepper"), + inventory_image = "crops_pepper_yellow.png", + on_use = minetest.item_eat(3), + groups = {food_pepper = 1, compostability = 55} +}) + +farming.add_eatable("farming:pepper_yellow", 3) + +-- red pepper + +minetest.register_craftitem("farming:pepper_red", { + description = S("Red Pepper"), + inventory_image = "crops_pepper_red.png", + on_use = minetest.item_eat(4), + groups = {food_pepper = 1, compostability = 55} +}) + +farming.add_eatable("farming:pepper_red", 4) + +-- pepper to peppercorn recipe + +minetest.register_craft({ + output = "farming:peppercorn", + recipe = {{"group:food_pepper"}} +}) + +-- crop definition + +local def = { + description = S("Pepper") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"crops_pepper_plant_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 1, + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 3, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:pepper_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"crops_pepper_plant_2.png"} +minetest.register_node("farming:pepper_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"crops_pepper_plant_3.png"} +minetest.register_node("farming:pepper_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"crops_pepper_plant_4.png"} +minetest.register_node("farming:pepper_4", table.copy(def)) + +-- stage 5 (green pepper) + +def.tiles = {"crops_pepper_plant_5.png"} +def.selection_box = farming.select_final +def.drop = { + max_items = 2, items = { + {items = {"farming:pepper 2"}, rarity = 1}, + {items = {"farming:pepper"}, rarity = 2}, + {items = {"farming:pepper"}, rarity = 3} + } +} +minetest.register_node("farming:pepper_5", table.copy(def)) + +-- stage 6 (yellow pepper) + +def.tiles = {"crops_pepper_plant_6.png"} +def.drop = { + max_items = 2, items = { + {items = {"farming:pepper_yellow 2"}, rarity = 1}, + {items = {"farming:pepper_yellow"}, rarity = 2}, + {items = {"farming:pepper_yellow"}, rarity = 3} + } +} +minetest.register_node("farming:pepper_6", table.copy(def)) + +-- stage 7 (red pepper - final) + +def.tiles = {"crops_pepper_plant_7.png"} +def.groups.growing = nil +def.drop = { + max_items = 2, items = { + {items = {"farming:pepper_red 2"}, rarity = 1}, + {items = {"farming:pepper_red"}, rarity = 2}, + {items = {"farming:pepper_red"}, rarity = 3} + } +} +minetest.register_node("farming:pepper_7", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:pepper"] = { + crop = "farming:pepper", + seed = "farming:peppercorn", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 7 +} + +-- mapgen +farming.register_decoration("pepper",7) diff --git a/mods/farming/crops/pineapple.lua b/mods/farming/crops/pineapple.lua new file mode 100644 index 00000000..26c329fd --- /dev/null +++ b/mods/farming/crops/pineapple.lua @@ -0,0 +1,119 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_craftitem("farming:pineapple_top", { + description = S("Pineapple Top"), + inventory_image = "farming_pineapple_top.png", + groups = {compostability = 48, seed = 2, flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:pineapple_1") + end +}) + +-- item + +minetest.register_node("farming:pineapple", { + description = S("Pineapple"), + drawtype = "plantlike", + tiles = {"farming_pineapple.png"}, + inventory_image = "farming_pineapple.png", + wield_image = "farming_pineapple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.27, -0.37, -0.27, 0.27, 0.44, 0.27} + }, + groups = { + food_pineapple = 1, fleshy = 3, dig_immediate = 3, flammable = 2, + compostability = 65 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false +}) + +-- crop definition + +local def = { + description = S("Pineapple") .. S(" Crop"), + drawtype = "plantlike", + visual_scale = 1.5, + tiles = {"farming_pineapple_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:pineapple_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_pineapple_2.png"} +minetest.register_node("farming:pineapple_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_pineapple_3.png"} +minetest.register_node("farming:pineapple_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_pineapple_4.png"} +minetest.register_node("farming:pineapple_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_pineapple_5.png"} +minetest.register_node("farming:pineapple_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_pineapple_6.png"} +minetest.register_node("farming:pineapple_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_pineapple_7.png"} +minetest.register_node("farming:pineapple_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_pineapple_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:pineapple"}, rarity = 1}, + {items = {"farming:pineapple"}, rarity = 2} + } +} +minetest.register_node("farming:pineapple_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:pineapple"] = { + crop = "farming:pineapple", + seed = "farming:pineapple_top", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("pineapple",8) diff --git a/mods/farming/crops/potato.lua b/mods/farming/crops/potato.lua new file mode 100644 index 00000000..77caeeae --- /dev/null +++ b/mods/farming/crops/potato.lua @@ -0,0 +1,102 @@ + +--[[ + Original textures from DocFarming mod + https://forum.minetest.net/viewtopic.php?id=3948 +]] + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:potato", { + description = S("Potato"), + inventory_image = "farming_potato.png", + groups = {compostability = 48, seed = 2, food_potato = 1}, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:potato_1") + end, + + -- 1 in 3 chance of being poisoned + on_use = function(itemstack, user, pointed_thing) + + if user then + + if math.random(3) == 1 then + return minetest.do_item_eat(-1, nil, itemstack, user, pointed_thing) + else + return minetest.do_item_eat(1, nil, itemstack, user, pointed_thing) + end + end + end +}) + +farming.add_eatable("farming:potato", 1) + +-- crop definition + +local def = { + description = S("Potato") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_potato_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:potato_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_potato_2.png"} +minetest.register_node("farming:potato_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_potato_3.png"} +def.drop = { + items = { + {items = {"farming:potato"}, rarity = 1}, + {items = {"farming:potato"}, rarity = 3} + } +} +minetest.register_node("farming:potato_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_potato_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:potato 2"}, rarity = 1}, + {items = {"farming:potato 3"}, rarity = 2} + } +} +minetest.register_node("farming:potato_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:potato"] = { + crop = "farming:potato", + seed = "farming:potato", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("potato",3) diff --git a/mods/farming/crops/pumpkin.lua b/mods/farming/crops/pumpkin.lua new file mode 100644 index 00000000..70816bd4 --- /dev/null +++ b/mods/farming/crops/pumpkin.lua @@ -0,0 +1,110 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_craftitem("farming:pumpkin_slice", { + description = S("Pumpkin Slice"), + inventory_image = "farming_pumpkin_slice.png", + groups = {compostability = 48, seed = 2, food_pumpkin_slice = 1}, + on_use = minetest.item_eat(2), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:pumpkin_1") + end +}) + +farming.add_eatable("farming:pumpkin_slice", 2) + +-- crop definition + +local def = { + description = S("Pumpkin") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_pumpkin_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:pumpkin_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_pumpkin_2.png"} +minetest.register_node("farming:pumpkin_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_pumpkin_3.png"} +minetest.register_node("farming:pumpkin_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_pumpkin_4.png"} +minetest.register_node("farming:pumpkin_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_pumpkin_5.png"} +minetest.register_node("farming:pumpkin_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_pumpkin_6.png"} +minetest.register_node("farming:pumpkin_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_pumpkin_7.png"} +minetest.register_node("farming:pumpkin_7", table.copy(def)) + +-- stage 8 (final) + +minetest.register_node("farming:pumpkin_8", { + description = S("Pumpkin"), + tiles = { + "farming_pumpkin_bottom.png^farming_pumpkin_top.png", + "farming_pumpkin_bottom.png", + "farming_pumpkin_side.png" + }, + groups = { + food_pumpkin = 1, snappy = 3, choppy = 3, oddly_breakable_by_hand = 2, + flammable = 2, plant = 1, handy = 1 + }, + is_ground_content = false, + drop = "farming:pumpkin_8", + sounds = farming.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +minetest.register_alias("farming:pumpkin", "farming:pumpkin_8") + +-- add to registered_plants + +farming.registered_plants["farming:pumpkin"] = { + crop = "farming:pumpkin", + seed = "farming:pumpkin_slice", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("pumpkin",8) diff --git a/mods/farming/crops/raspberry.lua b/mods/farming/crops/raspberry.lua new file mode 100644 index 00000000..771ceea8 --- /dev/null +++ b/mods/farming/crops/raspberry.lua @@ -0,0 +1,82 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:raspberries", { + description = S("Raspberries"), + inventory_image = "farming_raspberries.png", + groups = { + compostability = 48, seed = 2, food_raspberries = 1, food_raspberry = 1, + food_berry = 1 + }, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:raspberry_1") + end +}) + +farming.add_eatable("farming:raspberries", 1) + +-- crop definition + +local def = { + description = S("Raspberry") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_raspberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:raspberry_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_raspberry_2.png"} +minetest.register_node("farming:raspberry_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_raspberry_3.png"} +minetest.register_node("farming:raspberry_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_raspberry_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:raspberries 2"}, rarity = 1}, + {items = {"farming:raspberries"}, rarity = 2}, + {items = {"farming:raspberries"}, rarity = 3} + } +} +minetest.register_node("farming:raspberry_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:raspberries"] = { + crop = "farming:raspberry", + seed = "farming:raspberries", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("raspberry",4) diff --git a/mods/farming/crops/rhubarb.lua b/mods/farming/crops/rhubarb.lua new file mode 100644 index 00000000..26044e17 --- /dev/null +++ b/mods/farming/crops/rhubarb.lua @@ -0,0 +1,87 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:rhubarb", { + description = S("Rhubarb"), + inventory_image = "farming_rhubarb.png", + groups = {compostability = 48, seed = 2, food_rhubarb = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:rhubarb_1") + end +}) + +farming.add_eatable("farming:rhubarb", 1) + +-- crop definition + +local def = { + description = S("Rhubarb") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_rhubarb_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + minlight = 10, + maxlight = 12 +} + +-- stage 1 + +minetest.register_node("farming:rhubarb_1", table.copy(def)) + +-- stage2 + +def.tiles = {"farming_rhubarb_2.png"} +minetest.register_node("farming:rhubarb_2", table.copy(def)) + +-- stage3 + +def.tiles = {"farming_rhubarb_3.png"} +def.drop = { + items = { + {items = {"farming:rhubarb"}, rarity = 1}, + } +} +minetest.register_node("farming:rhubarb_3", table.copy(def)) + +-- stage 4 (final) + +def.tiles = {"farming_rhubarb_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:rhubarb 2"}, rarity = 1}, + {items = {"farming:rhubarb"}, rarity = 2}, + {items = {"farming:rhubarb"}, rarity = 3} + } +} +minetest.register_node("farming:rhubarb_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:rhubarb"] = { + crop = "farming:rhubarb", + seed = "farming:rhubarb", + minlight = 10, + maxlight = 12, + steps = 4 +} + +-- mapgen +farming.register_decoration("rhubarb",3) diff --git a/mods/farming/crops/rice.lua b/mods/farming/crops/rice.lua new file mode 100644 index 00000000..d363f638 --- /dev/null +++ b/mods/farming/crops/rice.lua @@ -0,0 +1,151 @@ + +local S = minetest.get_translator("farming") + +-- rice seed + +minetest.register_node("farming:seed_rice", { + description = S("Rice Seed"), + tiles = {"farming_rice_seed.png"}, + inventory_image = "farming_rice_seed.png", + wield_image = "farming_rice_seed.png", + drawtype = "signlike", + groups = { + handy = 1, compostability = 48, seed = 1, snappy = 3, attached_node = 1, + flammable = 4, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:rice_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_rice") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:rice_1", param2 = 3}) + end +}) + +-- rice item + +minetest.register_craftitem("farming:rice", { + description = S("Rice"), + inventory_image = "farming_rice.png", + groups = {seed = 2, food_rice = 1, flammable = 2, compostability = 65}, +}) + +-- dry rice seed to give edible rice + +minetest.register_craft({ + type = "cooking", + cooktime = 1, + output = "farming:rice", + recipe = "farming:seed_rice" +}) + +-- crop definition + +local def = { + description = S("Rice") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_rice_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 4, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:rice_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_rice_2.png"} +minetest.register_node("farming:rice_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_rice_3.png"} +minetest.register_node("farming:rice_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_rice_4.png"} +minetest.register_node("farming:rice_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_rice_5.png"} +def.drop = { + items = { + {items = {"farming:rice"}, rarity = 2} + } +} +minetest.register_node("farming:rice_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_rice_6.png"} +def.drop = { + items = { + {items = {"farming:rice"}, rarity = 2} + } +} +minetest.register_node("farming:rice_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_rice_7.png"} +def.drop = { + items = { + {items = {"farming:seed_rice"}, rarity = 1}, + {items = {"farming:seed_rice"}, rarity = 2}, + {items = {"farming:seed_rice"}, rarity = 3} + } +} +minetest.register_node("farming:rice_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_rice_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:seed_rice 2"}, rarity = 1}, + {items = {"farming:seed_rice 2"}, rarity = 2}, + {items = {"farming:seed_rice"}, rarity = 3} + } +} +minetest.register_node("farming:rice_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:rice"] = { + crop = "farming:rice", + seed = "farming:seed_rice", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("rice",8) diff --git a/mods/farming/crops/rye_oat.lua b/mods/farming/crops/rye_oat.lua new file mode 100644 index 00000000..3fd93c14 --- /dev/null +++ b/mods/farming/crops/rye_oat.lua @@ -0,0 +1,50 @@ + +local S = minetest.get_translator("farming") + +--= A nice addition from Ademant's grain mod :) + +-- Rye + +farming.register_plant("farming:rye", { + description = S("Rye seed"), + paramtype2 = "meshoptions", + inventory_image = "farming_rye_seed.png", + steps = 8, + place_param2 = 3 +}) + +-- override rye item + +minetest.override_item("farming:rye", { + description = S("Rye"), + groups = {food_rye = 1, flammable = 4, compostability = 65} +}) + +-- override rye crop + +minetest.override_item("farming:rye_1", {drop = {}}) +minetest.override_item("farming:rye_2", {drop = {}}) +minetest.override_item("farming:rye_3", {drop = {}}) + +-- Oats + +farming.register_plant("farming:oat", { + description = S("Oat seed"), + paramtype2 = "meshoptions", + inventory_image = "farming_oat_seed.png", + steps = 8, + place_param2 = 3 +}) + +-- override oat item + +minetest.override_item("farming:oat", { + description = S("Oats"), + groups = {food_oats = 1, flammable = 4, compostability = 65} +}) + +-- override oat crop + +minetest.override_item("farming:oat_1", {drop = {}}) +minetest.override_item("farming:oat_2", {drop = {}}) +minetest.override_item("farming:oat_3", {drop = {}}) diff --git a/mods/farming/crops/soy.lua b/mods/farming/crops/soy.lua new file mode 100644 index 00000000..88c1980a --- /dev/null +++ b/mods/farming/crops/soy.lua @@ -0,0 +1,112 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:soy_pod", { + description = S("Soy Pod"), + inventory_image = "farming_soy_pod.png", + groups = {compostability = 48, seed = 2, food_soy = 1, food_soy_pod = 1, flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:soy_1") + end +}) + +-- replacement for soy beans that was removed + +minetest.register_alias("farming:soy_beans", "farming:soy_pod") + +-- crop definition + +local def = { + description = S("Soy") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_soy_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:soy_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_soy_2.png"} +minetest.register_node("farming:soy_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_soy_3.png"} +minetest.register_node("farming:soy_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_soy_4.png"} +minetest.register_node("farming:soy_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_soy_5.png"} +def.drop = { + max_items = 1, items = { + {items = {"farming:soy_pod"}, rarity = 1}, + } +} +minetest.register_node("farming:soy_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_soy_6.png"} +def.drop = { + max_items = 3, items = { + {items = {"farming:soy_pod"}, rarity = 1}, + {items = {"farming:soy_pod"}, rarity = 2}, + {items = {"farming:soy_pod"}, rarity = 3} + } +} +minetest.register_node("farming:soy_6", table.copy(def)) + +-- stage 7 (final) + +def.tiles = {"farming_soy_7.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + max_items = 5, items = { + {items = {"farming:soy_pod"}, rarity = 1}, + {items = {"farming:soy_pod"}, rarity = 2}, + {items = {"farming:soy_pod"}, rarity = 3}, + {items = {"farming:soy_pod"}, rarity = 4}, + {items = {"farming:soy_pod"}, rarity = 5} + } +} +minetest.register_node("farming:soy_7", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:soy_pod"] = { + crop = "farming:soy", + seed = "farming:soy_pod", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 7 +} + +-- mapgen +farming.register_decoration("soy",7) diff --git a/mods/farming/crops/spinach.lua b/mods/farming/crops/spinach.lua new file mode 100644 index 00000000..29ac27ea --- /dev/null +++ b/mods/farming/crops/spinach.lua @@ -0,0 +1,86 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:spinach", { + description = S("Spinach"), + inventory_image = "farming_spinach.png", + groups = {compostability = 48, seed = 2, food_spinach = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:spinach_1") + end +}) + +farming.add_eatable("farming:spinach", 1) + +-- crop definition + +local def = { + description = S("Spinach") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_spinach_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:spinach_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_spinach_2.png"} +minetest.register_node("farming:spinach_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_spinach_3.png"} +def.drop = { + items = { + {items = {"farming:spinach"}, rarity = 1}, + {items = {"farming:spinach"}, rarity = 3} + } +} +minetest.register_node("farming:spinach_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_spinach_4.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:spinach 2"}, rarity = 1}, + {items = {"farming:spinach 2"}, rarity = 2}, + {items = {"farming:spinach 2"}, rarity = 3} + } +} +minetest.register_node("farming:spinach_4", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:spinach"] = { + crop = "farming:spinach", + seed = "farming:spinach", + minlight = 7, + maxlight = farming.max_light, + steps = 4 +} + +-- mapgen +farming.register_decoration("spinach",4) diff --git a/mods/farming/crops/strawberry.lua b/mods/farming/crops/strawberry.lua new file mode 100644 index 00000000..66c987c8 --- /dev/null +++ b/mods/farming/crops/strawberry.lua @@ -0,0 +1,114 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem(":ethereal:strawberry", { + description = S("Strawberry"), + inventory_image = "ethereal_strawberry.png", + groups = {compostability = 48, seed = 2, food_strawberry = 1, food_berry = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "ethereal:strawberry_1") + end, +}) + +farming.add_eatable("ethereal:strawberry", 1) + +-- crop definition + +local def = { + description = S("Strawberry") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"ethereal_strawberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} + }, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +--stage 1 + +minetest.register_node(":ethereal:strawberry_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"ethereal_strawberry_2.png"} +minetest.register_node(":ethereal:strawberry_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"ethereal_strawberry_3.png"} +minetest.register_node(":ethereal:strawberry_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"ethereal_strawberry_4.png"} +minetest.register_node(":ethereal:strawberry_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"ethereal_strawberry_5.png"} +minetest.register_node(":ethereal:strawberry_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"ethereal_strawberry_6.png"} +def.drop = { + items = { + {items = {"ethereal:strawberry 1"}, rarity = 2}, + {items = {"ethereal:strawberry 2"}, rarity = 3} + } +} +minetest.register_node(":ethereal:strawberry_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"ethereal_strawberry_7.png"} +def.drop = { + items = { + {items = {"ethereal:strawberry 1"}, rarity = 1}, + {items = {"ethereal:strawberry 2"}, rarity = 3} + } +} +minetest.register_node(":ethereal:strawberry_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"ethereal_strawberry_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"ethereal:strawberry 2"}, rarity = 1}, + {items = {"ethereal:strawberry 3"}, rarity = 3} + } +} +minetest.register_node(":ethereal:strawberry_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["ethereal:strawberry"] = { + crop = "ethereal:strawberry", + seed = "ethereal:strawberry", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("strawberry",7) diff --git a/mods/farming/crops/sunflower.lua b/mods/farming/crops/sunflower.lua new file mode 100644 index 00000000..09ef5dec --- /dev/null +++ b/mods/farming/crops/sunflower.lua @@ -0,0 +1,132 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_sunflower", { + description = S("Sunflower Seeds"), + tiles = {"farming_sunflower_seeds.png"}, + inventory_image = "farming_sunflower_seeds.png", + wield_image = "farming_sunflower_seeds.png", + drawtype = "signlike", + groups = { + compostability = 48, seed = 1, snappy = 3, attached_node = 1, growing = 1, + handy = 1, food_sunflower_seeds = 1, flammable = 2 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:sunflower_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_sunflower") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:sunflower_1", param2 = 1}) + end +}) + +minetest.register_alias("farming:sunflower_seeds", "farming:seed_sunflower") + +-- item + +minetest.register_craftitem("farming:sunflower", { + description = S("Sunflower"), + inventory_image = "farming_sunflower.png", + groups = {flammable = 2} +}) + +-- turn item into seeds + +minetest.register_craft({ + output = "farming:seed_sunflower 5", + recipe = {{"farming:sunflower"}} +}) + +-- crop definition + +local def = { + description = S("Sunflower") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_sunflower_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:sunflower_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_sunflower_2.png"} +minetest.register_node("farming:sunflower_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_sunflower_3.png"} +minetest.register_node("farming:sunflower_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_sunflower_4.png"} +minetest.register_node("farming:sunflower_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_sunflower_5.png"} +minetest.register_node("farming:sunflower_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_sunflower_6.png"} +def.visual_scale = 1.9 +minetest.register_node("farming:sunflower_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_sunflower_7.png"} +minetest.register_node("farming:sunflower_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_sunflower_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:sunflower"}, rarity = 1}, + {items = {"farming:sunflower"}, rarity = 6} + } +} +minetest.register_node("farming:sunflower_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:sunflower"] = { + crop = "farming:sunflower", + seed = "farming:seed_sunflower", + minlight = 14, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("sunflower",8) diff --git a/mods/farming/crops/tomato.lua b/mods/farming/crops/tomato.lua new file mode 100644 index 00000000..d0e94f45 --- /dev/null +++ b/mods/farming/crops/tomato.lua @@ -0,0 +1,111 @@ + +--[[ + Textures edited from: + http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1288375-food-plus-mod-more-food-than-you-can-imagine-v2-9) +]] + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:tomato", { + description = S("Tomato"), + inventory_image = "farming_tomato.png", + groups = {compostability = 45, seed = 2, food_tomato = 1}, + on_use = minetest.item_eat(4), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:tomato_1") + end +}) + +farming.add_eatable("farming:tomato", 4) + +-- crop definition + +local def = { + description = S("Tomato") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_tomato_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:tomato_1", table.copy(def)) + +-- stage2 + +def.tiles = {"farming_tomato_2.png"} +minetest.register_node("farming:tomato_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_tomato_3.png"} +minetest.register_node("farming:tomato_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_tomato_4.png"} +minetest.register_node("farming:tomato_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_tomato_5.png"} +minetest.register_node("farming:tomato_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_tomato_6.png"} +minetest.register_node("farming:tomato_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_tomato_7.png"} +def.drop = { + items = { + {items = {"farming:tomato"}, rarity = 1}, + {items = {"farming:tomato"}, rarity = 3} + } +} +minetest.register_node("farming:tomato_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_tomato_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:tomato 3"}, rarity = 1}, + {items = {"farming:tomato 2"}, rarity = 2}, + {items = {"farming:tomato 1"}, rarity = 3} + } +} +minetest.register_node("farming:tomato_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:tomato"] = { + crop = "farming:tomato", + seed = "farming:tomato", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("tomato",8) diff --git a/mods/farming/crops/vanilla.lua b/mods/farming/crops/vanilla.lua new file mode 100644 index 00000000..507020ee --- /dev/null +++ b/mods/farming/crops/vanilla.lua @@ -0,0 +1,109 @@ + +local S = minetest.get_translator("farming") + +-- item/seed + +minetest.register_craftitem("farming:vanilla", { + description = S("Vanilla"), + inventory_image = "farming_vanilla.png", + groups = {compostability = 48, seed = 2, food_vanilla = 1}, + on_use = minetest.item_eat(1), + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:vanilla_1") + end +}) + +farming.add_eatable("farming:vanilla", 1) + +-- crop definition + +local def = { + description = S("Vanilla") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_vanilla_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + handy = 1, snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:vanilla_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_vanilla_2.png"} +minetest.register_node("farming:vanilla_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_vanilla_3.png"} +minetest.register_node("farming:vanilla_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_vanilla_4.png"} +minetest.register_node("farming:vanilla_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_vanilla_5.png"} +minetest.register_node("farming:vanilla_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_vanilla_6.png"} +def.visual_scale = 1.9 +minetest.register_node("farming:vanilla_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_vanilla_7.png"} +def.drop = { + items = { + {items = {"farming:vanilla"}, rarity = 1}, + {items = {"farming:vanilla"}, rarity = 2}, + {items = {"farming:vanilla"}, rarity = 3} + } +} +minetest.register_node("farming:vanilla_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_vanilla_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:vanilla 2"}, rarity = 1}, + {items = {"farming:vanilla 2"}, rarity = 2}, + {items = {"farming:vanilla 2"}, rarity = 2}, + {items = {"farming:vanilla 2"}, rarity = 3} + } +} +minetest.register_node("farming:vanilla_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:vanilla"] = { + crop = "farming:vanilla", + seed = "farming:vanilla", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} + +-- mapgen +farming.register_decoration("vanilla",8) diff --git a/mods/farming/crops/wheat.lua b/mods/farming/crops/wheat.lua new file mode 100644 index 00000000..db6644ec --- /dev/null +++ b/mods/farming/crops/wheat.lua @@ -0,0 +1,144 @@ + +local S = minetest.get_translator("farming") + +-- seed + +minetest.register_node("farming:seed_wheat", { + description = S("Wheat Seed"), + tiles = {"farming_wheat_seed.png"}, + inventory_image = "farming_wheat_seed.png", + wield_image = "farming_wheat_seed.png", + drawtype = "signlike", + groups = { + handy = 1, seed = 1, snappy = 3, attached_node = 1, flammable = 4, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + next_plant = "farming:wheat_1", + + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:seed_wheat") + end, + + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "farming:wheat_1", param2 = 3}) + end +}) + +-- item + +minetest.register_craftitem("farming:wheat", { + description = S("Wheat"), + inventory_image = "farming_wheat.png", + groups = {food_wheat = 1, flammable = 4} +}) + +-- crop definition + +local def = { + description = S("Wheat") .. S(" Crop"), + drawtype = "plantlike", + tiles = {"farming_wheat_1.png"}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 3, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + waving = 1, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 4, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults() +} + +-- stage 1 + +minetest.register_node("farming:wheat_1", table.copy(def)) + +-- stage 2 + +def.tiles = {"farming_wheat_2.png"} +minetest.register_node("farming:wheat_2", table.copy(def)) + +-- stage 3 + +def.tiles = {"farming_wheat_3.png"} +minetest.register_node("farming:wheat_3", table.copy(def)) + +-- stage 4 + +def.tiles = {"farming_wheat_4.png"} +minetest.register_node("farming:wheat_4", table.copy(def)) + +-- stage 5 + +def.tiles = {"farming_wheat_5.png"} +def.drop = { + items = { + {items = {"farming:wheat"}, rarity = 2}, + {items = {"farming:seed_wheat"}, rarity = 2} + } +} +minetest.register_node("farming:wheat_5", table.copy(def)) + +-- stage 6 + +def.tiles = {"farming_wheat_6.png"} +def.drop = { + items = { + {items = {"farming:wheat"}, rarity = 2}, + {items = {"farming:seed_wheat"}, rarity = 1} + } +} +minetest.register_node("farming:wheat_6", table.copy(def)) + +-- stage 7 + +def.tiles = {"farming_wheat_7.png"} +def.drop = { + items = { + {items = {"farming:wheat"}, rarity = 1}, + {items = {"farming:wheat"}, rarity = 3}, + {items = {"farming:seed_wheat"}, rarity = 1}, + {items = {"farming:seed_wheat"}, rarity = 3} + } +} +minetest.register_node("farming:wheat_7", table.copy(def)) + +-- stage 8 (final) + +def.tiles = {"farming_wheat_8.png"} +def.groups.growing = nil +def.selection_box = farming.select_final +def.drop = { + items = { + {items = {"farming:wheat"}, rarity = 1}, + {items = {"farming:wheat"}, rarity = 3}, + {items = {"farming:seed_wheat"}, rarity = 1}, + {items = {"farming:seed_wheat"}, rarity = 3} + } +} +minetest.register_node("farming:wheat_8", table.copy(def)) + +-- add to registered_plants + +farming.registered_plants["farming:wheat"] = { + crop = "farming:wheat", + seed = "farming:seed_wheat", + minlight = farming.min_light, + maxlight = farming.max_light, + steps = 8 +} +-- mapgen +farming.register_decoration("wheat",8) diff --git a/mods/farming/farming.conf b/mods/farming/farming.conf new file mode 100644 index 00000000..efb018d9 --- /dev/null +++ b/mods/farming/farming.conf @@ -0,0 +1,51 @@ + +--[[ + Farming settings can be changed here and kept inside mod folder + even after the mod has been updated, or you can place inside + world folder for map specific settings. +--]] + +-- true to enable crop/food in-game and on mapgen set spawn rarety +farming.asparagus = 0.002 +farming.eggplant = 0.002 +farming.spinach = 0.002 +farming.carrot = false +farming.potato = false +farming.tomato = 0.001 +farming.cucumber = 0.001 +farming.corn = false +farming.coffee = false +farming.melon = false +farming.pumpkin = pumpkin +farming.cocoa = false -- true or false only +farming.raspberry = 0.001 +farming.blueberry = false +farming.rhubarb = 0.001 +farming.beans = 0.001 +farming.grapes = 0.001 +farming.barley = false -- true or false only +farming.chili = 0.003 +farming.hemp = 0.003 +farming.garlic = 0.001 +farming.onion = 0.001 +farming.pepper = 0.002 +farming.pineapple = 0.001 +farming.peas = 0.001 +farming.beetroot = false +farming.mint = 0.005 +farming.cabbage = 0.001 +farming.blackberry = false +farming.lettuce = 0.001 +farming.soy = false +farming.vanilla = 0.001 +farming.artichoke = 0.001 +farming.parsley = 0.002 +farming.sunflower = 0.001 +farming.ginger = 0.002 +farming.strawberry = false +farming.grains = true -- true or false only +farming.rice = true + +-- default minimum and maximum light levels crops need to grow +farming.min_light = 12 +farming.max_light = 15 diff --git a/mods/farming/farming.conf_example b/mods/farming/farming.conf_example new file mode 100644 index 00000000..d22ba2e9 --- /dev/null +++ b/mods/farming/farming.conf_example @@ -0,0 +1,52 @@ + +--[[ + Farming settings can be changed here and kept inside mod folder + even after the mod has been updated, or you can place inside + world folder for map specific settings. +--]] + +-- true to enable crop/food in-game and on mapgen set spawn rarety +farming.asparagus = 0.002 +farming.eggplant = 0.002 +farming.spinach = 0.002 +farming.carrot = 0.002 +farming.potato = 0.002 +farming.tomato = 0.002 +farming.cucumber = 0.002 +farming.corn = 0.002 +farming.coffee = 0.002 +farming.melon = 0.009 +farming.pumpkin = 0.009 +farming.cocoa = true -- true or false only +farming.raspberry = 0.002 +farming.blueberry = 0.002 +farming.rhubarb = 0.002 +farming.beans = 0.002 +farming.grapes = 0.002 +farming.barley = true -- true or false only +farming.chili = 0.003 +farming.hemp = 0.003 +farming.garlic = 0.002 +farming.onion = 0.002 +farming.pepper = 0.002 +farming.pineapple = 0.003 +farming.peas = 0.002 +farming.beetroot = 0.002 +farming.mint = 0.005 +farming.cabbage = 0.002 +farming.blackberry = 0.002 +farming.lettuce = 0.002 +farming.soy = 0.002 +farming.vanilla = 0.002 +farming.artichoke = 0.002 +farming.parsley = 0.002 +farming.sunflower = 0.002 +farming.ginger = 0.002 +farming.cotton = 0.003 +farming.strawberry = 0.002 +farming.grains = true -- true or false only +farming.rice = true + +-- default minimum and maximum light levels crops need to grow +farming.min_light = 12 +farming.max_light = 15 diff --git a/mods/farming/grass.lua b/mods/farming/grass.lua new file mode 100644 index 00000000..2e607c2a --- /dev/null +++ b/mods/farming/grass.lua @@ -0,0 +1,76 @@ + +-- Override grass to drop wheat and oat seeds + +local rarity_lookup = {[1] = 50, [2] = 50, [3] = 50, [4] = 5, [5] = 5} + +if minetest.registered_nodes["default:grass_1"] then + + for i = 1, 5 do + + minetest.override_item("default:grass_" .. i, { + drop = { + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = rarity_lookup[i]}, + {items = {"farming:seed_oat"},rarity = rarity_lookup[i]}, + {items = {"default:grass_1"}} + } + } + }) + end +end + +-- override dry grass to drop barley and rye seeds + +if minetest.registered_nodes["default:dry_grass_1"] then + + for i = 1, 5 do + + minetest.override_item("default:dry_grass_" .. i, { + drop = { + max_items = 1, + items = { + {items = {"farming:seed_barley"}, rarity = rarity_lookup[i]}, + {items = {"farming:seed_rye"}, rarity = rarity_lookup[i]}, + {items = {"default:dry_grass_1"}} + } + } + }) + end +end + +-- override jungle grass to drop cotton and rice seeds + +if minetest.registered_nodes["default:junglegrass"] then + + minetest.override_item("default:junglegrass", { + drop = { + max_items = 1, + items = { + {items = {"farming:seed_cotton"}, rarity = 8}, + {items = {"farming:seed_rice"}, rarity = 8}, + {items = {"default:junglegrass"}} + } + } + }) +end + +-- override mineclone tallgrass to drop all sof the above seeds + +if farming.mcl then + + minetest.override_item("mcl_flowers:tallgrass", { + drop = { + max_items = 1, + items = { + {items = {"mcl_farming:wheat_seeds"}, rarity = 5}, + {items = {"farming:seed_oat"},rarity = 5}, + {items = {"farming:seed_barley"}, rarity = 5}, + {items = {"farming:seed_rye"},rarity = 5}, + {items = {"farming:seed_cotton"}, rarity = 8}, + {items = {"farming:seed_rice"},rarity = 8} + } + } + }) +end + diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua new file mode 100644 index 00000000..e6865754 --- /dev/null +++ b/mods/farming/hoes.lua @@ -0,0 +1,485 @@ + +-- translation and mod check + +local S = minetest.get_translator("farming") +local mod_tr = minetest.get_modpath("toolranks") + +-- Hoe registration function + +farming.register_hoe = function(name, def) + + -- Check for : prefix (register new hoes in your mod's namespace) + if name:sub(1,1) ~= ":" then name = ":" .. name end + + -- Check def table + if def.description == nil then def.description = S("Hoe") end + + if def.inventory_image == nil then def.inventory_image = "unknown_item.png" end + + if def.max_uses == nil then def.max_uses = 30 end + + -- add hoe group + def.groups = def.groups or {} + def.groups.hoe = 1 + + -- Register the tool + minetest.register_tool(name, { + description = def.description, + inventory_image = def.inventory_image, + groups = def.groups, + sound = {breaks = "default_tool_breaks"}, + damage_groups = def.damage_groups or {fleshy = 1}, + + on_use = function(itemstack, user, pointed_thing) + return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) + end + }) + + -- Register its recipe + if def.recipe then + + minetest.register_craft({ + output = name:sub(2), + recipe = def.recipe + }) + elseif def.material then + + minetest.register_craft({ + output = name:sub(2), + recipe = { + {def.material, def.material, ""}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + end +end + +-- Turns dirt with group soil=1 into soil + +function farming.hoe_on_use(itemstack, user, pointed_thing, uses) + + local pt = pointed_thing or {} + local is_used = false + + -- am I going to hoe the top of a dirt node? + if pt.type == "node" and pt.above.y == pt.under.y + 1 then + + local under = minetest.get_node(pt.under) + local upos = pointed_thing.under + + if minetest.is_protected(upos, user:get_player_name()) then + minetest.record_protection_violation(upos, user:get_player_name()) + return + end + + local p = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] + or not minetest.registered_nodes[above.name] then return end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then return end + + -- check if pointing at dirt + if minetest.get_item_group(under.name, "soil") ~= 1 then return end + + -- check if (wet) soil defined + local ndef = minetest.registered_nodes[under.name] + + if ndef.soil == nil or ndef.soil.wet == nil or ndef.soil.dry == nil then + return + end + + if minetest.is_protected(pt.under, user:get_player_name()) then + minetest.record_protection_violation(pt.under, user:get_player_name()) + return + end + + -- turn the node into soil, wear out item and play sound + minetest.set_node(pt.under, {name = ndef.soil.dry}) ; is_used = true + + minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5}, true) + end + + local wdef = itemstack:get_definition() + local wear = 65535 / (uses - 1) + + -- using hoe as weapon + if pt.type == "object" then + + local ent = pt.ref and pt.ref:get_luaentity() + local dir = user:get_look_dir() + + if (ent and ent.name ~= "__builtin:item" + and ent.name ~= "__builtin:falling_node") or pt.ref:is_player() then + + pt.ref:punch(user, nil, {full_punch_interval = 1.0, + damage_groups = wdef.damage_groups}, dir) + + is_used = true + end + end + + -- only when used on soil top or external entity + if is_used then + + -- cretive doesnt wear tools but toolranks registers uses with wear so set to 1 + if farming.is_creative(user:get_player_name()) then + if mod_tr then wear = 1 else wear = 0 end + end + + if mod_tr then + itemstack = toolranks.new_afteruse(itemstack, user, under, {wear = wear}) + else + itemstack:add_wear(wear) + end + + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5}, true) + end + end + + return itemstack +end + +-- Define Hoes + +farming.register_hoe(":farming:hoe_wood", { + description = S("Wooden Hoe"), + inventory_image = "farming_tool_woodhoe.png", + max_uses = 30, + 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", + max_uses = 90, + material = "group:stone" +}) + +farming.register_hoe(":farming:hoe_steel", { + description = S("Steel Hoe"), + inventory_image = "farming_tool_steelhoe.png", + max_uses = 200, + material = "default:steel_ingot", + damage_groups = {fleshy = 2} +}) + +farming.register_hoe(":farming:hoe_bronze", { + description = S("Bronze Hoe"), + inventory_image = "farming_tool_bronzehoe.png", + max_uses = 250, + groups = {not_in_creative_inventory = 1}, + material = "default:bronze_ingot", + damage_groups = {fleshy = 2} +}) + +farming.register_hoe(":farming:hoe_mese", { + description = S("Mese Hoe"), + inventory_image = "farming_tool_mesehoe.png", + max_uses = 350, + groups = {not_in_creative_inventory = 1}, + damage_groups = {fleshy = 3} +}) + +farming.register_hoe(":farming:hoe_diamond", { + description = S("Diamond Hoe"), + inventory_image = "farming_tool_diamondhoe.png", + max_uses = 500, + groups = {not_in_creative_inventory = 1}, + damage_groups = {fleshy = 3} +}) + +-- Toolranks support + +if mod_tr then + + minetest.override_item("farming:hoe_wood", { + original_description = S("Wood Hoe"), + description = toolranks.create_description(S("Wood Hoe"))}) + + minetest.override_item("farming:hoe_stone", { + original_description = S("Stone Hoe"), + description = toolranks.create_description(S("Stone Hoe"))}) + + minetest.override_item("farming:hoe_steel", { + original_description = S("Steel Hoe"), + description = toolranks.create_description(S("Steel Hoe"))}) + + minetest.override_item("farming:hoe_bronze", { + original_description = S("Bronze Hoe"), + description = toolranks.create_description(S("Bronze Hoe"))}) + + minetest.override_item("farming:hoe_mese", { + original_description = S("Mese Hoe"), + description = toolranks.create_description(S("Mese Hoe"))}) + + minetest.override_item("farming:hoe_diamond", { + original_description = S("Diamond Hoe"), + description = toolranks.create_description(S("Diamond Hoe"))}) +end + +-- hoe bomb function + +local function hoe_area(pos, player) + + -- check for protection + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + + local r = 5 -- radius + + -- remove flora (grass, flowers etc.) + local res = minetest.find_nodes_in_area( + {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, + {x = pos.x + r, y = pos.y + 2, z = pos.z + r}, {"group:flora"}) + + for n = 1, #res do + minetest.swap_node(res[n], {name = "air"}) + end + + -- replace dirt with tilled soil + res = minetest.find_nodes_in_area_under_air( + {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, + {x = pos.x + r, y = pos.y + 2, z = pos.z + r}, + {"group:soil"}) + + for n = 1, #res do + minetest.swap_node(res[n], {name = "farming:soil"}) + end +end + +-- throwable hoe bomb entity + +minetest.register_entity("farming:hoebomb_entity", { + + initial_properties = { + physical = true, + visual = "sprite", + visual_size = {x = 1.0, y = 1.0}, + textures = {"farming_hoe_bomb.png"}, + collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1} + }, + + lastpos = {}, + player = "", + + on_step = function(self, dtime) + + if not self.player then + + self.object:remove() + + return + end + + local pos = self.object:get_pos() + + if self.lastpos.x ~= nil then + + local vel = self.object:get_velocity() + + -- only when potion hits something physical + if vel.x == 0 or vel.y == 0 or vel.z == 0 then + + if self.player ~= "" then + + -- round up coords to fix glitching through doors + self.lastpos = vector.round(self.lastpos) + + hoe_area(self.lastpos, self.player) + end + + self.object:remove() + + return + + end + end + + self.lastpos = pos + end +}) + +-- actual throwing function + +local function throw_potion(itemstack, player) + + local pos = player:get_pos() + + local obj = minetest.add_entity({ + x = pos.x, y = pos.y + 1.5, z = pos.z}, "farming:hoebomb_entity") + + if not obj then return end + + local dir = player:get_look_dir() + local velocity = 20 + + obj:set_velocity({x = dir.x * velocity, y = dir.y * velocity, z = dir.z * velocity}) + + obj:set_acceleration({x = dir.x * -3, y = -9.5, z = dir.z * -3}) + + obj:get_luaentity().player = player +end + +-- hoe bomb item + +minetest.register_craftitem("farming:hoe_bomb", { + description = S("Hoe Bomb (use or throw on grassy areas to hoe land)"), + inventory_image = "farming_hoe_bomb.png", + groups = {flammable = 2, not_in_creative_inventory = 1}, + + on_use = function(itemstack, user, pointed_thing) + + if pointed_thing.type == "node" then + hoe_area(pointed_thing.above, user) + else + throw_potion(itemstack, user) + + if not farming.is_creative(user:get_player_name()) then + + itemstack:take_item() + + return itemstack + end + end + end, +}) + +-- helper function + +local function node_not_num(nodename) + + local num = #nodename:split("_") + local str = "" + + if not num or num == 1 then return end + + for v = 1, (num - 1) do + str = str .. nodename:split("_")[v] .. "_" + end + + return str +end + +farming.scythe_not_drops = {"farming:trellis", "farming:beanpole"} + +farming.add_to_scythe_not_drops = function(item) + table.insert(farming.scythe_not_drops, item) +end + +-- Mithril Scythe (special item) + +minetest.register_tool("farming:scythe_mithril", { + description = S("Mithril Scythe (Use to harvest and replant crops)"), + inventory_image = "farming_scythe_mithril.png", + sound = {breaks = "default_tool_breaks"}, + + on_use = function(itemstack, placer, pointed_thing) + + if pointed_thing.type ~= "node" then return end + + local pos = pointed_thing.under + local name = placer:get_player_name() + + if minetest.is_protected(pos, name) then return end + + local node = minetest.get_node_or_nil(pos) + + if not node then return end + + local def = minetest.registered_nodes[node.name] + + if not def or not def.drop or not def.groups or not def.groups.plant then + return + end + + local drops = minetest.get_node_drops(node.name, "") + + if not drops or #drops == 0 or (#drops == 1 and drops[1] == "") then + return + end + + -- get crop name + local mname = node.name:split(":")[1] + local pname = node_not_num(node.name:split(":")[2]) + + if not pname then return end + + -- add dropped items + for _, dropped_item in pairs(drops) do + + -- dont drop items on this list + for _, not_item in pairs(farming.scythe_not_drops) do + + if dropped_item == not_item then + dropped_item = nil + end + end + + if dropped_item then + + local obj = minetest.add_item(pos, dropped_item) + + if obj then + + obj:set_velocity({ + x = math.random() - 0.5, y = 3, z = math.random() - 0.5}) + end + end + end + + -- Run script hook + for _, callback in pairs(core.registered_on_dignodes) do + callback(pos, node, placer) + end + + -- play sound + minetest.sound_play("default_grass_footstep", {pos = pos, gain = 1.0}, true) + + -- replace with seed or crop_1 + local replace = mname .. ":" .. pname .. "1" + + if minetest.registered_nodes[replace] then + + local p2 = minetest.registered_nodes[replace].place_param2 or 1 + + minetest.set_node(pos, {name = replace, param2 = p2}) + else + minetest.set_node(pos, {name = "air"}) + end + + if not farming.is_creative(name) then + + itemstack:add_wear(65535 / 350) -- 350 uses + + return itemstack + end + end +}) + +-- if moreores found add mithril scythe recipe + +if minetest.get_modpath("moreores") then + + minetest.register_craft({ + output = "farming:scythe_mithril", + recipe = { + {"", "moreores:mithril_ingot", "moreores:mithril_ingot"}, + {"moreores:mithril_ingot", "", "group:stick"}, + {"", "", "group:stick"} + } + }) +end diff --git a/mods/farming/init.lua b/mods/farming/init.lua new file mode 100644 index 00000000..8b658eb7 --- /dev/null +++ b/mods/farming/init.lua @@ -0,0 +1,862 @@ +--[[ + Farming Redo Mod by TenPlus1 + NEW growing routine by prestidigitator + auto-refill by crabman77 +]] + +-- Translation support + +local S = minetest.get_translator("farming") + +-- global + +farming = { + mod = "redo", + version = "20240924", + path = minetest.get_modpath("farming"), + select = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}}, + select_final = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -2.5/16, 0.5}}, + registered_plants = {}, + min_light = 12, max_light = 15, + mapgen = minetest.get_mapgen_setting("mg_name"), + use_utensils = minetest.settings:get_bool("farming_use_utensils") ~= false, + mtg = minetest.get_modpath("default"), + eth = minetest.get_modpath("ethereal"), + mcl = minetest.get_modpath("mcl_core"), + sounds = {}, + register_decoration = function(crop,steps,alt_source) + biomes = asuna.features.crops[crop] + if not biomes then + return + end + + local decor + if alt_source then + decor = alt_source + else + decor = {} + for i = 0, (steps > 4 and 2 or 0) do + decor[i + 1] = "farming:" .. crop .. "_" .. (steps - i) + end + end + + local chars = {crop:byte()} + local seed = 11111 + for _,c in ipairs(chars) do + seed = seed + c + end + seed = seed + #crop + + minetest.register_decoration(biomes.inject_decoration({ + name = "farming:" .. crop, + deco_type = "simple", + place_on = "group:soil", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = seed, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 1, + decoration = decor, + })) + end, + mcl_hardness = 0.01, + translate = S +} + +-- determine which sounds to use, default or mcl_sounds + +local function sound_helper(snd) + + farming[snd] = (farming.mtg and default[snd]) or (farming.mcl and mcl_sounds[snd]) + or function() return {} end +end + +sound_helper("node_sound_defaults") +sound_helper("node_sound_stone_defaults") +sound_helper("node_sound_dirt_defaults") +sound_helper("node_sound_sand_defaults") +sound_helper("node_sound_gravel_defaults") +sound_helper("node_sound_wood_defaults") +sound_helper("node_sound_leaves_defaults") +sound_helper("node_sound_ice_defaults") +sound_helper("node_sound_metal_defaults") +sound_helper("node_sound_water_defaults") +sound_helper("node_sound_snow_defaults") +sound_helper("node_sound_glass_defaults") + +-- check for creative mode or priv + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + +function farming.is_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + +-- stats, locals, settings, function helper + +local statistics = dofile(farming.path .. "/statistics.lua") +local random, floor = math.random, math.floor +local time_speed = tonumber(minetest.settings: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 + +-- 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) + + if count_day then + + if t_day < 0.25 then + t1_c = t1_day + 0.75 -- Relative to sunup, yesterday + t2_c = t_day + 0.75 + else + t1_c = t1_day - 0.25 -- Relative to sunup, today + t2_c = t_day - 0.25 + end + else + if t_day < 0.75 then + t1_c = t1_day + 0.25 -- Relative to sundown, yesterday + t2_c = t_day + 0.25 + else + t1_c = t1_day - 0.75 -- Relative to sundown, today + t2_c = t_day - 0.75 + end + end + + local dt_c = clamp(t2_c, 0, 0.5) - clamp(t1_c, 0, 0.5) -- this cycle + + if t1_c < -0.5 then + + local nc = floor(-t1_c) + + t1_c = t1_c + nc + dt_c = dt_c + 0.5 * nc + clamp(-t1_c - 0.5, 0, 0.5) + end + + return dt_c * SECS_PER_CYCLE +end + +-- Growth Logic + +local STAGE_LENGTH_AVG = tonumber(minetest.settings:get("farming_stage_length")) or 200 +local STAGE_LENGTH_DEV = STAGE_LENGTH_AVG / 6 + +-- quick start seed timer + +farming.start_seed_timer = function(pos) + + local timer = minetest.get_node_timer(pos) + local grow_time = floor(random(STAGE_LENGTH_DEV, STAGE_LENGTH_AVG)) + + timer:start(grow_time) +end + +-- return plant name and stage from node provided + +local function plant_name_stage(node) + + local name + + if type(node) == "table" then + + if node.name then name = node.name + elseif node.x and node.y and node.z then + node = minetest.get_node_or_nil(node) + name = node and node.name + end + else + name = tostring(node) + end + + if not name or name == "ignore" then return nil end + + local sep_pos = name:find("_[^_]+$") + + if sep_pos and sep_pos > 1 then + + local stage = tonumber(name:sub(sep_pos + 1)) + + if stage and stage >= 0 then + return name:sub(1, sep_pos - 1), stage + end + end + + return name, 0 +end + +-- Map from node name to +-- { plant_name = ..., name = ..., stage = n, stages_left = { node_name, ... } } + +local plant_stages = {} + +farming.plant_stages = plant_stages + +--- Registers the stages of growth of a (possible plant) node. + -- @param node - Node or position table, or node name. + -- @return - The (possibly zero) number of stages of growth the plant will go through + -- before being fully grown, or nil if not a plant. + +-- Recursive helper + +local function reg_plant_stages(plant_name, stage, force_last) + + local node_name = plant_name and plant_name .. "_" .. stage + local node_def = node_name and minetest.registered_nodes[node_name] + + if not node_def then return nil end + + local stages = plant_stages[node_name] + + if stages then return stages end + + if minetest.get_item_group(node_name, "growing") > 0 then + + local ns = reg_plant_stages(plant_name, stage + 1, true) + local stages_left = (ns and { ns.name, unpack(ns.stages_left) }) or {} + + stages = { + plant_name = plant_name, + name = node_name, + stage = stage, + stages_left = stages_left + } + + if #stages_left > 0 then + + local old_constr = node_def.on_construct + local old_destr = node_def.on_destruct + + minetest.override_item(node_name, { + + on_construct = function(pos) + + if old_constr then old_constr(pos) end + + farming.handle_growth(pos) + end, + + on_destruct = function(pos) + + minetest.get_node_timer(pos):stop() + + if old_destr then old_destr(pos) end + end, + + on_timer = function(pos, elapsed) + return farming.plant_growth_timer(pos, elapsed, node_name) + end, + }) + end + + elseif force_last then + + stages = { + plant_name = plant_name, + name = node_name, + stage = stage, + stages_left = {} + } + else + return nil + end + + plant_stages[node_name] = stages + + return stages +end + +-- split name and stage and register crop + +local function register_plant_node(node) + + local plant_name, stage = plant_name_stage(node) + + if plant_name then + + local stages = reg_plant_stages(plant_name, stage, false) + + return stages and #stages.stages_left + end +end + +-- check for further growth and set or stop timer + +local function set_growing(pos, stages_left) + + if not stages_left then return end + + local timer = minetest.get_node_timer(pos) + + if stages_left > 0 then + + if not timer:is_started() then + + local stage_length = statistics.normal(STAGE_LENGTH_AVG, STAGE_LENGTH_DEV) + + stage_length = clamp(stage_length, 0.5 * STAGE_LENGTH_AVG, 3.0 * STAGE_LENGTH_AVG) + + timer:set(stage_length, -0.5 * random() * STAGE_LENGTH_AVG) + end + + elseif timer:is_started() then + timer:stop() + end +end + +-- detects a crop at given position, starting or stopping growth timer when needed + +function farming.handle_growth(pos, node) + + if not pos then return end + + local stages_left = register_plant_node(node or pos) + + if stages_left then set_growing(pos, stages_left) end +end + +-- register crops nodes and add timer functions + +minetest.after(0, function() + + for _, node_def in pairs(minetest.registered_nodes) do + register_plant_node(node_def) + end +end) + +-- 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({ + label = "Start crop timer", + nodenames = {"group:growing"}, + interval = 300, + chance = 1, + catch_up = false, + + action = function(pos, node) + + -- skip if node timer already active + if minetest.get_node_timer(pos):is_started() then return end + + -- check if group:growing node is a seed + local def = minetest.registered_nodes[node.name] + + if def and def.groups and def.groups.seed then + + if def.on_timer then -- start node timer if found + + farming.start_seed_timer(pos) + + return + end + + local next_stage = def.next_plant + + def = minetest.registered_nodes[next_stage] + + if def then -- switch seed without timer to stage_1 of crop + + local p2 = def.place_param2 or 1 + + minetest.set_node(pos, {name = next_stage, param2 = p2}) + end + else + farming.handle_growth(pos, node) -- start normal crop timer + end + end +}) + +-- default check crop is on wet soil + +farming.can_grow = function(pos) + + local below = minetest.get_node({x = pos.x, y = pos.y -1, z = pos.z}) + + return minetest.get_item_group(below.name, "soil") >= 3 +end + +-- 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] + + if not stages then return false end + + local max_growth = #stages.stages_left + + if max_growth <= 0 then return false end + + local chk1 = minetest.registered_nodes[node_name].growth_check -- old + local chk2 = minetest.registered_nodes[node_name].can_grow -- new + + if chk1 then -- custom farming redo growth_check function + + if not chk1(pos, node_name) then return true end + + elseif chk2 then -- custom mt 5.9x farming can_grow function + + if not chk2(pos) then return true end + + -- default mt 5.9x farming.can_grow function + elseif not farming.can_grow(pos) then return true end + + local growth + local light_pos = {x = pos.x, y = pos.y, z = pos.z} + local lambda = elapsed / STAGE_LENGTH_AVG + + if lambda < 0.1 then return true end + + local MIN_LIGHT = minetest.registered_nodes[node_name].minlight or farming.min_light + local MAX_LIGHT = minetest.registered_nodes[node_name].maxlight or farming.max_light + + if max_growth == 1 or lambda < 2.0 then + + local light = (minetest.get_node_light(light_pos) or 0) + + if light < MIN_LIGHT or light > MAX_LIGHT then return true end + + growth = 1 + 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 = 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 + + if not day_growth then return true end + + lambda = day_or_night_time(elapsed, true) / STAGE_LENGTH_AVG + + elseif not day_growth then + + lambda = day_or_night_time(elapsed, false) / STAGE_LENGTH_AVG + end + + growth = statistics.poisson(lambda, max_growth) + + if growth < 1 then return true end + end + + if minetest.registered_nodes[stages.stages_left[growth]] then + + local p2 = minetest.registered_nodes[stages.stages_left[growth] ].place_param2 or 1 + + minetest.set_node(pos, {name = stages.stages_left[growth], param2 = p2}) + else + return true + end + + return growth ~= max_growth +end + +-- refill placed plant by crabman (26/08/2015) updated by TenPlus1 + +function farming.refill_plant(player, plantname, index) + + local inv = player and player:get_inventory() ; if not inv then return end + + local old_stack = inv:get_stack("main", index) + + if old_stack:get_name() ~= "" then return end + + for i, stack in ipairs(inv:get_list("main")) do + + if stack:get_name() == plantname and i ~= index then + + inv:set_stack("main", index, stack) + stack:clear() + inv:set_stack("main", i, stack) + + return + end + end +end + +-- Place Seeds on Soil + +function farming.place_seed(itemstack, placer, pointed_thing, plantname) + + local pt = pointed_thing + + -- check if pointing at a node + if not itemstack or not pt or pt.type ~= "node" then return end + + local under = minetest.get_node(pt.under) + + -- am I right-clicking on something that has a custom on_place set? + -- thanks to Krock for helping with this issue :) + local def = minetest.registered_nodes[under.name] + + if placer and itemstack and def and def.on_rightclick then + return def.on_rightclick(pt.under, under, placer, itemstack, pt) + end + + local above = minetest.get_node(pt.above) + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y + 1 then return end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] + or not minetest.registered_nodes[above.name] then return end + + -- can I replace above node, and am I pointing directly at soil + if not minetest.registered_nodes[above.name].buildable_to + or minetest.get_item_group(under.name, "soil") < 2 + or minetest.get_item_group(above.name, "plant") ~= 0 then return end + + -- is player planting seed? + local name = placer and placer:get_player_name() or "" + + -- if not protected then add node and remove 1 item from the itemstack + if not minetest.is_protected(pt.above, name) then + + local p2 = minetest.registered_nodes[plantname].place_param2 or 1 + + minetest.set_node(pt.above, {name = plantname, param2 = p2}) + + farming.start_seed_timer(pt.above) + + minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0}) + + minetest.log("action", string.format("%s planted %s at %s", + (placer and placer:is_player() and placer:get_player_name() or "A mod"), + itemstack:get_name(), minetest.pos_to_string(pt.above) + )) + + if placer and itemstack + and 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 then + + minetest.after(0.2, farming.refill_plant, + placer, name, placer:get_wield_index()) + end + end + + return itemstack + end +end + +-- Function to register plants (default farming compatibility) + +farming.register_plant = function(name, def) + + 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 12 + def.maxlight = def.maxlight or 15 + + -- Register seed + minetest.register_node(":" .. mname .. ":seed_" .. pname, { + + description = def.description, + tiles = {def.inventory_image}, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = "signlike", + groups = { + seed = 1, snappy = 3, attached_node = 1, flammable = 2, growing = 1, + compostability = 65, handy = 1 + }, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + place_param2 = 1, -- place seed flat + next_plant = mname .. ":" .. pname .. "_1", + + on_timer = function(pos, elapsed) + + local def = minetest.registered_nodes[mname .. ":" .. pname .. "_1"] + + if def then + minetest.swap_node(pos, {name = def.next_plant, param2 = def.place_param2}) + end + end, + + on_place = function(itemstack, placer, pointed_thing) + + return farming.place_seed(itemstack, placer, pointed_thing, + mname .. ":seed_" .. pname) + end + }) + + -- Register harvest + minetest.register_craftitem(":" .. mname .. ":" .. pname, { + description = pname:gsub("^%l", string.upper), + inventory_image = mname .. "_" .. pname .. ".png", + groups = def.groups or {flammable = 2}, + }) + + -- Register growing steps + for i = 1, def.steps do + + local base_rarity = 1 + + if def.steps ~= 1 then + base_rarity = 8 - (i - 1) * 7 / (def.steps - 1) + end + + local drop = { + items = { + {items = {mname .. ":" .. pname}, rarity = base_rarity}, + {items = {mname .. ":" .. pname}, rarity = base_rarity * 2}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity * 2}, + } + } + + local sel = farming.select + local g = { + handy = 1, 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 + -- also increase selection box for visual indication plant has matured + if i == def.steps then + sel = farming.select_final + g.growing = 0 + end + + local node_name = mname .. ":" .. pname .. "_" .. i + + local next_plant = nil + + if i < def.steps then + next_plant = mname .. ":" .. pname .. "_" .. (i + 1) + end + + local desc = pname:gsub("^%l", string.upper) + + minetest.register_node(node_name, { + description = S(desc) .. S(" Crop"), + drawtype = "plantlike", + waving = 1, + tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"}, + paramtype = "light", + paramtype2 = def.paramtype2, + place_param2 = def.place_param2, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = drop, + selection_box = sel, + groups = g, + _mcl_hardness = farming.mcl_hardness, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + minlight = def.minlight, + maxlight = def.maxlight, + next_plant = next_plant + }) + end + + -- add to farming.registered_plants + farming.registered_plants[mname .. ":" .. pname] = { + crop = mname .. ":" .. pname, + seed = mname .. ":seed_" .. pname, + steps = def.steps, + minlight = def.minlight, + maxlight = def.maxlight + } +-- print(dump(farming.registered_plants[mname .. ":" .. pname])) + + return {seed = mname .. ":seed_" .. pname, harvest = mname .. ":" .. pname} +end + +-- default settings + +farming.asparagus = 0.002 +farming.eggplant = 0.002 +farming.spinach = 0.002 +farming.carrot = 0.002 +farming.potato = 0.002 +farming.tomato = 0.002 +farming.cucumber = 0.002 +farming.corn = 0.002 +farming.coffee = 0.002 +farming.melon = 0.009 +farming.pumpkin = 0.009 +farming.cocoa = true +farming.raspberry = 0.002 +farming.blueberry = 0.002 +farming.rhubarb = 0.002 +farming.beans = 0.002 +farming.grapes = 0.002 +farming.barley = true +farming.chili = 0.003 +farming.hemp = 0.003 +farming.garlic = 0.002 +farming.onion = 0.002 +farming.pepper = 0.002 +farming.pineapple = 0.003 +farming.peas = 0.002 +farming.beetroot = 0.002 +farming.mint = 0.005 +farming.cabbage = 0.002 +farming.blackberry = 0.002 +farming.soy = 0.002 +farming.vanilla = 0.002 +farming.lettuce = 0.002 +farming.artichoke = 0.002 +farming.parsley = 0.002 +farming.sunflower = 0.002 +farming.ginger = 0.002 +farming.strawberry = 0.002 +farming.cotton = 0.003 +farming.grains = true +farming.rice = true + +-- Load new global settings if found inside mod folder + +local input = io.open(farming.path .. "/farming.conf", "r") + +if input then dofile(farming.path .. "/farming.conf") ; input:close() end + +-- load new world-specific settings if found inside world folder + +local worldpath = minetest.get_worldpath() + +input = io.open(worldpath .. "/farming.conf", "r") + +if input then dofile(worldpath .. "/farming.conf") ; input:close() end + +-- helper function to add {eatable} group to food items, also {flammable} + +function farming.add_eatable(item, hp) + + local def = minetest.registered_items[item] + + if def then + + local groups = table.copy(def.groups) or {} + + groups.eatable = hp ; groups.flammable = 2 + + minetest.override_item(item, {groups = groups}) + end +end + +-- recipe item list and alternatives + +dofile(farming.path .. "/item_list.lua") + +-- setup soil, register hoes, override grass + +if minetest.get_modpath("default") then + dofile(farming.path .. "/soil.lua") + dofile(farming.path .. "/hoes.lua") +end + +dofile(farming.path.."/grass.lua") + +-- disable crops Mineclone already has + +if farming.mcl then + farming.carrot = nil + farming.potato = nil + farming.melon = nil + farming.cocoa = nil + farming.beetroot = nil + farming.sunflower = nil + farming.pumpkin = nil +else + dofile(farming.path.."/crops/wheat.lua") -- default crop outwith mineclone +end + +dofile(farming.path.."/crops/cotton.lua") -- default crop + +-- helper function + +local function ddoo(file, check) + + if check then dofile(farming.path .. "/crops/" .. file) end +end + +-- add additional crops and food (if enabled) +ddoo("carrot.lua", farming.carrot) +ddoo("potato.lua", farming.potato) +ddoo("tomato.lua", farming.tomato) +ddoo("cucumber.lua", farming.cucumber) +ddoo("corn.lua", farming.corn) +ddoo("coffee.lua", farming.coffee) +ddoo("melon.lua", farming.melon) +ddoo("pumpkin.lua", farming.pumpkin) +ddoo("cocoa.lua", farming.cocoa) +ddoo("raspberry.lua", farming.raspberry) +ddoo("blueberry.lua", farming.blueberry) +ddoo("rhubarb.lua", farming.rhubarb) +ddoo("beans.lua", farming.beans) +ddoo("grapes.lua", farming.grapes) +ddoo("barley.lua", farming.barley) +ddoo("hemp.lua", farming.hemp) +ddoo("garlic.lua", farming.garlic) +ddoo("onion.lua", farming.onion) +ddoo("pepper.lua", farming.pepper) +ddoo("pineapple.lua", farming.pineapple) +ddoo("peas.lua", farming.peas) +ddoo("beetroot.lua", farming.beetroot) +ddoo("chili.lua", farming.chili) +ddoo("rye_oat.lua", farming.grains) +ddoo("rice.lua", farming.rice) +ddoo("mint.lua", farming.mint) +ddoo("cabbage.lua", farming.cabbage) +ddoo("blackberry.lua", farming.blackberry) +ddoo("soy.lua", farming.soy) +ddoo("vanilla.lua", farming.vanilla) +ddoo("lettuce.lua", farming.lettuce) +ddoo("artichoke.lua", farming.artichoke) +ddoo("parsley.lua", farming.parsley) +ddoo("sunflower.lua", farming.sunflower) +ddoo("strawberry.lua", farming.strawberry) +ddoo("asparagus.lua", farming.asparagus) +ddoo("eggplant.lua", farming.eggplant) +ddoo("spinach.lua", farming.eggplant) +ddoo("ginger.lua", farming.ginger) + +-- register food items, non-food items, recipes and stairs + +dofile(farming.path .. "/item_non_food.lua") +dofile(farming.path .. "/item_food.lua") +dofile(farming.path .. "/item_recipes.lua") +dofile(farming.path .. "/item_stairs.lua") + +if not farming.mcl then + dofile(farming.path .. "/compatibility.lua") -- Farming Plus compatibility +end + +if minetest.get_modpath("lucky_block") then + dofile(farming.path .. "/lucky_block.lua") +end + +print("[MOD] Farming Redo loaded") diff --git a/mods/farming/item_food.lua b/mods/farming/item_food.lua new file mode 100644 index 00000000..3842e5ab --- /dev/null +++ b/mods/farming/item_food.lua @@ -0,0 +1,933 @@ + +local S = minetest.get_translator("farming") +local a = farming.recipe_items + +local function register_craftitem(condition,eatable,name,def) + if condition then + core.register_craftitem(name,def) + if eatable then + farming.add_eatable(eatable) + end + end +end + +local function register_node(condition,eatable,name,def) + if condition then + core.register_node(name,def) + if eatable then + farming.add_eatable(eatable) + end + end +end + +-- Flour + +register_craftitem(true,nil,"farming:flour", { + description = S("Flour"), + inventory_image = "farming_flour.png", + groups = {food_flour = 1, flammable = 1} +}) + +-- Garlic bulb + +register_craftitem(farming.garlic,1,"farming:garlic", { + description = S("Garlic"), + inventory_image = "crops_garlic.png", + on_use = minetest.item_eat(1), + groups = {food_garlic = 1, compostability = 55} +}) + +-- Garlic braid + +register_node(farming.garlic,nil,"farming:garlic_braid", { + description = S("Garlic Braid"), + inventory_image = "crops_garlic_braid.png", + wield_image = "crops_garlic_braid.png", + drawtype = "nodebox", + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + tiles = { + "crops_garlic_braid_top.png", + "crops_garlic_braid.png", + "crops_garlic_braid_side.png^[transformFx", + "crops_garlic_braid_side.png", + "crops_garlic_braid.png", + "crops_garlic_braid.png" + }, + groups = {vessel = 1, dig_immediate = 3, flammable = 3, compostability = 65, handy = 1}, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + node_box = { + type = "fixed", fixed = {{-0.1875, -0.5, 0.5, 0.1875, 0.5, 0.125}} + } +}) + +-- Corn on the cob (texture by TenPlus1) + +register_craftitem(farming.corn,5,"farming:corn_cob", { + description = S("Corn on the Cob"), + inventory_image = "farming_corn_cob.png", + groups = {compostability = 65, food_corn_cooked = 1}, + on_use = minetest.item_eat(5) +}) + +-- Popcorn + +register_craftitem(farming.corn,4,"farming:popcorn", { + description = S("Popcorn"), + inventory_image = "farming_popcorn.png", + groups = {compostability = 55, food_popcorn = 1}, + on_use = minetest.item_eat(4) +}) + +-- Cornstarch + +register_craftitem(farming.corn,nil,"farming:cornstarch", { + description = S("Cornstarch"), + inventory_image = "farming_cornstarch.png", + groups = {food_cornstarch = 1, food_gelatin = 1, flammable = 2, compostability = 65} +}) + +-- Cup of coffee + +register_node(farming.coffee,2,"farming:coffee_cup", { + description = S("Cup of Coffee"), + drawtype = "torchlike", + tiles = {"farming_coffee_cup.png"}, + inventory_image = "farming_coffee_cup.png", + wield_image = "farming_coffee_cup.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, drink = 1, handy = 1}, + is_ground_content = false, + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + sounds = farming.node_sound_glass_defaults() +}) + +minetest.register_alias("farming:coffee_cup_hot", "farming:coffee_cup") +minetest.register_alias("farming:drinking_cup", "vessels:drinking_glass") + +-- Bar of of dark chocolate (thx to Ice Pandora for her deviantart.com chocolate tutorial) + +register_craftitem(farming.cocoa,3,"farming:chocolate_dark", { + description = S("Bar of Dark Chocolate"), + inventory_image = "farming_chocolate_dark.png", + on_use = minetest.item_eat(3) +}) + +-- Chocolate block (not edible) + +register_node(farming.cocoa,nil,"farming:chocolate_block", { + description = S("Chocolate Block"), + tiles = {"farming_chocolate_block.png"}, + is_ground_content = false, + groups = {cracky = 2, oddly_breakable_by_hand = 2, handy = 1}, + sounds = farming.node_sound_stone_defaults() +}) + +-- Bowl of chili + +register_craftitem(farming.chili,8,"farming:chili_bowl", { + description = S("Bowl of Chili"), + inventory_image = "farming_chili_bowl.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +-- Chili powder + +register_craftitem(farming.chili,nil,"farming:chili_powder", { + description = S("Chili Powder"), + on_use = minetest.item_eat(-1), + inventory_image = "farming_chili_powder.png", + groups = {compostability = 45} +}) + +-- Carrot juice + +register_craftitem(farming.carrot,4,"farming:carrot_juice", { + description = S("Carrot Juice"), + inventory_image = "farming_carrot_juice.png", + on_use = minetest.item_eat(4, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1} +}) + +-- Blueberry Pie + +register_craftitem(farming.blueberry or core.registered_items["default:blueberries"],6,"farming:blueberry_pie", { + description = S("Blueberry Pie"), + inventory_image = "farming_blueberry_pie.png", + on_use = minetest.item_eat(6), + groups = {compostability = 75} +}) + +-- Blueberry muffin (thanks to sosogirl123 @ deviantart.com for muffin image) + +register_craftitem(farming.blueberry or core.registered_items["default:blueberries"],2,"farming:muffin_blueberry", { + description = S("Blueberry Muffin"), + inventory_image = "farming_blueberry_muffin.png", + on_use = minetest.item_eat(2), + groups = {compostability = 65} +}) + +-- Tomato soup + +register_craftitem(farming.tomato,8,"farming:tomato_soup", { + description = S("Tomato Soup"), + inventory_image = "farming_tomato_soup.png", + groups = {compostability = 65, drink = 1}, + on_use = minetest.item_eat(8, "farming:bowl") +}) + +-- sliced bread + +register_craftitem(true,1,"farming:bread_slice", { + description = S("Sliced Bread"), + inventory_image = "farming_bread_slice.png", + on_use = minetest.item_eat(1), + groups = {food_bread_slice = 1, compostability = 65} +}) + +-- toast + +register_craftitem(true,1,"farming:toast", { + description = S("Toast"), + inventory_image = "farming_toast.png", + on_use = minetest.item_eat(1), + groups = {food_toast = 1, compostability = 65} +}) + +-- toast sandwich + +register_craftitem(true,4,"farming:toast_sandwich", { + description = S("Toast Sandwich"), + inventory_image = "farming_toast_sandwich.png", + on_use = minetest.item_eat(4), + groups = {compostability = 85} +}) + +-- glass of water + +register_craftitem(true,nil,"farming:glass_water", { + description = S("Glass of Water"), + inventory_image = "farming_water_glass.png", + groups = {food_glass_water = 1, flammable = 3, vessel = 1} +}) + +-- Sugar cube + +register_node(true,nil,"farming:sugar_cube", { + description = S("Sugar Cube"), + tiles = {"farming_sugar_cube.png"}, + groups = {shovely = 1, handy = 1, crumbly = 2}, + is_ground_content = false, + floodable = true, + sounds = farming.node_sound_gravel_defaults(), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- Sugar caramel + +register_craftitem(true,nil,"farming:caramel", { + description = S("Caramel"), + inventory_image = "farming_caramel.png", + groups = {compostability = 40} +}) + +-- Salt + +register_node(true,nil,"farming:salt", { + description = S("Salt"), + inventory_image = "farming_salt.png", + wield_image = "farming_salt.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + tiles = {"farming_salt.png"}, + groups = {food_salt = 1, vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1}, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + -- special function to make salt crystals form inside water + dropped_step = function(self, pos, dtime) + + self.ctimer = (self.ctimer or 0) + dtime + if self.ctimer < 15.0 then return end + self.ctimer = 0 + + local needed + + if self.node_inside and self.node_inside.name == a.water_source then + needed = 8 + + elseif self.node_inside and self.node_inside.name == a.river_water_source then + needed = 9 + end + + if not needed then return end + + local objs = core.get_objects_inside_radius(pos, 0.5) + + if not objs or #objs ~= 1 then return end + + local salt, ent = nil, nil + + for k, obj in pairs(objs) do + + ent = obj:get_luaentity() + + if ent and ent.name == "__builtin:item" + and ent.itemstring == "farming:salt " .. needed then + + obj:remove() + + core.add_item(pos, "farming:salt_crystal") + + return false -- return with no further action + end + end + end +}) + +-- Salt Crystal + +register_node(true,nil,"farming:salt_crystal", { + description = S("Salt crystal"), + inventory_image = "farming_salt_crystal.png", + wield_image = "farming_salt_crystal.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + light_source = 1, + tiles = {"farming_salt_crystal.png"}, + groups = {dig_immediate = 3, attached_node = 1, handy = 1}, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- Mayonnaise + +register_node(true,3,"farming:mayonnaise", { + description = S("Mayonnaise"), + drawtype = "plantlike", + tiles = {"farming_mayo.png"}, + inventory_image = "farming_mayo.png", + wield_image = "farming_mayo.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + on_use = minetest.item_eat(3), + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.45, 0.25} + }, + groups = { + compostability = 65, food_mayonnaise = 1, vessel = 1, dig_immediate = 3, + attached_node = 1, handy = 1 + }, + sounds = farming.node_sound_glass_defaults() +}) + +-- Rose Water + +register_node(true,nil,"farming:rose_water", { + description = S("Rose Water"), + inventory_image = "farming_rose_water.png", + wield_image = "farming_rose_water.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + tiles = {"farming_rose_water.png"}, + groups = { + food_rose_water = 1, vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + } +}) + +-- Turkish Delight + +register_craftitem(true,2,"farming:turkish_delight", { + description = S("Turkish Delight"), + inventory_image = "farming_turkish_delight.png", + groups = {compostability = 85}, + on_use = minetest.item_eat(2) +}) + +-- Garlic Bread + +register_craftitem(farming.garlic,2,"farming:garlic_bread", { + description = S("Garlic Bread"), + inventory_image = "farming_garlic_bread.png", + groups = {compostability = 65}, + on_use = minetest.item_eat(2) +}) + +-- Donuts (thanks to Bockwurst for making the donut images) + +register_craftitem(true,4,"farming:donut", { + description = S("Donut"), + inventory_image = "farming_donut.png", + on_use = minetest.item_eat(4), + groups = {compostability = 65} +}) + +register_craftitem(farming.cocoa,6,"farming:donut_chocolate", { + description = S("Chocolate Donut"), + inventory_image = "farming_donut_chocolate.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +register_craftitem(true,6,"farming:donut_apple", { + description = S("Apple Donut"), + inventory_image = "farming_donut_apple.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +-- Porridge Oats + +register_craftitem(farming.grains and farming.soy,6,"farming:porridge", { + description = S("Porridge"), + inventory_image = "farming_porridge.png", + on_use = minetest.item_eat(6, a.bowl), + groups = {compostability = 65} +}) + +-- Jaffa Cake + +register_craftitem(farming.soy,6,"farming:jaffa_cake", { + description = S("Jaffa Cake"), + inventory_image = "farming_jaffa_cake.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +-- Apple Pie + +register_craftitem(true,6,"farming:apple_pie", { + description = S("Apple Pie"), + inventory_image = "farming_apple_pie.png", + on_use = minetest.item_eat(6), + groups = {compostability = 75} +}) + +-- Cactus Juice + +register_craftitem(true,1,"farming:cactus_juice", { + description = S("Cactus Juice"), + inventory_image = "farming_cactus_juice.png", + groups = {vessel = 1, drink = 1, compostability = 55}, + + on_use = function(itemstack, user, pointed_thing) + + if user then + + local num = math.random(5) == 1 and -1 or 2 + + return minetest.do_item_eat(num, "vessels:drinking_glass", + itemstack, user, pointed_thing) + end + end +}) + +-- Pasta + +register_craftitem(true,nil,"farming:pasta", { + description = S("Pasta"), + inventory_image = "farming_pasta.png", + groups = {compostability = 65, food_pasta = 1} +}) + +-- Mac & Cheese + +register_craftitem(true,6,"farming:mac_and_cheese", { + description = S("Mac & Cheese"), + inventory_image = "farming_mac_and_cheese.png", + on_use = minetest.item_eat(6, a.bowl), + groups = {compostability = 65} +}) + +-- Spaghetti + +register_craftitem(farming.garlic and farming.tomato,8,"farming:spaghetti", { + description = S("Spaghetti"), + inventory_image = "farming_spaghetti.png", + on_use = minetest.item_eat(8), + groups = {compostability = 65} +}) + +-- Korean Bibimbap + +register_craftitem(farming.chili and farming.rice and farming.chili and farming.cabbage,8,"farming:bibimbap", { + description = S("Bibimbap"), + inventory_image = "farming_bibimbap.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +-- Burger + +register_craftitem(farming.lettuce and farming.tomato,16,"farming:burger", { + description = S("Burger"), + inventory_image = "farming_burger.png", + on_use = minetest.item_eat(16), + groups = {compostability = 95} +}) + +-- Salad + +register_craftitem(farming.lettuce and farming.tomato,8,"farming:salad", { + description = S("Salad"), + inventory_image = "farming_salad.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 45} +}) + +-- Triple Berry Smoothie + +register_craftitem(farming.raspberry and farming.blackberry and farming.strawberry,6,"farming:smoothie_berry", { + description = S("Triple Berry Smoothie"), + inventory_image = "farming_berry_smoothie.png", + on_use = minetest.item_eat(6, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1, compostability = 65} +}) + +-- Patatas a la importancia + +register_craftitem(farming.garlic and farming.parsley and farming.potato and farming.onion,8,"farming:spanish_potatoes", { + description = S("Spanish Potatoes"), + inventory_image = "farming_spanish_potatoes.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +-- Potato omelette + +register_craftitem(farming.onion and farming.potato,6,"farming:potato_omelet", { + description = S("Potato omelette"), + inventory_image = "farming_potato_omelet.png", + on_use = minetest.item_eat(6, a.bowl), + groups = {compostability = 65} +}) + +-- Paella + +register_craftitem(farming.peas and farming.pepper and farming.rice,8,"farming:paella", { + description = S("Paella"), + inventory_image = "farming_paella.png", + on_use = minetest.item_eat(8, a.bowl), + groups = {compostability = 65} +}) + +-- Vanilla Flan + +register_craftitem(farming.vanilla and farming.soy,6,"farming:flan", { + description = S("Vanilla Flan"), + inventory_image = "farming_vanilla_flan.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +-- Vegan Cheese + +register_craftitem(farming.corn and farming.pepper and farming.soy,2,"farming:cheese_vegan", { + description = S("Vegan Cheese"), + inventory_image = "farming_cheese_vegan.png", + on_use = minetest.item_eat(2), + groups = {compostability = 65, food_cheese = 1} +}) + +-- Vegan Butter + +register_craftitem(farming.soy and farming.sunflower,nil,"farming:butter_vegan", { + description = S("Vegan Butter"), + inventory_image = "farming_vegan_butter.png", + groups = {food_butter = 1} +}) + +-- Onigiri + +register_craftitem(farming.rice,2,"farming:onigiri", { + description = S("Onigiri"), + inventory_image = "farming_onigiri.png", + on_use = minetest.item_eat(2), + groups = {compostability = 65} +}) + +-- Gyoza + +register_craftitem(farming.cabbage and farming.garlic and farming.onion,4,"farming:gyoza", { + description = S("Gyoza"), + inventory_image = "farming_gyoza.png", + on_use = minetest.item_eat(4), + groups = {compostability = 65} +}) + +-- Mochi + +register_craftitem(farming.rice,3,"farming:mochi", { + description = S("Mochi"), + inventory_image = "farming_mochi.png", + on_use = minetest.item_eat(3), + groups = {compostability = 65} +}) + +-- Gingerbread Man + +register_craftitem(farming.ginger,2,"farming:gingerbread_man", { + description = S("Gingerbread Man"), + inventory_image = "farming_gingerbread_man.png", + on_use = minetest.item_eat(2), + groups = {compostability = 85} +}) + +-- Mint tea +register_craftitem(farming.mint,2,"farming:mint_tea", { + description = S("Mint Tea"), + inventory_image = "farming_mint_tea.png", + on_use = minetest.item_eat(2, a.drinking_glass), + groups = {drink = 1} +}) + +-- Onion soup +register_craftitem(farming.onion,6,"farming:onion_soup", { + description = S("Onion Soup"), + inventory_image = "farming_onion_soup.png", + groups = {compostability = 65, drink = 1}, + on_use = minetest.item_eat(6, a.bowl) +}) + +-- Pea soup + +register_craftitem(farming.peas,4,"farming:pea_soup", { + description = S("Pea Soup"), + inventory_image = "farming_pea_soup.png", + groups = {compostability = 65, drink = 1}, + on_use = minetest.item_eat(4, a.bowl) +}) + +-- Ground pepper + +register_node(farming.pepper,nil,"farming:pepper_ground", { + description = S("Ground Pepper"), + inventory_image = "crops_pepper_ground.png", + wield_image = "crops_pepper_ground.png", + drawtype = "plantlike", + visual_scale = 0.8, + paramtype = "light", + tiles = {"crops_pepper_ground.png"}, + groups = { + vessel = 1, food_pepper_ground = 1, handy = 1, + dig_immediate = 3, attached_node = 1, compostability = 30 + }, + is_ground_content = false, + sounds = farming.node_sound_defaults(), + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + } +}) + +-- pineapple ring + +register_craftitem(farming.pineapple,1,"farming:pineapple_ring", { + description = S("Pineapple Ring"), + inventory_image = "farming_pineapple_ring.png", + groups = {food_pineapple_ring = 1, compostability = 45}, + on_use = minetest.item_eat(1) +}) + +-- Pineapple juice + +register_craftitem(farming.pineapple,4,"farming:pineapple_juice", { + description = S("Pineapple Juice"), + inventory_image = "farming_pineapple_juice.png", + on_use = minetest.item_eat(4, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1, compostability = 35} +}) + +-- Potato & cucumber Salad + +register_craftitem(farming.potato,10,"farming:potato_salad", { + description = S("Cucumber and Potato Salad"), + inventory_image = "farming_potato_salad.png", + on_use = minetest.item_eat(10, "farming:bowl") +}) + +-- Pumpkin dough + +register_craftitem(farming.pumpkin,nil,"farming:pumpkin_dough", { + description = S("Pumpkin Dough"), + inventory_image = "farming_pumpkin_dough.png" +}) + +-- Pumpkin bread + +register_craftitem(farming.pumpkin,8,"farming:pumpkin_bread", { + description = S("Pumpkin Bread"), + inventory_image = "farming_pumpkin_bread.png", + on_use = minetest.item_eat(8), + groups = {food_bread = 1} +}) + +-- Raspberry smoothie + +register_craftitem(farming.raspberry,2,"farming:smoothie_raspberry", { + description = S("Raspberry Smoothie"), + inventory_image = "farming_raspberry_smoothie.png", + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = {vessel = 1, drink = 1, compostability = 65} +}) + +-- Rhubarb pie + +register_craftitem(farming.rhubarb,6,"farming:rhubarb_pie", { + description = S("Rhubarb Pie"), + inventory_image = "farming_rhubarb_pie.png", + on_use = minetest.item_eat(6), + groups = {compostability = 65} +}) + +-- Rice flour + +register_craftitem(farming.rice,nil,"farming:rice_flour", { + description = S("Rice Flour"), + inventory_image = "farming_rice_flour.png", + groups = {food_rice_flour = 1, flammable = 1, compostability = 65} +}) + +-- Rice bread + +register_craftitem(farming.rice,5,"farming:rice_bread", { + description = S("Rice Bread"), + inventory_image = "farming_rice_bread.png", + on_use = minetest.item_eat(5), + groups = {food_rice_bread = 1, compostability = 65} +}) + +-- Multigrain flour + +register_craftitem(farming.grains,nil,"farming:flour_multigrain", { + description = S("Multigrain Flour"), + inventory_image = "farming_flour_multigrain.png", + groups = {food_flour = 1, flammable = 1}, +}) + + +-- Multigrain bread + +register_craftitem(farming.grains,7,"farming:bread_multigrain", { + description = S("Multigrain Bread"), + inventory_image = "farming_bread_multigrain.png", + on_use = minetest.item_eat(7), + groups = {food_bread = 1, compostability = 65} +}) + +-- Soy sauce + +register_node(farming.soy,nil,"farming:soy_sauce", { + description = S("Soy Sauce"), + drawtype = "plantlike", + tiles = {"farming_soy_sauce.png"}, + inventory_image = "farming_soy_sauce.png", + wield_image = "farming_soy_sauce.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = { + vessel = 1, food_soy_sauce = 1, dig_immediate = 3, attached_node = 1, + compostability = 65, handy = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_glass_defaults() +}) + +-- Soy milk + +register_node(farming.soy,2,"farming:soy_milk", { + description = S("Soy Milk"), + drawtype = "plantlike", + tiles = {"farming_soy_milk_glass.png"}, + inventory_image = "farming_soy_milk_glass.png", + wield_image = "farming_soy_milk_glass.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = { + vessel = 1, food_milk_glass = 1, dig_immediate = 3, handy = 1, + attached_node = 1, drink = 1, compostability = 65 + }, + is_ground_content = false, + sounds = farming.node_sound_glass_defaults() +}) + +-- Tofu + +register_craftitem(farming.soy,3,"farming:tofu", { + description = S("Tofu"), + inventory_image = "farming_tofu.png", + groups = { + food_tofu = 1, food_meat_raw = 1, compostability = 65, + }, + on_use = minetest.item_eat(3) +}) + +-- Cooked tofu + +register_craftitem(farming.soy,6,"farming:tofu_cooked", { + description = S("Cooked Tofu"), + inventory_image = "farming_tofu_cooked.png", + groups = {food_meat = 1, compostability = 65}, + on_use = minetest.item_eat(6) +}) + +-- Toasted sunflower seeds + +register_craftitem(farming.sunflower,1,"farming:sunflower_seeds_toasted", { + description = S("Toasted Sunflower Seeds"), + inventory_image = "farming_sunflower_seeds_toasted.png", + groups = {food_sunflower_seeds_toasted = 1, compostability = 65}, + on_use = minetest.item_eat(1) +}) + +-- Sunflower oil + +register_node(farming.sunflower,nil,"farming:sunflower_oil", { + description = S("Bottle of Sunflower Oil"), + drawtype = "plantlike", + tiles = {"farming_sunflower_oil.png"}, + inventory_image = "farming_sunflower_oil.png", + wield_image = "farming_sunflower_oil.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = { + food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1, + flammable = 2, compostability = 65, handy = 1 + }, + sounds = farming.node_sound_glass_defaults() +}) + +-- Sunflower seed bread + +register_craftitem(farming.sunflower,8,"farming:sunflower_bread", { + description = S("Sunflower Seed Bread"), + inventory_image = "farming_sunflower_bread.png", + on_use = minetest.item_eat(8), + groups = {food_bread = 1} +}) + +-- Vanilla extract + +register_node(farming.vanilla and farming.corn,nil,"farming:vanilla_extract", { + description = S("Vanilla Extract"), + drawtype = "plantlike", + tiles = {"farming_vanilla_extract.png"}, + inventory_image = "farming_vanilla_extract.png", + wield_image = "farming_vanilla_extract.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1}, + sounds = farming.node_sound_glass_defaults(), +}) + +-- Jerusalem Artichokes with miso butter + +register_craftitem(farming.artichoke and farming.soy and farming.garlic,11,"farming:jerusalem_artichokes", { + description = S("Jerusalem Artichokes"), + inventory_image = "farming_jerusalem_artichokes.png", + on_use = minetest.item_eat(11, a.bowl) +}) + +--= Foods we shouldn't add when using Mineclonia/VoxeLibre + +if not farming.mcl then + + -- Bread + + register_craftitem(true,5,"farming:bread", { + description = S("Bread"), + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(5), + groups = {food_bread = 1} + }) + + -- Cocoa beans + + register_craftitem(farming.cocoa,nil,"farming:cocoa_beans", { + description = S("Cocoa Beans"), + inventory_image = "farming_cocoa_beans.png", + groups = {compostability = 65, food_cocoa = 1, flammable = 2} + }) + + -- Chocolate cookie + + register_craftitem(farming.cocoa,2,"farming:cookie", { + description = S("Cookie"), + inventory_image = "farming_cookie.png", + on_use = minetest.item_eat(2) + }) + + -- Golden carrot + + register_craftitem(farming.carrot,10,"farming:carrot_gold", { + description = S("Golden Carrot"), + inventory_image = "farming_carrot_gold.png", + on_use = minetest.item_eat(10) + }) + + -- Beetroot soup + + register_craftitem(farming.beetroot,6,"farming:beetroot_soup", { + description = S("Beetroot Soup"), + inventory_image = "farming_beetroot_soup.png", + on_use = minetest.item_eat(6, "farming:bowl"), + groups = {drink = 1} + }) + + -- Sugar + + register_craftitem(true,nil,"farming:sugar", { + description = S("Sugar"), + inventory_image = "farming_sugar.png", + groups = {food_sugar = 1, flammable = 3} + }) + + -- Baked potato + + register_craftitem(farming.potato,6,"farming:baked_potato", { + description = S("Baked Potato"), + inventory_image = "farming_baked_potato.png", + on_use = minetest.item_eat(6) + }) +end diff --git a/mods/farming/item_list.lua b/mods/farming/item_list.lua new file mode 100644 index 00000000..078c440f --- /dev/null +++ b/mods/farming/item_list.lua @@ -0,0 +1,126 @@ + +-- add group helper + +local function add_groups(item, groups) + + local def = minetest.registered_items[item] + + if def then + + local grps = table.copy(def.groups) or {} + + for k, v in pairs(groups) do + grps[k] = v + end + + minetest.override_item(item, {groups = grps}) + end +end + +-- default recipe items + +farming.recipe_items = { + + -- if utensils are disabled then use blank item + saucepan = farming.use_utensils and "farming:saucepan" or "", + pot = farming.use_utensils and "farming:pot" or "", + baking_tray = farming.use_utensils and "farming:baking_tray" or "", + skillet = farming.use_utensils and "farming:skillet" or "", + mortar_pestle = farming.use_utensils and "farming:mortar_pestle" or "", + cutting_board = farming.use_utensils and "farming:cutting_board" or "", + juicer = farming.use_utensils and "farming:juicer" or "", + mixing_bowl = farming.use_utensils and "farming:mixing_bowl" or "", + + water_source = "default:water_source", + river_water_source = "default:river_water_source", + bucket_empty = "bucket:bucket_empty", + bucket_water = "bucket:bucket_water", + bucket_river_water = "bucket:bucket_river_water", + drinking_glass = "vessels:drinking_glass", + glass_bottle = "vessels:glass_bottle", + sugar = "farming:sugar", + rose = "flowers:rose", + dye_red = "dye:red", + dye_pink = "dye:pink", + dye_orange = "dye:orange", + dye_green = "dye:green", + dye_brown = "dye:brown", + dye_blue = "dye:blue", + dye_violet = "dye:violet", + dye_yellow = "dye:yellow", + bowl = "farming:bowl", + flour = "group:food_flour", + bread = "farming:bread", + cactus = "default:cactus", + paper = "default:paper", + snow = "default:snow", + string = "farming:string", + wool = "wool:white", + steel_ingot = "default:steel_ingot", + clay_brick = "default:clay_brick", + stone = "default:stone", + glass = "default:glass", +} + +add_groups("default:apple", {food_apple = 1}) + + +-- if mineclone found then change recipe items + +if farming.mcl then + + local a = farming.recipe_items + + a.water_source = "mcl_core:water_source" + a.river_water_source = "mclx_core:river_water_source" + a.bucket_empty = "mcl_buckets:bucket_empty" + a.bucket_water = "mcl_buckets:bucket_water" + a.bucket_river_water = "mcl_buckets:bucket_river_water" + a.drinking_glass = "mcl_potions:glass_bottle" + a.glass_bottle = "mcl_potions:glass_bottle" + a.sugar = "mcl_core:sugar" + a.rose = "mcl_flowers:rose_bush" + a.dye_red = "mcl_dye:red" + a.dye_pink = "mcl_dye:pink" + a.dye_orange = "mcl_dye:orange" + a.dye_green = "mcl_dye:green" + a.dye_brown = "mcl_dye:brown" + a.dye_blue = "mcl_dye:blue" + a.dye_violet = "mcl_dye:violet" + a.dye_yellow = "mcl_dye:yellow" + a.bowl = "mcl_core:bowl" +-- a.flour = "mcl_farming:bread" + a.bread = "mcl_farming:bread" + a.cactus = "mcl_core:cactus" + a.paper = "mcl_core:paper" + a.snow = "mcl_throwing:snowball" + a.string = "mcl_mobitems:string" + a.wool = "mcl_wool:white" + a.steel_ingot = "mcl_core:iron_ingot" + a.clay_brick = "mcl_core:clay_lump" + a.stone = "mcl_core:stone" + a.glass = "mcl_core:glass" + + -- add missing groups for recipes to work properly + + add_groups("mcl_core:sugar", {food_sugar = 1}) + add_groups("mcl_throwing:egg", {food_egg = 1}) + add_groups("mcl_farming:wheat_item", {food_wheat = 1}) + add_groups("mcl_cocoas:cocoa_beans", {food_cocoa = 1}) + add_groups("mcl_core:apple", {food_apple = 1}) + add_groups("mcl_core:bowl", {food_bowl = 1}) + add_groups("mcl_mobitems:chicken", {food_chicken_raw = 1}) + add_groups("mcl_mobitems:cooked_chicken", {food_chicken = 1}) + add_groups("mcl_mushrooms:mushroom_brown", {food_mushroom = 1}) + add_groups("mcl_farming:carrot_item", {food_carrot = 1}) + add_groups("mcl_mobitems:cooked_beef", {food_meat = 1}) + add_groups("mcl_mobitems:beef", {food_meat_raw = 1}) + add_groups("mcl_farming:potato_item", {food_potato = 1}) + add_groups("mcl_farming:bread", {food_bread = 1}) + add_groups("mcl_mobitems:milk_bucket", {food_milk = 1}) + add_groups("mcl_ocean:dried_kelp", {food_seaweed = 1}) + add_groups("mcl_potions:river_water", {food_glass_water = 1}) + add_groups("mcl_dye:yellow", {food_lemon = 1, food_banana = 1}) + add_groups("mcl_dye:orange", {food_orange = 1}) + add_groups("mcl_flowers:sunflower", {food_olive_oil = 1, food_butter = 1}) +end diff --git a/mods/farming/item_non_food.lua b/mods/farming/item_non_food.lua new file mode 100644 index 00000000..bfe2a2cf --- /dev/null +++ b/mods/farming/item_non_food.lua @@ -0,0 +1,282 @@ + +local S = minetest.get_translator("farming") + +local function register_craftitem(condition,name,def) + if condition then + core.register_craftitem(name,def) + end +end + +local function register_node(condition,name,def) + if condition then + core.register_node(name,def) + end +end + +-- saucepan + +register_craftitem(true,"farming:saucepan", { + description = S("Saucepan"), + inventory_image = "farming_saucepan.png", + groups = {food_saucepan = 1, flammable = 2} +}) + +-- cooking pot + +register_craftitem(true,"farming:pot", { + description = S("Cooking Pot"), + inventory_image = "farming_pot.png", + groups = {food_pot = 1, flammable = 2} +}) + +-- baking tray + +register_craftitem(true,"farming:baking_tray", { + description = S("Baking Tray"), + inventory_image = "farming_baking_tray.png", + groups = {food_baking_tray = 1, flammable = 2} +}) + +-- skillet + +register_craftitem(true,"farming:skillet", { + description = S("Skillet"), + inventory_image = "farming_skillet.png", + groups = {food_skillet = 1, flammable = 2} +}) + +-- mortar & pestle + +register_craftitem(true,"farming:mortar_pestle", { + description = S("Mortar and Pestle"), + inventory_image = "farming_mortar_pestle.png", + groups = {food_mortar_pestle = 1, flammable = 2} +}) + +-- cutting board + +register_craftitem(true,"farming:cutting_board", { + description = S("Cutting Board"), + inventory_image = "farming_cutting_board.png", + groups = {food_cutting_board = 1, flammable = 2} +}) + +-- juicer + +register_craftitem(true,"farming:juicer", { + description = S("Juicer"), + inventory_image = "farming_juicer.png", + groups = {food_juicer = 1, flammable = 2} +}) + +-- glass mixing bowl + +register_craftitem(true,"farming:mixing_bowl", { + description = S("Glass Mixing Bowl"), + inventory_image = "farming_mixing_bowl.png", + groups = {food_mixing_bowl = 1, flammable = 2} +}) + +-- Ethanol (thanks to JKMurray for this idea) + +register_node(farming.corn,"farming:bottle_ethanol", { + description = S("Bottle of Ethanol"), + drawtype = "plantlike", + tiles = {"farming_bottle_ethanol.png"}, + inventory_image = "farming_bottle_ethanol.png", + wield_image = "farming_bottle_ethanol.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, handy = 1}, + sounds = farming.node_sound_glass_defaults() +}) + +-- straw + +register_node(true,"farming:straw", { + description = S("Straw"), + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {handy = 1, snappy = 3, flammable = 4, fall_damage_add_percent = -30}, + sounds = farming.node_sound_leaves_defaults(), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- hemp oil + +register_node(farming.hemp,"farming:hemp_oil", { + description = S("Bottle of Hemp Oil"), + drawtype = "plantlike", + tiles = {"farming_hemp_oil.png"}, + inventory_image = "farming_hemp_oil.png", + wield_image = "farming_hemp_oil.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = { + food_oil = 1, vessel = 1, dig_immediate = 3, attached_node = 1, + compostability = 45, handy = 1 + }, + sounds = farming.node_sound_glass_defaults() +}) + +-- hemp fibre + +register_craftitem(farming.hemp,"farming:hemp_fibre", { + description = S("Hemp Fibre"), + inventory_image = "farming_hemp_fibre.png", + groups = {compostability = 55} +}) + +-- hemp block + +register_node(farming.hemp,"farming:hemp_block", { + description = S("Hemp Block"), + tiles = {"farming_hemp_block.png"}, + paramtype = "light", + groups = { + axey = 1, handy = 1, snappy = 2, oddly_breakable_by_hand = 1, flammable = 2, + compostability = 85 + }, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +-- hemp rope + +register_node(false,"farming:hemp_rope", { + description = S("Hemp Rope"), + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + tiles = {"farming_hemp_rope.png"}, + wield_image = "farming_hemp_rope.png", + inventory_image = "farming_hemp_rope.png", + drawtype = "plantlike", + groups = { + handy = 1, axey = 1, swordy = 1, flammable = 2, choppy = 3, + oddly_breakable_by_hand = 3, compostability = 55 + }, + is_ground_content = false, + sounds = farming.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7} + }, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +--- Wooden scarecrow base + +register_node(false,"farming:scarecrow_bottom", { + description = S("Scarecrow Bottom"), + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + tiles = {"default_wood.png"}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16}, + {-12/16, 4/16, -1/16, 12/16, 2/16, 1/16}, + } + }, + groups = {axey = 1, handy = 1, snappy = 3, flammable = 2}, + is_ground_content = false, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 +}) + +--= Items we shouldn't add when using Mineclonia/VoxeLibre + +if not farming.mcl then + + -- Wooden bowl + + register_craftitem(true,"farming:bowl", { + description = S("Wooden Bowl"), + inventory_image = "farming_bowl.png", + groups = {food_bowl = 1, flammable = 2} + }) + + -- String + + register_craftitem(true,"farming:string", { + description = S("String"), + inventory_image = "farming_string.png", + groups = {flammable = 2} + }) + + -- Jack 'O Lantern + + register_node(farming.pumpkin,"farming:jackolantern", { + description = S("Jack 'O Lantern (punch to turn on and off)"), + tiles = { + "farming_pumpkin_bottom.png^farming_pumpkin_top.png", + "farming_pumpkin_bottom.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png^farming_pumpkin_face_off.png" + }, + paramtype2 = "facedir", + groups = { + handy = 1, snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 + }, + is_ground_content = false, + sounds = farming.node_sound_wood_defaults(), + + on_punch = function(pos, node, puncher) + local name = puncher:get_player_name() or "" + if minetest.is_protected(pos, name) then return end + node.name = "farming:jackolantern_on" + minetest.swap_node(pos, node) + end, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 + }) + + register_node(farming.pumpkin,"farming:jackolantern_on", { + tiles = { + "farming_pumpkin_bottom.png^farming_pumpkin_top.png", + "farming_pumpkin_bottom.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png^farming_pumpkin_face_on.png" + }, + light_source = minetest.LIGHT_MAX - 1, + paramtype2 = "facedir", + groups = { + handy = 1, snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, + not_in_creative_inventory = 1 + }, + is_ground_content = false, + sounds = farming.node_sound_wood_defaults(), + drop = "farming:jackolantern", + + on_punch = function(pos, node, puncher) + local name = puncher:get_player_name() or "" + if minetest.is_protected(pos, name) then return end + node.name = "farming:jackolantern" + minetest.swap_node(pos, node) + end, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 1 + }) +end diff --git a/mods/farming/item_recipes.lua b/mods/farming/item_recipes.lua new file mode 100644 index 00000000..2b51729e --- /dev/null +++ b/mods/farming/item_recipes.lua @@ -0,0 +1,1418 @@ + +local a = farming.recipe_items + +local function register_craft(condition,def) + if condition then + core.register_craft(def) + end +end + +-- flour recipes + +register_craft(farming.grains,{ + output = "farming:flour", + recipe = { + {"farming:rye", "farming:rye", "farming:rye"}, + {"farming:rye", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +register_craft(farming.barley,{ + output = "farming:flour", + recipe = { + {"farming:barley", "farming:barley", "farming:barley"}, + {"farming:barley", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +register_craft(farming.grains,{ + output = "farming:flour", + recipe = { + {"farming:oat", "farming:oat", "farming:oat"}, + {"farming:oat", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- multigrain flour + +register_craft(farming.barley and farming.grains,{ + type = "shapeless", + output = "farming:flour_multigrain", + recipe = { + "group:food_wheat", "group:food_barley", "group:food_oats", + "group:food_rye", a.mortar_pestle + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- multigrain bread + +register_craft(farming.grains,{ + type = "cooking", + cooktime = 15, + output = "farming:bread_multigrain", + recipe = "farming:flour_multigrain" +}) + +-- sliced bread + +register_craft(true,{ + output = "farming:bread_slice 5", + recipe = {{"group:food_bread", a.cutting_board}}, + replacements = {{"group:food_cutting_board", "farming:cutting_board"}} +}) + +-- toast + +register_craft(true,{ + type = "cooking", + cooktime = 3, + output = "farming:toast", + recipe = "farming:bread_slice" +}) + +-- toast sandwich + +register_craft(true,{ + output = "farming:toast_sandwich", + recipe = { + {"farming:bread_slice"}, + {"farming:toast"}, + {"farming:bread_slice"} + } +}) + +-- garlic bulb + +register_craft(farming.garlic,{ + output = "farming:garlic_clove 8", + recipe = {{"farming:garlic"}} +}) + +register_craft(farming.garlic,{ + output = "farming:garlic", + recipe = { + {"farming:garlic_clove", "farming:garlic_clove", "farming:garlic_clove"}, + {"farming:garlic_clove", "", "farming:garlic_clove"}, + {"farming:garlic_clove", "farming:garlic_clove", "farming:garlic_clove"} + } +}) + +-- garlic braid + +register_craft(farming.garlic,{ + output = "farming:garlic_braid", + recipe = { + {"farming:garlic", "farming:garlic", "farming:garlic"}, + {"farming:garlic", "farming:garlic", "farming:garlic"}, + {"farming:garlic", "farming:garlic", "farming:garlic"} + } +}) + +register_craft(farming.garlic,{ + type = "shapeless", + output = "farming:garlic 9", + recipe = {"farming:garlic_braid"} +}) + +-- corn on the cob + +register_craft(farming.corn,{ + type = "cooking", + cooktime = 10, + output = "farming:corn_cob", + recipe = "group:food_corn" +}) + +-- popcorn + +register_craft(farming.corn,{ + output = "farming:popcorn", + recipe = { + {"group:food_oil", "group:food_corn", a.pot} + }, + replacements = { + {"group:food_pot", "farming:pot"}, + {"group:food_oil", "vessels:glass_bottle"} + } +}) + +-- cornstarch + +register_craft(farming.corn,{ + output = "farming:cornstarch", + recipe = { + {a.mortar_pestle, "group:food_corn_cooked", a.baking_tray}, + {"", "group:food_bowl", ""}, + }, + replacements = { + {"group:food_mortar_pestle", "farming:mortar_pestle"}, + {"group:food_baking_tray", "farming:baking_tray"} + } +}) + +-- ethanol + +register_craft(farming.corn, { + output = "farming:bottle_ethanol", + recipe = { + {"group:food_corn", "group:food_corn", "group:food_corn"}, + {"group:food_corn", a.glass_bottle, "group:food_corn"}, + {"group:food_corn", "group:food_corn", "group:food_corn"} + } +}) + +-- cup of coffee + +register_craft(farming.coffee, { + output = "farming:coffee_cup", + recipe = { + {"group:food_coffee", "group:food_glass_water", a.saucepan} + }, + replacements = { + {"group:food_saucepan", "farming:saucepan"} + } +}) + +-- bar of dark chocolate + +register_craft(farming.cocoa, { + output = "farming:chocolate_dark", + recipe = { + {"group:food_cocoa", "group:food_cocoa", "group:food_cocoa"} + } +}) + +-- chocolate block + +register_craft(farming.cocoa,{ + output = "farming:chocolate_block", + recipe = { + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"}, + {"farming:chocolate_dark", "farming:chocolate_dark", "farming:chocolate_dark"} + } +}) + +register_craft(farming.cocoa,{ + output = "farming:chocolate_dark 9", + recipe = {{"farming:chocolate_block"}} +}) + +-- chili powder + +register_craft(farming.chili,{ + output = "farming:chili_powder", + recipe = { + {"farming:chili_pepper", a.mortar_pestle} + }, + replacements = {{"farming:mortar_pestle", "farming:mortar_pestle"}} +}) + +-- bowl of chili + +register_craft(farming.chili and farming.rice and farming.tomato and farming.chili and farming.beans,{ + output = "farming:chili_bowl", + recipe = { + {"group:food_chili_pepper", "group:food_rice", "group:food_tomato"}, + {"group:food_beans", "group:food_bowl", ""} + } +}) + +-- carrot juice + +register_craft(farming.carrot,{ + output = "farming:carrot_juice", + recipe = { + {a.juicer}, + {"group:food_carrot"}, + {"vessels:drinking_glass"} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- blueberry pie + +register_craft(farming.blueberry or core.registered_items["default:blueberries"],{ + output = "farming:blueberry_pie", + recipe = { + {"group:food_flour", "group:food_sugar", "group:food_blueberries"}, + {"", a.baking_tray, ""} + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- blueberry muffin + +register_craft(farming.blueberry or core.registered_items["default:blueberries"],{ + output = "farming:muffin_blueberry 2", + recipe = { + {"group:food_blueberries", "group:food_bread", "group:food_blueberries"} + } +}) + +-- tomato soup + +register_craft(farming.tomato,{ + output = "farming:tomato_soup", + recipe = { + {"group:food_tomato"}, + {"group:food_tomato"}, + {"group:food_bowl"} + } +}) + +-- filter sea water into river water + +register_craft(farming.hemp,{ + output = a.bucket_river_water, + recipe = { + {"farming:hemp_fibre"}, + {"farming:hemp_fibre"}, + {a.bucket_water} + } +}) + +if farming.mcl then + + register_craft(farming.hemp,{ + output = "mcl_potions:river_water", + recipe = { + {"farming:hemp_fibre"}, + {"mcl_potions:water"} + } + }) +end + +-- glass of water + +register_craft(true,{ + output = "farming:glass_water 4", + recipe = { + {a.drinking_glass, a.drinking_glass}, + {a.drinking_glass, a.drinking_glass}, + {a.bucket_river_water, ""} + }, + replacements = {{a.bucket_river_water, a.bucket_empty}} +}) + +register_craft(true,{ + output = "farming:glass_water 4", + recipe = { + {a.drinking_glass, a.drinking_glass}, + {a.drinking_glass, a.drinking_glass}, + {a.bucket_water, "farming:hemp_fibre"} + }, + replacements = {{a.bucket_water, a.bucket_empty}} +}) + +if minetest.get_modpath("bucket_wooden") then + + register_craft(farming.hemp,{ + output = "farming:glass_water 4", + recipe = { + {a.drinking_glass, a.drinking_glass}, + {a.drinking_glass, a.drinking_glass}, + {"group:water_bucket_wooden", "farming:hemp_fibre"} + }, + replacements = {{"group:water_bucket_wooden", "bucket_wooden:bucket_empty"}} + }) +end + +-- sugar cube + +register_craft(true,{ + output = "farming:sugar_cube", + recipe = { + {a.sugar, a.sugar, a.sugar}, + {a.sugar, a.sugar, a.sugar}, + {a.sugar, a.sugar, a.sugar} + } +}) + +register_craft(true,{ + output = a.sugar .. " 9", + recipe = {{"farming:sugar_cube"}} +}) + +-- caramel + +register_craft(true,{ + type = "cooking", + cooktime = 6, + output = "farming:caramel", + recipe = "group:food_sugar" +}) + +-- salt + +register_craft(true,{ + type = "cooking", + cooktime = 15, + output = "farming:salt", + recipe = a.bucket_water, + replacements = {{a.bucket_water, a.bucket_empty}} +}) + +-- salt crystal + +register_craft(true,{ + output = "farming:salt 9", + recipe = { + {"farming:salt_crystal", a.mortar_pestle} + }, + replacements = {{"farming:mortar_pestle", "farming:mortar_pestle"}} +}) + +register_craft(true,{ + output = "farming:salt_crystal", + recipe = { + {"farming:salt", "farming:salt", "farming:salt"}, + {"farming:salt", "farming:salt", "farming:salt"}, + {"farming:salt", "farming:salt", "farming:salt"} + } +}) + +-- mayonnaise + +register_craft(true,{ + output = "farming:mayonnaise", + recipe = { + {"group:food_olive_oil", "group:food_lemon"}, + {"group:food_egg", "farming:salt"} + }, + replacements = {{"farming:olive_oil", a.glass_bottle}} +}) + +-- rose water + +register_craft(true,{ + output = "farming:rose_water", + recipe = { + {a.rose, a.rose, a.rose}, + {a.rose, a.rose, a.rose}, + {"group:food_glass_water", a.pot, a.glass_bottle} + }, + replacements = { + {"group:food_glass_water", a.drinking_glass}, + {"group:food_pot", "farming:pot"} + } +}) + +-- turkish delight + +register_craft(true,{ + output = "farming:turkish_delight 4", + recipe = { + {"group:food_gelatin", "group:food_sugar", "group:food_gelatin"}, + {"group:food_sugar", "group:food_rose_water", "group:food_sugar"}, + {"group:food_sugar", a.dye_pink, "group:food_sugar"} + }, + replacements = { + {"group:food_cornstarch", a.bowl}, + {"group:food_cornstarch", a.bowl}, + {"group:food_rose_water", a.glass_bottle} + } +}) + +-- garlic bread + +register_craft(farming.garlic,{ + output = "farming:garlic_bread", + recipe = { + {"group:food_toast", "group:food_garlic_clove", "group:food_garlic_clove"} + } +}) + +-- donuts + +register_craft(true,{ + output = "farming:donut 3", + recipe = { + {"", "group:food_wheat", ""}, + {"group:food_wheat", "group:food_sugar", "group:food_wheat"}, + {"", "group:food_wheat", ""} + } +}) + +register_craft(farming.cocoa,{ + output = "farming:donut_chocolate", + recipe = { + {"group:food_cocoa"}, + {"farming:donut"} + } +}) + +register_craft(true,{ + output = "farming:donut_apple", + recipe = { + {"group:food_apple"}, + {"farming:donut"} + } +}) + +-- porridge oats + +register_craft(farming.grains and farming.soy,{ + output = "farming:porridge", + recipe = { + {"group:food_oats", "group:food_oats", "group:food_oats"}, + {"group:food_oats", "group:food_bowl", "group:food_milk_glass"} + }, + replacements = { + {"mobs:glass_milk", a.drinking_glass}, + {"farming:soy_milk", a.drinking_glass} + } +}) + +-- jaffa cake + +register_craft(farming.soy,{ + output = "farming:jaffa_cake 3", + recipe = { + {a.baking_tray, "group:food_egg", "group:food_sugar"}, + {a.flour, "group:food_cocoa", "group:food_orange"}, + {"group:food_milk", "", ""} + }, + replacements = { + {"farming:baking_tray", "farming:baking_tray"}, + {"mobs:bucket_milk", a.bucket_empty}, + {"mobs:wooden_bucket_milk", "wooden_bucket:bucket_wood_empty"}, + {"farming:soy_milk", a.drinking_glass} + } +}) + +-- apple pie + +register_craft(true,{ + output = "farming:apple_pie", + recipe = { + {a.flour, "group:food_sugar", "group:food_apple"}, + {"", a.baking_tray, ""} + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- cactus juice + +register_craft(true,{ + output = "farming:cactus_juice", + recipe = { + {a.juicer}, + {a.cactus}, + {a.drinking_glass} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- pasta + +register_craft(true,{ + output = "farming:pasta", + recipe = { + {a.flour, "group:food_butter", a.mixing_bowl} + }, + replacements = {{"group:food_mixing_bowl", "farming:mixing_bowl"}} +}) + +register_craft(true,{ + output = "farming:pasta", + recipe = { + {a.flour, "group:food_oil", a.mixing_bowl} + }, + replacements = { + {"group:food_mixing_bowl", "farming:mixing_bowl"}, + {"group:food_oil", a.glass_bottle} + } +}) + +-- mac & cheese + +register_craft(true,{ + output = "farming:mac_and_cheese", + recipe = { + {"group:food_pasta", "group:food_cheese", "group:food_bowl"} + } +}) + +-- spaghetti + +register_craft(farming.garlic and farming.tomato,{ + output = "farming:spaghetti", + recipe = { + {"group:food_pasta", "group:food_tomato", a.saucepan}, + {"group:food_garlic_clove", "group:food_garlic_clove", ""} + }, + replacements = {{"group:food_saucepan", "farming:saucepan"}} +}) + +-- korean bibimbap + +register_craft(farming.chili and farming.rice and farming.chili and farming.cabbage,{ + output = "farming:bibimbap", + recipe = { + {a.skillet, "group:food_bowl", "group:food_egg"}, + {"group:food_rice", "group:food_chicken_raw", "group:food_cabbage"}, + {"group:food_carrot", "group:food_chili_pepper", ""} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +register_craft(farming.chili and farming.cabbage and farming.carrot and farming.chili,{ + output = "farming:bibimbap", + type = "shapeless", + recipe = { + a.skillet, "group:food_bowl", "group:food_mushroom", + "group:food_rice", "group:food_cabbage", "group:food_carrot", + "group:food_mushroom", "group:food_chili_pepper" + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- burger + +register_craft(farming.lettuce and farming.tomato,{ + output = "farming:burger", + recipe = { + {a.bread, "group:food_meat", "group:food_cheese"}, + {"group:food_tomato", "group:food_cucumber", "group:food_onion"}, + {"group:food_lettuce", "", ""} + } +}) + +-- salad + +register_craft(farming.lettuce and farming.tomato,{ + output = "farming:salad", + type = "shapeless", + recipe = { + "group:food_bowl", "group:food_tomato", "group:food_cucumber", + "group:food_lettuce", "group:food_oil" + } +}) + +-- triple berry smoothie + +register_craft(farming.raspberry and farming.blackberry and farming.strawberry,{ + output = "farming:smoothie_berry", + type = "shapeless", + recipe = { + "group:food_raspberries", "group:food_blackberries", + "group:food_strawberry", "group:food_banana", + a.drinking_glass + } +}) + +-- patatas a la importancia + +register_craft(farming.garlic and farming.parsley and farming.potato and farming.onion,{ + output = "farming:spanish_potatoes", + recipe = { + {"group:food_potato", "group:food_parsley", "group:food_potato"}, + {"group:food_egg", a.flour, "group:food_onion"}, + {"farming:garlic_clove", "group:food_bowl", a.skillet} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- potato omelette + +register_craft(farming.onion and farming.potato,{ + output = "farming:potato_omelet", + recipe = { + {"group:food_egg", "group:food_potato", "group:food_onion"}, + {a.skillet, "group:food_bowl", ""} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- paella + +register_craft(farming.peas and farming.pepper and farming.rice,{ + output = "farming:paella", + recipe = { + {"group:food_rice", a.dye_orange, "farming:pepper_red"}, + {"group:food_peas", "group:food_chicken", "group:food_bowl"}, + {"", a.skillet, ""} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- vanilla flan + +register_craft(farming.vanilla and farming.soy,{ + output = "farming:flan", + recipe = { + {"group:food_sugar", "group:food_milk", "farming:caramel"}, + {"group:food_egg", "group:food_egg", "farming:vanilla_extract"} + }, + replacements = { + {"cucina_vegana:soy_milk", a.drinking_glass}, + {"mobs:bucket_milk", "bucket:bucket_empty"}, + {"mobs:wooden_bucket_milk", "wooden_bucket:bucket_wood_empty"}, + {"farming:vanilla_extract", a.glass_bottle} + } +}) + +-- vegan cheese + +register_craft(farming.corn and farming.pepper and farming.soy,{ + output = "farming:cheese_vegan", + recipe = { + {"farming:soy_milk", "farming:soy_milk", "farming:soy_milk"}, + {"group:food_salt", "group:food_peppercorn", "farming:bottle_ethanol"}, + {"group:food_gelatin", a.pot, ""} + }, + replacements = { + {"farming:soy_milk", a.drinking_glass .. " 3"}, + {"farming:pot", "farming:pot"}, + {"farming:bottle_ethanol", a.glass_bottle} + } +}) + +register_craft(farming.pepper and farming.soy,{ + output = "farming:cheese_vegan", + recipe = { + {"farming:soy_milk", "farming:soy_milk", "farming:soy_milk"}, + {"group:food_salt", "group:food_peppercorn", "group:food_lemon"}, + {"group:food_gelatin", a.pot, ""} + }, + replacements = { + {"farming:soy_milk", a.drinking_glass .. " 3"}, + {"farming:pot", "farming:pot"} + } +}) + +-- vegan butter + +register_craft(farming.soy and farming.sunflower,{ + output = "farming:butter_vegan", + recipe = { + {"farming:soy_milk", "farming:sunflower_oil", "farming:soy_milk"}, + {"group:food_salt", a.dye_yellow, "farming:mixing_bowl"} + }, + replacements = { + {"farming:soy_milk", a.drinking_glass .. " 2"}, + {"farming:sunflower_oil", a.glass_bottle}, + {"farming:mixing_bowl", "farming:mixing_bowl"} + } +}) + +-- onigiri + +register_craft(farming.rice,{ + output = "farming:onigiri", + recipe = { + {"group:food_rice", "group:food_salt", "group:food_rice"}, + {"", "group:food_seaweed", ""} + } +}) + +-- gyoza + +register_craft(farming.cabbage and farming.garlic and farming.onion,{ + output = "farming:gyoza 4", + recipe = { + {"group:food_cabbage", "group:food_garlic_clove", "group:food_onion"}, + {"group:food_meat_raw", "group:food_salt", a.flour}, + {"", a.skillet, ""} + + }, + replacements = { + {"group:food_skillet", "farming:skillet"} + } +}) + +-- mochi + +register_craft(farming.rice,{ + output = "farming:mochi", + recipe = { + {"", a.mortar_pestle, ""}, + {"group:food_rice", "group:food_sugar", "group:food_rice"}, + {"", "group:food_glass_water", ""} + }, + replacements = { + {"group:food_mortar_pestle", "farming:mortar_pestle"}, + {"group:food_glass_water", a.drinking_glass} + } +}) + +-- gingerbread man + +register_craft(farming.ginger,{ + output = "farming:gingerbread_man 3", + recipe = { + {"", "group:food_egg", ""}, + {"group:food_wheat", "group:food_ginger", "group:food_wheat"}, + {"group:food_sugar", "", "group:food_sugar"} + } +}) + +-- mint tea + +register_craft(farming.mint,{ + output = "farming:mint_tea", + recipe = { + {"group:food_mint", "group:food_mint", "group:food_mint"}, + {"group:food_glass_water", a.juicer, ""} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- onion soup + +register_craft(farming.onion,{ + output = "farming:onion_soup", + recipe = { + {"group:food_onion", "group:food_onion", "group:food_onion"}, + {"group:food_onion", "group:food_bowl", "group:food_onion"}, + {"", a.pot, ""} + }, + replacements = {{"farming:pot", "farming:pot"}} +}) + +-- pea soup + +register_craft(farming.peas,{ + output = "farming:pea_soup", + recipe = { + {"group:food_peas"}, + {"group:food_peas"}, + {"group:food_bowl"} + } +}) + +-- ground pepper + +register_craft(farming.pepper, { + output = "farming:pepper_ground", + recipe = { + {"group:food_peppercorn"}, + {a.glass_bottle}, + {a.mortar_pestle} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- pineapple ring + +register_craft(farming.pineapple, { + output = "farming:pineapple_ring 5", + recipe = {{"group:food_pineapple"}}, + replacements = {{"farming:pineapple", "farming:pineapple_top"}} +}) + +-- pineapple juice + +register_craft(farming.pineapple,{ + output = "farming:pineapple_juice", + recipe = { + {"group:food_pineapple_ring", "group:food_pineapple_ring", + "group:food_pineapple_ring"}, + {"", a.drinking_glass, ""}, + {"", a.juicer, ""} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +register_craft(farming.pineapple,{ + output = "farming:pineapple_juice 2", + recipe = { + {a.drinking_glass, "group:food_pineapple", a.drinking_glass}, + {"", a.juicer, ""} + }, + replacements = { + {"group:food_juicer", "farming:juicer"} + } +}) + +-- potato & cucumber salad + +register_craft(farming.cucumber and farming.potato,{ + output = "farming:potato_salad", + recipe = { + {"group:food_cucumber"}, + {"farming:baked_potato"}, + {"group:food_bowl"} + } +}) + +-- melon slice / block + +register_craft(farming.melon,{ + output = "farming:melon_8", + recipe = { + {"farming:melon_slice", "farming:melon_slice"}, + {"farming:melon_slice", "farming:melon_slice"} + } +}) + +register_craft(farming.melon,{ + output = "farming:melon_slice 4", + recipe = {{"farming:melon_8", a.cutting_board}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} +}) + +-- pumpkin slice / block + +register_craft(farming.pumpkin,{ + output = "farming:pumpkin", + recipe = { + {"farming:pumpkin_slice", "farming:pumpkin_slice"}, + {"farming:pumpkin_slice", "farming:pumpkin_slice"} + } +}) + +register_craft(farming.pumpkin,{ + output = "farming:pumpkin_slice 4", + recipe = {{"farming:pumpkin", a.cutting_board}}, + replacements = {{"farming:cutting_board", "farming:cutting_board"}} +}) + +-- pumpkin dough + +register_craft(farming.pumpkin,{ + output = "farming:pumpkin_dough", + recipe = { + {"group:food_pumpkin_slice", "group:food_flour", "group:food_pumpkin_slice"} + } +}) + +-- pumpkin bread + +register_craft(farming.pumpkin,{ + type = "cooking", + output = "farming:pumpkin_bread", + recipe = "farming:pumpkin_dough", + cooktime = 10 +}) + +-- raspberry smoothie + +register_craft(farming.raspberry,{ + output = "farming:smoothie_raspberry", + recipe = { + {a.snow}, + {"group:food_raspberries"}, + {a.drinking_glass} + } +}) + +-- rhubarb pie + +register_craft(farming.rhubarb,{ + output = "farming:rhubarb_pie", + recipe = { + {a.baking_tray, "group:food_sugar", ""}, + {"group:food_rhubarb", "group:food_rhubarb", "group:food_rhubarb"}, + {"group:food_wheat", "group:food_wheat", "group:food_wheat"} + }, + replacements = {{"group:food_baking_tray", "farming:baking_tray"}} +}) + +-- rice flour + +register_craft(farming.rice,{ + output = "farming:rice_flour", + recipe = { + {"farming:rice", "farming:rice", "farming:rice"}, + {"farming:rice", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} +}) + +-- rice bread + +register_craft(farming.rice,{ + type = "cooking", + cooktime = 15, + output = "farming:rice_bread", + recipe = "farming:rice_flour" +}) + +-- soy sauce + +register_craft(farming.soy, { + output = "farming:soy_sauce", + recipe = { + {"group:food_soy", "group:food_salt", "group:food_soy"}, + {a.juicer, a.bucket_water, a.glass_bottle} + }, + replacements = { + {a.bucket_water, a.bucket_empty}, + {"group:food_juicer", "farming:juicer"} + } +}) + +-- soy milk + +register_craft(farming.soy and farming.vanilla and farming.corn, { + output = "farming:soy_milk", + recipe = { + {"group:food_soy", "group:food_soy", "group:food_soy"}, + {"farming:vanilla_extract", "bucket:bucket_water", a.drinking_glass} + }, + replacements = { + {a.bucket_water, a.bucket_empty}, + {"farming:vanilla_extract", a.glass_bottle} + } +}) + +-- tofu + +register_craft(farming.soy,{ + output = "farming:tofu", + recipe = { + {"group:food_soy", "group:food_soy", "group:food_soy"}, + {"group:food_soy", "group:food_soy", a.baking_tray} + }, + replacements = {{"farming:baking_tray", "farming:baking_tray"}} +}) + +-- cooked tofu + +register_craft(true,{ + type = "cooking", + output = "farming:tofu_cooked", + recipe = "farming:tofu", + cooktime = 5 +}) + +-- vanilla extract + +register_craft(farming.corn and farming.vanilla, { + output = "farming:vanilla_extract", + recipe = { + {"group:food_vanilla", "group:food_vanilla", "group:food_vanilla"}, + {"group:food_vanilla", "farming:bottle_ethanol", "group:food_glass_water"}, + }, + replacements = { + {"group:food_glass_water", a.drinking_glass} + } +}) + +-- jerusalem artichokes + +register_craft(farming.artichoke and farming.soy and farming.garlic,{ + output = "farming:jerusalem_artichokes", + recipe = { + {"group:food_artichoke", "group:food_garlic_clove", "group:food_artichoke"}, + {"group:food_soy", "group:food_salt", "group:food_soy"}, + {"group:food_butter", "group:food_skillet", "group:food_bowl"} + }, + replacements = {{"group:food_skillet", "farming:skillet"}} +}) + +-- wooden scarecrow base + +register_craft(farming.pumpkin,{ + output = "farming:scarecrow_bottom", + recipe = { + {"", "group:stick", ""}, + {"group:stick", "group:stick", "group:stick"}, + {"", "group:stick", ""} + } +}) + +-- beanpole + +register_craft(farming.beans,{ + output = "farming:beanpole", + recipe = { + {"", "", ""}, + {"group:stick", "", "group:stick"}, + {"group:stick", "", "group:stick"} + } +}) + +-- trellis + +register_craft(farming.grapes,{ + output = "farming:trellis", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} + } +}) + +-- cotton to wool + +register_craft(true,{ + output = a.wool, + recipe = { + {"farming:cotton", "farming:cotton"}, + {"farming:cotton", "farming:cotton"} + } +}) + +-- string + +register_craft(true,{ + output = a.string .. " 2", + recipe = { + {"farming:cotton"}, + {"farming:cotton"} + } +}) + +-- saucepan + +register_craft(true,{ + output = "farming:saucepan", + recipe = { + {a.steel_ingot, "", ""}, + {"", "group:stick", ""} + } +}) + +-- cooking pot + +register_craft(true,{ + output = "farming:pot", + recipe = { + {"group:stick", a.steel_ingot, a.steel_ingot}, + {"", a.steel_ingot, a.steel_ingot} + } +}) + +-- baking tray + +register_craft(true,{ + output = "farming:baking_tray", + recipe = { + {a.clay_brick, a.clay_brick, a.clay_brick}, + {a.clay_brick, "", a.clay_brick}, + {a.clay_brick, a.clay_brick, a.clay_brick} + } +}) + +-- skillet + +register_craft(true,{ + output = "farming:skillet", + recipe = { + {a.steel_ingot, "", ""}, + {"", a.steel_ingot, ""}, + {"", "", "group:stick"} + } +}) + +-- mortar & pestle + +register_craft(true,{ + output = "farming:mortar_pestle", + recipe = { + {"group:stone", "group:stick", "group:stone"}, + {"", "group:stone", ""} + } +}) + +-- cutting board + +register_craft(true,{ + output = "farming:cutting_board", + recipe = { + {a.steel_ingot, "", ""}, + {"", "group:stick", ""}, + {"", "", "group:wood"} + } +}) + +-- juicer + +register_craft(true,{ + output = "farming:juicer", + recipe = { + {"", "group:stone", ""}, + {"group:stone", "", "group:stone"} + } +}) + +-- glass mixing bowl + +register_craft(true,{ + output = "farming:mixing_bowl", + recipe = { + {a.glass, "group:stick", a.glass}, + {"", a.glass, ""} + } +}) + +register_craft(true, { + output = "vessels:glass_fragments", + recipe = {{"farming:mixing_bowl"}} +}) + +-- hemp oil + +register_craft(farming.hemp, { + output = "farming:hemp_oil", + recipe = { + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"", a.glass_bottle, ""} + } +}) + +register_craft(farming.hemp, { + output = "farming:hemp_oil", + recipe = { + {"farming:seed_hemp", "farming:seed_hemp", "farming:seed_hemp"}, + {"farming:seed_hemp", "farming:seed_hemp", "farming:seed_hemp"}, + {"farming:seed_hemp", a.glass_bottle, "farming:seed_hemp"} + } +}) + +-- hemp fibre + +register_craft(farming.hemp, { + output = "farming:hemp_fibre 8", + recipe = { + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "group:water_bucket", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"} + }, + replacements = {{"group:water_bucket", a.bucket_empty}} +}) + +if minetest.get_modpath("bucket_wooden") then + + register_craft(farming.hemp, { + output = "farming:hemp_fibre 8", + recipe = { + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "group:water_bucket_wooden", "farming:hemp_leaf"}, + {"farming:hemp_leaf", "farming:hemp_leaf", "farming:hemp_leaf"} + }, + replacements = {{"group:water_bucket_wooden", "bucket_wooden:bucket_empty"}} + }) +end + +-- hemp block + +register_craft(farming.hemp, { + output = "farming:hemp_block", + recipe = { + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} + } +}) + +-- hemp rope + +register_craft(farming.hemp, { + output = "farming:hemp_rope 6", + recipe = { + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"}, + {"farming:cotton", "farming:cotton", "farming:cotton"}, + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} + } +}) + +-- paper + +register_craft(farming.hemp, { + output = a.paper .. " 3", + recipe = { + {"farming:hemp_fibre", "farming:hemp_fibre", "farming:hemp_fibre"} + } +}) + +-- straw + +local tmp = farming.mcl and "farming:rye" or "farming:wheat" + +register_craft(true,{ + output = "farming:straw 3", + recipe = { + {tmp, tmp, tmp}, + {tmp, tmp, tmp}, + {tmp, tmp, tmp} + } +}) + +register_craft(true,{ + output = tmp .. " 3", + recipe = {{"farming:straw"}} +}) + +--= Recipes we shouldn't add when using Mineclonia/VoxeLibre + +if not farming.mcl then + + -- Wheat flour + + register_craft(true,{ + output = "farming:flour", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", a.mortar_pestle, ""} + }, + replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}} + }) + + -- Bread + + register_craft(true,{ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" + }) + + -- Cocoa beans + + register_craft(farming.cocoa,{ + type = "cooking", + cooktime = 5, + output = "farming:cocoa_beans", + recipe = "farming:cocoa_beans_raw" + }) + + -- Chocolate cookie + + register_craft(farming.cocoa, { + output = "farming:cookie 8", + recipe = { + {"group:food_wheat", "group:food_cocoa", "group:food_wheat" } + } + }) + + -- Golden carrot + + register_craft(farming.carrot,{ + output = "farming:carrot_gold", + recipe = {{"group:food_carrot", "default:gold_lump"}} + }) + + -- Beetroot soup + + register_craft(farming.beetroot,{ + output = "farming:beetroot_soup", + recipe = { + {"group:food_beetroot", "group:food_beetroot", "group:food_beetroot"}, + {"group:food_beetroot", "group:food_bowl", "group:food_beetroot"} + } + }) + + -- Sugar + + register_craft(true,{ + type = "cooking", + cooktime = 3, + output = "farming:sugar 2", + recipe = "default:papyrus" + }) + + -- Baked potato + + register_craft(farming.potato,{ + type = "cooking", + cooktime = 10, + output = "farming:baked_potato", + recipe = "group:food_potato" + }) + + -- Toasted sunflower seeds + + register_craft(farming.sunflower,{ + type = "cooking", + cooktime = 10, + output = "farming:sunflower_seeds_toasted", + recipe = "farming:seed_sunflower" + }) + + -- Sunflower oil + + local tmp = "group:food_sunflower_seeds" + + register_craft(farming.sunflower, { + output = "farming:sunflower_oil", + recipe = { + {tmp, tmp, tmp}, + {tmp, tmp, tmp}, + {tmp, a.glass_bottle, tmp} + } + }) + + -- Sunflower seed bread + + register_craft(farming.sunflower,{ + output = "farming:sunflower_bread", + recipe = { + { + "group:food_sunflower_seeds_toasted", + "group:food_bread", + "group:food_sunflower_seeds_toasted" + } + } + }) + + -- Jack 'o lantern + + register_craft(farming.pumpkin,{ + output = "farming:jackolantern", + recipe = { + {"default:torch"}, + {"group:food_pumpkin"} + } + }) + + -- Wooden bowl + + register_craft(true,{ + output = "farming:bowl 4", + recipe = { + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } + }) +end + +-- dye recipes + +register_craft(farming.beans,{output = a.dye_green, recipe = {{"farming:beans"}}}) +register_craft(farming.beetroot,{output = a.dye_red, recipe = {{"group:food_beetroot"}}}) +register_craft(farming.blueberry,{output = a.dye_blue, recipe = {{"farming:blueberries"}}}) +register_craft(farming.chili,{output = a.dye_red, recipe = {{"farming:chili_pepper"}}}) +register_craft(farming.cocoa,{output = a.dye_brown, recipe = {{"farming:cocoa_beans"}}}) +register_craft(farming.grapes,{output = a.dye_violet, recipe = {{"farming:grapes"}}}) +register_craft(farming.onion,{output = a.dye_yellow, recipe = {{"group:food_onion"}}}) + +-- fuel items + +register_craft(true,{type = "fuel", recipe = "farming:straw", burntime = 3}) +register_craft(true,{type = "fuel", recipe = "farming:wheat", burntime = 1}) +register_craft(true,{type = "fuel", recipe = "farming:bowl",burntime = 10}) +register_craft(true,{type = "fuel", recipe = "farming:string", burntime = 1}) +register_craft(true,{type = "fuel", recipe = "farming:cotton", burntime = 1}) +register_craft(farming.barley,{type = "fuel", recipe = "farming:barley", burntime = 1}) +register_craft(farming.beans,{type = "fuel", recipe = "farming:beanpole", burntime = 10}) +register_craft(farming.grapes,{type = "fuel", recipe = "farming:trellis", burntime = 15}) +register_craft(farming.rice,{type = "fuel", recipe = "farming:rice", burntime = 1}) +register_craft(farming.rice,{type = "fuel", recipe = "farming:rice_bread", burntime = 1}) +register_craft(farming.grains,{type = "fuel", recipe = "farming:bread_multigrain", burntime = 1}) +register_craft(farming.grains,{type = "fuel", recipe = "farming:rye", burntime = 1}) +register_craft(farming.grains,{type = "fuel", recipe = "farming:oat", burntime = 1}) +register_craft(farming.hemp,{type = "fuel", recipe = "farming:hemp_oil", + burntime = 20, replacements = {{"farming:hemp_oil", a.glass_bottle}}}) +register_craft(farming.corn,{type = "fuel", recipe = "farming:bottle_ethanol", + burntime = 80, replacements = {{"farming:bottle_ethanol", a.glass_bottle}}}) +register_craft(farming.sunflower,{type = "fuel", recipe = "farming:sunflower_oil", + burntime = 30, replacements = {{"farming:sunflower_oil", a.glass_bottle}}}) +register_craft(farming.vanilla and farming.corn,{type = "fuel", recipe = "farming:vanilla_extract", + burntime = 25, replacements = {{"farming:vanilla_extract", a.glass_bottle}}}) diff --git a/mods/farming/item_stairs.lua b/mods/farming/item_stairs.lua new file mode 100644 index 00000000..6bfe6243 --- /dev/null +++ b/mods/farming/item_stairs.lua @@ -0,0 +1,35 @@ + +-- check and register stairs + +if minetest.global_exists("stairs") then + + if stairs.mod and stairs.mod == "redo" then + + stairs.register_all("straw", "farming:straw", + {snappy = 3, flammable = 4}, + {"farming_straw.png"}, + "Straw", + farming.node_sound_leaves_defaults()) + + stairs.register_all("hemp_block", "farming:hemp_block", + {snappy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + {"farming_hemp_block.png"}, + "Hemp Block", + farming.node_sound_leaves_defaults()) + else + + stairs.register_stair_and_slab("straw", "farming:straw", + {snappy = 3, flammable = 4}, + {"farming_straw.png"}, + "Straw Stair", + "Straw Slab", + farming.node_sound_leaves_defaults()) + + stairs.register_stair_and_slab("hemp_block", "farming:hemp_block", + {snappy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + {"farming_hemp_block.png"}, + "Hemp Block Stair", + "Hemp Block Slab", + farming.node_sound_leaves_defaults()) + end +end diff --git a/mods/farming/license.txt b/mods/farming/license.txt new file mode 100644 index 00000000..b3e9b074 --- /dev/null +++ b/mods/farming/license.txt @@ -0,0 +1,241 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +License of media (textures): +---------------------------- + +Created by TenPlus1 (CC0): + alt_textures/ethereal_strawberry*.png + farming_spanish_potatoes.png + +Created by Hugues Ross (CC BY-SA 4.0): + ethereal_strawberry*.png + +Created by NameNotQuality (CC0): + farming_vanilla_flan.png + farming_spaghetti.png + +Created by Oz-tal (license: CC BY-SA 3.0): + crops_garlic_*.png + crops_onion.png + farming_cookie.png + farming_grapes.png + farming_vanilla.png + +Created by Shadall (CC0): + farming_burger.png + +Created by PilzAdam (License: CC BY 3.0): + farming_bread.png + farming_soil.png + farming_soil_wet.png + 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 + farming_tool_stonehoe.png + farming_tool_woodhoe.png + farming_tool_mesehoe.png + farming_tool_diamondhoe.png + +Created by VanessaE (License: CC BY 3.0): + farming_cotton_seed.png + farming_wheat_seed.png + farming_flour.png + farming_wheat.png + farming_wheat_1.png + farming_wheat_2.png + farming_wheat_3.png + farming_wheat_4.png + farming_wheat_5.png + farming_wheat_5.png + farming_wheat_7.png + farming_wheat_8.png + farming_cotton_1.png + farming_cotton_2.png + farming_cotton_3.png + farming_cotton_4.png + farming_cotton_5.png + farming_cotton_6.png + farming_cotton_7.png + farming_cotton_8.png + +Created by alerikaisattera (License: CC-BY-SA 4.0) + farming_melon_top.png + farming_melon_side.png + farming_melon_bottom.png + farming_pumpkin_bottom.png + farming_pumpkin_top.png + farming_pumpkin_side.png + farming_pumpkin_face_on.png + farming_pumpkin_face_off.png + +Created by Doc (License: CC BY 3.0): + farming_cucumber.png + farming_cucumber_1.png + farming_cucumber_2.png + farming_cucumber_3.png + farming_cucumber_4.png + farming_potato.png + farming_potato_1.png + farming_potato_2.png + farming_potato_3.png + farming_potato_4.png + farming_raspberries.png + farming_raspberry_1.png + farming_raspberry_2.png + farming_raspberry_3.png + farming_raspberry_4.png + +Created by Gambit (License: CC BY 3.0): + default_junglegrass.png + farming_carrot.png + farming_carrot_1.png + farming_carrot_2.png + farming_carrot_3.png + farming_carrot_4.png + farming_carrot_5.png + farming_carrot_6.png + farming_carrot_7.png + farming_carrot_8.png + +Created by JoseTheCrafter and edited by TenPlus1 (CC BY 3.0): + farming_tomato.png + farming_tomato_1.png + farming_tomato_2.png + farming_tomato_3.png + farming_tomato_4.png + farming_tomato_5.png + farming_tomato_6.png + farming_tomato_7.png + farming_tomato_8.png + +Created by GeMinecraft and edited by TenPlus1 (CC BY 3.0): + farming_corn.png + farming_corn_cob.png + farming_corn_1.png + farming_corn_2.png + farming_corn_3.png + farming_corn_4.png + farming_corn_5.png + farming_corn_6.png + farming_corn_7.png + farming_corn_8.png + +Created by TenPlus1 (CC BY 3.0) + farming_cocoa_1.png + farming_cocoa_2.png + farming_cocoa_3.png + farming_cocoa_beans.png + farming_raspberry_smoothie.png + farming_rhubarb_1.png + farming_rhubarb_2.png + farming_rhubarb_3.png + farming_rhubarb.png + farming_hemp*.png + farming_tofu*.png + farming_gingerbread_man.png + +Created by ademant (CC-BY-3.0) + farming_rye*.png + farming_oat*.png + farming_rice*.png + +Created by PilzAdam and edited by SpaghettiToastBook (CC0): + farming_bread_multigrain.png + +Created by VanessaE and edited by SpaghettiToastBook (CC0): + farming_flour_multigrain.png + +Created by mDiyo (Natura), modified by TenPlus1 (License: CC BY-SA 3.0): + farming_barley.png + +Created by OgelGames (CC BY-SA 4.0): + farming_berry_smoothie.png + farming_cactus_juice.png + farming_salad.png + +Created by Huhues Ross (CC BY-SA 4.0): + farming_sunflower_bread.png + +Created by Felfa (CC0) + farming_blackberry*.png + farming_lettuce*.png + farming_soy*.png + farming_vanilla_*.png + farming_artichoke*.png + farming_parsley*.png + farming_paella*.png + farming_potato_omelette.png + farming_spanish_potatoes_32px.png + farming_vanilla_flan_32px.png + farming_sunflower*.png [except sunflower_bread.png] + farming_mayo*.png + +Created by gorlock (CC0) + farming_salt_crystal.png + +Created by sirrobzeroone (CC0) + farming_gyoza.png + farming_pineapple_ring.png + +Created by smoke_th (CC0 - https://opengameart.org/content/popcorn-icon) + farming_popcorn_32px.png + farming_popcorn.png [resized and edited by TenPlus1] + +Created by DMBuce (MIT - https://github.com/DMBuce/hatchling-snacks) + farming_mac_and_cheese.png + +Created by XSSheep (CC BY-SA 4.0 - https://minecraft.curseforge.com/projects/pixel-perfection-freshly-updated) + farming_coffee_1.png + farming_coffee_2.png + farming_coffee_3.png + farming_coffee_4.png + farming_coffee_5.png + farming_coffee_beans.png + farming_apple_pie.png (edited by TenPlus1) + farming_blueberry_pie.png (edited by TenPlus1) + farming_rhubarb_pie.png (edited by TenPlus1) + +Copyright (C) 2021-2022: Atlante - AFL-1.1 +License for code: AFL-1.1 + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + farming_asparagus* + farming_eggplant* + farming_spinach* + farming_ginger* diff --git a/mods/farming/locale/farming.de.tr b/mods/farming/locale/farming.de.tr new file mode 100644 index 00000000..f2da0c63 --- /dev/null +++ b/mods/farming/locale/farming.de.tr @@ -0,0 +1,189 @@ +# textdomain: farming +Banana=Banane +Banana Leaves=Bananenblätter +Orange=Orange +Artichoke=Artischocke + Crop=-Pflanze +Asparagus=Spargel +Barley Seed=Gerstensamen +Barley=Gerste +Green Beans=Grüne Bohnen +Bean Pole (place on soil before planting beans)=Bohnenstange (vor dem Pflanzen der Bohnen auf den@nAckerboden stellen) +Beetroot=Rote Beete +Blackberries=Brombeeren +Blackberry=Brombeere +Wild Blueberries=Wilde Blaubeeren +Blueberry=Blaubeere +Cabbage=Kohl +Carrot=Möhre +Chili Pepper=Chili +Raw Cocoa Beans=Rohe Kakaobohnen +Cocoa Beans=Kakaobohnen +Coffee Beans=Kaffeebohnen +Coffee=Kaffee +Corn=Mais +Cotton Seed=Baumwollsamen +Cotton=Baumwolle +Wild Cotton=Wilde Baumwolle +Cucumber=Gurke +Eggplant=Aubergine +Garlic clove=Knoblauchzehe +Garlic=Knoblauch +Ginger=Lebkuchen +Grapes=Weintrauben +Trellis (place on soil before planting grapes)=Spalier (vor dem Pflanzen der Weintrauben auf den@nAckerboden stellen) +Hemp Seed=Hanfsamen +Hemp Leaf=Hanfblatt +Hemp=Hanf +Lettuce=Kopfsalat +Melon Slice=Melonenscheibe +Melon=Melone +Mint Seeds=Minzsamen +Mint Leaf=Minzblatt +Mint=Minze +Onion=Zwiebel +Parsley=Petersilie +Pea Pod=Erbsenschote +Pea=Erbse +Peppercorn=Pfefferkorn +Green Pepper=Grüne Paprika +Yellow Pepper=Gelbe Paprika +Red Pepper=Rote Paprika +Pepper=Paprika +Pineapple Top=Ananasdeckel +Pineapple=Ananas +Potato=Kartoffel +Pumpkin Slice=Kürbisscheibe +Pumpkin=Kürbis +Raspberries=Himbeeren +Raspberry=Himbeere +Rhubarb=Rhabarber +Rice Seed=Reissamen +Rice=Reis +Rye seed=Roggensamen +Rye=Roggen +Oat seed=Hafersamen +Oats=Hafer +Soy Pod=Sojaschote +Soy=Soja +Spinach=Spinat +Strawberry=Erdbeere +Sunflower Seeds=Sonnenblumensamen +Sunflower=Sonnenblume +Tomato=Tomate +Vanilla=Vanille +Wheat Seed=Weizensamen +Wheat=Weizen +Hoe=Hacke +Wooden Hoe=Holzhacke +Stone Hoe=Steinhacke +Steel Hoe=Stahlhacke +Bronze Hoe=Bronzehacke +Mese Hoe=Mesehacke +Diamond Hoe=Diamanthacke +Wood Hoe=Holzhacke +Hoe Bomb (use or throw on grassy areas to hoe land)=Hackenbombe (Auf Grasland werfen oder benutzen,@num Land zu bestellen) +Mithril Scythe (Use to harvest and replant crops)=Mithrilsichel (Benutzen, um Nutzpflanzen zu ernten und neu zu pflanzen) +Seed=Saatgut +Flour=Mehl +Garlic Braid=Knoblauchzopf +Corn on the Cob=Maiskolben +Popcorn=Popcorn +Cornstarch=Speisestärke +Cup of Coffee=Tasse Kaffee +Bar of Dark Chocolate=Tafel Zartbitterschokolade +Chocolate Block=Schokoladenblock +Bowl of Chili=Schüssel mit Chili +Chili Powder=Chilipulver +Carrot Juice=Möhrensaft +Blueberry Pie=Blaubeerkuchen +Blueberry Muffin=Blaubeermuffin +Tomato Soup=Tomatensuppe +Sliced Bread=Geschnittenes Brot +Toast=Toast +Toast Sandwich=Toast-Sandwich +Glass of Water=Glas Wasser +Sugar Cube=Zuckerwürfel +Caramel=Karamell +Salt=Salz +Salt crystal=Salzkristall +Mayonnaise=Mayonnaise +Rose Water=Rosenwasser +Turkish Delight=Lokum +Garlic Bread=Knoblauchbrot +Donut=Donut +Chocolate Donut=Schokodonut +Apple Donut=Apfeldonut +Porridge=Haferbrei +Jaffa Cake=Jaffa +Apple Pie=Apfelkuchen +Cactus Juice=Kaktussaft +Pasta=Pasta +Mac & Cheese=Makkaroni mit Käse +Spaghetti=Spaghetti +Bibimbap=Bibimbap +Burger=Burger +Salad=Salat +Triple Berry Smoothie=Dreibeersmoothie +Spanish Potatoes=Spanische Kartoffeln +Potato omelette=Kartoffelomelette +Paella=Paella +Vanilla Flan=Vanilletorte +Vegan Cheese=Veganer Käse +Vegan Butter=Vegane Butter +Onigiri=Onigiri +Gyoza=Gyoza +Mochi=Mochi +Gingerbread Man=Lebkuchenmann +Mint Tea=Minztee +Onion Soup=Zwiebelsuppe +Pea Soup=Erbsensuppe +Ground Pepper=Gemahlener Pfeffer +Pineapple Ring=Ananasscheibe +Pineapple Juice=Ananassaft +Cucumber and Potato Salad=Gurken-Kartoffelsalat +Pumpkin Dough=Kürbisteig +Pumpkin Bread=Kürbisbrot +Raspberry Smoothie=Himbeersmoothie +Rhubarb Pie=Rhabarberkuchen +Rice Flour=Reismehl +Rice Bread=Reiswaffel +Multigrain Flour=Mehrkornmehl +Multigrain Bread=Mehrkornbrot +Soy Sauce=Sojasoße +Soy Milk=Sojamilch +Tofu=Tofu +Cooked Tofu=Gekochter Tofu +Toasted Sunflower Seeds=Geröstete Sonnenblumensamen +Bottle of Sunflower Oil=Flasche Sonnenblumenöl +Sunflower Seed Bread=Sonnenblumensamenbrot +Vanilla Extract=Vanilleextrakt +Jerusalem Artichokes=Jerusalemartischocken +Bread=Brot +Cookie=Keks +Golden Carrot=Goldene Möhre +Beetroot Soup=Rote-Beete-Suppe +Sugar=Zucker +Baked Potato=Ofenkartoffel +Saucepan=Kasserolle +Cooking Pot=Kochtopf +Baking Tray=Kuchenblech +Skillet=Bratpfanne +Mortar and Pestle=Mörser und Stößel +Cutting Board=Schneidebrett +Juicer=Entsafter +Glass Mixing Bowl=Glasschüssel +Bottle of Ethanol=Flasche Ethanol +Straw=Stroh +Bottle of Hemp Oil=Flasche mit Hanföl +Hemp Fibre=Hanffaser +Hemp Block=Hanfblock +Hemp Rope=Hanfseil +Scarecrow Bottom=Vogelscheuchengestell +Wooden Bowl=Holzschale +String=Faden +Jack 'O Lantern (punch to turn on and off)=Kürbislaterne (Hauen zum Ein- und Ausschalten) +Savanna Soil=Savannenerde +Wet Savanna Soil=Feuchte Savannenerde +Soil=Ackerboden +Wet Soil=Feuchter Ackerboden diff --git a/mods/farming/locale/farming.en.tr b/mods/farming/locale/farming.en.tr new file mode 100644 index 00000000..6f83b3e4 --- /dev/null +++ b/mods/farming/locale/farming.en.tr @@ -0,0 +1,186 @@ +# textdomain: farming + Crop= +Artichoke= +Asparagus= +Barley Seed= +Barley= +Green Beans= +Bean Pole (place on soil before planting beans)= +Beetroot= +Beetroot Soup= +Blackberry= +Blackberries= +Wild Blueberries= +Blueberry= +Blueberry Muffin= +Blueberry Pie= +Cabbage= +Carrot= +Carrot Juice= +Golden Carrot= +Chili Pepper= +Bowl of Chili= +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans= +Cookie= +Bar of Dark Chocolate= +Chocolate Block= +Coffee= +Coffee Beans= +Cup of Coffee= +Banana= +Banana Leaves= +Orange= +Corn= +Corn on the Cob= +Popcorn= +Cornstarch= +Bottle of Ethanol= +Wild Cotton= +Cotton Seed= +Cotton= +String= +Cucumber= +Eggplant= +Glass of Water= +Sugar= +Sugar Cube= +Caramel= +Salt= +Mayonnaise= +Rose Water= +Turkish Delight= +Garlic Bread= +Donut= +Chocolate Donut= +Apple Donut= +Porridge= +Jaffa Cake= +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove= +Garlic= +Garlic Braid= +Ginger= +Grapes= +Trellis (place on soil before planting grapes)= +Hemp= +Hemp Seed= +Hemp Leaf= +Bottle of Hemp Oil= +Hemp Fibre= +Hemp Block= +Hemp Rope= +Hoe= +Wooden Hoe= +Stone Hoe= +Steel Hoe= +Bronze Hoe= +Mese Hoe= +Diamond Hoe= +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)= +Mithril Scythe (Use to harvest and replant crops)= +Seed= +Lettuce= +Melon Slice= +Melon= +Mint= +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion= +Onion Soup= +Parsley= +Pea= +Pea Pod= +Pea Soup= +Pepper= +Peppercorn= +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper= +Pineapple Top= +Pineapple= +Pineapple Ring= +Pineapple Juice= +Potato= +Baked Potato= +Cucumber and Potato Salad= +Pumpkin Slice= +Jack 'O Lantern (punch to turn on and off)= +Scarecrow Bottom= +Pumpkin Bread= +Pumpkin Dough= +Pumpkin= +Raspberry= +Raspberries= +Raspberry Smoothie= +Rhubarb= +Rhubarb Pie= +Rice Seed= +Rice= +Rice Bread= +Rice Flour= +Rye seed= +Rye= +Oat seed= +Oats= +Multigrain Flour= +Multigrain Bread= +Savanna Soil= +Wet Savanna Soil= +Soil= +Wet Soil= +Soy= +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry= +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato= +Tomato Soup= +Wooden Bowl= +Saucepan= +Cooking Pot= +Baking Tray= +Skillet= +Mortar and Pestle= +Cutting Board= +Juicer= +Glass Mixing Bowl= +Vanilla= +Vanilla Extract= +Wheat Seed= +Wheat= +Straw= +Flour= +Bread= +Sliced Bread= +Toast= +Toast Sandwich= diff --git a/mods/farming/locale/farming.eo.tr b/mods/farming/locale/farming.eo.tr new file mode 100644 index 00000000..75f8bd4b --- /dev/null +++ b/mods/farming/locale/farming.eo.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke= +Asparagus= +Barley Seed=Hordea Semo +Barley=Hordeo +Green Beans=Verdaj Fazeoloj +Bean Pole (place on soil before planting beans)=Fazeola Poluso (metu sur grundo antaÅ­ planti fabojn) +Beetroot=Betoto +Beetroot Soup=Betota Supo +Blackberries= +Wild Blueberries= +Blueberry Muffin=Mirtila Mufino +Blueberry Pie=Mirtila Torto +Cabbage= +Carrot=Karoto +Carrot Juice=Karota Suko +Golden Carrot=Ora Karoto +Chili Pepper=Kapsiketo +Bowl of Chili=Bovlo da Kapsiketo +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans=Kakaa Faboj +Cookie=Kuketo +Bar of Dark Chocolate=Stango de Malhela Ĉokolado +Chocolate Block=Bloko de Ĉokolado +Coffee Beans=Kafaj Seboj +Cup of Coffee=Taso da Kafo +Banana=Banano +Banana Leaves=Bananaj Folioj +Orange=OranÄo +Corn=Maizo +Corn on the Cob=Maiza sur la Spadiko +Popcorn= +Cornstarch=Maizamelo +Bottle of Ethanol=Botelo da Etanolo +Wild Cotton= +Cotton Seed=Kotona Semo +Cotton=Kotono +String=Åœnuro +Cucumber=Kukumo +Eggplant= +Glass of Water= +Sugar=Sukero +Sugar Cube= +Caramel= +Salt=Salo +Mayonnaise= +Rose Water=Roza Akvo +Turkish Delight=Turka Delico +Garlic Bread=Ajla Pano +Donut=Benjeto +Chocolate Donut=Ĉokolada Benjeto +Apple Donut=Poma Benjeto +Porridge=Kaĉo +Jaffa Cake=Jafa Kuko +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=Ajlokloko +Garlic=Ajlo +Garlic Braid=Ajla Plektaĵo +Ginger= +Grapes=Vinberoj +Trellis (place on soil before planting grapes)=Trellis (meti sur grundo antaÅ­ planti vinberojn) +Hemp Seed=Kanaba Semo +Hemp Leaf=Kanaba Folio +Bottle of Hemp Oil=Botelo da Kanaba Oleo +Hemp Fibre=Kanaba Fibro +Hemp Block=Kanaba Bloko +Hemp Rope=Kanaba Åœnuro +Hoe=Sarkilo +Wooden Hoe=Ligna Sarkilo +Stone Hoe=Åœtona Sarkilo +Steel Hoe=Åœtala Sarkilo +Bronze Hoe=Bronza Sarkilo +Mese Hoe=Mesea Sarkilo +Diamond Hoe=Diamanta Sarkilo +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)= +Mithril Scythe (Use to harvest and replant crops)= +Seed=Semo +Lettuce= +Melon Slice=Tranĉaĵo de Melono +Melon=Melono +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion=Cepo +Onion Soup= +Parsley= +Pea Pod=Pizujo +Pea Soup=Piza Supo +Peppercorn=Piprograjno +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=Muelita Pipro +Pineapple Top=Pinto de Ananaso +Pineapple=Ananaso +Pineapple Ring=Ananasa Ringo +Pineapple Juice=Ananasa Suko +Potato=Terpomo +Baked Potato=Bakita Terpomo +Cucumber and Potato Salad=Salato de Kukumo kaj Terpomo +Pumpkin Slice=Tranĉaĵo de Kukurbo +Jack 'O Lantern (punch to turn on and off)=Kukurba Lanterno (punu por Åalti kaj malÅalti) +Scarecrow Bottom=Birdotimigilo Fundo +Pumpkin Bread=Kukurba Pano +Pumpkin Dough=Kukurba Pasto +Pumpkin=Kukurbo +Raspberries=Framboj +Raspberry Smoothie=Fraba Glataĵo +Rhubarb=Rabarbo +Rhubarb Pie=Rabarba Torto +Rice Seed= +Rice=Rizo +Rice Bread=Riza Pano +Rice Flour=Riza Faruno +Rye seed=Sekala Semo +Rye=Sekalo +Oat seed=Avena Semo +Oats= +Multigrain Flour=Multgrajna Faruno +Multigrain Bread=Multgrajna Pano +Savanna Soil= +Wet Savanna Soil= +Soil=Tero +Wet Soil=Malseka Tero +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry=Frago +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=Tomato +Tomato Soup= +Wooden Bowl=Ligna Bovlo +Saucepan=Kaserolo +Cooking Pot=Kuirpoto +Baking Tray=Baka Pleto +Skillet=Pato +Mortar and Pestle=Pistujo +Cutting Board=Tranĉa Tabulo +Juicer=Spremilo +Glass Mixing Bowl=Vitra Miksa Bovlo +Vanilla= +Vanilla Extract= +Wheat Seed=Tritika Semo +Wheat=Tritiko +Straw=Pajlo +Flour=Faruno +Bread=Pano +Sliced Bread=Tranĉita Pano +Toast=Toasto +Toast Sandwich=Toasta Sandviĉo diff --git a/mods/farming/locale/farming.es.tr b/mods/farming/locale/farming.es.tr new file mode 100644 index 00000000..e3d989a0 --- /dev/null +++ b/mods/farming/locale/farming.es.tr @@ -0,0 +1,177 @@ +# textdomain: farming +Banana=Banana +Banana Leaves=Hojas de Banana +Orange=Naranja +Artichoke=Alcachofa +Asparagus=Esparragos +Barley Seed=Semillas de Cebada +Barley=Cebada +Green Beans=Frijoles +Bean Pole (place on soil before planting beans)=Varas para frijoles (colocar antes de plantar frijoles) +Beetroot=Remolacha +Beetroot Soup=Sopa de Remolacha +Blackberries=Zarzamoras +Wild Blueberries=Arándanos +Blueberry Muffin=Bizcocho de Arándanos +Blueberry Pie=Pastel de Arándanos +Cabbage=Coliflor +Carrot=Zanahoria +Carrot Juice=Zumo de Zanahoria +Golden Carrot=Zanahoria Dorada +Chili Pepper=Guindilla +Bowl of Chili=Tazón de chile +Chili Powder=Chile en polvo +Raw Cocoa Beans=Granos de Cacao Verde +Cocoa Beans=Granos de Cacao +Cookie=Galleta +Bar of Dark Chocolate=Barra de Chocolate amargo +Chocolate Block=Bloque de Chocolate +Coffee Beans=Granos de Café +Cup of Coffee=Taza de Café +Corn=Mazorca de Maiz +Corn on the Cob=Mazorca Frita +Popcorn=Palomitas +Cornstarch=Maicena +Bottle of Ethanol=Botella de Etanol +Wild Cotton=Algodón silvestre +Cotton Seed=Semillas de Algodón +Cotton=Algodón +String=Cuerda +Cucumber=Pepino +Eggplant=Berenjena +Garlic clove=Diente de Ajo +Garlic=Ajo +Garlic Braid=Ristra de Ajos +Ginger=Jengibre +Grapes=Uvas +Trellis (place on soil before planting grapes)=Emparrado (colocar antes de sembrar uvas) +Hemp Seed=Semillas de Cáñamo +Hemp Leaf=Hoja de Cáñamo +Bottle of Hemp Oil=Aceite de Cáñamo +Hemp Fibre=Fibra de Cáñamo +Hemp Block=Bloque de Cáñamo +Hemp Rope=Cuerda de Cáñamo +Lettuce=Lechuga +Melon Slice=Rodaja de Sandia +Melon=Sandia +Mint Seeds=Semillas de Menta +Mint Leaf=Hoja de Menta +Mint Tea=Té de Menta +Onion=Cebolla +Onion Soup=Sopa de Cebolla +Parsley=Perejil +Pea Pod=Vaina de Guisantes +Pea Soup=Sopa de Guisantes +Peppercorn=Pimienta en Grano +Green Pepper=Pimiento Verde +Yellow Pepper=Pimiento Amarillo +Red Pepper=Pimiento Rojo +Ground Pepper=Pimienta Molida +Pineapple Top=Semilla de Piña +Pineapple=Piña +Pineapple Ring=Rodaja de Piña +Pineapple Juice=Zumito de Piña +Potato=Patata +Baked Potato=Papa Asada +Cucumber and Potato Salad=Ensalada de Pepino y Patatas +Pumpkin Slice=Trozo de Calabaza +Jack 'O Lantern (punch to turn on and off)=Linterna Calabaza (golpear para encender o apagar) +Scarecrow Bottom=Cuerpo de Espantapájaros +Pumpkin Bread=Pan de Calabaza +Pumpkin Dough=Pasta de Calabaza +Pumpkin=Calabaza +Raspberries=Frambuesas +Raspberry Smoothie=Crema de Frambuesas +Rhubarb=Ruibarbo +Rhubarb Pie=Bizcocho de Ruibarbo +Rice Seed=Granos de Arroz +Rice=Arroz +Rice Bread=Pan de Arroz +Rice Flour=Harina de Arroz +Rye seed=Semillas de Centeno +Rye=Centeno +Oat seed=Semillas de Avena +Oats=Avena +Multigrain Flour=Harina Multigrano +Multigrain Bread=Pan Multigrano +Soy Pod=Vaina de Soja +Soy Sauce=Aceite de Soja +Soy Milk=Leche de Soja +Tofu=Tofu +Cooked Tofu=Tofu Cocinado +Spinach=Espinacas +Strawberry=Fresa +Sunflower=Girasol +Sunflower Seeds=Semillas de Girasol +Toasted Sunflower Seeds=Pipas de Girasol +Bottle of Sunflower Oil=Aceite de Girasol +Sunflower Seed Bread=Pan con Pipas +Tomato=Tomate +Tomato Soup=Sopa de Tomate +Vanilla=Vainilla +Vanilla Extract=Extracto de Vainilla +Wheat Seed=Semillas de Trigo +Wheat=Trigo +Straw=Heno +Flour=Harina +Bread=Pan +Sliced Bread=Rebanada de Pan +Toast=Tostada +Toast Sandwich=Bocadillo de Pan +Glass of Water=Vaso de Agua +Sugar=Azucar +Sugar Cube=Bloque de Azucar +Caramel=Caramelo +Salt=Sal +Salt crystal=Cristal de Sal +Mayonnaise=Mayonesa +Rose Water=Agua de Rosas +Turkish Delight=Delicias Turcas +Garlic Bread=Pan con Ajito +Donut=Rosquilla +Chocolate Donut=Rosquilla de Chocolate +Apple Donut=Rosquilla de Manzana +Porridge=Gachas +Jaffa Cake=Galleta Jaffa +Apple Pie=Pastel de Manzana +Cactus Juice=Zumo de Cactus +Pasta=Pasta +Mac & Cheese=Pasta con queso +Spaghetti=Espaguetis +Bibimbap=Bibimbap +Burger=Hamburguesa +Salad=Ensalada +Triple Berry Smoothie=Helado Multifrutas +Spanish Potatoes=Tortilla Española +Potato omelet=Tortilla de Patatas +Paella=Paella +Vanilla Flan=Flan de Vainilla +Vegan Cheese=Queso Vegano +Onigiri=Onigiri +Gyoza=Empanadilla Japonesa +Mochi=Mochi +Gingerbread Man=Moñequito de Jengibre +Hoe=Azada +Wooden Hoe=Azada de Madera +Stone Hoe=Azada de Piedra +Steel Hoe=Azada de Acero +Bronze Hoe=Azada de Bronce +Mese Hoe=Azada de Mese +Diamond Hoe=Azada de Diamante +Wood Hoe=Azada de Madera +Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba Azada (usar o lanzar a tierra para ararla) +Mithril Scythe (Use to harvest and replant crops)=Guadaña de Mithril +Seed=Semilla +Savanna Soil=Tierra de Cultivo de Sabana +Wet Savanna Soil=Tierra de Cultivo de Sabana Humeda +Soil=Tierra de Cultivo +Wet Soil=Tierra de Cultivo Humeda +Wooden Bowl=Cuenco de Madera +Saucepan=Cazo +Cooking Pot=Olla +Baking Tray=Bandeja para Hornear +Skillet=Sartén +Mortar and Pestle=Mortero +Cutting Board=Tabla de cortar +Juicer=Exprimidor +Glass Mixing Bowl=Bol de Mezcla diff --git a/mods/farming/locale/farming.fr.tr b/mods/farming/locale/farming.fr.tr new file mode 100644 index 00000000..532e234b --- /dev/null +++ b/mods/farming/locale/farming.fr.tr @@ -0,0 +1,177 @@ +# textdomain: farming +Banana=Banane +Banana Leaves=Feuilles de banane +Orange=Orange +Artichoke=Artichaut +Asparagus=Asperge +Barley Seed=Graine d'orge +Barley=Orge +Green Beans=Haricots verts +Bean Pole (place on soil before planting beans)=Tuteur pour haricots (placer sur le sol avant de planter des haricots) +Beetroot=Betterave +Beetroot Soup=Soupe de betterave +Blackberries=Mûres +Wild Blueberries=Myrtilles sauvages +Blueberry Muffin=Muffin aux myrtilles +Blueberry Pie=Tarte aux myrtilles +Cabbage=Chou +Carrot=Carotte +Carrot Juice=Jus de carotte +Golden Carrot=Carotte dorée +Chili Pepper=Piment fort +Bowl of Chili=Bol de chilli +Chili Powder=Poudre de piment +Raw Cocoa Beans=Fèves de cacao brutes +Cocoa Beans=Fèves de cacao +Cookie=Biscuit +Bar of Dark Chocolate=Tablette de chocolat noir +Chocolate Block=Bloc de chocolat +Coffee Beans=Grains de café +Cup of Coffee=Tasse de café +Corn=Maïs +Corn on the Cob=Cobette (maïs cuit) +Popcorn=Popcorn +Cornstarch=Fécule de maïs +Bottle of Ethanol=Bouteille d'éthanol +Wild Cotton=Coton sauvage +Cotton Seed=Graines de coton +Cotton=Coton +String=Ficelle +Cucumber=Concombre +Eggplant=Aubergine +Garlic clove=Gousse d'ail +Garlic=Tête d'ail +Garlic Braid=Ail tressé +Ginger=Gingembre +Grapes=Raisins +Trellis (place on soil before planting grapes)=Treillis (placer sur le sol avant de planter la vigne) +Hemp Seed=Graines de chanvre +Hemp Leaf=Feuille de chanvre +Bottle of Hemp Oil=Bouteille d'huile de chanvre +Hemp Fibre=Fibre de chanvre +Hemp Block=Bloc de chanvre +Hemp Rope=Corde de chanvre +Lettuce=Laitue +Melon Slice=Tranche de melon +Melon=Melon +Mint Seeds=Graine de menthe +Mint Leaf=Feuille de menthe +Mint Tea=Thé à la menthe +Onion=Oignon +Onion Soup=Soupe à l'oignon +Parsley=Persil +Pea Pod=Cosse de petit-pois +Pea Soup=Soupe de petit-pois +Peppercorn=Grain de poivre +Green Pepper=Poivron vert +Yellow Pepper=Poivron jaune +Red Pepper=Poivron rouge +Ground Pepper=Poivre moulu +Pineapple Top=Pousse d'ananas +Pineapple=Ananas +Pineapple Ring=Tranche d'ananas +Pineapple Juice=Jus d'ananas +Potato=Pomme de terre +Baked Potato=Pomme de terre cuite +Cucumber and Potato Salad=Salade de pomme de terre et concombre +Pumpkin Slice=Tranche de citrouille +Jack 'O Lantern (punch to turn on and off)=Citrouille d'halloween (Frapper pour allumer et éteindre) +Scarecrow Bottom=Base d'épouventail +Pumpkin Bread=Pain à la citrouille +Pumpkin Dough=Pâton de pain à la citrouille +Pumpkin=Citrouille +Raspberries=Framboises +Raspberry Smoothie=Smoothie aux framboises +Rhubarb=Rhubarbe +Rhubarb Pie=Tarte à la rhubarbe +Rice Seed=Riz +Rice=Riz +Rice Bread=Pain de riz +Rice Flour=Farine de riz +Rye seed=Grains de seigle +Rye=Seigle +Oat seed=Grains d'orge +Oats=Avoine +Multigrain Flour=Farine multi-céréales +Multigrain Bread=Pain aux céréales +Soy Pod=Cosse de soja +Soy Sauce=Sauce de soja +Soy Milk=Lait de soja +Tofu=Tofu +Cooked Tofu=Tofu cuit +Spinach=Épinard +Strawberry=Fraise +Sunflower=Tournesol +Sunflower Seeds=Graines de tournesol +Toasted Sunflower Seeds=Graines de tournesol grillées +Bottle of Sunflower Oil=Bouteille d'huile de tournesol +Sunflower Seed Bread=Pain de graines de tournesol +Tomato=Tomate +Tomato Soup=Soupe de tomate +Vanilla=Vanille +Vanilla Extract=Extrait de vanille +Wheat Seed=Grain de blé +Wheat=Blé +Straw=Paille +Flour=Farine +Bread=Pain +Sliced Bread=Tranche de pain +Toast=Pain grillé +Toast Sandwich=Sandwich au pain grillé +Glass of Water=Verre d'eau +Sugar=Sucre +Sugar Cube=Morceau de sucre +Caramel=Caramel +Salt=Sel +Salt crystal=Cristaux de sel +Mayonnaise=Mayonnaise +Rose Water=Eau de rose +Turkish Delight=Douceur turque +Garlic Bread=Pain à l'ail +Donut=Beignet +Chocolate Donut=Beignet au chocolat +Apple Donut=Beignet aux pommes +Porridge=Gruau de céréales +Jaffa Cake=Petit gâteau à l'orange "Jaffa" +Apple Pie=Tarte aux pommes +Cactus Juice=Jus de cactus +Pasta=Pâtes +Mac & Cheese=Grâtin de pâtes +Spaghetti=Spaghetti +Bibimbap=Bibimbap +Burger=Hamburger +Salad=Salade verte +Triple Berry Smoothie=Smoothie aux trois baies +Spanish Potatoes=Patates sautées à l'Espagnole +Potato omelet=Omelette aux pommes de terre +Paella=Paëlla +Vanilla Flan=Flan +Vegan Cheese=Faumage végan +Onigiri=Onigiri +Gyoza=Gyoza +Mochi=Mochi +Gingerbread Man=Bonhomme en pain d'épice +Hoe=Binette +Wooden Hoe=Binette en bois +Stone Hoe=Binette en pierre +Steel Hoe=Binette en acier +Bronze Hoe=Binette en bronze +Mese Hoe=Binette en mese +Diamond Hoe=Binette en diamant +Wood Hoe=Binette en bois +Hoe Bomb (use or throw on grassy areas to hoe land)=Bombe à binnage (Actionner ou lancer sur une zone herbeuse pour la binner) +Mithril Scythe (Use to harvest and replant crops)=Faux de mithril (Utiliser pour récolter et replanter les cultures) +Seed=Graine +Savanna Soil=Terre de la savane binnée +Wet Savanna Soil=Terre humide et binnée de la savane +Soil=Terre binnée +Wet Soil=Terre humide et binnée +Wooden Bowl=Bol en bois +Saucepan=Casserole +Cooking Pot=Marmitte +Baking Tray=Lèche-frite +Skillet=Poêle +Mortar and Pestle=Mortier et pilon +Cutting Board=Planche à découper +Juicer=Presse-agrumes +Glass Mixing Bowl=Terrine en verre diff --git a/mods/farming/locale/farming.hu.tr b/mods/farming/locale/farming.hu.tr new file mode 100644 index 00000000..9cf75c9f --- /dev/null +++ b/mods/farming/locale/farming.hu.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke=Articsóka +Asparagus=Spárga +Barley Seed=Ãrpamag +Barley=Ãrpa +Green Beans=Zöldbab +Bean Pole (place on soil before planting beans)=Karó babhoz (szúrd a földbe és oda vess babot) +Beetroot=cékla +Beetroot Soup=céklaleves +Blackberries=Szeder +Wild Blueberries=Vadáfonya +Blueberry Muffin=Ãfonyamuffin +Blueberry Pie=Ãfonyatorta +Cabbage=Káposzta +Carrot=Répa +Carrot Juice=Répalé +Golden Carrot=Aranyrépa +Chili Pepper=Chilipaprika +Bowl of Chili=Chilis tál +Chili Powder=Chilipor +Raw Cocoa Beans=Nyers kakaóbab +Cocoa Beans=Kakaóbab +Cookie=Süti +Bar of Dark Chocolate=Rúd étcsoki +Chocolate Block=Csokiblokk +Coffee Beans=Kávébab +Cup of Coffee=Csésze kávé +Banana=Banán +Banana Leaves=Banánlevél +Orange=Narancs +Corn=Kukorica +Corn on the Cob=FÅ‘tt kukorica +Popcorn=Pattogatott kukorica +Cornstarch=KeményítÅ‘ +Bottle of Ethanol=Üveg etanol +Wild Cotton=Vadgyapot +Cotton Seed=Gyapotmag +Cotton=Gyapot +String=Madzag +Cucumber=Uborka +Eggplant=Padlizsán +Glass of Water=Pohár víz +Sugar=Cukor +Sugar Cube=Kockacukor +Caramel=Karamell +Salt=Só +Mayonnaise=Majonéz +Rose Water=Rózsavíz +Turkish Delight=Török desszert +Garlic Bread=Fokhagymás kenyér +Donut=Fánk +Chocolate Donut=Csokis fánk +Apple Donut=Almás fánk +Porridge=Zabkása +Jaffa Cake=Jaffatorta +Apple Pie=Almáspita +Cactus Juice=Kaktuszlé +Pasta=Tészta +Mac & Cheese=Sajtos makaróni +Spaghetti=Spagetti +Bibimbap=Bibimbap +Burger=Burger +Salad=Saláta +Triple Berry Smoothie=Hárombogyós smoothie +Spanish Potatoes=Tepsis krumpli +Potato omelet=Krumplis rántotta +Paella=Paella +Vanilla Flan=Vaníliás gyümölcstorta +Vegan Cheese=Vegán sajt +Onigiri=Onigiri +Gyoza=Gyoza +Mochi=Mochi +Gingerbread Man=Mézeskalács-emberke +Garlic clove=Gerezd fokhagyma +Garlic=Fokhagyma +Garlic Braid=Fokhagymafüzér +Ginger=Gyömbér +Grapes=SzÅ‘lÅ‘ +Trellis (place on soil before planting grapes)=Karó szÅ‘lÅ‘höz (szúrd a földbe és oda vess babot) +Hemp Seed=Kendermag +Hemp Leaf=Kenderlevél +Bottle of Hemp Oil=Üveg kenderolaj +Hemp Fibre=Kenderrost +Hemp Block=Kenderblokk +Hemp Rope=Kenderkötél +Hoe=Kapa +Wooden Hoe=Fakapa +Stone Hoe=KÅ‘kapa +Steel Hoe=Acélkapa +Bronze Hoe=Bronzkapa +Mese Hoe=Mesekapa +Diamond Hoe=Gyémántkapa +Wood Hoe=Fakapa (2) +Hoe Bomb (use or throw on grassy areas to hoe land)=Kapabomba (használd vagy dobd füves területre) +Mithril Scythe (Use to harvest and replant crops)=Mithrilkasza (használd termények begyűjtéséhez és újravetéséhez) +Seed=Mag +Lettuce=Saláta +Melon Slice=Szelet dinnye +Melon=Dinnye +Mint Seeds=Mentamag +Mint Leaf=Mentalevél +Mint Tea=Mentatea +Onion=Hagyma +Onion Soup=Hagymaleves +Parsley=Petrezselyem +Pea Pod=Hüvelyes borsó +Pea Soup=Borsóleves +Peppercorn=Borsszemek +Green Pepper=Zöldpaprika +Yellow Pepper=Sárga paprika +Red Pepper=Pirospaprika +Ground Pepper=Årölt bors +Pineapple Top=Ananászüstök +Pineapple=Ananász +Pineapple Ring=Szelet ananász +Pineapple Juice=Ananászlé +Potato=Krumpli +Baked Potato=Sült krumpli +Cucumber and Potato Salad=Uborkás krumplisaláta +Pumpkin Slice=Szelet tök +Jack 'O Lantern (punch to turn on and off)=Töklámpás (ütéssel kapcsold ki és be) +Scarecrow Bottom=MadárijesztÅ‘ alja +Pumpkin Bread=Tökkenyér +Pumpkin Dough=Töktészta +Pumpkin=Tök +Raspberries=Málna +Raspberry Smoothie=Málnasmoothie +Rhubarb=Rebarbara +Rhubarb Pie=Rebarbaratorta +Rice Seed=Rizsmag +Rice=Rizs +Rice Bread=Rizskenyér +Rice Flour=Rizsliszt +Rye seed=Rozsmag +Rye=Rozs +Oat seed=Zabmag +Oats=Zab +Multigrain Flour=Vegyesliszt +Multigrain Bread=Vegyesliszt-kenyér +Savanna Soil=Szavannatalaj +Wet Savanna Soil=Nedves szavannatalaj +Soil=Talaj +Wet Soil=Nedves talaj +Soy Pod=Hüvelyes szója +Soy Sauce=Szójaszósz +Soy Milk=Szójatej +Tofu=Tofu +Cooked Tofu=FÅ‘tt tofu +Spinach=Spenót +Strawberry=Eper +Sunflower=Napraforgó +Sunflower Seeds=Napraforgómag +Toasted Sunflower Seeds=Szotyi +Bottle of Sunflower Oil=Üveg napraforgó-olaj +Sunflower Seed Bread=Napraforgómagos kenyér +Tomato=Paradicsom +Tomato Soup=Paradicsomleves +Wooden Bowl=Fatál +Saucepan=Szószostál +Cooking Pot=FÅ‘zÅ‘edény +Baking Tray=SütÅ‘tál +Skillet=SerpenyÅ‘ +Mortar and Pestle=Mozsár +Cutting Board=Vágódeszka +Juicer=Facsaró +Glass Mixing Bowl=Üver keverÅ‘edény +Vanilla=Vanília +Vanilla Extract=Vaníliakivonat +Wheat Seed=Búzamag +Wheat=Búza +Straw=Szívószál +Flour=Liszt +Bread=Kenyér +Sliced Bread=Szeletelt kenyér +Toast=Pirítós +Toast Sandwich=Pirítósszendvics diff --git a/mods/farming/locale/farming.it.tr b/mods/farming/locale/farming.it.tr new file mode 100644 index 00000000..694b2e62 --- /dev/null +++ b/mods/farming/locale/farming.it.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke= +Asparagus= +Barley Seed=Seme d'orzo +Barley=Orzo +Green Beans=Fagiolini +Bean Pole (place on soil before planting beans)=Palina per fagiolini (mettila sul terreno coltivabile prima di piantare i fagiolini) +Beetroot=Barbabietola +Beetroot Soup=Zuppa di barbabietola +Blackberries= +Wild Blueberries=Mirtilli Selvatici +Blueberry Muffin=Focaccina di mirtilli +Blueberry Pie=Tortino di mirtilli +Cabbage= +Carrot=Carota +Carrot Juice=Succo di carota +Golden Carrot=Carota d'oro +Chili Pepper=Peperoncino +Bowl of Chili=Ciotola di peperoncino +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans=Chicchi di cacao +Cookie=Biscotto +Bar of Dark Chocolate=Barra di cioccolato fondente +Chocolate Block=Blocco di cioccolato +Coffee Beans=Chicchi di caffè +Cup of Coffee=Tazza di caffè +Banana=Banana +Banana Leaves=Foglie di banano +Orange=Arancia +Corn=Mais +Corn on the Cob=Pannocchia arrostita +Popcorn= +Cornstarch=Amido di mais +Bottle of Ethanol=Bottiglia di alcol etilico +Wild Cotton= +Cotton Seed=Seme di cotone +Cotton=Cotone +String=Filo +Cucumber=Cetriolo +Eggplant= +Glass of Water= +Sugar=Zucchero +Sugar Cube= +Caramel= +Salt=Sale +Mayonnaise= +Rose Water=Acqua di rose +Turkish Delight=Lokum +Garlic Bread=Pane all'aglio +Donut=Ciambella +Chocolate Donut=Ciambella al cioccolato +Apple Donut=Ciambella alla mela +Porridge=Porridge +Jaffa Cake=Torta di jaffa +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=Spicchio d'aglio +Garlic=Aglio +Garlic Braid=Treccia d'aglio +Ginger= +Grapes=Chicchi d'uva +Trellis (place on soil before planting grapes)=Graticcio (mettilo sul terreno coltivabile prima di piantare i chicchi d'uva) +Hemp Seed=Seme di canapa +Hemp Leaf=Foglia di canapa +Bottle of Hemp Oil=Bottiglia d'olio di canapa +Hemp Fibre=Fibra di canapa +Hemp Block=Blocco di canapa +Hemp Rope=Corda di canapa +Hoe=Zappa +Wooden Hoe=Zappa di legno +Stone Hoe=Zappa di pietra +Steel Hoe=Zappa d'acciaio +Bronze Hoe=Zappa di bronzo +Mese Hoe=Zappa di mese +Diamond Hoe=Zappa di diamante +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)=Bomba zappa (usala o lanciala sulle aree erbose per zappare il terreno) +Mithril Scythe (Use to harvest and replant crops)= +Seed=Seme +Lettuce= +Melon Slice=Fetta d'anguria +Melon=Anguria +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion=Cipolla +Onion Soup= +Parsley= +Pea Pod=Baccello di piselli +Pea Soup=Zuppa di piselli +Peppercorn=Grano di pepe +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=Pepe macinato +Pineapple Top=Cima d'ananas +Pineapple=Ananas +Pineapple Ring=Anello d'ananas +Pineapple Juice=Succo d'ananas +Potato=Patata +Baked Potato=Patata arrostita +Cucumber and Potato Salad=Insalata di patate e cetrioli +Pumpkin Slice=Fetta di zucca +Jack 'O Lantern (punch to turn on and off)=Jack Lanterna (colpirlo per accenderlo e spegnerlo) +Scarecrow Bottom=Fondo dello spaventapasseri +Pumpkin Bread=Pane alla zucca +Pumpkin Dough=Pasta di zucca +Pumpkin=Zucca +Raspberries=Lamponi +Raspberry Smoothie=Purea di lamponi +Rhubarb=Rabarbaro +Rhubarb Pie=Tortino al rabarbaro +Rice Seed= +Rice=Riso +Rice Bread=Pane di riso +Rice Flour=Farina di riso +Rye seed=Seme di segale +Rye=Segale +Oat seed=Seme d'avena +Oats= +Multigrain Flour=Farina multicereale +Multigrain Bread=Pane multicereale +Savanna Soil= +Wet Savanna Soil= +Soil=Terreno coltivabile +Wet Soil=Terreno coltivabile bagnato +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry=Fragola +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=Pomodoro +Tomato Soup= +Wooden Bowl=Ciotola di legno +Saucepan=Casseruola +Cooking Pot=Pentola da cottura +Baking Tray=Teglia da forno +Skillet=Padella +Mortar and Pestle=Mortaio e pestello +Cutting Board=Tagliere +Juicer=Spremiagrumi +Glass Mixing Bowl=Terrina di vetro +Vanilla= +Vanilla Extract= +Wheat Seed=Seme di grano +Wheat=Grano +Straw=Paglia +Flour=Farina +Bread=Pane +Sliced Bread=Pane a fette +Toast=Pane tostato +Toast Sandwich=Panino di pane tostato diff --git a/mods/farming/locale/farming.pt.tr b/mods/farming/locale/farming.pt.tr new file mode 100644 index 00000000..95afd02a --- /dev/null +++ b/mods/farming/locale/farming.pt.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke= +Asparagus= +Barley Seed=Sementes de Cevada +Barley=Cevada +Green Beans=Feijoes Verdes +Bean Pole (place on soil before planting beans)=Apoio de feijao (coloque no solo antes de plantar feijao) +Beetroot= +Beetroot Soup= +Blackberries= +Wild Blueberries=Mirtilos Selvagens +Blueberry Muffin=Muffin de Mirtilos +Blueberry Pie= +Cabbage= +Carrot=Cenoura +Carrot Juice= +Golden Carrot=Cenoura Dourada +Chili Pepper= +Bowl of Chili= +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans=Amendoas de Cacau +Cookie=Cookie +Bar of Dark Chocolate=Barra de Chocolate Preto +Chocolate Block= +Coffee Beans=Grao de Cafe +Cup of Coffee=Xicara de Cafe +Banana= +Banana Leaves= +Orange= +Corn=Milho +Corn on the Cob=Espiga de Milho +Popcorn= +Cornstarch= +Bottle of Ethanol=Garrafa de Etanol +Wild Cotton= +Cotton Seed=Sementes de Algodao +Cotton=Algodao +String= +Cucumber=Pepino +Eggplant= +Glass of Water= +Sugar=Açucar +Sugar Cube= +Caramel= +Salt= +Mayonnaise= +Rose Water= +Turkish Delight= +Garlic Bread= +Donut=Donut +Chocolate Donut=Donut de Chocolate +Apple Donut=Donut de Maça +Porridge= +Jaffa Cake= +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove= +Garlic= +Garlic Braid= +Ginger= +Grapes=Uvas +Trellis (place on soil before planting grapes)=Grade de Ripas (colocar no solo antes de plantar uvas) +Hemp Seed=Sementes de Canhamo +Hemp Leaf=Folha de Canhamo +Bottle of Hemp Oil=Garrafa de Oleo de Canhamo +Hemp Fibre=Fibra de Canhamo +Hemp Block= +Hemp Rope=Corda de Canhamo +Hoe=Enxada +Wooden Hoe=Enxada de Madeira +Stone Hoe=Enxada de Pedra +Steel Hoe=Enxada de Aço +Bronze Hoe=Enxada de Bronze +Mese Hoe=Enxada de Mese +Diamond Hoe=Enxada de Diamante +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)= +Mithril Scythe (Use to harvest and replant crops)= +Seed=Sementes +Lettuce= +Melon Slice=Sementes de Melancia +Melon=Melancia +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion= +Onion Soup= +Parsley= +Pea Pod= +Pea Soup= +Peppercorn= +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper= +Pineapple Top= +Pineapple= +Pineapple Ring= +Pineapple Juice= +Potato=Batata +Baked Potato=Batata Cozida +Cucumber and Potato Salad= +Pumpkin Slice=Pedaço de Abobora +Jack 'O Lantern (punch to turn on and off)=Jack 'O Lantern (Socos para ligar e desligar) +Scarecrow Bottom= +Pumpkin Bread=Pao de Abobora +Pumpkin Dough=Massa de Abobora +Pumpkin=Abobora +Raspberries=Framboesa +Raspberry Smoothie=Batida de Framboesa +Rhubarb=Ruibarbo +Rhubarb Pie=Torta de Ruibarbo +Rice Seed= +Rice= +Rice Bread= +Rice Flour= +Rye seed= +Rye= +Oat seed= +Oats= +Multigrain Flour= +Multigrain Bread= +Savanna Soil= +Wet Savanna Soil= +Soil=Solo +Wet Soil=Solo Seco +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry= +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=Tomate +Tomato Soup= +Wooden Bowl= +Saucepan= +Cooking Pot= +Baking Tray= +Skillet= +Mortar and Pestle= +Cutting Board= +Juicer= +Glass Mixing Bowl= +Vanilla= +Vanilla Extract= +Wheat Seed=Sementes de Trigo +Wheat=Trigo +Straw=Palha +Flour=Farinha +Bread=Pao +Sliced Bread= +Toast= +Toast Sandwich= diff --git a/mods/farming/locale/farming.ru.tr b/mods/farming/locale/farming.ru.tr new file mode 100644 index 00000000..e78e043a --- /dev/null +++ b/mods/farming/locale/farming.ru.tr @@ -0,0 +1,186 @@ +# textdomain: farming + Crop=. +Artichoke=Ðртишок +Asparagus=Спаржа +Barley Seed=Семена ÑÑ‡Ð¼ÐµÐ½Ñ +Barley=Ячмень +Green Beans=Ð—ÐµÐ»ÐµÐ½Ð°Ñ Ñ„Ð°Ñоль +Bean Pole (place on soil before planting beans)=Жердь Ð´Ð»Ñ Ð±Ð¾Ð±Ð¾Ð²Ñ‹Ñ… (уÑтановите на почву перед поÑадкой бобовых) +Beetroot=Свекла +Beetroot Soup=Борщ +Blackberry=Ежевика +Blackberries=Ежевика +Wild Blueberries=Голубика +Blueberry=Голубика +Blueberry Muffin=ÐšÐµÐºÑ Ñ Ð³Ð¾Ð»ÑƒÐ±Ð¸ÐºÐ¾Ð¹ +Blueberry Pie=Пирог Ñ Ð³Ð¾Ð»ÑƒÐ±Ð¸ÐºÐ¾Ð¹ +Cabbage=КапуÑта +Carrot=Морковь +Carrot Juice=Морковный Ñок +Golden Carrot=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð¼Ð¾Ñ€ÐºÐ¾Ð²ÑŒ +Chili Pepper=Перец чили +Bowl of Chili=МиÑка чили +Chili Powder=Порошок чили +Raw Cocoa Beans=Сырые какао-бобы +Cocoa Beans=Какао-бобы +Cookie=Печенье +Bar of Dark Chocolate=Плитка темного шоколада +Chocolate Block=Шоколадный блок +Coffee=Кофе +Coffee Beans=Кофейные зерна +Cup of Coffee=Чашка кофе +Banana=Банан +Banana Leaves=ЛиÑÑ‚ÑŒÑ Ð±Ð°Ð½Ð°Ð½Ð° +Orange=ÐпельÑин +Corn=Кукуруза +Corn on the Cob=Початок кукурузы +Popcorn=Попкорн +Cornstarch=Кукурузный крахмал +Bottle of Ethanol=Бутылка Ñпирта +Wild Cotton=ДикораÑтущий хлопок +Cotton Seed=Семена хлопка +Cotton=Хлопок +String=Ðить +Cucumber=Огурец +Eggplant=Баклажан +Glass of Water=Стакан воды +Sugar=Сахар +Sugar Cube=КуÑочек Ñахара +Caramel=Карамель +Salt=Соль +Mayonnaise=Майонез +Rose Water=Ð Ð¾Ð·Ð¾Ð²Ð°Ñ Ð²Ð¾Ð´Ð° +Turkish Delight=Рахат-лукум +Garlic Bread=ЧеÑночный хлеб +Donut=Пончик +Chocolate Donut=Шоколадный пончик +Apple Donut=Яблочный пончик +Porridge=Каша +Jaffa Cake=ЯффÑкий пирог +Apple Pie=Яблочный пирог +Cactus Juice=КактуÑовый Ñок +Pasta=ПаÑта +Mac & Cheese=Макароны Ñ Ñыром +Spaghetti=Спагетти +Bibimbap=Бибимпап +Burger=Бургер +Salad=Салат +Triple Berry Smoothie=Тройной Ñгодный Ñмузи +Spanish Potatoes=ИÑпанÑкий картофель +Potato omelet=Картофельный омлет +Paella=ПаÑÐ»ÑŒÑ +Vanilla Flan=Ванильный флан +Vegan Cheese=ВеганÑкий Ñыр +Onigiri=Онигири +Gyoza=Гёдза +Mochi=Моти +Gingerbread Man=ПрÑничный человечек +Garlic clove=Зубчик чеÑнока +Garlic=ЧеÑнок +Garlic Braid=СвÑзка чеÑнока +Ginger=Имбирь +Grapes=Виноград +Trellis (place on soil before planting grapes)=Решетка (поÑтавьте на почву перед поÑадкой винограда) +Hemp=ÐšÐ¾Ð½Ð¾Ð¿Ð»Ñ +Hemp Seed=Семена конопли +Hemp Leaf=ЛиÑÑ‚ конопли +Bottle of Hemp Oil=Бутылка коноплÑного маÑла +Hemp Fibre=КоноплÑное волокно +Hemp Block=Блок конопли +Hemp Rope=ÐŸÐµÐ½ÑŒÐºÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÐµÐ²ÐºÐ° +Hoe=Мотыга +Wooden Hoe=ДеревÑÐ½Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Stone Hoe=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Steel Hoe=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Bronze Hoe=Ð‘Ñ€Ð¾Ð½Ð·Ð¾Ð²Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Mese Hoe=МагичеÑÐºÐ°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Diamond Hoe=ÐÐ»Ð¼Ð°Ð·Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Wood Hoe=ДеревÑÐ½Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Hoe Bomb (use or throw on grassy areas to hoe land)=Мотыгобомба (иÑпользуйте или броÑьте на траву Ð´Ð»Ñ ÐµÐµ обработки) +Mithril Scythe (Use to harvest and replant crops)=ÐœÐ¸Ñ„Ñ€Ð¸Ð»Ð¾Ð²Ð°Ñ ÐºÐ¾Ñа (иÑпользуетÑÑ Ð´Ð»Ñ Ñбора и переÑадки урожаÑ) +Seed=Семена +Lettuce=Латук +Melon Slice=Долька арбуза +Melon=Ðрбуз +Mint=МÑта +Mint Seeds=Семена мÑты +Mint Leaf=ЛиÑÑ‚ мÑты +Mint Tea=Чай Ñ Ð¼Ñтой +Onion=Лук +Onion Soup=Луковый Ñуп +Parsley=Петрушка +Pea=Горох +Pea Pod=Стручок гороха +Pea Soup=Гороховый Ñуп +Pepper=Перец +Peppercorn=Перчинка +Green Pepper=Зеленый перец +Yellow Pepper=Желтый перец +Red Pepper=КраÑный перец +Ground Pepper=Молотый перец +Pineapple Top=Верхушка ананаÑа +Pineapple=ÐÐ½Ð°Ð½Ð°Ñ +Pineapple Ring=Кольцо ананаÑа +Pineapple Juice=ÐнанаÑовый Ñок +Potato=Картофель +Baked Potato=Печеный картофель +Cucumber and Potato Salad=Салат из огурцов и ÐºÐ°Ñ€Ñ‚Ð¾Ñ„ÐµÐ»Ñ +Pumpkin Slice=Ломтик тыквы +Jack 'O Lantern (punch to turn on and off)=Светильник джека (удар Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ выключениÑ) +Scarecrow Bottom=ОÑнование пугала +Pumpkin Bread=Тыквенный хлеб +Pumpkin Dough=Тыквенное теÑто +Pumpkin=Тыква +Raspberry=Малина +Raspberries=Малина +Raspberry Smoothie=Малиновый Ñмузи +Rhubarb=Ревень +Rhubarb Pie=Пирог Ñ Ñ€ÐµÐ²ÐµÐ½ÐµÐ¼ +Rice Seed=Семена риÑа +Rice=Ð Ð¸Ñ +Rice Bread=РиÑовый хлеб +Rice Flour=РиÑÐ¾Ð²Ð°Ñ Ð¼ÑƒÐºÐ° +Rye seed=Зёрна ржи +Rye=Рожь +Oat seed=Семена овÑа +Oats=ÐžÐ²ÐµÑ +Multigrain Flour=ÐœÑƒÐ»ÑŒÑ‚Ð¸Ð·ÐµÑ€Ð½Ð¾Ð²Ð°Ñ Ð¼ÑƒÐºÐ° +Multigrain Bread=Мультизерновой хлеб +Savanna Soil=Ð—ÐµÐ¼Ð»Ñ Ñаванны +Wet Savanna Soil=Ð£Ð²Ð»Ð°Ð¶Ð½ÐµÐ½Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ Ñаванны +Soil=Ð—ÐµÐ¼Ð»Ñ +Wet Soil=Ð£Ð²Ð»Ð°Ð¶Ð½ÐµÐ½Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ +Soy=Ð¡Ð¾Ñ +Soy Pod=Соевый Ñтручок +Soy Sauce=Соевый ÑÐ¾ÑƒÑ +Soy Milk=Соевое молоко +Tofu=Тофу +Cooked Tofu=Вареный тофу +Spinach=Шпинат +Strawberry=ЗемлÑника +Sunflower=ПодÑолнечник +Sunflower Seeds=Семена подÑолнечника +Toasted Sunflower Seeds=Жаренные Ñемена подÑолнечника +Bottle of Sunflower Oil=Бутылка подÑолнечного маÑла +Sunflower Seed Bread=Хлеб из ÑемÑн подÑолнечника +Tomato=Помидор +Tomato Soup=Томатный Ñуп +Wooden Bowl=ДеревÑÐ½Ð½Ð°Ñ Ð¼Ð¸Ñка +Saucepan=КаÑÑ‚Ñ€ÑŽÐ»Ñ +Cooking Pot=Котел +Baking Tray=Противень +Skillet=Сковорода +Mortar and Pestle=Ступка и пеÑтик +Cutting Board=Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ñ‡Ð½Ð°Ñ Ð´Ð¾Ñка +Juicer=Соковыжималка +Glass Mixing Bowl=СтеклÑÐ½Ð½Ð°Ñ Ñ‡Ð°ÑˆÐ° +Vanilla=Ваниль +Vanilla Extract=ЭкÑтракт ванили +Wheat Seed=Зёрна пшеницы +Wheat=Пшеница +Straw=Солома +Flour=Мука +Bread=Хлеб +Sliced Bread=Ðарезанный хлеб +Toast=ТоÑÑ‚ +Toast Sandwich=СÑндвич diff --git a/mods/farming/locale/farming.zh_CN.tr b/mods/farming/locale/farming.zh_CN.tr new file mode 100644 index 00000000..b773d32f --- /dev/null +++ b/mods/farming/locale/farming.zh_CN.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke= +Asparagus= +Barley Seed=大麦ç§å­ +Barley=大麦 +Green Beans=é’豆 +Bean Pole (place on soil before planting beans)=豆æ†ï¼ˆç§è±†å‰å…ˆæ”¾åœ¨åœŸä¸Šï¼‰ +Beetroot=ç”œèœæ ¹ +Beetroot Soup=ç”œèœæ ¹æ±¤ +Blackberries= +Wild Blueberries=è“莓 +Blueberry Muffin=è“莓æ¾ç³• +Blueberry Pie=è“莓派 +Cabbage= +Carrot=胡èåœ +Carrot Juice=胡èåœæ± +Golden Carrot=金èåœ +Chili Pepper=辣椒 +Bowl of Chili=一碗辣椒 +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans=å¯å¯è±† +Cookie=曲奇 +Bar of Dark Chocolate=é»‘å·§å…‹åŠ›æ¡ +Chocolate Block=å·§å…‹åŠ›å— +Coffee Beans=咖啡豆 +Cup of Coffee=一æ¯å’–å•¡ +Banana=香蕉 +Banana Leaves=é¦™è•‰å¶ +Orange=橙色 +Corn=玉米 +Corn on the Cob=玉米棒 +Popcorn= +Cornstarch=玉米淀粉 +Bottle of Ethanol=一瓶乙醇 +Wild Cotton= +Cotton Seed=棉籽 +Cotton=棉花 +String=线 +Cucumber=黄瓜 +Eggplant= +Glass of Water= +Sugar=ç³– +Sugar Cube= +Caramel= +Salt=ç› +Mayonnaise= +Rose Water=çŽ«ç‘°æ± +Turkish Delight=土耳其软糖 +Garlic Bread=蒜香é¢åŒ… +Donut=甜甜圈 +Chocolate Donut=巧克力甜甜圈 +Apple Donut=苹果甜甜圈 +Porridge=ç²¥ +Jaffa Cake=ä½³å‘饼 +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=蒜瓣 +Garlic=大蒜 +Garlic Braid=蒜辫 +Ginger= +Grapes=è‘¡è„ +Trellis (place on soil before planting grapes)=æ£šæž¶ï¼ˆç§æ¤è‘¡è„å‰å…ˆæ”¾åœ¨åœŸå£¤ä¸Šï¼‰ +Hemp Seed=大麻籽 +Hemp Leaf=å¤§éº»å¶ +Bottle of Hemp Oil=一瓶大麻油 +Hemp Fibre=大麻纤维 +Hemp Block=éº»å— +Hemp Rope=麻绳 +Hoe=锄头 +Wooden Hoe=木锄 +Stone Hoe=石锄 +Steel Hoe=钢锄头 +Bronze Hoe=é’铜锄头 +Mese Hoe=黄石锄头 +Diamond Hoe=钻石锄 +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)=锄弹(在è‰åœ°ä¸Šä½¿ç”¨æˆ–扔在锄地上) +Mithril Scythe (Use to harvest and replant crops)= +Seed=ç§å­ +Lettuce= +Melon Slice=西瓜片 +Melon=甜瓜 +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion=洋葱 +Onion Soup= +Parsley= +Pea Pod=è±Œè±†èš +Pea Soup=豌豆汤 +Peppercorn=胡椒粉 +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=胡椒粉 +Pineapple Top=è è上衣 +Pineapple=è è +Pineapple Ring=è è圈 +Pineapple Juice=è èæ± +Potato=土豆 +Baked Potato=焗马铃薯 +Cucumber and Potato Salad=黄瓜土豆沙拉 +Pumpkin Slice=å—瓜片 +Jack 'O Lantern (punch to turn on and off)=æ°å…‹ç¯ï¼ˆæŒ‰ä¸€ä¸‹å¼€å…³ï¼‰ +Scarecrow Bottom=稻è‰äººå±è‚¡ +Pumpkin Bread=å—瓜é¢åŒ… +Pumpkin Dough=å—瓜é¢å›¢ +Pumpkin=å—瓜 +Raspberries=è¦†ç›†å­ +Raspberry Smoothie=覆盆å­å†°æ²™ +Rhubarb=大黄 +Rhubarb Pie=大黄派 +Rice Seed= +Rice=大米 +Rice Bread=米饭é¢åŒ… +Rice Flour=米粉 +Rye seed=黑麦ç§å­ +Rye=黑麦 +Oat seed=燕麦籽 +Oats= +Multigrain Flour=多粒é¢ç²‰ +Multigrain Bread=æ‚ç²®é¢åŒ… +Savanna Soil= +Wet Savanna Soil= +Soil=土壤 +Wet Soil=湿土 +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry=è‰èŽ“ +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=番茄 +Tomato Soup= +Wooden Bowl=木碗 +Saucepan=平底锅 +Cooking Pot=é”… +Baking Tray=烤盘 +Skillet=平底锅 +Mortar and Pestle=研钵 +Cutting Board=ç §æ¿ +Juicer=æ¦¨æ±æœº +Glass Mixing Bowl=æ…æ‹Œæ¯ +Vanilla= +Vanilla Extract= +Wheat Seed=å°éº¦ç§å­ +Wheat=å°éº¦ +Straw=ç¨»è‰ +Flour=é¢ç²‰ +Bread=é¢åŒ… +Sliced Bread=切片é¢åŒ… +Toast=烤é¢åŒ…片 +Toast Sandwich=三明治é¢åŒ… diff --git a/mods/farming/locale/farming.zh_TW.tr b/mods/farming/locale/farming.zh_TW.tr new file mode 100644 index 00000000..07a874a9 --- /dev/null +++ b/mods/farming/locale/farming.zh_TW.tr @@ -0,0 +1,176 @@ +# textdomain: farming +Artichoke= +Asparagus= +Barley Seed=å¤§éº¥ç¨®å­ +Barley=大麥 +Green Beans=é’豆 +Bean Pole (place on soil before planting beans)=豆æ†ï¼ˆç¨®è±†å‰å…ˆæ”¾åœ¨åœŸä¸Šï¼‰ +Beetroot=ç”œèœæ ¹ +Beetroot Soup=ç”œèœæ ¹æ¹¯ +Blackberries= +Wild Blueberries=è—莓 +Blueberry Muffin=è—莓鬆糕 +Blueberry Pie=è—莓派 +Cabbage= +Carrot=胡蘿蔔 +Carrot Juice=èƒ¡è˜¿è””æ± +Golden Carrot=金蘿蔔 +Chili Pepper=辣椒 +Bowl of Chili=一碗辣椒 +Chili Powder= +Raw Cocoa Beans= +Cocoa Beans=å¯å¯è±† +Cookie=曲奇 +Bar of Dark Chocolate=é»‘å·§å…‹åŠ›æ¢ +Chocolate Block=巧克力塊 +Coffee Beans=咖啡豆 +Cup of Coffee=一æ¯å’–å•¡ +Banana=香蕉 +Banana Leaves=香蕉葉 +Orange=橙色 +Corn=玉米 +Corn on the Cob=玉米棒 +Popcorn= +Cornstarch=玉米澱粉 +Bottle of Ethanol=一瓶乙醇 +Wild Cotton= +Cotton Seed=棉籽 +Cotton=棉花 +String=字符串 +Cucumber=黃瓜 +Eggplant= +Glass of Water= +Sugar=ç³– +Sugar Cube= +Caramel= +Salt=é¹½ +Mayonnaise= +Rose Water=çŽ«ç‘°æ± +Turkish Delight=土耳其軟糖 +Garlic Bread=蒜香麵包 +Donut=甜甜圈 +Chocolate Donut=巧克力甜甜圈 +Apple Donut=蘋果甜甜圈 +Porridge=ç²¥ +Jaffa Cake=佳發餅 +Apple Pie= +Cactus Juice= +Pasta= +Mac & Cheese= +Spaghetti= +Bibimbap= +Burger= +Salad= +Triple Berry Smoothie= +Spanish Potatoes= +Potato omelet= +Paella= +Vanilla Flan= +Vegan Cheese= +Onigiri= +Gyoza= +Mochi= +Gingerbread Man= +Garlic clove=蒜瓣 +Garlic=大蒜 +Garlic Braid=蒜辮 +Ginger= +Grapes=è‘¡è„ +Trellis (place on soil before planting grapes)=棚架(種æ¤è‘¡è„å‰å…ˆæ”¾åœ¨åœŸå£¤ä¸Šï¼‰ +Hemp Seed=大麻籽 +Hemp Leaf=大麻葉 +Bottle of Hemp Oil=一瓶大麻油 +Hemp Fibre=大麻纖維 +Hemp Block=麻塊 +Hemp Rope=麻繩 +Hoe=鋤頭 +Wooden Hoe=木鋤 +Stone Hoe=石鋤 +Steel Hoe=鋼鋤頭 +Bronze Hoe=é’銅鋤頭 +Mese Hoe=黃石鋤頭 +Diamond Hoe=鑽石鋤 +Wood Hoe= +Hoe Bomb (use or throw on grassy areas to hoe land)=鋤彈(在è‰åœ°ä¸Šä½¿ç”¨æˆ–扔在鋤地上) +Mithril Scythe (Use to harvest and replant crops)= +Seed=ç¨®å­ +Lettuce= +Melon Slice=西瓜片 +Melon=甜瓜 +Mint Seeds= +Mint Leaf= +Mint Tea= +Onion=洋蔥 +Onion Soup= +Parsley= +Pea Pod=豌豆莢 +Pea Soup=豌豆湯 +Peppercorn=胡椒粉 +Green Pepper= +Yellow Pepper= +Red Pepper= +Ground Pepper=胡椒粉 +Pineapple Top=è è˜¿ä¸Šè¡£ +Pineapple=è è˜¿ +Pineapple Ring=è è˜¿åœˆ +Pineapple Juice=è è˜¿æ± +Potato=土豆 +Baked Potato=焗馬鈴薯 +Cucumber and Potato Salad=黃瓜土豆沙拉 +Pumpkin Slice=å—瓜片 +Jack 'O Lantern (punch to turn on and off)=å—瓜燈(按一下開關) +Scarecrow Bottom=稻è‰äººå±è‚¡ +Pumpkin Bread=å—瓜麵包 +Pumpkin Dough=å—瓜麵糰 +Pumpkin=å—瓜 +Raspberries=è¦†ç›†å­ +Raspberry Smoothie=覆盆å­å†°æ²™ +Rhubarb=大黃 +Rhubarb Pie=大黃派 +Rice Seed= +Rice=大米 +Rice Bread=米飯麵包 +Rice Flour=米粉 +Rye seed=é»‘éº¥ç¨®å­ +Rye=黑麥 +Oat seed=燕麥籽 +Oats= +Multigrain Flour=多粒麵粉 +Multigrain Bread=雜糧麵包 +Savanna Soil= +Wet Savanna Soil= +Soil=土壤 +Wet Soil=溼土 +Soy Pod= +Soy Sauce= +Soy Milk= +Tofu= +Cooked Tofu= +Spinach= +Strawberry=è‰èŽ“ +Sunflower= +Sunflower Seeds= +Toasted Sunflower Seeds= +Bottle of Sunflower Oil= +Sunflower Seed Bread= +Tomato=番茄 +Tomato Soup= +Wooden Bowl=木碗 +Saucepan=å¹³åº•é‹ +Cooking Pot=é‹ +Baking Tray=烤盤 +Skillet=å¹³åº•é‹ +Mortar and Pestle=研缽 +Cutting Board=ç §æ¿ +Juicer=æ¦¨æ±æ©Ÿ +Glass Mixing Bowl=æ”ªæ‹Œæ¯ +Vanilla= +Vanilla Extract= +Wheat Seed=å°éº¥ç¨®å­ +Wheat=å°éº¥ +Straw=ç¨»è‰ +Flour=麵粉 +Bread=麵包 +Sliced Bread=切片é¢åŒ… +Toast=烤麵包片 +Toast Sandwich=三明治麵包 diff --git a/mods/farming/lucky_block.lua b/mods/farming/lucky_block.lua new file mode 100644 index 00000000..5aa5f4c9 --- /dev/null +++ b/mods/farming/lucky_block.lua @@ -0,0 +1,109 @@ + +local mcl = farming.mcl + +-- add lucky blocks + +lucky_block:add_blocks({ + + {"dro", {"farming:corn"}, 5}, + {"dro", {"farming:coffee_cup_hot"}, 1}, + {"dro", {(mcl and "mcl_farming:bread" or "farming:bread")}, 5}, + {"nod", (mcl and "mcl_farming:pumpkin_face_light" or "farming:jackolantern"), 0}, + {"tro", (mcl and "mcl_farming:pumpkin_face_light" or "farming:jackolantern_on")}, + {"nod", (mcl and "mcl_core:water_source" or "default:river_water_source"), 1}, + {"tel"}, + {"dro", {"farming:trellis", "farming:grapes"}, 5}, + {"dro", {"farming:bottle_ethanol"}, 1}, + {"nod", (mcl and "mcl_farming:melon" or "farming:melon"), 0}, + {"dro", {"farming:donut", "farming:donut_chocolate", "farming:donut_apple"}, 5}, + {"dro", {"farming:hemp_leaf", "farming:hemp_fibre", "farming:seed_hemp"}, 10}, + {"nod", (mcl and "mcl_fire:fire" or "fire:permanent_flame"), 1}, + {"dro", {"farming:chili_pepper", "farming:chili_bowl"}, 5}, + {"dro", {(mcl and "mcl_core:bowl" or "farming:bowl")}, 3}, + {"dro", {"farming:saucepan"}, 1}, + {"dro", {"farming:pot"}, 1}, + {"dro", {"farming:baking_tray"}, 1}, + {"dro", {"farming:skillet"}, 1}, + {"exp", 4}, + {"dro", {"farming:mortar_pestle"}, 1}, + {"dro", {"farming:cutting_board"}, 1}, + {"dro", {"farming:juicer"}, 1}, + {"dro", {"farming:mixing_bowl"}, 1}, + {"dro", {"farming:sunflower_oil"}, 5}, + {"dro", {(mcl and "mcl_farming:hoe_stone" or "farming:hoe_bronze")}, 1}, + {"dro", {(mcl and "mcl_farming:hoe_gold" or "farming:hoe_mese")}, 1}, + {"dro", {(mcl and "mcl_farming:hoe_diamond" or "farming:hoe_diamond")}, 1}, + {"dro", {"farming:hoe_bomb"}, 10}, + {"dro", {"farming:turkish_delight"}, 5}, + {"lig"}, + {"dro", {(mcl and "mcl_farming:hoe_netherite" or "farming:scythe_mithril")}, 1}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:carrot_8"}, + {"farming:cotton_8", "farming:rhubarb_3"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:pepper_5"}, + {"farming:cotton_8", "farming:onion_5"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", (mcl and "mcl_farming:beetroot" or "farming:beetroot_5")}, + {"farming:cotton_8", "farming:barley_7"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:corn_8"}, + {"farming:cotton_8", "farming:grapes_8"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:pea_5"}, + {"farming:cotton_8", "farming:coffee_5"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:raspberry_4"}, + {"farming:cotton_8", "farming:tomato_8"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:chili_8"}, + {"farming:cotton_8", "farming:cucumber_4"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"sch", "instafarm", 0, true, { + {"farming:wheat_8", "farming:spinach_4"}, + {"farming:cotton_8", "farming:eggplant_4"}, + {"farming:soil_wet", (mcl and "mcl_farming:soil_wet" or "farming:soil_wet")}, + {"default:dirt", (mcl and "mcl_core:dirt" or "default:dirt")}, + {"default:water_source", (mcl and "mcl_core:water_source" or "default:water_source")}, + }}, + {"nod", "default:chest", 0, { + {name = (mcl and "mcl_farming:wheat_seeds" or "farming:seed_wheat"), max = 15}, + {name = "farming:seed_barley", max = 15}, + {name = "farming:seed_hemp", max = 15}, + {name = "farming:seed_rye", max = 15}, + {name = "farming:seed_rice", max = 15}, + {name = "farming:seed_oat", max = 15}, + {name = "farming:soil_wet", max = 10}, + {name = "farming:cotton_wild", max = 5}, + {name = "farming:grapebush", max = 5}, + {name = "farming:asparagus", max = 7} + }}, + {"dro", {"farming:chili_powder"}, 5} +}) diff --git a/mods/farming/mod.conf b/mods/farming/mod.conf new file mode 100644 index 00000000..bcaba216 --- /dev/null +++ b/mods/farming/mod.conf @@ -0,0 +1,4 @@ +name = farming +description = Adds many new plants and food into Minetest. +optional_depends = default, flowers, mcl_core, mcl_sounds, mcl_farming, mcl_stairs, mcl_flowers, stairs, lucky_block, toolranks +min_minetest_version = 5.0 diff --git a/mods/farming/screenshot.jpg b/mods/farming/screenshot.jpg new file mode 100644 index 00000000..3fd5c341 Binary files /dev/null and b/mods/farming/screenshot.jpg differ diff --git a/mods/farming/settingtypes.txt b/mods/farming/settingtypes.txt new file mode 100644 index 00000000..7573de9d --- /dev/null +++ b/mods/farming/settingtypes.txt @@ -0,0 +1,4 @@ +# Contains a value used for speed of crop growth in seconds +farming_stage_length (Farming Stage Length) float 160.0 + +farming_use_utensils (Use utensil recipes) bool true diff --git a/mods/farming/soil.lua b/mods/farming/soil.lua new file mode 100644 index 00000000..7572d572 --- /dev/null +++ b/mods/farming/soil.lua @@ -0,0 +1,196 @@ + +local S = minetest.get_translator("farming") + +-- default dry soil node + +local dry_soil = "farming:soil" + +-- add soil types to existing dirt blocks + +minetest.override_item("default:dirt", { + soil = { + base = "default:dirt", dry = "farming:soil", wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_grass", { + soil = { + base = "default:dirt_with_grass", dry = "farming:soil", wet = "farming:soil_wet" + } +}) + +if minetest.registered_nodes["default:dirt_with_dry_grass"] then + + minetest.override_item("default:dirt_with_dry_grass", { + soil = { + base = "default:dirt_with_dry_grass", dry = "farming:soil", + wet = "farming:soil_wet" + } + }) +end + +minetest.override_item("default:dirt_with_rainforest_litter", { + soil = { + base = "default:dirt_with_rainforest_litter", dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +if minetest.registered_nodes["default:dirt_with_coniferous_litter"] then + + minetest.override_item("default:dirt_with_coniferous_litter", { + soil = { + base = "default:dirt_with_coniferous_litter", dry = "farming:soil", + wet = "farming:soil_wet" + } + }) +end + +-- savanna soil + +if minetest.registered_nodes["default:dry_dirt"] then + + minetest.override_item("default:dry_dirt", { + soil = { + base = "default:dry_dirt", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + minetest.override_item("default:dry_dirt_with_dry_grass", { + soil = { + base = "default:dry_dirt_with_dry_grass", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + minetest.register_node("farming:dry_soil", { + description = S("Savanna Soil"), + tiles = { + "default_dry_dirt.png^farming_soil.png", + "default_dry_dirt.png" + }, + drop = "default:dry_dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2, grassland = 1, + field = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + minetest.register_node("farming:dry_soil_wet", { + description = S("Wet Savanna Soil"), + tiles = { + "default_dry_dirt.png^farming_soil_wet.png", + "default_dry_dirt.png^farming_soil_wet_side.png" + }, + drop = "default:dry_dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, grassland = 1, + field = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } + }) + + dry_soil = "farming:dry_soil" +end + +-- normal soil + +minetest.register_node("farming:soil", { + description = S("Soil"), + tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, + drop = "default:dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2, grassland = 1, + field = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", dry = "farming:soil", wet = "farming:soil_wet" + } +}) + +-- wet soil + +minetest.register_node("farming:soil_wet", { + description = S("Wet Soil"), + tiles = { + "default_dirt.png^farming_soil_wet.png", + "default_dirt.png^farming_soil_wet_side.png" + }, + drop = "default:dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3, grassland = 1, + field = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", dry = "farming:soil", wet = "farming:soil_wet" + } +}) + +-- sand is not soil, change existing sand-soil to use dry soil + +minetest.register_alias("farming:desert_sand_soil", dry_soil) +minetest.register_alias("farming:desert_sand_soil_wet", dry_soil .. "_wet") + +-- if water near soil then change to wet soil + +minetest.register_abm({ + label = "Soil changes", + nodenames = {"group:field"}, + interval = 15, + chance = 4, + catch_up = false, + + action = function(pos, node) + + local ndef = minetest.registered_nodes[node.name] + if not ndef or not ndef.soil or not ndef.soil.wet + or not ndef.soil.base or not ndef.soil.dry then return end + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + pos.y = pos.y - 1 + + if nn then nn = nn.name else return end + + -- what's on top of soil, if solid/not plant change soil to dirt + if minetest.registered_nodes[nn] + and minetest.registered_nodes[nn].walkable + and minetest.get_item_group(nn, "plant") == 0 + and minetest.get_item_group(nn, "growing") == 0 then + + minetest.set_node(pos, {name = ndef.soil.base}) + + return + end + + -- check if water is within 3 nodes + if minetest.find_node_near(pos, 3, {"group:water"}) then + + -- only change if it's not already wet soil + if node.name ~= ndef.soil.wet then + minetest.set_node(pos, {name = ndef.soil.wet}) + end + + -- only dry out soil if no unloaded blocks nearby, just incase + elseif not minetest.find_node_near(pos, 3, {"ignore"}) then + + if node.name == ndef.soil.wet then + minetest.set_node(pos, {name = ndef.soil.dry}) + + -- if crop or seed found don't turn to dry soil + elseif node.name == ndef.soil.dry + and minetest.get_item_group(nn, "plant") == 0 + and minetest.get_item_group(nn, "growing") == 0 then + minetest.set_node(pos, {name = ndef.soil.base}) + end + end + end +}) diff --git a/mods/farming/statistics.lua b/mods/farming/statistics.lua new file mode 100644 index 00000000..df12bd96 --- /dev/null +++ b/mods/farming/statistics.lua @@ -0,0 +1,163 @@ + +-- Approximations for erf(x) and erfInv(x) from +-- https://en.wikipedia.org/wiki/Error_function + +local statistics = {} +local random, floor, ceil = math.random, math.floor, math.ceil +local exp, log, sqrt = math.exp, math.log, math.sqrt +local ROOT_2 = sqrt(2.0) +local A = 8 * (math.pi - 3.0) / (3.0 * math.pi * (4.0 - math.pi)) +local B = 4.0 / math.pi +local C = 2.0 / (math.pi * A) +local D = 1.0 / A + + +local function erf(x) + + if x == 0 then return 0 end + + local xSq = x * x + local aXSq = A * xSq + local v = sqrt(1.0 - exp(-xSq * (B + aXSq) / (1.0 + aXSq))) + + return (x > 0 and v) or -v +end + + +local function erf_inv(x) + + if x == 0 then return 0 end + + if x <= -1 or x >= 1 then return nil end + + local y = log(1 - x * x) + local u = C + 0.5 * y + local v = sqrt(sqrt(u * u - D * y) - u) + + return (x > 0 and v) or -v +end + + +local function std_normal(u) + return ROOT_2 * erf_inv(2.0 * u - 1.0) +end + + +local function generate_cdf(lambda_index, lambda) + + local max = ceil(4 * lambda) + local pdf = exp(-lambda) + local cdf = pdf + local t = { [0] = pdf } + + for i = 1, max - 1 do + pdf = pdf * lambda / i + cdf = cdf + pdf + t[i] = cdf + end + + return t +end + + +local cdf_table = {} + +for li = 1, 100 do + cdf_table[li] = generate_cdf(li, 0.25 * li) +end + + +local function poisson(lambda, max) + + if max < 2 then + return (random() < exp(-lambda) and 0) or 1 + elseif lambda >= 2 * max then + return max + end + + local u = random() + local lambda_index = floor(4 * lambda + 0.5) + local cdfs = cdf_table[lambda_index] + + if cdfs then + + lambda = 0.25 * lambda_index + + if u < cdfs[0] then return 0 end + if max > #cdfs then max = #cdfs + 1 else max = floor(max) end + if u >= cdfs[max - 1] then return max end + + if max > 4 then -- Binary search + + local s = 0 + + while s + 1 < max do + + local m = floor(0.5 * (s + max)) + + if u < cdfs[m] then max = m else s = m end + end + else + for i = 1, max - 1 do + if u < cdfs[i] then return i end + end + end + + return max + else + local x = lambda + sqrt(lambda) * std_normal(u) + + return (x < 0.5 and 0) or (x >= max - 0.5 and max) or floor(x + 0.5) + end +end + +-- Error and Inverse error functions + +statistics.erf = erf +statistics.erf_inv = erf_inv + +--- Standard normal distribution function (mean 0, standard deviation 1). + -- @return - Any real number (actually between -3.0 and 3.0). + +statistics.std_normal = function() + + local u = random() + + if u < 0.001 then return -3.0 elseif u > 0.999 then return 3.0 end + + return std_normal(u) +end + +--- Standard normal distribution function (mean 0, standard deviation 1). + -- @param mu - The distribution mean. + -- @param sigma - The distribution standard deviation. + -- @return - Any real number (actually between -3*sigma and 3*sigma). + +statistics.normal = function(mu, sigma) + + local u = random() + + if u < 0.001 then + return mu - 3.0 * sigma + elseif u > 0.999 then + return mu + 3.0 * sigma + end + + return mu + sigma * std_normal(u) +end + +--- Poisson distribution function. + -- @param lambda - The distribution mean and variance. + -- @param max - The distribution maximum. + -- @return - An integer between 0 and max (both inclusive). + +statistics.poisson = function(lambda, max) + + lambda, max = tonumber(lambda), tonumber(max) + + if not lambda or not max or lambda <= 0 or max < 1 then return 0 end + + return poisson(lambda, max) +end + +return statistics diff --git a/mods/farming/textures/crops_garlic.png b/mods/farming/textures/crops_garlic.png new file mode 100644 index 00000000..831335f1 Binary files /dev/null and b/mods/farming/textures/crops_garlic.png differ diff --git a/mods/farming/textures/crops_garlic_braid.png b/mods/farming/textures/crops_garlic_braid.png new file mode 100644 index 00000000..e776a978 Binary files /dev/null and b/mods/farming/textures/crops_garlic_braid.png differ diff --git a/mods/farming/textures/crops_garlic_braid_side.png b/mods/farming/textures/crops_garlic_braid_side.png new file mode 100644 index 00000000..de5286b0 Binary files /dev/null and b/mods/farming/textures/crops_garlic_braid_side.png differ diff --git a/mods/farming/textures/crops_garlic_braid_top.png b/mods/farming/textures/crops_garlic_braid_top.png new file mode 100644 index 00000000..0d3508ad Binary files /dev/null and b/mods/farming/textures/crops_garlic_braid_top.png differ diff --git a/mods/farming/textures/crops_garlic_clove.png b/mods/farming/textures/crops_garlic_clove.png new file mode 100644 index 00000000..00cf9778 Binary files /dev/null and b/mods/farming/textures/crops_garlic_clove.png differ diff --git a/mods/farming/textures/crops_garlic_plant_1.png b/mods/farming/textures/crops_garlic_plant_1.png new file mode 100644 index 00000000..61eb9a86 Binary files /dev/null and b/mods/farming/textures/crops_garlic_plant_1.png differ diff --git a/mods/farming/textures/crops_garlic_plant_2.png b/mods/farming/textures/crops_garlic_plant_2.png new file mode 100644 index 00000000..217fd257 Binary files /dev/null and b/mods/farming/textures/crops_garlic_plant_2.png differ diff --git a/mods/farming/textures/crops_garlic_plant_3.png b/mods/farming/textures/crops_garlic_plant_3.png new file mode 100644 index 00000000..557b017c Binary files /dev/null and b/mods/farming/textures/crops_garlic_plant_3.png differ diff --git a/mods/farming/textures/crops_garlic_plant_4.png b/mods/farming/textures/crops_garlic_plant_4.png new file mode 100644 index 00000000..80ef076c Binary files /dev/null and b/mods/farming/textures/crops_garlic_plant_4.png differ diff --git a/mods/farming/textures/crops_garlic_plant_5.png b/mods/farming/textures/crops_garlic_plant_5.png new file mode 100644 index 00000000..8b8c31a4 Binary files /dev/null and b/mods/farming/textures/crops_garlic_plant_5.png differ diff --git a/mods/farming/textures/crops_onion.png b/mods/farming/textures/crops_onion.png new file mode 100644 index 00000000..4c778c88 Binary files /dev/null and b/mods/farming/textures/crops_onion.png differ diff --git a/mods/farming/textures/crops_onion_plant_1.png b/mods/farming/textures/crops_onion_plant_1.png new file mode 100644 index 00000000..dea2d4b0 Binary files /dev/null and b/mods/farming/textures/crops_onion_plant_1.png differ diff --git a/mods/farming/textures/crops_onion_plant_2.png b/mods/farming/textures/crops_onion_plant_2.png new file mode 100644 index 00000000..1f850f13 Binary files /dev/null and b/mods/farming/textures/crops_onion_plant_2.png differ diff --git a/mods/farming/textures/crops_onion_plant_3.png b/mods/farming/textures/crops_onion_plant_3.png new file mode 100644 index 00000000..d9af2394 Binary files /dev/null and b/mods/farming/textures/crops_onion_plant_3.png differ diff --git a/mods/farming/textures/crops_onion_plant_4.png b/mods/farming/textures/crops_onion_plant_4.png new file mode 100644 index 00000000..962b21ba Binary files /dev/null and b/mods/farming/textures/crops_onion_plant_4.png differ diff --git a/mods/farming/textures/crops_onion_plant_5.png b/mods/farming/textures/crops_onion_plant_5.png new file mode 100644 index 00000000..dfb1f7f8 Binary files /dev/null and b/mods/farming/textures/crops_onion_plant_5.png differ diff --git a/mods/farming/textures/crops_pepper.png b/mods/farming/textures/crops_pepper.png new file mode 100644 index 00000000..bb8f40c3 Binary files /dev/null and b/mods/farming/textures/crops_pepper.png differ diff --git a/mods/farming/textures/crops_pepper_ground.png b/mods/farming/textures/crops_pepper_ground.png new file mode 100644 index 00000000..d72405a3 Binary files /dev/null and b/mods/farming/textures/crops_pepper_ground.png differ diff --git a/mods/farming/textures/crops_pepper_plant_1.png b/mods/farming/textures/crops_pepper_plant_1.png new file mode 100644 index 00000000..43ce6ba5 Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_1.png differ diff --git a/mods/farming/textures/crops_pepper_plant_2.png b/mods/farming/textures/crops_pepper_plant_2.png new file mode 100644 index 00000000..556f9523 Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_2.png differ diff --git a/mods/farming/textures/crops_pepper_plant_3.png b/mods/farming/textures/crops_pepper_plant_3.png new file mode 100644 index 00000000..24e92e16 Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_3.png differ diff --git a/mods/farming/textures/crops_pepper_plant_4.png b/mods/farming/textures/crops_pepper_plant_4.png new file mode 100644 index 00000000..e33554d2 Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_4.png differ diff --git a/mods/farming/textures/crops_pepper_plant_5.png b/mods/farming/textures/crops_pepper_plant_5.png new file mode 100644 index 00000000..c2c92eb6 Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_5.png differ diff --git a/mods/farming/textures/crops_pepper_plant_6.png b/mods/farming/textures/crops_pepper_plant_6.png new file mode 100644 index 00000000..f2de13ae Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_6.png differ diff --git a/mods/farming/textures/crops_pepper_plant_7.png b/mods/farming/textures/crops_pepper_plant_7.png new file mode 100644 index 00000000..b94526ba Binary files /dev/null and b/mods/farming/textures/crops_pepper_plant_7.png differ diff --git a/mods/farming/textures/crops_pepper_red.png b/mods/farming/textures/crops_pepper_red.png new file mode 100644 index 00000000..26802ec7 Binary files /dev/null and b/mods/farming/textures/crops_pepper_red.png differ diff --git a/mods/farming/textures/crops_pepper_yellow.png b/mods/farming/textures/crops_pepper_yellow.png new file mode 100644 index 00000000..c0273e43 Binary files /dev/null and b/mods/farming/textures/crops_pepper_yellow.png differ diff --git a/mods/farming/textures/crops_peppercorn.png b/mods/farming/textures/crops_peppercorn.png new file mode 100644 index 00000000..0ee3c497 Binary files /dev/null and b/mods/farming/textures/crops_peppercorn.png differ diff --git a/mods/farming/textures/default_junglegrass.png b/mods/farming/textures/default_junglegrass.png new file mode 100644 index 00000000..5d8cdbca Binary files /dev/null and b/mods/farming/textures/default_junglegrass.png differ diff --git a/mods/farming/textures/ethereal_banana_leaf.png b/mods/farming/textures/ethereal_banana_leaf.png new file mode 100644 index 00000000..45770dac Binary files /dev/null and b/mods/farming/textures/ethereal_banana_leaf.png differ diff --git a/mods/farming/textures/ethereal_strawberry.png b/mods/farming/textures/ethereal_strawberry.png new file mode 100644 index 00000000..b085fd97 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry.png differ diff --git a/mods/farming/textures/ethereal_strawberry_1.png b/mods/farming/textures/ethereal_strawberry_1.png new file mode 100644 index 00000000..531ff350 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_1.png differ diff --git a/mods/farming/textures/ethereal_strawberry_2.png b/mods/farming/textures/ethereal_strawberry_2.png new file mode 100644 index 00000000..82fa6725 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_2.png differ diff --git a/mods/farming/textures/ethereal_strawberry_3.png b/mods/farming/textures/ethereal_strawberry_3.png new file mode 100644 index 00000000..950a57cd Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_3.png differ diff --git a/mods/farming/textures/ethereal_strawberry_4.png b/mods/farming/textures/ethereal_strawberry_4.png new file mode 100644 index 00000000..ed090917 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_4.png differ diff --git a/mods/farming/textures/ethereal_strawberry_5.png b/mods/farming/textures/ethereal_strawberry_5.png new file mode 100644 index 00000000..8e6c0acd Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_5.png differ diff --git a/mods/farming/textures/ethereal_strawberry_6.png b/mods/farming/textures/ethereal_strawberry_6.png new file mode 100644 index 00000000..c9e97664 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_6.png differ diff --git a/mods/farming/textures/ethereal_strawberry_7.png b/mods/farming/textures/ethereal_strawberry_7.png new file mode 100644 index 00000000..e35830d6 Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_7.png differ diff --git a/mods/farming/textures/ethereal_strawberry_8.png b/mods/farming/textures/ethereal_strawberry_8.png new file mode 100644 index 00000000..10ee97dd Binary files /dev/null and b/mods/farming/textures/ethereal_strawberry_8.png differ diff --git a/mods/farming/textures/farming_apple_pie.png b/mods/farming/textures/farming_apple_pie.png new file mode 100644 index 00000000..a6761350 Binary files /dev/null and b/mods/farming/textures/farming_apple_pie.png differ diff --git a/mods/farming/textures/farming_artichoke.png b/mods/farming/textures/farming_artichoke.png new file mode 100644 index 00000000..74af38b7 Binary files /dev/null and b/mods/farming/textures/farming_artichoke.png differ diff --git a/mods/farming/textures/farming_artichoke_1.png b/mods/farming/textures/farming_artichoke_1.png new file mode 100644 index 00000000..b7f2e020 Binary files /dev/null and b/mods/farming/textures/farming_artichoke_1.png differ diff --git a/mods/farming/textures/farming_artichoke_2.png b/mods/farming/textures/farming_artichoke_2.png new file mode 100644 index 00000000..653637e0 Binary files /dev/null and b/mods/farming/textures/farming_artichoke_2.png differ diff --git a/mods/farming/textures/farming_artichoke_3.png b/mods/farming/textures/farming_artichoke_3.png new file mode 100644 index 00000000..2d203e90 Binary files /dev/null and b/mods/farming/textures/farming_artichoke_3.png differ diff --git a/mods/farming/textures/farming_artichoke_4.png b/mods/farming/textures/farming_artichoke_4.png new file mode 100644 index 00000000..9a44e928 Binary files /dev/null and b/mods/farming/textures/farming_artichoke_4.png differ diff --git a/mods/farming/textures/farming_artichoke_5.png b/mods/farming/textures/farming_artichoke_5.png new file mode 100644 index 00000000..dac25ddf Binary files /dev/null and b/mods/farming/textures/farming_artichoke_5.png differ diff --git a/mods/farming/textures/farming_asparagus.png b/mods/farming/textures/farming_asparagus.png new file mode 100644 index 00000000..4dbc1ecb Binary files /dev/null and b/mods/farming/textures/farming_asparagus.png differ diff --git a/mods/farming/textures/farming_asparagus_1.png b/mods/farming/textures/farming_asparagus_1.png new file mode 100644 index 00000000..87444d1b Binary files /dev/null and b/mods/farming/textures/farming_asparagus_1.png differ diff --git a/mods/farming/textures/farming_asparagus_2.png b/mods/farming/textures/farming_asparagus_2.png new file mode 100644 index 00000000..cb8c6b4b Binary files /dev/null and b/mods/farming/textures/farming_asparagus_2.png differ diff --git a/mods/farming/textures/farming_asparagus_3.png b/mods/farming/textures/farming_asparagus_3.png new file mode 100644 index 00000000..904fb25f Binary files /dev/null and b/mods/farming/textures/farming_asparagus_3.png differ diff --git a/mods/farming/textures/farming_asparagus_4.png b/mods/farming/textures/farming_asparagus_4.png new file mode 100644 index 00000000..13c02ca5 Binary files /dev/null and b/mods/farming/textures/farming_asparagus_4.png differ diff --git a/mods/farming/textures/farming_asparagus_5.png b/mods/farming/textures/farming_asparagus_5.png new file mode 100644 index 00000000..1ed183e0 Binary files /dev/null and b/mods/farming/textures/farming_asparagus_5.png differ diff --git a/mods/farming/textures/farming_baked_potato.png b/mods/farming/textures/farming_baked_potato.png new file mode 100644 index 00000000..425c4ae3 Binary files /dev/null and b/mods/farming/textures/farming_baked_potato.png differ diff --git a/mods/farming/textures/farming_baking_tray.png b/mods/farming/textures/farming_baking_tray.png new file mode 100644 index 00000000..be1711c5 Binary files /dev/null and b/mods/farming/textures/farming_baking_tray.png differ diff --git a/mods/farming/textures/farming_banana_single.png b/mods/farming/textures/farming_banana_single.png new file mode 100644 index 00000000..b15ed2fa Binary files /dev/null and b/mods/farming/textures/farming_banana_single.png differ diff --git a/mods/farming/textures/farming_barley.png b/mods/farming/textures/farming_barley.png new file mode 100644 index 00000000..c6819548 Binary files /dev/null and b/mods/farming/textures/farming_barley.png differ diff --git a/mods/farming/textures/farming_barley_1.png b/mods/farming/textures/farming_barley_1.png new file mode 100644 index 00000000..177fbdf1 Binary files /dev/null and b/mods/farming/textures/farming_barley_1.png differ diff --git a/mods/farming/textures/farming_barley_2.png b/mods/farming/textures/farming_barley_2.png new file mode 100644 index 00000000..d5a5936e Binary files /dev/null and b/mods/farming/textures/farming_barley_2.png differ diff --git a/mods/farming/textures/farming_barley_3.png b/mods/farming/textures/farming_barley_3.png new file mode 100644 index 00000000..b456f431 Binary files /dev/null and b/mods/farming/textures/farming_barley_3.png differ diff --git a/mods/farming/textures/farming_barley_4.png b/mods/farming/textures/farming_barley_4.png new file mode 100644 index 00000000..62905efd Binary files /dev/null and b/mods/farming/textures/farming_barley_4.png differ diff --git a/mods/farming/textures/farming_barley_5.png b/mods/farming/textures/farming_barley_5.png new file mode 100644 index 00000000..cc1d66ba Binary files /dev/null and b/mods/farming/textures/farming_barley_5.png differ diff --git a/mods/farming/textures/farming_barley_6.png b/mods/farming/textures/farming_barley_6.png new file mode 100644 index 00000000..e72dd2e5 Binary files /dev/null and b/mods/farming/textures/farming_barley_6.png differ diff --git a/mods/farming/textures/farming_barley_7.png b/mods/farming/textures/farming_barley_7.png new file mode 100644 index 00000000..a37c5173 Binary files /dev/null and b/mods/farming/textures/farming_barley_7.png differ diff --git a/mods/farming/textures/farming_barley_8.png b/mods/farming/textures/farming_barley_8.png new file mode 100644 index 00000000..a2a07653 Binary files /dev/null and b/mods/farming/textures/farming_barley_8.png differ diff --git a/mods/farming/textures/farming_barley_seed.png b/mods/farming/textures/farming_barley_seed.png new file mode 100644 index 00000000..2f00a20a Binary files /dev/null and b/mods/farming/textures/farming_barley_seed.png differ diff --git a/mods/farming/textures/farming_beanbush.png b/mods/farming/textures/farming_beanbush.png new file mode 100644 index 00000000..637e7162 Binary files /dev/null and b/mods/farming/textures/farming_beanbush.png differ diff --git a/mods/farming/textures/farming_beanpole.png b/mods/farming/textures/farming_beanpole.png new file mode 100644 index 00000000..ed07572e Binary files /dev/null and b/mods/farming/textures/farming_beanpole.png differ diff --git a/mods/farming/textures/farming_beanpole_1.png b/mods/farming/textures/farming_beanpole_1.png new file mode 100644 index 00000000..ef2bd5ab Binary files /dev/null and b/mods/farming/textures/farming_beanpole_1.png differ diff --git a/mods/farming/textures/farming_beanpole_2.png b/mods/farming/textures/farming_beanpole_2.png new file mode 100644 index 00000000..34143e47 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_2.png differ diff --git a/mods/farming/textures/farming_beanpole_3.png b/mods/farming/textures/farming_beanpole_3.png new file mode 100644 index 00000000..d693f170 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_3.png differ diff --git a/mods/farming/textures/farming_beanpole_4.png b/mods/farming/textures/farming_beanpole_4.png new file mode 100644 index 00000000..c779b254 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_4.png differ diff --git a/mods/farming/textures/farming_beanpole_5.png b/mods/farming/textures/farming_beanpole_5.png new file mode 100644 index 00000000..910f8a07 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_5.png differ diff --git a/mods/farming/textures/farming_beans.png b/mods/farming/textures/farming_beans.png new file mode 100644 index 00000000..ad5cf859 Binary files /dev/null and b/mods/farming/textures/farming_beans.png differ diff --git a/mods/farming/textures/farming_beetroot.png b/mods/farming/textures/farming_beetroot.png new file mode 100644 index 00000000..6a601681 Binary files /dev/null and b/mods/farming/textures/farming_beetroot.png differ diff --git a/mods/farming/textures/farming_beetroot_1.png b/mods/farming/textures/farming_beetroot_1.png new file mode 100644 index 00000000..8b75e10f Binary files /dev/null and b/mods/farming/textures/farming_beetroot_1.png differ diff --git a/mods/farming/textures/farming_beetroot_2.png b/mods/farming/textures/farming_beetroot_2.png new file mode 100644 index 00000000..9c1ce1e7 Binary files /dev/null and b/mods/farming/textures/farming_beetroot_2.png differ diff --git a/mods/farming/textures/farming_beetroot_3.png b/mods/farming/textures/farming_beetroot_3.png new file mode 100644 index 00000000..0f28e5e7 Binary files /dev/null and b/mods/farming/textures/farming_beetroot_3.png differ diff --git a/mods/farming/textures/farming_beetroot_4.png b/mods/farming/textures/farming_beetroot_4.png new file mode 100644 index 00000000..35f211b0 Binary files /dev/null and b/mods/farming/textures/farming_beetroot_4.png differ diff --git a/mods/farming/textures/farming_beetroot_5.png b/mods/farming/textures/farming_beetroot_5.png new file mode 100644 index 00000000..c4b89572 Binary files /dev/null and b/mods/farming/textures/farming_beetroot_5.png differ diff --git a/mods/farming/textures/farming_beetroot_soup.png b/mods/farming/textures/farming_beetroot_soup.png new file mode 100644 index 00000000..4df562e9 Binary files /dev/null and b/mods/farming/textures/farming_beetroot_soup.png differ diff --git a/mods/farming/textures/farming_berry_smoothie.png b/mods/farming/textures/farming_berry_smoothie.png new file mode 100644 index 00000000..8da2fc55 Binary files /dev/null and b/mods/farming/textures/farming_berry_smoothie.png differ diff --git a/mods/farming/textures/farming_bibimbap.png b/mods/farming/textures/farming_bibimbap.png new file mode 100644 index 00000000..e1a7dfe3 Binary files /dev/null and b/mods/farming/textures/farming_bibimbap.png differ diff --git a/mods/farming/textures/farming_blackberry.png b/mods/farming/textures/farming_blackberry.png new file mode 100644 index 00000000..01d7ac5e Binary files /dev/null and b/mods/farming/textures/farming_blackberry.png differ diff --git a/mods/farming/textures/farming_blackberry_1.png b/mods/farming/textures/farming_blackberry_1.png new file mode 100644 index 00000000..8dd8832c Binary files /dev/null and b/mods/farming/textures/farming_blackberry_1.png differ diff --git a/mods/farming/textures/farming_blackberry_2.png b/mods/farming/textures/farming_blackberry_2.png new file mode 100644 index 00000000..7d3827c8 Binary files /dev/null and b/mods/farming/textures/farming_blackberry_2.png differ diff --git a/mods/farming/textures/farming_blackberry_3.png b/mods/farming/textures/farming_blackberry_3.png new file mode 100644 index 00000000..7d89aa0c Binary files /dev/null and b/mods/farming/textures/farming_blackberry_3.png differ diff --git a/mods/farming/textures/farming_blackberry_4.png b/mods/farming/textures/farming_blackberry_4.png new file mode 100644 index 00000000..d9d398d9 Binary files /dev/null and b/mods/farming/textures/farming_blackberry_4.png differ diff --git a/mods/farming/textures/farming_blueberries.png b/mods/farming/textures/farming_blueberries.png new file mode 100644 index 00000000..b0c49319 Binary files /dev/null and b/mods/farming/textures/farming_blueberries.png differ diff --git a/mods/farming/textures/farming_blueberry_1.png b/mods/farming/textures/farming_blueberry_1.png new file mode 100644 index 00000000..83832c86 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_1.png differ diff --git a/mods/farming/textures/farming_blueberry_2.png b/mods/farming/textures/farming_blueberry_2.png new file mode 100644 index 00000000..308a0caf Binary files /dev/null and b/mods/farming/textures/farming_blueberry_2.png differ diff --git a/mods/farming/textures/farming_blueberry_3.png b/mods/farming/textures/farming_blueberry_3.png new file mode 100644 index 00000000..43d2ab13 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_3.png differ diff --git a/mods/farming/textures/farming_blueberry_4.png b/mods/farming/textures/farming_blueberry_4.png new file mode 100644 index 00000000..75fb69a0 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_4.png differ diff --git a/mods/farming/textures/farming_blueberry_muffin.png b/mods/farming/textures/farming_blueberry_muffin.png new file mode 100644 index 00000000..b1253d70 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_muffin.png differ diff --git a/mods/farming/textures/farming_blueberry_pie.png b/mods/farming/textures/farming_blueberry_pie.png new file mode 100644 index 00000000..1fa6b1c9 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_pie.png differ diff --git a/mods/farming/textures/farming_bottle_ethanol.png b/mods/farming/textures/farming_bottle_ethanol.png new file mode 100644 index 00000000..84e6162d Binary files /dev/null and b/mods/farming/textures/farming_bottle_ethanol.png differ diff --git a/mods/farming/textures/farming_bowl.png b/mods/farming/textures/farming_bowl.png new file mode 100644 index 00000000..c6b69bab Binary files /dev/null and b/mods/farming/textures/farming_bowl.png differ diff --git a/mods/farming/textures/farming_bread.png b/mods/farming/textures/farming_bread.png new file mode 100644 index 00000000..bd00e3e1 Binary files /dev/null and b/mods/farming/textures/farming_bread.png differ diff --git a/mods/farming/textures/farming_bread_multigrain.png b/mods/farming/textures/farming_bread_multigrain.png new file mode 100644 index 00000000..66dda074 Binary files /dev/null and b/mods/farming/textures/farming_bread_multigrain.png differ diff --git a/mods/farming/textures/farming_bread_slice.png b/mods/farming/textures/farming_bread_slice.png new file mode 100644 index 00000000..ff2714d1 Binary files /dev/null and b/mods/farming/textures/farming_bread_slice.png differ diff --git a/mods/farming/textures/farming_burger.png b/mods/farming/textures/farming_burger.png new file mode 100644 index 00000000..94e38fcb Binary files /dev/null and b/mods/farming/textures/farming_burger.png differ diff --git a/mods/farming/textures/farming_cabbage.png b/mods/farming/textures/farming_cabbage.png new file mode 100644 index 00000000..7f4fa05a Binary files /dev/null and b/mods/farming/textures/farming_cabbage.png differ diff --git a/mods/farming/textures/farming_cabbage_1.png b/mods/farming/textures/farming_cabbage_1.png new file mode 100644 index 00000000..850b0da4 Binary files /dev/null and b/mods/farming/textures/farming_cabbage_1.png differ diff --git a/mods/farming/textures/farming_cabbage_2.png b/mods/farming/textures/farming_cabbage_2.png new file mode 100644 index 00000000..5ae079fb Binary files /dev/null and b/mods/farming/textures/farming_cabbage_2.png differ diff --git a/mods/farming/textures/farming_cabbage_3.png b/mods/farming/textures/farming_cabbage_3.png new file mode 100644 index 00000000..3050229c Binary files /dev/null and b/mods/farming/textures/farming_cabbage_3.png differ diff --git a/mods/farming/textures/farming_cabbage_4.png b/mods/farming/textures/farming_cabbage_4.png new file mode 100644 index 00000000..50642746 Binary files /dev/null and b/mods/farming/textures/farming_cabbage_4.png differ diff --git a/mods/farming/textures/farming_cabbage_5.png b/mods/farming/textures/farming_cabbage_5.png new file mode 100644 index 00000000..45dd7777 Binary files /dev/null and b/mods/farming/textures/farming_cabbage_5.png differ diff --git a/mods/farming/textures/farming_cabbage_6.png b/mods/farming/textures/farming_cabbage_6.png new file mode 100644 index 00000000..253f8a71 Binary files /dev/null and b/mods/farming/textures/farming_cabbage_6.png differ diff --git a/mods/farming/textures/farming_cactus_juice.png b/mods/farming/textures/farming_cactus_juice.png new file mode 100644 index 00000000..b4fb5b99 Binary files /dev/null and b/mods/farming/textures/farming_cactus_juice.png differ diff --git a/mods/farming/textures/farming_caramel.png b/mods/farming/textures/farming_caramel.png new file mode 100644 index 00000000..bc7d1648 Binary files /dev/null and b/mods/farming/textures/farming_caramel.png differ diff --git a/mods/farming/textures/farming_carrot.png b/mods/farming/textures/farming_carrot.png new file mode 100644 index 00000000..73f2fd47 Binary files /dev/null and b/mods/farming/textures/farming_carrot.png differ diff --git a/mods/farming/textures/farming_carrot_1.png b/mods/farming/textures/farming_carrot_1.png new file mode 100644 index 00000000..bbeae7e8 Binary files /dev/null and b/mods/farming/textures/farming_carrot_1.png differ diff --git a/mods/farming/textures/farming_carrot_2.png b/mods/farming/textures/farming_carrot_2.png new file mode 100644 index 00000000..b24ecc05 Binary files /dev/null and b/mods/farming/textures/farming_carrot_2.png differ diff --git a/mods/farming/textures/farming_carrot_3.png b/mods/farming/textures/farming_carrot_3.png new file mode 100644 index 00000000..84005057 Binary files /dev/null and b/mods/farming/textures/farming_carrot_3.png differ diff --git a/mods/farming/textures/farming_carrot_4.png b/mods/farming/textures/farming_carrot_4.png new file mode 100644 index 00000000..32ee2624 Binary files /dev/null and b/mods/farming/textures/farming_carrot_4.png differ diff --git a/mods/farming/textures/farming_carrot_5.png b/mods/farming/textures/farming_carrot_5.png new file mode 100644 index 00000000..0bcd9c1e Binary files /dev/null and b/mods/farming/textures/farming_carrot_5.png differ diff --git a/mods/farming/textures/farming_carrot_6.png b/mods/farming/textures/farming_carrot_6.png new file mode 100644 index 00000000..a17c6b2b Binary files /dev/null and b/mods/farming/textures/farming_carrot_6.png differ diff --git a/mods/farming/textures/farming_carrot_7.png b/mods/farming/textures/farming_carrot_7.png new file mode 100644 index 00000000..d26eee7c Binary files /dev/null and b/mods/farming/textures/farming_carrot_7.png differ diff --git a/mods/farming/textures/farming_carrot_8.png b/mods/farming/textures/farming_carrot_8.png new file mode 100644 index 00000000..00b6d928 Binary files /dev/null and b/mods/farming/textures/farming_carrot_8.png differ diff --git a/mods/farming/textures/farming_carrot_gold.png b/mods/farming/textures/farming_carrot_gold.png new file mode 100644 index 00000000..b817101d Binary files /dev/null and b/mods/farming/textures/farming_carrot_gold.png differ diff --git a/mods/farming/textures/farming_carrot_juice.png b/mods/farming/textures/farming_carrot_juice.png new file mode 100644 index 00000000..5a032455 Binary files /dev/null and b/mods/farming/textures/farming_carrot_juice.png differ diff --git a/mods/farming/textures/farming_cheese_vegan.png b/mods/farming/textures/farming_cheese_vegan.png new file mode 100644 index 00000000..22c439e3 Binary files /dev/null and b/mods/farming/textures/farming_cheese_vegan.png differ diff --git a/mods/farming/textures/farming_chili_1.png b/mods/farming/textures/farming_chili_1.png new file mode 100644 index 00000000..aa11988d Binary files /dev/null and b/mods/farming/textures/farming_chili_1.png differ diff --git a/mods/farming/textures/farming_chili_2.png b/mods/farming/textures/farming_chili_2.png new file mode 100644 index 00000000..ae345063 Binary files /dev/null and b/mods/farming/textures/farming_chili_2.png differ diff --git a/mods/farming/textures/farming_chili_3.png b/mods/farming/textures/farming_chili_3.png new file mode 100644 index 00000000..5e1d9015 Binary files /dev/null and b/mods/farming/textures/farming_chili_3.png differ diff --git a/mods/farming/textures/farming_chili_4.png b/mods/farming/textures/farming_chili_4.png new file mode 100644 index 00000000..d97769b2 Binary files /dev/null and b/mods/farming/textures/farming_chili_4.png differ diff --git a/mods/farming/textures/farming_chili_5.png b/mods/farming/textures/farming_chili_5.png new file mode 100644 index 00000000..dd4755d9 Binary files /dev/null and b/mods/farming/textures/farming_chili_5.png differ diff --git a/mods/farming/textures/farming_chili_6.png b/mods/farming/textures/farming_chili_6.png new file mode 100644 index 00000000..4ee057b1 Binary files /dev/null and b/mods/farming/textures/farming_chili_6.png differ diff --git a/mods/farming/textures/farming_chili_7.png b/mods/farming/textures/farming_chili_7.png new file mode 100644 index 00000000..5912c2e1 Binary files /dev/null and b/mods/farming/textures/farming_chili_7.png differ diff --git a/mods/farming/textures/farming_chili_8.png b/mods/farming/textures/farming_chili_8.png new file mode 100644 index 00000000..976eb521 Binary files /dev/null and b/mods/farming/textures/farming_chili_8.png differ diff --git a/mods/farming/textures/farming_chili_bowl.png b/mods/farming/textures/farming_chili_bowl.png new file mode 100644 index 00000000..6454ba3e Binary files /dev/null and b/mods/farming/textures/farming_chili_bowl.png differ diff --git a/mods/farming/textures/farming_chili_pepper.png b/mods/farming/textures/farming_chili_pepper.png new file mode 100644 index 00000000..922cec48 Binary files /dev/null and b/mods/farming/textures/farming_chili_pepper.png differ diff --git a/mods/farming/textures/farming_chili_powder.png b/mods/farming/textures/farming_chili_powder.png new file mode 100644 index 00000000..5c3e31e1 Binary files /dev/null and b/mods/farming/textures/farming_chili_powder.png differ diff --git a/mods/farming/textures/farming_chocolate_block.png b/mods/farming/textures/farming_chocolate_block.png new file mode 100644 index 00000000..20e5a79b Binary files /dev/null and b/mods/farming/textures/farming_chocolate_block.png differ diff --git a/mods/farming/textures/farming_chocolate_dark.png b/mods/farming/textures/farming_chocolate_dark.png new file mode 100644 index 00000000..03243b27 Binary files /dev/null and b/mods/farming/textures/farming_chocolate_dark.png differ diff --git a/mods/farming/textures/farming_cocoa_1.png b/mods/farming/textures/farming_cocoa_1.png new file mode 100644 index 00000000..18fd362c Binary files /dev/null and b/mods/farming/textures/farming_cocoa_1.png differ diff --git a/mods/farming/textures/farming_cocoa_2.png b/mods/farming/textures/farming_cocoa_2.png new file mode 100644 index 00000000..c304ee0e Binary files /dev/null and b/mods/farming/textures/farming_cocoa_2.png differ diff --git a/mods/farming/textures/farming_cocoa_3.png b/mods/farming/textures/farming_cocoa_3.png new file mode 100644 index 00000000..d66b47d4 Binary files /dev/null and b/mods/farming/textures/farming_cocoa_3.png differ diff --git a/mods/farming/textures/farming_cocoa_4.png b/mods/farming/textures/farming_cocoa_4.png new file mode 100644 index 00000000..990a8b45 Binary files /dev/null and b/mods/farming/textures/farming_cocoa_4.png differ diff --git a/mods/farming/textures/farming_cocoa_beans.png b/mods/farming/textures/farming_cocoa_beans.png new file mode 100644 index 00000000..9605e51f Binary files /dev/null and b/mods/farming/textures/farming_cocoa_beans.png differ diff --git a/mods/farming/textures/farming_coffee_1.png b/mods/farming/textures/farming_coffee_1.png new file mode 100644 index 00000000..48d1b7ff Binary files /dev/null and b/mods/farming/textures/farming_coffee_1.png differ diff --git a/mods/farming/textures/farming_coffee_2.png b/mods/farming/textures/farming_coffee_2.png new file mode 100644 index 00000000..e80d7bef Binary files /dev/null and b/mods/farming/textures/farming_coffee_2.png differ diff --git a/mods/farming/textures/farming_coffee_3.png b/mods/farming/textures/farming_coffee_3.png new file mode 100644 index 00000000..a057d04c Binary files /dev/null and b/mods/farming/textures/farming_coffee_3.png differ diff --git a/mods/farming/textures/farming_coffee_4.png b/mods/farming/textures/farming_coffee_4.png new file mode 100644 index 00000000..912c5f0d Binary files /dev/null and b/mods/farming/textures/farming_coffee_4.png differ diff --git a/mods/farming/textures/farming_coffee_5.png b/mods/farming/textures/farming_coffee_5.png new file mode 100644 index 00000000..47b11f22 Binary files /dev/null and b/mods/farming/textures/farming_coffee_5.png differ diff --git a/mods/farming/textures/farming_coffee_beans.png b/mods/farming/textures/farming_coffee_beans.png new file mode 100644 index 00000000..88e9438c Binary files /dev/null and b/mods/farming/textures/farming_coffee_beans.png differ diff --git a/mods/farming/textures/farming_coffee_cup.png b/mods/farming/textures/farming_coffee_cup.png new file mode 100644 index 00000000..d3820bc7 Binary files /dev/null and b/mods/farming/textures/farming_coffee_cup.png differ diff --git a/mods/farming/textures/farming_cookie.png b/mods/farming/textures/farming_cookie.png new file mode 100644 index 00000000..60d88f8a Binary files /dev/null and b/mods/farming/textures/farming_cookie.png differ diff --git a/mods/farming/textures/farming_corn.png b/mods/farming/textures/farming_corn.png new file mode 100644 index 00000000..2a2894a4 Binary files /dev/null and b/mods/farming/textures/farming_corn.png differ diff --git a/mods/farming/textures/farming_corn_1.png b/mods/farming/textures/farming_corn_1.png new file mode 100644 index 00000000..60e8b997 Binary files /dev/null and b/mods/farming/textures/farming_corn_1.png differ diff --git a/mods/farming/textures/farming_corn_2.png b/mods/farming/textures/farming_corn_2.png new file mode 100644 index 00000000..6ba6cc97 Binary files /dev/null and b/mods/farming/textures/farming_corn_2.png differ diff --git a/mods/farming/textures/farming_corn_3.png b/mods/farming/textures/farming_corn_3.png new file mode 100644 index 00000000..c5fa80b1 Binary files /dev/null and b/mods/farming/textures/farming_corn_3.png differ diff --git a/mods/farming/textures/farming_corn_4.png b/mods/farming/textures/farming_corn_4.png new file mode 100644 index 00000000..a43632dd Binary files /dev/null and b/mods/farming/textures/farming_corn_4.png differ diff --git a/mods/farming/textures/farming_corn_5.png b/mods/farming/textures/farming_corn_5.png new file mode 100644 index 00000000..7b6fb02b Binary files /dev/null and b/mods/farming/textures/farming_corn_5.png differ diff --git a/mods/farming/textures/farming_corn_6.png b/mods/farming/textures/farming_corn_6.png new file mode 100644 index 00000000..313697b9 Binary files /dev/null and b/mods/farming/textures/farming_corn_6.png differ diff --git a/mods/farming/textures/farming_corn_7.png b/mods/farming/textures/farming_corn_7.png new file mode 100644 index 00000000..6a937e79 Binary files /dev/null and b/mods/farming/textures/farming_corn_7.png differ diff --git a/mods/farming/textures/farming_corn_8.png b/mods/farming/textures/farming_corn_8.png new file mode 100644 index 00000000..77e442b0 Binary files /dev/null and b/mods/farming/textures/farming_corn_8.png differ diff --git a/mods/farming/textures/farming_corn_cob.png b/mods/farming/textures/farming_corn_cob.png new file mode 100644 index 00000000..a2fd9da7 Binary files /dev/null and b/mods/farming/textures/farming_corn_cob.png differ diff --git a/mods/farming/textures/farming_cornstarch.png b/mods/farming/textures/farming_cornstarch.png new file mode 100644 index 00000000..d5f8218f Binary files /dev/null and b/mods/farming/textures/farming_cornstarch.png differ diff --git a/mods/farming/textures/farming_cotton.png b/mods/farming/textures/farming_cotton.png new file mode 100644 index 00000000..8aa50e4e Binary files /dev/null and b/mods/farming/textures/farming_cotton.png differ diff --git a/mods/farming/textures/farming_cotton_1.png b/mods/farming/textures/farming_cotton_1.png new file mode 100644 index 00000000..5fc21807 Binary files /dev/null and b/mods/farming/textures/farming_cotton_1.png differ diff --git a/mods/farming/textures/farming_cotton_2.png b/mods/farming/textures/farming_cotton_2.png new file mode 100644 index 00000000..db4f4a3e Binary files /dev/null and b/mods/farming/textures/farming_cotton_2.png differ diff --git a/mods/farming/textures/farming_cotton_3.png b/mods/farming/textures/farming_cotton_3.png new file mode 100644 index 00000000..df3d7a77 Binary files /dev/null and b/mods/farming/textures/farming_cotton_3.png differ diff --git a/mods/farming/textures/farming_cotton_4.png b/mods/farming/textures/farming_cotton_4.png new file mode 100644 index 00000000..f314b07b Binary files /dev/null and b/mods/farming/textures/farming_cotton_4.png differ diff --git a/mods/farming/textures/farming_cotton_5.png b/mods/farming/textures/farming_cotton_5.png new file mode 100644 index 00000000..3e890855 Binary files /dev/null and b/mods/farming/textures/farming_cotton_5.png differ diff --git a/mods/farming/textures/farming_cotton_6.png b/mods/farming/textures/farming_cotton_6.png new file mode 100644 index 00000000..f4bd4fb3 Binary files /dev/null and b/mods/farming/textures/farming_cotton_6.png differ diff --git a/mods/farming/textures/farming_cotton_7.png b/mods/farming/textures/farming_cotton_7.png new file mode 100644 index 00000000..466d40a2 Binary files /dev/null and b/mods/farming/textures/farming_cotton_7.png differ diff --git a/mods/farming/textures/farming_cotton_8.png b/mods/farming/textures/farming_cotton_8.png new file mode 100644 index 00000000..f835ba5b Binary files /dev/null and b/mods/farming/textures/farming_cotton_8.png differ diff --git a/mods/farming/textures/farming_cotton_seed.png b/mods/farming/textures/farming_cotton_seed.png new file mode 100644 index 00000000..f1d5b8ab Binary files /dev/null and b/mods/farming/textures/farming_cotton_seed.png differ diff --git a/mods/farming/textures/farming_cotton_wild.png b/mods/farming/textures/farming_cotton_wild.png new file mode 100644 index 00000000..0107ad4a Binary files /dev/null and b/mods/farming/textures/farming_cotton_wild.png differ diff --git a/mods/farming/textures/farming_cucumber.png b/mods/farming/textures/farming_cucumber.png new file mode 100644 index 00000000..2acb7b2f Binary files /dev/null and b/mods/farming/textures/farming_cucumber.png differ diff --git a/mods/farming/textures/farming_cucumber_1.png b/mods/farming/textures/farming_cucumber_1.png new file mode 100644 index 00000000..e008fd12 Binary files /dev/null and b/mods/farming/textures/farming_cucumber_1.png differ diff --git a/mods/farming/textures/farming_cucumber_2.png b/mods/farming/textures/farming_cucumber_2.png new file mode 100644 index 00000000..9c345ff4 Binary files /dev/null and b/mods/farming/textures/farming_cucumber_2.png differ diff --git a/mods/farming/textures/farming_cucumber_3.png b/mods/farming/textures/farming_cucumber_3.png new file mode 100644 index 00000000..25f3c54f Binary files /dev/null and b/mods/farming/textures/farming_cucumber_3.png differ diff --git a/mods/farming/textures/farming_cucumber_4.png b/mods/farming/textures/farming_cucumber_4.png new file mode 100644 index 00000000..fc62f2f4 Binary files /dev/null and b/mods/farming/textures/farming_cucumber_4.png differ diff --git a/mods/farming/textures/farming_cutting_board.png b/mods/farming/textures/farming_cutting_board.png new file mode 100644 index 00000000..90b3f9ca Binary files /dev/null and b/mods/farming/textures/farming_cutting_board.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil.png b/mods/farming/textures/farming_desert_sand_soil.png new file mode 100644 index 00000000..1450e014 Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil_wet.png b/mods/farming/textures/farming_desert_sand_soil_wet.png new file mode 100644 index 00000000..cffa955d Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil_wet.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil_wet_side.png b/mods/farming/textures/farming_desert_sand_soil_wet_side.png new file mode 100644 index 00000000..fbb2815e Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil_wet_side.png differ diff --git a/mods/farming/textures/farming_donut.png b/mods/farming/textures/farming_donut.png new file mode 100644 index 00000000..8985299b Binary files /dev/null and b/mods/farming/textures/farming_donut.png differ diff --git a/mods/farming/textures/farming_donut_apple.png b/mods/farming/textures/farming_donut_apple.png new file mode 100644 index 00000000..6dfe63d5 Binary files /dev/null and b/mods/farming/textures/farming_donut_apple.png differ diff --git a/mods/farming/textures/farming_donut_chocolate.png b/mods/farming/textures/farming_donut_chocolate.png new file mode 100644 index 00000000..aa4b93fa Binary files /dev/null and b/mods/farming/textures/farming_donut_chocolate.png differ diff --git a/mods/farming/textures/farming_eggplant.png b/mods/farming/textures/farming_eggplant.png new file mode 100644 index 00000000..4315adda Binary files /dev/null and b/mods/farming/textures/farming_eggplant.png differ diff --git a/mods/farming/textures/farming_eggplant_1.png b/mods/farming/textures/farming_eggplant_1.png new file mode 100644 index 00000000..7246860d Binary files /dev/null and b/mods/farming/textures/farming_eggplant_1.png differ diff --git a/mods/farming/textures/farming_eggplant_2.png b/mods/farming/textures/farming_eggplant_2.png new file mode 100644 index 00000000..bfaf3634 Binary files /dev/null and b/mods/farming/textures/farming_eggplant_2.png differ diff --git a/mods/farming/textures/farming_eggplant_3.png b/mods/farming/textures/farming_eggplant_3.png new file mode 100644 index 00000000..c812200c Binary files /dev/null and b/mods/farming/textures/farming_eggplant_3.png differ diff --git a/mods/farming/textures/farming_eggplant_4.png b/mods/farming/textures/farming_eggplant_4.png new file mode 100644 index 00000000..7b32b1be Binary files /dev/null and b/mods/farming/textures/farming_eggplant_4.png differ diff --git a/mods/farming/textures/farming_flour.png b/mods/farming/textures/farming_flour.png new file mode 100644 index 00000000..b1a97836 Binary files /dev/null and b/mods/farming/textures/farming_flour.png differ diff --git a/mods/farming/textures/farming_flour_multigrain.png b/mods/farming/textures/farming_flour_multigrain.png new file mode 100644 index 00000000..5367bc58 Binary files /dev/null and b/mods/farming/textures/farming_flour_multigrain.png differ diff --git a/mods/farming/textures/farming_garlic_bread.png b/mods/farming/textures/farming_garlic_bread.png new file mode 100644 index 00000000..b7600041 Binary files /dev/null and b/mods/farming/textures/farming_garlic_bread.png differ diff --git a/mods/farming/textures/farming_ginger.png b/mods/farming/textures/farming_ginger.png new file mode 100644 index 00000000..22a48b5c Binary files /dev/null and b/mods/farming/textures/farming_ginger.png differ diff --git a/mods/farming/textures/farming_ginger_1.png b/mods/farming/textures/farming_ginger_1.png new file mode 100644 index 00000000..84d0d457 Binary files /dev/null and b/mods/farming/textures/farming_ginger_1.png differ diff --git a/mods/farming/textures/farming_ginger_2.png b/mods/farming/textures/farming_ginger_2.png new file mode 100644 index 00000000..c472d20c Binary files /dev/null and b/mods/farming/textures/farming_ginger_2.png differ diff --git a/mods/farming/textures/farming_ginger_3.png b/mods/farming/textures/farming_ginger_3.png new file mode 100644 index 00000000..96f75d75 Binary files /dev/null and b/mods/farming/textures/farming_ginger_3.png differ diff --git a/mods/farming/textures/farming_ginger_4.png b/mods/farming/textures/farming_ginger_4.png new file mode 100644 index 00000000..32f6de5b Binary files /dev/null and b/mods/farming/textures/farming_ginger_4.png differ diff --git a/mods/farming/textures/farming_gingerbread_man.png b/mods/farming/textures/farming_gingerbread_man.png new file mode 100644 index 00000000..f037ae20 Binary files /dev/null and b/mods/farming/textures/farming_gingerbread_man.png differ diff --git a/mods/farming/textures/farming_grapebush.png b/mods/farming/textures/farming_grapebush.png new file mode 100644 index 00000000..c2e66205 Binary files /dev/null and b/mods/farming/textures/farming_grapebush.png differ diff --git a/mods/farming/textures/farming_grapes.png b/mods/farming/textures/farming_grapes.png new file mode 100644 index 00000000..f6396e21 Binary files /dev/null and b/mods/farming/textures/farming_grapes.png differ diff --git a/mods/farming/textures/farming_grapes_1.png b/mods/farming/textures/farming_grapes_1.png new file mode 100644 index 00000000..64a935d2 Binary files /dev/null and b/mods/farming/textures/farming_grapes_1.png differ diff --git a/mods/farming/textures/farming_grapes_2.png b/mods/farming/textures/farming_grapes_2.png new file mode 100644 index 00000000..6cc2a337 Binary files /dev/null and b/mods/farming/textures/farming_grapes_2.png differ diff --git a/mods/farming/textures/farming_grapes_3.png b/mods/farming/textures/farming_grapes_3.png new file mode 100644 index 00000000..66d63109 Binary files /dev/null and b/mods/farming/textures/farming_grapes_3.png differ diff --git a/mods/farming/textures/farming_grapes_4.png b/mods/farming/textures/farming_grapes_4.png new file mode 100644 index 00000000..57cdc73f Binary files /dev/null and b/mods/farming/textures/farming_grapes_4.png differ diff --git a/mods/farming/textures/farming_grapes_5.png b/mods/farming/textures/farming_grapes_5.png new file mode 100644 index 00000000..aad41f41 Binary files /dev/null and b/mods/farming/textures/farming_grapes_5.png differ diff --git a/mods/farming/textures/farming_grapes_6.png b/mods/farming/textures/farming_grapes_6.png new file mode 100644 index 00000000..2e23a3ca Binary files /dev/null and b/mods/farming/textures/farming_grapes_6.png differ diff --git a/mods/farming/textures/farming_grapes_7.png b/mods/farming/textures/farming_grapes_7.png new file mode 100644 index 00000000..9e70b6d5 Binary files /dev/null and b/mods/farming/textures/farming_grapes_7.png differ diff --git a/mods/farming/textures/farming_grapes_8.png b/mods/farming/textures/farming_grapes_8.png new file mode 100644 index 00000000..5093a066 Binary files /dev/null and b/mods/farming/textures/farming_grapes_8.png differ diff --git a/mods/farming/textures/farming_gyoza.png b/mods/farming/textures/farming_gyoza.png new file mode 100644 index 00000000..c8f036f0 Binary files /dev/null and b/mods/farming/textures/farming_gyoza.png differ diff --git a/mods/farming/textures/farming_hemp_1.png b/mods/farming/textures/farming_hemp_1.png new file mode 100644 index 00000000..6fb45108 Binary files /dev/null and b/mods/farming/textures/farming_hemp_1.png differ diff --git a/mods/farming/textures/farming_hemp_2.png b/mods/farming/textures/farming_hemp_2.png new file mode 100644 index 00000000..a676173c Binary files /dev/null and b/mods/farming/textures/farming_hemp_2.png differ diff --git a/mods/farming/textures/farming_hemp_3.png b/mods/farming/textures/farming_hemp_3.png new file mode 100644 index 00000000..57136d50 Binary files /dev/null and b/mods/farming/textures/farming_hemp_3.png differ diff --git a/mods/farming/textures/farming_hemp_4.png b/mods/farming/textures/farming_hemp_4.png new file mode 100644 index 00000000..b375cf3d Binary files /dev/null and b/mods/farming/textures/farming_hemp_4.png differ diff --git a/mods/farming/textures/farming_hemp_5.png b/mods/farming/textures/farming_hemp_5.png new file mode 100644 index 00000000..890a3d28 Binary files /dev/null and b/mods/farming/textures/farming_hemp_5.png differ diff --git a/mods/farming/textures/farming_hemp_6.png b/mods/farming/textures/farming_hemp_6.png new file mode 100644 index 00000000..258d4e38 Binary files /dev/null and b/mods/farming/textures/farming_hemp_6.png differ diff --git a/mods/farming/textures/farming_hemp_7.png b/mods/farming/textures/farming_hemp_7.png new file mode 100644 index 00000000..1ce3a8d1 Binary files /dev/null and b/mods/farming/textures/farming_hemp_7.png differ diff --git a/mods/farming/textures/farming_hemp_8.png b/mods/farming/textures/farming_hemp_8.png new file mode 100644 index 00000000..8d2143f3 Binary files /dev/null and b/mods/farming/textures/farming_hemp_8.png differ diff --git a/mods/farming/textures/farming_hemp_block.png b/mods/farming/textures/farming_hemp_block.png new file mode 100644 index 00000000..285a2cda Binary files /dev/null and b/mods/farming/textures/farming_hemp_block.png differ diff --git a/mods/farming/textures/farming_hemp_fibre.png b/mods/farming/textures/farming_hemp_fibre.png new file mode 100644 index 00000000..fe3c9187 Binary files /dev/null and b/mods/farming/textures/farming_hemp_fibre.png differ diff --git a/mods/farming/textures/farming_hemp_leaf.png b/mods/farming/textures/farming_hemp_leaf.png new file mode 100644 index 00000000..997c8f0c Binary files /dev/null and b/mods/farming/textures/farming_hemp_leaf.png differ diff --git a/mods/farming/textures/farming_hemp_oil.png b/mods/farming/textures/farming_hemp_oil.png new file mode 100644 index 00000000..fa8afe26 Binary files /dev/null and b/mods/farming/textures/farming_hemp_oil.png differ diff --git a/mods/farming/textures/farming_hemp_rope.png b/mods/farming/textures/farming_hemp_rope.png new file mode 100644 index 00000000..03a7082f Binary files /dev/null and b/mods/farming/textures/farming_hemp_rope.png differ diff --git a/mods/farming/textures/farming_hemp_seed.png b/mods/farming/textures/farming_hemp_seed.png new file mode 100644 index 00000000..6be42c86 Binary files /dev/null and b/mods/farming/textures/farming_hemp_seed.png differ diff --git a/mods/farming/textures/farming_hoe_bomb.png b/mods/farming/textures/farming_hoe_bomb.png new file mode 100644 index 00000000..e8db9b18 Binary files /dev/null and b/mods/farming/textures/farming_hoe_bomb.png differ diff --git a/mods/farming/textures/farming_jaffa_cake.png b/mods/farming/textures/farming_jaffa_cake.png new file mode 100644 index 00000000..87cc0036 Binary files /dev/null and b/mods/farming/textures/farming_jaffa_cake.png differ diff --git a/mods/farming/textures/farming_jerusalem_artichokes.png b/mods/farming/textures/farming_jerusalem_artichokes.png new file mode 100644 index 00000000..db87dbc5 Binary files /dev/null and b/mods/farming/textures/farming_jerusalem_artichokes.png differ diff --git a/mods/farming/textures/farming_juicer.png b/mods/farming/textures/farming_juicer.png new file mode 100644 index 00000000..46265e4b Binary files /dev/null and b/mods/farming/textures/farming_juicer.png differ diff --git a/mods/farming/textures/farming_lettuce.png b/mods/farming/textures/farming_lettuce.png new file mode 100644 index 00000000..3f29fbe4 Binary files /dev/null and b/mods/farming/textures/farming_lettuce.png differ diff --git a/mods/farming/textures/farming_lettuce_1.png b/mods/farming/textures/farming_lettuce_1.png new file mode 100644 index 00000000..39ce9830 Binary files /dev/null and b/mods/farming/textures/farming_lettuce_1.png differ diff --git a/mods/farming/textures/farming_lettuce_2.png b/mods/farming/textures/farming_lettuce_2.png new file mode 100644 index 00000000..0e4ab303 Binary files /dev/null and b/mods/farming/textures/farming_lettuce_2.png differ diff --git a/mods/farming/textures/farming_lettuce_3.png b/mods/farming/textures/farming_lettuce_3.png new file mode 100644 index 00000000..066833b7 Binary files /dev/null and b/mods/farming/textures/farming_lettuce_3.png differ diff --git a/mods/farming/textures/farming_lettuce_4.png b/mods/farming/textures/farming_lettuce_4.png new file mode 100644 index 00000000..847a2de5 Binary files /dev/null and b/mods/farming/textures/farming_lettuce_4.png differ diff --git a/mods/farming/textures/farming_lettuce_5.png b/mods/farming/textures/farming_lettuce_5.png new file mode 100644 index 00000000..97651f40 Binary files /dev/null and b/mods/farming/textures/farming_lettuce_5.png differ diff --git a/mods/farming/textures/farming_mac_and_cheese.png b/mods/farming/textures/farming_mac_and_cheese.png new file mode 100644 index 00000000..9ae8b160 Binary files /dev/null and b/mods/farming/textures/farming_mac_and_cheese.png differ diff --git a/mods/farming/textures/farming_mayo.png b/mods/farming/textures/farming_mayo.png new file mode 100644 index 00000000..0178f140 Binary files /dev/null and b/mods/farming/textures/farming_mayo.png differ diff --git a/mods/farming/textures/farming_melon_1.png b/mods/farming/textures/farming_melon_1.png new file mode 100644 index 00000000..f18f6330 Binary files /dev/null and b/mods/farming/textures/farming_melon_1.png differ diff --git a/mods/farming/textures/farming_melon_2.png b/mods/farming/textures/farming_melon_2.png new file mode 100644 index 00000000..d5d94133 Binary files /dev/null and b/mods/farming/textures/farming_melon_2.png differ diff --git a/mods/farming/textures/farming_melon_3.png b/mods/farming/textures/farming_melon_3.png new file mode 100644 index 00000000..07730e97 Binary files /dev/null and b/mods/farming/textures/farming_melon_3.png differ diff --git a/mods/farming/textures/farming_melon_4.png b/mods/farming/textures/farming_melon_4.png new file mode 100644 index 00000000..9ff1e2f6 Binary files /dev/null and b/mods/farming/textures/farming_melon_4.png differ diff --git a/mods/farming/textures/farming_melon_5.png b/mods/farming/textures/farming_melon_5.png new file mode 100644 index 00000000..c44afcdd Binary files /dev/null and b/mods/farming/textures/farming_melon_5.png differ diff --git a/mods/farming/textures/farming_melon_6.png b/mods/farming/textures/farming_melon_6.png new file mode 100644 index 00000000..f0b9c3db Binary files /dev/null and b/mods/farming/textures/farming_melon_6.png differ diff --git a/mods/farming/textures/farming_melon_7.png b/mods/farming/textures/farming_melon_7.png new file mode 100644 index 00000000..95a3c633 Binary files /dev/null and b/mods/farming/textures/farming_melon_7.png differ diff --git a/mods/farming/textures/farming_melon_bottom.png b/mods/farming/textures/farming_melon_bottom.png new file mode 100644 index 00000000..471d6bec Binary files /dev/null and b/mods/farming/textures/farming_melon_bottom.png differ diff --git a/mods/farming/textures/farming_melon_side.png b/mods/farming/textures/farming_melon_side.png new file mode 100644 index 00000000..7995ea5d Binary files /dev/null and b/mods/farming/textures/farming_melon_side.png differ diff --git a/mods/farming/textures/farming_melon_slice.png b/mods/farming/textures/farming_melon_slice.png new file mode 100644 index 00000000..8ae5dec3 Binary files /dev/null and b/mods/farming/textures/farming_melon_slice.png differ diff --git a/mods/farming/textures/farming_melon_top.png b/mods/farming/textures/farming_melon_top.png new file mode 100644 index 00000000..9309f37d Binary files /dev/null and b/mods/farming/textures/farming_melon_top.png differ diff --git a/mods/farming/textures/farming_mint_1.png b/mods/farming/textures/farming_mint_1.png new file mode 100644 index 00000000..1f303aeb Binary files /dev/null and b/mods/farming/textures/farming_mint_1.png differ diff --git a/mods/farming/textures/farming_mint_2.png b/mods/farming/textures/farming_mint_2.png new file mode 100644 index 00000000..cdcde54b Binary files /dev/null and b/mods/farming/textures/farming_mint_2.png differ diff --git a/mods/farming/textures/farming_mint_3.png b/mods/farming/textures/farming_mint_3.png new file mode 100644 index 00000000..4bfc43f2 Binary files /dev/null and b/mods/farming/textures/farming_mint_3.png differ diff --git a/mods/farming/textures/farming_mint_4.png b/mods/farming/textures/farming_mint_4.png new file mode 100644 index 00000000..a71a6e33 Binary files /dev/null and b/mods/farming/textures/farming_mint_4.png differ diff --git a/mods/farming/textures/farming_mint_leaf.png b/mods/farming/textures/farming_mint_leaf.png new file mode 100644 index 00000000..9e144673 Binary files /dev/null and b/mods/farming/textures/farming_mint_leaf.png differ diff --git a/mods/farming/textures/farming_mint_seeds.png b/mods/farming/textures/farming_mint_seeds.png new file mode 100644 index 00000000..2e0a0eae Binary files /dev/null and b/mods/farming/textures/farming_mint_seeds.png differ diff --git a/mods/farming/textures/farming_mint_tea.png b/mods/farming/textures/farming_mint_tea.png new file mode 100644 index 00000000..a4b6440c Binary files /dev/null and b/mods/farming/textures/farming_mint_tea.png differ diff --git a/mods/farming/textures/farming_mixing_bowl.png b/mods/farming/textures/farming_mixing_bowl.png new file mode 100644 index 00000000..e96edf0e Binary files /dev/null and b/mods/farming/textures/farming_mixing_bowl.png differ diff --git a/mods/farming/textures/farming_mochi.png b/mods/farming/textures/farming_mochi.png new file mode 100644 index 00000000..7b3b2b57 Binary files /dev/null and b/mods/farming/textures/farming_mochi.png differ diff --git a/mods/farming/textures/farming_mortar_pestle.png b/mods/farming/textures/farming_mortar_pestle.png new file mode 100644 index 00000000..abfeb9eb Binary files /dev/null and b/mods/farming/textures/farming_mortar_pestle.png differ diff --git a/mods/farming/textures/farming_oat.png b/mods/farming/textures/farming_oat.png new file mode 100644 index 00000000..e8d5c230 Binary files /dev/null and b/mods/farming/textures/farming_oat.png differ diff --git a/mods/farming/textures/farming_oat_1.png b/mods/farming/textures/farming_oat_1.png new file mode 100644 index 00000000..177fbdf1 Binary files /dev/null and b/mods/farming/textures/farming_oat_1.png differ diff --git a/mods/farming/textures/farming_oat_2.png b/mods/farming/textures/farming_oat_2.png new file mode 100644 index 00000000..fe051ead Binary files /dev/null and b/mods/farming/textures/farming_oat_2.png differ diff --git a/mods/farming/textures/farming_oat_3.png b/mods/farming/textures/farming_oat_3.png new file mode 100644 index 00000000..5aba1086 Binary files /dev/null and b/mods/farming/textures/farming_oat_3.png differ diff --git a/mods/farming/textures/farming_oat_4.png b/mods/farming/textures/farming_oat_4.png new file mode 100644 index 00000000..833b1348 Binary files /dev/null and b/mods/farming/textures/farming_oat_4.png differ diff --git a/mods/farming/textures/farming_oat_5.png b/mods/farming/textures/farming_oat_5.png new file mode 100644 index 00000000..ec0803be Binary files /dev/null and b/mods/farming/textures/farming_oat_5.png differ diff --git a/mods/farming/textures/farming_oat_6.png b/mods/farming/textures/farming_oat_6.png new file mode 100644 index 00000000..847adc56 Binary files /dev/null and b/mods/farming/textures/farming_oat_6.png differ diff --git a/mods/farming/textures/farming_oat_7.png b/mods/farming/textures/farming_oat_7.png new file mode 100644 index 00000000..35528110 Binary files /dev/null and b/mods/farming/textures/farming_oat_7.png differ diff --git a/mods/farming/textures/farming_oat_8.png b/mods/farming/textures/farming_oat_8.png new file mode 100644 index 00000000..c7a55406 Binary files /dev/null and b/mods/farming/textures/farming_oat_8.png differ diff --git a/mods/farming/textures/farming_oat_seed.png b/mods/farming/textures/farming_oat_seed.png new file mode 100644 index 00000000..893c93c0 Binary files /dev/null and b/mods/farming/textures/farming_oat_seed.png differ diff --git a/mods/farming/textures/farming_onigiri.png b/mods/farming/textures/farming_onigiri.png new file mode 100644 index 00000000..e1bf0bc1 Binary files /dev/null and b/mods/farming/textures/farming_onigiri.png differ diff --git a/mods/farming/textures/farming_onion_soup.png b/mods/farming/textures/farming_onion_soup.png new file mode 100644 index 00000000..cd535aec Binary files /dev/null and b/mods/farming/textures/farming_onion_soup.png differ diff --git a/mods/farming/textures/farming_orange.png b/mods/farming/textures/farming_orange.png new file mode 100644 index 00000000..8b9ec299 Binary files /dev/null and b/mods/farming/textures/farming_orange.png differ diff --git a/mods/farming/textures/farming_paella.png b/mods/farming/textures/farming_paella.png new file mode 100644 index 00000000..e6bca52a Binary files /dev/null and b/mods/farming/textures/farming_paella.png differ diff --git a/mods/farming/textures/farming_parsley.png b/mods/farming/textures/farming_parsley.png new file mode 100644 index 00000000..183ecb75 Binary files /dev/null and b/mods/farming/textures/farming_parsley.png differ diff --git a/mods/farming/textures/farming_parsley_1.png b/mods/farming/textures/farming_parsley_1.png new file mode 100644 index 00000000..632928c8 Binary files /dev/null and b/mods/farming/textures/farming_parsley_1.png differ diff --git a/mods/farming/textures/farming_parsley_2.png b/mods/farming/textures/farming_parsley_2.png new file mode 100644 index 00000000..fddbf00b Binary files /dev/null and b/mods/farming/textures/farming_parsley_2.png differ diff --git a/mods/farming/textures/farming_parsley_3.png b/mods/farming/textures/farming_parsley_3.png new file mode 100644 index 00000000..e4aacb94 Binary files /dev/null and b/mods/farming/textures/farming_parsley_3.png differ diff --git a/mods/farming/textures/farming_pasta.png b/mods/farming/textures/farming_pasta.png new file mode 100644 index 00000000..af6a48c7 Binary files /dev/null and b/mods/farming/textures/farming_pasta.png differ diff --git a/mods/farming/textures/farming_pea_1.png b/mods/farming/textures/farming_pea_1.png new file mode 100644 index 00000000..aa98af7c Binary files /dev/null and b/mods/farming/textures/farming_pea_1.png differ diff --git a/mods/farming/textures/farming_pea_2.png b/mods/farming/textures/farming_pea_2.png new file mode 100644 index 00000000..3a4ed622 Binary files /dev/null and b/mods/farming/textures/farming_pea_2.png differ diff --git a/mods/farming/textures/farming_pea_3.png b/mods/farming/textures/farming_pea_3.png new file mode 100644 index 00000000..5cfd90e3 Binary files /dev/null and b/mods/farming/textures/farming_pea_3.png differ diff --git a/mods/farming/textures/farming_pea_4.png b/mods/farming/textures/farming_pea_4.png new file mode 100644 index 00000000..b14f301a Binary files /dev/null and b/mods/farming/textures/farming_pea_4.png differ diff --git a/mods/farming/textures/farming_pea_5.png b/mods/farming/textures/farming_pea_5.png new file mode 100644 index 00000000..ecd81c37 Binary files /dev/null and b/mods/farming/textures/farming_pea_5.png differ diff --git a/mods/farming/textures/farming_pea_pod.png b/mods/farming/textures/farming_pea_pod.png new file mode 100644 index 00000000..1c19c9f6 Binary files /dev/null and b/mods/farming/textures/farming_pea_pod.png differ diff --git a/mods/farming/textures/farming_pea_soup.png b/mods/farming/textures/farming_pea_soup.png new file mode 100644 index 00000000..03753cf6 Binary files /dev/null and b/mods/farming/textures/farming_pea_soup.png differ diff --git a/mods/farming/textures/farming_pineapple.png b/mods/farming/textures/farming_pineapple.png new file mode 100644 index 00000000..c2d2ceb1 Binary files /dev/null and b/mods/farming/textures/farming_pineapple.png differ diff --git a/mods/farming/textures/farming_pineapple_1.png b/mods/farming/textures/farming_pineapple_1.png new file mode 100644 index 00000000..7daa9176 Binary files /dev/null and b/mods/farming/textures/farming_pineapple_1.png differ diff --git a/mods/farming/textures/farming_pineapple_2.png b/mods/farming/textures/farming_pineapple_2.png new file mode 100644 index 00000000..6fe2a14b Binary files /dev/null and b/mods/farming/textures/farming_pineapple_2.png differ diff --git a/mods/farming/textures/farming_pineapple_3.png b/mods/farming/textures/farming_pineapple_3.png new file mode 100644 index 00000000..e9a625ab Binary files /dev/null and b/mods/farming/textures/farming_pineapple_3.png differ diff --git a/mods/farming/textures/farming_pineapple_4.png b/mods/farming/textures/farming_pineapple_4.png new file mode 100644 index 00000000..5bc64153 Binary files /dev/null and b/mods/farming/textures/farming_pineapple_4.png differ diff --git a/mods/farming/textures/farming_pineapple_5.png b/mods/farming/textures/farming_pineapple_5.png new file mode 100644 index 00000000..ddf2dd56 Binary files /dev/null and b/mods/farming/textures/farming_pineapple_5.png differ diff --git a/mods/farming/textures/farming_pineapple_6.png b/mods/farming/textures/farming_pineapple_6.png new file mode 100644 index 00000000..a674df2d Binary files /dev/null and b/mods/farming/textures/farming_pineapple_6.png differ diff --git a/mods/farming/textures/farming_pineapple_7.png b/mods/farming/textures/farming_pineapple_7.png new file mode 100644 index 00000000..5158af32 Binary files /dev/null and b/mods/farming/textures/farming_pineapple_7.png differ diff --git a/mods/farming/textures/farming_pineapple_8.png b/mods/farming/textures/farming_pineapple_8.png new file mode 100644 index 00000000..006a54ef Binary files /dev/null and b/mods/farming/textures/farming_pineapple_8.png differ diff --git a/mods/farming/textures/farming_pineapple_juice.png b/mods/farming/textures/farming_pineapple_juice.png new file mode 100644 index 00000000..43a54c70 Binary files /dev/null and b/mods/farming/textures/farming_pineapple_juice.png differ diff --git a/mods/farming/textures/farming_pineapple_ring.png b/mods/farming/textures/farming_pineapple_ring.png new file mode 100644 index 00000000..4cf3feb8 Binary files /dev/null and b/mods/farming/textures/farming_pineapple_ring.png differ diff --git a/mods/farming/textures/farming_pineapple_top.png b/mods/farming/textures/farming_pineapple_top.png new file mode 100644 index 00000000..78e3f36a Binary files /dev/null and b/mods/farming/textures/farming_pineapple_top.png differ diff --git a/mods/farming/textures/farming_popcorn.png b/mods/farming/textures/farming_popcorn.png new file mode 100644 index 00000000..9aa75807 Binary files /dev/null and b/mods/farming/textures/farming_popcorn.png differ diff --git a/mods/farming/textures/farming_porridge.png b/mods/farming/textures/farming_porridge.png new file mode 100644 index 00000000..e31929be Binary files /dev/null and b/mods/farming/textures/farming_porridge.png differ diff --git a/mods/farming/textures/farming_pot.png b/mods/farming/textures/farming_pot.png new file mode 100644 index 00000000..d28411d2 Binary files /dev/null and b/mods/farming/textures/farming_pot.png differ diff --git a/mods/farming/textures/farming_potato.png b/mods/farming/textures/farming_potato.png new file mode 100644 index 00000000..6e91d6ae Binary files /dev/null and b/mods/farming/textures/farming_potato.png differ diff --git a/mods/farming/textures/farming_potato_1.png b/mods/farming/textures/farming_potato_1.png new file mode 100644 index 00000000..a9c00409 Binary files /dev/null and b/mods/farming/textures/farming_potato_1.png differ diff --git a/mods/farming/textures/farming_potato_2.png b/mods/farming/textures/farming_potato_2.png new file mode 100644 index 00000000..c81830c4 Binary files /dev/null and b/mods/farming/textures/farming_potato_2.png differ diff --git a/mods/farming/textures/farming_potato_3.png b/mods/farming/textures/farming_potato_3.png new file mode 100644 index 00000000..a3d79209 Binary files /dev/null and b/mods/farming/textures/farming_potato_3.png differ diff --git a/mods/farming/textures/farming_potato_4.png b/mods/farming/textures/farming_potato_4.png new file mode 100644 index 00000000..405b7e56 Binary files /dev/null and b/mods/farming/textures/farming_potato_4.png differ diff --git a/mods/farming/textures/farming_potato_omelet.png b/mods/farming/textures/farming_potato_omelet.png new file mode 100644 index 00000000..aee3cfb5 Binary files /dev/null and b/mods/farming/textures/farming_potato_omelet.png differ diff --git a/mods/farming/textures/farming_potato_salad.png b/mods/farming/textures/farming_potato_salad.png new file mode 100644 index 00000000..ce148bb5 Binary files /dev/null and b/mods/farming/textures/farming_potato_salad.png differ diff --git a/mods/farming/textures/farming_pumpkin_1.png b/mods/farming/textures/farming_pumpkin_1.png new file mode 100644 index 00000000..e5b9a2bf Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_1.png differ diff --git a/mods/farming/textures/farming_pumpkin_2.png b/mods/farming/textures/farming_pumpkin_2.png new file mode 100644 index 00000000..d977e8c2 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_2.png differ diff --git a/mods/farming/textures/farming_pumpkin_3.png b/mods/farming/textures/farming_pumpkin_3.png new file mode 100644 index 00000000..83f81905 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_3.png differ diff --git a/mods/farming/textures/farming_pumpkin_4.png b/mods/farming/textures/farming_pumpkin_4.png new file mode 100644 index 00000000..20de004a Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_4.png differ diff --git a/mods/farming/textures/farming_pumpkin_5.png b/mods/farming/textures/farming_pumpkin_5.png new file mode 100644 index 00000000..59fa78eb Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_5.png differ diff --git a/mods/farming/textures/farming_pumpkin_6.png b/mods/farming/textures/farming_pumpkin_6.png new file mode 100644 index 00000000..6ae543e4 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_6.png differ diff --git a/mods/farming/textures/farming_pumpkin_7.png b/mods/farming/textures/farming_pumpkin_7.png new file mode 100644 index 00000000..79190e09 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_7.png differ diff --git a/mods/farming/textures/farming_pumpkin_8.png b/mods/farming/textures/farming_pumpkin_8.png new file mode 100644 index 00000000..b941442c Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_8.png differ diff --git a/mods/farming/textures/farming_pumpkin_bottom.png b/mods/farming/textures/farming_pumpkin_bottom.png new file mode 100644 index 00000000..8c8f56e8 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_bottom.png differ diff --git a/mods/farming/textures/farming_pumpkin_bread.png b/mods/farming/textures/farming_pumpkin_bread.png new file mode 100644 index 00000000..0dfae08f Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_bread.png differ diff --git a/mods/farming/textures/farming_pumpkin_dough.png b/mods/farming/textures/farming_pumpkin_dough.png new file mode 100644 index 00000000..62ea7a65 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_dough.png differ diff --git a/mods/farming/textures/farming_pumpkin_face_off.png b/mods/farming/textures/farming_pumpkin_face_off.png new file mode 100644 index 00000000..ed46e833 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_face_off.png differ diff --git a/mods/farming/textures/farming_pumpkin_face_on.png b/mods/farming/textures/farming_pumpkin_face_on.png new file mode 100644 index 00000000..4708c9d6 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_face_on.png differ diff --git a/mods/farming/textures/farming_pumpkin_side.png b/mods/farming/textures/farming_pumpkin_side.png new file mode 100644 index 00000000..e29b7320 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_side.png differ diff --git a/mods/farming/textures/farming_pumpkin_slice.png b/mods/farming/textures/farming_pumpkin_slice.png new file mode 100644 index 00000000..1fb659e2 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_slice.png differ diff --git a/mods/farming/textures/farming_pumpkin_top.png b/mods/farming/textures/farming_pumpkin_top.png new file mode 100644 index 00000000..6b8e91bb Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_top.png differ diff --git a/mods/farming/textures/farming_raspberries.png b/mods/farming/textures/farming_raspberries.png new file mode 100644 index 00000000..ab96e1bf Binary files /dev/null and b/mods/farming/textures/farming_raspberries.png differ diff --git a/mods/farming/textures/farming_raspberry_1.png b/mods/farming/textures/farming_raspberry_1.png new file mode 100644 index 00000000..d1a7ffca Binary files /dev/null and b/mods/farming/textures/farming_raspberry_1.png differ diff --git a/mods/farming/textures/farming_raspberry_2.png b/mods/farming/textures/farming_raspberry_2.png new file mode 100644 index 00000000..308a0caf Binary files /dev/null and b/mods/farming/textures/farming_raspberry_2.png differ diff --git a/mods/farming/textures/farming_raspberry_3.png b/mods/farming/textures/farming_raspberry_3.png new file mode 100644 index 00000000..43d2ab13 Binary files /dev/null and b/mods/farming/textures/farming_raspberry_3.png differ diff --git a/mods/farming/textures/farming_raspberry_4.png b/mods/farming/textures/farming_raspberry_4.png new file mode 100644 index 00000000..32da6b9f Binary files /dev/null and b/mods/farming/textures/farming_raspberry_4.png differ diff --git a/mods/farming/textures/farming_raspberry_smoothie.png b/mods/farming/textures/farming_raspberry_smoothie.png new file mode 100644 index 00000000..fe178d11 Binary files /dev/null and b/mods/farming/textures/farming_raspberry_smoothie.png differ diff --git a/mods/farming/textures/farming_rhubarb.png b/mods/farming/textures/farming_rhubarb.png new file mode 100644 index 00000000..7d416ab2 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb.png differ diff --git a/mods/farming/textures/farming_rhubarb_1.png b/mods/farming/textures/farming_rhubarb_1.png new file mode 100644 index 00000000..5ebf1160 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_1.png differ diff --git a/mods/farming/textures/farming_rhubarb_2.png b/mods/farming/textures/farming_rhubarb_2.png new file mode 100644 index 00000000..01585b1b Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_2.png differ diff --git a/mods/farming/textures/farming_rhubarb_3.png b/mods/farming/textures/farming_rhubarb_3.png new file mode 100644 index 00000000..71845c75 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_3.png differ diff --git a/mods/farming/textures/farming_rhubarb_4.png b/mods/farming/textures/farming_rhubarb_4.png new file mode 100644 index 00000000..b412f7e0 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_4.png differ diff --git a/mods/farming/textures/farming_rhubarb_pie.png b/mods/farming/textures/farming_rhubarb_pie.png new file mode 100644 index 00000000..d5593260 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_pie.png differ diff --git a/mods/farming/textures/farming_rice.png b/mods/farming/textures/farming_rice.png new file mode 100644 index 00000000..9b42a346 Binary files /dev/null and b/mods/farming/textures/farming_rice.png differ diff --git a/mods/farming/textures/farming_rice_1.png b/mods/farming/textures/farming_rice_1.png new file mode 100644 index 00000000..715bb2e6 Binary files /dev/null and b/mods/farming/textures/farming_rice_1.png differ diff --git a/mods/farming/textures/farming_rice_2.png b/mods/farming/textures/farming_rice_2.png new file mode 100644 index 00000000..2662d42b Binary files /dev/null and b/mods/farming/textures/farming_rice_2.png differ diff --git a/mods/farming/textures/farming_rice_3.png b/mods/farming/textures/farming_rice_3.png new file mode 100644 index 00000000..fee87b21 Binary files /dev/null and b/mods/farming/textures/farming_rice_3.png differ diff --git a/mods/farming/textures/farming_rice_4.png b/mods/farming/textures/farming_rice_4.png new file mode 100644 index 00000000..97b026f6 Binary files /dev/null and b/mods/farming/textures/farming_rice_4.png differ diff --git a/mods/farming/textures/farming_rice_5.png b/mods/farming/textures/farming_rice_5.png new file mode 100644 index 00000000..c249851c Binary files /dev/null and b/mods/farming/textures/farming_rice_5.png differ diff --git a/mods/farming/textures/farming_rice_6.png b/mods/farming/textures/farming_rice_6.png new file mode 100644 index 00000000..c0e7233a Binary files /dev/null and b/mods/farming/textures/farming_rice_6.png differ diff --git a/mods/farming/textures/farming_rice_7.png b/mods/farming/textures/farming_rice_7.png new file mode 100644 index 00000000..9d251ee2 Binary files /dev/null and b/mods/farming/textures/farming_rice_7.png differ diff --git a/mods/farming/textures/farming_rice_8.png b/mods/farming/textures/farming_rice_8.png new file mode 100644 index 00000000..41b37e03 Binary files /dev/null and b/mods/farming/textures/farming_rice_8.png differ diff --git a/mods/farming/textures/farming_rice_bread.png b/mods/farming/textures/farming_rice_bread.png new file mode 100644 index 00000000..f14f741d Binary files /dev/null and b/mods/farming/textures/farming_rice_bread.png differ diff --git a/mods/farming/textures/farming_rice_flour.png b/mods/farming/textures/farming_rice_flour.png new file mode 100644 index 00000000..27221516 Binary files /dev/null and b/mods/farming/textures/farming_rice_flour.png differ diff --git a/mods/farming/textures/farming_rice_seed.png b/mods/farming/textures/farming_rice_seed.png new file mode 100644 index 00000000..8a84f58d Binary files /dev/null and b/mods/farming/textures/farming_rice_seed.png differ diff --git a/mods/farming/textures/farming_rose_water.png b/mods/farming/textures/farming_rose_water.png new file mode 100644 index 00000000..96e546f2 Binary files /dev/null and b/mods/farming/textures/farming_rose_water.png differ diff --git a/mods/farming/textures/farming_rye.png b/mods/farming/textures/farming_rye.png new file mode 100644 index 00000000..ebc5b379 Binary files /dev/null and b/mods/farming/textures/farming_rye.png differ diff --git a/mods/farming/textures/farming_rye_1.png b/mods/farming/textures/farming_rye_1.png new file mode 100644 index 00000000..932b6212 Binary files /dev/null and b/mods/farming/textures/farming_rye_1.png differ diff --git a/mods/farming/textures/farming_rye_2.png b/mods/farming/textures/farming_rye_2.png new file mode 100644 index 00000000..b6a69b70 Binary files /dev/null and b/mods/farming/textures/farming_rye_2.png differ diff --git a/mods/farming/textures/farming_rye_3.png b/mods/farming/textures/farming_rye_3.png new file mode 100644 index 00000000..aaa71c2c Binary files /dev/null and b/mods/farming/textures/farming_rye_3.png differ diff --git a/mods/farming/textures/farming_rye_4.png b/mods/farming/textures/farming_rye_4.png new file mode 100644 index 00000000..ea1246ef Binary files /dev/null and b/mods/farming/textures/farming_rye_4.png differ diff --git a/mods/farming/textures/farming_rye_5.png b/mods/farming/textures/farming_rye_5.png new file mode 100644 index 00000000..b359673c Binary files /dev/null and b/mods/farming/textures/farming_rye_5.png differ diff --git a/mods/farming/textures/farming_rye_6.png b/mods/farming/textures/farming_rye_6.png new file mode 100644 index 00000000..749a2ef8 Binary files /dev/null and b/mods/farming/textures/farming_rye_6.png differ diff --git a/mods/farming/textures/farming_rye_7.png b/mods/farming/textures/farming_rye_7.png new file mode 100644 index 00000000..fc78198c Binary files /dev/null and b/mods/farming/textures/farming_rye_7.png differ diff --git a/mods/farming/textures/farming_rye_8.png b/mods/farming/textures/farming_rye_8.png new file mode 100644 index 00000000..0b7c33ed Binary files /dev/null and b/mods/farming/textures/farming_rye_8.png differ diff --git a/mods/farming/textures/farming_rye_seed.png b/mods/farming/textures/farming_rye_seed.png new file mode 100644 index 00000000..e65ba9b4 Binary files /dev/null and b/mods/farming/textures/farming_rye_seed.png differ diff --git a/mods/farming/textures/farming_salad.png b/mods/farming/textures/farming_salad.png new file mode 100644 index 00000000..febf40f3 Binary files /dev/null and b/mods/farming/textures/farming_salad.png differ diff --git a/mods/farming/textures/farming_salt.png b/mods/farming/textures/farming_salt.png new file mode 100644 index 00000000..2b23e33f Binary files /dev/null and b/mods/farming/textures/farming_salt.png differ diff --git a/mods/farming/textures/farming_salt_crystal.png b/mods/farming/textures/farming_salt_crystal.png new file mode 100644 index 00000000..e94ed7b3 Binary files /dev/null and b/mods/farming/textures/farming_salt_crystal.png differ diff --git a/mods/farming/textures/farming_saucepan.png b/mods/farming/textures/farming_saucepan.png new file mode 100644 index 00000000..2625d45d Binary files /dev/null and b/mods/farming/textures/farming_saucepan.png differ diff --git a/mods/farming/textures/farming_scythe_mithril.png b/mods/farming/textures/farming_scythe_mithril.png new file mode 100644 index 00000000..17c89c5a Binary files /dev/null and b/mods/farming/textures/farming_scythe_mithril.png differ diff --git a/mods/farming/textures/farming_skillet.png b/mods/farming/textures/farming_skillet.png new file mode 100644 index 00000000..60d26a1e Binary files /dev/null and b/mods/farming/textures/farming_skillet.png differ diff --git a/mods/farming/textures/farming_soil.png b/mods/farming/textures/farming_soil.png new file mode 100644 index 00000000..5cd3e681 Binary files /dev/null and b/mods/farming/textures/farming_soil.png differ diff --git a/mods/farming/textures/farming_soil_wet.png b/mods/farming/textures/farming_soil_wet.png new file mode 100644 index 00000000..0b4487d8 Binary files /dev/null and b/mods/farming/textures/farming_soil_wet.png differ diff --git a/mods/farming/textures/farming_soil_wet_side.png b/mods/farming/textures/farming_soil_wet_side.png new file mode 100644 index 00000000..f0b1bd45 Binary files /dev/null and b/mods/farming/textures/farming_soil_wet_side.png differ diff --git a/mods/farming/textures/farming_soy_1.png b/mods/farming/textures/farming_soy_1.png new file mode 100644 index 00000000..9a64d873 Binary files /dev/null and b/mods/farming/textures/farming_soy_1.png differ diff --git a/mods/farming/textures/farming_soy_2.png b/mods/farming/textures/farming_soy_2.png new file mode 100644 index 00000000..e4915941 Binary files /dev/null and b/mods/farming/textures/farming_soy_2.png differ diff --git a/mods/farming/textures/farming_soy_3.png b/mods/farming/textures/farming_soy_3.png new file mode 100644 index 00000000..e8f39ee5 Binary files /dev/null and b/mods/farming/textures/farming_soy_3.png differ diff --git a/mods/farming/textures/farming_soy_4.png b/mods/farming/textures/farming_soy_4.png new file mode 100644 index 00000000..3012c2af Binary files /dev/null and b/mods/farming/textures/farming_soy_4.png differ diff --git a/mods/farming/textures/farming_soy_5.png b/mods/farming/textures/farming_soy_5.png new file mode 100644 index 00000000..63f0ce49 Binary files /dev/null and b/mods/farming/textures/farming_soy_5.png differ diff --git a/mods/farming/textures/farming_soy_6.png b/mods/farming/textures/farming_soy_6.png new file mode 100644 index 00000000..581def50 Binary files /dev/null and b/mods/farming/textures/farming_soy_6.png differ diff --git a/mods/farming/textures/farming_soy_7.png b/mods/farming/textures/farming_soy_7.png new file mode 100644 index 00000000..eb47e325 Binary files /dev/null and b/mods/farming/textures/farming_soy_7.png differ diff --git a/mods/farming/textures/farming_soy_milk_glass.png b/mods/farming/textures/farming_soy_milk_glass.png new file mode 100644 index 00000000..95c567dd Binary files /dev/null and b/mods/farming/textures/farming_soy_milk_glass.png differ diff --git a/mods/farming/textures/farming_soy_pod.png b/mods/farming/textures/farming_soy_pod.png new file mode 100644 index 00000000..eceeec53 Binary files /dev/null and b/mods/farming/textures/farming_soy_pod.png differ diff --git a/mods/farming/textures/farming_soy_sauce.png b/mods/farming/textures/farming_soy_sauce.png new file mode 100644 index 00000000..f32caec4 Binary files /dev/null and b/mods/farming/textures/farming_soy_sauce.png differ diff --git a/mods/farming/textures/farming_spaghetti.png b/mods/farming/textures/farming_spaghetti.png new file mode 100644 index 00000000..b18ee439 Binary files /dev/null and b/mods/farming/textures/farming_spaghetti.png differ diff --git a/mods/farming/textures/farming_spanish_potatoes.png b/mods/farming/textures/farming_spanish_potatoes.png new file mode 100644 index 00000000..8571b180 Binary files /dev/null and b/mods/farming/textures/farming_spanish_potatoes.png differ diff --git a/mods/farming/textures/farming_spinach.png b/mods/farming/textures/farming_spinach.png new file mode 100644 index 00000000..2e7d519a Binary files /dev/null and b/mods/farming/textures/farming_spinach.png differ diff --git a/mods/farming/textures/farming_spinach_1.png b/mods/farming/textures/farming_spinach_1.png new file mode 100644 index 00000000..67c95f86 Binary files /dev/null and b/mods/farming/textures/farming_spinach_1.png differ diff --git a/mods/farming/textures/farming_spinach_2.png b/mods/farming/textures/farming_spinach_2.png new file mode 100644 index 00000000..52d976db Binary files /dev/null and b/mods/farming/textures/farming_spinach_2.png differ diff --git a/mods/farming/textures/farming_spinach_3.png b/mods/farming/textures/farming_spinach_3.png new file mode 100644 index 00000000..ef2e85f9 Binary files /dev/null and b/mods/farming/textures/farming_spinach_3.png differ diff --git a/mods/farming/textures/farming_spinach_4.png b/mods/farming/textures/farming_spinach_4.png new file mode 100644 index 00000000..9435bc66 Binary files /dev/null and b/mods/farming/textures/farming_spinach_4.png differ diff --git a/mods/farming/textures/farming_straw.png b/mods/farming/textures/farming_straw.png new file mode 100644 index 00000000..e4277723 Binary files /dev/null and b/mods/farming/textures/farming_straw.png differ diff --git a/mods/farming/textures/farming_strawberry.png b/mods/farming/textures/farming_strawberry.png new file mode 100644 index 00000000..5b43e6bc Binary files /dev/null and b/mods/farming/textures/farming_strawberry.png differ diff --git a/mods/farming/textures/farming_string.png b/mods/farming/textures/farming_string.png new file mode 100644 index 00000000..e2bbfd7a Binary files /dev/null and b/mods/farming/textures/farming_string.png differ diff --git a/mods/farming/textures/farming_sugar.png b/mods/farming/textures/farming_sugar.png new file mode 100644 index 00000000..5cb7fa01 Binary files /dev/null and b/mods/farming/textures/farming_sugar.png differ diff --git a/mods/farming/textures/farming_sugar_cube.png b/mods/farming/textures/farming_sugar_cube.png new file mode 100644 index 00000000..7c9b8352 Binary files /dev/null and b/mods/farming/textures/farming_sugar_cube.png differ diff --git a/mods/farming/textures/farming_sunflower.png b/mods/farming/textures/farming_sunflower.png new file mode 100644 index 00000000..17a91c97 Binary files /dev/null and b/mods/farming/textures/farming_sunflower.png differ diff --git a/mods/farming/textures/farming_sunflower_1.png b/mods/farming/textures/farming_sunflower_1.png new file mode 100644 index 00000000..719ec402 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_1.png differ diff --git a/mods/farming/textures/farming_sunflower_2.png b/mods/farming/textures/farming_sunflower_2.png new file mode 100644 index 00000000..4ccfff3b Binary files /dev/null and b/mods/farming/textures/farming_sunflower_2.png differ diff --git a/mods/farming/textures/farming_sunflower_3.png b/mods/farming/textures/farming_sunflower_3.png new file mode 100644 index 00000000..719b5f17 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_3.png differ diff --git a/mods/farming/textures/farming_sunflower_4.png b/mods/farming/textures/farming_sunflower_4.png new file mode 100644 index 00000000..2b03eb50 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_4.png differ diff --git a/mods/farming/textures/farming_sunflower_5.png b/mods/farming/textures/farming_sunflower_5.png new file mode 100644 index 00000000..a9c474ea Binary files /dev/null and b/mods/farming/textures/farming_sunflower_5.png differ diff --git a/mods/farming/textures/farming_sunflower_6.png b/mods/farming/textures/farming_sunflower_6.png new file mode 100644 index 00000000..a2ee8432 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_6.png differ diff --git a/mods/farming/textures/farming_sunflower_7.png b/mods/farming/textures/farming_sunflower_7.png new file mode 100644 index 00000000..e3a09860 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_7.png differ diff --git a/mods/farming/textures/farming_sunflower_8.png b/mods/farming/textures/farming_sunflower_8.png new file mode 100644 index 00000000..5d1022f7 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_8.png differ diff --git a/mods/farming/textures/farming_sunflower_bread.png b/mods/farming/textures/farming_sunflower_bread.png new file mode 100644 index 00000000..49938700 Binary files /dev/null and b/mods/farming/textures/farming_sunflower_bread.png differ diff --git a/mods/farming/textures/farming_sunflower_oil.png b/mods/farming/textures/farming_sunflower_oil.png new file mode 100644 index 00000000..36d139ff Binary files /dev/null and b/mods/farming/textures/farming_sunflower_oil.png differ diff --git a/mods/farming/textures/farming_sunflower_seeds.png b/mods/farming/textures/farming_sunflower_seeds.png new file mode 100644 index 00000000..fe67a0ce Binary files /dev/null and b/mods/farming/textures/farming_sunflower_seeds.png differ diff --git a/mods/farming/textures/farming_sunflower_seeds_toasted.png b/mods/farming/textures/farming_sunflower_seeds_toasted.png new file mode 100644 index 00000000..1973e48f Binary files /dev/null and b/mods/farming/textures/farming_sunflower_seeds_toasted.png differ diff --git a/mods/farming/textures/farming_toast.png b/mods/farming/textures/farming_toast.png new file mode 100644 index 00000000..8a4524e2 Binary files /dev/null and b/mods/farming/textures/farming_toast.png differ diff --git a/mods/farming/textures/farming_toast_sandwich.png b/mods/farming/textures/farming_toast_sandwich.png new file mode 100644 index 00000000..c60ff5a7 Binary files /dev/null and b/mods/farming/textures/farming_toast_sandwich.png differ diff --git a/mods/farming/textures/farming_tofu.png b/mods/farming/textures/farming_tofu.png new file mode 100644 index 00000000..aaa0a2cf Binary files /dev/null and b/mods/farming/textures/farming_tofu.png differ diff --git a/mods/farming/textures/farming_tofu_cooked.png b/mods/farming/textures/farming_tofu_cooked.png new file mode 100644 index 00000000..23963cec Binary files /dev/null and b/mods/farming/textures/farming_tofu_cooked.png differ diff --git a/mods/farming/textures/farming_tomato.png b/mods/farming/textures/farming_tomato.png new file mode 100644 index 00000000..586aa56d Binary files /dev/null and b/mods/farming/textures/farming_tomato.png differ diff --git a/mods/farming/textures/farming_tomato_1.png b/mods/farming/textures/farming_tomato_1.png new file mode 100644 index 00000000..d858e586 Binary files /dev/null and b/mods/farming/textures/farming_tomato_1.png differ diff --git a/mods/farming/textures/farming_tomato_2.png b/mods/farming/textures/farming_tomato_2.png new file mode 100644 index 00000000..9d9ed6d0 Binary files /dev/null and b/mods/farming/textures/farming_tomato_2.png differ diff --git a/mods/farming/textures/farming_tomato_3.png b/mods/farming/textures/farming_tomato_3.png new file mode 100644 index 00000000..fe3dcf0a Binary files /dev/null and b/mods/farming/textures/farming_tomato_3.png differ diff --git a/mods/farming/textures/farming_tomato_4.png b/mods/farming/textures/farming_tomato_4.png new file mode 100644 index 00000000..27c32828 Binary files /dev/null and b/mods/farming/textures/farming_tomato_4.png differ diff --git a/mods/farming/textures/farming_tomato_5.png b/mods/farming/textures/farming_tomato_5.png new file mode 100644 index 00000000..f369a68f Binary files /dev/null and b/mods/farming/textures/farming_tomato_5.png differ diff --git a/mods/farming/textures/farming_tomato_6.png b/mods/farming/textures/farming_tomato_6.png new file mode 100644 index 00000000..0135cb53 Binary files /dev/null and b/mods/farming/textures/farming_tomato_6.png differ diff --git a/mods/farming/textures/farming_tomato_7.png b/mods/farming/textures/farming_tomato_7.png new file mode 100644 index 00000000..4cd85f5f Binary files /dev/null and b/mods/farming/textures/farming_tomato_7.png differ diff --git a/mods/farming/textures/farming_tomato_8.png b/mods/farming/textures/farming_tomato_8.png new file mode 100644 index 00000000..0b490257 Binary files /dev/null and b/mods/farming/textures/farming_tomato_8.png differ diff --git a/mods/farming/textures/farming_tomato_soup.png b/mods/farming/textures/farming_tomato_soup.png new file mode 100644 index 00000000..d58d53db Binary files /dev/null and b/mods/farming/textures/farming_tomato_soup.png differ diff --git a/mods/farming/textures/farming_tool_bronzehoe.png b/mods/farming/textures/farming_tool_bronzehoe.png new file mode 100644 index 00000000..ef07a80a Binary files /dev/null and b/mods/farming/textures/farming_tool_bronzehoe.png differ diff --git a/mods/farming/textures/farming_tool_diamondhoe.png b/mods/farming/textures/farming_tool_diamondhoe.png new file mode 100644 index 00000000..093acb82 Binary files /dev/null and b/mods/farming/textures/farming_tool_diamondhoe.png differ diff --git a/mods/farming/textures/farming_tool_mesehoe.png b/mods/farming/textures/farming_tool_mesehoe.png new file mode 100644 index 00000000..ffd597a4 Binary files /dev/null and b/mods/farming/textures/farming_tool_mesehoe.png differ diff --git a/mods/farming/textures/farming_tool_steelhoe.png b/mods/farming/textures/farming_tool_steelhoe.png new file mode 100644 index 00000000..893a6958 Binary files /dev/null and b/mods/farming/textures/farming_tool_steelhoe.png differ diff --git a/mods/farming/textures/farming_tool_stonehoe.png b/mods/farming/textures/farming_tool_stonehoe.png new file mode 100644 index 00000000..4f8dade0 Binary files /dev/null and b/mods/farming/textures/farming_tool_stonehoe.png differ diff --git a/mods/farming/textures/farming_tool_woodhoe.png b/mods/farming/textures/farming_tool_woodhoe.png new file mode 100644 index 00000000..8b20d2dc Binary files /dev/null and b/mods/farming/textures/farming_tool_woodhoe.png differ diff --git a/mods/farming/textures/farming_trellis.png b/mods/farming/textures/farming_trellis.png new file mode 100644 index 00000000..855b9326 Binary files /dev/null and b/mods/farming/textures/farming_trellis.png differ diff --git a/mods/farming/textures/farming_turkish_delight.png b/mods/farming/textures/farming_turkish_delight.png new file mode 100644 index 00000000..198ffc45 Binary files /dev/null and b/mods/farming/textures/farming_turkish_delight.png differ diff --git a/mods/farming/textures/farming_vanilla.png b/mods/farming/textures/farming_vanilla.png new file mode 100644 index 00000000..ddcb540e Binary files /dev/null and b/mods/farming/textures/farming_vanilla.png differ diff --git a/mods/farming/textures/farming_vanilla_1.png b/mods/farming/textures/farming_vanilla_1.png new file mode 100644 index 00000000..fdd10c04 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_1.png differ diff --git a/mods/farming/textures/farming_vanilla_2.png b/mods/farming/textures/farming_vanilla_2.png new file mode 100644 index 00000000..73ba2ca6 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_2.png differ diff --git a/mods/farming/textures/farming_vanilla_3.png b/mods/farming/textures/farming_vanilla_3.png new file mode 100644 index 00000000..596b9bfa Binary files /dev/null and b/mods/farming/textures/farming_vanilla_3.png differ diff --git a/mods/farming/textures/farming_vanilla_4.png b/mods/farming/textures/farming_vanilla_4.png new file mode 100644 index 00000000..55858275 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_4.png differ diff --git a/mods/farming/textures/farming_vanilla_5.png b/mods/farming/textures/farming_vanilla_5.png new file mode 100644 index 00000000..7ac3ef73 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_5.png differ diff --git a/mods/farming/textures/farming_vanilla_6.png b/mods/farming/textures/farming_vanilla_6.png new file mode 100644 index 00000000..10a5bfd0 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_6.png differ diff --git a/mods/farming/textures/farming_vanilla_7.png b/mods/farming/textures/farming_vanilla_7.png new file mode 100644 index 00000000..f2962ee6 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_7.png differ diff --git a/mods/farming/textures/farming_vanilla_8.png b/mods/farming/textures/farming_vanilla_8.png new file mode 100644 index 00000000..1801a976 Binary files /dev/null and b/mods/farming/textures/farming_vanilla_8.png differ diff --git a/mods/farming/textures/farming_vanilla_extract.png b/mods/farming/textures/farming_vanilla_extract.png new file mode 100644 index 00000000..c0668cef Binary files /dev/null and b/mods/farming/textures/farming_vanilla_extract.png differ diff --git a/mods/farming/textures/farming_vanilla_flan.png b/mods/farming/textures/farming_vanilla_flan.png new file mode 100644 index 00000000..10008c4b Binary files /dev/null and b/mods/farming/textures/farming_vanilla_flan.png differ diff --git a/mods/farming/textures/farming_vegan_butter.png b/mods/farming/textures/farming_vegan_butter.png new file mode 100644 index 00000000..2e843497 Binary files /dev/null and b/mods/farming/textures/farming_vegan_butter.png differ diff --git a/mods/farming/textures/farming_water_glass.png b/mods/farming/textures/farming_water_glass.png new file mode 100644 index 00000000..081f8d6e Binary files /dev/null and b/mods/farming/textures/farming_water_glass.png differ diff --git a/mods/farming/textures/farming_wheat.png b/mods/farming/textures/farming_wheat.png new file mode 100644 index 00000000..1e0ad3b3 Binary files /dev/null and b/mods/farming/textures/farming_wheat.png differ diff --git a/mods/farming/textures/farming_wheat_1.png b/mods/farming/textures/farming_wheat_1.png new file mode 100644 index 00000000..c16ad94b Binary files /dev/null and b/mods/farming/textures/farming_wheat_1.png differ diff --git a/mods/farming/textures/farming_wheat_2.png b/mods/farming/textures/farming_wheat_2.png new file mode 100644 index 00000000..baddb4c5 Binary files /dev/null and b/mods/farming/textures/farming_wheat_2.png differ diff --git a/mods/farming/textures/farming_wheat_3.png b/mods/farming/textures/farming_wheat_3.png new file mode 100644 index 00000000..36ebb192 Binary files /dev/null and b/mods/farming/textures/farming_wheat_3.png differ diff --git a/mods/farming/textures/farming_wheat_4.png b/mods/farming/textures/farming_wheat_4.png new file mode 100644 index 00000000..735ed777 Binary files /dev/null and b/mods/farming/textures/farming_wheat_4.png differ diff --git a/mods/farming/textures/farming_wheat_5.png b/mods/farming/textures/farming_wheat_5.png new file mode 100644 index 00000000..f40b5f04 Binary files /dev/null and b/mods/farming/textures/farming_wheat_5.png differ diff --git a/mods/farming/textures/farming_wheat_6.png b/mods/farming/textures/farming_wheat_6.png new file mode 100644 index 00000000..e9c78e00 Binary files /dev/null and b/mods/farming/textures/farming_wheat_6.png differ diff --git a/mods/farming/textures/farming_wheat_7.png b/mods/farming/textures/farming_wheat_7.png new file mode 100644 index 00000000..cc26ca96 Binary files /dev/null and b/mods/farming/textures/farming_wheat_7.png differ diff --git a/mods/farming/textures/farming_wheat_8.png b/mods/farming/textures/farming_wheat_8.png new file mode 100644 index 00000000..d0500934 Binary files /dev/null and b/mods/farming/textures/farming_wheat_8.png differ diff --git a/mods/farming/textures/farming_wheat_seed.png b/mods/farming/textures/farming_wheat_seed.png new file mode 100644 index 00000000..a9031fba Binary files /dev/null and b/mods/farming/textures/farming_wheat_seed.png differ diff --git a/mods/farming/textures/vessels_drinking_cup.png b/mods/farming/textures/vessels_drinking_cup.png new file mode 100644 index 00000000..2eba2321 Binary files /dev/null and b/mods/farming/textures/vessels_drinking_cup.png differ diff --git a/mods/findbiome/.mailmap b/mods/findbiome/.mailmap new file mode 100644 index 00000000..5e3ac1df --- /dev/null +++ b/mods/findbiome/.mailmap @@ -0,0 +1 @@ +Wuzzy diff --git a/mods/findbiome/API.md b/mods/findbiome/API.md new file mode 100644 index 00000000..a17ff36d --- /dev/null +++ b/mods/findbiome/API.md @@ -0,0 +1,64 @@ +# Find Biome API + +This mod has two public functions: + +## `findbiome.find_biome(pos, biomes, res, checks)` + +Attempts to find a position of any biome listed in `biomes`, starting the search from `pos`. +The algorithm will start check positions around `pos`, starting at `pos` and extend its +search outwards. As soon as any of the listed biomes is found, the algorithm terminates +and the biome position is returned. + +### Parameters + +* `pos`: Position at where to start the search +* `biomes`: List of the technical names of the biomes to search for +* `res`: (optional): Size of search grid resolution (smaller = more precise, but also smaller area) (default: 64) +* `checks`: (optional): Number of points checked in total (default: 16384) + +### Return value + +Returns `, `. + +* `` is the position of a found biome or `nil` if none was found +* `` is `true` on success and `false` on failure. + +### Additional notes + +* This function checks nodes on a square spiral going outwards from `pos` +* Although unlikely, there is *no 100% guarantee* that the biome will always be found if + it exists in the world. Very small and/or rare biomes tend to get “overlookedâ€. +* The search might include different Y levels than provided in `pos.y` in order + to find biomes that are restricted by Y coordinates +* If the mapgen `v6` is used, this function only works if the mod `biomeinfo` is + active, too. See the `biomeinfo` mod for more information +* Be careful not to check too many points, as this can lead to potentially longer + searches which may freeze the server for a while + +## `findbiome.list_biomes()` + +Lists all registered biomes in the world. + +### Parameters + +None. + +### Return value + +Returns `, `. + +* `` is `true` on success and `false` on failure. +* `` is a table. + * If there are no errors, it will be a list of all registered biomes, in alphabetical order. + * If there is an error, it will be a table with the first element being an error message. + * Possible errors: + * `v6` mapgen is used and `biomeinfo` mod is not enabled. + * Not all mods have loaded into the world yet. + +### Additional notes + +* If no biomes have been registered, `` will be an empty table, but it still counts as success if there was no error. +* If the mapgen `v6` is used, this function only works if the mod `biomeinfo` is + active, too. See the `biomeinfo` mod for more information. +* The error messages are always sent in English so the API user can check for them. It is possible to then use a translator on the returned value before showing it to the player, if that is what is wanted. See how errors are handled by the chat command. +* It is better to just check the success value, unless the error message may interfere with other functions. diff --git a/mods/findbiome/README.md b/mods/findbiome/README.md new file mode 100644 index 00000000..d647a7cf --- /dev/null +++ b/mods/findbiome/README.md @@ -0,0 +1,30 @@ +# Minetest mod: findbiome + +## Description +This is a mod to help with mod/game development for Minetest. +It adds a command (“findbiomeâ€) to find a biome nearby and teleport you to it, +and another command (“listbiomesâ€) to list all biomes. + +Version: 1.2.0 + +## Known limitations +There's no guarantee you will always find the biome, even if it exists in the world. +This can happen if the biome is very obscure or small, but usually you should be +able to find the biome. + +If the biome could not be found, just move to somewhere else and try again. + +## Modding info + +For modders, this mod offers two functions to search or list biomes via code, similar to the chat commands. +See `API.md` for details. + +## Authors +- paramat (MIT License) +- Wuzzy (MIT License) +- Skivling (MIT License, `list_biomes()` function) +- rstcxk (MIT License, Polish translation, general cleanups) + +This mod is free software. See `license.txt` for license information. + +This mod is based on the algorithm of the "spawn" mod from Minetest Game 5.0.0. diff --git a/mods/findbiome/init.lua b/mods/findbiome/init.lua new file mode 100644 index 00000000..1057a472 --- /dev/null +++ b/mods/findbiome/init.lua @@ -0,0 +1,357 @@ +local S = minetest.get_translator("findbiome") +local NS = function(s) return s end + +findbiome = {} + +local mod_biomeinfo = minetest.get_modpath("biomeinfo") ~= nil +local mg_name = minetest.get_mapgen_setting("mg_name") +local water_level = tonumber(minetest.get_mapgen_setting("water_level")) + +-- Calculate the playable area of the world +local playable_limit_min, playable_limit_max +if minetest.get_mapgen_edges then + -- Modern method by just asking Minetest + playable_limit_min, playable_limit_max = minetest.get_mapgen_edges() +else + -- Legacy method for older Minetest versions + -- by calculating an estimate ourself + -- (it's not perfect but close enough) + local BLOCKSIZE = 16 + local mapgen_limit = tonumber(minetest.get_mapgen_setting("mapgen_limit")) + local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + local limit_estimate = math.max(mapgen_limit - (chunksize + 1) * BLOCKSIZE, 0) + playable_limit_min = vector.new(-limit_estimate, -limit_estimate, -limit_estimate) + playable_limit_max = vector.new(limit_estimate, limit_estimate, limit_estimate) +end + +-- Default parameters +--------------------- + +-- Resolution of search grid in nodes. +local DEFAULT_SEARCH_GRID_RESOLUTION = 64 +-- Number of points checked in the square search grid (edge * edge). +local DEFAULT_CHECKED_POINTS = 128 * 128 + +-- End of parameters +-------------------- + +-- Direction table + +local dirs = { + {x = 0, y = 0, z = 1}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = 0}, +} + +-- Returns true if pos is within the world boundaries +local function is_in_world(pos) + return not (pos.x < playable_limit_min.x or pos.y < playable_limit_min.y or pos.z < playable_limit_min.z or + pos.x > playable_limit_max.x or pos.y > playable_limit_max.y or pos.z > playable_limit_max.z) +end + +-- Checks if pos is within the biome's boundaries. If it isn't, places pos inside the boundaries. +local function adjust_pos_to_biome_limits(pos, biome_id) + local bpos = table.copy(pos) + local biome_name = minetest.get_biome_name(biome_id) + local biome = minetest.registered_biomes[biome_name] + if not biome then + minetest.log("error", "[findbiome] adjust_pos_to_biome_limits non-existing biome!") + return bpos, true + end + local axes = {"y", "x", "z"} + local out_of_bounds = false + for a=1, #axes do + local ax = axes[a] + local min, max + if biome[ax.."_min"] then + min = biome[ax.."_min"] + else + min = playable_limit_min[ax] + end + if biome[ax.."_max"] then + max = biome[ax.."_max"] + else + max = playable_limit_max[ax] + end + min = tonumber(min) + max = tonumber(max) + if bpos[ax] < min then + out_of_bounds = true + bpos[ax] = min + if max-min > 16 then + bpos[ax] = math.max(bpos[ax] + 8, playable_limit_min[ax]) + end + end + if bpos[ax] > max then + out_of_bounds = true + bpos[ax] = max + if max-min > 16 then + bpos[ax] = math.min(bpos[ax] - 8, playable_limit_max[ax]) + end + end + end + return bpos, out_of_bounds +end + +-- Find the special default biome +local function find_default_biome() + local all_biomes = minetest.registered_biomes + local biome_count = 0 + for _, _ in pairs(all_biomes) do + biome_count = biome_count + 1 + end + -- Trivial case: No biomes registered, default biome is everywhere. + if biome_count == 0 then + local y = minetest.get_spawn_level(0, 0) + if not y then + y = 0 + end + return vector.new(0, y, 0) + end + local pos = vector.new() + -- Just check a lot of random positions + -- It's a crappy algorithm but better than nothing. + for _=1, 100 do + pos.x = math.random(playable_limit_min.x, playable_limit_max.x) + pos.y = math.random(playable_limit_min.y, playable_limit_max.y) + pos.z = math.random(playable_limit_min.z, playable_limit_max.z) + local biome_data = minetest.get_biome_data(pos) + if biome_data and minetest.get_biome_name(biome_data.biome) == "default" then + return pos + end + end + return nil +end + +function findbiome.find_biome(pos, biomes, res, checks) + if not res then + res = DEFAULT_SEARCH_GRID_RESOLUTION + end + if not checks then + checks = DEFAULT_CHECKED_POINTS + end + + pos = vector.round(pos) + -- Pos: Starting point for biome checks. This also sets the y co-ordinate for all + -- points checked, so the suitable biomes must be active at this y. + + -- Initial variables + + local edge_len = 1 + local edge_dist = 0 + local dir_step = 0 + local dir_ind = 1 + local success + local spawn_pos + local biome_ids + + -- Get next position on square search spiral + local function next_pos() + if edge_dist == edge_len then + edge_dist = 0 + dir_ind = dir_ind + 1 + if dir_ind == 5 then + dir_ind = 1 + end + dir_step = dir_step + 1 + edge_len = math.floor(dir_step / 2) + 1 + end + + local dir = dirs[dir_ind] + local move = vector.multiply(dir, res) + + edge_dist = edge_dist + 1 + + return vector.add(pos, move) + end + + -- Position search + local function search() + local attempt = 1 + while attempt < 3 do + for _ = 1, checks do + local biome_data = minetest.get_biome_data(pos) + -- Sometimes biome_data is nil + local biome = biome_data and biome_data.biome + for id_ind = 1, #biome_ids do + local biome_id = biome_ids[id_ind] + pos = adjust_pos_to_biome_limits(pos, biome_id) + local spos = table.copy(pos) + if biome == biome_id then + local good_spawn_height = pos.y <= water_level + 16 and pos.y >= water_level + local spawn_y = minetest.get_spawn_level(spos.x, spos.z) + if spawn_y then + spawn_pos = vector.new(spos.x, spawn_y, spos.z) + elseif not good_spawn_height then + spawn_pos = vector.new(spos.x, spos.y, spos.z) + elseif attempt >= 2 then + spawn_pos = vector.new(spos.x, spos.y, spos.z) + end + if spawn_pos then + local _, outside = adjust_pos_to_biome_limits(spawn_pos, biome_id) + if is_in_world(spawn_pos) and not outside then + return true + end + end + end + end + + pos = next_pos() + end + attempt = attempt + 1 + end + return false + end + local function search_v6() + if not mod_biomeinfo then return + false + end + for _ = 1, checks do + local found_biome = biomeinfo.get_v6_biome(pos) + for i = 1, #biomes do + local searched_biome = biomes[i] + if found_biome == searched_biome then + local spawn_y = minetest.get_spawn_level(pos.x, pos.z) + if spawn_y then + spawn_pos = vector.new(pos.x, spawn_y, pos.z) + if is_in_world(spawn_pos) then + return true + end + end + end + end + + pos = next_pos() + end + + return false + end + + if mg_name == "v6" then + success = search_v6() + else + -- Table of suitable biomes + biome_ids = {} + for i=1, #biomes do + local id = minetest.get_biome_id(biomes[i]) + if not id then + return nil, false + end + table.insert(biome_ids, id) + end + success = search() + end + return spawn_pos, success + +end + +local mods_loaded = false +minetest.register_on_mods_loaded(function() + mods_loaded = true +end) + +function findbiome.list_biomes() + local biomes = {} + local b = 0 + if not mods_loaded then + table.insert(biomes, NS("Wait until all mods have loaded!")) + return false, biomes + end + if mg_name == "v6" then + if not mod_biomeinfo then + table.insert(biomes, NS("Not supported. The “biomeinfo†mod is required for v6 mapgen support!")) + return false, biomes + end + biomes = biomeinfo.get_active_v6_biomes() + b = #biomes + else + biomes = {} + for k, _ in pairs(minetest.registered_biomes) do + table.insert(biomes, k) + b = b + 1 + end + end + if b == 0 then + return true, biomes + else + table.sort(biomes) + return true, biomes + end +end + +-- Register chat commands +do + minetest.register_chatcommand("findbiome", { + description = S("Find and teleport to biome"), + params = S(""), + privs = { debug = true, teleport = true }, + func = function(name, param) + if not mods_loaded then + return false + end + local player = minetest.get_player_by_name(name) + if not player then + return false, S("No player.") + end + local pos = player:get_pos() + local invalid_biome = true + if mg_name == "v6" then + if not mod_biomeinfo then + return false, S("Not supported. The “biomeinfo†mod is required for v6 mapgen support!") + end + local biomes = biomeinfo.get_active_v6_biomes() + for b=1, #biomes do + if param == biomes[b] then + invalid_biome = false + break + end + end + else + if param == "default" then + local biome_pos = find_default_biome() + if biome_pos then + player:set_pos(biome_pos) + return true, S("Biome found at @1.", minetest.pos_to_string(biome_pos)) + else + return false, S("No biome found!") + end + end + local id = minetest.get_biome_id(param) + if id then + invalid_biome = false + end + end + if invalid_biome then + return false, S("Biome does not exist!") + end + local biome_pos, success = findbiome.find_biome(pos, {param}) + if success then + player:set_pos(biome_pos) + return true, S("Biome found at @1.", minetest.pos_to_string(biome_pos)) + else + return false, S("No biome found!") + end + end, + }) + + minetest.register_chatcommand("listbiomes", { + description = S("List all biomes"), + params = "", + privs = { debug = true }, + func = function(name, param) + local success, biomes = findbiome.list_biomes() + -- Error checking before sending them in chat + if success == false then -- send error message + return false, S(biomes[1]) + else -- it worked, send all biomes + if #biomes == 0 then + return true, S("No biomes.") + else + table.sort(biomes) + return true, table.concat(biomes, "\n") + end + end + end, + }) +end diff --git a/mods/findbiome/license.txt b/mods/findbiome/license.txt new file mode 100644 index 00000000..353c2f5d --- /dev/null +++ b/mods/findbiome/license.txt @@ -0,0 +1,24 @@ +License of this mod +------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/findbiome/locale/findbiome.de.tr b/mods/findbiome/locale/findbiome.de.tr new file mode 100644 index 00000000..5e2d0cfc --- /dev/null +++ b/mods/findbiome/locale/findbiome.de.tr @@ -0,0 +1,17 @@ +# textdomain: findbiome +# mod title +Find Biome=Biom finden +# mod description +Adds commands to list and find biomes=Fügt Befehle zum Auflisten und Finden von Biomen hinzu + +# mod strings +Wait until all mods have loaded!=Bitte warten, bis alle Mods geladen wurden! +Find and teleport to biome=Ein Biom finden und hinteleportieren += +No player.=Kein Spieler +Biome does not exist!=Biom existiert nicht! +Biome found at @1.=Biom gefunden bei @1. +No biome found!=Kein Biom gefunden! +List all biomes=Alle Biome auflisten +No biomes.=Keine Biome. +Not supported. The “biomeinfo†mod is required for v6 mapgen support!=Nicht unterstützt. Die Mod „biomeinfo“ wird für Unterstützung des v6-Kartengenerators benötigt. diff --git a/mods/findbiome/locale/findbiome.pl.tr b/mods/findbiome/locale/findbiome.pl.tr new file mode 100644 index 00000000..6851cb36 --- /dev/null +++ b/mods/findbiome/locale/findbiome.pl.tr @@ -0,0 +1,17 @@ +# textdomain: findbiome +# mod title +Find Biome=Znajdź biom +# mod description +Adds commands to list and find biomes=Dodaje komendy do znajdowania i wypisywania biomów + +# mod strings +Wait until all mods have loaded!= +Find and teleport to biome=Znajduje i teleportuje do biomu += +No player.=Gracz nie istnieje. +Biome does not exist!=Biom nie istnieje! +Biome found at @1.=Znaleziono biom w pozycji @1 +No biome found!=Nie znaleziono biomu! +List all biomes=Wypisuje wszystkie biomy +No biomes.=Brak Biomów +Not supported. The “biomeinfo†mod is required for v6 mapgen support!=Błąd! mod "biomeinfo" jest potrzebny dla wsparcia mapgen'u v6 diff --git a/mods/findbiome/locale/template.txt b/mods/findbiome/locale/template.txt new file mode 100644 index 00000000..606d61b9 --- /dev/null +++ b/mods/findbiome/locale/template.txt @@ -0,0 +1,17 @@ +# textdomain: findbiome +# mod title +Find Biome= +# mod description +Adds commands to list and find biomes= + +# mod strings +Wait until all mods have loaded!= +Find and teleport to biome= += +No player.= +Biome does not exist!= +Biome found at @1.= +No biome found!= +List all biomes= +No biomes.= +Not supported. The “biomeinfo†mod is required for v6 mapgen support!= diff --git a/mods/findbiome/mod.conf b/mods/findbiome/mod.conf new file mode 100644 index 00000000..99277a34 --- /dev/null +++ b/mods/findbiome/mod.conf @@ -0,0 +1,4 @@ +name=findbiome +title=Find Biome +description=Adds commands to list and find biomes +optional_depends=biomeinfo diff --git a/mods/flowerpot/.luacheckrc b/mods/flowerpot/.luacheckrc new file mode 100644 index 00000000..f002be16 --- /dev/null +++ b/mods/flowerpot/.luacheckrc @@ -0,0 +1,27 @@ +quiet = 1 +codes = true + +exclude_files = { + ".luarocks/*", + "worldeditadditions/utils/bit.lua" +} + + +ignore = { + "631", "61[124]", + "542", + "412", + "321/bit", + "21[123]" +} + +-- Read-write globals (i.e. they can be defined) +globals = { + "flowerpot" +} +-- Read-only globals +read_globals = { + "minetest", + "default" +} +std = "max" diff --git a/mods/flowerpot/LICENSE b/mods/flowerpot/LICENSE new file mode 100644 index 00000000..e1e07d34 --- /dev/null +++ b/mods/flowerpot/LICENSE @@ -0,0 +1,20 @@ + +flowerpot - a minetest mod that adds a stylish flowerpot + +See spdx.org/licenses to see what the License Identifiers used below mean. + +=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ + +All source code (lua): + (C) Auke Kok + LGPL-2.1+ + +All models: + (C) Auke Kok + CC-BY-SA-3.0 + +All Textures: + Public-Domain, see: + https://mods.curse.com/texture-packs/minecraft/227527-isabella-ii + +=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ diff --git a/mods/flowerpot/api.md b/mods/flowerpot/api.md new file mode 100644 index 00000000..e14af8be --- /dev/null +++ b/mods/flowerpot/api.md @@ -0,0 +1,6 @@ + +## flowerpot API + +`flowerpot.register_node(name)` + * name = node name, e.g. "default:sapling" + * the node must be defined and registered first using `minetest.register_node()`. diff --git a/mods/flowerpot/init.lua b/mods/flowerpot/init.lua new file mode 100644 index 00000000..fa1bfb9a --- /dev/null +++ b/mods/flowerpot/init.lua @@ -0,0 +1,304 @@ + +--[[ + + Copyright (C) 2015 - Auke Kok + + "flowerpot" is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of + the license, or (at your option) any later version. + +--]] + +flowerpot = {} + +local f = string.format + +-- Translation +local S = minetest.get_translator("flowerpot") + +local flower_items_by_pot = {} + +-- handle plant insertion into flowerpot +local function flowerpot_on_rightclick(pos, node, clicker, itemstack, pointed_thing) + if not minetest.is_player(clicker) then + return itemstack + end + + local player_name = clicker:get_player_name() + + if minetest.is_protected(pos, player_name) then + return itemstack + end + + local item_name = itemstack:get_name() + + local pot_name = "flowerpot:" .. item_name:gsub(":", "_") + local def = minetest.registered_nodes[pot_name] + if not def then + return itemstack + end + minetest.sound_play(def.sounds.place, {pos = pos}) + minetest.swap_node(pos, {name = pot_name}) + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() + end + return itemstack +end + +local function get_tile(def) + local tile = def.tiles[1] + if type (tile) == "table" then + return tile.name + end + return tile +end + +local old_get_node_drops = minetest.get_node_drops + +function minetest.get_node_drops(node, toolname) + local node_name + if type(node) == "table" then + node_name = node.name + + elseif type(node) == "string" then + node_name = node + end + + if node_name then + local flower_item = flower_items_by_pot[node_name] + if flower_item then + local drops = old_get_node_drops(flower_item, toolname) + if drops then + table.insert(drops, "flowerpot:empty") + return drops + else + return { "flowerpot:empty" } + end + end + end + + return old_get_node_drops(node, toolname) +end + +function flowerpot.register_node(nodename) + assert(nodename, "no nodename passed") + local nodedef = minetest.registered_nodes[nodename] + + if not nodedef then + error(f("%s is not a known node, unable to register flowerpot", nodename)) + end + + local desc = nodedef.description + local name = nodedef.name:gsub(":", "_") + local tiles + + if nodedef.drawtype == "plantlike" then + tiles = { + {name = "flowerpot.png"}, + {name = get_tile(nodedef)}, + {name = "blank.png"}, + } + else + tiles = { + {name = "flowerpot.png"}, + {name = "blank.png"}, + {name = get_tile(nodedef)}, + } + end + + flower_items_by_pot["flowerpot:" .. name] = nodename + + minetest.register_node(":flowerpot:" .. name, { + description = S("Flowerpot with @1", desc), + drawtype = "mesh", + mesh = "flowerpot.obj", + tiles = tiles, + paramtype = "light", + sunlight_propagates = true, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + collision_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, -1/8, 1/4}, + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 7/16, 1/4}, + }, + sounds = default.node_sound_defaults(), + groups = {attached_node = 1, oddly_breakable_by_hand = 1, snappy = 3, not_in_creative_inventory = 1}, + flowerpot_plantname = nodename, + node_dig_prediction = "flowerpot:empty", + on_punch = function(pos, node, puncher, pointed_thing) + if not (puncher and puncher:is_player()) then + return + end + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + local toolname = puncher:get_wielded_item() + if node.name then + local flower_item = flower_items_by_pot[node.name] + if flower_item then + local drops = old_get_node_drops(flower_item, toolname) + minetest.handle_node_drops(pos, drops, puncher) + end + end + minetest.swap_node(pos, {name = "flowerpot:empty"}) + end, + }) +end + +-- empty flowerpot +minetest.register_node("flowerpot:empty", { + description = S("Flowerpot"), + drawtype = "mesh", + mesh = "flowerpot.obj", + inventory_image = "flowerpot_item.png", + wield_image = "flowerpot_item.png", + tiles = { + {name = "flowerpot.png"}, + {name = "blank.png"}, + {name = "blank.png"}, + }, + paramtype = "light", + sunlight_propagates = true, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + collision_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, -1/8, 1/4}, + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, -1/16, 1/4}, + }, + sounds = default.node_sound_defaults(), + groups = {attached_node = 1, oddly_breakable_by_hand = 3, cracky = 1, dig_immediate = 3}, + on_rightclick = flowerpot_on_rightclick, +}) + +-- craft +minetest.register_craft({ + output = "flowerpot:empty", + recipe = { + {"default:clay_brick", "", "default:clay_brick"}, + {"", "default:clay_brick", ""}, + } +}) + +for _, node in pairs({ + -- default nodes + "default:acacia_bush_sapling", + "default:acacia_bush_stem", + "default:acacia_sapling", + "default:aspen_sapling", + "default:blueberry_bush_sapling", + "default:pine_bush_sapling", + "default:bush_sapling", + "default:bush_stem", + "default:cactus", + "default:dry_grass_1", + "default:dry_grass_2", + "default:dry_grass_3", + "default:dry_grass_4", + "default:dry_grass_5", + "default:dry_shrub", + "default:emergent_jungle_sapling", + "default:grass_1", + "default:grass_2", + "default:grass_3", + "default:grass_4", + "default:grass_5", + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + "default:large_cactus_seedling", + "default:junglegrass", + "default:junglesapling", + "default:papyrus", + "default:pine_sapling", + "default:sapling", + "default:fern_1", + "default:fern_2", + "default:fern_3", + -- farming nodes + "farming:cotton_1", + "farming:cotton_2", + "farming:cotton_3", + "farming:cotton_4", + "farming:cotton_5", + "farming:cotton_6", + "farming:cotton_7", + "farming:cotton_8", + "farming:wheat_1", + "farming:wheat_2", + "farming:wheat_3", + "farming:wheat_4", + "farming:wheat_5", + "farming:wheat_6", + "farming:wheat_7", + "farming:wheat_8", + -- flowers nodes + "flowers:dandelion_white", + "flowers:dandelion_yellow", + "flowers:geranium", + "flowers:mushroom_brown", + "flowers:mushroom_red", + "flowers:rose", + "flowers:tulip", + "flowers:viola", + "flowers:chrysanthemum_green", + "flowers:tulip_black", + -- moretrees nodes + "moretrees:beech_sapling", + "moretrees:apple_tree_sapling", + "moretrees:oak_sapling", + "moretrees:sequoia_sapling", + "moretrees:birch_sapling", + "moretrees:palm_sapling", + "moretrees:date_palm_sapling", + "moretrees:spruce_sapling", + "moretrees:cedar_sapling", + "moretrees:poplar_sapling", + "moretrees:poplar_small_sapling", + "moretrees:rubber_tree_sapling", + "moretrees:fir_sapling", + "moretrees:jungletree_sapling", + "moretrees:beech_sapling_ongen", + "moretrees:apple_tree_sapling_ongen", + "moretrees:oak_sapling_ongen", + "moretrees:sequoia_sapling_ongen", + "moretrees:birch_sapling_ongen", + "moretrees:palm_sapling_ongen", + "moretrees:date_palm_sapling_ongen", + "moretrees:spruce_sapling_ongen", + "moretrees:cedar_sapling_ongen", + "moretrees:poplar_sapling_ongen", + "moretrees:poplar_small_sapling_ongen", + "moretrees:rubber_tree_sapling_ongen", + "moretrees:fir_sapling_ongen", + "moretrees:jungletree_sapling_ongen", + -- dryplants nodes + "dryplants:grass", + "dryplants:grass_short", + "dryplants:hay", + "dryplants:juncus", + "dryplants:juncus_02", + "dryplants:reedmace_spikes", + "dryplants:reedmace_top", + "dryplants:reedmace_height_2", + "dryplants:reedmace_height_3", + "dryplants:reedmace_3_spikes", + "dryplants:reedmace", + "dryplants:reedmace_bottom", + "dryplants:reedmace_sapling", + -- poisonivy nodes + "poisonivy:seedling", + "poisonivy:sproutling", + "poisonivy:climbing", + +}) do + if minetest.registered_nodes[node] then + flowerpot.register_node(node) + end +end diff --git a/mods/flowerpot/locale/flowerpot.en.tr b/mods/flowerpot/locale/flowerpot.en.tr new file mode 100644 index 00000000..77b84a05 --- /dev/null +++ b/mods/flowerpot/locale/flowerpot.en.tr @@ -0,0 +1,7 @@ +# textdomain: flowerpot + +@1 is not a known node, unable to register flowerpot=@1 is not a known node, unable to register flowerpot + +Flowerpot with @1=Flowerpot with @1 + +Flowerpot=Flowerpot diff --git a/mods/flowerpot/locale/flowerpot.eo.tr b/mods/flowerpot/locale/flowerpot.eo.tr new file mode 100644 index 00000000..8a6c08f3 --- /dev/null +++ b/mods/flowerpot/locale/flowerpot.eo.tr @@ -0,0 +1,7 @@ +# textdomain: flowerpot + +@1 is not a known node, unable to register flowerpot=@1 ne estas konata nodo, nekapabla registri florpoton + +Flowerpot with @1=Florpoto kun @1 + +Flowerpot=Florpoto diff --git a/mods/flowerpot/locale/flowerpot.es.tr b/mods/flowerpot/locale/flowerpot.es.tr new file mode 100644 index 00000000..f4e1370b --- /dev/null +++ b/mods/flowerpot/locale/flowerpot.es.tr @@ -0,0 +1,7 @@ +# textdomain: flowerpot + +@1 is not a known node, unable to register flowerpot=@1 no es un nodo conocido, no se pudo registrar la maceta + +Flowerpot with @1=Maceta con @1 + +Flowerpot=Maceta diff --git a/mods/flowerpot/locale/flowerpot.fr.tr b/mods/flowerpot/locale/flowerpot.fr.tr new file mode 100644 index 00000000..57305fcb --- /dev/null +++ b/mods/flowerpot/locale/flowerpot.fr.tr @@ -0,0 +1,9 @@ +# textdomain: flowerpot + +# Translation fr by Louis Royer + +@1 is not a known node, unable to register flowerpot=@1 est un block inconnu, impossible d’enregister le pot de fleurs + +Flowerpot with @1=Pot de fleurs avec @1 + +Flowerpot=Pot de fleurs diff --git a/mods/flowerpot/mod.conf b/mods/flowerpot/mod.conf new file mode 100644 index 00000000..107b341c --- /dev/null +++ b/mods/flowerpot/mod.conf @@ -0,0 +1,4 @@ +name = flowerpot +depends = default +optional_depends = moretrees, dryplants, poisonivy, farming, flowers +description = A stylish flowerpot that can contain most plants. diff --git a/mods/flowerpot/models/flowerpot.obj b/mods/flowerpot/models/flowerpot.obj new file mode 100644 index 00000000..d8f2106c --- /dev/null +++ b/mods/flowerpot/models/flowerpot.obj @@ -0,0 +1,234 @@ +# Blender v2.78 (sub 0) OBJ File: 'flowerpot.blend' +# www.blender.org +mtllib flowerpot.mtl +o Cube +v 0.187500 -0.437500 -0.187500 +v 0.187500 -0.437500 0.187500 +v -0.187500 -0.437500 0.187500 +v -0.187500 -0.437500 -0.187500 +v 0.187500 -0.125000 -0.187500 +v 0.187500 -0.125000 0.187500 +v -0.187500 -0.125000 0.187500 +v -0.187500 -0.125000 -0.187500 +v -0.125000 -0.125000 -0.125000 +v 0.125000 -0.125000 0.125000 +v 0.125000 -0.125000 -0.125000 +v -0.125000 -0.125000 -0.125000 +v 0.187500 -0.125000 0.125000 +v 0.125000 -0.187500 -0.125000 +v 0.125000 -0.187500 0.125000 +v -0.187500 -0.125000 -0.125000 +v 0.187500 -0.125000 -0.125000 +v -0.125000 -0.187500 -0.125000 +v -0.125000 -0.187500 0.125000 +v -0.187500 -0.125000 0.125000 +v 0.125000 -0.125000 0.125000 +v -0.125000 -0.125000 -0.125000 +v -0.125000 -0.125000 0.125000 +v -0.125000 -0.125000 -0.125000 +v 0.125000 -0.125000 -0.125000 +v 0.125000 -0.125000 0.125000 +v -0.125000 -0.125000 0.125000 +v -0.125000 -0.125000 0.125000 +v 0.125000 -0.125000 -0.125000 +v 0.125000 -0.125000 0.125000 +v 0.125000 -0.125000 -0.125000 +v -0.125000 -0.125000 0.125000 +v -0.172986 -0.104281 -0.179133 +v 0.172986 -0.187289 0.179132 +v 0.172986 -0.104282 0.179132 +v 0.230648 -0.104282 0.238843 +v -0.238843 0.476773 0.230648 +v 0.238843 0.476773 -0.230648 +v -0.125000 -0.500000 0.125000 +v -0.125000 -0.500000 -0.125000 +v 0.187500 -0.437500 0.125000 +v 0.125000 -0.500000 -0.125000 +v -0.187500 -0.437500 -0.125000 +v 0.187500 -0.437500 -0.125000 +v 0.125000 -0.500000 0.125000 +v -0.187500 -0.437500 0.125000 +v 0.125000 -0.437500 0.125000 +v 0.125000 -0.437500 -0.125000 +v -0.125000 -0.437500 -0.125000 +v -0.125000 -0.437500 0.125000 +v -0.230648 0.476773 -0.238843 +v -0.230648 -0.104281 -0.238843 +v -0.172986 -0.187289 -0.179133 +v 0.230648 0.476773 0.238843 +v -0.179133 -0.187289 0.172986 +v 0.238843 -0.104282 -0.230648 +v -0.238843 -0.104281 0.230648 +v 0.179132 -0.187289 -0.172986 +v -0.179133 -0.104281 0.172986 +v 0.179132 -0.104282 -0.172986 +v 0.132813 -0.187289 -0.132812 +v 0.132812 -0.187289 0.132813 +v -0.132812 -0.187289 -0.132812 +v -0.132813 -0.187289 0.132812 +v 0.132812 0.476682 0.132813 +v -0.132813 0.476682 0.132812 +v -0.132812 0.476682 -0.132812 +v 0.132813 0.476682 -0.132812 +vt 0.6250 0.5000 +vt 0.6250 0.7500 +vt 0.3750 0.7500 +vt 0.3750 0.5000 +vt 1.0000 0.5625 +vt 1.0000 0.8750 +vt 0.9375 0.8750 +vt 0.6875 0.8750 +vt 0.6250 0.8750 +vt 0.6250 0.5625 +vt 0.6875 0.5625 +vt 0.9375 0.5625 +vt 0.3750 0.9375 +vt 0.0000 0.9375 +vt 0.0000 0.8750 +vt 0.3750 0.8750 +vt 0.9375 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.8750 +vt 0.9375 0.8750 +vt 0.9375 0.9375 +vt 0.3125 0.9375 +vt 0.0625 0.9375 +vt -0.0000 0.9375 +vt -0.0000 0.8750 +vt 0.3750 0.8750 +vt 0.3750 0.9375 +vt 0.0000 0.5625 +vt 0.3750 0.5625 +vt 0.3125 1.0000 +vt 0.0625 1.0000 +vt 0.9375 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.9375 +vt 0.9375 0.9375 +vt 1.0000 0.5625 +vt 1.0000 0.8750 +vt 0.6250 0.8750 +vt 0.6250 0.5625 +vt 0.6875 0.5625 +vt 0.9375 0.5625 +vt 0.3750 0.5625 +vt 0.0000 0.5625 +vt 0.0625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1.0000 +vt 0.0625 1.0000 +vt 0.9375 1.0000 +vt 0.6875 1.0000 +vt 0.9375 1.0000 +vt 0.6875 1.0000 +vt 0.0000 0.5000 +vt 0.0625 0.5000 +vt 0.3125 0.5000 +vt 0.3750 0.5000 +vt 0.3125 0.5000 +vt 0.0625 0.5000 +vt 0.0625 0.4375 +vt 0.3125 0.4375 +vt 0.3750 0.5000 +vt 0.0000 0.5000 +vt 0.6875 0.5000 +vt 0.9375 0.5000 +vt 0.6875 0.5000 +vt 0.9375 0.5000 +vt 0.3750 1.0000 +vt 0.3750 0.7500 +vt 0.6250 0.7500 +vt 0.6250 1.0000 +vt 0.6875 0.4375 +vt 0.9375 0.4375 +vt 0.0625 0.4375 +vt 0.3125 0.4375 +vt 0.6875 0.4375 +vt 0.9375 0.4375 +vt 0.0020 0.9983 +vt 0.0020 0.1265 +vt 0.1265 0.1265 +vt 0.1265 0.0020 +vt 0.8735 0.0020 +vt 0.8735 0.1265 +vt 0.9980 0.1265 +vt 0.9980 0.9983 +vt 0.0020 0.9983 +vt 0.9980 0.9983 +vt 0.9980 0.1265 +vt 0.8735 0.1265 +vt 0.8735 0.0020 +vt 0.1265 0.0020 +vt 0.1265 0.1265 +vt 0.0020 0.1265 +vt 0.1875 0.8750 +vt 0.1875 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.8750 +vt 0.0625 -0.0000 +vt 0.3125 -0.0000 +vt 0.3125 0.6250 +vt 0.0625 0.6250 +vt 0.2500 -0.0000 +vt 0.5000 -0.0000 +vt 0.5000 0.6250 +vt 0.2500 0.6250 +vt 0.7500 -0.0000 +vt 0.7500 0.6250 +vt 0.9375 0.0000 +vt 0.6875 -0.0000 +vt 0.6875 0.6250 +vt 0.9375 0.6250 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 -0.0000 +vn 0.7193 0.0000 -0.6947 +vn 0.6947 -0.0000 0.7193 +g Cube_Cube_pot +usemtl pot +s off +f 18/1/1 19/2/1 15/3/1 14/4/1 +f 1/5/2 5/6/2 17/7/2 13/8/2 6/9/2 2/10/2 41/11/2 44/12/2 +f 13/13/1 20/14/1 7/15/1 6/16/1 +f 32/17/1 24/18/1 16/19/1 20/20/1 27/21/1 +f 24/22/1 29/23/1 17/24/1 5/25/1 8/26/1 16/27/1 +f 3/28/3 2/29/3 6/16/3 7/15/3 +f 29/23/3 24/22/3 18/30/3 14/31/3 +f 29/32/1 30/33/1 26/34/1 13/8/1 17/7/1 25/35/1 +f 3/36/4 7/37/4 20/20/4 16/19/4 8/38/4 4/39/4 43/40/4 46/41/4 +f 4/42/5 8/26/5 5/25/5 1/43/5 +f 32/44/5 30/45/5 15/46/5 19/47/5 +f 30/33/4 29/32/4 14/48/4 15/49/4 +f 24/18/2 32/17/2 19/50/2 18/51/2 +f 2/29/6 3/28/6 46/52/6 50/53/6 47/54/6 41/55/6 +f 49/56/5 48/57/5 42/58/5 40/59/5 +f 48/57/6 49/56/6 43/60/6 4/42/6 1/43/6 44/61/6 +f 49/62/6 50/63/6 46/41/6 43/40/6 +f 44/12/6 41/11/6 47/64/6 48/65/6 +f 40/66/6 42/67/6 45/68/6 39/69/6 +f 48/65/2 47/64/2 45/70/2 42/71/2 +f 47/54/3 50/53/3 39/72/3 45/73/3 +f 50/63/4 49/62/4 40/74/4 39/75/4 +g Cube_Cube_plant +usemtl plant +f 54/76/7 36/77/7 35/78/7 34/79/7 53/80/7 33/81/7 52/82/7 51/83/7 +f 38/84/8 37/85/8 57/86/8 59/87/8 55/88/8 58/89/8 60/90/8 56/91/8 +g Cube_Cube_block +usemtl block +f 67/92/1 66/93/1 65/94/1 68/95/1 +f 63/96/4 64/97/4 66/98/4 67/99/4 +f 64/100/3 62/101/3 65/102/3 66/103/3 +f 62/101/2 61/104/2 68/105/2 65/102/2 +f 61/106/5 63/107/5 67/108/5 68/109/5 +l 28 23 +l 22 9 +l 11 31 +l 19 28 +l 14 11 +l 18 22 +l 10 21 +l 24 12 +l 15 10 diff --git a/mods/flowerpot/readme.md b/mods/flowerpot/readme.md new file mode 100644 index 00000000..fecf15ba --- /dev/null +++ b/mods/flowerpot/readme.md @@ -0,0 +1,34 @@ + +flowerpot +========= + +This minetest mod adds a simple, single-node, non-entity flowerpot +that can contain `plantlike` drawtype nodes. + +The player can place these pots as normal nodes, and then right-click +the pot with a plant or plantlike node, and the pot then will contain +a slightly smaller version of the plant. If punched, the plant that +was put in the pot will be returned to the puncher. + +The concept works through the use of object materials. The empty +flowerpot node has the same model, but part of the mesh is transparent +and therefore not visible. If a plant is inserted, the transparent +textures are replaced with the texture of the plant node, and thus +it looks like the plant is inserted, while effectively the pot is a +single node without metadata. + +There are no crafting recipes for each variant. The player can craft +pots and potentially use `/giveme` to give filled versions of the +flowerpot, but the creative inventory does not contain them as they +are easily filled already. + +The model was made in blender from scratch by the author. + +The texture of the flowerpot itself was created from the flowerpot +texture of the excellent Isabella II texture pack, which is Public +Domain. The texture has been reworked to allow for a more detailed +texturing of the flowerpot model. + +The flowerpot mod has an API that can be used by other mods to create +new plant-flowerpot combinations. See api.md for usage information. + diff --git a/mods/flowerpot/textures/flowerpot.png b/mods/flowerpot/textures/flowerpot.png new file mode 100644 index 00000000..32e05cf4 Binary files /dev/null and b/mods/flowerpot/textures/flowerpot.png differ diff --git a/mods/flowerpot/textures/flowerpot_item.png b/mods/flowerpot/textures/flowerpot_item.png new file mode 100644 index 00000000..ffe9914f Binary files /dev/null and b/mods/flowerpot/textures/flowerpot_item.png differ diff --git a/mods/geodes/LICENSE.txt b/mods/geodes/LICENSE.txt new file mode 100644 index 00000000..826eae2f --- /dev/null +++ b/mods/geodes/LICENSE.txt @@ -0,0 +1,15 @@ +~~LICENSE~~ + +Source Code: + +(C) AwesomeDragon97 + +LGPL-3.0 + +Textures: + +(C) AwesomeDragon97 + +CC-BY-SA-3.0 + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mods/geodes/init.lua b/mods/geodes/init.lua new file mode 100644 index 00000000..6b634254 --- /dev/null +++ b/mods/geodes/init.lua @@ -0,0 +1,141 @@ +geodes = {} + +local geode_types = {} + +minetest.register_node("geodes:calcite", { + description = "Calcite", + tiles = {"calcite.png"}, + groups = {cracky = 3, not_in_creative_inventory = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("geodes:amethyst_block", { + description = "Amethyst Block", + tiles = {"amethyst_block.png"}, + groups = {cracky = 3, not_in_creative_inventory = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("geodes:basalt", { + description = "Basalt", + tiles = {"basalt.png"}, + groups = {cracky = 3, not_in_creative_inventory = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("geodes:amethyst_crystal", { + description = "Amethyst Crystal", + tiles = {"amethyst_crystal.png"}, + inventory_image = "amethyst_crystal.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + groups = {cracky = 3, not_in_creative_inventory = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = {-5/16, -0.5, -5/16, 5/16, 5/16, 5/16} + }, + selection_box = { + type = "fixed", + fixed = {-5/16, -0.5, -5/16, 5/16, 5/16, 5/16} + }, +}) + +minetest.register_node("geodes:geode_core", { + groups = {not_in_creative_inventory = 1}, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "geodes:geode_core", + wherein = "default:stone", + clust_scarcity = 64 * 64 * 64, + clust_num_ores = 1, + clust_size = 1, + y_max = -40, + y_min = -31000, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "geodes:geode_core", + wherein = "air", + clust_scarcity = 64 * 64 * 64, + clust_num_ores = 1, + clust_size = 1, + y_max = -40, + y_min = -31000, +}) + +minetest.register_lbm({ + label = "make_geode", + name = "geodes:create_geode", + nodenames = {"geodes:geode_core"}, + run_at_every_load = true, + action = function(pos, node) + + if (#geode_types == 0) then + minetest.log('THE GEODES MOD REQUIRES AT LEAST ONE MOD THAT ADDS GEODES TO FUNCTION. PLEASE MAKE SURE THAT THE "amethyst_geodes" MOD IS ENABLED, OR ANOTHER MOD THAT USES THE API IS ENABLED.') + return + end + + local pcgr = PcgRandom(minetest.hash_node_position(pos)) + local outer, middle, inner, crystal, fill, size_min, size_max = unpack(geode_types[math.random(1, #geode_types)]) + local size = pcgr:next(size_min, size_max) + + for x = -size, size do + for y = -size, size do + for z = -size, size do + if minetest.get_node(pos + vector.new(x, y, z)).name ~= "air" then + if vector.distance(vector.new(x, y, z), vector.new()) < size then + minetest.set_node(pos + vector.new(x, y, z), {name = outer}) + if vector.distance(vector.new(x, y, z), vector.new()) < size - 1 then + minetest.set_node(pos + vector.new(x, y, z), {name = middle}) + if vector.distance(vector.new(x, y, z), vector.new()) < size - 2 then + minetest.set_node(pos + vector.new(x, y, z), {name = inner}) + if vector.distance(vector.new(x, y, z), vector.new()) < size - 3 then + minetest.set_node(pos + vector.new(x, y, z), {name = fill}) + end + end + end + end + end + end + end + end + + if crystal ~= fill then + for x = -size +4, size -4 do + for y = -size +4, size -4 do + for z = -size +4, size -4 do + if pcgr:next(0, 10) == 0 and vector.distance(vector.new(x, y, z), vector.new()) >= size - 4 and vector.distance(vector.new(x, y, z), vector.new()) < size - 3 then + + if minetest.get_node(pos + vector.new(x, y + 1, z)).name == inner then + minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 0}) + elseif minetest.get_node(pos + vector.new(x, y - 1, z)).name == inner then + minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 1}) + elseif minetest.get_node(pos + vector.new(x + 1, y, z)).name == inner then + minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 2}) + elseif minetest.get_node(pos + vector.new(x - 1, y, z)).name == inner then + minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 3}) + elseif minetest.get_node(pos + vector.new(x, y, z + 1)).name == inner then + minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 4}) + elseif minetest.get_node(pos + vector.new(x, y, z - 1)).name == inner then + minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 5}) + + end + end + end + end + end + end + + end, + }) + + +function geodes.register_geode(outer, middle, inner, crystal, fill, size_min, size_max) + table.insert(geode_types, {outer, middle, inner, crystal or "air", fill or "air", size_min or 6, size_max or 11}) +end \ No newline at end of file diff --git a/mods/geodes/mod.conf b/mods/geodes/mod.conf new file mode 100644 index 00000000..3465c90a --- /dev/null +++ b/mods/geodes/mod.conf @@ -0,0 +1,4 @@ +name = geodes +title = Geodes +description = Adds an API to make custom geodes. +depends = default \ No newline at end of file diff --git a/mods/geodes/textures/.DS_Store b/mods/geodes/textures/.DS_Store new file mode 100644 index 00000000..5008ddfc Binary files /dev/null and b/mods/geodes/textures/.DS_Store differ diff --git a/mods/geodes/textures/amethyst_block.png b/mods/geodes/textures/amethyst_block.png new file mode 100644 index 00000000..befd0957 Binary files /dev/null and b/mods/geodes/textures/amethyst_block.png differ diff --git a/mods/geodes/textures/amethyst_crystal.png b/mods/geodes/textures/amethyst_crystal.png new file mode 100644 index 00000000..aea42488 Binary files /dev/null and b/mods/geodes/textures/amethyst_crystal.png differ diff --git a/mods/geodes/textures/basalt.png b/mods/geodes/textures/basalt.png new file mode 100644 index 00000000..1642aeb2 Binary files /dev/null and b/mods/geodes/textures/basalt.png differ diff --git a/mods/geodes/textures/calcite.png b/mods/geodes/textures/calcite.png new file mode 100644 index 00000000..0058af2a Binary files /dev/null and b/mods/geodes/textures/calcite.png differ diff --git a/mods/herbs/LICENSE b/mods/herbs/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/mods/herbs/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/mods/herbs/README.md b/mods/herbs/README.md new file mode 100644 index 00000000..d2386d04 --- /dev/null +++ b/mods/herbs/README.md @@ -0,0 +1,20 @@ +# herbs + +A mod for minetest to add additional Flowers and Herbs. +This small mod adds 15 new flowers and 6 new mushrooms to minetest. + +All the flowers and mushrooms are flowers and also behave like this. + +![Screenshot](https://github.com/acmgit/herbs/blob/main/screenshot.png) +![Screenshot](https://github.com/acmgit/herbs/blob/main/screenshot_2.png) + +## Depends +default, flower + +## optional Depends +hunger_ng, techage + +## License: +GPL 3.0 + + diff --git a/mods/herbs/init.lua b/mods/herbs/init.lua new file mode 100644 index 00000000..c62f4316 --- /dev/null +++ b/mods/herbs/init.lua @@ -0,0 +1,258 @@ +herbs = {} +local hb = herbs + +hb.modname = minetest.get_current_modname() +hb.version = 1 +hb.revision = 2 + +local modname = hb.modname + +-- Load support for MT game translation. +local S = minetest.get_translator(modname) + +--[[ +local T = minetest.get_translator(modname) +local function S(text) + local line = string.gsub(text, "\27%([^()]*%)", "") + return T(line) +]]-- + +dofile(minetest.get_modpath(modname) .. "/mapgen.lua") + +-- Flower registration +function hb.add_simple_flower(name, desc, box, f_groups) + -- Common flowers' groups + f_groups.snappy = 3 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node(modname .. ":" .. name, { + description = desc, + drawtype = "plantlike", + waving = 1, + tiles = {modname .. "_" .. name .. ".png"}, + inventory_image = modname .. "_" .. name .. ".png", + wield_image = modname .. "_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + buildable_to = true, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box + } + }) +end + +function hb.register_mushroom(name, descript, tile, heal) + -- Determine mushroom edibility + local groups = { + mushroom = 1, + snappy = 3, + attached_node = 1, + flammable = 1, + } + if heal > 0 then + groups.food_mushroom = 1 + end + + minetest.register_node(modname .. ":" .. name, { + description = descript, + tiles = {modname .. "_" .. tile}, + inventory_image = modname .. "_" .. tile, + wield_image = modname .. "_" .. tile, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = groups, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(heal), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } + }) +end + +hb.flowerdatas = { + { + "campanula_blue", + S("Campanula Blue"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "trifolium_red", + S("Trifolium Red"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_pink = 1, flammable = 1} + }, + { + "trifolium_white", + S("Trifolium White"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 3 / 16, 4 / 16}, + {color_white = 1, flammable = 1} + }, + { + "centaurea", + S("Centaurea"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "anagallis_yellow", + S("Anagallis Yellow"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_yellow = 1, flammable = 1} + }, + { + "iris", + S("Iris"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "leucanthemum_white", + S("Leucanthemum White"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_white = 1, flammable = 1} + }, + { + "leontopodium_white", + S("Leontopodium White"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}, + {color_white = 1, flammable = 1} + }, + { + "papaver_red", + S("Papaver Red"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_red = 1, flammable = 1} + }, + { + "plantago", + S("Plantago"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_brown = 1, flammable = 1} + }, + { + "antirrhinum", + S("Antirrhinum"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_pink = 1, flammable = 1} + }, + { + "drosera", + S("Drosera Round"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, 5 / 16, 4 / 16}, + {color_red = 1, flammable = 1} + }, + { "digitalis_blue", + S("Digitalis Blue"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "digitalis_yellow", + S("Digitalis Yellow"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_yellow = 1, flammable = 1} + }, + { + "achillea_white", + S("Achillea White"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_white = 1, flammable = 1} + } +} + +hb.mushroomdatas = { + { "mushroom_amanita_green", + S("Amanita Green"), + "mushroom_amanita_green.png", + 1, + -20 + }, + { + "mushroom_cantharellus", + S("Cantharellus"), + "mushroom_cantharellus.png", + 3, + 1 + }, + { + "mushroom_gyromitra", + S("Gyromitra"), + "mushroom_gyromitra.png", + 1, + -10 + }, + { + "mushroom_macrolepiota", + S("Macrolepiota"), + "mushroom_macrolepiota.png", + 5, + 1 + }, + { + "mushroom_galerina", + S("Galerina"), + "mushroom_galerina.png", + 1, + -5 + }, + { + "mushroom_boletus", + S("Boletus"), + "mushroom_boletus.png", + 4, + 1 + } + } + +for _, mushroom in pairs(hb.mushroomdatas) do + hb.register_mushroom(mushroom[1], + mushroom[2], + mushroom[3], + mushroom[5] + ) +end + +for _,item in pairs(hb.flowerdatas) do + hb.add_simple_flower(unpack(item)) +end + +-- Compatibility for older versions +minetest.register_alias("herbs:clover_red","herbs:trifolium_red") +minetest.register_alias("herbs:clover_white","herbs:trifolium_white") +minetest.register_alias("herbs:cornflower","herbs:centaurea") +minetest.register_alias("herbs:houndstooth","herbs:anagallis_yellow") +minetest.register_alias("herbs:margerit","herbs:leucanthemum_white") +minetest.register_alias("herbs:poppy_red","herbs:papaver_red") +minetest.register_alias("herbs:ribwort","herbs:plantago") +minetest.register_alias("herbs:snapdragon","herbs:antirrhinum") +minetest.register_alias("herbs:sundew","herbs:drosera") +minetest.register_alias("herbs:thimble_blue","herbs:digitalis_blue") +minetest.register_alias("herbs:thimble_yellow","herbs:digitalis_yellow") +minetest.register_alias("herbs:yarrow_white","herbs:achillea_white") +minetest.register_alias("herbs:nobel_white","herbs:leontopodium_white") + +minetest.register_alias("herbs:mushroom_bulbous_green","herbs:mushroom_amanita_green") +minetest.register_alias("herbs:mushroom_chanterelle","herbs:mushroom_cantharellus") +minetest.register_alias("herbs:mushroom_lorikeet","herbs:mushroom_gyromitra") +minetest.register_alias("herbs:mushroom_parasol","herbs:mushroom_macrolepiota") +minetest.register_alias("herbs:mushroom_poisonous_sublime","herbs:mushroom_galerina") +minetest.register_alias("herbs:mushroom_stone","herbs:mushroom_boletus") + +minetest.register_alias("herbs:dosera","herbs:drosera") + + +dofile(minetest.get_modpath(modname) .. "/register_mods.lua") + +minetest.log("action","[Mod] " .. hb.modname .. " V " .. hb.version .. "." .. hb.revision .. " loaded.") +print("[Mod] " .. hb.modname .. " V " .. hb.version .. "." .. hb.revision .. " loaded.") diff --git a/mods/herbs/locale/herbs.de.tr b/mods/herbs/locale/herbs.de.tr new file mode 100644 index 00000000..f831051d --- /dev/null +++ b/mods/herbs/locale/herbs.de.tr @@ -0,0 +1,26 @@ +# textdomain: herbs + + +### init.lua ### + +Achillea White=Weisse Schafgarbe +Amanita Green=Grüner Knollenblätterpilz +Anagallis Yellow=Gelber Hahnentritt +Antirrhinum=Löwenmäulchen +Boletus=Steinpilz +Campanula Blue=Blaue Glockenblume +Cantharellus=Pfifferling +Centaurea=Kornblume +Digitalis Blue=Blauer Fingerhut +Digitalis Yellow=Gelber Fingerhut +Drosera Round=Runder Sonnentau +Galerina=Gifthäubling +Gyromitra=Lorchel +Iris=Iris +Leontopodium White=Edelweiss +Leucanthemum White=Margerithe +Macrolepiota=Parasol +Papaver Red=Roter Klatschmohn +Plantago=Spitzwegerich +Trifolium Red=Rotklee +Trifolium White=Weissklee diff --git a/mods/herbs/locale/herbs.en.tr b/mods/herbs/locale/herbs.en.tr new file mode 100644 index 00000000..d8fce227 --- /dev/null +++ b/mods/herbs/locale/herbs.en.tr @@ -0,0 +1,26 @@ +# textdomain: herbs + + +### init.lua ### + +Achillea White=White Yarrow +Amanita Green=Green Bulbous +Anagallis Yellow=Yellow Houndstooth +Antirrhinum=Snapdragon +Boletus=Stone Mushroom +Campanula Blue=Blue Campanula +Cantharellus=Chanterelle +Centaurea=Cornflower +Digitalis Blue=Blue Thimble +Digitalis Yellow=Yellow Thimble +Drosera Round=Round Sundew +Galerina=Poisonous Sublime +Gyromitra=Lorikeet +Iris=Iris +Leontopodium White=Noble White +Leucanthemum White=Margerit +Macrolepiota=Parasol +Papaver Red=Red Poppy +Plantago=Ribwort +Trifolium Red=Red Clover +Trifolium White=White Clover diff --git a/mods/herbs/locale/herbs.it.tr b/mods/herbs/locale/herbs.it.tr new file mode 100644 index 00000000..fded2b6f --- /dev/null +++ b/mods/herbs/locale/herbs.it.tr @@ -0,0 +1,27 @@ +# textdomain: herbs + + +### init.lua ### + + +Achillea White=Achillea Bianca +Amanita Green=Tignosa Verdognola +Anagallis Yellow=Dente di Segugio Giallo +Antirrhinum=Bocca di Leone +Boletus=Boleto +Campanula Blue=Campanula Blu +Cantharellus=Gallinaccio +Centaurea=Fiordaliso +Digitalis Blue=Gilia Capitata Blu +Digitalis Yellow=Gilia Capitata Gialla +Drosera Round=Rosolida +Galerina=Galerina Marginata +Gyromitra=Falsa Spugnola +Iris=Iris +Leontopodium White=Stella Alpina +Leucanthemum White=Margherite +Macrolepiota=Mazza di Tamburo +Papaver Red=Papavero Rosso +Plantago=Piantaggine +Trifolium Red=Trifoglio Rosso +Trifolium White=Trifoglio Bianco diff --git a/mods/herbs/locale/template.txt b/mods/herbs/locale/template.txt new file mode 100644 index 00000000..8f808a80 --- /dev/null +++ b/mods/herbs/locale/template.txt @@ -0,0 +1,26 @@ +# textdomain: herbs + + +### init.lua ### + +Achillea White= +Amanita Green= +Anagallis Yellow= +Antirrhinum= +Boletus= +Campanula Blue= +Cantharellus= +Centaurea= +Digitalis Blue= +Digitalis Yellow= +Drosera Round= +Galerina= +Gyromitra= +Iris= +Leontopodium White= +Leucanthemum White= +Macrolepiota= +Papaver Red= +Plantago= +Trifolium Red= +Trifolium White= diff --git a/mods/herbs/mapgen.lua b/mods/herbs/mapgen.lua new file mode 100644 index 00000000..4bb595bb --- /dev/null +++ b/mods/herbs/mapgen.lua @@ -0,0 +1,125 @@ +-- +-- All other biome API mapgens +-- +local modname = herbs.modname + +local function register_flower(seed, flower_name, place, biome, ymin) + minetest.register_decoration({ + name = modname .. ":" ..flower_name, + deco_type = "simple", + place_on = place, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = {x = 200, y = 200, z = 200}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + biomes = biome, + y_max = 31000, + y_min = ymin, + decoration = modname.. ":" ..flower_name, + }) +end + +local function register_mushroom(mushroom_name) + minetest.register_decoration({ + name = modname .. ":" .. mushroom_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest", "coniferous_forest", "rainforest"}, + y_max = 31000, + y_min = 1, + decoration = modname..":" .. mushroom_name, + }) +end + +function herbs.register_decorations() + + -- Flowers + register_flower(7810530, "campanula_blue", + {"default:dirt_with_grass"}, + {"grassland", "decidious_forest"}, 1) + + register_flower(1770624, "clover_red", + {"default:dirt_with_grass","default:dirt_with_coniferous_litter","default:dry_dirt_with_dry_grass"}, + {"grassland", "decidious_forest", "coniferous_forest", "savanna"}, 1) + + register_flower(7741102, "cornflower", + {"default:dirt_with_grass"}, + {"grassland", "decidious_forest"}, 1) + + register_flower(440615, "thimble_blue", + {"default:dirt_with_grass"}, + {"grassland", "decidious_forest_shore"}, 1) + + register_flower(7245998, "thimble_yellow", + {"default:dirt_with_grass"}, + {"grassland", "decidious_forest_shore", "rainforest"}, 1) + + register_flower(3003485, "houndstooth", + {"default:dirt_with_grass"}, + {"grassland"}, 1) + + register_flower(8624595, "margerit", + {"default:dirt_with_grass", "default:dry_dirt_with_dry_grass"}, + {"grassland", "savanna", "savanna_shore"}, 1) + + register_flower(1444101, "poppy_red", + {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"}, + {"grassland","rainforest"}, 1) + + register_flower(7022389, "ribwort", + {"default:dirt_with_grass", "default:dirt", "default:dirt_with_coniferous_litter"}, + {"grassland", "decidious_forest", "mountain"}, 50) + + register_flower(8517959, "sundew", + {"default:dirt_with_grass", "default:dirt", "default:dirt_with_rainforest_litter"}, + {"decidious_forest_shore", "rainforest", "rainforest_swamp"}, 1) + + register_flower(2204695, "yarrow_white", + {"default:dirt_with_grass", "default:dirt", "default:dirt_with_coniferous_litter"}, + {"grassland", "decidious_forest", "mountain"}, 30) + + register_flower(2204695, "noble_white", + {"default:dirt_with_grass", "default:dirt","default:dirt_with_coniferous_litter"}, + {"grassland", "mountain"}, 70) + + register_flower(2204695, "iris", + {"default:dirt_with_grass", "default:dirt", "default:dirt_with_rainforest_litter"}, + {"decidious_forest_shore", "decidious_forest", "rainforest"}, 1) + + register_flower(2204695, "clover_white", + {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, + {"grassland"}, 1) + + register_flower(7810530, "snapdragon", + {"default:dirt_with_grass"}, + {"grassland", "decidious_forest", "decidious_forest_shore"}, 1) + + -- Mushrooms + register_mushroom("mushroom_bulbous_green") + register_mushroom("mushroom_chanterelle") + register_mushroom("mushroom_lorikeet") + register_mushroom("mushroom_parasol") + register_mushroom("mushroom_poisonous_sublime") + register_mushroom("mushroom_stone") + +end + + +-- +-- Detect mapgen to select functions +-- +--herbs.register_decorations() -- removed, flowers and mushrooms will be placed via other mods diff --git a/mods/herbs/mod.conf b/mods/herbs/mod.conf new file mode 100644 index 00000000..b9993ec5 --- /dev/null +++ b/mods/herbs/mod.conf @@ -0,0 +1,3 @@ +name = herbs +depends = default, flowers +optional_depends = hunger_ng, techage, signs_bot, flowerpot, technic diff --git a/mods/herbs/register_mods.lua b/mods/herbs/register_mods.lua new file mode 100644 index 00000000..c1a7e292 --- /dev/null +++ b/mods/herbs/register_mods.lua @@ -0,0 +1,86 @@ +local modname = herbs.modname +local hb = herbs + +if(minetest.get_modpath("hunger_ng")) then + local add = hunger_ng.add_hunger_data + + for key, value in pairs(hb.mushroomdatas) do + add(modname .. ":" .. value[1], {satiates = value[4], heal = value[5]}) + minetest.log("action",hb.modname .. " registers " .. modname.. ":" .. value[1] .. " @hunger_ng.") + end -- for key + +end -- if(minetest.get_modname("hunger_ng + +if(minetest.get_modpath("techage")) then + local reg = techage.register_flower + + for key, value in pairs(hb.mushroomdatas) do + reg(modname .. ":" .. value[1]) + minetest.log("action",hb.modname .. " registers " .. modname.. ":" .. value[1] .. " @techage.") + + end + + for key, value in pairs(hb.flowerdatas) do + reg(modname .. ":" .. value[1]) + minetest.log("action",hb.modname .. " registers " .. modname..":" .. value[1] .. " @techage.") + end + +end + + +if(minetest.get_modpath("signs_bot")) then + local reg = signs_bot.register_flower + + for key, value in pairs(hb.mushroomdatas) do + reg(modname .. ":" .. value[1]) + minetest.log("action",hb.modname .. " registers " .. modname.. ":" .. value[1] .. " @signs_bot.") + + end + + for key, value in pairs(hb.flowerdatas) do + reg(modname .. ":" .. value[1]) + minetest.log("action",hb.modname .. " registers " .. modname..":" .. value[1] .. " @signs_bot.") + end + +end + +if(minetest.get_modpath("flowerpot")) then + local reg = flowerpot.register_node + + for key, value in pairs(hb.mushroomdatas) do + reg(modname .. ":" .. value[1]) + minetest.log("action",hb.modname .. " registers " .. modname..":" .. value[1] .. " @signs_bot.") + + end + + for key, value in pairs(hb.flowerdatas) do + reg(modname .. ":" .. value[1]) + minetest.log("action",hb.modname .. " registers " .. modname..":" .. value[1] .. " @signs_bot.") + + end + +end + +if(minetest.get_modpath("technic")) then + local extractor_recipes = { + {"campanula_blue", "dye:blue"}, + {"trifolium_red", "dye:violet"}, + {"trifolium_white", "dye:green"}, + {"centaurea", "dye:blue"}, + {"anagallis_yellow", "dye:yellow"}, + {"leucanthemum_white", "dye:white"}, + {"leontopodium_white", "dye:grey"}, + {"papaver_red", "dye:red"}, + {"antirrhinum", "dye:pink"}, + {"drosera", "dye:red"}, + {"digitalis_blue", "dye:blue"}, + {"digitalis_yellow", "dye:yellow"}, + {"achillea_white", "dye:white"}, + } + + for _,value in pairs(extractor_recipes) do + technic.register_extractor_recipe({input = {"herbs:" .. value[1]}, output = value[2] .. " 4"}) + + end -- for _,value + +end -- if(technic) diff --git a/mods/herbs/screenshot_2.png b/mods/herbs/screenshot_2.png new file mode 100644 index 00000000..3ad4e3d1 Binary files /dev/null and b/mods/herbs/screenshot_2.png differ diff --git a/mods/herbs/textures/herbs_achillea_white.png b/mods/herbs/textures/herbs_achillea_white.png new file mode 100644 index 00000000..8aaf5657 Binary files /dev/null and b/mods/herbs/textures/herbs_achillea_white.png differ diff --git a/mods/herbs/textures/herbs_anagallis_yellow.png b/mods/herbs/textures/herbs_anagallis_yellow.png new file mode 100644 index 00000000..90e51914 Binary files /dev/null and b/mods/herbs/textures/herbs_anagallis_yellow.png differ diff --git a/mods/herbs/textures/herbs_antirrhinum.png b/mods/herbs/textures/herbs_antirrhinum.png new file mode 100644 index 00000000..f29e8553 Binary files /dev/null and b/mods/herbs/textures/herbs_antirrhinum.png differ diff --git a/mods/herbs/textures/herbs_campanula_blue.png b/mods/herbs/textures/herbs_campanula_blue.png new file mode 100644 index 00000000..d575e7ec Binary files /dev/null and b/mods/herbs/textures/herbs_campanula_blue.png differ diff --git a/mods/herbs/textures/herbs_centaurea.png b/mods/herbs/textures/herbs_centaurea.png new file mode 100644 index 00000000..d6a073ae Binary files /dev/null and b/mods/herbs/textures/herbs_centaurea.png differ diff --git a/mods/herbs/textures/herbs_digitalis_blue.png b/mods/herbs/textures/herbs_digitalis_blue.png new file mode 100644 index 00000000..53f242b7 Binary files /dev/null and b/mods/herbs/textures/herbs_digitalis_blue.png differ diff --git a/mods/herbs/textures/herbs_digitalis_yellow.png b/mods/herbs/textures/herbs_digitalis_yellow.png new file mode 100644 index 00000000..e5843e0c Binary files /dev/null and b/mods/herbs/textures/herbs_digitalis_yellow.png differ diff --git a/mods/herbs/textures/herbs_dosera.png b/mods/herbs/textures/herbs_dosera.png new file mode 100644 index 00000000..0c6cf16e Binary files /dev/null and b/mods/herbs/textures/herbs_dosera.png differ diff --git a/mods/herbs/textures/herbs_iris.png b/mods/herbs/textures/herbs_iris.png new file mode 100644 index 00000000..2f0afe4d Binary files /dev/null and b/mods/herbs/textures/herbs_iris.png differ diff --git a/mods/herbs/textures/herbs_leontopodium_white.png b/mods/herbs/textures/herbs_leontopodium_white.png new file mode 100644 index 00000000..95f909b6 Binary files /dev/null and b/mods/herbs/textures/herbs_leontopodium_white.png differ diff --git a/mods/herbs/textures/herbs_leucanthemum_white.png b/mods/herbs/textures/herbs_leucanthemum_white.png new file mode 100644 index 00000000..f46a77ee Binary files /dev/null and b/mods/herbs/textures/herbs_leucanthemum_white.png differ diff --git a/mods/herbs/textures/herbs_mushroom_amanita_green.png b/mods/herbs/textures/herbs_mushroom_amanita_green.png new file mode 100644 index 00000000..822677dc Binary files /dev/null and b/mods/herbs/textures/herbs_mushroom_amanita_green.png differ diff --git a/mods/herbs/textures/herbs_mushroom_boletus.png b/mods/herbs/textures/herbs_mushroom_boletus.png new file mode 100644 index 00000000..7ca82b2e Binary files /dev/null and b/mods/herbs/textures/herbs_mushroom_boletus.png differ diff --git a/mods/herbs/textures/herbs_mushroom_cantharellus.png b/mods/herbs/textures/herbs_mushroom_cantharellus.png new file mode 100644 index 00000000..a17ad28f Binary files /dev/null and b/mods/herbs/textures/herbs_mushroom_cantharellus.png differ diff --git a/mods/herbs/textures/herbs_mushroom_galerina.png b/mods/herbs/textures/herbs_mushroom_galerina.png new file mode 100644 index 00000000..c2a7a73c Binary files /dev/null and b/mods/herbs/textures/herbs_mushroom_galerina.png differ diff --git a/mods/herbs/textures/herbs_mushroom_gyromitra.png b/mods/herbs/textures/herbs_mushroom_gyromitra.png new file mode 100644 index 00000000..f4863a91 Binary files /dev/null and b/mods/herbs/textures/herbs_mushroom_gyromitra.png differ diff --git a/mods/herbs/textures/herbs_mushroom_macrolepiota.png b/mods/herbs/textures/herbs_mushroom_macrolepiota.png new file mode 100644 index 00000000..fa51e2f7 Binary files /dev/null and b/mods/herbs/textures/herbs_mushroom_macrolepiota.png differ diff --git a/mods/herbs/textures/herbs_papver_red.png b/mods/herbs/textures/herbs_papver_red.png new file mode 100644 index 00000000..be6b2afd Binary files /dev/null and b/mods/herbs/textures/herbs_papver_red.png differ diff --git a/mods/herbs/textures/herbs_plantago.png b/mods/herbs/textures/herbs_plantago.png new file mode 100644 index 00000000..e6a6952d Binary files /dev/null and b/mods/herbs/textures/herbs_plantago.png differ diff --git a/mods/herbs/textures/herbs_trifolium_red.png b/mods/herbs/textures/herbs_trifolium_red.png new file mode 100644 index 00000000..0a7c63ca Binary files /dev/null and b/mods/herbs/textures/herbs_trifolium_red.png differ diff --git a/mods/herbs/textures/herbs_trifolium_white.png b/mods/herbs/textures/herbs_trifolium_white.png new file mode 100644 index 00000000..72a64191 Binary files /dev/null and b/mods/herbs/textures/herbs_trifolium_white.png differ diff --git a/mods/herbs/textures/old/herbs_achillea_white.png b/mods/herbs/textures/old/herbs_achillea_white.png new file mode 100644 index 00000000..32a91031 Binary files /dev/null and b/mods/herbs/textures/old/herbs_achillea_white.png differ diff --git a/mods/herbs/textures/old/herbs_anagallis.png b/mods/herbs/textures/old/herbs_anagallis.png new file mode 100644 index 00000000..ec7a8b62 Binary files /dev/null and b/mods/herbs/textures/old/herbs_anagallis.png differ diff --git a/mods/herbs/textures/old/herbs_antirrhinum.png b/mods/herbs/textures/old/herbs_antirrhinum.png new file mode 100644 index 00000000..00620d8c Binary files /dev/null and b/mods/herbs/textures/old/herbs_antirrhinum.png differ diff --git a/mods/herbs/textures/old/herbs_campanula_blue.png b/mods/herbs/textures/old/herbs_campanula_blue.png new file mode 100644 index 00000000..cd9a143a Binary files /dev/null and b/mods/herbs/textures/old/herbs_campanula_blue.png differ diff --git a/mods/herbs/textures/old/herbs_centaurea.png b/mods/herbs/textures/old/herbs_centaurea.png new file mode 100644 index 00000000..b3881acb Binary files /dev/null and b/mods/herbs/textures/old/herbs_centaurea.png differ diff --git a/mods/herbs/textures/old/herbs_digitalis_blue.png b/mods/herbs/textures/old/herbs_digitalis_blue.png new file mode 100644 index 00000000..1565f514 Binary files /dev/null and b/mods/herbs/textures/old/herbs_digitalis_blue.png differ diff --git a/mods/herbs/textures/old/herbs_digitalis_yellow.png b/mods/herbs/textures/old/herbs_digitalis_yellow.png new file mode 100644 index 00000000..379f6e26 Binary files /dev/null and b/mods/herbs/textures/old/herbs_digitalis_yellow.png differ diff --git a/mods/herbs/textures/old/herbs_drosera.png b/mods/herbs/textures/old/herbs_drosera.png new file mode 100644 index 00000000..38a38216 Binary files /dev/null and b/mods/herbs/textures/old/herbs_drosera.png differ diff --git a/mods/herbs/textures/old/herbs_iris.png b/mods/herbs/textures/old/herbs_iris.png new file mode 100644 index 00000000..83144dec Binary files /dev/null and b/mods/herbs/textures/old/herbs_iris.png differ diff --git a/mods/herbs/textures/old/herbs_leucanthemum.png b/mods/herbs/textures/old/herbs_leucanthemum.png new file mode 100644 index 00000000..6aa837ab Binary files /dev/null and b/mods/herbs/textures/old/herbs_leucanthemum.png differ diff --git a/mods/herbs/textures/old/herbs_mushroom_amanita_green.png b/mods/herbs/textures/old/herbs_mushroom_amanita_green.png new file mode 100644 index 00000000..7c0e0f0e Binary files /dev/null and b/mods/herbs/textures/old/herbs_mushroom_amanita_green.png differ diff --git a/mods/herbs/textures/old/herbs_mushroom_boletus.png b/mods/herbs/textures/old/herbs_mushroom_boletus.png new file mode 100644 index 00000000..ae4b2974 Binary files /dev/null and b/mods/herbs/textures/old/herbs_mushroom_boletus.png differ diff --git a/mods/herbs/textures/old/herbs_mushroom_chanterellus.png b/mods/herbs/textures/old/herbs_mushroom_chanterellus.png new file mode 100644 index 00000000..671b69e3 Binary files /dev/null and b/mods/herbs/textures/old/herbs_mushroom_chanterellus.png differ diff --git a/mods/herbs/textures/old/herbs_mushroom_galerina.png b/mods/herbs/textures/old/herbs_mushroom_galerina.png new file mode 100644 index 00000000..88ec3385 Binary files /dev/null and b/mods/herbs/textures/old/herbs_mushroom_galerina.png differ diff --git a/mods/herbs/textures/old/herbs_mushroom_gyromitra.png b/mods/herbs/textures/old/herbs_mushroom_gyromitra.png new file mode 100644 index 00000000..42d3e441 Binary files /dev/null and b/mods/herbs/textures/old/herbs_mushroom_gyromitra.png differ diff --git a/mods/herbs/textures/old/herbs_mushroom_macrolepiota.png b/mods/herbs/textures/old/herbs_mushroom_macrolepiota.png new file mode 100644 index 00000000..66636dbc Binary files /dev/null and b/mods/herbs/textures/old/herbs_mushroom_macrolepiota.png differ diff --git a/mods/herbs/textures/old/herbs_noble_white.png b/mods/herbs/textures/old/herbs_noble_white.png new file mode 100644 index 00000000..2aa40c33 Binary files /dev/null and b/mods/herbs/textures/old/herbs_noble_white.png differ diff --git a/mods/herbs/textures/old/herbs_papaver_red.png b/mods/herbs/textures/old/herbs_papaver_red.png new file mode 100644 index 00000000..89bbb885 Binary files /dev/null and b/mods/herbs/textures/old/herbs_papaver_red.png differ diff --git a/mods/herbs/textures/old/herbs_plantago.png b/mods/herbs/textures/old/herbs_plantago.png new file mode 100644 index 00000000..985089c8 Binary files /dev/null and b/mods/herbs/textures/old/herbs_plantago.png differ diff --git a/mods/herbs/textures/old/herbs_trifolium_red.png b/mods/herbs/textures/old/herbs_trifolium_red.png new file mode 100644 index 00000000..593efa43 Binary files /dev/null and b/mods/herbs/textures/old/herbs_trifolium_red.png differ diff --git a/mods/herbs/textures/old/herbs_trifolium_white.png b/mods/herbs/textures/old/herbs_trifolium_white.png new file mode 100644 index 00000000..80d616c0 Binary files /dev/null and b/mods/herbs/textures/old/herbs_trifolium_white.png differ diff --git a/mods/item_drop/.luacheckrc b/mods/item_drop/.luacheckrc new file mode 100644 index 00000000..a9c034e1 --- /dev/null +++ b/mods/item_drop/.luacheckrc @@ -0,0 +1,19 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +ignore = { + "name", "drops", "i", +} + +globals = { + "minetest", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + "vector", "ItemStack", + "dump", +} diff --git a/mods/item_drop/CONTRIBUTING.md b/mods/item_drop/CONTRIBUTING.md new file mode 100644 index 00000000..16a26e33 --- /dev/null +++ b/mods/item_drop/CONTRIBUTING.md @@ -0,0 +1,3 @@ +- The `master` branch should be stable to end-users at all times. It should target latest Minetest point release. +- Put rewrites and new features in branches. +- Conform with setting defaults so that end-user upgrades doesn't change expected in-game behavior. Discuss default changes in an issue if one really need to change. diff --git a/mods/item_drop/LICENSE b/mods/item_drop/LICENSE new file mode 100644 index 00000000..19e30718 --- /dev/null +++ b/mods/item_drop/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/item_drop/README.md b/mods/item_drop/README.md new file mode 100644 index 00000000..771e82d9 --- /dev/null +++ b/mods/item_drop/README.md @@ -0,0 +1,60 @@ +# Item Drop [![](https://github.com/minetest-mods/item_drop/workflows/build/badge.svg)](https://github.com/minetest-mods/item_drop/actions) [![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) + +A highly configurable mod providing item magnet and in-world node drops\ +By [PilzAdam](https://github.com/PilzAdam), +[texmex](https://github.com/tacotexmex/), [hybriddog](https://github.com/hybriddog/). + +## Licensing +LGPLv2.1/CC BY-SA 3.0. Particle code from WCILA mod by Aurailus, originally licensed MIT. + +## Notes +`item_drop` can be played with Minetest 0.4.16 or above. It was originally +developed by [PilzAdam](https://github.com/PilzAdam/item_drop). + +## List of features +* All settings may be configured from within the game itself. + (Settings tab > Advanced settings > Mods > item_drop) +* Drops nodes as in-world items on dig if `item_drop.enable_item_drop` is + `true` (true by default) It does nothing in creative mode. +* Puts dropped items to the player's inventory if `item_drop.enable_item_pickup` + is `true` (true by default) + * Multiple items are picked in a quick succession instead of all at once which + is indicated by the pickup sound. + * It uses a node radius set in `item_drop.pickup_radius` (default 0.75), + if items are within this radius around the player's belt, they're picked. + * If `item_drop.pickup_age` is something positive, items dropped by players + are ignored for this time to avoid instantly picking up when dropping. + * If `item_drop.pickup_age` is `-1`, items are only picked when they don't + move, it's another fix for instant item picking. + * If `item_drop.magnet_radius` is bigger than `item_drop.pickup_radius`, + items between these radii are flying to the player for + `item_drop.magnet_time` seconds, after this time, they're picked or stop + flying. + * Enable manual item pickups by mouse only if `item_drop.mouse_pickup` is + `true` (true by default) +* Plays a sound when the items are picked up with the gain level set to + `item_drop.pickup_sound_gain` (default 0.2) +* Requires a key to be pressed in order to pick items if + `item_drop.enable_pickup_key` is `true` (true by default) + * The keytypes to choose from by setting `item_pickup_keytype` are: + * Use key (`Use`) + * Sneak key (`Sneak`) + * Left and Right keys combined (`LeftAndRight`) + * Right mouse button (`RMB`) + * Sneak key and right mouse button combined (`SneakAndRMB`) + * If `item_drop.pickup_keyinvert` is `true`, items are + collected when the key is not pressed instead of when it's pressed. +* Displays a particle of the picked item above the player if + `item_drop.pickup_particle` is `true` (true by default) + + +## Known issues + +## Bug reports and suggestions +You can report bugs or suggest ideas by +[filing an issue](http://github.com/minetest-mods/item_drop/issues/new). + +## Links +* [Download ZIP](https://github.com/minetest-mods/item_drop/archive/master.zip) +* [Source](https://github.com/minetest-mods/item_drop/) +* [Forum thread](https://forum.minetest.net/viewtopic.php?t=16913) diff --git a/mods/item_drop/description.txt b/mods/item_drop/description.txt new file mode 100644 index 00000000..ef32f14f --- /dev/null +++ b/mods/item_drop/description.txt @@ -0,0 +1 @@ +A highly configurable mod providing item magnet and in-world node drops diff --git a/mods/item_drop/init.lua b/mods/item_drop/init.lua new file mode 100644 index 00000000..0d0fe2ee --- /dev/null +++ b/mods/item_drop/init.lua @@ -0,0 +1,437 @@ +local load_time_start = minetest.get_us_time() + +-- Functions which can be overridden by mods +item_drop = { + -- This function is executed before picking up an item or making it fly to + -- the player. If it does not return true, the item is ignored. + -- It is also executed before collecting the item after it flew to + -- the player and did not reach him/her for magnet_time seconds. + can_pickup = function(entity, player) + if entity.item_drop_picked then + -- Ignore items where picking has already failed + return false + end + return true + end, + + -- before_collect and after_collect are executed before and after an item + -- is collected by a player + before_collect = function(entity, pos, player) + end, + after_collect = function(entity, pos, player) + entity.item_drop_picked = true + end, +} + +local function legacy_setting_getbool(name_new, name_old, default) + local v = minetest.settings:get_bool(name_new) + if v == nil then + v = minetest.settings:get_bool(name_new) + end + if default then + return v ~= false + end + return v +end + +local function legacy_setting_getnumber(name_new, name_old, default) + return tonumber(minetest.settings:get(name_new)) + or tonumber(minetest.settings:get(name_old)) + or default +end + +if legacy_setting_getbool("item_drop.enable_item_pickup", + "enable_item_pickup", true) then + local pickup_gain = legacy_setting_getnumber("item_drop.pickup_sound_gain", + "item_pickup_gain", 0.0375) + local pickup_particle = + minetest.settings:get_bool("item_drop.pickup_particle", false) + local pickup_radius = legacy_setting_getnumber("item_drop.pickup_radius", + "item_pickup_radius", 1.5) + local magnet_radius = tonumber( + minetest.settings:get("item_drop.magnet_radius")) or -1 + local magnet_time = tonumber( + minetest.settings:get("item_drop.magnet_time")) or 5.0 + local pickup_age = tonumber( + minetest.settings:get("item_drop.pickup_age")) or 1 + local key_triggered = legacy_setting_getbool("item_drop.enable_pickup_key", + "enable_item_pickup_key", true) + local key_invert = minetest.settings:get_bool( + "item_drop.pickup_keyinvert") ~= false + local keytype + if key_triggered then + keytype = minetest.settings:get("item_drop.pickup_keytype") or + minetest.settings:get("item_pickup_keytype") or "Use" + -- disable pickup age if picking is explicitly enabled by the player + if not key_invert then + pickup_age = math.min(pickup_age, 0) + end + end + local mouse_pickup = minetest.settings:get_bool( + "item_drop.mouse_pickup") ~= false + if not mouse_pickup then + minetest.registered_entities["__builtin:item"].pointable = false + end + + local magnet_mode = magnet_radius > pickup_radius + local zero_velocity_mode = pickup_age == -1 + if magnet_mode + and zero_velocity_mode then + error"zero velocity mode can't be used together with magnet mode" + end + + -- tells whether an inventorycube should be shown as pickup_particle or not + -- for known drawtypes + local inventorycube_drawtypes = { + normal = true, + allfaces = true, + allfaces_optional = true, + glasslike = true, + glasslike_framed = true, + glasslike_framed_optional = true, + liquid = true, + flowingliquid = true, + } + + -- Get an image string from a tile definition + local function tile_to_image(tile, fallback_image) + if not tile then + return fallback_image + end + local tile_type = type(tile) + if tile_type == "string" then + return tile + end + assert(tile_type == "table", "Tile definition is not a string or table") + local image = tile.name or tile.image + assert(image, "Tile definition has no image file specified") + if tile.color then + local colorstr = minetest.colorspec_to_colorstring(tile.color) + if colorstr then + return image .. "^[multiply:" .. colorstr + end + end + return image + end + + -- adds the item to the inventory and removes the object + local function collect_item(ent, pos, player) + item_drop.before_collect(ent, pos, player) + minetest.sound_play("item_drop_pickup", { + pos = pos, + gain = pickup_gain, + pitch = 2.1 + math.random(-2250,2250) / 10000, + }, true) + if pickup_particle then + local item = minetest.registered_nodes[ + ent.itemstring:gsub("(.*)%s.*$", "%1")] + local image + if item and item.tiles and item.tiles[1] then + if inventorycube_drawtypes[item.drawtype] then + local tiles = item.tiles + -- color in the tile definition is handled by tile_to_image. + -- color in the node definition is not yet supported here. + local top = tile_to_image(tiles[1]) + local left = tile_to_image(tiles[3], top) + local right = tile_to_image(tiles[5], left) + image = minetest.inventorycube(top, left, right) + else + image = item.inventory_image or item.tiles[1] + end + minetest.add_particle({ + pos = {x = pos.x, y = pos.y + 1.5, z = pos.z}, + velocity = {x = 0, y = 1, z = 0}, + acceleration = {x = 0, y = -4, z = 0}, + expirationtime = 0.2, + size = 3,--math.random() + 0.5, + vertical = false, + texture = image, + }) + end + end + ent:on_punch(player) + item_drop.after_collect(ent, pos, player) + end + + -- opt_get_ent gets the object's luaentity if it can be collected + local opt_get_ent + if zero_velocity_mode then + function opt_get_ent(object) + if object:is_player() + or not vector.equals(object:get_velocity(), {x=0, y=0, z=0}) then + return + end + local ent = object:get_luaentity() + if not ent + or ent.name ~= "__builtin:item" + or ent.itemstring == "" then + return + end + return ent + end + else + function opt_get_ent(object) + if object:is_player() then + return + end + local ent = object:get_luaentity() + if not ent + or ent.name ~= "__builtin:item" + or (ent.dropped_by and ent.age < pickup_age) + or ent.itemstring == "" then + return + end + return ent + end + end + + local afterflight + if magnet_mode then + -- take item or reset velocity after flying a second + function afterflight(object, inv, player) + -- TODO: test what happens if player left the game + local ent = opt_get_ent(object) + if not ent then + return + end + local item = ItemStack(ent.itemstring) + if inv + and inv:room_for_item("main", item) + and item_drop.can_pickup(ent, player) then + collect_item(ent, object:get_pos(), player) + else + -- the acceleration will be reset by the object's on_step + object:set_velocity({x=0,y=0,z=0}) + ent.is_magnet_item = false + end + end + + -- disable velocity and acceleration changes of items flying to players + minetest.after(0, function() + local ObjectRef + local blocked_methods = {"set_acceleration", "set_velocity", + "setacceleration", "setvelocity"} + local itemdef = minetest.registered_entities["__builtin:item"] + local old_on_step = itemdef.on_step + local function do_nothing() end + function itemdef.on_step(self, ...) + if not self.is_magnet_item then + return old_on_step(self, ...) + end + ObjectRef = ObjectRef or getmetatable(self.object) + local old_funcs = {} + for i = 1, #blocked_methods do + local method = blocked_methods[i] + old_funcs[method] = ObjectRef[method] + ObjectRef[method] = do_nothing + end + old_on_step(self, ...) + for i = 1, #blocked_methods do + local method = blocked_methods[i] + ObjectRef[method] = old_funcs[method] + end + end + end) + end + + -- set keytype to the key name if possible + if keytype == "Use" then + keytype = "aux1" + elseif keytype == "Sneak" then + keytype = "sneak" + elseif keytype == "LeftAndRight" then -- LeftAndRight combination + keytype = 0 + elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination + keytype = 1 + end + + + -- tests if the player has the keys pressed to enable item picking + local function has_keys_pressed(player) + if not key_triggered then + return true + end + + local control = player:get_player_control() + local keys_pressed + if keytype == 0 then -- LeftAndRight combination + keys_pressed = control.left and control.right + elseif keytype == 1 then -- SneakAndRMB combination + keys_pressed = control.sneak and control.RMB + else + keys_pressed = control[keytype] + end + + return keys_pressed ~= key_invert + end + + local function is_inside_map(pos) + local bound = 31000 + return -bound < pos.x and pos.x < bound + and -bound < pos.y and pos.y < bound + and -bound < pos.z and pos.z < bound + end + + -- called for each player to possibly collect an item, returns true if so + local function pickupfunc(player) + if not has_keys_pressed(player) + or not minetest.get_player_privs(player:get_player_name()).interact + or player:get_hp() <= 0 then + return + end + + local pos = player:get_pos() + if not is_inside_map(pos) then + -- get_objects_inside_radius crashes for too far positions + return + end + pos.y = pos.y+0.5 + local inv = player:get_inventory() + + local objectlist = minetest.get_objects_inside_radius(pos, + magnet_mode and magnet_radius or pickup_radius) + for i = 1,#objectlist do + local object = objectlist[i] + local ent = opt_get_ent(object) + if ent + and item_drop.can_pickup(ent, player) then + local item = ItemStack(ent.itemstring) + if inv:room_for_item("main", item) then + local flying_item + local pos2 + if magnet_mode then + pos2 = object:get_pos() + flying_item = vector.distance(pos, pos2) > pickup_radius + end + if not flying_item then + -- The item is near enough to pick it + collect_item(ent, pos, player) + -- Collect one item at a time to avoid the loud pop + return true + end + -- The item is not too far a way but near enough to be + -- magnetised, make it fly to the player + local vel = vector.multiply(vector.subtract(pos, pos2), 3) + vel.y = vel.y + 0.6 + object:set_velocity(vel) + if not ent.is_magnet_item then + ent.object:set_acceleration({x=0, y=0, z=0}) + ent.is_magnet_item = true + + minetest.after(magnet_time, afterflight, + object, inv, player) + end + end + end + end + end + + local function pickup_step() + local got_item + local players = minetest.get_connected_players() + for i = 1,#players do + got_item = got_item or pickupfunc(players[i]) + end + -- lower step if takeable item(s) were found + local time + if got_item then + time = 0.02 + else + time = 0.2 + end + minetest.after(time, pickup_step) + end + minetest.after(3.0, pickup_step) +end + +if legacy_setting_getbool("item_drop.enable_item_drop", "enable_item_drop", true) +and not minetest.settings:get_bool("creative_mode") then + -- Workaround to test if an item metadata (ItemStackMetaRef) is empty + local function itemmeta_is_empty(meta) + local t = meta:to_table() + for k, v in pairs(t) do + if k ~= "fields" then + return false + end + assert(type(v) == "table") + if next(v) ~= nil then + return false + end + end + return true + end + + -- Tests if the item has special information such as metadata + local function can_split_item(item) + return item:get_wear() == 0 and itemmeta_is_empty(item:get_meta()) + end + + local function spawn_items(pos, items_to_spawn) + for i = 1,#items_to_spawn do + local obj = minetest.add_item(pos, items_to_spawn[i]) + if not obj then + error("Couldn't spawn item " .. name .. ", drops: " + .. dump(drops)) + end + + local vel = obj:get_velocity() + local x = math.random(-5, 4) + if x >= 0 then + x = x+1 + end + vel.x = 1 / x + local z = math.random(-5, 4) + if z >= 0 then + z = z+1 + end + vel.z = 1 / z + obj:set_velocity(vel) + end + end + + local old_handle_node_drops = minetest.handle_node_drops + function minetest.handle_node_drops(pos, drops, player) + if not player or player.is_fake_player then + -- Node Breaker or similar machines should receive items in the + -- inventory + return old_handle_node_drops(pos, drops, player) + end + for i = 1,#drops do + local item = drops[i] + if type(item) == "string" then + -- The string is not necessarily only the item name, + -- so always convert it to ItemStack + item = ItemStack(item) + end + local count = item:get_count() + local name = item:get_name() + + -- Sometimes nothing should be dropped + if name == "" + or not minetest.registered_items[name] then + count = 0 + end + + if count > 0 then + -- Split items if possible + local items_to_spawn = {item} + if can_split_item(item) then + for i = 1,count do + items_to_spawn[i] = name + end + end + + spawn_items(pos, items_to_spawn) + end + end + end +end + + +local time = (minetest.get_us_time() - load_time_start) / 1000000 +local msg = "[item_drop] loaded after ca. " .. time .. " seconds." +if time > 0.01 then + print(msg) +else + minetest.log("info", msg) +end diff --git a/mods/item_drop/mod.conf b/mods/item_drop/mod.conf new file mode 100644 index 00000000..89669131 --- /dev/null +++ b/mods/item_drop/mod.conf @@ -0,0 +1,2 @@ +name = item_drop +description = A highly configurable mod providing item magnet and in-world node drops diff --git a/mods/item_drop/settingtypes.txt b/mods/item_drop/settingtypes.txt new file mode 100644 index 00000000..128c7a62 --- /dev/null +++ b/mods/item_drop/settingtypes.txt @@ -0,0 +1,38 @@ +#Pick up items automatically +item_drop.enable_item_pickup (Enable item pickups) bool true + +#Drop items in-world on dig, does nothing in creative mode +item_drop.enable_item_drop (Enable item drops) bool true + +#Use a key to pick up items +item_drop.enable_pickup_key (Use pickup key) bool true + +#Collect items when the key is not pressed instead of when it is pressed +item_drop.pickup_keyinvert (Invert pickup key) bool true + +#What keytype to use as pickup key +item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB + +#The volume of the pickup sound +item_drop.pickup_sound_gain (Pickup sound gain) float 0.0375 + +#Display a particle of the item picked up above the player +item_drop.pickup_particle (Pickup particle) bool false + +#Player pickup radius, the maximum distance from which items can be collected +item_drop.pickup_radius (Pickup radius) float 1.5 + +#Magnet radius, items between pickup_radius and this begin flying to the player +#Set it to -1 (or something else smaller than pickup_radius) to disable item +#flying +item_drop.magnet_radius (Magnet radius) float -1 + +#Item flight duration, items flying for more than this time are added to the +#player's inventory +item_drop.magnet_time (Magnet time) float 5.0 + +#Time delay in seconds after autopicking an item if it's dropped by a player +item_drop.pickup_age (Pickup age) float 1 + +#Enable manual item pickups by mouse +item_drop.mouse_pickup (Mouse pickup) bool true diff --git a/mods/item_drop/sounds/item_drop_pickup.1.ogg b/mods/item_drop/sounds/item_drop_pickup.1.ogg new file mode 100644 index 00000000..2ae432d5 Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.1.ogg differ diff --git a/mods/item_drop/sounds/item_drop_pickup.2.ogg b/mods/item_drop/sounds/item_drop_pickup.2.ogg new file mode 100644 index 00000000..f58bf08e Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.2.ogg differ diff --git a/mods/item_drop/sounds/item_drop_pickup.3.ogg b/mods/item_drop/sounds/item_drop_pickup.3.ogg new file mode 100644 index 00000000..cf57c94c Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.3.ogg differ diff --git a/mods/item_drop/sounds/item_drop_pickup.4.ogg b/mods/item_drop/sounds/item_drop_pickup.4.ogg new file mode 100644 index 00000000..bfe99d9a Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.4.ogg differ diff --git a/mods/leafstride/LICENSE b/mods/leafstride/LICENSE new file mode 100644 index 00000000..4b7f73fb --- /dev/null +++ b/mods/leafstride/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright © 2023 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mods/leafstride/README.md b/mods/leafstride/README.md new file mode 100644 index 00000000..1deb9e46 --- /dev/null +++ b/mods/leafstride/README.md @@ -0,0 +1,11 @@ +Leafstride +========== + +Climb through trees and glide through forests with Leafstride! This mod gives natural substance to leaves, allowing players to climb and walk through all forms of leaves. Although Leafstride allows players to move through leaves, the dense foliage will slow players down as they pass through -- but as a bonus, this also allows leaves to gently break a player's fall! + +How to Use +---------- + +Simply download and install Leafstride and it will automatically apply to all of the leaves in your world. Every node in your world that has `group:leaves` will be modified. + +The movement resistance caused by leaves can be configured via Settings > All Settings > Content: Mods > Leafstride. The value can range from 0 to 7; a value of 0 will not slow players down at all while a value of 7 will slow players down greatly. The default value of 2 offers a good middle ground. \ No newline at end of file diff --git a/mods/leafstride/init.lua b/mods/leafstride/init.lua new file mode 100644 index 00000000..a130b9cb --- /dev/null +++ b/mods/leafstride/init.lua @@ -0,0 +1,15 @@ +-- Get movement speed from settings if defined +local resistance = tonumber(minetest.settings:get("leafstride_move_resistance") or 2) + +-- Apply movement attributes to leaves after all mods have been loaded +minetest.register_on_mods_loaded(function() + for node,def in pairs(minetest.registered_nodes) do + if def.groups and def.groups.leaves and def.groups.leaves > 0 then + minetest.override_item(node,{ + walkable = false, + climbable = true, + move_resistance = resistance, + }) + end + end +end) \ No newline at end of file diff --git a/mods/leafstride/mod.conf b/mods/leafstride/mod.conf new file mode 100644 index 00000000..27c92d69 --- /dev/null +++ b/mods/leafstride/mod.conf @@ -0,0 +1,4 @@ +name = leafstride +title = Leafstride +description = Allows players to climb and walk through leaves +author = EmptyStar \ No newline at end of file diff --git a/mods/leafstride/settingtypes.txt b/mods/leafstride/settingtypes.txt new file mode 100644 index 00000000..e20b026e --- /dev/null +++ b/mods/leafstride/settingtypes.txt @@ -0,0 +1,2 @@ +# The amount of node move_resistance to apply to leaves. Value can range from 0 (leaves do not slow down players) to 7 (leaves greatly slow down players). +leafstride_move_resistance (Leaves movement resistance) int 2 0 7 \ No newline at end of file diff --git a/mods/livingjungle/LICENSE b/mods/livingjungle/LICENSE new file mode 100644 index 00000000..2477cb56 --- /dev/null +++ b/mods/livingjungle/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Liil (c) 2022 +Textures and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/livingjungle/init.lua b/mods/livingjungle/init.lua new file mode 100644 index 00000000..cb48604e --- /dev/null +++ b/mods/livingjungle/init.lua @@ -0,0 +1,28 @@ +--This creates the livingjungle object. +livingjungle = {} + +--This creates the livingjungle.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +livingjungle.settings = { + clear_biomes = minetest.settings:get_bool("livingjungle.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("livingjungle.clear_decos") or false, + clear_ores = minetest.settings:get_bool("livingjungle.clear_ores") or false, +} + +if livingjungle.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if livingjungle.settings.clear_decos then + minetest.clear_registered_decorations() +end +if livingjungle.settings.clear_ores then + minetest.clear_registered_ores() +end + +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +-- plants +dofile(path .. "junglenodes.lua") -- +dofile(path .. "jungleplants.lua") -- +dofile(path .. "leafdecay.lua") -- + + diff --git a/mods/livingjungle/junglenodes.lua b/mods/livingjungle/junglenodes.lua new file mode 100644 index 00000000..d7b5edf1 --- /dev/null +++ b/mods/livingjungle/junglenodes.lua @@ -0,0 +1,277 @@ +local S = minetest.get_translator("livingjungle") + +local modname = "livingjungle" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + + +minetest.register_biome({ + name = "livingjungle:jungle", + node_top = "livingjungle:jungleground", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 6, + node_riverbed = "default:sand", + depth_riverbed = 3, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 0, + heat_point = 92, + humidity_point = 72, +}) + +-- ground nodes + +minetest.register_node("livingjungle:jungleground", { + description = S("Green Jungle Ground"), + tiles = {"livingjungle_jungleground.png", "default_dirt.png", + {name = "default_dirt.png^livingjungle_jungleground_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("livingjungle:leafyjungleground", { + description = S("Leafy Jungle Ground"), + tiles = {"livingjungle_rainforest_litter.png", "default_dirt.png", + {name = "default_dirt.png^livingjungle_rainforest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingjungle:jungleground"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.9, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 31000, + y_min = 0, + decoration = "livingjungle:leafyjungleground" + }) + +--- rocks + +minetest.register_node("livingjungle:mossstone", { + description = S("Mossy Stone"), + tiles = {"livingjungle_mossstone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingjungle:mossstone", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingjungle:mossstone2", { + description = S("Mossy Stone"), + tiles = {"livingjungle_mossstone2.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingjungle:mossstone2", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingjungle:mossstone3", { + description = S("Mossy Stone"), + tiles = {"livingjungle_mossstone3.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingjungle:mossstone3", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "livingjungle:mossstone", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle") .. "/schematics/livingjungle_mossyrock.mts", + flags = "place_center_x, place_center_z", + spawn_by = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + rotation = "random", + }) + +minetest.register_decoration({ + name = "livingjungle:mossstone2", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle") .. "/schematics/livingjungle_mossyrock2.mts", + flags = "place_center_x, place_center_z", + spawn_by = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + rotation = "random", + }) + +minetest.register_decoration({ + name = "livingjungle:mossstone3", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle") .. "/schematics/livingjungle_mossyrock3.mts", + flags = "place_center_x, place_center_z", + spawn_by = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + rotation = "random", + }) + +--- crafting + +walls.register(":livingjungle:mossstonebrick_wall", S"Jungle Brick Wall", "livingjungle_stonebricks.png", + "livingjungle:mossstonebrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingjungle_stonebricks", + "livingjungle:mossstonebrick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingjungle_stonebricks.png"}, + S("Jungle Brick Stair"), + S("Jungle Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("livingjungle:mossstonebrick", { + description = S("Jungle Brick"), + tiles = {"livingjungle_stonebricks.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick", + type = "shapeless", + recipe = + {"livingjungle:mossstone"} + + +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick_wall", + type = "shapeless", + recipe = + {"livingjungle:mossstonebrick"} + + +}) + +walls.register(":livingjungle:mossstonebrick_wall2", S"Jungle Brick Wall", "livingjungle_stonebricks2.png", + "livingjungle:mossstonebrick_wall2", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingjungle_stonebricks2", + "livingjungle:mossstonebrick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingjungle_stonebricks2.png"}, + S("Jungle Brick Stair"), + S("Jungle Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("livingjungle:mossstonebrick2", { + description = S("Jungle Brick"), + tiles = {"livingjungle_stonebricks2.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick2", + type = "shapeless", + recipe = + {"livingjungle:mossstone2"} + + +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick_wall2", + type = "shapeless", + recipe = + {"livingjungle:mossstonebrick2"} + + +}) + +walls.register(":livingjungle:mossstonebrick_wall3", S"Jungle Brick Wall", "livingjungle_stonebricks3.png", + "livingjungle:mossstonebrick_wall3", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingjungle_stonebricks3", + "livingjungle:mossstonebrick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingjungle_stonebricks3.png"}, + S("Jungle Brick Stair"), + S("Jungle Brick Slab"), + default.node_sound_wood_defaults() + ) + +minetest.register_node("livingjungle:mossstonebrick3", { + description = S("Jungle Brick"), + tiles = {"livingjungle_stonebricks3.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick3", + type = "shapeless", + recipe = + {"livingjungle:mossstone3"} + + +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick_wall3", + type = "shapeless", + recipe = + {"livingjungle:mossstonebrick3"} + + +}) + diff --git a/mods/livingjungle/jungleplants.lua b/mods/livingjungle/jungleplants.lua new file mode 100644 index 00000000..46a7cdf3 --- /dev/null +++ b/mods/livingjungle/jungleplants.lua @@ -0,0 +1,727 @@ +local S = minetest.get_translator("livingjungle") + +local modname = "livingjungle" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- grass + + minetest.register_decoration({ + name = "livingjungle:grass1", + deco_type = "simple", + place_on = {"livingjungle:jungleground"}, + sidelen = 16, + fill_ratio = 0.115, + y_max = 31000, + y_min = 2, + decoration = "livingjungle:grass1", + }) + +minetest.register_node("livingjungle:grass1", { + description = S"Jungle Bushplant", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_junglegrass.png"}, + inventory_image = "livingjungle_junglegrass.png", + wield_image = "livingjungle_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingjungle:grass2", + deco_type = "simple", + place_on = {"livingjungle:jungleground"}, + sidelen = 16, + fill_ratio = 0.115, + y_max = 31000, + y_min = 2, + decoration = "livingjungle:grass2", + }) + +minetest.register_node("livingjungle:grass2", { + description = S"Jungle Fern", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_junglefern.png"}, + inventory_image = "livingjungle_junglefern.png", + wield_image = "livingjungle_junglefern.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +--- decor plants + +minetest.register_node("livingjungle:alocasia", { + description = S"Alocasia Bush", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_alocasia.png"}, + inventory_image = "livingjungle_alocasia.png", + wield_image = "livingjungle_alocasia.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingjungle:livingjungle:alocasia", + deco_type = "simple", + place_on = {"livingjungle:leafyjungleground"}, + sidelen = 16, + noise_params = { + offset = -0.025, + scale = 0.09, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 4, + persist = 0.9, + }, + y_max = 31000, + y_min = 1, + decoration = "livingjungle:alocasia", + }) + +minetest.register_node("livingjungle:flamingoflower", { + description = S"Flamingo Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_flamingoflower.png"}, + inventory_image = "livingjungle_flamingoflower.png", + wield_image = "livingjungle_flamingoflower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingjungle:flamingoflower", + deco_type = "simple", + place_on = {"livingjungle:leafyjungleground"}, + sidelen = 16, + noise_params = { + offset = -0.025, + scale = 0.09, + spread = {x = 100, y = 100, z = 100}, + seed = 722, + octaves = 4, + persist = 0.9, + }, + y_max = 31000, + y_min = 1, + decoration = "livingjungle:flamingoflower", + }) + + +minetest.register_node("livingjungle:stinkflower_core", { + description = S("Stinkflower"), + tiles = { + "livingjungle_stinkflower_middle.png", + "livingjungle_stinkflower_middle.png", + "livingjungle_stinkflower_middle.png" + }, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingjungle:stinkflower_leaf", { + description = S("Stinkflower Leaf"), + tiles = { + "livingjungle_stinkflower_side.png", + "livingjungle_stinkflower_side.png", + "livingjungle_stinkflower_side.png" + }, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingjungle:jungleground"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 111, + octaves = 3, + persist = 0.8, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/stinkflower.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + +--- trees + +-- New giantforest paleo samauma tree + +local function grow_new_samauma_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 13, y = pos.y - 0, z = pos.z - 13}, modpath.."/schematics/samauma_tree.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingjungle:samauma_sapling", grow_new_samauma_tree, "soil"}, +}) +end + +-- samauma trunk +minetest.register_node("livingjungle:samauma_trunk", { + description = S("Samauma Trunk"), + tiles = { + "livingjungle_samauma_trunk_top.png", + "livingjungle_samauma_trunk_top.png", + "livingjungle_samauma_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- paleo samauma wood +minetest.register_node("livingjungle:samauma_wood", { + description = S("Samauma Wood"), + tiles = {"livingjungle_samauma_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:samauma_wood 4", + recipe = {{"livingjungle:samauma_trunk"}} +}) + +minetest.register_node("livingjungle:samauma_leaves", { + description = S("Samauma Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingjungle_samauma_leaves.png"}, + special_tiles = {"livingjungle_samauma_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingjungle:samauma_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingjungle:samauma_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingjungle:samauma_sapling", { + description = S("Samauma Sapling"), + drawtype = "plantlike", + tiles = {"livingjungle_samauma_sapling.png"}, + inventory_image = "livingjungle_samauma_sapling.png", + wield_image = "livingjungle_samauma_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_samauma_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingjungle:samauma_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "livingjungle_samauma_wood", + "livingjungle:samauma_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingjungle_samauma_wood.png"}, + S("Samauma Stair"), + S("Samauma Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "livingjungle_samauma_trunk", + "livingjungle:samauma_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingjungle_samauma_trunk_top.png", "livingjungle_samauma_trunk_top.png", "livingjungle_samauma_trunk.png"}, + S("Samauma Trunk Stair"), + S("Samauma Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "livingjungle:gate_samauma_wood", + { + description = S("Samauma Wood Fence Gate"), + texture = "livingjungle_samauma_wood.png", + material = "livingjungle:samauma_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "livingjungle:fence_samauma_wood", + { + description = S("Samauma Fence"), + texture = "livingjungle_samauma_fencewood.png", + inventory_image = "default_fence_overlay.png^livingjungle_samauma_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingjungle_samauma_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingjungle:samauma_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "livingjungle:fence_rail_samauma_wood", + { + description = S("Samauma Fence Rail"), + texture = "livingjungle_samauma_fencewood.png", + inventory_image = "default_fence_rail_overlay.png^livingjungle_samauma_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingjungle_samauma_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingjungle:samauma_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree2", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree3", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00935, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree11", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree11.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree22", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree22.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree33", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00935, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree33.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + +minetest.register_node("livingjungle:lianabranch", { + description = S("Liana Branch"), + drawtype = "plantlike", + waving = 1, + tiles = {"livingjungle_liana_branch.png"}, + inventory_image = "livingjungle_liana_branch.png", + wield_image = "livingjungle_liana_branch.png", + paramtype = "light", + sunlight_propagates = true, + climbable = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2, winleafdecay = 3}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingjungle:lianabranch3", { + description = S("Liana Branch"), + drawtype = "raillike", + waving = 1, + tiles = {"livingjungle_liana_branch3.png"}, + inventory_image = "livingjungle_liana_branch3.png", + wield_image = "livingjungle_liana_branch3.png", + paramtype = "light", + sunlight_propagates = true, + climbable = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2, winleafdecay = 3}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingjungle:lianaleaves", { + description = S("Liana Leaves"), + drawtype = "plantlike", + waving = 1, + tiles = {"livingjungle_liana_leaves.png"}, + inventory_image = "livingjungle_liana_leaves.png", + wield_image = "livingjungle_liana_leaves.png", + paramtype = "light", + sunlight_propagates = true, + climbable = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2, winleafdecay = 3}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + + + +minetest.register_node("livingjungle:liana_stem", { + description = S("Liana Stem"), + tiles = { + "livingjungle_liana_stem.png", + "livingjungle_liana_stem.png", + "livingjungle_liana_stem.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +--- mangroves + +minetest.register_node("livingjungle:mangrove_root", { + description = S("Mangrove Root"), + drawtype = "plantlike_rooted", + waving = 0, + paramtype = "light", + tiles = {"default_sand.png"}, + special_tiles = {{name = "livingjungle_mangrove_root.png", tileable_vertical = true}}, + inventory_image = "livingjungle_mangrove_root.png", + wield_image = "livingjungle_mangrove_root.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end, +}) + +minetest.register_node("livingjungle:mangrove_root2", { + description = S("Mangrove Air Roots"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingjungle_mangrove_root.png"}, + inventory_image = "livingjungle_mangrove_root.png", + wield_image = "livingjungle_mangrove_root.png", + paramtype = "light", + sunlight_propagates = true, + + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingjungle:mangrove_stem", { + description = S("Mangrove Stem"), + tiles = { + "livingjungle_mangrove_stem.png", + "livingjungle_mangrove_stem.png", + "livingjungle_mangrove_stem.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingjungle:mangrove_leaves", { + description = S("Mangrove Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingjungle_mangrove_leaves.png"}, + special_tiles = {"livingjungle_mangrove_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.010, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"livingjungle:jungle_shore","junglee_shore"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree2", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"livingjungle:jungle_shore","junglee_shore"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree2.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree2", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"livingjungle:jungle_shore","junglee_shore"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree2.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree3", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.019, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"livingjungle:jungle_shore","junglee_shore"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree3.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingjungle:jungleground", {"livingjungle:grass1", "livingjungle:grass2", "livingjungle:alocasia", "livingjungle:flamingoflower"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingjungle:leafyjungleground", {"livingjungle:grass1", "livingjungle:grass2", "livingjungle:alocasia", "livingjungle:flamingoflower"}, {}} + }) +end + diff --git a/mods/livingjungle/leafdecay.lua b/mods/livingjungle/leafdecay.lua new file mode 100644 index 00000000..d2ca944e --- /dev/null +++ b/mods/livingjungle/leafdecay.lua @@ -0,0 +1,18 @@ + +default.register_leafdecay({ + trunks = {"livingjungle:samauma_trunk"}, + leaves = {"livingjungle:samauma_leaves", "livingjungle:lianaleaves", "livingjungle:lianabranch", "livingjungle:lianabranch3"}, + radius = 9 +}) + +default.register_leafdecay({ + trunks = {"livingjungle:liana_stem"}, + leaves = {"livingjungle:lianaleaves", "livingjungle:lianabranch", "livingjungle:lianabranch3"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"livingjungle:mangrove_root2", "livingjungle:mangrove_stem"}, + leaves = {"livingjungle:mangrove_leaves"}, + radius = 5 +}) \ No newline at end of file diff --git a/mods/livingjungle/locale/livingjungle.de.tr b/mods/livingjungle/locale/livingjungle.de.tr new file mode 100644 index 00000000..5c1cb29c --- /dev/null +++ b/mods/livingjungle/locale/livingjungle.de.tr @@ -0,0 +1,33 @@ +# textdomain: livingjungle + +Green Jungle Ground=Grüner Dschungelboden +Leafy Jungle Ground=Dschungelboden mit Laub +Mossy Stone=Moosiger Stein +Jungle Brick Wall=Dschungelziegel Mauer +Jungle Brick Stair=Dschungelziegel Treppe +Jungle Brick Slab=Dschungelziegel Platte +Jungle Brick=Dschungelziegel +Jungle Bushplant=Dschungel Buschpflanze +Jungle Fern=Dschungelfarn +Alocasia Bush=Alokasie +Flamingo Flower=Flamingoblume +Stinkflower=Rafflesie +Stinkflower Leaf=Rafflesienblatt +Samauma Trunk=Samauma Stamm +Samauma Wood=Samauma Holz +Samauma Leaves=Samauma Blätter +Samauma Sapling=Samauma Setzling +Samauma Stair=Samauma Holztreppe +Samauma Slab=Samauma Holzplatte +Samauma Trunk Stair=Samauma Stamm Treppe +Samauma Trunk Slab=Samauma Stamm Platte +Samauma Wood Fence Gate=Samauma Holzzauntor +Samauma Fence=Samauma Zaun +Samauma Fence Rail=Samauma Geländer +Liana Branch=Liane +Liana Leaves=Lianenblätter +Liana Stem=Lianen Stamm +Mangrove Root=Mangrovenwurzeln +Mangrove Air Roots=Mangroven Luftwurzeln +Mangrove Stem=Mangrovenstamm +Mangrove Leaves=Mangrovenblätter diff --git a/mods/livingjungle/mod.conf b/mods/livingjungle/mod.conf new file mode 100644 index 00000000..2de7483e --- /dev/null +++ b/mods/livingjungle/mod.conf @@ -0,0 +1,4 @@ +name = livingjungle +depends = default, stairs, doors +optional_depends = bonemeal +description = adds a new type of jungle biome to minetest game. \ No newline at end of file diff --git a/mods/livingjungle/schematics/livingjungle_mangrovetree.mts b/mods/livingjungle/schematics/livingjungle_mangrovetree.mts new file mode 100644 index 00000000..84881c78 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mangrovetree.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mangrovetree2.mts b/mods/livingjungle/schematics/livingjungle_mangrovetree2.mts new file mode 100644 index 00000000..0fad85d2 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mangrovetree2.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mangrovetree3.mts b/mods/livingjungle/schematics/livingjungle_mangrovetree3.mts new file mode 100644 index 00000000..c107071d Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mangrovetree3.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mossyrock.mts b/mods/livingjungle/schematics/livingjungle_mossyrock.mts new file mode 100644 index 00000000..048ef199 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mossyrock.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mossyrock2.mts b/mods/livingjungle/schematics/livingjungle_mossyrock2.mts new file mode 100644 index 00000000..77ec1f62 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mossyrock2.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mossyrock3.mts b/mods/livingjungle/schematics/livingjungle_mossyrock3.mts new file mode 100644 index 00000000..6093c705 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mossyrock3.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree.lua b/mods/livingjungle/schematics/samauma_tree.lua new file mode 100644 index 00000000..b3b80c0c --- /dev/null +++ b/mods/livingjungle/schematics/samauma_tree.lua @@ -0,0 +1,23025 @@ +schematic = { + size = {x=26, y=34, z=26}, + yslice_prob = { + {ypos=0, prob=254}, + {ypos=1, prob=254}, + {ypos=2, prob=254}, + {ypos=3, prob=254}, + {ypos=4, prob=254}, + {ypos=5, prob=254}, + {ypos=6, prob=254}, + {ypos=7, prob=254}, + {ypos=8, prob=254}, + {ypos=9, prob=254}, + {ypos=10, prob=254}, + {ypos=11, prob=254}, + {ypos=12, prob=254}, + {ypos=13, prob=254}, + {ypos=14, prob=254}, + {ypos=15, prob=254}, + {ypos=16, prob=254}, + {ypos=17, prob=254}, + {ypos=18, prob=254}, + {ypos=19, prob=254}, + {ypos=20, prob=254}, + {ypos=21, prob=254}, + {ypos=22, prob=254}, + {ypos=23, prob=254}, + {ypos=24, prob=254}, + {ypos=25, prob=254}, + {ypos=26, prob=254}, + {ypos=27, prob=254}, + {ypos=28, prob=254}, + {ypos=29, prob=254}, + {ypos=30, prob=254}, + {ypos=31, prob=254}, + {ypos=32, prob=254}, + {ypos=33, prob=254}, + }, + data = { + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + }, +} diff --git a/mods/livingjungle/schematics/samauma_tree.mts b/mods/livingjungle/schematics/samauma_tree.mts new file mode 100644 index 00000000..6591ba8a Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree11.mts b/mods/livingjungle/schematics/samauma_tree11.mts new file mode 100644 index 00000000..19255e03 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree11.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree2.mts b/mods/livingjungle/schematics/samauma_tree2.mts new file mode 100644 index 00000000..11538898 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree2.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree22.mts b/mods/livingjungle/schematics/samauma_tree22.mts new file mode 100644 index 00000000..963c2a08 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree22.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree3.mts b/mods/livingjungle/schematics/samauma_tree3.mts new file mode 100644 index 00000000..8ea71f41 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree3.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree33.mts b/mods/livingjungle/schematics/samauma_tree33.mts new file mode 100644 index 00000000..60745573 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree33.mts differ diff --git a/mods/livingjungle/schematics/stinkflower.mts b/mods/livingjungle/schematics/stinkflower.mts new file mode 100644 index 00000000..f35667d7 Binary files /dev/null and b/mods/livingjungle/schematics/stinkflower.mts differ diff --git a/mods/livingjungle/textures/livingjungle_alocasia.png b/mods/livingjungle/textures/livingjungle_alocasia.png new file mode 100644 index 00000000..990ca482 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_alocasia.png differ diff --git a/mods/livingjungle/textures/livingjungle_bromeliad.png b/mods/livingjungle/textures/livingjungle_bromeliad.png new file mode 100644 index 00000000..2fb606ef Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_bromeliad.png differ diff --git a/mods/livingjungle/textures/livingjungle_bromeliad2.png b/mods/livingjungle/textures/livingjungle_bromeliad2.png new file mode 100644 index 00000000..8f748258 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_bromeliad2.png differ diff --git a/mods/livingjungle/textures/livingjungle_bromeliad3.png b/mods/livingjungle/textures/livingjungle_bromeliad3.png new file mode 100644 index 00000000..9e4f0761 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_bromeliad3.png differ diff --git a/mods/livingjungle/textures/livingjungle_flamingoflower.png b/mods/livingjungle/textures/livingjungle_flamingoflower.png new file mode 100644 index 00000000..0b492e4a Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_flamingoflower.png differ diff --git a/mods/livingjungle/textures/livingjungle_junglefern.png b/mods/livingjungle/textures/livingjungle_junglefern.png new file mode 100644 index 00000000..45ddce9a Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_junglefern.png differ diff --git a/mods/livingjungle/textures/livingjungle_junglegrass.png b/mods/livingjungle/textures/livingjungle_junglegrass.png new file mode 100644 index 00000000..38be525f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_junglegrass.png differ diff --git a/mods/livingjungle/textures/livingjungle_jungleground.png b/mods/livingjungle/textures/livingjungle_jungleground.png new file mode 100644 index 00000000..604fac11 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_jungleground.png differ diff --git a/mods/livingjungle/textures/livingjungle_jungleground_side.png b/mods/livingjungle/textures/livingjungle_jungleground_side.png new file mode 100644 index 00000000..cab79750 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_jungleground_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_branch.png b/mods/livingjungle/textures/livingjungle_liana_branch.png new file mode 100644 index 00000000..ec332355 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_branch.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_branch3.png b/mods/livingjungle/textures/livingjungle_liana_branch3.png new file mode 100644 index 00000000..ca5893a0 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_branch3.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_leaves.png b/mods/livingjungle/textures/livingjungle_liana_leaves.png new file mode 100644 index 00000000..c4837183 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_leaves.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_stem.png b/mods/livingjungle/textures/livingjungle_liana_stem.png new file mode 100644 index 00000000..20dd63af Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_stem.png differ diff --git a/mods/livingjungle/textures/livingjungle_mangrove_leaves.png b/mods/livingjungle/textures/livingjungle_mangrove_leaves.png new file mode 100644 index 00000000..615ac836 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mangrove_leaves.png differ diff --git a/mods/livingjungle/textures/livingjungle_mangrove_root.png b/mods/livingjungle/textures/livingjungle_mangrove_root.png new file mode 100644 index 00000000..b68eace3 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mangrove_root.png differ diff --git a/mods/livingjungle/textures/livingjungle_mangrove_stem.png b/mods/livingjungle/textures/livingjungle_mangrove_stem.png new file mode 100644 index 00000000..49205f4f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mangrove_stem.png differ diff --git a/mods/livingjungle/textures/livingjungle_mossstone.png b/mods/livingjungle/textures/livingjungle_mossstone.png new file mode 100644 index 00000000..4c58eafe Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mossstone.png differ diff --git a/mods/livingjungle/textures/livingjungle_mossstone2.png b/mods/livingjungle/textures/livingjungle_mossstone2.png new file mode 100644 index 00000000..12ce949c Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mossstone2.png differ diff --git a/mods/livingjungle/textures/livingjungle_mossstone3.png b/mods/livingjungle/textures/livingjungle_mossstone3.png new file mode 100644 index 00000000..067739a1 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mossstone3.png differ diff --git a/mods/livingjungle/textures/livingjungle_rainforest_litter.png b/mods/livingjungle/textures/livingjungle_rainforest_litter.png new file mode 100644 index 00000000..cc6a946f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_rainforest_litter.png differ diff --git a/mods/livingjungle/textures/livingjungle_rainforest_litter_side.png b/mods/livingjungle/textures/livingjungle_rainforest_litter_side.png new file mode 100644 index 00000000..ae4f615d Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_rainforest_litter_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_fencewood.png b/mods/livingjungle/textures/livingjungle_samauma_fencewood.png new file mode 100644 index 00000000..e480c6f8 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_fencewood.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_leaves.png b/mods/livingjungle/textures/livingjungle_samauma_leaves.png new file mode 100644 index 00000000..898884d3 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_leaves.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_sapling.png b/mods/livingjungle/textures/livingjungle_samauma_sapling.png new file mode 100644 index 00000000..6bb9cb9b Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_sapling.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_trunk.png b/mods/livingjungle/textures/livingjungle_samauma_trunk.png new file mode 100644 index 00000000..a8ee45ef Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_trunk.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_trunk_top.png b/mods/livingjungle/textures/livingjungle_samauma_trunk_top.png new file mode 100644 index 00000000..17da4cb3 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_trunk_top.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_wood.png b/mods/livingjungle/textures/livingjungle_samauma_wood.png new file mode 100644 index 00000000..6593b80f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_wood.png differ diff --git a/mods/livingjungle/textures/livingjungle_stinkflower_middle.png b/mods/livingjungle/textures/livingjungle_stinkflower_middle.png new file mode 100644 index 00000000..590353f1 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stinkflower_middle.png differ diff --git a/mods/livingjungle/textures/livingjungle_stinkflower_side.png b/mods/livingjungle/textures/livingjungle_stinkflower_side.png new file mode 100644 index 00000000..4ac5a14b Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stinkflower_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_stonebricks.png b/mods/livingjungle/textures/livingjungle_stonebricks.png new file mode 100644 index 00000000..c614d41f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stonebricks.png differ diff --git a/mods/livingjungle/textures/livingjungle_stonebricks2.png b/mods/livingjungle/textures/livingjungle_stonebricks2.png new file mode 100644 index 00000000..c47017b1 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stonebricks2.png differ diff --git a/mods/livingjungle/textures/livingjungle_stonebricks3.png b/mods/livingjungle/textures/livingjungle_stonebricks3.png new file mode 100644 index 00000000..36d98ab5 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stonebricks3.png differ diff --git a/mods/livingslimes/.gitattributes b/mods/livingslimes/.gitattributes new file mode 100644 index 00000000..e2dcd1e6 --- /dev/null +++ b/mods/livingslimes/.gitattributes @@ -0,0 +1,2 @@ +*.xcf export-ignore +*.blend export-ignore \ No newline at end of file diff --git a/mods/livingslimes/GNU_GPL.txt b/mods/livingslimes/GNU_GPL.txt new file mode 100644 index 00000000..1451535f --- /dev/null +++ b/mods/livingslimes/GNU_GPL.txt @@ -0,0 +1,185 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS +0. Definitions. +“This License†refers to version 3 of the GNU General Public License. + +“Copyright†also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +“The Program†refers to any copyrightable work licensed under this License. Each licensee is addressed as “youâ€. “Licensees†and “recipients†may be individuals or organizations. + +To “modify†a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version†of the earlier work or a work “based on†the earlier work. + +A “covered work†means either the unmodified Program or a work based on the Program. + +To “propagate†a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To “convey†a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices†to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. +The “source code†for a work means the preferred form of the work for making modifications to it. “Object code†means any non-source form of a work. + +A “Standard Interface†means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The “System Libraries†of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Componentâ€, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The “Corresponding Source†for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified it, and giving a relevant date. +b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all noticesâ€. +c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. +d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate†if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + +a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. +b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. +c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. +d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. +e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A “User Product†is either (1) a “consumer productâ€, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used†refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +“Installation Information†for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. +“Additional permissions†are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or +b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or +c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or +d) Limiting the use for publicity purposes of names of licensors or authors of the material; or +e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or +f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. +All other non-permissive additional terms are considered “further restrictions†within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An “entity transaction†is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. +A “contributor†is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor versionâ€. + +A contributor's “essential patent claims†are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control†includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a “patent license†is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant†such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying†means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is “discriminatory†if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + +14. Revised Versions of this License. +The Free Software Foundation may publish revised and/or new versions of the GNU 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 Program specifies that a certain numbered version of the GNU General Public License “or any later version†applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS†WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/mods/livingslimes/LICENSE.txt b/mods/livingslimes/LICENSE.txt new file mode 100644 index 00000000..f4b28a68 --- /dev/null +++ b/mods/livingslimes/LICENSE.txt @@ -0,0 +1,29 @@ +License for code +---------------- + +Copyright (C) 2024 "EmptyStar" + +Original mod copyright (C) 2019 "Piezo_" + +This mod is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This mod 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this mod. If not, see . + +License for media +(Sounds, textures, models) +-------------------------- + +Sounds (.ogg files under sounds/) copyright (C) 2024 "EmptyStar" + +Models and textures (files under models/ and textures/) copyright (C) 2019 "Piezo_" + +Creative Commons Attribution-ShareAlike 4.0 \ No newline at end of file diff --git a/mods/livingslimes/README.md b/mods/livingslimes/README.md new file mode 100644 index 00000000..21722ae9 --- /dev/null +++ b/mods/livingslimes/README.md @@ -0,0 +1,57 @@ +# Living Slimes + +Bring the classic fodder of fantasy adventure to your world with Living Slimes! From simple grass slimes to fire-belching lava slimes and everything in between, these living slimes can be found high and low throughout the world. Some are content to roam and forage while others are hostile hunters. + +This mod is substantially based on [The Mana World slimes mod](https://github.com/mt-historical/tmw_slimes) by Piezo_ which was inspired by [The Mana World](https://themanaworld.org/). + +## Slimes + +The following slimes can be found in various environments throughout the world: + +- **Grass Slime** - Found in grasslands and forests; loves to eat plants and leaves +- **Savanna Slime** - Found in savannas and dry plains; eats dry grass +- **Poisonous Slime** - Found in swamps and jungles; oozes poison and is harmful to the touch +- **Algae Slime** - Found in swamps and wetlands; docile attitude and loves to eat mushrooms +- **Ice Slime** - Found in icy and snowy biomes; subsists on ice and snow +- **Ocean Slime** - Found in bodies of water; small, gentle, and quick +- **Lava Slime** - Found in lava pools; very aggressive and spreads fire when provoked, also burns when touched +- **Mineral Slime** - Found underground; a sturdy slime that eats stones and rare minerals +- **Dark Slime** - Found in shadows underground; sneaky and malevolent + +## Behaviors + +### Eating + +Slimes are eager to eat any items that are left on the ground near them. Many slimes favor weapons and tools, so beware that if you drop valuable items near them, they are likely to be eaten. + +When no dropped items are available to eat, slimes will often dig up resources from their surrounding environment for sustenance. Most slimes have a preferred diet, and they will seek out foods that are most favorable to them. + +### Digesting + +Slimes will begin to digest the contents of their stomach after eating, a process which takes a few minutes per item eaten. When an item is digested, it is permanently destroyed without a trace. So if you suspect that a slime has eaten your items, be sure to get them back quickly! + +Any items that a slime has not digested will be dropped when the slime is killed. + +### Attacking + +Most slimes are territorial and will pursue nearby players. Slime speeds, strength, and aggression vary by type, and they can only attack when they're close enough to a player to strike at close range although certain slimes have extra tricks up their sleeve (e.g., poisonous slimes and lava slimes). + +### Stealing + +When a slime successfully attacks a player, it's possible that the slime will rob the player of an item on their hotbar. When this happens, it's as though the slime has eaten the item meaning that it will be digested if left unrecovered. + +Note that the stolen item can be the item in the player's hand, so be mindful of what you're holding! + +## Drops and Resources + +All slimes will drop at least one slime goo of its type when killed. This goo is edible with varying nutritional benefits or detriments. + +Placing slime goo of the same kind in each square of a 3x3 crafting grid will create a slime block of that type. Slime blocks are slippery and bouncy, and they will prevent all fall damage from any height when landing on it from above. + +## Settings + +Many of the slime behaviors documented above can be enabled/disabled or adjusted via mod settings. Check the mod settings under `All Settings > Content: Mods > Living Slimes` for available settings. Also see [settingtypes.txt](https://github.com/EmptyStar/livingslimes/tree/main/settingtypes.txt) for a textual description of mod settings. + +## Errors, Issues, and Bugs + +Please [open an issue at GitHub](https://github.com/EmptyStar/livingslimes/issues/new) to report any problems encountered with this mod. \ No newline at end of file diff --git a/mods/livingslimes/behaviors.lua b/mods/livingslimes/behaviors.lua new file mode 100644 index 00000000..58cea187 --- /dev/null +++ b/mods/livingslimes/behaviors.lua @@ -0,0 +1,629 @@ +-- +-- Slime behaviors +-- + +local function reset_attack_vals(self) + self.target = nil +end + +-- Dig limits + +livingslimes.dig_limit = { + limit = livingslimes.settings.dig_limit, + get = function(self,pos) + local mapblock = minetest.hash_node_position(vector.divide(pos,16):floor()) + local value = self[mapblock] or (function() + local stored_value = livingslimes.storage:get_int(mapblock) + self[mapblock] = stored_value + return stored_value + end)() + return mapblock, value + end, + limited = livingslimes.settings.dig_limit > 0 and function(self,pos) + local mapblock, value = self:get(pos) + return value >= self.limit + end or function() return false end, + increment = livingslimes.settings.dig_limit and function(self,pos) + local mapblock, value = self:get(pos) + value = value + 1 + livingslimes.storage:set_int(mapblock,value) + self[mapblock] = value + end or function() end, +} + +-- Actions + +function livingslimes.action_pursue(self, target, method, speed_factor, anim) + local goal + local function func(_self) + local target_alive, line_of_sight, tgt_pos = _self:get_target(target) + if not target_alive then + return true + end + goal = goal or tgt_pos + self:animate("move") + if line_of_sight + and vector.distance(goal, tgt_pos) > 3 then + goal = tgt_pos + end + if _self:move_to(goal, method or "creatura:obstacle_avoidance", speed_factor or 0.5) then + return true + end + end + self:set_action(func) +end + +function livingslimes.action_pursue_poison(self, target, method, speed_factor, anim) + local poison_timer = 0.5 + local goal + local function func(_self) + local target_alive, line_of_sight, tgt_pos = _self:get_target(target) + if not target_alive then + return true + end + goal = goal or tgt_pos + poison_timer = poison_timer - _self.dtime + self:animate("move") + if line_of_sight + and vector.distance(goal, tgt_pos) > 3 then + goal = tgt_pos + end + if poison_timer <= 0 then + poison_timer = 0.5 + local pos = _self.object:get_pos() + local nodename = minetest.get_node(pos).name + local below = minetest.get_node(pos:add(vector.new(0,-1,0))).name + if below ~= "air" and (nodename == "air" or nodename == _self.poison) then + minetest.set_node(pos,{ name = _self.poison, param2 = 0 }) + minetest.get_node_timer(pos):start(10) + end + end + if _self:move_to(goal, method or "creatura:obstacle_avoidance", speed_factor or 0.5) then + return true + end + end + self:set_action(func) +end + +function livingslimes.action_forage(self, target, method, speed_factor, anim) + local goal + local item = target.item + local function func(_self) + local tgt_pos = item and item.object and item.object:get_pos() + target.timeout = target.timeout - _self.dtime + if not tgt_pos or target.timeout <= 0 then + _self.nearby_food = nil + return + end + goal = goal or tgt_pos + self:animate(anim or "move") + if vector.distance(goal, tgt_pos) > 3 then + goal = tgt_pos + end + if _self:move_to(goal, method or "creatura:obstacle_avoidance", speed_factor or 0.5) then + return true + end + end + self:set_action(func) +end + +function livingslimes.action_dig(self, node, method, speed_factor, anim) + local goal + local function func(_self) + local tgt_pos = node and node.pos + node.timeout = node.timeout - _self.dtime + if not tgt_pos or minetest.get_node(node.pos).name ~= node.name or node.timeout <= 0 then + _self.nearby_node = nil + return + end + goal = goal or tgt_pos + self:animate(anim or "move") + if vector.distance(goal, tgt_pos) > 3 then + goal = tgt_pos + end + if _self:move_to(goal, method or "creatura:obstacle_avoidance", speed_factor or 0.5) then + return true + end + end + self:set_action(func) +end + +function livingslimes.action_punch(self, target) + local jump_init = false + local timeout = 2 + local function func(_self) + local tgt_alive, _, tgt_pos = _self:get_target(target) + if not tgt_alive then return true end + local pos = _self.object:get_pos() + if not pos then return end + local dir = vector.direction(pos, tgt_pos) + if not jump_init + and _self.touching_ground then + _self.object:add_velocity({x = dir.x * 3, y = 2, z = dir.z * 3}) + jump_init = true + end + timeout = timeout - _self.dtime + if timeout <= 0 then return true end + local dist = vector.distance(pos, tgt_pos) + if dist < _self.width + 1 then + _self:punch_target(target) + local knockback = minetest.calculate_knockback( + target, self.object, 1.0, + {damage_groups = {fleshy = self.damage}}, + dir, 2.0, self.damage + ) + target:add_velocity({x = dir.x * knockback, y = dir.y * knockback, z = dir.z * knockback}) + return true + end + end + self:set_action(func) +end + +-- Utilities + +-- wander: slime wanders the area aimlessly +creatura.register_utility("livingslimes:wander", function(self) + local move_chance = self.move_chance or 3 + local center = self.object:get_pos() + if not center then return end + local move = self.wander_action or creatura.action_move + local function func(_self) + if not _self:get_action() then + local pos2 = _self:get_wander_pos(2, 3) + if math.random(move_chance) == 1 + and vector.distance(pos2, center) < _self.tracking_range * 0.5 then + move(_self, pos2, 2, "creatura:obstacle_avoidance", 0.35, "move") + else + creatura.action_idle(_self, math.random(2,5), "idle") + end + end + end + self:set_utility(func) +end) + +-- attack: slime attacks a target +creatura.register_utility("livingslimes:attack", function(self, target) + self.nearby_food = nil -- forget about food, this is a much better target >:) + self.nearby_node = nil + local width = self.width + local punch_init = false + local function func(_self) + local pos = _self.object:get_pos() + if not pos then return end + local tgt_alive, _, tgt_pos = _self:get_target(target) + if not tgt_alive then reset_attack_vals(self) return true end + local dist = vector.distance(pos, tgt_pos) + if dist > self.tracking_range then reset_attack_vals(self) return true end + local punch_cooldown = self.punch_cooldown or 0 + if punch_cooldown > 0 then + punch_cooldown = punch_cooldown - self.dtime + end + self.punch_cooldown = punch_cooldown + if punch_cooldown <= 0 + and dist < width + 1 + and not punch_init then + punch_init = true + _self:play_sound("attack") + livingslimes.action_punch(_self, target) + self.punch_cooldown = 1 + if livingslimes.settings.allow_steal and math.random(100) <= livingslimes.settings.steal_chance then + _self.steal_item(target) + _self:play_sound("slurp") + end + end + if not _self:get_action() then + if punch_init then reset_attack_vals(self) return true end + livingslimes.action_pursue(_self, target, "creatura:obstacle_avoidance", 0.75) + end + end + self:set_utility(func) +end) + +-- neutral: slime is idle unless a hostile target attacks it +creatura.register_utility("livingslimes:neutral", function(self, target) + self.nearby_food = nil -- forget about food, this is a much better target >:) + self.nearby_node = nil + local width = self.width + local punch_init = false + local function func(_self) + local pos = _self.object:get_pos() + if not pos then return end + local tgt_alive, _, tgt_pos = _self:get_target(target) + if not tgt_alive then reset_attack_vals(self) return true end + local dist = vector.distance(pos, tgt_pos) + if dist > self.tracking_range then reset_attack_vals(self) return true end + local punch_cooldown = self.punch_cooldown or 0 + if punch_cooldown > 0 then + punch_cooldown = punch_cooldown - self.dtime + end + self.punch_cooldown = punch_cooldown + if punch_cooldown <= 0 + and dist < width + 1 + and not punch_init then + punch_init = true + _self:play_sound("attack") + livingslimes.action_punch(_self, target) + self.punch_cooldown = 1 + if livingslimes.settings.allow_steal and math.random(100) <= livingslimes.settings.steal_chance then + _self.steal_item(target) + _self:play_sound("slurp") + end + end + if not _self:get_action() then + if punch_init then reset_attack_vals(self) return true end + livingslimes.action_pursue(_self, target, "creatura:obstacle_avoidance", 0.75) + end + end + self:set_utility(func) +end) + +-- poison: slime leaves poisonous creep on the ground while attacking +creatura.register_utility("livingslimes:poison", function(self, target) + self.nearby_food = nil -- forget about food, this is a much better target >:) + self.nearby_node = nil + local width = self.width + local punch_init = false + local function func(_self) + local pos = _self.object:get_pos() + if not pos then return end + local tgt_alive, _, tgt_pos = _self:get_target(target) + if not tgt_alive then reset_attack_vals(self) return true end + local dist = vector.distance(pos, tgt_pos) + if dist > self.tracking_range then reset_attack_vals(self) return true end + local punch_cooldown = self.punch_cooldown or 0 + if punch_cooldown > 0 then + punch_cooldown = punch_cooldown - self.dtime + end + self.punch_cooldown = punch_cooldown + if punch_cooldown <= 0 + and dist < width + 1 + and not punch_init then + punch_init = true + _self:play_sound("attack") + livingslimes.action_punch(_self, target) + self.punch_cooldown = 1 + end + if not _self:get_action() then + if punch_init then reset_attack_vals(self) return true end + livingslimes.action_pursue_poison(_self, target, "creatura:obstacle_avoidance", 0.75) + end + end + self:set_utility(func) +end) + +-- die: slime's HP reaches zero and it must die +creatura.register_utility("livingslimes:die", function(self) + local timer = 1.5 + local init = false + local function func(_self) + if not init then + _self:animate("idle") + _self.object:set_properties({ + visual_size = {x = 8, y = 0.5}, + selectionbox = {0,0,0,0,0,0}, + pointable = false, + }) + _self:play_sound("die") + init = true + end + timer = timer - _self.dtime + if timer <= 0 then + local pos = _self.object:get_pos() + if not pos then return end + minetest.add_particlespawner({ + amount = 8, + time = 0.25, + minpos = {x = pos.x - 0.1, y = pos.y, z = pos.z - 0.1}, + maxpos = {x = pos.x + 0.1, y = pos.y + 0.1, z = pos.z + 0.1}, + minacc = {x = 0, y = 2, z = 0}, + maxacc = {x = 0, y = 3, z = 0}, + minvel = {x = math.random(-1, 1), y = -0.25, z = math.random(-1, 1)}, + maxvel = {x = math.random(-2, 2), y = -0.25, z = math.random(-2, 2)}, + minexptime = 0.75, + maxexptime = 1, + minsize = 4, + maxsize = 4, + texture = "creatura_smoke_particle.png", + animation = { + type = 'vertical_frames', + aspect_w = 4, + aspect_h = 4, + length = 1, + }, + glow = 1 + }) + creatura.drop_items(_self) + _self.stomach:drop(pos) + _self.object:remove() + end + end + self:set_utility(func) +end) + +-- eat: slime eats an item +creatura.register_utility("livingslimes:eat", function(self, target) + local item = target.item + local width = self.width + local function func(_self) + local pos = _self.object:get_pos() + local itempos = item and item.object and item.object:get_pos() + if not pos or not itempos then + _self.nearby_food = nil + return + end + if vector.distance(pos,itempos) < width + 0.5 then + _self:play_sound("slurp") + _self.stomach:add(item.itemstring) + item.object:remove() + _self.nearby_food = nil + else + livingslimes.action_forage(_self, target, "creatura:obstacle_avoidance", 0.5) + end + end + self:set_utility(func) +end) + +-- dig: slime digs a node +creatura.register_utility("livingslimes:dig", function(self, node) + local width = self.width + local function func(_self) + local pos = _self.object:get_pos() + local nodepos = node.pos + if not pos or not nodepos or minetest.get_node(nodepos).name ~= node.name then + _self.nearby_node = nil + return + end + if vector.distance(pos,nodepos) < width + 0.5 then + local nodedef = minetest.registered_nodes[node.name] + if nodedef and nodedef.sounds and nodedef.sounds.dug then + minetest.sound_play(nodedef.sounds.dug,{ + gain = 0.5, + pos = node.pos, + max_hear_distance = 40, + },true) + end + minetest.remove_node(node.pos) + livingslimes.dig_limit:increment(node.pos) + local drop = minetest.get_node_drops(node.name) + if drop and drop[1] then + _self:play_sound("slurp") + _self.stomach:add(drop[1]) + end + _self.nearby_node = nil + else + livingslimes.action_dig(_self, node, "creatura:obstacle_avoidance", 0.5) + end + end + self:set_utility(func) +end) + +-- digest: slime digests an item in its stomach +creatura.register_utility("livingslimes:digest", function(self, item) + local timer = 5 + local init = false + local function func(_self) + if not init then + init = true + _self.charging = "digest" + creatura.action_idle(_self, timer, "none") + end + timer = timer - _self.dtime + if timer <= 0 then + _self:play_sound("digest") + _self.stomach:digest() + _self.charging = nil + return true + end + end + self:set_utility(func) +end) + +creatura.register_utility("livingslimes:fire", function(self) + local timer = 2 + local init = false + local function func(_self) + local pos = _self.object:get_pos() + if not init then + init = true + _self.charging = "fire" + minetest.add_particlespawner({ + amount = 40, + time = 2, + minpos = {x = pos.x - 0.9, y = pos.y + 0.1, z = pos.z - 0.9}, + maxpos = {x = pos.x + 0.9, y = pos.y + 0.2, z = pos.z + 0.9}, + minacc = {x = 0, y = 2, z = 0}, + maxacc = {x = 0, y = 3, z = 0}, + minvel = {x = 0, y = 0, z = 0}, + maxvel = {x = 0, y = 0.5, z = 0}, + minexptime = 0.75, + maxexptime = 1, + minsize = 2.5, + maxsize = 3.25, + texture = { + name = livingslimes.fire.texture, + scale_tween = { + { x = 0.875, y = 1 }, + { x = 0, y = 1.4 }, + }, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 7, + }, + }, + glow = 14, + }) + creatura.action_idle(_self, timer, "idle") + end + timer = timer - _self.dtime + if timer <= 0 then + _self.charging = nil + local nearby_ground = minetest.find_nodes_in_area_under_air(pos:add(vector.new(-4,-1,-4)), pos:add(vector.new(4,1,4)),{ + "group:soil", + "group:stone", + "group:crumbly", + "group:cracky", + }) + local nearby_ground_limit = #nearby_ground + for node = 1, math.min(20,nearby_ground_limit) do + node = nearby_ground[math.random(1,nearby_ground_limit)]:add(vector.new(0,1,0)) + minetest.set_node(node,{ name = livingslimes.fire.node, param2 = 0 }) + end + _self:play_sound("fire") + return true + end + end + self:set_utility(func) +end) + +-- Utility stack behaviors +livingslimes.behaviors = { + wander = { + utility = "livingslimes:wander", + step_delay = 0.25, + get_score = function(self) + return 0.1, {self} + end, + enabled = true, + }, + eat = { + utility = "livingslimes:eat", + get_score = function(self) + -- Already seeking food + local existing_food = self.nearby_food + if existing_food then + return 0.3, {self,existing_food} + end + + -- More likely to eat if stomach is empty + if math.random(0,self.stomach:size() * 20 + 39) == 0 then + local items = minetest.get_objects_inside_radius(self.object:get_pos(),self.tracking_range) + local favorite = { + item = nil, + score = 0, + timeout = 6, + } + for item = 1, #items do + item = items[item]:get_luaentity() + local is_food = item and item.name == "__builtin:item" and item.itemstring and true or false + local food_score = is_food and (self.diet[ItemStack(item.itemstring):get_name()] or (self.diet.any or -1)) or -1 + if food_score > favorite.score + then + favorite.item = item + favorite.score = food_score + end + end + if favorite.item then + self.nearby_food = favorite + return 0.3, {self,favorite} + else + return 0 + end + else + return 0 + end + end, + enabled = livingslimes.settings.allow_eat, + }, + digest = { + utility = "livingslimes:digest", + get_score = function(self) + return (self.charging == "digest" or (self.stomach:can_digest() and self:get_utility() == "livingslimes:wander")) and 0.6 or 0, {self} + end, + enabled = livingslimes.settings.allow_digest, + }, + attack = { + utility = "livingslimes:attack", + step_delay = 0.25, + get_score = function(self) + local target = creatura.get_nearby_player(self,self.tracking_range) + return target and 0.4 or 0, {self,target} + end, + enabled = livingslimes.settings.allow_attack, + }, + neutral = { + utility = "livingslimes:neutral", + step_delay = 0.25, + get_score = function(self) + local target = creatura.get_nearby_player(self,self.tracking_range) + return target and target:is_player() and self.enemies[target:get_player_name() or ""] and 0.4 or 0, {self,target} + end, + enabled = livingslimes.settings.allow_attack, + }, + poison = { + utility = "livingslimes:poison", + step_delay = 0.25, + get_score = function(self) + local target = creatura.get_nearby_player(self,self.tracking_range) + return target and 0.4 or 0, {self,target} + end, + enabled = livingslimes.settings.allow_attack and livingslimes.settings.allow_poison, + alternative = "attack", + }, + fire = { + utility = "livingslimes:fire", + get_score = function(self) + return (self.charging == "fire" or (math.random(1,10) == 1 and self:get_utility() == "livingslimes:attack")) and 0.5 or 0, {self} + end, + enabled = livingslimes.settings.allow_attack and livingslimes.fire and livingslimes.settings.allow_fire, + }, + dig = { + utility = "livingslimes:dig", + get_score = function(self) + -- Already seeking node + local existing_node = self.nearby_node + if existing_node then + return 0.275, {self,existing_node} + end + + -- More likely to dig for food if stomach is empty + if math.random(0,self.stomach:size() * 20 + 99) == 0 then + local pos = self.object:get_pos() + local nodes = minetest.find_nodes_in_area_under_air( + pos:add(vector.new(-self.tracking_range,-1,-self.tracking_range)), + pos:add(vector.new(self.tracking_range,1,self.tracking_range)), + self.diet_set + ) + local favorite = { + node = nil, + positions = nil, + score = 0, + } + for _,node in ipairs(nodes) do + node = { + name = minetest.get_node(node).name, + pos = node, + } + local food_score = self.diet[node.name] or -1 + if food_score > favorite.score then + favorite.node = node.name + favorite.positions = { node.pos } + favorite.score = food_score + elseif food_score == favorite.score then + favorite.positions[#favorite.positions + 1] = node.pos + end + end + if favorite.node then + local pos = favorite.positions[math.random(#favorite.positions)] + if livingslimes.dig_limit:limited(pos) then + return 0 + else + favorite = { + name = favorite.node, + pos = pos, + timeout = 6, + } + self.nearby_node = favorite + return 0.275, {self,favorite} + end + else + return 0 + end + else + return 0 + end + end, + enabled = livingslimes.settings.allow_dig, + } +} \ No newline at end of file diff --git a/mods/livingslimes/functions.lua b/mods/livingslimes/functions.lua new file mode 100644 index 00000000..2d7c3463 --- /dev/null +++ b/mods/livingslimes/functions.lua @@ -0,0 +1,496 @@ +-- Get list of liquid nodes that slimes should float on +local is_liquid = {} +minetest.register_on_mods_loaded(function() + for node,ndef in pairs(minetest.registered_nodes) do + if ndef.liquidtype and ndef.liquidtype ~= "none" then + is_liquid[node] = true + end + end +end) + +-- Lookup table for poison particles +local poisonmap = {} + +-- Register slimes +function livingslimes.register_slime(name,def) + -- Skip unsupported slimes + if not def then + goto continue + end + + -- Get slime technical name component + local tname = string.lower(name) .. "_slime" + + -- Register goo item + local goo = "livingslimes:" .. tname .. "_goo" + minetest.register_craftitem(goo, { + inventory_image = "livingslimes_slime_goo.png^[colorize:" .. def.color, + description = name .. " Slime Goo", + groups = {slime = 1}, + on_use = def.edible ~= 0 and minetest.item_eat(def.edible) or nil, + light_source = def.glow, + }) + + -- Register goo block + local slime_block = "livingslimes:" .. tname .. "_block" + minetest.register_node(slime_block, { + tiles = {"livingslimes_slime_block.png^[colorize:" .. def.color .. "^[colorize:#000:25"}, + description = name .. " Slime Block", + drawtype = "allfaces_optional", + use_texture_alpha = true, + groups = { + slippery = 1, + crumbly = 3, + oddly_breakable_by_hand = 2, + fall_damage_add_percent = -100, + bouncy = 40, + }, + sounds = { + footstep = "livingslimes_hit", + dig = "livingslimes_hit", + dug = "livingslimes_hit", + place = "livingslimes_hit", + }, + damage_per_second = def.harmful, + light_source = def.glow, + }) + + -- Register goo block recipe + minetest.register_craft({ + output = slime_block, + recipe = { + {goo,goo,goo}, + {goo,goo,goo}, + {goo,goo,goo}, + } + }) + + -- Identify items and nodes that belong to dietary groups + minetest.register_on_mods_loaded(function() + for food,score in pairs(def.diet) do + local mod, name = (function(match) + return match(), match() + end)(food:gmatch("[^:]+")) + if mod == "group" then + for item,idef in pairs(minetest.registered_items) do + if idef.groups and idef.groups[name] and idef.groups[name] > 0 then + def.diet[item] = score + end + end + end + end + end) + + -- Create boolean map of slime behaviors + for i = 1, #def.behaviors do + def.behaviors[def.behaviors[i]] = true + end + + -- Register slime punchback if the slime is harmful + -- Deals damage to players that attack the slime bare-handed + local punchback = function() end + if def.harmful then + local pbdmg = def.harmful + punchback = function(self,puncher) + if puncher:is_player() and puncher:get_wielded_item():is_empty() then + puncher:punch(self.object, nil, {damage_groups={fleshy=pbdmg}}, nil) + end + end + end + + -- Register slime poison node if slime is poisonous + local poison_node = nil + if def.behaviors.poison then + local pdmg = def.harmful or 1 + poison_node = "livingslimes:" .. tname .. "_poison" + minetest.register_node(poison_node,{ + description = name .. " Slime Poison", + damage_per_second = pdmg, + walkable = false, + pointable = false, + diggable = false, + climbable = false, + move_resistance = 1, + buildable_to = true, + floodable = true, + sunlight_propagates = true, + groups = { not_in_creative_inventory = 1 }, + drawtype = "nodebox", + paramtype = "light", + tiles = { "livingslimes_slime_block.png^[colorize:" .. def.color .. "^[opacity:150" }, + use_texture_alpha = "blend", + color = def.color, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.49, 0.5 }, + }, + post_effect_color = "#cc00cc0f", + on_construct = function(pos) + local hash = minetest.hash_node_position(pos) + poisonmap[hash] = minetest.add_particlespawner({ + pos = { + min = pos:add(vector.new(-0.45,-0.05,-0.45)), + max = pos:add(vector.new(0.45,-0.4,0.45)), + }, + amount = 15, + time = 0, + collisiondetection = false, + collision_removal = false, + object_collision = false, + vertical = true, + texture = { + name = "livingslimes_slime_inventory.png^[colorize:" .. def.color .. "^[opacity:150", + scale_tween = { + { x = 1, y = 1 }, + { x = 0, y = 0 }, + } + }, + minsize = 0.75, + maxsize = 1.25, + minvel = { x = 0, y = 0.25, z = 0 }, + maxvel = { x = 0, y = 1, z = 0 }, + minexptime = 1, + maxexptime = 2, + glow = 1, + }) + if poisonmap[hash] == -1 then -- adding particles did not succeed + poisonmap[hash] = nil + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + local hash = minetest.hash_node_position(pos) + if poisonmap[hash] then + minetest.delete_particlespawner(poisonmap[hash]) + poisonmap[hash] = nil + end + end, + on_timer = function(pos) + minetest.remove_node(pos) + end, + drop = nil, + }) + end + + -- Register slime mob with Creatura + local mob = "livingslimes:" .. tname + creatura.register_mob(mob,{ + -- Engine properties + infotext = name .. " Slime", + visual_size = { x = def.size, y = def.size }, + visual = "mesh", + mesh = def.aquatic and "slime_liquid.b3d" or "slime_land.b3d", + textures = { + {"livingslimes_slime_block.png^[colorize:" .. def.color,"livingslimes_slime_block.png^[colorize:" .. def.color}, + }, + use_texture_alpha = true, + stepheight = 1.1, + glow = def.glow, + + -- Creatura properties + max_health = def.max_health, + armor_groups = (function() + local groups = {fleshy = 100, fire = 100} + local additional_groups = def.armor_groups or {} + for group,value in pairs(additional_groups) do + groups[group] = value + end + return groups + end)(), + fire_resistance = def.fire_resistance or 0, + fall_resistance = 1, + damage = def.damage, + speed = def.speed, + tracking_range = def.tracking_range, + despawn_after = 1500, + max_fall = 0, + turn_rate = 6, + -- water physics + liquid_drag = 0, + liquid_submergence = 0.0025, + makes_footstep_sound = false, + sounds = { + move = { + name = "livingslimes_move", + gain = 2.75, + distance = 40, + }, + slurp = { + name = "livingslimes_slurp", + gain = 2.75, + distance = 40, + }, + attack = { + name = "livingslimes_attack", + gain = 10, + distance = 40, + }, + hit = { + name = "livingslimes_hit", + gain = 10, + distance = 40, + }, + hurt = { + name = "livingslimes_hit", + gain = 10, + distance = 40, + }, + die = { + name = "livingslimes_die", + gain = 10, + distance = 40, + }, + fire = { + name = livingslimes.fire.sound, + gain = 1, + distance = 40, + }, + digest = { + name = "livingslimes_digest", + gain = 2.75, + distance = 40, + }, + }, + hitbox = { + width = def.size / 10, + height = def.size / 5, + }, + animations = { + none = { + range = { x = 0, y = 0 }, + speed = 10, + loop = true, + }, + idle = { + range = { x = 0, y = 19 }, + speed = 10, + frame_blend = 0.3, + loop = true, + }, + move = { + range = { x = 21, y = 40 }, + speed = 30, + frame_blend = 0.3, + loop = true, + }, + fall = { + range = { x = 42, y = 62 }, + speed = 20, + frame_blend = 0.3, + loop = true, + }, + jump = { + range = { x = 63, y = 83 }, + speed = 20, + frame_blend = 0.3, + loop = true, + }, + }, + drops = (function() + local d = { + { + name = goo, + min = 1, + max = 2, + chance = 1, + }, + } + if def.drops then + for _,drop in ipairs(def.drops) do + d[#d + 1] = drop + end + end + return d + end)(), + utility_stack = (function() + local stack = {} + for i = 1, #def.behaviors do + local behavior = livingslimes.behaviors[def.behaviors[i]] + while behavior and not behavior.enabled do + behavior = livingslimes.behaviors[behavior.alternative or ""] + end + if behavior then + stack[#stack + 1] = behavior + end + end + return stack + end)(), + + -- Functions + on_punch = def.behaviors.neutral and function(self, puncher, ...) + punchback(self,puncher) + creatura.basic_punch_func(self, puncher, ...) + local name = puncher:is_player() and puncher:get_player_name() + if name then + if not self.enemies[name] then + self.enemies[name] = true + self.enemies[0] = self.enemies[0] + 1 + if self.enemies[0] > 15 then + for ename,_ in pairs(self.enemies) do + if ename ~= 0 then + self.enemies[ename] = nil + self.enemies[0] = 15 + break + end + end + end + self.enemies = self:memorize("enemies", self.enemies) + end + end + end or function(self, puncher, ...) + punchback(self,puncher) + creatura.basic_punch_func(self, puncher, ...) + end, + + activate_func = function(self) + -- General initialization + self:animate("idle") + self.is_floating_mob = true + self.step_sound_timer = 0 + self.poison = poison_node + self.diet = def.diet + self.diet_set = (function() + local items = {} + for item,_ in pairs(def.diet) do + table.insert(items,item) + end + return items + end)() + + -- Stateful initialization + self.enemies = def.behaviors.neutral and (self:recall("enemies") or self:memorize("enemies",{ [0] = 0 })) or nil + self.stomach = { + contents = self:recall("stomach") or self:memorize("stomach",{ + a = 1, + z = 0, + digestion_timer = livingslimes.settings.digest_timer, + }), + add = function(self,item) + self.contents.z = self.contents.z + 1 + self.contents[self.contents.z] = item + self.contents.digestion_timer = self:size() == 1 and livingslimes.settings.digest_timer or self.contents.digestion_timer + end, + digest = function(self) + self.contents[self.contents.a] = nil + self.contents.a = self.contents.a + 1 + self.contents.digestion_timer = livingslimes.settings.digest_timer + end, + size = function(self) + return self.contents.z - self.contents.a + 1 + end, + tick = function(self,dtime) + self.contents.digestion_timer = self.contents.digestion_timer - dtime + end, + can_digest = function(self) + return (self:size() > 0 and self.contents.digestion_timer <= 0) and true or false + end, + drop = function(self,pos) + for i = self.contents.a, self.contents.z do + minetest.add_item({x=pos.x + math.random()/2,y=pos.y+0.5,z=pos.z+math.random()/2}, self.contents[i]) + end + end, + } + + -- Item stealing function + self.steal_item = function(player) + local inventory = player and player:get_inventory() + local size = inventory and inventory:get_size("main") + if size and size > 0 then + local hotbar = {} + for i = 1, player:hud_get_hotbar_itemcount() do + local item = inventory:get_stack("main",i) + if item and not item:is_empty() then + hotbar[#hotbar + 1] = { + index = i, + item = item, + } + end + end + if #hotbar > 0 then + local stolen = hotbar[math.random(#hotbar)] + self.stomach:add(stolen.item:to_string()) + inventory:set_stack("main",stolen.index,ItemStack(nil)) + end + end + end + end, + + step_func = function(self,dtime,moveresult) + self.step_sound_timer = self.step_sound_timer - dtime + self.stomach:tick(self.dtime) + local velocity = self.object:get_velocity() + local pos = self.object:get_pos() + if (math.abs(velocity.x) > 0.025 or math.abs(velocity.z) > 0.025) and self.step_sound_timer <= 0 then + self:play_sound("move") + self.step_sound_timer = 1.5 + end + end, + + death_func = function(self) + if self:get_utility() ~= "livingslimes:die" then + self:initiate_utility("livingslimes:die", self) + end + end, + }) + + -- Register spawn egg for slime mob + creatura.register_spawn_egg(mob,def.color:sub(2,-5),"555") + + -- Create spawning rules for slime mob + creatura.register_abm_spawn(mob,{ + chance = def.spawn_chance, + interval = 30, + min_height = def.min_height, + max_height = def.max_height, + min_light = def.min_light, + max_light = def.max_light, + min_group = def.min_group, + max_group = def.max_group, + block_protected = true, + biomes = def.spawn_biomes, + nodes = def.spawn_nodes, + spawn_in_nodes = false, + spawn_cap = def.spawn_cap, + }) + + ::continue:: +end + +-- Override Creatura's default water physics; slimes must rise quickly in +-- liquids and must float on top of liquids +-- Define gravity constants +local fall_gravity = -9.8 +local float_gravity = 0.0001 +local rise_gravity = 2 + +local odwp = creatura.default_water_physics +creatura.default_water_physics = function(self) + if not self.is_floating_mob then + odwp(self) + else + local pos = self.object:get_pos() + local below = pos:add(vector.new(0,-1,0)) + local posnode = minetest.get_node(pos).name + local belownode = minetest.get_node(below).name + local velocity = self.object:get_velocity() + local gravity = fall_gravity + if is_liquid[posnode] then + self:set_gravity(rise_gravity) + gravity = rise_gravity + else + if is_liquid[belownode] then + self:set_gravity(float_gravity) + gravity = float_gravity + if math.abs(velocity.x) > 0.25 or math.abs(velocity.z) > 0.25 then + self.object:set_velocity({x = 0, y = -0.75, z = 0}) + else + self.object:set_velocity({x = 0, y = -0.425, z = 0}) + end + else + self:set_gravity(fall_gravity) + gravity = fall_gravity + end + end + self.object:set_acceleration({x = 0, y = gravity, z = 0}) + end +end \ No newline at end of file diff --git a/mods/livingslimes/init.lua b/mods/livingslimes/init.lua new file mode 100644 index 00000000..351498c3 --- /dev/null +++ b/mods/livingslimes/init.lua @@ -0,0 +1,77 @@ +-- Globals +livingslimes = { + storage = minetest.get_mod_storage(), + settings = { + allow_attack = minetest.settings:get_bool("livingslimes.allow_attack",true) and minetest.settings:get_bool("enable_damage",true), + allow_eat = minetest.settings:get_bool("livingslimes.allow_eat",true), + allow_dig = minetest.settings:get_bool("livingslimes.allow_dig",true), + dig_limit = tonumber(minetest.settings:get("livingslimes.dig_limit",8) or 8), + allow_steal = minetest.settings:get_bool("livingslimes.allow_steal",true), + steal_chance = tonumber(minetest.settings:get("livingslimes.steal_chance",36) or 36), + allow_digest = minetest.settings:get_bool("livingslimes.allow_digest",true), + digest_timer = tonumber(minetest.settings:get("livingslimes.digest_timer",240) or 240), + allow_poison = minetest.settings:get_bool("livingslimes.allow_poison",true), + allow_fire = minetest.settings:get_bool("livingslimes.allow_fire",true), + spawn_chance_docile = tonumber(minetest.settings:get("livingslimes.spawn_chance_docile",8500) or 8500), + spawn_chance_hostile = tonumber(minetest.settings:get("livingslimes.spawn_chance_hostile",12750) or 12750), + }, + dependencies = (function() + local deps = {} + for _,dependency in ipairs({ + "default", + "fire", + "ethereal", + "everness", + "naturalbiomes", + "variety", + "asuna_core", + "mcl_biomes", + "mcl_core", + "mcl_fire", + "mcl_flowers", + "mcl_mushrooms", + }) do + deps[dependency] = minetest.get_modpath(dependency) and true or false + end + return deps + end)(), + fire = (function() + if minetest.get_modpath("fire") then + return { + node = "fire:basic_flame", + texture = "fire_basic_flame_animated.png", + sound = "fire_extinguish_flame", + } + elseif minetest.get_modpath("mcl_fire") then + return { + node = "mcl_fire:fire", + texture = "fire_basic_flame_animated.png", + sound = "fire_extinguish_flame", + } + else + return nil + end + end)(), +} + +-- Do not spawn slimes in Asuna if slimes are disabled +if not asuna.content.menagerie.slimes then + livingslimes.settings.spawn_chance_docile = -1 + livingslimes.settings.spawn_chance_hostile = -1 +end + +-- Get mod path +local mpath = minetest.get_modpath("livingslimes") + +-- Load slime behaviors +dofile(mpath .. "/behaviors.lua") + +-- Load functions +dofile(mpath .. "/functions.lua") + +-- Load slimes +local slimes_path = mpath .. "/slimes/" +local slime_files = minetest.get_dir_list(slimes_path,false) +for i = 1, #slime_files do + dofile(slimes_path .. slime_files[i]) +end \ No newline at end of file diff --git a/mods/livingslimes/mod.conf b/mods/livingslimes/mod.conf new file mode 100644 index 00000000..67793f30 --- /dev/null +++ b/mods/livingslimes/mod.conf @@ -0,0 +1,6 @@ +name = livingslimes +title = Living Slimes +description = Adds living slime mobs to Minetest +author = EmptyStar +depends = creatura +optional_depends = default, fire, ethereal, everness, naturalbiomes, variety, asuna_core, mcl_biomes, mcl_core, mcl_fire, mcl_flowers, mcl_mushrooms \ No newline at end of file diff --git a/mods/livingslimes/models/slime_land.b3d b/mods/livingslimes/models/slime_land.b3d new file mode 100644 index 00000000..8227872d Binary files /dev/null and b/mods/livingslimes/models/slime_land.b3d differ diff --git a/mods/livingslimes/models/slime_liquid.b3d b/mods/livingslimes/models/slime_liquid.b3d new file mode 100644 index 00000000..246132a7 Binary files /dev/null and b/mods/livingslimes/models/slime_liquid.b3d differ diff --git a/mods/livingslimes/settingtypes.txt b/mods/livingslimes/settingtypes.txt new file mode 100644 index 00000000..fb4891dc --- /dev/null +++ b/mods/livingslimes/settingtypes.txt @@ -0,0 +1,39 @@ +[Behaviors] + +# Allow slimes to attack? If disabled, all slimes will be passive and will not attack even if attacked. Attacking is automatically disabled on worlds where damage is disabled. +livingslimes.allow_attack (Allow slimes to attack?) bool true + +# Allow slimes to eat items? If enabled, slimes will eat items left on the ground and, if given enough time, will permanently digest the items. +livingslimes.allow_eat (Allow slimes to eat items?) bool true + +# Allow slimes to dig nodes? If enabled, slimes will forage in their local environment for food, a process which is destructive to landscapes and structures. +livingslimes.allow_dig (Allow slimes to dig nodes?) bool true + +# The total number of nodes that can be dug by slimes per mapblock. 4096 represents an entire 16x16x16 mapblock. Set to 0 for no limit. +livingslimes.dig_limit (Allowed nodes per mapblock slimes can dig) int 8 0 4096 + +# Allow slimes to steal items from player hotbar? If enabled, a successful slime attack has a chance that the attacking slime will steal/eat an item from the target player's hotbar. +livingslimes.allow_steal (Allow slimes to steal items on attack?) bool true + +# The percentage chance that a slime will steal an item from a player on a successful attack. +livingslimes.steal_chance (Chance that slimes will steal an item on attack) int 36 1 100 + +# Allow slimes to digest the contents of their stomach? If enabled, items that slimes eat can be permanently destroyed. +livingslimes.allow_digest (Allow slimes to digest?) bool true + +# How many seconds must pass before a slime will digest an item in its stomach. +livingslimes.digest_timer (How many seconds between slime digestions) int 240 30 3600 + +# Allow slimes to spread poison? If enabled, poisonous slimes will leave behind harmful but temporary poison on the ground. +livingslimes.allow_poison (Allow slimes to spread poison?) bool true + +# Allow slimes to spread fire? If enabled, slimes that are able to spread fire may create fires in their local environment when provoked. Fire may cause serious damage to flora and flammable structures. +livingslimes.allow_fire (Allow slimes to spread fire?) bool true + +[Spawning] + +# The chance that a docile slime can spawn. Affects algae slimes, ocean slimes, and mineral slimes. Set to -1 to disable spawning for docile slimes. +livingslimes.spawn_chance_docile (Spawn chance of docile slimes) int 8500 -1 50000 + +# The chance that an aggressive slime can spawn. Affects grass slimes, poison slimes, savanna slimes, ice slimes, dark slimes, and lava slimes. Set to -1 to disable spawning for aggressive slimes. +livingslimes.spawn_chance_hostile (Spawn chance of hostile slimes) int 12750 -1 50000 \ No newline at end of file diff --git a/mods/livingslimes/slimes/algae.lua b/mods/livingslimes/slimes/algae.lua new file mode 100644 index 00000000..7f6170bf --- /dev/null +++ b/mods/livingslimes/slimes/algae.lua @@ -0,0 +1,72 @@ +livingslimes.register_slime("Algae",{ + -- Mob Properties + color = "#0C9:170", + size = 4, + glow = 1, + aquatic = true, + max_health = 10, + damage = 1, + speed = 3.5, + tracking_range = 13, + behaviors = { + "wander", + "neutral", + "dig", + "eat", + "digest", + }, + diet = { + ["group:mushroom"] = 5, + ["group:grass"] = 1, + ["group:flora"] = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_docile, + spawn_cap = 2, + spawn_biomes = { + "swamp", + "alderswamp", + "naturalbiomes:alderswamp", + "marsh", + "Swampland", + "MangroveSwamp", + }, + spawn_nodes = { + "group:soil", + "group:water", + }, + min_height = 0, + max_height = 31000, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 2, + + -- Drops properties + edible = 1, + harmful = 0, + drops = (function() + local d = {} + + if livingslimes.dependencies.default then + d[#d + 1] = { + name = "flowers:mushroom_red", + min = 1, + max = 1, + chance = 10, + } + end + + if livingslimes.dependencies.mcl_mushrooms then + d[#d + 1] = { + name = "mcl_mushrooms:mushroom_red", + min = 1, + max = 1, + chance = 10, + } + end + + return d + end)(), +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/dark.lua b/mods/livingslimes/slimes/dark.lua new file mode 100644 index 00000000..b5a66dd7 --- /dev/null +++ b/mods/livingslimes/slimes/dark.lua @@ -0,0 +1,44 @@ +livingslimes.register_slime("Dark",{ + -- Mob Properties + color = "#100015:120", + size = 5, + aquatic = false, + max_health = 18, + damage = 4, + speed = 2.5, + tracking_range = 14, + behaviors = { + "wander", + "attack", + "eat", + "digest", + }, + diet = { + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 7, + ["group:hoe"] = 7, + ["group:food"] = 2, + any = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_hostile, + spawn_cap = 1, + spawn_biomes = nil, + spawn_nodes = { + "group:soil", + "group:stone", + }, + min_height = -31000, + max_height = -32, + min_light = 0, + max_light = 7, + min_group = 1, + max_group = 1, + + -- Drops properties + edible = 2, + harmful = 0, +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/grass.lua b/mods/livingslimes/slimes/grass.lua new file mode 100644 index 00000000..3ee8b808 --- /dev/null +++ b/mods/livingslimes/slimes/grass.lua @@ -0,0 +1,97 @@ +livingslimes.register_slime("Grass",{ + -- Mob Properties + color = "#0A1:180", + size = 5, + aquatic = false, + max_health = 14, + damage = 2, + speed = 3.25, + tracking_range = 13, + behaviors = { + "wander", + "attack", + "dig", + "eat", + "digest", + }, + diet = { + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 7, + ["group:hoe"] = 7, + ["group:grass"] = 3, + ["group:flora"] = 3, + ["group:leaves"] = 3, + ["group:food"] = 2, + any = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_hostile, + spawn_cap = 1, + spawn_biomes = { + "grassland", + "grassytwo", + "junglee", + "grassytwo", + "dorwinion", + "prairie", + "grove", + "alpine", + "deciduous_forest", + "japanese_forest", + "japaneseforest", + "meadow", + "cherry", + "sakura", + "bamboo", + "bambooforest", + "bamboo_forest", + "Plains", + "SunflowerPlains", + "Forest", + "FlowerForest", + "BirchForest", + "BirchForestM", + "mediterranean", + "naturalbiomes:bushland", + "naturalbiomes:heath", + }, + spawn_nodes = { + "group:soil", + }, + min_height = 0, + max_height = 31000, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 1, + + -- Drops properties + edible = 2, + harmful = 0, + drops = (function() + local d = {} + + if livingslimes.dependencies.default then + d[#d + 1] = { + name = "default:grass_1", + min = 1, + max = 1, + chance = 10, + } + end + + if livingslimes.dependencies.mcl_flowers then + d[#d + 1] = { + name = "mcl_flowers:tallgrass", + min = 1, + max = 1, + chance = 10, + } + end + + return d + end)(), +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/ice.lua b/mods/livingslimes/slimes/ice.lua new file mode 100644 index 00000000..8724e07e --- /dev/null +++ b/mods/livingslimes/slimes/ice.lua @@ -0,0 +1,85 @@ +livingslimes.register_slime("Ice",{ + -- Mob Properties + color = "#8BF:180", + size = 5, + aquatic = false, + max_health = 14, + damage = 2, + speed = 3.25, + tracking_range = 13, + behaviors = { + "wander", + "attack", + "eat", + "digest", + }, + diet = { + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 7, + ["group:hoe"] = 7, + ["group:snowy"] = 5, + ["group:food"] = 2, + any = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_hostile, + spawn_cap = 1, + spawn_biomes = { + "tundra", + "tundra_highland", + "taiga", + "coniferous_forest", + "frost_land", + "glacier", + "everness_frosted_icesheet", + "everness:frosted_icesheet", + "icesheet", + "snowy_grassland", + "frost", + "frost_floatland", + "IcePlains", + "IcePlainsSpikes", + "ColdTaiga", + }, + spawn_nodes = { + "group:soil", + "group:snowy", + "group:ice", + }, + min_height = 0, + max_height = 31000, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 1, + + -- Drops properties + edible = 2, + harmful = 0, + drops = (function() + local d = {} + + if livingslimes.dependencies.default then + d[#d + 1] = { + name = "default:ice", + min = 1, + max = 1, + chance = 10, + } + end + + if livingslimes.dependencies.mcl_core then + d[#d + 1] = { + name = "mcl_core:ice", + min = 1, + max = 1, + chance = 10, + } + end + + return d + end)(), +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/lava.lua b/mods/livingslimes/slimes/lava.lua new file mode 100644 index 00000000..93ec9011 --- /dev/null +++ b/mods/livingslimes/slimes/lava.lua @@ -0,0 +1,46 @@ +livingslimes.register_slime("Lava",{ + -- Mob Properties + color = "#F80:190", + size = 8, + glow = 6, + aquatic = true, + max_health = 24, + armor_groups = { fire = 0 }, + fire_resistance = 1, + damage = 5, + speed = 4.75, + tracking_range = 11, + behaviors = { + "wander", + "attack", + "fire", + "eat", + "digest", + }, + diet = { + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 7, + ["group:hoe"] = 7, + ["group:food"] = 2, + any = 1, + }, + + -- Spawning properties + spawn_chance = math.floor(livingslimes.settings.spawn_chance_hostile / 10), -- lava is typically more rare so spawn chance is higher + spawn_cap = 3, + spawn_nodes = { + "group:lava", + }, + min_height = -31000, + max_height = 31000, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 2, + + -- Drops properties + edible = -2, + harmful = 2, +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/mineral.lua b/mods/livingslimes/slimes/mineral.lua new file mode 100644 index 00000000..687e6e01 --- /dev/null +++ b/mods/livingslimes/slimes/mineral.lua @@ -0,0 +1,82 @@ +livingslimes.register_slime("Mineral",{ + -- Mob Properties + color = "#803010:220", + size = 6, + max_health = 30, + damage = 3, + speed = 3, + tracking_range = 14, + behaviors = { + "wander", + "neutral", + "dig", + "eat", + "digest", + }, + diet = { + ["default:mese"] = 19, + ["mcl_core:stone_with_diamond"] = 19, + ["default:stone_with_diamond"] = 18, + ["mcl_core:stone_with_emerald"] = 18, + ["default:stone_with_mese"] = 17, + ["mcl_core:stone_with_redstone"] = 17, + ["mcl_core:stone_with_lapis"] = 17, + ["mcl_core:stone_with_redstone"] = 17, + ["default:stone_with_gold"] = 16, + ["mcl_core:stone_with_gold"] = 16, + ["default:stone_with_iron"] = 15, + ["mcl_core:stone_with_iron"] = 15, + ["default:stone_with_tin"] = 14, + ["everness:quartz_ore"] = 14, + ["everness:pyrite_ore"] = 14, + ["default:stone_with_coal"] = 13, + ["mcl_core:stone_with_coal"] = 13, + ["group:stone"] = 12, + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 7, + ["group:hoe"] = 7, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_docile, + spawn_cap = 2, + spawn_nodes = { + "group:stone", + "group:soil", + }, + min_height = -31000, + max_height = -32, + min_light = 0, + max_light = 9, + min_group = 1, + max_group = 1, + + -- Drops properties + edible = 2, + harmful = 0, + drops = (function() + local d = {} + + if livingslimes.dependencies.default then + d[#d + 1] = { + name = "default:cobble", + min = 1, + max = 1, + chance = 10, + } + end + + if livingslimes.dependencies.mcl_core then + d[#d + 1] = { + name = "mcl_core:cobble", + min = 1, + max = 1, + chance = 10, + } + end + + return d + end)(), +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/ocean.lua b/mods/livingslimes/slimes/ocean.lua new file mode 100644 index 00000000..5ba75e8d --- /dev/null +++ b/mods/livingslimes/slimes/ocean.lua @@ -0,0 +1,39 @@ +livingslimes.register_slime("Ocean",{ + -- Mob Properties + color = "#00C:170", + size = 3, + aquatic = true, + max_health = 10, + damage = 1, + speed = 3.75, + tracking_range = 13, + behaviors = { + "wander", + "neutral", + "eat", + "digest", + }, + diet = { + any = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_docile, + spawn_cap = 2, + spawn_biomes = nil, + spawn_nodes = { + "group:water", + "mapgen_water_source", + "mapgen_river_water_source", + }, + min_height = 0, + max_height = 1, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 2, + + -- Drops properties + edible = 1, + harmful = 0, +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/poison.lua b/mods/livingslimes/slimes/poison.lua new file mode 100644 index 00000000..8e055065 --- /dev/null +++ b/mods/livingslimes/slimes/poison.lua @@ -0,0 +1,70 @@ +livingslimes.register_slime("Poison",{ + -- Mob Properties + color = "#205:180", + size = 5, + glow = 3, + aquatic = false, + max_health = 12, + damage = 2, + speed = 3.25, + tracking_range = 14, + behaviors = { + "wander", + "poison", + "dig", + "eat", + "digest", + }, + diet = { + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 8, + ["group:hoe"] = 8, + ["group:mushroom"] = 5, + ["group:food"] = 2, + any = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_hostile, + spawn_cap = 1, + spawn_biomes = { + "rainforest", + "rainforest_swamp", + "swamp", + "junglee", + "mushroom", + "marsh", + "nightshade", + "jumble", + "livingjungle", + "livingjungle:livingjungle", + "alderswamp", + "naturalbiomes:alderswamp", + "everness_cursed_lands", + "everness:cursed_lands", + "everness_coral_forest", + "everness:coral_forest", + "MushroomIsland", + "Jungle", + "JungleM", + "JungleEdge", + "JungleEdgeM", + "Swampland", + "MangroveSwamp", + }, + spawn_nodes = { + "group:soil", + }, + min_height = 1, + max_height = 31000, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 1, + + -- Drops properties + edible = -5, + harmful = 1, +}) \ No newline at end of file diff --git a/mods/livingslimes/slimes/savanna.lua b/mods/livingslimes/slimes/savanna.lua new file mode 100644 index 00000000..3d360d59 --- /dev/null +++ b/mods/livingslimes/slimes/savanna.lua @@ -0,0 +1,79 @@ +livingslimes.register_slime("Savanna",{ + -- Mob Properties + color = "#dfbb30:180", + size = 5, + aquatic = false, + max_health = 14, + damage = 2, + speed = 3.25, + tracking_range = 13, + behaviors = { + "wander", + "attack", + "dig", + "eat", + "digest", + }, + diet = { + ["group:sword"] = 10, + ["group:pickaxe"] = 9, + ["group:axe"] = 8, + ["group:shovel"] = 8, + ["group:hoe"] = 8, + ["group:grass"] = 5, + ["group:food"] = 2, + any = 1, + }, + + -- Spawning properties + spawn_chance = livingslimes.settings.spawn_chance_hostile, + spawn_cap = 1, + spawn_biomes = { + "savanna", + "naturalbiomes:wetsavanna", + "plains", + "outback", + "naturalbiomes:outback", + "mesa", + "everness_baobab_savanna", + "everness:baobab_savanna", + "Savanna", + "SavannaM", + }, + spawn_nodes = { + "group:soil", + }, + min_height = 0, + max_height = 31000, + min_light = 0, + max_light = 16, + min_group = 1, + max_group = 1, + + -- Drops properties + edible = 2, + harmful = 0, + drops = (function() + local d = {} + + if livingslimes.dependencies.default then + d[#d + 1] = { + name = "default:dry_grass_1", + min = 1, + max = 1, + chance = 10, + } + end + + if livingslimes.dependencies.mcl_flowers then + d[#d + 1] = { + name = "mcl_flowers:tallgrass", + min = 1, + max = 1, + chance = 10, + } + end + + return d + end)(), +}) \ No newline at end of file diff --git a/mods/livingslimes/sounds/CREDITS.md b/mods/livingslimes/sounds/CREDITS.md new file mode 100644 index 00000000..f03062fb --- /dev/null +++ b/mods/livingslimes/sounds/CREDITS.md @@ -0,0 +1,14 @@ +Credits +======= + +- The following sounds are derived from "Slime 24.wav", licensed CC0: + - livingslimes_attack.1.ogg + - livingslimes_die.1.ogg + - livingslimes_hit.1.ogg + - livingslimes_hit.2.ogg + - livingslimes_move.1.ogg + - livingslimes_move.2.ogg +- The following sounds are derived from "Soup slurp" by Slave2theLight, licensed [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/): + - livingslimes_slurp.1.ogg +- The following sounds are derived from "Bubbling, Large, A.wav" by InspectorJ, licensed [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/): + - livingslimes_digest.1.ogg \ No newline at end of file diff --git a/mods/livingslimes/sounds/livingslimes_attack.1.ogg b/mods/livingslimes/sounds/livingslimes_attack.1.ogg new file mode 100644 index 00000000..4ae37e46 Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_attack.1.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_die.1.ogg b/mods/livingslimes/sounds/livingslimes_die.1.ogg new file mode 100644 index 00000000..0de58873 Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_die.1.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_digest.1.ogg b/mods/livingslimes/sounds/livingslimes_digest.1.ogg new file mode 100644 index 00000000..79ace1c1 Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_digest.1.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_hit.1.ogg b/mods/livingslimes/sounds/livingslimes_hit.1.ogg new file mode 100644 index 00000000..60f8b6a1 Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_hit.1.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_hit.2.ogg b/mods/livingslimes/sounds/livingslimes_hit.2.ogg new file mode 100644 index 00000000..6b537ccb Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_hit.2.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_move.1.ogg b/mods/livingslimes/sounds/livingslimes_move.1.ogg new file mode 100644 index 00000000..8e94ff3d Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_move.1.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_move.2.ogg b/mods/livingslimes/sounds/livingslimes_move.2.ogg new file mode 100644 index 00000000..27054652 Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_move.2.ogg differ diff --git a/mods/livingslimes/sounds/livingslimes_slurp.1.ogg b/mods/livingslimes/sounds/livingslimes_slurp.1.ogg new file mode 100644 index 00000000..992a215b Binary files /dev/null and b/mods/livingslimes/sounds/livingslimes_slurp.1.ogg differ diff --git a/mods/livingslimes/textures/livingslimes_slime_block.png b/mods/livingslimes/textures/livingslimes_slime_block.png new file mode 100644 index 00000000..451c4b76 Binary files /dev/null and b/mods/livingslimes/textures/livingslimes_slime_block.png differ diff --git a/mods/livingslimes/textures/livingslimes_slime_goo.png b/mods/livingslimes/textures/livingslimes_slime_goo.png new file mode 100644 index 00000000..28b7caf8 Binary files /dev/null and b/mods/livingslimes/textures/livingslimes_slime_goo.png differ diff --git a/mods/livingslimes/textures/livingslimes_slime_inventory.png b/mods/livingslimes/textures/livingslimes_slime_inventory.png new file mode 100644 index 00000000..f99ec4de Binary files /dev/null and b/mods/livingslimes/textures/livingslimes_slime_inventory.png differ diff --git a/mods/lootchests_modpack/README.md b/mods/lootchests_modpack/README.md new file mode 100644 index 00000000..32743351 --- /dev/null +++ b/mods/lootchests_modpack/README.md @@ -0,0 +1,45 @@ +# lootchests_modpack +Modpack adding various loot containers across the world to be found and providing an API, resources and integrations for other mods. + +![Screenshot](screenshot.png) + +## Requirements + +- Minetest 5.0.0+ +- Minetest_game 5.0.0+ +- [magic_materials](https://github.com/ClockGen/magic_materials) (optional) + +## Recommended mods +- [decorations_sea](https://github.com/ClockGen/decorations_sea) (Provides decorations when looking for ocean chests) +- [shipwrecks](https://github.com/ClockGen/shipwrecks) (Shipwrecks depend on lootchests_modpack to spawn lootchests in shipwrecks) + +## Integrations +lootchests_default adds loot from following mods, if they are installed: + +- 3d_armor +- Bonemeal +- farming_redo +- gadgets_modpack +- moreores +- moretrees + + +## Contents +Default lootchest pack provides: + +- Baskets, spawning in caves from 0 to -128, containing various organic items (food, seeds, saplings, etc) +- Urns, spawning in caves from 0 to -128, containing various low-grade craftitems and tools (stone tools, ores up to iron, sticks, etc) +- Ocean chests, spawning in seabed and also very rare in caves, containing many precious materials and tools +- Ancient chests, spawning from -128 to -4096 in solid rock and also very rare in caverns, containing very expensive loot + +Magic_materials pack provides: +- Rune urn, spawning in caves from -64 to -4096, containing low grade magic items from magic_materials +- rune chest, spawning from -64 to -4096 in solid rock and very rare in caverns, contains high grade items from magic_materials + +## Making your own lootchests +Process of making your own lootchests is described in [documentation](lootchests/documentation.txt) + +## License +All code is licensed under GPLv3 [link to the license](https://www.gnu.org/licenses/gpl-3.0.en.html) +All resources are licensed under CC BY 4.0 [link to the license](https://creativecommons.org/licenses/by/4.0/legalcode) + diff --git a/mods/lootchests_modpack/description.txt b/mods/lootchests_modpack/description.txt new file mode 100644 index 00000000..6d7b5193 --- /dev/null +++ b/mods/lootchests_modpack/description.txt @@ -0,0 +1 @@ +Modpack adding a lot of various loot containers across the world to be found and providing an API, resources and integrations for other mods diff --git a/mods/lootchests_modpack/lootchests/api.lua b/mods/lootchests_modpack/lootchests/api.lua new file mode 100644 index 00000000..fe4e1094 --- /dev/null +++ b/mods/lootchests_modpack/lootchests/api.lua @@ -0,0 +1,197 @@ +lootchests = {} + +lootchests.loot_table = {} + +lootchests.spawn_chests = asuna.content.wayfarer.loot_chests +local S = minetest.get_translator(minetest.get_current_modname()) + +local debug = minetest.settings:get("lootchests_debug") or false + +local function list_length(list) + local count = 0 + for _,_ in pairs(list) do + count = count + 1 + end + return count +end + +lootchests.add_to_loot_table = function(key, add) + if not lootchests.loot_table[key] then + lootchests.loot_table[key] = {} + end + for _,v in pairs(add) do + table.insert(lootchests.loot_table[key], v) + end +end + +local water_nodes = { + "default:water_source", + "default:river_water_source", + "default:lava_source", + "ethereal:quicksand2", +} + +lootchests.register_lootchest = function(def) + + if not def.name or not def.description then + minetest.log("error", S("[lootchests] Missing fields in chest definition!")) + return + end + + if not lootchests.loot_table[def.name] then + minetest.log("error", S("[lootchests] Missing loot table for") .. " " .. def.name .. "!") + return + end + + local tiles = def.tiles or { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + } + + local sounds = def.sounds or default.node_sound_wood_defaults() + local groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 2} + local rarity = def.spawn_in_rarity or 512 + local fill_ratio = def.spawn_on_rarity or 512 + local ymax = def.ymax or 31000 + local ymin = def.ymin or -31000 + local slot_spawn_chance = def.slot_spawn_chance or 0.25 + local slots = def.slots or 32 + local node_box = def.node_box or { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + + local marker_drawtype = "airlike" + local marker_groups = {dig_immediate = 2, not_in_creative_inventory = 1} + if debug then + marker_drawtype = nil + marker_groups = {dig_immediate = 2} + end + + minetest.register_node(def.name .. "_marker", { + drawtype = marker_drawtype, + description = def.description .. " " .. S("Spawn Marker"), + tiles = {"lootchests_marker_top.png", "lootchests_marker_side.png"}, + groups = marker_groups, + paramtype2 = "facedir", + }) + + minetest.register_node(def.name, { + description = def.description, + drawtype = def.drawtype, + tiles = tiles, + node_box = node_box, + selection_box = node_box, + groups = groups, + sounds = sounds, + paramtype = "light", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[8,9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[current_name;main;0,0;8,5;]" .. + "list[current_player;main;0,5;8,4;]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" + ) + meta:set_string("infotext", def.description) + local inv = meta:get_inventory() + inv:set_size("main", slots) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + }) + + -- Function for checking underwater + local check_water + if not def.underwater then + check_water = function(pos) + for _,waterpos in ipairs({ + { x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + { x = pos.x + 1, y = pos.y, z = pos.z - 1 }, + { x = pos.x - 1, y = pos.y, z = pos.z + 1 }, + { x = pos.x + 1, y = pos.y, z = pos.z + 1 }, + }) do + for _,water_node in ipairs(water_nodes) do + if minetest.get_node(waterpos).name == water_node then + return true -- found nearby water, trigger check + end + end + end + return false -- did not find nearby water, do not trigger check + end + else + check_water = function() + return false -- check never triggers + end + end + + if not debug and lootchests.spawn_chests then + minetest.register_lbm({ + label = S("Upgrade") .. " " .. def.description, + name = def.name .. "_marker_replace", + nodenames = def.name .. "_marker", + run_at_every_load = true, + action = function(pos, node) + if check_water(pos) then + minetest.set_node(pos, {name = "default:water_source", param2 = 0}) + return -- loot chest is underwater and should not be, do not place here + else + minetest.set_node(pos, {name = def.name, param2 = 0}) + end + local rand = PcgRandom(pos.x * pos.y * pos.z) + local inv = minetest.get_inventory({type = "node", pos = pos}) + for i = 1, slots do + if rand:next(0,100) <= slot_spawn_chance then + local item_def = lootchests.loot_table[def.name][rand:next(1, #lootchests.loot_table[def.name])] + local item_name = item_def[#item_def < 3 and 1 or rand:next(1,#item_def - 1)] + local stack = ItemStack(item_name) + if minetest.registered_tools[item_name] then + stack:set_wear(rand:next(1,65535)) + else + stack:set_count(rand:next(1, item_def[#item_def])) + end + inv:set_stack("main", i, stack) + end + end + end, + }) + end + + if def.spawn_in and lootchests.spawn_chests then + minetest.register_ore({ + ore_type = "scatter", + ore = def.name .. "_marker", + wherein = def.spawn_in, + clust_scarcity = rarity * rarity * rarity, + clust_num_ores = 1, + clust_size = 25, + y_min = ymin, + y_max = ymax, + }) + end + + if def.spawn_on and lootchests.spawn_chests then + minetest.register_decoration({ + deco_type = "simple", + place_on = def.spawn_on, + spawn_by = def.spawn_by, + num_spawn_by = def.num_spawn_by, + sidelen = 80, + fill_ratio = 1/fill_ratio, + y_min = ymin, + y_max = ymax, + flags = "force_placement, all_floors", + decoration = def.name .. "_marker", + }) + end +end diff --git a/mods/lootchests_modpack/lootchests/depends.txt b/mods/lootchests_modpack/lootchests/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/lootchests_modpack/lootchests/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests/description.txt b/mods/lootchests_modpack/lootchests/description.txt new file mode 100644 index 00000000..fa76e8d8 --- /dev/null +++ b/mods/lootchests_modpack/lootchests/description.txt @@ -0,0 +1 @@ +An API for registering various loot containers diff --git a/mods/lootchests_modpack/lootchests/documentation.txt b/mods/lootchests_modpack/lootchests/documentation.txt new file mode 100644 index 00000000..b9e52ef1 --- /dev/null +++ b/mods/lootchests_modpack/lootchests/documentation.txt @@ -0,0 +1,70 @@ +To spawn the lootchests, world is populated by spawn chest markers of corresponding type. +During the normal gameplay, they are of "airlike" type and are replaced with LBM which replaces them with corresponding chests and fill them with loot. +If minetest.conf setting "lootchests_debug = true" is active, markers are not replaced and can be taken from the creative inventory. +This can be used for placing them manually for various purposes, mainly for adding lootchest markers to schematics. + +Creating a lootchest consists of two parts: defining the lootchest itself with lootchests.register_lootchest(def) +and creating a corresponding loot table in lootchests.loot_table[def.name]. Examples are below. + +Example of a lootchest definition: +lootchests.register_lootchest({ + --Mandatory + name = "lootchests:default_chest", --ID of the lootchest. A table with corresponding key should be created in tables.loot_table + description = "Loot Chest", --Name as it appears in inventory, also lootchest infobox + + --Visuals + drawtype = "nodebox", --Drawtype of the node. Don't define for default node look + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, --Nodebox def if drawtype is "nodebox" + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + }, --Node tile definition + + --Sounds and groups + sounds = default.node_sound_wood_defaults(), --Node sound definition + groups = {choppy = 2, oddly_breakable_by_hand = 2}, --Node groups + + --Spawning + spawn_in = {"default:sand", "default:desert_sand"}, --Spawn in which nodes, may be one itemstring or a list of them + spawn_on = {"default:stone", "default:desert_stone"}, --Spawn on which nodes, may be one itemstring or a list of them + spawn_in_rarity = 25, --Spawn in rarity, approximate spacing between each node + spawn_on_rarity = 1000. --Spawn on rarity, spawns one out of defined value (if default is 1000 then on 1 out of 1000) + + --Height limit + ymax = 5, --Max Y limit + ymin = -64, --Min Y limit + + --Container parameters + slot_spawn_chance = 50, --Chance to spawn something in a container slot. Ranges from 0 to 100 + slots = 32, --Total amount of slots in the container. Max is 32 +}) + + +To actually add loot to your lootchests, you need to define a loot table in lootchests.loot_table. Table must be accessible by the key which equals to +the lootchest ID. + +Example of a loot table definition for "lootchests:default_chest": +lootchests.loot_table["lootchests:default_chest"] = { + {"default:stick", 16}, --Each item definition is a table with 2 elements - their itemstring and maximum amount + {"default:axe_stone"}, --If defined item is a tool, it doesn't need an amount definition, there will always be one anyway + --Tools spawn with random wear instead + {"default:stone", 64}, +} + +Third-party mods can also access and modify loot tables, you can add custom items to them manually, or by using +lootchests.add_to_loot_table(key, items), where "key" is the lootchest ID and "items" is another table with loot. + +Example: + +local items = { + {"custom_mod:custom_item_01", 15}, + {"custom_mod:custom_item_02", 32}, +} + +lootchests.add_to_loot_table("lootchests:default_chest", items) \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests/init.lua b/mods/lootchests_modpack/lootchests/init.lua new file mode 100644 index 00000000..410e6ba5 --- /dev/null +++ b/mods/lootchests_modpack/lootchests/init.lua @@ -0,0 +1 @@ +dofile(minetest.get_modpath("lootchests").."/api.lua") diff --git a/mods/lootchests_modpack/lootchests/locale/lootchests.ru.tr b/mods/lootchests_modpack/lootchests/locale/lootchests.ru.tr new file mode 100644 index 00000000..3367a7c1 --- /dev/null +++ b/mods/lootchests_modpack/lootchests/locale/lootchests.ru.tr @@ -0,0 +1,6 @@ +# textdomain: lootchests + +[lootchests] Missing fields in chest definition!=[lootchests] ОтÑутÑтвуют Ð¿Ð¾Ð»Ñ Ð² определении Ñундука! +[lootchests] Missing loot table for=[lootchests] ОтÑутÑтвует таблица добычи Ð´Ð»Ñ +Spawn Marker=Маркер поÑÐ²Ð»ÐµÐ½Ð¸Ñ +Upgrade=Обновление diff --git a/mods/lootchests_modpack/lootchests/mod.conf b/mods/lootchests_modpack/lootchests/mod.conf new file mode 100644 index 00000000..092e87bb --- /dev/null +++ b/mods/lootchests_modpack/lootchests/mod.conf @@ -0,0 +1 @@ +name = lootchests diff --git a/mods/lootchests_modpack/lootchests/textures/lootchests_marker_side.png b/mods/lootchests_modpack/lootchests/textures/lootchests_marker_side.png new file mode 100644 index 00000000..10106c0d Binary files /dev/null and b/mods/lootchests_modpack/lootchests/textures/lootchests_marker_side.png differ diff --git a/mods/lootchests_modpack/lootchests/textures/lootchests_marker_top.png b/mods/lootchests_modpack/lootchests/textures/lootchests_marker_top.png new file mode 100644 index 00000000..f083e198 Binary files /dev/null and b/mods/lootchests_modpack/lootchests/textures/lootchests_marker_top.png differ diff --git a/mods/lootchests_modpack/lootchests_default/chests.lua b/mods/lootchests_modpack/lootchests_default/chests.lua new file mode 100644 index 00000000..e58b6ce1 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/chests.lua @@ -0,0 +1,203 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +lootchests.register_lootchest({ + name = "lootchests_default:ocean_chest", + description = S("Ocean Chest"), + spawn_in = {"default:sand", "default:desert_sand", "default:silver_sand"}, + spawn_on = {"default:sand"}, + underwater = true, + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + ymax = -11, + ymin = -36, + spawn_in_rarity = 80, + spawn_on_rarity = 2750, + spawn_by = { + "group:wood", -- sunken ships + "marinara:sand_with_kelp", -- thick kelp + }, + num_spawn_by = 2, + slot_spawn_chance = 55, + slots = 32, +}) + +local chest_spawning = { + on = { + "group:stone", + "default:sand", + "default:dirt", + "default:dry_dirt", + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dry_dirt_with_dry_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:desert_sand", + "ethereal:grove_dirt", + "ethereal:bamboo_dirt", + "dorwinion:dorwinion_grass", + "prairie:prairie_dirt_with_grass", + "nightshade:nightshade_dirt_with_grass", + "badland:badland_grass", + "japaneseforest:japanese_dirt_with_grass", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:alpine_litter", + "naturalbiomes:mediterran_litter", + "naturalbiomes:outback_litter", + "naturalbiomes:savanna_litter", + "livingjungle:jungleground", + "livingjungle:leafyjungleground", + "group:soil", + "caverealms:stone_with_moss", + "caverealms:stone_with_lichen", + "caverealms:stone_with_algae", + "caverealms:stone_with_salt", + "caverealms:hot_cobble", + "default:clay", + "everness:forsaken_desert_sand", + "everness:forsaken_tundra_dirt", + "everness:frosted_snowblock", + "default:snowblock", + "everness:dirt_with_cursed_grass", + "everness:dirt_with_crystal_grass", + "everness:dirt_with_coral_grass", + "everness:moss_block", + "everness:crystal_moss_block", + "everness:emerald_ice", + "everness:ancient_emerald_ice", + "everness:dense_emerald_ice", + "everness:frosted_ice", + "everness:frosted_ice_translucent", + }, + by = { + "group:tree", + "group:leaves", + "group:stone", + "default:sand", + "default:dirt", + "default:dry_dirt", + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dry_dirt_with_dry_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:desert_sand", + "ethereal:grove_dirt", + "ethereal:bamboo_dirt", + "dorwinion:dorwinion_grass", + "prairie:prairie_dirt_with_grass", + "nightshade:nightshade_dirt_with_grass", + "badland:badland_grass", + "japaneseforest:japanese_dirt_with_grass", + "naturalbiomes:alderswamp_litter", + "naturalbiomes:alpine_litter", + "naturalbiomes:mediterran_litter", + "naturalbiomes:outback_litter", + "naturalbiomes:savanna_litter", + "livingjungle:jungleground", + "livingjungle:leafyjungleground", + "group:soil", + "caverealms:stone_with_moss", + "caverealms:stone_with_lichen", + "caverealms:stone_with_algae", + "caverealms:stone_with_salt", + "caverealms:hot_cobble", + "default:clay", + "everness:forsaken_desert_sand", + "everness:forsaken_tundra_dirt", + "everness:frosted_snowblock", + "default:snowblock", + "everness:dirt_with_cursed_grass", + "everness:dirt_with_crystal_grass", + "everness:dirt_with_coral_grass", + "everness:moss_block", + "everness:crystal_moss_block", + "everness:emerald_ice", + "everness:ancient_emerald_ice", + "everness:dense_emerald_ice", + "everness:frosted_ice", + "everness:frosted_ice_translucent", + } +} + +lootchests.register_lootchest({ + name = "lootchests_default:basket", + description = S("Basket"), + tiles = { + "lootchests_default_basket_top.png", + "lootchests_default_basket_top.png", + "lootchests_default_basket_side.png", + }, + spawn_on = chest_spawning.on, + sounds = default.node_sound_wood_defaults(), + groups = {snappy = 2, oddly_breakable_by_hand = 2}, + ymax = 31000, + ymin = -256, + spawn_on_rarity = 4900, + spawn_by = chest_spawning.by, + num_spawn_by = 9, + slot_spawn_chance = 40, + slots = 24, +}) + +lootchests.register_lootchest({ + name = "lootchests_default:urn", + description = S("Urn"), + tiles = { + "lootchests_default_urn_top.png", + "lootchests_default_urn_top.png", + "lootchests_default_urn_side.png", + }, + spawn_on = chest_spawning.on, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, oddly_breakable_by_hand = 2}, + ymax = 0, + ymin = -4096, + spawn_on_rarity = 4900, + spawn_by = chest_spawning.by, + num_spawn_by = 9, + slot_spawn_chance = 40, + slots = 24, +}) + +lootchests.register_lootchest({ + name = "lootchests_default:barrel", + description = S("Barrel"), + tiles = { + "lootchests_default_barrel_top.png", + "lootchests_default_barrel_top.png", + "lootchests_default_barrel_side.png", + }, + spawn_in = {"default:sand", "default:desert_sand", "default:silver_sand"}, + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + ymax = -3, + ymin = -32, + spawn_in_rarity = 80, + slot_spawn_chance = 40, + slots = 24, +}) + +lootchests.register_lootchest({ + name = "lootchests_default:stone_chest", + description = S("Ancient Chest"), + tiles = { + "lootchests_default_stone_chest_top.png", + "lootchests_default_stone_chest_top.png", + "lootchests_default_stone_chest_side.png", + "lootchests_default_stone_chest_side.png", + "lootchests_default_stone_chest_front.png", + }, + spawn_in = {"group:stone"}, + spawn_on = {"group:stone"}, + spawn_by = {"group:stone"}, + num_spawn_by = 11, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2}, + ymax = -256, + ymin = -31000, + spawn_in_rarity = 80, + spawn_on_rarity = 12500, + slot_spawn_chance = 55, + slots = 32, +}) diff --git a/mods/lootchests_modpack/lootchests_default/depends.txt b/mods/lootchests_modpack/lootchests_default/depends.txt new file mode 100644 index 00000000..2800765a --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/depends.txt @@ -0,0 +1,38 @@ +default +lootchests +tnt +vessels +screwdriver +map +fire +dye +wool +carts +bucket +boats +binoculars +farming +flowers +flowerpot? +beautiflowers? +herbs? +3d_armor? +shields? +bonemeal? +moreores? +moretrees? +too_many_stones? +bakedclay? +animalia? +gadgets_consumables? +ethereal? +livingjungle? +marinara? +naturalbiomes? +dorwinion? +prairie? +badland? +frost_land? +japanese_forest? +asuna_core? +x_farming? \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/description.txt b/mods/lootchests_modpack/lootchests_default/description.txt new file mode 100644 index 00000000..a68a02dd --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/description.txt @@ -0,0 +1 @@ +Part of lootchests_modpack, providing lootchests for minetest_game, as well as integration with some mods diff --git a/mods/lootchests_modpack/lootchests_default/init.lua b/mods/lootchests_modpack/lootchests_default/init.lua new file mode 100644 index 00000000..af12f1ad --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/init.lua @@ -0,0 +1,35 @@ +local path = minetest.get_modpath("lootchests_default") +dofile(path .. "/item_tables.lua") +dofile(path .. "/chests.lua") + +if minetest.get_modpath("3d_armor") then + dofile(path .. "/mod_support/3d_armor.lua") +end + +if minetest.get_modpath("shields") then + dofile(path .. "/mod_support/3d_armor_shields.lua") +end + +if minetest.get_modpath("bonemeal") then + dofile(path .. "/mod_support/bonemeal.lua") +end + +if minetest.get_modpath("farming") and farming and farming.mod == "redo" then + dofile(path .. "/mod_support/farming_redo.lua") +end + +if minetest.get_modpath("gadgets_consumables") then + dofile(path .. "/mod_support/gadgets_modpack.lua") +end + +if minetest.get_modpath("moreores") then + dofile(path .. "/mod_support/moreores.lua") +end + +if minetest.get_modpath("moretrees") then + dofile(path .. "/mod_support/moretrees.lua") +end + +if minetest.get_modpath("asuna_core") then + dofile(path .. "/mod_support/asuna.lua") +end \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/item_tables.lua b/mods/lootchests_modpack/lootchests_default/item_tables.lua new file mode 100644 index 00000000..7b812b9b --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/item_tables.lua @@ -0,0 +1,173 @@ +lootchests.loot_table["lootchests_default:ocean_chest"] = { + {"default:stick", 16}, + {"default:paper", 4}, + {"default:book", 3}, + {"default:skeleton_key", 1}, + {"default:flint", 4}, + {"default:obsidian_shard", 24}, + {"default:clay_brick", 32}, + {"default:mese_crystal_fragment", 4}, + {"default:gold_ingot", 8}, + {"default:bronze_ingot", 8}, + {"default:tin_ingot", 8}, + {"default:copper_ingot", 8}, + {"default:steel_ingot", 8}, + {"default:coal_lump", 16}, + {"default:pick_stone"}, + {"default:pick_bronze"}, + {"default:pick_steel"}, + {"default:shovel_stone"}, + {"default:shovel_bronze"}, + {"default:shovel_steel"}, + {"default:axe_stone"}, + {"default:axe_bronze"}, + {"default:axe_steel"}, + {"default:sword_stone"}, + {"default:sword_bronze"}, + {"default:sword_steel"}, + {"default:bookshelf", 4}, + {"default:sign_wall_wood", 2}, + {"default:ladder_wood", 32}, + {"default:ladder_steel", 16}, + {"default:glass", 24}, + {"default:obsidian_glass", 8}, + {"tnt:gunpowder", 16}, + {"vessels:glass_bottle", 8}, + {"vessels:drinking_glass", 8}, + {"screwdriver:screwdriver"}, + {"map:mapping_kit", 1}, + {"fire:flint_and_steel"}, + {"wool:white", 16}, + {"carts:rail", 24}, + {"carts:powerrail", 12}, + {"carts:brakerail", 12}, + {"carts:cart", 1}, + {"bucket:bucket_empty", 2}, + {"boats:boat", 1}, + {"binoculars:binoculars", 1}, + { + "default:coral_green", + "default:coral_pink", + "default:coral_cyan", + "default:coral_brown", + "default:coral_orange", + 3, + }, +} + +lootchests.loot_table["lootchests_default:basket"] = { + {"default:stick", 16}, + {"default:tree", 4}, + {"default:jungletree", 4}, + {"default:pine_tree", 4}, + {"default:cactus", 4}, + {"default:large_cactus_seedling", 2}, + {"default:papyrus", 8}, + {"default:junglegrass", 4}, + {"default:grass_1", 4}, + {"default:blueberry_bush_sapling", 4}, + { + "default:sapling", + "default:junglesapling", + "default:pine_sapling", + "default:acacia_sapling", + "default:aspen_sapling", + 1, + }, + { + "default:leaves", + "default:acacia_leaves", + "default:pine_needles", + "default:aspen_leaves", + "default:jungleleaves", + 10, + }, + {"wool:white", 8}, + {"farming:wheat", 8}, + {"farming:flour", 4}, + {"farming:cotton", 4}, + {"farming:string", 4}, + {"flowers:mushroom_red", 8}, + {"ethereal:vine", 6}, + {"vessels:glass_bottle", 2}, +} + +lootchests.loot_table["lootchests_default:urn"] = { + {"default:stick", 16}, + {"default:paper", 4}, + {"default:flint", 4}, + {"default:clay_lump", 16}, + {"default:tin_lump", 8}, + {"default:copper_lump", 8}, + {"default:iron_lump", 8}, + {"default:coal_lump", 16}, + {"default:pick_stone"}, + {"default:shovel_stone"}, + {"default:axe_stone"}, + {"default:sword_stone"}, + {"default:sign_wall_wood", 1}, + {"default:ladder_wood", 8}, + {"vessels:glass_bottle", 4}, + {"fire:flint_and_steel"}, + {"wool:white", 8}, + {"farming:flour", 4}, + {"default:tree", 2}, + {"default:jungletree", 2}, + {"default:pine_tree", 2}, + {"default:cobble", 60}, + {"caverealms:glow_gem", 6}, + {"default:gravel", 24}, + {"default:torch", 8}, + {"default:obsidian", 3} +} + +lootchests.loot_table["lootchests_default:barrel"] = lootchests.loot_table["lootchests_default:urn"] + +lootchests.loot_table["lootchests_default:stone_chest"] = { + {"default:coalblock", 4}, + {"default:steelblock", 2}, + {"default:copperblock", 2}, + {"default:tinblock", 2}, + {"default:bronzeblock", 2}, + {"default:mese", 2}, + {"default:meselamp", 4}, + {"default:stick", 16}, + {"default:paper", 4}, + {"default:book", 3}, + {"default:skeleton_key", 1}, + {"default:flint", 4}, + {"default:obsidian", 24}, + {"default:clay_brick", 32}, + {"default:mese_crystal", 16}, + {"default:diamond", 16}, + {"default:gold_ingot", 16}, + {"default:bronze_ingot", 16}, + {"default:tin_ingot", 16}, + {"default:copper_ingot", 16}, + {"default:steel_ingot", 16}, + {"default:coal_lump", 32}, + {"default:pick_bronze"}, + {"default:pick_steel"}, + {"default:pick_mese"}, + {"default:shovel_bronze"}, + {"default:shovel_steel"}, + {"default:shovel_mese"}, + {"default:axe_bronze"}, + {"default:axe_steel"}, + {"default:axe_mese"}, + {"default:sword_bronze"}, + {"default:sword_steel"}, + {"default:sword_mese"}, + {"default:glass", 32}, + {"default:obsidian_glass", 16}, + {"tnt:gunpowder", 32}, + {"vessels:glass_bottle", 32}, + {"vessels:drinking_glass", 32}, + {"fire:flint_and_steel"}, + {"carts:rail", 64}, + {"carts:powerrail", 32}, + {"carts:brakerail", 32}, + {"carts:cart", 2}, + {"bucket:bucket_empty", 8}, + {"boats:boat", 2}, +} \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/locale/lootchests_default.ru.tr b/mods/lootchests_modpack/lootchests_default/locale/lootchests_default.ru.tr new file mode 100644 index 00000000..6b477f10 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/locale/lootchests_default.ru.tr @@ -0,0 +1,7 @@ +# textdomain: lootchests_default + +Loot Chest=Сундук Ñ Ð´Ð¾Ð±Ñ‹Ñ‡ÐµÐ¹ +Basket=Корзина +Urn=Урна +Barrel=Бочка +Ancient Chest=Древний Ñундук diff --git a/mods/lootchests_modpack/lootchests_default/mod.conf b/mods/lootchests_modpack/lootchests_default/mod.conf new file mode 100644 index 00000000..50063625 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod.conf @@ -0,0 +1 @@ +name = lootchests_default diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/3d_armor.lua b/mods/lootchests_modpack/lootchests_default/mod_support/3d_armor.lua new file mode 100644 index 00000000..b90a1c10 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/3d_armor.lua @@ -0,0 +1,36 @@ +local cheap_items = { + {"3d_armor:helmet_wood"}, + {"3d_armor:chestplate_wood"}, + {"3d_armor:leggings_wood"}, + {"3d_armor:boots_wood"}, + {"3d_armor:helmet_cactus"}, + {"3d_armor:chestplate_cactus"}, + {"3d_armor:leggings_cactus"}, + {"3d_armor:boots_cactus"}, +} + +local medium_items = { + {"3d_armor:helmet_steel"}, + {"3d_armor:chestplate_steel"}, + {"3d_armor:leggings_steel"}, + {"3d_armor:boots_steel"}, + {"3d_armor:helmet_bronze"}, + {"3d_armor:chestplate_bronze"}, + {"3d_armor:leggings_bronze"}, + {"3d_armor:boots_bronze"}, +} + +local expensive_items = { + {"3d_armor:helmet_gold"}, + {"3d_armor:chestplate_gold"}, + {"3d_armor:leggings_gold"}, + {"3d_armor:boots_gold"}, + {"3d_armor:helmet_diamond"}, + {"3d_armor:chestplate_diamond"}, + {"3d_armor:leggings_diamond"}, + {"3d_armor:boots_diamond"}, +} + +lootchests.add_to_loot_table("lootchests_default:ocean_chest", medium_items) +lootchests.add_to_loot_table("lootchests_default:urn", cheap_items) +lootchests.add_to_loot_table("lootchests_default:stone_chest", expensive_items) \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/3d_armor_shields.lua b/mods/lootchests_modpack/lootchests_default/mod_support/3d_armor_shields.lua new file mode 100644 index 00000000..7face274 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/3d_armor_shields.lua @@ -0,0 +1,20 @@ +local cheap_items = { + {"shields:shield_wood"}, + {"shields:shield_enhanced_wood"}, + {"shields:shield_cactus"}, + {"shields:shield_enhanced_cactus"}, +} + +local medium_items = { + {"shields:shield_steel"}, + {"shields:shield_bronze"}, +} + +local expensive_items = { + {"shields:shield_gold"}, + {"shields:shield_diamond"}, +} + +lootchests.add_to_loot_table("lootchests_default:ocean_chest", medium_items) +lootchests.add_to_loot_table("lootchests_default:urn", cheap_items) +lootchests.add_to_loot_table("lootchests_default:stone_chest", expensive_items) diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/asuna.lua b/mods/lootchests_modpack/lootchests_default/mod_support/asuna.lua new file mode 100644 index 00000000..e047c18d --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/asuna.lua @@ -0,0 +1,388 @@ +--[[ + Define loot groups +]] + +local loot_groups = { + too_many_stones = { + crystals = { + "too_many_stones:celestine_crystal", + "too_many_stones:amethyst_crystal", + "too_many_stones:heliodor_crystal", + "too_many_stones:vivianite_crystal", + "too_many_stones:prasiolite_crystal", + "too_many_stones:crocoite_crystal", + "too_many_stones:quartz_crystal", + "too_many_stones:rose_quartz_crystal", + "too_many_stones:smokey_quartz_crystal", + "too_many_stones:citrine_crystal", + 8, + }, + precious_stones = { + "too_many_stones:celestine", + "too_many_stones:amethyst", + "too_many_stones:heliodor", + "too_many_stones:vivianite", + "too_many_stones:prasiolite", + "too_many_stones:crocoite", + "too_many_stones:quartz", + "too_many_stones:rose_quartz", + "too_many_stones:smokey_quartz", + "too_many_stones:citrine", + "too_many_stones:black_moonstone", + "too_many_stones:marble", + 8, + }, + common_stones = { + "too_many_stones:granite_white", + "too_many_stones:granite_gray", + 30, + }, + opal = { + "too_many_stones:opal", + "too_many_stones:fire_opal", + "too_many_stones:black_opal", + 8, + }, + glowing_stones = { + "too_many_stones:glow_apatite", + "too_many_stones:glow_calcite", + "too_many_stones:glow_esperite", + "too_many_stones:glow_fluorite", + "too_many_stones:glow_selenite", + "too_many_stones:glow_sodalite", + "too_many_stones:glow_willemite", + "too_many_stones:glow_apatite", + "too_many_stones:glow_calcite", + "too_many_stones:glow_esperite", + "too_many_stones:glow_fluorite", + "too_many_stones:glow_selenite", + "too_many_stones:glow_sodalite", + "too_many_stones:glow_willemite", + 6, + } + }, + + marinara = { + seashells = { + "marinara:seashells_white", + "marinara:seashells_yellow", + "marinara:seashells_brown", + "marinara:seashells_pink", + "marinara:seashells_orange", + 4, + }, + }, + + x_farming = { + seeds = { + "x_farming:seed_barley", + "x_farming:seed_beetroot", + "x_farming:large_cactus_with_fruit_seedling", + "x_farming:seed_carrot", + "x_farming:jungle_with_cocoa_sapling", + "x_farming:seed_coffee", + "x_farming:seed_corn", + "x_farming:kiwi_sapling", + "x_farming:seed_melon", + "x_farming:pine_nut_sapling", + "x_farming:seed_pumpkin", + "x_farming:seed_rice", + "x_farming:seed_potato", + "x_farming:seed_soybean", + "x_farming:seed_stevia", + "x_farming:seed_strawberry", + 4, + }, + surface_crops = { + "x_farming:barley", + "x_farming:beetroot", + "x_farming:cactus_fruit_item", + "x_farming:carrot", + "x_farming:cocoa_bean", + "x_farming:coffee", + "x_farming:corn", + "x_farming:kiwi_fruit", + "x_farming:melon", + "x_farming:pine_nut_sapling", + "x_farming:pumpkin", + "x_farming:rice", + "x_farming:potato", + "x_farming:soybean", + "x_farming:stevia", + "x_farming:strawberry", + 4, + }, + underground_crops = { + "x_farming:seed_beetroot", + "x_farming:potato", + 4, + }, + rope = { + "x_farming:rope", + 16, + }, + }, + + flowers = { + all_flowers = { + "flowers:tulip_black", + "beautiflowers:carla", + "beautiflowers:cloe", + "beautiflowers:genesis", + "beautiflowers:gloria", + "beautiflowers:hadassa", + "beautiflowers:ingrid", + "beautiflowers:irene", + "beautiflowers:iris", + "beautiflowers:ivette", + "beautiflowers:michelle", + "beautiflowers:suri", + "flowers:dandelion_white", + "herbs:achillea_white", + "herbs:leontopodium_white", + "herbs:leucanthemum_white", + "herbs:trifolium_white", + "beautiflowers:beatriz", + "beautiflowers:berta", + "flowers:geranium", + "herbs:centaurea", + "herbs:campanula_blue", + "herbs:digitalis_blue", + "herbs:iris", + "bakedclay:delphinium", + "beautiflowers:thais", + "beautiflowers:valentina", + "beautiflowers:valeria", + "beautiflowers:vera", + "beautiflowers:victoria", + "beautiflowers:virginia", + "beautiflowers:xenia", + "beautiflowers:zaida", + "beautiflowers:dafne", + "beautiflowers:dana", + "beautiflowers:delia", + "beautiflowers:elena", + "beautiflowers:erica", + "beautiflowers:estela", + "beautiflowers:eva", + "beautiflowers:fabiola", + "beautiflowers:fiona", + "beautiflowers:gala", + "flowers:tulip", + "beautiflowers:ada", + "beautiflowers:agnes", + "beautiflowers:alicia", + "beautiflowers:alma", + "beautiflowers:amaia", + "beautiflowers:anastasia", + "beautiflowers:any", + "flowers:dandelion_yellow", + "herbs:digitalis_yellow", + "herbs:plantago", + "beautiflowers:arleth", + "beautiflowers:astrid", + "beautiflowers:belen", + "beautiflowers:blanca", + "beautiflowers:casandra", + "beautiflowers:clara", + "beautiflowers:claudia", + "beautiflowers:minerva", + "beautiflowers:miriam", + "beautiflowers:nazareth", + "beautiflowers:noemi", + "beautiflowers:olga", + "beautiflowers:paula", + "beautiflowers:regina", + "beautiflowers:rocio", + "beautiflowers:sabrina", + "beautiflowers:vanesa", + "flowers:viola", + "beautiflowers:xena", + "beautiflowers:arcoiris", + "beautiflowers:jennifer", + "beautiflowers:lara", + "beautiflowers:laura", + "beautiflowers:lidia", + "beautiflowers:lucia", + "beautiflowers:mara", + "beautiflowers:martina", + "beautiflowers:melania", + "beautiflowers:mireia", + "beautiflowers:nadia", + "beautiflowers:nerea", + "beautiflowers:noelia", + "flowers:rose", + "herbs:dosera", + "herbs:papaver_red", + "beautiflowers:caroline", + "beautiflowers:cristina", + "beautiflowers:diana", + "beautiflowers:gisela", + "beautiflowers:olimpia", + "beautiflowers:oriana", + "beautiflowers:pia", + "beautiflowers:raquel", + "beautiflowers:ruth", + "beautiflowers:sandra", + "beautiflowers:sara", + "beautiflowers:silvia", + "beautiflowers:sofia", + "beautiflowers:sonia", + "beautiflowers:talia", + "herbs:antirrhinum", + "herbs:trifolium_red", + "bakedclay:thistle", + "bakedclay:lazarus", + "flowers:chrysanthemum_green", + "beautiflowers:pasto_1", + "beautiflowers:pasto_2", + "beautiflowers:pasto_3", + "beautiflowers:pasto_4", + "beautiflowers:pasto_5", + "beautiflowers:pasto_6", + "beautiflowers:pasto_7", + "beautiflowers:pasto_8", + "beautiflowers:pasto_9", + "beautiflowers:pasto_10", + "bakedclay:mannagrass", + 6, + }, + brown_mushrooms = { + "flowers:mushroom_brown", + "herbs:mushroom_boletus", + "herbs:mushroom_macrolepiota", + 4, + }, + }, + + flowerpot = { + pot = { + "flowerpot:empty", + 1, + }, + }, + + animalia = { + feather = { + "animalia:feather", + 3, + }, + leather = { + "animalia:leather", + 2, + }, + }, + + ethereal = { + fruit = { + "ethereal:banana", + 3, + }, + bowl = { + "ethereal:bowl", + 1, + }, + }, + + bakedclay = { + clay = { + "bakedclay:natural", + "bakedclay:white", + "bakedclay:grey", + "bakedclay:black", + "bakedclay:red", + "bakedclay:yellow", + "bakedclay:green", + "bakedclay:cyan", + "bakedclay:blue", + "bakedclay:magenta", + "bakedclay:orange", + "bakedclay:violet", + "bakedclay:brown", + "bakedclay:pink", + "bakedclay:dark_grey", + "bakedclay:dark_green", + 6, + }, + terracotta = { + "bakedclay:terracotta_white", + "bakedclay:terracotta_grey", + "bakedclay:terracotta_black", + "bakedclay:terracotta_red", + "bakedclay:terracotta_yellow", + "bakedclay:terracotta_green", + "bakedclay:terracotta_cyan", + "bakedclay:terracotta_blue", + "bakedclay:terracotta_magenta", + "bakedclay:terracotta_orange", + "bakedclay:terracotta_violet", + "bakedclay:terracotta_brown", + "bakedclay:terracotta_pink", + "bakedclay:terracotta_dark_grey", + "bakedclay:terracotta_dark_green", + 10, + }, + }, + + food = { + bread = { + "farming:bread", + 2, + }, + fruit = { + "default:apple", + "default:blueberries", + "ethereal:banana", + "ethereal:orange", + "ethereal:lemon", + "x_farming:melon_fruit", + "x_farming:pumpkin_fruit", + "x_farming:kiwi_fruit", + "x_farming:cactus_fruit_item", + 2, + }, + }, +} + +--[[ + Apply loot groups +]] + +lootchests.add_to_loot_table("lootchests_default:ocean_chest",{ + loot_groups.marinara.seashells, + loot_groups.animalia.leather, + loot_groups.bakedclay.terracotta, +}) + +lootchests.add_to_loot_table("lootchests_default:basket",{ + loot_groups.x_farming.seeds, + loot_groups.x_farming.surface_crops, + loot_groups.x_farming.rope, + loot_groups.flowers.all_flowers, + loot_groups.flowers.all_flowers, -- 2x chance for flowers + loot_groups.flowers.all_flowers, -- 3x chance for flowers + loot_groups.flowerpot.pot, + loot_groups.animalia.feather, + loot_groups.animalia.leather, + loot_groups.food.bread, + loot_groups.food.fruit, + loot_groups.ethereal.bowl, + loot_groups.flowers.brown_mushrooms, +}) + +lootchests.add_to_loot_table("lootchests_default:urn",{ + loot_groups.too_many_stones.crystals, + loot_groups.too_many_stones.precious_stones, + loot_groups.too_many_stones.common_stones, + loot_groups.x_farming.underground_crops, + loot_groups.x_farming.rope, + loot_groups.flowerpot.pot, + loot_groups.bakedclay.clay, + loot_groups.ethereal.bowl, +}) + +lootchests.add_to_loot_table("lootchests_default:stone_chest",{ + loot_groups.too_many_stones.glowing_stones, + loot_groups.too_many_stones.opal, + loot_groups.bakedclay.terracotta, +}) \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/bonemeal.lua b/mods/lootchests_modpack/lootchests_default/mod_support/bonemeal.lua new file mode 100644 index 00000000..644530b7 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/bonemeal.lua @@ -0,0 +1,9 @@ +local items = { + {"bonemeal:bonemeal", 8}, + {"bonemeal:mulch", 8}, + {"bonemeal:fertiliser", 8}, + {"bonemeal:bone", 4}, + {"bonemeal:gelatin_powder", 8}, +} + +lootchests.add_to_loot_table("lootchests_default:basket", items) \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/farming_redo.lua b/mods/lootchests_modpack/lootchests_default/mod_support/farming_redo.lua new file mode 100644 index 00000000..c8a29cd0 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/farming_redo.lua @@ -0,0 +1,44 @@ +local items = {} + +for _,item in ipairs({ + {"farming:seed_wheat", 4}, + {"farming:tomato", 2}, + {"farming:rye", 4}, + {"farming:oat", 4}, + {"farming:rice", 4}, + {"farming:rhubarb", 2}, + {"farming:raspberries", 4}, + {"farming:pumpkin", 1}, + {"farming:potato", 4}, + {"farming:pineapple", 2}, + {"farming:peppercorn", 4}, + {"farming:pepper", 4}, + {"farming:pea_pod", 4}, + {"farming:peas", 8}, + {"farming:onion", 4}, + {"farming:melon", 1}, + {"farming:seed_hemp", 4}, + {"farming:hemp_leaf", 8}, + {"farming:hemp_rope", 4}, + {"farming:grapes", 6}, + {"farming:garlic_clove", 2}, + {"farming:garlic", 4}, + {"farming:cucumber", 2}, + {"farming:seed_cotton", 4}, + {"farming:corn", 8}, + {"farming:coffee_beans", 8}, + {"farming:cocoa_beans", 8}, + {"farming:chili_pepper", 2}, + {"farming:carrot", 4}, + {"farming:blueberries", 8}, + {"farming:beetroot", 8}, + {"farming:beans", 8}, + {"farming:seed_barley", 4}, + {"farming:barley", 8}, +}) do + if minetest.registered_items[item[1]] then + table.insert(items,item) + end +end + +lootchests.add_to_loot_table("lootchests_default:basket", items) diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/gadgets_modpack.lua b/mods/lootchests_modpack/lootchests_default/mod_support/gadgets_modpack.lua new file mode 100644 index 00000000..311cd5a5 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/gadgets_modpack.lua @@ -0,0 +1,28 @@ +local chest_items = { + {"gadgets_consumables:potion_speed_01", 2}, + {"gadgets_consumables:potion_jump_01", 2}, + {"gadgets_consumables:potion_gravity_01", 2}, + {"gadgets_consumables:potion_dispel", 2}, + {"gadgets_consumables:potion_health_regen_01", 2}, + {"gadgets_consumables:potion_water_breath_01", 2}, + {"gadgets_consumables:water_bottle", 2}, +} + +local stone_chest_items = { + {"gadgets_consumables:potion_teleport", 2}, + {"gadgets_consumables:potion_fire_shield_02", 2}, + {"gadgets_consumables:potion_speed_02", 2}, + {"gadgets_consumables:potion_jump_02", 2}, + {"gadgets_consumables:potion_gravity_02", 2}, + {"gadgets_consumables:potion_dispel", 2}, + {"gadgets_consumables:potion_health_regen_02", 2}, + {"gadgets_consumables:potion_water_breath_02", 2}, +} + +lootchests.add_to_loot_table("lootchests_default:ocean_chest", chest_items) +lootchests.add_to_loot_table("lootchests_default:stone_chest", stone_chest_items) + +if minetest.get_modpath("lootchests_magic_materials") then + lootchests.add_to_loot_table("lootchests_magic_materials:rune_urn", chest_items) + lootchests.add_to_loot_table("lootchests_magic_materials:rune_chest", stone_chest_items) +end diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/moreores.lua b/mods/lootchests_modpack/lootchests_default/mod_support/moreores.lua new file mode 100644 index 00000000..b036aba1 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/moreores.lua @@ -0,0 +1,29 @@ +local chest_items = { + {"moreores:silver_ingot", 8}, + {"moreores:mithril_lump", 2}, + {"moreores:sword_silver"}, + {"moreores:axe_silver"}, + {"moreores:shovel_silver"}, + {"moreores:pick_silver"}, +} + +local urn_items = { + {"moreores:silver_lump", 8}, +} + +local stone_chest_items = { + {"moreores:sword_silver"}, + {"moreores:axe_silver"}, + {"moreores:shovel_silver"}, + {"moreores:pick_silver"}, + {"moreores:sword_mithril"}, + {"moreores:axe_mithril"}, + {"moreores:shovel_mithril"}, + {"moreores:pick_mithril"}, + {"moreores:mithril_ingot", 4}, + {"moreores:silver_block", 2}, +} + +lootchests.add_to_loot_table("lootchests_default:ocean_chest", chest_items) +lootchests.add_to_loot_table("lootchests_default:urn", urn_items) +lootchests.add_to_loot_table("lootchests_default:stone_chest", stone_chest_items) \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/mod_support/moretrees.lua b/mods/lootchests_modpack/lootchests_default/mod_support/moretrees.lua new file mode 100644 index 00000000..fcd3e3c4 --- /dev/null +++ b/mods/lootchests_modpack/lootchests_default/mod_support/moretrees.lua @@ -0,0 +1,28 @@ +local items = { + {"moretrees:acorn", 8}, + {"moretrees:acorn_muffin_batter", 4}, + {"moretrees:cedar_nuts", 16}, + {"moretrees:cedar_cone", 4}, + {"moretrees:coconut", 2}, + {"moretrees:date", 16}, + {"moretrees:date_nut_batter", 4}, + {"moretrees:fir_cone", 4}, + {"moretrees:fir_nuts", 8}, + {"moretrees:spruce_cone", 4}, + {"moretrees:spruce_nuts", 8}, + {"moretrees:rubber_tree_sapling", 2}, + {"moretrees:sequoia_sapling", 2}, + {"moretrees:spruce_sapling", 2}, + {"moretrees:willow_sapling", 2}, + {"moretrees:poplar_sapling", 2}, + {"moretrees:palm_sapling", 2}, + {"moretrees:oak_sapling", 2}, + {"moretrees:fir_sapling", 2}, + {"moretrees:date_palm_sapling", 2}, + {"moretrees:apple_tree_sapling", 2}, + {"moretrees:birch_sapling", 2}, + {"moretrees:cedar_sapling", 2}, + {"moretrees:beech_sapling", 2}, +} + +lootchests.add_to_loot_table("lootchests_default:basket", items) \ No newline at end of file diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_barrel_side.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_barrel_side.png new file mode 100644 index 00000000..f1a010f5 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_barrel_side.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_barrel_top.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_barrel_top.png new file mode 100644 index 00000000..dfb129a6 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_barrel_top.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_basket_side.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_basket_side.png new file mode 100644 index 00000000..e8438499 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_basket_side.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_basket_top.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_basket_top.png new file mode 100644 index 00000000..78d0d7e0 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_basket_top.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_front.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_front.png new file mode 100644 index 00000000..45024267 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_front.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_side.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_side.png new file mode 100644 index 00000000..da9177e6 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_side.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_top.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_top.png new file mode 100644 index 00000000..15ca5708 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_stone_chest_top.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_urn_side.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_urn_side.png new file mode 100644 index 00000000..7b5655cf Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_urn_side.png differ diff --git a/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_urn_top.png b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_urn_top.png new file mode 100644 index 00000000..213a2574 Binary files /dev/null and b/mods/lootchests_modpack/lootchests_default/textures/lootchests_default_urn_top.png differ diff --git a/mods/lootchests_modpack/modpack.txt b/mods/lootchests_modpack/modpack.txt new file mode 100644 index 00000000..8d1c8b69 --- /dev/null +++ b/mods/lootchests_modpack/modpack.txt @@ -0,0 +1 @@ + diff --git a/mods/marinara/LICENSE b/mods/marinara/LICENSE new file mode 100644 index 00000000..e810afb8 --- /dev/null +++ b/mods/marinara/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2022 +Textures and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/marinara/coralnodes.lua b/mods/marinara/coralnodes.lua new file mode 100644 index 00000000..7fe9ced2 --- /dev/null +++ b/mods/marinara/coralnodes.lua @@ -0,0 +1,108 @@ +local S = minetest.get_translator("marinara") + +minetest.register_node("marinara:hardcoral_brown", { + description = S("Brown Hard Coral"), + tiles = {"marinara_hardcoral_brown.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral_brown", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral", { + description = S("Hard Coral"), + tiles = {"marinara_hardcoral.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_blue", { + description = S("Blue Hard Coral"), + tiles = {"marinara_hardcoral_blue.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + drop = "marinara:hardcoral_blue", + light_source = 2, + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_green", { + description = S("Green Hard Coral"), + tiles = {"marinara_hardcoral_green.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral_green", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_pink", { + description = S("Pink Hard Coral"), + tiles = {"marinara_hardcoral_pink.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral_pink", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_red", { + description = S("Red Hard Coral"), + tiles = {"marinara_hardcoral_red.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral_red", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_violet", { + description = S("Violet Hard Coral"), + tiles = {"marinara_hardcoral_violet.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral_violet", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_yellow", { + description = S("Yellow Hard Coral"), + tiles = {"marinara_hardcoral_yellow.png"}, + groups = {cracky = 3, stone = 1, coral = 1}, + light_source = 2, + drop = "marinara:hardcoral_yellow", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:coastrock", { + description = S("Coastal Rock"), + tiles = {"marinara_coastrock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:coastrock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:coastrock_alage", { + description = S("Coastal Rock with Alage"), + tiles = {"marinara_coastrock_alage.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:coastrock_alage", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:seapocks", { + description = S("Sea Pocks"), + tiles = {"marinara_seapocks.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:seapocks", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) \ No newline at end of file diff --git a/mods/marinara/crafting.lua b/mods/marinara/crafting.lua new file mode 100644 index 00000000..d01c6b11 --- /dev/null +++ b/mods/marinara/crafting.lua @@ -0,0 +1,605 @@ +local S = minetest.get_translator("marinara") + + stairs.register_stair_and_slab( + "marinara_reed_node", + "marinara:reed_bundle", + {snappy = 3, oddly_breakable_by_hand = 0, flammable = 0}, + {"marinara_reed_node_top.png", "marinara_reed_node.png", "marinara_reed_node_top.png"}, + S("Reed Node Stair"), + S("Reed Node Slab"), + default.node_sound_leaves_defaults() + ) + +minetest.register_node("marinara:reed_bundle", { + description = S("Reed Node"), + tiles = { + "marinara_reed_node.png", + "marinara_reed_node.png", + "marinara_reed_node_top.png" + }, + is_ground_content = false, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_craft({ + output = "marinara:reed_bundle", + type = "shapeless", + recipe = + {"marinara:reed", "marinara:reed"} + +}) + +minetest.register_craft({ + output = "marinara:reed_bundle", + type = "shapeless", + recipe = + {"marinara:reed_root", "marinara:reed_root"} + +}) + +minetest.register_node("marinara:bountychest", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:steel_ingot 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest2", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "tnt:gunpowder 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest3", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:axe_bronze 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest4", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "farming:seed_wheat 10", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest5", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:sword_steel 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest6", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:gold_ingot 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest7", { + description = ("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "farming:string 6", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest8", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:book 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest9", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:mese_crystal_fragment 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest10", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:pick_bronze 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest11", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:obsidian_shard 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest12", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "farming:seed_cotton 10", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:sand_with_seashells", { + description = S("Sand with Seashells"), + tiles = {"default_sand.png^marinara_seashells.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile", + type = "shapeless", + recipe = + {"marinara:seashells", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells", { + description = S("Seashells"), + inventory_image = "marinara_seashells.png", +}) + +minetest.register_node("marinara:seashellmobile", { + description = S("Seashell Mobile"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile.png"}, + inventory_image = "marinara_seashellmobile.png", + wield_image = "marinara_seashellmobile.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +walls.register(":marinara:coastbrick_wall", S"Coast Brick Wall", "marinara_coastbrick.png", + "marinara:coastbrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "marinara_coastbrick", + "marinara:coastbricks", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"marinara_coastbrick.png"}, + S("Coast Rock Brick Stair"), + S("Coast Rock Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("marinara:coastbricks", { + description = S("Coast Bricks"), + tiles = {"marinara_coastbrick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "marinara:coastbricks", + type = "shapeless", + recipe = + {"marinara:coastrock", "marinara:coastrock"} + + +}) + +minetest.register_craft({ + output = "marinara:coastbrick_wall", + type = "shapeless", + recipe = + {"marinara:coastbricks"} + + +}) + +walls.register(":marinara:coastbrick_wall_alage", S"Coast Brick Wall with Alage", "marinara_coastbrick_alage.png", + "marinara:coastbrick_wall_alage", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "marinara_coastbrick_alage", + "marinara:coastbricks_alage", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"marinara_coastbrick_alage.png"}, + S("Coast Rock Brick Stair with Alage"), + S("Coast Rock Brick Slab with Alage"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("marinara:coastbricks_alage", { + description = S("Coast Bricks with Alage"), + tiles = {"marinara_coastbrick_alage.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "marinara:coastbricks_alage", + type = "shapeless", + recipe = + {"marinara:coastrock_alage", "marinara:coastrock_alage"} + + +}) + +minetest.register_craft({ + output = "marinara:coastbrick_wall_alage", + type = "shapeless", + recipe = + {"marinara:coastbricks_alage"} + + +}) + +minetest.register_node("marinara:sand_with_seashells_orange", { + description = S("Sand with Seashells Orange"), + tiles = {"default_sand.png^marinara_seashells_orange.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_orange", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_orange", + type = "shapeless", + recipe = + {"marinara:seashells_orange", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_orange", { + description = S("Seashells Orange"), + inventory_image = "marinara_seashells_orange.png", +}) + +minetest.register_node("marinara:seashellmobile_orange", { + description = S("Seashell Mobile Orange"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_orange.png"}, + inventory_image = "marinara_seashellmobile_orange.png", + wield_image = "marinara_seashellmobile_orange.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_broken", { + description = S("Sand with Seashells Broken"), + tiles = {"default_sand.png^marinara_seashells_broken.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_broken", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_broken", + type = "shapeless", + recipe = + {"marinara:seashells_broken", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_broken", { + description = S("Seashells Broken"), + inventory_image = "marinara_seashells_broken.png", +}) + +minetest.register_node("marinara:seashellmobile_broken", { + description = S("Seashell Mobile Broken"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_broken.png"}, + inventory_image = "marinara_seashellmobile_broken.png", + wield_image = "marinara_seashellmobile_broken.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_pink", { + description = S("Sand with Seashells Pink"), + tiles = {"default_sand.png^marinara_seashells_pink.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_pink", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_pink", + type = "shapeless", + recipe = + {"marinara:seashells_pink", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_pink", { + description = S("Seashells Pink"), + inventory_image = "marinara_seashells_pink.png", +}) + +minetest.register_node("marinara:seashellmobile_pink", { + description = S("Seashell Mobile Pink"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_pink.png"}, + inventory_image = "marinara_seashellmobile_pink.png", + wield_image = "marinara_seashellmobile_pink.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_brown", { + description = S("Sand with Seashells Brown"), + tiles = {"default_sand.png^marinara_seashells_brown.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_brown", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_brown", + type = "shapeless", + recipe = + {"marinara:seashells_brown", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_brown", { + description = S("Seashells Brown"), + inventory_image = "marinara_seashells_brown.png", +}) + +minetest.register_node("marinara:seashellmobile_brown", { + description = S("Seashell Mobile Brown"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_brown.png"}, + inventory_image = "marinara_seashellmobile_brown.png", + wield_image = "marinara_seashellmobile_brown.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_yellow", { + description = S("Sand with Seashells Yellow"), + tiles = {"default_sand.png^marinara_seashells_yellow.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_yellow", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_yellow", + type = "shapeless", + recipe = + {"marinara:seashells_yellow", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_yellow", { + description = S("Seashells Yellow"), + inventory_image = "marinara_seashells_yellow.png", +}) + +minetest.register_node("marinara:seashellmobile_yellow", { + description = S("Seashell Mobile Yellow"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_yellow.png"}, + inventory_image = "marinara_seashellmobile_yellow.png", + wield_image = "marinara_seashellmobile_yellow.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_white", { + description = S("Sand with Seashells White"), + tiles = {"default_sand.png^marinara_seashells_white.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_white", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_white", + type = "shapeless", + recipe = + {"marinara:seashells_white", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_white", { + description = S("Seashells White"), + inventory_image = "marinara_seashells_white.png", +}) + +minetest.register_node("marinara:seashellmobile_white", { + description = S("Seashell Mobile White"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_white.png"}, + inventory_image = "marinara_seashellmobile_white.png", + wield_image = "marinara_seashellmobile_white.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) \ No newline at end of file diff --git a/mods/marinara/hunger.lua b/mods/marinara/hunger.lua new file mode 100644 index 00000000..5a66bd34 --- /dev/null +++ b/mods/marinara/hunger.lua @@ -0,0 +1,8 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('marinara:raw_oisters', { + satiates = 2.0, + }) + hunger_ng.add_hunger_data('marinara:mussels_cooked', { + satiates = 5.0, +}) +end \ No newline at end of file diff --git a/mods/marinara/init.lua b/mods/marinara/init.lua new file mode 100644 index 00000000..fa10801f --- /dev/null +++ b/mods/marinara/init.lua @@ -0,0 +1,33 @@ +--This creates the marinara object. +marinara = {} + +--This creates the marinara.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +marinara.settings = { + clear_biomes = minetest.settings:get_bool("marinara.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("marinara.clear_decos") or false, + clear_ores = minetest.settings:get_bool("marinara.clear_ores") or false, +} + +if marinara.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if marinara.settings.clear_decos then + minetest.clear_registered_decorations() +end +if marinara.settings.clear_ores then + minetest.clear_registered_ores() +end + +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +-- plants +dofile(path .. "coralnodes.lua") -- +dofile(path .. "plants.lua") -- +dofile(path .. "reefstuff.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "spawn.lua") -- +dofile(path .. "hunger.lua") -- + + + + diff --git a/mods/marinara/locale/marinara.de.tr b/mods/marinara/locale/marinara.de.tr new file mode 100644 index 00000000..25485709 --- /dev/null +++ b/mods/marinara/locale/marinara.de.tr @@ -0,0 +1,87 @@ +# textdomain: marinara + +### coralnodes.lua ### +Brown Hard Coral=Braune Steinkoralle +Hard Coral=Steinkoralle +Blue Hard Coral=Blaue Steinkoralle +Green Hard Coral=Grüne Steinkoralle +Pink Hard Coral=Pinke Steinkoralle +Red Hard Coral=Rote Steinkoralle +Violet Hard Coral=Violette Steinkoralle +Yellow Hard Coral=Gelbe Steinkoralle +Coastal Rock=Küstenfels +Coastal Rock with Alage=Algiger Küstenfels +Sea Pocks=Seepocken + +### crafting.lua ### +Reed Node=Schilfblock +Reed Node Stair=Schilftreppe +Reed Node Slab=Schilfplatte +Bounty Chest=Beutetruhe +Sand with Seashells=Sand mit Muscheln +Seashells=Muscheln +Seashell Mobile=Muschel Mobile +Coast Bricks=Küstenziegel +Coast Brick Wall=Küstenziegelmauer +Coast Rock Brick Stair=Küstenziegel Treppe +Coast Rock Brick Slab=Küstenziegel Platte +Coast Brick Wall with Alage=Algige Küstenziegelmauer +Coast Rock Brick Stair with Alage=Algige Küstenziegel Treppe +Coast Bricks with Alage=Algige Küstenziegel +Sand with Seashells Orange=Sand mit orangen Muscheln +Seashell Mobile=Muschel Mobile +Seashells Orange=Orange Muscheln +Seashell Mobile Orange=Muschel Mobile Orange +Sand with Seashells Broken=Sand mit zerbrochenen Muscheln +Seashells Broken=Zerbrochene Muscheln +Seashell Mobile Broken=Muschel Mobile mit Bruchstücken +Sand with Seashells Pink=Sand mit pinken Muscheln +Seashells Pink=Pinke Muscheln +Seashell Mobile Pink=Muschel Mobile Pink +Sand with Seashells Brown=Sand mit braunen Muscheln +Seashells Brown=Braune Muscheln +Seashell Mobile Brown=Muschel Mobile Braun +Sand with Seashells Yellow=Sand mit gelben Muscheln +Seashells Yellow=Gelbe Muscheln +Seashell Mobile Yellow=Muschel Mobile Gelb +Sand with Seashells White=Sand mit weißen Muscheln +Seashells White=Weiße Muscheln +Seashell Mobile White=Muschel Mobile Weiß + +### plants.lua ### +Reed Root=Schilf mit Wurzeln +Reed=Schilf +Long Seagrass=Langes Seegras +Seagrass=Seegras +Alage=Alge +Brown Alage=Braunalge + +### reefstuff.lua ### +Yellow Soft Coral=Gelbe Weichkoralle +White Soft Coral=Weiße Weichkoralle +Red Soft Coral=Rote Weichkoralle +Green Soft Coral=Grüne Weichkoralle +Soft Coral=Weichkoralle +Brown Soft Coral=Braune Weichkoralle +Sea Anemone=Seeanemone +Sea Worm=Fächerwurm +Mussel Node=Muschelblock +Cooked Mussels=Gekochte Muscheln +Oister Bank=Austernbank +Raw Oisters=Rohe Austern + + + + + + + + + + + + + + + + diff --git a/mods/marinara/mod.conf b/mods/marinara/mod.conf new file mode 100644 index 00000000..1501bf1e --- /dev/null +++ b/mods/marinara/mod.conf @@ -0,0 +1,3 @@ +name = marinara +description = adds water structures and coral reefs to your minetest game world +depends = default, stairs, tnt, farming \ No newline at end of file diff --git a/mods/marinara/plants.lua b/mods/marinara/plants.lua new file mode 100644 index 00000000..00510fbc --- /dev/null +++ b/mods/marinara/plants.lua @@ -0,0 +1,415 @@ +local S = minetest.get_translator("marinara") + +minetest.register_node("marinara:reed_root", { + description = S("Reed Root"), + drawtype = "plantlike_rooted", + visual_scale = 3.5, + waving = 1, + paramtype = "light", + tiles = {"default_dirt.png"}, + special_tiles = {{name = "marinara_reed_root.png", tileable_vertical = true}}, + inventory_image = "marinara_reed_root.png", + wield_image = "marinara_reed_root.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:dirt", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:dirt"}) + end, +}) + +minetest.register_node("marinara:reed", { + description = S("Reed"), + drawtype = "plantlike", + waving = 1, + visual_scale = 3.5, + tiles = {"marinara_reed.png"}, + inventory_image = "marinara_reed.png", + wield_image = "marinara_reed.png", + paramtype = "light", + sunlight_propagates = true, + + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_kelp", { + description = ("Kelp"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_kelp.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_kelp_inv.png", + visual_scale = 2.0, + wield_image = "marinara_kelp_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(4, 12) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_kelp", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:sand_with_seagrass2", { + description = S("Long Seagrass"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_seagrass.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_seagrass_inv.png", + visual_scale = 2.0, + wield_image = "marinara_seagrass_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(2, 2) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_seagrass2", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:sand_with_seagrass", { + description = S("Seagrass"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_seagrass.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_seagrass_inv.png", + visual_scale = 2.0, + wield_image = "marinara_seagrass_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(1, 1) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_seagrass", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:sand_with_alage", { + description = S("Algae"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_alage.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_alage_inv.png", + visual_scale = 1.0, + wield_image = "marinara_alage_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(1, 1) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_alage", + param2 = height * 16}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:coastrock_with_brownalage", { + description = S("Brown Algae"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"marinara_coastrock.png"}, + special_tiles = {{name = "marinara_brownalage.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_brownalage_inv.png", + visual_scale = 2.0, + wield_image = "marinara_brownalage_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(2, 2) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:coastrock_with_brownalage", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end +}) diff --git a/mods/marinara/reefstuff.lua b/mods/marinara/reefstuff.lua new file mode 100644 index 00000000..bd4f17c2 --- /dev/null +++ b/mods/marinara/reefstuff.lua @@ -0,0 +1,497 @@ +local S = minetest.get_translator("marinara") + +-- soft corals + +minetest.register_node("marinara:softcoral_yellow", { + description = S("Yellow Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_yellow.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_softcoral_yellow_inv.png", + wield_image = "marinara_softcoral_yellow_inv.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_white", { + description = S("White Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_white.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_softcoral_white_inv.png", + wield_image = "marinara_softcoral_white_inv.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_red", { + description = S("Red Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_red.png", tileable_vertical = true, waving = 1}}, + inventory_image = "marinara_softcoral_red.png", + wield_image = "marinara_softcoral_red.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_green", { + description = S("Green Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_green.png", tileable_vertical = true, waving = 1}}, + inventory_image = "marinara_softcoral_green.png", + wield_image = "marinara_softcoral_green.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral", { + description = S("Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral.png", tileable_vertical = true, waving = 1}}, + inventory_image = "marinara_softcoral.png", + wield_image = "marinara_softcoral_green.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_brown", { + description = S("Brown Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_brown.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_softcoral_brown_inv.png", + wield_image = "marinara_softcoral_brown_inv.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +--- sea anemones + +minetest.register_node("marinara:seaanemone_tentacle", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle_inv.png", + wield_image = "marinara_seaanemone_tentacle_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +minetest.register_node("marinara:seaanemone_tentacle2", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle2.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle2_inv.png", + wield_image = "marinara_seaanemone_tentacle2_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +minetest.register_node("marinara:seaanemone_tentacle3", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle3.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle3_inv.png", + wield_image = "marinara_seaanemone_tentacle3_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +minetest.register_node("marinara:seaanemone_tentacle4", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle4.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle4_inv.png", + wield_image = "marinara_seaanemone_tentacle4_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +--- fan worms + +minetest.register_node("marinara:seaworm", { + description = S("Sea Worm"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_seaworm.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaworm_inv.png", + wield_image = "marinara_seaworm_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:seapocks"}) + end, +}) + +minetest.register_node("marinara:seaworm2", { + description = S("Sea Worm"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_seaworm2.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaworm2_inv.png", + wield_image = "marinara_seaworm2_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:seapocks"}) + end, +}) + +minetest.register_node("marinara:seaworm3", { + description = S("Sea Worm"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_seaworm3.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 12}}}, + inventory_image = "marinara_seaworm3_inv.png", + wield_image = "marinara_seaworm3_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:seapocks"}) + end, +}) + +-- mussels and oisters + +minetest.register_node("marinara:mussels", { + description = S("Mussel Node"), +tiles = { + { + name = "marinara_mussles.png", + animation = {type="vertical_frames", length = 4} + } + }, +inventory_image = "marinara_mussles_inv.png", + wield_image = "marinara_mussles_inv.png", + groups = {cracky = 2}, + drop = "marinara:mussels", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + type = "cooking", + output = "marinara:mussels_cooked", + recipe = "marinara:mussels", + cooktime = 5 +}) + +minetest.register_craftitem("marinara:mussels_cooked", { + description = S("Cooked Mussels"), + inventory_image = "marinara_mussles_cooked.png", + on_use = minetest.item_eat(8), + groups = {food_meat = 1, flammable = 2} +}) + +minetest.register_node("marinara:oisterbank", { + description = S("Oister Bank"), + drawtype = "plantlike_rooted", + waving = 0, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_oisterbank.png", tileable_vertical = true}}, + inventory_image = "marinara_oisterbank.png", + wield_image = "marinara_oisterbank.png", + groups = {cracky = 2}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + drop = "marinara:raw_oisters", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_choppy", gain = 0.2}, + dug = {name = "default_dig_choppy", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:raw_oisters"}) + end, +}) + +minetest.register_node("marinara:raw_oisters", { + description = S("Raw Oisters"), + drawtype = "plantlike", + tiles = {"marinara_rawoisters.png"}, + inventory_image = "marinara_rawoisters.png", + wield_image = "marinara_rawoisters.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = {food = 1, flammable = 2, fleshy = 3, dig_immediate = 3}, + drop = "marinara:raw_oisters", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "marinara:raw_oisters", param2 = 1}) + end + end +}) \ No newline at end of file diff --git a/mods/marinara/schematics/marinara_alage.mts b/mods/marinara/schematics/marinara_alage.mts new file mode 100644 index 00000000..1b12c3b4 Binary files /dev/null and b/mods/marinara/schematics/marinara_alage.mts differ diff --git a/mods/marinara/schematics/marinara_brownalage.mts b/mods/marinara/schematics/marinara_brownalage.mts new file mode 100644 index 00000000..bb5806e1 Binary files /dev/null and b/mods/marinara/schematics/marinara_brownalage.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock.mts b/mods/marinara/schematics/marinara_coast_rock.mts new file mode 100644 index 00000000..18286233 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock2.mts b/mods/marinara/schematics/marinara_coast_rock2.mts new file mode 100644 index 00000000..b659fa40 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock2.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock3.mts b/mods/marinara/schematics/marinara_coast_rock3.mts new file mode 100644 index 00000000..b33a539a Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock3.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock4.mts b/mods/marinara/schematics/marinara_coast_rock4.mts new file mode 100644 index 00000000..0daef3e2 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock4.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock5.mts b/mods/marinara/schematics/marinara_coast_rock5.mts new file mode 100644 index 00000000..c87f9be4 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock5.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock6.mts b/mods/marinara/schematics/marinara_coast_rock6.mts new file mode 100644 index 00000000..88571f91 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock6.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock7.mts b/mods/marinara/schematics/marinara_coast_rock7.mts new file mode 100644 index 00000000..41bd6ae1 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock7.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef.mts b/mods/marinara/schematics/marinara_coldreef.mts new file mode 100644 index 00000000..00c6044b Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef2.mts b/mods/marinara/schematics/marinara_coldreef2.mts new file mode 100644 index 00000000..1eb11031 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef2.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef3.mts b/mods/marinara/schematics/marinara_coldreef3.mts new file mode 100644 index 00000000..2016d932 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef3.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef4.mts b/mods/marinara/schematics/marinara_coldreef4.mts new file mode 100644 index 00000000..6b4c02f7 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef4.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef5.mts b/mods/marinara/schematics/marinara_coldreef5.mts new file mode 100644 index 00000000..38009ace Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef5.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef6.mts b/mods/marinara/schematics/marinara_coldreef6.mts new file mode 100644 index 00000000..755d08f0 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef6.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef.mts b/mods/marinara/schematics/marinara_coralreef.mts new file mode 100644 index 00000000..d8c562ae Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef2.mts b/mods/marinara/schematics/marinara_coralreef2.mts new file mode 100644 index 00000000..fccd6259 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef3.mts b/mods/marinara/schematics/marinara_coralreef3.mts new file mode 100644 index 00000000..29dac28a Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_blue.mts b/mods/marinara/schematics/marinara_coralreef_blue.mts new file mode 100644 index 00000000..b79280d3 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_blue.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_blue2.mts b/mods/marinara/schematics/marinara_coralreef_blue2.mts new file mode 100644 index 00000000..ec393b27 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_blue2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_blue3.mts b/mods/marinara/schematics/marinara_coralreef_blue3.mts new file mode 100644 index 00000000..0fce4fb2 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_blue3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_brown.mts b/mods/marinara/schematics/marinara_coralreef_brown.mts new file mode 100644 index 00000000..97f12cc5 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_brown.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_brown2.mts b/mods/marinara/schematics/marinara_coralreef_brown2.mts new file mode 100644 index 00000000..e313db45 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_brown2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_brown3.mts b/mods/marinara/schematics/marinara_coralreef_brown3.mts new file mode 100644 index 00000000..97d7c13b Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_brown3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_green.mts b/mods/marinara/schematics/marinara_coralreef_green.mts new file mode 100644 index 00000000..b9f1f4a4 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_green.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_green2.mts b/mods/marinara/schematics/marinara_coralreef_green2.mts new file mode 100644 index 00000000..1c396a1c Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_green2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_green3.mts b/mods/marinara/schematics/marinara_coralreef_green3.mts new file mode 100644 index 00000000..8f8c8e96 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_green3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_pink.mts b/mods/marinara/schematics/marinara_coralreef_pink.mts new file mode 100644 index 00000000..a211c3de Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_pink.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_pink2.mts b/mods/marinara/schematics/marinara_coralreef_pink2.mts new file mode 100644 index 00000000..4575e366 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_pink2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_pink3.mts b/mods/marinara/schematics/marinara_coralreef_pink3.mts new file mode 100644 index 00000000..0f12f03b Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_pink3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_red.mts b/mods/marinara/schematics/marinara_coralreef_red.mts new file mode 100644 index 00000000..9bb87822 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_red.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_red2.mts b/mods/marinara/schematics/marinara_coralreef_red2.mts new file mode 100644 index 00000000..9152ec95 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_red2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_red3.mts b/mods/marinara/schematics/marinara_coralreef_red3.mts new file mode 100644 index 00000000..e92d040b Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_red3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_yellow.mts b/mods/marinara/schematics/marinara_coralreef_yellow.mts new file mode 100644 index 00000000..f192fed9 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_yellow.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_yellow2.mts b/mods/marinara/schematics/marinara_coralreef_yellow2.mts new file mode 100644 index 00000000..d5168bb7 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_yellow2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_yellow3.mts b/mods/marinara/schematics/marinara_coralreef_yellow3.mts new file mode 100644 index 00000000..7751186a Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_yellow3.mts differ diff --git a/mods/marinara/schematics/marinara_musslebank.mts b/mods/marinara/schematics/marinara_musslebank.mts new file mode 100644 index 00000000..5560d3b7 Binary files /dev/null and b/mods/marinara/schematics/marinara_musslebank.mts differ diff --git a/mods/marinara/schematics/marinara_musslebank2.mts b/mods/marinara/schematics/marinara_musslebank2.mts new file mode 100644 index 00000000..37ce8ca8 Binary files /dev/null and b/mods/marinara/schematics/marinara_musslebank2.mts differ diff --git a/mods/marinara/schematics/marinara_musslebank3.mts b/mods/marinara/schematics/marinara_musslebank3.mts new file mode 100644 index 00000000..fc2ca024 Binary files /dev/null and b/mods/marinara/schematics/marinara_musslebank3.mts differ diff --git a/mods/marinara/schematics/marinara_oister_bank.mts b/mods/marinara/schematics/marinara_oister_bank.mts new file mode 100644 index 00000000..c08f479a Binary files /dev/null and b/mods/marinara/schematics/marinara_oister_bank.mts differ diff --git a/mods/marinara/schematics/marinara_oister_bank2.mts b/mods/marinara/schematics/marinara_oister_bank2.mts new file mode 100644 index 00000000..9f961515 Binary files /dev/null and b/mods/marinara/schematics/marinara_oister_bank2.mts differ diff --git a/mods/marinara/schematics/marinara_oister_bank3.mts b/mods/marinara/schematics/marinara_oister_bank3.mts new file mode 100644 index 00000000..e4454084 Binary files /dev/null and b/mods/marinara/schematics/marinara_oister_bank3.mts differ diff --git a/mods/marinara/schematics/marinara_reed.mts b/mods/marinara/schematics/marinara_reed.mts new file mode 100644 index 00000000..179c4331 Binary files /dev/null and b/mods/marinara/schematics/marinara_reed.mts differ diff --git a/mods/marinara/schematics/marinara_reed2.mts b/mods/marinara/schematics/marinara_reed2.mts new file mode 100644 index 00000000..69800457 Binary files /dev/null and b/mods/marinara/schematics/marinara_reed2.mts differ diff --git a/mods/marinara/schematics/marinara_seagrass.mts b/mods/marinara/schematics/marinara_seagrass.mts new file mode 100644 index 00000000..0449b037 Binary files /dev/null and b/mods/marinara/schematics/marinara_seagrass.mts differ diff --git a/mods/marinara/schematics/marinara_seagrass_long.mts b/mods/marinara/schematics/marinara_seagrass_long.mts new file mode 100644 index 00000000..abaf4f5f Binary files /dev/null and b/mods/marinara/schematics/marinara_seagrass_long.mts differ diff --git a/mods/marinara/schematics/marinara_wreck.mts b/mods/marinara/schematics/marinara_wreck.mts new file mode 100644 index 00000000..f4d98494 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreck.mts differ diff --git a/mods/marinara/schematics/marinara_wreck2.mts b/mods/marinara/schematics/marinara_wreck2.mts new file mode 100644 index 00000000..d3f105d6 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreck2.mts differ diff --git a/mods/marinara/schematics/marinara_wreck3.mts b/mods/marinara/schematics/marinara_wreck3.mts new file mode 100644 index 00000000..915530f7 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreck3.mts differ diff --git a/mods/marinara/schematics/marinara_wreckbounty.mts b/mods/marinara/schematics/marinara_wreckbounty.mts new file mode 100644 index 00000000..7533fc7f Binary files /dev/null and b/mods/marinara/schematics/marinara_wreckbounty.mts differ diff --git a/mods/marinara/schematics/marinara_wreckbounty2.mts b/mods/marinara/schematics/marinara_wreckbounty2.mts new file mode 100644 index 00000000..55dea510 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreckbounty2.mts differ diff --git a/mods/marinara/schematics/marinara_wreckbounty3.mts b/mods/marinara/schematics/marinara_wreckbounty3.mts new file mode 100644 index 00000000..a741d450 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreckbounty3.mts differ diff --git a/mods/marinara/settingtypes.txt b/mods/marinara/settingtypes.txt new file mode 100644 index 00000000..84bb350f --- /dev/null +++ b/mods/marinara/settingtypes.txt @@ -0,0 +1,10 @@ +#marinara settings + +#If enabled, will clear all registered biomes. +marinara.clear_biomes (Enable to clear registered biomes. true / false) bool true + +#If enabled, will clear all registered decorations. +marinara.clear_decos (Enable to clear registered decorations. true / false) bool true + +#If enabled, will clear all registered ores. +marinara.clear_ores (Enable to clear registered ores. true / false) bool false diff --git a/mods/marinara/spawn.lua b/mods/marinara/spawn.lua new file mode 100644 index 00000000..3d33da3f --- /dev/null +++ b/mods/marinara/spawn.lua @@ -0,0 +1,940 @@ +local mpath = minetest.get_modpath("marinara") +local oceans_and_shore = {} +for _,biome in ipairs(asuna.biome_groups.below) do + table.insert(oceans_and_shore,biome) +end +for _,biome in ipairs(asuna.biome_groups.shore) do + table.insert(oceans_and_shore,biome) +end + +--- seashells + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:sand", + }, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.0075, + spread = {x = 80, y = 10, z = 80}, + seed = 3789, + octaves = 1, + persist = 1.0, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = oceans_and_shore, + y_max = 2, + y_min = 0, + decoration = { + "marinara:sand_with_seashells", + "marinara:sand_with_seashells_broken", + "marinara:sand_with_seashells_white", + "marinara:sand_with_seashells_yellow", + "marinara:sand_with_seashells_brown", + "marinara:sand_with_seashells_pink", + "marinara:sand_with_seashells_orange", + }, + }) + +--- wrecks + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.00001, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreck.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.00001, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreck2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.00001, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreck3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.00001, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreckbounty.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.00001, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreckbounty2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.00001, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreckbounty3.mts", + rotation = "random", +}) + +--- cold oceans + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock4.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock5.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock6.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0009, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -3, + y_min = -5, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock7.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0002, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_oister_bank.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0002, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_oister_bank2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_oister_bank3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_musslebank.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_musslebank2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_musslebank3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef4.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef5.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0007, + biomes = asuna.biome_groups.ocean_cold, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef6.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 300, y = 300, z = 300}, + seed = 87112, + octaves = 5, + persist = 0.9 + }, + biomes = asuna.biome_groups.all, + y_max = -11, + y_min = -16, + flags = "force_placement", + decoration = "marinara:sand_with_kelp", + param2 = 48, + param2_max = 96, + }) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand", "naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.25, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 4, + persist = 0.5 + }, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -3, + y_min = -36, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_seagrass.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand", "naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.25, + spread = {x = 100, y = 100, z = 100}, + seed = 87113, + octaves = 4, + persist = 0.5 + }, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -4, + y_min = -36, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_seagrass_long.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand", "naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.25, + spread = {x = 100, y = 100, z = 100}, + seed = 87114, + octaves = 4, + persist = 0.5 + }, + biomes = oceans_and_shore, + flags = "place_center_x,place_center_z,force_placement", + y_max = -0, + y_min = -3, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_alage.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.25, + spread = {x = 100, y = 100, z = 100}, + seed = 87115, + octaves = 4, + persist = 0.5 + }, + biomes = asuna.biome_groups.all, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -5, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_brownalage.mts", + rotation = "random", +}) + +--- tropical oceans + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_blue.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_blue2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_blue3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_brown.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_brown2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_brown3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_green.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_green2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_green3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_pink.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_pink2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_pink3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_red.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_red2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_red3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_yellow.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_yellow2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "default:sand", + "everness:mineral_sand", + }, + sidelen = 16, + fill_ratio = 0.0003, + biomes = asuna.biome_groups.ocean_tropical, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_yellow3.mts", + rotation = "random", +}) diff --git a/mods/marinara/textures/marinara_alage.png b/mods/marinara/textures/marinara_alage.png new file mode 100644 index 00000000..5f27fe93 Binary files /dev/null and b/mods/marinara/textures/marinara_alage.png differ diff --git a/mods/marinara/textures/marinara_alage_inv.png b/mods/marinara/textures/marinara_alage_inv.png new file mode 100644 index 00000000..3bcd3ea8 Binary files /dev/null and b/mods/marinara/textures/marinara_alage_inv.png differ diff --git a/mods/marinara/textures/marinara_bootynode_back.png b/mods/marinara/textures/marinara_bootynode_back.png new file mode 100644 index 00000000..8d9e6720 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_back.png differ diff --git a/mods/marinara/textures/marinara_bootynode_bottom.png b/mods/marinara/textures/marinara_bootynode_bottom.png new file mode 100644 index 00000000..b71b3c09 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_bottom.png differ diff --git a/mods/marinara/textures/marinara_bootynode_front.png b/mods/marinara/textures/marinara_bootynode_front.png new file mode 100644 index 00000000..3a4e9873 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_front.png differ diff --git a/mods/marinara/textures/marinara_bootynode_left.png b/mods/marinara/textures/marinara_bootynode_left.png new file mode 100644 index 00000000..7db42438 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_left.png differ diff --git a/mods/marinara/textures/marinara_bootynode_right.png b/mods/marinara/textures/marinara_bootynode_right.png new file mode 100644 index 00000000..222d0284 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_right.png differ diff --git a/mods/marinara/textures/marinara_bootynode_top.png b/mods/marinara/textures/marinara_bootynode_top.png new file mode 100644 index 00000000..5687a86d Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_top.png differ diff --git a/mods/marinara/textures/marinara_brownalage.png b/mods/marinara/textures/marinara_brownalage.png new file mode 100644 index 00000000..2a598479 Binary files /dev/null and b/mods/marinara/textures/marinara_brownalage.png differ diff --git a/mods/marinara/textures/marinara_brownalage_inv.png b/mods/marinara/textures/marinara_brownalage_inv.png new file mode 100644 index 00000000..0e62467b Binary files /dev/null and b/mods/marinara/textures/marinara_brownalage_inv.png differ diff --git a/mods/marinara/textures/marinara_coastbrick.png b/mods/marinara/textures/marinara_coastbrick.png new file mode 100644 index 00000000..4c7141ce Binary files /dev/null and b/mods/marinara/textures/marinara_coastbrick.png differ diff --git a/mods/marinara/textures/marinara_coastbrick_alage.png b/mods/marinara/textures/marinara_coastbrick_alage.png new file mode 100644 index 00000000..fccd2e73 Binary files /dev/null and b/mods/marinara/textures/marinara_coastbrick_alage.png differ diff --git a/mods/marinara/textures/marinara_coastrock.png b/mods/marinara/textures/marinara_coastrock.png new file mode 100644 index 00000000..517e2f66 Binary files /dev/null and b/mods/marinara/textures/marinara_coastrock.png differ diff --git a/mods/marinara/textures/marinara_coastrock_alage.png b/mods/marinara/textures/marinara_coastrock_alage.png new file mode 100644 index 00000000..3d74c398 Binary files /dev/null and b/mods/marinara/textures/marinara_coastrock_alage.png differ diff --git a/mods/marinara/textures/marinara_hardcoral.png b/mods/marinara/textures/marinara_hardcoral.png new file mode 100644 index 00000000..b49ac1fa Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_blue.png b/mods/marinara/textures/marinara_hardcoral_blue.png new file mode 100644 index 00000000..0055bfd9 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_blue.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_brown.png b/mods/marinara/textures/marinara_hardcoral_brown.png new file mode 100644 index 00000000..1f2d0343 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_brown.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_green.png b/mods/marinara/textures/marinara_hardcoral_green.png new file mode 100644 index 00000000..93c77aa7 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_green.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_pink.png b/mods/marinara/textures/marinara_hardcoral_pink.png new file mode 100644 index 00000000..8fdfc9d6 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_pink.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_red.png b/mods/marinara/textures/marinara_hardcoral_red.png new file mode 100644 index 00000000..4d82563d Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_red.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_violet.png b/mods/marinara/textures/marinara_hardcoral_violet.png new file mode 100644 index 00000000..8b9e56aa Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_violet.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_yellow.png b/mods/marinara/textures/marinara_hardcoral_yellow.png new file mode 100644 index 00000000..3a81a24e Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_yellow.png differ diff --git a/mods/marinara/textures/marinara_kelp.png b/mods/marinara/textures/marinara_kelp.png new file mode 100644 index 00000000..d2e40374 Binary files /dev/null and b/mods/marinara/textures/marinara_kelp.png differ diff --git a/mods/marinara/textures/marinara_kelp_inv.png b/mods/marinara/textures/marinara_kelp_inv.png new file mode 100644 index 00000000..1b0f70be Binary files /dev/null and b/mods/marinara/textures/marinara_kelp_inv.png differ diff --git a/mods/marinara/textures/marinara_mussles.png b/mods/marinara/textures/marinara_mussles.png new file mode 100644 index 00000000..fdb1ae5d Binary files /dev/null and b/mods/marinara/textures/marinara_mussles.png differ diff --git a/mods/marinara/textures/marinara_mussles_cooked.png b/mods/marinara/textures/marinara_mussles_cooked.png new file mode 100644 index 00000000..f36ce6ce Binary files /dev/null and b/mods/marinara/textures/marinara_mussles_cooked.png differ diff --git a/mods/marinara/textures/marinara_mussles_inv.png b/mods/marinara/textures/marinara_mussles_inv.png new file mode 100644 index 00000000..190743dc Binary files /dev/null and b/mods/marinara/textures/marinara_mussles_inv.png differ diff --git a/mods/marinara/textures/marinara_oisterbank.png b/mods/marinara/textures/marinara_oisterbank.png new file mode 100644 index 00000000..73aff303 Binary files /dev/null and b/mods/marinara/textures/marinara_oisterbank.png differ diff --git a/mods/marinara/textures/marinara_rawoisters.png b/mods/marinara/textures/marinara_rawoisters.png new file mode 100644 index 00000000..4c9aca33 Binary files /dev/null and b/mods/marinara/textures/marinara_rawoisters.png differ diff --git a/mods/marinara/textures/marinara_reed.png b/mods/marinara/textures/marinara_reed.png new file mode 100644 index 00000000..cb45a872 Binary files /dev/null and b/mods/marinara/textures/marinara_reed.png differ diff --git a/mods/marinara/textures/marinara_reed_node.png b/mods/marinara/textures/marinara_reed_node.png new file mode 100644 index 00000000..e0c52b5c Binary files /dev/null and b/mods/marinara/textures/marinara_reed_node.png differ diff --git a/mods/marinara/textures/marinara_reed_node_top.png b/mods/marinara/textures/marinara_reed_node_top.png new file mode 100644 index 00000000..374cae29 Binary files /dev/null and b/mods/marinara/textures/marinara_reed_node_top.png differ diff --git a/mods/marinara/textures/marinara_reed_root.png b/mods/marinara/textures/marinara_reed_root.png new file mode 100644 index 00000000..43de22f3 Binary files /dev/null and b/mods/marinara/textures/marinara_reed_root.png differ diff --git a/mods/marinara/textures/marinara_sea worm.png b/mods/marinara/textures/marinara_sea worm.png new file mode 100644 index 00000000..76b0a0cf Binary files /dev/null and b/mods/marinara/textures/marinara_sea worm.png differ diff --git a/mods/marinara/textures/marinara_sea worm2.png b/mods/marinara/textures/marinara_sea worm2.png new file mode 100644 index 00000000..60fab8bf Binary files /dev/null and b/mods/marinara/textures/marinara_sea worm2.png differ diff --git a/mods/marinara/textures/marinara_sea worm3.png b/mods/marinara/textures/marinara_sea worm3.png new file mode 100644 index 00000000..20917bc8 Binary files /dev/null and b/mods/marinara/textures/marinara_sea worm3.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle.png b/mods/marinara/textures/marinara_seaanemone_tentacle.png new file mode 100644 index 00000000..9ee5ee5c Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle2.png b/mods/marinara/textures/marinara_seaanemone_tentacle2.png new file mode 100644 index 00000000..ebaa1fe0 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle2.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle2_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle2_inv.png new file mode 100644 index 00000000..1c11f75a Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle2_inv.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle3.png b/mods/marinara/textures/marinara_seaanemone_tentacle3.png new file mode 100644 index 00000000..95bc0131 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle3.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle3_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle3_inv.png new file mode 100644 index 00000000..10edde9e Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle3_inv.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle4.png b/mods/marinara/textures/marinara_seaanemone_tentacle4.png new file mode 100644 index 00000000..9f50cfa4 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle4.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle4_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle4_inv.png new file mode 100644 index 00000000..6ed4cbb0 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle4_inv.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle_inv.png new file mode 100644 index 00000000..54a9d02a Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle_inv.png differ diff --git a/mods/marinara/textures/marinara_seagrass.png b/mods/marinara/textures/marinara_seagrass.png new file mode 100644 index 00000000..bca7214a Binary files /dev/null and b/mods/marinara/textures/marinara_seagrass.png differ diff --git a/mods/marinara/textures/marinara_seagrass_inv.png b/mods/marinara/textures/marinara_seagrass_inv.png new file mode 100644 index 00000000..fd7a5d18 Binary files /dev/null and b/mods/marinara/textures/marinara_seagrass_inv.png differ diff --git a/mods/marinara/textures/marinara_seagrass_top.png b/mods/marinara/textures/marinara_seagrass_top.png new file mode 100644 index 00000000..f5a7331f Binary files /dev/null and b/mods/marinara/textures/marinara_seagrass_top.png differ diff --git a/mods/marinara/textures/marinara_seapocks.png b/mods/marinara/textures/marinara_seapocks.png new file mode 100644 index 00000000..00bd0583 Binary files /dev/null and b/mods/marinara/textures/marinara_seapocks.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile.png b/mods/marinara/textures/marinara_seashellmobile.png new file mode 100644 index 00000000..f9fb8838 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_broken.png b/mods/marinara/textures/marinara_seashellmobile_broken.png new file mode 100644 index 00000000..c7077033 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_broken.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_brown.png b/mods/marinara/textures/marinara_seashellmobile_brown.png new file mode 100644 index 00000000..6946716f Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_brown.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_orange.png b/mods/marinara/textures/marinara_seashellmobile_orange.png new file mode 100644 index 00000000..eb3145c4 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_orange.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_pink.png b/mods/marinara/textures/marinara_seashellmobile_pink.png new file mode 100644 index 00000000..6d50ca35 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_pink.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_white.png b/mods/marinara/textures/marinara_seashellmobile_white.png new file mode 100644 index 00000000..73d44d62 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_white.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_yellow.png b/mods/marinara/textures/marinara_seashellmobile_yellow.png new file mode 100644 index 00000000..32193ad2 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_yellow.png differ diff --git a/mods/marinara/textures/marinara_seashells.png b/mods/marinara/textures/marinara_seashells.png new file mode 100644 index 00000000..45832898 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells.png differ diff --git a/mods/marinara/textures/marinara_seashells_broken.png b/mods/marinara/textures/marinara_seashells_broken.png new file mode 100644 index 00000000..3ce5cc40 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_broken.png differ diff --git a/mods/marinara/textures/marinara_seashells_brown.png b/mods/marinara/textures/marinara_seashells_brown.png new file mode 100644 index 00000000..200cfd5f Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_brown.png differ diff --git a/mods/marinara/textures/marinara_seashells_orange.png b/mods/marinara/textures/marinara_seashells_orange.png new file mode 100644 index 00000000..62420181 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_orange.png differ diff --git a/mods/marinara/textures/marinara_seashells_pink.png b/mods/marinara/textures/marinara_seashells_pink.png new file mode 100644 index 00000000..8f96200f Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_pink.png differ diff --git a/mods/marinara/textures/marinara_seashells_white.png b/mods/marinara/textures/marinara_seashells_white.png new file mode 100644 index 00000000..50989890 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_white.png differ diff --git a/mods/marinara/textures/marinara_seashells_yellow.png b/mods/marinara/textures/marinara_seashells_yellow.png new file mode 100644 index 00000000..aa9828fb Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_yellow.png differ diff --git a/mods/marinara/textures/marinara_seaworm.png b/mods/marinara/textures/marinara_seaworm.png new file mode 100644 index 00000000..d6420e28 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm.png differ diff --git a/mods/marinara/textures/marinara_seaworm2.png b/mods/marinara/textures/marinara_seaworm2.png new file mode 100644 index 00000000..e053455f Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm2.png differ diff --git a/mods/marinara/textures/marinara_seaworm2_inv.png b/mods/marinara/textures/marinara_seaworm2_inv.png new file mode 100644 index 00000000..dc28fd90 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm2_inv.png differ diff --git a/mods/marinara/textures/marinara_seaworm3.png b/mods/marinara/textures/marinara_seaworm3.png new file mode 100644 index 00000000..cda45f1e Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm3.png differ diff --git a/mods/marinara/textures/marinara_seaworm3_inv.png b/mods/marinara/textures/marinara_seaworm3_inv.png new file mode 100644 index 00000000..820514a0 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm3_inv.png differ diff --git a/mods/marinara/textures/marinara_seaworm_inv.png b/mods/marinara/textures/marinara_seaworm_inv.png new file mode 100644 index 00000000..f4bfbe22 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm_inv.png differ diff --git a/mods/marinara/textures/marinara_softcoral.png b/mods/marinara/textures/marinara_softcoral.png new file mode 100644 index 00000000..0119b3b6 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral.png differ diff --git a/mods/marinara/textures/marinara_softcoral_brown.png b/mods/marinara/textures/marinara_softcoral_brown.png new file mode 100644 index 00000000..cae94ae5 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_brown.png differ diff --git a/mods/marinara/textures/marinara_softcoral_brown_inv.png b/mods/marinara/textures/marinara_softcoral_brown_inv.png new file mode 100644 index 00000000..00dad84b Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_brown_inv.png differ diff --git a/mods/marinara/textures/marinara_softcoral_green.png b/mods/marinara/textures/marinara_softcoral_green.png new file mode 100644 index 00000000..d59ceae1 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_green.png differ diff --git a/mods/marinara/textures/marinara_softcoral_red.png b/mods/marinara/textures/marinara_softcoral_red.png new file mode 100644 index 00000000..d2664235 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_red.png differ diff --git a/mods/marinara/textures/marinara_softcoral_white.png b/mods/marinara/textures/marinara_softcoral_white.png new file mode 100644 index 00000000..65ff9d3e Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_white.png differ diff --git a/mods/marinara/textures/marinara_softcoral_white_inv.png b/mods/marinara/textures/marinara_softcoral_white_inv.png new file mode 100644 index 00000000..63bce811 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_white_inv.png differ diff --git a/mods/marinara/textures/marinara_softcoral_yellow.png b/mods/marinara/textures/marinara_softcoral_yellow.png new file mode 100644 index 00000000..d82685f9 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_yellow.png differ diff --git a/mods/marinara/textures/marinara_softcoral_yellow_inv.png b/mods/marinara/textures/marinara_softcoral_yellow_inv.png new file mode 100644 index 00000000..c2a215ce Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_yellow_inv.png differ diff --git a/mods/minetest_game/README.md b/mods/minetest_game/README.md new file mode 100644 index 00000000..fc51ad48 --- /dev/null +++ b/mods/minetest_game/README.md @@ -0,0 +1,50 @@ +# Minetest Game + +**NOTE:** This copy of Minetest Game has been heavily modified to act as a modpack for +Asuna. See [Minetest Game](https://content.minetest.net/packages/Minetest/minetest_game/) +at ContentDB for a playable standalone version of Minetest Game. + +[![ContentDB](https://content.luanti.org/packages/Minetest/minetest_game/shields/title/)](https://content.luanti.org/packages/Minetest/minetest_game/) + +Minetest Game (abbreviated MTG) is a simple and peaceful sandbox game, with no +real goals or built-in enemy mobs. + +While it provides a basic gameplay experience out of the box, it is best played +with mods. + +Minetest Game is in perpetual maintenance-only mode, meaning it will not see new +gameplay features or anything else that breaks compatibility (see +[#2710](https://github.com/minetest/minetest_game/issues/2710)). + +## Installation + +### ContentDB + +* Content > Browse Online Content +* Search for "[Minetest Game](https://content.luanti.org/packages/Minetest/minetest_game/)" +* Click Install + +### Manually + +- Unzip the archive, rename the folder to `minetest_game` and +place it in `.../minetest/games/` + +- GNU/Linux: If you use a system-wide installation place it in `~/.minetest/games/`. + +The Luanti engine can be found at [GitHub](https://github.com/minetest/minetest). + +For further information or help, see: [Installing Mods](https://wiki.luanti.org/Installing_Mods). + +## Compatibility + +As of January 2024 Minetest Game follows a **rolling release** model with new changes being automatically +published on ContentDB every day. + +There are no stable releases or tags, all existing ones are considered legacy. + +Minetest Game is always compatible to the latest stable release of the engine. +Older releases may be supported too depending on circumstances. + +## Licensing + +See `LICENSE.txt` diff --git a/mods/minetest_game/beds/README.txt b/mods/minetest_game/beds/README.txt new file mode 100644 index 00000000..5c452da8 --- /dev/null +++ b/mods/minetest_game/beds/README.txt @@ -0,0 +1,30 @@ +Minetest Game mod: beds +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by BlockMen (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +BlockMen (CC BY-SA 3.0) + All textures unless otherwise noted + +TumeniNodes (CC BY-SA 3.0) + beds_bed_under.png + +This mod adds a bed which allows players to skip the night. +To sleep, right click on the bed. If playing in singleplayer mode the night gets skipped +immediately. If playing multiplayer you get shown how many other players are in bed too, +if all players are sleeping the night gets skipped. The night skip can be forced if more +than half of the players are lying in bed and use this option. + +Another feature is a controlled respawning. If you have slept in bed (not just lying in +it) your respawn point is set to the beds location and you will respawn there after +death. +You can disable the respawn at beds by setting "enable_bed_respawn = false" in +minetest.conf. +You can disable the night skip feature by setting "enable_bed_night_skip = false" in +minetest.conf or by using the /set command in-game. diff --git a/mods/minetest_game/beds/api.lua b/mods/minetest_game/beds/api.lua new file mode 100644 index 00000000..2214465b --- /dev/null +++ b/mods/minetest_game/beds/api.lua @@ -0,0 +1,204 @@ +-- Removes a node without calling on on_destruct() +-- We use this to mess with bed nodes without causing unwanted recursion. +local function remove_no_destruct(pos) + minetest.swap_node(pos, {name = "air"}) + minetest.remove_node(pos) -- Now clear the meta + minetest.check_for_falling(pos) +end + +--- returns the position of the other bed half (or nil on failure) +local function get_other_bed_pos(pos, n) + local node = core.get_node(pos) + local dir = core.facedir_to_dir(node.param2) + if not dir then + return -- There are 255 possible param2 values. Ignore bad ones. + end + local other + if n == 2 then + other = vector.subtract(pos, dir) + elseif n == 1 then + other = vector.add(pos, dir) + else + return nil + end + + local onode = core.get_node(other) + if onode.param2 == node.param2 and core.get_item_group(onode.name, "bed") ~= 0 then + return other + end + return nil +end + +local function destruct_bed(pos, n) + local other = get_other_bed_pos(pos, n) + if other then + remove_no_destruct(other) + beds.remove_spawns_at(other) + end + beds.remove_spawns_at(pos) +end + +function beds.register_bed(name, def) + minetest.register_node(name .. "_bottom", { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + drawtype = "nodebox", + tiles = def.tiles.bottom, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + stack_max = 1, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.bottom, + }, + selection_box = { + type = "fixed", + fixed = def.selectionbox, + }, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local pos + if udef and udef.buildable_to then + pos = under + else + pos = pointed_thing.above + end + + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + if not node_def or not node_def.buildable_to then + return itemstack + end + + local dir = placer and placer:get_look_dir() and + minetest.dir_to_facedir(placer:get_look_dir()) or 0 + local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) + + if minetest.is_protected(botpos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(botpos, player_name) + return itemstack + end + + local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] + if not botdef or not botdef.buildable_to then + return itemstack + end + + minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) + minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + end, + + on_destruct = function(pos) + destruct_bed(pos, 1) + end, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + beds.on_rightclick(pos, clicker) + return itemstack + end, + + on_rotate = function(pos, node, user, _, new_param2) + local dir = minetest.facedir_to_dir(node.param2) + if not dir then + return false + end + -- old position of the top node + local p = vector.add(pos, dir) + local node2 = minetest.get_node_or_nil(p) + if not node2 or minetest.get_item_group(node2.name, "bed") ~= 2 or + node.param2 ~= node2.param2 then + return false + end + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + if new_param2 % 32 > 3 then + return false + end + -- new position of the top node + local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) + local node3 = minetest.get_node_or_nil(newp) + local node_def = node3 and minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then + return false + end + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + node.param2 = new_param2 + remove_no_destruct(p) + minetest.set_node(pos, node) + minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) + return true + end, + can_dig = function(pos, player) + return beds.can_dig(pos) + end, + }) + + minetest.register_node(name .. "_top", { + drawtype = "nodebox", + tiles = def.tiles.top, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2, + not_in_creative_inventory = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + drop = "", + node_box = { + type = "fixed", + fixed = def.nodebox.top, + }, + selection_box = { + type = "fixed", + -- Small selection box to allow digging stray top nodes + fixed = {-0.3, -0.3, -0.3, 0.3, -0.1, 0.3}, + }, + on_destruct = function(pos) + destruct_bed(pos, 2) + end, + can_dig = function(pos, player) + local other = get_other_bed_pos(pos, 2) + return (not other) or beds.can_dig(other) + end, + }) + + minetest.register_alias(name, name .. "_bottom") + + minetest.register_craft({ + output = name, + recipe = def.recipe + }) +end diff --git a/mods/minetest_game/beds/beds.lua b/mods/minetest_game/beds/beds.lua new file mode 100644 index 00000000..e9051076 --- /dev/null +++ b/mods/minetest_game/beds/beds.lua @@ -0,0 +1,109 @@ +-- beds/beds.lua + +-- support for MT game translation. +local S = beds.get_translator + +-- Fancy shaped bed + +beds.register_bed("beds:fancy_bed", { + description = S("Fancy Bed"), + inventory_image = "beds_bed_fancy.png", + wield_image = "beds_bed_fancy.png", + tiles = { + bottom = { + "beds_bed_top1.png", + "beds_bed_under.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "beds_bed_foot.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "beds_bed_under.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +-- Simple shaped bed + +beds.register_bed("beds:bed", { + description = S("Simple Bed"), + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformFX", + "blank.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformFX", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + }, +}) + +-- Aliases for PilzAdam's beds mod + +minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") +minetest.register_alias("beds:bed_top_red", "beds:bed_top") + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "beds:fancy_bed_bottom", + burntime = 13, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "beds:bed_bottom", + burntime = 12, +}) diff --git a/mods/minetest_game/beds/functions.lua b/mods/minetest_game/beds/functions.lua new file mode 100644 index 00000000..6ce90f2c --- /dev/null +++ b/mods/minetest_game/beds/functions.lua @@ -0,0 +1,304 @@ +local pi = math.pi +local is_sp = minetest.is_singleplayer() +local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") +if enable_respawn == nil then + enable_respawn = true +end + +-- support for MT game translation. +local S = beds.get_translator + +-- Helper functions + +local function get_look_yaw(pos) + local rotation = minetest.get_node(pos).param2 + if rotation > 3 then + rotation = rotation % 4 -- Mask colorfacedir values + end + if rotation == 1 then + return pi / 2, rotation + elseif rotation == 3 then + return -pi / 2, rotation + elseif rotation == 0 then + return pi, rotation + else + return 0, rotation + end +end + +local function is_night_skip_enabled() + local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") + if enable_night_skip == nil then + enable_night_skip = true + end + return enable_night_skip +end + +local function check_in_beds(players) + local in_bed = beds.player + if not players then + players = minetest.get_connected_players() + end + + for n, player in ipairs(players) do + local name = player:get_player_name() + if not in_bed[name] then + return false + end + end + + return #players > 0 +end + +local function lay_down(player, pos, bed_pos, state, skip) + local name = player:get_player_name() + local hud_flags = player:hud_get_flags() + + if not player or not name then + return + end + + -- stand up + if state ~= nil and not state then + if not beds.player[name] then + -- player not in bed, do nothing + return false + end + beds.bed_position[name] = nil + -- skip here to prevent sending player specific changes (used for leaving players) + if skip then + return + end + player:set_pos(beds.pos[name]) + + -- physics, eye_offset, etc + local physics_override = beds.player[name].physics_override + beds.player[name] = nil + player:set_physics_override({ + speed = physics_override.speed, + jump = physics_override.jump, + gravity = physics_override.gravity + }) + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_look_horizontal(math.random(1, 180) / 100) + player_api.player_attached[name] = false + hud_flags.wielditem = true + player_api.set_animation(player, "stand" , 30) + + -- lay down + else + + -- Check if bed is occupied + for _, other_pos in pairs(beds.bed_position) do + if vector.distance(bed_pos, other_pos) < 0.1 then + minetest.chat_send_player(name, S("This bed is already occupied!")) + return false + end + end + + -- Check if player is moving + if vector.length(player:get_velocity()) > 0.05 then + minetest.chat_send_player(name, S("You have to stop moving before going to bed!")) + return false + end + + -- Check if player is attached to an object + if player:get_attach() then + return false + end + + if beds.player[name] then + -- player already in bed, do nothing + return false + end + + beds.pos[name] = pos + beds.bed_position[name] = bed_pos + beds.player[name] = {physics_override = player:get_physics_override()} + + local yaw, param2 = get_look_yaw(bed_pos) + player:set_look_horizontal(yaw) + local dir = minetest.facedir_to_dir(param2) + -- p.y is just above the nodebox height of the 'Simple Bed' (the highest bed), + -- to avoid sinking down through the bed. + local p = { + x = bed_pos.x + dir.x / 2, + y = bed_pos.y + 0.07, + z = bed_pos.z + dir.z / 2 + } + player:set_physics_override({speed = 0, jump = 0, gravity = 0}) + player:set_pos(p) + player_api.player_attached[name] = true + hud_flags.wielditem = false + player_api.set_animation(player, "lay" , 0) + end + + player:hud_set_flags(hud_flags) +end + +local function get_player_in_bed_count() + local c = 0 + for _, _ in pairs(beds.player) do + c = c + 1 + end + return c +end + +local function update_formspecs(finished) + local ges = #minetest.get_connected_players() + local player_in_bed = get_player_in_bed_count() + local is_majority = (ges / 2) < player_in_bed + + local form_n + local esc = minetest.formspec_escape + if finished then + form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Good morning.")) .. "]" + else + form_n = beds.formspec .. "label[2.2,9;" .. + esc(S("@1 of @2 players are in bed", player_in_bed, ges)) .. "]" + if is_majority and is_night_skip_enabled() then + form_n = form_n .. "button_exit[2,6;4,0.75;force;" .. + esc(S("Force night skip")) .. "]" + end + end + + for name,_ in pairs(beds.player) do + minetest.show_formspec(name, "beds_form", form_n) + end +end + + +-- Public functions + +function beds.kick_players() + for name, _ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + lay_down(player, nil, nil, false) + end +end + +function beds.skip_night() + minetest.set_timeofday(0.23) +end + +local update_scheduled = false +local function schedule_update() + if update_scheduled then + -- there already is an update scheduled; don't schedule more to prevent races + return + end + update_scheduled = true + minetest.after(2, function() + update_scheduled = false + if not is_sp then + update_formspecs(is_night_skip_enabled()) + end + if is_night_skip_enabled() then + -- skip the night and let all players stand up + beds.skip_night() + beds.kick_players() + end + end) +end + +function beds.on_rightclick(pos, player) + local name = player:get_player_name() + local ppos = player:get_pos() + local tod = minetest.get_timeofday() + + if tod > beds.day_interval.start and tod < beds.day_interval.finish then + if beds.player[name] then + lay_down(player, nil, nil, false) + end + minetest.chat_send_player(name, S("You can only sleep at night.")) + return + end + + -- move to bed + if not beds.player[name] then + lay_down(player, ppos, pos) + beds.set_spawns() -- save respawn positions when entering bed + else + lay_down(player, nil, nil, false) + end + + if not is_sp then + update_formspecs(false) + end + + if check_in_beds() then + schedule_update() + end +end + +function beds.can_dig(bed_pos) + -- Check all players in bed which one is at the expected position + for _, player_bed_pos in pairs(beds.bed_position) do + if vector.equals(bed_pos, player_bed_pos) then + return false + end + end + return true +end + +-- Callbacks +-- Only register respawn callback if respawn enabled +if enable_respawn then + -- Respawn player at bed if valid position is found + spawn.register_on_spawn(function(player, is_new) + local pos = beds.spawn[player:get_player_name()] + if pos then + player:set_pos(pos) + return true + end + end) +end + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + lay_down(player, nil, nil, false, true) + beds.player[name] = nil + if check_in_beds() then + schedule_update() + end +end) + +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + local in_bed = beds.player + local pos = player:get_pos() + local yaw = get_look_yaw(pos) + + if in_bed[name] then + lay_down(player, nil, pos, false) + player:set_look_horizontal(yaw) + player:set_pos(pos) + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "beds_form" then + return + end + + -- Because "Force night skip" button is a button_exit, it will set fields.quit + -- and lay_down call will change value of player_in_bed, so it must be taken + -- earlier. + local last_player_in_bed = get_player_in_bed_count() + + if fields.quit or fields.leave then + lay_down(player, nil, nil, false) + update_formspecs(false) + end + + if fields.force then + local is_majority = (#minetest.get_connected_players() / 2) < last_player_in_bed + if is_majority and is_night_skip_enabled() then + update_formspecs(true) + beds.skip_night() + beds.kick_players() + else + update_formspecs(false) + end + end +end) diff --git a/mods/minetest_game/beds/init.lua b/mods/minetest_game/beds/init.lua new file mode 100644 index 00000000..14ced8ba --- /dev/null +++ b/mods/minetest_game/beds/init.lua @@ -0,0 +1,31 @@ +-- beds/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("beds") +local esc = minetest.formspec_escape + +beds = {} +beds.player = {} +beds.bed_position = {} +beds.pos = {} +beds.spawn = {} +beds.get_translator = S + +beds.formspec = "size[8,11;true]" .. + "no_prepend[]" .. + "bgcolor[#080808BB;true]" .. + "button_exit[2,10;4,0.75;leave;" .. esc(S("Leave Bed")) .. "]" + +beds.day_interval = { + start = 0.2, + finish = 0.805, +} + +local modpath = minetest.get_modpath("beds") + +-- Load files + +dofile(modpath .. "/functions.lua") +dofile(modpath .. "/api.lua") +dofile(modpath .. "/beds.lua") +dofile(modpath .. "/spawns.lua") diff --git a/mods/minetest_game/beds/license.txt b/mods/minetest_game/beds/license.txt new file mode 100644 index 00000000..383047d1 --- /dev/null +++ b/mods/minetest_game/beds/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2018 TumeniNodes + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/beds/locale/beds.de.tr b/mods/minetest_game/beds/locale/beds.de.tr new file mode 100644 index 00000000..3f2c959e --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.de.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Schickes Bett +Simple Bed=Schlichtes Bett +This bed is already occupied!=Dieses Bett ist bereits belegt! +You have to stop moving before going to bed!=Sie müssen stehen bleiben, bevor Sie zu Bett gehen können! +Good morning.=Guten Morgen. +@1 of @2 players are in bed=@1 von @2 Spielern sind im Bett +Force night skip=Überspringen der Nacht erzwingen +You can only sleep at night.=Sie können nur nachts schlafen. +Leave Bed=Bett verlassen diff --git a/mods/minetest_game/beds/locale/beds.eo.tr b/mods/minetest_game/beds/locale/beds.eo.tr new file mode 100644 index 00000000..3a4ad2f8 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.eo.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Luksa lito +Simple Bed=Simpla lito +This bed is already occupied!=Tiu lito jam estas okupata! +You have to stop moving before going to bed!=Vi ĉesu moviÄi por enlitiÄi! +Good morning.=Bonan matenon. +@1 of @2 players are in bed=@1 el @2 ludantoj estas en lito +Force night skip=Devigi noktan salton +You can only sleep at night.=Vi povas dormi nur nokte. +Leave Bed=EllitiÄi diff --git a/mods/minetest_game/beds/locale/beds.es.tr b/mods/minetest_game/beds/locale/beds.es.tr new file mode 100644 index 00000000..8ef0db73 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.es.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Cama de lujo +Simple Bed=Cama sencilla +This bed is already occupied!=Esta cama esta ocupada +You have to stop moving before going to bed!=Deja de moverte o no podras acostarte +Good morning.=Buenos días. +@1 of @2 players are in bed=@1 de @2 jugadores están durmiendo +Force night skip=Forzar hacer de dia +You can only sleep at night.=Sólo puedes dormir por la noche. +Leave Bed=Levantarse diff --git a/mods/minetest_game/beds/locale/beds.fr.tr b/mods/minetest_game/beds/locale/beds.fr.tr new file mode 100644 index 00000000..43c06e3c --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.fr.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Lit chic +Simple Bed=Lit simple +This bed is already occupied!=Ce lit est déjà occupé ! +You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher ! +Good morning.=Bonjour. +@1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit +Force night skip=Forcer le passage de la nuit +You can only sleep at night.=Vous ne pouvez dormir que la nuit. +Leave Bed=Se lever du lit diff --git a/mods/minetest_game/beds/locale/beds.id.tr b/mods/minetest_game/beds/locale/beds.id.tr new file mode 100644 index 00000000..d87c933c --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.id.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Ranjang Mewah +Simple Bed=Ranjang Sederhana +This bed is already occupied!=Ranjang telah terisi! +You have to stop moving before going to bed!=Anda harus diam untuk tidur! +Good morning.=Selamat pagi. +@1 of @2 players are in bed=@1 dari @2 pemain sedang tidur +Force night skip=Paksa lewati malam +You can only sleep at night.=Anda hanya bisa tidur pada waktu malam. +Leave Bed=Tinggalkan Ranjang diff --git a/mods/minetest_game/beds/locale/beds.it.tr b/mods/minetest_game/beds/locale/beds.it.tr new file mode 100644 index 00000000..8f4e14ea --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.it.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Letto decorato +Simple Bed=Letto semplice +This bed is already occupied!= +You have to stop moving before going to bed!= +Good morning.= +@1 of @2 players are in bed= +Force night skip= +You can only sleep at night.= +Leave Bed=Alzati dal letto diff --git a/mods/minetest_game/beds/locale/beds.ja.tr b/mods/minetest_game/beds/locale/beds.ja.tr new file mode 100644 index 00000000..50344566 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.ja.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=ファンシーãªãƒ™ãƒƒãƒ‰ +Simple Bed=シンプルãªãƒ™ãƒƒãƒ‰ +This bed is already occupied!=ベッドã¯ã™ã§ã«ä½¿ã‚れã¦ã„ã¾ã™ï¼ +You have to stop moving before going to bed!=å¯ã‚‹ã¨ãã¯å‹•ã‹ãªã„ã§ãã ã•ã„ï¼ +Good morning.=ãŠã¯ã‚ˆã†ã”ã–ã„ã¾ã™ã€‚ +@1 of @2 players are in bed=ベッドã«@1 / @2人ã„ã¾ã™ +Force night skip=強制的ã«å¤œã‚’スキップã—ã¾ã™ +You can only sleep at night.=夜ã—ã‹å¯ã‚Œã¾ã›ã‚“。 +Leave Bed=ベッドã‹ã‚‰å‡ºã¾ã™ diff --git a/mods/minetest_game/beds/locale/beds.jbo.tr b/mods/minetest_game/beds/locale/beds.jbo.tr new file mode 100644 index 00000000..a72f686c --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.jbo.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=lo selja'i ckana +Simple Bed=lo sampu ckana +This bed is already occupied!=.i lo ti ckana cu canlu +You have to stop moving before going to bed!=lo nu do cando cu sarcu lo nu do sipna +Good morning.=.i .uise'inai cerni +@1 of @2 players are in bed=.i @1 cmima be lu'i @2 le pilno cu vreta lo ckana +Force night skip=bapli le nu co'u nicte +You can only sleep at night.=.i steci le ka nicte kei fa le ka do kakne le ka sipna ca pa ckaji be ce'u +Leave Bed=cliva lo ckana diff --git a/mods/minetest_game/beds/locale/beds.lv.tr b/mods/minetest_game/beds/locale/beds.lv.tr new file mode 100644 index 00000000..cea63ffb --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.lv.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Skaista gulta +Simple Bed=Gulta +This bed is already occupied!=Å Ä« gulta jau ir aizņemta! +You have to stop moving before going to bed!=Jums jÄapstÄjas lai gulÄ“tu! +Good morning.=LabrÄ«t. +@1 of @2 players are in bed=@1 no @2 spÄ“lÄ“tÄjiem guļ gultÄs +Force night skip=Izlaist nakti +You can only sleep at night.=JÅ«s variet gulÄ“t tikai naktÄ«. +Leave Bed=Celties no gultas diff --git a/mods/minetest_game/beds/locale/beds.ms.tr b/mods/minetest_game/beds/locale/beds.ms.tr new file mode 100644 index 00000000..b197b636 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.ms.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Katil Beragam +Simple Bed=Katil Biasa +This bed is already occupied!=Katil ini sudah diduduki! +You have to stop moving before going to bed!=Anda perlu berhenti bergerak sebelum tidur! +Good morning.=Selamat pagi. +@1 of @2 players are in bed=@1 daripada @2 pemain sedang tidur +Force night skip=Paksa langkau malam +You can only sleep at night.=Anda hanya boleh tidur pada waktu malam. +Leave Bed=Tinggalkan Katil diff --git a/mods/minetest_game/beds/locale/beds.pl.tr b/mods/minetest_game/beds/locale/beds.pl.tr new file mode 100644 index 00000000..2bc03c61 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.pl.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Fantazyjne łóżko +Simple Bed=Proste łóżko +This bed is already occupied!=To łóżko jest już zajÄ™te! +You have to stop moving before going to bed!=Musisz się zatrzymać aby wejść do łóżka +Good morning.=DzieÅ„ dobry. +@1 of @2 players are in bed=@1 z @2 graczy Å›piÄ… +Force night skip=WymuÅ› pominiÄ™cie nocy +You can only sleep at night.=Możesz spać tylko w nocy. +Leave Bed=Opuść łóżko diff --git a/mods/minetest_game/beds/locale/beds.pt_BR.tr b/mods/minetest_game/beds/locale/beds.pt_BR.tr new file mode 100644 index 00000000..47fb1b93 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Cama Bonita +Simple Bed=Cama Simples +This bed is already occupied!=Esta cama já está ocupada! +You have to stop moving before going to bed!=Você precisa parar de se mover antes de ir para cama! +Good morning.=Bom dia. +@1 of @2 players are in bed=@1 de @2 jogadores estão na cama +Force night skip=Forçar o amanhecer +You can only sleep at night.=Você só pode dormir à noite +Leave Bed=Sair da Cama diff --git a/mods/minetest_game/beds/locale/beds.ru.tr b/mods/minetest_game/beds/locale/beds.ru.tr new file mode 100644 index 00000000..7c1b5368 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.ru.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=КраÑÐ¸Ð²Ð°Ñ ÐºÑ€Ð¾Ð²Ð°Ñ‚ÑŒ +Simple Bed=ПроÑÑ‚Ð°Ñ ÐºÑ€Ð¾Ð²Ð°Ñ‚ÑŒ +This bed is already occupied!=Эта кровать уже занÑта! +You have to stop moving before going to bed!=Вам нужно переÑтать двигатьÑÑ Ñ‡Ñ‚Ð¾Ð±Ñ‹ лечь! +Good morning.=Доброе утро. +@1 of @2 players are in bed=@1 из @2 игроков в кровати +Force night skip=ПропуÑтить ночь +You can only sleep at night.=Ð’Ñ‹ можете Ñпать только ночью. +Leave Bed=Ð’Ñтать Ñ ÐºÑ€Ð¾Ð²Ð°Ñ‚Ð¸ diff --git a/mods/minetest_game/beds/locale/beds.sk.tr b/mods/minetest_game/beds/locale/beds.sk.tr new file mode 100644 index 00000000..5f31f0fd --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.sk.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Pekná posteľ +Simple Bed=Jednoduchá posteľ +This bed is already occupied!=Táto posteľ je už obsadená +You have to stop moving before going to bed!=Predtým ako si ľahneÅ¡ do postele, sa musíš prestaÅ¥ pohybovaÅ¥! +Good morning.=Dobré ráno. +@1 of @2 players are in bed=@1 z @2 hráÄov sú v posteli +Force night skip=Nútene preskoÄiÅ¥ noc +You can only sleep at night.=MôžeÅ¡ spaÅ¥ len v noci. +Leave Bed=Opusti posteľ diff --git a/mods/minetest_game/beds/locale/beds.sv.tr b/mods/minetest_game/beds/locale/beds.sv.tr new file mode 100644 index 00000000..3b737b46 --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.sv.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Fin säng +Simple Bed=Enkel säng +This bed is already occupied!=Den här sängen används redan! +You have to stop moving before going to bed!=Du mÃ¥ste stanna innan du kan lägga dig! +Good morning.=God morgon. +@1 of @2 players are in bed=@1 av @2 spelare försöker sova. +Force night skip=Tvinga att hoppa över natt +You can only sleep at night.=Du kan bara sova pÃ¥ natten. +Leave Bed=Lämna säng diff --git a/mods/minetest_game/beds/locale/beds.uk.tr b/mods/minetest_game/beds/locale/beds.uk.tr new file mode 100644 index 00000000..c9db693f --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.uk.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Гарне ліжко +Simple Bed=ПроÑте ліжко +This bed is already occupied!=Це ліжко вже зайнÑте! +You have to stop moving before going to bed!=ЗупинітьÑÑ Ð¿ÐµÑ€ÐµÐ´ тим Ñк лÑгти! +Good morning.=Доброго ранку. +@1 of @2 players are in bed=@1 з @2 гравців(-Ñ) у ліжку +Force night skip=ПропуÑтити ніч +You can only sleep at night.=Ви можете Ñпати лише вночі. +Leave Bed=Ð’Ñтати з ліжка diff --git a/mods/minetest_game/beds/locale/beds.zh_CN.tr b/mods/minetest_game/beds/locale/beds.zh_CN.tr new file mode 100644 index 00000000..7e6cfc7a --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.zh_CN.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=花å¼åºŠ +Simple Bed=简易床 +This bed is already occupied!=åºŠä¸Šå·²æœ‰äººï¼ +You have to stop moving before going to bed!=上床å‰è¦åœæ­¢ç§»åŠ¨ï¼ +Good morning.=æ—©å®‰ï¼ +@1 of @2 players are in bed=@2ä½çŽ©å®¶ä¸­çš„@1ä½åœ¨åºŠä¸Š +Force night skip=强制跳过夜晚 +You can only sleep at night.=ä½ åªèƒ½åœ¨æ™šä¸Šç¡è§‰ã€‚ +Leave Bed=离开床 diff --git a/mods/minetest_game/beds/locale/beds.zh_TW.tr b/mods/minetest_game/beds/locale/beds.zh_TW.tr new file mode 100644 index 00000000..a0428b4e --- /dev/null +++ b/mods/minetest_game/beds/locale/beds.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=花å¼åºŠ +Simple Bed=簡易床 +This bed is already occupied!=é€™å€‹åºŠå·²ç¶“è¢«å æ“šäº†ï¼ +You have to stop moving before going to bed!=你必須在上床å‰åœæ­¢ç§»å‹•ï¼ +Good morning.=æ—©å®‰ï¼ +@1 of @2 players are in bed=@2ä½çŽ©å®¶ä¸­çš„@1ä½åœ¨åºŠä¸Š +Force night skip=強制跳éŽå¤œæ™š +You can only sleep at night.=ä½ åªèƒ½åœ¨æ™šä¸Šç¡è¦ºã€‚ +Leave Bed=離開床 diff --git a/mods/minetest_game/beds/locale/template.txt b/mods/minetest_game/beds/locale/template.txt new file mode 100644 index 00000000..a965787b --- /dev/null +++ b/mods/minetest_game/beds/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed= +Simple Bed= +This bed is already occupied!= +You have to stop moving before going to bed!= +Good morning.= +@1 of @2 players are in bed= +Force night skip= +You can only sleep at night.= +Leave Bed= diff --git a/mods/minetest_game/beds/mod.conf b/mods/minetest_game/beds/mod.conf new file mode 100644 index 00000000..ef88ad18 --- /dev/null +++ b/mods/minetest_game/beds/mod.conf @@ -0,0 +1,3 @@ +name = beds +description = Minetest Game mod: beds +depends = default, wool, spawn diff --git a/mods/minetest_game/beds/spawns.lua b/mods/minetest_game/beds/spawns.lua new file mode 100644 index 00000000..1a2ce810 --- /dev/null +++ b/mods/minetest_game/beds/spawns.lua @@ -0,0 +1,72 @@ +local world_path = minetest.get_worldpath() +local org_file = world_path .. "/beds_spawns" +local file = world_path .. "/beds_spawns" +local bkwd = false + +-- check for PA's beds mod spawns +local cf = io.open(world_path .. "/beds_player_spawns", "r") +if cf ~= nil then + io.close(cf) + file = world_path .. "/beds_player_spawns" + bkwd = true +end + +function beds.read_spawns() + local spawns = beds.spawn + local input = io.open(file, "r") + if input and not bkwd then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + elseif input and bkwd then + beds.spawn = minetest.deserialize(input:read("*all")) + input:close() + beds.save_spawns() + os.rename(file, file .. ".backup") + file = org_file + end +end + +beds.read_spawns() + +function beds.save_spawns() + if not beds.spawn then + return + end + local data = {} + local output = io.open(org_file, "w") + for k, v in pairs(beds.spawn) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, k)) + end + output:write(table.concat(data)) + io.close(output) +end + +function beds.set_spawns() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + local p = player:get_pos() + -- but don't change spawn location if borrowing a bed + if not minetest.is_protected(p, name) then + beds.spawn[name] = p + end + end + beds.save_spawns() +end + +function beds.remove_spawns_at(pos) + for name, p in pairs(beds.spawn) do + if vector.equals(vector.round(p), pos) then + beds.spawn[name] = nil + end + end + beds.save_spawns() +end diff --git a/mods/minetest_game/beds/textures/beds_bed.png b/mods/minetest_game/beds/textures/beds_bed.png new file mode 100644 index 00000000..d4b02e77 Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_fancy.png b/mods/minetest_game/beds/textures/beds_bed_fancy.png new file mode 100644 index 00000000..1c9fde9a Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_fancy.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_foot.png b/mods/minetest_game/beds/textures/beds_bed_foot.png new file mode 100644 index 00000000..af510bb6 Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_foot.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_head.png b/mods/minetest_game/beds/textures/beds_bed_head.png new file mode 100644 index 00000000..b98b1104 Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_head.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_side1.png b/mods/minetest_game/beds/textures/beds_bed_side1.png new file mode 100644 index 00000000..8ded54fd Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_side1.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_side2.png b/mods/minetest_game/beds/textures/beds_bed_side2.png new file mode 100644 index 00000000..a6bdb99d Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_side2.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_side_bottom.png b/mods/minetest_game/beds/textures/beds_bed_side_bottom.png new file mode 100644 index 00000000..ed80f752 Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_side_bottom.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_side_bottom_r.png b/mods/minetest_game/beds/textures/beds_bed_side_bottom_r.png new file mode 100644 index 00000000..2d86532d Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_side_bottom_r.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_side_top.png b/mods/minetest_game/beds/textures/beds_bed_side_top.png new file mode 100644 index 00000000..04b2ba1e Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_side_top.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_side_top_r.png b/mods/minetest_game/beds/textures/beds_bed_side_top_r.png new file mode 100644 index 00000000..c3c07b1b Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_side_top_r.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_top1.png b/mods/minetest_game/beds/textures/beds_bed_top1.png new file mode 100644 index 00000000..2b3ae8dc Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_top1.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_top2.png b/mods/minetest_game/beds/textures/beds_bed_top2.png new file mode 100644 index 00000000..b80353cb Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_top2.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_top_bottom.png b/mods/minetest_game/beds/textures/beds_bed_top_bottom.png new file mode 100644 index 00000000..43dcc649 Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_top_bottom.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_top_top.png b/mods/minetest_game/beds/textures/beds_bed_top_top.png new file mode 100644 index 00000000..9b3d08fa Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_top_top.png differ diff --git a/mods/minetest_game/beds/textures/beds_bed_under.png b/mods/minetest_game/beds/textures/beds_bed_under.png new file mode 100644 index 00000000..1a67367d Binary files /dev/null and b/mods/minetest_game/beds/textures/beds_bed_under.png differ diff --git a/mods/minetest_game/binoculars/README.txt b/mods/minetest_game/binoculars/README.txt new file mode 100644 index 00000000..0c65f6ea --- /dev/null +++ b/mods/minetest_game/binoculars/README.txt @@ -0,0 +1,37 @@ +Minetest Game mod: binoculars +============================= +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +paramat (CC BY-SA 3.0): + binoculars_binoculars.png + +Crafting +-------- +binoculars:binoculars + +default:obsidian_glass O +default:bronze_ingot B + +O_O +BBB +O_O + +Usage +----- +In survival mode, use of zoom requires the binoculars item in your inventory, +they will allow a 10 degree field of view. +It can take up to 5 seconds for adding to or removal from inventory to have an +effect, however to instantly allow the use of this zoom 'use' (leftclick) the +item. + +Zoom with a field of view of 15 degrees is automatically allowed in creative +mode and for any player with the 'creative' privilege. + +The 'binoculars.update_player_property()' function is global so can be +redefined by a mod for alternative behaviour. diff --git a/mods/minetest_game/binoculars/init.lua b/mods/minetest_game/binoculars/init.lua new file mode 100644 index 00000000..914a8611 --- /dev/null +++ b/mods/minetest_game/binoculars/init.lua @@ -0,0 +1,73 @@ +-- binoculars/init.lua + +-- Mod global namespace + +binoculars = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("binoculars") + + +-- Update player property +-- Global to allow overriding + +function binoculars.update_player_property(player) + local new_zoom_fov = 0 + + if player:get_inventory():contains_item( + "main", "binoculars:binoculars") then + new_zoom_fov = 10 + elseif minetest.is_creative_enabled(player:get_player_name()) then + new_zoom_fov = 15 + end + + -- Only set property if necessary to avoid player mesh reload + if player:get_properties().zoom_fov ~= new_zoom_fov then + player:set_properties({zoom_fov = new_zoom_fov}) + end +end + + +-- Set player property 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + binoculars.update_player_property(player) +end) + + +-- Cyclic update of player property + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + binoculars.update_player_property(player) + end + minetest.after(4.7, cyclic_update) +end + +minetest.after(4.7, cyclic_update) + + +-- Binoculars item + +minetest.register_craftitem("binoculars:binoculars", { + description = S("Binoculars") .. "\n" .. S("Use with 'Zoom' key"), + inventory_image = "binoculars_binoculars.png", + stack_max = 1, + groups = {tool = 1}, + + on_use = function(itemstack, user, pointed_thing) + binoculars.update_player_property(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "binoculars:binoculars", + recipe = { + {"default:obsidian_glass", "", "default:obsidian_glass"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:obsidian_glass", "", "default:obsidian_glass"}, + } +}) diff --git a/mods/minetest_game/binoculars/license.txt b/mods/minetest_game/binoculars/license.txt new file mode 100644 index 00000000..f3aefda1 --- /dev/null +++ b/mods/minetest_game/binoculars/license.txt @@ -0,0 +1,59 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/binoculars/locale/binoculars.de.tr b/mods/minetest_game/binoculars/locale/binoculars.de.tr new file mode 100644 index 00000000..7bd9b9d5 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.de.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Fernglas +Use with 'Zoom' key=Mit „Zoom“-Taste benutzen diff --git a/mods/minetest_game/binoculars/locale/binoculars.eo.tr b/mods/minetest_game/binoculars/locale/binoculars.eo.tr new file mode 100644 index 00000000..bec8dc14 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.eo.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binoklo +Use with 'Zoom' key=Uzi per 'Zomo' klavo diff --git a/mods/minetest_game/binoculars/locale/binoculars.es.tr b/mods/minetest_game/binoculars/locale/binoculars.es.tr new file mode 100644 index 00000000..7b7e77d7 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.es.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Prismáticos +Use with 'Zoom' key=Usar con la tecla 'Zoom' diff --git a/mods/minetest_game/binoculars/locale/binoculars.fr.tr b/mods/minetest_game/binoculars/locale/binoculars.fr.tr new file mode 100644 index 00000000..3f8b0bc8 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.fr.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Jumelles +Use with 'Zoom' key=Utiliser avec le bouton « Zoom » diff --git a/mods/minetest_game/binoculars/locale/binoculars.id.tr b/mods/minetest_game/binoculars/locale/binoculars.id.tr new file mode 100644 index 00000000..59ba2cd3 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.id.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Teropong +Use with 'Zoom' key=Gunakan dengan tombol 'Zum' diff --git a/mods/minetest_game/binoculars/locale/binoculars.it.tr b/mods/minetest_game/binoculars/locale/binoculars.it.tr new file mode 100644 index 00000000..97c7b860 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.it.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binocolo +Use with 'Zoom' key=Usalo col tasto 'Ingrandimento' diff --git a/mods/minetest_game/binoculars/locale/binoculars.ja.tr b/mods/minetest_game/binoculars/locale/binoculars.ja.tr new file mode 100644 index 00000000..9766f461 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.ja.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=åŒçœ¼é¡ +Use with 'Zoom' key=ズームキーã§ä½¿ã„ã¾ã™ diff --git a/mods/minetest_game/binoculars/locale/binoculars.jbo.tr b/mods/minetest_game/binoculars/locale/binoculars.jbo.tr new file mode 100644 index 00000000..e1465696 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.jbo.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=lo reldarvistci +Use with 'Zoom' key=.i tu'a le jvinu banro batke cu tadji lo nu pilno diff --git a/mods/minetest_game/binoculars/locale/binoculars.lv.tr b/mods/minetest_game/binoculars/locale/binoculars.lv.tr new file mode 100644 index 00000000..0713a03e --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.lv.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binoklis +Use with 'Zoom' key=Lietojiet ar 'PietuvinÄt' pogu diff --git a/mods/minetest_game/binoculars/locale/binoculars.ms.tr b/mods/minetest_game/binoculars/locale/binoculars.ms.tr new file mode 100644 index 00000000..d38e64fd --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.ms.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binokular +Use with 'Zoom' key=Guna dengan kekunci 'Zum' diff --git a/mods/minetest_game/binoculars/locale/binoculars.pl.tr b/mods/minetest_game/binoculars/locale/binoculars.pl.tr new file mode 100644 index 00000000..9fbd9032 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.pl.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Lornetka +Use with 'Zoom' key=Aby użyć naciÅ›nij 'Zoom' diff --git a/mods/minetest_game/binoculars/locale/binoculars.pt_BR.tr b/mods/minetest_game/binoculars/locale/binoculars.pt_BR.tr new file mode 100644 index 00000000..4aabfeff --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binóculos +Use with 'Zoom' key=Use com a tecla de 'Zoom' diff --git a/mods/minetest_game/binoculars/locale/binoculars.ru.tr b/mods/minetest_game/binoculars/locale/binoculars.ru.tr new file mode 100644 index 00000000..6825f27f --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.ru.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Бинокль +Use with 'Zoom' key=ИÑпользуетÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐµÐ¹ 'Приближение' diff --git a/mods/minetest_game/binoculars/locale/binoculars.sk.tr b/mods/minetest_game/binoculars/locale/binoculars.sk.tr new file mode 100644 index 00000000..50083113 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.sk.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=ÄŽalekohľad +Use with 'Zoom' key=Použi s klávesou "Priblíž" diff --git a/mods/minetest_game/binoculars/locale/binoculars.sv.tr b/mods/minetest_game/binoculars/locale/binoculars.sv.tr new file mode 100644 index 00000000..f8a01db2 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.sv.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Kikare +Use with 'Zoom' key=Använd med 'Zoom'-knappen diff --git a/mods/minetest_game/binoculars/locale/binoculars.uk.tr b/mods/minetest_game/binoculars/locale/binoculars.uk.tr new file mode 100644 index 00000000..cec1e2f8 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.uk.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Бінокль +Use with 'Zoom' key=ВикориÑтовуєтьÑÑ ÐºÐ»Ð°Ð²Ñ–ÑˆÐµÑŽ 'ÐаближеннÑ' diff --git a/mods/minetest_game/binoculars/locale/binoculars.zh_CN.tr b/mods/minetest_game/binoculars/locale/binoculars.zh_CN.tr new file mode 100644 index 00000000..ec46cf8d --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=望远镜 +Use with 'Zoom' key=与“缩放â€é”®ä¸€èµ·ä½¿ç”¨ diff --git a/mods/minetest_game/binoculars/locale/binoculars.zh_TW.tr b/mods/minetest_game/binoculars/locale/binoculars.zh_TW.tr new file mode 100644 index 00000000..bbe3b390 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/binoculars.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=望é é¡ +Use with 'Zoom' key=與“縮放â€éµä¸€èµ·ä½¿ç”¨ diff --git a/mods/minetest_game/binoculars/locale/template.txt b/mods/minetest_game/binoculars/locale/template.txt new file mode 100644 index 00000000..a5264627 --- /dev/null +++ b/mods/minetest_game/binoculars/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars= +Use with 'Zoom' key= diff --git a/mods/minetest_game/binoculars/mod.conf b/mods/minetest_game/binoculars/mod.conf new file mode 100644 index 00000000..4a64ce52 --- /dev/null +++ b/mods/minetest_game/binoculars/mod.conf @@ -0,0 +1,3 @@ +name = binoculars +description = Minetest Game mod: binoculars +depends = default diff --git a/mods/minetest_game/binoculars/textures/binoculars_binoculars.png b/mods/minetest_game/binoculars/textures/binoculars_binoculars.png new file mode 100644 index 00000000..5803d48f Binary files /dev/null and b/mods/minetest_game/binoculars/textures/binoculars_binoculars.png differ diff --git a/mods/minetest_game/boats/README.txt b/mods/minetest_game/boats/README.txt new file mode 100644 index 00000000..26b1b6f8 --- /dev/null +++ b/mods/minetest_game/boats/README.txt @@ -0,0 +1,31 @@ +Minetest Game mod: boats +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures and model) +------------------------------------- +Textures: Zeg9 (CC BY-SA 3.0) +Model: thetoon and Zeg9 (CC BY-SA 3.0), + modified by PavelS(SokolovPavel) (CC BY-SA 3.0), + modified by sofar (CC BY-SA 3.0) + +Controls +-------- +Right mouse button = Enter or exit boat when pointing at boat. +Forward = Speed up. + Slow down when moving backwards. +Forward + backward = Enable cruise mode: Boat will accelerate to maximum forward + speed and remain at that speed without needing to hold the + forward key. +Backward = Slow down. + Speed up when moving backwards. + Disable cruise mode. +Left = Turn to the left. + Turn to the right when moving backwards. +Right = Turn to the right. + Turn to the left when moving backwards. diff --git a/mods/minetest_game/boats/init.lua b/mods/minetest_game/boats/init.lua new file mode 100644 index 00000000..52360be4 --- /dev/null +++ b/mods/minetest_game/boats/init.lua @@ -0,0 +1,290 @@ +-- boats/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("boats") + +-- +-- Helper functions +-- + +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 0 +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + +-- +-- Boat entity +-- + +local boat = { + initial_properties = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boats_boat.obj", + textures = {"default_wood.png"}, + }, + + driver = nil, + v = 0, + last_v = 0, + removed = false, + auto = false +} + + +function boat.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and name == self.driver then + -- Cleanup happens in boat.on_detach_child + clicker:set_detach() + + player_api.set_animation(clicker, "stand", 30) + local pos = clicker:get_pos() + pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} + minetest.after(0.1, function() + clicker:set_pos(pos) + end) + elseif not self.driver then + clicker:set_attach(self.object, "", + {x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0}) + + self.driver = name + player_api.player_attached[name] = true + + minetest.after(0.2, function() + player_api.set_animation(clicker, "sit", 30) + end) + clicker:set_look_horizontal(self.object:get_yaw()) + end +end + + +-- If driver leaves server while driving boat +function boat.on_detach_child(self, child) + if child and child:get_player_name() == self.driver then + player_api.player_attached[child:get_player_name()] = false + + self.driver = nil + self.auto = false + end +end + + +function boat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end + self.last_v = self.v +end + + +function boat.get_staticdata(self) + return tostring(self.v) +end + + +function boat.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + + local name = puncher:get_player_name() + if self.driver and name == self.driver then + self.driver = nil + puncher:set_detach() + player_api.player_attached[name] = false + end + if not self.driver then + self.removed = true + local inv = puncher:get_inventory() + if not minetest.is_creative_enabled(name) + or not inv:contains_item("main", "boats:boat") then + local leftover = inv:add_item("main", "boats:boat") + -- if no room in inventory add a replacement boat to the world + if not leftover:is_empty() then + minetest.add_item(self.object:get_pos(), leftover) + end + end + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + end +end + + +function boat.on_step(self, dtime) + self.v = get_v(self.object:get_velocity()) * math.sign(self.v) + if self.driver then + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.up and ctrl.down then + if not self.auto then + self.auto = true + minetest.chat_send_player(self.driver, S("Boat cruise mode on")) + end + elseif ctrl.down then + self.v = self.v - dtime * 2.0 + if self.auto then + self.auto = false + minetest.chat_send_player(self.driver, S("Boat cruise mode off")) + end + elseif ctrl.up or self.auto then + self.v = self.v + dtime * 2.0 + end + if ctrl.left then + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + else + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) + end + elseif ctrl.right then + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) + else + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + end + end + end + end + local velo = self.object:get_velocity() + if not self.driver and + self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:set_pos(self.object:get_pos()) + return + end + -- We need to preserve velocity sign to properly apply drag force + -- while moving backward + local drag = dtime * math.sign(self.v) * (0.01 + 0.0796 * self.v * self.v) + -- If drag is larger than velocity, then stop horizontal movement + if math.abs(self.v) <= math.abs(drag) then + self.v = 0 + else + self.v = self.v - drag + end + + local p = self.object:get_pos() + p.y = p.y - 0.5 + local new_velo + local new_acce = {x = 0, y = 0, z = 0} + if not is_water(p) then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then + self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} + end + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) + else + p.y = p.y + 1 + if is_water(p) then + local y = self.object:get_velocity().y + if y >= 5 then + y = 5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} + end + new_velo = get_velocity(self.v, self.object:get_yaw(), y) + self.object:set_pos(self.object:get_pos()) + else + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:get_velocity().y) < 1 then + local pos = self.object:get_pos() + pos.y = math.floor(pos.y) + 0.5 + self.object:set_pos(pos) + new_velo = get_velocity(self.v, self.object:get_yaw(), 0) + else + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) + end + end + end + self.object:set_velocity(new_velo) + self.object:set_acceleration(new_acce) +end + + +minetest.register_entity("boats:boat", boat) + + +minetest.register_craftitem("boats:boat", { + description = S("Boat"), + inventory_image = "boats_inventory.png", + wield_image = "boats_wield.png", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + groups = {flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + if not is_water(pointed_thing.under) then + return itemstack + end + pointed_thing.under.y = pointed_thing.under.y + 0.5 + boat = minetest.add_entity(pointed_thing.under, "boats:boat") + if boat then + if placer then + boat:set_yaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +minetest.register_craft({ + output = "boats:boat", + recipe = { + {"", "", "" }, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "boats:boat", + burntime = 20, +}) diff --git a/mods/minetest_game/boats/license.txt b/mods/minetest_game/boats/license.txt new file mode 100644 index 00000000..d816be54 --- /dev/null +++ b/mods/minetest_game/boats/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures and model) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Zeg9 +Copyright (C) 2012-2016 thetoon +Copyright (C) 2012-2016 PavelS(SokolovPavel) +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/boats/locale/boats.de.tr b/mods/minetest_game/boats/locale/boats.de.tr new file mode 100644 index 00000000..d8eb8d74 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.de.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Schneller Bootsmodus an +Boat cruise mode off=Schneller Bootsmodus aus +Boat=Boot diff --git a/mods/minetest_game/boats/locale/boats.eo.tr b/mods/minetest_game/boats/locale/boats.eo.tr new file mode 100644 index 00000000..7d02e2f7 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.eo.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=La kroza maniero de la boato estas Åaltita. +Boat cruise mode off=La kroza maniero de la boato estas malÅaltita. +Boat=Boato diff --git a/mods/minetest_game/boats/locale/boats.es.tr b/mods/minetest_game/boats/locale/boats.es.tr new file mode 100644 index 00000000..b9adb72e --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.es.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Modo crucero en bote activado +Boat cruise mode off=Modo crucero en bote desactivado +Boat=Bote diff --git a/mods/minetest_game/boats/locale/boats.fr.tr b/mods/minetest_game/boats/locale/boats.fr.tr new file mode 100644 index 00000000..f469a0b6 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.fr.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Bateau mode rapide activé +Boat cruise mode off=Bateau mode rapide désactivé +Boat=Bateau diff --git a/mods/minetest_game/boats/locale/boats.id.tr b/mods/minetest_game/boats/locale/boats.id.tr new file mode 100644 index 00000000..cf37f476 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.id.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Mode perahu jelajah nyala +Boat cruise mode off=Mode perahu jelajah mati +Boat=Perahu diff --git a/mods/minetest_game/boats/locale/boats.it.tr b/mods/minetest_game/boats/locale/boats.it.tr new file mode 100644 index 00000000..4a878354 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.it.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Modalità movimento automatico barca attivata +Boat cruise mode off=Modalità movimento automatico barca disattivata +Boat=Barca diff --git a/mods/minetest_game/boats/locale/boats.ja.tr b/mods/minetest_game/boats/locale/boats.ja.tr new file mode 100644 index 00000000..ee2d0863 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.ja.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=クルージングモード・オン +Boat cruise mode off=クルージングモード・オフ +Boat=ボート diff --git a/mods/minetest_game/boats/locale/boats.jbo.tr b/mods/minetest_game/boats/locale/boats.jbo.tr new file mode 100644 index 00000000..c7d534f9 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=.i lo bloti cu zmiku le ka klama +Boat cruise mode off=.i lo bloti cu macnu le ka klama +Boat=lo bloti diff --git a/mods/minetest_game/boats/locale/boats.lv.tr b/mods/minetest_game/boats/locale/boats.lv.tr new file mode 100644 index 00000000..8d78fa6e --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.lv.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Autopilots ieslÄ“gts +Boat cruise mode off=Autopilots izslÄ“gts +Boat=Laiva diff --git a/mods/minetest_game/boats/locale/boats.ms.tr b/mods/minetest_game/boats/locale/boats.ms.tr new file mode 100644 index 00000000..df42bc33 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.ms.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Mod jelajah bot dihidupkan +Boat cruise mode off=Mod jelajah bot dimatikan +Boat=Bot diff --git a/mods/minetest_game/boats/locale/boats.pl.tr b/mods/minetest_game/boats/locale/boats.pl.tr new file mode 100644 index 00000000..ce43286a --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.pl.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Tryb rejsu Å‚odkÄ… włączony +Boat cruise mode off=Tryb rejsu Å‚odkÄ… wyłączony +Boat=Åódka diff --git a/mods/minetest_game/boats/locale/boats.pt_BR.tr b/mods/minetest_game/boats/locale/boats.pt_BR.tr new file mode 100644 index 00000000..1992fdfd --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Modo de cruseiro do barco ligado +Boat cruise mode off=Modo de cruseiro do barco desligado +Boat=Barco diff --git a/mods/minetest_game/boats/locale/boats.ru.tr b/mods/minetest_game/boats/locale/boats.ru.tr new file mode 100644 index 00000000..972bfb07 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.ru.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Ðвтоход лодки включен +Boat cruise mode off=Ðвтоход лодки выключен +Boat=Лодка diff --git a/mods/minetest_game/boats/locale/boats.sk.tr b/mods/minetest_game/boats/locale/boats.sk.tr new file mode 100644 index 00000000..4d313cdf --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.sk.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Cestovný režim loÄky je zapnutý +Boat cruise mode off=Cestovný režim loÄky je vypnutý +Boat=LoÄka diff --git a/mods/minetest_game/boats/locale/boats.sv.tr b/mods/minetest_game/boats/locale/boats.sv.tr new file mode 100644 index 00000000..248b0889 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.sv.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=BÃ¥tkryssningsläge pÃ¥ +Boat cruise mode off=BÃ¥tkryssningsläge av +Boat=BÃ¥t diff --git a/mods/minetest_game/boats/locale/boats.uk.tr b/mods/minetest_game/boats/locale/boats.uk.tr new file mode 100644 index 00000000..662ba6fc --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.uk.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Режим Ð¼Ð°Ð½Ð´Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° човні увімкнено +Boat cruise mode off=Режим Ð¼Ð°Ð½Ð´Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° човні вимкнено +Boat=Човен diff --git a/mods/minetest_game/boats/locale/boats.zh_CN.tr b/mods/minetest_game/boats/locale/boats.zh_CN.tr new file mode 100644 index 00000000..254f2dfc --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=巡航模å¼å¼€å¯ +Boat cruise mode off=巡航模å¼å…³é—­ +Boat=船 diff --git a/mods/minetest_game/boats/locale/boats.zh_TW.tr b/mods/minetest_game/boats/locale/boats.zh_TW.tr new file mode 100644 index 00000000..97b34711 --- /dev/null +++ b/mods/minetest_game/boats/locale/boats.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=巡航模å¼é–‹å•Ÿ +Boat cruise mode off=巡航模å¼é—œé–‰ +Boat=船 diff --git a/mods/minetest_game/boats/locale/template.txt b/mods/minetest_game/boats/locale/template.txt new file mode 100644 index 00000000..17aedc89 --- /dev/null +++ b/mods/minetest_game/boats/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on= +Boat cruise mode off= +Boat= diff --git a/mods/minetest_game/boats/mod.conf b/mods/minetest_game/boats/mod.conf new file mode 100644 index 00000000..a727f8ff --- /dev/null +++ b/mods/minetest_game/boats/mod.conf @@ -0,0 +1,3 @@ +name = boats +description = Minetest Game mod: boats +depends = default, player_api diff --git a/mods/minetest_game/boats/models/boats_boat.obj b/mods/minetest_game/boats/models/boats_boat.obj new file mode 100644 index 00000000..0f21e47f --- /dev/null +++ b/mods/minetest_game/boats/models/boats_boat.obj @@ -0,0 +1,358 @@ +# Blender v2.76 (sub 11) OBJ File: 'boat.blend' +# www.blender.org +mtllib boat.mtl +o boats_boat +v -6.786140 -3.033999 -9.415440 +v -6.786140 -1.967150 -9.415440 +v -6.786140 -1.967150 8.793510 +v -6.786140 -3.033999 8.793510 +v 5.732520 -1.967150 -9.415440 +v 5.732520 -3.033999 -9.415440 +v 5.732520 -3.033999 8.793510 +v 5.732520 -1.967150 8.793510 +v -2.233900 -3.033999 -9.415440 +v -2.233900 -1.967150 -9.415440 +v -2.233900 -1.967150 8.793510 +v -2.233900 -3.033999 8.793510 +v 2.318340 -3.033999 -9.415440 +v 2.318340 -1.967150 -9.415440 +v 2.318340 -1.967150 8.793510 +v 2.318340 -3.033999 8.793510 +v -3.371960 -3.033999 8.793510 +v -3.371960 -1.967150 8.793510 +v -3.371960 -1.967150 -9.415440 +v -3.371960 -3.033999 -9.415440 +v 2.318340 0.276645 8.793510 +v 1.180280 -1.967150 8.793510 +v 5.732520 0.276645 8.793510 +v 5.732520 1.039180 8.793510 +v 6.870580 0.276645 8.793510 +v 6.870580 -1.967150 8.793510 +v 2.318340 1.039180 8.793510 +v 1.180280 0.276645 8.793510 +v 1.180280 1.039180 8.793510 +v 1.180280 -3.033999 8.793510 +v -2.233900 0.276645 8.793510 +v -3.371960 0.276645 8.793510 +v -2.233900 1.039180 8.793510 +v -3.371960 1.039180 8.793510 +v -6.786140 0.276645 8.793510 +v -7.786200 0.276645 8.793510 +v -7.786200 -1.967150 8.793510 +v -6.786140 1.039180 8.793510 +v 1.180280 -1.967150 -9.415440 +v 1.180280 -3.033999 -9.415440 +v 2.318340 0.276645 -9.415440 +v 1.180280 0.276645 -9.415440 +v 2.318340 1.039180 -9.415440 +v 5.732520 0.276645 -9.415440 +v 6.870580 -1.967150 -9.415440 +v 5.732520 1.039180 -9.415440 +v 6.870580 0.276645 -9.415440 +v 0.042220 1.039180 -9.415440 +v 1.180280 1.039180 -9.415440 +v 0.042220 -1.967150 -9.415440 +v -1.095840 -1.967150 -9.415440 +v -2.233900 0.276645 -9.415440 +v -3.371960 0.276645 -9.415440 +v -2.233900 1.039180 -9.415440 +v -1.095840 1.039180 -9.415440 +v -3.371960 1.039180 -9.415440 +v -6.786140 0.276645 -9.415440 +v -6.786140 1.039180 -9.415440 +v -7.786200 -1.967150 -9.415440 +v -7.786200 0.276645 -9.415440 +v -1.095840 0.156645 -12.044100 +v -1.095840 -4.601110 -9.415440 +v -1.095840 1.039181 -10.802900 +v -1.095840 2.868579 -10.802900 +v -1.095840 2.868580 -7.883420 +v -1.095840 3.746069 -12.034100 +v -1.095840 3.746070 -7.883420 +v -1.095840 0.156645 -14.294900 +v -1.095840 -4.601110 -14.284900 +v 0.042220 -4.601110 -14.284900 +v 0.042220 -4.601110 -9.415440 +v 0.042220 1.039181 -10.802900 +v 0.042220 0.156645 -12.044100 +v 0.042220 2.868579 -10.802900 +v 0.042220 0.156645 -14.294900 +v 0.042220 3.746069 -12.034100 +v 0.042220 3.746070 -7.883420 +v 0.042220 2.868580 -7.883420 +v -1.096322 -3.033999 -9.415440 +v 0.044046 -3.035397 -9.415440 +vt 1.000000 0.187500 +vt -1.000000 0.312500 +vt 1.000000 0.312500 +vt 0.687500 1.000000 +vt 0.500000 0.875000 +vt 0.500000 0.625000 +vt -1.000000 0.062500 +vt 1.000000 0.062500 +vt 1.000000 -0.000000 +vt -1.000000 0.125000 +vt 1.000000 0.125000 +vt 0.437500 0.125000 +vt 0.312500 0.500000 +vt 0.312500 0.125000 +vt 1.000000 0.625000 +vt -1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.187500 0.687500 +vt -0.187500 0.687500 +vt -0.187500 0.312500 +vt 1.000000 0.812500 +vt -1.000000 0.937500 +vt -1.000000 0.812500 +vt 0.812500 0.687500 +vt 1.187500 0.687500 +vt 0.812500 0.312500 +vt 1.000000 0.562500 +vt 0.312500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.750000 +vt -1.000000 0.875000 +vt -1.000000 0.750000 +vt -1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.437500 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.625000 +vt -1.000000 0.437500 +vt -1.000000 0.000000 +vt 0.500000 0.062500 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt -1.000000 0.250000 +vt -1.000000 0.687500 +vt 1.000000 0.687500 +vt 0.625000 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.250000 +vt 1.000000 0.937500 +vt 0.437500 0.812500 +vt 0.312500 0.312500 +vt 0.312500 0.812500 +vt 0.437500 0.312500 +vt 0.437500 0.437500 +vt 0.687500 0.812500 +vt 0.000000 0.687500 +vt 0.000000 0.812500 +vt -1.000000 0.562500 +vt 0.875000 0.812500 +vt 0.875000 0.687500 +vt 0.250000 0.312500 +vt 0.562500 0.187500 +vt 0.250000 0.187500 +vt -1.000000 0.187500 +vt 0.312500 0.625000 +vt 0.312500 0.187500 +vt 0.312500 -0.187500 +vt 1.000000 -0.187500 +vt 0.687500 0.500000 +vt -0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.437500 0.500000 +vt -1.000000 0.625000 +vt 0.812500 0.187500 +vt 1.187500 0.187500 +vt 1.187500 0.312500 +vt 1.312500 0.312500 +vt 1.312500 0.687500 +vt 0.687500 0.187500 +vt 0.687500 0.312500 +vt 1.187500 0.812500 +vt 0.812500 0.812500 +vt 0.187500 0.312500 +vt 0.312500 0.687500 +vt 0.687500 0.687500 +vt -0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.312500 0.687500 +vt -0.312500 0.312500 +vt 0.187500 0.812500 +vt -0.187500 0.812500 +vt 0.437500 0.687500 +vt 0.437500 0.187500 +vt 0.562500 0.812500 +vt 0.562500 0.687500 +vt 0.312500 0.562500 +vt 1.000000 0.875000 +vt 0.375000 0.062500 +vt -1.000000 0.375000 +vt 0.625000 0.500000 +vt 0.875000 0.562500 +vt 0.937500 0.812500 +vt 0.937500 0.687500 +vt 0.875000 0.937500 +vt 0.562500 0.312500 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.002100 -1.000000 +vn 0.001200 -1.000000 0.000000 +vn 0.000000 0.002800 -1.000000 +vn -0.001200 -1.000000 0.000200 +g boats_boat_boats_boat_None +usemtl None +s off +f 41/1/1 27/2/1 43/3/1 +f 76/4/2 74/5/2 72/6/2 +f 8/7/2 6/1/2 5/8/2 +f 15/9/1 13/10/1 16/11/1 +f 51/12/3 71/13/3 50/14/3 +f 56/15/2 32/16/2 53/17/2 +f 15/18/3 8/19/3 23/20/3 +f 22/21/2 40/22/2 39/23/2 +f 19/24/4 2/25/4 53/26/4 +f 70/27/5 62/28/5 69/29/5 +f 11/30/5 19/31/5 10/32/5 +f 4/15/5 20/33/5 17/34/5 +f 72/35/3 64/36/3 63/37/3 +f 13/8/5 7/38/5 16/7/5 +f 23/39/6 47/11/6 44/9/6 +f 68/40/7 70/41/7 69/42/7 +f 80/43/8 40/10/8 30/11/8 +f 3/15/1 1/32/1 4/30/1 +f 20/44/2 18/27/2 17/45/2 +f 74/17/5 65/46/5 64/47/5 +f 31/43/1 54/47/1 52/48/1 +f 22/47/5 14/43/5 15/48/5 +f 46/1/2 23/7/2 44/8/2 +f 57/21/1 38/22/1 58/49/1 +f 61/50/9 76/51/9 73/52/9 +f 37/45/5 2/23/5 3/21/5 +f 78/28/3 67/53/3 65/54/3 +f 64/5/1 66/4/1 63/6/1 +f 76/55/6 67/56/6 77/57/6 +f 47/17/2 26/10/2 45/11/2 +f 5/16/5 26/47/5 8/17/5 +f 33/58/6 48/59/6 55/60/6 +f 29/38/2 42/3/2 49/29/2 +f 32/44/6 52/21/6 53/45/6 +f 58/15/6 34/33/6 56/34/6 +f 27/7/6 46/29/6 43/8/6 +f 73/61/6 68/62/6 61/63/6 +f 21/58/6 42/29/6 28/38/6 +f 11/29/1 9/58/1 12/27/1 +f 59/45/1 36/2/1 60/3/1 +f 60/9/6 35/10/6 57/11/6 +f 41/1/1 21/64/1 27/2/1 +f 72/6/2 48/65/2 50/66/2 +f 50/66/2 71/67/2 70/68/2 +f 70/68/2 75/17/2 73/69/2 +f 76/4/2 77/70/2 74/5/2 +f 77/70/2 78/71/2 74/5/2 +f 50/66/2 70/68/2 73/69/2 +f 73/69/2 76/4/2 72/6/2 +f 72/6/2 50/66/2 73/69/2 +f 8/7/2 7/64/2 6/1/2 +f 15/9/1 14/39/1 13/10/1 +f 51/12/3 62/72/3 71/13/3 +f 56/15/2 34/73/2 32/16/2 +f 32/26/3 34/74/3 38/75/3 +f 35/76/3 36/77/3 37/78/3 +f 32/26/3 38/75/3 35/76/3 +f 29/66/3 33/79/3 31/80/3 +f 32/26/3 35/76/3 3/25/3 +f 28/51/3 29/66/3 31/80/3 +f 31/80/3 32/26/3 18/24/3 +f 3/25/3 4/81/3 17/82/3 +f 35/76/3 37/78/3 3/25/3 +f 21/83/3 28/51/3 22/84/3 +f 3/25/3 17/82/3 18/24/3 +f 11/85/3 12/55/3 30/52/3 +f 32/26/3 3/25/3 18/24/3 +f 11/85/3 30/52/3 22/84/3 +f 31/80/3 18/24/3 11/85/3 +f 24/86/3 27/87/3 21/83/3 +f 28/51/3 31/80/3 11/85/3 +f 11/85/3 22/84/3 28/51/3 +f 24/86/3 21/83/3 23/20/3 +f 26/88/3 25/89/3 23/20/3 +f 23/20/3 21/83/3 15/18/3 +f 15/18/3 16/90/3 7/91/3 +f 21/83/3 22/84/3 15/18/3 +f 8/19/3 26/88/3 23/20/3 +f 15/18/3 7/91/3 8/19/3 +f 22/21/2 30/49/2 40/22/2 +f 47/89/4 45/88/4 5/19/4 +f 5/19/4 6/91/4 13/90/4 +f 5/19/4 13/90/4 14/18/4 +f 44/20/4 47/89/4 5/19/4 +f 43/87/4 46/86/4 44/20/4 +f 41/83/4 43/87/4 44/20/4 +f 44/20/4 5/19/4 14/18/4 +f 39/84/4 40/52/4 80/50/4 +f 44/20/4 14/18/4 41/83/4 +f 42/51/4 41/83/4 39/84/4 +f 39/84/4 80/50/4 50/92/4 +f 41/83/4 14/18/4 39/84/4 +f 48/93/4 49/66/4 42/51/4 +f 50/92/4 48/93/4 42/51/4 +f 80/50/4 79/94/4 50/92/4 +f 50/92/4 42/51/4 39/84/4 +f 54/79/4 55/62/4 52/80/4 +f 50/92/4 79/94/4 51/95/4 +f 52/80/4 55/62/4 51/95/4 +f 51/95/4 79/94/4 10/85/4 +f 79/94/4 9/55/4 10/85/4 +f 53/26/4 52/80/4 10/85/4 +f 58/75/4 56/74/4 53/26/4 +f 59/78/4 60/77/4 57/76/4 +f 57/76/4 58/75/4 53/26/4 +f 52/80/4 51/95/4 10/85/4 +f 19/24/4 20/82/4 1/81/4 +f 53/26/4 10/85/4 19/24/4 +f 59/78/4 57/76/4 2/25/4 +f 19/24/4 1/81/4 2/25/4 +f 2/25/4 57/76/4 53/26/4 +f 70/27/5 71/96/5 62/28/5 +f 11/30/5 18/97/5 19/31/5 +f 4/15/5 1/73/5 20/33/5 +f 72/35/3 74/54/3 64/36/3 +f 13/8/5 6/29/5 7/38/5 +f 23/39/6 25/10/6 47/11/6 +f 68/40/7 75/98/7 70/41/7 +f 30/11/5 12/17/5 79/99/5 +f 79/99/10 80/43/10 30/11/10 +f 12/17/5 9/16/5 79/99/5 +f 3/15/1 2/73/1 1/32/1 +f 20/44/2 19/58/2 18/27/2 +f 74/17/5 78/100/5 65/46/5 +f 31/43/1 33/99/1 54/47/1 +f 22/47/5 39/99/5 14/43/5 +f 46/1/2 24/64/2 23/7/2 +f 57/21/1 35/23/1 38/22/1 +f 61/50/9 66/53/9 76/51/9 +f 37/45/5 59/44/5 2/23/5 +f 78/28/3 77/51/3 67/53/3 +f 62/67/1 51/66/1 69/68/1 +f 51/66/1 55/65/1 63/6/1 +f 68/17/1 69/68/1 61/69/1 +f 61/69/1 69/68/1 51/66/1 +f 61/69/1 51/66/1 63/6/1 +f 65/71/1 67/70/1 64/5/1 +f 61/69/1 63/6/1 66/4/1 +f 64/5/1 67/70/1 66/4/1 +f 76/55/6 66/85/6 67/56/6 +f 47/17/2 25/16/2 26/10/2 +f 5/16/5 45/99/5 26/47/5 +f 55/60/6 54/101/6 33/58/6 +f 33/58/6 29/22/6 48/59/6 +f 48/59/6 72/102/6 63/103/6 +f 29/22/6 49/104/6 48/59/6 +f 48/59/6 63/103/6 55/60/6 +f 29/38/2 28/2/2 42/3/2 +f 32/44/6 31/23/6 52/21/6 +f 58/15/6 38/73/6 34/33/6 +f 27/7/6 24/38/6 46/29/6 +f 73/61/6 75/105/6 68/62/6 +f 21/58/6 41/27/6 42/29/6 +f 11/29/1 10/38/1 9/58/1 +f 59/45/1 37/44/1 36/2/1 +f 60/9/6 36/39/6 35/10/6 diff --git a/mods/minetest_game/boats/textures/boats_inventory.png b/mods/minetest_game/boats/textures/boats_inventory.png new file mode 100644 index 00000000..f9d082e3 Binary files /dev/null and b/mods/minetest_game/boats/textures/boats_inventory.png differ diff --git a/mods/minetest_game/boats/textures/boats_wield.png b/mods/minetest_game/boats/textures/boats_wield.png new file mode 100644 index 00000000..f998b5bb Binary files /dev/null and b/mods/minetest_game/boats/textures/boats_wield.png differ diff --git a/mods/minetest_game/bones/README.txt b/mods/minetest_game/bones/README.txt new file mode 100644 index 00000000..219cc30d --- /dev/null +++ b/mods/minetest_game/bones/README.txt @@ -0,0 +1,12 @@ +Minetest Game mod: bones +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +All textures: paramat (CC BY-SA 3.0) diff --git a/mods/minetest_game/bones/init.lua b/mods/minetest_game/bones/init.lua new file mode 100644 index 00000000..797224c8 --- /dev/null +++ b/mods/minetest_game/bones/init.lua @@ -0,0 +1,310 @@ +-- bones/init.lua + +-- Minetest Game mod: bones +-- See README.txt for licensing and other information. + +-- Load support for MT game translation. +local S = minetest.get_translator("bones") + +bones = {} + +local function is_owner(pos, name) + local owner = minetest.get_meta(pos):get_string("owner") + if owner == "" or owner == name or minetest.check_player_privs(name, "protection_bypass") then + return true + end + return false +end + +local function drop(pos, itemstack) + local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count())) + if obj then + obj:set_velocity({ + x = math.random(-10, 10) / 9, + y = 5, + z = math.random(-10, 10) / 9, + }) + end +end + +local function drop_contents(pos) + local inv = minetest.get_meta(pos):get_inventory() + + for i = 1, inv:get_size("main") do + local stk = inv:get_stack("main", i) + drop(pos, stk) + end + minetest.remove_node(pos) +end + +local bones_formspec = + "size[8,9]" .. + "list[current_name;main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + +local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or 1200 +local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4 + +local bones_def = { + description = S("Bones"), + tiles = { + "bones_top.png^[transform2", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {dig_immediate = 2}, + sounds = default.node_sound_gravel_defaults(), + + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + local name = "" + if player then + name = player:get_player_name() + end + return is_owner(pos, name) and inv:is_empty("main") + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if is_owner(pos, player:get_player_name()) then + return count + end + return 0 + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return 0 + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if is_owner(pos, player:get_player_name()) then + return stack:get_count() + end + return 0 + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if meta:get_inventory():is_empty("main") then + local inv = player:get_inventory() + if inv:room_for_item("main", {name = "bones:bones"}) then + inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos, "bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_punch = function(pos, node, player) + if not is_owner(pos, player:get_player_name()) then + return + end + + if not player:is_player() then + drop_contents(pos) + return + end + + if minetest.get_meta(pos):get_string("infotext") == "" then + return + end + + local inv = minetest.get_meta(pos):get_inventory() + local player_inv = player:get_inventory() + local has_space = true + + for i = 1, inv:get_size("main") do + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + + -- remove bones if player emptied them + if has_space then + if player_inv:room_for_item("main", {name = "bones:bones"}) then + player_inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos,"bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then + meta:set_string("infotext", S("@1's old bones", meta:get_string("owner"))) + meta:set_string("owner", "") + else + meta:set_int("time", time) + return true + end + end, + on_blast = function(pos) + end, +} + +default.set_inventory_action_loggers(bones_def, "bones") + +minetest.register_node("bones:bones", bones_def) + +local function may_replace(pos, player) + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] + + -- if the node is unknown, we return false + if not node_definition then + return false + end + + -- allow replacing air + if node_name == "air" then + return true + end + + -- don't replace nodes inside protections + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + + -- allow replacing liquids + if node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + return node_definition.buildable_to +end + +local player_inventory_lists = { "main", "craft" } +bones.player_inventory_lists = player_inventory_lists + +local function is_all_empty(player_inv) + for _, list_name in ipairs(player_inventory_lists) do + if not player_inv:is_empty(list_name) then + return false + end + end + return true +end + +minetest.register_on_dieplayer(function(player) + local bones_mode = minetest.settings:get("bones_mode") or "bones" + if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then + bones_mode = "bones" + end + + local bones_position_message = minetest.settings:get_bool("bones_position_message") == true + local player_name = player:get_player_name() + local pos = vector.round(player:get_pos()) + local pos_string = minetest.pos_to_string(pos) + + -- return if keep inventory set or in creative mode + if bones_mode == "keep" or minetest.is_creative_enabled(player_name) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string)) + end + return + end + + local player_inv = player:get_inventory() + if is_all_empty(player_inv) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string)) + end + return + end + + -- check if it's possible to place bones, if not find space near player + if bones_mode == "bones" and not may_replace(pos, player) then + local air = minetest.find_node_near(pos, 1, {"air"}) + if air then + pos = air + else + bones_mode = "drop" + end + end + + if bones_mode == "drop" then + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + drop(pos, player_inv:get_stack(list_name, i)) + end + player_inv:set_list(list_name, {}) + end + drop(pos, ItemStack("bones:bones")) + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Inventory dropped") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2, and dropped their inventory.", player_name, pos_string)) + end + return + end + + local param2 = minetest.dir_to_facedir(player:get_look_dir()) + minetest.set_node(pos, {name = "bones:bones", param2 = param2}) + + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2, and bones were placed.", player_name, pos_string)) + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 8 * 4) + + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + local stack = player_inv:get_stack(list_name, i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else -- no space left + drop(pos, stack) + end + end + player_inv:set_list(list_name, {}) + end + + meta:set_string("formspec", bones_formspec) + meta:set_string("owner", player_name) + + if share_bones_time ~= 0 then + meta:set_string("infotext", S("@1's fresh bones", player_name)) + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", S("@1's bones", player_name)) + end +end) diff --git a/mods/minetest_game/bones/license.txt b/mods/minetest_game/bones/license.txt new file mode 100644 index 00000000..5c20a9c9 --- /dev/null +++ b/mods/minetest_game/bones/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + diff --git a/mods/minetest_game/bones/locale/bones.de.tr b/mods/minetest_game/bones/locale/bones.de.tr new file mode 100644 index 00000000..83f5c28a --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.de.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Knochen +@1's old bones=Alte Knochen von @1 +@1 died at @2.=@1 starb bei @2. +@1 died at @2, and dropped their inventory.=@1 starb bei @2 und ließ das Inventar fallen. +@1 died at @2, and bones were placed.=@1 starb bei @2 und Knochen wurden platziert. +@1's fresh bones=Frische Knochen von @1 +@1's bones=Knochen von @1 diff --git a/mods/minetest_game/bones/locale/bones.eo.tr b/mods/minetest_game/bones/locale/bones.eo.tr new file mode 100644 index 00000000..d8028f14 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.eo.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ostoj +@1's old bones=La malfreÅaj ostoj de @1 +@1 died at @2.=@1 mortis ĉe @2 +@1 died at @2, and dropped their inventory.=@1 mortis ĉe @2, kaj delasis sian stokon. +@1 died at @2, and bones were placed.=@1 mortis ĉe @2, kaj ostoj estas demetitaj. +@1's fresh bones=La freÅaj ostoj de @1 +@1's bones=La ostoj de @1 diff --git a/mods/minetest_game/bones/locale/bones.es.tr b/mods/minetest_game/bones/locale/bones.es.tr new file mode 100644 index 00000000..9c45513c --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.es.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Huesos +@1's old bones=Huesos antiguos de @1 +@1 died at @2.=@1 murió en @2. +@1 died at @2, and dropped their inventory.=@1 murió en @2, y su inventario se desprendió. +@1 died at @2, and bones were placed.=@1 murió en @2, y sus huesos fueron depositados. +@1's fresh bones=Huesos recientes de @1 +@1's bones=Huesos de @1 diff --git a/mods/minetest_game/bones/locale/bones.fr.tr b/mods/minetest_game/bones/locale/bones.fr.tr new file mode 100644 index 00000000..cfe01ee1 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.fr.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Os +@1's old bones=Vieux os de @1 +@1 died at @2.=@1 est mort à @2. +@1 died at @2, and dropped their inventory.=@1 est mort à @2 et a laissé tomber son inventaire. +@1 died at @2, and bones were placed.=@1 est mort à @2 et ses os ont été placés. +@1's fresh bones=Os frais de @1 +@1's bones=Os de @1 diff --git a/mods/minetest_game/bones/locale/bones.id.tr b/mods/minetest_game/bones/locale/bones.id.tr new file mode 100644 index 00000000..3c81accf --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.id.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Tulang +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2 dan meninggalkan barangnya. +@1 died at @2, and bones were placed.=@1 mati di @2 dan tulangnya diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/mods/minetest_game/bones/locale/bones.it.tr b/mods/minetest_game/bones/locale/bones.it.tr new file mode 100644 index 00000000..ea3094e9 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.it.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ossa +@1's old bones=Ossa vecchie di @1 +@1 died at @2.=@1 è morto alla posizione @2. +@1 died at @2, and dropped their inventory.=@1 è morto alla posizione @2, e ha lasciato a terra il contenuto del suo inventario. +@1 died at @2, and bones were placed.=@1 è morto alla posizione @2, e vi sono state posizionate delle ossa. +@1's fresh bones=Ossa fresche di @1 +@1's bones=Ossa di @1 diff --git a/mods/minetest_game/bones/locale/bones.ja.tr b/mods/minetest_game/bones/locale/bones.ja.tr new file mode 100644 index 00000000..8c3f7328 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.ja.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=骨 +@1's old bones=@1ã®å¤ã„骨 +@1 died at @2.=@1ã¯@2ã§æ­»äº¡ã—ã¾ã—ãŸã€‚ +@1 died at @2, and dropped their inventory.=@1ã¯@2ã§æ­»äº¡ã—ã¦æŒã¡ç‰©ã‚’è½ã¨ã—ã¾ã—ãŸã€‚ +@1 died at @2, and bones were placed.=@1ã¯@2ã§æ­»äº¡ã—ã¦éª¨ãŒæ®‹ã•れã¾ã—ãŸã€‚ +@1's fresh bones=@1ã®æ–°é®®ãªéª¨ +@1's bones=@1ã®éª¨ diff --git a/mods/minetest_game/bones/locale/bones.jbo.tr b/mods/minetest_game/bones/locale/bones.jbo.tr new file mode 100644 index 00000000..cbb476e7 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.jbo.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=lo bongu gunma +@1's old bones=.i ti tolci'o ke bongu gunma po'a la'o zo'i.@1.zo'i +@1 died at @2.=.i la'o zo'i.@1.zo'i pu morsi di'o lo me zoi pos.@2.pos. +@1 died at @2, and dropped their inventory.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije ly. te farlu lo me le dacti liste po ly. +@1 died at @2, and bones were placed.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije lo bongu gunma pu se punji +@1's fresh bones=.i ti cnino ke bongu gunma po'a la'o zo'i.@1.zo'i +@1's bones=.i ti bongu gunma po'a la'o zo'i.@1.zo'i diff --git a/mods/minetest_game/bones/locale/bones.lv.tr b/mods/minetest_game/bones/locale/bones.lv.tr new file mode 100644 index 00000000..eb2fce2b --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.lv.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Kauli +@1's old bones=@1 vecie kauli +@1 died at @2.=@1 nomira @2. +@1 died at @2, and dropped their inventory.=@1 nomira @2 pazaudÄ“ja inventÄru. +@1 died at @2, and bones were placed.=@1 nomira @2, un kauli nolikti. +@1's fresh bones=@1 jaunie kauli +@1's bones=@1 kauli diff --git a/mods/minetest_game/bones/locale/bones.ms.tr b/mods/minetest_game/bones/locale/bones.ms.tr new file mode 100644 index 00000000..e4b87129 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.ms.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Tulang +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2, dan menjatuhkan inventorinya. +@1 died at @2, and bones were placed.=@1 mati di @2, dan tulang diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/mods/minetest_game/bones/locale/bones.pl.tr b/mods/minetest_game/bones/locale/bones.pl.tr new file mode 100644 index 00000000..be48a0c9 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.pl.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=KoÅ›ci +@1's old bones=Stare koÅ›ci @1 +@1 died at @2.=@1 umarÅ‚ w @2. +@1 died at @2, and dropped their inventory.=@1 umarÅ‚ w @2, i upuÅ›ciÅ‚ swój ekwipunek. +@1 died at @2, and bones were placed.=@1 umarÅ‚ w @2, koÅ›ci zostaÅ‚y poÅ‚ożone. +@1's fresh bones=Åšwieże koÅ›ci @1 +@1's bones=KoÅ›ci @1 diff --git a/mods/minetest_game/bones/locale/bones.pt_BR.tr b/mods/minetest_game/bones/locale/bones.pt_BR.tr new file mode 100644 index 00000000..31339af7 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ossos +@1's old bones=Ossos antigos de @1 +@1 died at @2.=@1 morreu em @2. +@1 died at @2, and dropped their inventory.=@1 morreu em @2, e seu inventário foi derrubado. +@1 died at @2, and bones were placed.=@1 morreu em @2, e os ossos foram colocados. +@1's fresh bones=Ossos recentes de @1 +@1's bones=Ossos de @1 diff --git a/mods/minetest_game/bones/locale/bones.ru.tr b/mods/minetest_game/bones/locale/bones.ru.tr new file mode 100644 index 00000000..0bc5eaf2 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.ru.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=КоÑти +@1's old bones=Старые коÑти @1 +@1 died at @2.=Игрок @1 умер в @2. +@1 died at @2, and dropped their inventory.=Игрок @1 умер в @2 и потерÑл Ñодержимое Ñвоего инвентарÑ. +@1 died at @2, and bones were placed.=Игрок @1 умер в @2, коÑти размещены. +@1's fresh bones=Ðовые коÑти @1 +@1's bones=КоÑти @1 diff --git a/mods/minetest_game/bones/locale/bones.sk.tr b/mods/minetest_game/bones/locale/bones.sk.tr new file mode 100644 index 00000000..a32c17de --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.sk.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Kosti +@1's old bones=Staré kosti hráÄa @1 +@1 died at @2.=@1 zomrel na pozícií @2. +@1 died at @2, and dropped their inventory.=@1 zomrel na pozícií @2 a vysypal svoj inventár. +@1 died at @2, and bones were placed.=@1 zomrel na pozícií @2 a ostali po ňom kosti. +@1's fresh bones=ÄŒerstvé kosti hráÄa @1 +@1's bones=Kosti hráÄa @1 diff --git a/mods/minetest_game/bones/locale/bones.sv.tr b/mods/minetest_game/bones/locale/bones.sv.tr new file mode 100644 index 00000000..9df9b0f0 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.sv.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ben +@1's old bones=@1s Gamla ben +@1 died at @2.=@1 dog pÃ¥ @2. +@1 died at @2, and dropped their inventory.=@1 dog pÃ¥ @2, och tappade deras saker. +@1 died at @2, and bones were placed.=@1 dog pÃ¥ @2, och deras ben var placerade. +@1's fresh bones=@1s färska ben +@1's bones=@1s ben diff --git a/mods/minetest_game/bones/locale/bones.uk.tr b/mods/minetest_game/bones/locale/bones.uk.tr new file mode 100644 index 00000000..00b4ff4e --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.uk.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=КіÑтки +@1's old bones=Старі кіÑтки @1 +@1 died at @2.=@1 загинув на координатах @2. +@1 died at @2, and dropped their inventory.=@1 загинув на координатах @2 та втратив вміÑÑ‚ Ñвого інвентарю. +@1 died at @2, and bones were placed.=@1 загинув на координатах @2, було розміщено кіÑтки. +@1's fresh bones=Свіжі кіÑтки @1 +@1's bones=КіÑтки @1 diff --git a/mods/minetest_game/bones/locale/bones.zh_CN.tr b/mods/minetest_game/bones/locale/bones.zh_CN.tr new file mode 100644 index 00000000..7911e37c --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=骨骸 +@1's old bones=@1的旧骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丢掉了所有物å“。 +@1 died at @2, and bones were placed.=@1在@2死亡,已放置骨骸。 +@1's fresh bones=@1的新鲜骨骸 +@1's bones=@1的骨骸 diff --git a/mods/minetest_game/bones/locale/bones.zh_TW.tr b/mods/minetest_game/bones/locale/bones.zh_TW.tr new file mode 100644 index 00000000..1a94d2f1 --- /dev/null +++ b/mods/minetest_game/bones/locale/bones.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=骨骸 +@1's old bones=@1的舊骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2æ­»äº¡ï¼Œä¸ŸæŽ‰äº†ç‰©å“æ¬„。 +@1 died at @2, and bones were placed.=@1在@2死亡,骨骸被放置。 +@1's fresh bones=@1的新鮮骨骸 +@1's bones=@1的骨骸 diff --git a/mods/minetest_game/bones/locale/template.txt b/mods/minetest_game/bones/locale/template.txt new file mode 100644 index 00000000..4ac8d459 --- /dev/null +++ b/mods/minetest_game/bones/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: bones +Bones= +@1's old bones= +@1 died at @2.= +@1 died at @2, and dropped their inventory.= +@1 died at @2, and bones were placed.= +@1's fresh bones= +@1's bones= diff --git a/mods/minetest_game/bones/mod.conf b/mods/minetest_game/bones/mod.conf new file mode 100644 index 00000000..371997b3 --- /dev/null +++ b/mods/minetest_game/bones/mod.conf @@ -0,0 +1,3 @@ +name = bones +description = Minetest Game mod: bones +depends = default diff --git a/mods/minetest_game/bones/textures/bones_bottom.png b/mods/minetest_game/bones/textures/bones_bottom.png new file mode 100644 index 00000000..d3d5d322 Binary files /dev/null and b/mods/minetest_game/bones/textures/bones_bottom.png differ diff --git a/mods/minetest_game/bones/textures/bones_front.png b/mods/minetest_game/bones/textures/bones_front.png new file mode 100644 index 00000000..1617d8f7 Binary files /dev/null and b/mods/minetest_game/bones/textures/bones_front.png differ diff --git a/mods/minetest_game/bones/textures/bones_rear.png b/mods/minetest_game/bones/textures/bones_rear.png new file mode 100644 index 00000000..05ee2a12 Binary files /dev/null and b/mods/minetest_game/bones/textures/bones_rear.png differ diff --git a/mods/minetest_game/bones/textures/bones_side.png b/mods/minetest_game/bones/textures/bones_side.png new file mode 100644 index 00000000..c8ac5053 Binary files /dev/null and b/mods/minetest_game/bones/textures/bones_side.png differ diff --git a/mods/minetest_game/bones/textures/bones_top.png b/mods/minetest_game/bones/textures/bones_top.png new file mode 100644 index 00000000..63786da7 Binary files /dev/null and b/mods/minetest_game/bones/textures/bones_top.png differ diff --git a/mods/minetest_game/bucket/README.txt b/mods/minetest_game/bucket/README.txt new file mode 100644 index 00000000..d19f8732 --- /dev/null +++ b/mods/minetest_game/bucket/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: bucket +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Kahrl (LGPLv2.1+) +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- +ElementW (CC BY-SA 3.0) diff --git a/mods/minetest_game/bucket/init.lua b/mods/minetest_game/bucket/init.lua new file mode 100644 index 00000000..b026ee07 --- /dev/null +++ b/mods/minetest_game/bucket/init.lua @@ -0,0 +1,248 @@ +-- Minetest Game mod: bucket +-- See README.txt for licensing and other information. + +-- Load support for MT game translation. +local S = minetest.get_translator("bucket") + + +minetest.register_alias("bucket", "bucket:bucket_empty") +minetest.register_alias("bucket_water", "bucket:bucket_water") +minetest.register_alias("bucket_lava", "bucket:bucket_lava") + +minetest.register_craft({ + output = "bucket:bucket_empty 1", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + } +}) + +bucket = {} +bucket.liquids = {} + +local function check_protection(pos, name, text) + if minetest.is_protected(pos, name) then + minetest.log("action", (name ~= "" and name or "A mod") + .. " tried to " .. text + .. " at protected position " + .. minetest.pos_to_string(pos) + .. " with a bucket") + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +local function log_action(pos, name, action) + minetest.log("action", (name ~= "" and name or "A mod") + .. " " .. action .. " at " .. minetest.pos_to_string(pos) .. " with a bucket") +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- inventory_image = texture of the new bucket item (ignored if itemname == nil) +-- name = text description of the bucket item +-- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. +-- This function can be called from any mod (that depends on bucket). +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) + bucket.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + force_renew = force_renew, + } + bucket.liquids[flowing] = bucket.liquids[source] + + if itemname ~= nil then + minetest.register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + stack_max = 1, + liquids_pointable = true, + groups = groups, + + on_place = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + + local node = minetest.get_node_or_nil(pointed_thing.under) + local ndef = node and minetest.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if ndef and ndef.on_rightclick and + not (user and user:is_player() and + user:get_player_control().sneak) then + return ndef.on_rightclick( + pointed_thing.under, + node, user, + itemstack) + end + + local lpos + + -- Check if pointing to a buildable node + if ndef and ndef.buildable_to then + -- buildable; replace the node + lpos = pointed_thing.under + else + -- not buildable to; place the liquid above + -- check if the node above can be replaced + + lpos = pointed_thing.above + node = minetest.get_node_or_nil(lpos) + local above_ndef = node and minetest.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then + -- do not remove the bucket with the liquid + return itemstack + end + end + + local pname = user and user:get_player_name() or "" + if check_protection(lpos, pname, "place "..source) then + return + end + + minetest.set_node(lpos, {name = source}) + log_action(lpos, pname, "placed " .. source) + return ItemStack("bucket:bucket_empty") + end + }) + end +end + +minetest.register_craftitem("bucket:bucket_empty", { + description = S("Empty Bucket"), + inventory_image = "bucket.png", + groups = {tool = 1}, + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "object" then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= "node" then + -- do nothing if it's neither object nor node + return + end + -- Check if pointing to a liquid source + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source then + local pname = user:get_player_name() + if check_protection(pos, pname, "take ".. node.name) then + return + end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + if inv:room_for_item("main", {name=liquiddef.itemname}) then + inv:add_item("main", liquiddef.itemname) + else + local upos = user:get_pos() + upos.y = math.floor(upos.y + 0.5) + minetest.add_item(upos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = "bucket:bucket_empty "..tostring(item_count-1) + + end + + -- force_renew requires a source neighbour + local source_neighbor = false + if liquiddef.force_renew then + source_neighbor = + minetest.find_node_near(pos, 1, liquiddef.source) + end + if source_neighbor and liquiddef.force_renew then + log_action(pos, pname, "picked up " .. liquiddef.source .. " (force renewed)") + else + minetest.add_node(pos, {name = "air"}) + log_action(pos, pname, "picked up " .. liquiddef.source) + end + + return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = minetest.registered_nodes[node.name] + if node_def then + node_def.on_punch(pos, node, user, pointed_thing) + end + return user:get_wielded_item() + end + end, +}) + +bucket.register_liquid( + "default:water_source", + "default:water_flowing", + "bucket:bucket_water", + "bucket_water.png", + S("Water Bucket"), + {tool = 1, water_bucket = 1} +) + +-- River water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + +bucket.register_liquid( + "default:river_water_source", + "default:river_water_flowing", + "bucket:bucket_river_water", + "bucket_river_water.png", + S("River Water Bucket"), + {tool = 1, water_bucket = 1}, + true +) + +bucket.register_liquid( + "default:lava_source", + "default:lava_flowing", + "bucket:bucket_lava", + "bucket_lava.png", + S("Lava Bucket"), + {tool = 1} +) + +minetest.register_craft({ + type = "fuel", + recipe = "bucket:bucket_lava", + burntime = 60, + replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}}, +}) + +-- Register buckets as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + {name = "bucket:bucket_empty", chance = 0.55}, + -- water in deserts/ice or above ground, lava otherwise + {name = "bucket:bucket_water", chance = 0.45, + types = {"sandstone", "desert", "ice"}}, + {name = "bucket:bucket_water", chance = 0.45, y = {0, 32768}, + types = {"normal"}}, + {name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1}, + types = {"normal"}}, + }) +end diff --git a/mods/minetest_game/bucket/license.txt b/mods/minetest_game/bucket/license.txt new file mode 100644 index 00000000..6245d646 --- /dev/null +++ b/mods/minetest_game/bucket/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 Kahrl +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2011-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2015-2016 ElementW + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/bucket/locale/bucket.de.tr b/mods/minetest_game/bucket/locale/bucket.de.tr new file mode 100644 index 00000000..570dff15 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.de.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Leerer Eimer +Water Bucket=Wassereimer +River Water Bucket=Flusswassereimer +Lava Bucket=Lavaeimer diff --git a/mods/minetest_game/bucket/locale/bucket.eo.tr b/mods/minetest_game/bucket/locale/bucket.eo.tr new file mode 100644 index 00000000..65d8ec88 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.eo.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Malplena sitelo +Water Bucket=Sitelo da akvo +River Water Bucket=Sitelo da rivera akvo +Lava Bucket=Sitelo da lafo diff --git a/mods/minetest_game/bucket/locale/bucket.es.tr b/mods/minetest_game/bucket/locale/bucket.es.tr new file mode 100644 index 00000000..91a06233 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.es.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Cubo vacío +Water Bucket=Cubo con agua +River Water Bucket=Cubo con agua de río +Lava Bucket=Cubo con lava diff --git a/mods/minetest_game/bucket/locale/bucket.fr.tr b/mods/minetest_game/bucket/locale/bucket.fr.tr new file mode 100644 index 00000000..5065150d --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.fr.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Seau vide +Water Bucket=Seau d'eau +River Water Bucket=Seau d'eau de rivière +Lava Bucket=Seau de lave diff --git a/mods/minetest_game/bucket/locale/bucket.id.tr b/mods/minetest_game/bucket/locale/bucket.id.tr new file mode 100644 index 00000000..56625638 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.id.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Ember Kosong +Water Bucket=Ember Air +River Water Bucket=Ember Air Sungai +Lava Bucket=Ember Lava diff --git a/mods/minetest_game/bucket/locale/bucket.it.tr b/mods/minetest_game/bucket/locale/bucket.it.tr new file mode 100644 index 00000000..beca28c7 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.it.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Secchio vuoto +Water Bucket=Secchio d'acqua +River Water Bucket=Secchio d'acqua di fiume +Lava Bucket=Secchio di lava diff --git a/mods/minetest_game/bucket/locale/bucket.ja.tr b/mods/minetest_game/bucket/locale/bucket.ja.tr new file mode 100644 index 00000000..06a401ab --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.ja.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空ã®ãƒã‚±ãƒ„ +Water Bucket=水入りãƒã‚±ãƒ„ +River Water Bucket=æ²³å·æ°´å…¥ã‚Šãƒã‚±ãƒ„ +Lava Bucket=溶岩入りãƒã‚±ãƒ„ diff --git a/mods/minetest_game/bucket/locale/bucket.jbo.tr b/mods/minetest_game/bucket/locale/bucket.jbo.tr new file mode 100644 index 00000000..e40d2b92 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.jbo.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=lo baktu be no da +Water Bucket=lo baktu be lo djacu +River Water Bucket=lo baktu be lo rirxe djacu +Lava Bucket=lo baktu be lo likro'i diff --git a/mods/minetest_game/bucket/locale/bucket.lv.tr b/mods/minetest_game/bucket/locale/bucket.lv.tr new file mode 100644 index 00000000..5d6e2c48 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.lv.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=TukÅ¡s spainis +Water Bucket=Spainis ar Å«deni +River Water Bucket=Spainis ar upes Å«deni +Lava Bucket=Spainis ar lavu diff --git a/mods/minetest_game/bucket/locale/bucket.ms.tr b/mods/minetest_game/bucket/locale/bucket.ms.tr new file mode 100644 index 00000000..02ba38a6 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.ms.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Baldi Kosong +Water Bucket=Baldi Air +River Water Bucket=Baldi Air Sungai +Lava Bucket=Baldi Lava diff --git a/mods/minetest_game/bucket/locale/bucket.pl.tr b/mods/minetest_game/bucket/locale/bucket.pl.tr new file mode 100644 index 00000000..31600f1b --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.pl.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Puste wiadro +Water Bucket=Wiadro z wodÄ… +River Water Bucket=Wiadro z rzecznÄ… wodÄ… +Lava Bucket=Wiadro z lawÄ… diff --git a/mods/minetest_game/bucket/locale/bucket.pt_BR.tr b/mods/minetest_game/bucket/locale/bucket.pt_BR.tr new file mode 100644 index 00000000..429acac0 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Balde Vazio +Water Bucket=Balde de Ãgua +River Water Bucket=Balde de Ãgua do Rio +Lava Bucket=Balde de Lava diff --git a/mods/minetest_game/bucket/locale/bucket.ru.tr b/mods/minetest_game/bucket/locale/bucket.ru.tr new file mode 100644 index 00000000..080ebfc5 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.ru.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=ПуÑтое ведро +Water Bucket=Ведро Ñ Ð²Ð¾Ð´Ð¾Ð¹ +River Water Bucket=Ведро Ñ Ñ€ÐµÑ‡Ð½Ð¾Ð¹ водой +Lava Bucket=Ведро Ñ Ð»Ð°Ð²Ð¾Ð¹ diff --git a/mods/minetest_game/bucket/locale/bucket.sk.tr b/mods/minetest_game/bucket/locale/bucket.sk.tr new file mode 100644 index 00000000..0327b20c --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.sk.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Prázdne vedro +Water Bucket=Vedro s vodou +River Water Bucket=Vedro s vodou z rieky +Lava Bucket=Vedro s lávou diff --git a/mods/minetest_game/bucket/locale/bucket.sv.tr b/mods/minetest_game/bucket/locale/bucket.sv.tr new file mode 100644 index 00000000..59ee62df --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.sv.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Tom hink +Water Bucket=Vattenhink +River Water Bucket=Flodvattenshink +Lava Bucket=Lavahink diff --git a/mods/minetest_game/bucket/locale/bucket.uk.tr b/mods/minetest_game/bucket/locale/bucket.uk.tr new file mode 100644 index 00000000..3486d1ea --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.uk.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Порожнє відро +Water Bucket=Відро з водою +River Water Bucket=Відро з річковою водою +Lava Bucket=Відро з лавою diff --git a/mods/minetest_game/bucket/locale/bucket.zh_CN.tr b/mods/minetest_game/bucket/locale/bucket.zh_CN.tr new file mode 100644 index 00000000..fda5bfcd --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空桶 +Water Bucket=æ°´æ¡¶ +River Water Bucket=河水桶 +Lava Bucket=岩浆桶 diff --git a/mods/minetest_game/bucket/locale/bucket.zh_TW.tr b/mods/minetest_game/bucket/locale/bucket.zh_TW.tr new file mode 100644 index 00000000..965d6575 --- /dev/null +++ b/mods/minetest_game/bucket/locale/bucket.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空桶 +Water Bucket=æ°´æ¡¶ +River Water Bucket=河水桶 +Lava Bucket=岩漿桶 diff --git a/mods/minetest_game/bucket/locale/template.txt b/mods/minetest_game/bucket/locale/template.txt new file mode 100644 index 00000000..a37c103b --- /dev/null +++ b/mods/minetest_game/bucket/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket= +Water Bucket= +River Water Bucket= +Lava Bucket= diff --git a/mods/minetest_game/bucket/mod.conf b/mods/minetest_game/bucket/mod.conf new file mode 100644 index 00000000..fef46873 --- /dev/null +++ b/mods/minetest_game/bucket/mod.conf @@ -0,0 +1,4 @@ +name = bucket +description = Minetest Game mod: bucket +depends = default +optional_depends = dungeon_loot diff --git a/mods/minetest_game/bucket/textures/bucket.png b/mods/minetest_game/bucket/textures/bucket.png new file mode 100644 index 00000000..17b0c493 Binary files /dev/null and b/mods/minetest_game/bucket/textures/bucket.png differ diff --git a/mods/minetest_game/bucket/textures/bucket_lava.png b/mods/minetest_game/bucket/textures/bucket_lava.png new file mode 100644 index 00000000..ac6108d9 Binary files /dev/null and b/mods/minetest_game/bucket/textures/bucket_lava.png differ diff --git a/mods/minetest_game/bucket/textures/bucket_river_water.png b/mods/minetest_game/bucket/textures/bucket_river_water.png new file mode 100644 index 00000000..d4648bb3 Binary files /dev/null and b/mods/minetest_game/bucket/textures/bucket_river_water.png differ diff --git a/mods/minetest_game/bucket/textures/bucket_water.png b/mods/minetest_game/bucket/textures/bucket_water.png new file mode 100644 index 00000000..5af836bc Binary files /dev/null and b/mods/minetest_game/bucket/textures/bucket_water.png differ diff --git a/mods/minetest_game/butterflies/README.txt b/mods/minetest_game/butterflies/README.txt new file mode 100644 index 00000000..a7f52a07 --- /dev/null +++ b/mods/minetest_game/butterflies/README.txt @@ -0,0 +1,14 @@ +Minetest Game mod: Butterflies +============================== +Adds butterflies to the world on mapgen, which can be caught in a net if the +fireflies mod is also enabled. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + butterflies_butterfly_*.png + butterflies_butterfly_*_animated.png \ No newline at end of file diff --git a/mods/minetest_game/butterflies/init.lua b/mods/minetest_game/butterflies/init.lua new file mode 100644 index 00000000..d5f692f7 --- /dev/null +++ b/mods/minetest_game/butterflies/init.lua @@ -0,0 +1,97 @@ +-- butterflies/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("butterflies") + +-- Legacy compatibility, when pointabilities don't exist, pointable is set to true. +local pointable_compat = not minetest.features.item_specific_pointabilities + +-- register butterflies +local butter_list = { + {"white", S("White Butterfly")}, + {"red", S("Red Butterfly")}, + {"violet", S("Violet Butterfly")} +} + +for i in ipairs (butter_list) do + local name = butter_list[i][1] + local desc = butter_list[i][2] + + minetest.register_node("butterflies:butterfly_"..name, { + description = desc, + drawtype = "plantlike", + tiles = {{ + name = "butterflies_butterfly_"..name.."_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3 + }, + }}, + inventory_image = "butterflies_butterfly_"..name..".png", + wield_image = "butterflies_butterfly_"..name..".png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + pointable = pointable_compat, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.set_node(pos, {name = "butterflies:hidden_butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) + + minetest.register_node("butterflies:hidden_butterfly_"..name, { + drawtype = "airlike", + inventory_image = "butterflies_butterfly_"..name..".png^default_invisible_node_overlay.png", + wield_image = "butterflies_butterfly_"..name..".png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) >= 11 then + minetest.set_node(pos, {name = "butterflies:butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) +end + +-- restart butterfly timers +minetest.register_lbm({ + name = "butterflies:butterfly_timer", + nodenames = { + "butterflies:butterfly_white", + "butterflies:butterfly_red", + "butterflies:butterfly_violet", + "butterflies:hidden_butterfly_white", + "butterflies:hidden_butterfly_red", + "butterflies:hidden_butterfly_violet", + }, + run_at_every_load = true, + + action = function(pos) + minetest.get_node_timer(pos):start(math.random(1,5)) + end, +}) \ No newline at end of file diff --git a/mods/minetest_game/butterflies/license.txt b/mods/minetest_game/butterflies/license.txt new file mode 100644 index 00000000..eebdad63 --- /dev/null +++ b/mods/minetest_game/butterflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/minetest_game/butterflies/locale/butterflies.de.tr b/mods/minetest_game/butterflies/locale/butterflies.de.tr new file mode 100644 index 00000000..2f1b982f --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.de.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Weißer Schmetterling +Red Butterfly=Roter Schmetterling +Violet Butterfly=Violetter Schmetterling diff --git a/mods/minetest_game/butterflies/locale/butterflies.eo.tr b/mods/minetest_game/butterflies/locale/butterflies.eo.tr new file mode 100644 index 00000000..be09eb74 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.eo.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Blanka papilio +Red Butterfly=RuÄa papilio +Violet Butterfly=Violkolora papilio diff --git a/mods/minetest_game/butterflies/locale/butterflies.es.tr b/mods/minetest_game/butterflies/locale/butterflies.es.tr new file mode 100644 index 00000000..59a28eb9 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.es.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Mariposa blanca +Red Butterfly=Mariposa roja +Violet Butterfly=Mariposa violeta diff --git a/mods/minetest_game/butterflies/locale/butterflies.fr.tr b/mods/minetest_game/butterflies/locale/butterflies.fr.tr new file mode 100644 index 00000000..8f5c094c --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.fr.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Papillon blanc +Red Butterfly=Papillon rouge +Violet Butterfly=Papillon violet diff --git a/mods/minetest_game/butterflies/locale/butterflies.id.tr b/mods/minetest_game/butterflies/locale/butterflies.id.tr new file mode 100644 index 00000000..d4429a6c --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.id.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Kupu-Kupu Putih +Red Butterfly=Kupu-Kupu Merah +Violet Butterfly=Kupu-Kupu Ungu diff --git a/mods/minetest_game/butterflies/locale/butterflies.it.tr b/mods/minetest_game/butterflies/locale/butterflies.it.tr new file mode 100644 index 00000000..ec65da68 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.it.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Farfalla bianca +Red Butterfly=Farfalla rossa +Violet Butterfly=Farfalla viola diff --git a/mods/minetest_game/butterflies/locale/butterflies.ja.tr b/mods/minetest_game/butterflies/locale/butterflies.ja.tr new file mode 100644 index 00000000..5a22d6bf --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.ja.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白色ã®è¶ +Red Butterfly=赤色ã®è¶ +Violet Butterfly=紫色ã®è¶ diff --git a/mods/minetest_game/butterflies/locale/butterflies.jbo.tr b/mods/minetest_game/butterflies/locale/butterflies.jbo.tr new file mode 100644 index 00000000..f003e004 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=lo blabi toldi +Red Butterfly=lo xunre toldi +Violet Butterfly=lo zirpu toldi diff --git a/mods/minetest_game/butterflies/locale/butterflies.lv.tr b/mods/minetest_game/butterflies/locale/butterflies.lv.tr new file mode 100644 index 00000000..d17eb6c4 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.lv.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Balts taurenis +Red Butterfly=Sarkans taurenis +Violet Butterfly=Violets taurenis diff --git a/mods/minetest_game/butterflies/locale/butterflies.ms.tr b/mods/minetest_game/butterflies/locale/butterflies.ms.tr new file mode 100644 index 00000000..b8bde851 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.ms.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Rama-Rama Putih +Red Butterfly=Rama-Rama Merah +Violet Butterfly=Rama-Rama Ungu diff --git a/mods/minetest_game/butterflies/locale/butterflies.pl.tr b/mods/minetest_game/butterflies/locale/butterflies.pl.tr new file mode 100644 index 00000000..577f0b88 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.pl.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=BiaÅ‚y motyl +Red Butterfly=Czerwony motyl +Violet Butterfly=Fioletowy motyl diff --git a/mods/minetest_game/butterflies/locale/butterflies.pt_BR.tr b/mods/minetest_game/butterflies/locale/butterflies.pt_BR.tr new file mode 100644 index 00000000..af3539e1 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Borboleta Branca +Red Butterfly=Borboleta Vermelha +Violet Butterfly=Borboleta Violeta diff --git a/mods/minetest_game/butterflies/locale/butterflies.ru.tr b/mods/minetest_game/butterflies/locale/butterflies.ru.tr new file mode 100644 index 00000000..6881f1c4 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.ru.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Ð‘ÐµÐ»Ð°Ñ Ð±Ð°Ð±Ð¾Ñ‡ÐºÐ° +Red Butterfly=КраÑÐ½Ð°Ñ Ð±Ð°Ð±Ð¾Ñ‡ÐºÐ° +Violet Butterfly=Ð¤Ð¸Ð¾Ð»ÐµÑ‚Ð¾Ð²Ð°Ñ Ð±Ð°Ð±Ð¾Ñ‡ÐºÐ° diff --git a/mods/minetest_game/butterflies/locale/butterflies.sk.tr b/mods/minetest_game/butterflies/locale/butterflies.sk.tr new file mode 100644 index 00000000..c3086e7f --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.sk.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Biely motýlik +Red Butterfly=ÄŒervený motýlik +Violet Butterfly=Fialový motýlik diff --git a/mods/minetest_game/butterflies/locale/butterflies.sv.tr b/mods/minetest_game/butterflies/locale/butterflies.sv.tr new file mode 100644 index 00000000..77bfb340 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.sv.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Vit fjäril +Red Butterfly=Röd fjäril +Violet Butterfly=Violett fjäril diff --git a/mods/minetest_game/butterflies/locale/butterflies.uk.tr b/mods/minetest_game/butterflies/locale/butterflies.uk.tr new file mode 100644 index 00000000..8779b000 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.uk.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Білий метелик +Red Butterfly=Червоний метелик +Violet Butterfly=Фіолетовий метелик diff --git a/mods/minetest_game/butterflies/locale/butterflies.zh_CN.tr b/mods/minetest_game/butterflies/locale/butterflies.zh_CN.tr new file mode 100644 index 00000000..24e0bd13 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白è´è¶ +Red Butterfly=红è´è¶ +Violet Butterfly=ç´«è´è¶ diff --git a/mods/minetest_game/butterflies/locale/butterflies.zh_TW.tr b/mods/minetest_game/butterflies/locale/butterflies.zh_TW.tr new file mode 100644 index 00000000..8d927c18 --- /dev/null +++ b/mods/minetest_game/butterflies/locale/butterflies.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白è´è¶ +Red Butterfly=ç´…è´è¶ +Violet Butterfly=ç´«è´è¶ diff --git a/mods/minetest_game/butterflies/locale/template.txt b/mods/minetest_game/butterflies/locale/template.txt new file mode 100644 index 00000000..d89503aa --- /dev/null +++ b/mods/minetest_game/butterflies/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly= +Red Butterfly= +Violet Butterfly= diff --git a/mods/minetest_game/butterflies/mod.conf b/mods/minetest_game/butterflies/mod.conf new file mode 100644 index 00000000..1c66497d --- /dev/null +++ b/mods/minetest_game/butterflies/mod.conf @@ -0,0 +1,3 @@ +name = butterflies +description = Minetest Game mod: Butterflies +depends = default, flowers diff --git a/mods/minetest_game/butterflies/textures/butterflies_butterfly_red.png b/mods/minetest_game/butterflies/textures/butterflies_butterfly_red.png new file mode 100644 index 00000000..8edfc365 Binary files /dev/null and b/mods/minetest_game/butterflies/textures/butterflies_butterfly_red.png differ diff --git a/mods/minetest_game/butterflies/textures/butterflies_butterfly_red_animated.png b/mods/minetest_game/butterflies/textures/butterflies_butterfly_red_animated.png new file mode 100644 index 00000000..4a2097bd Binary files /dev/null and b/mods/minetest_game/butterflies/textures/butterflies_butterfly_red_animated.png differ diff --git a/mods/minetest_game/butterflies/textures/butterflies_butterfly_violet.png b/mods/minetest_game/butterflies/textures/butterflies_butterfly_violet.png new file mode 100644 index 00000000..8b8c29dd Binary files /dev/null and b/mods/minetest_game/butterflies/textures/butterflies_butterfly_violet.png differ diff --git a/mods/minetest_game/butterflies/textures/butterflies_butterfly_violet_animated.png b/mods/minetest_game/butterflies/textures/butterflies_butterfly_violet_animated.png new file mode 100644 index 00000000..3f9d72e9 Binary files /dev/null and b/mods/minetest_game/butterflies/textures/butterflies_butterfly_violet_animated.png differ diff --git a/mods/minetest_game/butterflies/textures/butterflies_butterfly_white.png b/mods/minetest_game/butterflies/textures/butterflies_butterfly_white.png new file mode 100644 index 00000000..db4eaec8 Binary files /dev/null and b/mods/minetest_game/butterflies/textures/butterflies_butterfly_white.png differ diff --git a/mods/minetest_game/butterflies/textures/butterflies_butterfly_white_animated.png b/mods/minetest_game/butterflies/textures/butterflies_butterfly_white_animated.png new file mode 100644 index 00000000..e7cada39 Binary files /dev/null and b/mods/minetest_game/butterflies/textures/butterflies_butterfly_white_animated.png differ diff --git a/mods/minetest_game/carts/README.txt b/mods/minetest_game/carts/README.txt new file mode 100644 index 00000000..c0be2d73 --- /dev/null +++ b/mods/minetest_game/carts/README.txt @@ -0,0 +1,23 @@ +Carts (formerly boost_cart) +========================== + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). + + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + + +Features +---------- +- A fast cart for your railway or roller coaster (up to 7 m/s!) +- Boost and brake rails +- Rail junction switching with the 'right-left' walking keys +- Handbrake with the 'back' key diff --git a/mods/minetest_game/carts/cart_entity.lua b/mods/minetest_game/carts/cart_entity.lua new file mode 100644 index 00000000..3dfebe1d --- /dev/null +++ b/mods/minetest_game/carts/cart_entity.lua @@ -0,0 +1,430 @@ +-- carts/cart_entity.lua + +-- support for MT game translation. +local S = carts.get_translator + +local cart_entity = { + initial_properties = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + }, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch + old_pos = nil, + old_switch = 0, + railtype = nil, + attached_items = {} +} + +function cart_entity:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + carts:manage_attachment(clicker, nil) + elseif not self.driver then + carts:manage_attachment(clicker, self.object) + self.driver = player_name + end +end + +function cart_entity:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + if string.sub(staticdata, 1, string.len("return")) ~= "return" then + return + end + local data = minetest.deserialize(staticdata) + if type(data) ~= "table" then + return + end + self.railtype = data.railtype + self.old_dir = data.old_dir or self.old_dir +end + +function cart_entity:get_staticdata() + return minetest.serialize({ + railtype = self.railtype, + old_dir = self.old_dir + }) +end + +-- 0.5.x and later: When the driver leaves +function cart_entity:on_detach_child(child) + if child and child:get_player_name() == self.driver then + -- Clean up eye height + carts:manage_attachment(child, nil) + self.driver = nil + end +end + +function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then + local node = minetest.get_node(pos).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + -- Punched by non-player + if not puncher or not puncher:is_player() then + local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 2) + self.punched = true + return + end + -- Player digs cart by sneak-punch + if puncher:get_player_control().sneak then + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + end + -- Detach driver and items + if self.driver then + if self.old_pos then + self.object:set_pos(self.old_pos) + end + local player = minetest.get_player_by_name(self.driver) + carts:manage_attachment(player, nil) + end + for _, obj_ in ipairs(self.attached_items) do + if obj_ then + obj_:set_detach() + end + end + -- Pick up cart + local inv = puncher:get_inventory() + if not minetest.is_creative_enabled(puncher:get_player_name()) + or not inv:contains_item("main", "carts:cart") then + local leftover = inv:add_item("main", "carts:cart") + -- If no room in inventory add a replacement cart to the world + if not leftover:is_empty() then + minetest.add_item(self.object:get_pos(), leftover) + end + end + self.object:remove() + return + end + -- Player punches cart to alter velocity + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > carts.punch_speed_max then + return + end + end + + local punch_dir = carts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = carts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + local punch_interval = 1 + -- Faulty tool registrations may cause the interval to be set to 0 ! + if tool_capabilities and (tool_capabilities.full_punch_interval or 0) > 0 then + punch_interval = tool_capabilities.full_punch_interval + end + time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) + local f = 2 * (time_from_last_punch / punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_dir = cart_dir + self.punched = true +end + +local function rail_on_step_event(handler, obj, dtime) + if handler then + handler(obj, dtime) + end +end + +-- sound refresh interval = 1.0sec +local function rail_sound(self, dtime) + if not self.sound_ttl then + self.sound_ttl = 1.0 + return + elseif self.sound_ttl > 0 then + self.sound_ttl = self.sound_ttl - dtime + return + end + self.sound_ttl = 1.0 + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + local vel = self.object:get_velocity() + local speed = vector.length(vel) + if speed > 0 then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = (speed / carts.speed_max) / 2, + loop = true, + }) + end +end + +local function get_railparams(pos) + local node = minetest.get_node(pos) + return carts.railparams[node.name] or {} +end + +local v3_len = vector.length +local function rail_on_step(self, dtime) + local vel = self.object:get_velocity() + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:set_velocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local pos = self.object:get_pos() + local dir = carts:velocity_to_dir(vel) + local dir_changed = not vector.equals(dir, self.old_dir) + local update = {} + + if self.old_pos and not self.punched and not dir_changed then + local flo_pos = vector.round(pos) + local flo_old = vector.round(self.old_pos) + if vector.equals(flo_pos, flo_old) then + -- Do not check one node multiple times + return + end + end + + local ctrl, player + + -- Get player controls + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + + local stop_wiggle = false + if self.old_pos and not dir_changed then + -- Detection for "skipping" nodes (perhaps use average dtime?) + -- It's sophisticated enough to take the acceleration in account + local acc = self.object:get_acceleration() + local distance = dtime * (v3_len(vel) + 0.5 * dtime * v3_len(acc)) + + local new_pos, new_dir = carts:pathfinder( + pos, self.old_pos, self.old_dir, distance, ctrl, + self.old_switch, self.railtype + ) + + if new_pos then + -- No rail found: set to the expected position + pos = new_pos + update.pos = true + dir = new_dir + end + elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then + -- Stop wiggle + stop_wiggle = true + end + + local railparams + + -- dir: New moving direction of the cart + -- switch_keys: Currently pressed L(1) or R(2) key, + -- used to ignore the key on the next rail node + local switch_keys + dir, switch_keys = carts:get_rail_direction( + pos, dir, ctrl, self.old_switch, self.railtype + ) + dir_changed = not vector.equals(dir, self.old_dir) + + local acc = 0 + if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then + dir = vector.new(self.old_dir) + vel = {x = 0, y = 0, z = 0} + local pos_r = vector.round(pos) + if not carts:is_rail(pos_r, self.railtype) + and self.old_pos then + pos = self.old_pos + elseif not stop_wiggle then + -- End of rail: Smooth out. + pos = pos_r + dir_changed = false + dir.y = 0 + else + pos.y = math.floor(pos.y + 0.5) + end + update.pos = true + update.vel = true + else + -- Direction change detected + if dir_changed then + vel = vector.multiply(dir, math.abs(vel.x + vel.z)) + update.vel = true + if dir.y ~= self.old_dir.y then + pos = vector.round(pos) + update.pos = true + end + end + -- Center on the rail + if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + + -- Slow down or speed up.. + acc = dir.y * -4.0 + + -- Get rail for corrected position + railparams = get_railparams(pos) + + -- no need to check for railparams == nil since we always make it exist. + local speed_mod = railparams.acceleration + if speed_mod and speed_mod ~= 0 then + -- Try to make it similar to the original carts mod + acc = acc + speed_mod + else + -- Handbrake or coast + if ctrl and ctrl.down then + acc = acc - 3 + else + acc = acc - 0.4 + end + end + end + + -- Limit cart speed + local vel_len = vector.length(vel) + if vel_len > carts.speed_max then + vel = vector.multiply(vel, carts.speed_max / vel_len) + update.vel = true + end + if vel_len >= carts.speed_max and acc > 0 then + acc = 0 + end + + self.object:set_acceleration(vector.multiply(dir, acc)) + + self.old_pos = vector.round(pos) + self.old_dir = vector.new(dir) + self.old_switch = switch_keys + + if self.punched then + -- Collect dropped items + for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local ent = obj_:get_luaentity() + -- Careful here: physical_state and disable_physics are item-internal APIs + if ent and ent.name == "__builtin:item" and ent.physical_state then + ent:disable_physics() + obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + self.attached_items[#self.attached_items + 1] = obj_ + end + end + self.punched = false + update.vel = true + end + + railparams = railparams or get_railparams(pos) + + if not (update.vel or update.pos) then + rail_on_step_event(railparams.on_step, self, dtime) + return + end + + local yaw = 0 + if dir.x < 0 then + yaw = 0.5 + elseif dir.x > 0 then + yaw = 1.5 + elseif dir.z < 0 then + yaw = 1 + end + self.object:set_yaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + if update.vel then + self.object:set_velocity(vel) + end + if update.pos then + if dir_changed then + self.object:set_pos(pos) + else + self.object:move_to(pos) + end + end + + -- call event handler + rail_on_step_event(railparams.on_step, self, dtime) +end + +function cart_entity:on_step(dtime) + rail_on_step(self, dtime) + rail_sound(self, dtime) +end + +minetest.register_entity("carts:cart", cart_entity) + +minetest.register_craftitem("carts:cart", { + description = S("Cart") .. "\n" .. S("(Sneak+Click to pick up)"), + inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_front.png", "carts_cart_side.png"), + wield_image = "carts_cart_front.png", + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return + end + if carts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "carts:cart") + elseif carts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "carts:cart") + else + return + end + + minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, + {pos = pointed_thing.above}, true) + + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "carts:cart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/mods/minetest_game/carts/functions.lua b/mods/minetest_game/carts/functions.lua new file mode 100644 index 00000000..36b7e129 --- /dev/null +++ b/mods/minetest_game/carts/functions.lua @@ -0,0 +1,252 @@ +function carts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function carts:manage_attachment(player, obj) + if not player then + return + end + local status = obj ~= nil + local player_name = player:get_player_name() + if obj and player:get_attach() == obj then + return + end + player_api.player_attached[player_name] = status + + if status then + player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + + -- player_api does not update the animation + -- when the player is attached, reset to default animation + player_api.set_animation(player, "stand") + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end +end + +function carts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=carts:get_sign(v.x), y=carts:get_sign(v.y), z=0} + else + return {x=0, y=carts:get_sign(v.y), z=carts:get_sign(v.z)} + end +end + +function carts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function carts:check_front_up_down(pos, dir_, check_up, railtype) + local dir = vector.new(dir_) + local cur + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_up then + dir.y = 1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + local straight_priority = ctrl and dir.y ~= 0 + + -- Normal, to disallow rail switching up- & downhill + if straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = self:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = self:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + if not straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + + -- Left, if not already checked + if left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = carts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function carts:pathfinder(pos_, old_pos, old_dir, distance, ctrl, + pf_switch, railtype) + + local pos = vector.round(pos_) + if vector.equals(old_pos, pos) then + return + end + + local pf_pos = vector.round(old_pos) + local pf_dir = vector.new(old_dir) + distance = math.min(carts.path_distance_max, + math.floor(distance + 1)) + + for i = 1, distance do + pf_dir, pf_switch = self:get_rail_direction( + pf_pos, pf_dir, ctrl, pf_switch or 0, railtype) + + if vector.equals(pf_dir, {x=0, y=0, z=0}) then + -- No way forwards + return pf_pos, pf_dir + end + + pf_pos = vector.add(pf_pos, pf_dir) + + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return + end + end + -- Not found. Put cart to predicted position + return pf_pos, pf_dir +end + +function carts:register_rail(name, def_overwrite, railparams) + local def = { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + sounds = default.node_sound_metal_defaults() + } + for k, v in pairs(def_overwrite) do + def[k] = v + end + if not def.inventory_image then + def.wield_image = def.tiles[1] + def.inventory_image = def.tiles[1] + end + + if railparams then + carts.railparams[name] = table.copy(railparams) + end + + minetest.register_node(name, def) +end + +function carts:get_rail_groups(additional_groups) + -- Get the default rail groups and add more when a table is given + local groups = { + dig_immediate = 2, + attached_node = 1, + rail = 1, + connect_to_raillike = minetest.raillike_group("rail") + } + if type(additional_groups) == "table" then + for k, v in pairs(additional_groups) do + groups[k] = v + end + end + return groups +end diff --git a/mods/minetest_game/carts/init.lua b/mods/minetest_game/carts/init.lua new file mode 100644 index 00000000..69d59d9f --- /dev/null +++ b/mods/minetest_game/carts/init.lua @@ -0,0 +1,28 @@ +-- carts/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("carts") + +carts = {} +carts.modpath = minetest.get_modpath("carts") +carts.railparams = {} +carts.get_translator = S + +-- Maximal speed of the cart in m/s (min = -1) +carts.speed_max = 7 +-- Set to -1 to disable punching the cart from inside (min = -1) +carts.punch_speed_max = 5 +-- Maximal distance for the path correction (for dtime peaks) +carts.path_distance_max = 3 + + +dofile(carts.modpath.."/functions.lua") +dofile(carts.modpath.."/rails.lua") +dofile(carts.modpath.."/cart_entity.lua") + +-- Register rails as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + name = "carts:rail", chance = 0.35, count = {1, 6} + }) +end diff --git a/mods/minetest_game/carts/license.txt b/mods/minetest_game/carts/license.txt new file mode 100644 index 00000000..e2781aca --- /dev/null +++ b/mods/minetest_game/carts/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/mods/minetest_game/carts/locale/carts.de.tr b/mods/minetest_game/carts/locale/carts.de.tr new file mode 100644 index 00000000..89a33ac3 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.de.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Lore +(Sneak+Click to pick up)=(Schleichen u. Klicken zum Aufheben) +Rail=Schiene +Powered Rail=Antriebsschiene +Brake Rail=Bremsschiene diff --git a/mods/minetest_game/carts/locale/carts.eo.tr b/mods/minetest_game/carts/locale/carts.eo.tr new file mode 100644 index 00000000..22b5280a --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.eo.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Ĉaro +(Sneak+Click to pick up)=(Åœteliri+Alklaki por reprini) +Rail=Relo +Powered Rail=Elektra relo +Brake Rail=Bremsa relo diff --git a/mods/minetest_game/carts/locale/carts.es.tr b/mods/minetest_game/carts/locale/carts.es.tr new file mode 100644 index 00000000..c0857a1b --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.es.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagoneta +(Sneak+Click to pick up)=(Agacharse+Clic para recoger) +Rail=Raíl +Powered Rail=Raíl energizado +Brake Rail=Raíl de frenado diff --git a/mods/minetest_game/carts/locale/carts.fr.tr b/mods/minetest_game/carts/locale/carts.fr.tr new file mode 100644 index 00000000..b092f14d --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.fr.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Chariot +(Sneak+Click to pick up)=(Se baisser + clic pour ramasser) +Rail=Rail +Powered Rail=Rail de traction +Brake Rail=Rail de freinage diff --git a/mods/minetest_game/carts/locale/carts.id.tr b/mods/minetest_game/carts/locale/carts.id.tr new file mode 100644 index 00000000..ce0db926 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.id.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Kereta +(Sneak+Click to pick up)=(Menyelinap + Klik untuk ambil) +Rail=Rel +Powered Rail=Rel Bertenaga +Brake Rail=Rel Rem diff --git a/mods/minetest_game/carts/locale/carts.it.tr b/mods/minetest_game/carts/locale/carts.it.tr new file mode 100644 index 00000000..c28e403e --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.it.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagone +(Sneak+Click to pick up)=(Strisciare+Click per raccoglierlo) +Rail=Binario +Powered Rail=Binario alimentato +Brake Rail=Binario freno diff --git a/mods/minetest_game/carts/locale/carts.ja.tr b/mods/minetest_game/carts/locale/carts.ja.tr new file mode 100644 index 00000000..30c14ce2 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.ja.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=トロッコ +(Sneak+Click to pick up)=(スニークキーã¨ã‚¯ãƒªãƒƒã‚¯ã§ä¹—りã¾ã™) +Rail=レール +Powered Rail=パワードレール +Brake Rail=ブレーキレール diff --git a/mods/minetest_game/carts/locale/carts.jbo.tr b/mods/minetest_game/carts/locale/carts.jbo.tr new file mode 100644 index 00000000..b48c5423 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.jbo.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=lo carce +(Sneak+Click to pick up)=to lo nu dzibi'o je cu samxa'e te cabra cu tadji lo nu lebna toi +Rail=lo teryre'e +Powered Rail=lo se dikca teryre'e +Brake Rail=lo terjabre teryre'e diff --git a/mods/minetest_game/carts/locale/carts.lv.tr b/mods/minetest_game/carts/locale/carts.lv.tr new file mode 100644 index 00000000..91fc6631 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.lv.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagons +(Sneak+Click to pick up)=(Lavieties un klikšķiniet, lai paceltu) +Rail=Sliedes +Powered Rail=ElektrizÄ“tas sliedes +Brake Rail=Bremžu sliedes diff --git a/mods/minetest_game/carts/locale/carts.ms.tr b/mods/minetest_game/carts/locale/carts.ms.tr new file mode 100644 index 00000000..e8944e9a --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.ms.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Pedati +(Sneak+Click to pick up)=(Selinap+Klik untuk ambil balik) +Rail=Landasan +Powered Rail=Landasan Berkuasa +Brake Rail=Landasan Brek diff --git a/mods/minetest_game/carts/locale/carts.pl.tr b/mods/minetest_game/carts/locale/carts.pl.tr new file mode 100644 index 00000000..d0cb8792 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.pl.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Wagonik +(Sneak+Click to pick up)=(Skradanie+NaciÅ›nij aby zebrać) +Rail=Tory +Powered Rail=NapÄ™dzane tory +Brake Rail=HamujÄ…ce tory diff --git a/mods/minetest_game/carts/locale/carts.pt_BR.tr b/mods/minetest_game/carts/locale/carts.pt_BR.tr new file mode 100644 index 00000000..b92f91ea --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Carrinho +(Sneak+Click to pick up)=(Esgueirar + Clique para pegar) +Rail=Trilho +Powered Rail=Trilho Energizado +Brake Rail=Trilho de Freio diff --git a/mods/minetest_game/carts/locale/carts.ru.tr b/mods/minetest_game/carts/locale/carts.ru.tr new file mode 100644 index 00000000..cd683be4 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.ru.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Вагонетка +(Sneak+Click to pick up)=(ПригнитеÑÑŒ и кликните по вагонетке, чтобы забрать) +Rail=РельÑÑ‹ +Powered Rail=УÑкорÑющие рельÑÑ‹ +Brake Rail=ТормозÑщие рельÑÑ‹ diff --git a/mods/minetest_game/carts/locale/carts.sk.tr b/mods/minetest_game/carts/locale/carts.sk.tr new file mode 100644 index 00000000..6303a49b --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.sk.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vozík +(Sneak+Click to pick up)=(Zakrádanie sa + Klik pre zdvihnutie) +Rail=Koľajnica +Powered Rail=Koľajnica s pohonom +Brake Rail=Brzdná koľajnica diff --git a/mods/minetest_game/carts/locale/carts.sv.tr b/mods/minetest_game/carts/locale/carts.sv.tr new file mode 100644 index 00000000..0521ca85 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.sv.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagn +(Sneak+Click to pick up)=(Shift+Klicka för att plocka upp) +Rail=Räls +Powered Rail=Aktiverad räls +Brake Rail=Bromsräls diff --git a/mods/minetest_game/carts/locale/carts.uk.tr b/mods/minetest_game/carts/locale/carts.uk.tr new file mode 100644 index 00000000..3e16c722 --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.uk.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Вагонетка +(Sneak+Click to pick up)=(ПригнітьÑÑ Ñ‚Ð° натиÑніть, щоби підібрати) +Rail=Рейки +Powered Rail=Електричні рейки +Brake Rail=Гальмівні рейки diff --git a/mods/minetest_game/carts/locale/carts.zh_CN.tr b/mods/minetest_game/carts/locale/carts.zh_CN.tr new file mode 100644 index 00000000..953cdefc --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.zh_CN.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=矿车 +(Sneak+Click to pick up)=(潜行+å•击以æ¡èµ·ï¼‰ +Rail=é“轨 +Powered Rail=动力é“轨 +Brake Rail=制动é“轨 diff --git a/mods/minetest_game/carts/locale/carts.zh_TW.tr b/mods/minetest_game/carts/locale/carts.zh_TW.tr new file mode 100644 index 00000000..f6300d4a --- /dev/null +++ b/mods/minetest_game/carts/locale/carts.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=礦車 +(Sneak+Click to pick up)=(潛行+單擊以撿起) +Rail=éµè»Œ +Powered Rail=動力éµè»Œ +Brake Rail=制動éµè»Œ diff --git a/mods/minetest_game/carts/locale/template.txt b/mods/minetest_game/carts/locale/template.txt new file mode 100644 index 00000000..a67d95fd --- /dev/null +++ b/mods/minetest_game/carts/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: carts +Cart= +(Sneak+Click to pick up)= +Rail= +Powered Rail= +Brake Rail= diff --git a/mods/minetest_game/carts/mod.conf b/mods/minetest_game/carts/mod.conf new file mode 100644 index 00000000..0eab35c3 --- /dev/null +++ b/mods/minetest_game/carts/mod.conf @@ -0,0 +1,4 @@ +name = carts +description = Carts (formerly boost_cart) +depends = default, player_api +optional_depends = dungeon_loot diff --git a/mods/minetest_game/carts/models/carts_cart.b3d b/mods/minetest_game/carts/models/carts_cart.b3d new file mode 100644 index 00000000..b8b7c3a1 Binary files /dev/null and b/mods/minetest_game/carts/models/carts_cart.b3d differ diff --git a/mods/minetest_game/carts/rails.lua b/mods/minetest_game/carts/rails.lua new file mode 100644 index 00000000..8bd2ba1e --- /dev/null +++ b/mods/minetest_game/carts/rails.lua @@ -0,0 +1,64 @@ +-- carts/rails.lua + +-- support for MT game translation. +local S = carts.get_translator + +carts:register_rail("carts:rail", { + description = S("Rail"), + tiles = { + "carts_rail_straight.png", "carts_rail_curved.png", + "carts_rail_t_junction.png", "carts_rail_crossing.png" + }, + inventory_image = "carts_rail_straight.png", + wield_image = "carts_rail_straight.png", + groups = carts:get_rail_groups(), +}, {}) + +minetest.register_craft({ + output = "carts:rail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + +minetest.register_alias("default:rail", "carts:rail") + + +carts:register_rail("carts:powerrail", { + description = S("Powered Rail"), + tiles = { + "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", + "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = 5}) + +minetest.register_craft({ + output = "carts:powerrail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + + +carts:register_rail("carts:brakerail", { + description = S("Brake Rail"), + tiles = { + "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", + "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = -3}) + +minetest.register_craft({ + output = "carts:brakerail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) diff --git a/mods/minetest_game/carts/sounds/carts_cart_moving.1.ogg b/mods/minetest_game/carts/sounds/carts_cart_moving.1.ogg new file mode 100644 index 00000000..869e765b Binary files /dev/null and b/mods/minetest_game/carts/sounds/carts_cart_moving.1.ogg differ diff --git a/mods/minetest_game/carts/sounds/carts_cart_moving.2.ogg b/mods/minetest_game/carts/sounds/carts_cart_moving.2.ogg new file mode 100644 index 00000000..b4cc5084 Binary files /dev/null and b/mods/minetest_game/carts/sounds/carts_cart_moving.2.ogg differ diff --git a/mods/minetest_game/carts/sounds/carts_cart_moving.3.ogg b/mods/minetest_game/carts/sounds/carts_cart_moving.3.ogg new file mode 100644 index 00000000..e19a782d Binary files /dev/null and b/mods/minetest_game/carts/sounds/carts_cart_moving.3.ogg differ diff --git a/mods/minetest_game/carts/textures/carts_cart.png b/mods/minetest_game/carts/textures/carts_cart.png new file mode 100644 index 00000000..dd6c88cc Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_cart.png differ diff --git a/mods/minetest_game/carts/textures/carts_cart_front.png b/mods/minetest_game/carts/textures/carts_cart_front.png new file mode 100644 index 00000000..0b3015be Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_cart_front.png differ diff --git a/mods/minetest_game/carts/textures/carts_cart_side.png b/mods/minetest_game/carts/textures/carts_cart_side.png new file mode 100644 index 00000000..69b7fdd2 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_cart_side.png differ diff --git a/mods/minetest_game/carts/textures/carts_cart_top.png b/mods/minetest_game/carts/textures/carts_cart_top.png new file mode 100644 index 00000000..89594837 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_cart_top.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_crossing.png b/mods/minetest_game/carts/textures/carts_rail_crossing.png new file mode 100644 index 00000000..99dab9e4 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_crossing.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_crossing_brk.png b/mods/minetest_game/carts/textures/carts_rail_crossing_brk.png new file mode 100644 index 00000000..ae71d7e4 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_crossing_brk.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_crossing_pwr.png b/mods/minetest_game/carts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 00000000..fc57b08a Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_crossing_pwr.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_curved.png b/mods/minetest_game/carts/textures/carts_rail_curved.png new file mode 100644 index 00000000..cb1beac2 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_curved.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_curved_brk.png b/mods/minetest_game/carts/textures/carts_rail_curved_brk.png new file mode 100644 index 00000000..cff2a30c Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_curved_brk.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_curved_pwr.png b/mods/minetest_game/carts/textures/carts_rail_curved_pwr.png new file mode 100644 index 00000000..2cd0770f Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_curved_pwr.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_straight.png b/mods/minetest_game/carts/textures/carts_rail_straight.png new file mode 100644 index 00000000..764333b7 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_straight.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_straight_brk.png b/mods/minetest_game/carts/textures/carts_rail_straight_brk.png new file mode 100644 index 00000000..cea7b1b3 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_straight_brk.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_straight_pwr.png b/mods/minetest_game/carts/textures/carts_rail_straight_pwr.png new file mode 100644 index 00000000..764fa611 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_straight_pwr.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_t_junction.png b/mods/minetest_game/carts/textures/carts_rail_t_junction.png new file mode 100644 index 00000000..0f3fd25a Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_t_junction.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_t_junction_brk.png b/mods/minetest_game/carts/textures/carts_rail_t_junction_brk.png new file mode 100644 index 00000000..5905d011 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_t_junction_brk.png differ diff --git a/mods/minetest_game/carts/textures/carts_rail_t_junction_pwr.png b/mods/minetest_game/carts/textures/carts_rail_t_junction_pwr.png new file mode 100644 index 00000000..56565553 Binary files /dev/null and b/mods/minetest_game/carts/textures/carts_rail_t_junction_pwr.png differ diff --git a/mods/minetest_game/creative/README.txt b/mods/minetest_game/creative/README.txt new file mode 100644 index 00000000..32e8d22a --- /dev/null +++ b/mods/minetest_game/creative/README.txt @@ -0,0 +1,17 @@ +Minetest Game mod: creative +=========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Jean-Patrick G. (kilbith) (MIT) + +Author of media (textures) +-------------------------- +paramat (CC BY-SA 3.0): +* creative_prev_icon.png +* creative_next_icon.png +* creative_search_icon.png +* creative_clear_icon.png +* creative_trash_icon.png derived from a texture by kilbith (CC BY-SA 3.0) diff --git a/mods/minetest_game/creative/init.lua b/mods/minetest_game/creative/init.lua new file mode 100644 index 00000000..f345697e --- /dev/null +++ b/mods/minetest_game/creative/init.lua @@ -0,0 +1,103 @@ +-- creative/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("creative") + +creative = {} +creative.get_translator = S + +local function update_sfinv(name) + minetest.after(0, function() + local player = minetest.get_player_by_name(name) + if player then + if sfinv.get_page(player):sub(1, 9) == "creative:" then + sfinv.set_page(player, sfinv.get_homepage_name(player)) + else + sfinv.set_player_inventory_formspec(player) + end + end + end) +end + +minetest.register_privilege("creative", { + description = S("Allow player to use creative inventory"), + give_to_singleplayer = false, + give_to_admin = false, + on_grant = update_sfinv, + on_revoke = update_sfinv, +}) + +-- Override the engine's creative mode function +local old_is_creative_enabled = minetest.is_creative_enabled + +function minetest.is_creative_enabled(name) + if name == "" then + return old_is_creative_enabled(name) + end + return minetest.check_player_privs(name, {creative = true}) or + old_is_creative_enabled(name) +end + +-- For backwards compatibility: +function creative.is_enabled_for(name) + return minetest.is_creative_enabled(name) +end + +dofile(minetest.get_modpath("creative") .. "/inventory.lua") + +if minetest.is_creative_enabled("") then + minetest.register_on_mods_loaded(function() + -- Dig time is modified according to difference (leveldiff) between tool + -- 'maxlevel' and node 'level'. Digtime is divided by the larger of + -- leveldiff and 1. + -- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been + -- increased such that nodes of differing levels have an insignificant + -- effect on digtime. + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + -- Override the hand tool + minetest.override_item("", { + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + -- dig_immediate group doesn't use value 1. Value 3 is instant dig + dig_immediate = + {times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256}, + }, + damage_groups = {fleshy = 10}, + } + }) + end) +end + +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + if placer and placer:is_player() then + return minetest.is_creative_enabled(placer:get_player_name()) + end +end) + +-- Don't pick up if the item is already in the inventory +local old_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() or + not minetest.is_creative_enabled(digger:get_player_name()) then + return old_handle_node_drops(pos, drops, digger) + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end +end diff --git a/mods/minetest_game/creative/inventory.lua b/mods/minetest_game/creative/inventory.lua new file mode 100644 index 00000000..f018afe1 --- /dev/null +++ b/mods/minetest_game/creative/inventory.lua @@ -0,0 +1,261 @@ +-- creative/inventory.lua + +-- support for MT game translation. +local S = creative.get_translator + +local player_inventory = {} +local inventory_cache = {} + +local function init_creative_cache(items) + inventory_cache[items] = {} + local i_cache = inventory_cache[items] + + for name, def in pairs(items) do + if def.groups.not_in_creative_inventory ~= 1 and + def.description and def.description ~= "" then + i_cache[name] = def + end + end + table.sort(i_cache) + return i_cache +end + +function creative.init_creative_inventory(player) + local player_name = player:get_player_name() + player_inventory[player_name] = { + size = 0, + filter = "", + start_i = 0, + old_filter = nil, -- use only for caching in update_creative_inventory + old_content = nil + } + + minetest.create_detached_inventory("creative_" .. player_name, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + local name = player2 and player2:get_player_name() or "" + if not minetest.is_creative_enabled(name) or + to_list == "main" then + return 0 + end + return count + end, + allow_put = function(inv, listname, index, stack, player2) + return 0 + end, + allow_take = function(inv, listname, index, stack, player2) + local name = player2 and player2:get_player_name() or "" + if not minetest.is_creative_enabled(name) then + return 0 + end + return -1 + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + end, + on_take = function(inv, listname, index, stack, player2) + if stack and stack:get_count() > 0 then + minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory") + end + end, + }, player_name) + + return player_inventory[player_name] +end + +local NO_MATCH = 999 +local function match(s, filter) + if filter == "" then + return 0 + end + if s:lower():find(filter, 1, true) then + return #s - #filter + end + return NO_MATCH +end + +local function description(def, lang_code) + local s = def.description + if lang_code then + s = minetest.get_translated_string(lang_code, s) + end + return s:gsub("\n.*", "") -- First line only +end + +function creative.update_creative_inventory(player_name, tab_content) + local inv = player_inventory[player_name] or + creative.init_creative_inventory(minetest.get_player_by_name(player_name)) + local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) + + if inv.filter == inv.old_filter and tab_content == inv.old_content then + return + end + inv.old_filter = inv.filter + inv.old_content = tab_content + + local items = inventory_cache[tab_content] or init_creative_cache(tab_content) + + local lang + local player_info = minetest.get_player_information(player_name) + if player_info and player_info.lang_code ~= "" then + lang = player_info.lang_code + end + + local creative_list = {} + local order = {} + for name, def in pairs(items) do + local m = match(description(def), inv.filter) + if m > 0 then + m = math.min(m, match(description(def, lang), inv.filter)) + end + if m > 0 then + m = math.min(m, match(name, inv.filter)) + end + + if m < NO_MATCH then + creative_list[#creative_list+1] = name + -- Sort by match value first so closer matches appear earlier + order[name] = string.format("%02d", m) .. name + end + end + + table.sort(creative_list, function(a, b) return order[a] < order[b] end) + + player_inv:set_size("main", #creative_list) + player_inv:set_list("main", creative_list) + inv.size = #creative_list +end + +-- Create the trash field +local trash = minetest.create_detached_inventory("trash", { + -- Allow the stack to be placed and remove it in on_put() + -- This allows the creative inventory to restore the stack + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() + end, + on_put = function(inv, listname) + inv:set_list(listname, {}) + end, +}) +trash:set_size("main", 1) + +creative.formspec_add = "" + +function creative.register_tab(name, title, items) + sfinv.register_page("creative:" .. name, { + title = title, + is_in_nav = function(self, player, context) + return minetest.is_creative_enabled(player:get_player_name()) + end, + get = function(self, player, context) + local player_name = player:get_player_name() + creative.update_creative_inventory(player_name, items) + local inv = player_inventory[player_name] + local pagenum = math.floor(inv.start_i / (4*8) + 1) + local pagemax = math.max(math.ceil(inv.size / (4*8)), 1) + local esc = minetest.formspec_escape + return sfinv.make_formspec(player, context, + (inv.size == 0 and ("label[3,2;"..esc(S("No items to show.")).."]") or "") .. + "label[5.8,4.15;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" .. + [[ + image[4.08,4.2;0.8,0.8;creative_trash_icon.png] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] + list[detached:trash;main;4.02,4.1;1,1;] + listring[] + image_button[5,4.05;0.8,0.8;creative_prev_icon.png;creative_prev;] + image_button[7.25,4.05;0.8,0.8;creative_next_icon.png;creative_next;] + image_button[2.63,4.05;0.8,0.8;creative_search_icon.png;creative_search;] + image_button[3.25,4.05;0.8,0.8;creative_clear_icon.png;creative_clear;] + ]] .. + "tooltip[creative_search;" .. esc(S("Search")) .. "]" .. + "tooltip[creative_clear;" .. esc(S("Reset")) .. "]" .. + "tooltip[creative_prev;" .. esc(S("Previous page")) .. "]" .. + "tooltip[creative_next;" .. esc(S("Next page")) .. "]" .. + "listring[current_player;main]" .. + "field_enter_after_edit[creative_filter;true]" .. + "field_close_on_enter[creative_filter;false]" .. + "field[0.3,4.2;2.8,1.2;creative_filter;;" .. esc(inv.filter) .. "]" .. + "listring[detached:creative_" .. player_name .. ";main]" .. + "list[detached:creative_" .. player_name .. ";main;0,0;8,4;" .. tostring(inv.start_i) .. "]" .. + creative.formspec_add, true) + end, + on_enter = function(self, player, context) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + if inv then + inv.start_i = 0 + end + end, + on_player_receive_fields = function(self, player, context, fields) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + assert(inv) + + if fields.creative_clear then + inv.start_i = 0 + inv.filter = "" + sfinv.set_player_inventory_formspec(player, context) + elseif (fields.creative_search or + fields.key_enter_field == "creative_filter") + and fields.creative_filter then + inv.start_i = 0 + inv.filter = fields.creative_filter:sub(1, 128) -- truncate to a sane length + :gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + :lower() -- search is case insensitive + sfinv.set_player_inventory_formspec(player, context) + elseif not fields.quit then + local start_i = inv.start_i or 0 + + if fields.creative_prev then + start_i = start_i - 4*8 + if start_i < 0 then + start_i = inv.size - (inv.size % (4*8)) + if inv.size == start_i then + start_i = math.max(0, inv.size - (4*8)) + end + end + elseif fields.creative_next then + start_i = start_i + 4*8 + if start_i >= inv.size then + start_i = 0 + end + end + + inv.start_i = start_i + sfinv.set_player_inventory_formspec(player, context) + end + end + }) +end + +-- Sort registered items +local registered_nodes = {} +local registered_tools = {} +local registered_craftitems = {} + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_items) do + local group = def.groups or {} + + local nogroup = not (group.node or group.tool or group.craftitem) + if group.node or (nogroup and minetest.registered_nodes[name]) then + registered_nodes[name] = def + elseif group.tool or (nogroup and minetest.registered_tools[name]) then + registered_tools[name] = def + elseif group.craftitem or (nogroup and minetest.registered_craftitems[name]) then + registered_craftitems[name] = def + end + end +end) + +creative.register_tab("all", S("All"), minetest.registered_items) +creative.register_tab("nodes", S("Nodes"), registered_nodes) +creative.register_tab("tools", S("Tools"), registered_tools) +creative.register_tab("craftitems", S("Items"), registered_craftitems) + +local old_homepage_name = sfinv.get_homepage_name +function sfinv.get_homepage_name(player) + if minetest.is_creative_enabled(player:get_player_name()) then + return "creative:all" + else + return old_homepage_name(player) + end +end diff --git a/mods/minetest_game/creative/license.txt b/mods/minetest_game/creative/license.txt new file mode 100644 index 00000000..50ff9c74 --- /dev/null +++ b/mods/minetest_game/creative/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 Jean-Patrick G. (kilbith) +Copyright (C) 2018 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/creative/locale/creative.de.tr b/mods/minetest_game/creative/locale/creative.de.tr new file mode 100644 index 00000000..ddd88ddc --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.de.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Spieler erlauben, das Kreativinventar zu benutzen +No items to show.=Keine Gegenstände vorhanden. +Search=Suchen +Reset=Zurücksetzen +Previous page=Vorherige Seite +Next page=Nächste Seite +All=Alles +Nodes=Blöcke +Tools=Werkzeuge +Items=Gegenstände diff --git a/mods/minetest_game/creative/locale/creative.eo.tr b/mods/minetest_game/creative/locale/creative.eo.tr new file mode 100644 index 00000000..8142baf6 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.eo.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permesi ke la ludanto uzu la kreeman stokon +No items to show.= +Search=Serĉi +Reset=Rekomencigi +Previous page=AntaÅ­a paÄo +Next page=Sekva paÄo +All=Ĉio +Nodes=Nodoj +Tools=Iloj +Items=Objektoj diff --git a/mods/minetest_game/creative/locale/creative.es.tr b/mods/minetest_game/creative/locale/creative.es.tr new file mode 100644 index 00000000..ceeb32fc --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.es.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permitir al jugador usar el inventario creativo +No items to show.=Sin artículos que mostrar. +Search=Buscar +Reset=Reiniciar +Previous page=Pág. siguiente +Next page=Pág. anterior +All=Todos +Nodes=Nodos +Tools=Herramientas +Items=Objetos diff --git a/mods/minetest_game/creative/locale/creative.fr.tr b/mods/minetest_game/creative/locale/creative.fr.tr new file mode 100644 index 00000000..89a42226 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.fr.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permettre aux joueurs d'utiliser l'inventaire du mode créatif +No items to show.= +Search=Rechercher +Reset=Réinitialiser +Previous page=Page précédente +Next page=Page suivante +All=Tout +Nodes=NÅ“uds +Tools=Outils +Items=Article diff --git a/mods/minetest_game/creative/locale/creative.id.tr b/mods/minetest_game/creative/locale/creative.id.tr new file mode 100644 index 00000000..5b859c4e --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.id.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Bolehkan pemain menggunakan inventaris kreatif +No items to show.=Tiada barang untuk ditampilkan. +Search=Cari +Reset=Atur ulang +Previous page=Halaman sebelumnya +Next page=Halaman selanjutnya +All=Semua +Nodes=Nodus +Tools=Perkakas +Items=Barang diff --git a/mods/minetest_game/creative/locale/creative.it.tr b/mods/minetest_game/creative/locale/creative.it.tr new file mode 100644 index 00000000..736bc941 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.it.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permette al giocatore di usare l'inventario creativo +No items to show.= +Search=Cerca +Reset=Azzera +Previous page=Pagina precedente +Next page=Pagina successiva +All=Tutto +Nodes=Nodi +Tools=Strumenti +Items=Oggetti diff --git a/mods/minetest_game/creative/locale/creative.ja.tr b/mods/minetest_game/creative/locale/creative.ja.tr new file mode 100644 index 00000000..2d734e52 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.ja.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=プレーヤーã«ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ– インベントリーã®ä½¿ç”¨ã‚’許å¯ã™ã‚‹ +No items to show.= +Search=検索 +Reset=リセット +Previous page=å‰ã®ãƒšãƒ¼ã‚¸ +Next page=次ã®ãƒšãƒ¼ã‚¸ +All=ã™ã¹ã¦ +Nodes=ブロック +Tools=é“å…· +Items=アイテム diff --git a/mods/minetest_game/creative/locale/creative.jbo.tr b/mods/minetest_game/creative/locale/creative.jbo.tr new file mode 100644 index 00000000..d8640b18 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.jbo.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=zifre le ka pilno le finti ke dacti liste +No items to show.= +Search=sisku +Reset=kraga'igau +Previous page=lidne +Next page=selyli'e +All=ro dacti +Nodes=bliku +Tools=tutci +Items=dacti diff --git a/mods/minetest_game/creative/locale/creative.lv.tr b/mods/minetest_game/creative/locale/creative.lv.tr new file mode 100644 index 00000000..de8662ee --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.lv.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Atļaut spÄ“lÄ“tÄjam izmantot radoÅ¡o inventÄru +No items to show.=Nav priekÅ¡metu ko paradÄ«t. +Search=MeklÄ“t +Reset=NodzÄ“st +Previous page=IepriekšējÄ lappuse +Next page=NÄkoÅ¡Ä lappuse +All=Viss +Nodes=Bloki +Tools=RÄ«ki +Items=PriekÅ¡meti diff --git a/mods/minetest_game/creative/locale/creative.ms.tr b/mods/minetest_game/creative/locale/creative.ms.tr new file mode 100644 index 00000000..98178f15 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.ms.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Benarkan pemain menggunakan inventori kreatif +No items to show.=Tiada item untuk ditunjukkan. +Search=Cari +Reset=Tetap semula +Previous page=Halaman sebelumnya +Next page=Halaman seterusnya +All=Semua +Nodes=Nod +Tools=Alatan +Items=Item diff --git a/mods/minetest_game/creative/locale/creative.pl.tr b/mods/minetest_game/creative/locale/creative.pl.tr new file mode 100644 index 00000000..1fe78572 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.pl.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Zezwól graczom na używanie kreatywnego ekwipunku +No items to show.= +Search=Wyszukaj +Reset=Zresetuj +Previous page=Poprzednia strona +Next page=NastÄ™pna strona +All=Wszystko +Nodes=Bloki +Tools=NarzÄ™dzia +Items=Przedmioty diff --git a/mods/minetest_game/creative/locale/creative.pt_BR.tr b/mods/minetest_game/creative/locale/creative.pt_BR.tr new file mode 100644 index 00000000..b66edcc9 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permitir o jogador usar o inventário criativo +No items to show.= +Search=Pesquisar +Reset=Redefinir +Previous page=Página anterior +Next page=Próxima página +All=Todos +Nodes=Blocos +Tools=Ferramentas +Items=Itens diff --git a/mods/minetest_game/creative/locale/creative.ru.tr b/mods/minetest_game/creative/locale/creative.ru.tr new file mode 100644 index 00000000..b0bb7577 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.ru.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Разрешить игроку иÑпользовать творчеÑкий инвентарь +No items to show.=Ðет предметов. +Search=ПоиÑк +Reset=Ð¡Ð±Ñ€Ð¾Ñ +Previous page=ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница +Next page=Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница +All=Ð’ÑÑ‘ +Nodes=Ðоды +Tools=ИнÑтрументы +Items=Предметы diff --git a/mods/minetest_game/creative/locale/creative.sk.tr b/mods/minetest_game/creative/locale/creative.sk.tr new file mode 100644 index 00000000..0aa8d0e4 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.sk.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Povolí hráÄovi použivaÅ¥ kreatívny inventár +No items to show.= +Search=Hľadaj +Reset=VrátiÅ¥ späť +Previous page=Predchádzajúca stránka +Next page=Nasledujúca stránka +All=VÅ¡etko +Nodes=Kocky +Tools=Nástroje +Items=Veci diff --git a/mods/minetest_game/creative/locale/creative.sv.tr b/mods/minetest_game/creative/locale/creative.sv.tr new file mode 100644 index 00000000..ddba02d8 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.sv.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=TillÃ¥t spelare att använda kreativa saker +No items to show.= +Search=Sök +Reset=Ã…terställ +Previous page=Förra sida +Next page=Nästa sida +All=Alla +Nodes=Noder +Tools=Verktyg +Items=Saker diff --git a/mods/minetest_game/creative/locale/creative.uk.tr b/mods/minetest_game/creative/locale/creative.uk.tr new file mode 100644 index 00000000..c0a817c9 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.uk.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Дозволити гравцю викориÑтовувати творчий інвентар +No items to show.=Ðемає результатів. +Search=Пошук +Reset=Скинути +Previous page=ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка +Next page=ÐаÑтупна Ñторінка +All=Ð’Ñе +Nodes=Ðоди +Tools=ІнÑтрументи +Items=Предмети diff --git a/mods/minetest_game/creative/locale/creative.zh_CN.tr b/mods/minetest_game/creative/locale/creative.zh_CN.tr new file mode 100644 index 00000000..27d3e868 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.zh_CN.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=å…许玩家使用创造模å¼ç‰©å“æ  +No items to show.= +Search=æœç´¢ +Reset=é‡ç½® +Previous page=上一页 +Next page=下一页 +All=所有 +Nodes=节点 +Tools=工具 +Items=ç‰©å“ diff --git a/mods/minetest_game/creative/locale/creative.zh_TW.tr b/mods/minetest_game/creative/locale/creative.zh_TW.tr new file mode 100644 index 00000000..ae9b1565 --- /dev/null +++ b/mods/minetest_game/creative/locale/creative.zh_TW.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=å…許玩家使用創造模å¼ç‰©å“欄 +No items to show.= +Search=æœç´¢ +Reset=é‡ç½® +Previous page=ä¸Šä¸€é  +Next page=ä¸‹ä¸€é  +All=所有 +Nodes=節點 +Tools=工具 +Items=ç‰©å“ diff --git a/mods/minetest_game/creative/locale/template.txt b/mods/minetest_game/creative/locale/template.txt new file mode 100644 index 00000000..ee593fe9 --- /dev/null +++ b/mods/minetest_game/creative/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory= +No items to show.= +Search= +Reset= +Previous page= +Next page= +All= +Nodes= +Tools= +Items= diff --git a/mods/minetest_game/creative/mod.conf b/mods/minetest_game/creative/mod.conf new file mode 100644 index 00000000..37d0d67e --- /dev/null +++ b/mods/minetest_game/creative/mod.conf @@ -0,0 +1,3 @@ +name = creative +description = Minetest Game mod: creative +depends = sfinv diff --git a/mods/minetest_game/creative/textures/creative_clear_icon.png b/mods/minetest_game/creative/textures/creative_clear_icon.png new file mode 100644 index 00000000..ab421d98 Binary files /dev/null and b/mods/minetest_game/creative/textures/creative_clear_icon.png differ diff --git a/mods/minetest_game/creative/textures/creative_next_icon.png b/mods/minetest_game/creative/textures/creative_next_icon.png new file mode 100644 index 00000000..4a3637dc Binary files /dev/null and b/mods/minetest_game/creative/textures/creative_next_icon.png differ diff --git a/mods/minetest_game/creative/textures/creative_prev_icon.png b/mods/minetest_game/creative/textures/creative_prev_icon.png new file mode 100644 index 00000000..d5e3c27a Binary files /dev/null and b/mods/minetest_game/creative/textures/creative_prev_icon.png differ diff --git a/mods/minetest_game/creative/textures/creative_search_icon.png b/mods/minetest_game/creative/textures/creative_search_icon.png new file mode 100644 index 00000000..421b833e Binary files /dev/null and b/mods/minetest_game/creative/textures/creative_search_icon.png differ diff --git a/mods/minetest_game/creative/textures/creative_trash_icon.png b/mods/minetest_game/creative/textures/creative_trash_icon.png new file mode 100644 index 00000000..a0f6d237 Binary files /dev/null and b/mods/minetest_game/creative/textures/creative_trash_icon.png differ diff --git a/mods/minetest_game/default/README.txt b/mods/minetest_game/default/README.txt new file mode 100644 index 00000000..e8b78a75 --- /dev/null +++ b/mods/minetest_game/default/README.txt @@ -0,0 +1,407 @@ +Minetest Game mod: default +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +The torch code was derived by sofar from the 'torches' mod by +BlockMen (LGPLv2.1+) + +Authors of media (textures, sounds, models and schematics) +---------------------------------------------------------- +Everything not listed in here: +celeron55, Perttu Ahola (CC BY-SA 3.0) + + +Textures +-------- +Cisoun's texture pack (CC BY-SA 3.0): + default_jungletree.png + default_lava.png + default_leaves.png + default_sapling.png + default_bush_sapling.png + default_stone.png + default_tree.png + default_tree_top.png + default_water.png + +RealBadAngel's animated water (CC BY-SA 3.0): + default_water_source_animated.png + default_water_flowing_animated.png + +VanessaE (CC BY-SA 3.0): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png + default_desert_sand.png + default_desert_stone.png + default_sand.png + default_mese_crystal.png + default_mese_crystal_fragment.png + +Calinou (CC BY-SA 3.0): + default_brick.png + default_papyrus.png + default_mineral_copper.png + +PilzAdam (CC BY-SA 3.0): + default_jungleleaves.png + default_junglesapling.png + default_obsidian_glass.png + default_obsidian_shard.png + default_mineral_gold.png + +jojoa1997 (CC BY-SA 3.0): + default_obsidian.png + +InfinityProject (CC BY-SA 3.0): + default_mineral_diamond.png + +Splizard (CC BY-SA 3.0): + default_pine_sapling.png + default_pine_needles.png + +Zeg9 (CC BY-SA 3.0): + default_coal_block.png + +paramat (CC BY-SA 3.0): + wieldhand.png -- Copied from character.png by Jordach (CC BY-SA 3.0) + default_pinetree.png + default_pinetree_top.png + default_pinewood.png + default_acacia_leaves.png + default_acacia_leaves_simple.png + default_acacia_sapling.png + default_acacia_bush_sapling.png + default_pine_bush_sapling.png + default_acacia_tree.png + default_acacia_tree_top.png + default_acacia_wood.png + default_acacia_bush_stem.png + default_bush_stem.png + default_pine_bush_stem.png + default_junglewood.png + default_jungletree_top.png + default_sandstone_brick.png + default_obsidian_brick.png + default_stone_brick.png + default_desert_stone_brick.png + default_sandstone_block.png + default_obsidian_block.png + default_stone_block.png + default_desert_stone_block.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png + default_dry_grass.png + default_dry_grass_side.png + default_dry_grass_*.png + default_grass_side.png -- Derived from a texture by TumeniNodes (CC-BY-SA 3.0) + default_mese_block.png + default_silver_sand.png + default_mese_post_light_side.png + default_mese_post_light_side_dark.png + default_mese_post_light_top.png + default_silver_sandstone.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) + default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) + default_emergent_jungle_sapling.png + default_permafrost.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + default_stones.png -- Derived from a texture by sofar (CC0 1.0) + default_stones_side.png -- Derived from a texture by sofar (CC0 1.0) + default_moss.png + default_moss_side.png + default_fence_rail_acacia_wood + default_fence_rail_aspen_wood -- Derived from a texture by sofar (CC BY-SA 3.0) + default_fence_rail_junglewood + default_fence_rail_pine_wood + default_fence_rail_wood -- Derived from a texture by BlockMen (CC BY-SA 3.0) + gui_hotbar.png + gui_hotbar_selected.png + +TumeniNodes (CC BY-SA 3.0): + default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) + default_coniferous_litter.png + default_coniferous_litter_side.png + default_grass.png + default_dry_dirt.png + +BlockMen (CC BY-SA 3.0): + default_aspen_leaves.png -- Derived from Sofar's texture + default_wood.png + default_clay_brick.png + default_iron_ingot.png + default_gold_ingot.png + default_tool_steelsword.png + default_diamond.png + default_tool_*.png + default_lava_source_animated.png + default_lava_flowing_animated.png + default_stick.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + default_mineral_mese.png + default_meselamp.png + gui_formbg.png + gui_furnace_arrow_bg.png + gui_furnace_arrow_fg.png + gui_hb_bg.png + +sofar (CC BY-SA 3.0): + default_aspen_sapling + default_aspen_tree + default_aspen_tree_top, derived from default_pine_tree_top (by paramat) + default_aspen_wood, derived from default_pine_wood (by paramat) + default_chest_inside + +sofar (CC0 1.0): + default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel + +Neuromancer (CC BY-SA 3.0): + default_cobble.png, based on texture by Brane praefect + default_mossycobble.png, based on texture by Brane praefect + default_furnace_*.png + +Gambit (CC BY-SA 3.0): + default_bronze_ingot.png + default_copper_ingot.png + default_copper_lump.png + default_iron_lump.png + default_gold_lump.png + default_clay_lump.png + default_coal_lump.png + default_grass_*.png + default_paper.png + default_diamond_block.png + default_ladder_steel.png + default_sign_wall_wood.png + default_flint.png + default_snow.png + default_snow_side.png + default_snowball.png + default_book.png + +asl97 (CC BY-SA 3.0): + default_ice.png + +Pithydon (CC BY-SA 3.0) + default_coral_brown.png + default_coral_orange.png + default_coral_skeleton.png + +Ferk (CC0 1.0): + default_item_smoke.png + +npx (CC BY-SA 3.0): + default_rainforest_litter.png + default_rainforest_litter_side.png + +kaeza (CC-BY-SA 3.0): + default_desert_sandstone.png + default_desert_sandstone_brick.png + default_desert_sandstone_block.png + +kilbith (CC BY-SA 3.0): + default_steel_block.png + default_copper_block.png + default_bronze_block.png + default_gold_block.png + default_tin_block.png + default_mineral_tin.png + default_tin_ingot.png + default_tin_lump.png + +tobyplowy (CC BY-SA 3.0): + default_kelp.png + +CloudyProton (CC BY-SA 3.0): + default_book_written.png, based on default_book.png by Gambit + +Mossmanikin (CC BY-SA 3.0): + default_fern_*.png + +random-geek (CC BY-SA 3.0): + default_blueberries.png + default_blueberry_overlay.png + default_blueberry_bush_leaves.png, derived from default_bush_leaves (by paramat) + default_blueberry_bush_sapling.png + default_dirt.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + +Krock (CC0 1.0): + default_glass.png + default_glass_detail.png + +Topywo (CC BY-SA 3.0) + default_coral_cyan.png + default_coral_green.png + default_coral_pink.png + +Extex101 (CC BY-SA 3.0) + default_large_cactus_seedling.png + default_dry_shrub.png -- Derived from the original texture by celeron55 + +An0n3m0us (CC BY-SA 3.0): + heart.png -- Derived from a texture by KevDoy (CC BY-SA 3.0) + bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0) + + +Sounds +------ +Glass breaking sounds (CC BY 3.0): + 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ + 2: http://www.freesound.org/people/Tomlija/sounds/97669/ + 3: http://www.freesound.org/people/lsprice/sounds/88808/ + +Mito551 (sounds) (CC BY-SA 3.0): + default_dig_crumbly.*.ogg + default_dig_dig_immediate.ogg + default_dig_oddly_breakable_by_hand.ogg + default_dug_node.*.ogg + default_grass_footstep.1.ogg + default_grass_footstep.2.ogg + default_grass_footstep.3.ogg + default_gravel_footstep.*.ogg + default_place_node.*.ogg + default_place_node_hard.*.ogg + default_glass_footstep.ogg + default_wood_footstep.1.ogg + default_wood_footstep.2.ogg + default_dirt_footstep.1.ogg + default_dirt_footstep.2.ogg + default_glass_footstep.ogg + +Metal sounds: + default_dig_metal.ogg - yadronoff - CC-BY-3.0 + - https://www.freesound.org/people/yadronoff/sounds/320397/ + default_dug_metal.*.ogg - Iwan Gabovitch - qubodup - CC0 + - http://opengameart.org/users/qubodup + default_metal_footstep.*.ogg - (CC0 1.0) - CC0 1.0 + - https://freesound.org/people/mypantsfelldown/sounds/398937/ + default_place_node_metal.*.ogg - Ogrebane - CC0 + - http://opengameart.org/content/wood-and-metal-sound-effects-volume-2 + +Tool breaking sounds added by sofar: CC-BY-3.0 + default_tool_breaks.* - http://www.freesound.org/people/HerbertBoland/sounds/33206/ + +AGFX (CC BY 3.0): +https://www.freesound.org/people/AGFX/packs/1253/ + default_water_footstep.1.ogg + default_water_footstep.2.ogg + default_water_footstep.3.ogg + +blukotek (CC0 1.0): +https://www.freesound.org/people/blukotek/sounds/251660/ + default_dig_snappy.ogg + +Chests sounds added by sofar, derived of several files mixed together: + default_chest_open.ogg + default_chest_close.ogg + - http://www.freesound.org/people/Sevin7/sounds/269722/ CC0 + - http://www.freesound.org/people/Percy%20Duke/sounds/23448/ CC-BY-3.0 + - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 + - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 + - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 + +Ryding (CC0 1.0): +http://freesound.org/people/Ryding/sounds/94337/ + default_snow_footstep.*.ogg + +Ferk (CC0 1.0): + default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart + +sonictechtonic (CC BY 3.0): +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + +Sheyvan (CC0 1.0): +https://freesound.org/people/Sheyvan/sounds/476113/ + default_dig_choppy.*.ogg + +lolamadeus (CC0 1.0): +https://freesound.org/people/lolamadeus/sounds/179341/ + default_gravel_dig.*.ogg + default_gravel_dug.*.ogg + +Benboncan (CC BY 3.0): +https://freesound.org/people/Benboncan/sounds/71823/ + default_dig_cracky.*.ogg + +Erdie (CC BY 3.0): +https://freesound.org/people/Erdie/sounds/41579/ + default_hard_footstep.*.ogg + +worthahep88 (CC0 1.0): +https://freesound.org/people/worthahep88/sounds/319224/ + default_sand_footstep.*.ogg + +dheming (CC BY 3.0): +https://freesound.org/people/dheming/sounds/268023/ + default_ice_dig.*.ogg + +InspectorJ (CC BY 3.0): +https://freesound.org/people/InspectorJ/sounds/416967/ + default_ice_footstep.*.ogg + +Angel_Perez_Grandi (CC BY 3.0): +https://freesound.org/people/Angel_Perez_Grandi/sounds/49190/ + default_ice_dug.ogg + +iankath (CC0 1.0) +https://freesound.org/people/iankath/sounds/173991/ + default_furnace_active.ogg + + +Models +------ +sofar (CC BY-SA 3.0): + chest_open.obj + torch_ceiling.obj + torch_floor.obj + torch_wall.obj + + +Schematics +---------- +paramat (CC BY-SA 3.0): + acacia_bush.mts + acacia_tree.mts + acacia_tree_from_sapling.mts + apple_tree.mts + apple_tree_from_sapling.mts + aspen_tree.mts + aspen_tree_from_sapling.mts + bush.mts + emergent_jungle_tree.mts + emergent_jungle_tree_from_sapling.mts + jungle_tree.mts + jungle_tree_from_sapling.mts + large_cactus.mts + papyrus.mts + pine_tree.mts + pine_tree_from_sapling.mts + snowy_pine_tree_from_sapling.mts + small_pine_tree.mts + small_pine_tree_from_sapling.mts + snowy_small_pine_tree_from_sapling.mts + +Shara RedCat (CC BY-SA 3.0): + acacia_log.mts + apple_log.mts + aspen_log.mts + jungle_log.mts + pine_log.mts + +TumeniNodes (CC BY-SA 3.0): + pine_bush.mts + +random-geek (CC BY-SA 3.0): + blueberry_bush.mts diff --git a/mods/minetest_game/default/aliases.lua b/mods/minetest_game/default/aliases.lua new file mode 100644 index 00000000..6db3fc8d --- /dev/null +++ b/mods/minetest_game/default/aliases.lua @@ -0,0 +1,77 @@ +-- mods/default/aliases.lua + +-- Aliases to support loading worlds using nodes following the old naming convention +-- These can also be helpful when using chat commands, for example /giveme +minetest.register_alias("stone", "default:stone") +minetest.register_alias("stone_with_coal", "default:stone_with_coal") +minetest.register_alias("stone_with_iron", "default:stone_with_iron") +minetest.register_alias("dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("dirt_with_grass_footsteps", "default:dirt_with_grass_footsteps") +minetest.register_alias("dirt", "default:dirt") +minetest.register_alias("sand", "default:sand") +minetest.register_alias("gravel", "default:gravel") +minetest.register_alias("sandstone", "default:sandstone") +minetest.register_alias("clay", "default:clay") +minetest.register_alias("brick", "default:brick") +minetest.register_alias("tree", "default:tree") +minetest.register_alias("jungletree", "default:jungletree") +minetest.register_alias("junglegrass", "default:junglegrass") +minetest.register_alias("leaves", "default:leaves") +minetest.register_alias("cactus", "default:cactus") +minetest.register_alias("papyrus", "default:papyrus") +minetest.register_alias("bookshelf", "default:bookshelf") +minetest.register_alias("glass", "default:glass") +minetest.register_alias("wooden_fence", "default:fence_wood") +minetest.register_alias("rail", "carts:rail") +minetest.register_alias("ladder", "default:ladder_wood") +minetest.register_alias("wood", "default:wood") +minetest.register_alias("mese", "default:mese") +minetest.register_alias("cloud", "default:cloud") +minetest.register_alias("water_flowing", "default:water_flowing") +minetest.register_alias("water_source", "default:water_source") +minetest.register_alias("lava_flowing", "default:lava_flowing") +minetest.register_alias("lava_source", "default:lava_source") +minetest.register_alias("torch", "default:torch") +minetest.register_alias("sign_wall", "default:sign_wall_wood") +minetest.register_alias("furnace", "default:furnace") +minetest.register_alias("chest", "default:chest") +minetest.register_alias("locked_chest", "default:chest_locked") +minetest.register_alias("cobble", "default:cobble") +minetest.register_alias("mossycobble", "default:mossycobble") +minetest.register_alias("steelblock", "default:steelblock") +minetest.register_alias("sapling", "default:sapling") +minetest.register_alias("apple", "default:apple") + +minetest.register_alias("WPick", "default:pick_wood") +minetest.register_alias("STPick", "default:pick_stone") +minetest.register_alias("SteelPick", "default:pick_steel") +minetest.register_alias("MesePick", "default:pick_mese") +minetest.register_alias("WShovel", "default:shovel_wood") +minetest.register_alias("STShovel", "default:shovel_stone") +minetest.register_alias("SteelShovel", "default:shovel_steel") +minetest.register_alias("WAxe", "default:axe_wood") +minetest.register_alias("STAxe", "default:axe_stone") +minetest.register_alias("SteelAxe", "default:axe_steel") +minetest.register_alias("WSword", "default:sword_wood") +minetest.register_alias("STSword", "default:sword_stone") +minetest.register_alias("SteelSword", "default:sword_steel") + +minetest.register_alias("Stick", "default:stick") +minetest.register_alias("paper", "default:paper") +minetest.register_alias("book", "default:book") +minetest.register_alias("lump_of_coal", "default:coal_lump") +minetest.register_alias("lump_of_iron", "default:iron_lump") +minetest.register_alias("lump_of_clay", "default:clay_lump") +minetest.register_alias("steel_ingot", "default:steel_ingot") +minetest.register_alias("clay_brick", "default:clay_brick") +minetest.register_alias("snow", "default:snow") + +-- 'mese_block' was used for a while for the block form of mese +minetest.register_alias("default:mese_block", "default:mese") + +-- Aliases for corrected pine node names +minetest.register_alias("default:pinetree", "default:pine_tree") +minetest.register_alias("default:pinewood", "default:pine_wood") + +minetest.register_alias("default:ladder", "default:ladder_wood") +minetest.register_alias("default:sign_wall", "default:sign_wall_wood") diff --git a/mods/minetest_game/default/chests.lua b/mods/minetest_game/default/chests.lua new file mode 100644 index 00000000..1d9b150a --- /dev/null +++ b/mods/minetest_game/default/chests.lua @@ -0,0 +1,380 @@ +default.chest = {} + +-- support for MT game translation. +local S = default.get_translator + +function default.chest.get_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[nodemeta:" .. spos .. ";main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + return formspec +end + +function default.chest.chest_lid_obstructed(pos) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def and + (def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then + return false + end + return true +end + +function default.chest.chest_lid_close(pn) + local chest_open_info = default.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + default.chest.open_chests[pn] = nil + for k, v in pairs(default.chest.open_chests) do + if vector.equals(v.pos, pos) then + -- another player is also looking at the chest + return true + end + end + + local node = minetest.get_node(pos) + minetest.after(0.2, function() + local current_node = minetest.get_node(pos) + if current_node.name ~= swap .. "_open" then + -- the chest has already been replaced, don't try to replace what's there. + return + end + minetest.swap_node(pos, {name = swap, param2 = node.param2}) + minetest.sound_play(sound, {gain = 0.3, pos = pos, + max_hear_distance = 10}, true) + end) +end + +default.chest.open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local pn = player:get_player_name() + + if formname ~= "default:chest" then + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) + end + + return + end + + if not (fields.quit and default.chest.open_chests[pn]) then + return + end + + default.chest.chest_lid_close(pn) + + return true +end) + +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) + end +end) + +function default.chest.register_chest(prefixed_name, d) + local name = prefixed_name:sub(1,1) == ':' and prefixed_name:sub(2,-1) or prefixed_name + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Locked Chest")) + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", S("Locked Chest (owned by @1)", meta:get_string("owner"))) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + local cn = clicker:get_player_name() + + if default.chest.open_chests[cn] then + default.chest.chest_lid_close(cn) + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}, true) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, cn, + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[cn] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if itemstack:get_meta():get_string("") == "" then + return + end + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_meta():get_string("")).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + default.chest.get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, S("You do not own this chest.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked chest"), owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Chest")) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end + def.on_rightclick = function(pos, node, clicker) + local cn = clicker:get_player_name() + + if default.chest.open_chests[cn] then + default.chest.chest_lid_close(cn) + end + + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}, true) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + cn, + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[cn] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = name + minetest.remove_node(pos) + return drops + end + end + + default.set_inventory_action_loggers(def, "chest") + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + for i = 1, #def_opened.tiles do + if type(def_opened.tiles[i]) == "string" then + def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true} + elseif def_opened.tiles[i].backface_culling == nil then + def_opened.tiles[i].backface_culling = true + end + end + def_opened.drop = name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + def_opened.on_blast = function() end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3].."^[transformFX" + + minetest.register_node(prefixed_name, def_closed) + minetest.register_node(prefixed_name .. "_open", def_opened) + + -- convert old chests to this new variant + if name == "default:chest" or name == "default:chest_locked" then + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name:sub(9,-1) .. "_v2", + nodenames = {name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "") + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end + end + }) + end + + -- close opened chests on load + local modname, chestname = prefixed_name:match("^(:?.-):(.*)$") + minetest.register_lbm({ + label = "close opened chests on load", + name = modname .. ":close_" .. chestname .. "_open", + nodenames = {prefixed_name .. "_open"}, + run_at_every_load = true, + action = function(pos, node) + node.name = prefixed_name + minetest.swap_node(pos, node) + end + }) +end + +default.chest.register_chest("default:chest", { + description = S("Chest"), + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, +}) + +default.chest.register_chest("default:chest_locked", { + description = S("Locked Chest"), + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_lock.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) + +minetest.register_craft({ + output = "default:chest", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:chest_locked", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "default:steel_ingot", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:chest_locked", + recipe = {"default:chest", "default:steel_ingot"}, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest_locked", + burntime = 30, +}) diff --git a/mods/minetest_game/default/crafting.lua b/mods/minetest_game/default/crafting.lua new file mode 100644 index 00000000..ecbe9d12 --- /dev/null +++ b/mods/minetest_game/default/crafting.lua @@ -0,0 +1,737 @@ +-- mods/default/crafting.lua + +minetest.register_craft({ + output = "default:wood 4", + recipe = { + {"default:tree"}, + } +}) + +minetest.register_craft({ + output = "default:junglewood 4", + recipe = { + {"default:jungletree"}, + } +}) + +minetest.register_craft({ + output = "default:pine_wood 4", + recipe = { + {"default:pine_tree"}, + } +}) + +minetest.register_craft({ + output = "default:acacia_wood 4", + recipe = { + {"default:acacia_tree"}, + } +}) + +minetest.register_craft({ + output = "default:aspen_wood 4", + recipe = { + {"default:aspen_tree"}, + } +}) + +minetest.register_craft({ + output = "default:wood", + recipe = { + {"default:bush_stem"}, + } +}) + +minetest.register_craft({ + output = "default:acacia_wood", + recipe = { + {"default:acacia_bush_stem"}, + } +}) + +minetest.register_craft({ + output = "default:pine_wood", + recipe = { + {"default:pine_bush_stem"}, + } +}) + +minetest.register_craft({ + output = "default:sign_wall_steel 3", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"", "group:stick", ""}, + } +}) + +minetest.register_craft({ + output = "default:sign_wall_wood 3", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "group:stick", ""}, + } +}) + +minetest.register_craft({ + output = "default:coalblock", + recipe = { + {"default:coal_lump", "default:coal_lump", "default:coal_lump"}, + {"default:coal_lump", "default:coal_lump", "default:coal_lump"}, + {"default:coal_lump", "default:coal_lump", "default:coal_lump"}, + } +}) + +minetest.register_craft({ + output = "default:steelblock", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:copperblock", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:tinblock", + recipe = { + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:bronzeblock", + recipe = { + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:bronzeblock"}, + } +}) + +minetest.register_craft({ + output = "default:goldblock", + recipe = { + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:diamondblock", + recipe = { + {"default:diamond", "default:diamond", "default:diamond"}, + {"default:diamond", "default:diamond", "default:diamond"}, + {"default:diamond", "default:diamond", "default:diamond"}, + } +}) + +minetest.register_craft({ + output = "default:sandstone", + recipe = { + {"default:sand", "default:sand"}, + {"default:sand", "default:sand"}, + } +}) + +minetest.register_craft({ + output = "default:sand 4", + recipe = { + {"default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:sandstonebrick 4", + recipe = { + {"default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:sandstone_block 9", + recipe = { + {"default:sandstone", "default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone", "default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone", + recipe = { + {"default:desert_sand", "default:desert_sand"}, + {"default:desert_sand", "default:desert_sand"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sand 4", + recipe = { + {"default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone_brick 4", + recipe = { + {"default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone_block 9", + recipe = { + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone", + recipe = { + {"default:silver_sand", "default:silver_sand"}, + {"default:silver_sand", "default:silver_sand"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sand 4", + recipe = { + {"default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone_brick 4", + recipe = { + {"default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone_block 9", + recipe = { + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:clay", + recipe = { + {"default:clay_lump", "default:clay_lump"}, + {"default:clay_lump", "default:clay_lump"}, + } +}) + +minetest.register_craft({ + output = "default:brick", + recipe = { + {"default:clay_brick", "default:clay_brick"}, + {"default:clay_brick", "default:clay_brick"}, + } +}) + +minetest.register_craft({ + output = "default:bookshelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"default:book", "default:book", "default:book"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:ladder_wood 5", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"}, + } +}) + +minetest.register_craft({ + output = "default:ladder_steel 15", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:mese", + recipe = { + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:meselamp", + recipe = { + {"default:glass"}, + {"default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:obsidian", + recipe = { + {"default:obsidian_shard", "default:obsidian_shard", "default:obsidian_shard"}, + {"default:obsidian_shard", "default:obsidian_shard", "default:obsidian_shard"}, + {"default:obsidian_shard", "default:obsidian_shard", "default:obsidian_shard"}, + } +}) + +minetest.register_craft({ + output = "default:obsidianbrick 4", + recipe = { + {"default:obsidian", "default:obsidian"}, + {"default:obsidian", "default:obsidian"} + } +}) + +minetest.register_craft({ + output = "default:obsidian_block 9", + recipe = { + {"default:obsidian", "default:obsidian", "default:obsidian"}, + {"default:obsidian", "default:obsidian", "default:obsidian"}, + {"default:obsidian", "default:obsidian", "default:obsidian"}, + } +}) + +minetest.register_craft({ + output = "default:stonebrick 4", + recipe = { + {"default:stone", "default:stone"}, + {"default:stone", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "default:stone_block 9", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_stonebrick 4", + recipe = { + {"default:desert_stone", "default:desert_stone"}, + {"default:desert_stone", "default:desert_stone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_stone_block 9", + recipe = { + {"default:desert_stone", "default:desert_stone", "default:desert_stone"}, + {"default:desert_stone", "default:desert_stone", "default:desert_stone"}, + {"default:desert_stone", "default:desert_stone", "default:desert_stone"}, + } +}) + +minetest.register_craft({ + output = "default:snowblock", + recipe = { + {"default:snow", "default:snow", "default:snow"}, + {"default:snow", "default:snow", "default:snow"}, + {"default:snow", "default:snow", "default:snow"}, + } +}) + +minetest.register_craft({ + output = "default:snow 9", + recipe = { + {"default:snowblock"}, + } +}) + +minetest.register_craft({ + output = "default:emergent_jungle_sapling", + recipe = { + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + } +}) + +minetest.register_craft({ + output = "default:large_cactus_seedling", + recipe = { + {"", "default:cactus", ""}, + {"default:cactus", "default:cactus", "default:cactus"}, + {"", "default:cactus", ""}, + } +}) + + +-- +-- Crafting (tool repair) +-- + +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.02, +}) + + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "group:sand", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:obsidian_glass", + recipe = "default:obsidian_shard", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:mossycobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:desert_stone", + recipe = "default:desert_cobble", +}) + + +-- +-- Fuels +-- + +-- Support use of group:tree, includes default:tree which has the same burn time +minetest.register_craft({ + type = "fuel", + recipe = "group:tree", + burntime = 30, +}) + +-- Burn time for all woods are in order of wood density, +-- which is also the order of wood colour darkness: +-- aspen, pine, apple, acacia, jungle + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_tree", + burntime = 22, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_tree", + burntime = 26, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_tree", + burntime = 34, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:jungletree", + burntime = 38, +}) + + +-- Support use of group:wood, includes default:wood which has the same burn time +minetest.register_craft({ + type = "fuel", + recipe = "group:wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_wood", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglewood", + burntime = 9, +}) + + +-- Support use of group:sapling, includes default:sapling which has the same burn time +minetest.register_craft({ + type = "fuel", + recipe = "group:sapling", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_sapling", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_sapling", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_sapling", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_sapling", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_sapling", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_sapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglesapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:emergent_jungle_sapling", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_aspen_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_pine_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_acacia_wood", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_junglewood", + burntime = 9, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_aspen_wood", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_pine_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_acacia_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_junglewood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_stem", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_stem", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_stem", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglegrass", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:leaves", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:cactus", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:large_cactus_seedling", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:papyrus", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bookshelf", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:ladder_wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:lava_source", + burntime = 60, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sign_wall_wood", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coalblock", + burntime = 370, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:dry_grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fern_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:marram_grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:dry_shrub", + burntime = 2, +}) diff --git a/mods/minetest_game/default/craftitems.lua b/mods/minetest_game/default/craftitems.lua new file mode 100644 index 00000000..4cc5f8d8 --- /dev/null +++ b/mods/minetest_game/default/craftitems.lua @@ -0,0 +1,543 @@ +-- mods/default/craftitems.lua + +-- support for MT game translation. +local S = default.get_translator + +local esc = minetest.formspec_escape +local formspec_size = "size[8,8]" + +local function formspec_core(tab) + if tab == nil then tab = 1 else tab = tostring(tab) end + return "tabheader[0,0;book_header;" .. + esc(S("Write")) .. "," .. + esc(S("Read")) .. ";" .. + tab .. ";false;false]" +end + +local function formspec_write(title, text) + return "field[0.5,1;7.5,0;title;" .. esc(S("Title:")) .. ";" .. + esc(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;text;" .. esc(S("Contents:")) .. ";" .. + esc(text) .. "]" .. + "button_exit[2.5,7.5;3,1;save;" .. esc(S("Save")) .. "]" +end + +local function formspec_read(owner, title, string, text, page, page_max) + return "label[0.5,0.5;" .. esc(S("by @1", owner)) .. "]" .. + "tablecolumns[color;text]" .. + "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. + "table[0.4,0;7,0.5;title;#FFFF00," .. esc(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;;" .. + esc(string ~= "" and string or text) .. ";]" .. + "button[2.4,7.6;0.8,0.8;book_prev;<]" .. + "label[3.2,7.7;" .. esc(S("Page @1 of @2", page, page_max)) .. "]" .. + "button[4.9,7.6;0.8,0.8;book_next;>]" +end + +local function formspec_string(lpp, page, lines, string) + for i = ((lpp * page) - lpp) + 1, lpp * page do + if not lines[i] then break end + string = string .. lines[i] .. "\n" + end + return string +end + +local book_writers = {} + +minetest.register_on_leaveplayer(function(player) + book_writers[player:get_player_name()] = nil +end) + +local tab_number +local lpp = 14 -- Lines per book's page +local function book_on_use(itemstack, user) + local player_name = user:get_player_name() + local meta = itemstack:get_meta() + local title, text, owner = "", "", player_name + local page, page_max, lines, string = 1, 1, {}, "" + + -- Backwards compatibility + local old_data = minetest.deserialize(itemstack:get_meta():get_string("")) + if old_data then + meta:from_table({ fields = old_data }) + end + + local data = meta:to_table().fields + + if data.owner then + title = data.title or "" + text = data.text or "" + owner = data.owner + + for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do + lines[#lines+1] = str + end + + if data.page then + page = data.page + page_max = data.page_max + string = formspec_string(lpp, page, lines, string) + end + end + + local formspec + if title == "" and text == "" then + formspec = formspec_write(title, text) + elseif owner == player_name then + local tab = tab_number or 1 + if tab == 2 then + formspec = formspec_core(tab) .. + formspec_read(owner, title, string, text, page, page_max) + else + formspec = formspec_core(tab) .. formspec_write(title, text) + end + else + formspec = formspec_read(owner, title, string, text, page, page_max) + end + + minetest.show_formspec(player_name, "default:book", formspec_size .. formspec) + -- Store the wield index in case the user accidentally switches before the formspec is shown + book_writers[player_name] = {wield_index = user:get_wield_index()} + return itemstack +end + +local max_text_size = 10000 +local max_title_size = 80 +local short_title_size = 35 +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:book" then + return + end + local player_name = player:get_player_name() + local inv = player:get_inventory() + if not book_writers[player_name] then + return + end + local wield_index = book_writers[player_name].wield_index + local wield_list = player:get_wield_list() + local stack = inv:get_stack(wield_list, wield_index) + local written = stack:get_name() == "default:book_written" + if stack:get_name() ~= "default:book" and not written then + -- No book in the wield slot, abort & inform the player + minetest.chat_send_player(player_name, S("The book you were writing to mysteriously disappeared.")) + return + end + local data = stack:get_meta():to_table().fields + + local title = data.title or "" + local text = data.text or "" + + if fields.book_header ~= nil and data.owner == player_name then + local contents + local tab = tonumber(fields.book_header) + if tab == 1 then + contents = formspec_core(tab) .. + formspec_write(title, text) + elseif tab == 2 then + local lines, string = {}, "" + for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do + lines[#lines+1] = str + end + string = formspec_string(lpp, data.page, lines, string) + contents = formspec_read(player_name, title, string, + text, data.page, data.page_max) + else + return -- malicious data + end + tab_number = tab + local formspec = formspec_size .. formspec_core(tab) .. contents + minetest.show_formspec(player_name, "default:book", formspec) + return + end + + if fields.quit then + book_writers[player_name] = nil + end + + if fields.save and fields.title and fields.text then + local new_stack + if not written then + local count = stack:get_count() + if count == 1 then + stack:set_name("default:book_written") + else + stack:set_count(count - 1) + new_stack = ItemStack("default:book_written") + end + end + + if data.owner ~= player_name and title ~= "" and text ~= "" then + return + end + + if not data then data = {} end + data.title = fields.title:sub(1, max_title_size) + data.owner = player:get_player_name() + local short_title = data.title + -- Don't bother triming the title if the trailing dots would make it longer + if #short_title > short_title_size + 3 then + short_title = short_title:sub(1, short_title_size) .. "..." + end + data.description = S("\"@1\" by @2", short_title, data.owner) + data.text = fields.text:sub(1, max_text_size) + data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n") + data.text = data.text:gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + data.page = 1 + data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) + + if new_stack then + new_stack:get_meta():from_table({ fields = data }) + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(player:get_pos(), new_stack) + end + else + stack:get_meta():from_table({ fields = data }) + end + + elseif fields.book_next or fields.book_prev then + if not data.page then + return + end + + data.page = tonumber(data.page) + data.page_max = tonumber(data.page_max) + + if fields.book_next then + data.page = data.page + 1 + if data.page > data.page_max then + data.page = 1 + end + else + data.page = data.page - 1 + if data.page == 0 then + data.page = data.page_max + end + end + + stack:get_meta():from_table({fields = data}) + stack = book_on_use(stack, player) + end + + -- Update stack + inv:set_stack(wield_list, wield_index, stack) +end) + + +-- +-- Craftitem registry +-- + +minetest.register_craftitem("default:blueberries", { + description = S("Blueberries"), + inventory_image = "default_blueberries.png", + groups = {food_blueberries = 1, food_berry = 1}, + on_use = minetest.item_eat(2), +}) + +minetest.register_craftitem("default:book", { + description = S("Book"), + inventory_image = "default_book.png", + groups = {book = 1, flammable = 3}, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:book_written", { + description = S("Book with Text"), + inventory_image = "default_book_written.png", + groups = {book = 1, not_in_creative_inventory = 1, flammable = 3}, + stack_max = 1, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:bronze_ingot", { + description = S("Bronze Ingot"), + inventory_image = "default_bronze_ingot.png" +}) + +minetest.register_craftitem("default:clay_brick", { + description = S("Clay Brick"), + inventory_image = "default_clay_brick.png", +}) + +minetest.register_craftitem("default:clay_lump", { + description = S("Clay Lump"), + inventory_image = "default_clay_lump.png", +}) + +minetest.register_craftitem("default:coal_lump", { + description = S("Coal Lump"), + inventory_image = "default_coal_lump.png", + groups = {coal = 1, flammable = 1} +}) + +minetest.register_craftitem("default:copper_ingot", { + description = S("Copper Ingot"), + inventory_image = "default_copper_ingot.png" +}) + +minetest.register_craftitem("default:copper_lump", { + description = S("Copper Lump"), + inventory_image = "default_copper_lump.png" +}) + +minetest.register_craftitem("default:diamond", { + description = S("Diamond"), + inventory_image = "default_diamond.png", +}) + +minetest.register_craftitem("default:flint", { + description = S("Flint"), + inventory_image = "default_flint.png" +}) + +minetest.register_craftitem("default:gold_ingot", { + description = S("Gold Ingot"), + inventory_image = "default_gold_ingot.png" +}) + +minetest.register_craftitem("default:gold_lump", { + description = S("Gold Lump"), + inventory_image = "default_gold_lump.png" +}) + +minetest.register_craftitem("default:iron_lump", { + description = S("Iron Lump"), + inventory_image = "default_iron_lump.png" +}) + +minetest.register_craftitem("default:mese_crystal", { + description = S("Mese Crystal"), + inventory_image = "default_mese_crystal.png", +}) + +minetest.register_craftitem("default:mese_crystal_fragment", { + description = S("Mese Crystal Fragment"), + inventory_image = "default_mese_crystal_fragment.png", +}) + +minetest.register_craftitem("default:obsidian_shard", { + description = S("Obsidian Shard"), + inventory_image = "default_obsidian_shard.png", +}) + +minetest.register_craftitem("default:paper", { + description = S("Paper"), + inventory_image = "default_paper.png", + groups = {flammable = 3}, +}) + +minetest.register_craftitem("default:steel_ingot", { + description = S("Steel Ingot"), + inventory_image = "default_steel_ingot.png" +}) + +minetest.register_craftitem("default:stick", { + description = S("Stick"), + inventory_image = "default_stick.png", + groups = {stick = 1, flammable = 2}, +}) + +minetest.register_craftitem("default:tin_ingot", { + description = S("Tin Ingot"), + inventory_image = "default_tin_ingot.png" +}) + +minetest.register_craftitem("default:tin_lump", { + description = S("Tin Lump"), + inventory_image = "default_tin_lump.png" +}) + +-- +-- Crafting recipes +-- + +minetest.register_craft({ + output = "default:book", + recipe = { + {"default:paper"}, + {"default:paper"}, + {"default:paper"}, + } +}) + +default.register_craft_metadata_copy("default:book", "default:book_written") + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:clay_brick 4", + recipe = { + {"default:brick"}, + } +}) + +minetest.register_craft({ + output = "default:clay_lump 4", + recipe = { + {"default:clay"}, + } +}) + +minetest.register_craft({ + output = "default:coal_lump 9", + recipe = { + {"default:coalblock"}, + } +}) + +minetest.register_craft({ + output = "default:copper_ingot 9", + recipe = { + {"default:copperblock"}, + } +}) + +minetest.register_craft({ + output = "default:diamond 9", + recipe = { + {"default:diamondblock"}, + } +}) + +minetest.register_craft({ + output = "default:gold_ingot 9", + recipe = { + {"default:goldblock"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal", + recipe = { + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal 9", + recipe = { + {"default:mese"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal_fragment 9", + recipe = { + {"default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:obsidian_shard 9", + recipe = { + {"default:obsidian"} + } +}) + +minetest.register_craft({ + output = "default:paper", + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + } +}) + +minetest.register_craft({ + output = "default:steel_ingot 9", + recipe = { + {"default:steelblock"}, + } +}) + +minetest.register_craft({ + output = "default:stick 4", + recipe = { + {"group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:tin_ingot 9", + recipe = { + {"default:tinblock"}, + } +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:clay_brick", + recipe = "default:clay_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:copper_ingot", + recipe = "default:copper_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:gold_lump", +}) + + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "default:iron_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:tin_ingot", + recipe = "default:tin_lump", +}) + +-- +-- Fuels +-- + +minetest.register_craft({ + type = "fuel", + recipe = "default:book", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:book_written", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coal_lump", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:paper", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:stick", + burntime = 1, +}) diff --git a/mods/minetest_game/default/functions.lua b/mods/minetest_game/default/functions.lua new file mode 100644 index 00000000..fbe26bcd --- /dev/null +++ b/mods/minetest_game/default/functions.lua @@ -0,0 +1,1045 @@ +-- +-- Sounds +-- + +if minetest.get_modpath("everness") then + function default.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = '', gain = 1.0 } + table.dug = table.dug or { name = 'everness_stone_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_stone_dug', gain = 0.6 } + return table + end + + function default.node_sound_frosted_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_frosted_snow_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_frosted_snow_hit', gain = 0.2 } + table.dug = table.dug or { name = 'everness_frosted_snow_footstep', gain = 0.3 } + table.place = table.place or { name = 'everness_frosted_snow_place', gain = 0.25 } + return table + end + + function default.node_sound_crystal_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_crystal_chime', gain = 0.2 } + table.dig = table.dig or { name = 'everness_crystal_chime', gain = 0.3 } + table.dug = table.dug or { name = 'everness_stone_footstep', gain = 0.3 } + table.place = table.place or { name = 'everness_crystal_chime', gain = 1.0 } + return table + end + + function default.node_sound_bamboo_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_bamboo_hit', gain = 0.2 } + table.dig = table.dig or { name = 'everness_bamboo_hit', gain = 0.3 } + table.dug = table.dug or { name = 'everness_bamboo_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_bamboo_hit', gain = 1.0 } + return table + end + + function default.node_sound_mud_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_mud_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_mud_footstep', gain = 0.3 } + table.dug = table.dug or { name = 'everness_mud_footstep', gain = 0.1 } + table.place = table.place or { name = 'everness_mud_footstep', gain = 1.0 } + return table + end + + function default.node_sound_grass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_grass_footstep', gain = 0.6 } + table.dig = table.dig or { name = 'everness_grass_hit', gain = 1.2 } + table.dug = table.dug or { name = 'everness_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_dirt_hit', gain = 1.0 } + return table + end + + function default.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_dirt_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'everness_dirt_hit', gain = 0.4 } + table.dug = table.dug or { name = 'everness_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_dirt_hit', gain = 1.0 } + return table + end + + function default.node_sound_ice_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_ice_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_ice_hit', gain = 0.4 } + table.dug = table.dug or { name = 'everness_ice_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_ice_hit', gain = 1.0 } + return table + end + + function default.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_stone_footstep', gain = 0.6 } + table.dig = table.dig or { name = 'everness_stone_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_stone_dug', gain = 0.6 } + table.place = table.place or { name = 'everness_stone_place', gain = 1.0 } + return table + end + + function default.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_leaves_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_leaves_hit', gain = 0.25 } + table.dug = table.dug or { name = 'everness_leaves_dug', gain = 0.5 } + table.place = table.place or { name = 'everness_leaves_place', gain = 0.4 } + return table + end + + function default.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_wood_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'everness_wood_hit', gain = 0.8 } + table.dug = table.dug or { name = 'everness_wood_place', gain = 0.1 } + table.place = table.place or { name = 'everness_wood_place', gain = 0.15 } + return table + end + + function default.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_sand_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_sand_hit', gain = 0.5 } + table.dug = table.dug or { name = 'everness_sand_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_sand_place', gain = 0.15 } + return table + end + + function default.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_metal_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_metal_hit', gain = 0.5 } + table.dug = table.dug or { name = 'everness_metal_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_metal_place', gain = 0.15 } + return table + end + + function default.node_sound_thin_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_thin_glass_footstep', gain = 0.3 } + table.dig = table.dig or { name = 'everness_thin_glass_footstep', gain = 0.5 } + table.dug = table.dug or { name = 'everness_break_thin_glass', gain = 1.0 } + table.place = table.place or { name = 'everness_glass_place', gain = 0.2 } + return table + end + + default.node_sound_glass_defaults = default.node_sound_thin_glass_defaults + + --[[function default.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_glass_footstep', gain = 0.02 } + table.dig = table.dig or { name = 'everness_glass_footstep', gain = 0.05 } + table.dug = table.dug or { name = 'everness_glass_dug', gain = 0.4 } + table.place = table.place or { name = 'everness_glass_place', gain = 0.2 } + return table + end]] + + function default.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_snow_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_snow_hit', gain = 0.2 } + table.dug = table.dug or { name = 'everness_snow_footstep', gain = 0.2 } + table.place = table.place or { name = 'everness_snow_place', gain = 0.3 } + return table + end + + function default.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_gravel_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_gravel_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_gravel_dug', gain = 0.6 } + table.place = table.place or { name = 'everness_gravel_place', gain = 1.0 } + return table + end + + function default.node_sound_ceramic_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_ceramic_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_ceramic_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_ceramic_dug', gain = 1.0 } + table.place = table.place or { name = 'everness_ceramic_place', gain = 1.0 } + return table + end + + function default.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_water_footstep', gain = 0.05 } + default.node_sound_defaults(table) + return table + end + + -- Override hard-coded default sounds with Everness sounds + + minetest.register_on_mods_loaded(function() + local sound_map = { + default_dug_node = { name = 'everness_stone_hit', gain = 1.0 }, + default_place_node_hard = { name = 'everness_stone_dug', gain = 0.6 }, + default_hard_footstep = { name = 'everness_stone_footstep', gain = 0.6 }, + default_dirt_footstep = { name = 'everness_dirt_footstep', gain = 0.15 }, + default_dig_crumbly = { name = 'everness_dirt_hit', gain = 1.0 }, + default_grass_footstep = { name = 'everness_grass_footstep', gain = 0.6 }, + default_sand_footstep = { name = 'everness_sand_footstep', gain = 0.1 }, + default_glass_footstep = { name = 'everness_glass_footstep', gain = 0.02 }, + default_break_glass = { name = 'everness_glass_place', gain = 0.2 }, + default_ice_footstep = { name = 'everness_ice_footstep', gain = 0.2 }, + default_ice_dig = { name = 'everness_ice_hit', gain = 0.4 }, + default_ice_dug = { name = 'everness_ice_hit', gain = 1.0 }, + default_metal_footstep = { name = 'everness_metal_footstep', gain = 0.1 }, + default_metal_dig = { name = 'everness_metal_hit', gain = 0.5 }, + default_metal_dug = { name = 'everness_metal_dug', gain = 0.1 }, + default_metal_place = { name = 'everness_metal_place', gain = 0.15 }, + default_snow_footstep = { name = 'everness_snow_footstep', gain = 0.1 }, + default_water_footstep = { name = 'everness_water_footstep', gain = 0.05 }, + } + + for node,def in pairs(minetest.registered_nodes) do + local sounds = def.sounds or {} + for name,sound in pairs(sounds) do + local everness_sound = sound_map[sound.name] + if everness_sound then + sounds[name] = { name = everness_sound.name, gain = everness_sound.gain } + end + end + end + end) +else + function default.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "", gain = 1.0} + table.dug = table.dug or + {name = "default_dug_node", gain = 0.25} + table.place = table.place or + {name = "default_place_node_hard", gain = 1.0} + return table + end + + function default.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_hard_footstep", gain = 0.2} + table.dug = table.dug or + {name = "default_hard_footstep", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_dirt_footstep", gain = 0.25} + table.dig = table.dig or + {name = "default_dig_crumbly", gain = 0.4} + table.dug = table.dug or + {name = "default_dirt_footstep", gain = 1.0} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_sand_footstep", gain = 0.05} + table.dug = table.dug or + {name = "default_sand_footstep", gain = 0.15} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_gravel_footstep", gain = 0.25} + table.dig = table.dig or + {name = "default_gravel_dig", gain = 0.35} + table.dug = table.dug or + {name = "default_gravel_dug", gain = 1.0} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_wood_footstep", gain = 0.15} + table.dig = table.dig or + {name = "default_dig_choppy", gain = 0.4} + table.dug = table.dug or + {name = "default_wood_footstep", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_grass_footstep", gain = 0.45} + table.dug = table.dug or + {name = "default_grass_footstep", gain = 0.7} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_glass_footstep", gain = 0.3} + table.dig = table.dig or + {name = "default_glass_footstep", gain = 0.5} + table.dug = table.dug or + {name = "default_break_glass", gain = 1.0} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_ice_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_ice_footstep", gain = 0.15} + table.dig = table.dig or + {name = "default_ice_dig", gain = 0.5} + table.dug = table.dug or + {name = "default_ice_dug", gain = 0.5} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_metal_footstep", gain = 0.2} + table.dig = table.dig or + {name = "default_dig_metal", gain = 0.5} + table.dug = table.dug or + {name = "default_dug_metal", gain = 0.5} + table.place = table.place or + {name = "default_place_node_metal", gain = 0.5} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_water_footstep", gain = 0.2} + default.node_sound_defaults(table) + return table + end + + function default.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_snow_footstep", gain = 0.2} + table.dig = table.dig or + {name = "default_snow_footstep", gain = 0.3} + table.dug = table.dug or + {name = "default_snow_footstep", gain = 0.3} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table + end +end + +-- +-- Lavacooling +-- + +default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "default:stone"}) + end + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.2}, true) +end + +if minetest.settings:get_bool("enable_lavacooling") ~= false then + minetest.register_abm({ + label = "Lava cooling", + nodenames = {"default:lava_source", "default:lava_flowing"}, + neighbors = {"group:cools_lava", "group:water"}, + interval = 2, + chance = 2, + catch_up = false, + action = function(...) + default.cool_lava(...) + end, + }) +end + + +-- +-- Optimized helper to put all items in an inventory into a drops list +-- + +function default.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n+1] = stack:to_table() + n = n + 1 + end + end +end + + +-- +-- Papyrus and cactus growing +-- + +-- Wrapping the functions in ABM action is necessary to make overriding them possible + +function default.grow_cactus(pos, node) + if node.param2 >= 4 then + return + end + pos.y = pos.y - 1 + if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:cactus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:cactus"}) + return true +end + +function default.grow_papyrus(pos, node) + pos.y = pos.y - 1 + local name = minetest.get_node(pos).name + if name ~= "default:dirt" and + name ~= "default:dirt_with_grass" and + name ~= "default:dirt_with_dry_grass" and + name ~= "default:dirt_with_rainforest_litter" and + name ~= "default:dry_dirt" and + name ~= "default:dry_dirt_with_dry_grass" then + return + end + if not minetest.find_node_near(pos, 3, {"group:water"}) then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:papyrus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:papyrus"}) + return true +end + +minetest.register_abm({ + label = "Grow cactus", + nodenames = {"default:cactus"}, + neighbors = {"group:sand"}, + interval = 12, + chance = 83, + action = function(...) + default.grow_cactus(...) + end +}) + +minetest.register_abm({ + label = "Grow papyrus", + nodenames = {"default:papyrus"}, + -- Grows on the dirt and surface dirt nodes of the biomes papyrus appears in, + -- including the old savanna nodes. + -- 'default:dirt_with_grass' is here only because it was allowed before. + neighbors = { + "default:dirt", + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", + "default:dry_dirt", + "default:dry_dirt_with_dry_grass", + }, + interval = 14, + chance = 71, + action = function(...) + default.grow_papyrus(...) + end +}) + + +-- +-- Dig upwards +-- + +local in_dig_up = false + +function default.dig_up(pos, node, digger, max_height) + if in_dig_up then return end -- Do not recurse + if digger == nil then return end + max_height = max_height or 100 + + in_dig_up = true + for y = 1, max_height do + local up_pos = vector.offset(pos, 0, y, 0) + local up_node = minetest.get_node(up_pos) + if up_node.name ~= node.name then + break + end + if not minetest.node_dig(up_pos, up_node, digger) then + break + end + end + in_dig_up = false +end + +-- errors are hard to handle, instead we rely on resetting this value the next step +minetest.register_globalstep(function() + in_dig_up = false +end) + + +-- +-- Fence registration helper +-- +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +function default.register_fence(name, def) + local fence_texture = "default_fence_overlay.png^" .. def.texture .. + "^default_fence_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16, 3/16, -1/2, 1/16, 5/16, -1/8 }, + {-1/16, -5/16, -1/2, 1/16, -3/16, -1/8 }}, + connect_left = {{-1/2, 3/16, -1/16, -1/8, 5/16, 1/16}, + {-1/2, -5/16, -1/16, -1/8, -3/16, 1/16}}, + connect_back = {{-1/16, 3/16, 1/8, 1/16, 5/16, 1/2 }, + {-1/16, -5/16, 1/8, 1/16, -3/16, 1/2 }}, + connect_right = {{ 1/8, 3/16, -1/16, 1/2, 5/16, 1/16}, + { 1/8, -5/16, -1/16, 1/2, -3/16, 1/16}} + }, + collision_box = { + type = "connected", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2 + fence_collision_extra, 1/8}, + -- connect_top = + -- connect_bottom = + connect_front = {-1/8, -1/2, -1/2, 1/8, 1/2 + fence_collision_extra, -1/8}, + connect_left = {-1/2, -1/2, -1/8, -1/8, 1/2 + fence_collision_extra, 1/8}, + connect_back = {-1/8, -1/2, 1/8, 1/8, 1/2 + fence_collision_extra, 1/2}, + connect_right = { 1/8, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + }, + connects_to = {"group:fence", "group:wood", "group:tree", "group:wall"}, + inventory_image = fence_texture, + wield_image = fence_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + local material = def.material + def.texture = nil + def.material = nil + + minetest.register_node(name, def) + + -- Register crafting recipe, trim away starting colon if any + if not material then return end + name = string.gsub(name, "^:", "") + minetest.register_craft({ + output = name .. " 4", + recipe = { + { material, 'group:stick', material }, + { material, 'group:stick', material }, + } + }) +end + + +-- +-- Fence rail registration helper +-- + +function default.register_fence_rail(name, def) + local fence_rail_texture = "default_fence_rail_overlay.png^" .. def.texture .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/16, 3/16, -1/16, 1/16, 5/16, 1/16}, + {-1/16, -3/16, -1/16, 1/16, -5/16, 1/16}}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16, 3/16, -1/2, 1/16, 5/16, -1/16}, + {-1/16, -5/16, -1/2, 1/16, -3/16, -1/16}}, + connect_left = {{-1/2, 3/16, -1/16, -1/16, 5/16, 1/16}, + {-1/2, -5/16, -1/16, -1/16, -3/16, 1/16}}, + connect_back = {{-1/16, 3/16, 1/16, 1/16, 5/16, 1/2 }, + {-1/16, -5/16, 1/16, 1/16, -3/16, 1/2 }}, + connect_right = {{ 1/16, 3/16, -1/16, 1/2, 5/16, 1/16}, + { 1/16, -5/16, -1/16, 1/2, -3/16, 1/16}} + }, + collision_box = { + type = "connected", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2 + fence_collision_extra, 1/8}, + -- connect_top = + -- connect_bottom = + connect_front = {-1/8, -1/2, -1/2, 1/8, 1/2 + fence_collision_extra, -1/8}, + connect_left = {-1/2, -1/2, -1/8, -1/8, 1/2 + fence_collision_extra, 1/8}, + connect_back = {-1/8, -1/2, 1/8, 1/8, 1/2 + fence_collision_extra, 1/2}, + connect_right = { 1/8, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + }, + connects_to = {"group:fence", "group:wall"}, + inventory_image = fence_rail_texture, + wield_image = fence_rail_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + local material = def.material + def.texture = nil + def.material = nil + + minetest.register_node(name, def) + + -- Register crafting recipe, trim away starting colon if any + if not material then return end + name = string.gsub(name, "^:", "") + minetest.register_craft({ + output = name .. " 16", + recipe = { + { material, material }, + { "", ""}, + { material, material }, + } + }) +end + +-- +-- Mese post registration helper +-- + +function default.register_mesepost(name, def) + local post_texture = def.texture .. "^default_mese_post_light_side.png^[makealpha:0,0,0" + local post_texture_dark = def.texture .. "^default_mese_post_light_side_dark.png^[makealpha:0,0,0" + -- Allow almost everything to be overridden + local default_fields = { + wield_image = post_texture, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16}, + }, + }, + paramtype = "light", + tiles = {def.texture, def.texture, post_texture_dark, post_texture_dark, post_texture, post_texture}, + use_texture_alpha = "opaque", + light_source = default.LIGHT_MAX, + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + local material = def.material + def.texture = nil + def.material = nil + + minetest.register_node(name, def) + + -- Register crafting recipe, trim away starting colon if any + if not material then return end + name = string.gsub(name, "^:", "") + minetest.register_craft({ + output = name .. " 4", + recipe = { + {'', 'default:glass', ''}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'', material, ''}, + } + }) +end + +-- +-- Leafdecay +-- + +-- Prevent decay of placed leaves + +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end +end + +-- Leafdecay +local function leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if node.param2 ~= 1 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) + end + end +end + +local movement_gravity = tonumber( + minetest.settings:get("movement_gravity")) or 9.81 + +local function leafdecay_on_timer(pos, def) + if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or + not is_leaf then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) + + -- spawn a few particles for the removed node + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}), + maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) +end + +function default.register_leafdecay(def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + + +-- +-- Convert default:dirt to something that fits the environment +-- + +minetest.register_abm({ + label = "Grass spread", + nodenames = {"default:dirt"}, + neighbors = { + "air", + "group:grass", + "group:dry_grass", + "default:snow", + }, + interval = 6, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type") + if p2 then + local n3 = minetest.get_node(p2) + minetest.set_node(pos, {name = n3.name}) + return + end + + -- Else, any seeding nodes on top? + local name = minetest.get_node(above).name + -- Snow check is cheapest, so comes first + if name == "default:snow" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + elseif minetest.get_item_group(name, "grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + elseif minetest.get_item_group(name, "dry_grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) + end + end +}) + + +-- +-- Grass and dry grass removed in darkness +-- + +minetest.register_abm({ + label = "Grass covered", + nodenames = {"group:spreading_dirt_type", "default:dry_dirt_with_dry_grass"}, + interval = 8, + chance = 50, + catch_up = false, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or + nodedef.paramtype == "light") and + nodedef.liquidtype == "none") then + local ndef = minetest.registered_nodes[node.name] + if ndef and type(ndef.drop) == "string" and minetest.registered_nodes[ndef.drop] then + minetest.set_node(pos, {name = ndef.drop}) + elseif node.name == "default:dry_dirt_with_dry_grass" then + minetest.set_node(pos, {name = "default:dry_dirt"}) + else + minetest.set_node(pos, {name = "default:dirt"}) + end + end + end +}) + + +-- +-- Moss growth on cobble near water +-- + +local moss_correspondences = { + ["default:cobble"] = "default:mossycobble", + ["stairs:slab_cobble"] = "stairs:slab_mossycobble", + ["stairs:stair_cobble"] = "stairs:stair_mossycobble", + ["stairs:stair_inner_cobble"] = "stairs:stair_inner_mossycobble", + ["stairs:stair_outer_cobble"] = "stairs:stair_outer_mossycobble", + ["walls:cobble"] = "walls:mossycobble", +} +minetest.register_abm({ + label = "Moss growth", + nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble", + "stairs:stair_inner_cobble", "stairs:stair_outer_cobble", + "walls:cobble"}, + neighbors = {"group:water"}, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + node.name = moss_correspondences[node.name] + if node.name then + minetest.set_node(pos, node) + end + end +}) + +-- +-- Register a craft to copy the metadata of items +-- + +function default.register_craft_metadata_copy(ingredient, result) + minetest.register_craft({ + type = "shapeless", + output = result, + recipe = {ingredient, result} + }) + + minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack:get_name() ~= result then + return + end + + local original + local index + for i = 1, #old_craft_grid do + if old_craft_grid[i]:get_name() == result then + original = old_craft_grid[i] + index = i + end + end + if not original then + return + end + local copymeta = original:get_meta():to_table() + itemstack:get_meta():from_table(copymeta) + -- put the book with metadata back in the craft grid + craft_inv:set_stack("craft", index, original) + end) +end + +-- +-- Log API / helpers +-- + +local log_non_player_actions = minetest.settings:get_bool("log_non_player_actions", false) + +local is_pos = function(v) + return type(v) == "table" and + type(v.x) == "number" and type(v.y) == "number" and type(v.z) == "number" +end + +function default.log_player_action(player, ...) + local msg = player:get_player_name() + if player.is_fake_player or not player:is_player() then + if not log_non_player_actions then + return + end + msg = msg .. "(" .. (type(player.is_fake_player) == "string" + and player.is_fake_player or "*") .. ")" + end + for _, v in ipairs({...}) do + -- translate pos + local part = is_pos(v) and minetest.pos_to_string(v) or v + -- no leading spaces before punctuation marks + msg = msg .. (string.match(part, "^[;,.]") and "" or " ") .. part + end + minetest.log("action", msg) +end + +local nop = function() end +function default.set_inventory_action_loggers(def, name) + local on_move = def.on_metadata_inventory_move or nop + def.on_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + default.log_player_action(player, "moves stuff in", name, "at", pos) + return on_move(pos, from_list, from_index, to_list, to_index, count, player) + end + local on_put = def.on_metadata_inventory_put or nop + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + default.log_player_action(player, "moves", stack:get_name(), stack:get_count(), "to", name, "at", pos) + return on_put(pos, listname, index, stack, player) + end + local on_take = def.on_metadata_inventory_take or nop + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + default.log_player_action(player, "takes", stack:get_name(), stack:get_count(), "from", name, "at", pos) + return on_take(pos, listname, index, stack, player) + end +end + +-- +-- NOTICE: This method is not an official part of the API yet. +-- This method may change in future. +-- + +function default.can_interact_with_node(player, pos) + if player and player:is_player() then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if not owner or owner == "" or owner == player:get_player_name() then + return true + end + + -- Is player wielding the right key? + local item = player:get_wielded_item() + if minetest.get_item_group(item:get_name(), "key") == 1 then + local key_meta = item:get_meta() + + if key_meta:get_string("secret") == "" then + local key_oldmeta = item:get_meta():get_string("") + if key_oldmeta == "" or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string("secret", minetest.parse_json(key_oldmeta).secret) + item:set_metadata("") + end + + return meta:get_string("key_lock_secret") == key_meta:get_string("secret") + end + + return false +end diff --git a/mods/minetest_game/default/furnace.lua b/mods/minetest_game/default/furnace.lua new file mode 100644 index 00000000..4ef4e024 --- /dev/null +++ b/mods/minetest_game/default/furnace.lua @@ -0,0 +1,436 @@ +-- default/furnace.lua + +-- support for MT game translation. +local S = default.get_translator + +-- List of sound handles for active furnace +local furnace_fire_sounds = {} + +-- +-- Formspecs +-- + +function default.get_furnace_active_formspec(fuel_percent, item_percent) + return "size[8,8.5]".. + "list[context;src;2.75,0.5;1,1;]".. + "list[context;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[context;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +function default.get_furnace_inactive_formspec() + return "size[8,8.5]".. + "list[context;src;2.75,0.5;1,1;]".. + "list[context;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[context;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", S("Furnace is empty")) + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function stop_furnace_sound(pos, fadeout_step) + local hash = minetest.hash_node_position(pos) + local sound_ids = furnace_fire_sounds[hash] + if sound_ids then + for _, sound_id in ipairs(sound_ids) do + minetest.sound_fade(sound_id, -1, 0) + end + furnace_fire_sounds[hash] = nil + end +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Initialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + local dst_full = false + + local timer_elapsed = meta:get_int("timer_elapsed") or 0 + meta:set_int("timer_elapsed", timer_elapsed + 1) + + local cookable, cooked + local fuel + + local update = true + local items_smelt = 0 + while elapsed > 0 and update do + update = false + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = cooked.time ~= 0 + + local el = math.min(elapsed, fuel_totaltime - fuel_time) + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + el + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = src_time - cooked.time + update = true + else + dst_full = true + end + items_smelt = items_smelt + 1 + else + -- Item could not be cooked: probably missing fuel + update = true + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + src_time = 0 + else + -- prevent blocking of fuel inventory (for automatization mods) + local is_fuel = minetest.get_craft_result({method = "fuel", width = 1, items = {afterfuel.items[1]:to_string()}}) + if is_fuel.time == 0 then + table.insert(fuel.replacements, afterfuel.items[1]) + inv:set_stack("fuel", 1, "") + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + end + -- Put replacements in dst list or drop them on the furnace. + local replacements = fuel.replacements + if replacements[1] then + local leftover = inv:add_item("dst", replacements[1]) + if not leftover:is_empty() then + local above = vector.new(pos.x, pos.y + 1, pos.z) + local drop_pos = minetest.find_node_near(above, 1, {"air"}) or above + minetest.item_drop(replacements[1], nil, drop_pos) + end + end + update = true + fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time) + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + src_time = 0 + end + fuel_time = 0 + end + + elapsed = elapsed - el + end + + if items_smelt > 0 then + -- Play cooling sound + minetest.sound_play("default_cool_lava", + { pos = pos, max_hear_distance = 16, gain = 0.07 * math.min(items_smelt, 7) }, true) + end + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist and srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec, infotext and node + -- + local formspec + local item_state + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + if dst_full then + item_state = S("100% (output full)") + else + item_state = S("@1%", item_percent) + end + else + if srclist and not srclist[1]:is_empty() then + item_state = S("Not cookable") + else + item_state = S("Empty") + end + end + + local fuel_state = S("Empty") + local active = false + local result = false + + if fuel_totaltime ~= 0 then + active = true + local fuel_percent = 100 - math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = S("@1%", fuel_percent) + formspec = default.get_furnace_active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + -- make sure timer restarts automatically + result = true + + -- Play sound every 5 seconds while the furnace is active + if timer_elapsed == 0 or (timer_elapsed + 1) % 5 == 0 then + local sound_id = minetest.sound_play("default_furnace_active", + {pos = pos, max_hear_distance = 16, gain = 0.25}) + local hash = minetest.hash_node_position(pos) + furnace_fire_sounds[hash] = furnace_fire_sounds[hash] or {} + table.insert(furnace_fire_sounds[hash], sound_id) + -- Only remember the 3 last sound handles + if #furnace_fire_sounds[hash] > 3 then + table.remove(furnace_fire_sounds[hash], 1) + end + -- Remove the sound ID automatically from table after 11 seconds + minetest.after(11, function() + if not furnace_fire_sounds[hash] then + return + end + for f=#furnace_fire_sounds[hash], 1, -1 do + if furnace_fire_sounds[hash][f] == sound_id then + table.remove(furnace_fire_sounds[hash], f) + end + end + if #furnace_fire_sounds[hash] == 0 then + furnace_fire_sounds[hash] = nil + end + end) + end + else + if fuellist and not fuellist[1]:is_empty() then + fuel_state = S("@1%", 0) + end + formspec = default.get_furnace_inactive_formspec() + swap_node(pos, "default:furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + meta:set_int("timer_elapsed", 0) + + stop_furnace_sound(pos) + end + + + local infotext + if active then + infotext = S("Furnace active") + else + infotext = S("Furnace inactive") + end + infotext = infotext .. "\n" .. S("(Item: @1; Fuel: @2)", item_state, fuel_state) + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + + return result +end + +-- +-- Node definitions +-- + +local function apply_logger(def) + default.set_inventory_action_loggers(def, "furnace") + return def +end + +minetest.register_node("default:furnace", apply_logger({ + description = S("Furnace"), + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + on_timer = furnace_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('fuel', 1) + inv:set_size('dst', 4) + furnace_node_timer(pos, 0) + end, + + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos) + -- check whether the furnace is empty or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "src", drops) + default.get_inventory_drops(pos, "fuel", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "default:furnace" + minetest.remove_node(pos) + return drops + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +})) + +minetest.register_node("default:furnace_active", apply_logger({ + description = S("Furnace"), + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + on_destruct = function(pos) + stop_furnace_sound(pos) + end, + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +})) + +minetest.register_craft({ + output = "default:furnace", + recipe = { + {"group:stone", "group:stone", "group:stone"}, + {"group:stone", "", "group:stone"}, + {"group:stone", "group:stone", "group:stone"}, + } +}) diff --git a/mods/minetest_game/default/init.lua b/mods/minetest_game/default/init.lua new file mode 100644 index 00000000..649b5c00 --- /dev/null +++ b/mods/minetest_game/default/init.lua @@ -0,0 +1,95 @@ +-- Minetest Game mod: default +-- See README.txt for licensing and other information. + +-- The API documentation in here was moved into game_api.txt + +-- Load support for MT game translation. +local S = minetest.get_translator("default") + +-- Definitions made by this mod that other mods can use too +default = {} + +default.LIGHT_MAX = 14 +default.get_translator = S + +-- Check for engine features required by MTG +-- This provides clear error behaviour when MTG is newer than the installed engine +-- and avoids obscure, hard to debug runtime errors. +-- This section should be updated before release and older checks can be dropped +-- when newer ones are introduced. +if ItemStack("").add_wear_by_uses == nil then + error("\nThis version of Minetest Game is incompatible with your engine version ".. + "(which is too old). You should download a version of Minetest Game that ".. + "matches the installed engine version.\n") +end + +-- GUI related stuff +minetest.register_on_joinplayer(function(player) + -- Set formspec prepend + local formspec = [[ + bgcolor[#080808BB;true] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]] + local name = player:get_player_name() + local info = minetest.get_player_information(name) + if info.formspec_version > 1 then + formspec = formspec .. "background9[5,5;1,1;gui_formbg.png;true;10]" + else + formspec = formspec .. "background[5,5;1,1;gui_formbg.png;true]" + end + player:set_formspec_prepend(formspec) + + -- Set hotbar textures + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) + +function default.get_hotbar_bg(x,y) + local out = "" + for i=0,7,1 do + out = out .."image["..x+i..","..y..";1,1;gui_hb_bg.png]" + end + return out +end + +default.gui_survival_form = "size[8,8.5]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "list[current_player;craft;1.75,0.5;3,3;]".. + "list[current_player;craftpreview;5.75,1.5;1,1;]".. + "image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "listring[current_player;main]".. + "listring[current_player;craft]".. + default.get_hotbar_bg(0,4.25) + +-- Load files +local default_path = minetest.get_modpath("default") + +dofile(default_path.."/functions.lua") +dofile(default_path.."/trees.lua") +dofile(default_path.."/nodes.lua") +dofile(default_path.."/chests.lua") +dofile(default_path.."/furnace.lua") +dofile(default_path.."/torch.lua") +dofile(default_path.."/tools.lua") +dofile(default_path.."/item_entity.lua") +dofile(default_path.."/craftitems.lua") +dofile(default_path.."/crafting.lua") +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/aliases.lua") +dofile(default_path.."/legacy.lua") + +-- Smoke test that is run via ./util/test/run.sh +if minetest.settings:get_bool("minetest_game_smoke_test") then + minetest.after(0, function() + minetest.emerge_area(vector.new(0, 0, 0), vector.new(32, 32, 32)) + local pos = vector.new(9, 9, 9) + local function check() + if minetest.get_node(pos).name ~= "ignore" then + minetest.request_shutdown() + return + end + minetest.after(0, check) + end + check() + end) +end diff --git a/mods/minetest_game/default/item_entity.lua b/mods/minetest_game/default/item_entity.lua new file mode 100644 index 00000000..50b4cd03 --- /dev/null +++ b/mods/minetest_game/default/item_entity.lua @@ -0,0 +1,86 @@ +-- mods/default/item_entity.lua + +local builtin_item = minetest.registered_entities["__builtin:item"] + +-- strictly speaking none of this is part of the API, so do some checks +-- and if it looks wrong skip the modifications +if not builtin_item or type(builtin_item.set_item) ~= "function" or type(builtin_item.on_step) ~= "function" then + minetest.log("warning", "Builtin item entity does not look as expected, skipping overrides.") + return +end + +local item = { + set_item = function(self, itemstring, ...) + builtin_item.set_item(self, itemstring, ...) + + local stack = ItemStack(itemstring) + local itemdef = minetest.registered_items[stack:get_name()] + if itemdef and itemdef.groups.flammable ~= 0 then + self.flammable = itemdef.groups.flammable + end + end, + + burn_up = function(self) + -- disappear in a smoke puff + local p = self.object:get_pos() + self.object:remove() + minetest.sound_play("default_item_smoke", { + pos = p, + gain = 1.0, + max_hear_distance = 8, + }, true) + minetest.add_particlespawner({ + amount = 3, + time = 0.1, + minpos = {x = p.x - 0.1, y = p.y + 0.1, z = p.z - 0.1 }, + maxpos = {x = p.x + 0.1, y = p.y + 0.2, z = p.z + 0.1 }, + minvel = {x = 0, y = 2.5, z = 0}, + maxvel = {x = 0, y = 2.5, z = 0}, + minacc = {x = -0.15, y = -0.02, z = -0.15}, + maxacc = {x = 0.15, y = -0.01, z = 0.15}, + minexptime = 4, + maxexptime = 6, + minsize = 5, + maxsize = 5, + collisiondetection = true, + texture = "default_item_smoke.png" + }) + end, + + on_step = function(self, dtime, ...) + builtin_item.on_step(self, dtime, ...) + + if self.flammable then + -- flammable, check for igniters every 10 s + self.ignite_timer = (self.ignite_timer or 0) + dtime + if self.ignite_timer > 10 then + self.ignite_timer = 0 + + local pos = self.object:get_pos() + if pos == nil then + return -- object already deleted + end + local node = minetest.get_node_or_nil(pos) + if not node then + return + end + + -- Immediately burn up flammable items in lava + if minetest.get_item_group(node.name, "lava") > 0 then + self:burn_up() + else + -- otherwise there'll be a chance based on its igniter value + local burn_chance = self.flammable + * minetest.get_item_group(node.name, "igniter") + if burn_chance > 0 and math.random(0, burn_chance) ~= 0 then + self:burn_up() + end + end + end + end + end, +} + +-- set defined item as new __builtin:item, with the old one as fallback table +setmetatable(item, { __index = builtin_item }) +minetest.register_entity(":__builtin:item", item) diff --git a/mods/minetest_game/default/legacy.lua b/mods/minetest_game/default/legacy.lua new file mode 100644 index 00000000..a2d812d4 --- /dev/null +++ b/mods/minetest_game/default/legacy.lua @@ -0,0 +1,49 @@ +-- mods/default/legacy.lua + +-- Horrible stuff to support old code registering falling nodes +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + +function default.spawn_falling_node(p, nodename) + spawn_falling_node(p, nodename) +end + +-- Liquids +WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha +WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity +LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity +LIGHT_MAX = default.LIGHT_MAX + +-- Formspecs +default.gui_suvival_form = default.gui_survival_form +default.gui_bg = "" +default.gui_bg_img = "" +default.gui_slots = "" + +-- Players +if minetest.get_modpath("player_api") then + default.registered_player_models = player_api.registered_models + default.player_register_model = player_api.register_model + default.player_attached = player_api.player_attached + default.player_get_animation = player_api.get_animation + default.player_set_model = player_api.set_model + default.player_set_textures = player_api.set_textures + default.player_set_animation = player_api.set_animation +end + +-- Chests +default.register_chest = default.chest.register_chest + +-- Check for a volume intersecting protection +function default.intersects_protection(minp, maxp, player_name, interval) + minetest.log("warning", "default.intersects_protection() is " .. + "deprecated, use minetest.is_area_protected() instead.") + return minetest.is_area_protected(minp, maxp, player_name, interval) +end diff --git a/mods/minetest_game/default/license.txt b/mods/minetest_game/default/license.txt new file mode 100644 index 00000000..625f0f86 --- /dev/null +++ b/mods/minetest_game/default/license.txt @@ -0,0 +1,158 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2023: + + celeron55, Perttu Ahola + Cisoun + G4JC + VanessaE + RealBadAngel + Calinou + MirceaKitsune + Jordach + PilzAdam + jojoa1997 + InfinityProject + Splizard + Zeg9 + paramat + BlockMen + sofar + Neuromancer + Gambit + asl97 + KevDoy + Mito551 + GreenXenith + kaeza + kilbith + tobyplowy + CloudyProton + TumeniNodes + Mossmanikin + random-geek + Extex101 + An0n3m0us + Lopano + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) + +Copyright (C) 2009 cmusounddesign +Copyright (C) 2010 Tomlija +Copyright (C) 2010 lsprice +Copyright (C) 2014 sonictechtonic +Copyright (C) 2015 yadronoff +Copyright (C) 2007 HerbertBoland +Copyright (C) 2006 AGFX + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + +Iwan Gabovitch +Ottomaani138 +Ogrebane +blukotek +Sevin7 +Yoyodaman234 +Ryding + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/minetest_game/default/locale/default.de.tr b/mods/minetest_game/default/locale/default.de.tr new file mode 100644 index 00000000..cb0ec1eb --- /dev/null +++ b/mods/minetest_game/default/locale/default.de.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Abgeschlossene Truhe +Locked Chest (owned by @1)=Abgeschlossene Truhe (Eigentum von @1) +You do not own this chest.=Ihnen gehört diese Truhe nicht. +a locked chest=eine abgeschlossene Truhe +Chest=Truhe +Write=Schreiben +Read=Lesen +Title:=Titel: +Contents:=Inhalt: +Save=Speichern +by @1=von @1 +Page @1 of @2=Seite @1 von @2 +The book you were writing to mysteriously disappeared.=Das Buch, an dem Sie geschrieben haben, ist auf mysteriöse Weise verschwunden. +"@1" by @2=„@1“ von @2 +Blueberries=Blaubeeren +Book=Buch +Book with Text=Buch mit Text +Bronze Ingot=Bronzebarren +Clay Brick=Tonziegel +Clay Lump=Tonklumpen +Coal Lump=Kohleklumpen +Copper Ingot=Kupferbarren +Copper Lump=Kupferklumpen +Diamond=Diamant +Flint=Feuerstein +Gold Ingot=Goldbarren +Gold Lump=Goldklumpen +Iron Lump=Eisenklumpen +Mese Crystal=Mesekristall +Mese Crystal Fragment=Mesekristallfragment +Obsidian Shard=Obsidianscherbe +Paper=Papier +Steel Ingot=Stahlbarren +Stick=Stock +Tin Ingot=Zinnbarren +Tin Lump=Zinnklumpen +Furnace is empty=Ofen ist leer +100% (output full)=100% (Ausgabe voll) +@1%=@1% +Not cookable=Nicht kochbar +Empty=Leer +Furnace active=Ofen aktiv +Furnace inactive=Ofen inaktiv +(Item: @1; Fuel: @2)=(Gegenstand: @1; Brennstoff: @2) +Furnace=Ofen +Stone=Stein +Cobblestone=Kopfsteinpflaster +Stone Brick=Steinziegel +Stone Block=Steinblock +Mossy Cobblestone=Moosiges Kopfsteinpflaster +Desert Stone=Wüstenstein +Desert Cobblestone=Wüstenkopfsteinpflaster +Desert Stone Brick=Wüstensteinziegel +Desert Stone Block=Wüstensteinblock +Sandstone=Sandstein +Sandstone Brick=Sandsteinziegel +Sandstone Block=Sandsteinblock +Desert Sandstone=Wüstensandstein +Desert Sandstone Brick=Wüstensandsteinziegel +Desert Sandstone Block=Wüstensandsteinblock +Silver Sandstone=Silbersandstein +Silver Sandstone Brick=Silbersandsteinziegel +Silver Sandstone Block=Silbersandsteinblock +Obsidian=Obsidian +Obsidian Brick=Obsidianziegel +Obsidian Block=Obsidianblock +Dirt=Erde +Dirt with Grass=Erde mit Gras +Dirt with Grass and Footsteps=Erde mit Gras und Fußstapfen +Dirt with Savanna Grass=Erde mit Savannengras +Dirt with Snow=Erde mit Schnee +Dirt with Rainforest Litter=Erde mit Regenwaldboden +Dirt with Coniferous Litter=Erde mit Nadelwaldboden +Savanna Dirt=Savannenerde +Savanna Dirt with Savanna Grass=Savannenerde mit Savannengras +Permafrost=Permafrost +Permafrost with Stones=Permafrost mit Steinen +Permafrost with Moss=Permafrost mit Moos +Sand=Sand +Desert Sand=Wüstensand +Silver Sand=Silbersand +Gravel=Kies +Clay=Ton +Snow=Schnee +Snow Block=Schneeblock +Ice=Eis +Cave Ice=Höhleneis +Apple Tree=Apfelbaum +Apple Wood Planks=Apfelbaumplanken +Apple Tree Sapling=Apfelbaumsetzling +Apple Tree Leaves=Apfelbaumblätter +Apple=Apfel +Apple Marker=Apfelmarkierung +Jungle Tree=Dschungelbaum +Jungle Wood Planks=Dschungelholzplanken +Jungle Tree Leaves=Dschungelbaumblätter +Jungle Tree Sapling=Dschungelbaumsetzling +Emergent Jungle Tree Sapling=Hervorstehender Dschungelbaumsetzling +Pine Tree=Kiefernbaum +Pine Wood Planks=Kiefernholzplanken +Pine Needles=Kiefernnadeln +Pine Tree Sapling=Kiefernbaumsetzling +Acacia Tree=Akazienbaum +Acacia Wood Planks=Akazienholzplanken +Acacia Tree Leaves=Akazienbaumblätter +Acacia Tree Sapling=Akazienbaumsetzling +Aspen Tree=Espenbaum +Aspen Wood Planks=Espenholzplanken +Aspen Tree Leaves=Espenbaumblätter +Aspen Tree Sapling=Espenbaumsetzling +Coal Ore=Kohleerz +Coal Block=Kohleblock +Iron Ore=Eisenerz +Steel Block=Stahlblock +Copper Ore=Kupfererz +Copper Block=Kupferblock +Tin Ore=Zinnerz +Tin Block=Zinnblock +Bronze Block=Bronzeblock +Mese Ore=Meseerz +Mese Block=Meseblock +Gold Ore=Golderz +Gold Block=Goldblock +Diamond Ore=Diamanterz +Diamond Block=Diamantblock +Cactus=Kaktus +Large Cactus Seedling=Großer Kaktussämling +Papyrus=Papyrus +Dry Shrub=Trockener Busch +Jungle Grass=Dschungelgras +Grass=Gras +Savanna Grass=Savannengras +Fern=Farn +Marram Grass=Dünengras +Bush Stem=Buschstamm +Bush Leaves=Buschblätter +Bush Sapling=Buschsetzling +Blueberry Bush Leaves with Berries=Blaubeerbuschblätter mit Beeren +Blueberry Bush Leaves=Blaubeerbuschblätter +Blueberry Bush Sapling=Blaubeerbuschsetzling +Acacia Bush Stem=Akazienbuschstamm +Acacia Bush Leaves=Akazienbuschblätter +Acacia Bush Sapling=Akazienbuschsetzling +Pine Bush Stem=Kiefernbuschstamm +Pine Bush Needles=Kiefernbuschnadeln +Pine Bush Sapling=Kiefernbuschsetzling +Kelp=Seetang +Green Coral=Grüne Koralle +Pink Coral=Rosa Koralle +Cyan Coral=Türkise Koralle +Brown Coral=Braune Koralle +Orange Coral=Orange Koralle +Coral Skeleton=Korallenskelett +Water Source=Wasserquelle +Flowing Water=Fließendes Wasser +River Water Source=Flusswasserquelle +Flowing River Water=Fließendes Flusswasser +Lava Source=Lavaquelle +Flowing Lava=Fließende Lava +Empty Bookshelf=Leeres Bücherregal +Bookshelf (@1 written, @2 empty books)=Bücherregal (@1 beschriebene, @2 leere Bücher) +Bookshelf=Bücherregal +Text too long=Text zu lang +"@1"=„@1“ +Wooden Sign=Holzschild +Steel Sign=Stahlschild +Wooden Ladder=Holzleiter +Steel Ladder=Stahlleiter +Apple Wood Fence=Apfelholzzaun +Acacia Wood Fence=Akazienholzzaun +Jungle Wood Fence=Dschungelholzzaun +Pine Wood Fence=Kiefernholzzaun +Aspen Wood Fence=Espenholzzaun +Apple Wood Fence Rail=Apfelholzzaungeländer +Acacia Wood Fence Rail=Akazienholzzaungeländer +Jungle Wood Fence Rail=Dschungelholzzaungeländer +Pine Wood Fence Rail=Kiefernholzzaungeländer +Aspen Wood Fence Rail=Espenholzzaungeländer +Glass=Glas +Obsidian Glass=Obsidianglas +Brick Block=Ziegelblock +Mese Lamp=Meselampe +Apple Wood Mese Post Light=Apfelholzmesestandlampe +Acacia Wood Mese Post Light=Akazienholzmesestandlampe +Jungle Wood Mese Post Light=Dschungelholzmesestandlampe +Pine Wood Mese Post Light=Kiefernholzmesestandlampe +Aspen Wood Mese Post Light=Espenholzmesestandlampe +Cloud=Wolke +Wooden Pickaxe=Holzspitzhacke +Stone Pickaxe=Steinspitzhacke +Bronze Pickaxe=Bronzespitzhacke +Steel Pickaxe=Stahlspitzhacke +Mese Pickaxe=Mesespitzhacke +Diamond Pickaxe=Diamantspitzhacke +Wooden Shovel=Holzschaufel +Stone Shovel=Steinschaufel +Bronze Shovel=Bronzeschaufel +Steel Shovel=Stahlschaufel +Mese Shovel=Meseschaufel +Diamond Shovel=Diamantschaufel +Wooden Axe=Holzaxt +Stone Axe=Steinaxt +Bronze Axe=Bronzeaxt +Steel Axe=Stahlaxt +Mese Axe=Meseaxt +Diamond Axe=Diamantaxt +Wooden Sword=Holzschwert +Stone Sword=Steinschwert +Bronze Sword=Bronzeschwert +Steel Sword=Stahlschwert +Mese Sword=Meseschwert +Diamond Sword=Diamantschwert +Torch=Fackel +@1 will intersect protection on growth.=@1 wird bei Wachstum mit geschützter Zone überlappen. + + +##### not used anymore ##### + +Mese Post Light=Mesestandlampe diff --git a/mods/minetest_game/default/locale/default.eo.tr b/mods/minetest_game/default/locale/default.eo.tr new file mode 100644 index 00000000..8454c6dc --- /dev/null +++ b/mods/minetest_game/default/locale/default.eo.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Åœlosita kesto +Locked Chest (owned by @1)=Åœlosita kesto (de @1) +You do not own this chest.=Vi ne posedas ĉi tiun keston. +a locked chest=Ålosita kesto +Chest=Kesto +Write=Skribi +Read=Legi +Title:=Titolo: +Contents:=Enhavo: +Save=Konservi +by @1=per @1 +Page @1 of @2=PaÄo @1 el @2 +The book you were writing to mysteriously disappeared.=La libro, kiun vi skribis, mistere malaperis. +"@1" by @2="@1" per @2 +Blueberries=Mirteloj +Book=Libro +Book with Text=Libro kun teksto +Bronze Ingot=Bronza ingoto +Clay Brick=Argila briko +Clay Lump=Argila bulo +Coal Lump=Karba bulo +Copper Ingot=Kupra ingoto +Copper Lump=Kupra bulo +Diamond=Diamanto +Flint=Siliko +Gold Ingot=Ora ingoto +Gold Lump=Ora bulo +Iron Lump=Fera bulo +Mese Crystal=Mesea kristalo +Mese Crystal Fragment=Mesea kristala ero +Obsidian Shard=Obsidiana peceto +Paper=Papero +Steel Ingot=Åœtala ingoto +Stick=Bastono +Tin Ingot=Stana ingoto +Tin Lump=Stana bulo +Furnace is empty=Forno estas malplena +100% (output full)=100% (plena eligo) +@1%=@1% +Not cookable=Nekuirebla +Empty=Malplena +Furnace active=Forno laboras +Furnace inactive=Forno ne laboras +(Item: @1; Fuel: @2)=(Objekto: @1; Brulaĵo: @2) +Furnace=Forno +Stone=Åœtono +Cobblestone=PavimÅtono +Stone Brick=Åœtona briko +Stone Block=Åœtona bloko +Mossy Cobblestone=Muska pavimÅtono +Desert Stone=Dezerta Åtono +Desert Cobblestone=Dezerta pavimÅtono +Desert Stone Brick=Dezerta Åtona briko +Desert Stone Block=Dezerta Åtona bloko +Sandstone=SablaÅtono +Sandstone Brick=SablaÅtono briko +Sandstone Block=SablaÅtono bloko +Desert Sandstone=Dezerta sablaÅtono +Desert Sandstone Brick=Dezerta sablaÅtono briko +Desert Sandstone Block=Dezerta sablaÅtono bloko +Silver Sandstone=ArÄenta sablaÅtono +Silver Sandstone Brick=ArÄenta sablaÅtono briko +Silver Sandstone Block=ArÄenta sablaÅtono bloko +Obsidian=Obsidiano +Obsidian Brick=Obsidiana briko +Obsidian Block=Obsidiana bloko +Dirt=Tero +Dirt with Grass=Tero kun herbo +Dirt with Grass and Footsteps=Tero kun herbo kaj piedpaÅoj +Dirt with Savanna Grass=Tero kun savana herbo +Dirt with Snow=Tero kun neÄo +Dirt with Rainforest Litter=Tero kun pluvarbara folioj +Dirt with Coniferous Litter=Tero kun koniferaj folioj +Savanna Dirt=Savana tero +Savanna Dirt with Savanna Grass=Savana tero kun savana herbo +Permafrost=Ĉiamfrosto +Permafrost with Stones=Ĉiamfrosto kun Åtonoj +Permafrost with Moss=Ĉiamfrosto kun musko +Sand=Sablo +Desert Sand=Dezerta sablo +Silver Sand=ArÄenta sablo +Gravel=Gruzo +Clay=Argilo +Snow=NeÄo +Snow Block=NeÄa bloko +Ice=Glacio +Cave Ice=Kaverna glacio +Apple Tree=Pomarbo +Apple Wood Planks=Pomarbaj lignaj tabuloj +Apple Tree Sapling=Pomarba arbido +Apple Tree Leaves=Pomarbaj folioj +Apple=Pomo +Apple Marker=Poma marko +Jungle Tree=Äœangala arbo +Jungle Wood Planks=Äœangalaj lignaj tabuloj +Jungle Tree Leaves=Äœangalaj arbaj folioj +Jungle Tree Sapling=Äœangala arba arbido +Emergent Jungle Tree Sapling=Nova Äangala arba arbido +Pine Tree=Pino +Pine Wood Planks=Pinaj lignaj tabuloj +Pine Needles=Pinpingloj +Pine Tree Sapling=Pina arbido +Acacia Tree=Akacio +Acacia Wood Planks=Akaciaj lignaj tabuloj +Acacia Tree Leaves=Akaciaj folioj +Acacia Tree Sapling=Akacia arbido +Aspen Tree=Tremolo +Aspen Wood Planks=Tremolaj lignaj tabuloj +Aspen Tree Leaves=Tremolaj folioj +Aspen Tree Sapling=Tremola arbido +Coal Ore=Karba minaĵo +Coal Block=Karba bloko +Iron Ore=Fera minaĵo +Steel Block=Åœtala bloko +Copper Ore=Kupra minaĵo +Copper Block=Kupra bloko +Tin Ore=Stana minaĵo +Tin Block=Stana bloko +Bronze Block=Bronza bloko +Mese Ore=Mesea minaĵo +Mese Block=Mesea bloko +Gold Ore=Ora minaĵo +Gold Block=Ora bloko +Diamond Ore=Diamanta minaĵo +Diamond Block=Diamanta bloko +Cactus=Kakto +Large Cactus Seedling=Granda kakta kreskaĵo +Papyrus=Papiruso +Dry Shrub=Seka arbetaĵo +Jungle Grass=Äœangala herbo +Grass=Herbo +Savanna Grass=Savana herbo +Fern=Filiko +Marram Grass=Amofilo +Bush Stem=Arbateĵa tubo +Bush Leaves=Arbateĵaj folioj +Bush Sapling=Arbateĵa arbido +Blueberry Bush Leaves with Berries=Mirtelaj arbateĵaj folioj kaj beroj +Blueberry Bush Leaves=Mirtelaj arbateĵaj folioj +Blueberry Bush Sapling=Mirtela arbateĵa arbido +Acacia Bush Stem=Akacia arbateĵa tubo +Acacia Bush Leaves=Akaciaj arbateĵaj folioj +Acacia Bush Sapling=Akacia arbateĵa arbido +Pine Bush Stem=Pina arbateĵa tubo +Pine Bush Needles=Pinaj arbateĵaj pingloj +Pine Bush Sapling=Pina arbateĵa arbido +Kelp=Fuko +Green Coral=Verda koralo +Pink Coral=Rozkolora koralo +Cyan Coral=Bluverda koralo +Brown Coral=Bruna koralo +Orange Coral=OranÄkolora koralo +Coral Skeleton=Korala framo +Water Source=Akva fonto +Flowing Water=Flua akvo +River Water Source=Rivera akva fonto +Flowing River Water=Flua rivera akvo +Lava Source=Lafa fonto +Flowing Lava=Flua lafa +Empty Bookshelf=Malplena librobreto +Bookshelf (@1 written, @2 empty books)=Librobreto (@1 skriba(j), @2 malplena(j) libro(j)) +Bookshelf=Librobreto +Text too long=Tro longa teksto +"@1"= +Wooden Sign=Ligna signo +Steel Sign=Åœtala signo +Wooden Ladder=Ligna Åtupetaro +Steel Ladder=Åœtala Åtupetaro +Apple Wood Fence=Poma ligna barilo +Acacia Wood Fence=Akacia ligna barilo +Jungle Wood Fence=Äœangala ligna barilo +Pine Wood Fence=Pina ligna barilo +Aspen Wood Fence=Tremola ligna barilo +Apple Wood Fence Rail=Poma ligna barila relo +Acacia Wood Fence Rail=Akacia ligna barila relo +Jungle Wood Fence Rail=Äœangala ligna barila relo +Pine Wood Fence Rail=Pina ligna barila relo +Aspen Wood Fence Rail=Tremola ligna barila relo +Glass=Vitro +Obsidian Glass=Obsidiana vitro +Brick Block=Brika bloko +Mese Lamp=Mesea lampo +Apple Wood Mese Post Light=Poma ligna mesea fosta lampo +Acacia Wood Mese Post Light=Akacia ligna mesea fosta lampo +Jungle Wood Mese Post Light=Äœangala ligna mesea fosta lampo +Pine Wood Mese Post Light=Pina ligna mesea fosta lampo +Aspen Wood Mese Post Light=Tremola ligna mesea fosta lampo +Cloud=Nubo +Wooden Pickaxe=Ligna pioĉo +Stone Pickaxe=Åœtona pioĉo +Bronze Pickaxe=Bronza pioĉo +Steel Pickaxe=Åœtala pioĉo +Mese Pickaxe=Mesea pioĉo +Diamond Pickaxe=Diamanta pioĉo +Wooden Shovel=Ligna fosilo +Stone Shovel=Åœtona fosilo +Bronze Shovel=Bronza fosilo +Steel Shovel=Åœtala fosilo +Mese Shovel=Mesea fosilo +Diamond Shovel=Diamanta fosilo +Wooden Axe=Ligna hakilo +Stone Axe=Åœtona hakilo +Bronze Axe=Bronza hakilo +Steel Axe=Åœtala hakilo +Mese Axe=Mesea hakilo +Diamond Axe=Diamanta hakilo +Wooden Sword=Ligna glavo +Stone Sword=Åœtona glavo +Bronze Sword=Bronza glavo +Steel Sword=Åœtala glavo +Mese Sword=Mesea glavo +Diamond Sword=Diamanta glavo +Torch=Torĉo +@1 will intersect protection on growth.=@1 sekcos protekton dum kresko. + + +##### not used anymore ##### + +Mese Post Light=Mesea fosta lampo diff --git a/mods/minetest_game/default/locale/default.es.tr b/mods/minetest_game/default/locale/default.es.tr new file mode 100644 index 00000000..d08c2d2e --- /dev/null +++ b/mods/minetest_game/default/locale/default.es.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Cofre cerrado +Locked Chest (owned by @1)=Cofre cerrado (propiedad de @1) +You do not own this chest.=Este cofre no te pertenece. +a locked chest=un cofre cerrado +Chest=Cofre +Write= +Read= +Title:=Título: +Contents:=Contenidos: +Save=Guardar +by @1=por @1 +Page @1 of @2=Página @1 de @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" por @2 +Blueberries=Arándanos +Book=Libro +Book with Text=Libro escrito +Bronze Ingot=Lingote de bronce +Clay Brick=Ladrillo de arcilla +Clay Lump=Bola de arcilla +Coal Lump=Carbón +Copper Ingot=Lingote de cobre +Copper Lump=Pepita de cobre +Diamond=Diamante +Flint=Pedernal +Gold Ingot=Lingote de oro +Gold Lump=Pepita de oro +Iron Lump=Pepita de hierro +Mese Crystal=Cristal de mese +Mese Crystal Fragment=Fragmento de cristal de mese +Obsidian Shard=Esquirla de obsidiana +Paper=Papel +Steel Ingot=Lingote de acero +Stick=Palo +Tin Ingot=Lingote de estaño +Tin Lump=Pepita de estaño +Furnace is empty=El horno está vacío +100% (output full)=100% (salida completa) +@1%=@1% +Not cookable=No se puede cocinar +Empty=Vacío +Furnace active=Horno activado +Furnace inactive=Horno desactivado +(Item: @1; Fuel: @2)=(Objeto: @1; Combustible: @2) +Furnace=Horno +Stone=Piedra +Cobblestone=Adoquín +Stone Brick=Ladrillo de piedra +Stone Block=Bloque de piedra +Mossy Cobblestone=Adoquín musgoso +Desert Stone=Piedra desértica +Desert Cobblestone=Adoquín desértico +Desert Stone Brick=Ladrillo de piedra desértica +Desert Stone Block=Bloque de piedra desértica +Sandstone=Piedra arenisca +Sandstone Brick=Ladrillo de arenisca +Sandstone Block=Bloque de arenisca +Desert Sandstone=Piedra arenisca desértica +Desert Sandstone Brick=Ladrillo de arenisca desértica +Desert Sandstone Block=Bloque de arenisca deÅ›ertica +Silver Sandstone=Piedra arenisca plateada +Silver Sandstone Brick=Ladrillo de arenisca plateada +Silver Sandstone Block=Bloque de arenisca plateada +Obsidian=Obsidiana +Obsidian Brick=Ladrillo de obsidiana +Obsidian Block=Bloque de obsidiana +Dirt=Tierra +Dirt with Grass=Tierra con pasto +Dirt with Grass and Footsteps=Tierra con pasto y pisadas +Dirt with Savanna Grass=Tierra con hierba de sabana +Dirt with Snow=Tierra con nieve +Dirt with Rainforest Litter=Tierra con hojarasca de selva tropical +Dirt with Coniferous Litter=Tierra con hojarasca de coníferas +Savanna Dirt=Tierra de sabana +Savanna Dirt with Savanna Grass=Tierra de sabana con hierba de sabana +Permafrost=Permafrost +Permafrost with Stones=Permafrost pedregoso +Permafrost with Moss=Permafrost musgoso +Sand=Arena +Desert Sand=Arena desértica +Silver Sand=Arena plateada +Gravel=Grava +Clay=Arcilla +Snow=Nieve +Snow Block=Bloque de nieve +Ice=Hielo +Cave Ice=Hielo de cueva +Apple Tree=Madera de manzano +Apple Wood Planks=Tablas de manzano +Apple Tree Sapling=Retoño de manzano +Apple Tree Leaves=Hojas de manzano +Apple=Manzana +Apple Marker=Marcador de manzano +Jungle Tree=Madera de árbol tropical +Jungle Wood Planks=Tablas de madera tropical +Jungle Tree Leaves=Hojas de árbol tropical +Jungle Tree Sapling=Retoño de árbol tropical +Emergent Jungle Tree Sapling=Retoño de árbol tropical +Pine Tree=Madera de pino +Pine Wood Planks=Tablas de pino +Pine Needles=Agujas de pino +Pine Tree Sapling=Retoño de pino +Acacia Tree=Madera de acacia +Acacia Wood Planks=Tablas de acacia +Acacia Tree Leaves=Hojas de acacia +Acacia Tree Sapling=Retoño de acacia +Aspen Tree=Madera de álamo +Aspen Wood Planks=Tablas de álamo +Aspen Tree Leaves=Hojas de álamo +Aspen Tree Sapling=Retoño de álamo +Coal Ore=Mineral de carbón +Coal Block=Bloque de carbón +Iron Ore=Mineral de hierro +Steel Block=Bloque de acero +Copper Ore=Mineral de cobre +Copper Block=Bloque de cobre +Tin Ore=Mineral de estaño +Tin Block=Bloque de estaño +Bronze Block=Bloque de bronce +Mese Ore=Mineral de mese +Mese Block=Bloque de mese +Gold Ore=Mineral de oro +Gold Block=Bloque de oro +Diamond Ore=Mineral de diamante +Diamond Block=Bloque de diamante +Cactus=Cáctus +Large Cactus Seedling=Vástago grande de cactus +Papyrus=Papiro +Dry Shrub=Arbusto seco +Jungle Grass=Pasto de jungla +Grass=Pasto +Savanna Grass=Hierba de sabana +Fern=Helecho +Marram Grass=Carrizo +Bush Stem=Tallo de arbusto +Bush Leaves=Hojas de arbusto +Bush Sapling=Retoño de arbusto +Blueberry Bush Leaves with Berries=Hojas de arbusto de arándano con bayas +Blueberry Bush Leaves=Hojas de arbusto de arándano +Blueberry Bush Sapling=Retoño de arbusto de arándano +Acacia Bush Stem=Tallo de arbusto de acacia +Acacia Bush Leaves=Hojas de arbusto de acacia +Acacia Bush Sapling=Retoño de arbusto de acacia +Pine Bush Stem=Tallo de arbusto de pino +Pine Bush Needles=Agujas de arbusto de pino +Pine Bush Sapling=Retoño de arbusto de pino +Kelp=Alga marina +Green Coral=Coral verde +Pink Coral=Coral rosa +Cyan Coral=Coral cián +Brown Coral=Coral café +Orange Coral=Coral naranja +Coral Skeleton=Esqueleto de coral +Water Source=Fuente de agua +Flowing Water=Fluído de agua +River Water Source=Fuente de agua de río +Flowing River Water=Fluído de agua de río +Lava Source=Fuente de lava +Flowing Lava=Fluído de lava +Empty Bookshelf=Librería vacía +Bookshelf (@1 written, @2 empty books)=Librería(@1 escritos, @2 libros en blanco) +Bookshelf=Librería +Text too long=Texto demasiado largo +"@1"="@1" +Wooden Sign=Cartel de madera +Steel Sign=Cartel de acero +Wooden Ladder=Escalera de madera +Steel Ladder=Escalera de acero +Apple Wood Fence=Cerca de manzano +Acacia Wood Fence=Cerca de acacia +Jungle Wood Fence=Cerca de madera tropical +Pine Wood Fence=Cerca de pino +Aspen Wood Fence=Cerca de álamo +Apple Wood Fence Rail=Listones de manzano para cerca +Acacia Wood Fence Rail=Listones de acacia para cerca +Jungle Wood Fence Rail=Listones de madera tropical para cerca +Pine Wood Fence Rail=Listones de pino para cerca +Aspen Wood Fence Rail=Listones de álamo para cerca +Glass=Vidrio +Obsidian Glass=Vidrio de obsidiana +Brick Block=Bloque de ladrillo +Mese Lamp=Lámpara de mese +Apple Wood Mese Post Light=Poste de luz de madera de manzano +Acacia Wood Mese Post Light=Poste de luz de madera de acacia +Jungle Wood Mese Post Light=Poste de luz de madera de jungla +Pine Wood Mese Post Light=Poste de luz de madera de pino +Aspen Wood Mese Post Light=Poste de luz de madera de álamo +Cloud=Nube +Wooden Pickaxe=Pico de madera +Stone Pickaxe=Pico de piedra +Bronze Pickaxe=Pico de bronce +Steel Pickaxe=Pico de acero +Mese Pickaxe=Pico de mese +Diamond Pickaxe=Pico de diamante +Wooden Shovel=Pala de madera +Stone Shovel=Pala de piedra +Bronze Shovel=Pala de bronce +Steel Shovel=Pala de acero +Mese Shovel=Pala de mese +Diamond Shovel=Pala de diamante +Wooden Axe=Hacha de madera +Stone Axe=Hacha de piedra +Bronze Axe=Hacha de bronce +Steel Axe=Hacha de acero +Mese Axe=Hacha de mese +Diamond Axe=Hacha de diamante +Wooden Sword=Espada de madera +Stone Sword=Espada de piedra +Bronze Sword=Espada de bronce +Steel Sword=Espada de acero +Mese Sword=Espada de mese +Diamond Sword=Espada de diamante +Torch=Antorcha +@1 will intersect protection on growth.=@1 intersectará con protección cuando crezca. + + +##### not used anymore ##### + +Dirt with Dry Grass=Tierra con pasto seco +Dry Dirt=Tierra Seca +Dry Dirt with Dry Grass=Tierra seca con pasto seco +Dry Grass=Pasto seco +Mese Post Light=Poste de luz de mese diff --git a/mods/minetest_game/default/locale/default.fr.tr b/mods/minetest_game/default/locale/default.fr.tr new file mode 100644 index 00000000..8f694fb3 --- /dev/null +++ b/mods/minetest_game/default/locale/default.fr.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Coffre verrouillé +Locked Chest (owned by @1)=Coffre verrouillé (possédé par @1) +You do not own this chest.=Ce coffre ne vous appartient pas. +a locked chest=un coffre verrouillé +Chest=Coffre +Write=Écrire +Read=Lire +Title:=Titre : +Contents:=Contenu : +Save=Sauvegarder +by @1=de @1 +Page @1 of @2=Page @1 sur @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2=« @1 » de @2 +Blueberries=Myrtille +Book=Livre +Book with Text=Livre avec du texte +Bronze Ingot=Lingot de bronze +Clay Brick=Brique d'argile +Clay Lump=Morceau d'argile +Coal Lump=Morceau de charbon +Copper Ingot=Lingot de cuivre +Copper Lump=Morceau de cuivre +Diamond=Diamant +Flint=Silex +Gold Ingot=Lingot d'or +Gold Lump=Morceau d'or +Iron Lump=Morceau de fer +Mese Crystal=Cristal de Mese +Mese Crystal Fragment=Fragment de cristal de Mese +Obsidian Shard=Tesson d'obsidienne +Paper=Papier +Steel Ingot=Lingot d'acier +Stick=Baton +Tin Ingot=Lingot d'étain +Tin Lump=Morceau d'étain +Furnace is empty=Le four est vide +100% (output full)=100% (Sortie pleine) +@1%=@1% +Not cookable=Ne se cuit pas +Empty=Vide +Furnace active=Four actif +Furnace inactive=Four inactif +(Item: @1; Fuel: @2)=(Article: @1; Carburant: @2) +Furnace=Four +Stone=Pierre +Cobblestone=Pavé +Stone Brick=Brique de pierre +Stone Block=Bloc de pierre +Mossy Cobblestone=Pavé moussu +Desert Stone=Pierre du désert +Desert Cobblestone=Pavé de pierre du désert +Desert Stone Brick=Brique de pierre du désert +Desert Stone Block=Bloc de pierre du désert +Sandstone=Grès +Sandstone Brick=Brique de grès +Sandstone Block=Bloc de grès +Desert Sandstone=Grès du désert +Desert Sandstone Brick=Brique de grès du désert +Desert Sandstone Block=Bloc de grès du désert +Silver Sandstone=Grès argenté +Silver Sandstone Brick=Brique de grès argenté +Silver Sandstone Block=Bloc de grès argenté +Obsidian=Obsidienne +Obsidian Brick=Brique d'obsidienne +Obsidian Block=Bloc d'obsidienne +Dirt=Terre +Dirt with Grass=Terre avec de l'herbe +Dirt with Grass and Footsteps=Terre avec de l'herbe et des traces de pas +Dirt with Savanna Grass=Terre avec de l'herbe de savane +Dirt with Snow=Terre avec de la neige +Dirt with Rainforest Litter=Terre avec sol de forêt humide +Dirt with Coniferous Litter=Terre avec sol de forêt de conifère +Savanna Dirt=Terre de la savane +Savanna Dirt with Savanna Grass=Terre de la savane avec son herbe +Permafrost=Pergélisol +Permafrost with Stones=Pergélisol avec de la pierre +Permafrost with Moss=Pergélisol avec de la mousse +Sand=Sable +Desert Sand=Sable du désert +Silver Sand=Sable argenté +Gravel=Gravier +Clay=Argile +Snow=Neige +Snow Block=Bloc de neige +Ice=Glace +Cave Ice=Glace de grotte +Apple Tree=Pommier +Apple Wood Planks=Planche de pommier +Apple Tree Sapling=Pousse de pommier +Apple Tree Leaves=Feuilles de pommier +Apple=Pomme +Apple Marker=Marqueur de pomme +Jungle Tree=Arbre de la jungle +Jungle Wood Planks=Planche d'arbre de la jungle +Jungle Tree Leaves=Feuilles d'arbre de la jungle +Jungle Tree Sapling=Pousse d'arbre de la jungle +Emergent Jungle Tree Sapling=Pousse d'arbre de la jungle émergent +Pine Tree=Pin +Pine Wood Planks=Planche de pin +Pine Needles=Aiguilles de pin +Pine Tree Sapling=Pousse de pin +Acacia Tree=Acacia +Acacia Wood Planks=Planche d'acacia +Acacia Tree Leaves=Feuilles d'acacia +Acacia Tree Sapling=Pousse d'acacia +Aspen Tree=Tremble +Aspen Wood Planks=Planche de tremble +Aspen Tree Leaves=Feuilles de tremble +Aspen Tree Sapling=Pousse de tremble +Coal Ore=Minerai de charbon +Coal Block=Bloc de charbon +Iron Ore=Minerai de fer +Steel Block=Bloc d'acier +Copper Ore=Minerai de cuivre +Copper Block=Bloc de cuivre +Tin Ore=Minerai d'étain +Tin Block=Bloc d'étain +Bronze Block=Bloc de bronze +Mese Ore=Minerai de Mese +Mese Block=Bloc de Mese +Gold Ore=Minerai d'or +Gold Block=Bloc d'or +Diamond Ore=Minerai de diamant +Diamond Block=Bloc de diamant +Cactus=Cactus +Large Cactus Seedling=Grand plan de cactus +Papyrus=Papyrus +Dry Shrub=Arbuste sec +Jungle Grass=Herbe de la jungle +Grass=Herbe +Savanna Grass=Herbe de la savane +Fern=Fougère +Marram Grass=Ammophile +Bush Stem=Tige de buisson +Bush Leaves=Feuilles de buisson +Bush Sapling=Pousse de buisson +Blueberry Bush Leaves with Berries=Buisson de myrtille avec des myrtilles +Blueberry Bush Leaves=Feuilles de buisson à myrtilles +Blueberry Bush Sapling=Pousse de buisson à myrtilles +Acacia Bush Stem=Tige de buisson d'acacia +Acacia Bush Leaves=Feuilles de buisson d'acacia +Acacia Bush Sapling=Pousses de buisson d'acacia +Pine Bush Stem=Tige de buisson de pin +Pine Bush Needles=Aiguilles de buisson de pin +Pine Bush Sapling=Pousse de buisson de pin +Kelp=Varech +Green Coral=Corail vert +Pink Coral=Corail rose +Cyan Coral=Corail cyan +Brown Coral=Corail marron +Orange Coral=Corail orange +Coral Skeleton=Squelette de corail +Water Source=Source d'eau +Flowing Water=Écoulement d'eau +River Water Source=Source d'eau de rivière +Flowing River Water=Écoulement d'eau de rivière +Lava Source=Source de lave +Flowing Lava=Écoulement de lave +Empty Bookshelf=Bibliothèque vide +Bookshelf (@1 written, @2 empty books)=Bibliothèque (@1 écrits, @2 livres vides) +Bookshelf=Bibliothèque +Text too long=Texte trop longue +"@1"=« @1 » +Wooden Sign=Panneau en bois +Steel Sign=Panneau en acier +Wooden Ladder=Échelle en bois +Steel Ladder=Échelle en acier +Apple Wood Fence=Barrière de bois de pommier +Acacia Wood Fence=Barrière de bois d'acacia +Jungle Wood Fence=Barrière de bois de la jungle +Pine Wood Fence=Barrière de bois de pin +Aspen Wood Fence=Barrière de bois de tremble +Apple Wood Fence Rail=Clôture de bois de pommier +Acacia Wood Fence Rail=Clôture de bois d'acacia +Jungle Wood Fence Rail=Clôture de bois de la jungle +Pine Wood Fence Rail=Clôture de bois de pin +Aspen Wood Fence Rail=Clôture de bois de tremble +Glass=Verre +Obsidian Glass=Verre d'obsidienne +Brick Block=Bloc de brique +Mese Lamp=Lampe de Mese +Apple Wood Mese Post Light=Réverbère de Mese en bois de pommier +Acacia Wood Mese Post Light=Réverbère de Mese en bois d'acacia +Jungle Wood Mese Post Light=Réverbère de Mese en bois de la jungle +Pine Wood Mese Post Light=Réverbère de Mese en bois de pin +Aspen Wood Mese Post Light=Réverbère de Mese en bois de tremble +Cloud=Nuage +Wooden Pickaxe=Pioche en bois +Stone Pickaxe=Pioche en pierre +Bronze Pickaxe=Pioche en bronze +Steel Pickaxe=Pioche en acier +Mese Pickaxe=Pioche de Mese +Diamond Pickaxe=Pioche en diamant +Wooden Shovel=Pelle en bois +Stone Shovel=Pelle en pierre +Bronze Shovel=Pelle en bronze +Steel Shovel=Pelle en acier +Mese Shovel=Pelle en Mese +Diamond Shovel=Pelle en diamant +Wooden Axe=Hache en bois +Stone Axe=Hache en pierre +Bronze Axe=Hache en bronze +Steel Axe=Hache en acier +Mese Axe=Hache en Mese +Diamond Axe=Hache en diamant +Wooden Sword=Epée en bois +Stone Sword=Épée en pierre +Bronze Sword=Épée en bronze +Steel Sword=Épée en acier +Mese Sword=Épée en Mese +Diamond Sword=Épée en diamant +Torch=Torche +@1 will intersect protection on growth.=@1 chevauchera la zone protégée avec la croissance. + + +##### not used anymore ##### + +Dirt with Dry Grass=Terre avec de l'herbe sèche +Dry Dirt=Terre sèche +Dry Dirt with Dry Grass=Terre sèche avec de l'herbe sèche +Dry Grass=Herbe sèche +Mese Post Light=Réverbère de Mese diff --git a/mods/minetest_game/default/locale/default.id.tr b/mods/minetest_game/default/locale/default.id.tr new file mode 100644 index 00000000..c60b5b08 --- /dev/null +++ b/mods/minetest_game/default/locale/default.id.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Peti Terkunci +Locked Chest (owned by @1)=Peti Terkunci (milik @1) +You do not own this chest.=Anda bukan pemilik peti ini. +a locked chest=peti terkunci +Chest=Peti +Write=Tulis +Read=Baca +Title:=Judul: +Contents:=Isi: +Save=Simpan +by @1=oleh @1 +Page @1 of @2=Halaman @1 dari @2 +The book you were writing to mysteriously disappeared.=Buku yang Anda tulis menghilang secara misterius. +"@1" by @2="@1" oleh @2 +Blueberries=Bluberi +Book=Buku +Book with Text=Buku Tertulis +Bronze Ingot=Perunggu Batangan +Clay Brick=Bata +Clay Lump=Bongkahan Tanah Liat +Coal Lump=Bongkahan Batu Bara +Copper Ingot=Tembaga Batangan +Copper Lump=Bongkahan Tembaga +Diamond=Berlian +Flint=Batu Api +Gold Ingot=Emas Batangan +Gold Lump=Bongkahan Emas +Iron Lump=Bongkahan Besi +Mese Crystal=Kristal Mese +Mese Crystal Fragment=Pecahan Kristal Mese +Obsidian Shard=Pecahan Obsidian +Paper=Kertas +Steel Ingot=Baja Batangan +Stick=Tongkat +Tin Ingot=Timah Batangan +Tin Lump=Bongkahan Timah +Furnace is empty=Tungku kosong +100% (output full)=100% (keluaran penuh) +@1%=@1% +Not cookable=Tidak bisa dimasak +Empty=Kosong +Furnace active=Tungku nyala +Furnace inactive=Tungku mati +(Item: @1; Fuel: @2)=(Barang: @1; Bahan Bakar: @2) +Furnace=Tungku +Stone=Batu +Cobblestone=Bongkahan Batu +Stone Brick=Tembok Batu +Stone Block=Balok Batu +Mossy Cobblestone=Bongkahan Batu Berlumut +Desert Stone=Batu Gurun +Desert Cobblestone=Bongkahan Batu Gurun +Desert Stone Brick=Tembok Batu Gurun +Desert Stone Block=Balok Batu Gurun +Sandstone=Batu Pasir +Sandstone Brick=Tembok Batu Pasir +Sandstone Block=Balok Batu Pasir +Desert Sandstone=Batu Pasir Gurun +Desert Sandstone Brick=Tembok Batu Pasir Gurun +Desert Sandstone Block=Balok Batu Pasir Gurun +Silver Sandstone=Batu Pasir Perak +Silver Sandstone Brick=Tembok Batu Pasir Perak +Silver Sandstone Block=Balok Batu Pasir Perak +Obsidian=Obsidian +Obsidian Brick=Tembok Obsidian +Obsidian Block=Balok Obsidian +Dirt=Tanah +Dirt with Grass=Tanah Berumput +Dirt with Grass and Footsteps=Tanah Berumput dengan Jejak Kaki +Dirt with Savanna Grass=Tanah Berumput Sabana +Dirt with Snow=Tanah Bersalju +Dirt with Rainforest Litter=Tanah Berserasah Hutan Hujan +Dirt with Coniferous Litter=Tanah Berserasah Hutan Konifer +Savanna Dirt=Tanah Sabana +Savanna Dirt with Savanna Grass=Tanah Sabana Berumput Sabana +Permafrost=Ibun Abadi +Permafrost with Stones=Ibun Abadi Berbatu +Permafrost with Moss=Ibun Abadi Berlumut +Sand=Pasir +Desert Sand=Pasir Gurun +Silver Sand=Pasir Perak +Gravel=Kerikil +Clay=Tanah Liat +Snow=Salju +Snow Block=Balok Salju +Ice=Es +Cave Ice=Es Gua +Apple Tree=Pohon Apel +Apple Wood Planks=Papan Kayu Pohon Apel +Apple Tree Sapling=Anak Pohon Apel +Apple Tree Leaves=Daun Pohon Apel +Apple=Apel +Apple Marker=Penanda Apel +Jungle Tree=Pohon Hutan Rimba +Jungle Wood Planks=Papan Kayu Pohon Rimba +Jungle Tree Leaves=Daun Pohon Rimba +Jungle Tree Sapling=Anak Pohon Rimba +Emergent Jungle Tree Sapling=Anak Pohon Rimba Bertumbuh +Pine Tree=Pohon Pinus +Pine Wood Planks=Papan Kayu Pinus +Pine Needles=Daun Pinus +Pine Tree Sapling=Anak Pohon Pinus +Acacia Tree=Pohon Akasia +Acacia Wood Planks=Papan Kayu Akasia +Acacia Tree Leaves=Daun Akasia +Acacia Tree Sapling=Anak Pohon Akasia +Aspen Tree=Pohon Aspen +Aspen Wood Planks=Papan Kayu Aspen +Aspen Tree Leaves=Daun Aspen +Aspen Tree Sapling=Anak Pohon Aspen +Coal Ore=Bijih Batu Bara +Coal Block=Balok Batu Bara +Iron Ore=Bijih Besi +Steel Block=Balok Baja +Copper Ore=Bijih Tembaga +Copper Block=Balok Tembaga +Tin Ore=Bijih Timah +Tin Block=Balok Timah +Bronze Block=Balok Perunggu +Mese Ore=Bijih Mese +Mese Block=Balok Mese +Gold Ore=Bijih Emas +Gold Block=Balok Emas +Diamond Ore=Bijih Berlian +Diamond Block=Balok Berlian +Cactus=Kaktus +Large Cactus Seedling=Bibit Kaktus Besar +Papyrus=Papirus +Dry Shrub=Semak Kering +Jungle Grass=Rumput Rimba +Grass=Rumput +Savanna Grass=Rumput Sabana +Fern=Pakis +Marram Grass=Rumput Pantai +Bush Stem=Batang Semak +Bush Leaves=Daun Semak +Bush Sapling=Anak Semak +Blueberry Bush Leaves with Berries=Daun Semak Bluberi Berbuah +Blueberry Bush Leaves=Daun Semak Bluberi +Blueberry Bush Sapling=Anak Semak Bluberi +Acacia Bush Stem=Batang Semak Akasia +Acacia Bush Leaves=Daun Semak Akasia +Acacia Bush Sapling=Bibit Semak Akasia +Pine Bush Stem=Batang Semak Pinus +Pine Bush Needles=Daun Semak Pinus +Pine Bush Sapling=Bibit Semak Pinus +Kelp=Kelp +Green Coral=Koral Hijau +Pink Coral=Koral Merah Muda +Cyan Coral=Koral Sian +Brown Coral=Koral Cokelat +Orange Coral=Koral Oranye +Coral Skeleton=Kerangka Koral +Water Source=Mata Air +Flowing Water=Aliran Air +River Water Source=Mata Air Sungai +Flowing River Water=Aliran Air Sungai +Lava Source=Sumber Lava +Flowing Lava=Aliran Lava +Empty Bookshelf=Rak Buku Kosong +Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku tertulis, @2 buku kosong) +Bookshelf=Rak Buku +Text too long=Teks terlalu panjang +"@1"="@1" +Wooden Sign=Penanda Kayu +Steel Sign=Penanda Baja +Wooden Ladder=Tangga Kayu +Steel Ladder=Tangga Baja +Apple Wood Fence=Pagar Kayu Apel +Acacia Wood Fence=Pagar Akasia +Jungle Wood Fence=Pagar Kayu Rimba +Pine Wood Fence=Pagar Pinus +Aspen Wood Fence=Pagar Aspen +Apple Wood Fence Rail=Rel Pagar Kayu Apel +Acacia Wood Fence Rail=Rel Pagar Akasia +Jungle Wood Fence Rail=Rel Pagar Kayu Rimba +Pine Wood Fence Rail=Rel Pagar Pinus +Aspen Wood Fence Rail=Rel Pagar Aspen +Glass=Kaca +Obsidian Glass=Kaca Obsidian +Brick Block=Balok Bata +Mese Lamp=Lampu Mese +Apple Wood Mese Post Light=Lampu Taman Mese Kayu Apel +Acacia Wood Mese Post Light=Lampu Taman Mese Kayu Akasia +Jungle Wood Mese Post Light=Lampu Taman Mese Kayu Rimba +Pine Wood Mese Post Light=Lampu Taman Mese Kayu Pinus +Aspen Wood Mese Post Light=Lampu Taman Mese Kayu Aspen +Cloud=Awan +Wooden Pickaxe=Belencong Kayu +Stone Pickaxe=Belencong Batu +Bronze Pickaxe=Belencong Perunggu +Steel Pickaxe=Belencong Baja +Mese Pickaxe=Belencong Mese +Diamond Pickaxe=Belencong Berlian +Wooden Shovel=Sekop Kayu +Stone Shovel=Sekop Batu +Bronze Shovel=Sekop Perunggu +Steel Shovel=Sekop Baja +Mese Shovel=Sekop Mese +Diamond Shovel=Sekop Berlian +Wooden Axe=Kapak Kayu +Stone Axe=Kapak Batu +Bronze Axe=Kapak Perunggu +Steel Axe=Kapak Baja +Mese Axe=Kapak Mese +Diamond Axe=Kapak Berlian +Wooden Sword=Pedang Kayu +Stone Sword=Pedang Batu +Bronze Sword=Pedang Perunggu +Steel Sword=Pedang Baja +Mese Sword=Pedang Mese +Diamond Sword=Pedang Berlian +Torch=Obor +@1 will intersect protection on growth.=@1 akan memotong perlindungan ketika tumbuh. + + +##### not used anymore ##### + +Mese Post Light=Lampu Taman Mese diff --git a/mods/minetest_game/default/locale/default.it.tr b/mods/minetest_game/default/locale/default.it.tr new file mode 100644 index 00000000..39406659 --- /dev/null +++ b/mods/minetest_game/default/locale/default.it.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Baule chiuso a chiave +Locked Chest (owned by @1)=Baule chiuso a chiave (di proprietà di @1) +You do not own this chest.=Questo baule non ti appartiene. +a locked chest=un baule chiuso a chiave +Chest=Baule +Write= +Read= +Title:= +Contents:= +Save= +by @1= +Page @1 of @2= +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" di @2 +Blueberries=Mirtilli +Book=Libro +Book with Text=Libro con testo +Bronze Ingot=Lingotto di bronzo +Clay Brick=Mattone d'argilla +Clay Lump=Grumo d'argilla +Coal Lump=Grumo di carbone +Copper Ingot=Lingotto di rame +Copper Lump=Grumo di rame +Diamond=Diamante +Flint=Selce +Gold Ingot=Lingotto d'oro +Gold Lump=Grumo d'oro +Iron Lump=Grumo di ferro +Mese Crystal=Cristallo di mese +Mese Crystal Fragment=Frammento di cristallo di mese +Obsidian Shard=Scheggia d'ossidiana +Paper=Carta +Steel Ingot=Lingotto d'acciaio +Stick=Bastone +Tin Ingot=Lingotto di stagno +Tin Lump=Grumo di stagno +Furnace is empty=La fornace è vuota +100% (output full)=100% (uscita piena) +@1%=@1% +Not cookable=Non cucinabile +Empty=Vuota +Furnace active=Fornace attiva +Furnace inactive=Fornace inattiva +(Item: @1; Fuel: @2)=(Oggetto: @1; Combustibile: @2) +Furnace=Fornace +Stone=Pietra +Cobblestone=Ciottoli +Stone Brick=Mattone di pietra +Stone Block=Blocco di pietra +Mossy Cobblestone=Ciottoli muschiosi +Desert Stone=Pietra del deserto +Desert Cobblestone=Ciottoli del deserto +Desert Stone Brick=Mattone di pietra del deserto +Desert Stone Block=Blocco di pietra del deserto +Sandstone=Arenaria +Sandstone Brick=Mattone d'arenaria +Sandstone Block=Blocco d'arenaria +Desert Sandstone=Arenaria del deserto +Desert Sandstone Brick=Mattone d'arenaria del deserto +Desert Sandstone Block=Blocco d'arenaria del deserto +Silver Sandstone=Arenaria argentata +Silver Sandstone Brick=Mattone d'arenaria argentata +Silver Sandstone Block=Blocco d'arenaria argentata +Obsidian=Ossidiana +Obsidian Brick=Mattone d'ossidiana +Obsidian Block=Blocco d'ossidiana +Dirt=Terra +Dirt with Grass=Terra con erba +Dirt with Grass and Footsteps=Terra con erba e impronte +Dirt with Savanna Grass= +Dirt with Snow=Terra con neve +Dirt with Rainforest Litter=Terra con detriti della foresta pluviale +Dirt with Coniferous Litter=Terra con detriti di conifera +Savanna Dirt= +Savanna Dirt with Savanna Grass= +Permafrost=Permafrost +Permafrost with Stones=Permafrost con pietra +Permafrost with Moss=Permafrost con muschio +Sand=Sabbia +Desert Sand=Sabbia del deserto +Silver Sand=Sabbia argentata +Gravel=Ghiaia +Clay=Argilla +Snow=Neve +Snow Block=Blocco di neve +Ice=Ghiaccio +Cave Ice=Ghiaccio di caverna +Apple Tree=Melo +Apple Wood Planks=Assi di melo +Apple Tree Sapling=Alberello di melo +Apple Tree Leaves=Foglie di melo +Apple=Mela +Apple Marker=Marcatore mela +Jungle Tree=Albero della giungla +Jungle Wood Planks=Assi di legno della giungla +Jungle Tree Leaves=Foglie di albero della giungla +Jungle Tree Sapling=Alberello della giungla +Emergent Jungle Tree Sapling=Alberello della giungla emergente +Pine Tree=Pino +Pine Wood Planks=Assi di legno di pino +Pine Needles=Aghi di pino +Pine Tree Sapling=Alberello di pino +Acacia Tree=Acacia +Acacia Wood Planks=Assi di legno d'acacia +Acacia Tree Leaves=Foglie d'acacia +Acacia Tree Sapling=Alberello d'acacia +Aspen Tree=Pioppo +Aspen Wood Planks=Assi di legno di pioppo +Aspen Tree Leaves=Foglie di pioppo +Aspen Tree Sapling=Alberello di pioppo +Coal Ore=Minerale di carbone +Coal Block=Blocco di carbone +Iron Ore=Minerale di ferro +Steel Block=Blocco d'acciaio +Copper Ore=Minerale di rame +Copper Block=Blocco di rame +Tin Ore=Minerale di stagno +Tin Block=Blocco di stagno +Bronze Block=Blocco di bronzo +Mese Ore=Minerale di mese +Mese Block=Blocco di mese +Gold Ore=Minerale d'oro +Gold Block=Blocco d'oro +Diamond Ore=Minerale di diamante +Diamond Block=Blocco di diamante +Cactus=Cactus +Large Cactus Seedling=Piantina di cactus grande +Papyrus=Papiro +Dry Shrub=Arbusto secco +Jungle Grass=Erba della giungla +Grass=Erba +Savanna Grass= +Fern=Felce +Marram Grass=Ammofila arenaria +Bush Stem=Fusto di cespuglio +Bush Leaves=Foglie di cespuglio +Bush Sapling=Alberello di cespuglio +Blueberry Bush Leaves with Berries=Foglie di cespuglio di mirtilli con bacche +Blueberry Bush Leaves=Foglie di cespuglio di mirtilli +Blueberry Bush Sapling=Alberello di cespuglio di mirtilli +Acacia Bush Stem=Fusto di cespuglio d'acacia +Acacia Bush Leaves=Foglie di cespuglio d'acacia +Acacia Bush Sapling=Alberello di cespuglio d'acacia +Pine Bush Stem=Fusto di cespuglio di pino +Pine Bush Needles=Aghi di cespuglio di pino +Pine Bush Sapling=Alberello di cespuglio di pino +Kelp=Alga +Green Coral=Corallo verde +Pink Coral=Corallo rosa +Cyan Coral=Corallo ciano +Brown Coral=Corallo marrone +Orange Coral=Corallo arancione +Coral Skeleton=Scheletro di corallo +Water Source=Fonte d'acqua +Flowing Water=Acqua corrente +River Water Source=Fonte d'acqua di fiume +Flowing River Water=Acqua corrente di fiume +Lava Source=Fonte di lava +Flowing Lava=Lava corrente +Empty Bookshelf=Libreria vuota +Bookshelf (@1 written, @2 empty books)=Libreria (@1 scritti, @2 vuoti) +Bookshelf=Libreria +Text too long=Testo troppo lungo +"@1"= +Wooden Sign=Cartello di legno +Steel Sign=Cartello d'acciaio +Wooden Ladder=Scala a pioli di legno +Steel Ladder=Scala a pioli d'acciaio +Apple Wood Fence=Recinzione di legno di melo +Acacia Wood Fence=Recinzione di legno d'acacia +Jungle Wood Fence=Recinzione di legno della giungla +Pine Wood Fence=Recinzione di legno di pino +Aspen Wood Fence=Recinzione di legno di pioppo +Apple Wood Fence Rail=Ringhiera della recinzione di legno di melo +Acacia Wood Fence Rail=Ringhiera della recinzione di legno d'acacia +Jungle Wood Fence Rail=Ringhiera della recinzione di legno della giungla +Pine Wood Fence Rail=Ringhiera della recinzione di legno di pino +Aspen Wood Fence Rail=Ringhiera della recinzione di legno di pioppo +Glass=Vetro +Obsidian Glass=Vetro d'ossidiana +Brick Block=Blocco di mattone +Mese Lamp=Lampada di mese +Apple Wood Mese Post Light= +Acacia Wood Mese Post Light= +Jungle Wood Mese Post Light= +Pine Wood Mese Post Light= +Aspen Wood Mese Post Light= +Cloud=Nuvola +Wooden Pickaxe=Piccone di legno +Stone Pickaxe=Piccone di pietra +Bronze Pickaxe=Piccone di bronzo +Steel Pickaxe=Piccone d'acciaio +Mese Pickaxe=Piccone di mese +Diamond Pickaxe=Piccone di diamante +Wooden Shovel=Pala di legno +Stone Shovel=Pala di pietra +Bronze Shovel=Pala di bronzo +Steel Shovel=Pala d'acciaio +Mese Shovel=Pala di mese +Diamond Shovel=Pala di diamante +Wooden Axe=Ascia di legno +Stone Axe=Ascia di pietra +Bronze Axe=Ascia di bronzo +Steel Axe=Ascia d'acciaio +Mese Axe=Ascia di mese +Diamond Axe=Ascia di diamante +Wooden Sword=Spada di legno +Stone Sword=Spada di pietra +Bronze Sword=Spada di bronzo +Steel Sword=Spada d'acciaio +Mese Sword=Spada di mese +Diamond Sword=Spada di diamante +Torch=Torcia +@1 will intersect protection on growth.=@1 crescendo attraverserà la protezione. + + +##### not used anymore ##### + +Dirt with Dry Grass=Terra con erba secca +Dry Dirt=Terra asciutta +Dry Dirt with Dry Grass=Terra asciutta con erba secca +Dry Grass=Erba secca +Mese Post Light=Lampioncino di mese diff --git a/mods/minetest_game/default/locale/default.ja.tr b/mods/minetest_game/default/locale/default.ja.tr new file mode 100644 index 00000000..cf30e45f --- /dev/null +++ b/mods/minetest_game/default/locale/default.ja.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=éµã®ã‹ã‹ã£ãŸãƒã‚§ã‚¹ãƒˆ +Locked Chest (owned by @1)=éµã®ã‹ã‹ã£ãŸãƒã‚§ã‚¹ãƒˆ(@1所有) +You do not own this chest.=ã‚ãªãŸã¯ã“ã®ãƒã‚§ã‚¹ãƒˆã®æ‰€æœ‰è€…ã§ã¯ã‚りã¾ã›ã‚“。 +a locked chest=ロックã•れãŸãƒã‚§ã‚¹ãƒˆ +Chest=ãƒã‚§ã‚¹ãƒˆ +Write=書ã込む +Read=読む +Title:=題å +Contents:=内容 +Save=ä¿å­˜ +by @1=@1è‘— +Page @1 of @2=@1 / @2 ページ +The book you were writing to mysteriously disappeared.=ã‚ãªãŸãŒæ›¸ã„ã¦ã„ãŸæœ¬ãŒã€ä¸æ€è­°ãªã“ã¨ã«æ¶ˆãˆã¾ã—ãŸã€‚ +"@1" by @2=@2著「@1〠+Blueberries=ブルーベリー +Book=本 +Book with Text=記入済ã¿ã®æœ¬ +Bronze Ingot=é’銅インゴット +Clay Brick=粘土レンガ +Clay Lump=粘土玉 +Coal Lump=石炭 +Copper Ingot=銅インゴット +Copper Lump=銅ã®ç²—鉱 +Diamond=ダイヤモンド +Flint=ç«æ‰“ã¡çŸ³ +Gold Ingot=金インゴット +Gold Lump=金ã®ç²—鉱 +Iron Lump=鉄ã®ç²—鉱 +Mese Crystal=メセクリスタル +Mese Crystal Fragment=メセクリスタルã®ç ´ç‰‡ +Obsidian Shard=é»’æ›œçŸ³ã®æ¬ ç‰‡ +Paper=ç´™ +Steel Ingot=鉄インゴット +Stick=棒 +Tin Ingot=スズインゴット +Tin Lump=スズã®ç²—鉱 +Furnace is empty=ã‹ã¾ã©ã¯ç©ºã§ã™ +100% (output full)=100%(フル出力) +@1%=@1% +Not cookable=調ç†ã§ãã¾ã›ã‚“ +Empty=空 +Furnace active=ã‹ã¾ã©ã¯ç‡ƒãˆã¦ã¾ã™ +Furnace inactive=ã‹ã¾ã©ã¯æ¶ˆãˆã¦ã„ã¾ã™ +(Item: @1; Fuel: @2)=(アイテム: @1; 燃料: @2) +Furnace=ã‹ã¾ã© +Stone=石 +Cobblestone=丸石 +Stone Brick=石レンガ +Stone Block=石ブロック +Mossy Cobblestone=苔むã—ãŸä¸¸çŸ³ +Desert Stone=ç ‚æ¼ ã®çŸ³ +Desert Cobblestone=ç ‚æ¼ ã®ä¸¸çŸ³ +Desert Stone Brick=ç ‚æ¼ ã®çŸ³ãƒ¬ãƒ³ã‚¬ +Desert Stone Block=ç ‚æ¼ ã®çŸ³ãƒ–ロック +Sandstone=砂岩 +Sandstone Brick=砂岩レンガ +Sandstone Block=砂岩ブロック +Desert Sandstone=ç ‚æ¼ ã®ç ‚岩 +Desert Sandstone Brick=ç ‚æ¼ ã®ç ‚岩レンガ +Desert Sandstone Block=ç ‚æ¼ ã®ç ‚岩ブロック +Silver Sandstone=銀色ã®ç ‚岩 +Silver Sandstone Brick=銀色ã®ç ‚岩レンガ +Silver Sandstone Block=銀色ã®ç ‚岩ブロック +Obsidian=黒曜石 +Obsidian Brick=黒曜石レンガ +Obsidian Block=黒曜石ブロック +Dirt=土 +Dirt with Grass=è‰ã«è¦†ã‚れãŸåœŸ +Dirt with Grass and Footsteps=足跡ã¨è‰ã«è¦†ã‚れãŸåœŸ +Dirt with Savanna Grass=サãƒãƒ³ãƒŠã®è‰ã«è¦†ã‚れãŸåœŸ +Dirt with Snow=雪ã«è¦†ã‚れãŸåœŸ +Dirt with Rainforest Litter=熱帯雨林ã®è½è‘‰ã«è¦†ã‚れãŸåœŸ +Dirt with Coniferous Litter=é‡è‘‰æ¨¹ã®è½è‘‰ã«è¦†ã‚れãŸåœŸ +Savanna Dirt=サãƒãƒ³ãƒŠã®åœŸ +Savanna Dirt with Savanna Grass=サãƒãƒ³ãƒŠã®è‰ã«è¦†ã‚れãŸã‚µãƒãƒ³ãƒŠã®åœŸ +Permafrost=永久å‡åœŸ +Permafrost with Stones=石ã«è¦†ã‚ã‚ŒãŸæ°¸ä¹…å‡åœŸ +Permafrost with Moss=è‹”ã«è¦†ã‚ã‚ŒãŸæ°¸ä¹…å‡åœŸ +Sand=ç ‚ +Desert Sand=ç ‚æ¼ ã®ç ‚ +Silver Sand=銀色ã®ç ‚ +Gravel=砂利 +Clay=粘土 +Snow=雪 +Snow Block=雪ブロック +Ice=æ°· +Cave Ice=æ´žçªŸã®æ°· +Apple Tree=リンゴã®åŽŸæœ¨ +Apple Wood Planks=ãƒªãƒ³ã‚´ã®æœ¨ã®æ¿æ +Apple Tree Sapling=ãƒªãƒ³ã‚´ã®æœ¨ã®è‹—木 +Apple Tree Leaves=ãƒªãƒ³ã‚´ã®æœ¨ã®è‘‰ +Apple=リンゴ +Apple Marker=リンゴã®ãƒžãƒ¼ã‚«ãƒ¼ +Jungle Tree=ジャングルã®åŽŸæœ¨ +Jungle Wood Planks=ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®æ¿æ +Jungle Tree Leaves=ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®è‘‰ +Jungle Tree Sapling=ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®è‹—木 +Emergent Jungle Tree Sapling=ジャングルã®è¶…高木ã®è‹—木 +Pine Tree=マツã®åŽŸæœ¨ +Pine Wood Planks=ãƒžãƒ„ã®æœ¨ã®æ¿æ +Pine Needles=ãƒžãƒ„ã®æœ¨ã®è‘‰ +Pine Tree Sapling=ãƒžãƒ„ã®æœ¨ã®è‹—木 +Acacia Tree=アカシアã®åŽŸæœ¨ +Acacia Wood Planks=ã‚¢ã‚«ã‚·ã‚¢ã®æœ¨ã®æ¿æ +Acacia Tree Leaves=ã‚¢ã‚«ã‚·ã‚¢ã®æœ¨ã®è‘‰ +Acacia Tree Sapling=ã‚¢ã‚«ã‚·ã‚¢ã®æœ¨ã®è‹—木 +Aspen Tree=ãƒãƒ—ラã®åŽŸæœ¨ +Aspen Wood Planks=ãƒãƒ—ãƒ©ã®æœ¨ã®æ¿æ +Aspen Tree Leaves=ãƒãƒ—ãƒ©ã®æœ¨ã®è‘‰ +Aspen Tree Sapling=ãƒãƒ—ãƒ©ã®æœ¨ã®è‹—木 +Coal Ore=石炭鉱石 +Coal Block=石炭ブロック +Iron Ore=鉄鉱石 +Steel Block=鉄ブロック +Copper Ore=銅鉱石 +Copper Block=銅ブロック +Tin Ore=スズ鉱石 +Tin Block=スズブロック +Bronze Block=é’銅ブロック +Mese Ore=メセ鉱石 +Mese Block=メセブロック +Gold Ore=金鉱石 +Gold Block=金ブロック +Diamond Ore=ダイヤモンド鉱石 +Diamond Block=ダイヤモンドブロック +Cactus=サボテン +Large Cactus Seedling=大ããªã‚µãƒœãƒ†ãƒ³ã®è‹— +Papyrus=パピルス +Dry Shrub=枯れãŸä½Žæœ¨ +Jungle Grass=ジャングルã®è‰ +Grass=è‰ +Savanna Grass=サãƒãƒ³ãƒŠã®è‰ +Fern=シダ +Marram Grass=マラムã®è‰ +Bush Stem=低木ã®å¹¹ +Bush Leaves=低木ã®è‘‰ +Bush Sapling=低木ã®è‹—木 +Blueberry Bush Leaves with Berries=ブルーベリーã®å®Ÿã£ãŸä½Žæœ¨ +Blueberry Bush Leaves=ブルーベリーã®ä½Žæœ¨ã®è‘‰ +Blueberry Bush Sapling=ブルーベリーã®ä½Žæœ¨ã®è‹—木 +Acacia Bush Stem=アカシアã®ä½Žæœ¨ã®å¹¹ +Acacia Bush Leaves=アカシアã®ä½Žæœ¨ã®è‘‰ +Acacia Bush Sapling=アカシアã®ä½Žæœ¨ã®è‹—木 +Pine Bush Stem=マツã®ä½Žæœ¨ã®å¹¹ +Pine Bush Needles=マツã®ä½Žæœ¨ã®è‘‰ +Pine Bush Sapling=マツã®ä½Žæœ¨ã®è‹—木 +Kelp=コンブ +Green Coral=緑色ã®ã‚µãƒ³ã‚´ +Pink Coral=桃色ã®ã‚µãƒ³ã‚´ +Cyan Coral=é’緑色ã®ã‚µãƒ³ã‚´ +Brown Coral=茶色ã®ã‚µãƒ³ã‚´ +Orange Coral=橙色ã®ã‚µãƒ³ã‚´ +Coral Skeleton=サンゴã®ã—ãŒã„ +Water Source=æ°´æº +Flowing Water=æµã‚Œã‚‹æ°´ +River Water Source=æ²³å·æ°´æº +Flowing River Water=æµã‚Œã‚‹æ²³å·æ°´ +Lava Source=溶岩 +Flowing Lava=æµã‚Œã‚‹æº¶å²© +Empty Bookshelf=ç©ºã®æœ¬æ£š +Bookshelf (@1 written, @2 empty books)=本棚(記述済㿠@1 冊, 未記述 @2 冊) +Bookshelf=本棚 +Text too long=テキストãŒé•·ã™ãŽã¾ã™ +"@1"=「@1〠+Wooden Sign=木製ã®çœ‹æ¿ +Steel Sign=鉄ã®çœ‹æ¿ +Wooden Ladder=木製ã®ã¯ã—ã” +Steel Ladder=鉄ã®ã¯ã—ã” +Apple Wood Fence=リンゴæã®ãƒ•ェンス +Acacia Wood Fence=アカシアæã®ãƒ•ェンス +Jungle Wood Fence=ジャングルæã®ãƒ•ェンス +Pine Wood Fence=マツæã®ãƒ•ェンス +Aspen Wood Fence=ãƒãƒ—ラæã®ãƒ•ェンス +Apple Wood Fence Rail=リンゴæã®ãƒ•ェンスレール +Acacia Wood Fence Rail=アカシアæã®ãƒ•ェンスレール +Jungle Wood Fence Rail=ジャングルæã®ãƒ•ェンスレール +Pine Wood Fence Rail=マツæã®ãƒ•ェンスレール +Aspen Wood Fence Rail=ãƒãƒ—ラæã®ãƒ•ェンスレール +Glass=ガラス +Obsidian Glass=黒曜石ガラス +Brick Block=レンガブロック +Mese Lamp=メセã®ãƒ©ãƒ³ãƒ— +Apple Wood Mese Post Light=リンゴæã®ãƒ¡ã‚»ç¯æŸ± +Acacia Wood Mese Post Light=アカシアæã®ãƒ¡ã‚»ç¯æŸ± +Jungle Wood Mese Post Light=ジャングルæã®ãƒ¡ã‚»ç¯æŸ± +Pine Wood Mese Post Light=マツæã®ãƒ¡ã‚»ç¯æŸ± +Aspen Wood Mese Post Light=ãƒãƒ—ラæã®ãƒ¡ã‚»ç¯æŸ± +Cloud=雲 +Wooden Pickaxe=木製ã®ãƒ„ルãƒã‚· +Stone Pickaxe=石ã®ãƒ„ルãƒã‚· +Bronze Pickaxe=é’銅ã®ãƒ„ルãƒã‚· +Steel Pickaxe=鉄ã®ãƒ„ルãƒã‚· +Mese Pickaxe=メセã®ãƒ„ルãƒã‚· +Diamond Pickaxe=ダイヤモンドã®ãƒ„ルãƒã‚· +Wooden Shovel=木製ã®ã‚·ãƒ£ãƒ™ãƒ« +Stone Shovel=石ã®ã‚·ãƒ£ãƒ™ãƒ« +Bronze Shovel=é’銅ã®ã‚·ãƒ£ãƒ™ãƒ« +Steel Shovel=鉄ã®ã‚·ãƒ£ãƒ™ãƒ« +Mese Shovel=メセã®ã‚·ãƒ£ãƒ™ãƒ« +Diamond Shovel=ダイヤモンドã®ã‚·ãƒ£ãƒ™ãƒ« +Wooden Axe=æœ¨è£½ã®æ–§ +Stone Axe=çŸ³ã®æ–§ +Bronze Axe=é’éŠ…ã®æ–§ +Steel Axe=é‰„ã®æ–§ +Mese Axe=ãƒ¡ã‚»ã®æ–§ +Diamond Axe=ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã®æ–§ +Wooden Sword=木製ã®å‰£ +Stone Sword=石ã®å‰£ +Bronze Sword=é’銅ã®å‰£ +Steel Sword=鉄ã®å‰£ +Mese Sword=メセã®å‰£ +Diamond Sword=ダイヤモンドã®å‰£ +Torch=æ¾æ˜Ž +@1 will intersect protection on growth.=@1ã¯æˆé•·ã™ã‚‹ã¨ãä¿è­·ã¨äº¤å·®ã—ã¾ã™ã€‚ diff --git a/mods/minetest_game/default/locale/default.jbo.tr b/mods/minetest_game/default/locale/default.jbo.tr new file mode 100644 index 00000000..5ae97224 --- /dev/null +++ b/mods/minetest_game/default/locale/default.jbo.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=lo selstela gairvau +Locked Chest (owned by @1)=.i ti selstela gairvau po la'o zo'i.@1.zo'i +You do not own this chest.=.i do na ponse lo ti gairvau +a locked chest=lo selstela gairvau +Chest=lo gairvau +Write=ciska +Read=tcidu +Title:=cmene +Contents:=se cukta +Save=rejgau +by @1=la'o zo'i.@1.zo'i te cukta +Page @1 of @2=meirmoi fe li @1 li @2 +The book you were writing to mysteriously disappeared.=lo cukta poi do ciska ke'a cu cizra canci +"@1" by @2=lo cukta be la'o gy.@1.gy. bei la'o zo'i.@2.zo'i +Blueberries=lo blajba +Book=lo cukta +Book with Text=lo cukta joi selci'a +Bronze Ingot=lo ransu manfybli +Clay Brick=lo kitybli +Clay Lump=lo kliti bakfu +Coal Lump=lo kolme bakfu +Copper Ingot=lo tunka manfybli +Copper Lump=lo tunka bakfu +Diamond=lo tabjme +Flint=lo fagyro'i +Gold Ingot=lo solji manfybli +Gold Lump=lo solji bakfu +Iron Lump=lo tirse bakfu +Mese Crystal=lo za'e krilrmese +Mese Crystal Fragment=lo za'e krilrmese spisa +Obsidian Shard=lo je'erma'ablaci spisa +Paper=lo pelji +Steel Ingot=lo gasta manfybli +Stick=lo grana +Tin Ingot=lo tinci manfybli +Tin Lump=lo tinci bakfu +Furnace is empty=.i lo toknu cu kunti +100% (output full)=100 ce'i to lo se zbasu cu culno toi +@1%=@1 ce'i +Not cookable=na kakne le ka se jukpa +Empty=ti kunti +Furnace active=.i lo toknu cu tolcando +Furnace inactive=.i lo toknu cu cando +(Item: @1; Fuel: @2)=to jukpa @1 @2 +Furnace=lo toknu +Stone=lo rokci +Cobblestone=lo lolro'iboi +Stone Brick=lo morna rokci +Stone Block=lo rokci bliku +Mossy Cobblestone=lo clika lolro'iboi +Desert Stone=lo cantu'a rokci +Desert Cobblestone=lo cantu'a lolro'iboi +Desert Stone Brick=lo morna ke cantu'a rokci +Desert Stone Block=lo cantu'a rokci bliku +Sandstone=lo canro'i +Sandstone Brick=lo morna canro'i +Sandstone Block=lo canro'i bliku +Desert Sandstone=lo cantu'a canro'i +Desert Sandstone Brick=lo morna ke cantu'a canro'i +Desert Sandstone Block=lo cantu'a canro'i bliku +Silver Sandstone=lo rijyska canro'i +Silver Sandstone Brick=lo morna ke rijyska canro'i +Silver Sandstone Block=lo rijyska canro'i bliku +Obsidian=lo je'erma'ablaci +Obsidian Brick=lo morna je'erma'ablaci +Obsidian Block=lo je'erma'ablaci bliku +Dirt=lo dertu +Dirt with Grass=lo dertu joi srasu +Dirt with Grass and Footsteps=lo dertu joi srasu jebo stapa bo prina +Dirt with Savanna Grass=lo dertu joi sudytu'a bo srasu +Dirt with Snow=lo dertu joi snime +Dirt with Rainforest Litter=lo dertu joi glatimdemricfoi bo festi +Dirt with Coniferous Litter=lo dertu joi ckunu bo festi +Savanna Dirt=lo sudytu'a dertu +Savanna Dirt with Savanna Grass=lo sudysu'a bo dertu joi sudytu'a bo srasu +Permafrost=lo vi'orbisloi +Permafrost with Stones=lo vi'orbisloi joi rokci +Permafrost with Moss=lo vi'orbisloi joi clika +Sand=lo canre +Desert Sand=lo cantu'a canre +Silver Sand=lo rijyska canre +Gravel=lo cmaro'i +Clay=lo kliti +Snow=lo snime +Snow Block=lo snime bliku +Ice=lo bisli +Cave Ice=lo kevzda bisli +Apple Tree=lo plisytricu ricystani +Apple Wood Planks=lo plisymudri tanbo +Apple Tree Sapling=lo plisytricu ciftricu +Apple Tree Leaves=lo plisytricu pezli +Apple=lo plise +Apple Marker=lo plise barna +Jungle Tree=lo glatimdemricfoi ricystani +Jungle Wood Planks=lo glatimdemricfoi mudri tanbo +Jungle Tree Leaves=lo glatimdemricfoi pezli +Jungle Tree Sapling=lo glatimdemricfoi ciftricu +Emergent Jungle Tree Sapling=lo barda ke glatimdemricfoi ciftricu +Pine Tree=lo ckunu ricystani +Pine Wood Planks=lo ku'urmudri tanbo +Pine Needles=lo ckunu jezpezli +Pine Tree Sapling=lo ckunu ciftricu +Acacia Tree=lo atkaci,ia ricystani +Acacia Wood Planks=lo atkaci,ia mudri tanbo +Acacia Tree Leaves=lo atkaci,ia pezli +Acacia Tree Sapling=lo atkaci,ia ciftricu +Aspen Tree=lo ricrpopulu ricystani +Aspen Wood Planks=lo mudrpopulu tanbo +Aspen Tree Leaves=lo ricrpopulu pezli +Aspen Tree Sapling=lo ricrpopulu ciftricu +Coal Ore=lo kolme kunra +Coal Block=lo kolme bliku +Iron Ore=lo tirse kunra +Steel Block=lo gasta bliku +Copper Ore=lo tunka kunra +Copper Block=lo tunka bliku +Tin Ore=lo tinci kunra +Tin Block=lo tinci bliku +Bronze Block=lo ransu bliku +Mese Ore=lo za'e kunrmese +Mese Block=lo za'e blikrmese +Gold Ore=lo solji kunra +Gold Block=lo solji bliku +Diamond Ore=lo tabjme kunra +Diamond Block=lo tabjme bliku +Cactus=lo jesyspa +Large Cactus Seedling=lo barda ke jesyspa tsiju +Papyrus=lo misryplespa +Dry Shrub=lo sudga dzitricu +Jungle Grass=lo glatimdemricfoi srasu +Grass=lo srasu +Savanna Grass=lo sudytu'a srasu +Fern=lo filcina +Marram Grass=lo xaskoi srasu +Bush Stem=lo dzitricu stani +Bush Leaves=lo dzitricu pezli +Bush Sapling=lo dzitricu ciftricu +Blueberry Bush Leaves with Berries=lo ke blajba dzitricu pezli ke'e joi jbari +Blueberry Bush Leaves=lo blajba dzitricu pezli +Blueberry Bush Sapling=lo blajba dzitrcu ciftricu +Acacia Bush Stem=lo atkaci,ia dzitricu stani +Acacia Bush Leaves=lo atkaci,ia dzitricu pezli +Acacia Bush Sapling=lo atkaci,ia dzitricu ciftricu +Pine Bush Stem=lo ckunu dzitricu stani +Pine Bush Needles=lo ckunu dzitricu jezpezli +Pine Bush Sapling=lo ckunu dzitricu ciftricu +Kelp=lo vraike +Green Coral=lo crino pevypanje +Pink Coral=lo xunblabi pevypanje +Cyan Coral=lo cicna pevypanje +Brown Coral=lo bunre pevypanje +Orange Coral=lo narju pevypanje +Coral Skeleton=lo pevypanje greku +Water Source=lo djacu velflecu +Flowing Water=lo flecu djacu +River Water Source=lo rirxe djacu velflecu +Flowing River Water=lo flecu ke rirxe djacu +Lava Source=lo likro'i velflecu +Flowing Lava=lo flecu likro'i +Empty Bookshelf=.i ti kunti ckukajna +Bookshelf (@1 written, @2 empty books)=.i ti ckukajna to @1 cukta joi selci'a .ije @2 kunti cukta toi +Bookshelf=lo ckukajna +Text too long=.i lo lerpoi cu dukse lo ka clani +"@1"=zoi sy.@1.sy. +Wooden Sign=lo mudri sinxa +Steel Sign=lo gasta sinxa +Wooden Ladder=lo mudri rajyserti +Steel Ladder=lo gasta rajyserti +Apple Wood Fence=lo plisymudri garbi'u +Acacia Wood Fence=lo atkaci,ia mudri garbi'u +Jungle Wood Fence=lo glatimdemricfoi mudri garbi'u +Pine Wood Fence=lo ku'urmudri garbi'u +Aspen Wood Fence=lo mudrpopulu garbi'u +Apple Wood Fence Rail=lo plisymudri garbi'u garna +Acacia Wood Fence Rail=lo atkaci,ia mudri garbi'u garna +Jungle Wood Fence Rail=lo glatimdemricfoi mudri garbi'u garna +Pine Wood Fence Rail=lo ku'urmudri garbi'u garna +Aspen Wood Fence Rail=lo mudrpopulu garbi'u garna +Glass=lo blaci +Obsidian Glass=lo je'erma'ablaci blaci +Brick Block=lo kitybli bliku +Mese Lamp=lo za'e gusrmese +Apple Wood Mese Post Light=lo plisymudri ke kamju za'e gusrmese +Acacia Wood Mese Post Light=lo atkaci,ia mudri ke kamju za'e gusrmese +Jungle Wood Mese Post Light=lo glatimdemricfoi mudri ke kamju za'e gusrmese +Pine Wood Mese Post Light=lo ku'urmudri ke kamju za'e gusrmese +Aspen Wood Mese Post Light=lo mudrpopulu ke kamju za'e gusrmese +Cloud=lo dilnu +Wooden Pickaxe=lo mudri velkakpymru +Stone Pickaxe=lo rokci velkakpymru +Bronze Pickaxe=lo ransu velkakpymru +Steel Pickaxe=lo gasta velkakpymru +Mese Pickaxe=lo za'e kunrmese velkakpymru +Diamond Pickaxe=lo tabjme velkakpymru +Wooden Shovel=lo mudri canpa +Stone Shovel=lo rokci canpa +Bronze Shovel=lo ransu canpa +Steel Shovel=lo gasta canpa +Mese Shovel=lo za'e kunrmese canpa +Diamond Shovel=lo tabjme canpa +Wooden Axe=lo mudri ka'amru +Stone Axe=lo rokci ka'amru +Bronze Axe=lo ransu ka'amru +Steel Axe=lo gasta ka'amru +Mese Axe=lo za'e kunrmese ka'amru +Diamond Axe=lo tabjme ka'amru +Wooden Sword=lo mudri cladakyxa'i +Stone Sword=lo rokci cladakyxa'i +Bronze Sword=lo ransu cladakyxa'i +Steel Sword=lo gasta cladakyxa'i +Mese Sword=lo za'e kunrmese cladakyxa'i +Diamond Sword=lo tabjme cladakyxa'i +Torch=lo fagytergu'i +@1 will intersect protection on growth.=.i @1 cu ba kruca lo bandu ca lo nu banro diff --git a/mods/minetest_game/default/locale/default.lv.tr b/mods/minetest_game/default/locale/default.lv.tr new file mode 100644 index 00000000..b0a1de05 --- /dev/null +++ b/mods/minetest_game/default/locale/default.lv.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=AizslÄ“gta lÄde +Locked Chest (owned by @1)=AizslÄ“gta lÄde (Saimnieks: @1) +You do not own this chest.=Jums nepieder šī lÄde. +a locked chest=aizslÄ“gta lÄde +Chest=LÄde +Write=RakstÄ«t +Read=LasÄ«t +Title:=Virsraksts: +Contents:=Saturs: +Save=SaglabÄt +by @1=autors @1 +Page @1 of @2=@1 lappuse no @2 +The book you were writing to mysteriously disappeared.=GrÄmata, kuru rakstÄ«jÄt, pÄ“kšņi pazuda. +"@1" by @2="@1" @2 +Blueberries=Mellenes +Book=GrÄmata +Book with Text=GrÄmata ar tekstu +Bronze Ingot=Bronzas stienis +Clay Brick=MÄla Ä·ieÄ£elis +Clay Lump=MÄla pika +Coal Lump=Ogle +Copper Ingot=Vara stienis +Copper Lump=Vara rÅ«das gabals +Diamond=Dimants +Flint=Krams +Gold Ingot=Zelta stienis +Gold Lump=Zelta rÅ«das gabals +Iron Lump=Dzelzs rÅ«das gabals +Mese Crystal=MÄ“zes kristÄls +Mese Crystal Fragment=MÄ“zes kristÄla fragments +Obsidian Shard=ObsidiÄna skaida +Paper=PapÄ«rs +Steel Ingot=TÄ“rauda stienis +Stick=Puļķis +Tin Ingot=Alvas stienis +Tin Lump=Alvas rÅ«das gabals +Furnace is empty=KrÄsns ir tukÅ¡a +100% (output full)=100% (izeja pilna) +@1%=@1% +Not cookable=Nav gatavojams +Empty=TukÅ¡s +Furnace active=KrÄsns kurÄs +Furnace inactive=KrÄsns nekurÄs +(Item: @1; Fuel: @2)=(PriekÅ¡mets: @1; Degviela: @2) +Furnace=KrÄsns +Stone=Akmens +Cobblestone=MÅ«rakmens +Stone Brick=Akmens Ä·ieÄ£eļi +Stone Block=Akmens bloks +Mossy Cobblestone=ApsÅ«nojis mÅ«rakmens +Desert Stone=TuksneÅ¡a akmens +Desert Cobblestone=TuksneÅ¡a mÅ«rakmens +Desert Stone Brick=TuksneÅ¡a akmens Ä·ieÄ£eļi +Desert Stone Block=TuksneÅ¡a akmens bloks +Sandstone=SmilÅ¡akmens +Sandstone Brick=SmilÅ¡akmens Ä·ieÄ£eļi +Sandstone Block=SmilÅ¡akmens bloks +Desert Sandstone=Tuksnesa smilÅ¡akmens +Desert Sandstone Brick=TuksneÅ¡a smilÅ¡akmens Ä·ieÄ£eļi +Desert Sandstone Block=TuksneÅ¡a smilÅ¡akmens bloks +Silver Sandstone=Baltais smilÅ¡akmens +Silver Sandstone Brick=BaltÄ smilÅ¡akmens Ä·ieÄ£eļi +Silver Sandstone Block=BaltÄ smilÅ¡akmens bloks +Obsidian=ObsidiÄns +Obsidian Brick=ObsidiÄna Ä·ieÄ£eļi +Obsidian Block=ObsidiÄna bloks +Dirt=Zeme +Dirt with Grass=Zeme ar zÄli +Dirt with Grass and Footsteps=PÄ“daina zeme ar zÄli +Dirt with Savanna Grass=Zeme ar savannas zÄli +Dirt with Snow=Zeme ar sniegu +Dirt with Rainforest Litter=Zeme ar lietusmeža zemsedzi +Dirt with Coniferous Litter=Zeme ar skujÄm +Savanna Dirt=Savannas zeme +Savanna Dirt with Savanna Grass=Savannas zeme ar savannas zÄli +Permafrost=Mūžīgais sasalums +Permafrost with Stones=Mūžīgais sasalums ar akmentiņiem +Permafrost with Moss=Mūžīgais sasalums ar sÅ«nÄm +Sand=Smilts +Desert Sand=TuksneÅ¡a smilts +Silver Sand=BaltÄ smilts +Gravel=Grants +Clay=MÄla bloks +Snow=Sniegs +Snow Block=Sniega bloks +Ice=Ledus +Cave Ice=Alu ledus +Apple Tree=Ä€bele +Apple Wood Planks=Ä€bolkoka dēļi +Apple Tree Sapling=Ä€beles dzinums +Apple Tree Leaves=Ä€beles lapas +Apple=Ä€bols +Apple Marker=Ä€bola marÄ·ieris +Jungle Tree=Džungļu koks +Jungle Wood Planks=Džungļu koka dēļi +Jungle Tree Leaves=Džungļu koka lapas +Jungle Tree Sapling=Džungļu koka dzinums +Emergent Jungle Tree Sapling=Augsta džungļu koka dzinums +Pine Tree=Skujkoks +Pine Wood Planks=Skujkoka dēļi +Pine Needles=Skujas +Pine Tree Sapling=Skujkoka dzinums +Acacia Tree=AkÄcija +Acacia Wood Planks=AkÄcijas dēļi +Acacia Tree Leaves=AkÄcijas lapas +Acacia Tree Sapling=AkÄcijas dzinums +Aspen Tree=Apse +Aspen Wood Planks=Apses koka dēļi +Aspen Tree Leaves=Apses lapas +Aspen Tree Sapling=Apses dzinums +Coal Ore=Akmeņogļu rÅ«da +Coal Block=Akmeņogļu bloks +Iron Ore=Dzelzs rÅ«da +Steel Block=TÄ“rauda bloks +Copper Ore=Vara rÅ«da +Copper Block=Vara bloks +Tin Ore=Alvas rÅ«da +Tin Block=Alvas bloks +Bronze Block=Bronzas bloks +Mese Ore=MÄ“zes rÅ«da +Mese Block=MÄ“zes bloks +Gold Ore=Zelta rÅ«da +Gold Block=Zelta bloks +Diamond Ore=Dimanta rÅ«da +Diamond Block=Dimanta bloks +Cactus=Kaktuss +Large Cactus Seedling=Liela kaktusa dzinums +Papyrus=Papiruss +Dry Shrub=Izžuvis krÅ«miņš +Jungle Grass=Džungļu zÄle +Grass=ZÄle +Savanna Grass=Savannas zÄle +Fern=Paparde +Marram Grass=KÄpu niedre +Bush Stem=KrÅ«ma stumbrÄjs +Bush Leaves=KrÅ«ma lapas +Bush Sapling=KrÅ«ma dzinums +Blueberry Bush Leaves with Berries=Melleņu krÅ«ms ar ogÄm +Blueberry Bush Leaves=Melleņu krÅ«ms +Blueberry Bush Sapling=Melleņu krÅ«ma dzinums +Acacia Bush Stem=AkÄcijas krÅ«ma stumbrÄjs +Acacia Bush Leaves=AkÄcijas krÅ«ma lapas +Acacia Bush Sapling=AkÄcijas krÅ«ma dzinums +Pine Bush Stem=Skujaina krÅ«ma stumbrÄjs +Pine Bush Needles=Skujaina krÅ«ma lapas +Pine Bush Sapling=Skujaina krÅ«ma dzinums +Kelp=BrÅ«naļģes +Green Coral=Zaļš korallis +Pink Coral=RozÄ korallis +Cyan Coral=CiÄnkrÄsas korallis +Brown Coral=BrÅ«ns korallis +Orange Coral=Oranžs korallis +Coral Skeleton=Koraļļa skelets +Water Source=Ūdens avots +Flowing Water=PlÅ«stoÅ¡s Å«dens +River Water Source=Upes Å«dens avots +Flowing River Water=TekoÅ¡s upes Å«dens +Lava Source=Lavas avots +Flowing Lava=PlÅ«stoÅ¡a lava +Empty Bookshelf=Tukss grÄmatplaukts +Bookshelf (@1 written, @2 empty books)=GrÄmatplauktÄ (@1 rakstÄ«tas, @2 tukÅ¡as grÄmatas) +Bookshelf=GrÄmatplaukts +Text too long=Teksts par garu +"@1"="@1" +Wooden Sign=Koka zÄ«me +Steel Sign=TÄ“rauda zÄ«me +Wooden Ladder=Koka kÄpnes +Steel Ladder=TÄ“rauda kÄpnes +Apple Wood Fence=Ä€bolkoka žogs +Acacia Wood Fence=AkÄcijas žogs +Jungle Wood Fence=Džungļu koka žogs +Pine Wood Fence=Skujkoka žogs +Aspen Wood Fence=Apses koka žogs +Apple Wood Fence Rail=Ä€bolkoka žoga margas +Acacia Wood Fence Rail=AkÄcijas žoga margas +Jungle Wood Fence Rail=Džungļu koka žoga margas +Pine Wood Fence Rail=Skujkoka žoga margas +Aspen Wood Fence Rail=Apses žoga margas +Glass=Stikls +Obsidian Glass=ObsidiÄna stikls +Brick Block=ĶieÄ£eļu bloks +Mese Lamp=MÄ“zes lampa +Apple Wood Mese Post Light=Ä€bolkoka mÄ“zes lampa +Acacia Wood Mese Post Light=AkÄcijas mÄ“zes lampa +Jungle Wood Mese Post Light=Džungļu koka mÄ“zes lampa +Pine Wood Mese Post Light=Skujkoka mÄ“zes lampa +Aspen Wood Mese Post Light=Apses koka mÄ“zes lampa +Cloud=MÄkonis +Wooden Pickaxe=Koka cÄ“rte +Stone Pickaxe=Akmens cÄ“rte +Bronze Pickaxe=Bronzas cÄ“rte +Steel Pickaxe=TÄ“rauda cÄ“rte +Mese Pickaxe=MÄ“zes cÄ“rte +Diamond Pickaxe=Dimanta cÄ“rte +Wooden Shovel=Koka lÄpsta +Stone Shovel=Akmens lÄpsta +Bronze Shovel=Bronzas lÄpsta +Steel Shovel=TÄ“rauda lÄpsta +Mese Shovel=MÄ“zes lÄpsta +Diamond Shovel=Dimanta lÄpsta +Wooden Axe=Koka cirvis +Stone Axe=Akmens cirvis +Bronze Axe=Bronzas cirvis +Steel Axe=TÄ“rauda cirvis +Mese Axe=MÄ“zes cirvis +Diamond Axe=Dimanta cirvis +Wooden Sword=Koka zobens +Stone Sword=Akmens zobens +Bronze Sword=Bronzas zobens +Steel Sword=TÄ“rauda zobens +Mese Sword=MÄ“zes zobens +Diamond Sword=Dimanta zobens +Torch=LÄpa +@1 will intersect protection on growth.=@1 augot krustos aisargÄjamo zonu. diff --git a/mods/minetest_game/default/locale/default.ms.tr b/mods/minetest_game/default/locale/default.ms.tr new file mode 100644 index 00000000..0395afa0 --- /dev/null +++ b/mods/minetest_game/default/locale/default.ms.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Peti Berkunci +Locked Chest (owned by @1)=Peti Berkunci (milik @1) +You do not own this chest.=Ini bukan peti milik anda. +a locked chest=peti berkunci +Chest=Peti +Write=Tulis +Read=Baca +Title:=Tajuk: +Contents:=Kandungan: +Save=Simpan +by @1=oleh @1 +Page @1 of @2=Halaman @1 daripada @2 +The book you were writing to mysteriously disappeared.=Buku yang anda tulis hilang secara misterinya. +"@1" by @2="@1" oleh @2 +Blueberries=Beri Biru +Book=Buku +Book with Text=Buku Bertulisan +Bronze Ingot=Jongkong Gangsa +Clay Brick=Bata Tanah Liat +Clay Lump=Longgokan Tanah Liat +Coal Lump=Longgokan Batu Arang +Copper Ingot=Jongkong Tembaga +Copper Lump=Longgokan Tembaga +Diamond=Berlian +Flint=Batu Api +Gold Ingot=Jongkong Emas +Gold Lump=Longgokan Emas +Iron Lump=Longgokan Besi +Mese Crystal=Kristal Mese +Mese Crystal Fragment=Serpihan Kristal Mese +Obsidian Shard=Serpihan Obsidia +Paper=Kertas +Steel Ingot=Jongkong Keluli +Stick=Serpihan Kayu +Tin Ingot=Jongkong Timah +Tin Lump=Longgokan Timah +Furnace is empty=Relau masih kosong +100% (output full)=100% (keluaran penuh) +@1%=@1% +Not cookable=Tidak boleh dimasak +Empty=Kosong +Furnace active=Relau aktif +Furnace inactive=Relau tidak aktif +(Item: @1; Fuel: @2)=(Item: @1; Bahan api: @2) +Furnace=Relau +Stone=Batu +Cobblestone=Batu Buntar +Stone Brick=Bata Batu +Stone Block=Bongkah Batu +Mossy Cobblestone=Batu Buntar Berlumut +Desert Stone=Batu Gurun +Desert Cobblestone=Batu Buntar Gurun +Desert Stone Brick=Bata Batu Gurun +Desert Stone Block=Bongkah Batu Gurun +Sandstone=Batu Pasir +Sandstone Brick=Bata Batu Pasir +Sandstone Block=Bongkah Batu Pasir +Desert Sandstone=Batu Pasir Gurun +Desert Sandstone Brick=Bata Batu Pasir Gurun +Desert Sandstone Block=Bongkah Batu Pasir Gurun +Silver Sandstone=Batu Pasir Perak +Silver Sandstone Brick=Bata Batu Pasir Perak +Silver Sandstone Block=Bongkah Batu Pasir Perak +Obsidian=Obsidia +Obsidian Brick=Bata Obsidia +Obsidian Block=Bongkah Obsidia +Dirt=Tanah +Dirt with Grass=Tanah Berumput +Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki +Dirt with Savanna Grass=Tanah Berumput Savana +Dirt with Snow=Tanah Bersalji +Dirt with Rainforest Litter=Tanah Bersarap Hutan Hujan +Dirt with Coniferous Litter=Tanah Bersarap Hutan Konifer +Savanna Dirt=Tanah Savana +Savanna Dirt with Savanna Grass=Tanah Savana Berumput Savana +Permafrost=Ibun Abadi +Permafrost with Stones=Ibun Abadi Berbatu +Permafrost with Moss=Ibun Abadi Berlumut +Sand=Pasir +Desert Sand=Pasir Gurun +Silver Sand=Pasir Perak +Gravel=Kelikir +Clay=Tanah Liat +Snow=Salji +Snow Block=Bongkah Salji +Ice=Ais +Cave Ice=Ais Gua +Apple Tree=Kayu Pokok Epal +Apple Wood Planks=Papan Kayu Epal +Apple Tree Sapling=Anak Pokok Epal +Apple Tree Leaves=Daun Pokok Epal +Apple=Epal +Apple Marker=Penanda Epal +Jungle Tree=Kayu Pokok Hutan +Jungle Wood Planks=Papan Kayu Hutan +Jungle Tree Leaves=Daun Pokok Hutan +Jungle Tree Sapling=Anak Pokok Hutan +Emergent Jungle Tree Sapling=Anak Pokok Hutan Kembang +Pine Tree=Kayu Pokok Pain +Pine Wood Planks=Papan Kayu Pain +Pine Needles=Daun Pokok Pain +Pine Tree Sapling=Anak Pokok Pain +Acacia Tree=Kayu Pokok Akasia +Acacia Wood Planks=Papan Kayu Akasia +Acacia Tree Leaves=Daun Pokok Akasia +Acacia Tree Sapling=Anak Pokok Akasia +Aspen Tree=Kayu Pokok Aspen +Aspen Wood Planks=Papan Kayu Aspen +Aspen Tree Leaves=Daun Pokok Aspen +Aspen Tree Sapling=Anak Pokok Aspen +Coal Ore=Bijih Batu Arang +Coal Block=Bongkah Batu Arang +Iron Ore=Bijih Besi +Steel Block=Bongkah Keluli +Copper Ore=Bijih Tembaga +Copper Block=Bongkah Tembaga +Tin Ore=Bijih Timah +Tin Block=Bongkah Timah +Bronze Block=Bongkah Gangsa +Mese Ore=Bijih Mese +Mese Block=Bongkah Mese +Gold Ore=Bijih Emas +Gold Block=Bongkah Emas +Diamond Ore=Bijih Intan +Diamond Block=Bongkah Intan +Cactus=Kaktus +Large Cactus Seedling=Benih Kaktus Besar +Papyrus=Papirus +Dry Shrub=Pokok Renek Kering +Jungle Grass=Rumput Hutan +Grass=Rumput +Savanna Grass=Rumput Savana +Fern=Paku Pakis +Marram Grass=Rumput Maram +Bush Stem=Batang Belukar +Bush Leaves=Daun Belukar +Bush Sapling=Anak Belukar +Blueberry Bush Leaves with Berries=Daun Belukar Beri Biru Berberi +Blueberry Bush Leaves=Daun Belukar Beri Biru +Blueberry Bush Sapling=Anak Belukar Beri Biru +Acacia Bush Stem=Batang Belukar Akasia +Acacia Bush Leaves=Daun Belukar Akasia +Acacia Bush Sapling=Anak Belukar Akasia +Pine Bush Stem=Batang Belukar Pain +Pine Bush Needles=Daun Belukar Pain +Pine Bush Sapling=Anak Belukar Pain +Kelp=Kelpa +Green Coral=Batu Karang Hijau +Pink Coral=Batu Karang Merah Jambu +Cyan Coral=Batu Karang Biru Kehijauan +Brown Coral=Batu Karang Perang +Orange Coral=Batu Karang Jingga +Coral Skeleton= Rangka Karang +Water Source=Sumber Air +Flowing Water=Air Mengalir +River Water Source=Sumber Air Sungai +Flowing River Water=Air Sungai Mengalir +Lava Source=Sumber Lava +Flowing Lava=Lava Mengalir +Empty Bookshelf=Rak Buku Kosong +Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku bertulis, @2 buku kosong) +Bookshelf=Rak Buku +Text too long=Tulisan terlalu panjang +"@1"="@1" +Wooden Sign=Papan Tanda Kayu +Steel Sign=Papan Tanda Keluli +Wooden Ladder=Tangga Panjat Kayu +Steel Ladder=Tangga Panjat Keluli +Apple Wood Fence=Pagar Kayu Epal +Acacia Wood Fence=Pagar Kayu Akasia +Jungle Wood Fence=Pagar Kayu Hutan +Pine Wood Fence=Pagar Kayu Pain +Aspen Wood Fence=Pagar Kayu Aspen +Apple Wood Fence Rail=Pagar Rel Kayu Epal +Acacia Wood Fence Rail=Pagar Rel Kayu Akasia +Jungle Wood Fence Rail=Pagar Rel Kayu Hutan +Pine Wood Fence Rail=Pagar Rel Kayu Pain +Aspen Wood Fence Rail=Pagar Rel Kayu Aspen +Glass=Kaca +Obsidian Glass=Kaca Obsidia +Brick Block=Bongkah Bata +Mese Lamp=Lampu Mese +Apple Wood Mese Post Light=Lampu Tiang Mese Kayu Epal +Acacia Wood Mese Post Light=Lampu Tiang Mese Kayu Akasia +Jungle Wood Mese Post Light=Lampu Tiang Mese Kayu Hutan +Pine Wood Mese Post Light=Lampu Tiang Mese Kayu Pain +Aspen Wood Mese Post Light=Lampu Tiang Mese Kayu Aspen +Cloud=Awan +Wooden Pickaxe=Beliung Kayu +Stone Pickaxe=Beliung Batu +Bronze Pickaxe=Beliung Gangsa +Steel Pickaxe=Beliung Keluli +Mese Pickaxe=Beliung Mese +Diamond Pickaxe=Beliung Intan +Wooden Shovel=Penyodok Kayu +Stone Shovel=Penyodok Batu +Bronze Shovel=Penyodok Gangsa +Steel Shovel=Penyodok Keluli +Mese Shovel=Penyodok Mese +Diamond Shovel=Penyodok Intan +Wooden Axe=Kapak Kayu +Stone Axe=Kapak Batu +Bronze Axe=Kapak Gangsa +Steel Axe=Kapak Keluli +Mese Axe=Kapak Mese +Diamond Axe=Kapak Intan +Wooden Sword=Pedang Kayu +Stone Sword=Pedang Batu +Bronze Sword=Pedang Gangsa +Steel Sword=Pedang Keluli +Mese Sword=Pedang Mese +Diamond Sword=Pedang Intan +Torch=Obor +@1 will intersect protection on growth.=@1 akan masuk kawasan perlindungan lain apabila ia tumbuh. + + +##### not used anymore ##### + +Dirt with Dry Grass=Tanah Berumput Kering +Dry Dirt=Tanah Kering +Dry Dirt with Dry Grass=Tanah Kering Berumput Kering +Dry Grass=Rumput Kering +Mese Post Light=Lampu Tiang Mese diff --git a/mods/minetest_game/default/locale/default.pl.tr b/mods/minetest_game/default/locale/default.pl.tr new file mode 100644 index 00000000..dd08b841 --- /dev/null +++ b/mods/minetest_game/default/locale/default.pl.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Zablokowana skrzynia +Locked Chest (owned by @1)=Zablokowana skrzynia (wÅ‚aÅ›ciciel: @1) +You do not own this chest.=Nie jesteś wÅ‚aÅ›cicielem tej skrzyni. +a locked chest=zablokowana skrzynia +Chest=Skrzynia +Write=Zapis +Read=Odczyt +Title:=TytuÅ‚: +Contents:=Zawartość: +Save=Zapisz +by @1=autor: @1 +Page @1 of @2=Strona @1 z @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" przez @2 +Blueberries=Jagody +Book=Książka +Book with Text=Zapisana książka +Bronze Ingot=Sztabka brÄ…zu +Clay Brick=Gliniana cegÅ‚a +Clay Lump=Glina +Coal Lump=WÄ™giel +Copper Ingot=Sztabka miedzi +Copper Lump=BryÅ‚ka miedzi +Diamond=Diament +Flint=KrzemieÅ„ +Gold Ingot=Sztabka zÅ‚ota +Gold Lump=BryÅ‚ka zÅ‚ota +Iron Lump=BryÅ‚ka żelaza +Mese Crystal=KrysztaÅ‚ Mese +Mese Crystal Fragment=Fragment krysztaÅ‚u Mese +Obsidian Shard=OdÅ‚amek obsydianu +Paper=Papier +Steel Ingot=Sztabka stali +Stick=Patyk +Tin Ingot=Sztabka cyny +Tin Lump=BryÅ‚ka cyny +Furnace is empty=Piec jest pusty +100% (output full)=100% (zapeÅ‚nione) +@1%=@1% +Not cookable=Nie nadaje siÄ™ do przepalania +Empty=Puste +Furnace active=Piec aktywny +Furnace inactive=Piec nieaktywny +(Item: @1; Fuel: @2)=(Przedmiot: @1; Paliwo: @2) +Furnace=Piec +Stone=KamieÅ„ +Cobblestone=Bruk +Stone Brick=Kamienne cegÅ‚y +Stone Block=Blok kamienia +Mossy Cobblestone=Bruk z mchem +Desert Stone=Pustynny kamieÅ„ +Desert Cobblestone=Pustynny bruk +Desert Stone Brick=Pustynne kamienne cegÅ‚y +Desert Stone Block=Blok pustynnego kamienia +Sandstone=Piaskowiec +Sandstone Brick=CegÅ‚y z piaskowca +Sandstone Block=Blok piaskowca +Desert Sandstone=Pustynny piaskowiec +Desert Sandstone Brick=CegÅ‚y z pustynnego piaskowca +Desert Sandstone Block=Blok pustynnego piaskowca +Silver Sandstone=Srebrny piaskowiec +Silver Sandstone Brick=CegÅ‚y z srebrnego piaskowca +Silver Sandstone Block=Blok srebrnego piaskowca +Obsidian=Obsydian +Obsidian Brick=Obsydianowe cegÅ‚y +Obsidian Block=Blok obsydianu +Dirt=Ziemia +Dirt with Grass=Ziemia z trawÄ… +Dirt with Grass and Footsteps=Ziemia z trawÄ… i Å›ladami +Dirt with Savanna Grass=Ziemia z sawannowÄ… trawÄ… +Dirt with Snow=Ziemia ze Å›niegiem +Dirt with Rainforest Litter=Ziemia ze Å›ciółkÄ… lasu deszczowego +Dirt with Coniferous Litter=Ziemia ze Å›ciółkÄ… lasu iglastego +Savanna Dirt=Sawannowa ziemia +Savanna Dirt with Savanna Grass=Sawannowa ziemia z sawannowÄ… trawÄ… +Permafrost=Zmarzlina +Permafrost with Stones=Zmarzlina z kamieniami +Permafrost with Moss=Zmarzlina z mchem +Sand=Piasek +Desert Sand=Pustynny piasek +Silver Sand=Srebrny piasek +Gravel=Å»wir +Clay=Glina +Snow=Åšnieg +Snow Block=Blok Å›niegu +Ice=Lód +Cave Ice=Jaskiniowy lód +Apple Tree=JabÅ‚kowe drewno +Apple Wood Planks=Deski z drzewa jabÅ‚kowego +Apple Tree Sapling=Sadzonka drzewa jabÅ‚kowego +Apple Tree Leaves=LiÅ›cie drzewa jabÅ‚kowego +Apple=JabÅ‚ko +Apple Marker=Znacznik jabÅ‚ka +Jungle Tree=Dżunglowe drewno +Jungle Wood Planks=Deski z dżunglowego drzewa +Jungle Tree Leaves=LiÅ›cie dżunglowego drzewa +Jungle Tree Sapling=Sadzonka dżunglowego drzewa +Emergent Jungle Tree Sapling=WyÅ‚aniajÄ…ca siÄ™ sadzonka dżunglowego drzewa +Pine Tree=Sosnowe drewno +Pine Wood Planks=Deski z sosnowego drzewa +Pine Needles=Sosnowe igÅ‚y +Pine Tree Sapling=Sadzonka sosnowego drzewa +Acacia Tree=Akacjowe drewno +Acacia Wood Planks=Deski z akacjowego drzewa +Acacia Tree Leaves=LiÅ›cie akacjowego drzewa +Acacia Tree Sapling=Sadzonka akacjowego drzewa +Aspen Tree=Brzozowe drzewo +Aspen Wood Planks=Deski z brzozowego drzewa +Aspen Tree Leaves=LiÅ›cie brzozowego drzewa +Aspen Tree Sapling=Sadzonka brzozowego drzewa +Coal Ore=Ruda wÄ™gla +Coal Block=Blok wÄ™gla +Iron Ore=Ruda żelaza +Steel Block=Blok stali +Copper Ore=Ruda miedzi +Copper Block=Blok miedzi +Tin Ore=Ruda cyny +Tin Block=Blok cyny +Bronze Block=Blok brÄ…zu +Mese Ore=Ruda Mese +Mese Block=Blok Mese +Gold Ore=Ruda zÅ‚ota +Gold Block=Blok zÅ‚ota +Diamond Ore=Ruda diamentu +Diamond Block=Blok diamentu +Cactus=Kaktus +Large Cactus Seedling=Sadzonka dużego kaktusa +Papyrus=Papirus +Dry Shrub=UschniÄ™ty krzak +Jungle Grass=Dżunglowa trawa +Grass=Trawa +Savanna Grass=Sawannowa trawa +Fern=Paproć +Marram Grass=Trzcinnik leÅ›ny +Bush Stem=KorzeÅ„ krzaku +Bush Leaves=LiÅ›cie krzaku +Bush Sapling=Sadzonka krzaku +Blueberry Bush Leaves with Berries=LiÅ›cie jagodowego krzaku z jagodami +Blueberry Bush Leaves=LiÅ›cie jagodowego krzaku +Blueberry Bush Sapling=Sadzonka jagodowego krzaku +Acacia Bush Stem=KorzeÅ„ akacjowego krzaku +Acacia Bush Leaves=LiÅ›cie akacjowego krzaku +Acacia Bush Sapling=Sadzonka akacjowego krzaku +Pine Bush Stem=KorzeÅ„ sosnowego krzaku +Pine Bush Needles=IgÅ‚y sosnowego krzaku +Pine Bush Sapling=Sadzonka sosnowego krzaku +Kelp=Wodorost +Green Coral=Zielony koralowiec +Pink Coral=Różowy koralowiec +Cyan Coral=Cyjanowy koralowiec +Brown Coral=BrÄ…zowy koralowiec +Orange Coral=PomaraÅ„czowy koralowiec +Coral Skeleton=Szkielet koralowca +Water Source=ŹródÅ‚o wody +Flowing Water=PÅ‚ynÄ…ca woda +River Water Source=ŹródÅ‚o wody rzecznej +Flowing River Water=PÅ‚ynÄ…ca woda rzeczna +Lava Source=ŹródÅ‚o lawy +Flowing Lava=PÅ‚ynÄ…ca lawa +Empty Bookshelf=Pusta półka na książki +Bookshelf (@1 written, @2 empty books)=Półka na książki (@1 zapisanych, @2 pustych książek) +Bookshelf=Półka na książki +Text too long=Tekst jest zbyt dÅ‚ugi +"@1"="@1" +Wooden Sign=Drewniana tabliczka +Steel Sign=Stalowa tabliczka +Wooden Ladder=Drewniana drabina +Steel Ladder=Stalowa drabina +Apple Wood Fence=PÅ‚ot z jabÅ‚kowego drzewa +Acacia Wood Fence=PÅ‚ot z akacjowego drzewa +Jungle Wood Fence=PÅ‚ot z dżunglowego drzewa +Pine Wood Fence=PÅ‚ot z sosnowego drzewa +Aspen Wood Fence=PÅ‚ot z brzozowego drzewa +Apple Wood Fence Rail=Szyna ogrodzeniowa z jabÅ‚kowego drzewa +Acacia Wood Fence Rail=Szyna ogrodzeniowa z akacjowego drzewa +Jungle Wood Fence Rail=Szyna ogrodzeniowa z dżunglowego drzewa +Pine Wood Fence Rail=Szyna ogrodzeniowa z sosnowego drzewa +Aspen Wood Fence Rail=Szyna ogrodzeniowa z brzozowego drzewa +Glass=SzkÅ‚o +Obsidian Glass=Obsydianowe szkÅ‚o +Brick Block=Blok cegieÅ‚ +Mese Lamp=Lampa Mese +Apple Wood Mese Post Light=Lampa Mese z obramowaniem z jabÅ‚kowego drzewa +Acacia Wood Mese Post Light=Lampa Mese z obramowaniem z akacjowego drzewa +Jungle Wood Mese Post Light=Lampa Mese z obramowaniem z dżunglowego drzewa +Pine Wood Mese Post Light=Lampa Mese z obramowaniem z sosnowego drzewa +Aspen Wood Mese Post Light=Lampa Mese z obramowaniem z brzozowego drzewa +Cloud=Chmura +Wooden Pickaxe=Drewniany kilof +Stone Pickaxe=Kamienny kilof +Bronze Pickaxe=BrÄ…zowy kilof +Steel Pickaxe=Stalowy kilof +Mese Pickaxe=Mesowy kilof +Diamond Pickaxe=Diamentowy kilof +Wooden Shovel=Drewniana Å‚opata +Stone Shovel=Kamienna Å‚opata +Bronze Shovel=BrÄ…zowa Å‚opata +Steel Shovel=Stalowa Å‚opata +Mese Shovel=Mesowa Å‚opata +Diamond Shovel=Diamentowa Å‚opata +Wooden Axe=Drewniana siekiera +Stone Axe=Kamienna siekiera +Bronze Axe=BrÄ…zowa siekiera +Steel Axe=Stalowa siekiera +Mese Axe=Mesowa siekiera +Diamond Axe=Diamentowa siekiera +Wooden Sword=Drewniany miecz +Stone Sword=Kamienny miecz +Bronze Sword=BrÄ…zowy miecz +Steel Sword=Stalowy miecz +Mese Sword=Mesowy miecz +Diamond Sword=Diamentowy miecz +Torch=Pochodnia +@1 will intersect protection on growth.=@1 bÄ™dzie kolidować z ochronÄ… terenu podczas roÅ›niÄ™cia. diff --git a/mods/minetest_game/default/locale/default.pt.tr b/mods/minetest_game/default/locale/default.pt.tr new file mode 100644 index 00000000..80ad5875 --- /dev/null +++ b/mods/minetest_game/default/locale/default.pt.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Baú Trancado +Locked Chest (owned by @1)=Baú Trancado (pertence a @1) +You do not own this chest.=Você não é dono deste baú. +a locked chest=um baú trancado +Chest=Baú +Write= +Read= +Title:=Título: +Contents:=Conteúdo: +Save=Salvar +by @1=por @1 +Page @1 of @2=Página @1 de @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" por @2 +Blueberries=Mirtilo +Book=Livro +Book with Text=Livro com Texto +Bronze Ingot=Lingote de Bronze +Clay Brick=Tijolo de Argila +Clay Lump=Pedaço de Argila +Coal Lump=Pedaço de Carvão +Copper Ingot=Lingote de Cobre +Copper Lump=Pedaço de Cobre +Diamond=Diamante +Flint=Rocha Sílex +Gold Ingot=Lingote de Ouro +Gold Lump=Pedaço de Ouro +Iron Lump=Pedaço de Ferro +Mese Crystal=Cristal de Mese +Mese Crystal Fragment=Fragmento de Cristal de Mese +Obsidian Shard=Caco de Obsidian +Paper=Papel +Steel Ingot=Lingote de Aço +Stick=Graveto +Tin Ingot=Lingote de Estanho +Tin Lump=Pedaço de Estanho +Furnace is empty=A fornalha está vazia +100% (output full)=100% (saída cheia) +@1%=@1% +Not cookable=Não pode cozinhar +Empty=Vazio +Furnace active=Fornalha ativa +Furnace inactive=Fornalha inativa +(Item: @1; Fuel: @2)=(Item: @1; Combustível: @2) +Furnace=Fornalha +Stone=Pedra +Cobblestone=Pedregulho +Stone Brick=Tijolo de Pedra +Stone Block=Bloco de Pedra +Mossy Cobblestone=Pedregulho Musgoso +Desert Stone=Pedra do Deserto +Desert Cobblestone=Pedregulho do Deserto +Desert Stone Brick=Tijolo de Pedra do Deserto +Desert Stone Block=Bloco de Pedra do Deserto +Sandstone=Arenito +Sandstone Brick=Tijolo de Arenito +Sandstone Block=Bloco de Arenito +Desert Sandstone=Bloco de Arenito do Deserto +Desert Sandstone Brick=Tijolo de Arenito do Deserto +Desert Sandstone Block=Bloco de Arenito do Deserto +Silver Sandstone=Arenito Prateado +Silver Sandstone Brick=Tijolo de Arenito Prateado +Silver Sandstone Block=Bloco de Arenito Prateado +Obsidian=Obsidiana +Obsidian Brick=Tijolo de Obsidiana +Obsidian Block=Bloco de Obsidiana +Dirt=Terra +Dirt with Grass=Terra com Grama +Dirt with Grass and Footsteps=Terra com Grama e Pegadas +Dirt with Savanna Grass=Terra com Grama da Savana +Dirt with Snow=Terra com Neve +Dirt with Rainforest Litter=Terra com Serrapilheira Tropical +Dirt with Coniferous Litter=Terra com Serrapilheira +Savanna Dirt=Terra da Savana +Savanna Dirt with Savanna Grass=Terra da Savana com Grama da Savana +Permafrost=Terra Congelada +Permafrost with Stones=Terra Congelada com Pedras +Permafrost with Moss=Terra Congelada com Musgo +Sand=Areia +Desert Sand=Areia do Deserto +Silver Sand=Areia Prateada +Gravel=Cascalho +Clay=Argila +Snow=Neve +Snow Block=Bloco de Neve +Ice=Gelo +Cave Ice=Caverna de Gelo +Apple Tree=Macieira +Apple Wood Planks=Tábuas de Macieira +Apple Tree Sapling=Muda de Macieira +Apple Tree Leaves=Folhas de Macieira +Apple=Maçã +Apple Marker=Marcador de Maçã +Jungle Tree=Ãrvore da Selva +Jungle Wood Planks=Tábuas de Ãrvore da Selva +Jungle Tree Leaves=Folhas de Ãrvore da Selva +Jungle Tree Sapling=Muda de Ãrvore da Selva +Emergent Jungle Tree Sapling=Muda Crescida de Ãrvore da Selva +Pine Tree=Pinheiro +Pine Wood Planks=Tábuas de Pinheiro +Pine Needles=Agulhas de Pinheiro +Pine Tree Sapling=Muda de Pinheiro +Acacia Tree=Acácia +Acacia Wood Planks=Tábuas de Acácia +Acacia Tree Leaves=Folhas de Acácia +Acacia Tree Sapling=Mudas de Acácia +Aspen Tree=Ãlamo +Aspen Wood Planks=Tábuas de Ãlamo +Aspen Tree Leaves=Folhas de Ãlamo +Aspen Tree Sapling=Muda de Ãlamo +Coal Ore=Minério de Carvão +Coal Block=Bloco de Carvão +Iron Ore=Minério de Ferro +Steel Block=Bloco de Aço +Copper Ore=Minério de Cobre +Copper Block=Bloco de Cobre +Tin Ore=Minério de Estanho +Tin Block=Bloco de Estanho +Bronze Block=Bloco de Bronze +Mese Ore=Minério de Mese +Mese Block=Bloco de Mese +Gold Ore=Minério de Ouro +Gold Block=Bloco de Ouro +Diamond Ore=Minério de Diamante +Diamond Block=Bloco de Diamante +Cactus=Cacto +Large Cactus Seedling=Grande Muda de Cacto +Papyrus=Papiro +Dry Shrub=Arbusto Seco +Jungle Grass=Grama da Selva +Grass=Grama +Savanna Grass=Grama da Savana +Fern=Samambaia +Marram Grass=Grama de Feno +Bush Stem=Caule de Arbusto +Bush Leaves=Folhas de Arbusto +Bush Sapling=Muda de Arbusto +Blueberry Bush Leaves with Berries=Folhas de Arbusto de Mirtilo com Bagas +Blueberry Bush Leaves=Folhas de Arbusto de Mirtilo +Blueberry Bush Sapling=Muda de Arbusto de Mirtilo +Acacia Bush Stem=Caule de Arbusto de Acácia +Acacia Bush Leaves=Folhas de Arbusto de Acácia +Acacia Bush Sapling=Muda de Arbusto de Acácia +Pine Bush Stem=Caule de Arbusto de Pinheiro +Pine Bush Needles=Agulha de Arbusto de Pinheiro +Pine Bush Sapling=Muda de Arbusto de Pinheiro +Kelp=Alga +Green Coral=Coral Verde +Pink Coral=Coral Rosa +Cyan Coral=Coral Ciano +Brown Coral=Coral Marrom +Orange Coral=Coral Laranja +Coral Skeleton=Esqueleto de Coral +Water Source=Fonte de Ãgua +Flowing Water=Ãgua Corrente +River Water Source=Fonte de Ãgua do Rio +Flowing River Water=Ãgua Corrente do Rio +Lava Source=Fonte de Lava +Flowing Lava=Lava Corrente +Empty Bookshelf=Estante de Livros Vazia +Bookshelf (@1 written, @2 empty books)=Estante de Livros (@1 livros escritos, @2 livros em branco) +Bookshelf=Estante de Livros +Text too long=Texto muito longo +"@1"="@1" +Wooden Sign=Placa de Madeira +Steel Sign=Placa de Aço +Wooden Ladder=Escada de Madeira +Steel Ladder=Escada de Aço +Apple Wood Fence=Cerca de Macieira +Acacia Wood Fence=Cerca de Acácia +Jungle Wood Fence=Cerca de Madeira da Selva +Pine Wood Fence=Cerca de Pinheiro +Aspen Wood Fence=Cerca de Ãlamo +Apple Wood Fence Rail=Trilho de Cerca de Macieira +Acacia Wood Fence Rail=Trilho de Cerca de Acácia +Jungle Wood Fence Rail=Trilho de Cerca de Madeira da Selva +Pine Wood Fence Rail=Trilho de Cerca de Pinheiro +Aspen Wood Fence Rail=Trilho de Cerca de Ãlamo +Glass=Vidro +Obsidian Glass=Vidro de Obsidiana +Brick Block=Bloco de Tijolos +Mese Lamp=Lâmpada de Mese +Apple Wood Mese Post Light=Poste de Lâmpada de Mese de Macieira +Acacia Wood Mese Post Light=Poste de Lâmpada de Mese de Acácia +Jungle Wood Mese Post Light=Poste de Lâmpada de Mese de Madeira da Selva +Pine Wood Mese Post Light=Poste de Lâmpada de Mese de Pinheiro +Aspen Wood Mese Post Light=Poste de Lâmpada de Mese de Aspen +Cloud=Nuvem +Wooden Pickaxe=Picareta de Madeira +Stone Pickaxe=Picareta de Pedra +Bronze Pickaxe=Picareta de Bronze +Steel Pickaxe=Picareta de Aço +Mese Pickaxe=Picareta de Mese +Diamond Pickaxe=Picareta de Diamante +Wooden Shovel=Pá de Madeira +Stone Shovel=Pá de Pedra +Bronze Shovel=Pá de Bronze +Steel Shovel=Pá de Aço +Mese Shovel=Pá de Mese +Diamond Shovel=Pá de Diamante +Wooden Axe=Machado de Madeira +Stone Axe=Machado de Pedra +Bronze Axe=Machado de Bronze +Steel Axe=Machado de Aço +Mese Axe=Machado de Mese +Diamond Axe=Machado de Diamante +Wooden Sword=Espada de Madeira +Stone Sword=Espada de Pedra +Bronze Sword=Espada de Bronze +Steel Sword=Espada de Aço +Mese Sword=Espada de Mese +Diamond Sword=Espada de Diamante +Torch=Tocha +@1 will intersect protection on growth.=@1 cruzará a proteção no crescimento. diff --git a/mods/minetest_game/default/locale/default.pt_BR.tr b/mods/minetest_game/default/locale/default.pt_BR.tr new file mode 100644 index 00000000..80ad5875 --- /dev/null +++ b/mods/minetest_game/default/locale/default.pt_BR.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Baú Trancado +Locked Chest (owned by @1)=Baú Trancado (pertence a @1) +You do not own this chest.=Você não é dono deste baú. +a locked chest=um baú trancado +Chest=Baú +Write= +Read= +Title:=Título: +Contents:=Conteúdo: +Save=Salvar +by @1=por @1 +Page @1 of @2=Página @1 de @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" por @2 +Blueberries=Mirtilo +Book=Livro +Book with Text=Livro com Texto +Bronze Ingot=Lingote de Bronze +Clay Brick=Tijolo de Argila +Clay Lump=Pedaço de Argila +Coal Lump=Pedaço de Carvão +Copper Ingot=Lingote de Cobre +Copper Lump=Pedaço de Cobre +Diamond=Diamante +Flint=Rocha Sílex +Gold Ingot=Lingote de Ouro +Gold Lump=Pedaço de Ouro +Iron Lump=Pedaço de Ferro +Mese Crystal=Cristal de Mese +Mese Crystal Fragment=Fragmento de Cristal de Mese +Obsidian Shard=Caco de Obsidian +Paper=Papel +Steel Ingot=Lingote de Aço +Stick=Graveto +Tin Ingot=Lingote de Estanho +Tin Lump=Pedaço de Estanho +Furnace is empty=A fornalha está vazia +100% (output full)=100% (saída cheia) +@1%=@1% +Not cookable=Não pode cozinhar +Empty=Vazio +Furnace active=Fornalha ativa +Furnace inactive=Fornalha inativa +(Item: @1; Fuel: @2)=(Item: @1; Combustível: @2) +Furnace=Fornalha +Stone=Pedra +Cobblestone=Pedregulho +Stone Brick=Tijolo de Pedra +Stone Block=Bloco de Pedra +Mossy Cobblestone=Pedregulho Musgoso +Desert Stone=Pedra do Deserto +Desert Cobblestone=Pedregulho do Deserto +Desert Stone Brick=Tijolo de Pedra do Deserto +Desert Stone Block=Bloco de Pedra do Deserto +Sandstone=Arenito +Sandstone Brick=Tijolo de Arenito +Sandstone Block=Bloco de Arenito +Desert Sandstone=Bloco de Arenito do Deserto +Desert Sandstone Brick=Tijolo de Arenito do Deserto +Desert Sandstone Block=Bloco de Arenito do Deserto +Silver Sandstone=Arenito Prateado +Silver Sandstone Brick=Tijolo de Arenito Prateado +Silver Sandstone Block=Bloco de Arenito Prateado +Obsidian=Obsidiana +Obsidian Brick=Tijolo de Obsidiana +Obsidian Block=Bloco de Obsidiana +Dirt=Terra +Dirt with Grass=Terra com Grama +Dirt with Grass and Footsteps=Terra com Grama e Pegadas +Dirt with Savanna Grass=Terra com Grama da Savana +Dirt with Snow=Terra com Neve +Dirt with Rainforest Litter=Terra com Serrapilheira Tropical +Dirt with Coniferous Litter=Terra com Serrapilheira +Savanna Dirt=Terra da Savana +Savanna Dirt with Savanna Grass=Terra da Savana com Grama da Savana +Permafrost=Terra Congelada +Permafrost with Stones=Terra Congelada com Pedras +Permafrost with Moss=Terra Congelada com Musgo +Sand=Areia +Desert Sand=Areia do Deserto +Silver Sand=Areia Prateada +Gravel=Cascalho +Clay=Argila +Snow=Neve +Snow Block=Bloco de Neve +Ice=Gelo +Cave Ice=Caverna de Gelo +Apple Tree=Macieira +Apple Wood Planks=Tábuas de Macieira +Apple Tree Sapling=Muda de Macieira +Apple Tree Leaves=Folhas de Macieira +Apple=Maçã +Apple Marker=Marcador de Maçã +Jungle Tree=Ãrvore da Selva +Jungle Wood Planks=Tábuas de Ãrvore da Selva +Jungle Tree Leaves=Folhas de Ãrvore da Selva +Jungle Tree Sapling=Muda de Ãrvore da Selva +Emergent Jungle Tree Sapling=Muda Crescida de Ãrvore da Selva +Pine Tree=Pinheiro +Pine Wood Planks=Tábuas de Pinheiro +Pine Needles=Agulhas de Pinheiro +Pine Tree Sapling=Muda de Pinheiro +Acacia Tree=Acácia +Acacia Wood Planks=Tábuas de Acácia +Acacia Tree Leaves=Folhas de Acácia +Acacia Tree Sapling=Mudas de Acácia +Aspen Tree=Ãlamo +Aspen Wood Planks=Tábuas de Ãlamo +Aspen Tree Leaves=Folhas de Ãlamo +Aspen Tree Sapling=Muda de Ãlamo +Coal Ore=Minério de Carvão +Coal Block=Bloco de Carvão +Iron Ore=Minério de Ferro +Steel Block=Bloco de Aço +Copper Ore=Minério de Cobre +Copper Block=Bloco de Cobre +Tin Ore=Minério de Estanho +Tin Block=Bloco de Estanho +Bronze Block=Bloco de Bronze +Mese Ore=Minério de Mese +Mese Block=Bloco de Mese +Gold Ore=Minério de Ouro +Gold Block=Bloco de Ouro +Diamond Ore=Minério de Diamante +Diamond Block=Bloco de Diamante +Cactus=Cacto +Large Cactus Seedling=Grande Muda de Cacto +Papyrus=Papiro +Dry Shrub=Arbusto Seco +Jungle Grass=Grama da Selva +Grass=Grama +Savanna Grass=Grama da Savana +Fern=Samambaia +Marram Grass=Grama de Feno +Bush Stem=Caule de Arbusto +Bush Leaves=Folhas de Arbusto +Bush Sapling=Muda de Arbusto +Blueberry Bush Leaves with Berries=Folhas de Arbusto de Mirtilo com Bagas +Blueberry Bush Leaves=Folhas de Arbusto de Mirtilo +Blueberry Bush Sapling=Muda de Arbusto de Mirtilo +Acacia Bush Stem=Caule de Arbusto de Acácia +Acacia Bush Leaves=Folhas de Arbusto de Acácia +Acacia Bush Sapling=Muda de Arbusto de Acácia +Pine Bush Stem=Caule de Arbusto de Pinheiro +Pine Bush Needles=Agulha de Arbusto de Pinheiro +Pine Bush Sapling=Muda de Arbusto de Pinheiro +Kelp=Alga +Green Coral=Coral Verde +Pink Coral=Coral Rosa +Cyan Coral=Coral Ciano +Brown Coral=Coral Marrom +Orange Coral=Coral Laranja +Coral Skeleton=Esqueleto de Coral +Water Source=Fonte de Ãgua +Flowing Water=Ãgua Corrente +River Water Source=Fonte de Ãgua do Rio +Flowing River Water=Ãgua Corrente do Rio +Lava Source=Fonte de Lava +Flowing Lava=Lava Corrente +Empty Bookshelf=Estante de Livros Vazia +Bookshelf (@1 written, @2 empty books)=Estante de Livros (@1 livros escritos, @2 livros em branco) +Bookshelf=Estante de Livros +Text too long=Texto muito longo +"@1"="@1" +Wooden Sign=Placa de Madeira +Steel Sign=Placa de Aço +Wooden Ladder=Escada de Madeira +Steel Ladder=Escada de Aço +Apple Wood Fence=Cerca de Macieira +Acacia Wood Fence=Cerca de Acácia +Jungle Wood Fence=Cerca de Madeira da Selva +Pine Wood Fence=Cerca de Pinheiro +Aspen Wood Fence=Cerca de Ãlamo +Apple Wood Fence Rail=Trilho de Cerca de Macieira +Acacia Wood Fence Rail=Trilho de Cerca de Acácia +Jungle Wood Fence Rail=Trilho de Cerca de Madeira da Selva +Pine Wood Fence Rail=Trilho de Cerca de Pinheiro +Aspen Wood Fence Rail=Trilho de Cerca de Ãlamo +Glass=Vidro +Obsidian Glass=Vidro de Obsidiana +Brick Block=Bloco de Tijolos +Mese Lamp=Lâmpada de Mese +Apple Wood Mese Post Light=Poste de Lâmpada de Mese de Macieira +Acacia Wood Mese Post Light=Poste de Lâmpada de Mese de Acácia +Jungle Wood Mese Post Light=Poste de Lâmpada de Mese de Madeira da Selva +Pine Wood Mese Post Light=Poste de Lâmpada de Mese de Pinheiro +Aspen Wood Mese Post Light=Poste de Lâmpada de Mese de Aspen +Cloud=Nuvem +Wooden Pickaxe=Picareta de Madeira +Stone Pickaxe=Picareta de Pedra +Bronze Pickaxe=Picareta de Bronze +Steel Pickaxe=Picareta de Aço +Mese Pickaxe=Picareta de Mese +Diamond Pickaxe=Picareta de Diamante +Wooden Shovel=Pá de Madeira +Stone Shovel=Pá de Pedra +Bronze Shovel=Pá de Bronze +Steel Shovel=Pá de Aço +Mese Shovel=Pá de Mese +Diamond Shovel=Pá de Diamante +Wooden Axe=Machado de Madeira +Stone Axe=Machado de Pedra +Bronze Axe=Machado de Bronze +Steel Axe=Machado de Aço +Mese Axe=Machado de Mese +Diamond Axe=Machado de Diamante +Wooden Sword=Espada de Madeira +Stone Sword=Espada de Pedra +Bronze Sword=Espada de Bronze +Steel Sword=Espada de Aço +Mese Sword=Espada de Mese +Diamond Sword=Espada de Diamante +Torch=Tocha +@1 will intersect protection on growth.=@1 cruzará a proteção no crescimento. diff --git a/mods/minetest_game/default/locale/default.ru.tr b/mods/minetest_game/default/locale/default.ru.tr new file mode 100644 index 00000000..ed99a2dc --- /dev/null +++ b/mods/minetest_game/default/locale/default.ru.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Запертый Ñундук +Locked Chest (owned by @1)=Запертый Ñундук (владелец: @1) +You do not own this chest.=Ð’Ñ‹ не владелец Ñтого Ñундука. +a locked chest=запертый Ñундук +Chest=Сундук +Write=ÐапиÑать +Read=Читать +Title:=Заголовок: +Contents:=Содержимое: +Save=Сохранить +by @1=от @1 +Page @1 of @2=Страница @1 из @2 +The book you were writing to mysteriously disappeared.=Книга, которую вы пиÑали, загадочно иÑчезла. +"@1" by @2="@1" @2 +Blueberries=Черника +Book=Книга +Book with Text=Книга Ñ Ñ‚ÐµÐºÑтом +Bronze Ingot=Бронзовый Ñлиток +Clay Brick=Кирпич +Clay Lump=Глина +Coal Lump=Уголь +Copper Ingot=Медный Ñлиток +Copper Lump=КуÑок меди +Diamond=Ðлмаз +Flint=Кремень +Gold Ingot=Золотой Ñлиток +Gold Lump=КуÑок золота +Iron Lump=КуÑок железа +Mese Crystal=КриÑталл мезы +Mese Crystal Fragment=ОÑколок криÑталла мезы +Obsidian Shard=ОбÑидиановый оÑколок +Paper=Бумага +Steel Ingot=Стальной Ñлиток +Stick=Палка +Tin Ingot=ОловÑнный Ñлиток +Tin Lump=КуÑок олова +Furnace is empty=Печь пуÑта +100% (output full)=100% (выход заполнен) +@1%=@1% +Not cookable=Ðе может быть приготовлено +Empty=ПуÑтое +Furnace active=Печь зажжена +Furnace inactive=Печь не зажжена +(Item: @1; Fuel: @2)=(Предмет: @1; Топливо: @2) +Furnace=Печь +Stone=Камень +Cobblestone=Булыжник +Stone Brick=Каменные кирпичи +Stone Block=Каменный блок +Mossy Cobblestone=Замшелый булыжник +Desert Stone=ПуÑтынный камень +Desert Cobblestone=ПуÑтынный булыжник +Desert Stone Brick=ПуÑтынный каменные кирпичи +Desert Stone Block=ПуÑтынный каменный блок +Sandstone=ПеÑчаник +Sandstone Brick=ПеÑчаниковые кирпичи +Sandstone Block=ПеÑчаниковый блок +Desert Sandstone=ПуÑтынный пеÑчаник +Desert Sandstone Brick=ПуÑтынные пеÑчаниковые кирпичи +Desert Sandstone Block=ПуÑтынный пеÑчаниковый блок +Silver Sandstone=СеребриÑтый пеÑчаник +Silver Sandstone Brick=СеребриÑтые пеÑчаниковые кирпичи +Silver Sandstone Block=СеребриÑтый пеÑчаниковый блок +Obsidian=ОбÑидиан +Obsidian Brick=ОбÑидиановые кирпичи +Obsidian Block=ОбÑидиановый блок +Dirt=Ð—ÐµÐ¼Ð»Ñ +Dirt with Grass=Дёрн +Dirt with Grass and Footsteps=Дёрн Ñо Ñледами +Dirt with Savanna Grass=Саванный дёрн +Dirt with Snow=Ð—ÐµÐ¼Ð»Ñ Ñо Ñнегом +Dirt with Rainforest Litter=Ð—ÐµÐ¼Ð»Ñ Ñ Ñ‚Ñ€Ð¾Ð¿Ð¸Ñ‡ÐµÑкой подÑтилкой +Dirt with Coniferous Litter=Ð—ÐµÐ¼Ð»Ñ Ñ ÑоÑновой подÑтилкой +Savanna Dirt=Ð¡Ð°Ð²Ð°Ð½Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ +Savanna Dirt with Savanna Grass=Ð¡Ð°Ð²Ð°Ð½Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ Ñ Ñаванной травой +Permafrost=ÐœÑ‘Ñ€Ð·Ð»Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° +Permafrost with Stones=ÐœÑ‘Ñ€Ð·Ð»Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° Ñ ÐºÐ°Ð¼Ð½Ñми +Permafrost with Moss=ÐœÑ‘Ñ€Ð·Ð»Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° Ñ Ð¼Ñ…Ð¾Ð¼ +Sand=ПеÑок +Desert Sand=ПуÑтынный пеÑок +Silver Sand=СеребриÑтый пеÑок +Gravel=Гравий +Clay=ГлинÑный блок +Snow=Снежок +Snow Block=Снежный блок +Ice=Лёд +Cave Ice=Пещерный лёд +Apple Tree=Ð¯Ð±Ð»Ð¾Ð½ÐµÐ²Ð°Ñ Ð´Ñ€ÐµÐ²ÐµÑина +Apple Wood Planks=Яблоневые доÑки +Apple Tree Sapling=Саженец Ñблони +Apple Tree Leaves=Ð¯Ð±Ð»Ð¾Ð½ÐµÐ²Ð°Ñ Ð»Ð¸Ñтва +Apple=Яблоко +Apple Marker=Ð¯Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° +Jungle Tree=ДревеÑина тропичеÑкого дерева +Jungle Wood Planks=ДоÑки из тропичеÑкого дерева +Jungle Tree Leaves=ЛиÑтва тропичеÑкого дерева +Jungle Tree Sapling=Саженец тропичеÑкого дерева +Emergent Jungle Tree Sapling=ВыроÑший Ñаженец тропичеÑкого дерева +Pine Tree=СоÑÐ½Ð¾Ð²Ð°Ñ Ð´Ñ€ÐµÐ²ÐµÑина +Pine Wood Planks=СоÑновые доÑки +Pine Needles=СоÑÐ½Ð¾Ð²Ð°Ñ Ñ…Ð²Ð¾Ñ +Pine Tree Sapling=Саженец ÑоÑны +Acacia Tree=ÐÐºÐ°Ñ†Ð¸ÐµÐ²Ð°Ñ Ð´Ñ€ÐµÐ²ÐµÑина +Acacia Wood Planks=Ðкациевые доÑки +Acacia Tree Leaves=ÐÐºÐ°Ñ†Ð¸ÐµÐ²Ð°Ñ Ð»Ð¸Ñтва +Acacia Tree Sapling=Саженец акации +Aspen Tree=ОÑÐ¸Ð½Ð¾Ð²Ð°Ñ Ð´Ñ€ÐµÐ²ÐµÑина +Aspen Wood Planks=ОÑиновые доÑки +Aspen Tree Leaves=ОÑÐ¸Ð½Ð¾Ð²Ð°Ñ Ð»Ð¸Ñтва +Aspen Tree Sapling=Саженец оÑины +Coal Ore=Ð£Ð³Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ€ÑƒÐ´Ð° +Coal Block=Угольный блок +Iron Ore=Ð–ÐµÐ»ÐµÐ·Ð½Ð°Ñ Ñ€ÑƒÐ´Ð° +Steel Block=Стальной блок +Copper Ore=ÐœÐµÐ´Ð½Ð°Ñ Ñ€ÑƒÐ´Ð° +Copper Block=Медный блок +Tin Ore=ОловÑÐ½Ð½Ð°Ñ Ñ€ÑƒÐ´Ð° +Tin Block=ОловÑнный блок +Bronze Block=Бронзовый блок +Mese Ore=ÐœÐµÐ·Ð¾Ð²Ð°Ñ Ñ€ÑƒÐ´Ð° +Mese Block=Мезовый блок +Gold Ore=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ñ€ÑƒÐ´Ð° +Gold Block=Золотой блок +Diamond Ore=ÐÐ»Ð¼Ð°Ð·Ð½Ð°Ñ Ñ€ÑƒÐ´Ð° +Diamond Block=Ðлмазный блок +Cactus=ÐšÐ°ÐºÑ‚ÑƒÑ +Large Cactus Seedling=Саженец кактуÑа +Papyrus=ÐŸÐ°Ð¿Ð¸Ñ€ÑƒÑ +Dry Shrub=Сухой куÑÑ‚ +Jungle Grass=ТропичеÑÐºÐ°Ñ Ñ‚Ñ€Ð°Ð²Ð° +Grass=Трава +Savanna Grass=Ð¡Ð°Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð²Ð° +Fern=Папоротник +Marram Grass=ПеÑколюб +Bush Stem=Стебель куÑта +Bush Leaves=ЛиÑÑ‚ÑŒÑ ÐºÑƒÑта +Bush Sapling=Саженец куÑта +Blueberry Bush Leaves with Berries=Черничный куÑÑ‚ Ñ Ñгодами +Blueberry Bush Leaves=ЛиÑÑ‚ÑŒÑ Ñ‡ÐµÑ€Ð½Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ куÑта +Blueberry Bush Sapling=Саженец черничного куÑта +Acacia Bush Stem=Стебель куÑта акации +Acacia Bush Leaves=ЛиÑÑ‚ÑŒÑ ÐºÑƒÑта акации +Acacia Bush Sapling=Саженец куÑта акации +Pine Bush Stem=Стебли хвойного куÑта +Pine Bush Needles=Ð¥Ð²Ð¾Ñ ÐºÑƒÑта +Pine Bush Sapling=Саженец хвойного куÑта +Kelp=Ð›Ð°Ð¼Ð¸Ð½Ð°Ñ€Ð¸Ñ +Green Coral=Зелёный коралл +Pink Coral=Розовый коралл +Cyan Coral=Бирюзовый коралл +Brown Coral=Коричневый коралл +Orange Coral=Оранжевый коралл +Coral Skeleton=Коралловый оÑтов +Water Source=ИÑточник воды +Flowing Water=Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²Ð¾Ð´Ð° +River Water Source=ИÑточник речной воды +Flowing River Water=Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñ€ÐµÑ‡Ð½Ð°Ñ Ð²Ð¾Ð´Ð° +Lava Source=ИÑточник лавы +Flowing Lava=Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð»Ð°Ð²Ð° +Empty Bookshelf=ПуÑÑ‚Ð°Ñ ÐºÐ½Ð¸Ð¶Ð½Ð°Ñ Ð¿Ð¾Ð»ÐºÐ° +Bookshelf (@1 written, @2 empty books)=ÐšÐ½Ð¸Ð¶Ð½Ð°Ñ Ð¿Ð¾Ð»ÐºÐ° (@1 напиÑано, @2 чиÑтые книги) +Bookshelf=ÐšÐ½Ð¸Ð¶Ð½Ð°Ñ Ð¿Ð¾Ð»ÐºÐ° +Text too long=ТекÑÑ‚ Ñлишком длинный +"@1"="@1" +Wooden Sign=ДеревÑÐ½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡ÐºÐ° +Steel Sign=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡ÐºÐ° +Wooden Ladder=ДеревÑÐ½Ð½Ð°Ñ Ð»ÐµÑтница +Steel Ladder=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð»ÐµÑтница +Apple Wood Fence=Яблоневый забор +Acacia Wood Fence=Ðкациевый забор +Jungle Wood Fence=Забор из тропичеÑкого дерева +Pine Wood Fence=СоÑновый забор +Aspen Wood Fence=ОÑиновый забор +Apple Wood Fence Rail=Яблоневый реечный забор +Acacia Wood Fence Rail=Ðкациевый реечный забор +Jungle Wood Fence Rail=Реечный забор из тропичеÑкого дерева +Pine Wood Fence Rail=СоÑновый реечный забор +Aspen Wood Fence Rail=ОÑиновый реечный забор +Glass=Стекло +Obsidian Glass=ОбÑидиановое Ñтекло +Brick Block=Кирпичи +Mese Lamp=ÐœÐµÐ·Ð¾Ð²Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° +Apple Wood Mese Post Light=Яблоневый уличный фонарь +Acacia Wood Mese Post Light=Ðкациевый уличный фонарь +Jungle Wood Mese Post Light=Уличный фонарь из тропичеÑкого дерева +Pine Wood Mese Post Light=СоÑновый уличный фонарь +Aspen Wood Mese Post Light=ОÑиновый уличный фонарь +Cloud=Облако +Wooden Pickaxe=ДеревÑÐ½Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° +Stone Pickaxe=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° +Bronze Pickaxe=Ð‘Ñ€Ð¾Ð½Ð·Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° +Steel Pickaxe=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° +Mese Pickaxe=ÐœÐµÐ·Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° +Diamond Pickaxe=ÐÐ»Ð¼Ð°Ð·Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° +Wooden Shovel=ДеревÑÐ½Ð½Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° +Stone Shovel=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° +Bronze Shovel=Ð‘Ñ€Ð¾Ð½Ð·Ð¾Ð²Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° +Steel Shovel=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° +Mese Shovel=ÐœÐµÐ·Ð¾Ð²Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° +Diamond Shovel=ÐÐ»Ð¼Ð°Ð·Ð½Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° +Wooden Axe=ДеревÑнный топор +Stone Axe=Каменный топор +Bronze Axe=Бронзовый топор +Steel Axe=Стальной топор +Mese Axe=Мезовый топор +Diamond Axe=Ðлмазный топор +Wooden Sword=ДеревÑнный меч +Stone Sword=Каменный меч +Bronze Sword=Бронзовый меч +Steel Sword=Стальной меч +Mese Sword=Мезовый меч +Diamond Sword=Ðлмазный меч +Torch=Факел +@1 will intersect protection on growth.=@1 переÑечет защищённую зону при выраÑтании. \ No newline at end of file diff --git a/mods/minetest_game/default/locale/default.sk.tr b/mods/minetest_game/default/locale/default.sk.tr new file mode 100644 index 00000000..337ebcfb --- /dev/null +++ b/mods/minetest_game/default/locale/default.sk.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Uzamknutá truhlica +Locked Chest (owned by @1)=Uzamknutá truhlica (Vlastník - @1) +You do not own this chest.=Túto truhlicu nevlastníš. +a locked chest=zamknutá truhlica +Chest=Truhlica +Write= +Read= +Title:=Názov: +Contents:=Obsah: +Save=UložiÅ¥ +by @1=od @1 +Page @1 of @2=Strana @1 z @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2=„@1“ z @2 +Blueberries=ÄŒuÄoriedky +Book=Kniha +Book with Text=Kniha s textom +Bronze Ingot=Bronzový ingot +Clay Brick=Nepálená tehla +Clay Lump=Hruda ílu +Coal Lump=Hruda uhlia +Copper Ingot=Medený ingot +Copper Lump=Hruda medi +Diamond=Diamant +Flint=Kresací kamienok +Gold Ingot=Zlatý ingot +Gold Lump=Hruda zlata +Iron Lump=Hruda železa +Mese Crystal=Mese KriÅ¡táľ +Mese Crystal Fragment=Fragment Mese kriÅ¡táľu +Obsidian Shard=Úlomok obsidiánu +Paper=Papier +Steel Ingot=Oceľový ingot +Stick=Palica +Tin Ingot=Cínový ingot +Tin Lump=Hruda cínu +Furnace is empty=Pec je prázdna +100% (output full)=100% (Výstup je plný) +@1%=@1% +Not cookable=Nie je variteľné +Empty=Prázdne +Furnace active=Pec je aktívna +Furnace inactive=Pec je neaktívna +(Item: @1; Fuel: @2)=(Vec: @1; Palivo: @2) +Furnace=Pec +Stone=Kameň +Cobblestone=Dlažbový kameň +Stone Brick=Tehla z kameňa +Stone Block=Blok kameňa +Mossy Cobblestone=Dlažbový kameň obrastený machom +Desert Stone=Púštny kameň +Desert Cobblestone=Púštny dlažbový kameň +Desert Stone Brick=Tehla z púštneho kameňa +Desert Stone Block=Blok púštneho kameňa +Sandstone=Pieskovec +Sandstone Brick=Tehla z pieskovca +Sandstone Block=Blok pieskovca +Desert Sandstone=Púštny pieskovec +Desert Sandstone Brick=Tehla z púštneho pieskovca +Desert Sandstone Block=Blok púštneho pieskovca +Silver Sandstone=Strieborný pieskovec +Silver Sandstone Brick=Tehla zo strieborného pieskovca +Silver Sandstone Block=Blok strieborného pieskovca +Obsidian=Obsidián +Obsidian Brick=Tehla z obsidiánu +Obsidian Block=Blok obsidiánu +Dirt=Hlina +Dirt with Grass=Hlina s trávou +Dirt with Grass and Footsteps=Hlina s trávou a stopami +Dirt with Savanna Grass=Hlina s trávou zo savany +Dirt with Snow=Hlina so snehom +Dirt with Rainforest Litter=Hlina s povrchom dažÄového pralesa +Dirt with Coniferous Litter=Hlina s ihliÄnatým povrchom +Savanna Dirt=Hlina zo savany +Savanna Dirt with Savanna Grass=Hlina zo savany s trávou +Permafrost=Permafrost +Permafrost with Stones=Permafrost s kameňmi +Permafrost with Moss=Permafrost s machom +Sand=Piesok +Desert Sand=Púštny piesok +Silver Sand=Strieborný piesok +Gravel=Å trk +Clay=Ãl +Snow=Sneh +Snow Block=Blok snehu +Ice=Ľad +Cave Ice=Jaskynný ľad +Apple Tree=Jabloň +Apple Wood Planks=Drevené dosky z jablone +Apple Tree Sapling=StromÄek jablone +Apple Tree Leaves=Listy z jablone +Apple=Jablko +Apple Marker=Jablková znaÄka +Jungle Tree=ÄŽungľový strom +Jungle Wood Planks=Drevené dosky z džungľového stromu +Jungle Tree Leaves=Listy z džungľového stromu +Jungle Tree Sapling=Džungľový stromÄek +Emergent Jungle Tree Sapling=Vznikajúci džungľový stromÄek +Pine Tree=Borovica +Pine Wood Planks=Drevené dosky z borovice +Pine Needles=IhliÄie z borovice +Pine Tree Sapling=Borovicový stromÄek +Acacia Tree=Akácia +Acacia Wood Planks=Drevené dosky z akácie +Acacia Tree Leaves=Listy z akácie +Acacia Tree Sapling=StromÄek akácie +Aspen Tree=Osika +Aspen Wood Planks=Drevené dosky z osiky +Aspen Tree Leaves=Listy z osiky +Aspen Tree Sapling=StromÄek osiky +Coal Ore=Uhoľná ruda +Coal Block=Blok uhlia +Iron Ore=Železná ruda +Steel Block=Blok ocele +Copper Ore=Medená ruda +Copper Block=Blok medi +Tin Ore=Cínová ruda +Tin Block=Blok cínu +Bronze Block=Blok bronzu +Mese Ore=Mese Ruda +Mese Block=Blok Mese +Gold Ore=Zlatá ruda +Gold Block=Blok zlata +Diamond Ore=Diamantová ruda +Diamond Block=Blok diamantu +Cactus=Kaktus +Large Cactus Seedling=Vaľká sadenica kaktusu +Papyrus=Papyrus +Dry Shrub=Suchý ker +Jungle Grass=Džungľová tráva +Grass=Tráva +Savanna Grass=Tráva zo savany +Fern=PapraÄ +Marram Grass=Pobrežná tráva +Bush Stem=Stonka z kríka +Bush Leaves=Listy z kríka +Bush Sapling=Sadenica kríka +Blueberry Bush Leaves with Berries=ÄŒuÄoriedkové listy s ÄuÄoriedkami +Blueberry Bush Leaves=ÄŒuÄoriedkové listy +Blueberry Bush Sapling=Sadenica ÄuÄoriedky +Acacia Bush Stem=Stonka z kríka akácie +Acacia Bush Leaves=Listy z kríka akácie +Acacia Bush Sapling=Sadenica kríka akácie +Pine Bush Stem=Stonka kríka borovice +Pine Bush Needles=IhliÄie kríka borovice +Pine Bush Sapling=Sadenica kríka borovice +Kelp=Riasa +Green Coral=Zelený koral +Pink Coral=Ružový koral +Cyan Coral=Tyrkysový koral +Brown Coral=Hnedý koral +Orange Coral=Oranžový koral +Coral Skeleton=Koralová kostra +Water Source=Zdroj vody +Flowing Water=TeÄúca voda +River Water Source=Zdroj rieÄnej voda +Flowing River Water=TeÄúca rieÄna voda +Lava Source=Zdroj lávy +Flowing Lava=TeÄúca láva +Empty Bookshelf=Prázdna knižnica +Bookshelf (@1 written, @2 empty books)=Knižnica (@1 popísané, @2 prázdne knihy) +Bookshelf=Knižnica +Text too long=Text je príliÅ¡ dlhý +"@1"=„@1“ +Wooden Sign=Drevená tabuľka +Steel Sign=Oceľová tabuľka +Wooden Ladder=Drevený rebrík +Steel Ladder=Oceľový rebrík +Apple Wood Fence=Drevený plot z jablone +Acacia Wood Fence=Drevený plot z akácie +Jungle Wood Fence=Drevený plot z džungľového dreva +Pine Wood Fence=Drevený plot z borovice +Aspen Wood Fence=Drevený plot z osiky +Apple Wood Fence Rail=Drevené zábradlie z jablone +Acacia Wood Fence Rail=Drevené zábradlie z akácie +Jungle Wood Fence Rail=Drevené zábradlie z džungľového dreva +Pine Wood Fence Rail=Drevené zábradlie z borovice +Aspen Wood Fence Rail=Drevené zábradlie z osiky +Glass=Sklo +Obsidian Glass=Obsidiánové sklo +Brick Block=Blok z tehál +Mese Lamp=Mese lampa +Apple Wood Mese Post Light= +Acacia Wood Mese Post Light= +Jungle Wood Mese Post Light= +Pine Wood Mese Post Light= +Aspen Wood Mese Post Light= +Cloud=Oblak +Wooden Pickaxe=Drevený krompÃ¡Ä +Stone Pickaxe=Kamenný krompÃ¡Ä +Bronze Pickaxe=Bronzový krompÃ¡Ä +Steel Pickaxe=Oceľový krompÃ¡Ä +Mese Pickaxe=Mese krompÃ¡Ä +Diamond Pickaxe=Diamantový krompÃ¡Ä +Wooden Shovel=Drevená lopata +Stone Shovel=Kamenná lopata +Bronze Shovel=Bronzová lopata +Steel Shovel=Oceľová lopata +Mese Shovel=Mese lopata +Diamond Shovel=Diamantová lopata +Wooden Axe=Drevená sekera +Stone Axe=Kamenná sekera +Bronze Axe=Bronzová sekera +Steel Axe=Oceľová sekera +Mese Axe=Mese sekera +Diamond Axe=Diamantová sekera +Wooden Sword=Drevený meÄ +Stone Sword=Kamenný meÄ +Bronze Sword=Bronzový meÄ +Steel Sword=Oceľový meÄ +Mese Sword=Mese meÄ +Diamond Sword=Diamantový meÄ +Torch=Fakľa +@1 will intersect protection on growth.=@1 prekroÄí pri raste chránenú zónu. + + +##### not used anymore ##### + +Mese Post Light=Mese stĺpová lampa diff --git a/mods/minetest_game/default/locale/default.sv.tr b/mods/minetest_game/default/locale/default.sv.tr new file mode 100644 index 00000000..90df6c3c --- /dev/null +++ b/mods/minetest_game/default/locale/default.sv.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=LÃ¥st kista +Locked Chest (owned by @1)=LÃ¥st kista (Ägd av @1) +You do not own this chest.=Du äger inte denna kista. +a locked chest=en lÃ¥st kista +Chest=Kista +Write=Skriva +Read=Läs +Title:=Titel: +Contents:=InnehÃ¥ll: +Save=Spara +by @1=av @1 +Page @1 of @2=Sida @1 av @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" av @2 +Blueberries=BlÃ¥bär +Book=Bok +Book with Text=Bok med text +Bronze Ingot=Bronstacka +Clay Brick=Tegelsten +Clay Lump=Lerklump +Coal Lump=Kolklump +Copper Ingot=Koppartacka +Copper Lump=Kopparklump +Diamond=Diamant +Flint=Flinta +Gold Ingot=Guldtacka +Gold Lump=Guldklump +Iron Lump=Järnklump +Mese Crystal=Mesekristall +Mese Crystal Fragment=Mesekristallfragment +Obsidian Shard=Obsidianskärva +Paper=Papper +Steel Ingot=StÃ¥ltacka +Stick=Pinne +Tin Ingot=Tenntacka +Tin Lump=Tennklump +Furnace is empty=Ugnen är tom +100% (output full)=100% (utgÃ¥ngen full) +@1%=@1% +Not cookable=Inte kokbar +Empty=Tom +Furnace active=Ugn aktiv +Furnace inactive=Ugn inaktiv +(Item: @1; Fuel: @2)=(Sak: @1; Bränsle: @2) +Furnace=Ugn +Stone=Sten +Cobblestone=Kullersten +Stone Brick=Stentegel +Stone Block=Stenblock +Mossy Cobblestone=Mossig kullersten +Desert Stone=Ökensten +Desert Cobblestone=Ökenkullersten +Desert Stone Brick=Ökenstenstegel +Desert Stone Block=Ökenstensblock +Sandstone=Sandsten +Sandstone Brick=Sandstenstegel +Sandstone Block=Sandstensblock +Desert Sandstone=Ökensandsten +Desert Sandstone Brick=Ökensandstenstegel +Desert Sandstone Block=Ökensandstensblock +Silver Sandstone=Silversandsten +Silver Sandstone Brick=Silversandstenstegel +Silver Sandstone Block=Silversandstensblock +Obsidian=Obsidian +Obsidian Brick=Obsidiantegel +Obsidian Block=Obsidianblock +Dirt=Jord +Dirt with Grass=Jord med gräs +Dirt with Grass and Footsteps=Jord med gräs och fotsteg +Dirt with Savanna Grass=Jord med savanngräs +Dirt with Snow=Jord med snö +Dirt with Rainforest Litter=Jord med regnskogströ +Dirt with Coniferous Litter=Jord med barrträd +Savanna Dirt=Savannjord +Savanna Dirt with Savanna Grass=Savannjord med savanngräs +Permafrost=Permafrost +Permafrost with Stones=Permafrost med sten +Permafrost with Moss=Permafrost med mossa +Sand=Sand +Desert Sand=Ökensand +Silver Sand=Silversand +Gravel=Grus +Clay=Lera +Snow=Snö +Snow Block=Snöblock +Ice=Is +Cave Ice=Grottis +Apple Tree=Äppleträd +Apple Wood Planks=Äppleträdplankor +Apple Tree Sapling=Äppleplanta +Apple Tree Leaves=Äpplelöv +Apple=Äpple +Apple Marker=Äpplemarkör +Jungle Tree=Djungelträd +Jungle Wood Planks=Djungelplankor +Jungle Tree Leaves=Djungellöv +Jungle Tree Sapling=Djungelplanta +Emergent Jungle Tree Sapling=Nybliven djungelplanta +Pine Tree=Tall +Pine Wood Planks=Tallplankor +Pine Needles=Granbarr +Pine Tree Sapling=Tallplanta +Acacia Tree=Akaciaträd +Acacia Wood Planks=Akaciaplankor +Acacia Tree Leaves=Akacialöv +Acacia Tree Sapling=Akaciaplanta +Aspen Tree=Asp +Aspen Wood Planks=Aspplankor +Aspen Tree Leaves=Asplöv +Aspen Tree Sapling=Aspplanta +Coal Ore=Kolmalm +Coal Block=Kolblock +Iron Ore=Järnmalm +Steel Block=StÃ¥lblock +Copper Ore=Kopparmalm +Copper Block=Kopparblock +Tin Ore=Tennmalm +Tin Block=Tennblock +Bronze Block=Bronsblock +Mese Ore=Mesemalm +Mese Block=Meseblock +Gold Ore=Guldmalm +Gold Block=Guldblock +Diamond Ore=Diamantmalm +Diamond Block=Diamantblock +Cactus=Kaktus +Large Cactus Seedling=Stor kaktusplanta +Papyrus=Papyrus +Dry Shrub=Torr buske +Jungle Grass=Djungelgräs +Grass=Gräs +Savanna Grass=Savanngräs +Fern=Ormbunke +Marram Grass=Marramgräs +Bush Stem=Buskstam +Bush Leaves=Busklöv +Bush Sapling=Buskplanta +Blueberry Bush Leaves with Berries=BlÃ¥bärsbuske med bär +Blueberry Bush Leaves=BlÃ¥bärsbuske +Blueberry Bush Sapling=BlÃ¥bärsbuskplanta +Acacia Bush Stem=Akaciabuskstam +Acacia Bush Leaves=Akaciabuske +Acacia Bush Sapling=Akaciabuskplanta +Pine Bush Stem=Tallbuskestam +Pine Bush Needles=Tallgranbarr +Pine Bush Sapling=Tallbuskplanta +Kelp=Brunalg +Green Coral=Grön korall +Pink Coral=Rosa korall +Cyan Coral=Cyan korall +Brown Coral=Brun korall +Orange Coral=Orange korall +Coral Skeleton=Korallskelett +Water Source=Vattenkälla +Flowing Water=Flytande vatten +River Water Source=Flodvattenkälla +Flowing River Water=Flytande flodvatten +Lava Source=Lavakälla +Flowing Lava=Flytande lava +Empty Bookshelf=Tom bokhylla +Bookshelf (@1 written, @2 empty books)=Bokhylla (@1 skriva, @2 tomma böcker) +Bookshelf=Bokhylla +Text too long=Texten är för lÃ¥ng +"@1"="@1" +Wooden Sign=Träskylt +Steel Sign=StÃ¥lskylt +Wooden Ladder=Trästege +Steel Ladder=StÃ¥lstege +Apple Wood Fence=Äppleträstaket +Acacia Wood Fence=Akaciastaket +Jungle Wood Fence=Djungelstaket +Pine Wood Fence=Tallstaket +Aspen Wood Fence=Aspträdstaket +Apple Wood Fence Rail=Äppleträstaketsräls +Acacia Wood Fence Rail=Akaciastaketsräls +Jungle Wood Fence Rail=Djungelstaketsräls +Pine Wood Fence Rail=Tallstaketsräls +Aspen Wood Fence Rail=Aspstaketsräls +Glass=Glas +Obsidian Glass=Obsidianglas +Brick Block=Tegelstensblock +Mese Lamp=Meselampa +Apple Wood Mese Post Light=Äppleträ-meselykta +Acacia Wood Mese Post Light=Acacia-meselykta +Jungle Wood Mese Post Light=Djungel-meselykta +Pine Wood Mese Post Light=Tall-meselykta +Aspen Wood Mese Post Light=Aspträ-meselykta +Cloud=Moln +Wooden Pickaxe=Trähacka +Stone Pickaxe=Stenhacka +Bronze Pickaxe=Bronshacka +Steel Pickaxe=StÃ¥lhacka +Mese Pickaxe=Mesehacka +Diamond Pickaxe=Diamanthacka +Wooden Shovel=Träspade +Stone Shovel=Stenspade +Bronze Shovel=Bronsspade +Steel Shovel=StÃ¥lspade +Mese Shovel=Mesespade +Diamond Shovel=Diamantspade +Wooden Axe=Träyxa +Stone Axe=Stenyxa +Bronze Axe=Bronsyxa +Steel Axe=StÃ¥lyxa +Mese Axe=Meseyxa +Diamond Axe=Diamantyxa +Wooden Sword=Träsvärd +Stone Sword=Stensvärd +Bronze Sword=Bronssvärd +Steel Sword=StÃ¥lsvärd +Mese Sword=Mesesvärd +Diamond Sword=Diamantsvärd +Torch=Fackla +@1 will intersect protection on growth.=@1 kommer korsa skyddet mot tillväxt. diff --git a/mods/minetest_game/default/locale/default.uk.tr b/mods/minetest_game/default/locale/default.uk.tr new file mode 100644 index 00000000..aa24bfb8 --- /dev/null +++ b/mods/minetest_game/default/locale/default.uk.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Замкнена ÑÐºÑ€Ð¸Ð½Ñ +Locked Chest (owned by @1)=Замкнена ÑÐºÑ€Ð¸Ð½Ñ (влаÑник — @1) +You do not own this chest.=Ви — не влаÑник цієї Ñкрині. +a locked chest=замкнена ÑÐºÑ€Ð¸Ð½Ñ +Chest=Ð¡ÐºÑ€Ð¸Ð½Ñ +Write=ПиÑати +Read=Читати +Title:=Заголовок: +Contents:=ВміÑÑ‚: +Save=Зберегти +by @1=Ðвтор: @1 +Page @1 of @2=Сторінка @1 з @2 +The book you were writing to mysteriously disappeared.=Книга, в Ñку ви пиÑали, загадковим чином зникла. +"@1" by @2=@2 — "@1" +Blueberries=Чорниці +Book=Книга +Book with Text=Книга з текÑтом +Bronze Ingot=Бронзовий злиток +Clay Brick=ГлинÑна цегла +Clay Lump=Шматок глини +Coal Lump=Шматок Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ +Copper Ingot=Мідний злиток +Copper Lump=Шматок міді +Diamond=Діамант +Flint=Кремінь +Gold Ingot=Золотий злиток +Gold Lump=Шматок золота +Iron Lump=Шматок заліза +Mese Crystal=КриÑтал МеÑе +Mese Crystal Fragment=Уламок криÑталу МеÑе +Obsidian Shard=ОбÑидіановий уламок +Paper=Папір +Steel Ingot=Сталевий злиток +Stick=ÐŸÐ°Ð»Ð¸Ñ†Ñ +Tin Ingot=Олов'Ñний злиток +Tin Lump=Шматок олова +Furnace is empty=Піч Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ +100% (output full)=100% (піч переповнена) +@1%=@1% +Not cookable=Ðе може бути приготовано +Empty=Порожньо +Furnace active=Піч запалена +Furnace inactive=Піч не запалена +(Item: @1; Fuel: @2)=(Предмет: @1; Паливо: @2) +Furnace=Піч +Stone=Камінь +Cobblestone=КруглÑк +Stone Brick=Кам'Ñна цегла +Stone Block=Блок каменю +Mossy Cobblestone=Моховитий круглÑк +Desert Stone=ПуÑтельний камінь +Desert Cobblestone=ПуÑтельний круглÑк +Desert Stone Brick=Цегла з пуÑтельного каменю +Desert Stone Block=Блок пуÑтельного каменю +Sandstone=ПіÑковик +Sandstone Brick=ПіÑковикова цегла +Sandstone Block=Блок піÑковику +Desert Sandstone=ПуÑтельний піÑковик +Desert Sandstone Brick=Цегла з пуÑтельного піÑковику +Desert Sandstone Block=Блок пуÑтельного піÑковику +Silver Sandstone=Срібний піÑковик +Silver Sandstone Brick=Цегла зі Ñрібного піÑковику +Silver Sandstone Block=Блок Ñрібного піÑковику +Obsidian=ОбÑидіан +Obsidian Brick=ОбÑидіанова цегла +Obsidian Block=Блок обÑидіану +Dirt=Ð—ÐµÐ¼Ð»Ñ +Dirt with Grass=Ð—ÐµÐ¼Ð»Ñ Ð· травою +Dirt with Grass and Footsteps=Ð—ÐµÐ¼Ð»Ñ Ð· травою та Ñлідами +Dirt with Savanna Grass=Ð—ÐµÐ¼Ð»Ñ Ñ–Ð· Ñаванною травою +Dirt with Snow=Ð—ÐµÐ¼Ð»Ñ Ð·Ñ– Ñнігом +Dirt with Rainforest Litter=Ð—ÐµÐ¼Ð»Ñ Ð· тропічно-ліÑовою підÑтилкою +Dirt with Coniferous Litter=Ð—ÐµÐ¼Ð»Ñ Ð· хвойно-ліÑовою підÑтилкою +Savanna Dirt=Саванна Ð·ÐµÐ¼Ð»Ñ +Savanna Dirt with Savanna Grass=Саванна Ð·ÐµÐ¼Ð»Ñ Ñ–Ð· Ñаванною травою +Permafrost=Вічна мерзлота +Permafrost with Stones=Вічна мерзлота з каміннÑм +Permafrost with Moss=Вічна мерзлота з мохом +Sand=ПіÑок +Desert Sand=ПуÑтельний піÑок +Silver Sand=Срібний піÑок +Gravel=Гравій +Clay=Глина +Snow=Сніг +Snow Block=Блок Ñнігу +Ice=Крига +Cave Ice=Печерова крига +Apple Tree=Стовбур Ñблуні +Apple Wood Planks=Яблуневі дошки +Apple Tree Sapling=Саджанець Ñблуні +Apple Tree Leaves=Яблуневе лиÑÑ‚Ñ +Apple=Яблуко +Apple Marker=Мітка Ñблука +Jungle Tree=Стовбур тропічного дерева +Jungle Wood Planks=Дошки з тропічного дерева +Jungle Tree Leaves=ЛиÑÑ‚Ñ Ñ‚Ñ€Ð¾Ð¿Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ дерева +Jungle Tree Sapling=Саджанець тропічного дерева +Emergent Jungle Tree Sapling=Молодий Ñаджанець тропічного дерева +Pine Tree=СоÑновий Ñтовбур +Pine Wood Planks=СоÑнові дошки +Pine Needles=СоÑнова Ñ…Ð²Ð¾Ñ +Pine Tree Sapling=Саджанець ÑоÑни +Acacia Tree=Ðкацієвий Ñтовбур +Acacia Wood Planks=Ðкацієві дошки +Acacia Tree Leaves=Ðкацієве лиÑÑ‚Ñ +Acacia Tree Sapling=Саджанець акації +Aspen Tree=ОÑиковий Ñтовбур +Aspen Wood Planks=ОÑикові дошки +Aspen Tree Leaves=ОÑикове лиÑÑ‚Ñ +Aspen Tree Sapling=Саджанець оÑики +Coal Ore=Поклади Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ +Coal Block=Блок Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ +Iron Ore=Поклади заліза +Steel Block=Блок Ñталі +Copper Ore=Поклади міді +Copper Block=Блок міді +Tin Ore=Поклади олова +Tin Block=Блок олова +Bronze Block=Блок бронзи +Mese Ore=Поклади МеÑе +Mese Block=Блок МеÑе +Gold Ore=Поклади золота +Gold Block=Блок золота +Diamond Ore=Поклади діамантів +Diamond Block=Блок діамантів +Cactus=ÐšÐ°ÐºÑ‚ÑƒÑ +Large Cactus Seedling=Великий Ñаджанець кактуÑа +Papyrus=ÐŸÐ°Ð¿Ñ–Ñ€ÑƒÑ +Dry Shrub=Сухий кущ +Jungle Grass=Тропічна трава +Grass=Трава +Savanna Grass=Саванна трава +Fern=Папороть +Marram Grass=ПлÑжна трава +Bush Stem=Стебла куща +Bush Leaves=ЛиÑÑ‚Ñ ÐºÑƒÑ‰Ð° +Bush Sapling=Саджанець куща +Blueberry Bush Leaves with Berries=Кущ чорниці з Ñгодами +Blueberry Bush Leaves=Кущ чорниці +Blueberry Bush Sapling=Саджанець куща чорниці +Acacia Bush Stem=Стебла акацієвого куща +Acacia Bush Leaves=ЛиÑÑ‚Ñ Ð°ÐºÐ°Ñ†Ñ–Ñ”Ð²Ð¾Ð³Ð¾ куща +Acacia Bush Sapling=Саджанець акацієвого куща +Pine Bush Stem=Стебла ÑоÑнового куща +Pine Bush Needles=Ð¥Ð²Ð¾Ñ ÑоÑнового куща +Pine Bush Sapling=Саджанець ÑоÑнового куща +Kelp=Ð›Ð°Ð¼Ñ–Ð½Ð°Ñ€Ñ–Ñ +Green Coral=Зелений корал +Pink Coral=Рожевий корал +Cyan Coral=Блакитний корал +Brown Coral=Коричневий корал +Orange Coral=Помаранчевий корал +Coral Skeleton=Скелет корала +Water Source=Водне джерело +Flowing Water=Проточна вода +River Water Source=Річкове водне джерело +Flowing River Water=Проточна річкова вода +Lava Source=Лавове джерело +Flowing Lava=Проточна лава +Empty Bookshelf=ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ ÐºÐ½Ð¸Ð¶ÐºÐ¾Ð²Ð° Ð¿Ð¾Ð»Ð¸Ñ†Ñ +Bookshelf (@1 written, @2 empty books)=Книжкова Ð¿Ð¾Ð»Ð¸Ñ†Ñ (книги: @1 з текÑтом, @2 без текÑту) +Bookshelf=Книжкова Ð¿Ð¾Ð»Ð¸Ñ†Ñ +Text too long=ТекÑÑ‚ занадто довгий +"@1"="@1" +Wooden Sign=Дерев'Ñна табличка +Steel Sign=Сталева табличка +Wooden Ladder=Дерев'Ñна драбина +Steel Ladder=Сталева драбина +Apple Wood Fence=Яблуневий паркан +Acacia Wood Fence=Ðкацієвий паркан +Jungle Wood Fence=Паркан із тропічного дерева +Pine Wood Fence=СоÑновий паркан +Aspen Wood Fence=ОÑиковий паркан +Apple Wood Fence Rail=Яблуневий рейковий паркан +Acacia Wood Fence Rail=Ðкацієвий рейковий паркан +Jungle Wood Fence Rail=Рейковий паркан з тропічного дерева +Pine Wood Fence Rail=СоÑновий рейковий паркан +Aspen Wood Fence Rail=ОÑиковий рейковий паркан +Glass=Скло +Obsidian Glass=ОбÑидіанове Ñкло +Brick Block=ЦеглÑний блок +Mese Lamp=МеÑе-лампа +Apple Wood Mese Post Light=Яблуневий Ñтовповий МеÑе-Ñвітильник +Acacia Wood Mese Post Light=Ðкацієвий Ñтовповий МеÑе-Ñвітильник +Jungle Wood Mese Post Light=Стовповий МеÑе-Ñвітильник із тропічного дерева +Pine Wood Mese Post Light=СоÑновий Ñтовповий МеÑе-Ñвітильник +Aspen Wood Mese Post Light=ОÑиковий Ñтовповий МеÑе-Ñвітильник +Cloud=Хмара +Wooden Pickaxe=Дерев'Ñне кайло +Stone Pickaxe=Кам'Ñне кайло +Bronze Pickaxe=Бронзове кайло +Steel Pickaxe=Сталеве кайло +Mese Pickaxe=МеÑе-кайло +Diamond Pickaxe=Діамантове кайло +Wooden Shovel=Дерев'Ñна лопата +Stone Shovel=Кам'Ñна лопата +Bronze Shovel=Бронзова лопата +Steel Shovel=Сталева лопата +Mese Shovel=МеÑе-лопата +Diamond Shovel=Діамантова лопата +Wooden Axe=Дерев'Ñна Ñокира +Stone Axe=Кам'Ñна Ñокира +Bronze Axe=Бронзова Ñокира +Steel Axe=Сталева Ñокира +Mese Axe=МеÑе-Ñокира +Diamond Axe=Діамантова Ñокира +Wooden Sword=Дерев'Ñний меч +Stone Sword=Кам'Ñний меч +Bronze Sword=Бронзовий меч +Steel Sword=Сталевий меч +Mese Sword=МеÑе-меч +Diamond Sword=Діамантовий меч +Torch=СмолоÑкип +@1 will intersect protection on growth.=@1 перетне захиÑÑ‚ коли вироÑте. diff --git a/mods/minetest_game/default/locale/default.zh_CN.tr b/mods/minetest_game/default/locale/default.zh_CN.tr new file mode 100644 index 00000000..c887df87 --- /dev/null +++ b/mods/minetest_game/default/locale/default.zh_CN.tr @@ -0,0 +1,221 @@ +# textdomain: default +Locked Chest=已上é”çš„ç®±å­ +Locked Chest (owned by @1)=已上é”的箱å­ï¼ˆå±žäºŽ@1) +You do not own this chest.=这个箱å­ä¸å±žäºŽä½ æ‰€æœ‰ã€‚ +a locked chest=一个已上é”çš„ç®±å­ +Chest=ç®±å­ +Write=写 +Read=读 +Title:=标题: +Contents:=内容: +Save=ä¿å­˜ +by @1=ç”±@1 +Page @1 of @2=第@1页,共@2页。 +The book you were writing to mysteriously disappeared.=你正在写的书ä¸çŸ¥ä¸ºä½•消失了。 +"@1" by @2="@1" by @2 +Blueberries=è“莓 +Book=书 +Book with Text=带文字的书 +Bronze Ingot=é’铜锭 +Clay Brick=粘土砖 +Clay Lump=ç²˜åœŸå— +Coal Lump=ç…¤å— +Copper Ingot=铜锭 +Copper Lump=é“œå— +Diamond=钻石 +Flint=燧石 +Gold Ingot=金锭 +Gold Lump=é‡‘å— +Iron Lump=é“å— +Mese Crystal=黄石晶体 +Mese Crystal Fragment=黄石晶体碎片 +Obsidian Shard=黑曜石碎片 +Paper=纸 +Steel Ingot=é“é”­ +Stick=棒 +Tin Ingot=锡锭 +Tin Lump=é”¡å— +Furnace is empty=熔炉是空的 +100% (output full)=100%(输出已满) +@1%=@1% +Not cookable=ä¸å¯çƒ¹é¥ª +Empty=空 +Furnace active=熔炉正在è¿è½¬ +Furnace inactive=熔炉未使用 +(Item: @1; Fuel: @2)=(项目:@1;燃料:@2) +Furnace=熔炉 +Stone=石 +Cobblestone=é¹…åµçŸ³ +Stone Brick=石砖 +Stone Block=çŸ³æ–¹å— +Mossy Cobblestone=苔藓覆盖的鹅åµçŸ³ +Desert Stone=沙漠石 +Desert Cobblestone=沙漠鹅åµçŸ³ +Desert Stone Brick=沙漠鹅åµçŸ³ç – +Desert Stone Block=沙漠鹅åµçŸ³æ–¹å— +Sandstone=砂岩 +Sandstone Brick=砂岩砖 +Sandstone Block=ç ‚å²©æ–¹å— +Desert Sandstone=沙漠砂岩 +Desert Sandstone Brick=沙漠砂岩砖 +Desert Sandstone Block=æ²™æ¼ ç ‚å²©æ–¹å— +Silver Sandstone=银砂岩 +Silver Sandstone Brick=银砂岩砖 +Silver Sandstone Block=é“¶ç ‚å²©æ–¹å— +Obsidian=黑曜石 +Obsidian Brick=黑曜石砖 +Obsidian Block=é»‘æ›œçŸ³æ–¹å— +Dirt=åœŸæ–¹å— +Dirt with Grass=è‰æ–¹å— +Dirt with Grass and Footsteps=带有脚å°çš„è‰æ–¹å— +Dirt with Savanna Grass=è‰åŽŸè‰æ–¹å— +Dirt with Snow=é›ªåœŸæ–¹å— +Dirt with Rainforest Litter=雨林凋è½ç‰©åœŸ +Dirt with Coniferous Litter=é’ˆå¶æž—凋è½ç‰©åœŸ +Savanna Dirt=è‰åŽŸåœŸ +Savanna Dirt with Savanna Grass=è‰åŽŸè‰æ–¹å— +Permafrost=多年冻土 +Permafrost with Stones=带石头的多年冻土 +Permafrost with Moss=生苔的多年冻土 +Sand=æ²™ +Desert Sand=沙漠沙 +Silver Sand=é“¶æ²™ +Gravel=沙砾 +Clay=粘土 +Snow=雪 +Snow Block=é›ªæ–¹å— +Ice=冰 +Cave Ice=洞穴冰 +Apple Tree=苹果树 +Apple Wood Planks=è‹¹æžœæ ‘æœ¨æ¿ +Apple Tree Sapling=苹果树苗 +Apple Tree Leaves=è‹¹æžœæ ‘å¶ +Apple=苹果 +Apple Marker=苹果标记 +Jungle Tree=丛林树 +Jungle Wood Planks=ä¸›æž—æ ‘æœ¨æ¿ +Jungle Tree Leaves=ä¸›æž—æ ‘å¶ +Jungle Tree Sapling=丛林树苗 +Emergent Jungle Tree Sapling=露生层丛林树苗 +Pine Tree=æ¾æ ‘ +Pine Wood Planks=æ¾æ ‘æœ¨æ¿ +Pine Needles=æ¾é’ˆ +Pine Tree Sapling=æ¾æ ‘æ ‘è‹— +Acacia Tree=ç›¸æ€æ ‘ +Acacia Wood Planks=ç›¸æ€æ ‘æœ¨æ¿ +Acacia Tree Leaves=ç›¸æ€æ ‘å¶ +Acacia Tree Sapling=ç›¸æ€æ ‘æ ‘è‹— +Aspen Tree=ç™½æ¨æ ‘ +Aspen Wood Planks=ç™½æ¨æ ‘æœ¨æ¿ +Aspen Tree Leaves=ç™½æ¨æ ‘å¶ +Aspen Tree Sapling=ç™½æ¨æ ‘æ ‘è‹— +Coal Ore=煤炭矿石 +Coal Block=ç…¤ç‚­æ–¹å— +Iron Ore=é“矿石 +Steel Block=é’¢æ–¹å— +Copper Ore=铜矿石 +Copper Block=é“œæ–¹å— +Tin Ore=锡矿石 +Tin Block=é”¡æ–¹å— +Bronze Block=é’é“œæ–¹å— +Mese Ore=黄石矿石 +Mese Block=é»„çŸ³æ–¹å— +Gold Ore=金矿石 +Gold Block=é‡‘æ–¹å— +Diamond Ore=钻石矿石 +Diamond Block=é’»çŸ³æ–¹å— +Cactus=仙人掌 +Large Cactus Seedling=大仙人掌苗 +Papyrus=莎è‰çº¸ +Dry Shrub=å¹²çŒæœ¨ +Jungle Grass=ä¸›æž—è‰ +Grass=è‰ +Savanna Grass=è‰åŽŸè‰ +Fern=蕨 +Marram Grass=æ»¨è‰ +Bush Stem=çŒæœ¨ +Bush Leaves=çŒæœ¨å¶ +Bush Sapling=çŒæœ¨è‹— +Blueberry Bush Leaves with Berries=é•¿è“莓的è“èŽ“çŒæœ¨å¶ +Blueberry Bush Leaves=è“èŽ“çŒæœ¨å¶ +Blueberry Bush Sapling=è“èŽ“çŒæœ¨è‹— +Acacia Bush Stem=相æ€çŒæœ¨ +Acacia Bush Leaves=相æ€çŒæœ¨å¶ +Acacia Bush Sapling=相æ€çŒæœ¨è‹— +Pine Bush Stem=æ¾æ ‘çŒæœ¨ +Pine Bush Needles=æ¾æ ‘çŒæœ¨é’ˆ +Pine Bush Sapling=æ¾æ ‘çŒæœ¨è‹— +Kelp=海带 +Green Coral=绿çŠç‘š +Pink Coral=淡红çŠç‘š +Cyan Coral=é’çŠç‘š +Brown Coral=棕çŠç‘š +Orange Coral=æ©™çŠç‘š +Coral Skeleton=çŠç‘šéª¨æž¶ +Water Source=æ°´æ–¹å— +Flowing Water=æµåŠ¨çš„æ°´ +River Water Source=æ²³æ°´æ–¹å— +Flowing River Water=æµåŠ¨çš„æ²³æ°´ +Lava Source=å²©æµ†æ–¹å— +Flowing Lava=æµåŠ¨çš„å²©æµ† +Empty Bookshelf=空书架 +Bookshelf (@1 written, @2 empty books)=书架(@1本有字的书,@2本空书) +Bookshelf=书架 +Text too long=文字太长 +"@1"="@1" +Wooden Sign=木牌 +Steel Sign=é“牌 +Wooden Ladder=æœ¨æ¢¯å­ +Steel Ladder=铿¢¯å­ +Apple Wood Fence=è‹¹æžœæœ¨æ …æ  +Acacia Wood Fence=ç›¸æ€æœ¨æ …æ  +Jungle Wood Fence=ä¸›æž—æœ¨æ …æ  +Pine Wood Fence=æ¾æœ¨æ …æ  +Aspen Wood Fence=ç™½æ¨æœ¨æ …æ  +Apple Wood Fence Rail=è‹¹æžœæœ¨æ æ† +Acacia Wood Fence Rail=ç›¸æ€æœ¨æ æ† +Jungle Wood Fence Rail=ä¸›æž—æœ¨æ æ† +Pine Wood Fence Rail=æ¾æœ¨æ æ† +Aspen Wood Fence Rail=ç™½æ¨æœ¨æ æ† +Glass=玻璃 +Obsidian Glass=黑曜石玻璃 +Brick Block=ç –æ–¹å— +Mese Lamp=é»„çŸ³ç¯ +Apple Wood Mese Post Light=è‹¹æžœæœ¨é»„çŸ³ç¯æŸ± +Acacia Wood Mese Post Light=é‡‘åˆæ¬¢æœ¨é»„çŸ³ç¯æŸ± +Jungle Wood Mese Post Light=ä¸›æž—æœ¨é»„çŸ³ç¯æŸ± +Pine Wood Mese Post Light=æ¾æœ¨é»„çŸ³ç¯æŸ± +Aspen Wood Mese Post Light=ç™½æ¨æœ¨é»„çŸ³ç¯æŸ± +Cloud=云 +Wooden Pickaxe=æœ¨é• +Stone Pickaxe=çŸ³é• +Bronze Pickaxe=é’é“œé• +Steel Pickaxe=é“é• +Mese Pickaxe=é»„çŸ³é• +Diamond Pickaxe=é’»çŸ³é• +Wooden Shovel=木铲 +Stone Shovel=石铲 +Bronze Shovel=é’铜铲 +Steel Shovel=é“铲 +Mese Shovel=黄石铲 +Diamond Shovel=钻石铲 +Wooden Axe=木斧 +Stone Axe=石斧 +Bronze Axe=é’铜斧 +Steel Axe=铿–§ +Mese Axe=黄石斧 +Diamond Axe=钻石斧 +Wooden Sword=木剑 +Stone Sword=石剑 +Bronze Sword=é’铜剑 +Steel Sword=é“剑 +Mese Sword=黄石剑 +Diamond Sword=钻石剑 +Torch=ç«æŠŠ +@1 will intersect protection on growth.=@1ç”Ÿé•¿æ—¶å°†ä¸Žä¿æŠ¤åŒºåŸŸç›¸äº¤ã€‚ + + +##### not used anymore ##### + +Dirt with Dry Grass=å¹²è‰åœŸæ–¹å— +Dry Grass=å¹²è‰ diff --git a/mods/minetest_game/default/locale/default.zh_TW.tr b/mods/minetest_game/default/locale/default.zh_TW.tr new file mode 100644 index 00000000..bd638b4a --- /dev/null +++ b/mods/minetest_game/default/locale/default.zh_TW.tr @@ -0,0 +1,221 @@ +# textdomain: default +Locked Chest=å·²ä¸ŠéŽ–çš„ç®±å­ +Locked Chest (owned by @1)=已上鎖的箱å­ï¼ˆå±¬æ–¼@1所有) +You do not own this chest.=這個箱å­ä¸å±¬æ–¼ä½ æ‰€æœ‰ã€‚ +a locked chest=ä¸€å€‹å·²ä¸ŠéŽ–çš„ç®±å­ +Chest=ç®±å­ +Write=寫 +Read=讀 +Title:=標題: +Contents:=內容: +Save=ä¿å­˜ +by @1=ç”±@1 +Page @1 of @2=第@1é ï¼Œå…±@2é ã€‚ +The book you were writing to mysteriously disappeared.=你正在寫的書神秘消失了。 +"@1" by @2="@1" by @2 +Blueberries=è—莓 +Book=書 +Book with Text=帶文字的書 +Bronze Ingot=é’銅錠 +Clay Brick=粘土磚 +Clay Lump=粘土塊 +Coal Lump=煤塊 +Copper Ingot=銅錠 +Copper Lump=銅塊 +Diamond=鑽石 +Flint=燧石 +Gold Ingot=金錠 +Gold Lump=金塊 +Iron Lump=éµå¡Š +Mese Crystal=黃石晶體 +Mese Crystal Fragment=黃石晶體碎片 +Obsidian Shard=黑曜石碎片 +Paper=ç´™ +Steel Ingot=éµéŒ  +Stick=棒 +Tin Ingot=錫錠 +Tin Lump=錫塊 +Furnace is empty=ç†”çˆæ˜¯ç©ºçš„ +100% (output full)=100%(輸出已滿) +@1%=@1% +Not cookable=ä¸å¯çƒ¹é£ª +Empty=空 +Furnace active=ç†”çˆæ­£åœ¨é‹è½‰ +Furnace inactive=ç†”çˆæœªä½¿ç”¨ +(Item: @1; Fuel: @2)=(項目:@1;燃料:@2) +Furnace=ç†”çˆ +Stone=石 +Cobblestone=éµåµçŸ³ +Stone Brick=石磚 +Stone Block=石方塊 +Mossy Cobblestone=苔蘚覆蓋的éµåµçŸ³ +Desert Stone=沙漠石 +Desert Cobblestone=沙漠éµåµçŸ³ +Desert Stone Brick=沙漠éµåµçŸ³ç£š +Desert Stone Block=沙漠éµåµçŸ³æ–¹å¡Š +Sandstone=砂岩 +Sandstone Brick=砂岩磚 +Sandstone Block=砂岩方塊 +Desert Sandstone=沙漠砂岩 +Desert Sandstone Brick=沙漠砂岩磚 +Desert Sandstone Block=沙漠砂岩方塊 +Silver Sandstone=銀砂岩 +Silver Sandstone Brick=銀砂岩磚 +Silver Sandstone Block=銀砂岩方塊 +Obsidian=黑曜石 +Obsidian Brick=黑曜石磚 +Obsidian Block=黑曜石方塊 +Dirt=土方塊 +Dirt with Grass=è‰æ–¹å¡Š +Dirt with Grass and Footsteps=è‰æ–¹å¡ŠåŠè…³å° +Dirt with Savanna Grass=è‰åŽŸè‰æ–¹å¡Š +Dirt with Snow=雪土方塊 +Dirt with Rainforest Litter=雨林è…土 +Dirt with Coniferous Litter=é‡è‘‰æž—è…土 +Savanna Dirt=è‰åŽŸåœŸ +Savanna Dirt with Savanna Grass=è‰åŽŸè‰æ–¹å¡Šï¼ˆè‰åŽŸåœŸï¼‰ +Permafrost=多年å‡åœŸ +Permafrost with Stones=帶石頭的多年å‡åœŸ +Permafrost with Moss=生苔的多年å‡åœŸ +Sand=æ²™ +Desert Sand=沙漠沙 +Silver Sand=銀沙 +Gravel=沙礫 +Clay=粘土 +Snow=雪 +Snow Block=雪方塊 +Ice=冰 +Cave Ice=洞穴冰 +Apple Tree=蘋果樹 +Apple Wood Planks=è˜‹æžœæ¨¹æœ¨æ¿ +Apple Tree Sapling=蘋果樹苗 +Apple Tree Leaves=蘋果樹葉 +Apple=蘋果 +Apple Marker=蘋果標記 +Jungle Tree=墿ž—樹 +Jungle Wood Planks=墿ž—æ¨¹æœ¨æ¿ +Jungle Tree Leaves=墿ž—樹葉 +Jungle Tree Sapling=墿ž—樹苗 +Emergent Jungle Tree Sapling=æ‡‰æ€¥å¢æž—樹苗 +Pine Tree=æ¾æ¨¹ +Pine Wood Planks=æ¾æ¨¹æœ¨æ¿ +Pine Needles=æ¾é‡ +Pine Tree Sapling=æ¾æ¨¹æ¨¹è‹— +Acacia Tree=ç›¸æ€æ¨¹ +Acacia Wood Planks=ç›¸æ€æ¨¹æœ¨æ¿ +Acacia Tree Leaves=ç›¸æ€æ¨¹è‘‰ +Acacia Tree Sapling=ç›¸æ€æ¨¹æ¨¹è‹— +Aspen Tree=白楊樹 +Aspen Wood Planks=ç™½æ¥Šæ¨¹æœ¨æ¿ +Aspen Tree Leaves=白楊樹葉 +Aspen Tree Sapling=白楊樹樹苗 +Coal Ore=煤炭礦石 +Coal Block=煤炭方塊 +Iron Ore=éµç¤¦çŸ³ +Steel Block=鋼方塊 +Copper Ore=銅礦石 +Copper Block=銅方塊 +Tin Ore=錫礦石 +Tin Block=錫方塊 +Bronze Block=é’銅方塊 +Mese Ore=黃石礦石 +Mese Block=黃石方塊 +Gold Ore=金礦石 +Gold Block=金方塊 +Diamond Ore=鑽石礦石 +Diamond Block=鑽石方塊 +Cactus=仙人掌 +Large Cactus Seedling=大仙人掌苗 +Papyrus=莎è‰ç´™ +Dry Shrub=å¹¹çŒæœ¨ +Jungle Grass=墿ž—è‰ +Grass=è‰ +Savanna Grass= +Fern=蕨 +Marram Grass=æ¿±è‰ +Bush Stem=çŒæœ¨ +Bush Leaves=çŒæœ¨è‘‰ +Bush Sapling=çŒæœ¨è‹— +Blueberry Bush Leaves with Berries=è—èŽ“çŒæœ¨è‘‰èˆ‡æ¼¿æžœ +Blueberry Bush Leaves=è—èŽ“çŒæœ¨è‘‰ +Blueberry Bush Sapling=è—èŽ“çŒæœ¨è‹— +Acacia Bush Stem=相æ€çŒæœ¨ +Acacia Bush Leaves=相æ€çŒæœ¨è‘‰ +Acacia Bush Sapling=相æ€çŒæœ¨è‹— +Pine Bush Stem=æ¾æ¨¹çŒæœ¨ +Pine Bush Needles=æ¾æ¨¹çŒæœ¨é‡ +Pine Bush Sapling=æ¾æ¨¹çŒæœ¨è‹— +Kelp=海帶 +Green Coral=ç¶ çŠç‘š +Pink Coral=æ·¡ç´…çŠç‘š +Cyan Coral=é’çŠç‘š +Brown Coral=棕çŠç‘š +Orange Coral=æ©™çŠç‘š +Coral Skeleton=çŠç‘šéª¨æž¶ +Water Source=水方塊 +Flowing Water=æµå‹•的水 +River Water Source=河水方塊 +Flowing River Water=æµå‹•的河水 +Lava Source=岩漿方塊 +Flowing Lava=æµå‹•的岩漿 +Empty Bookshelf=空書架 +Bookshelf (@1 written, @2 empty books)=書架(@1本有字的書,@2本空書) +Bookshelf=書架 +Text too long=文字太長 +"@1"="@1" +Wooden Sign=木牌 +Steel Sign=éµç‰Œ +Wooden Ladder=æœ¨æ¢¯å­ +Steel Ladder=鵿¢¯å­ +Apple Wood Fence=蘋果木柵欄 +Acacia Wood Fence=ç›¸æ€æœ¨æŸµæ¬„ +Jungle Wood Fence=墿ž—木柵欄 +Pine Wood Fence=æ¾æœ¨æŸµæ¬„ +Aspen Wood Fence=白楊木柵欄 +Apple Wood Fence Rail=è˜‹æžœæœ¨æ¬„æ† +Acacia Wood Fence Rail=ç›¸æ€æœ¨æ¬„æ† +Jungle Wood Fence Rail=墿ž—æœ¨æ¬„æ† +Pine Wood Fence Rail=æ¾æœ¨æ¬„æ† +Aspen Wood Fence Rail=ç™½æ¥Šæœ¨æ¬„æ† +Glass=玻璃 +Obsidian Glass=黑曜石玻璃 +Brick Block=磚方塊 +Mese Lamp=黃石燈 +Apple Wood Mese Post Light=蘋果木黃石燈柱 +Acacia Wood Mese Post Light=é‡‘åˆæ­¡æœ¨é»ƒçŸ³ç‡ˆæŸ± +Jungle Wood Mese Post Light=墿ž—木黃石燈柱 +Pine Wood Mese Post Light=æ¾æœ¨é»ƒçŸ³ç‡ˆæŸ± +Aspen Wood Mese Post Light=白楊木黃石燈柱 +Cloud=雲 +Wooden Pickaxe=木鎬 +Stone Pickaxe=石鎬 +Bronze Pickaxe=é’銅鎬 +Steel Pickaxe=éµéެ +Mese Pickaxe=黃石鎬 +Diamond Pickaxe=鑽石鎬 +Wooden Shovel=æœ¨éŸ +Stone Shovel=çŸ³éŸ +Bronze Shovel=é’éŠ…éŸ +Steel Shovel=éµéŸ +Mese Shovel=é»ƒçŸ³éŸ +Diamond Shovel=é‘½çŸ³éŸ +Wooden Axe=木斧 +Stone Axe=石斧 +Bronze Axe=é’銅斧 +Steel Axe=鵿–§ +Mese Axe=黃石斧 +Diamond Axe=鑽石斧 +Wooden Sword=æœ¨åŠ +Stone Sword=çŸ³åŠ +Bronze Sword=é’éŠ…åŠ +Steel Sword=éµåŠ +Mese Sword=é»ƒçŸ³åŠ +Diamond Sword=é‘½çŸ³åŠ +Torch=ç«æŠŠ +@1 will intersect protection on growth.=@1將與增長的ä¿è­·ç›¸äº¤ã€‚ + + +##### not used anymore ##### + +Dirt with Dry Grass=ä¹¾è‰åœŸæ–¹å¡Š +Dry Grass=ä¹¾è‰ diff --git a/mods/minetest_game/default/locale/template.txt b/mods/minetest_game/default/locale/template.txt new file mode 100644 index 00000000..815c29c5 --- /dev/null +++ b/mods/minetest_game/default/locale/template.txt @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest= +Locked Chest (owned by @1)= +You do not own this chest.= +a locked chest= +Chest= +Write= +Read= +Title:= +Contents:= +Save= +by @1= +Page @1 of @2= +The book you were writing to mysteriously disappeared.= +"@1" by @2= +Blueberries= +Book= +Book with Text= +Bronze Ingot= +Clay Brick= +Clay Lump= +Coal Lump= +Copper Ingot= +Copper Lump= +Diamond= +Flint= +Gold Ingot= +Gold Lump= +Iron Lump= +Mese Crystal= +Mese Crystal Fragment= +Obsidian Shard= +Paper= +Steel Ingot= +Stick= +Tin Ingot= +Tin Lump= +Furnace is empty= +100% (output full)= +@1%= +Not cookable= +Empty= +Furnace active= +Furnace inactive= +(Item: @1; Fuel: @2)= +Furnace= +Stone= +Cobblestone= +Stone Brick= +Stone Block= +Mossy Cobblestone= +Desert Stone= +Desert Cobblestone= +Desert Stone Brick= +Desert Stone Block= +Sandstone= +Sandstone Brick= +Sandstone Block= +Desert Sandstone= +Desert Sandstone Brick= +Desert Sandstone Block= +Silver Sandstone= +Silver Sandstone Brick= +Silver Sandstone Block= +Obsidian= +Obsidian Brick= +Obsidian Block= +Dirt= +Dirt with Grass= +Dirt with Grass and Footsteps= +Dirt with Savanna Grass= +Dirt with Snow= +Dirt with Rainforest Litter= +Dirt with Coniferous Litter= +Savanna Dirt= +Savanna Dirt with Savanna Grass= +Permafrost= +Permafrost with Stones= +Permafrost with Moss= +Sand= +Desert Sand= +Silver Sand= +Gravel= +Clay= +Snow= +Snow Block= +Ice= +Cave Ice= +Apple Tree= +Apple Wood Planks= +Apple Tree Sapling= +Apple Tree Leaves= +Apple= +Apple Marker= +Jungle Tree= +Jungle Wood Planks= +Jungle Tree Leaves= +Jungle Tree Sapling= +Emergent Jungle Tree Sapling= +Pine Tree= +Pine Wood Planks= +Pine Needles= +Pine Tree Sapling= +Acacia Tree= +Acacia Wood Planks= +Acacia Tree Leaves= +Acacia Tree Sapling= +Aspen Tree= +Aspen Wood Planks= +Aspen Tree Leaves= +Aspen Tree Sapling= +Coal Ore= +Coal Block= +Iron Ore= +Steel Block= +Copper Ore= +Copper Block= +Tin Ore= +Tin Block= +Bronze Block= +Mese Ore= +Mese Block= +Gold Ore= +Gold Block= +Diamond Ore= +Diamond Block= +Cactus= +Large Cactus Seedling= +Papyrus= +Dry Shrub= +Jungle Grass= +Grass= +Savanna Grass= +Fern= +Marram Grass= +Bush Stem= +Bush Leaves= +Bush Sapling= +Blueberry Bush Leaves with Berries= +Blueberry Bush Leaves= +Blueberry Bush Sapling= +Acacia Bush Stem= +Acacia Bush Leaves= +Acacia Bush Sapling= +Pine Bush Stem= +Pine Bush Needles= +Pine Bush Sapling= +Kelp= +Green Coral= +Pink Coral= +Cyan Coral= +Brown Coral= +Orange Coral= +Coral Skeleton= +Water Source= +Flowing Water= +River Water Source= +Flowing River Water= +Lava Source= +Flowing Lava= +Empty Bookshelf= +Bookshelf (@1 written, @2 empty books)= +Bookshelf= +Text too long= +"@1"= +Wooden Sign= +Steel Sign= +Wooden Ladder= +Steel Ladder= +Apple Wood Fence= +Acacia Wood Fence= +Jungle Wood Fence= +Pine Wood Fence= +Aspen Wood Fence= +Apple Wood Fence Rail= +Acacia Wood Fence Rail= +Jungle Wood Fence Rail= +Pine Wood Fence Rail= +Aspen Wood Fence Rail= +Glass= +Obsidian Glass= +Brick Block= +Mese Lamp= +Apple Wood Mese Post Light= +Acacia Wood Mese Post Light= +Jungle Wood Mese Post Light= +Pine Wood Mese Post Light= +Aspen Wood Mese Post Light= +Cloud= +Wooden Pickaxe= +Stone Pickaxe= +Bronze Pickaxe= +Steel Pickaxe= +Mese Pickaxe= +Diamond Pickaxe= +Wooden Shovel= +Stone Shovel= +Bronze Shovel= +Steel Shovel= +Mese Shovel= +Diamond Shovel= +Wooden Axe= +Stone Axe= +Bronze Axe= +Steel Axe= +Mese Axe= +Diamond Axe= +Wooden Sword= +Stone Sword= +Bronze Sword= +Steel Sword= +Mese Sword= +Diamond Sword= +Torch= +@1 will intersect protection on growth.= diff --git a/mods/minetest_game/default/mapgen.lua b/mods/minetest_game/default/mapgen.lua new file mode 100644 index 00000000..d07dcb52 --- /dev/null +++ b/mods/minetest_game/default/mapgen.lua @@ -0,0 +1,2487 @@ +-- +-- Aliases for map generators +-- + +-- All mapgens + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") + +-- Additional aliases needed for mapgen v6 + +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pine_tree", "default:pine_tree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_stair_desert_stone", "stairs:stair_desert_stone") + + +-- +-- Register ores +-- + +-- Mgv6 + +function default.register_mgv6_ores() + + -- Blob ore + -- These first to avoid other ores in blobs + + -- Clay + -- This first to avoid clay in sand blobs + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -15, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Sand + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Dirt + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) + + -- Scatter ores + + -- Coal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 8, + clust_size = 3, + y_max = 64, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_max = 0, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = 0, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_max = -64, + y_min = -31000, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_max = -16, + y_min = -63, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = -64, + y_min = -31000, + }) + + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 4, + clust_size = 3, + y_max = -32, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Gold + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Mese block + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = -1024, + y_min = -31000, + }) +end + + +-- All mapgens except mgv6 + +function default.register_ores() + + -- Stratum ores. + -- These obviously first. + + -- Silver sandstone + + --[[minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"cold_desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"cold_desert"}, + })]] + + -- Desert sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 39, + y_min = 3, + noise_params = { + offset = 21, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Blob ore. + -- These before scatter ores to avoid other ores in blobs. + + -- Clay + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -15, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Silver sand + + minetest.register_ore({ + ore_type = "blob", + ore = "default:silver_sand", + wherein = {"default:stone"}, + clust_scarcity = 30 * 30 * 30, + clust_size = 5, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Dirt + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 36 * 36 * 36, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + -- Only where default:dirt is present as surface material + biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", + "deciduous_forest", "deciduous_forest_shore", "rainforest", + "rainforest_swamp"} + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 20 * 20 * 20, + clust_size = 5, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) + + -- Scatter ores + + -- Coal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 8, + clust_size = 3, + y_max = 64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 30, + clust_size = 5, + y_max = -128, + y_min = -31000, + }) + + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 29, + clust_size = 5, + y_max = -256, + y_min = -31000, + }) + + -- Gold + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -256, + y_min = -511, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -512, + y_min = -31000, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_max = -512, + y_min = -1023, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = -1024, + y_min = -31000, + }) + + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_max = -1024, + y_min = -2047, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = -2048, + y_min = -31000, + }) + + -- Mese block + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = -2048, + y_min = -4095, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 28 * 28 * 28, + clust_num_ores = 5, + clust_size = 3, + y_max = -4096, + y_min = -31000, + }) +end + + +-- +-- Register biomes +-- + +-- All mapgens except mgv6 + +function default.register_biomes() + + -- Icesheet + + minetest.register_biome({ + name = "icesheet", + node_dust = "default:snowblock", + node_top = "default:snowblock", + depth_top = 1, + node_filler = "default:snowblock", + depth_filler = 3, + node_stone = "default:cave_ice", + node_water_top = "default:ice", + depth_water_top = 10, + node_river_water = "default:ice", + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:ice", + node_dungeon_stair = "stairs:stair_ice", + y_max = 31000, + y_min = -8, + heat_point = 0, + humidity_point = 73, + }) + + minetest.register_biome({ + name = "icesheet_ocean", + node_dust = "default:snowblock", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_water_top = "default:ice", + depth_water_top = 10, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -9, + y_min = -255, + heat_point = 0, + humidity_point = 73, + }) + + minetest.register_biome({ + name = "icesheet_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 0, + humidity_point = 73, + }) + + -- Tundra + + minetest.register_biome({ + name = "tundra_highland", + node_dust = "default:snow", + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 47, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra", + node_top = "default:permafrost_with_stones", + depth_top = 1, + node_filler = "default:permafrost", + depth_filler = 1, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 4, + y_max = 46, + y_min = 2, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_beach", + node_top = "default:gravel", + depth_top = 1, + node_filler = "default:gravel", + depth_filler = 2, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 1, + y_min = -3, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -4, + y_min = -255, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 0, + humidity_point = 40, + }) + + -- Taiga + + minetest.register_biome({ + name = "taiga", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 25, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "taiga_ocean", + node_dust = "default:snow", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 25, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "taiga_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 25, + humidity_point = 70, + }) + + -- Snowy grassland + + minetest.register_biome({ + name = "snowy_grassland", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 20, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "snowy_grassland_ocean", + node_dust = "default:snow", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 20, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "snowy_grassland_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 20, + humidity_point = 35, + }) + + -- Grassland + + minetest.register_biome({ + name = "grassland", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 50, + humidity_point = 35, + }) + + -- Coniferous forest + + minetest.register_biome({ + name = "coniferous_forest", + node_top = "default:dirt_with_coniferous_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 45, + humidity_point = 70, + }) + + -- Deciduous forest + + minetest.register_biome({ + name = "deciduous_forest", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_shore", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 60, + humidity_point = 68, + }) + + -- Desert + + minetest.register_biome({ + name = "desert", + node_top = "default:desert_sand", + depth_top = 1, + node_filler = "default:desert_sand", + depth_filler = 1, + node_stone = "default:desert_stone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:desert_stone", + node_dungeon_stair = "stairs:stair_desert_stone", + y_max = 31000, + y_min = 4, + heat_point = 92, + humidity_point = 16, + }) + + minetest.register_biome({ + name = "desert_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:desert_stone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:desert_stone", + node_dungeon_stair = "stairs:stair_desert_stone", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 92, + humidity_point = 16, + }) + + minetest.register_biome({ + name = "desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 92, + humidity_point = 16, + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "sandstone_desert", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone_block", + y_max = 31000, + y_min = 4, + heat_point = 60, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "sandstone_desert_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:sandstone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone_block", + y_max = 3, + y_min = -255, + heat_point = 60, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "sandstone_desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 60, + humidity_point = 0, + }) + + -- Cold desert + + minetest.register_biome({ + name = "cold_desert", + node_top = "default:silver_sand", + depth_top = 1, + node_filler = "default:silver_sand", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 40, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "cold_desert_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 40, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "cold_desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 40, + humidity_point = 0, + }) + + -- Savanna + + minetest.register_biome({ + name = "savanna", + node_top = "default:dry_dirt_with_dry_grass", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_shore", + node_top = "default:dry_dirt", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 89, + humidity_point = 42, + }) + + -- Rainforest + + minetest.register_biome({ + name = "rainforest", + node_top = "default:dirt_with_rainforest_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_swamp", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 86, + humidity_point = 65, + }) +end + + +-- +-- Register decorations +-- + +-- Mgv6 + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + name = "default:papyrus", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 100, y = 100, z = 100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_max = 1, + y_min = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + name = "default:cactus", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Long grasses + + for length = 1, 5 do + minetest.register_decoration({ + name = "default:grass_"..length, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + name = "default:dry_shrub", + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:dry_shrub", + param2 = 4, + }) +end + + +-- All mapgens except mgv6 + +local function register_grass_decoration(offset, scale, length) + minetest.register_decoration({ + name = "default:grass_" .. length, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + decoration = "default:grass_" .. length, + }) +end + +local function register_dry_grass_decoration(offset, scale, length) + minetest.register_decoration({ + name = "default:dry_grass_" .. length, + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "default:dry_grass_" .. length, + }) +end + +local function register_fern_decoration(seed, length) + minetest.register_decoration({ + name = "default:fern_" .. length, + deco_type = "simple", + place_on = {"default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.7 + }, + biomes = {"coniferous_forest"}, + y_max = 31000, + y_min = 6, + decoration = "default:fern_" .. length, + }) +end + + +function default.register_decorations() + -- Savanna bare dirt patches. + -- Must come before all savanna decorations that are placed on dry grass. + -- Noise is similar to long dry grass noise, but scale inverted, to appear + -- where long dry grass is least dense and shortest. + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 4, + noise_params = { + offset = -1.5, + scale = -1.5, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 4, + persist = 1.0 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "default:dry_dirt", + place_offset_y = -1, + flags = "force_placement", + }) + + -- Apple tree and log + + minetest.register_decoration({ + name = "default:apple_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.024, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "default:apple_log", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, + }) + + -- Emergent jungle tree + -- Due to 32 node height, altitude is limited and prescence depends on chunksize + + local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + if chunksize >= 5 then + minetest.register_decoration({ + name = "default:emergent_jungle_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + noise_params = { + offset = 0.0, + scale = 0.0025, + spread = {x = 250, y = 250, z = 250}, + seed = 2685, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest"}, + y_max = 32, + y_min = 1, + schematic = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + place_offset_y = -4, + }) + end + + -- Jungle tree and log + + minetest.register_decoration({ + name = "default:jungle_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Swamp jungle trees + + minetest.register_decoration({ + name = "default:jungle_tree(swamp)", + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + -- Noise tuned to place swamp trees where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = {"rainforest_swamp"}, + y_max = 0, + y_min = -1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "default:jungle_log", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 8, + }) + + -- Taiga and temperate coniferous forest pine tree, small pine tree and log + + minetest.register_decoration({ + name = "default:pine_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0.010, + scale = 0.048, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:small_pine_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0.010, + scale = -0.048, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:pine_log", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0018, + biomes = {"taiga", "coniferous_forest"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + num_spawn_by = 8, + }) + + -- Acacia tree and log + + minetest.register_decoration({ + name = "default:acacia_tree", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "default:acacia_log", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dry_dirt_with_dry_grass", + num_spawn_by = 8, + }) + + -- Aspen tree and log + + minetest.register_decoration({ + name = "default:aspen_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:aspen_log", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.0008, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, + }) + + -- Large cactus + + minetest.register_decoration({ + name = "default:large_cactus", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = {x = 200, y = 200, z = 200}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Cactus + + minetest.register_decoration({ + name = "default:cactus", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = {x = 200, y = 200, z = 200}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert"}, + y_max = 31000, + y_min = 4, + decoration = "default:cactus", + height = 2, + height_max = 5, + }) + + -- Papyrus + + -- Dirt version for rainforest swamp + + minetest.register_decoration({ + name = "default:papyrus_on_dirt", + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest_swamp"}, + y_max = 0, + y_min = 0, + schematic = minetest.get_modpath("default") .. "/schematics/papyrus_on_dirt.mts", + }) + + -- Dry dirt version for savanna shore + + minetest.register_decoration({ + name = "default:papyrus_on_dry_dirt", + deco_type = "schematic", + place_on = {"default:dry_dirt"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + biomes = {"savanna_shore"}, + y_max = 0, + y_min = 0, + schematic = minetest.get_modpath("default") .. + "/schematics/papyrus_on_dry_dirt.mts", + }) + + -- Bush + + minetest.register_decoration({ + name = "default:bush", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Blueberry bush + + minetest.register_decoration({ + name = "default:blueberry_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland", "snowy_grassland"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = minetest.get_modpath("default") .. "/schematics/blueberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Acacia bush + + minetest.register_decoration({ + name = "default:acacia_bush", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 90155, + octaves = 3, + persist = 0.7, + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Pine bush + + minetest.register_decoration({ + name = "default:pine_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"taiga", "snowy_grassland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Grasses + + register_grass_decoration(-0.03, 0.09, 5) + register_grass_decoration(-0.015, 0.075, 4) + register_grass_decoration(0, 0.06, 3) + register_grass_decoration(0.015, 0.045, 2) + register_grass_decoration(0.03, 0.03, 1) + + -- Dry grasses + + register_dry_grass_decoration(0.01, 0.05, 5) + register_dry_grass_decoration(0.03, 0.03, 4) + register_dry_grass_decoration(0.05, 0.01, 3) + register_dry_grass_decoration(0.07, -0.01, 2) + register_dry_grass_decoration(0.09, -0.03, 1) + + -- Ferns + + register_fern_decoration(14936, 3) + register_fern_decoration(801, 2) + register_fern_decoration(5, 1) + + -- Junglegrass + + minetest.register_decoration({ + name = "default:junglegrass", + deco_type = "simple", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "default:junglegrass", + }) + + -- Dry shrub + + minetest.register_decoration({ + name = "default:dry_shrub", + deco_type = "simple", + place_on = {"default:desert_sand", + "default:sand", "default:silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert", "sandstone_desert", "cold_desert"}, + y_max = 31000, + y_min = 2, + decoration = "default:dry_shrub", + param2 = 4, + }) + + -- Marram grass + + minetest.register_decoration({ + name = "default:marram_grass", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 4, + noise_params = { + offset = -0.7, + scale = 4.0, + spread = {x = 16, y = 16, z = 16}, + seed = 513337, + octaves = 1, + persist = 0.0, + flags = "absvalue, eased" + }, + biomes = {"coniferous_forest_dunes", "grassland_dunes"}, + y_max = 6, + y_min = 4, + decoration = { + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + }, + }) + + -- Tundra moss + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:permafrost_with_stones"}, + sidelen = 4, + noise_params = { + offset = -0.8, + scale = 2.0, + spread = {x = 100, y = 100, z = 100}, + seed = 53995, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra"}, + y_max = 50, + y_min = 2, + decoration = "default:permafrost_with_moss", + place_offset_y = -1, + flags = "force_placement", + }) + + -- Tundra patchy snow + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:stone", + "default:gravel" + }, + sidelen = 4, + noise_params = { + offset = 0, + scale = 1.0, + spread = {x = 100, y = 100, z = 100}, + seed = 172555, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra", "tundra_beach"}, + y_max = 50, + y_min = 1, + decoration = "default:snow", + }) + + -- Coral reef + + minetest.register_decoration({ + name = "default:corals", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = {x = 50, y = 50, z = 50}, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { + "desert_ocean", + "savanna_ocean", + "rainforest_ocean", + }, + y_max = -2, + y_min = -8, + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton", + }, + }) + + -- Kelp + + minetest.register_decoration({ + name = "default:kelp", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = { + "taiga_ocean", + "snowy_grassland_ocean", + "grassland_ocean", + "coniferous_forest_ocean", + "deciduous_forest_ocean", + "sandstone_desert_ocean", + "cold_desert_ocean"}, + y_max = -5, + y_min = -10, + flags = "force_placement", + decoration = "default:sand_with_kelp", + param2 = 48, + param2_max = 96, + }) +end + + +-- +-- Detect mapgen to select functions +-- + + +local mg_name = minetest.get_mapgen_setting("mg_name") + +if mg_name == "v6" then + default.register_mgv6_ores() + default.register_mgv6_decorations() +else + default.register_ores() +end diff --git a/mods/minetest_game/default/mod.conf b/mods/minetest_game/default/mod.conf new file mode 100644 index 00000000..017c64ab --- /dev/null +++ b/mods/minetest_game/default/mod.conf @@ -0,0 +1,3 @@ +name = default +description = Minetest Game mod: default +optional_depends = player_api, asuna_core diff --git a/mods/minetest_game/default/models/chest_open.obj b/mods/minetest_game/default/models/chest_open.obj new file mode 100644 index 00000000..72ba175a --- /dev/null +++ b/mods/minetest_game/default/models/chest_open.obj @@ -0,0 +1,79 @@ +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' +# www.blender.org +o Top_Cube.002_None_Top_Cube.002_None_bottom +v -0.500000 0.408471 0.720970 +v -0.500000 1.115578 0.013863 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 +v 0.500000 1.115578 0.013863 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top +s off +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/mods/minetest_game/default/models/torch_ceiling.obj b/mods/minetest_game/default/models/torch_ceiling.obj new file mode 100644 index 00000000..5df8597c --- /dev/null +++ b/mods/minetest_game/default/models/torch_ceiling.obj @@ -0,0 +1,53 @@ +# Blender v2.77 (sub 0) OBJ File: 'torch_ceiling.blend' +# www.blender.org +v -0.062469 -0.047331 0.068152 +v -0.062469 -0.559515 -0.164388 +v -0.062469 0.004344 -0.045667 +v -0.062469 -0.507839 -0.278206 +v 0.062531 -0.047331 0.068152 +v 0.062531 -0.559515 -0.164388 +v 0.062531 0.004344 -0.045667 +v 0.062531 -0.507839 -0.278206 +v 0.353584 0.040000 0.363553 +v 0.353584 -0.397500 0.363553 +v -0.353522 0.040000 -0.343553 +v -0.353522 -0.397500 -0.343553 +v 0.353584 0.040000 -0.343553 +v -0.353522 0.040000 0.363553 +v 0.353584 -0.397500 -0.343553 +v -0.353522 -0.397500 0.363553 +vt 0.5625 0.5000 +vt 0.5625 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.5000 +vt 0.4375 0.0000 +vt 0.5625 0.0000 +vt 0.5625 0.1250 +vt 0.4375 0.1250 +vt 0.5625 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.0000 +vt 0.5625 0.6250 +vt 0.5625 0.0000 +vt 1.0000 0.5625 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5625 +vt 0.0000 0.5625 +vt 1.0000 0.5625 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 0.9105 0.4134 +vn -0.0000 -0.4134 0.9105 +vn -1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/9/2 4/6/2 8/5/2 7/10/2 +f 1/11/3 3/9/3 4/6/3 2/12/3 +f 5/13/2 1/11/2 2/12/2 6/14/2 +f 7/10/3 8/5/3 6/14/3 5/13/3 +f 9/15/4 10/16/4 12/17/4 11/18/4 +f 13/19/5 14/20/5 16/21/5 15/22/5 diff --git a/mods/minetest_game/default/models/torch_floor.obj b/mods/minetest_game/default/models/torch_floor.obj new file mode 100644 index 00000000..dfd25e8f --- /dev/null +++ b/mods/minetest_game/default/models/torch_floor.obj @@ -0,0 +1,43 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_floor.blend' +# www.blender.org +v 0.062500 0.062500 -0.062500 +v 0.062500 -0.500000 -0.062500 +v 0.062500 0.062500 0.062500 +v 0.062500 -0.500000 0.062500 +v -0.062500 0.062500 -0.062500 +v -0.062500 -0.500000 -0.062500 +v -0.062500 0.062500 0.062500 +v -0.062500 -0.500000 0.062500 +v -0.353553 -0.500000 0.353553 +v -0.353553 0.500000 0.353553 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.500000 -0.353553 +v -0.353553 -0.500000 -0.353553 +v 0.353553 -0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.000000 -0.707100 +vn -0.707100 -0.000000 0.707100 +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 13/12/5 14/9/5 16/10/5 15/11/5 diff --git a/mods/minetest_game/default/models/torch_wall.obj b/mods/minetest_game/default/models/torch_wall.obj new file mode 100644 index 00000000..6de4b131 --- /dev/null +++ b/mods/minetest_game/default/models/torch_wall.obj @@ -0,0 +1,57 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_wall.blend' +# www.blender.org +v 0.062469 -0.195248 0.023570 +v 0.062469 -0.476498 -0.463570 +v 0.062469 -0.303502 0.086070 +v 0.062469 -0.584752 -0.401070 +v -0.062531 -0.195248 0.023570 +v -0.062531 -0.476498 -0.463570 +v -0.062531 -0.303502 0.086070 +v -0.062531 -0.584752 -0.401070 +v -0.353584 -0.613553 0.022500 +v -0.353584 -0.613553 0.460000 +v 0.353522 0.093553 0.022500 +v 0.353522 0.093553 0.460000 +v -0.353584 0.093553 0.022500 +v 0.353522 -0.613553 0.022500 +v -0.353584 0.093553 0.460000 +v 0.353522 -0.613553 0.460000 +v 0.353553 0.056811 -0.121957 +v 0.353553 -0.224439 -0.609096 +v -0.353553 -0.555561 0.231596 +v -0.353553 -0.836811 -0.255543 +v -0.353553 0.056811 -0.121957 +v -0.353553 -0.224439 -0.609096 +v 0.353553 -0.555561 0.231596 +v 0.353553 -0.836811 -0.255543 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.562500 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn -0.000000 0.500000 0.866000 +vn -0.000000 0.866000 -0.500000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.612400 -0.353600 +vn -0.707100 -0.612400 0.353600 +vn -0.707100 0.707100 -0.000000 +vn -0.707100 -0.707100 -0.000000 +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +f 17/9/4 18/10/4 20/11/4 19/12/4 +f 21/9/5 22/10/5 24/11/5 23/12/5 +f 9/12/6 10/13/6 12/14/6 11/9/6 +f 13/9/7 14/12/7 16/13/7 15/14/7 diff --git a/mods/minetest_game/default/nodes.lua b/mods/minetest_game/default/nodes.lua new file mode 100644 index 00000000..d3ecd5c0 --- /dev/null +++ b/mods/minetest_game/default/nodes.lua @@ -0,0 +1,2957 @@ +-- mods/default/nodes.lua + +-- support for MT game translation. +local S = default.get_translator + +--[[ Node name convention: + +Although many node names are in combined-word form, the required form for new +node names is words separated by underscores. If both forms are used in written +language (for example pinewood and pine wood) the underscore form should be used. + +--]] + + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant 4. Modified forms) + +default:stone +default:cobble +default:stonebrick +default:stone_block +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick +default:desert_stone_block + +default:sandstone +default:sandstonebrick +default:sandstone_block +default:desert_sandstone +default:desert_sandstone_brick +default:desert_sandstone_block +default:silver_sandstone +default:silver_sandstone_brick +default:silver_sandstone_block + +default:obsidian +default:obsidianbrick +default:obsidian_block + +Soft / Non-Stone +---------------- +(1. Material 2. Modified forms) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_dry_grass +default:dirt_with_snow +default:dirt_with_rainforest_litter +default:dirt_with_coniferous_litter +default:dry_dirt +default:dry_dirt_with_dry_grass + +default:permafrost +default:permafrost_with_stones +default:permafrost_with_moss + +default:sand +default:desert_sand +default:silver_sand + +default:gravel + +default:clay + +default:snow +default:snowblock +default:ice +default:cave_ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling +default:emergent_jungle_sapling + +default:pine_tree +default:pine_wood +default:pine_needles +default:pine_sapling + +default:acacia_tree +default:acacia_wood +default:acacia_leaves +default:acacia_sapling + +default:aspen_tree +default:aspen_wood +default:aspen_leaves +default:aspen_sapling + +Ores +---- +(1. In stone 2. Blocks) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock + +default:stone_with_tin +default:tinblock + +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife +--------- + +default:cactus +default:large_cactus_seedling + +default:papyrus +default:dry_shrub +default:junglegrass + +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +default:dry_grass_1 +default:dry_grass_2 +default:dry_grass_3 +default:dry_grass_4 +default:dry_grass_5 + +default:fern_1 +default:fern_2 +default:fern_3 + +default:marram_grass_1 +default:marram_grass_2 +default:marram_grass_3 + +default:bush_stem +default:bush_leaves +default:bush_sapling +default:acacia_bush_stem +default:acacia_bush_leaves +default:acacia_bush_sapling +default:pine_bush_stem +default:pine_bush_needles +default:pine_bush_sapling +default:blueberry_bush_leaves_with_berries +default:blueberry_bush_leaves +default:blueberry_bush_sapling + +default:sand_with_kelp + +Corals +------ + +default:coral_green +default:coral_pink +default:coral_cyan +default:coral_brown +default:coral_orange +default:coral_skeleton + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- + +default:bookshelf + +default:sign_wall_wood +default:sign_wall_steel + +default:ladder_wood +default:ladder_steel + +default:fence_wood +default:fence_acacia_wood +default:fence_junglewood +default:fence_pine_wood +default:fence_aspen_wood + +default:fence_rail_wood +default:fence_rail_acacia_wood +default:fence_rail_junglewood +default:fence_rail_pine_wood +default:fence_rail_aspen_wood + +default:glass +default:obsidian_glass + +default:brick + +default:meselamp +default:mese_post_light +default:mese_post_light_acacia_wood +default:mese_post_light_junglewood +default:mese_post_light_pine_wood +default:mese_post_light_aspen_wood + +Misc +---- + +default:cloud + +--]] + +-- Required wrapper to allow customization of default.after_place_leaves +local function after_place_leaves(...) + return default.after_place_leaves(...) +end + +-- Required wrapper to allow customization of default.grow_sapling +local function grow_sapling(...) + return default.grow_sapling(...) +end + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = S("Stone"), + tiles = {"default_stone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "default:cobble", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = S("Cobblestone"), + tiles = {"default_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = S("Stone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_stone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_block", { + description = S("Stone Block"), + tiles = {"default_stone_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = S("Mossy Cobblestone"), + tiles = {"default_mossycobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:desert_stone", { + description = S("Desert Stone"), + tiles = {"default_desert_stone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "default:desert_cobble", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = S("Desert Cobblestone"), + tiles = {"default_desert_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = S("Desert Stone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_desert_stone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stone_block", { + description = S("Desert Stone Block"), + tiles = {"default_desert_stone_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstone", { + description = S("Sandstone"), + tiles = {"default_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = S("Sandstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstone_block", { + description = S("Sandstone Block"), + tiles = {"default_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone", { + description = S("Desert Sandstone"), + tiles = {"default_desert_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone_brick", { + description = S("Desert Sandstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_desert_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone_block", { + description = S("Desert Sandstone Block"), + tiles = {"default_desert_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone", { + description = S("Silver Sandstone"), + tiles = {"default_silver_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone_brick", { + description = S("Silver Sandstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_silver_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone_block", { + description = S("Silver Sandstone Block"), + tiles = {"default_silver_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:obsidian", { + description = S("Obsidian"), + tiles = {"default_obsidian.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = S("Obsidian Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_obsidian_brick.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +minetest.register_node("default:obsidian_block", { + description = S("Obsidian Block"), + tiles = {"default_obsidian_block.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = S("Dirt"), + tiles = {"default_dirt.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = S("Dirt with Grass"), + tiles = {"default_grass.png", "default_dirt.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = S("Dirt with Grass and Footsteps"), + tiles = {"default_grass.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:dirt_with_dry_grass", { + description = S("Dirt with Savanna Grass"), + tiles = {"default_dry_grass.png", + "default_dirt.png", + {name = "default_dirt.png^default_dry_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = S("Dirt with Snow"), + tiles = {"default_snow.png", "default_dirt.png", + {name = "default_dirt.png^default_snow_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.2}, + }), +}) + +minetest.register_node("default:dirt_with_rainforest_litter", { + description = S("Dirt with Rainforest Litter"), + tiles = { + "default_rainforest_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_rainforest_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dirt_with_coniferous_litter", { + description = S("Dirt with Coniferous Litter"), + tiles = { + "default_coniferous_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_coniferous_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dry_dirt", { + description = S("Savanna Dirt"), + tiles = {"default_dry_dirt.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dry_dirt_with_dry_grass", { + description = S("Savanna Dirt with Savanna Grass"), + tiles = {"default_dry_grass.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^default_dry_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:permafrost", { + description = S("Permafrost"), + tiles = {"default_permafrost.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:permafrost_with_stones", { + description = S("Permafrost with Stones"), + tiles = {"default_permafrost.png^default_stones.png", + "default_permafrost.png", + "default_permafrost.png^default_stones_side.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_gravel_defaults(), +}) + +minetest.register_node("default:permafrost_with_moss", { + description = S("Permafrost with Moss"), + tiles = {"default_moss.png", "default_permafrost.png", + {name = "default_permafrost.png^default_moss_side.png", + tileable_vertical = false}}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:sand", { + description = S("Sand"), + tiles = {"default_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = S("Desert Sand"), + tiles = {"default_desert_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:silver_sand", { + description = S("Silver Sand"), + tiles = {"default_silver_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + + +minetest.register_node("default:gravel", { + description = S("Gravel"), + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1}, + sounds = default.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + {items = {"default:flint"}, rarity = 16}, + {items = {"default:gravel"}} + } + } +}) + +minetest.register_node("default:clay", { + description = S("Clay"), + tiles = {"default_clay.png"}, + groups = {crumbly = 3}, + drop = "default:clay_lump 4", + sounds = default.node_sound_dirt_defaults(), +}) + + +minetest.register_node("default:snow", { + description = S("Snow"), + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + paramtype = "light", + buildable_to = true, + floodable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1, snowy = 1}, + sounds = default.node_sound_snow_defaults(), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + +minetest.register_node("default:snowblock", { + description = S("Snow Block"), + tiles = {"default_snow.png"}, + groups = {crumbly = 3, cools_lava = 1, snowy = 1}, + sounds = default.node_sound_snow_defaults(), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + +-- 'is ground content = false' to avoid tunnels in sea ice or ice rivers +minetest.register_node("default:ice", { + description = S("Ice"), + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +minetest.register_node("default:cave_ice", { + description = S("Cave Ice"), + tiles = {"default_ice.png"}, + paramtype = "light", + groups = {cracky = 3, cools_lava = 1, slippery = 3, + not_in_creative_inventory = 1}, + drop = "default:ice", + sounds = default.node_sound_ice_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = S("Apple Tree"), + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = S("Apple Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = S("Apple Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:leaves", { + description = S("Apple Tree Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_leaves.png"}, + special_tiles = {"default_leaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = S("Apple"), + drawtype = "plantlike", + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + minetest.set_node(pos, {name = "default:apple", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, {name = "default:apple_mark"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +minetest.register_node("default:apple_mark", { + description = S("Apple Marker"), + inventory_image = "default_apple.png^default_invisible_node_overlay.png", + wield_image = "default_apple.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, "default:leaves") then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:apple"}) + end + end +}) + + +minetest.register_node("default:jungletree", { + description = S("Jungle Tree"), + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", + "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = S("Jungle Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_junglewood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = S("Jungle Tree Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_jungleleaves.png"}, + special_tiles = {"default_jungleleaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:junglesapling"}, rarity = 20}, + {items = {"default:jungleleaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = S("Jungle Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:junglesapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 15, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:emergent_jungle_sapling", { + description = S("Emergent Jungle Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_emergent_jungle_sapling.png"}, + inventory_image = "default_emergent_jungle_sapling.png", + wield_image = "default_emergent_jungle_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:emergent_jungle_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -3, y = -5, z = -3}, + {x = 3, y = 31, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + + +minetest.register_node("default:pine_tree", { + description = S("Pine Tree"), + tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", + "default_pine_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pine_wood", { + description = S("Pine Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_pine_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = S("Pine Needles"), + drawtype = "allfaces_optional", + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_sapling"}, rarity = 20}, + {items = {"default:pine_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = S("Pine Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 14, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + + +minetest.register_node("default:acacia_tree", { + description = S("Acacia Tree"), + tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png", + "default_acacia_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:acacia_wood", { + description = S("Acacia Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_acacia_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:acacia_leaves", { + description = S("Acacia Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_acacia_leaves.png"}, + special_tiles = {"default_acacia_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_sapling"}, rarity = 20}, + {items = {"default:acacia_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:acacia_sapling", { + description = S("Acacia Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_acacia_sapling.png"}, + inventory_image = "default_acacia_sapling.png", + wield_image = "default_acacia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -4, y = 1, z = -4}, + {x = 4, y = 7, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:aspen_tree", { + description = S("Aspen Tree"), + tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png", + "default_aspen_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:aspen_wood", { + description = S("Aspen Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_aspen_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:aspen_leaves", { + description = S("Aspen Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_aspen_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:aspen_sapling"}, rarity = 20}, + {items = {"default:aspen_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:aspen_sapling", { + description = S("Aspen Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_aspen_sapling.png"}, + inventory_image = "default_aspen_sapling.png", + wield_image = "default_aspen_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:aspen_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 12, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = S("Coal Ore"), + tiles = {"default_stone.png^default_mineral_coal.png"}, + groups = {cracky = 3}, + drop = "default:coal_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = S("Coal Block"), + tiles = {"default_coal_block.png"}, + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:stone_with_iron", { + description = S("Iron Ore"), + tiles = {"default_stone.png^default_mineral_iron.png"}, + groups = {cracky = 2}, + drop = "default:iron_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = S("Steel Block"), + tiles = {"default_steel_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_copper", { + description = S("Copper Ore"), + tiles = {"default_stone.png^default_mineral_copper.png"}, + groups = {cracky = 2}, + drop = "default:copper_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = S("Copper Block"), + tiles = {"default_copper_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_tin", { + description = S("Tin Ore"), + tiles = {"default_stone.png^default_mineral_tin.png"}, + groups = {cracky = 2}, + drop = "default:tin_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:tinblock", { + description = S("Tin Block"), + tiles = {"default_tin_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:bronzeblock", { + description = S("Bronze Block"), + tiles = {"default_bronze_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_mese", { + description = S("Mese Ore"), + tiles = {"default_stone.png^default_mineral_mese.png"}, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mese", { + description = S("Mese Block"), + tiles = {"default_mese_block.png"}, + paramtype = "light", + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 3, +}) + + +minetest.register_node("default:stone_with_gold", { + description = S("Gold Ore"), + tiles = {"default_stone.png^default_mineral_gold.png"}, + groups = {cracky = 2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = S("Gold Block"), + tiles = {"default_gold_block.png"}, + is_ground_content = false, + groups = {cracky = 1}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_diamond", { + description = S("Diamond Ore"), + tiles = {"default_stone.png^default_mineral_diamond.png"}, + groups = {cracky = 1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = S("Diamond Block"), + tiles = {"default_diamond_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = S("Cactus"), + tiles = {"default_cactus_top.png", "default_cactus_top.png", + "default_cactus_side.png"}, + paramtype2 = "facedir", + groups = {choppy = 3}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +minetest.register_node("default:large_cactus_seedling", { + description = S("Large Cactus Seedling"), + drawtype = "plantlike", + tiles = {"default_large_cactus_seedling.png"}, + inventory_image = "default_large_cactus_seedling.png", + wield_image = "default_large_cactus_seedling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { + -5 / 16, -0.5, -5 / 16, + 5 / 16, 0.5, 5 / 16 + } + }, + groups = {choppy = 3, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_wood_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:large_cactus_seedling", + {x = -2, y = -1, z = -2}, + {x = 2, y = 5, z = 2}, + 4) + + return itemstack + end, + + on_construct = function(pos) + -- Normal cactus farming adds 1 cactus node by ABM, + -- interval 12s, chance 83. + -- Consider starting with 5 cactus nodes. We make sure that growing a + -- large cactus is not a faster way to produce new cactus nodes. + -- Confirmed by experiment, when farming 5 cacti, on average 1 new + -- cactus node is added on average every + -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s. + -- Large cactus contains on average 14 cactus nodes. + -- 14 * 199.2 = 2788.8s. + -- Set random range to average to 2789s. + minetest.get_node_timer(pos):start(math.random(1859, 3719)) + end, + + on_timer = function(pos) + local node_under = minetest.get_node_or_nil( + {x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + -- Node under not yet loaded, try later + minetest.get_node_timer(pos):start(300) + return + end + + if minetest.get_item_group(node_under.name, "sand") == 0 then + -- Seedling dies + minetest.remove_node(pos) + return + end + + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + -- Too dark for growth, try later in case it's night + minetest.get_node_timer(pos):start(300) + return + end + + minetest.log("action", "A large cactus seedling grows into a large" .. + "cactus at ".. minetest.pos_to_string(pos)) + default.grow_large_cactus(pos) + end, +}) + +minetest.register_node("default:papyrus", { + description = S("Papyrus"), + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = S("Dry Shrub"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = S("Jungle Grass"), + drawtype = "plantlike", + waving = 1, + visual_scale = 1.69, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, junglegrass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, +}) + + +minetest.register_node("default:grass_1", { + description = S("Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_" .. math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + minetest.register_node("default:grass_" .. i, { + description = S("Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_" .. i .. ".png"}, + inventory_image = "default_grass_" .. i .. ".png", + wield_image = "default_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "default:grass_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:dry_grass_1", { + description = S("Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_1.png"}, + inventory_image = "default_dry_grass_3.png", + wield_image = "default_dry_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, + attached_node = 1, grass = 1, dry_grass = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random dry grass node + local stack = ItemStack("default:dry_grass_" .. math.random(1, 5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:dry_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + minetest.register_node("default:dry_grass_" .. i, { + description = S("Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_" .. i .. ".png"}, + inventory_image = "default_dry_grass_" .. i .. ".png", + wield_image = "default_dry_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, dry_grass = 1}, + drop = "default:dry_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:fern_1", { + description = S("Fern"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_fern_1.png"}, + inventory_image = "default_fern_1.png", + wield_image = "default_fern_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, + fern = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random fern node + local stack = ItemStack("default:fern_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:fern_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:fern_" .. i, { + description = S("Fern"), + drawtype = "plantlike", + waving = 1, + visual_scale = 2, + tiles = {"default_fern_" .. i .. ".png"}, + inventory_image = "default_fern_" .. i .. ".png", + wield_image = "default_fern_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + grass = 1, fern = 1, not_in_creative_inventory = 1}, + drop = "default:fern_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:marram_grass_1", { + description = S("Marram Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_1.png"}, + inventory_image = "default_marram_grass_1.png", + wield_image = "default_marram_grass_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, marram_grass = 1, + attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random marram grass node + local stack = ItemStack("default:marram_grass_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:marram_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:marram_grass_" .. i, { + description = S("Marram Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_" .. i .. ".png"}, + inventory_image = "default_marram_grass_" .. i .. ".png", + wield_image = "default_marram_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + grass = 1, marram_grass = 1, not_in_creative_inventory = 1}, + drop = "default:marram_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:bush_stem", { + description = S("Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_bush_stem.png"}, + inventory_image = "default_bush_stem.png", + wield_image = "default_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:bush_leaves", { + description = S("Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_leaves_simple.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:bush_sapling"}, rarity = 5}, + {items = {"default:bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:bush_sapling", { + description = S("Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_bush_sapling.png"}, + inventory_image = "default_bush_sapling.png", + wield_image = "default_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:blueberry_bush_leaves_with_berries", { + description = S("Blueberry Bush Leaves with Berries"), + drawtype = "allfaces_optional", + tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + drop = "default:blueberries", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "default:blueberry_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:blueberry_bush_leaves"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, +}) + +minetest.register_node("default:blueberry_bush_leaves", { + description = S("Blueberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_blueberry_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:blueberry_bush_sapling"}, rarity = 5}, + {items = {"default:blueberry_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"}) + end + end, + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:blueberry_bush_sapling", { + description = S("Blueberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_blueberry_bush_sapling.png"}, + inventory_image = "default_blueberry_bush_sapling.png", + wield_image = "default_blueberry_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:blueberry_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:acacia_bush_stem", { + description = S("Acacia Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_acacia_bush_stem.png"}, + inventory_image = "default_acacia_bush_stem.png", + wield_image = "default_acacia_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:acacia_bush_leaves", { + description = S("Acacia Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_acacia_leaves_simple.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_bush_sapling"}, rarity = 5}, + {items = {"default:acacia_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:acacia_bush_sapling", { + description = S("Acacia Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_acacia_bush_sapling.png"}, + inventory_image = "default_acacia_bush_sapling.png", + wield_image = "default_acacia_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:pine_bush_stem", { + description = S("Pine Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_pine_bush_stem.png"}, + inventory_image = "default_pine_bush_stem.png", + wield_image = "default_pine_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:pine_bush_needles", { + description = S("Pine Bush Needles"), + drawtype = "allfaces_optional", + tiles = {"default_pine_needles.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_bush_sapling"}, rarity = 5}, + {items = {"default:pine_bush_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:pine_bush_sapling", { + description = S("Pine Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_pine_bush_sapling.png"}, + inventory_image = "default_pine_bush_sapling.png", + wield_image = "default_pine_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + +minetest.register_node("default:sand_with_kelp", { + description = S("Kelp"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, + inventory_image = "default_kelp.png", + wield_image = "default_kelp.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and not (placer and placer:is_player() + and placer:get_player_control().sneak) then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(4, 6) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "default:sand_with_kelp", + param2 = height * 16}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + + +-- +-- Corals +-- + +local function coral_on_place(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local player_name = placer and placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + local node_under = minetest.get_node(pos_under) + local def_under = minetest.registered_nodes[node_under.name] + + if def_under and def_under.on_rightclick and not ( + placer and placer:is_player() and placer:get_player_control().sneak) then + return def_under.on_rightclick(pos_under, node_under, + placer, itemstack, pointed_thing) + end + + if node_under.name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + node_under.name = itemstack:get_name() + minetest.set_node(pos_under, node_under) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack +end + +minetest.register_node("default:coral_green", { + description = S("Green Coral"), + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}}, + inventory_image = "default_coral_green.png", + wield_image = "default_coral_green.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = coral_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_pink", { + description = S("Pink Coral"), + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}}, + inventory_image = "default_coral_pink.png", + wield_image = "default_coral_pink.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = coral_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_cyan", { + description = S("Cyan Coral"), + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}}, + inventory_image = "default_coral_cyan.png", + wield_image = "default_coral_cyan.png", + groups = {snappy = 3, coral = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = coral_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_brown", { + description = S("Brown Coral"), + tiles = {"default_coral_brown.png"}, + groups = {cracky = 3, coral = 1}, + drop = "default:coral_skeleton", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coral_orange", { + description = S("Orange Coral"), + tiles = {"default_coral_orange.png"}, + groups = {cracky = 3, coral = 1}, + drop = "default:coral_skeleton", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coral_skeleton", { + description = S("Coral Skeleton"), + tiles = {"default_coral_skeleton.png"}, + groups = {cracky = 3, coral = 1}, + sounds = default.node_sound_stone_defaults(), +}) + + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = S("Water Source"), + drawtype = "liquid", + waving = 3, + tiles = { + { + name = "default_water_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "default_water_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("default:water_flowing", { + description = S("Flowing Water"), + drawtype = "flowingliquid", + waving = 3, + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + + +minetest.register_node("default:river_water_source", { + description = S("River Water Source"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "default_river_water_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + -- Not renewable to avoid horizontal spread of water sources in sloping + -- rivers that can cause water to overflow riverbanks and cause floods. + -- River water source is instead made renewable by the 'force renew' + -- option used in the 'bucket' mod by the river water bucket. + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("default:river_water_flowing", { + description = S("Flowing River Water"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + + +minetest.register_node("default:lava_source", { + description = S("Lava Source"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + { + name = "default_lava_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a = 191, r = 255, g = 64, b = 0}, + groups = {lava = 3, liquid = 2, igniter = 1}, +}) + +minetest.register_node("default:lava_flowing", { + description = S("Flowing Lava"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a = 191, r = 255, g = 64, b = 0}, + groups = {lava = 3, liquid = 2, igniter = 1, + not_in_creative_inventory = 1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +local bookshelf_formspec = + "size[8,7;]" .. + "list[context;books;0,0.3;8,2;]" .. + "list[current_player;main;0,2.85;8,1;]" .. + "list[current_player;main;0,4.08;8,3;8]" .. + "listring[context;books]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,2.85) + +local function update_bookshelf(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("books") + + local formspec = bookshelf_formspec + -- Inventory slots overlay + local bx, by = 0, 0.3 + local n_written, n_empty = 0, 0 + for i = 1, 16 do + if i == 9 then + bx = 0 + by = by + 1 + end + local stack = invlist[i] + if stack:is_empty() then + formspec = formspec .. + "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]" + else + local metatable = stack:get_meta():to_table() or {} + if metatable.fields and metatable.fields.text then + n_written = n_written + stack:get_count() + else + n_empty = n_empty + stack:get_count() + end + end + bx = bx + 1 + end + meta:set_string("formspec", formspec) + if n_written + n_empty == 0 then + meta:set_string("infotext", S("Empty Bookshelf")) + else + meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", n_written, n_empty)) + end +end + +local default_bookshelf_def = { + description = S("Bookshelf"), + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("books", 8 * 2) + update_bookshelf(pos) + end, + can_dig = function(pos,player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("books") + end, + allow_metadata_inventory_put = function(pos, listname, index, stack) + if minetest.get_item_group(stack:get_name(), "book") ~= 0 then + return stack:get_count() + end + return 0 + end, + on_metadata_inventory_put = function(pos) + update_bookshelf(pos) + end, + on_metadata_inventory_take = function(pos) + update_bookshelf(pos) + end, + on_metadata_inventory_move = function(pos) + update_bookshelf(pos) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "books", drops) + drops[#drops+1] = "default:bookshelf" + minetest.remove_node(pos) + return drops + end, +} +default.set_inventory_action_loggers(default_bookshelf_def, "bookshelf") +minetest.register_node("default:bookshelf", default_bookshelf_def) + +local function register_sign(material, desc, def) + minetest.register_node("default:sign_wall_" .. material, { + description = desc, + drawtype = "nodebox", + tiles = {"default_sign_wall_" .. material .. ".png"}, + inventory_image = "default_sign_" .. material .. ".png", + wield_image = "default_sign_" .. material .. ".png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + use_texture_alpha = "opaque", + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = def.groups, + legacy_wallmounted = true, + sounds = def.sounds, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + end, + on_receive_fields = function(pos, formname, fields, sender) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + local text = fields.text + if not text then + return + end + if #text > 512 then + minetest.chat_send_player(player_name, S("Text too long")) + return + end + text = text:gsub("[%z-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + default.log_player_action(sender, ("wrote %q to the sign at"):format(text), pos) + local meta = minetest.get_meta(pos) + meta:set_string("text", text) + + if #text > 0 then + meta:set_string("infotext", S('"@1"', text)) + else + meta:set_string("infotext", '') + end + end, + }) +end + +register_sign("wood", S("Wooden Sign"), { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3} +}) + +register_sign("steel", S("Steel Sign"), { + sounds = default.node_sound_metal_defaults(), + groups = {cracky = 2, attached_node = 1} +}) + +minetest.register_node("default:ladder_wood", { + description = S("Wooden Ladder"), + drawtype = "signlike", + tiles = {"default_ladder_wood.png"}, + inventory_image = "default_ladder_wood.png", + wield_image = "default_ladder_wood.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:ladder_steel", { + description = S("Steel Ladder"), + drawtype = "signlike", + tiles = {"default_ladder_steel.png"}, + inventory_image = "default_ladder_steel.png", + wield_image = "default_ladder_steel.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +default.register_fence("default:fence_wood", { + description = S("Apple Wood Fence"), + texture = "default_fence_wood.png", + inventory_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_acacia_wood", { + description = S("Acacia Wood Fence"), + texture = "default_fence_acacia_wood.png", + inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_junglewood", { + description = S("Jungle Wood Fence"), + texture = "default_fence_junglewood.png", + inventory_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_pine_wood", { + description = S("Pine Wood Fence"), + texture = "default_fence_pine_wood.png", + inventory_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_aspen_wood", { + description = S("Aspen Wood Fence"), + texture = "default_fence_aspen_wood.png", + inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_wood", { + description = S("Apple Wood Fence Rail"), + texture = "default_fence_rail_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_acacia_wood", { + description = S("Acacia Wood Fence Rail"), + texture = "default_fence_rail_acacia_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_junglewood", { + description = S("Jungle Wood Fence Rail"), + texture = "default_fence_rail_junglewood.png", + inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_pine_wood", { + description = S("Pine Wood Fence Rail"), + texture = "default_fence_rail_pine_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_aspen_wood", { + description = S("Aspen Wood Fence Rail"), + texture = "default_fence_rail_aspen_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_node("default:glass", { + description = S("Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + use_texture_alpha = "clip", -- only needed for stairs API + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = S("Obsidian Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, + use_texture_alpha = "clip", -- only needed for stairs API + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky = 3}, +}) + + +minetest.register_node("default:brick", { + description = S("Brick Block"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = { + "default_brick.png^[transformFX", + "default_brick.png", + }, + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = S("Mese Lamp"), + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +default.register_mesepost("default:mese_post_light", { + description = S("Apple Wood Mese Post Light"), + texture = "default_fence_wood.png", + material = "default:wood", +}) + +default.register_mesepost("default:mese_post_light_acacia_wood", { + description = S("Acacia Wood Mese Post Light"), + texture = "default_fence_acacia_wood.png", + material = "default:acacia_wood", +}) + +default.register_mesepost("default:mese_post_light_junglewood", { + description = S("Jungle Wood Mese Post Light"), + texture = "default_fence_junglewood.png", + material = "default:junglewood", +}) + +default.register_mesepost("default:mese_post_light_pine_wood", { + description = S("Pine Wood Mese Post Light"), + texture = "default_fence_pine_wood.png", + material = "default:pine_wood", +}) + +default.register_mesepost("default:mese_post_light_aspen_wood", { + description = S("Aspen Wood Mese Post Light"), + texture = "default_fence_aspen_wood.png", + material = "default:aspen_wood", +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = S("Cloud"), + tiles = {"default_cloud.png"}, + is_ground_content = false, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory = 1}, +}) + +-- +-- register trees for leafdecay +-- + +if minetest.get_mapgen_setting("mg_name") == "v6" then + default.register_leafdecay({ + trunks = {"default:tree"}, + leaves = {"default:apple", "default:leaves"}, + radius = 2, + }) + + default.register_leafdecay({ + trunks = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + radius = 3, + }) +else + default.register_leafdecay({ + trunks = {"default:tree"}, + leaves = {"default:apple", "default:leaves"}, + radius = 3, + }) + + default.register_leafdecay({ + trunks = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + radius = 2, + }) +end + +default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"default:acacia_tree"}, + leaves = {"default:acacia_leaves"}, + radius = 2, +}) + +default.register_leafdecay({ + trunks = {"default:aspen_tree"}, + leaves = {"default:aspen_leaves"}, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"default:bush_stem"}, + leaves = {"default:bush_leaves"}, + radius = 1, +}) + +default.register_leafdecay({ + trunks = {"default:acacia_bush_stem"}, + leaves = {"default:acacia_bush_leaves"}, + radius = 1, +}) + +default.register_leafdecay({ + trunks = {"default:pine_bush_stem"}, + leaves = {"default:pine_bush_needles"}, + radius = 1, +}) diff --git a/mods/minetest_game/default/schematics/acacia_bush.mts b/mods/minetest_game/default/schematics/acacia_bush.mts new file mode 100644 index 00000000..3322e3b3 Binary files /dev/null and b/mods/minetest_game/default/schematics/acacia_bush.mts differ diff --git a/mods/minetest_game/default/schematics/acacia_log.mts b/mods/minetest_game/default/schematics/acacia_log.mts new file mode 100644 index 00000000..aff3bd6a Binary files /dev/null and b/mods/minetest_game/default/schematics/acacia_log.mts differ diff --git a/mods/minetest_game/default/schematics/acacia_tree.mts b/mods/minetest_game/default/schematics/acacia_tree.mts new file mode 100644 index 00000000..9b234981 Binary files /dev/null and b/mods/minetest_game/default/schematics/acacia_tree.mts differ diff --git a/mods/minetest_game/default/schematics/acacia_tree_from_sapling.mts b/mods/minetest_game/default/schematics/acacia_tree_from_sapling.mts new file mode 100644 index 00000000..c32a995c Binary files /dev/null and b/mods/minetest_game/default/schematics/acacia_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/apple_log.mts b/mods/minetest_game/default/schematics/apple_log.mts new file mode 100644 index 00000000..92fb900a Binary files /dev/null and b/mods/minetest_game/default/schematics/apple_log.mts differ diff --git a/mods/minetest_game/default/schematics/apple_tree.mts b/mods/minetest_game/default/schematics/apple_tree.mts new file mode 100644 index 00000000..d56cd54b Binary files /dev/null and b/mods/minetest_game/default/schematics/apple_tree.mts differ diff --git a/mods/minetest_game/default/schematics/apple_tree_from_sapling.mts b/mods/minetest_game/default/schematics/apple_tree_from_sapling.mts new file mode 100644 index 00000000..23251003 Binary files /dev/null and b/mods/minetest_game/default/schematics/apple_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/aspen_log.mts b/mods/minetest_game/default/schematics/aspen_log.mts new file mode 100644 index 00000000..d0c723d7 Binary files /dev/null and b/mods/minetest_game/default/schematics/aspen_log.mts differ diff --git a/mods/minetest_game/default/schematics/aspen_tree.mts b/mods/minetest_game/default/schematics/aspen_tree.mts new file mode 100644 index 00000000..429a831c Binary files /dev/null and b/mods/minetest_game/default/schematics/aspen_tree.mts differ diff --git a/mods/minetest_game/default/schematics/aspen_tree_from_sapling.mts b/mods/minetest_game/default/schematics/aspen_tree_from_sapling.mts new file mode 100644 index 00000000..b7ab3ee6 Binary files /dev/null and b/mods/minetest_game/default/schematics/aspen_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/blueberry_bush.mts b/mods/minetest_game/default/schematics/blueberry_bush.mts new file mode 100644 index 00000000..cf4d8ef8 Binary files /dev/null and b/mods/minetest_game/default/schematics/blueberry_bush.mts differ diff --git a/mods/minetest_game/default/schematics/bush.mts b/mods/minetest_game/default/schematics/bush.mts new file mode 100644 index 00000000..d08cf5f5 Binary files /dev/null and b/mods/minetest_game/default/schematics/bush.mts differ diff --git a/mods/minetest_game/default/schematics/emergent_jungle_tree.mts b/mods/minetest_game/default/schematics/emergent_jungle_tree.mts new file mode 100644 index 00000000..b5264309 Binary files /dev/null and b/mods/minetest_game/default/schematics/emergent_jungle_tree.mts differ diff --git a/mods/minetest_game/default/schematics/emergent_jungle_tree_from_sapling.mts b/mods/minetest_game/default/schematics/emergent_jungle_tree_from_sapling.mts new file mode 100644 index 00000000..cb4e4e9e Binary files /dev/null and b/mods/minetest_game/default/schematics/emergent_jungle_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/jungle_log.mts b/mods/minetest_game/default/schematics/jungle_log.mts new file mode 100644 index 00000000..34dca436 Binary files /dev/null and b/mods/minetest_game/default/schematics/jungle_log.mts differ diff --git a/mods/minetest_game/default/schematics/jungle_tree.mts b/mods/minetest_game/default/schematics/jungle_tree.mts new file mode 100644 index 00000000..fe93c8c1 Binary files /dev/null and b/mods/minetest_game/default/schematics/jungle_tree.mts differ diff --git a/mods/minetest_game/default/schematics/jungle_tree_from_sapling.mts b/mods/minetest_game/default/schematics/jungle_tree_from_sapling.mts new file mode 100644 index 00000000..f32d312b Binary files /dev/null and b/mods/minetest_game/default/schematics/jungle_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/large_cactus.mts b/mods/minetest_game/default/schematics/large_cactus.mts new file mode 100644 index 00000000..755e2d8c Binary files /dev/null and b/mods/minetest_game/default/schematics/large_cactus.mts differ diff --git a/mods/minetest_game/default/schematics/papyrus_on_dirt.mts b/mods/minetest_game/default/schematics/papyrus_on_dirt.mts new file mode 100644 index 00000000..1333a7c4 Binary files /dev/null and b/mods/minetest_game/default/schematics/papyrus_on_dirt.mts differ diff --git a/mods/minetest_game/default/schematics/papyrus_on_dry_dirt.mts b/mods/minetest_game/default/schematics/papyrus_on_dry_dirt.mts new file mode 100644 index 00000000..36265802 Binary files /dev/null and b/mods/minetest_game/default/schematics/papyrus_on_dry_dirt.mts differ diff --git a/mods/minetest_game/default/schematics/pine_bush.mts b/mods/minetest_game/default/schematics/pine_bush.mts new file mode 100644 index 00000000..ca572a7d Binary files /dev/null and b/mods/minetest_game/default/schematics/pine_bush.mts differ diff --git a/mods/minetest_game/default/schematics/pine_log.mts b/mods/minetest_game/default/schematics/pine_log.mts new file mode 100644 index 00000000..d51a489f Binary files /dev/null and b/mods/minetest_game/default/schematics/pine_log.mts differ diff --git a/mods/minetest_game/default/schematics/pine_tree.mts b/mods/minetest_game/default/schematics/pine_tree.mts new file mode 100644 index 00000000..c80532ae Binary files /dev/null and b/mods/minetest_game/default/schematics/pine_tree.mts differ diff --git a/mods/minetest_game/default/schematics/pine_tree_from_sapling.mts b/mods/minetest_game/default/schematics/pine_tree_from_sapling.mts new file mode 100644 index 00000000..0800387c Binary files /dev/null and b/mods/minetest_game/default/schematics/pine_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/small_pine_tree.mts b/mods/minetest_game/default/schematics/small_pine_tree.mts new file mode 100644 index 00000000..b2832266 Binary files /dev/null and b/mods/minetest_game/default/schematics/small_pine_tree.mts differ diff --git a/mods/minetest_game/default/schematics/small_pine_tree_from_sapling.mts b/mods/minetest_game/default/schematics/small_pine_tree_from_sapling.mts new file mode 100644 index 00000000..a1b11703 Binary files /dev/null and b/mods/minetest_game/default/schematics/small_pine_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/snowy_pine_tree_from_sapling.mts b/mods/minetest_game/default/schematics/snowy_pine_tree_from_sapling.mts new file mode 100644 index 00000000..3d502a3e Binary files /dev/null and b/mods/minetest_game/default/schematics/snowy_pine_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/schematics/snowy_small_pine_tree_from_sapling.mts b/mods/minetest_game/default/schematics/snowy_small_pine_tree_from_sapling.mts new file mode 100644 index 00000000..d017c9e0 Binary files /dev/null and b/mods/minetest_game/default/schematics/snowy_small_pine_tree_from_sapling.mts differ diff --git a/mods/minetest_game/default/sounds/default_break_glass.1.ogg b/mods/minetest_game/default/sounds/default_break_glass.1.ogg new file mode 100644 index 00000000..b1ccc5fa Binary files /dev/null and b/mods/minetest_game/default/sounds/default_break_glass.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_break_glass.2.ogg b/mods/minetest_game/default/sounds/default_break_glass.2.ogg new file mode 100644 index 00000000..b6cc9e85 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_break_glass.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_break_glass.3.ogg b/mods/minetest_game/default/sounds/default_break_glass.3.ogg new file mode 100644 index 00000000..ae6a6bfc Binary files /dev/null and b/mods/minetest_game/default/sounds/default_break_glass.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_chest_close.ogg b/mods/minetest_game/default/sounds/default_chest_close.ogg new file mode 100644 index 00000000..068d9002 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_chest_close.ogg differ diff --git a/mods/minetest_game/default/sounds/default_chest_open.ogg b/mods/minetest_game/default/sounds/default_chest_open.ogg new file mode 100644 index 00000000..40b0b934 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_chest_open.ogg differ diff --git a/mods/minetest_game/default/sounds/default_cool_lava.1.ogg b/mods/minetest_game/default/sounds/default_cool_lava.1.ogg new file mode 100644 index 00000000..42506ddf Binary files /dev/null and b/mods/minetest_game/default/sounds/default_cool_lava.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_cool_lava.2.ogg b/mods/minetest_game/default/sounds/default_cool_lava.2.ogg new file mode 100644 index 00000000..2747ab81 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_cool_lava.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_cool_lava.3.ogg b/mods/minetest_game/default/sounds/default_cool_lava.3.ogg new file mode 100644 index 00000000..8baeac32 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_cool_lava.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_choppy.1.ogg b/mods/minetest_game/default/sounds/default_dig_choppy.1.ogg new file mode 100644 index 00000000..95fa6d4e Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_choppy.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_choppy.2.ogg b/mods/minetest_game/default/sounds/default_dig_choppy.2.ogg new file mode 100644 index 00000000..5d3a0444 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_choppy.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_choppy.3.ogg b/mods/minetest_game/default/sounds/default_dig_choppy.3.ogg new file mode 100644 index 00000000..2bb0aceb Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_choppy.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_cracky.1.ogg b/mods/minetest_game/default/sounds/default_dig_cracky.1.ogg new file mode 100644 index 00000000..ffced27a Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_cracky.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_cracky.2.ogg b/mods/minetest_game/default/sounds/default_dig_cracky.2.ogg new file mode 100644 index 00000000..d9e80103 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_cracky.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_cracky.3.ogg b/mods/minetest_game/default/sounds/default_dig_cracky.3.ogg new file mode 100644 index 00000000..7d19d408 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_cracky.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_crumbly.ogg b/mods/minetest_game/default/sounds/default_dig_crumbly.ogg new file mode 100644 index 00000000..a0b2a1f9 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_crumbly.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_dig_immediate.ogg b/mods/minetest_game/default/sounds/default_dig_dig_immediate.ogg new file mode 100644 index 00000000..e65d766e Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_dig_immediate.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_metal.ogg b/mods/minetest_game/default/sounds/default_dig_metal.ogg new file mode 100644 index 00000000..0b585097 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_metal.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_oddly_breakable_by_hand.ogg b/mods/minetest_game/default/sounds/default_dig_oddly_breakable_by_hand.ogg new file mode 100644 index 00000000..ef4d7b15 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_oddly_breakable_by_hand.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dig_snappy.ogg b/mods/minetest_game/default/sounds/default_dig_snappy.ogg new file mode 100644 index 00000000..3686fcdd Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dig_snappy.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dirt_footstep.1.ogg b/mods/minetest_game/default/sounds/default_dirt_footstep.1.ogg new file mode 100644 index 00000000..201aa3b2 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dirt_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dirt_footstep.2.ogg b/mods/minetest_game/default/sounds/default_dirt_footstep.2.ogg new file mode 100644 index 00000000..2667dbc2 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dirt_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dug_metal.1.ogg b/mods/minetest_game/default/sounds/default_dug_metal.1.ogg new file mode 100644 index 00000000..5d6cb5b1 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dug_metal.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dug_metal.2.ogg b/mods/minetest_game/default/sounds/default_dug_metal.2.ogg new file mode 100644 index 00000000..63567fc0 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dug_metal.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dug_node.1.ogg b/mods/minetest_game/default/sounds/default_dug_node.1.ogg new file mode 100644 index 00000000..c04975d4 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dug_node.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_dug_node.2.ogg b/mods/minetest_game/default/sounds/default_dug_node.2.ogg new file mode 100644 index 00000000..9f209268 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_dug_node.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_furnace_active.ogg b/mods/minetest_game/default/sounds/default_furnace_active.ogg new file mode 100644 index 00000000..536edc24 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_furnace_active.ogg differ diff --git a/mods/minetest_game/default/sounds/default_glass_footstep.ogg b/mods/minetest_game/default/sounds/default_glass_footstep.ogg new file mode 100644 index 00000000..191287a3 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_glass_footstep.ogg differ diff --git a/mods/minetest_game/default/sounds/default_grass_footstep.1.ogg b/mods/minetest_game/default/sounds/default_grass_footstep.1.ogg new file mode 100644 index 00000000..a04cdb47 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_grass_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_grass_footstep.2.ogg b/mods/minetest_game/default/sounds/default_grass_footstep.2.ogg new file mode 100644 index 00000000..d193068d Binary files /dev/null and b/mods/minetest_game/default/sounds/default_grass_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_grass_footstep.3.ogg b/mods/minetest_game/default/sounds/default_grass_footstep.3.ogg new file mode 100644 index 00000000..e1897ea3 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_grass_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_dig.1.ogg b/mods/minetest_game/default/sounds/default_gravel_dig.1.ogg new file mode 100644 index 00000000..baf8fca7 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_dig.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_dig.2.ogg b/mods/minetest_game/default/sounds/default_gravel_dig.2.ogg new file mode 100644 index 00000000..e0c0c50f Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_dig.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_dug.1.ogg b/mods/minetest_game/default/sounds/default_gravel_dug.1.ogg new file mode 100644 index 00000000..13034335 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_dug.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_dug.2.ogg b/mods/minetest_game/default/sounds/default_gravel_dug.2.ogg new file mode 100644 index 00000000..ee5ed330 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_dug.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_dug.3.ogg b/mods/minetest_game/default/sounds/default_gravel_dug.3.ogg new file mode 100644 index 00000000..add4c54b Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_dug.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_footstep.1.ogg b/mods/minetest_game/default/sounds/default_gravel_footstep.1.ogg new file mode 100644 index 00000000..8d260ce0 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_footstep.2.ogg b/mods/minetest_game/default/sounds/default_gravel_footstep.2.ogg new file mode 100644 index 00000000..2aba2c65 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_footstep.3.ogg b/mods/minetest_game/default/sounds/default_gravel_footstep.3.ogg new file mode 100644 index 00000000..1bcd8a11 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_gravel_footstep.4.ogg b/mods/minetest_game/default/sounds/default_gravel_footstep.4.ogg new file mode 100644 index 00000000..696c9ffd Binary files /dev/null and b/mods/minetest_game/default/sounds/default_gravel_footstep.4.ogg differ diff --git a/mods/minetest_game/default/sounds/default_hard_footstep.1.ogg b/mods/minetest_game/default/sounds/default_hard_footstep.1.ogg new file mode 100644 index 00000000..0a08efa8 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_hard_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_hard_footstep.2.ogg b/mods/minetest_game/default/sounds/default_hard_footstep.2.ogg new file mode 100644 index 00000000..be52a870 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_hard_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_hard_footstep.3.ogg b/mods/minetest_game/default/sounds/default_hard_footstep.3.ogg new file mode 100644 index 00000000..a342787d Binary files /dev/null and b/mods/minetest_game/default/sounds/default_hard_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_dig.1.ogg b/mods/minetest_game/default/sounds/default_ice_dig.1.ogg new file mode 100644 index 00000000..97399c83 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_dig.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_dig.2.ogg b/mods/minetest_game/default/sounds/default_ice_dig.2.ogg new file mode 100644 index 00000000..8a5da119 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_dig.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_dig.3.ogg b/mods/minetest_game/default/sounds/default_ice_dig.3.ogg new file mode 100644 index 00000000..765fb9be Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_dig.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_dug.ogg b/mods/minetest_game/default/sounds/default_ice_dug.ogg new file mode 100644 index 00000000..ae37673e Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_dug.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_footstep.1.ogg b/mods/minetest_game/default/sounds/default_ice_footstep.1.ogg new file mode 100644 index 00000000..c235f1ef Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_footstep.2.ogg b/mods/minetest_game/default/sounds/default_ice_footstep.2.ogg new file mode 100644 index 00000000..61d2c990 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_ice_footstep.3.ogg b/mods/minetest_game/default/sounds/default_ice_footstep.3.ogg new file mode 100644 index 00000000..2ecbb431 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_ice_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_item_smoke.ogg b/mods/minetest_game/default/sounds/default_item_smoke.ogg new file mode 100644 index 00000000..038a46e4 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_item_smoke.ogg differ diff --git a/mods/minetest_game/default/sounds/default_metal_footstep.1.ogg b/mods/minetest_game/default/sounds/default_metal_footstep.1.ogg new file mode 100644 index 00000000..49fe89ba Binary files /dev/null and b/mods/minetest_game/default/sounds/default_metal_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_metal_footstep.2.ogg b/mods/minetest_game/default/sounds/default_metal_footstep.2.ogg new file mode 100644 index 00000000..878711d5 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_metal_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_metal_footstep.3.ogg b/mods/minetest_game/default/sounds/default_metal_footstep.3.ogg new file mode 100644 index 00000000..2a566a83 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_metal_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node.1.ogg b/mods/minetest_game/default/sounds/default_place_node.1.ogg new file mode 100644 index 00000000..46b9756d Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node.2.ogg b/mods/minetest_game/default/sounds/default_place_node.2.ogg new file mode 100644 index 00000000..d34c01a4 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node.3.ogg b/mods/minetest_game/default/sounds/default_place_node.3.ogg new file mode 100644 index 00000000..fc293650 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node_hard.1.ogg b/mods/minetest_game/default/sounds/default_place_node_hard.1.ogg new file mode 100644 index 00000000..9f97faca Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node_hard.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node_hard.2.ogg b/mods/minetest_game/default/sounds/default_place_node_hard.2.ogg new file mode 100644 index 00000000..1d3b3de2 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node_hard.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node_metal.1.ogg b/mods/minetest_game/default/sounds/default_place_node_metal.1.ogg new file mode 100644 index 00000000..5da085ea Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node_metal.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_place_node_metal.2.ogg b/mods/minetest_game/default/sounds/default_place_node_metal.2.ogg new file mode 100644 index 00000000..5ee67fcf Binary files /dev/null and b/mods/minetest_game/default/sounds/default_place_node_metal.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_sand_footstep.1.ogg b/mods/minetest_game/default/sounds/default_sand_footstep.1.ogg new file mode 100644 index 00000000..b92feabb Binary files /dev/null and b/mods/minetest_game/default/sounds/default_sand_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_sand_footstep.2.ogg b/mods/minetest_game/default/sounds/default_sand_footstep.2.ogg new file mode 100644 index 00000000..6bc5da3e Binary files /dev/null and b/mods/minetest_game/default/sounds/default_sand_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_sand_footstep.3.ogg b/mods/minetest_game/default/sounds/default_sand_footstep.3.ogg new file mode 100644 index 00000000..880306fd Binary files /dev/null and b/mods/minetest_game/default/sounds/default_sand_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_snow_footstep.1.ogg b/mods/minetest_game/default/sounds/default_snow_footstep.1.ogg new file mode 100644 index 00000000..97cc8252 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_snow_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_snow_footstep.2.ogg b/mods/minetest_game/default/sounds/default_snow_footstep.2.ogg new file mode 100644 index 00000000..97a6baa4 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_snow_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_snow_footstep.3.ogg b/mods/minetest_game/default/sounds/default_snow_footstep.3.ogg new file mode 100644 index 00000000..bde1f21d Binary files /dev/null and b/mods/minetest_game/default/sounds/default_snow_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_snow_footstep.4.ogg b/mods/minetest_game/default/sounds/default_snow_footstep.4.ogg new file mode 100644 index 00000000..8ca6a590 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_snow_footstep.4.ogg differ diff --git a/mods/minetest_game/default/sounds/default_snow_footstep.5.ogg b/mods/minetest_game/default/sounds/default_snow_footstep.5.ogg new file mode 100644 index 00000000..220d60c9 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_snow_footstep.5.ogg differ diff --git a/mods/minetest_game/default/sounds/default_tool_breaks.1.ogg b/mods/minetest_game/default/sounds/default_tool_breaks.1.ogg new file mode 100644 index 00000000..2a571ae2 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_tool_breaks.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_tool_breaks.2.ogg b/mods/minetest_game/default/sounds/default_tool_breaks.2.ogg new file mode 100644 index 00000000..17893520 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_tool_breaks.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_tool_breaks.3.ogg b/mods/minetest_game/default/sounds/default_tool_breaks.3.ogg new file mode 100644 index 00000000..a99c4b7e Binary files /dev/null and b/mods/minetest_game/default/sounds/default_tool_breaks.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_water_footstep.1.ogg b/mods/minetest_game/default/sounds/default_water_footstep.1.ogg new file mode 100644 index 00000000..63b9744c Binary files /dev/null and b/mods/minetest_game/default/sounds/default_water_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_water_footstep.2.ogg b/mods/minetest_game/default/sounds/default_water_footstep.2.ogg new file mode 100644 index 00000000..8d79c1f4 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_water_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/default_water_footstep.3.ogg b/mods/minetest_game/default/sounds/default_water_footstep.3.ogg new file mode 100644 index 00000000..f8891506 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_water_footstep.3.ogg differ diff --git a/mods/minetest_game/default/sounds/default_wood_footstep.1.ogg b/mods/minetest_game/default/sounds/default_wood_footstep.1.ogg new file mode 100644 index 00000000..34f63a17 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_wood_footstep.1.ogg differ diff --git a/mods/minetest_game/default/sounds/default_wood_footstep.2.ogg b/mods/minetest_game/default/sounds/default_wood_footstep.2.ogg new file mode 100644 index 00000000..124fc297 Binary files /dev/null and b/mods/minetest_game/default/sounds/default_wood_footstep.2.ogg differ diff --git a/mods/minetest_game/default/sounds/player_damage.ogg b/mods/minetest_game/default/sounds/player_damage.ogg new file mode 100644 index 00000000..78880871 Binary files /dev/null and b/mods/minetest_game/default/sounds/player_damage.ogg differ diff --git a/mods/minetest_game/default/textures/bubble.png b/mods/minetest_game/default/textures/bubble.png new file mode 100644 index 00000000..30170d29 Binary files /dev/null and b/mods/minetest_game/default/textures/bubble.png differ diff --git a/mods/minetest_game/default/textures/crack_anylength.png b/mods/minetest_game/default/textures/crack_anylength.png new file mode 100644 index 00000000..297eced4 Binary files /dev/null and b/mods/minetest_game/default/textures/crack_anylength.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_bush_sapling.png b/mods/minetest_game/default/textures/default_acacia_bush_sapling.png new file mode 100644 index 00000000..940b3aac Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_bush_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_bush_stem.png b/mods/minetest_game/default/textures/default_acacia_bush_stem.png new file mode 100644 index 00000000..f2ee9fa1 Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_bush_stem.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_leaves.png b/mods/minetest_game/default/textures/default_acacia_leaves.png new file mode 100644 index 00000000..9620c400 Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_leaves.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_leaves_simple.png b/mods/minetest_game/default/textures/default_acacia_leaves_simple.png new file mode 100644 index 00000000..ab464bad Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_leaves_simple.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_sapling.png b/mods/minetest_game/default/textures/default_acacia_sapling.png new file mode 100644 index 00000000..e34aec51 Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_tree.png b/mods/minetest_game/default/textures/default_acacia_tree.png new file mode 100644 index 00000000..86ab6b15 Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_tree.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_tree_top.png b/mods/minetest_game/default/textures/default_acacia_tree_top.png new file mode 100644 index 00000000..5dbe97be Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_tree_top.png differ diff --git a/mods/minetest_game/default/textures/default_acacia_wood.png b/mods/minetest_game/default/textures/default_acacia_wood.png new file mode 100644 index 00000000..f2f8337e Binary files /dev/null and b/mods/minetest_game/default/textures/default_acacia_wood.png differ diff --git a/mods/minetest_game/default/textures/default_apple.png b/mods/minetest_game/default/textures/default_apple.png new file mode 100644 index 00000000..7549bfd2 Binary files /dev/null and b/mods/minetest_game/default/textures/default_apple.png differ diff --git a/mods/minetest_game/default/textures/default_aspen_leaves.png b/mods/minetest_game/default/textures/default_aspen_leaves.png new file mode 100644 index 00000000..2d6a7efe Binary files /dev/null and b/mods/minetest_game/default/textures/default_aspen_leaves.png differ diff --git a/mods/minetest_game/default/textures/default_aspen_sapling.png b/mods/minetest_game/default/textures/default_aspen_sapling.png new file mode 100644 index 00000000..f4c772c0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_aspen_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_aspen_tree.png b/mods/minetest_game/default/textures/default_aspen_tree.png new file mode 100644 index 00000000..db2285e7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_aspen_tree.png differ diff --git a/mods/minetest_game/default/textures/default_aspen_tree_top.png b/mods/minetest_game/default/textures/default_aspen_tree_top.png new file mode 100644 index 00000000..61ac0096 Binary files /dev/null and b/mods/minetest_game/default/textures/default_aspen_tree_top.png differ diff --git a/mods/minetest_game/default/textures/default_aspen_wood.png b/mods/minetest_game/default/textures/default_aspen_wood.png new file mode 100644 index 00000000..f31ac30f Binary files /dev/null and b/mods/minetest_game/default/textures/default_aspen_wood.png differ diff --git a/mods/minetest_game/default/textures/default_blueberries.png b/mods/minetest_game/default/textures/default_blueberries.png new file mode 100644 index 00000000..1dbb0d64 Binary files /dev/null and b/mods/minetest_game/default/textures/default_blueberries.png differ diff --git a/mods/minetest_game/default/textures/default_blueberry_bush_leaves.png b/mods/minetest_game/default/textures/default_blueberry_bush_leaves.png new file mode 100644 index 00000000..d6736ca7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_blueberry_bush_leaves.png differ diff --git a/mods/minetest_game/default/textures/default_blueberry_bush_sapling.png b/mods/minetest_game/default/textures/default_blueberry_bush_sapling.png new file mode 100644 index 00000000..c22a374f Binary files /dev/null and b/mods/minetest_game/default/textures/default_blueberry_bush_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_blueberry_overlay.png b/mods/minetest_game/default/textures/default_blueberry_overlay.png new file mode 100644 index 00000000..a7f8ab04 Binary files /dev/null and b/mods/minetest_game/default/textures/default_blueberry_overlay.png differ diff --git a/mods/minetest_game/default/textures/default_book.png b/mods/minetest_game/default/textures/default_book.png new file mode 100644 index 00000000..bcf1e6a0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_book.png differ diff --git a/mods/minetest_game/default/textures/default_book_written.png b/mods/minetest_game/default/textures/default_book_written.png new file mode 100644 index 00000000..f23d1225 Binary files /dev/null and b/mods/minetest_game/default/textures/default_book_written.png differ diff --git a/mods/minetest_game/default/textures/default_bookshelf.png b/mods/minetest_game/default/textures/default_bookshelf.png new file mode 100644 index 00000000..3407f758 Binary files /dev/null and b/mods/minetest_game/default/textures/default_bookshelf.png differ diff --git a/mods/minetest_game/default/textures/default_bookshelf_slot.png b/mods/minetest_game/default/textures/default_bookshelf_slot.png new file mode 100644 index 00000000..ea4fdba1 Binary files /dev/null and b/mods/minetest_game/default/textures/default_bookshelf_slot.png differ diff --git a/mods/minetest_game/default/textures/default_brick.png b/mods/minetest_game/default/textures/default_brick.png new file mode 100644 index 00000000..de98961e Binary files /dev/null and b/mods/minetest_game/default/textures/default_brick.png differ diff --git a/mods/minetest_game/default/textures/default_bronze_block.png b/mods/minetest_game/default/textures/default_bronze_block.png new file mode 100644 index 00000000..491fc78a Binary files /dev/null and b/mods/minetest_game/default/textures/default_bronze_block.png differ diff --git a/mods/minetest_game/default/textures/default_bronze_ingot.png b/mods/minetest_game/default/textures/default_bronze_ingot.png new file mode 100644 index 00000000..6cccdf6e Binary files /dev/null and b/mods/minetest_game/default/textures/default_bronze_ingot.png differ diff --git a/mods/minetest_game/default/textures/default_bush_sapling.png b/mods/minetest_game/default/textures/default_bush_sapling.png new file mode 100644 index 00000000..905ba4b8 Binary files /dev/null and b/mods/minetest_game/default/textures/default_bush_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_bush_stem.png b/mods/minetest_game/default/textures/default_bush_stem.png new file mode 100644 index 00000000..6ad88885 Binary files /dev/null and b/mods/minetest_game/default/textures/default_bush_stem.png differ diff --git a/mods/minetest_game/default/textures/default_cactus_side.png b/mods/minetest_game/default/textures/default_cactus_side.png new file mode 100644 index 00000000..e5c10c33 Binary files /dev/null and b/mods/minetest_game/default/textures/default_cactus_side.png differ diff --git a/mods/minetest_game/default/textures/default_cactus_top.png b/mods/minetest_game/default/textures/default_cactus_top.png new file mode 100644 index 00000000..cf46aa2d Binary files /dev/null and b/mods/minetest_game/default/textures/default_cactus_top.png differ diff --git a/mods/minetest_game/default/textures/default_chest_front.png b/mods/minetest_game/default/textures/default_chest_front.png new file mode 100644 index 00000000..f4132794 Binary files /dev/null and b/mods/minetest_game/default/textures/default_chest_front.png differ diff --git a/mods/minetest_game/default/textures/default_chest_inside.png b/mods/minetest_game/default/textures/default_chest_inside.png new file mode 100644 index 00000000..9d2e883d Binary files /dev/null and b/mods/minetest_game/default/textures/default_chest_inside.png differ diff --git a/mods/minetest_game/default/textures/default_chest_lock.png b/mods/minetest_game/default/textures/default_chest_lock.png new file mode 100644 index 00000000..b1885ea5 Binary files /dev/null and b/mods/minetest_game/default/textures/default_chest_lock.png differ diff --git a/mods/minetest_game/default/textures/default_chest_side.png b/mods/minetest_game/default/textures/default_chest_side.png new file mode 100644 index 00000000..44a65a43 Binary files /dev/null and b/mods/minetest_game/default/textures/default_chest_side.png differ diff --git a/mods/minetest_game/default/textures/default_chest_top.png b/mods/minetest_game/default/textures/default_chest_top.png new file mode 100644 index 00000000..1fbdbb94 Binary files /dev/null and b/mods/minetest_game/default/textures/default_chest_top.png differ diff --git a/mods/minetest_game/default/textures/default_clay.png b/mods/minetest_game/default/textures/default_clay.png new file mode 100644 index 00000000..76e5a40a Binary files /dev/null and b/mods/minetest_game/default/textures/default_clay.png differ diff --git a/mods/minetest_game/default/textures/default_clay_brick.png b/mods/minetest_game/default/textures/default_clay_brick.png new file mode 100644 index 00000000..b288ef0b Binary files /dev/null and b/mods/minetest_game/default/textures/default_clay_brick.png differ diff --git a/mods/minetest_game/default/textures/default_clay_lump.png b/mods/minetest_game/default/textures/default_clay_lump.png new file mode 100644 index 00000000..c1d0220d Binary files /dev/null and b/mods/minetest_game/default/textures/default_clay_lump.png differ diff --git a/mods/minetest_game/default/textures/default_cloud.png b/mods/minetest_game/default/textures/default_cloud.png new file mode 100644 index 00000000..faf0ec13 Binary files /dev/null and b/mods/minetest_game/default/textures/default_cloud.png differ diff --git a/mods/minetest_game/default/textures/default_coal_block.png b/mods/minetest_game/default/textures/default_coal_block.png new file mode 100644 index 00000000..e92c5322 Binary files /dev/null and b/mods/minetest_game/default/textures/default_coal_block.png differ diff --git a/mods/minetest_game/default/textures/default_coal_lump.png b/mods/minetest_game/default/textures/default_coal_lump.png new file mode 100644 index 00000000..792961dc Binary files /dev/null and b/mods/minetest_game/default/textures/default_coal_lump.png differ diff --git a/mods/minetest_game/default/textures/default_cobble.png b/mods/minetest_game/default/textures/default_cobble.png new file mode 100644 index 00000000..d3798404 Binary files /dev/null and b/mods/minetest_game/default/textures/default_cobble.png differ diff --git a/mods/minetest_game/default/textures/default_coniferous_litter.png b/mods/minetest_game/default/textures/default_coniferous_litter.png new file mode 100644 index 00000000..9d9651ae Binary files /dev/null and b/mods/minetest_game/default/textures/default_coniferous_litter.png differ diff --git a/mods/minetest_game/default/textures/default_coniferous_litter_side.png b/mods/minetest_game/default/textures/default_coniferous_litter_side.png new file mode 100644 index 00000000..9a390584 Binary files /dev/null and b/mods/minetest_game/default/textures/default_coniferous_litter_side.png differ diff --git a/mods/minetest_game/default/textures/default_copper_block.png b/mods/minetest_game/default/textures/default_copper_block.png new file mode 100644 index 00000000..e1b60f0a Binary files /dev/null and b/mods/minetest_game/default/textures/default_copper_block.png differ diff --git a/mods/minetest_game/default/textures/default_copper_ingot.png b/mods/minetest_game/default/textures/default_copper_ingot.png new file mode 100644 index 00000000..bcad9c05 Binary files /dev/null and b/mods/minetest_game/default/textures/default_copper_ingot.png differ diff --git a/mods/minetest_game/default/textures/default_copper_lump.png b/mods/minetest_game/default/textures/default_copper_lump.png new file mode 100644 index 00000000..998c592e Binary files /dev/null and b/mods/minetest_game/default/textures/default_copper_lump.png differ diff --git a/mods/minetest_game/default/textures/default_coral_brown.png b/mods/minetest_game/default/textures/default_coral_brown.png new file mode 100644 index 00000000..7a18bd70 Binary files /dev/null and b/mods/minetest_game/default/textures/default_coral_brown.png differ diff --git a/mods/minetest_game/default/textures/default_coral_cyan.png b/mods/minetest_game/default/textures/default_coral_cyan.png new file mode 100644 index 00000000..890347f7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_coral_cyan.png differ diff --git a/mods/minetest_game/default/textures/default_coral_green.png b/mods/minetest_game/default/textures/default_coral_green.png new file mode 100644 index 00000000..78f3f33f Binary files /dev/null and b/mods/minetest_game/default/textures/default_coral_green.png differ diff --git a/mods/minetest_game/default/textures/default_coral_orange.png b/mods/minetest_game/default/textures/default_coral_orange.png new file mode 100644 index 00000000..d7432abd Binary files /dev/null and b/mods/minetest_game/default/textures/default_coral_orange.png differ diff --git a/mods/minetest_game/default/textures/default_coral_pink.png b/mods/minetest_game/default/textures/default_coral_pink.png new file mode 100644 index 00000000..3708ba5f Binary files /dev/null and b/mods/minetest_game/default/textures/default_coral_pink.png differ diff --git a/mods/minetest_game/default/textures/default_coral_skeleton.png b/mods/minetest_game/default/textures/default_coral_skeleton.png new file mode 100644 index 00000000..d00c6fed Binary files /dev/null and b/mods/minetest_game/default/textures/default_coral_skeleton.png differ diff --git a/mods/minetest_game/default/textures/default_desert_cobble.png b/mods/minetest_game/default/textures/default_desert_cobble.png new file mode 100644 index 00000000..fa1af5d3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_cobble.png differ diff --git a/mods/minetest_game/default/textures/default_desert_sand.png b/mods/minetest_game/default/textures/default_desert_sand.png new file mode 100644 index 00000000..75ade0b7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_sand.png differ diff --git a/mods/minetest_game/default/textures/default_desert_sandstone.png b/mods/minetest_game/default/textures/default_desert_sandstone.png new file mode 100644 index 00000000..e0b22d0d Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_sandstone.png differ diff --git a/mods/minetest_game/default/textures/default_desert_sandstone_block.png b/mods/minetest_game/default/textures/default_desert_sandstone_block.png new file mode 100644 index 00000000..6f6c8ff5 Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_sandstone_block.png differ diff --git a/mods/minetest_game/default/textures/default_desert_sandstone_brick.png b/mods/minetest_game/default/textures/default_desert_sandstone_brick.png new file mode 100644 index 00000000..d2b70dd2 Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_sandstone_brick.png differ diff --git a/mods/minetest_game/default/textures/default_desert_stone.png b/mods/minetest_game/default/textures/default_desert_stone.png new file mode 100644 index 00000000..5d3aded2 Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_stone.png differ diff --git a/mods/minetest_game/default/textures/default_desert_stone_block.png b/mods/minetest_game/default/textures/default_desert_stone_block.png new file mode 100644 index 00000000..e8e842bc Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_stone_block.png differ diff --git a/mods/minetest_game/default/textures/default_desert_stone_brick.png b/mods/minetest_game/default/textures/default_desert_stone_brick.png new file mode 100644 index 00000000..8e7208dc Binary files /dev/null and b/mods/minetest_game/default/textures/default_desert_stone_brick.png differ diff --git a/mods/minetest_game/default/textures/default_diamond.png b/mods/minetest_game/default/textures/default_diamond.png new file mode 100644 index 00000000..a8dac747 Binary files /dev/null and b/mods/minetest_game/default/textures/default_diamond.png differ diff --git a/mods/minetest_game/default/textures/default_diamond_block.png b/mods/minetest_game/default/textures/default_diamond_block.png new file mode 100644 index 00000000..20c33edb Binary files /dev/null and b/mods/minetest_game/default/textures/default_diamond_block.png differ diff --git a/mods/minetest_game/default/textures/default_dirt.png b/mods/minetest_game/default/textures/default_dirt.png new file mode 100644 index 00000000..4ed965a9 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dirt.png differ diff --git a/mods/minetest_game/default/textures/default_dry_dirt.png b/mods/minetest_game/default/textures/default_dry_dirt.png new file mode 100644 index 00000000..8ee53984 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_dirt.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass.png b/mods/minetest_game/default/textures/default_dry_grass.png new file mode 100644 index 00000000..11def9c6 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass_1.png b/mods/minetest_game/default/textures/default_dry_grass_1.png new file mode 100644 index 00000000..d91174cc Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass_1.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass_2.png b/mods/minetest_game/default/textures/default_dry_grass_2.png new file mode 100644 index 00000000..b12bf547 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass_2.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass_3.png b/mods/minetest_game/default/textures/default_dry_grass_3.png new file mode 100644 index 00000000..c37a8eb9 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass_3.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass_4.png b/mods/minetest_game/default/textures/default_dry_grass_4.png new file mode 100644 index 00000000..c00c7027 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass_4.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass_5.png b/mods/minetest_game/default/textures/default_dry_grass_5.png new file mode 100644 index 00000000..10a09316 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass_5.png differ diff --git a/mods/minetest_game/default/textures/default_dry_grass_side.png b/mods/minetest_game/default/textures/default_dry_grass_side.png new file mode 100644 index 00000000..3ccbe418 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_grass_side.png differ diff --git a/mods/minetest_game/default/textures/default_dry_shrub.png b/mods/minetest_game/default/textures/default_dry_shrub.png new file mode 100644 index 00000000..82c9cc58 Binary files /dev/null and b/mods/minetest_game/default/textures/default_dry_shrub.png differ diff --git a/mods/minetest_game/default/textures/default_emergent_jungle_sapling.png b/mods/minetest_game/default/textures/default_emergent_jungle_sapling.png new file mode 100644 index 00000000..b363b3cc Binary files /dev/null and b/mods/minetest_game/default/textures/default_emergent_jungle_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_fence_acacia_wood.png b/mods/minetest_game/default/textures/default_fence_acacia_wood.png new file mode 100644 index 00000000..0fb97cc9 Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_acacia_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_aspen_wood.png b/mods/minetest_game/default/textures/default_fence_aspen_wood.png new file mode 100644 index 00000000..fec97550 Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_aspen_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_junglewood.png b/mods/minetest_game/default/textures/default_fence_junglewood.png new file mode 100644 index 00000000..b3b8549c Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_junglewood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_overlay.png b/mods/minetest_game/default/textures/default_fence_overlay.png new file mode 100644 index 00000000..718184cc Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_overlay.png differ diff --git a/mods/minetest_game/default/textures/default_fence_pine_wood.png b/mods/minetest_game/default/textures/default_fence_pine_wood.png new file mode 100644 index 00000000..5045d19a Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_pine_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_rail_acacia_wood.png b/mods/minetest_game/default/textures/default_fence_rail_acacia_wood.png new file mode 100644 index 00000000..7081cdb0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_rail_acacia_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_rail_aspen_wood.png b/mods/minetest_game/default/textures/default_fence_rail_aspen_wood.png new file mode 100644 index 00000000..0d35302f Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_rail_aspen_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_rail_junglewood.png b/mods/minetest_game/default/textures/default_fence_rail_junglewood.png new file mode 100644 index 00000000..6616059b Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_rail_junglewood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_rail_overlay.png b/mods/minetest_game/default/textures/default_fence_rail_overlay.png new file mode 100644 index 00000000..4da47aec Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_rail_overlay.png differ diff --git a/mods/minetest_game/default/textures/default_fence_rail_pine_wood.png b/mods/minetest_game/default/textures/default_fence_rail_pine_wood.png new file mode 100644 index 00000000..b2f74a37 Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_rail_pine_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_rail_wood.png b/mods/minetest_game/default/textures/default_fence_rail_wood.png new file mode 100644 index 00000000..e41143cb Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_rail_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fence_wood.png b/mods/minetest_game/default/textures/default_fence_wood.png new file mode 100644 index 00000000..7d161dce Binary files /dev/null and b/mods/minetest_game/default/textures/default_fence_wood.png differ diff --git a/mods/minetest_game/default/textures/default_fern_1.png b/mods/minetest_game/default/textures/default_fern_1.png new file mode 100644 index 00000000..b307986d Binary files /dev/null and b/mods/minetest_game/default/textures/default_fern_1.png differ diff --git a/mods/minetest_game/default/textures/default_fern_2.png b/mods/minetest_game/default/textures/default_fern_2.png new file mode 100644 index 00000000..6c5f7d54 Binary files /dev/null and b/mods/minetest_game/default/textures/default_fern_2.png differ diff --git a/mods/minetest_game/default/textures/default_fern_3.png b/mods/minetest_game/default/textures/default_fern_3.png new file mode 100644 index 00000000..2c1f605e Binary files /dev/null and b/mods/minetest_game/default/textures/default_fern_3.png differ diff --git a/mods/minetest_game/default/textures/default_flint.png b/mods/minetest_game/default/textures/default_flint.png new file mode 100644 index 00000000..9763f4b1 Binary files /dev/null and b/mods/minetest_game/default/textures/default_flint.png differ diff --git a/mods/minetest_game/default/textures/default_footprint.png b/mods/minetest_game/default/textures/default_footprint.png new file mode 100644 index 00000000..24d3e944 Binary files /dev/null and b/mods/minetest_game/default/textures/default_footprint.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_bottom.png b/mods/minetest_game/default/textures/default_furnace_bottom.png new file mode 100644 index 00000000..92279ba3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_bottom.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_fire_bg.png b/mods/minetest_game/default/textures/default_furnace_fire_bg.png new file mode 100644 index 00000000..126204a3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_fire_bg.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_fire_fg.png b/mods/minetest_game/default/textures/default_furnace_fire_fg.png new file mode 100644 index 00000000..576f113b Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_fire_fg.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_front.png b/mods/minetest_game/default/textures/default_furnace_front.png new file mode 100644 index 00000000..f445d83d Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_front.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_front_active.png b/mods/minetest_game/default/textures/default_furnace_front_active.png new file mode 100644 index 00000000..68c03f57 Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_front_active.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_side.png b/mods/minetest_game/default/textures/default_furnace_side.png new file mode 100644 index 00000000..33408cfe Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_side.png differ diff --git a/mods/minetest_game/default/textures/default_furnace_top.png b/mods/minetest_game/default/textures/default_furnace_top.png new file mode 100644 index 00000000..92279ba3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_furnace_top.png differ diff --git a/mods/minetest_game/default/textures/default_glass.png b/mods/minetest_game/default/textures/default_glass.png new file mode 100644 index 00000000..74d6a025 Binary files /dev/null and b/mods/minetest_game/default/textures/default_glass.png differ diff --git a/mods/minetest_game/default/textures/default_glass_detail.png b/mods/minetest_game/default/textures/default_glass_detail.png new file mode 100644 index 00000000..7eab49e0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_glass_detail.png differ diff --git a/mods/minetest_game/default/textures/default_gold_block.png b/mods/minetest_game/default/textures/default_gold_block.png new file mode 100644 index 00000000..170d50be Binary files /dev/null and b/mods/minetest_game/default/textures/default_gold_block.png differ diff --git a/mods/minetest_game/default/textures/default_gold_ingot.png b/mods/minetest_game/default/textures/default_gold_ingot.png new file mode 100644 index 00000000..ba66471e Binary files /dev/null and b/mods/minetest_game/default/textures/default_gold_ingot.png differ diff --git a/mods/minetest_game/default/textures/default_gold_lump.png b/mods/minetest_game/default/textures/default_gold_lump.png new file mode 100644 index 00000000..d5a1be79 Binary files /dev/null and b/mods/minetest_game/default/textures/default_gold_lump.png differ diff --git a/mods/minetest_game/default/textures/default_grass.png b/mods/minetest_game/default/textures/default_grass.png new file mode 100644 index 00000000..5778caa1 Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass.png differ diff --git a/mods/minetest_game/default/textures/default_grass_1.png b/mods/minetest_game/default/textures/default_grass_1.png new file mode 100644 index 00000000..d16b307e Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass_1.png differ diff --git a/mods/minetest_game/default/textures/default_grass_2.png b/mods/minetest_game/default/textures/default_grass_2.png new file mode 100644 index 00000000..6a1dac2c Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass_2.png differ diff --git a/mods/minetest_game/default/textures/default_grass_3.png b/mods/minetest_game/default/textures/default_grass_3.png new file mode 100644 index 00000000..e67727a4 Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass_3.png differ diff --git a/mods/minetest_game/default/textures/default_grass_4.png b/mods/minetest_game/default/textures/default_grass_4.png new file mode 100644 index 00000000..80269d7e Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass_4.png differ diff --git a/mods/minetest_game/default/textures/default_grass_5.png b/mods/minetest_game/default/textures/default_grass_5.png new file mode 100644 index 00000000..df457605 Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass_5.png differ diff --git a/mods/minetest_game/default/textures/default_grass_side.png b/mods/minetest_game/default/textures/default_grass_side.png new file mode 100644 index 00000000..77aa6557 Binary files /dev/null and b/mods/minetest_game/default/textures/default_grass_side.png differ diff --git a/mods/minetest_game/default/textures/default_gravel.png b/mods/minetest_game/default/textures/default_gravel.png new file mode 100644 index 00000000..37bf286d Binary files /dev/null and b/mods/minetest_game/default/textures/default_gravel.png differ diff --git a/mods/minetest_game/default/textures/default_ice.png b/mods/minetest_game/default/textures/default_ice.png new file mode 100644 index 00000000..09b53f28 Binary files /dev/null and b/mods/minetest_game/default/textures/default_ice.png differ diff --git a/mods/minetest_game/default/textures/default_invisible_node_overlay.png b/mods/minetest_game/default/textures/default_invisible_node_overlay.png new file mode 100644 index 00000000..7fc88061 Binary files /dev/null and b/mods/minetest_game/default/textures/default_invisible_node_overlay.png differ diff --git a/mods/minetest_game/default/textures/default_iron_lump.png b/mods/minetest_game/default/textures/default_iron_lump.png new file mode 100644 index 00000000..db61a94c Binary files /dev/null and b/mods/minetest_game/default/textures/default_iron_lump.png differ diff --git a/mods/minetest_game/default/textures/default_item_smoke.png b/mods/minetest_game/default/textures/default_item_smoke.png new file mode 100644 index 00000000..ae95c160 Binary files /dev/null and b/mods/minetest_game/default/textures/default_item_smoke.png differ diff --git a/mods/minetest_game/default/textures/default_junglegrass.png b/mods/minetest_game/default/textures/default_junglegrass.png new file mode 100644 index 00000000..25abb714 Binary files /dev/null and b/mods/minetest_game/default/textures/default_junglegrass.png differ diff --git a/mods/minetest_game/default/textures/default_jungleleaves.png b/mods/minetest_game/default/textures/default_jungleleaves.png new file mode 100644 index 00000000..9a8d5f93 Binary files /dev/null and b/mods/minetest_game/default/textures/default_jungleleaves.png differ diff --git a/mods/minetest_game/default/textures/default_jungleleaves_simple.png b/mods/minetest_game/default/textures/default_jungleleaves_simple.png new file mode 100644 index 00000000..d0c3f7ed Binary files /dev/null and b/mods/minetest_game/default/textures/default_jungleleaves_simple.png differ diff --git a/mods/minetest_game/default/textures/default_junglesapling.png b/mods/minetest_game/default/textures/default_junglesapling.png new file mode 100644 index 00000000..05e1e505 Binary files /dev/null and b/mods/minetest_game/default/textures/default_junglesapling.png differ diff --git a/mods/minetest_game/default/textures/default_jungletree.png b/mods/minetest_game/default/textures/default_jungletree.png new file mode 100644 index 00000000..671b24dc Binary files /dev/null and b/mods/minetest_game/default/textures/default_jungletree.png differ diff --git a/mods/minetest_game/default/textures/default_jungletree_top.png b/mods/minetest_game/default/textures/default_jungletree_top.png new file mode 100644 index 00000000..4027d9e0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_jungletree_top.png differ diff --git a/mods/minetest_game/default/textures/default_junglewood.png b/mods/minetest_game/default/textures/default_junglewood.png new file mode 100644 index 00000000..68d9e48a Binary files /dev/null and b/mods/minetest_game/default/textures/default_junglewood.png differ diff --git a/mods/minetest_game/default/textures/default_kelp.png b/mods/minetest_game/default/textures/default_kelp.png new file mode 100644 index 00000000..4b95b84c Binary files /dev/null and b/mods/minetest_game/default/textures/default_kelp.png differ diff --git a/mods/minetest_game/default/textures/default_ladder_steel.png b/mods/minetest_game/default/textures/default_ladder_steel.png new file mode 100644 index 00000000..87041262 Binary files /dev/null and b/mods/minetest_game/default/textures/default_ladder_steel.png differ diff --git a/mods/minetest_game/default/textures/default_ladder_wood.png b/mods/minetest_game/default/textures/default_ladder_wood.png new file mode 100644 index 00000000..6e18e547 Binary files /dev/null and b/mods/minetest_game/default/textures/default_ladder_wood.png differ diff --git a/mods/minetest_game/default/textures/default_large_cactus_seedling.png b/mods/minetest_game/default/textures/default_large_cactus_seedling.png new file mode 100644 index 00000000..c8ebf3ce Binary files /dev/null and b/mods/minetest_game/default/textures/default_large_cactus_seedling.png differ diff --git a/mods/minetest_game/default/textures/default_lava.png b/mods/minetest_game/default/textures/default_lava.png new file mode 100644 index 00000000..1d7039ff Binary files /dev/null and b/mods/minetest_game/default/textures/default_lava.png differ diff --git a/mods/minetest_game/default/textures/default_lava_flowing_animated.png b/mods/minetest_game/default/textures/default_lava_flowing_animated.png new file mode 100644 index 00000000..ebb0ec17 Binary files /dev/null and b/mods/minetest_game/default/textures/default_lava_flowing_animated.png differ diff --git a/mods/minetest_game/default/textures/default_lava_source_animated.png b/mods/minetest_game/default/textures/default_lava_source_animated.png new file mode 100644 index 00000000..326af645 Binary files /dev/null and b/mods/minetest_game/default/textures/default_lava_source_animated.png differ diff --git a/mods/minetest_game/default/textures/default_leaves.png b/mods/minetest_game/default/textures/default_leaves.png new file mode 100644 index 00000000..55ba1e68 Binary files /dev/null and b/mods/minetest_game/default/textures/default_leaves.png differ diff --git a/mods/minetest_game/default/textures/default_leaves_simple.png b/mods/minetest_game/default/textures/default_leaves_simple.png new file mode 100644 index 00000000..c71def7a Binary files /dev/null and b/mods/minetest_game/default/textures/default_leaves_simple.png differ diff --git a/mods/minetest_game/default/textures/default_marram_grass_1.png b/mods/minetest_game/default/textures/default_marram_grass_1.png new file mode 100644 index 00000000..107a2590 Binary files /dev/null and b/mods/minetest_game/default/textures/default_marram_grass_1.png differ diff --git a/mods/minetest_game/default/textures/default_marram_grass_2.png b/mods/minetest_game/default/textures/default_marram_grass_2.png new file mode 100644 index 00000000..a6d05c51 Binary files /dev/null and b/mods/minetest_game/default/textures/default_marram_grass_2.png differ diff --git a/mods/minetest_game/default/textures/default_marram_grass_3.png b/mods/minetest_game/default/textures/default_marram_grass_3.png new file mode 100644 index 00000000..2a9668c7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_marram_grass_3.png differ diff --git a/mods/minetest_game/default/textures/default_mese_block.png b/mods/minetest_game/default/textures/default_mese_block.png new file mode 100644 index 00000000..77524faa Binary files /dev/null and b/mods/minetest_game/default/textures/default_mese_block.png differ diff --git a/mods/minetest_game/default/textures/default_mese_crystal.png b/mods/minetest_game/default/textures/default_mese_crystal.png new file mode 100644 index 00000000..f1d71f16 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mese_crystal.png differ diff --git a/mods/minetest_game/default/textures/default_mese_crystal_fragment.png b/mods/minetest_game/default/textures/default_mese_crystal_fragment.png new file mode 100644 index 00000000..d5416ab0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mese_crystal_fragment.png differ diff --git a/mods/minetest_game/default/textures/default_mese_post_light_side.png b/mods/minetest_game/default/textures/default_mese_post_light_side.png new file mode 100644 index 00000000..80a0999c Binary files /dev/null and b/mods/minetest_game/default/textures/default_mese_post_light_side.png differ diff --git a/mods/minetest_game/default/textures/default_mese_post_light_side_dark.png b/mods/minetest_game/default/textures/default_mese_post_light_side_dark.png new file mode 100644 index 00000000..4243e486 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mese_post_light_side_dark.png differ diff --git a/mods/minetest_game/default/textures/default_meselamp.png b/mods/minetest_game/default/textures/default_meselamp.png new file mode 100644 index 00000000..d15c8b9b Binary files /dev/null and b/mods/minetest_game/default/textures/default_meselamp.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_coal.png b/mods/minetest_game/default/textures/default_mineral_coal.png new file mode 100644 index 00000000..6d1386b9 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_coal.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_copper.png b/mods/minetest_game/default/textures/default_mineral_copper.png new file mode 100644 index 00000000..c4c518eb Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_copper.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_diamond.png b/mods/minetest_game/default/textures/default_mineral_diamond.png new file mode 100644 index 00000000..b817bd11 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_diamond.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_gold.png b/mods/minetest_game/default/textures/default_mineral_gold.png new file mode 100644 index 00000000..2220addd Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_gold.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_iron.png b/mods/minetest_game/default/textures/default_mineral_iron.png new file mode 100644 index 00000000..5d630628 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_iron.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_mese.png b/mods/minetest_game/default/textures/default_mineral_mese.png new file mode 100644 index 00000000..56a447d0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_mese.png differ diff --git a/mods/minetest_game/default/textures/default_mineral_tin.png b/mods/minetest_game/default/textures/default_mineral_tin.png new file mode 100644 index 00000000..232d4b53 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mineral_tin.png differ diff --git a/mods/minetest_game/default/textures/default_moss.png b/mods/minetest_game/default/textures/default_moss.png new file mode 100644 index 00000000..bb98d7fe Binary files /dev/null and b/mods/minetest_game/default/textures/default_moss.png differ diff --git a/mods/minetest_game/default/textures/default_moss_side.png b/mods/minetest_game/default/textures/default_moss_side.png new file mode 100644 index 00000000..f18322c6 Binary files /dev/null and b/mods/minetest_game/default/textures/default_moss_side.png differ diff --git a/mods/minetest_game/default/textures/default_mossycobble.png b/mods/minetest_game/default/textures/default_mossycobble.png new file mode 100644 index 00000000..1071cb46 Binary files /dev/null and b/mods/minetest_game/default/textures/default_mossycobble.png differ diff --git a/mods/minetest_game/default/textures/default_obsidian.png b/mods/minetest_game/default/textures/default_obsidian.png new file mode 100644 index 00000000..30e063fd Binary files /dev/null and b/mods/minetest_game/default/textures/default_obsidian.png differ diff --git a/mods/minetest_game/default/textures/default_obsidian_block.png b/mods/minetest_game/default/textures/default_obsidian_block.png new file mode 100644 index 00000000..dd93f8d1 Binary files /dev/null and b/mods/minetest_game/default/textures/default_obsidian_block.png differ diff --git a/mods/minetest_game/default/textures/default_obsidian_brick.png b/mods/minetest_game/default/textures/default_obsidian_brick.png new file mode 100644 index 00000000..e4c8fe7f Binary files /dev/null and b/mods/minetest_game/default/textures/default_obsidian_brick.png differ diff --git a/mods/minetest_game/default/textures/default_obsidian_glass.png b/mods/minetest_game/default/textures/default_obsidian_glass.png new file mode 100644 index 00000000..d5ac83d0 Binary files /dev/null and b/mods/minetest_game/default/textures/default_obsidian_glass.png differ diff --git a/mods/minetest_game/default/textures/default_obsidian_glass_detail.png b/mods/minetest_game/default/textures/default_obsidian_glass_detail.png new file mode 100644 index 00000000..1397ecc4 Binary files /dev/null and b/mods/minetest_game/default/textures/default_obsidian_glass_detail.png differ diff --git a/mods/minetest_game/default/textures/default_obsidian_shard.png b/mods/minetest_game/default/textures/default_obsidian_shard.png new file mode 100644 index 00000000..a988d8ce Binary files /dev/null and b/mods/minetest_game/default/textures/default_obsidian_shard.png differ diff --git a/mods/minetest_game/default/textures/default_paper.png b/mods/minetest_game/default/textures/default_paper.png new file mode 100644 index 00000000..8f23924e Binary files /dev/null and b/mods/minetest_game/default/textures/default_paper.png differ diff --git a/mods/minetest_game/default/textures/default_papyrus.png b/mods/minetest_game/default/textures/default_papyrus.png new file mode 100644 index 00000000..982d589c Binary files /dev/null and b/mods/minetest_game/default/textures/default_papyrus.png differ diff --git a/mods/minetest_game/default/textures/default_permafrost.png b/mods/minetest_game/default/textures/default_permafrost.png new file mode 100644 index 00000000..6f2567e7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_permafrost.png differ diff --git a/mods/minetest_game/default/textures/default_pine_bush_sapling.png b/mods/minetest_game/default/textures/default_pine_bush_sapling.png new file mode 100644 index 00000000..fadeff87 Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_bush_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_pine_bush_stem.png b/mods/minetest_game/default/textures/default_pine_bush_stem.png new file mode 100644 index 00000000..7dc00f7b Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_bush_stem.png differ diff --git a/mods/minetest_game/default/textures/default_pine_needles.png b/mods/minetest_game/default/textures/default_pine_needles.png new file mode 100644 index 00000000..e0e39908 Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_needles.png differ diff --git a/mods/minetest_game/default/textures/default_pine_sapling.png b/mods/minetest_game/default/textures/default_pine_sapling.png new file mode 100644 index 00000000..c30131d8 Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_pine_tree.png b/mods/minetest_game/default/textures/default_pine_tree.png new file mode 100644 index 00000000..4a5328ff Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_tree.png differ diff --git a/mods/minetest_game/default/textures/default_pine_tree_top.png b/mods/minetest_game/default/textures/default_pine_tree_top.png new file mode 100644 index 00000000..e26a835d Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_tree_top.png differ diff --git a/mods/minetest_game/default/textures/default_pine_wood.png b/mods/minetest_game/default/textures/default_pine_wood.png new file mode 100644 index 00000000..29f9d6d2 Binary files /dev/null and b/mods/minetest_game/default/textures/default_pine_wood.png differ diff --git a/mods/minetest_game/default/textures/default_rainforest_litter.png b/mods/minetest_game/default/textures/default_rainforest_litter.png new file mode 100644 index 00000000..d762deb4 Binary files /dev/null and b/mods/minetest_game/default/textures/default_rainforest_litter.png differ diff --git a/mods/minetest_game/default/textures/default_rainforest_litter_side.png b/mods/minetest_game/default/textures/default_rainforest_litter_side.png new file mode 100644 index 00000000..1bd0bb60 Binary files /dev/null and b/mods/minetest_game/default/textures/default_rainforest_litter_side.png differ diff --git a/mods/minetest_game/default/textures/default_river_water.png b/mods/minetest_game/default/textures/default_river_water.png new file mode 100644 index 00000000..bee757be Binary files /dev/null and b/mods/minetest_game/default/textures/default_river_water.png differ diff --git a/mods/minetest_game/default/textures/default_river_water_flowing_animated.png b/mods/minetest_game/default/textures/default_river_water_flowing_animated.png new file mode 100644 index 00000000..760d9eb7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_river_water_flowing_animated.png differ diff --git a/mods/minetest_game/default/textures/default_river_water_source_animated.png b/mods/minetest_game/default/textures/default_river_water_source_animated.png new file mode 100644 index 00000000..e7259ccc Binary files /dev/null and b/mods/minetest_game/default/textures/default_river_water_source_animated.png differ diff --git a/mods/minetest_game/default/textures/default_sand.png b/mods/minetest_game/default/textures/default_sand.png new file mode 100644 index 00000000..645a3004 Binary files /dev/null and b/mods/minetest_game/default/textures/default_sand.png differ diff --git a/mods/minetest_game/default/textures/default_sandstone.png b/mods/minetest_game/default/textures/default_sandstone.png new file mode 100644 index 00000000..16e3d13b Binary files /dev/null and b/mods/minetest_game/default/textures/default_sandstone.png differ diff --git a/mods/minetest_game/default/textures/default_sandstone_block.png b/mods/minetest_game/default/textures/default_sandstone_block.png new file mode 100644 index 00000000..c3adfd97 Binary files /dev/null and b/mods/minetest_game/default/textures/default_sandstone_block.png differ diff --git a/mods/minetest_game/default/textures/default_sandstone_brick.png b/mods/minetest_game/default/textures/default_sandstone_brick.png new file mode 100644 index 00000000..6326391b Binary files /dev/null and b/mods/minetest_game/default/textures/default_sandstone_brick.png differ diff --git a/mods/minetest_game/default/textures/default_sapling.png b/mods/minetest_game/default/textures/default_sapling.png new file mode 100644 index 00000000..3fd64f02 Binary files /dev/null and b/mods/minetest_game/default/textures/default_sapling.png differ diff --git a/mods/minetest_game/default/textures/default_sign_steel.png b/mods/minetest_game/default/textures/default_sign_steel.png new file mode 100644 index 00000000..1ea3ec97 Binary files /dev/null and b/mods/minetest_game/default/textures/default_sign_steel.png differ diff --git a/mods/minetest_game/default/textures/default_sign_wall_steel.png b/mods/minetest_game/default/textures/default_sign_wall_steel.png new file mode 100644 index 00000000..9a9273db Binary files /dev/null and b/mods/minetest_game/default/textures/default_sign_wall_steel.png differ diff --git a/mods/minetest_game/default/textures/default_sign_wall_wood.png b/mods/minetest_game/default/textures/default_sign_wall_wood.png new file mode 100644 index 00000000..eb91cf6d Binary files /dev/null and b/mods/minetest_game/default/textures/default_sign_wall_wood.png differ diff --git a/mods/minetest_game/default/textures/default_sign_wood.png b/mods/minetest_game/default/textures/default_sign_wood.png new file mode 100644 index 00000000..07eb9846 Binary files /dev/null and b/mods/minetest_game/default/textures/default_sign_wood.png differ diff --git a/mods/minetest_game/default/textures/default_silver_sand.png b/mods/minetest_game/default/textures/default_silver_sand.png new file mode 100644 index 00000000..90a7044b Binary files /dev/null and b/mods/minetest_game/default/textures/default_silver_sand.png differ diff --git a/mods/minetest_game/default/textures/default_silver_sandstone.png b/mods/minetest_game/default/textures/default_silver_sandstone.png new file mode 100644 index 00000000..1ccecbf3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_silver_sandstone.png differ diff --git a/mods/minetest_game/default/textures/default_silver_sandstone_block.png b/mods/minetest_game/default/textures/default_silver_sandstone_block.png new file mode 100644 index 00000000..c8c14e41 Binary files /dev/null and b/mods/minetest_game/default/textures/default_silver_sandstone_block.png differ diff --git a/mods/minetest_game/default/textures/default_silver_sandstone_brick.png b/mods/minetest_game/default/textures/default_silver_sandstone_brick.png new file mode 100644 index 00000000..cb7be40d Binary files /dev/null and b/mods/minetest_game/default/textures/default_silver_sandstone_brick.png differ diff --git a/mods/minetest_game/default/textures/default_snow.png b/mods/minetest_game/default/textures/default_snow.png new file mode 100644 index 00000000..6a12161d Binary files /dev/null and b/mods/minetest_game/default/textures/default_snow.png differ diff --git a/mods/minetest_game/default/textures/default_snow_side.png b/mods/minetest_game/default/textures/default_snow_side.png new file mode 100644 index 00000000..8465d80d Binary files /dev/null and b/mods/minetest_game/default/textures/default_snow_side.png differ diff --git a/mods/minetest_game/default/textures/default_snowball.png b/mods/minetest_game/default/textures/default_snowball.png new file mode 100644 index 00000000..13eb27af Binary files /dev/null and b/mods/minetest_game/default/textures/default_snowball.png differ diff --git a/mods/minetest_game/default/textures/default_steel_block.png b/mods/minetest_game/default/textures/default_steel_block.png new file mode 100644 index 00000000..5e421f02 Binary files /dev/null and b/mods/minetest_game/default/textures/default_steel_block.png differ diff --git a/mods/minetest_game/default/textures/default_steel_ingot.png b/mods/minetest_game/default/textures/default_steel_ingot.png new file mode 100644 index 00000000..8100b013 Binary files /dev/null and b/mods/minetest_game/default/textures/default_steel_ingot.png differ diff --git a/mods/minetest_game/default/textures/default_stick.png b/mods/minetest_game/default/textures/default_stick.png new file mode 100644 index 00000000..0378d078 Binary files /dev/null and b/mods/minetest_game/default/textures/default_stick.png differ diff --git a/mods/minetest_game/default/textures/default_stone.png b/mods/minetest_game/default/textures/default_stone.png new file mode 100644 index 00000000..d3f0ef80 Binary files /dev/null and b/mods/minetest_game/default/textures/default_stone.png differ diff --git a/mods/minetest_game/default/textures/default_stone_block.png b/mods/minetest_game/default/textures/default_stone_block.png new file mode 100644 index 00000000..2d098783 Binary files /dev/null and b/mods/minetest_game/default/textures/default_stone_block.png differ diff --git a/mods/minetest_game/default/textures/default_stone_brick.png b/mods/minetest_game/default/textures/default_stone_brick.png new file mode 100644 index 00000000..3ae9602a Binary files /dev/null and b/mods/minetest_game/default/textures/default_stone_brick.png differ diff --git a/mods/minetest_game/default/textures/default_stones.png b/mods/minetest_game/default/textures/default_stones.png new file mode 100644 index 00000000..d09e3299 Binary files /dev/null and b/mods/minetest_game/default/textures/default_stones.png differ diff --git a/mods/minetest_game/default/textures/default_stones_side.png b/mods/minetest_game/default/textures/default_stones_side.png new file mode 100644 index 00000000..7ae823a7 Binary files /dev/null and b/mods/minetest_game/default/textures/default_stones_side.png differ diff --git a/mods/minetest_game/default/textures/default_tin_block.png b/mods/minetest_game/default/textures/default_tin_block.png new file mode 100644 index 00000000..a834d272 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tin_block.png differ diff --git a/mods/minetest_game/default/textures/default_tin_ingot.png b/mods/minetest_game/default/textures/default_tin_ingot.png new file mode 100644 index 00000000..eed53610 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tin_ingot.png differ diff --git a/mods/minetest_game/default/textures/default_tin_lump.png b/mods/minetest_game/default/textures/default_tin_lump.png new file mode 100644 index 00000000..72bd339b Binary files /dev/null and b/mods/minetest_game/default/textures/default_tin_lump.png differ diff --git a/mods/minetest_game/default/textures/default_tool_bronzeaxe.png b/mods/minetest_game/default/textures/default_tool_bronzeaxe.png new file mode 100644 index 00000000..8ae43b5a Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_bronzeaxe.png differ diff --git a/mods/minetest_game/default/textures/default_tool_bronzepick.png b/mods/minetest_game/default/textures/default_tool_bronzepick.png new file mode 100644 index 00000000..c88a5f09 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_bronzepick.png differ diff --git a/mods/minetest_game/default/textures/default_tool_bronzeshovel.png b/mods/minetest_game/default/textures/default_tool_bronzeshovel.png new file mode 100644 index 00000000..d7d800e4 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_bronzeshovel.png differ diff --git a/mods/minetest_game/default/textures/default_tool_bronzesword.png b/mods/minetest_game/default/textures/default_tool_bronzesword.png new file mode 100644 index 00000000..cdab8985 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_bronzesword.png differ diff --git a/mods/minetest_game/default/textures/default_tool_diamondaxe.png b/mods/minetest_game/default/textures/default_tool_diamondaxe.png new file mode 100644 index 00000000..e32a0bf2 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_diamondaxe.png differ diff --git a/mods/minetest_game/default/textures/default_tool_diamondpick.png b/mods/minetest_game/default/textures/default_tool_diamondpick.png new file mode 100644 index 00000000..5dcc9983 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_diamondpick.png differ diff --git a/mods/minetest_game/default/textures/default_tool_diamondshovel.png b/mods/minetest_game/default/textures/default_tool_diamondshovel.png new file mode 100644 index 00000000..d0fe24de Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_diamondshovel.png differ diff --git a/mods/minetest_game/default/textures/default_tool_diamondsword.png b/mods/minetest_game/default/textures/default_tool_diamondsword.png new file mode 100644 index 00000000..dbccd0e3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_diamondsword.png differ diff --git a/mods/minetest_game/default/textures/default_tool_meseaxe.png b/mods/minetest_game/default/textures/default_tool_meseaxe.png new file mode 100644 index 00000000..c01fb4f3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_meseaxe.png differ diff --git a/mods/minetest_game/default/textures/default_tool_mesepick.png b/mods/minetest_game/default/textures/default_tool_mesepick.png new file mode 100644 index 00000000..1b2e25be Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_mesepick.png differ diff --git a/mods/minetest_game/default/textures/default_tool_meseshovel.png b/mods/minetest_game/default/textures/default_tool_meseshovel.png new file mode 100644 index 00000000..00813a23 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_meseshovel.png differ diff --git a/mods/minetest_game/default/textures/default_tool_mesesword.png b/mods/minetest_game/default/textures/default_tool_mesesword.png new file mode 100644 index 00000000..d395d3a1 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_mesesword.png differ diff --git a/mods/minetest_game/default/textures/default_tool_steelaxe.png b/mods/minetest_game/default/textures/default_tool_steelaxe.png new file mode 100644 index 00000000..1528cad4 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_steelaxe.png differ diff --git a/mods/minetest_game/default/textures/default_tool_steelpick.png b/mods/minetest_game/default/textures/default_tool_steelpick.png new file mode 100644 index 00000000..a7543a1f Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_steelpick.png differ diff --git a/mods/minetest_game/default/textures/default_tool_steelshovel.png b/mods/minetest_game/default/textures/default_tool_steelshovel.png new file mode 100644 index 00000000..65e40450 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_steelshovel.png differ diff --git a/mods/minetest_game/default/textures/default_tool_steelsword.png b/mods/minetest_game/default/textures/default_tool_steelsword.png new file mode 100644 index 00000000..630a3396 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_steelsword.png differ diff --git a/mods/minetest_game/default/textures/default_tool_stoneaxe.png b/mods/minetest_game/default/textures/default_tool_stoneaxe.png new file mode 100644 index 00000000..cc360545 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_stoneaxe.png differ diff --git a/mods/minetest_game/default/textures/default_tool_stonepick.png b/mods/minetest_game/default/textures/default_tool_stonepick.png new file mode 100644 index 00000000..237d739c Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_stonepick.png differ diff --git a/mods/minetest_game/default/textures/default_tool_stoneshovel.png b/mods/minetest_game/default/textures/default_tool_stoneshovel.png new file mode 100644 index 00000000..11711bd2 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_stoneshovel.png differ diff --git a/mods/minetest_game/default/textures/default_tool_stonesword.png b/mods/minetest_game/default/textures/default_tool_stonesword.png new file mode 100644 index 00000000..1a493acb Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_stonesword.png differ diff --git a/mods/minetest_game/default/textures/default_tool_woodaxe.png b/mods/minetest_game/default/textures/default_tool_woodaxe.png new file mode 100644 index 00000000..68f1fd8c Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_woodaxe.png differ diff --git a/mods/minetest_game/default/textures/default_tool_woodpick.png b/mods/minetest_game/default/textures/default_tool_woodpick.png new file mode 100644 index 00000000..0aed5833 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_woodpick.png differ diff --git a/mods/minetest_game/default/textures/default_tool_woodshovel.png b/mods/minetest_game/default/textures/default_tool_woodshovel.png new file mode 100644 index 00000000..dcef2b5b Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_woodshovel.png differ diff --git a/mods/minetest_game/default/textures/default_tool_woodsword.png b/mods/minetest_game/default/textures/default_tool_woodsword.png new file mode 100644 index 00000000..c78ba50b Binary files /dev/null and b/mods/minetest_game/default/textures/default_tool_woodsword.png differ diff --git a/mods/minetest_game/default/textures/default_torch_animated.png b/mods/minetest_game/default/textures/default_torch_animated.png new file mode 100644 index 00000000..cdf33ef3 Binary files /dev/null and b/mods/minetest_game/default/textures/default_torch_animated.png differ diff --git a/mods/minetest_game/default/textures/default_torch_on_ceiling_animated.png b/mods/minetest_game/default/textures/default_torch_on_ceiling_animated.png new file mode 100644 index 00000000..5465217f Binary files /dev/null and b/mods/minetest_game/default/textures/default_torch_on_ceiling_animated.png differ diff --git a/mods/minetest_game/default/textures/default_torch_on_floor.png b/mods/minetest_game/default/textures/default_torch_on_floor.png new file mode 100644 index 00000000..bc4bdd6b Binary files /dev/null and b/mods/minetest_game/default/textures/default_torch_on_floor.png differ diff --git a/mods/minetest_game/default/textures/default_torch_on_floor_animated.png b/mods/minetest_game/default/textures/default_torch_on_floor_animated.png new file mode 100644 index 00000000..ad51c03a Binary files /dev/null and b/mods/minetest_game/default/textures/default_torch_on_floor_animated.png differ diff --git a/mods/minetest_game/default/textures/default_tree.png b/mods/minetest_game/default/textures/default_tree.png new file mode 100644 index 00000000..fe89963c Binary files /dev/null and b/mods/minetest_game/default/textures/default_tree.png differ diff --git a/mods/minetest_game/default/textures/default_tree_top.png b/mods/minetest_game/default/textures/default_tree_top.png new file mode 100644 index 00000000..9205ed98 Binary files /dev/null and b/mods/minetest_game/default/textures/default_tree_top.png differ diff --git a/mods/minetest_game/default/textures/default_water.png b/mods/minetest_game/default/textures/default_water.png new file mode 100644 index 00000000..ee093a9a Binary files /dev/null and b/mods/minetest_game/default/textures/default_water.png differ diff --git a/mods/minetest_game/default/textures/default_water_flowing_animated.png b/mods/minetest_game/default/textures/default_water_flowing_animated.png new file mode 100644 index 00000000..c9d9e3ba Binary files /dev/null and b/mods/minetest_game/default/textures/default_water_flowing_animated.png differ diff --git a/mods/minetest_game/default/textures/default_water_source_animated.png b/mods/minetest_game/default/textures/default_water_source_animated.png new file mode 100644 index 00000000..c4fed814 Binary files /dev/null and b/mods/minetest_game/default/textures/default_water_source_animated.png differ diff --git a/mods/minetest_game/default/textures/default_wood.png b/mods/minetest_game/default/textures/default_wood.png new file mode 100644 index 00000000..af56d6cd Binary files /dev/null and b/mods/minetest_game/default/textures/default_wood.png differ diff --git a/mods/minetest_game/default/textures/gui_formbg.png b/mods/minetest_game/default/textures/gui_formbg.png new file mode 100644 index 00000000..e259fec2 Binary files /dev/null and b/mods/minetest_game/default/textures/gui_formbg.png differ diff --git a/mods/minetest_game/default/textures/gui_furnace_arrow_bg.png b/mods/minetest_game/default/textures/gui_furnace_arrow_bg.png new file mode 100644 index 00000000..046d8cda Binary files /dev/null and b/mods/minetest_game/default/textures/gui_furnace_arrow_bg.png differ diff --git a/mods/minetest_game/default/textures/gui_furnace_arrow_fg.png b/mods/minetest_game/default/textures/gui_furnace_arrow_fg.png new file mode 100644 index 00000000..8d3c396e Binary files /dev/null and b/mods/minetest_game/default/textures/gui_furnace_arrow_fg.png differ diff --git a/mods/minetest_game/default/textures/gui_hb_bg.png b/mods/minetest_game/default/textures/gui_hb_bg.png new file mode 100644 index 00000000..99248e17 Binary files /dev/null and b/mods/minetest_game/default/textures/gui_hb_bg.png differ diff --git a/mods/minetest_game/default/textures/gui_hotbar.png b/mods/minetest_game/default/textures/gui_hotbar.png new file mode 100644 index 00000000..7bc78875 Binary files /dev/null and b/mods/minetest_game/default/textures/gui_hotbar.png differ diff --git a/mods/minetest_game/default/textures/gui_hotbar_selected.png b/mods/minetest_game/default/textures/gui_hotbar_selected.png new file mode 100644 index 00000000..7203e9a7 Binary files /dev/null and b/mods/minetest_game/default/textures/gui_hotbar_selected.png differ diff --git a/mods/minetest_game/default/textures/heart.png b/mods/minetest_game/default/textures/heart.png new file mode 100644 index 00000000..4412cab5 Binary files /dev/null and b/mods/minetest_game/default/textures/heart.png differ diff --git a/mods/minetest_game/default/textures/wieldhand.png b/mods/minetest_game/default/textures/wieldhand.png new file mode 100644 index 00000000..69f4b7bf Binary files /dev/null and b/mods/minetest_game/default/textures/wieldhand.png differ diff --git a/mods/minetest_game/default/tools.lua b/mods/minetest_game/default/tools.lua new file mode 100644 index 00000000..1a95a50d --- /dev/null +++ b/mods/minetest_game/default/tools.lua @@ -0,0 +1,477 @@ +-- mods/default/tools.lua + +-- support for MT game translation. +local S = default.get_translator + +-- The hand +-- Override the hand item registered in the engine in builtin/game/register.lua +minetest.override_item("", { + wield_scale = {x=1,y=1,z=2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0} + }, + damage_groups = {fleshy=1}, + } +}) + +-- +-- Picks +-- + +minetest.register_tool("default:pick_wood", { + description = S("Wooden Pickaxe"), + inventory_image = "default_tool_woodpick.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + cracky = {times={[3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1, flammable = 2} +}) + +minetest.register_tool("default:pick_stone", { + description = S("Stone Pickaxe"), + inventory_image = "default_tool_stonepick.png", + tool_capabilities = { + full_punch_interval = 1.3, + max_drop_level=0, + groupcaps={ + cracky = {times={[2]=2.0, [3]=1.00}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_bronze", { + description = S("Bronze Pickaxe"), + inventory_image = "default_tool_bronzepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.50, [2]=1.80, [3]=0.90}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_steel", { + description = S("Steel Pickaxe"), + inventory_image = "default_tool_steelpick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_mese", { + description = S("Mese Pickaxe"), + inventory_image = "default_tool_mesepick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_diamond", { + description = S("Diamond Pickaxe"), + inventory_image = "default_tool_diamondpick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +-- +-- Shovels +-- + +minetest.register_tool("default:shovel_wood", { + description = S("Wooden Shovel"), + inventory_image = "default_tool_woodshovel.png", + wield_image = "default_tool_woodshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=3.00, [2]=1.60, [3]=0.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1, flammable = 2} +}) + +minetest.register_tool("default:shovel_stone", { + description = S("Stone Shovel"), + inventory_image = "default_tool_stoneshovel.png", + wield_image = "default_tool_stoneshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.4, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_bronze", { + description = S("Bronze Shovel"), + inventory_image = "default_tool_bronzeshovel.png", + wield_image = "default_tool_bronzeshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.65, [2]=1.05, [3]=0.45}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_steel", { + description = S("Steel Shovel"), + inventory_image = "default_tool_steelshovel.png", + wield_image = "default_tool_steelshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_mese", { + description = S("Mese Shovel"), + inventory_image = "default_tool_meseshovel.png", + wield_image = "default_tool_meseshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + crumbly = {times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_diamond", { + description = S("Diamond Shovel"), + inventory_image = "default_tool_diamondshovel.png", + wield_image = "default_tool_diamondshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.10, [2]=0.50, [3]=0.30}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +-- +-- Axes +-- + +minetest.register_tool("default:axe_wood", { + description = S("Wooden Axe"), + inventory_image = "default_tool_woodaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + groupcaps={ + choppy = {times={[2]=3.00, [3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1, flammable = 2} +}) + +minetest.register_tool("default:axe_stone", { + description = S("Stone Axe"), + inventory_image = "default_tool_stoneaxe.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + choppy={times={[1]=3.00, [2]=2.00, [3]=1.30}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_bronze", { + description = S("Bronze Axe"), + inventory_image = "default_tool_bronzeaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.75, [2]=1.70, [3]=1.15}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_steel", { + description = S("Steel Axe"), + inventory_image = "default_tool_steelaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_mese", { + description = S("Mese Axe"), + inventory_image = "default_tool_meseaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.20, [2]=1.00, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_diamond", { + description = S("Diamond Axe"), + inventory_image = "default_tool_diamondaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +-- +-- Swords +-- + +minetest.register_tool("default:sword_wood", { + description = S("Wooden Sword"), + inventory_image = "default_tool_woodsword.png", + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.6, [3]=0.40}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1, flammable = 2} +}) + +minetest.register_tool("default:sword_stone", { + description = S("Stone Sword"), + inventory_image = "default_tool_stonesword.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_bronze", { + description = S("Bronze Sword"), + inventory_image = "default_tool_bronzesword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.75, [2]=1.30, [3]=0.375}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_steel", { + description = S("Steel Sword"), + inventory_image = "default_tool_steelsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_mese", { + description = S("Mese Sword"), + inventory_image = "default_tool_mesesword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_diamond", { + description = S("Diamond Sword"), + inventory_image = "default_tool_diamondsword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40, maxlevel=3}, + }, + damage_groups = {fleshy=8}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +-- +-- Register Craft Recipies +-- + +local craft_ingreds = { + wood = "group:wood", + stone = "group:stone", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + mese = "default:mese_crystal", + diamond = "default:diamond" +} + +for name, mat in pairs(craft_ingreds) do + minetest.register_craft({ + output = "default:pick_".. name, + recipe = { + {mat, mat, mat}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + + minetest.register_craft({ + output = "default:shovel_".. name, + recipe = { + {mat}, + {"group:stick"}, + {"group:stick"} + } + }) + + minetest.register_craft({ + output = "default:axe_".. name, + recipe = { + {mat, mat}, + {mat, "group:stick"}, + {"", "group:stick"} + } + }) + + minetest.register_craft({ + output = "default:sword_".. name, + recipe = { + {mat}, + {mat}, + {"group:stick"} + } + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "default:pick_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:shovel_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:axe_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sword_wood", + burntime = 5, +}) diff --git a/mods/minetest_game/default/torch.lua b/mods/minetest_game/default/torch.lua new file mode 100644 index 00000000..e8f734c7 --- /dev/null +++ b/mods/minetest_game/default/torch.lua @@ -0,0 +1,157 @@ +-- default/torch.lua + +-- support for MT game translation. +local S = default.get_translator + +local function on_flood(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack("default:torch 1")) + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + if not (nodedef and nodedef.groups and + nodedef.groups.igniter and nodedef.groups.igniter > 0) then + minetest.sound_play( + "default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.07}, + true + ) + end + -- Remove the torch node + return false +end + +minetest.register_node("default:torch", { + description = S("Torch"), + drawtype = "mesh", + mesh = "torch_floor.obj", + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_bottom = {-1/8, -1/2, -1/8, 1/8, 2/16, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local above = pointed_thing.above + local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) + local fakestack = itemstack + if wdir == 0 then + fakestack:set_name("default:torch_ceiling") + elseif wdir == 1 then + fakestack:set_name("default:torch") + else + fakestack:set_name("default:torch_wall") + end + + itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name("default:torch") + + return itemstack + end, + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_node("default:torch_wall", { + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_side = {-1/2, -1/2, -1/8, -1/8, 1/8, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_node("default:torch_ceiling", { + drawtype = "mesh", + mesh = "torch_ceiling.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-1/8, -1/16, -5/16, 1/8, 1/2, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_lbm({ + name = "default:3dtorch", + nodenames = {"default:torch", "torches:floor", "torches:wall"}, + action = function(pos, node) + if node.param2 == 0 then + minetest.set_node(pos, {name = "default:torch_ceiling", + param2 = node.param2}) + elseif node.param2 == 1 then + minetest.set_node(pos, {name = "default:torch", + param2 = node.param2}) + else + minetest.set_node(pos, {name = "default:torch_wall", + param2 = node.param2}) + end + end +}) + +minetest.register_craft({ + output = "default:torch 4", + recipe = { + {"default:coal_lump"}, + {"group:stick"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:torch", + burntime = 4, +}) diff --git a/mods/minetest_game/default/trees.lua b/mods/minetest_game/default/trees.lua new file mode 100644 index 00000000..9536369c --- /dev/null +++ b/mods/minetest_game/default/trees.lua @@ -0,0 +1,605 @@ +-- default/trees.lua + +-- support for MT game translation. +local S = default.get_translator + +local random = math.random + +-- +-- Grow trees from saplings +-- + +-- 'can grow' function + +function default.can_grow(pos) + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + return false + end + if minetest.get_item_group(node_under.name, "soil") == 0 then + return false + end + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + return false + end + return true +end + +function default.on_grow_failed(pos) + minetest.get_node_timer(pos):start(300) +end + + +-- 'is snow nearby' function + +local function is_snow_nearby(pos) + return minetest.find_node_near(pos, 1, {"group:snowy"}) +end + + + +-- +-- Tree generation +-- + +-- Apple tree and jungle tree trunk and leaves function + +local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, + height, size, iters, is_apple_tree) + local x, y, z = pos.x, pos.y, pos.z + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_apple = minetest.get_content_id("default:apple") + + -- Trunk + data[a:index(x, y, z)] = tree_cid -- Force-place lowest trunk node to replace sapling + for yy = y + 1, y + height - 1 do + local vi = a:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == leaves_cid then + data[vi] = tree_cid + end + end + + -- Force leaves near the trunk + for z_dist = -1, 1 do + for y_dist = -size, 1 do + local vi = a:index(x - 1, y + height + y_dist, z + z_dist) + for x_dist = -1, 1 do + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + vi = vi + 1 + end + end + end + + -- Randomly add leaves in 2x2x2 clusters. + for i = 1, iters do + local clust_x = x + random(-size, size - 1) + local clust_y = y + height + random(-size, 0) + local clust_z = z + random(-size, size - 1) + + for xi = 0, 1 do + for yi = 0, 1 do + for zi = 0, 1 do + local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi) + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + end + end + end + end +end + + +-- Apple tree + +function default.grow_tree(pos, is_apple_tree, bad) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(4, 5) + local c_tree = minetest.get_content_id("default:tree") + local c_leaves = minetest.get_content_id("default:leaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 2, y = y, z = z - 2}, + {x = x + 2, y = y + height + 1, z = z + 2} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_tree, c_leaves, height, 2, 8, is_apple_tree) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +-- Jungle tree + +function default.grow_jungle_tree(pos, bad) + --[[ + NOTE: Jungletree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_jungle_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(8, 12) + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_jungletree = minetest.get_content_id("default:jungletree") + local c_jungleleaves = minetest.get_content_id("default:jungleleaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y - 1, z = z - 3}, + {x = x + 3, y = y + height + 1, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, + height, 3, 30, false) + + -- Roots + for z_dist = -1, 1 do + local vi_1 = a:index(x - 1, y - 1, z + z_dist) + local vi_2 = a:index(x - 1, y, z + z_dist) + for x_dist = -1, 1 do + if random(1, 3) >= 2 then + if data[vi_1] == c_air or data[vi_1] == c_ignore then + data[vi_1] = c_jungletree + elseif data[vi_2] == c_air or data[vi_2] == c_ignore then + data[vi_2] = c_jungletree + end + end + vi_1 = vi_1 + 1 + vi_2 = vi_2 + 1 + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- Pine tree from mg mapgen mod, design by sfan5, pointy top added by paramat + +local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == c_snow then + data[vi] = c_pine_needles + end +end + +local function add_snow(data, vi, c_air, c_ignore, c_snow) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore then + data[vi] = c_snow + end +end + +function default.grow_pine_tree(pos, snow) + local x, y, z = pos.x, pos.y, pos.z + local maxy = y + random(9, 13) -- Trunk top + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_pine_tree = minetest.get_content_id("default:pine_tree") + local c_pine_needles = minetest.get_content_id("default:pine_needles") + local c_snow = minetest.get_content_id("default:snow") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y, z = z - 3}, + {x = x + 3, y = maxy + 3, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + -- Upper branches layer + local dev = 3 + for yy = maxy - 1, maxy + 1 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Centre top nodes + add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow, + c_pine_needles) + add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow, + c_pine_needles) -- Paramat added a pointy top node + if snow then + add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow) + end + + -- Lower branches layer + local my = 0 + for i = 1, 20 do -- Random 2x2 squares of needles + local xi = x + random(-3, 2) + local yy = maxy + random(-6, -5) + local zi = z + random(-3, 2) + if yy > my then + my = yy + end + for zz = zi, zi+1 do + local vi = a:index(xi, yy, zz) + local via = a:index(xi, yy + 1, zz) + for xx = xi, xi + 1 do + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + vi = vi + 1 + via = via + 1 + end + end + end + + dev = 2 + for yy = my + 1, my + 2 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Trunk + -- Force-place lowest trunk node to replace sapling + data[a:index(x, y, z)] = c_pine_tree + for yy = y + 1, maxy do + local vi = a:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or + node_id == c_pine_needles or node_id == c_snow then + data[vi] = c_pine_tree + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- New apple tree + +function default.grow_new_apple_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/apple_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, + path, "random", nil, false) +end + + +-- New jungle tree + +function default.grow_new_jungle_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/jungle_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New emergent jungle tree + +function default.grow_new_emergent_jungle_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 3, y = pos.y - 5, z = pos.z - 3}, + path, "random", nil, false) +end + + +-- New pine tree + +function default.grow_new_pine_tree(pos) + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/small_pine_tree_from_sapling.mts" + end + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "0", nil, false) +end + + +-- New snowy pine tree + +function default.grow_new_snowy_pine_tree(pos) + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/snowy_pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/snowy_small_pine_tree_from_sapling.mts" + end + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New acacia tree + +function default.grow_new_acacia_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 4, y = pos.y - 1, z = pos.z - 4}, + path, "random", nil, false) +end + + +-- New aspen tree + +function default.grow_new_aspen_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/aspen_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "0", nil, false) +end + + +-- Bushes do not need 'from sapling' schematic variants because +-- only the stem node is force-placed in the schematic. + +-- Bush + +function default.grow_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + +-- Blueberry bush + +function default.grow_blueberry_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/blueberry_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Acacia bush + +function default.grow_acacia_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Pine bush + +function default.grow_pine_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/pine_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Large cactus + +function default.grow_large_cactus(pos) + local path = minetest.get_modpath("default") .. + "/schematics/large_cactus.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- +-- Sapling 'on place' function to check protection of node and resulting tree volume +-- + +function default.sapling_on_place(itemstack, placer, pointed_thing, + sapling_name, minp_relative, maxp_relative, interval) + -- Position of sapling + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local pdef = node and minetest.registered_nodes[node.name] + + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + if not pdef or not pdef.buildable_to then + pos = pointed_thing.above + node = minetest.get_node_or_nil(pos) + pdef = node and minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local player_name = placer and placer:get_player_name() or "" + -- Check sapling position for protection + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + -- Check tree volume for protection + if minetest.is_area_protected( + vector.add(pos, minp_relative), + vector.add(pos, maxp_relative), + player_name, + interval) then + minetest.record_protection_violation(pos, player_name) + -- Print extra information to explain + minetest.chat_send_player(player_name, + S("@1 will intersect protection on growth.", + itemstack:get_definition().description)) + return itemstack + end + + if placer then + default.log_player_action(placer, "places node", sapling_name, "at", pos) + end + + local take_item = not minetest.is_creative_enabled(player_name) + local newnode = {name = sapling_name} + local ndef = minetest.registered_nodes[sapling_name] + minetest.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + return itemstack +end + +-- Grow sapling + +default.sapling_growth_defs = {} + +function default.register_sapling_growth(name, def) + default.sapling_growth_defs[name] = { + can_grow = def.can_grow or default.can_grow, + on_grow_failed = def.on_grow_failed or default.on_grow_failed, + grow = assert(def.grow) + } +end + +function default.grow_sapling(pos) + local node = minetest.get_node(pos) + local sapling_def = default.sapling_growth_defs[node.name] + + if not sapling_def then + minetest.log("warning", "default.grow_sapling called on undefined sapling " .. node.name) + return + end + + if not sapling_def.can_grow(pos) then + sapling_def.on_grow_failed(pos) + return + end + + minetest.log("action", "Growing sapling " .. node.name .. " at " .. minetest.pos_to_string(pos)) + sapling_def.grow(pos) +end + +local function register_sapling_growth(nodename, grow) + default.register_sapling_growth("default:" .. nodename, {grow = grow}) +end + +if minetest.get_mapgen_setting("mg_name") == "v6" then + register_sapling_growth("sapling", function(pos) + default.grow_tree(pos, random(1, 4) == 1) + end) + register_sapling_growth("junglesapling", default.grow_jungle_tree) + register_sapling_growth("pine_sapling", function(pos) + local snow = is_snow_nearby(pos) + default.grow_pine_tree(pos, snow) + end) +else + register_sapling_growth("sapling", default.grow_new_apple_tree) + register_sapling_growth("junglesapling", default.grow_new_jungle_tree) + register_sapling_growth("pine_sapling", function(pos) + local snow = is_snow_nearby(pos) + if snow then + default.grow_new_snowy_pine_tree(pos) + else + default.grow_new_pine_tree(pos) + end + end) +end + +register_sapling_growth("acacia_sapling", default.grow_new_acacia_tree) +register_sapling_growth("aspen_sapling", default.grow_new_aspen_tree) +register_sapling_growth("bush_sapling", default.grow_bush) +register_sapling_growth("blueberry_bush_sapling", default.grow_blueberry_bush) +register_sapling_growth("acacia_bush_sapling", default.grow_acacia_bush) +register_sapling_growth("pine_bush_sapling", default.grow_pine_bush) +register_sapling_growth("emergent_jungle_sapling", default.grow_new_emergent_jungle_tree) + +-- Backwards compatibility for saplings that used to use ABMs; does not need to include newer saplings. +minetest.register_lbm({ + name = "default:convert_saplings_to_node_timer", + nodenames = {"default:sapling", "default:junglesapling", + "default:pine_sapling", "default:acacia_sapling", + "default:aspen_sapling"}, + action = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end +}) diff --git a/mods/minetest_game/doors/README.txt b/mods/minetest_game/doors/README.txt new file mode 100644 index 00000000..b1ad3b56 --- /dev/null +++ b/mods/minetest_game/doors/README.txt @@ -0,0 +1,87 @@ +Minetest Game mod: doors +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) + +Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. + +Modified by sofar (sofar@foo-projects.org) (MIT): +Added Steel trapdoor. +Re-implemented most of the door algorithms, added meshes, UV wrapped texture. +Added doors API to facilitate coding mods accessing and operating doors. +Added Fence Gate model, code, and sounds. + +Various Minetest Game developers and contributors (MIT) + + +Authors of media (textures) +--------------------------- +Following textures created by Fernando Zapata (CC BY-SA 3.0): + door_wood.png + door_wood_a.png + door_wood_a_r.png + door_wood_b.png + door_wood_b_r.png + +Following textures created by BlockMen (CC BY-SA 3.0): + door_trapdoor.png + door_obsidian_glass_side.png + +Following textures created by celeron55 (CC BY-SA 3.0): + door_glass_a.png + door_glass_b.png + +Following textures created by PenguinDad (CC BY-SA 4.0): + door_glass.png + door_obsidian_glass.png + +Following textures created by sofar (CC-BY-SA-3.0): + doors_trapdoor_steel.png + +Following textures created by paramat (CC-BY-SA-3.0): + door_trapdoor_side.png + doors_trapdoor_steel_side.png + +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): + door_obsidian_glass.png + +Glass door textures by Krock and paramat based on textures by VanessaE (CC BY-SA 3.0): + doors_door_glass.png + doors_item_glass.png + +All other textures (created by PilzAdam) (CC BY-SA 3.0): + +Door textures were converted to the new texture map by sofar, paramat and +red-001, under the same license as the originals. + + +Authors of media (models) +------------------------- +Door 3d models by sofar (CC-BY-SA-3.0) + - door_a.obj + - door_b.obj +Fence gate models by sofar (CC-BY-SA-3.0) + - fencegate_open.obj + - fencegate_closed.obj + + +Authors of media (sounds) +------------------------- +Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen + door_open.ogg +Closing-Sound created by bennstir (CC BY 3.0) + door_close.ogg +fencegate_open.ogg: + http://www.freesound.org/people/mhtaylor67/sounds/126041/ - (CC0 1.0) +fencegate_close.ogg: + http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - (CC-BY-3.0) + http://www.freesound.org/people/rivernile7/sounds/249573/ - (CC-BY-3.0) +Steel door sounds open & close (CC-BY-3.0) by HazMatt + - http://www.freesound.org/people/HazMattt/sounds/187283/ + doors_steel_door_open.ogg + doors_steel_door_close.ogg +doors_glass_door_open.ogg, doors_glass_door_close.ogg: + https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) diff --git a/mods/minetest_game/doors/init.lua b/mods/minetest_game/doors/init.lua new file mode 100644 index 00000000..d198f1e2 --- /dev/null +++ b/mods/minetest_game/doors/init.lua @@ -0,0 +1,937 @@ +-- doors/init.lua + +-- our API object +doors = {} + +doors.registered_doors = {} +doors.registered_trapdoors = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("doors") + + +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + +local function is_doors_upper_node(pos) + return minetest.get_node(pos).name == "doors:hidden" +end + +-- returns an object to a door object or nil +function doors.get(pos) + local node_name = minetest.get_node(pos).name + if doors.registered_doors[node_name] then + -- A normal upright door + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return doors.door_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return doors.door_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return doors.door_toggle(self.pos, nil, player) + end, + state = function(self) + local state = minetest.get_meta(self.pos):get_int("state") + return state %2 == 1 + end + } + elseif doors.registered_trapdoors[node_name] then + -- A trapdoor + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return doors.trapdoor_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return doors.trapdoor_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return doors.trapdoor_toggle(self.pos, nil, player) + end, + state = function(self) + return minetest.get_node(self.pos).name:sub(-5) == "_open" + end + } + else + return nil + end +end + +-- this hidden node is placed on top of the bottom, and prevents +-- nodes from being placed in the top half of the door. +minetest.register_node("doors:hidden", { + description = S("Hidden Door Segment"), + inventory_image = "doors_hidden_segment.png^default_invisible_node_overlay.png", + wield_image = "doors_hidden_segment.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + -- has to be walkable for falling nodes to stop falling. + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + floodable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, + -- 1px block inside door hinge near node top + collision_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, +}) + +-- table used to aid door opening/closing +local transform = { + { + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, + }, + { + {v = "_c", param2 = 1}, + {v = "_c", param2 = 2}, + {v = "_c", param2 = 3}, + {v = "_c", param2 = 0}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_d", param2 = 3}, + {v = "_d", param2 = 0}, + {v = "_d", param2 = 1}, + {v = "_d", param2 = 2}, + }, +} + +function doors.door_toggle(pos, node, clicker) + local meta = minetest.get_meta(pos) + node = node or minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + local name = def.door.name + + local state = meta:get_string("state") + if state == "" then + -- fix up lvm-placed right-hinged doors, default closed + if node.name:sub(-2) == "_b" then + state = 2 + else + state = 0 + end + else + state = tonumber(state) + end + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + -- until Lua-5.2 we have no bitwise operators :( + if state % 2 == 1 then + state = state - 1 + else + state = state + 1 + end + + local dir = node.param2 + + -- It's possible param2 is messed up, so, validate before using + -- the input data. This indicates something may have rotated + -- the door, even though that is not supported. + if not transform[state + 1] or not transform[state + 1][dir + 1] then + return false + end + + if state % 2 == 0 then + minetest.sound_play(def.door.sounds[1], + {pos = pos, gain = def.door.gains[1], max_hear_distance = 10}, true) + else + minetest.sound_play(def.door.sounds[2], + {pos = pos, gain = def.door.gains[2], max_hear_distance = 10}, true) + end + + minetest.swap_node(pos, { + name = name .. transform[state + 1][dir+1].v, + param2 = transform[state + 1][dir+1].param2 + }) + meta:set_int("state", state) + + return true +end + + +local function on_place_node(place_to, newnode, + placer, oldnode, itemstack, pointed_thing) + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} + local newnode_copy = + {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = + {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local pointed_thing_copy = { + type = pointed_thing.type, + above = vector.new(pointed_thing.above), + under = vector.new(pointed_thing.under), + ref = pointed_thing.ref, + } + callback(place_to_copy, newnode_copy, placer, + oldnode_copy, itemstack, pointed_thing_copy) + end +end + +local function can_dig_door(pos, digger) + replace_old_owner_information(pos) + return default.can_interact_with_node(digger, pos) +end + +function doors.register(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + -- replace old doors of this type automatically + minetest.register_lbm({ + name = ":doors:replace_" .. name:gsub(":", "_"), + nodenames = {name.."_b_1", name.."_b_2"}, + action = function(pos, node) + local l = tonumber(node.name:sub(-1)) + local meta = minetest.get_meta(pos) + local h = meta:get_int("right") + 1 + local p2 = node.param2 + local replace = { + {{type = "a", state = 0}, {type = "a", state = 3}}, + {{type = "b", state = 1}, {type = "b", state = 2}} + } + local new = replace[l][h] + -- retain infotext and doors_owner fields + minetest.swap_node(pos, {name = name .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- properly place doors:hidden at the right spot + local p3 = p2 + if new.state >= 2 then + p3 = (p3 + 3) % 4 + end + if new.state % 2 == 1 then + if new.state >= 2 then + p3 = (p3 + 1) % 4 + else + p3 = (p3 + 3) % 4 + end + end + -- wipe meta on top node as it's unused + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, + {name = "doors:hidden", param2 = p3}) + end + }) + + minetest.register_craftitem(":" .. name, { + description = def.description, + inventory_image = def.inventory_image, + groups = table.copy(def.groups), + + on_place = function(itemstack, placer, pointed_thing) + local pos + + if pointed_thing.type ~= "node" then + return itemstack + end + + local doorname = itemstack:get_name() + local node = minetest.get_node(pointed_thing.under) + local pdef = minetest.registered_nodes[node.name] + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return pdef.on_rightclick(pointed_thing.under, + node, placer, itemstack, pointed_thing) + end + + if pdef and pdef.buildable_to then + pos = pointed_thing.under + else + pos = pointed_thing.above + node = minetest.get_node(pos) + pdef = minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local top_node = minetest.get_node_or_nil(above) + local topdef = top_node and minetest.registered_nodes[top_node.name] + + if not topdef or not topdef.buildable_to then + return itemstack + end + + local pn = placer and placer:get_player_name() or "" + if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then + return itemstack + end + + local dir = placer and minetest.dir_to_facedir(placer:get_look_dir()) or 0 + + local ref = { + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + } + + local aside = { + x = pos.x + ref[dir + 1].x, + y = pos.y + ref[dir + 1].y, + z = pos.z + ref[dir + 1].z, + } + + local state = 0 + if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then + state = state + 2 + minetest.set_node(pos, {name = doorname .. "_b", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4}) + else + minetest.set_node(pos, {name = doorname .. "_a", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = dir}) + end + + local meta = minetest.get_meta(pos) + meta:set_int("state", state) + + if def.protected then + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + end + + if not minetest.is_creative_enabled(pn) then + itemstack:take_item() + end + + minetest.sound_play(def.sounds.place, {pos = pos}, true) + + on_place_node(pos, minetest.get_node(pos), + placer, node, itemstack, pointed_thing) + + return itemstack + end + }) + def.inventory_image = nil + + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) + end + def.recipe = nil + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + if not def.gain_open then + def.gain_open = 0.3 + end + + if not def.gain_close then + def.gain_close = 0.3 + end + + def.groups.not_in_creative_inventory = 1 + def.groups.door = 1 + def.drop = name + def.door = { + name = name, + sounds = {def.sound_close, def.sound_open}, + gains = {def.gain_close, def.gain_open}, + } + if not def.on_rightclick then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.door_toggle(pos, node, clicker) + return itemstack + end + end + def.after_dig_node = function(pos, node, meta, digger) + local above = pos:offset(0, 1, 0) + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + minetest.check_for_falling(above) + end + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end + + if def.protected then + def.can_dig = can_dig_door + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this locked door.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked door"), owner + end + def.node_dig_prediction = "" + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + local above = pos:offset(0, 1, 0) + -- hidden node doesn't get blasted away. + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + return {name} + end + end + + def.on_destruct = function(pos) + local above = pos:offset(0, 1, 0) + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + end + + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.sunlight_propagates = true + def.walkable = true + def.is_ground_content = false + def.buildable_to = false + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.use_texture_alpha = def.use_texture_alpha or "clip" + + def.mesh = "door_a.b3d" + minetest.register_node(":" .. name .. "_a", table.copy(def)) + + def.mesh = "door_b.b3d" + minetest.register_node(":" .. name .. "_b", table.copy(def)) + + def.mesh = "door_b.b3d" + minetest.register_node(":" .. name .. "_c", table.copy(def)) + + def.mesh = "door_a.b3d" + minetest.register_node(":" .. name .. "_d", table.copy(def)) + + doors.registered_doors[name .. "_a"] = true + doors.registered_doors[name .. "_b"] = true + doors.registered_doors[name .. "_c"] = true + doors.registered_doors[name .. "_d"] = true +end + +doors.register("door_wood", { + tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, + description = S("Wooden Door"), + inventory_image = "doors_item_wood.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + } +}) + +doors.register("door_steel", { + tiles = {{name = "doors_door_steel.png", backface_culling = true}}, + description = S("Steel Door"), + inventory_image = "doors_item_steel.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + +doors.register("door_glass", { + tiles = {"doors_door_glass.png"}, + description = S("Glass Door"), + inventory_image = "doors_item_glass.png", + groups = {node = 1, cracky=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + } +}) + +doors.register("door_obsidian_glass", { + tiles = {"doors_door_obsidian_glass.png"}, + description = S("Obsidian Glass Door"), + inventory_image = "doors_item_obsidian_glass.png", + groups = {node = 1, cracky=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + }, +}) + +-- Capture mods using the old API as best as possible. +function doors.register_door(name, def) + if def.only_placer_can_open then + def.protected = true + end + def.only_placer_can_open = nil + + local i = name:find(":") + local modname = name:sub(1, i - 1) + if not def.tiles then + if def.protected then + def.tiles = {{name = "doors_door_steel.png", backface_culling = true}} + else + def.tiles = {{name = "doors_door_wood.png", backface_culling = true}} + end + minetest.log("warning", modname .. " registered door \"" .. name .. "\" " .. + "using deprecated API method \"doors.register_door()\" but " .. + "did not provide the \"tiles\" parameter. A fallback tiledef " .. + "will be used instead.") + end + + doors.register(name, def) +end + +----trapdoor---- + +function doors.trapdoor_toggle(pos, node, clicker) + node = node or minetest.get_node(pos) + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + local def = minetest.registered_nodes[node.name] + + if string.sub(node.name, -5) == "_open" then + minetest.sound_play(def.sound_close, + {pos = pos, gain = def.gain_close, max_hear_distance = 10}, true) + minetest.swap_node(pos, {name = string.sub(node.name, 1, + string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) + else + minetest.sound_play(def.sound_open, + {pos = pos, gain = def.gain_open, max_hear_distance = 10}, true) + minetest.swap_node(pos, {name = node.name .. "_open", + param1 = node.param1, param2 = node.param2}) + end +end + +function doors.register_trapdoor(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + local name_closed = name + local name_opened = name.."_open" + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.trapdoor_toggle(pos, node, clicker) + return itemstack + end + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.is_ground_content = false + def.use_texture_alpha = def.use_texture_alpha or "clip" + + if def.protected then + def.can_dig = can_dig_door + def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local pn = placer:get_player_name() + local meta = minetest.get_meta(pos) + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + + return minetest.is_creative_enabled(pn) + end + + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this trapdoor.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked trapdoor"), owner + end + def.node_dig_prediction = "" + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + return {name} + end + end + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + if not def.gain_open then + def.gain_open = 0.3 + end + + if not def.gain_close then + def.gain_close = 0.3 + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + if def.nodebox_closed and def.nodebox_opened then + def_closed.node_box = def.nodebox_closed + else + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + end + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.tiles = { + def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, + def.tile_side, + def.tile_side, + def.tile_side + } + + if def.nodebox_opened and def.nodebox_closed then + def_opened.node_box = def.nodebox_opened + else + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + end + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.tiles = { + def.tile_side, + def.tile_side .. '^[transform2', + def.tile_side .. '^[transform3', + def.tile_side .. '^[transform1', + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6' + } + + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + minetest.register_node(name_opened, def_opened) + minetest.register_node(name_closed, def_closed) + + doors.registered_trapdoors[name_opened] = true + doors.registered_trapdoors[name_closed] = true +end + +doors.register_trapdoor("doors:trapdoor", { + description = S("Wooden Trapdoor"), + inventory_image = "doors_trapdoor.png", + wield_image = "doors_trapdoor.png", + tile_front = "doors_trapdoor.png", + tile_side = "doors_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + +doors.register_trapdoor("doors:trapdoor_steel", { + description = S("Steel Trapdoor"), + inventory_image = "doors_trapdoor_steel.png", + wield_image = "doors_trapdoor_steel.png", + tile_front = "doors_trapdoor_steel.png", + tile_side = "doors_trapdoor_steel_side.png", + protected = true, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + groups = {cracky = 1, level = 2, door = 1}, +}) + +minetest.register_craft({ + output = "doors:trapdoor 2", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "", ""}, + } +}) + +minetest.register_craft({ + output = "doors:trapdoor_steel", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + + +----fence gate---- +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +function doors.register_fencegate(name, def) + local fence = { + description = def.description, + drawtype = "mesh", + tiles = {}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = name .. "_closed", + connect_sides = {"left", "right"}, + groups = def.groups, + sounds = def.sounds, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local node_def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = node_def._gate, param2 = node.param2}) + minetest.sound_play(node_def._gate_sound, {pos = pos, gain = 0.15, + max_hear_distance = 8}, true) + return itemstack + end, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4} + }, + } + + + if type(def.texture) == "string" then + fence.tiles[1] = {name = def.texture, backface_culling = true} + elseif def.texture.backface_culling == nil then + fence.tiles[1] = table.copy(def.texture) + fence.tiles[1].backface_culling = true + else + fence.tiles[1] = def.texture + end + + if not fence.sounds then + fence.sounds = default.node_sound_wood_defaults() + end + + fence.groups.fence = 1 + + local fence_closed = table.copy(fence) + fence_closed.mesh = "doors_fencegate_closed.obj" + fence_closed._gate = name .. "_open" + fence_closed._gate_sound = "doors_fencegate_open" + fence_closed.collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + } + + local fence_open = table.copy(fence) + fence_open.mesh = "doors_fencegate_open.obj" + fence_open._gate = name .. "_closed" + fence_open._gate_sound = "doors_fencegate_close" + fence_open.groups.not_in_creative_inventory = 1 + fence_open.collision_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/8, -3/8, 1/2 + fence_collision_extra, 1/8}, + {-1/2, -3/8, -1/2, -3/8, 3/8, 0 }} + } + + minetest.register_node(":" .. name .. "_closed", fence_closed) + minetest.register_node(":" .. name .. "_open", fence_open) + + minetest.register_craft({ + output = name .. "_closed", + recipe = { + {"group:stick", def.material, "group:stick"}, + {"group:stick", def.material, "group:stick"} + } + }) +end + +doors.register_fencegate("doors:gate_wood", { + description = S("Apple Wood Fence Gate"), + texture = "default_wood.png", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_acacia_wood", { + description = S("Acacia Wood Fence Gate"), + texture = "default_acacia_wood.png", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_junglewood", { + description = S("Jungle Wood Fence Gate"), + texture = "default_junglewood.png", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_pine_wood", { + description = S("Pine Wood Fence Gate"), + texture = "default_pine_wood.png", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + +doors.register_fencegate("doors:gate_aspen_wood", { + description = S("Aspen Wood Fence Gate"), + texture = "default_aspen_wood.png", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + + +----fuels---- + +minetest.register_craft({ + type = "fuel", + recipe = "doors:trapdoor", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_wood", + burntime = 14, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_wood_closed", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_acacia_wood_closed", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_junglewood_closed", + burntime = 9, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_pine_wood_closed", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_aspen_wood_closed", + burntime = 5, +}) diff --git a/mods/minetest_game/doors/license.txt b/mods/minetest_game/doors/license.txt new file mode 100644 index 00000000..97e60c27 --- /dev/null +++ b/mods/minetest_game/doors/license.txt @@ -0,0 +1,164 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar (sofar@foo-projects.org) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2016 Fernando Zapata +Copyright (C) 2014-2016 celeron55 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar +Copyright (C) 2016 red-001 +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 PenguinDad + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/4.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014 CGEffex +Copyright (C) 2014 bennstir +Copyright (C) 2016 BarkersPinhead +Copyright (C) 2016 rivernile7 +Copyright (C) 2016 HazMatt + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +mhtaylor67 +SkeetMasterFunk69 + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public +domain by waiving all of his or her rights to the work worldwide under copyright law, +including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +Other Information + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as +publicity or privacy rights. +Unless expressly stated otherwise, the person who associated a work with this deed makes +no warranties about the work, and disclaims liability for all uses of the work, to the +fullest extent permitted by applicable law. +When using or citing the work, you should not imply endorsement by the author or the +affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/minetest_game/doors/locale/doors.de.tr b/mods/minetest_game/doors/locale/doors.de.tr new file mode 100644 index 00000000..79707ce8 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.de.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Verborgenes Türsegment +Owned by @1=Eigentum von @1 +You do not own this locked door.=Diese abgeschlossene Tür gehört Ihnen nicht. +a locked door=eine abgeschlossene Tür +Wooden Door=Holztür +Steel Door=Stahltür +Glass Door=Glastür +Obsidian Glass Door=Obsidianglastür +You do not own this trapdoor.=Diese Falltür gehört Ihnen nicht. +a locked trapdoor=eine abgeschlossene Falltür +Wooden Trapdoor=Holzfalltür +Steel Trapdoor=Stahlfalltür +Apple Wood Fence Gate=Apfelholzzauntor +Acacia Wood Fence Gate=Akazienholzzauntor +Jungle Wood Fence Gate=Dschungelholzzauntor +Pine Wood Fence Gate=Kiefernholzzauntor +Aspen Wood Fence Gate=Espenholzzauntor diff --git a/mods/minetest_game/doors/locale/doors.eo.tr b/mods/minetest_game/doors/locale/doors.eo.tr new file mode 100644 index 00000000..e8e10ddc --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.eo.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=KaÅita porda segmento +Owned by @1=Posedita de @1 +You do not own this locked door.=Vi ne posedas ĉi tiun Ålositan pordon. +a locked door=Ålosita pordo +Wooden Door=Ligna pordo +Steel Door=Åœtala pordo +Glass Door=Vitra pordo +Obsidian Glass Door=Obsidiana vitra pordo +You do not own this trapdoor.=Vi ne posedas ĉi tiun plankpordon. +a locked trapdoor=Ålosita plankpordo +Wooden Trapdoor=Ligna plankpordo +Steel Trapdoor=Åœtala plankpordo +Apple Wood Fence Gate=Poma ligna barila pordo +Acacia Wood Fence Gate=Akacia ligna barila pordo +Jungle Wood Fence Gate=Äœangala ligna barila pordo +Pine Wood Fence Gate=Pina ligna barila pordo +Aspen Wood Fence Gate=Tremola ligna barila pordo diff --git a/mods/minetest_game/doors/locale/doors.es.tr b/mods/minetest_game/doors/locale/doors.es.tr new file mode 100644 index 00000000..677f2dfd --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.es.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento de puerta oculta +Owned by @1=Propiedad de @1 +You do not own this locked door.=Esta puerta cerrada no te pertenece. +a locked door=una puerta cerrada +Wooden Door=Puerta de madera +Steel Door=Puerta de acero +Glass Door=Puerta de vidrio +Obsidian Glass Door=Puerta de vidrio de obsidiana +You do not own this trapdoor.=Esta trampilla no te pertenece. +a locked trapdoor=una trampilla cerrada +Wooden Trapdoor=Trampilla de madera +Steel Trapdoor=Trampilla de acero +Apple Wood Fence Gate=Puerta de cerca de manzano +Acacia Wood Fence Gate=Puerta de cerca de acacia +Jungle Wood Fence Gate=Puerta de cerca de madera tropical +Pine Wood Fence Gate=Puerta de cerca de pino +Aspen Wood Fence Gate=Puerta de cerca de álamo diff --git a/mods/minetest_game/doors/locale/doors.fr.tr b/mods/minetest_game/doors/locale/doors.fr.tr new file mode 100644 index 00000000..930f75cc --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.fr.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segment de porte cachée +Owned by @1=Possédée par @1 +You do not own this locked door.=Cette porte vérouillée ne vous appartient pas. +a locked door=une porte verouillée +Wooden Door=Porte en bois +Steel Door=Porte en acier +Glass Door=Porte en verre +Obsidian Glass Door=Porte en verre d'obsidienne +You do not own this trapdoor.=Vous ne possédez pas cette trappe. +a locked trapdoor=une trappe verouillée +Wooden Trapdoor=Trappe en bois +Steel Trapdoor=Trappe en acier +Apple Wood Fence Gate=Porte de clôture en bois de pommier +Acacia Wood Fence Gate=Porte de clôture en bois d'acacia +Jungle Wood Fence Gate=Porte de clôture en bois de la jungle +Pine Wood Fence Gate=Porte de clôture en bois de pin +Aspen Wood Fence Gate=Porte de clôture en bois de tremble diff --git a/mods/minetest_game/doors/locale/doors.id.tr b/mods/minetest_game/doors/locale/doors.id.tr new file mode 100644 index 00000000..3b749049 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.id.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Bagian Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu terkunci ini. +a locked door=pintu terkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Baja +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidian +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong terkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Baja +Apple Wood Fence Gate=Gerbang Kayu Pohon Apel +Acacia Wood Fence Gate=Gerbang Kayu Akasia +Jungle Wood Fence Gate=Gerbang Kayu Pohon Rimba +Pine Wood Fence Gate=Gerbang Kayu Pinus +Aspen Wood Fence Gate=Gerbang Kayu Aspen diff --git a/mods/minetest_game/doors/locale/doors.it.tr b/mods/minetest_game/doors/locale/doors.it.tr new file mode 100644 index 00000000..ccd00d36 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.it.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento di porta nascosto +Owned by @1=Di proprietà di @1 +You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave. +a locked door=una porta chiusa a chiave +Wooden Door=Porta di legno +Steel Door=Porta d'acciaio +Glass Door=Porta di vetro +Obsidian Glass Door=Porta di vetro d'ossidiana +You do not own this trapdoor.=Non sei il proprietario di questa botola. +a locked trapdoor=una botola chiusa a chiave +Wooden Trapdoor=Botola di legno +Steel Trapdoor=Botola d'acciaio +Apple Wood Fence Gate=Cancello della recinzione di legno di melo +Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia +Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla +Pine Wood Fence Gate=Cancello della recinzione di legno di pino +Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo diff --git a/mods/minetest_game/doors/locale/doors.ja.tr b/mods/minetest_game/doors/locale/doors.ja.tr new file mode 100644 index 00000000..b173504b --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.ja.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=éš ã—ドアã®åŒºåˆ‡ã‚Š +Owned by @1=所有者 @1 +You do not own this locked door.=ã‚ãªãŸã¯ã“ã®ãƒ­ãƒƒã‚¯ã•れãŸãƒ‰ã‚¢ã®æ‰€æœ‰è€…ã§ã¯ã‚りã¾ã›ã‚“。 +a locked door=ロックã•れãŸãƒ‰ã‚¢ +Wooden Door=木製ã®ãƒ‰ã‚¢ +Steel Door=鉄ã®ãƒ‰ã‚¢ +Glass Door=ガラスã®ãƒ‰ã‚¢ +Obsidian Glass Door=黒曜石ガラスã®ãƒ‰ã‚¢ +You do not own this trapdoor.=ã‚ãªãŸã¯ã“ã®ãƒˆãƒ©ãƒƒãƒ—ãƒ‰ã‚¢ã®æ‰€æœ‰è€…ã§ã¯ã‚りã¾ã›ã‚“。 +a locked trapdoor=ロックã•れãŸãƒˆãƒ©ãƒƒãƒ—ドア +Wooden Trapdoor=木製ã®ãƒˆãƒ©ãƒƒãƒ—ドア +Steel Trapdoor=鉄ã®ãƒˆãƒ©ãƒƒãƒ—ドア +Apple Wood Fence Gate=リンゴæã®ãƒ•ェンスゲート +Acacia Wood Fence Gate=アカシアæã®ãƒ•ェンスゲート +Jungle Wood Fence Gate=ジャングルæã®ãƒ•ェンスゲート +Pine Wood Fence Gate=マツæã®ãƒ•ェンスゲート +Aspen Wood Fence Gate=ãƒãƒ—ラæã®ãƒ•ェンスゲート diff --git a/mods/minetest_game/doors/locale/doors.jbo.tr b/mods/minetest_game/doors/locale/doors.jbo.tr new file mode 100644 index 00000000..f15854eb --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.jbo.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=lo se mipri pagbu be lo vrogai +Owned by @1=.i ti ponse zoi zo'i.@1.zo'i +You do not own this locked door.=.i do na ponse lo ti selstela vrogai +a locked door=lo selstela vrogai +Wooden Door=lo mudri vrogai +Steel Door=lo gasta vrogai +Glass Door=lo blaci vrogai +Obsidian Glass Door=lo je'erma'ablaci blaci vrogai +You do not own this trapdoor.=.i do na ponse lo ti selstela lolvrogai +a locked trapdoor=lo selstela lolvrogai +Wooden Trapdoor=lo mudri lolvrogai +Steel Trapdoor=lo gasta lolvrogai +Apple Wood Fence Gate=lo plisymudri garbimvrogai +Acacia Wood Fence Gate=lo atkaci,ia mudri garbimvrogai +Jungle Wood Fence Gate=lo glatimdemricfoi mudri garbimvrogai +Pine Wood Fence Gate=lo ku'urmudri garbimvrogai +Aspen Wood Fence Gate=lo mudrpopulu garbimvrogai diff --git a/mods/minetest_game/doors/locale/doors.lv.tr b/mods/minetest_game/doors/locale/doors.lv.tr new file mode 100644 index 00000000..624e440d --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.lv.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=PalsÄ“ptais durvju segments +Owned by @1=Saimnieks: @1 +You do not own this locked door.=Jums nepieder šīs aizslÄ“gtÄs durvis. +a locked door=AizslÄ“gtas durvis +Wooden Door=Koka durvis +Steel Door=TÄ“rauda durvis +Glass Door=Stikla durvis +Obsidian Glass Door=ObsidiÄnstikla durvis +You do not own this trapdoor.=Jums nepieder šī aizslÄ“gtÄ lÅ«ka. +a locked trapdoor=AizslÄ“gta lÅ«ka +Wooden Trapdoor=Koka lÅ«ka +Steel Trapdoor=TÄ“rauda lÅ«ka +Apple Wood Fence Gate=Ä€bolkoka žoga vÄrti +Acacia Wood Fence Gate=AkÄcijas žoga vÄrti +Jungle Wood Fence Gate=Džungļu koka žoga vÄrti +Pine Wood Fence Gate=Skujkoka žoga vÄrti +Aspen Wood Fence Gate=Apses žoga vÄrti diff --git a/mods/minetest_game/doors/locale/doors.ms.tr b/mods/minetest_game/doors/locale/doors.ms.tr new file mode 100644 index 00000000..93d6df2e --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.ms.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmen Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu berkunci ini. +a locked door=pintu berkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Keluli +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidia +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong berkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Keluli +Apple Wood Fence Gate=Pintu Pagar Kayu Epal +Acacia Wood Fence Gate=Pintu Pagar Kayu Akasia +Jungle Wood Fence Gate=Pintu Pagar Kayu Hutan +Pine Wood Fence Gate=Pintu Pagar Kayu Pain +Aspen Wood Fence Gate=Pintu Pagar Kayu Aspen diff --git a/mods/minetest_game/doors/locale/doors.pl.tr b/mods/minetest_game/doors/locale/doors.pl.tr new file mode 100644 index 00000000..6aec2852 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.pl.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Ukryty segment drzwi +Owned by @1=WÅ‚aÅ›ciciel: @1 +You do not own this locked door.=Nie jesteÅ› wÅ‚aÅ›cicielem tych zablokowanych drzwi. +a locked door=zablokowane drzwi +Wooden Door=Drewniane drzwi +Steel Door=Stalowe drzwi +Glass Door=Szklane drzwi +Obsidian Glass Door=Drzwi z obsydianowego szkÅ‚a +You do not own this trapdoor.=Nie jesteÅ› wÅ‚aÅ›cicielem tego wÅ‚azu. +a locked trapdoor=zablokowany wÅ‚az +Wooden Trapdoor=Drewniany wÅ‚az +Steel Trapdoor=Stalowy wÅ‚az +Apple Wood Fence Gate=Furtka z jabÅ‚kowego drzewa +Acacia Wood Fence Gate=Furtka z akacjowego drzewa +Jungle Wood Fence Gate=Furtka z dżunglowego drzewa +Pine Wood Fence Gate=Furtka z sosnowego drzewa +Aspen Wood Fence Gate=Furtka z brzozowego drzewa diff --git a/mods/minetest_game/doors/locale/doors.pt_BR.tr b/mods/minetest_game/doors/locale/doors.pt_BR.tr new file mode 100644 index 00000000..82324424 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento de Porta Oculto +Owned by @1=Propriedade de @1 +You do not own this locked door.=Você não é dono desta porta trancada. +a locked door=uma porta trancada +Wooden Door=Porta de Madeira +Steel Door=Porta de Aço +Glass Door=Porta de Vidro +Obsidian Glass Door=Porta de Vidro de Obsidiana +You do not own this trapdoor.=Você não é dono deste alçapão. +a locked trapdoor=um alçapão trancado +Wooden Trapdoor=Alçapão de Madeira +Steel Trapdoor=Alçapão de Aço +Apple Wood Fence Gate=Portão de Cerca de Macieira +Acacia Wood Fence Gate=Portão de Cerca de Acácia +Jungle Wood Fence Gate=Portão de Cerca de Madeira da Selva +Pine Wood Fence Gate=Portão de Cerca de Pinheiro +Aspen Wood Fence Gate=Portão de Cerca de Ãlamo diff --git a/mods/minetest_game/doors/locale/doors.ru.tr b/mods/minetest_game/doors/locale/doors.ru.tr new file mode 100644 index 00000000..7b967629 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.ru.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=СпрÑÑ‚Ð°Ð½Ð½Ð°Ñ Ñ‡Ð°Ñть двери +Owned by @1=Владелец: @1 +You do not own this locked door.=Ð’Ñ‹ не владелец Ñтой запертой двери. +a locked door=Ð·Ð°Ð¿ÐµÑ€Ñ‚Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +Wooden Door=ДеревÑÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +Steel Door=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +Glass Door=СтеклÑÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +Obsidian Glass Door=Дверь из обÑидианового Ñтекла +You do not own this trapdoor.=Ð’Ñ‹ не владелец Ñтого люка. +a locked trapdoor=запертый люк +Wooden Trapdoor=ДеревÑнный люк +Steel Trapdoor=Стальной люк +Apple Wood Fence Gate=Ð¯Ð±Ð»Ð¾Ð½ÐµÐ²Ð°Ñ ÐºÐ°Ð»Ð¸Ñ‚ÐºÐ° +Acacia Wood Fence Gate=ÐÐºÐ°Ñ†Ð¸ÐµÐ²Ð°Ñ ÐºÐ°Ð»Ð¸Ñ‚ÐºÐ° +Jungle Wood Fence Gate=Калитка из тропичеÑкого дерева +Pine Wood Fence Gate=СоÑÐ½Ð¾Ð²Ð°Ñ ÐºÐ°Ð»Ð¸Ñ‚ÐºÐ° +Aspen Wood Fence Gate=ОÑÐ¸Ð½Ð¾Ð²Ð°Ñ ÐºÐ°Ð»Ð¸Ñ‚ÐºÐ° diff --git a/mods/minetest_game/doors/locale/doors.sk.tr b/mods/minetest_game/doors/locale/doors.sk.tr new file mode 100644 index 00000000..e6943ac3 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.sk.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Skrytá ÄasÅ¥ dverí +Owned by @1=Vlastník - @1 +You do not own this locked door.=Nevlastníš tieto uzamknuté dvere. +a locked door=uzamknuté dvere +Wooden Door=Drevené dvere +Steel Door=Oceľové dvere +Glass Door=Sklenené dvere +Obsidian Glass Door=Obsidiánové sklenené dvere +You do not own this trapdoor.=Nevlastníš tieto padacie dvere. +a locked trapdoor=uzamknuté padacie dvere +Wooden Trapdoor=Drevené padacie dvere +Steel Trapdoor=Oceľové padacie dvere +Apple Wood Fence Gate=Drevený plot z jablone +Acacia Wood Fence Gate=Drevený plot z akácie +Jungle Wood Fence Gate=Drevený plot z džungľového dreva +Pine Wood Fence Gate=Drevený plot z borovice +Aspen Wood Fence Gate=Drevený plot z osiky diff --git a/mods/minetest_game/doors/locale/doors.sv.tr b/mods/minetest_game/doors/locale/doors.sv.tr new file mode 100644 index 00000000..9f31d9c8 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.sv.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Dolt dörrsegment +Owned by @1=Ägd av @1 +You do not own this locked door.=Du äger inte denna lÃ¥sta dörr. +a locked door=en lÃ¥st dörr +Wooden Door=Trädörr +Steel Door=StÃ¥ldörr +Glass Door=Glasdörr +Obsidian Glass Door=Obsidianglasdörr +You do not own this trapdoor.=Du äger inte denna fallucka +a locked trapdoor=en lÃ¥st fallucka +Wooden Trapdoor=Träfallucka +Steel Trapdoor=StÃ¥lfallucka +Apple Wood Fence Gate=Äppleträfallucka +Acacia Wood Fence Gate=Akaciaträfallucka +Jungle Wood Fence Gate=Djungelträfallucka +Pine Wood Fence Gate=Tallträfallucka +Aspen Wood Fence Gate=Aspträfallucka diff --git a/mods/minetest_game/doors/locale/doors.uk.tr b/mods/minetest_game/doors/locale/doors.uk.tr new file mode 100644 index 00000000..fc07f397 --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.uk.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Прихована чаÑтина дверей +Owned by @1=ВлаÑник: @1 +You do not own this locked door.=Ви — не влаÑник цих замкнених дверей. +a locked door=замкнені двері +Wooden Door=Дерев'Ñні двері +Steel Door=Сталеві двері +Glass Door=СклÑні двері +Obsidian Glass Door=Двері з обÑидіанового Ñкла +You do not own this trapdoor.=Ви — не влаÑник цього люка. +a locked trapdoor=замкнений люк +Wooden Trapdoor=Дерев'Ñний люк +Steel Trapdoor=Сталевий люк +Apple Wood Fence Gate=Яблунева хвіртка +Acacia Wood Fence Gate=Ðкацієва хвіртка +Jungle Wood Fence Gate=Хвіртка з тропічного дерева +Pine Wood Fence Gate=СоÑнова хвіртка +Aspen Wood Fence Gate=ОÑикова хвіртка diff --git a/mods/minetest_game/doors/locale/doors.zh_CN.tr b/mods/minetest_game/doors/locale/doors.zh_CN.tr new file mode 100644 index 00000000..cf32996e --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.zh_CN.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=éšè—门段 +Owned by @1=ç”±@1所有 +You do not own this locked door.=这个门ä¸å±žäºŽä½ ã€‚ +a locked door=一扇已上é”的门 +Wooden Door=木门 +Steel Door=é“é—¨ +Glass Door=玻璃门 +Obsidian Glass Door=黑曜石玻璃门 +You do not own this trapdoor.=这个活æ¿é—¨ä¸å±žäºŽä½ ã€‚ +a locked trapdoor=一扇已上é”的活æ¿é—¨ +Wooden Trapdoor=木活æ¿é—¨ +Steel Trapdoor=铿´»æ¿é—¨ +Apple Wood Fence Gate=苹果木栅æ é—¨ +Acacia Wood Fence Gate=ç›¸æ€æœ¨æ …æ é—¨ +Jungle Wood Fence Gate=丛林木栅æ é—¨ +Pine Wood Fence Gate=æ¾æœ¨æ …æ é—¨ +Aspen Wood Fence Gate=ç™½æ¨æœ¨æ …æ é—¨ diff --git a/mods/minetest_game/doors/locale/doors.zh_TW.tr b/mods/minetest_game/doors/locale/doors.zh_TW.tr new file mode 100644 index 00000000..81e06fcc --- /dev/null +++ b/mods/minetest_game/doors/locale/doors.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=éš±è—門段 +Owned by @1=ç”±@1æ“æœ‰ +You do not own this locked door.=這個門ä¸å±¬æ–¼ä½ æ‰€æœ‰ã€‚ +a locked door=一扇已上鎖的門 +Wooden Door=木門 +Steel Door=éµé–€ +Glass Door=玻璃門 +Obsidian Glass Door=黑曜石玻璃門 +You do not own this trapdoor.=這個活æ¿é–€ä¸å±¬æ–¼ä½ æ‰€æœ‰ã€‚ +a locked trapdoor=一扇已上鎖的活æ¿é–€ +Wooden Trapdoor=木活æ¿é–€ +Steel Trapdoor=鵿´»æ¿é–€ +Apple Wood Fence Gate=蘋果木柵欄門 +Acacia Wood Fence Gate=ç›¸æ€æœ¨æŸµæ¬„é–€ +Jungle Wood Fence Gate=墿ž—木柵欄門 +Pine Wood Fence Gate=æ¾æœ¨æŸµæ¬„é–€ +Aspen Wood Fence Gate=白楊木柵欄門 diff --git a/mods/minetest_game/doors/locale/template.txt b/mods/minetest_game/doors/locale/template.txt new file mode 100644 index 00000000..8b5c349c --- /dev/null +++ b/mods/minetest_game/doors/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment= +Owned by @1= +You do not own this locked door.= +a locked door= +Wooden Door= +Steel Door= +Glass Door= +Obsidian Glass Door= +You do not own this trapdoor.= +a locked trapdoor= +Wooden Trapdoor= +Steel Trapdoor= +Apple Wood Fence Gate= +Acacia Wood Fence Gate= +Jungle Wood Fence Gate= +Pine Wood Fence Gate= +Aspen Wood Fence Gate= diff --git a/mods/minetest_game/doors/mod.conf b/mods/minetest_game/doors/mod.conf new file mode 100644 index 00000000..de053c27 --- /dev/null +++ b/mods/minetest_game/doors/mod.conf @@ -0,0 +1,4 @@ +name = doors +description = Minetest Game mod: doors +depends = default +optional_depends = screwdriver diff --git a/mods/minetest_game/doors/models/door_a.b3d b/mods/minetest_game/doors/models/door_a.b3d new file mode 100644 index 00000000..7f9249fe Binary files /dev/null and b/mods/minetest_game/doors/models/door_a.b3d differ diff --git a/mods/minetest_game/doors/models/door_b.b3d b/mods/minetest_game/doors/models/door_b.b3d new file mode 100644 index 00000000..77a1a16c Binary files /dev/null and b/mods/minetest_game/doors/models/door_b.b3d differ diff --git a/mods/minetest_game/doors/models/doors_fencegate_closed.obj b/mods/minetest_game/doors/models/doors_fencegate_closed.obj new file mode 100644 index 00000000..0050f70e --- /dev/null +++ b/mods/minetest_game/doors/models/doors_fencegate_closed.obj @@ -0,0 +1,106 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_closed.blend' +# www.blender.org +mtllib gate_closed.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -0.125000 +v -0.375000 0.187500 0.062500 +v -0.375000 0.312500 0.062500 +v -0.375000 0.187500 -0.062500 +v -0.375000 0.312500 -0.062500 +v 0.375000 0.187500 0.062500 +v 0.375000 0.312500 0.062500 +v 0.375000 0.187500 -0.062500 +v 0.375000 0.312500 -0.062500 +v -0.374831 0.187348 0.062500 +v -0.156342 0.187363 0.062500 +v -0.374831 0.187348 -0.062500 +v -0.156342 0.187363 -0.062500 +v 0.374981 -0.343683 0.062500 +v 0.375065 -0.187304 0.062500 +v 0.374981 -0.343683 -0.062500 +v 0.375065 -0.187304 -0.062500 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.578000 -0.816100 0.000000 +vn 0.576200 0.817300 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/2 24/3/2 23/19/2 19/20/2 +f 22/1/4 18/4/4 17/21/4 21/22/4 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/2 32/28/2 31/29/2 27/30/2 +f 30/31/4 26/32/4 25/33/4 29/34/4 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 diff --git a/mods/minetest_game/doors/models/doors_fencegate_open.obj b/mods/minetest_game/doors/models/doors_fencegate_open.obj new file mode 100644 index 00000000..3fb727f4 --- /dev/null +++ b/mods/minetest_game/doors/models/doors_fencegate_open.obj @@ -0,0 +1,112 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_open.blend' +# www.blender.org +mtllib gate_open.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -0.125000 +v 0.434859 0.187500 -0.872359 +v 0.434859 0.312500 -0.872359 +v 0.559859 0.187500 -0.872359 +v 0.559859 0.312500 -0.872359 +v 0.434859 0.187500 -0.122359 +v 0.434859 0.312500 -0.122359 +v 0.559859 0.187500 -0.122359 +v 0.559859 0.312500 -0.122359 +v 0.434859 0.187348 -0.872190 +v 0.434859 0.187363 -0.653701 +v 0.559859 0.187348 -0.872190 +v 0.559859 0.187363 -0.653701 +v 0.434859 -0.343683 -0.122379 +v 0.434859 -0.187304 -0.122294 +v 0.559859 -0.343683 -0.122379 +v 0.559859 -0.187304 -0.122294 +v 0.499560 -0.442900 0.005495 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.625000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.816100 -0.578000 +vn 0.000000 0.817300 0.576200 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/3 24/3/3 23/19/3 19/20/3 +f 22/1/1 18/4/1 17/21/1 21/22/1 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/3 32/28/3 31/29/3 27/30/3 +f 30/31/1 26/32/1 25/33/1 29/34/1 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 +f 17/41/2 18/42/2 20/43/2 19/44/2 diff --git a/mods/minetest_game/doors/sounds/doors_door_close.ogg b/mods/minetest_game/doors/sounds/doors_door_close.ogg new file mode 100644 index 00000000..fede4af3 Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_door_close.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_door_open.ogg b/mods/minetest_game/doors/sounds/doors_door_open.ogg new file mode 100644 index 00000000..9a4c4f11 Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_door_open.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_fencegate_close.ogg b/mods/minetest_game/doors/sounds/doors_fencegate_close.ogg new file mode 100644 index 00000000..d42590ff Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_fencegate_close.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_fencegate_open.ogg b/mods/minetest_game/doors/sounds/doors_fencegate_open.ogg new file mode 100644 index 00000000..f6dfd1d9 Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_fencegate_open.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_glass_door_close.ogg b/mods/minetest_game/doors/sounds/doors_glass_door_close.ogg new file mode 100644 index 00000000..b3c13559 Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_glass_door_close.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_glass_door_open.ogg b/mods/minetest_game/doors/sounds/doors_glass_door_open.ogg new file mode 100644 index 00000000..66e6812d Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_glass_door_open.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_steel_door_close.ogg b/mods/minetest_game/doors/sounds/doors_steel_door_close.ogg new file mode 100644 index 00000000..aea7be67 Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_steel_door_close.ogg differ diff --git a/mods/minetest_game/doors/sounds/doors_steel_door_open.ogg b/mods/minetest_game/doors/sounds/doors_steel_door_open.ogg new file mode 100644 index 00000000..de874770 Binary files /dev/null and b/mods/minetest_game/doors/sounds/doors_steel_door_open.ogg differ diff --git a/mods/minetest_game/doors/textures/doors_door_glass.png b/mods/minetest_game/doors/textures/doors_door_glass.png new file mode 100644 index 00000000..ea6fdc1f Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_door_glass.png differ diff --git a/mods/minetest_game/doors/textures/doors_door_obsidian_glass.png b/mods/minetest_game/doors/textures/doors_door_obsidian_glass.png new file mode 100644 index 00000000..fab25b34 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_door_obsidian_glass.png differ diff --git a/mods/minetest_game/doors/textures/doors_door_steel.png b/mods/minetest_game/doors/textures/doors_door_steel.png new file mode 100644 index 00000000..9e33ff1a Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_door_steel.png differ diff --git a/mods/minetest_game/doors/textures/doors_door_wood.png b/mods/minetest_game/doors/textures/doors_door_wood.png new file mode 100644 index 00000000..c073faf1 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_door_wood.png differ diff --git a/mods/minetest_game/doors/textures/doors_hidden_segment.png b/mods/minetest_game/doors/textures/doors_hidden_segment.png new file mode 100644 index 00000000..b3b6f34c Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_hidden_segment.png differ diff --git a/mods/minetest_game/doors/textures/doors_item_glass.png b/mods/minetest_game/doors/textures/doors_item_glass.png new file mode 100644 index 00000000..d883f6e6 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_item_glass.png differ diff --git a/mods/minetest_game/doors/textures/doors_item_obsidian_glass.png b/mods/minetest_game/doors/textures/doors_item_obsidian_glass.png new file mode 100644 index 00000000..8c7920c5 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_item_obsidian_glass.png differ diff --git a/mods/minetest_game/doors/textures/doors_item_steel.png b/mods/minetest_game/doors/textures/doors_item_steel.png new file mode 100644 index 00000000..dd99e136 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_item_steel.png differ diff --git a/mods/minetest_game/doors/textures/doors_item_wood.png b/mods/minetest_game/doors/textures/doors_item_wood.png new file mode 100644 index 00000000..d3a62ab1 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_item_wood.png differ diff --git a/mods/minetest_game/doors/textures/doors_trapdoor.png b/mods/minetest_game/doors/textures/doors_trapdoor.png new file mode 100644 index 00000000..e92c8b2e Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_trapdoor.png differ diff --git a/mods/minetest_game/doors/textures/doors_trapdoor_side.png b/mods/minetest_game/doors/textures/doors_trapdoor_side.png new file mode 100644 index 00000000..55981ea3 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_trapdoor_side.png differ diff --git a/mods/minetest_game/doors/textures/doors_trapdoor_steel.png b/mods/minetest_game/doors/textures/doors_trapdoor_steel.png new file mode 100644 index 00000000..4ba507d6 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_trapdoor_steel.png differ diff --git a/mods/minetest_game/doors/textures/doors_trapdoor_steel_side.png b/mods/minetest_game/doors/textures/doors_trapdoor_steel_side.png new file mode 100644 index 00000000..e29c59e0 Binary files /dev/null and b/mods/minetest_game/doors/textures/doors_trapdoor_steel_side.png differ diff --git a/mods/minetest_game/dungeon_loot/README.txt b/mods/minetest_game/dungeon_loot/README.txt new file mode 100644 index 00000000..c500d255 --- /dev/null +++ b/mods/minetest_game/dungeon_loot/README.txt @@ -0,0 +1,11 @@ +Minetest Game mod: dungeon_loot +=============================== +Adds randomly generated chests with some "loot" to generated dungeons, +an API to register additional loot is provided. +Only works if dungeons are actually enabled in mapgen flags. + +License information can be found in license.txt + +Authors of source code +---------------------- +Originally by sfan5 (MIT) diff --git a/mods/minetest_game/dungeon_loot/init.lua b/mods/minetest_game/dungeon_loot/init.lua new file mode 100644 index 00000000..9d8ac52f --- /dev/null +++ b/mods/minetest_game/dungeon_loot/init.lua @@ -0,0 +1,8 @@ +dungeon_loot = {} + +dungeon_loot.CHESTS_MIN = 0 -- not necessarily in a single dungeon +dungeon_loot.CHESTS_MAX = 2 +dungeon_loot.STACKS_PER_CHEST_MAX = 8 + +dofile(minetest.get_modpath("dungeon_loot") .. "/loot.lua") +dofile(minetest.get_modpath("dungeon_loot") .. "/mapgen.lua") diff --git a/mods/minetest_game/dungeon_loot/license.txt b/mods/minetest_game/dungeon_loot/license.txt new file mode 100644 index 00000000..0af30a0c --- /dev/null +++ b/mods/minetest_game/dungeon_loot/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 sfan5 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/minetest_game/dungeon_loot/loot.lua b/mods/minetest_game/dungeon_loot/loot.lua new file mode 100644 index 00000000..a5a40973 --- /dev/null +++ b/mods/minetest_game/dungeon_loot/loot.lua @@ -0,0 +1,60 @@ +-- Loot from the `default` mod is registered here, +-- with the rest being registered in the respective mods + +dungeon_loot.registered_loot = { + -- various items + {name = "default:stick", chance = 0.6, count = {3, 6}}, + {name = "default:flint", chance = 0.4, count = {1, 3}}, + + -- farming / consumable + {name = "default:apple", chance = 0.4, count = {1, 4}}, + {name = "default:cactus", chance = 0.4, count = {1, 4}, + types = {"sandstone", "desert"}}, + + -- minerals + {name = "default:coal_lump", chance = 0.9, count = {1, 12}}, + {name = "default:gold_ingot", chance = 0.5}, + {name = "default:steel_ingot", chance = 0.4, count = {1, 6}}, + {name = "default:mese_crystal", chance = 0.1, count = {2, 3}}, + + -- tools + {name = "default:sword_wood", chance = 0.6}, + {name = "default:pick_stone", chance = 0.3}, + {name = "default:axe_diamond", chance = 0.05}, + + -- natural materials + {name = "default:sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, + types = {"normal"}}, + {name = "default:desert_sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, + types = {"sandstone"}}, + {name = "default:desert_cobble", chance = 0.8, count = {4, 32}, + types = {"desert"}}, + {name = "default:snow", chance = 0.8, count = {8, 64}, y = {-64, 32768}, + types = {"ice"}}, + {name = "default:dirt", chance = 0.6, count = {2, 16}, y = {-64, 32768}, + types = {"normal", "sandstone", "desert"}}, + {name = "default:obsidian", chance = 0.25, count = {1, 3}, y = {-32768, -512}}, + {name = "default:mese", chance = 0.15, y = {-32768, -512}}, +} + +function dungeon_loot.register(t) + if t.name ~= nil then + t = {t} -- single entry + end + for _, loot in ipairs(t) do + table.insert(dungeon_loot.registered_loot, loot) + end +end + +function dungeon_loot._internal_get_loot(pos_y, dungeontype) + -- filter by y pos and type + local ret = {} + for _, l in ipairs(dungeon_loot.registered_loot) do + if l.y == nil or (pos_y >= l.y[1] and pos_y <= l.y[2]) then + if l.types == nil or table.indexof(l.types, dungeontype) ~= -1 then + table.insert(ret, l) + end + end + end + return ret +end diff --git a/mods/minetest_game/dungeon_loot/mapgen.lua b/mods/minetest_game/dungeon_loot/mapgen.lua new file mode 100644 index 00000000..3b597f2e --- /dev/null +++ b/mods/minetest_game/dungeon_loot/mapgen.lua @@ -0,0 +1,173 @@ +minetest.set_gen_notify({dungeon = true, temple = true}) + +local function noise3d_integer(noise, pos) + return math.abs(math.floor(noise:get_3d(pos) * 0x7fffffff)) +end + +local function random_sample(rand, list, count) + local ret = {} + for n = 1, count do + local idx = rand:next(1, #list) + table.insert(ret, list[idx]) + table.remove(list, idx) + end + return ret +end + +local function find_walls(cpos, is_temple) + local is_wall = function(node) + return node.name ~= "air" and node.name ~= "ignore" + end + + local dirs = {{x=1, z=0}, {x=-1, z=0}, {x=0, z=1}, {x=0, z=-1}} + local get_node = minetest.get_node + + local ret = {} + local mindist = {x=0, z=0} + local min = function(a, b) return a ~= 0 and math.min(a, b) or b end + for _, dir in ipairs(dirs) do + for i = 1, 9 do -- 9 = max room size / 2 + local pos = vector.add(cpos, {x=dir.x*i, y=0, z=dir.z*i}) + + -- continue in that direction until we find a wall-like node + local node = get_node(pos) + if is_wall(node) then + local front_below = vector.subtract(pos, {x=dir.x, y=1, z=dir.z}) + local above = vector.add(pos, {x=0, y=1, z=0}) + + -- check that it: + --- is at least 2 nodes high (not a staircase) + --- has a floor + if is_wall(get_node(front_below)) and is_wall(get_node(above)) then + table.insert(ret, {pos = pos, facing = {x=-dir.x, y=0, z=-dir.z}}) + if dir.z == 0 then + mindist.x = min(mindist.x, i-1) + else + mindist.z = min(mindist.z, i-1) + end + end + -- abort even if it wasn't a wall cause something is in the way + break + end + end + end + + local biome = minetest.get_biome_data(cpos) + biome = biome and minetest.get_biome_name(biome.biome) or "" + local type = "normal" + if is_temple or biome:find("desert") == 1 then + type = "desert" + elseif biome:find("sandstone_desert") == 1 then + type = "sandstone" + elseif biome:find("icesheet") == 1 then + type = "ice" + end + + return { + walls = ret, + size = {x=mindist.x*2, z=mindist.z*2}, + type = type, + } +end + +local function populate_chest(pos, rand, dungeontype) + --minetest.chat_send_all("chest placed at " .. minetest.pos_to_string(pos) .. " [" .. dungeontype .. "]") + --minetest.add_node(vector.add(pos, {x=0, y=1, z=0}), {name="default:torch", param2=1}) + + local item_list = dungeon_loot._internal_get_loot(pos.y, dungeontype) + -- take random (partial) sample of all possible items + local sample_n = math.min(#item_list, dungeon_loot.STACKS_PER_CHEST_MAX) + item_list = random_sample(rand, item_list, sample_n) + + -- apply chances / randomized amounts and collect resulting items + local items = {} + for _, loot in ipairs(item_list) do + if rand:next(0, 1000) / 1000 <= loot.chance then + local itemdef = minetest.registered_items[loot.name] + local amount = 1 + if loot.count ~= nil then + amount = rand:next(loot.count[1], loot.count[2]) + end + + if not itemdef then + minetest.log("warning", "Registered loot item " .. loot.name .. " does not exist") + elseif itemdef.tool_capabilities then + for n = 1, amount do + local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear + table.insert(items, ItemStack({name = loot.name, wear = wear})) + end + elseif itemdef.stack_max == 1 then + -- not stackable, add separately + for n = 1, amount do + table.insert(items, loot.name) + end + else + table.insert(items, ItemStack({name = loot.name, count = amount})) + end + end + end + + -- place items at random places in chest + local inv = minetest.get_meta(pos):get_inventory() + local listsz = inv:get_size("main") + assert(listsz >= #items) + for _, item in ipairs(items) do + local index = rand:next(1, listsz) + if inv:get_stack("main", index):is_empty() then + inv:set_stack("main", index, item) + else + inv:add_item("main", item) -- space occupied, just put it anywhere + end + end +end + + +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = gennotify["dungeon"] or {} + local n_dungeons = #poslist + -- Add MGv6 desert temples to the list too + for _, entry in ipairs(gennotify["temple"] or {}) do + table.insert(poslist, entry) + end + if #poslist == 0 then return end + + local noise = minetest.get_perlin(10115, 4, 0.5, 1) + local rand = PcgRandom(noise3d_integer(noise, poslist[1])) + + local candidates = {} + -- process at most 8 rooms to keep runtime of this predictable + local num_process = math.min(#poslist, 8) + for i = 1, num_process do + local room = find_walls(poslist[i], i > n_dungeons) + -- skip small rooms and everything that doesn't at least have 3 walls + if math.min(room.size.x, room.size.z) >= 4 and #room.walls >= 3 then + table.insert(candidates, room) + end + end + + local num_chests = rand:next(dungeon_loot.CHESTS_MIN, dungeon_loot.CHESTS_MAX) + num_chests = math.min(#candidates, num_chests) + local rooms = random_sample(rand, candidates, num_chests) + + for _, room in ipairs(rooms) do + -- choose place somewhere in front of any of the walls + local wall = room.walls[rand:next(1, #room.walls)] + local v, vi -- vector / axis that runs alongside the wall + if wall.facing.x ~= 0 then + v, vi = {x=0, y=0, z=1}, "z" + else + v, vi = {x=1, y=0, z=0}, "x" + end + local chestpos = vector.add(wall.pos, wall.facing) + local off = rand:next(-room.size[vi]/2 + 1, room.size[vi]/2 - 1) + chestpos = vector.add(chestpos, vector.multiply(v, off)) + + if minetest.get_node(chestpos).name == "air" then + -- make it face inwards to the room + local facedir = minetest.dir_to_facedir(vector.multiply(wall.facing, -1)) + minetest.add_node(chestpos, {name = "default:chest", param2 = facedir}) + populate_chest(chestpos, PcgRandom(noise3d_integer(noise, chestpos)), room.type) + end + end +end) diff --git a/mods/minetest_game/dungeon_loot/mod.conf b/mods/minetest_game/dungeon_loot/mod.conf new file mode 100644 index 00000000..79d80899 --- /dev/null +++ b/mods/minetest_game/dungeon_loot/mod.conf @@ -0,0 +1,3 @@ +name = dungeon_loot +description = Minetest Game mod: dungeon_loot +depends = default diff --git a/mods/minetest_game/dye/README.txt b/mods/minetest_game/dye/README.txt new file mode 100644 index 00000000..4b922fa8 --- /dev/null +++ b/mods/minetest_game/dye/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: dye +====================== +See license.txt for license information. +See init.lua for documentation. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Perttu Ahola (celeron55) (CC BY-SA 3.0) diff --git a/mods/minetest_game/dye/init.lua b/mods/minetest_game/dye/init.lua new file mode 100644 index 00000000..f0affe8b --- /dev/null +++ b/mods/minetest_game/dye/init.lua @@ -0,0 +1,127 @@ +-- dye/init.lua + +dye = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("dye") + +-- Make dye names and descriptions available globally + +dye.dyes = { + {"white", "White"}, + {"grey", "Grey"}, + {"dark_grey", "Dark Grey"}, + {"black", "Black"}, + {"violet", "Violet"}, + {"blue", "Blue"}, + {"cyan", "Cyan"}, + {"dark_green", "Dark Green"}, + {"green", "Green"}, + {"yellow", "Yellow"}, + {"brown", "Brown"}, + {"orange", "Orange"}, + {"red", "Red"}, + {"magenta", "Magenta"}, + {"pink", "Pink"}, +} + +-- Define items + +for _, row in ipairs(dye.dyes) do + local name = row[1] + local description = row[2] + local groups = {dye = 1} + groups["color_" .. name] = 1 + + minetest.register_craftitem("dye:" .. name, { + inventory_image = "dye_" .. name .. ".png", + description = S(description .. " Dye"), + groups = groups + }) + + minetest.register_craft({ + output = "dye:" .. name .. " 4", + recipe = { + {"group:flower,color_" .. name} + }, + }) +end + +-- Manually add coal -> black dye + +minetest.register_craft({ + output = "dye:black 4", + recipe = { + {"group:coal"} + }, +}) + +-- Manually add blueberries->violet dye + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"default:blueberries"} + }, +}) + +-- Mix recipes + +local dye_recipes = { + -- src1, src2, dst + -- RYB mixes + {"red", "blue", "violet"}, -- "purple" + {"yellow", "red", "orange"}, + {"yellow", "blue", "green"}, + -- RYB complementary mixes + {"yellow", "violet", "dark_grey"}, + {"blue", "orange", "dark_grey"}, + -- CMY mixes - approximation + {"cyan", "yellow", "green"}, + {"cyan", "magenta", "blue"}, + {"yellow", "magenta", "red"}, + -- other mixes that result in a color we have + {"red", "green", "brown"}, + {"magenta", "blue", "violet"}, + {"green", "blue", "cyan"}, + {"pink", "violet", "magenta"}, + -- mixes with black + {"white", "black", "grey"}, + {"grey", "black", "dark_grey"}, + {"green", "black", "dark_green"}, + {"orange", "black", "brown"}, + -- mixes with white + {"white", "red", "pink"}, + {"white", "dark_grey", "grey"}, + {"white", "dark_green", "green"}, +} + +for _, mix in pairs(dye_recipes) do + minetest.register_craft({ + type = "shapeless", + output = "dye:" .. mix[3] .. " 2", + recipe = {"dye:" .. mix[1], "dye:" .. mix[2]}, + }) +end + +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this run: +-- for _,e in ipairs(dye.dyes) do print(("S(%q)"):format(e[2].." Dye")) end + +--[[ +S("White Dye") +S("Grey Dye") +S("Dark Grey Dye") +S("Black Dye") +S("Violet Dye") +S("Blue Dye") +S("Cyan Dye") +S("Dark Green Dye") +S("Green Dye") +S("Yellow Dye") +S("Brown Dye") +S("Orange Dye") +S("Red Dye") +S("Magenta Dye") +S("Pink Dye") +--]] diff --git a/mods/minetest_game/dye/license.txt b/mods/minetest_game/dye/license.txt new file mode 100644 index 00000000..340820ce --- /dev/null +++ b/mods/minetest_game/dye/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/dye/locale/dye.de.tr b/mods/minetest_game/dye/locale/dye.de.tr new file mode 100644 index 00000000..f73fb572 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.de.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Weißer Farbstoff +Grey Dye=Grauer Farbstoff +Dark Grey Dye=Dunkelgrauer Farbstoff +Black Dye=Schwarzer Farbstoff +Violet Dye=Violetter Farbstoff +Blue Dye=Blauer Farbstoff +Cyan Dye=Türkiser Farbstoff +Dark Green Dye=Dunkelgrüner Farbstoff +Green Dye=Grüner Farbstoff +Yellow Dye=Gelber Farbstoff +Brown Dye=Brauner Farbstoff +Orange Dye=Orange Farbstoff +Red Dye=Roter Farbstoff +Magenta Dye=Magenta Farbstoff +Pink Dye=Rosa Farbstoff diff --git a/mods/minetest_game/dye/locale/dye.eo.tr b/mods/minetest_game/dye/locale/dye.eo.tr new file mode 100644 index 00000000..ee37abbb --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.eo.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Blanka tinkturo +Grey Dye=Griza tinkturo +Dark Grey Dye=Malhela griza tinkturo +Black Dye=Nigra tinkturo +Violet Dye=Violkolora tinkturo +Blue Dye=Blua tinkturo +Cyan Dye=Bluverda tinkturo +Dark Green Dye=Malhela verda tinkturo +Green Dye=Verda tinkturo +Yellow Dye=Flava tinkturo +Brown Dye=Bruna tinkturo +Orange Dye=OranÄkolora tinkturo +Red Dye=RuÄa tinkturo +Magenta Dye=Fiksina tinkturo +Pink Dye=Rozkolora tinkturo diff --git a/mods/minetest_game/dye/locale/dye.es.tr b/mods/minetest_game/dye/locale/dye.es.tr new file mode 100644 index 00000000..bd04ef45 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.es.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Tinte blanco +Grey Dye=Tinte gris +Dark Grey Dye=Tinte gris oscuro +Black Dye=Tinte negro +Violet Dye=Tinte violeta +Blue Dye=Tinte azul +Cyan Dye=Tinte cián +Dark Green Dye=Tinte verde oscuro +Green Dye=Tinte verde +Yellow Dye=Tinte amarillo +Brown Dye=Tinte marrón +Orange Dye=Tinte naranja +Red Dye=Tinte rojo +Magenta Dye=Tinte magenta +Pink Dye=Tinte rosa diff --git a/mods/minetest_game/dye/locale/dye.fr.tr b/mods/minetest_game/dye/locale/dye.fr.tr new file mode 100644 index 00000000..390fa07c --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.fr.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Colorant blanc +Grey Dye=Colorant gris +Dark Grey Dye=Colorant gris foncé +Black Dye=Colorant noir +Violet Dye=Colorant violet +Blue Dye=Colorant bleu +Cyan Dye=Colorant cyan +Dark Green Dye=Colorant vert foncé +Green Dye=Colorant vert +Yellow Dye=Colorant jaune +Brown Dye=Colorant marron +Orange Dye=Colorant orange +Red Dye=Colorant rouge +Magenta Dye=Colorant magenta +Pink Dye=Colorant rose diff --git a/mods/minetest_game/dye/locale/dye.id.tr b/mods/minetest_game/dye/locale/dye.id.tr new file mode 100644 index 00000000..d5871075 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.id.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Pewarna Putih +Grey Dye=Pewarna Abu +Dark Grey Dye=Pewarna Abu Tua +Black Dye=Pewarna Hitam +Violet Dye=Pewarna Ungu +Blue Dye=Pewarna Biru +Cyan Dye=Pewarna Sian +Dark Green Dye=Pewarna Hijau Tua +Green Dye=Pewarna Hijau +Yellow Dye=Pewarna Kuning +Brown Dye=Pewarna Cokelat +Orange Dye=Pewarna Oranye +Red Dye=Pewarna Merah +Magenta Dye=Pewarna Magenta +Pink Dye=Pewarna Merah Muda diff --git a/mods/minetest_game/dye/locale/dye.it.tr b/mods/minetest_game/dye/locale/dye.it.tr new file mode 100644 index 00000000..9deb385e --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.it.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Tintura bianca +Grey Dye=Tintura grigia +Dark Grey Dye=Tintura grigia scura +Black Dye=Tintura nera +Violet Dye=Tintura viola +Blue Dye=Tintura blu +Cyan Dye=Tintura ciano +Dark Green Dye=Tintura verde scura +Green Dye=Tintura verde +Yellow Dye=Tintura gialla +Brown Dye=Tintura marrone +Orange Dye=Tintura arancione +Red Dye=Tintura rossa +Magenta Dye=Tintura magenta +Pink Dye=Tintura rosa diff --git a/mods/minetest_game/dye/locale/dye.ja.tr b/mods/minetest_game/dye/locale/dye.ja.tr new file mode 100644 index 00000000..d7ae3068 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.ja.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=ç™½è‰²ã®æŸ“æ–™ +Grey Dye=ç°è‰²ã®æŸ“æ–™ +Dark Grey Dye=濃ç°è‰²ã®æŸ“æ–™ +Black Dye=é»’è‰²ã®æŸ“æ–™ +Violet Dye=ç´«è‰²ã®æŸ“æ–™ +Blue Dye=é’è‰²ã®æŸ“æ–™ +Cyan Dye=é’ç·‘è‰²ã®æŸ“æ–™ +Dark Green Dye=æ¿ƒç·‘è‰²ã®æŸ“æ–™ +Green Dye=ç·‘è‰²ã®æŸ“æ–™ +Yellow Dye=é»„è‰²ã®æŸ“æ–™ +Brown Dye=èŒ¶è‰²ã®æŸ“æ–™ +Orange Dye=æ©™è‰²ã®æŸ“æ–™ +Red Dye=èµ¤è‰²ã®æŸ“æ–™ +Magenta Dye=èµ¤ç´«è‰²ã®æŸ“æ–™ +Pink Dye=æ¡ƒè‰²ã®æŸ“æ–™ diff --git a/mods/minetest_game/dye/locale/dye.jbo.tr b/mods/minetest_game/dye/locale/dye.jbo.tr new file mode 100644 index 00000000..39ec7ab2 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.jbo.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=lo blabi xinmo +Grey Dye=lo grusi xinmo +Dark Grey Dye=lo xekri grusi xinmo +Black Dye=lo xekri xinmo +Violet Dye=lo zirpu xinmo +Blue Dye=lo blanu xinmo +Cyan Dye=lo cicna xinmo +Dark Green Dye=lo xekri crino xinmo +Green Dye=lo crino xinmo +Yellow Dye=lo pelxu xinmo +Brown Dye=lo bunre xinmo +Orange Dye=lo narju xinmo +Red Dye=lo xunre xinmo +Magenta Dye=lo nukni xinmo +Pink Dye=lo xunblabi xinmo diff --git a/mods/minetest_game/dye/locale/dye.lv.tr b/mods/minetest_game/dye/locale/dye.lv.tr new file mode 100644 index 00000000..048a087e --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.lv.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=BaltÄ krÄsa +Grey Dye=PelÄ“kÄ krÄsa +Dark Grey Dye=TumÅ¡pelÄ“kÄ krÄsa +Black Dye=MelnÄ krÄsa +Violet Dye=VioletÄ krÄsa +Blue Dye=ZilÄ krÄsa +Cyan Dye=CiÄna krÄsa +Dark Green Dye=TumÅ¡zaÄ¼Ä krÄsa +Green Dye=ZaÄ¼Ä krÄsa +Yellow Dye=DzeltenÄ krÄsa +Brown Dye=BrÅ«nÄ krÄsa +Orange Dye=OranÅ¾Ä krÄsa +Red Dye=SarkanÄ krÄsa +Magenta Dye=FuksÄ«na krÄsa +Pink Dye=RozÄ krÄsa diff --git a/mods/minetest_game/dye/locale/dye.ms.tr b/mods/minetest_game/dye/locale/dye.ms.tr new file mode 100644 index 00000000..a4256c73 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.ms.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Pewarna Putih +Grey Dye=Pewarna Kelabu +Dark Grey Dye=Pewarna Kelabu Tua +Black Dye=Pewarna Hitam +Violet Dye=Pewarna Ungu +Blue Dye=Pewarna Biru +Cyan Dye=Pewarna Biru Kehijauan +Dark Green Dye=Pewarna Hijau Tua +Green Dye=Pewarna Hijau +Yellow Dye=Pewarna Kuning +Brown Dye=Pewarna Perang +Orange Dye=Pewarna Jingga +Red Dye=Pewarna Merah +Magenta Dye=Pewarna Magenta +Pink Dye=Pewarna Merah Jambu diff --git a/mods/minetest_game/dye/locale/dye.pl.tr b/mods/minetest_game/dye/locale/dye.pl.tr new file mode 100644 index 00000000..a4bfa640 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.pl.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=BiaÅ‚y barwnik +Grey Dye=Szary barwnik +Dark Grey Dye=Ciemnoszary barwnik +Black Dye=Czarny barwnik +Violet Dye=Fioletowy barwnik +Blue Dye=Niebieski barwnik +Cyan Dye=Cyjanowy barwnik +Dark Green Dye=Ciemnozielony barwnik +Green Dye=Zielony barwnik +Yellow Dye=Żółty barwnik +Brown Dye=BrÄ…zowy barwnik +Orange Dye=PomaraÅ„czowy barwnik +Red Dye=Czerwony barwnik +Magenta Dye=Karmazynowy barwnik +Pink Dye=Różowy barwnik diff --git a/mods/minetest_game/dye/locale/dye.pt_BR.tr b/mods/minetest_game/dye/locale/dye.pt_BR.tr new file mode 100644 index 00000000..29e98dac --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Tinta Branca +Grey Dye=Tinta Cinza +Dark Grey Dye=Tinta Cinza-escuro +Black Dye=Tinta Preta +Violet Dye=Tinta Violeta +Blue Dye=Tinta Azul +Cyan Dye=Tinta Ciano +Dark Green Dye=Tinta Verde-escuro +Green Dye=Tinta Verde +Yellow Dye=Tinta Amarela +Brown Dye=Tinta Marrom +Orange Dye=Tinta Laranja +Red Dye=Tinta Vermelha +Magenta Dye=Tinta Magenta +Pink Dye=Tinta Rosa diff --git a/mods/minetest_game/dye/locale/dye.ru.tr b/mods/minetest_game/dye/locale/dye.ru.tr new file mode 100644 index 00000000..eff51f94 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.ru.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Белый краÑитель +Grey Dye=Серый краÑитель +Dark Grey Dye=Тёмно-Ñерый краÑитель +Black Dye=Черный краÑитель +Violet Dye=Фиолетовый краÑитель +Blue Dye=Синий краÑитель +Cyan Dye=Бирюзовый краÑитель +Dark Green Dye=Тёмно-зелёный краÑитель +Green Dye=Зелёный краÑитель +Yellow Dye=Жёлтый краÑитель +Brown Dye=Коричневый краÑитель +Orange Dye=Оранжевый краÑитель +Red Dye=КраÑный краÑитель +Magenta Dye=Сиреневый краÑитель +Pink Dye=Розовый краÑитель diff --git a/mods/minetest_game/dye/locale/dye.sk.tr b/mods/minetest_game/dye/locale/dye.sk.tr new file mode 100644 index 00000000..625804c3 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.sk.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Biele farbivo +Grey Dye=Å edé farbivo +Dark Grey Dye=Tmavo Å¡edé farbivo +Black Dye=ÄŒierne farbivo +Violet Dye=Fialové farbivo +Blue Dye=Modré farbivo +Cyan Dye=Tyrkysové farbivo +Dark Green Dye=Tmavozelené farbivo +Green Dye=Zelené farbivo +Yellow Dye=Žlté farbivo +Brown Dye=Hnedé farbivo +Orange Dye=Oranžové farbivo +Red Dye=ÄŒervené farbivo +Magenta Dye=Purpurové farbivo +Pink Dye=Ružové farbivo diff --git a/mods/minetest_game/dye/locale/dye.sv.tr b/mods/minetest_game/dye/locale/dye.sv.tr new file mode 100644 index 00000000..ecde4433 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.sv.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Vit färg +Grey Dye=GrÃ¥ färg +Dark Grey Dye=MörkgrÃ¥ färg +Black Dye=Svart färg +Violet Dye=Violett färg +Blue Dye=BlÃ¥ färg +Cyan Dye=Cyan färg +Dark Green Dye=Mörkgrön färg +Green Dye=Grön färg +Yellow Dye=Gul färg +Brown Dye=Brun färg +Orange Dye=Orange färg +Red Dye=Röd färg +Magenta Dye=Magenta färg +Pink Dye=Rosa färg diff --git a/mods/minetest_game/dye/locale/dye.uk.tr b/mods/minetest_game/dye/locale/dye.uk.tr new file mode 100644 index 00000000..7bf0f45c --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.uk.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Білий барвник +Grey Dye=Сірий барвник +Dark Grey Dye=Темно-Ñірий барвник +Black Dye=Чорний барвник +Violet Dye=Фіолетовий барвник +Blue Dye=Синій барвник +Cyan Dye=Синьо-зелений барвник +Dark Green Dye=Темно-зелений барвник +Green Dye=Зелений барвник +Yellow Dye=Жовтий барвник +Brown Dye=Коричневий барвник +Orange Dye=Помаранчевий барвник +Red Dye=Червоний барвник +Magenta Dye=Пурпурний барвник +Pink Dye=Рожевий барвник diff --git a/mods/minetest_game/dye/locale/dye.zh_CN.tr b/mods/minetest_game/dye/locale/dye.zh_CN.tr new file mode 100644 index 00000000..11bf9cb2 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.zh_CN.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=白色染料 +Grey Dye=ç°è‰²æŸ“æ–™ +Dark Grey Dye=æš—ç°æŸ“æ–™ +Black Dye=黑色染料 +Violet Dye=紫色染料 +Blue Dye=è“色染料 +Cyan Dye=é’色染料 +Dark Green Dye=暗绿染料 +Green Dye=绿色染料 +Yellow Dye=黄色染料 +Brown Dye=棕色染料 +Orange Dye=橙色染料 +Red Dye=红色染料 +Magenta Dye=å“红染料 +Pink Dye=粉红染料 diff --git a/mods/minetest_game/dye/locale/dye.zh_TW.tr b/mods/minetest_game/dye/locale/dye.zh_TW.tr new file mode 100644 index 00000000..b84d07e1 --- /dev/null +++ b/mods/minetest_game/dye/locale/dye.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=白色染料 +Grey Dye=ç°è‰²æŸ“æ–™ +Dark Grey Dye=æš—ç°æŸ“æ–™ +Black Dye=黑色染料 +Violet Dye=紫色染料 +Blue Dye=è—色染料 +Cyan Dye=é’色染料 +Dark Green Dye=暗綠染料 +Green Dye=綠色染料 +Yellow Dye=黃色染料 +Brown Dye=棕色染料 +Orange Dye=橙色染料 +Red Dye=紅色染料 +Magenta Dye=å“紅染料 +Pink Dye=粉紅染料 diff --git a/mods/minetest_game/dye/locale/template.txt b/mods/minetest_game/dye/locale/template.txt new file mode 100644 index 00000000..c20bab5f --- /dev/null +++ b/mods/minetest_game/dye/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye= +Grey Dye= +Dark Grey Dye= +Black Dye= +Violet Dye= +Blue Dye= +Cyan Dye= +Dark Green Dye= +Green Dye= +Yellow Dye= +Brown Dye= +Orange Dye= +Red Dye= +Magenta Dye= +Pink Dye= diff --git a/mods/minetest_game/dye/mod.conf b/mods/minetest_game/dye/mod.conf new file mode 100644 index 00000000..32bb816c --- /dev/null +++ b/mods/minetest_game/dye/mod.conf @@ -0,0 +1,2 @@ +name = dye +description = Minetest Game mod: dye diff --git a/mods/minetest_game/dye/textures/dye_black.png b/mods/minetest_game/dye/textures/dye_black.png new file mode 100644 index 00000000..1055b6c2 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_black.png differ diff --git a/mods/minetest_game/dye/textures/dye_blue.png b/mods/minetest_game/dye/textures/dye_blue.png new file mode 100644 index 00000000..d1377c6b Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_blue.png differ diff --git a/mods/minetest_game/dye/textures/dye_brown.png b/mods/minetest_game/dye/textures/dye_brown.png new file mode 100644 index 00000000..77d475cd Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_brown.png differ diff --git a/mods/minetest_game/dye/textures/dye_cyan.png b/mods/minetest_game/dye/textures/dye_cyan.png new file mode 100644 index 00000000..239d66ce Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_cyan.png differ diff --git a/mods/minetest_game/dye/textures/dye_dark_green.png b/mods/minetest_game/dye/textures/dye_dark_green.png new file mode 100644 index 00000000..9606ccf4 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_dark_green.png differ diff --git a/mods/minetest_game/dye/textures/dye_dark_grey.png b/mods/minetest_game/dye/textures/dye_dark_grey.png new file mode 100644 index 00000000..060737ba Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_dark_grey.png differ diff --git a/mods/minetest_game/dye/textures/dye_green.png b/mods/minetest_game/dye/textures/dye_green.png new file mode 100644 index 00000000..0d99ee1c Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_green.png differ diff --git a/mods/minetest_game/dye/textures/dye_grey.png b/mods/minetest_game/dye/textures/dye_grey.png new file mode 100644 index 00000000..5efb0280 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_grey.png differ diff --git a/mods/minetest_game/dye/textures/dye_magenta.png b/mods/minetest_game/dye/textures/dye_magenta.png new file mode 100644 index 00000000..c84df62c Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_magenta.png differ diff --git a/mods/minetest_game/dye/textures/dye_orange.png b/mods/minetest_game/dye/textures/dye_orange.png new file mode 100644 index 00000000..08449073 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_orange.png differ diff --git a/mods/minetest_game/dye/textures/dye_pink.png b/mods/minetest_game/dye/textures/dye_pink.png new file mode 100644 index 00000000..c3dec22a Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_pink.png differ diff --git a/mods/minetest_game/dye/textures/dye_red.png b/mods/minetest_game/dye/textures/dye_red.png new file mode 100644 index 00000000..14eafbf4 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_red.png differ diff --git a/mods/minetest_game/dye/textures/dye_violet.png b/mods/minetest_game/dye/textures/dye_violet.png new file mode 100644 index 00000000..600cbb44 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_violet.png differ diff --git a/mods/minetest_game/dye/textures/dye_white.png b/mods/minetest_game/dye/textures/dye_white.png new file mode 100644 index 00000000..2a840a41 Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_white.png differ diff --git a/mods/minetest_game/dye/textures/dye_yellow.png b/mods/minetest_game/dye/textures/dye_yellow.png new file mode 100644 index 00000000..fe75775e Binary files /dev/null and b/mods/minetest_game/dye/textures/dye_yellow.png differ diff --git a/mods/minetest_game/env_sounds/README.txt b/mods/minetest_game/env_sounds/README.txt new file mode 100644 index 00000000..3b3d2755 --- /dev/null +++ b/mods/minetest_game/env_sounds/README.txt @@ -0,0 +1,17 @@ +Minetest Game mod: env_sounds +============================= +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (sounds) +------------------------- +Yuval (CC0 1.0) +https://freesound.org/people/Yuval/sounds/197023/ + env_sounds_water.*.ogg + +Halion (CC0 1.0) +https://freesound.org/people/Halion/sounds/17785/ + env_sounds_lava.*.ogg diff --git a/mods/minetest_game/env_sounds/init.lua b/mods/minetest_game/env_sounds/init.lua new file mode 100644 index 00000000..31cc483e --- /dev/null +++ b/mods/minetest_game/env_sounds/init.lua @@ -0,0 +1,112 @@ +-- Parameters + +-- Node search radius around player +local radius = 8 + +local allsounds = { + ["env_sounds_water"] = { + trigger = {"default:water_flowing", "default:river_water_flowing"}, + base_volume = 0.04, + max_volume = 0.4, + per_node = 0.004, + }, + ["env_sounds_lava"] = { + trigger = {"default:lava_source", "default:lava_flowing"}, + base_volume = 0, + max_volume = 0.6, + per_node = { + ["default:lava_source"] = 0.008, + ["default:lava_flowing"] = 0.002, + }, + }, +} + +if minetest.settings:get_bool("river_source_sounds") then + table.insert(allsounds["env_sounds_water"].trigger, + "default:river_water_source") +end + + +-- Cache the union of all trigger nodes + +local cache_triggers = {} + +for sound, def in pairs(allsounds) do + for _, name in ipairs(def.trigger) do + table.insert(cache_triggers, name) + end +end + + +-- Update sound for player + +local function update_sound(player) + local player_name = player:get_player_name() + local ppos = player:get_pos() + ppos = vector.add(ppos, player:get_properties().eye_height) + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + + local pos = minetest.find_nodes_in_area(areamin, areamax, cache_triggers, true) + if next(pos) == nil then -- If table empty + return + end + for sound, def in pairs(allsounds) do + -- Find average position + local posav = {0, 0, 0} + local count = 0 + for _, name in ipairs(def.trigger) do + if pos[name] then + for _, p in ipairs(pos[name]) do + posav[1] = posav[1] + p.x + posav[2] = posav[2] + p.y + posav[3] = posav[3] + p.z + end + count = count + #pos[name] + end + end + + if count > 0 then + posav = vector.new(posav[1] / count, posav[2] / count, + posav[3] / count) + + -- Calculate gain + local gain = def.base_volume + if type(def.per_node) == 'table' then + for name, multiplier in pairs(def.per_node) do + if pos[name] then + gain = gain + #pos[name] * multiplier + end + end + else + gain = gain + count * def.per_node + end + gain = math.min(gain, def.max_volume) + + minetest.sound_play(sound, { + pos = posav, + to_player = player_name, + gain = gain, + }, true) + end + end +end + + +-- Update sound when player joins + +minetest.register_on_joinplayer(function(player) + update_sound(player) +end) + + +-- Cyclic sound update + +local function cyclic_update() + for _, player in pairs(minetest.get_connected_players()) do + update_sound(player) + end + minetest.after(3.5, cyclic_update) +end + +minetest.after(0, cyclic_update) diff --git a/mods/minetest_game/env_sounds/license.txt b/mods/minetest_game/env_sounds/license.txt new file mode 100644 index 00000000..ff8867dd --- /dev/null +++ b/mods/minetest_game/env_sounds/license.txt @@ -0,0 +1,57 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2019 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (sounds) +-------------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +Yuval + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/minetest_game/env_sounds/mod.conf b/mods/minetest_game/env_sounds/mod.conf new file mode 100644 index 00000000..ad6feb31 --- /dev/null +++ b/mods/minetest_game/env_sounds/mod.conf @@ -0,0 +1,3 @@ +name = env_sounds +description = Minetest Game mod: env_sounds +depends = default diff --git a/mods/minetest_game/env_sounds/sounds/env_sounds_lava.1.ogg b/mods/minetest_game/env_sounds/sounds/env_sounds_lava.1.ogg new file mode 100644 index 00000000..3eafce2d Binary files /dev/null and b/mods/minetest_game/env_sounds/sounds/env_sounds_lava.1.ogg differ diff --git a/mods/minetest_game/env_sounds/sounds/env_sounds_lava.2.ogg b/mods/minetest_game/env_sounds/sounds/env_sounds_lava.2.ogg new file mode 100644 index 00000000..8648f17f Binary files /dev/null and b/mods/minetest_game/env_sounds/sounds/env_sounds_lava.2.ogg differ diff --git a/mods/minetest_game/env_sounds/sounds/env_sounds_water.1.ogg b/mods/minetest_game/env_sounds/sounds/env_sounds_water.1.ogg new file mode 100644 index 00000000..aa808825 Binary files /dev/null and b/mods/minetest_game/env_sounds/sounds/env_sounds_water.1.ogg differ diff --git a/mods/minetest_game/env_sounds/sounds/env_sounds_water.2.ogg b/mods/minetest_game/env_sounds/sounds/env_sounds_water.2.ogg new file mode 100644 index 00000000..b3ff114f Binary files /dev/null and b/mods/minetest_game/env_sounds/sounds/env_sounds_water.2.ogg differ diff --git a/mods/minetest_game/env_sounds/sounds/env_sounds_water.3.ogg b/mods/minetest_game/env_sounds/sounds/env_sounds_water.3.ogg new file mode 100644 index 00000000..431a6ed3 Binary files /dev/null and b/mods/minetest_game/env_sounds/sounds/env_sounds_water.3.ogg differ diff --git a/mods/minetest_game/env_sounds/sounds/env_sounds_water.4.ogg b/mods/minetest_game/env_sounds/sounds/env_sounds_water.4.ogg new file mode 100644 index 00000000..56c2ee21 Binary files /dev/null and b/mods/minetest_game/env_sounds/sounds/env_sounds_water.4.ogg differ diff --git a/mods/minetest_game/farming/README.txt b/mods/minetest_game/farming/README.txt new file mode 100644 index 00000000..69cfa758 --- /dev/null +++ b/mods/minetest_game/farming/README.txt @@ -0,0 +1,43 @@ +Minetest Game mod: farming +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +webdesigner97 (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Created by PilzAdam (CC BY 3.0): + farming_bread.png + farming_soil.png + farming_soil_wet.png + farming_soil_wet_side.png + farming_string.png + +Created by BlockMen (CC BY 3.0): + farming_tool_diamondhoe.png + farming_tool_mesehoe.png + farming_tool_bronzehoe.png + farming_tool_steelhoe.png + farming_tool_stonehoe.png + farming_tool_woodhoe.png + +Created by MasterGollum (CC BY 3.0): + farming_straw.png + +Created by Gambit (CC BY 3.0): + farming_wheat.png + farming_wheat_*.png + farming_cotton_*.png + farming_flour.png + farming_cotton_seed.png + farming_wheat_seed.png + +Created by Napiophelios (CC BY-SA 3.0): + farming_cotton.png + +Created by Extex101 (CC BY-SA 3.0): + farming_cotton_wild.png diff --git a/mods/minetest_game/farming/api.lua b/mods/minetest_game/farming/api.lua new file mode 100644 index 00000000..08ab0a0a --- /dev/null +++ b/mods/minetest_game/farming/api.lua @@ -0,0 +1,406 @@ +-- farming/api.lua + +-- support for MT game translation. +local S = farming.get_translator + +-- Wear out hoes, place soil +-- TODO Ignore group:flower +farming.registered_plants = {} + +farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") ~= 1 then + return + end + + -- check if (wet) soil defined + local regN = minetest.registered_nodes + if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then + return + end + + local player_name = user and user:get_player_name() or "" + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + -- turn the node into soil and play sound + minetest.set_node(pt.under, {name = regN[under.name].soil.dry}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.3, + }, true) + + if not minetest.is_creative_enabled(player_name) then + -- wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear_by_uses(uses) + -- tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pt.above, + gain = 0.5}, true) + end + end + return itemstack +end + +-- Register new hoes +farming.register_hoe = function(name, def) + -- Check for : prefix (register new hoes in your mod's namespace) + if name:sub(1,1) ~= ":" then + name = ":" .. name + end + -- Check def table + if def.description == nil then + def.description = S("Hoe") + end + if def.inventory_image == nil then + def.inventory_image = "unknown_item.png" + end + if def.max_uses == nil then + def.max_uses = 30 + end + -- Register the tool + minetest.register_tool(name, { + description = def.description, + inventory_image = def.inventory_image, + on_use = function(itemstack, user, pointed_thing) + return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) + end, + groups = def.groups, + sound = {breaks = "default_tool_breaks"}, + }) + -- Register its recipe + if def.recipe then + minetest.register_craft({ + output = name:sub(2), + recipe = def.recipe + }) + elseif def.material then + minetest.register_craft({ + output = name:sub(2), + recipe = { + {def.material, def.material}, + {"", "group:stick"}, + {"", "group:stick"} + } + }) + end +end + +-- how often node timers for plants will tick, +/- some random value +local function tick(pos) + minetest.get_node_timer(pos):start(math.random(166, 286)) +end +-- how often a growth failure tick is retried (e.g. too dark) +local function tick_again(pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +-- Seed placement +farming.place_seed = function(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") < 2 then + return itemstack + end + + -- add the node and remove 1 item from the itemstack + if placer then + default.log_player_action(placer, "places node", plantname, "at", pt.above) + end + minetest.add_node(pt.above, {name = plantname, param2 = 1}) + tick(pt.above) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack +end + +-- check if on wet soil +farming.can_grow = function(pos) + local below = minetest.get_node(pos:offset(0, -1, 0)) + return minetest.get_item_group(below.name, "soil") >= 3 +end + +farming.grow_plant = function(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + -- disable timer for fully grown plant + return + end + + -- grow seed + if minetest.get_item_group(node.name, "seed") and def.fertility then + local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not soil_node then + tick_again(pos) + return + end + -- omitted is a check for light, we assume seeds can germinate in the dark. + for _, v in pairs(def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 then + local placenode = {name = def.next_plant} + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + return + end + end + end + + return + end + + if not (def.can_grow or farming.can_grow)(pos) then + tick_again(pos) + return + end + + -- check light + local light = minetest.get_node_light(pos) + if not light or light < def.minlight or light > def.maxlight then + tick_again(pos) + return + end + + -- grow + local placenode = {name = def.next_plant} + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + + -- new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + end + return +end + +-- Register plants +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.harvest_description then + def.harvest_description = pname:gsub("^%l", string.upper) + end + if not def.inventory_image then + def.inventory_image = "unknown_item.png" + end + if not def.steps then + return nil + end + if not def.minlight then + def.minlight = 1 + end + if not def.maxlight then + def.maxlight = 14 + end + if not def.fertility then + def.fertility = {} + end + + farming.registered_plants[pname] = def + + -- Register seed + local lbm_nodes = {mname .. ":seed_" .. pname} + local g = {seed = 1, snappy = 3, attached_node = 1, flammable = 2} + for k, v in pairs(def.fertility) do + g[v] = 1 + end + minetest.register_node(":" .. mname .. ":seed_" .. pname, { + description = def.description, + tiles = {def.inventory_image}, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = "signlike", + groups = g, + paramtype = "light", + paramtype2 = "wallmounted", + place_param2 = def.place_param2 or nil, -- this isn't actually used for placement + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + fertility = def.fertility, + sounds = default.node_sound_dirt_defaults({ + dig = {name = "", gain = 0}, + dug = {name = "default_grass_footstep", gain = 0.2}, + place = {name = "default_place_node", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname) + end, + next_plant = mname .. ":" .. pname .. "_1", + on_timer = farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + }) + + -- Register harvest + minetest.register_craftitem(":" .. mname .. ":" .. pname, { + description = def.harvest_description, + inventory_image = mname .. "_" .. pname .. ".png", + groups = def.groups or {flammable = 2}, + }) + + -- Register growing steps + for i = 1, def.steps do + local base_rarity = 1 + if def.steps ~= 1 then + base_rarity = 8 - (i - 1) * 7 / (def.steps - 1) + end + local drop = { + items = { + {items = {mname .. ":" .. pname}, rarity = base_rarity}, + {items = {mname .. ":" .. pname}, rarity = base_rarity * 2}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity * 2}, + } + } + local nodegroups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1} + nodegroups[pname] = i + + local next_plant = nil + + if i < def.steps then + next_plant = mname .. ":" .. pname .. "_" .. (i + 1) + lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i + end + + minetest.register_node(":" .. mname .. ":" .. pname .. "_" .. i, { + 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 = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + groups = nodegroups, + sounds = default.node_sound_leaves_defaults(), + next_plant = next_plant, + on_timer = farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + }) + end + + -- replacement LBM for pre-nodetimer plants + minetest.register_lbm({ + name = ":" .. mname .. ":start_nodetimer_" .. pname, + nodenames = lbm_nodes, + action = function(pos, node) + tick_again(pos) + end, + }) + + -- Return + local r = { + seed = mname .. ":seed_" .. pname, + harvest = mname .. ":" .. pname + } + return r +end diff --git a/mods/minetest_game/farming/hoes.lua b/mods/minetest_game/farming/hoes.lua new file mode 100644 index 00000000..d005f6d0 --- /dev/null +++ b/mods/minetest_game/farming/hoes.lua @@ -0,0 +1,54 @@ +-- farming/hoes.lua + +-- support for MT game translation. +local S = farming.get_translator + +farming.register_hoe(":farming:hoe_wood", { + description = S("Wooden Hoe"), + inventory_image = "farming_tool_woodhoe.png", + max_uses = 30, + material = "group:wood", + groups = {hoe = 1, flammable = 2}, +}) + +farming.register_hoe(":farming:hoe_stone", { + description = S("Stone Hoe"), + inventory_image = "farming_tool_stonehoe.png", + max_uses = 90, + material = "group:stone", + groups = {hoe = 1} +}) + +farming.register_hoe(":farming:hoe_steel", { + description = S("Steel Hoe"), + inventory_image = "farming_tool_steelhoe.png", + max_uses = 500, + material = "default:steel_ingot", + groups = {hoe = 1} +}) + +-- The following are deprecated by removing the 'material' field to prevent +-- crafting and removing from creative inventory, to cause them to eventually +-- disappear from worlds. The registrations should be removed in a future +-- release. + +farming.register_hoe(":farming:hoe_bronze", { + description = S("Bronze Hoe"), + inventory_image = "farming_tool_bronzehoe.png", + max_uses = 220, + groups = {hoe = 1, not_in_creative_inventory = 1}, +}) + +farming.register_hoe(":farming:hoe_mese", { + description = S("Mese Hoe"), + inventory_image = "farming_tool_mesehoe.png", + max_uses = 350, + groups = {hoe = 1, not_in_creative_inventory = 1}, +}) + +farming.register_hoe(":farming:hoe_diamond", { + description = S("Diamond Hoe"), + inventory_image = "farming_tool_diamondhoe.png", + max_uses = 500, + groups = {hoe = 1, not_in_creative_inventory = 1}, +}) diff --git a/mods/minetest_game/farming/init.lua b/mods/minetest_game/farming/init.lua new file mode 100644 index 00000000..5beb1212 --- /dev/null +++ b/mods/minetest_game/farming/init.lua @@ -0,0 +1,152 @@ +-- farming/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("farming") + +-- Global farming namespace + +farming = {} +farming.path = minetest.get_modpath("farming") +farming.get_translator = S + +-- Load files + +dofile(farming.path .. "/api.lua") +dofile(farming.path .. "/nodes.lua") +dofile(farming.path .. "/hoes.lua") + + +-- Wheat + +farming.register_plant("farming:wheat", { + description = S("Wheat Seed"), + harvest_description = S("Wheat"), + paramtype2 = "meshoptions", + inventory_image = "farming_wheat_seed.png", + steps = 8, + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"grassland"}, + groups = {food_wheat = 1, flammable = 4}, + place_param2 = 3, +}) + +minetest.register_craftitem("farming:flour", { + description = S("Flour"), + inventory_image = "farming_flour.png", + groups = {food_flour = 1, flammable = 1}, +}) + +minetest.register_craftitem("farming:bread", { + description = S("Bread"), + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(5), + groups = {food_bread = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "farming:flour", + recipe = {"farming:wheat", "farming:wheat", "farming:wheat", "farming:wheat"} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" +}) + + +-- Cotton + +farming.register_plant("farming:cotton", { + description = S("Cotton Seed"), + harvest_description = S("Cotton"), + inventory_image = "farming_cotton_seed.png", + steps = 8, + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"grassland", "desert"}, + groups = {flammable = 4}, +}) + +minetest.register_craftitem("farming:string", { + description = S("String"), + inventory_image = "farming_string.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = "wool:white", + recipe = { + {"farming:cotton", "farming:cotton"}, + {"farming:cotton", "farming:cotton"}, + } +}) + +minetest.register_craft({ + output = "farming:string 2", + recipe = { + {"farming:cotton"}, + {"farming:cotton"}, + } +}) + + +-- Straw + +minetest.register_craft({ + output = "farming:straw 3", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + } +}) + +minetest.register_craft({ + output = "farming:wheat 3", + recipe = { + {"farming:straw"}, + } +}) + + +-- Fuels + +minetest.register_craft({ + type = "fuel", + recipe = "farming:wheat", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:cotton", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:string", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:hoe_wood", + burntime = 5, +}) + + +-- Register farming items as dungeon loot + +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + {name = "farming:string", chance = 0.5, count = {1, 8}}, + {name = "farming:wheat", chance = 0.5, count = {2, 5}}, + {name = "farming:seed_cotton", chance = 0.4, count = {1, 4}, + types = {"normal"}}, + }) +end diff --git a/mods/minetest_game/farming/license.txt b/mods/minetest_game/farming/license.txt new file mode 100644 index 00000000..a90d8084 --- /dev/null +++ b/mods/minetest_game/farming/license.txt @@ -0,0 +1,95 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 webdesigner97 +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 MasterGollum +Copyright (C) 2015-2016 Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 Napiophelios +Copyright (C) 2020 Extex101 + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/farming/locale/farming.de.tr b/mods/minetest_game/farming/locale/farming.de.tr new file mode 100644 index 00000000..b16748db --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.de.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Hacke +Seed=Samen +Wooden Hoe=Holzhacke +Stone Hoe=Steinhacke +Steel Hoe=Stahlhacke +Bronze Hoe=Bronzehacke +Mese Hoe=Mesehacke +Diamond Hoe=Diamanthacke +Wheat Seed=Weizensamen +Wheat=Weizen +Flour=Mehl +Bread=Brot +Cotton Seed=Baumwollsamen +Cotton=Baumwolle +String=Faden +Soil=Ackerboden +Wet Soil=Nasser Ackerboden +Savanna Soil=Savannenackerboden +Wet Savanna Soil=Nasser Savannenackerboden +Desert Sand Soil=Wüstensandackerboden +Wet Desert Sand Soil=Nasser Wüstensandackerboden +Straw=Stroh +Straw Stair=Strohtreppe +Inner Straw Stair=Innere Strohtreppe +Outer Straw Stair=Äußere Strohtreppe +Straw Slab=Strohplatte +Wild Cotton=Wilde Baumwolle diff --git a/mods/minetest_game/farming/locale/farming.eo.tr b/mods/minetest_game/farming/locale/farming.eo.tr new file mode 100644 index 00000000..887ef004 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.eo.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Sarkilo +Seed=Semo +Wooden Hoe=Ligna sarkilo +Stone Hoe=Åœtona sarkilo +Steel Hoe=Åœtala sarkilo +Bronze Hoe=Bronza sarkilo +Mese Hoe=Mesea sarkilo +Diamond Hoe=Diamanta sarkilo +Wheat Seed=Tritika semo +Wheat=Tritiko +Flour=Faruno +Bread=Pano +Cotton Seed=Katuna semo +Cotton=Katuno +String=Åœnuro +Soil=Tero +Wet Soil=Malseka tero +Savanna Soil=Savana tero +Wet Savanna Soil=Malseka savana tero +Desert Sand Soil=Dezerta sablo tero +Wet Desert Sand Soil=Malseka dezerta sablo tero +Straw=Pajlo +Straw Stair=Pajla Åtupo +Inner Straw Stair=Interna pajla Åtupo +Outer Straw Stair=Ekstera pajla Åtupo +Straw Slab=Pajla plato +Wild Cotton=SovaÄa kotonujo diff --git a/mods/minetest_game/farming/locale/farming.es.tr b/mods/minetest_game/farming/locale/farming.es.tr new file mode 100644 index 00000000..b17a4524 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.es.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe= +Seed= +Wooden Hoe=Azada de madera +Stone Hoe=Azada de piedra +Steel Hoe=Azada de acero +Bronze Hoe=Azada de bronce +Mese Hoe=Azada de mese +Diamond Hoe=Azada de diamante +Wheat Seed=Semilla de trigo +Wheat=Trigo +Flour=Harina +Bread=Pan +Cotton Seed=Semilla de algodón +Cotton=Algodón +String=Hilo +Soil=Tierra de cultivo +Wet Soil=Tierra de cultivo humeda +Savanna Soil= +Wet Savanna Soil= +Desert Sand Soil=Tierra de cultivo de arena de desierto +Wet Desert Sand Soil=Tierra de cultivo de arena de desierto humeda +Straw=Paja +Straw Stair=Escalera de paja +Inner Straw Stair=Escalera de paja interior +Outer Straw Stair=Escalera de paja exterior +Straw Slab=Losa de paja +Wild Cotton=Algodón silvestre + + +##### not used anymore ##### + +Dry Soil=Tierra de cultivo seca +Wet Dry Soil=Tierra de cultivo seca-humeda diff --git a/mods/minetest_game/farming/locale/farming.fr.tr b/mods/minetest_game/farming/locale/farming.fr.tr new file mode 100644 index 00000000..826949e1 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.fr.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=Houe +Seed=Grain +Wooden Hoe=Houe en bois +Stone Hoe=Houe en pierre +Steel Hoe=Houe en acier +Bronze Hoe=Houe en bronze +Mese Hoe=Houe en Mese +Diamond Hoe=Houe en diamant +Wheat Seed=Grain de blé +Wheat=Blé +Flour=Farine +Bread=Pain +Cotton Seed=Graine de coton +Cotton=Coton +String=Ficelle +Soil=Sol +Wet Soil=Sol humide +Savanna Soil=Sol de la savanne +Wet Savanna Soil=Sol de la savanne humide +Desert Sand Soil=Sol de sable du désert +Wet Desert Sand Soil=Sol de sable du désert humide +Straw=Paille +Straw Stair=Escalier de paille +Inner Straw Stair=Escalier intérieur en paille +Outer Straw Stair=Escalier extérieur en paille +Straw Slab=Dalle de paille +Wild Cotton=Coton sauvage + + +##### not used anymore ##### + +Dry Soil=Sol sec +Wet Dry Soil=Sol sec et humide diff --git a/mods/minetest_game/farming/locale/farming.id.tr b/mods/minetest_game/farming/locale/farming.id.tr new file mode 100644 index 00000000..7b276801 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.id.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Cangkul +Seed=Benih +Wooden Hoe=Cangkul Kayu +Stone Hoe=Cangkul Batu +Steel Hoe=Cangkul Baja +Bronze Hoe=Cangkul Perunggu +Mese Hoe=Cangkul Mese +Diamond Hoe=Cangkul Berlian +Wheat Seed=Benih Gandum +Wheat=Gandum +Flour=Tepung +Bread=Roti +Cotton Seed=Benih Kapas +Cotton=Kapas +String=Benang +Soil=Tanah Tanam +Wet Soil=Tanah Tanam Basah +Savanna Soil=Tanah Tanam Sabana +Wet Savanna Soil=Tanah Tanam Sabana Basah +Desert Sand Soil=Pasir Tanam Gurun +Wet Desert Sand Soil=Pasir Tanam Gurun Basah +Straw=Jerami +Straw Stair=Tangga Jerami +Inner Straw Stair=Tangga Jerami Dalam +Outer Straw Stair=Tangga Jerami Luar +Straw Slab=Lempengan Jerami +Wild Cotton=Kapas Liar diff --git a/mods/minetest_game/farming/locale/farming.it.tr b/mods/minetest_game/farming/locale/farming.it.tr new file mode 100644 index 00000000..aeb9c0a7 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.it.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe= +Seed= +Wooden Hoe=Zappa di legno +Stone Hoe=Zappa di pietra +Steel Hoe=Zappa d'acciaio +Bronze Hoe=Zappa di bronzo +Mese Hoe=Zappa di mese +Diamond Hoe=Zappa di diamante +Wheat Seed=Seme di grano +Wheat=Grano +Flour=Farina +Bread=Pane +Cotton Seed=Seme di cotone +Cotton=Cotone +String=Filo +Soil=Terreno +Wet Soil=Terreno bagnato +Savanna Soil= +Wet Savanna Soil= +Desert Sand Soil=Terreno di sabbia del deserto +Wet Desert Sand Soil=Terreno bagnato di sabbia del deserto +Straw=Paglia +Straw Stair=Scala di paglia +Inner Straw Stair=Scala di paglia interna +Outer Straw Stair=Scala di paglia esterna +Straw Slab=Lastra di paglia +Wild Cotton= + + +##### not used anymore ##### + +Dry Soil=Terreno asciutto +Wet Dry Soil=Terreno asciutto bagnato diff --git a/mods/minetest_game/farming/locale/farming.ja.tr b/mods/minetest_game/farming/locale/farming.ja.tr new file mode 100644 index 00000000..887d839e --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.ja.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=クワ +Seed=種 +Wooden Hoe=木製ã®ã‚¯ãƒ¯ +Stone Hoe=石ã®ã‚¯ãƒ¯ +Steel Hoe=鉄ã®ã‚¯ãƒ¯ +Bronze Hoe=é’銅ã®ã‚¯ãƒ¯ +Mese Hoe=メセã®ã‚¯ãƒ¯ +Diamond Hoe=ダイヤモンドã®ã‚¯ãƒ¯ +Wheat Seed=å°éº¦ã®ç¨® +Wheat=å°éº¦ +Flour=å°éº¦ç²‰ +Bread=パン +Cotton Seed=ç¶¿ã®ç¨® +Cotton=ç¶¿ +String=糸 +Soil=土壌 +Wet Soil=湿ã£ãŸåœŸå£Œ +Savanna Soil=サãƒãƒ³ãƒŠã®åœŸå£Œ +Wet Savanna Soil=湿ã£ãŸã‚µãƒãƒ³ãƒŠã®åœŸå£Œ +Desert Sand Soil=ç ‚æ¼ ã®ç ‚ã®åœŸå£Œ +Wet Desert Sand Soil=湿ã£ãŸç ‚æ¼ ã®ç ‚ã®åœŸå£Œ +Straw=ワラ +Straw Stair=ワラã®éšŽæ®µ +Inner Straw Stair=ワラã®å‡¹éšŽæ®µ +Outer Straw Stair=ワラã®å‡¸éšŽæ®µ +Straw Slab=ワラã®åŽšæ¿ +Wild Cotton=天然綿 diff --git a/mods/minetest_game/farming/locale/farming.jbo.tr b/mods/minetest_game/farming/locale/farming.jbo.tr new file mode 100644 index 00000000..51bb9db9 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.jbo.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=lo te plixa +Seed=lo tsiju +Wooden Hoe=lo mudri te plixa +Stone Hoe=lo rokci te plixa +Steel Hoe=lo gasta te plixa +Bronze Hoe=lo ransu te plixa +Mese Hoe=lo za'e kunrmese te plixa +Diamond Hoe=lo tabjme te plixa +Wheat Seed=lo tsiju be lo maxri +Wheat=lo maxri +Flour=lo grupu'o +Bread=lo nanba +Cotton Seed=lo tsiju be lo mapni +Cotton=lo mapni +String=lo skori +Soil=lo ferti dertu +Wet Soil=lo cilmo ke ferti dertu +Savanna Soil=lo ferti ke sudytu'a dertu +Wet Savanna Soil=lo cilmo ke ferti ke sudytu'a dertu +Desert Sand Soil=lo ferti ke cantu'a canre +Wet Desert Sand Soil=lo cilmo ke ferti ke cantu'a canre +Straw=lo sudysrasu +Straw Stair=lo sudysrasu serti +Inner Straw Stair=lo zo'i sudysrasu serti +Outer Straw Stair=lo ze'o sudysrasu serti +Straw Slab=lo sudysrasu ke xadba bliku +Wild Cotton=lo cilce ke mapni spati diff --git a/mods/minetest_game/farming/locale/farming.lv.tr b/mods/minetest_game/farming/locale/farming.lv.tr new file mode 100644 index 00000000..b1f9546d --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.lv.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Kaplis +Seed=SÄ“klas +Wooden Hoe=Koka kaplis +Stone Hoe=Akmens kaplis +Steel Hoe=TÄ“rauda kaplis +Bronze Hoe=Bronzas kaplis +Mese Hoe=MÄ“zes kaplis +Diamond Hoe=Dimanta kaplis +Wheat Seed=KvieÅ¡u sÄ“kla +Wheat=KvieÅ¡i +Flour=Milti +Bread=Maize +Cotton Seed=Kokvilnas sÄ“klas +Cotton=Kokvilna +String=Stiegra +Soil=Augsne +Wet Soil=Slapja augsne +Savanna Soil=Savannas augsne +Wet Savanna Soil=Slapja savannas augsne +Desert Sand Soil=TuksneÅ¡a smilts augsne +Wet Desert Sand Soil=Slapja tuksneÅ¡a smilts augsne +Straw=Salmi +Straw Stair=Salmu pakÄpiens +Inner Straw Stair=Iekšējais salmu pakÄpiens +Outer Straw Stair=Ä€rÄ“jais salmu pakÄpiens +Straw Slab=Salmu plÄtne +Wild Cotton=Savvaļas kokvilna diff --git a/mods/minetest_game/farming/locale/farming.ms.tr b/mods/minetest_game/farming/locale/farming.ms.tr new file mode 100644 index 00000000..5b8315b2 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.ms.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=Cangkul +Seed=Benih +Wooden Hoe=Cangkul Kayu +Stone Hoe=Cangkul Batu +Steel Hoe=Cangkul Keluli +Bronze Hoe=Cangkul Gangsa +Mese Hoe=Cangkul Mese +Diamond Hoe=Cangkul Intan +Wheat Seed=Benih Gandum +Wheat=Gandum +Flour=Tepung +Bread=Roti +Cotton Seed=Benih Kapas +Cotton=Kapas +String=Benang +Soil=Tanih +Wet Soil=Tanih Lembap +Savanna Soil=Tanih Savana +Wet Savanna Soil=Tanih Savana Lembap +Desert Sand Soil=Tanih Pasir Gurun +Wet Desert Sand Soil=Tanih Pasir Gurun Lembap +Straw=Jerami +Straw Stair=Tangga Jerami +Inner Straw Stair=Tangga Jerami Dalaman +Outer Straw Stair=Tangga Jerami Luaran +Straw Slab=Papak Jerami +Wild Cotton=Kapuk + + +##### not used anymore ##### + +Dry Soil=Tanih Kering +Wet Dry Soil=Tanih Kering Lembap diff --git a/mods/minetest_game/farming/locale/farming.pl.tr b/mods/minetest_game/farming/locale/farming.pl.tr new file mode 100644 index 00000000..ffde3b76 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.pl.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Motyka +Seed=Nasiona +Wooden Hoe=Drewniana motyka +Stone Hoe=Kamienna motyka +Steel Hoe=Stalowa motyka +Bronze Hoe=BrÄ…zowa motyka +Mese Hoe=Mesowa motyka +Diamond Hoe=Diamentowa motyka +Wheat Seed=Nasiona pszenicy +Wheat=Pszenica +Flour=MÄ…ka +Bread=Chleb +Cotton Seed=Nasiona baweÅ‚ny +Cotton=BaweÅ‚na +String=Nić +Soil=Gleba +Wet Soil=Mokra gleba +Savanna Soil=Sawannowa gleba +Wet Savanna Soil=Mokra sawannowa gleba +Desert Sand Soil=Pustynno-piaszczysta gleba +Wet Desert Sand Soil=Mokra pustynno-piaszczysta gleba +Straw=SÅ‚oma +Straw Stair=SÅ‚omiane schody +Inner Straw Stair=WewnÄ™trzne sÅ‚omiane schody +Outer Straw Stair=ZewnÄ™trzne sÅ‚omiane schody +Straw Slab=SÅ‚omiany półblok +Wild Cotton=Dzika baweÅ‚na diff --git a/mods/minetest_game/farming/locale/farming.pt.tr b/mods/minetest_game/farming/locale/farming.pt.tr new file mode 100644 index 00000000..fb0a83c1 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.pt.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Enxada +Seed=Semente +Wooden Hoe=Enxada de Madeira +Stone Hoe=Enxada de Pedra +Steel Hoe=Enxada de Aço +Bronze Hoe=Enxada de Bronze +Mese Hoe=Enxada de Mese +Diamond Hoe=Enxada de Diamante +Wheat Seed=Semente de Trigo +Wheat=Trigo +Flour=Farinha +Bread=Pão +Cotton Seed=Semente de Algodão +Cotton=Algodão +String=Fio +Soil=Solo +Wet Soil=Solo Molhado +Savanna Soil=Solo da Savana +Wet Savanna Soil=Solo da Savana Molhado +Desert Sand Soil=Solo Arenoso do Deserto +Wet Desert Sand Soil=Solo Arenoso do Deserto Molhado +Straw=Palha +Straw Stair=Escada de Palha +Inner Straw Stair=Escada de Palha Externa +Outer Straw Stair=Escada de Palha Interna +Straw Slab=Laje de Palha +Wild Cotton=Algodão Selvagem diff --git a/mods/minetest_game/farming/locale/farming.pt_BR.tr b/mods/minetest_game/farming/locale/farming.pt_BR.tr new file mode 100644 index 00000000..fb0a83c1 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.pt_BR.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Enxada +Seed=Semente +Wooden Hoe=Enxada de Madeira +Stone Hoe=Enxada de Pedra +Steel Hoe=Enxada de Aço +Bronze Hoe=Enxada de Bronze +Mese Hoe=Enxada de Mese +Diamond Hoe=Enxada de Diamante +Wheat Seed=Semente de Trigo +Wheat=Trigo +Flour=Farinha +Bread=Pão +Cotton Seed=Semente de Algodão +Cotton=Algodão +String=Fio +Soil=Solo +Wet Soil=Solo Molhado +Savanna Soil=Solo da Savana +Wet Savanna Soil=Solo da Savana Molhado +Desert Sand Soil=Solo Arenoso do Deserto +Wet Desert Sand Soil=Solo Arenoso do Deserto Molhado +Straw=Palha +Straw Stair=Escada de Palha +Inner Straw Stair=Escada de Palha Externa +Outer Straw Stair=Escada de Palha Interna +Straw Slab=Laje de Palha +Wild Cotton=Algodão Selvagem diff --git a/mods/minetest_game/farming/locale/farming.ru.tr b/mods/minetest_game/farming/locale/farming.ru.tr new file mode 100644 index 00000000..8ec25f78 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.ru.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Мотыга +Seed=Семена +Wooden Hoe=ДеревÑÐ½Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Stone Hoe=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Steel Hoe=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Bronze Hoe=Ð‘Ñ€Ð¾Ð½Ð·Ð¾Ð²Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Mese Hoe=ÐœÐµÐ·Ð¾Ð²Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Diamond Hoe=ÐÐ»Ð¼Ð°Ð·Ð½Ð°Ñ Ð¼Ð¾Ñ‚Ñ‹Ð³Ð° +Wheat Seed=Семена пшеницы +Wheat=Пшеница +Flour=Мука +Bread=Хлеб +Cotton Seed=Семена хлопчатника +Cotton=Хлопок +String=Ðить +Soil=Почва +Wet Soil=Ð’Ð»Ð°Ð¶Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° +Savanna Soil=Ð¡Ð°Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° +Wet Savanna Soil=Ð’Ð»Ð°Ð¶Ð½Ð°Ñ ÑÐ°Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° +Desert Sand Soil=ПуÑÑ‚Ñ‹Ð½Ð½Ð°Ñ Ð¿ÐµÑÑ‡Ð°Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° +Wet Desert Sand Soil=Ð’Ð»Ð°Ð¶Ð½Ð°Ñ Ð¿ÑƒÑÑ‚Ñ‹Ð½Ð½Ð°Ñ Ð¿ÐµÑÑ‡Ð°Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ð²Ð° +Straw=Солома +Straw Stair=Соломенные Ñтупени +Inner Straw Stair=Внутренние Ñоломенные Ñтупени +Outer Straw Stair=Внешние Ñоломенные Ñтупени +Straw Slab=Ð¡Ð¾Ð»Ð¾Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Wild Cotton=Дикий хлопчатник diff --git a/mods/minetest_game/farming/locale/farming.sk.tr b/mods/minetest_game/farming/locale/farming.sk.tr new file mode 100644 index 00000000..2caa4b57 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.sk.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Motyka +Seed=Semienko +Wooden Hoe=Drevená motyka +Stone Hoe=Kamenná motyka +Steel Hoe=Oceľová motyka +Bronze Hoe=Bronzová motyka +Mese Hoe=Mese motyka +Diamond Hoe=Diamantová motyka +Wheat Seed=PÅ¡eniÄné semienko +Wheat=PÅ¡enica +Flour=Múka +Bread=Chlieb +Cotton Seed=Bavlnené semienko +Cotton=Bavlna +String=Šňúra +Soil=Zemina +Wet Soil=Mokrá zemina +Savanna Soil=Zemina zo savany +Wet Savanna Soil=Morká zemina zo savany +Desert Sand Soil=Zemina s púšte +Wet Desert Sand Soil=Mokrá zemina s púšte +Straw=Slama +Straw Stair=Slamenné schody +Inner Straw Stair=Vnútorné slamenné schodisko +Outer Straw Stair=VonkajÅ¡ie slamenné schodisko +Straw Slab=Slamenná doska +Wild Cotton=Divoká bavlna diff --git a/mods/minetest_game/farming/locale/farming.sv.tr b/mods/minetest_game/farming/locale/farming.sv.tr new file mode 100644 index 00000000..e6c9e685 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.sv.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Kratta +Seed=Frö +Wooden Hoe=Träkratta +Stone Hoe=Stenkratta +Steel Hoe=StÃ¥lkratta +Bronze Hoe=Bronskratta +Mese Hoe=Mesekratta +Diamond Hoe=Diamantkratta +Wheat Seed=Vetefrö +Wheat=Vete +Flour=Mjöl +Bread=Bröd +Cotton Seed=Bomullfrö +Cotton=Bomull +String=Snöre +Soil=Odlinngsmark +Wet Soil=VÃ¥t Odlingsmark +Savanna Soil=Savannodlingsmark +Wet Savanna Soil=VÃ¥t savannodlingsmark +Desert Sand Soil=Ökensandsodlingsmark +Wet Desert Sand Soil=VÃ¥t ökensandsodlingsmark +Straw=Halm +Straw Stair=Halmtrappa +Inner Straw Stair=Inre halmtrappa +Outer Straw Stair=Yttre halmtrappa +Straw Slab=Halmplatta +Wild Cotton= diff --git a/mods/minetest_game/farming/locale/farming.uk.tr b/mods/minetest_game/farming/locale/farming.uk.tr new file mode 100644 index 00000000..75e7deae --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.uk.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Мотика +Seed=ÐаÑÑ–Ð½Ð½Ñ +Wooden Hoe=Дерев'Ñна мотика +Stone Hoe=Кам'Ñна мотика +Steel Hoe=Сталева мотика +Bronze Hoe=Бронзова мотика +Mese Hoe=МеÑе-мотика +Diamond Hoe=Діамантова мотика +Wheat Seed=ÐаÑÑ–Ð½Ð½Ñ Ð¿ÑˆÐµÐ½Ð¸Ñ†Ñ– +Wheat=ÐŸÑˆÐµÐ½Ð¸Ñ†Ñ +Flour=Борошно +Bread=Хліб +Cotton Seed=ÐаÑÑ–Ð½Ð½Ñ Ð±Ð°Ð²Ð¾Ð²Ð½Ð¸ÐºÑƒ +Cotton=Бавовна +String=Ðитка +Soil=Òрунт +Wet Soil=Вологий ґрунт +Savanna Soil=Саванний ґрунт +Wet Savanna Soil=Вологий Ñаванний ґрунт +Desert Sand Soil=ПуÑтельний піщаний ґрунт +Wet Desert Sand Soil=Вологий пуÑтельний піщаний ґрунт +Straw=Солома +Straw Stair=Солом'Ñна Ñходинка +Inner Straw Stair=Кутова Ñолом'Ñна Ñходинка (внутрішній кут) +Outer Straw Stair=Кутова Ñолом'Ñна Ñходинка (зовнішній кут) +Straw Slab=Солом'Ñна плита +Wild Cotton=Дикий бавовник diff --git a/mods/minetest_game/farming/locale/farming.zh_CN.tr b/mods/minetest_game/farming/locale/farming.zh_CN.tr new file mode 100644 index 00000000..33ad9be4 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.zh_CN.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=锄头 +Seed=ç§å­ +Wooden Hoe=木锄头 +Stone Hoe=石锄头 +Steel Hoe=é“锄头 +Bronze Hoe=é’铜锄头 +Mese Hoe=黄石锄头 +Diamond Hoe=钻石锄头 +Wheat Seed=å°éº¦ç§å­ +Wheat=å°éº¦ +Flour=é¢ç²‰ +Bread=é¢åŒ… +Cotton Seed=棉花ç§å­ +Cotton=棉 +String=线 +Soil=土 +Wet Soil=湿土 +Savanna Soil=è‰åŽŸåœŸ +Wet Savanna Soil=湿è‰åŽŸåœŸ +Desert Sand Soil=沙漠沙土 +Wet Desert Sand Soil=湿沙漠沙土 +Straw=ç¨»è‰ +Straw Stair=稻è‰å°é˜¶ +Inner Straw Stair=稻è‰å†…楼梯 +Outer Straw Stair=稻è‰å¤–楼梯 +Straw Slab=ç¨»è‰æ¿ +Wild Cotton=野棉花 + + +##### not used anymore ##### + +Dry Soil=干土 +Wet Dry Soil=湿干土 diff --git a/mods/minetest_game/farming/locale/farming.zh_TW.tr b/mods/minetest_game/farming/locale/farming.zh_TW.tr new file mode 100644 index 00000000..36037af0 --- /dev/null +++ b/mods/minetest_game/farming/locale/farming.zh_TW.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=鋤頭 +Seed=ç¨®å­ +Wooden Hoe=木鋤頭 +Stone Hoe=石鋤頭 +Steel Hoe=éµé‹¤é ­ +Bronze Hoe=é’銅鋤頭 +Mese Hoe=黃石鋤頭 +Diamond Hoe=鑽石鋤頭 +Wheat Seed=å°éº¥ç¨®å­ +Wheat=å°éº¥ +Flour=麵粉 +Bread=麵包 +Cotton Seed=æ£‰èŠ±ç¨®å­ +Cotton=棉 +String=ç·š +Soil=土 +Wet Soil=溼土 +Savanna Soil=è‰åŽŸåœŸ +Wet Savanna Soil=溼è‰åŽŸåœŸ +Desert Sand Soil=沙漠沙土 +Wet Desert Sand Soil=溼沙漠沙土 +Straw=ç¨»è‰ +Straw Stair=稻è‰è‡ºéšŽ +Inner Straw Stair=稻è‰å…§æ¨“梯 +Outer Straw Stair=稻è‰å¤–樓梯 +Straw Slab=ç¨»è‰æ¿ +Wild Cotton=野生棉花 + + +##### not used anymore ##### + +Dry Soil=乾土 +Wet Dry Soil=溼乾土 diff --git a/mods/minetest_game/farming/locale/template.txt b/mods/minetest_game/farming/locale/template.txt new file mode 100644 index 00000000..af923474 --- /dev/null +++ b/mods/minetest_game/farming/locale/template.txt @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe= +Seed= +Wooden Hoe= +Stone Hoe= +Steel Hoe= +Bronze Hoe= +Mese Hoe= +Diamond Hoe= +Wheat Seed= +Wheat= +Flour= +Bread= +Cotton Seed= +Cotton= +String= +Soil= +Wet Soil= +Savanna Soil= +Wet Savanna Soil= +Desert Sand Soil= +Wet Desert Sand Soil= +Straw= +Straw Stair= +Inner Straw Stair= +Outer Straw Stair= +Straw Slab= +Wild Cotton= diff --git a/mods/minetest_game/farming/mod.conf b/mods/minetest_game/farming/mod.conf new file mode 100644 index 00000000..9a76a6a7 --- /dev/null +++ b/mods/minetest_game/farming/mod.conf @@ -0,0 +1,4 @@ +name = farming +description = Minetest Game mod: farming +depends = default, wool, stairs +optional_depends = dungeon_loot diff --git a/mods/minetest_game/farming/nodes.lua b/mods/minetest_game/farming/nodes.lua new file mode 100644 index 00000000..b5f90f96 --- /dev/null +++ b/mods/minetest_game/farming/nodes.lua @@ -0,0 +1,282 @@ +-- farming/nodes.lua + +-- support for MT game translation. +local S = farming.get_translator + +minetest.override_item("default:dirt", { + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_grass", { + soil = { + base = "default:dirt_with_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_dry_grass", { + soil = { + base = "default:dirt_with_dry_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_rainforest_litter", { + soil = { + base = "default:dirt_with_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_coniferous_litter", { + soil = { + base = "default:dirt_with_coniferous_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dry_dirt", { + soil = { + base = "default:dry_dirt", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.override_item("default:dry_dirt_with_dry_grass", { + soil = { + base = "default:dry_dirt_with_dry_grass", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.register_node("farming:soil", { + description = S("Soil"), + tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("farming:soil_wet", { + description = S("Wet Soil"), + tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("farming:dry_soil", { + description = S("Savanna Soil"), + tiles = {"default_dry_dirt.png^farming_soil.png", "default_dry_dirt.png"}, + drop = "default:dry_dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.register_node("farming:dry_soil_wet", { + description = S("Wet Savanna Soil"), + tiles = {"default_dry_dirt.png^farming_soil_wet.png", "default_dry_dirt.png^farming_soil_wet_side.png"}, + drop = "default:dry_dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.override_item("default:desert_sand", { + groups = {crumbly=3, falling_node=1, sand=1, soil = 1}, + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) +minetest.register_node("farming:desert_sand_soil", { + description = S("Desert Sand Soil"), + drop = "default:desert_sand", + tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"}, + groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1}, + sounds = default.node_sound_sand_defaults(), + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) + +minetest.register_node("farming:desert_sand_soil_wet", { + description = S("Wet Desert Sand Soil"), + drop = "default:desert_sand", + tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"}, + groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1}, + sounds = default.node_sound_sand_defaults(), + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) + +minetest.register_node("farming:straw", { + description = S("Straw"), + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {snappy=3, flammable=4, fall_damage_add_percent=-30}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Registered before the stairs so the stairs get fuel recipes. +minetest.register_craft({ + type = "fuel", + recipe = "farming:straw", + burntime = 3, +}) + +do + local recipe = "farming:straw" + local groups = {snappy = 3, flammable = 4} + local images = {"farming_straw.png"} + local sounds = default.node_sound_leaves_defaults() + + stairs.register_stair("straw", recipe, groups, images, S("Straw Stair"), + sounds, true) + stairs.register_stair_inner("straw", recipe, groups, images, "", + sounds, true, S("Inner Straw Stair")) + stairs.register_stair_outer("straw", recipe, groups, images, "", + sounds, true, S("Outer Straw Stair")) + stairs.register_slab("straw", recipe, groups, images, S("Straw Slab"), + sounds, true) +end + +minetest.register_abm({ + label = "Farming soil", + nodenames = {"group:field"}, + interval = 15, + chance = 4, + action = function(pos, node) + local n_def = minetest.registered_nodes[node.name] or nil + local wet = n_def.soil.wet or nil + local base = n_def.soil.base or nil + local dry = n_def.soil.dry or nil + if not n_def or not n_def.soil or not wet or not base or not dry then + return + end + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + if not nn or not nn.name then + return + end + local nn_def = minetest.registered_nodes[nn.name] or nil + pos.y = pos.y - 1 + + if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then + minetest.set_node(pos, {name = base}) + return + end + -- check if there is water nearby + local wet_lvl = minetest.get_item_group(node.name, "wet") + if minetest.find_node_near(pos, 3, {"group:water"}) then + -- if it is dry soil and not base node, turn it into wet soil + if wet_lvl == 0 then + minetest.set_node(pos, {name = wet}) + end + else + -- only turn back if there are no unloaded blocks (and therefore + -- possible water sources) nearby + if not minetest.find_node_near(pos, 3, {"ignore"}) then + -- turn it back into base if it is already dry + if wet_lvl == 0 then + -- only turn it back if there is no plant/seed on top of it + if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then + minetest.set_node(pos, {name = base}) + end + + -- if its wet turn it back into dry soil + elseif wet_lvl == 1 then + minetest.set_node(pos, {name = dry}) + end + end + end + end, +}) + + +-- Make default:grass_* occasionally drop wheat seed + +for i = 1, 5 do + minetest.override_item("default:grass_"..i, {drop = { + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"default:grass_1"}}, + } + }}) +end + + +-- Make default:junglegrass occasionally drop cotton seed. + +-- This is the old source of cotton seeds that makes no sense. It is a leftover +-- from Mapgen V6 where junglegrass was the only plant available to be a source. +-- This source is kept for now to avoid disruption but should probably be +-- removed in future as players get used to the new source. + +minetest.override_item("default:junglegrass", {drop = { + max_items = 1, + items = { + {items = {"farming:seed_cotton"}, rarity = 8}, + {items = {"default:junglegrass"}}, + } +}}) + + +-- Wild cotton as a source of cotton seed + +minetest.register_node("farming:cotton_wild", { + description = S("Wild Cotton"), + drawtype = "plantlike", + waving = 1, + tiles = {"farming_cotton_wild.png"}, + inventory_image = "farming_cotton_wild.png", + wield_image = "farming_cotton_wild.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 4}, + drop = "farming:seed_cotton", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16}, + }, +}) diff --git a/mods/minetest_game/farming/textures/farming_bread.png b/mods/minetest_game/farming/textures/farming_bread.png new file mode 100644 index 00000000..16b25f19 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_bread.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton.png b/mods/minetest_game/farming/textures/farming_cotton.png new file mode 100644 index 00000000..8aa50e4e Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_1.png b/mods/minetest_game/farming/textures/farming_cotton_1.png new file mode 100644 index 00000000..5fc21807 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_1.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_2.png b/mods/minetest_game/farming/textures/farming_cotton_2.png new file mode 100644 index 00000000..db4f4a3e Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_2.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_3.png b/mods/minetest_game/farming/textures/farming_cotton_3.png new file mode 100644 index 00000000..df3d7a77 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_3.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_4.png b/mods/minetest_game/farming/textures/farming_cotton_4.png new file mode 100644 index 00000000..f314b07b Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_4.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_5.png b/mods/minetest_game/farming/textures/farming_cotton_5.png new file mode 100644 index 00000000..520e8f6c Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_5.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_6.png b/mods/minetest_game/farming/textures/farming_cotton_6.png new file mode 100644 index 00000000..f4bd4fb3 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_6.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_7.png b/mods/minetest_game/farming/textures/farming_cotton_7.png new file mode 100644 index 00000000..11c0cf6d Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_7.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_8.png b/mods/minetest_game/farming/textures/farming_cotton_8.png new file mode 100644 index 00000000..4450a2c4 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_8.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_seed.png b/mods/minetest_game/farming/textures/farming_cotton_seed.png new file mode 100644 index 00000000..f1d5b8ab Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_seed.png differ diff --git a/mods/minetest_game/farming/textures/farming_cotton_wild.png b/mods/minetest_game/farming/textures/farming_cotton_wild.png new file mode 100644 index 00000000..fba344c7 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_cotton_wild.png differ diff --git a/mods/minetest_game/farming/textures/farming_desert_sand_soil.png b/mods/minetest_game/farming/textures/farming_desert_sand_soil.png new file mode 100644 index 00000000..3c09ef0c Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_desert_sand_soil.png differ diff --git a/mods/minetest_game/farming/textures/farming_desert_sand_soil_wet.png b/mods/minetest_game/farming/textures/farming_desert_sand_soil_wet.png new file mode 100644 index 00000000..facc83e1 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_desert_sand_soil_wet.png differ diff --git a/mods/minetest_game/farming/textures/farming_desert_sand_soil_wet_side.png b/mods/minetest_game/farming/textures/farming_desert_sand_soil_wet_side.png new file mode 100644 index 00000000..41e5a04a Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_desert_sand_soil_wet_side.png differ diff --git a/mods/minetest_game/farming/textures/farming_flour.png b/mods/minetest_game/farming/textures/farming_flour.png new file mode 100644 index 00000000..b1a97836 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_flour.png differ diff --git a/mods/minetest_game/farming/textures/farming_soil.png b/mods/minetest_game/farming/textures/farming_soil.png new file mode 100644 index 00000000..31504258 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_soil.png differ diff --git a/mods/minetest_game/farming/textures/farming_soil_wet.png b/mods/minetest_game/farming/textures/farming_soil_wet.png new file mode 100644 index 00000000..2eb2c3cd Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_soil_wet.png differ diff --git a/mods/minetest_game/farming/textures/farming_soil_wet_side.png b/mods/minetest_game/farming/textures/farming_soil_wet_side.png new file mode 100644 index 00000000..f0b1bd45 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_soil_wet_side.png differ diff --git a/mods/minetest_game/farming/textures/farming_straw.png b/mods/minetest_game/farming/textures/farming_straw.png new file mode 100644 index 00000000..f9f5fe7c Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_straw.png differ diff --git a/mods/minetest_game/farming/textures/farming_string.png b/mods/minetest_game/farming/textures/farming_string.png new file mode 100644 index 00000000..e2bbfd7a Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_string.png differ diff --git a/mods/minetest_game/farming/textures/farming_tool_bronzehoe.png b/mods/minetest_game/farming/textures/farming_tool_bronzehoe.png new file mode 100644 index 00000000..2802d11d Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_tool_bronzehoe.png differ diff --git a/mods/minetest_game/farming/textures/farming_tool_diamondhoe.png b/mods/minetest_game/farming/textures/farming_tool_diamondhoe.png new file mode 100644 index 00000000..66f1042a Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_tool_diamondhoe.png differ diff --git a/mods/minetest_game/farming/textures/farming_tool_mesehoe.png b/mods/minetest_game/farming/textures/farming_tool_mesehoe.png new file mode 100644 index 00000000..4534fbaf Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_tool_mesehoe.png differ diff --git a/mods/minetest_game/farming/textures/farming_tool_steelhoe.png b/mods/minetest_game/farming/textures/farming_tool_steelhoe.png new file mode 100644 index 00000000..d057af24 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_tool_steelhoe.png differ diff --git a/mods/minetest_game/farming/textures/farming_tool_stonehoe.png b/mods/minetest_game/farming/textures/farming_tool_stonehoe.png new file mode 100644 index 00000000..55d8123f Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_tool_stonehoe.png differ diff --git a/mods/minetest_game/farming/textures/farming_tool_woodhoe.png b/mods/minetest_game/farming/textures/farming_tool_woodhoe.png new file mode 100644 index 00000000..a287152c Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_tool_woodhoe.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat.png b/mods/minetest_game/farming/textures/farming_wheat.png new file mode 100644 index 00000000..435d5df5 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_1.png b/mods/minetest_game/farming/textures/farming_wheat_1.png new file mode 100644 index 00000000..c16ad94b Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_1.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_2.png b/mods/minetest_game/farming/textures/farming_wheat_2.png new file mode 100644 index 00000000..baddb4c5 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_2.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_3.png b/mods/minetest_game/farming/textures/farming_wheat_3.png new file mode 100644 index 00000000..9d90ac14 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_3.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_4.png b/mods/minetest_game/farming/textures/farming_wheat_4.png new file mode 100644 index 00000000..14d055fb Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_4.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_5.png b/mods/minetest_game/farming/textures/farming_wheat_5.png new file mode 100644 index 00000000..5b88c578 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_5.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_6.png b/mods/minetest_game/farming/textures/farming_wheat_6.png new file mode 100644 index 00000000..e9c78e00 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_6.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_7.png b/mods/minetest_game/farming/textures/farming_wheat_7.png new file mode 100644 index 00000000..6b7bb4b9 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_7.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_8.png b/mods/minetest_game/farming/textures/farming_wheat_8.png new file mode 100644 index 00000000..d0500934 Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_8.png differ diff --git a/mods/minetest_game/farming/textures/farming_wheat_seed.png b/mods/minetest_game/farming/textures/farming_wheat_seed.png new file mode 100644 index 00000000..a9031fba Binary files /dev/null and b/mods/minetest_game/farming/textures/farming_wheat_seed.png differ diff --git a/mods/minetest_game/fire/README.txt b/mods/minetest_game/fire/README.txt new file mode 100644 index 00000000..eb3e1e24 --- /dev/null +++ b/mods/minetest_game/fire/README.txt @@ -0,0 +1,35 @@ +Minetest Game mod: fire +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures and sounds) +-------------------------------------- +Everything not listed in here: +Copyright (C) 2012 Perttu Ahola (celeron55) (CC BY-SA 3.0) + +Muadtralk (CC BY-SA 3.0) + fire_basic_flame_animated.png + +Gambit (CC BY-SA 3.0) + fire_flint_steel.png + +dobroide (CC BY 3.0) +http://www.freesound.org/people/dobroide/sounds/4211/ + fire_small.ogg + +Dynamicell (CC BY 3.0) +http://www.freesound.org/people/Dynamicell/sounds/17548/ + fire_large.ogg + fire_fire.*.ogg + +fire_small.ogg and fire_large.ogg are unused but kept temporarily to not break +other mods that may use them. + +Benboncan (CC BY 3.0) +https://www.freesound.org/people/Benboncan/sounds/66457/ + fire_flint_and_steel.ogg diff --git a/mods/minetest_game/fire/init.lua b/mods/minetest_game/fire/init.lua new file mode 100644 index 00000000..538cfa6f --- /dev/null +++ b/mods/minetest_game/fire/init.lua @@ -0,0 +1,312 @@ +-- fire/init.lua + +-- Global namespace for functions +fire = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("fire") + +-- 'Enable fire' setting +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.settings:get_bool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end +end + +-- +-- Items +-- + +-- Flood flame function +local function flood_flame(pos, _, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if minetest.get_item_group(newnode.name, "igniter") == 0 then + minetest.sound_play("fire_extinguish_flame", + {pos = pos, max_hear_distance = 16, gain = 0.15}, true) + end + -- Remove the flame + return false +end + +-- Flame nodes +local fire_node = { + drawtype = "firelike", + tiles = {{ + name = "fire_basic_flame_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + }} + }, + inventory_image = "fire_basic_flame.png", + paramtype = "light", + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = {igniter = 2, dig_immediate = 3, fire = 1}, + drop = "", + on_flood = flood_flame +} + +-- Basic flame node +local flame_fire_node = table.copy(fire_node) +flame_fire_node.description = S("Fire") +flame_fire_node.groups.not_in_creative_inventory = 1 +flame_fire_node.on_timer = function(pos) + if not minetest.find_node_near(pos, 1, {"group:flammable"}) then + minetest.remove_node(pos) + return + end + -- Restart timer + return true +end +flame_fire_node.on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(30, 60)) +end + +minetest.register_node("fire:basic_flame", flame_fire_node) + +-- Permanent flame node +local permanent_fire_node = table.copy(fire_node) +permanent_fire_node.description = S("Permanent Fire") + +minetest.register_node("fire:permanent_flame", permanent_fire_node) + +-- Flint and Steel +minetest.register_tool("fire:flint_and_steel", { + description = S("Flint and Steel"), + inventory_image = "fire_flint_steel.png", + sound = {breaks = "default_tool_breaks"}, + + on_use = function(itemstack, user, pointed_thing) + local sound_pos = pointed_thing.above or user:get_pos() + minetest.sound_play("fire_flint_and_steel", + {pos = sound_pos, gain = 0.2, max_hear_distance = 8}, true) + local player_name = user:get_player_name() + if pointed_thing.type == "node" then + local node_under = minetest.get_node(pointed_thing.under).name + local nodedef = minetest.registered_nodes[node_under] + if not nodedef then + return + end + if minetest.is_protected(pointed_thing.under, player_name) then + minetest.record_protection_violation(pointed_thing.under, player_name) + return + end + if nodedef.on_ignite then + nodedef.on_ignite(pointed_thing.under, user) + elseif minetest.get_item_group(node_under, "flammable") >= 1 + and minetest.get_node(pointed_thing.above).name == "air" then + if minetest.is_protected(pointed_thing.above, player_name) then + minetest.record_protection_violation(pointed_thing.above, player_name) + return + end + + minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"}) + end + end + if not minetest.is_creative_enabled(player_name) then + -- Wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear_by_uses(66) + + -- Tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, + {pos = sound_pos, gain = 0.5}, true) + end + return itemstack + end + end +}) + +minetest.register_craft({ + output = "fire:flint_and_steel", + recipe = { + {"default:flint", "default:steel_ingot"} + } +}) + +-- Override coalblock to enable permanent flame above +-- Coalblock is non-flammable to avoid unwanted basic_flame nodes +minetest.override_item("default:coalblock", { + after_destruct = function(pos) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == "fire:permanent_flame" then + minetest.remove_node(pos) + end + end, + on_ignite = function(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node(flame_pos).name == "air" then + minetest.set_node(flame_pos, {name = "fire:permanent_flame"}) + end + end +}) + + +-- +-- Sound +-- + +-- Enable if no setting present +local flame_sound = minetest.settings:get_bool("flame_sound", true) + +if flame_sound then + local handles = {} + local timer = 0 + + -- Parameters + local radius = 8 -- Flame node search radius around player + local cycle = 3 -- Cycle time for sound updates + + -- Update sound for player + function fire.update_player_sound(player) + local player_name = player:get_player_name() + -- Search for flame nodes in radius around player + local ppos = player:get_pos() + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + local fpos, num = minetest.find_nodes_in_area( + areamin, + areamax, + {"fire:basic_flame", "fire:permanent_flame"} + ) + -- Total number of flames in radius + local flames = (num["fire:basic_flame"] or 0) + + (num["fire:permanent_flame"] or 0) + -- Stop previous sound + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + -- If flames + if flames > 0 then + -- Find centre of flame positions + local fposmid = fpos[1] + -- If more than 1 flame + if #fpos > 1 then + local fposmin = areamax + local fposmax = areamin + for i = 1, #fpos do + local fposi = fpos[i] + if fposi.x > fposmax.x then + fposmax.x = fposi.x + end + if fposi.y > fposmax.y then + fposmax.y = fposi.y + end + if fposi.z > fposmax.z then + fposmax.z = fposi.z + end + if fposi.x < fposmin.x then + fposmin.x = fposi.x + end + if fposi.y < fposmin.y then + fposmin.y = fposi.y + end + if fposi.z < fposmin.z then + fposmin.z = fposi.z + end + end + fposmid = vector.divide(vector.add(fposmin, fposmax), 2) + end + -- Play sound + local handle = minetest.sound_play("fire_fire", { + pos = fposmid, + to_player = player_name, + gain = math.min(0.06 * (1 + flames * 0.125), 0.18), + max_hear_distance = 32, + loop = true -- In case of lag + }) + -- Store sound handle for this player + if handle then + handles[player_name] = handle + end + end + end + + -- Cycle for updating players sounds + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < cycle then + return + end + + timer = 0 + local players = minetest.get_connected_players() + for n = 1, #players do + fire.update_player_sound(players[n]) + end + end) + + -- Stop sound and clear handle on player leave + minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + end) +end + + +-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it +function fire.update_sounds_around() end + +-- +-- ABMs +-- + +if fire_enabled then + -- Ignite neighboring nodes, add basic flames + minetest.register_abm({ + label = "Ignite flame", + nodenames = {"group:flammable"}, + neighbors = {"group:igniter"}, + interval = 7, + chance = 12, + catch_up = false, + action = function(pos) + local p = minetest.find_node_near(pos, 1, {"air"}) + if p then + minetest.set_node(p, {name = "fire:basic_flame"}) + end + end + }) + + -- Remove flammable nodes around basic flame + minetest.register_abm({ + label = "Remove flammable nodes", + nodenames = {"fire:basic_flame"}, + neighbors = "group:flammable", + interval = 5, + chance = 18, + catch_up = false, + action = function(pos) + local p = minetest.find_node_near(pos, 1, {"group:flammable"}) + if not p then + return + end + local flammable_node = minetest.get_node(p) + local def = minetest.registered_nodes[flammable_node.name] + if def.on_burn then + def.on_burn(p) + else + minetest.remove_node(p) + minetest.check_for_falling(p) + end + end + }) +end diff --git a/mods/minetest_game/fire/license.txt b/mods/minetest_game/fire/license.txt new file mode 100644 index 00000000..9f2aca92 --- /dev/null +++ b/mods/minetest_game/fire/license.txt @@ -0,0 +1,84 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures and sounds) +--------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Muadtralk +Copyright (C) 2013-2016 Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2005 dobroide +Copyright (C) 2006 Dynamicell +Copyright (C) 2009 Benboncan + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ diff --git a/mods/minetest_game/fire/locale/fire.de.tr b/mods/minetest_game/fire/locale/fire.de.tr new file mode 100644 index 00000000..dad7c34a --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.de.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Feuer +Permanent Fire=Permanentes Feuer +Flint and Steel=Feuerstein und Stahl diff --git a/mods/minetest_game/fire/locale/fire.eo.tr b/mods/minetest_game/fire/locale/fire.eo.tr new file mode 100644 index 00000000..c1e992be --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.eo.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fajro +Permanent Fire=Ĉiama fajro +Flint and Steel=Siliko kaj Åtalo diff --git a/mods/minetest_game/fire/locale/fire.es.tr b/mods/minetest_game/fire/locale/fire.es.tr new file mode 100644 index 00000000..4ce3f328 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.es.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fuego +Permanent Fire=Fuego permanente +Flint and Steel=Yesca y pedernal diff --git a/mods/minetest_game/fire/locale/fire.fr.tr b/mods/minetest_game/fire/locale/fire.fr.tr new file mode 100644 index 00000000..6218c53c --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.fr.tr @@ -0,0 +1,9 @@ +# textdomain: fire +Fire=Feu +Permanent Fire=Feu qui brûle en permanence +Flint and Steel=Briquet à silex en acier + + +##### not used anymore ##### + +Permanent Flame=Flamme permanente diff --git a/mods/minetest_game/fire/locale/fire.id.tr b/mods/minetest_game/fire/locale/fire.id.tr new file mode 100644 index 00000000..a6d2da55 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.id.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Api +Permanent Fire=Api Abadi +Flint and Steel=Pemantik Api diff --git a/mods/minetest_game/fire/locale/fire.it.tr b/mods/minetest_game/fire/locale/fire.it.tr new file mode 100644 index 00000000..14ad3828 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.it.tr @@ -0,0 +1,9 @@ +# textdomain: fire +Fire= +Permanent Fire= +Flint and Steel=Acciarino + + +##### not used anymore ##### + +Permanent Flame=Fiamma permanente diff --git a/mods/minetest_game/fire/locale/fire.ja.tr b/mods/minetest_game/fire/locale/fire.ja.tr new file mode 100644 index 00000000..bf5fec4e --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.ja.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=炎 +Permanent Fire=燃ãˆç¶šã‘る炎 +Flint and Steel=ç«æ‰“ã¡çŸ³ã¨æ‰“ã¡é‡‘ diff --git a/mods/minetest_game/fire/locale/fire.jbo.tr b/mods/minetest_game/fire/locale/fire.jbo.tr new file mode 100644 index 00000000..b081236d --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=lo fagri +Permanent Fire=lo vitno fagri +Flint and Steel=lo fakro'i jo'u gasta diff --git a/mods/minetest_game/fire/locale/fire.lv.tr b/mods/minetest_game/fire/locale/fire.lv.tr new file mode 100644 index 00000000..b9b50ef8 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.lv.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Uguns +Permanent Fire=MūžīgÄ uguns +Flint and Steel=Krams un zÄģītis diff --git a/mods/minetest_game/fire/locale/fire.ms.tr b/mods/minetest_game/fire/locale/fire.ms.tr new file mode 100644 index 00000000..e43f26c1 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.ms.tr @@ -0,0 +1,9 @@ +# textdomain: fire +Fire=Api +Permanent Fire=Api Abadi +Flint and Steel=Pemetik Api + + +##### not used anymore ##### + +Permanent Flame=Api Abadi diff --git a/mods/minetest_game/fire/locale/fire.pl.tr b/mods/minetest_game/fire/locale/fire.pl.tr new file mode 100644 index 00000000..a19e6aff --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.pl.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=OgieÅ„ +Permanent Fire=StaÅ‚y ogieÅ„ +Flint and Steel=Zapalniczka diff --git a/mods/minetest_game/fire/locale/fire.pt.tr b/mods/minetest_game/fire/locale/fire.pt.tr new file mode 100644 index 00000000..4a84b6e5 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.pt.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fogo +Permanent Fire=Fogo Permanente +Flint and Steel=Pederneira Primitiva diff --git a/mods/minetest_game/fire/locale/fire.pt_BR.tr b/mods/minetest_game/fire/locale/fire.pt_BR.tr new file mode 100644 index 00000000..4a84b6e5 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fogo +Permanent Fire=Fogo Permanente +Flint and Steel=Pederneira Primitiva diff --git a/mods/minetest_game/fire/locale/fire.ru.tr b/mods/minetest_game/fire/locale/fire.ru.tr new file mode 100644 index 00000000..5b38a8c1 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.ru.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Огонь +Permanent Fire=Вечный огонь +Flint and Steel=Огниво \ No newline at end of file diff --git a/mods/minetest_game/fire/locale/fire.sk.tr b/mods/minetest_game/fire/locale/fire.sk.tr new file mode 100644 index 00000000..125c8603 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.sk.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Oheň +Permanent Fire=Stály oheň +Flint and Steel=Pazúrik a ocieľka diff --git a/mods/minetest_game/fire/locale/fire.sv.tr b/mods/minetest_game/fire/locale/fire.sv.tr new file mode 100644 index 00000000..28e9a4a2 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.sv.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Eld +Permanent Fire=Permanent eld +Flint and Steel=Flinta och stÃ¥l diff --git a/mods/minetest_game/fire/locale/fire.uk.tr b/mods/minetest_game/fire/locale/fire.uk.tr new file mode 100644 index 00000000..da202aa7 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.uk.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Вогонь +Permanent Fire=Вічний вогонь +Flint and Steel=КреÑало diff --git a/mods/minetest_game/fire/locale/fire.zh_CN.tr b/mods/minetest_game/fire/locale/fire.zh_CN.tr new file mode 100644 index 00000000..7b0a4727 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=ç«ç„° +Permanent Fire=永久ç«ç„° +Flint and Steel=ç«çŸ³å’Œåˆ’片 diff --git a/mods/minetest_game/fire/locale/fire.zh_TW.tr b/mods/minetest_game/fire/locale/fire.zh_TW.tr new file mode 100644 index 00000000..9e3d7663 --- /dev/null +++ b/mods/minetest_game/fire/locale/fire.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=ç«ç„° +Permanent Fire=永久ç«ç„° +Flint and Steel=ç«çŸ³å’Œé‹¼ diff --git a/mods/minetest_game/fire/locale/template.txt b/mods/minetest_game/fire/locale/template.txt new file mode 100644 index 00000000..e4e44e79 --- /dev/null +++ b/mods/minetest_game/fire/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: fire +Fire= +Permanent Fire= +Flint and Steel= diff --git a/mods/minetest_game/fire/mod.conf b/mods/minetest_game/fire/mod.conf new file mode 100644 index 00000000..c70f23b7 --- /dev/null +++ b/mods/minetest_game/fire/mod.conf @@ -0,0 +1,3 @@ +name = fire +description = Minetest Game mod: fire +depends = default diff --git a/mods/minetest_game/fire/sounds/fire_extinguish_flame.1.ogg b/mods/minetest_game/fire/sounds/fire_extinguish_flame.1.ogg new file mode 100644 index 00000000..42506ddf Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_extinguish_flame.1.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_extinguish_flame.2.ogg b/mods/minetest_game/fire/sounds/fire_extinguish_flame.2.ogg new file mode 100644 index 00000000..2747ab81 Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_extinguish_flame.2.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_extinguish_flame.3.ogg b/mods/minetest_game/fire/sounds/fire_extinguish_flame.3.ogg new file mode 100644 index 00000000..8baeac32 Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_extinguish_flame.3.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_fire.1.ogg b/mods/minetest_game/fire/sounds/fire_fire.1.ogg new file mode 100644 index 00000000..cbfee4c6 Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_fire.1.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_fire.2.ogg b/mods/minetest_game/fire/sounds/fire_fire.2.ogg new file mode 100644 index 00000000..e8d0eb13 Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_fire.2.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_fire.3.ogg b/mods/minetest_game/fire/sounds/fire_fire.3.ogg new file mode 100644 index 00000000..5cad3d9b Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_fire.3.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_flint_and_steel.ogg b/mods/minetest_game/fire/sounds/fire_flint_and_steel.ogg new file mode 100644 index 00000000..6996e16f Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_flint_and_steel.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_large.ogg b/mods/minetest_game/fire/sounds/fire_large.ogg new file mode 100644 index 00000000..fe78e625 Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_large.ogg differ diff --git a/mods/minetest_game/fire/sounds/fire_small.ogg b/mods/minetest_game/fire/sounds/fire_small.ogg new file mode 100644 index 00000000..5aac595b Binary files /dev/null and b/mods/minetest_game/fire/sounds/fire_small.ogg differ diff --git a/mods/minetest_game/fire/textures/fire_basic_flame.png b/mods/minetest_game/fire/textures/fire_basic_flame.png new file mode 100644 index 00000000..484bcb19 Binary files /dev/null and b/mods/minetest_game/fire/textures/fire_basic_flame.png differ diff --git a/mods/minetest_game/fire/textures/fire_basic_flame_animated.png b/mods/minetest_game/fire/textures/fire_basic_flame_animated.png new file mode 100644 index 00000000..b01f7036 Binary files /dev/null and b/mods/minetest_game/fire/textures/fire_basic_flame_animated.png differ diff --git a/mods/minetest_game/fire/textures/fire_flint_steel.png b/mods/minetest_game/fire/textures/fire_flint_steel.png new file mode 100644 index 00000000..9d32d85b Binary files /dev/null and b/mods/minetest_game/fire/textures/fire_flint_steel.png differ diff --git a/mods/minetest_game/fireflies/README.txt b/mods/minetest_game/fireflies/README.txt new file mode 100644 index 00000000..7382578d --- /dev/null +++ b/mods/minetest_game/fireflies/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: fireflies +============================ +Adds fireflies to the world on mapgen, which can then be caught in a net and placed in +bottles to provide light. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + fireflies_firefly.png + fireflies_firefly_animated.png + fireflies_bugnet.png + fireflies_bottle.png + fireflies_bottle_animated.png + +fireflies_bugnet.png is modified from a texture by tenplus1 (CC0) + +fireflies_bottle.png and fireflies_bottle_animated.png are +modified from a texture by Vanessa Ezekowitz (CC BY-SA 3.0) \ No newline at end of file diff --git a/mods/minetest_game/fireflies/init.lua b/mods/minetest_game/fireflies/init.lua new file mode 100644 index 00000000..e0037715 --- /dev/null +++ b/mods/minetest_game/fireflies/init.lua @@ -0,0 +1,162 @@ +-- firefly/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("fireflies") + +-- Legacy compatibility, when pointabilities don't exist, pointable is set to true. +local pointable_compat = not minetest.features.item_specific_pointabilities + +minetest.register_node("fireflies:firefly", { + description = S("Firefly"), + drawtype = "plantlike", + tiles = {{ + name = "fireflies_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + pointable = pointable_compat, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "fireflies:hidden_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("fireflies:hidden_firefly", { + description = S("Hidden Firefly"), + drawtype = "airlike", + inventory_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + wield_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "fireflies:firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + + +-- bug net +minetest.register_tool("fireflies:bug_net", { + description = S("Bug Net"), + inventory_image = "fireflies_bugnet.png", + pointabilities = {nodes = {["group:catchable"] = true}}, + tool_capabilities = { + groupcaps = { + catchable = { maxlevel = 1, uses = 256, times = { [1] = 0, [2] = 0, [3] = 0 } } + }, + }, +}) + +minetest.register_craft( { + output = "fireflies:bug_net", + recipe = { + {"farming:string", "farming:string"}, + {"farming:string", "farming:string"}, + {"group:stick", ""} + } +}) + + +-- firefly in a bottle +minetest.register_node("fireflies:firefly_bottle", { + description = S("Firefly in a Bottle"), + inventory_image = "fireflies_bottle.png", + wield_image = "fireflies_bottle.png", + tiles = {{ + name = "fireflies_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + walkable = false, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + sounds = default.node_sound_glass_defaults(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local firefly_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + firefly_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + firefly_pos = lower_pos + end + + if firefly_pos then + minetest.set_node(pos, {name = "vessels:glass_bottle"}) + minetest.set_node(firefly_pos, {name = "fireflies:firefly"}) + minetest.get_node_timer(firefly_pos):start(1) + end + end +}) + +minetest.register_craft( { + output = "fireflies:firefly_bottle", + recipe = { + {"fireflies:firefly"}, + {"vessels:glass_bottle"} + } +}) + +-- restart firefly timers +minetest.register_lbm({ + name = "fireflies:firefly_timer", + nodenames = {"fireflies:firefly", "fireflies:hidden_firefly"}, + run_at_every_load = true, + + action = function(pos) + minetest.get_node_timer(pos):start(math.random(1,5)) + end, +}) \ No newline at end of file diff --git a/mods/minetest_game/fireflies/license.txt b/mods/minetest_game/fireflies/license.txt new file mode 100644 index 00000000..eebdad63 --- /dev/null +++ b/mods/minetest_game/fireflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/minetest_game/fireflies/locale/fireflies.de.tr b/mods/minetest_game/fireflies/locale/fireflies.de.tr new file mode 100644 index 00000000..c5d116a7 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.de.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Glühwürmchen +Hidden Firefly=Verborgenes Glühwürmchen +Bug Net=Insektennetz +Firefly in a Bottle=Glühwürmchen in einer Flasche diff --git a/mods/minetest_game/fireflies/locale/fireflies.eo.tr b/mods/minetest_game/fireflies/locale/fireflies.eo.tr new file mode 100644 index 00000000..0eaa2cb7 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.eo.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Lampiro +Hidden Firefly=KaÅita lampiro +Bug Net=Insekta reto +Firefly in a Bottle=Lampiro en botelo diff --git a/mods/minetest_game/fireflies/locale/fireflies.es.tr b/mods/minetest_game/fireflies/locale/fireflies.es.tr new file mode 100644 index 00000000..95d053e1 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.es.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Luciérnaga +Hidden Firefly=Luciérnaga oculta +Bug Net=Red de insectos +Firefly in a Bottle=Luciérnaga en botella diff --git a/mods/minetest_game/fireflies/locale/fireflies.fr.tr b/mods/minetest_game/fireflies/locale/fireflies.fr.tr new file mode 100644 index 00000000..3deda664 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.fr.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Luciole +Hidden Firefly=Luciole cachée +Bug Net=Filet à papillon +Firefly in a Bottle=Luciole en bouteille diff --git a/mods/minetest_game/fireflies/locale/fireflies.id.tr b/mods/minetest_game/fireflies/locale/fireflies.id.tr new file mode 100644 index 00000000..bc6434ee --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.id.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Kunang-Kunang +Hidden Firefly=Kunang-Kunang Tersembunyi +Bug Net=Jaring Serangga +Firefly in a Bottle=Kunang-Kunang dalam Botol diff --git a/mods/minetest_game/fireflies/locale/fireflies.it.tr b/mods/minetest_game/fireflies/locale/fireflies.it.tr new file mode 100644 index 00000000..22ad57b3 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.it.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Lucciola +Hidden Firefly=Lucciola nascosta +Bug Net=Retino +Firefly in a Bottle=Lucciola imbottigliata diff --git a/mods/minetest_game/fireflies/locale/fireflies.ja.tr b/mods/minetest_game/fireflies/locale/fireflies.ja.tr new file mode 100644 index 00000000..4116ca2f --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.ja.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=ホタル +Hidden Firefly=éš ã•れãŸãƒ›ã‚¿ãƒ« +Bug Net=虫å–り網 +Firefly in a Bottle=ホタルã®å…¥ã£ãŸç“¶ diff --git a/mods/minetest_game/fireflies/locale/fireflies.jbo.tr b/mods/minetest_game/fireflies/locale/fireflies.jbo.tr new file mode 100644 index 00000000..4e69ab49 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.jbo.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=lo gusycinki +Hidden Firefly=lo se mipri gusycinki +Bug Net=lo cinki julne +Firefly in a Bottle=lo gusycinki poi nenri lo botpi diff --git a/mods/minetest_game/fireflies/locale/fireflies.lv.tr b/mods/minetest_game/fireflies/locale/fireflies.lv.tr new file mode 100644 index 00000000..7bb65207 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.lv.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=JÄņtÄrpiņš +Hidden Firefly=PaslÄ“pts jÄņtÄrpiņš +Bug Net=ĶeramtÄ«kls +Firefly in a Bottle=JÄņtÄrpiņš pudelÄ“ diff --git a/mods/minetest_game/fireflies/locale/fireflies.ms.tr b/mods/minetest_game/fireflies/locale/fireflies.ms.tr new file mode 100644 index 00000000..509d03d3 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.ms.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Kelip-Kelip +Hidden Firefly=Kelip-Kelip Tersembunyi +Bug Net=Jaring Pepijat +Firefly in a Bottle=Kelip-Kelip dalam Botol diff --git a/mods/minetest_game/fireflies/locale/fireflies.pl.tr b/mods/minetest_game/fireflies/locale/fireflies.pl.tr new file mode 100644 index 00000000..b07152b9 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.pl.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Åšwietlik +Hidden Firefly=Ukryty Å›wietlik +Bug Net=Siatka na owady +Firefly in a Bottle=Åšwietlik w butelce diff --git a/mods/minetest_game/fireflies/locale/fireflies.pt_BR.tr b/mods/minetest_game/fireflies/locale/fireflies.pt_BR.tr new file mode 100644 index 00000000..543c00b7 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Vaga-lume +Hidden Firefly=Vaga-lume escondido +Bug Net=Rede de Insetos +Firefly in a Bottle=Vaga-lume em uma garrafa diff --git a/mods/minetest_game/fireflies/locale/fireflies.ru.tr b/mods/minetest_game/fireflies/locale/fireflies.ru.tr new file mode 100644 index 00000000..8c50a7da --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.ru.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=СветлÑчок +Hidden Firefly=ПритаившийÑÑ ÑветлÑчок +Bug Net=Сачок +Firefly in a Bottle=СветлÑчок в бутылке diff --git a/mods/minetest_game/fireflies/locale/fireflies.sk.tr b/mods/minetest_game/fireflies/locale/fireflies.sk.tr new file mode 100644 index 00000000..b68674dd --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.sk.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=SvetluÅ¡ka +Hidden Firefly=Skrytá svetluÅ¡ka +Bug Net=SieÅ¥ka na hmyz +Firefly in a Bottle=SvetluÅ¡ka vo fľaÅ¡i diff --git a/mods/minetest_game/fireflies/locale/fireflies.sv.tr b/mods/minetest_game/fireflies/locale/fireflies.sv.tr new file mode 100644 index 00000000..d8016f99 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.sv.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Eldfluga +Hidden Firefly=Gömd eldfluga +Bug Net=InsektshÃ¥v +Firefly in a Bottle=Eldfluga i en flaska diff --git a/mods/minetest_game/fireflies/locale/fireflies.uk.tr b/mods/minetest_game/fireflies/locale/fireflies.uk.tr new file mode 100644 index 00000000..f1bcb163 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.uk.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=СвітлÑк +Hidden Firefly=СвітлÑк, що причаївÑÑ +Bug Net=Сачок +Firefly in a Bottle=СвітлÑк у плÑшці diff --git a/mods/minetest_game/fireflies/locale/fireflies.zh_CN.tr b/mods/minetest_game/fireflies/locale/fireflies.zh_CN.tr new file mode 100644 index 00000000..5971785a --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=è¤ç«è™« +Hidden Firefly=éšè—çš„è¤ç«è™« +Bug Net=虫网 +Firefly in a Bottle=放在瓶å­é‡Œçš„è¤ç«è™« diff --git a/mods/minetest_game/fireflies/locale/fireflies.zh_TW.tr b/mods/minetest_game/fireflies/locale/fireflies.zh_TW.tr new file mode 100644 index 00000000..af754a91 --- /dev/null +++ b/mods/minetest_game/fireflies/locale/fireflies.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=螢ç«èŸ² +Hidden Firefly=éš±è—的螢ç«èŸ² +Bug Net=蟲網 +Firefly in a Bottle=放在瓶å­è£¡çš„螢ç«èŸ² diff --git a/mods/minetest_game/fireflies/locale/template.txt b/mods/minetest_game/fireflies/locale/template.txt new file mode 100644 index 00000000..91aa8ffa --- /dev/null +++ b/mods/minetest_game/fireflies/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly= +Hidden Firefly= +Bug Net= +Firefly in a Bottle= diff --git a/mods/minetest_game/fireflies/mod.conf b/mods/minetest_game/fireflies/mod.conf new file mode 100644 index 00000000..a5335880 --- /dev/null +++ b/mods/minetest_game/fireflies/mod.conf @@ -0,0 +1,3 @@ +name = fireflies +description = Minetest Game mod: fireflies +depends = default, vessels diff --git a/mods/minetest_game/fireflies/textures/fireflies_bottle.png b/mods/minetest_game/fireflies/textures/fireflies_bottle.png new file mode 100644 index 00000000..ecca0363 Binary files /dev/null and b/mods/minetest_game/fireflies/textures/fireflies_bottle.png differ diff --git a/mods/minetest_game/fireflies/textures/fireflies_bottle_animated.png b/mods/minetest_game/fireflies/textures/fireflies_bottle_animated.png new file mode 100644 index 00000000..294ff974 Binary files /dev/null and b/mods/minetest_game/fireflies/textures/fireflies_bottle_animated.png differ diff --git a/mods/minetest_game/fireflies/textures/fireflies_bugnet.png b/mods/minetest_game/fireflies/textures/fireflies_bugnet.png new file mode 100644 index 00000000..8ec3d33b Binary files /dev/null and b/mods/minetest_game/fireflies/textures/fireflies_bugnet.png differ diff --git a/mods/minetest_game/fireflies/textures/fireflies_firefly.png b/mods/minetest_game/fireflies/textures/fireflies_firefly.png new file mode 100644 index 00000000..c0866894 Binary files /dev/null and b/mods/minetest_game/fireflies/textures/fireflies_firefly.png differ diff --git a/mods/minetest_game/fireflies/textures/fireflies_firefly_animated.png b/mods/minetest_game/fireflies/textures/fireflies_firefly_animated.png new file mode 100644 index 00000000..e6932e37 Binary files /dev/null and b/mods/minetest_game/fireflies/textures/fireflies_firefly_animated.png differ diff --git a/mods/minetest_game/flowers/README.txt b/mods/minetest_game/flowers/README.txt new file mode 100644 index 00000000..1cb02a75 --- /dev/null +++ b/mods/minetest_game/flowers/README.txt @@ -0,0 +1,30 @@ +Minetest Game mod: flowers +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Ironzorg (MIT) and VanessaE (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +RHRhino (CC BY-SA 3.0): + flowers_dandelion_white.png + flowers_geranium.png + flowers_rose.png + flowers_tulip.png + flowers_viola.png + +Gambit (CC BY-SA 3.0): + flowers_mushroom_brown.png + flowers_mushroom_red.png + flowers_waterlily.png + +yyt16384 (CC BY-SA 3.0): + flowers_waterlily_bottom.png -- Derived from Gambit's texture + +paramat (CC BY-SA 3.0): + flowers_dandelion_yellow.png -- Derived from RHRhino's texture + flowers_tulip_black.png -- Derived from RHRhino's texture + flowers_chrysanthemum_green.png diff --git a/mods/minetest_game/flowers/init.lua b/mods/minetest_game/flowers/init.lua new file mode 100644 index 00000000..e13ee32f --- /dev/null +++ b/mods/minetest_game/flowers/init.lua @@ -0,0 +1,336 @@ +-- flowers/init.lua + +-- Minetest Game mod: flowers +-- See README.txt for licensing and other information. + + +-- Namespace for functions + +flowers = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("flowers") + + +-- Map Generation + +dofile(minetest.get_modpath("flowers") .. "/mapgen.lua") + + +-- +-- Flowers +-- + +-- Aliases for original flowers mod + +minetest.register_alias("flowers:flower_rose", "flowers:rose") +minetest.register_alias("flowers:flower_tulip", "flowers:tulip") +minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow") +minetest.register_alias("flowers:flower_geranium", "flowers:geranium") +minetest.register_alias("flowers:flower_viola", "flowers:viola") +minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white") + + +-- Flower registration + +local function add_simple_flower(name, desc, box, f_groups) + -- Common flowers' groups + f_groups.snappy = 3 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node("flowers:" .. name, { + description = desc, + drawtype = "plantlike", + waving = 1, + tiles = {"flowers_" .. name .. ".png"}, + inventory_image = "flowers_" .. name .. ".png", + wield_image = "flowers_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + buildable_to = true, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box + } + }) +end + +flowers.datas = { + { + "rose", + S("Red Rose"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_red = 1, flammable = 1} + }, + { + "tulip", + S("Orange Tulip"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_orange = 1, flammable = 1} + }, + { + "dandelion_yellow", + S("Yellow Dandelion"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16}, + {color_yellow = 1, flammable = 1} + }, + { + "chrysanthemum_green", + S("Green Chrysanthemum"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + {color_green = 1, flammable = 1} + }, + { + "geranium", + S("Blue Geranium"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "viola", + S("Viola"), + {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}, + {color_violet = 1, flammable = 1} + }, + { + "dandelion_white", + S("White Dandelion"), + {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, + {color_white = 1, flammable = 1} + }, + { + "tulip_black", + S("Black Tulip"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_black = 1, flammable = 1} + }, +} + +for _,item in pairs(flowers.datas) do + add_simple_flower(unpack(item)) +end + + +-- Flower spread +-- Public function to enable override by mods + +function flowers.flower_spread(pos, node) + pos.y = pos.y - 1 + local under = minetest.get_node(pos) + pos.y = pos.y + 1 + -- Replace flora with dry shrub in desert sand and silver sand, + -- as this is the only way to generate them. + -- However, preserve grasses in sand dune biomes. + if minetest.get_item_group(under.name, "sand") == 1 and + under.name ~= "default:sand" then + minetest.set_node(pos, {name = "default:dry_shrub"}) + return + end + + if minetest.get_item_group(under.name, "soil") == 0 then + return + end + + local light = minetest.get_node_light(pos) + if not light or light < 13 then + return + end + + local pos0 = vector.subtract(pos, 4) + local pos1 = vector.add(pos, 4) + -- Testing shows that a threshold of 3 results in an appropriate maximum + -- density of approximately 7 flora per 9x9 area. + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then + return + end + + local soils = minetest.find_nodes_in_area_under_air( + pos0, pos1, "group:soil") + local num_soils = #soils + if num_soils >= 1 then + for si = 1, math.min(3, num_soils) do + local soil = soils[math.random(num_soils)] + local soil_name = minetest.get_node(soil).name + local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z} + light = minetest.get_node_light(soil_above) + if light and light >= 13 and + -- Only spread to same surface node + soil_name == under.name and + -- Desert sand is in the soil group + soil_name ~= "default:desert_sand" then + minetest.set_node(soil_above, {name = node.name}) + end + end + end +end + +minetest.register_abm({ + label = "Flower spread", + nodenames = {"group:flora"}, + interval = 13, + chance = 300, + action = function(...) + flowers.flower_spread(...) + end, +}) + + +-- +-- Mushrooms +-- + +minetest.register_node("flowers:mushroom_red", { + description = S("Red Mushroom"), + tiles = {"flowers_mushroom_red.png"}, + inventory_image = "flowers_mushroom_red.png", + wield_image = "flowers_mushroom_red.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(-5), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } +}) + +minetest.register_node("flowers:mushroom_brown", { + description = S("Brown Mushroom"), + tiles = {"flowers_mushroom_brown.png"}, + inventory_image = "flowers_mushroom_brown.png", + wield_image = "flowers_mushroom_brown.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {mushroom = 1, food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(1), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } +}) + + +-- Mushroom spread and death + +function flowers.mushroom_spread(pos, node) + --[[if minetest.get_node_light(pos, 0.5) > 3 then + if minetest.get_node_light(pos, nil) == 15 then + minetest.remove_node(pos) + end + return + end]] + local positions = minetest.find_nodes_in_area_under_air( + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, + {"group:soil", "group:tree"}) + if #positions == 0 then + return + end + local pos2 = positions[math.random(#positions)] + pos2.y = pos2.y + 1 + if minetest.get_node_light(pos2, 0.5) <= 3 then + minetest.set_node(pos2, {name = node.name}) + end +end + +minetest.register_abm({ + label = "Mushroom spread", + nodenames = {"group:mushroom"}, + interval = 11, + chance = 150, + action = function(...) + flowers.mushroom_spread(...) + end, +}) + + +-- These old mushroom related nodes can be simplified now + +minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown") +minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red") +minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown") +minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red") +minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown") +minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red") + + +-- +-- Waterlily +-- + +local waterlily_def = { + description = S("Waterlily"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"}, + inventory_image = "flowers_waterlily.png", + wield_image = "flowers_waterlily.png", + use_texture_alpha = "clip", + liquids_pointable = true, + walkable = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flower = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + node_placement_prediction = "", + node_box = { + type = "fixed", + fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5} + }, + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16} + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, + pointed_thing) + end + + if def and def.liquidtype == "source" and + minetest.get_item_group(node.name, "water") > 0 then + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = "flowers:waterlily" .. + (def.waving == 3 and "_waving" or ""), + param2 = math.random(0, 3)}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +} + +local waterlily_waving_def = table.copy(waterlily_def) +waterlily_waving_def.waving = 3 +waterlily_waving_def.drop = "flowers:waterlily" +waterlily_waving_def.groups.not_in_creative_inventory = 1 + +minetest.register_node("flowers:waterlily", waterlily_def) +minetest.register_node("flowers:waterlily_waving", waterlily_waving_def) + diff --git a/mods/minetest_game/flowers/license.txt b/mods/minetest_game/flowers/license.txt new file mode 100644 index 00000000..4cd70249 --- /dev/null +++ b/mods/minetest_game/flowers/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Ironzorg, VanessaE +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 RHRhino +Copyright (C) 2015-2016 Gambit +Copyright (C) 2016 yyt16384 +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/flowers/locale/flowers.de.tr b/mods/minetest_game/flowers/locale/flowers.de.tr new file mode 100644 index 00000000..18afb2af --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.de.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rote Rose +Orange Tulip=Orange Tulpe +Yellow Dandelion=Gelber Löwenzahn +Green Chrysanthemum=Grüne Chrysantheme +Blue Geranium=Blaue Geranie +Viola=Veilchen +White Dandelion=Weißer Löwenzahn +Black Tulip=Schwarze Tulpe +Red Mushroom=Roter Pilz +Brown Mushroom=Brauner Pilz +Waterlily=Wasserlilie diff --git a/mods/minetest_game/flowers/locale/flowers.eo.tr b/mods/minetest_game/flowers/locale/flowers.eo.tr new file mode 100644 index 00000000..076df181 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.eo.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=RuÄa rozo +Orange Tulip=OranÄkolora tulipo +Yellow Dandelion=Flava leontodo +Green Chrysanthemum=Verda krizantemo +Blue Geranium=Blua geranio +Viola=Violo +White Dandelion=Blanka leontodo +Black Tulip=Nigra tulipo +Red Mushroom=RuÄa fungo +Brown Mushroom=Bruna fungo +Waterlily=Nimfeo diff --git a/mods/minetest_game/flowers/locale/flowers.es.tr b/mods/minetest_game/flowers/locale/flowers.es.tr new file mode 100644 index 00000000..e9c345d8 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.es.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rosa roja +Orange Tulip=Tulipán naranja +Yellow Dandelion=Diente de León amarillo +Green Chrysanthemum=Crisantemo verde +Blue Geranium=Geranio azul +Viola=Violeta +White Dandelion=Diente de León blanco +Black Tulip=Tulipán negro +Red Mushroom=Champiñón rojo +Brown Mushroom=Champiñón café +Waterlily=Nenúfar diff --git a/mods/minetest_game/flowers/locale/flowers.fr.tr b/mods/minetest_game/flowers/locale/flowers.fr.tr new file mode 100644 index 00000000..41e0d008 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.fr.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rose rouge +Orange Tulip=Tulipe orange +Yellow Dandelion=Pissenlit jaune +Green Chrysanthemum=Chrysanthème vert +Blue Geranium=Géranium bleu +Viola=Violette +White Dandelion=Pissenlit blanc +Black Tulip=Tulipe noire +Red Mushroom=Champignon rouge +Brown Mushroom=Champignon brun +Waterlily=Nénuphar diff --git a/mods/minetest_game/flowers/locale/flowers.id.tr b/mods/minetest_game/flowers/locale/flowers.id.tr new file mode 100644 index 00000000..730529b3 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.id.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Mawar Merah +Orange Tulip=Tulip Oranye +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Krisan Hijau +Blue Geranium=Geranium Biru +Viola=Viola +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Jamur Merah +Brown Mushroom=Jamur Cokelat +Waterlily=Teratai diff --git a/mods/minetest_game/flowers/locale/flowers.it.tr b/mods/minetest_game/flowers/locale/flowers.it.tr new file mode 100644 index 00000000..1ab49dd4 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.it.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rosa rossa +Orange Tulip=Tulipano arancione +Yellow Dandelion=Dente di leone giallo +Green Chrysanthemum=Crisantemo verde +Blue Geranium=Geranio blu +Viola=Viola +White Dandelion=Dente di leone bianco +Black Tulip=Tulipano nero +Red Mushroom=Fungo rosso +Brown Mushroom=Fungo marrone +Waterlily=Ninfea diff --git a/mods/minetest_game/flowers/locale/flowers.ja.tr b/mods/minetest_game/flowers/locale/flowers.ja.tr new file mode 100644 index 00000000..bea87e27 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.ja.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=赤色ã®ãƒãƒ© +Orange Tulip=橙色ã®ãƒãƒ¥ãƒ¼ãƒªãƒƒãƒ— +Yellow Dandelion=黄色ã®ã‚¿ãƒ³ãƒãƒ +Green Chrysanthemum=緑色ã®ã‚­ã‚¯ +Blue Geranium=é’色ã®ã‚¼ãƒ©ãƒ‹ã‚¦ãƒ  +Viola=ビオラ +White Dandelion=白色ã®ã‚¿ãƒ³ãƒãƒ +Black Tulip=黒色ã®ãƒãƒ¥ãƒ¼ãƒªãƒƒãƒ— +Red Mushroom=赤色ã®ã‚­ãƒŽã‚³ +Brown Mushroom=茶色ã®ã‚­ãƒŽã‚³ +Waterlily=スイレン diff --git a/mods/minetest_game/flowers/locale/flowers.jbo.tr b/mods/minetest_game/flowers/locale/flowers.jbo.tr new file mode 100644 index 00000000..1df06ec5 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.jbo.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=lo xunre rozgu +Orange Tulip=lo narju tujli +Yellow Dandelion=lo pelxu spatrtaraksaku +Green Chrysanthemum=lo crino xrisantemo +Blue Geranium=lo blanu plargoni +Viola=lo spatrvi'ola +White Dandelion=lo blabi spatrtaraksaku +Black Tulip=lo xekri tujli +Red Mushroom=lo xunre ledgrute +Brown Mushroom=lo bunre ledgrute +Waterlily=lo jacrulspa diff --git a/mods/minetest_game/flowers/locale/flowers.lv.tr b/mods/minetest_game/flowers/locale/flowers.lv.tr new file mode 100644 index 00000000..315272d8 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.lv.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=SarkanÄ roze +Orange Tulip=OranÅ¾Ä tulpe +Yellow Dandelion=Dzeltena pienene +Green Chrysanthemum=ZaÄ¼Ä krizantema +Blue Geranium=ZilÄ Ä£erÄnija +Viola=VijolÄ«te +White Dandelion=Balta pienene +Black Tulip=MelnÄ tulpe +Red Mushroom=SarkanÄ sÄ“ne +Brown Mushroom=BrÅ«nÄ sÄ“ne +Waterlily=Ūdensroze diff --git a/mods/minetest_game/flowers/locale/flowers.ms.tr b/mods/minetest_game/flowers/locale/flowers.ms.tr new file mode 100644 index 00000000..4e846eb5 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.ms.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Ros Merah +Orange Tulip=Tulip Jingga +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Kekwa Hijau +Blue Geranium=Geranium Biru +Viola=Violet +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Cendawan Merah +Brown Mushroom=Cendawan Perang +Waterlily=Teratai diff --git a/mods/minetest_game/flowers/locale/flowers.pl.tr b/mods/minetest_game/flowers/locale/flowers.pl.tr new file mode 100644 index 00000000..ff6a5e20 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.pl.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Czerwona róża +Orange Tulip=PomaraÅ„czowy tulipan +Yellow Dandelion=Żółty mlecz +Green Chrysanthemum=Zielona chryzantema +Blue Geranium=Niebieska pelargonia +Viola=FioÅ‚ek +White Dandelion=BiaÅ‚y mlecz +Black Tulip=Czarny tulipan +Red Mushroom=Czerwony muchomor +Brown Mushroom=BrÄ…zowy grzyb +Waterlily=Lilia wodna diff --git a/mods/minetest_game/flowers/locale/flowers.pt_BR.tr b/mods/minetest_game/flowers/locale/flowers.pt_BR.tr new file mode 100644 index 00000000..1f5ff929 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rosa Vermelha +Orange Tulip=Tulipa Laranja +Yellow Dandelion=Dente-de-leão Amarelo +Green Chrysanthemum=Crisântemo Verde +Blue Geranium=Gerânio Azul +Viola=Violeta +White Dandelion=Dente-de-leão Branco +Black Tulip=Tulipa Negra +Red Mushroom=Cogumelo Vermelho +Brown Mushroom=Cogumelo Marrom +Waterlily=Nenúfar diff --git a/mods/minetest_game/flowers/locale/flowers.ru.tr b/mods/minetest_game/flowers/locale/flowers.ru.tr new file mode 100644 index 00000000..0d129a58 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.ru.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=КраÑÐ½Ð°Ñ Ñ€Ð¾Ð·Ð° +Orange Tulip=Оранжевый тюльпан +Yellow Dandelion=Жёлтый одуванчик +Green Chrysanthemum=Ð—ÐµÐ»Ñ‘Ð½Ð°Ñ Ñ…Ñ€Ð¸Ð·Ð°Ð½Ñ‚ÐµÐ¼Ð° +Blue Geranium=СинÑÑ Ð³ÐµÑ€Ð°Ð½ÑŒ +Viola=Фиалка +White Dandelion=Белый одуванчик +Black Tulip=Чёрный тюльпан +Red Mushroom=КраÑный гриб +Brown Mushroom=Коричневый гриб +Waterlily=Ð›Ð¸Ð»Ð¸Ñ diff --git a/mods/minetest_game/flowers/locale/flowers.sk.tr b/mods/minetest_game/flowers/locale/flowers.sk.tr new file mode 100644 index 00000000..75d4ae1e --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.sk.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=ÄŒervená ruža +Orange Tulip=Oranžový tulipán +Yellow Dandelion=Žltá púpava +Green Chrysanthemum=Zelená chryzantéma +Blue Geranium=Modrý muÅ¡kát +Viola=Fialka +White Dandelion=Biela púpava +Black Tulip=ÄŒierny tulipán +Red Mushroom=ÄŒervená huba +Brown Mushroom=Hnedá huba +Waterlily=Lekno diff --git a/mods/minetest_game/flowers/locale/flowers.sv.tr b/mods/minetest_game/flowers/locale/flowers.sv.tr new file mode 100644 index 00000000..c8a26a3d --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.sv.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Röd ros +Orange Tulip=Orange tulpan +Yellow Dandelion=Gul maskros +Green Chrysanthemum=Grön krysantemum +Blue Geranium=BlÃ¥ geranium +Viola=Violett viola +White Dandelion=Vit maskros +Black Tulip=Svart tulpan +Red Mushroom=Röd svamp +Brown Mushroom=Brun svamp +Waterlily=Näckros diff --git a/mods/minetest_game/flowers/locale/flowers.uk.tr b/mods/minetest_game/flowers/locale/flowers.uk.tr new file mode 100644 index 00000000..56200293 --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.uk.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Червона троÑнда +Orange Tulip=Помаранчевий тюльпан +Yellow Dandelion=Жовта кульбаба +Green Chrysanthemum=Зелена хризантема +Blue Geranium=Синій журавець +Viola=Фіалка +White Dandelion=Біла кульбаба +Black Tulip=Чорний тюльпан +Red Mushroom=Червоний гриб +Brown Mushroom=Коричневий гриб +Waterlily=Ð›Ð°Ñ‚Ð°Ñ‚Ñ‚Ñ diff --git a/mods/minetest_game/flowers/locale/flowers.zh_CN.tr b/mods/minetest_game/flowers/locale/flowers.zh_CN.tr new file mode 100644 index 00000000..3139dfbc --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.zh_CN.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=红玫瑰 +Orange Tulip=æ©™éƒé‡‘香 +Yellow Dandelion=黄蒲公英 +Green Chrysanthemum=绿èŠèб +Blue Geranium=è“天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑éƒé‡‘香 +Red Mushroom=çº¢è˜‘è‡ +Brown Mushroom=æ£•è˜‘è‡ +Waterlily=ç¡è޲ diff --git a/mods/minetest_game/flowers/locale/flowers.zh_TW.tr b/mods/minetest_game/flowers/locale/flowers.zh_TW.tr new file mode 100644 index 00000000..a3a3ec5a --- /dev/null +++ b/mods/minetest_game/flowers/locale/flowers.zh_TW.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=紅玫瑰 +Orange Tulip=橙鬱金香 +Yellow Dandelion=黃蒲公英 +Green Chrysanthemum=ç¶ èŠèб +Blue Geranium=è—天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑鬱金香 +Red Mushroom=ç´…è˜‘è‡ +Brown Mushroom=æ£•è˜‘è‡ +Waterlily=ç¡è“® diff --git a/mods/minetest_game/flowers/locale/template.txt b/mods/minetest_game/flowers/locale/template.txt new file mode 100644 index 00000000..a3a687fd --- /dev/null +++ b/mods/minetest_game/flowers/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose= +Orange Tulip= +Yellow Dandelion= +Green Chrysanthemum= +Blue Geranium= +Viola= +White Dandelion= +Black Tulip= +Red Mushroom= +Brown Mushroom= +Waterlily= diff --git a/mods/minetest_game/flowers/mapgen.lua b/mods/minetest_game/flowers/mapgen.lua new file mode 100644 index 00000000..36b992eb --- /dev/null +++ b/mods/minetest_game/flowers/mapgen.lua @@ -0,0 +1,181 @@ +-- +-- Mgv6 +-- + +local function register_mgv6_flower(flower_name) + minetest.register_decoration({ + name = "flowers:"..flower_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "flowers:"..flower_name, + }) +end + +local function register_mgv6_mushroom(mushroom_name) + minetest.register_decoration({ + name = "flowers:"..mushroom_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = 7133, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "flowers:"..mushroom_name, + spawn_by = "default:tree", + num_spawn_by = 1, + }) +end + +local function register_mgv6_waterlily() + minetest.register_decoration({ + name = "flowers:waterlily", + deco_type = "simple", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + y_max = 0, + y_min = 0, + decoration = "flowers:waterlily_waving", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) +end + +function flowers.register_mgv6_decorations() + register_mgv6_flower("rose") + register_mgv6_flower("tulip") + register_mgv6_flower("dandelion_yellow") + register_mgv6_flower("geranium") + register_mgv6_flower("viola") + register_mgv6_flower("dandelion_white") + + register_mgv6_mushroom("mushroom_brown") + register_mgv6_mushroom("mushroom_red") + + register_mgv6_waterlily() +end + + +-- +-- All other biome API mapgens +-- + +local function register_flower(seed, flower_name) + minetest.register_decoration({ + name = "flowers:"..flower_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = {x = 200, y = 200, z = 200}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:"..flower_name, + }) +end + +local function register_mushroom(mushroom_name) + minetest.register_decoration({ + name = "flowers:"..mushroom_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest", "coniferous_forest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:"..mushroom_name, + }) +end + +local function register_waterlily() + minetest.register_decoration({ + name = "default:waterlily", + deco_type = "simple", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"}, + y_max = 0, + y_min = 0, + decoration = "flowers:waterlily_waving", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) +end + +function flowers.register_decorations() + register_flower(436, "rose") + register_flower(19822, "tulip") + register_flower(1220999, "dandelion_yellow") + register_flower(800081, "chrysanthemum_green") + register_flower(36662, "geranium") + register_flower(1133, "viola") + register_flower(73133, "dandelion_white") + register_flower(42, "tulip_black") + + register_mushroom("mushroom_brown") + register_mushroom("mushroom_red") + + register_waterlily() +end + + +-- +-- Detect mapgen to select functions +-- + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" then + --flowers.register_mgv6_decorations() +else + --flowers.register_decorations() +end diff --git a/mods/minetest_game/flowers/mod.conf b/mods/minetest_game/flowers/mod.conf new file mode 100644 index 00000000..cdafe642 --- /dev/null +++ b/mods/minetest_game/flowers/mod.conf @@ -0,0 +1,3 @@ +name = flowers +description = Minetest Game mod: flowers +depends = default diff --git a/mods/minetest_game/flowers/textures/flowers_chrysanthemum_green.png b/mods/minetest_game/flowers/textures/flowers_chrysanthemum_green.png new file mode 100644 index 00000000..01d8c7e3 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_chrysanthemum_green.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_dandelion_white.png b/mods/minetest_game/flowers/textures/flowers_dandelion_white.png new file mode 100644 index 00000000..1bc02fb5 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_dandelion_white.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_dandelion_yellow.png b/mods/minetest_game/flowers/textures/flowers_dandelion_yellow.png new file mode 100644 index 00000000..544f60c1 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_dandelion_yellow.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_geranium.png b/mods/minetest_game/flowers/textures/flowers_geranium.png new file mode 100644 index 00000000..88de1d7f Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_geranium.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_mushroom_brown.png b/mods/minetest_game/flowers/textures/flowers_mushroom_brown.png new file mode 100644 index 00000000..33ffcd47 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_mushroom_brown.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_mushroom_red.png b/mods/minetest_game/flowers/textures/flowers_mushroom_red.png new file mode 100644 index 00000000..a68f5d50 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_mushroom_red.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_rose.png b/mods/minetest_game/flowers/textures/flowers_rose.png new file mode 100644 index 00000000..e3b841d2 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_rose.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_tulip.png b/mods/minetest_game/flowers/textures/flowers_tulip.png new file mode 100644 index 00000000..471fcd3a Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_tulip.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_tulip_black.png b/mods/minetest_game/flowers/textures/flowers_tulip_black.png new file mode 100644 index 00000000..1dd09f74 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_tulip_black.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_viola.png b/mods/minetest_game/flowers/textures/flowers_viola.png new file mode 100644 index 00000000..ca2d750e Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_viola.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_waterlily.png b/mods/minetest_game/flowers/textures/flowers_waterlily.png new file mode 100644 index 00000000..973e5113 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_waterlily.png differ diff --git a/mods/minetest_game/flowers/textures/flowers_waterlily_bottom.png b/mods/minetest_game/flowers/textures/flowers_waterlily_bottom.png new file mode 100644 index 00000000..3dbeaf40 Binary files /dev/null and b/mods/minetest_game/flowers/textures/flowers_waterlily_bottom.png differ diff --git a/mods/minetest_game/game_commands/README.txt b/mods/minetest_game/game_commands/README.txt new file mode 100644 index 00000000..a4516082 --- /dev/null +++ b/mods/minetest_game/game_commands/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: game_commands +================================ +See license.txt for license information. + +Authors of source code +---------------------- +rubenwardy (MIT) diff --git a/mods/minetest_game/game_commands/init.lua b/mods/minetest_game/game_commands/init.lua new file mode 100644 index 00000000..e038be18 --- /dev/null +++ b/mods/minetest_game/game_commands/init.lua @@ -0,0 +1,31 @@ +-- game_commands/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("game_commands") + + +minetest.register_chatcommand("killme", { + description = S("Kill yourself to respawn"), + func = function(name) + local player = minetest.get_player_by_name(name) + if player then + if minetest.settings:get_bool("enable_damage") then + player:set_hp(0) + return true + else + for _, callback in pairs(minetest.registered_on_respawnplayers) do + if callback(player) then + return true + end + end + + -- There doesn't seem to be a way to get a default spawn pos + -- from the lua API + return false, S("No static_spawnpoint defined") + end + else + -- Show error message if used when not logged in, eg: from IRC mod + return false, S("You need to be online to be killed!") + end + end +}) diff --git a/mods/minetest_game/game_commands/license.txt b/mods/minetest_game/game_commands/license.txt new file mode 100644 index 00000000..fa855644 --- /dev/null +++ b/mods/minetest_game/game_commands/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017-2018 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/minetest_game/game_commands/locale/game_commands.de.tr b/mods/minetest_game/game_commands/locale/game_commands.de.tr new file mode 100644 index 00000000..24b0e25d --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.de.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Selbstmord begehen, um zu Respawnen +No static_spawnpoint defined=Kein static_spawnpoint definiert +You need to be online to be killed!=Sie müssen online sein, um getötet zu werden! diff --git a/mods/minetest_game/game_commands/locale/game_commands.eo.tr b/mods/minetest_game/game_commands/locale/game_commands.eo.tr new file mode 100644 index 00000000..0ff99aab --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.eo.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Sinmortigu por renaski +No static_spawnpoint defined=Ne estas difina static_spawnpoint +You need to be online to be killed!=Vi devas esti enreta por esti mortigita! diff --git a/mods/minetest_game/game_commands/locale/game_commands.es.tr b/mods/minetest_game/game_commands/locale/game_commands.es.tr new file mode 100644 index 00000000..702a2ef9 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.es.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Suicídate para reaparecer +No static_spawnpoint defined=No se ha definido un punto de aparición +You need to be online to be killed!=¡Necesitas estar en línea para que te maten! diff --git a/mods/minetest_game/game_commands/locale/game_commands.fr.tr b/mods/minetest_game/game_commands/locale/game_commands.fr.tr new file mode 100644 index 00000000..0e295d68 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.fr.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Se suicider pour réapparaître +No static_spawnpoint defined=Pas de point d'apparition défini +You need to be online to be killed!=Vous devez être en ligne pour être tué ! diff --git a/mods/minetest_game/game_commands/locale/game_commands.id.tr b/mods/minetest_game/game_commands/locale/game_commands.id.tr new file mode 100644 index 00000000..0d586c93 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.id.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Bunuh diri untuk bangkit kembali +No static_spawnpoint defined=Tidak ada static_spawnpoint (titik bangkit statis) yang diatur +You need to be online to be killed!=Anda harus daring untuk dibunuh! diff --git a/mods/minetest_game/game_commands/locale/game_commands.it.tr b/mods/minetest_game/game_commands/locale/game_commands.it.tr new file mode 100644 index 00000000..91646b0f --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.it.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Ucciditi per ricomparire +No static_spawnpoint defined=Nessuno static_spawnpoint definito +You need to be online to be killed!=Devi essere in linea per essere ucciso! diff --git a/mods/minetest_game/game_commands/locale/game_commands.ja.tr b/mods/minetest_game/game_commands/locale/game_commands.ja.tr new file mode 100644 index 00000000..b6c77dce --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.ja.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=リセットã—ã¦ãƒªã‚¹ãƒãƒ¼ãƒ³ã—ã¾ã™ +No static_spawnpoint defined=static_spawnpoint ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ +You need to be online to be killed!=リセットã™ã‚‹ã«ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ diff --git a/mods/minetest_game/game_commands/locale/game_commands.jbo.tr b/mods/minetest_game/game_commands/locale/game_commands.jbo.tr new file mode 100644 index 00000000..ddddcd7a --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=.i ro nu do catra do cu tadji pa nu do tolcanci +No static_spawnpoint defined=.i no da ckaji lo me la'o zoi.static_spawnpoint.zoi +You need to be online to be killed!=.i lo nu samjo'e cu sarcu lo nu do se catra diff --git a/mods/minetest_game/game_commands/locale/game_commands.lv.tr b/mods/minetest_game/game_commands/locale/game_commands.lv.tr new file mode 100644 index 00000000..b498bcb5 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.lv.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Nobeidzieties lai atdzÄ«votos +No static_spawnpoint defined=static_spawnpoint nav definÄ“ts +You need to be online to be killed!=Jums jÄbÅ«t tieÅ¡saistÄ“ lai nobeigtos. diff --git a/mods/minetest_game/game_commands/locale/game_commands.ms.tr b/mods/minetest_game/game_commands/locale/game_commands.ms.tr new file mode 100644 index 00000000..d22e0a40 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.ms.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Bunuh diri anda untuk jelma semula +No static_spawnpoint defined=Tiada titik jelma statik (tetapan static_spawnpoint) ditakrifkan +You need to be online to be killed!=Anda mesti berada dalam talian untuk dibunuh! diff --git a/mods/minetest_game/game_commands/locale/game_commands.pl.tr b/mods/minetest_game/game_commands/locale/game_commands.pl.tr new file mode 100644 index 00000000..52477c6d --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.pl.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Zastosować komendÄ™ kill aby siÄ™ zrespawnować +No static_spawnpoint defined=Nie zdefiniowano static_spawnpoint +You need to be online to be killed!=Musisz być online aby zastosować komendÄ™ kill diff --git a/mods/minetest_game/game_commands/locale/game_commands.pt_BR.tr b/mods/minetest_game/game_commands/locale/game_commands.pt_BR.tr new file mode 100644 index 00000000..6c52c0bd --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Mate-se para reaparecer +No static_spawnpoint defined=Nenhum ponto de reaparecer estático definido +You need to be online to be killed!=Você precisa estar online para ser morto! diff --git a/mods/minetest_game/game_commands/locale/game_commands.ru.tr b/mods/minetest_game/game_commands/locale/game_commands.ru.tr new file mode 100644 index 00000000..59a59711 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.ru.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Убейте ÑебÑ, чтобы возродитьÑÑ +No static_spawnpoint defined=static_spawnpoint не определён +You need to be online to be killed!=Ð’Ñ‹ должны быть в Ñети, чтобы убить ÑебÑ! diff --git a/mods/minetest_game/game_commands/locale/game_commands.sk.tr b/mods/minetest_game/game_commands/locale/game_commands.sk.tr new file mode 100644 index 00000000..f7d153ae --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.sk.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Samovražda pre znovuzrodenie +No static_spawnpoint defined=Nie je definované stále miesto znovuzrodenia +You need to be online to be killed!=Musíš byÅ¥ online, aby si mohol byÅ¥ zabitý! diff --git a/mods/minetest_game/game_commands/locale/game_commands.sv.tr b/mods/minetest_game/game_commands/locale/game_commands.sv.tr new file mode 100644 index 00000000..e3110dad --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.sv.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Döda dig själv för att respawna +No static_spawnpoint defined=Ingen static_spawnpoint definierad +You need to be online to be killed!=Du mÃ¥sta vara online för att bli dödad! diff --git a/mods/minetest_game/game_commands/locale/game_commands.uk.tr b/mods/minetest_game/game_commands/locale/game_commands.uk.tr new file mode 100644 index 00000000..03cd2678 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.uk.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Вбити Ñебе, щоб відродитиÑÑ +No static_spawnpoint defined=Ðемає визначеного static_spawnpoint +You need to be online to be killed!=Ви повинні бути онлайн, щоби Ð’Ð°Ñ Ð±ÑƒÐ»Ð¾ вбито! diff --git a/mods/minetest_game/game_commands/locale/game_commands.zh_CN.tr b/mods/minetest_game/game_commands/locale/game_commands.zh_CN.tr new file mode 100644 index 00000000..ba9a0275 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=自æ€å¹¶é‡ç”Ÿ +No static_spawnpoint defined=static_spawnpoint 未定义 +You need to be online to be killed!=您需è¦åœ¨çº¿æ‰èƒ½è¢«æ€æ­»ï¼ diff --git a/mods/minetest_game/game_commands/locale/game_commands.zh_TW.tr b/mods/minetest_game/game_commands/locale/game_commands.zh_TW.tr new file mode 100644 index 00000000..34e148d2 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/game_commands.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=殺死自己並é‡ç”Ÿ +No static_spawnpoint defined=static_spawnpoint 未定義 +You need to be online to be killed!=您需è¦åœ¨ç·šæ‰èƒ½è¢«æ®ºæ­»ï¼ diff --git a/mods/minetest_game/game_commands/locale/template.txt b/mods/minetest_game/game_commands/locale/template.txt new file mode 100644 index 00000000..903f1603 --- /dev/null +++ b/mods/minetest_game/game_commands/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn= +No static_spawnpoint defined= +You need to be online to be killed!= diff --git a/mods/minetest_game/game_commands/mod.conf b/mods/minetest_game/game_commands/mod.conf new file mode 100644 index 00000000..5571ff51 --- /dev/null +++ b/mods/minetest_game/game_commands/mod.conf @@ -0,0 +1,2 @@ +name = game_commands +description = Minetest Game mod: game_commands diff --git a/mods/minetest_game/give_initial_stuff/README.txt b/mods/minetest_game/give_initial_stuff/README.txt new file mode 100644 index 00000000..b10c3602 --- /dev/null +++ b/mods/minetest_game/give_initial_stuff/README.txt @@ -0,0 +1,8 @@ +Minetest Game mod: give_initial_stuff +===================================== +See license.txt for license information. + +Authors of source code +---------------------- +Perttu Ahola (celeron55) (MIT) +Various Minetest Game developers and contributors (MIT) diff --git a/mods/minetest_game/give_initial_stuff/init.lua b/mods/minetest_game/give_initial_stuff/init.lua new file mode 100644 index 00000000..74421dc6 --- /dev/null +++ b/mods/minetest_game/give_initial_stuff/init.lua @@ -0,0 +1,46 @@ +-- gave_initial_stuff/init.lua + +local stuff_string = minetest.settings:get("initial_stuff") or + "default:pick_steel,default:axe_steel,default:shovel_steel," .. + "default:torch 99,default:cobble 99" + +give_initial_stuff = { + items = {} +} + +function give_initial_stuff.give(player) + minetest.log("action", + "Giving initial stuff to player " .. player:get_player_name()) + local inv = player:get_inventory() + for _, stack in ipairs(give_initial_stuff.items) do + inv:add_item("main", stack) + end +end + +function give_initial_stuff.add(stack) + give_initial_stuff.items[#give_initial_stuff.items + 1] = ItemStack(stack) +end + +function give_initial_stuff.clear() + give_initial_stuff.items = {} +end + +function give_initial_stuff.add_from_csv(str) + local items = str:split(",") + for _, itemname in ipairs(items) do + give_initial_stuff.add(itemname) + end +end + +function give_initial_stuff.set_list(list) + give_initial_stuff.items = list +end + +function give_initial_stuff.get_list() + return give_initial_stuff.items +end + +give_initial_stuff.add_from_csv(stuff_string) +if minetest.settings:get_bool("give_initial_stuff") then + minetest.register_on_newplayer(give_initial_stuff.give) +end diff --git a/mods/minetest_game/give_initial_stuff/license.txt b/mods/minetest_game/give_initial_stuff/license.txt new file mode 100644 index 00000000..45dba3fb --- /dev/null +++ b/mods/minetest_game/give_initial_stuff/license.txt @@ -0,0 +1,25 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/minetest_game/give_initial_stuff/mod.conf b/mods/minetest_game/give_initial_stuff/mod.conf new file mode 100644 index 00000000..51d31aef --- /dev/null +++ b/mods/minetest_game/give_initial_stuff/mod.conf @@ -0,0 +1,3 @@ +name = give_initial_stuff +description = Minetest Game mod: give_initial_stuff +depends = default diff --git a/mods/minetest_game/keys/README.txt b/mods/minetest_game/keys/README.txt new file mode 100644 index 00000000..0db27df1 --- /dev/null +++ b/mods/minetest_game/keys/README.txt @@ -0,0 +1,21 @@ +Minetest Game mod: keys +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures, sounds, models and schematics) +---------------------------------------------------------- + +Textures +-------- +Gambit (CC BY-SA 3.0): + keys_key.png + keys_key_skeleton.png + +Features +-------- +This mod uses the key API as defined in game_api.txt section [Key API]. diff --git a/mods/minetest_game/keys/aliases.lua b/mods/minetest_game/keys/aliases.lua new file mode 100644 index 00000000..4297498b --- /dev/null +++ b/mods/minetest_game/keys/aliases.lua @@ -0,0 +1,6 @@ +-- +-- Aliases for backward compatibility +-- + +minetest.register_alias("default:key", "keys:key") +minetest.register_alias("default:skeleton_key", "keys:skeleton_key") diff --git a/mods/minetest_game/keys/crafting.lua b/mods/minetest_game/keys/crafting.lua new file mode 100644 index 00000000..b9b503a5 --- /dev/null +++ b/mods/minetest_game/keys/crafting.lua @@ -0,0 +1,28 @@ +-- +-- Crafting recipes +-- + +minetest.register_craft({ + output = "keys:skeleton_key", + recipe = { + {"default:gold_ingot"}, + } +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "keys:key", + cooktime = 5, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "keys:skeleton_key", + cooktime = 5, +}) diff --git a/mods/minetest_game/keys/craftitems.lua b/mods/minetest_game/keys/craftitems.lua new file mode 100644 index 00000000..45e0b824 --- /dev/null +++ b/mods/minetest_game/keys/craftitems.lua @@ -0,0 +1,101 @@ +-- Load support for MT game translation. +local S = minetest.get_translator("keys") + +-- +-- Craftitems +-- + +minetest.register_craftitem("keys:skeleton_key", { + description = S("Skeleton Key"), + inventory_image = "keys_key_skeleton.png", + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + + if not node then + return itemstack + end + + local node_reg = minetest.registered_nodes[node.name] + local on_skeleton_key_use = node_reg and node_reg.on_skeleton_key_use + if not on_skeleton_key_use then + return itemstack + end + + -- make a new key secret in case the node callback needs it + local random = math.random + local newsecret = string.format( + "%04x%04x%04x%04x", + random(2^16) - 1, random(2^16) - 1, + random(2^16) - 1, random(2^16) - 1) + + local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) + + if secret then + local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) + + -- update original itemstack + itemstack:take_item() + + -- finish and return the new key + local new_stack = ItemStack("keys:key") + local meta = new_stack:get_meta() + meta:set_string("secret", secret) + meta:set_string("description", S("Key to @1's @2", user:get_player_name(), + minetest.registered_nodes[node.name].description)) + + if itemstack:get_count() == 0 then + itemstack = new_stack + else + if inv:add_item("main", new_stack):get_count() > 0 then + minetest.add_item(user:get_pos(), new_stack) + end -- else: added to inventory successfully + end + + return itemstack + end + end +}) + +minetest.register_craftitem("keys:key", { + description = S("Key"), + inventory_image = "keys_key.png", + groups = {key = 1, not_in_creative_inventory = 1}, + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + node = minetest.get_node(pos) + + if not node or node.name == "ignore" then + return itemstack + end + + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + + local on_key_use = ndef.on_key_use + if on_key_use then + on_key_use(pos, placer) + end + + return nil + end +}) diff --git a/mods/minetest_game/keys/init.lua b/mods/minetest_game/keys/init.lua new file mode 100644 index 00000000..ed45adba --- /dev/null +++ b/mods/minetest_game/keys/init.lua @@ -0,0 +1,6 @@ +-- Minetest Game mod: keys +local keys_path = minetest.get_modpath("keys") + +dofile(keys_path.."/craftitems.lua") +dofile(keys_path.."/crafting.lua") +dofile(keys_path.."/aliases.lua") diff --git a/mods/minetest_game/keys/license.txt b/mods/minetest_game/keys/license.txt new file mode 100644 index 00000000..e96ffb95 --- /dev/null +++ b/mods/minetest_game/keys/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2018: + + Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/keys/locale/keys.de.tr b/mods/minetest_game/keys/locale/keys.de.tr new file mode 100644 index 00000000..499a6ba7 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.de.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Schlüssel +Key to @1's @2=Schlüssel für @2 von @1 +Skeleton Key=Skelettschlüssel diff --git a/mods/minetest_game/keys/locale/keys.eo.tr b/mods/minetest_game/keys/locale/keys.eo.tr new file mode 100644 index 00000000..02a06d42 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.eo.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Åœlosilo +Key to @1's @2=Åœlosilo por la @2 de @1 +Skeleton Key=Skeleta Ålosilo diff --git a/mods/minetest_game/keys/locale/keys.es.tr b/mods/minetest_game/keys/locale/keys.es.tr new file mode 100644 index 00000000..e408c32a --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.es.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Llave +Key to @1's @2=Llave para @2 de @1 +Skeleton Key=Llave esqueleto diff --git a/mods/minetest_game/keys/locale/keys.fr.tr b/mods/minetest_game/keys/locale/keys.fr.tr new file mode 100644 index 00000000..b1b9e6a8 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.fr.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Clé +Key to @1's @2=Clé pour @2 de @1 +Skeleton Key=Squelette diff --git a/mods/minetest_game/keys/locale/keys.id.tr b/mods/minetest_game/keys/locale/keys.id.tr new file mode 100644 index 00000000..58f8fc55 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.id.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Kunci +Key to @1's @2=Kunci @2 milik @1 +Skeleton Key=Kunci Induk diff --git a/mods/minetest_game/keys/locale/keys.it.tr b/mods/minetest_game/keys/locale/keys.it.tr new file mode 100644 index 00000000..ed7bb312 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.it.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Chiave +Key to @1's @2=Chiave per @2 di @1 +Skeleton Key=Chiave dello Scheletro diff --git a/mods/minetest_game/keys/locale/keys.ja.tr b/mods/minetest_game/keys/locale/keys.ja.tr new file mode 100644 index 00000000..b356178a --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.ja.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=éµ +Key to @1's @2=@1ã®@2ã¸ã®éµ +Skeleton Key=スケルトンã®éµ diff --git a/mods/minetest_game/keys/locale/keys.jbo.tr b/mods/minetest_game/keys/locale/keys.jbo.tr new file mode 100644 index 00000000..bd12f09b --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.jbo.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=lo ckiku +Key to @1's @2=lo ckiku be @2 po la'o zo'i.@1.zo'i +Skeleton Key=lo greku ckiku diff --git a/mods/minetest_game/keys/locale/keys.lv.tr b/mods/minetest_game/keys/locale/keys.lv.tr new file mode 100644 index 00000000..04922cc2 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.lv.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=AtslÄ“ga +Key to @1's @2=AtslÄ“ga priekÅ¡ @1 @2 +Skeleton Key=NovÄ«lÄ“ta atslÄ“ga diff --git a/mods/minetest_game/keys/locale/keys.ms.tr b/mods/minetest_game/keys/locale/keys.ms.tr new file mode 100644 index 00000000..58f8fc55 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.ms.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Kunci +Key to @1's @2=Kunci @2 milik @1 +Skeleton Key=Kunci Induk diff --git a/mods/minetest_game/keys/locale/keys.pl.tr b/mods/minetest_game/keys/locale/keys.pl.tr new file mode 100644 index 00000000..864d8a94 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.pl.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Klucz +Key to @1's @2=Klucz do @2 gracza @1 +Skeleton Key=Szkieletowy klucz diff --git a/mods/minetest_game/keys/locale/keys.pt_BR.tr b/mods/minetest_game/keys/locale/keys.pt_BR.tr new file mode 100644 index 00000000..ef9ca1ee --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Chave +Key to @1's @2=Chave para @2 de @1 +Skeleton Key=Chave de Mestra diff --git a/mods/minetest_game/keys/locale/keys.ru.tr b/mods/minetest_game/keys/locale/keys.ru.tr new file mode 100644 index 00000000..a804e182 --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.ru.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Ключ +Key to @1's @2=Ключ к @2 от @1 +Skeleton Key=Заготовка ключа diff --git a/mods/minetest_game/keys/locale/keys.sv.tr b/mods/minetest_game/keys/locale/keys.sv.tr new file mode 100644 index 00000000..f666eb3d --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.sv.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Nyckel +Key to @1's @2=Nyckel till @1s @2 +Skeleton Key=Skelettnyckel diff --git a/mods/minetest_game/keys/locale/keys.uk.tr b/mods/minetest_game/keys/locale/keys.uk.tr new file mode 100644 index 00000000..6f6a681d --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.uk.tr @@ -0,0 +1,4 @@ +# textdomain: keys +Key=Ключ +Key to @1's @2=Ключ з биркою "@2, влаÑником Ñкого(-ої/-их) Ñ” @1" +Skeleton Key=Заготовка ключа diff --git a/mods/minetest_game/keys/locale/keys.zh_CN.tr b/mods/minetest_game/keys/locale/keys.zh_CN.tr new file mode 100644 index 00000000..57f632ae --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=钥匙 +Key to @1's @2=@1çš„@2的钥匙 +Skeleton Key=万能钥匙 diff --git a/mods/minetest_game/keys/locale/keys.zh_TW.tr b/mods/minetest_game/keys/locale/keys.zh_TW.tr new file mode 100644 index 00000000..c97879ca --- /dev/null +++ b/mods/minetest_game/keys/locale/keys.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=鑰匙 +Key to @1's @2=@1çš„@2的鑰匙 +Skeleton Key=è¬èƒ½é‘°åŒ™ diff --git a/mods/minetest_game/keys/locale/template.txt b/mods/minetest_game/keys/locale/template.txt new file mode 100644 index 00000000..9fbf62fd --- /dev/null +++ b/mods/minetest_game/keys/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: keys + +Key= +Key to @1's @2= +Skeleton Key= diff --git a/mods/minetest_game/keys/mod.conf b/mods/minetest_game/keys/mod.conf new file mode 100644 index 00000000..8b8d6693 --- /dev/null +++ b/mods/minetest_game/keys/mod.conf @@ -0,0 +1,3 @@ +name = keys +description = Minetest Game mod: keys +depends = default diff --git a/mods/minetest_game/keys/textures/keys_key.png b/mods/minetest_game/keys/textures/keys_key.png new file mode 100644 index 00000000..d39d9afa Binary files /dev/null and b/mods/minetest_game/keys/textures/keys_key.png differ diff --git a/mods/minetest_game/keys/textures/keys_key_skeleton.png b/mods/minetest_game/keys/textures/keys_key_skeleton.png new file mode 100644 index 00000000..f60cacee Binary files /dev/null and b/mods/minetest_game/keys/textures/keys_key_skeleton.png differ diff --git a/mods/minetest_game/map/README.txt b/mods/minetest_game/map/README.txt new file mode 100644 index 00000000..068439a9 --- /dev/null +++ b/mods/minetest_game/map/README.txt @@ -0,0 +1,44 @@ +Minetest Game mod: map +====================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +TumeniNodes (CC BY-SA 3.0): + map_mapping_kit.png (map) + +paramat (CC BY-SA 3.0): + map_mapping_kit.png (compass and pen) + +Crafting +-------- +map:mapping_kit + +default:glass G +default:paper P +group:stick S +default:steel_ingot I +group:wood W +dye:black D + +GPS +IPI +WPD + +Usage +----- +In survival mode, use of the minimap requires the mapping kit item in your +inventory. It can take up to 5 seconds for adding to or removal from inventory +to have an effect, however to instantly allow the use of the minimap 'use' +(leftclick) the item. +Minimap radar mode is always disallowed in survival mode. + +Minimap and minimap radar mode are automatically allowed in creative mode and +for any player with the 'creative' privilege. + +The 'map.update_hud_flags()' function is global so can be redefined by a mod for +alternative behaviour. diff --git a/mods/minetest_game/map/init.lua b/mods/minetest_game/map/init.lua new file mode 100644 index 00000000..b91e528d --- /dev/null +++ b/mods/minetest_game/map/init.lua @@ -0,0 +1,80 @@ +-- map/init.lua + +-- Mod global namespace + +map = {} + + +-- Load support for MT game translation. +local S = minetest.get_translator("map") + + +-- Update HUD flags +-- Global to allow overriding + +function map.update_hud_flags(player) + local creative_enabled = minetest.is_creative_enabled(player:get_player_name()) + + local minimap_enabled = creative_enabled or + player:get_inventory():contains_item("main", "map:mapping_kit") + local radar_enabled = creative_enabled + + player:hud_set_flags({ + minimap = minimap_enabled, + minimap_radar = radar_enabled + }) +end + + +-- Set HUD flags 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + map.update_hud_flags(player) +end) + + +-- Cyclic update of HUD flags + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + map.update_hud_flags(player) + end + minetest.after(5.3, cyclic_update) +end + +minetest.after(5.3, cyclic_update) + + +-- Mapping kit item + +minetest.register_craftitem("map:mapping_kit", { + description = S("Mapping Kit") .. "\n" .. S("Use with 'Minimap' key"), + inventory_image = "map_mapping_kit.png", + stack_max = 1, + groups = {flammable = 3, tool = 1}, + + on_use = function(itemstack, user, pointed_thing) + map.update_hud_flags(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "map:mapping_kit", + recipe = { + {"default:glass", "default:paper", "group:stick"}, + {"default:steel_ingot", "default:paper", "default:steel_ingot"}, + {"group:wood", "default:paper", "dye:black"}, + } +}) + + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "map:mapping_kit", + burntime = 5, +}) diff --git a/mods/minetest_game/map/license.txt b/mods/minetest_game/map/license.txt new file mode 100644 index 00000000..a89f59c4 --- /dev/null +++ b/mods/minetest_game/map/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 TumeniNodes +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/map/locale/map.de.tr b/mods/minetest_game/map/locale/map.de.tr new file mode 100644 index 00000000..1a784abf --- /dev/null +++ b/mods/minetest_game/map/locale/map.de.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartenset +Use with 'Minimap' key=Mit „Karte an/aus“-Taste benutzen diff --git a/mods/minetest_game/map/locale/map.eo.tr b/mods/minetest_game/map/locale/map.eo.tr new file mode 100644 index 00000000..906be7b6 --- /dev/null +++ b/mods/minetest_game/map/locale/map.eo.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Mapa ilaro +Use with 'Minimap' key=Uzi per 'Minimapo' klavo diff --git a/mods/minetest_game/map/locale/map.es.tr b/mods/minetest_game/map/locale/map.es.tr new file mode 100644 index 00000000..0faed529 --- /dev/null +++ b/mods/minetest_game/map/locale/map.es.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit de cartografía +Use with 'Minimap' key=Usar con la tecla 'Minimapa' diff --git a/mods/minetest_game/map/locale/map.fr.tr b/mods/minetest_game/map/locale/map.fr.tr new file mode 100644 index 00000000..fcffb6de --- /dev/null +++ b/mods/minetest_game/map/locale/map.fr.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit de carthographie +Use with 'Minimap' key=Utiliser avec le bouton « Mini-carte » diff --git a/mods/minetest_game/map/locale/map.id.tr b/mods/minetest_game/map/locale/map.id.tr new file mode 100644 index 00000000..c90a0293 --- /dev/null +++ b/mods/minetest_game/map/locale/map.id.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Alat Pemetaan +Use with 'Minimap' key=Gunakan dengan tombol 'Peta Mini' diff --git a/mods/minetest_game/map/locale/map.it.tr b/mods/minetest_game/map/locale/map.it.tr new file mode 100644 index 00000000..59885e98 --- /dev/null +++ b/mods/minetest_game/map/locale/map.it.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit di mappatura +Use with 'Minimap' key=Usalo col tasto 'Minimappa' diff --git a/mods/minetest_game/map/locale/map.ja.tr b/mods/minetest_game/map/locale/map.ja.tr new file mode 100644 index 00000000..7205f244 --- /dev/null +++ b/mods/minetest_game/map/locale/map.ja.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地図キット +Use with 'Minimap' key=ミニマップキーã§ä½¿ã„ã¾ã™ diff --git a/mods/minetest_game/map/locale/map.jbo.tr b/mods/minetest_game/map/locale/map.jbo.tr new file mode 100644 index 00000000..8f37c188 --- /dev/null +++ b/mods/minetest_game/map/locale/map.jbo.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=lo cartu ke sidju bakfu +Use with 'Minimap' key=.i tu'a le cmalu cartu batke cu tadji lo nu pilno diff --git a/mods/minetest_game/map/locale/map.lv.tr b/mods/minetest_game/map/locale/map.lv.tr new file mode 100644 index 00000000..fb74f513 --- /dev/null +++ b/mods/minetest_game/map/locale/map.lv.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartēšanas komplekts +Use with 'Minimap' key=Izmantojiet ar pogu 'Minikarte' diff --git a/mods/minetest_game/map/locale/map.ms.tr b/mods/minetest_game/map/locale/map.ms.tr new file mode 100644 index 00000000..8564f910 --- /dev/null +++ b/mods/minetest_game/map/locale/map.ms.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Alat Pemetaan +Use with 'Minimap' key=Guna dengan kekunci 'Peta Mini' diff --git a/mods/minetest_game/map/locale/map.pl.tr b/mods/minetest_game/map/locale/map.pl.tr new file mode 100644 index 00000000..d665de0c --- /dev/null +++ b/mods/minetest_game/map/locale/map.pl.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Zestaw kartograficzny +Use with 'Minimap' key=NaciÅ›nij 'Minimap' aby użyć diff --git a/mods/minetest_game/map/locale/map.pt_BR.tr b/mods/minetest_game/map/locale/map.pt_BR.tr new file mode 100644 index 00000000..0095c395 --- /dev/null +++ b/mods/minetest_game/map/locale/map.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit de mapeamento +Use with 'Minimap' key=Use com a tecla do 'mini-mapa' diff --git a/mods/minetest_game/map/locale/map.ru.tr b/mods/minetest_game/map/locale/map.ru.tr new file mode 100644 index 00000000..4c03d549 --- /dev/null +++ b/mods/minetest_game/map/locale/map.ru.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=КартографичеÑкий комплект +Use with 'Minimap' key=ИÑпользуйте клавишей 'Миникарта' diff --git a/mods/minetest_game/map/locale/map.sk.tr b/mods/minetest_game/map/locale/map.sk.tr new file mode 100644 index 00000000..2016c85f --- /dev/null +++ b/mods/minetest_game/map/locale/map.sk.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartografická súprava +Use with 'Minimap' key=Použi klávesou 'Prepni minimpu' diff --git a/mods/minetest_game/map/locale/map.sv.tr b/mods/minetest_game/map/locale/map.sv.tr new file mode 100644 index 00000000..bc79d44e --- /dev/null +++ b/mods/minetest_game/map/locale/map.sv.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartläggningssats +Use with 'Minimap' key=Använd med 'Minimap'-tangent diff --git a/mods/minetest_game/map/locale/map.uk.tr b/mods/minetest_game/map/locale/map.uk.tr new file mode 100644 index 00000000..b7d6452c --- /dev/null +++ b/mods/minetest_game/map/locale/map.uk.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Картографічний набір +Use with 'Minimap' key=ВикориÑтовуєтьÑÑ ÐºÐ»Ð°Ð²Ñ–ÑˆÐµÑŽ 'Мінімапа' diff --git a/mods/minetest_game/map/locale/map.zh_CN.tr b/mods/minetest_game/map/locale/map.zh_CN.tr new file mode 100644 index 00000000..cec95bb7 --- /dev/null +++ b/mods/minetest_game/map/locale/map.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地图绘制工具包 +Use with 'Minimap' key=与“迷你地图â€é”®ä¸€èµ·ä½¿ç”¨ diff --git a/mods/minetest_game/map/locale/map.zh_TW.tr b/mods/minetest_game/map/locale/map.zh_TW.tr new file mode 100644 index 00000000..a0981245 --- /dev/null +++ b/mods/minetest_game/map/locale/map.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地圖繪製工具包 +Use with 'Minimap' key=與“迷你地圖â€éµä¸€èµ·ä½¿ç”¨ diff --git a/mods/minetest_game/map/locale/template.txt b/mods/minetest_game/map/locale/template.txt new file mode 100644 index 00000000..2dbe2eea --- /dev/null +++ b/mods/minetest_game/map/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit= +Use with 'Minimap' key= diff --git a/mods/minetest_game/map/mod.conf b/mods/minetest_game/map/mod.conf new file mode 100644 index 00000000..bb045c77 --- /dev/null +++ b/mods/minetest_game/map/mod.conf @@ -0,0 +1,3 @@ +name = map +description = Minetest Game mod: map +depends = default, dye diff --git a/mods/minetest_game/map/textures/map_mapping_kit.png b/mods/minetest_game/map/textures/map_mapping_kit.png new file mode 100644 index 00000000..015b878a Binary files /dev/null and b/mods/minetest_game/map/textures/map_mapping_kit.png differ diff --git a/mods/minetest_game/modpack.txt b/mods/minetest_game/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/minetest_game/mtg_craftguide/README.md b/mods/minetest_game/mtg_craftguide/README.md new file mode 100644 index 00000000..9c4ed7a4 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/README.md @@ -0,0 +1,25 @@ +Minetest Game mod: mtg_craftguide +================================= + +Adds a "Recipes" tab to the inventory. Click an item to see it's recipes. +Click again to show usages. + +Based on [craftguide](https://github.com/minetest-mods/craftguide). + +Authors of media +---------------- + +paramat (CC BY-SA 3.0): + +* craftguide_clear_icon.png +* craftguide_next_icon.png +* craftguide_prev_icon.png +* craftguide_search_icon.png + +Neuromancer (CC BY-SA 3.0): + +* craftguide_furnace.png + +Wuzzy (CC BY-SA 3.0): + +* craftguide_shapeless.png diff --git a/mods/minetest_game/mtg_craftguide/init.lua b/mods/minetest_game/mtg_craftguide/init.lua new file mode 100644 index 00000000..97cd63a7 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/init.lua @@ -0,0 +1,438 @@ +local S = minetest.get_translator("mtg_craftguide") +local esc = minetest.formspec_escape + +local player_data = {} +local init_items = {} +local recipes_cache = {} +local usages_cache = {} + +local group_stereotypes = { + dye = "dye:white", + wool = "wool:white", + coal = "default:coal_lump", + vessel = "vessels:glass_bottle", + flower = "flowers:dandelion_yellow" +} + +local group_names = { + coal = S("Any coal"), + sand = S("Any sand"), + wool = S("Any wool"), + stick = S("Any stick"), + vessel = S("Any vessel"), + wood = S("Any wood planks"), + stone = S("Any kind of stone block"), + + ["color_red,flower"] = S("Any red flower"), + ["color_blue,flower"] = S("Any blue flower"), + ["color_black,flower"] = S("Any black flower"), + ["color_green,flower"] = S("Any green flower"), + ["color_white,flower"] = S("Any white flower"), + ["color_orange,flower"] = S("Any orange flower"), + ["color_violet,flower"] = S("Any violet flower"), + ["color_yellow,flower"] = S("Any yellow flower"), + + ["color_red,dye"] = S("Any red dye"), + ["color_blue,dye"] = S("Any blue dye"), + ["color_cyan,dye"] = S("Any cyan dye"), + ["color_grey,dye"] = S("Any grey dye"), + ["color_pink,dye"] = S("Any pink dye"), + ["color_black,dye"] = S("Any black dye"), + ["color_brown,dye"] = S("Any brown dye"), + ["color_green,dye"] = S("Any green dye"), + ["color_white,dye"] = S("Any white dye"), + ["color_orange,dye"] = S("Any orange dye"), + ["color_violet,dye"] = S("Any violet dye"), + ["color_yellow,dye"] = S("Any yellow dye"), + ["color_magenta,dye"] = S("Any magenta dye"), + ["color_dark_grey,dye"] = S("Any dark grey dye"), + ["color_dark_green,dye"] = S("Any dark green dye") +} + +local function table_replace(t, val, new) + for k, v in pairs(t) do + if v == val then + t[k] = new + end + end +end + +local function extract_groups(str) + if str:sub(1, 6) == "group:" then + return str:sub(7):split() + end + return nil +end + +local function item_has_groups(item_groups, groups) + for _, group in ipairs(groups) do + if not item_groups[group] then + return false + end + end + return true +end + +local function groups_to_item(groups) + if #groups == 1 then + local group = groups[1] + if group_stereotypes[group] then + return group_stereotypes[group] + elseif minetest.registered_items["default:"..group] then + return "default:"..group + end + end + + for name, def in pairs(minetest.registered_items) do + if item_has_groups(def.groups, groups) then + return name + end + end + + return ":unknown" +end + +local function get_craftable_recipes(output) + local recipes = minetest.get_all_craft_recipes(output) + if not recipes then + return nil + end + + for i = #recipes, 1, -1 do + for _, item in pairs(recipes[i].items) do + local groups = extract_groups(item) + if groups then + item = groups_to_item(groups) + end + if not minetest.registered_items[item] then + table.remove(recipes, i) + break + end + end + end + + if #recipes > 0 then + return recipes + end +end + +local function show_item(def) + return def.groups.not_in_craft_guide ~= 1 and def.description ~= "" +end + +local function cache_usages(recipe) + local added = {} + for _, item in pairs(recipe.items) do + if not added[item] then + local groups = extract_groups(item) + if groups then + for name, def in pairs(minetest.registered_items) do + if not added[name] and show_item(def) + and item_has_groups(def.groups, groups) then + local usage = table.copy(recipe) + table_replace(usage.items, item, name) + usages_cache[name] = usages_cache[name] or {} + table.insert(usages_cache[name], usage) + added[name] = true + end + end + elseif show_item(minetest.registered_items[item]) then + usages_cache[item] = usages_cache[item] or {} + table.insert(usages_cache[item], recipe) + end + added[item] = true + end + end +end + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_items) do + if show_item(def) then + local recipes = get_craftable_recipes(name) + if recipes then + recipes_cache[name] = recipes + for _, recipe in ipairs(recipes) do + cache_usages(recipe) + end + end + end + end + for name, def in pairs(minetest.registered_items) do + if recipes_cache[name] or usages_cache[name] then + table.insert(init_items, name) + end + end + table.sort(init_items) +end) + +local function coords(i, cols) + return i % cols, math.floor(i / cols) +end + +local function is_fuel(item) + return minetest.get_craft_result({method="fuel", items={item}}).time > 0 +end + +local function item_button_fs(fs, x, y, item, element_name, groups) + table.insert(fs, ("item_image_button[%s,%s;1.05,1.05;%s;%s;%s]") + :format(x, y, item, element_name, groups and "\n"..esc(S("G")) or "")) + + local tooltip + if groups then + table.sort(groups) + tooltip = group_names[table.concat(groups, ",")] + if not tooltip then + local groupstr = {} + for _, group in ipairs(groups) do + table.insert(groupstr, minetest.colorize("yellow", group)) + end + groupstr = table.concat(groupstr, ", ") + tooltip = S("Any item belonging to the group(s): @1", groupstr) + end + elseif is_fuel(item) then + local itemdef = minetest.registered_items[item:match("%S*")] + local desc = itemdef and itemdef.description or S("Unknown Item") + tooltip = desc.."\n"..minetest.colorize("orange", S("Fuel")) + end + if tooltip then + table.insert(fs, ("tooltip[%s;%s]"):format(element_name, esc(tooltip))) + end +end + +local function recipe_fs(fs, data) + local recipe = data.recipes[data.rnum] + local width = recipe.width + local cooktime, shapeless + + if recipe.method == "cooking" then + cooktime, width = width, 1 + elseif width == 0 then + shapeless = true + if #recipe.items == 1 then + width = 1 + elseif #recipe.items <= 4 then + width = 2 + else + width = 3 + end + end + + table.insert(fs, ("label[5.5,1;%s]"):format(esc(data.show_usages + and S("Usage @1 of @2", data.rnum, #data.recipes) + or S("Recipe @1 of @2", data.rnum, #data.recipes)))) + + if #data.recipes > 1 then + table.insert(fs, + "image_button[5.5,1.6;0.8,0.8;craftguide_prev_icon.png;recipe_prev;]".. + "image_button[6.2,1.6;0.8,0.8;craftguide_next_icon.png;recipe_next;]".. + "tooltip[recipe_prev;"..esc(S("Previous recipe")).."]".. + "tooltip[recipe_next;"..esc(S("Next recipe")).."]") + end + + local rows = math.ceil(table.maxn(recipe.items) / width) + if width > 3 or rows > 3 then + table.insert(fs, ("label[0,1;%s]") + :format(esc(S("Recipe is too big to be displayed.")))) + return + end + + local base_x = 3 - width + local base_y = rows == 1 and 1 or 0 + + for i, item in pairs(recipe.items) do + local x, y = coords(i - 1, width) + + local elem_name = item + local groups = extract_groups(item) + if groups then + item = groups_to_item(groups) + elem_name = esc(item.."."..table.concat(groups, "+")) + end + item_button_fs(fs, base_x + x, base_y + y, item, elem_name, groups) + end + + if shapeless or recipe.method == "cooking" then + table.insert(fs, ("image[3.2,0.5;0.5,0.5;craftguide_%s.png]") + :format(shapeless and "shapeless" or "furnace")) + local tooltip = shapeless and S("Shapeless") or + S("Cooking time: @1", minetest.colorize("yellow", cooktime)) + table.insert(fs, "tooltip[3.2,0.5;0.5,0.5;"..esc(tooltip).."]") + end + table.insert(fs, "image[3,1;1,1;sfinv_crafting_arrow.png]") + + item_button_fs(fs, 4, 1, recipe.output, recipe.output:match("%S*")) +end + +local function get_formspec(player) + local name = player:get_player_name() + local data = player_data[name] + data.pagemax = math.max(1, math.ceil(#data.items / 32)) + + local fs = {} + table.insert(fs, + "style_type[item_image_button;padding=2]".. + "field[0.3,4.2;2.8,1.2;filter;;"..esc(data.filter).."]".. + "label[5.8,4.15;"..minetest.colorize("yellow", data.pagenum).." / ".. + data.pagemax.."]".. + "image_button[2.63,4.05;0.8,0.8;craftguide_search_icon.png;search;]".. + "image_button[3.25,4.05;0.8,0.8;craftguide_clear_icon.png;clear;]".. + "image_button[5,4.05;0.8,0.8;craftguide_prev_icon.png;prev;]".. + "image_button[7.25,4.05;0.8,0.8;craftguide_next_icon.png;next;]".. + "tooltip[search;"..esc(S("Search")).."]".. + "tooltip[clear;"..esc(S("Reset")).."]".. + "tooltip[prev;"..esc(S("Previous page")).."]".. + "tooltip[next;"..esc(S("Next page")).."]".. + "field_enter_after_edit[filter;true]".. + "field_close_on_enter[filter;false]") + + if #data.items == 0 then + table.insert(fs, "label[3,2;"..esc(S("No items to show.")).."]") + else + local first_item = (data.pagenum - 1) * 32 + for i = first_item, first_item + 31 do + local item = data.items[i + 1] + if not item then + break + end + local x, y = coords(i % 32, 8) + item_button_fs(fs, x, y, item, item) + end + end + + table.insert(fs, "container[0,5.6]") + if data.recipes then + recipe_fs(fs, data) + elseif data.prev_item then + table.insert(fs, ("label[2,1;%s]"):format(esc(data.show_usages + and S("No usages.").."\n"..S("Click again to show recipes.") + or S("No recipes.").."\n"..S("Click again to show usages.")))) + end + table.insert(fs, "container_end[]") + + return table.concat(fs) +end + +local function imatch(str, filter) + return str:lower():find(filter, 1, true) ~= nil +end + +local function execute_search(data) + local filter = data.filter + if filter == "" then + data.items = init_items + return + end + data.items = {} + + for _, item in ipairs(init_items) do + local def = minetest.registered_items[item] + local desc = def and minetest.get_translated_string(data.lang_code, def.description) + + if imatch(item, filter) or desc and imatch(desc, filter) then + table.insert(data.items, item) + end + end +end + +local function on_receive_fields(player, fields) + local name = player:get_player_name() + local data = player_data[name] + + if fields.clear then + data.filter = "" + data.pagenum = 1 + data.prev_item = nil + data.recipes = nil + data.items = init_items + return true + + elseif (fields.key_enter_field == "filter" or fields.search) + and fields.filter then + local new = fields.filter:sub(1, 128) -- truncate to a sane length + :gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + :lower() -- search is case insensitive + if data.filter == new then + return + end + data.filter = new + data.pagenum = 1 + execute_search(data) + return true + + elseif fields.prev or fields.next then + if data.pagemax == 1 then + return + end + data.pagenum = data.pagenum + (fields.next and 1 or -1) + if data.pagenum > data.pagemax then + data.pagenum = 1 + elseif data.pagenum == 0 then + data.pagenum = data.pagemax + end + return true + + elseif fields.recipe_next or fields.recipe_prev then + data.rnum = data.rnum + (fields.recipe_next and 1 or -1) + if data.rnum > #data.recipes then + data.rnum = 1 + elseif data.rnum == 0 then + data.rnum = #data.recipes + end + return true + + else + local item + for field in pairs(fields) do + if field:find(":") then + item = field:match("[%w_:]+") + break + end + end + if not item then + return + end + + if item == data.prev_item then + data.show_usages = not data.show_usages + else + data.show_usages = nil + end + if data.show_usages then + data.recipes = usages_cache[item] + else + data.recipes = recipes_cache[item] + end + data.prev_item = item + data.rnum = 1 + return true + end +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + local info = minetest.get_player_information(name) + + player_data[name] = { + filter = "", + pagenum = 1, + items = init_items, + lang_code = info.lang_code + } +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_data[name] = nil +end) + +sfinv.register_page("mtg_craftguide:craftguide", { + title = esc(S("Recipes")), + get = function(self, player, context) + return sfinv.make_formspec(player, context, get_formspec(player)) + end, + on_player_receive_fields = function(self, player, context, fields) + if on_receive_fields(player, fields) then + sfinv.set_player_inventory_formspec(player) + end + end +}) diff --git a/mods/minetest_game/mtg_craftguide/license.txt b/mods/minetest_game/mtg_craftguide/license.txt new file mode 100644 index 00000000..8d28c5c7 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) + +Copyright (C) 2015-2019 Jean-Patrick Guerrero and contributors. +Copyright (C) 2020 pauloue + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + +Copyright (C) 2018 paramat +Copyright (C) Neuromancer +Copyright (C) 2017 Wuzzy + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.de.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.de.tr new file mode 100644 index 00000000..d90f833d --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.de.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Beliebige Kohle +Any sand=Beliebiger Sand +Any wool=Beliebige Wolle +Any stick=Beliebiger Stock +Any vessel=Beliebiges Gefäß +Any wood planks=Beliebige Holzplanken +Any kind of stone block=Beliebige Art von Steinblock +Any red flower=Beliebige rote Blume +Any blue flower=Beliebige blaue Blume +Any black flower=Beliebige schwarze Blume +Any green flower=Beliebige grüne Blume +Any white flower=Beliebige weiße Blume +Any orange flower=Beliebige orange Blume +Any violet flower=Beliebige violette Blume +Any yellow flower=Beliebige gelbe Blume +Any red dye=Beliebiger roter Farbstoff +Any blue dye=Beliebiger blauer Farbstoff +Any cyan dye=Beliebiger türkiser Farbstoff +Any grey dye=Beliebiger grauer Farbstoff +Any pink dye=Beliebiger rosa Farbstoff +Any black dye=Beliebiger schwarzer Farbstoff +Any brown dye=Beliebiger brauner Farbstoff +Any green dye=Beliebiger grüner Farbstoff +Any white dye=Beliebiger weißer Farbstoff +Any orange dye=Beliebiger orange Farbstoff +Any violet dye=Beliebiger violetter Farbstoff +Any yellow dye=Beliebiger gelber Farbstoff +Any magenta dye=Beliebiger magenta Farbstoff +Any dark grey dye=Beliebiger dunkelgrauer Farbstoff +Any dark green dye=Beliebiger dunkelgrüner Farbstoff +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Beliebiger Gegenstand, der zu Gruppe(n) gehört: @1 +Unknown Item=Unbekannter Gegenstand +Fuel=Brennstoff +Usage @1 of @2=Verwendung @1 von @2 +Recipe @1 of @2=Rezept @1 von @2 +Previous recipe=Vorheriges Rezept +Next recipe=Nächstes Rezept +Recipe is too big to be displayed.=Rezept ist zu groß für die Anzeige. +Shapeless=Formlos +Cooking time: @1=Kochdauer: @1 +Search=Suche +Reset=Zurücksetzen +Previous page=Vorherige Seite +Next page=Nächste Seite +No items to show.=Keine Gegenstände anzuzeigen. +No usages.=Keine Verwendungen. +Click again to show recipes.=Erneut klicken, um Rezepte zu zeigen. +No recipes.=Keine Rezepte. +Click again to show usages.=Erneut klicken, um Verwendungen zu zeigen. +Recipes=Rezepte diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.eo.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.eo.tr new file mode 100644 index 00000000..80a1e391 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.eo.tr @@ -0,0 +1,54 @@ +# textdomain: mtg_craftguide + +Any coal=Ajna karbo +Any sand=Ajna sablo +Any wool=Ajna lano +Any stick=Ajna bastono +Any vessel=Ajna vazo +Any wood planks=Ajnaj lignaj tabuloj +Any kind of stone block=Ia Åtona bloko +Any red flower=Ajna ruÄa floro +Any blue flower=Ajna blua floro +Any black flower=Ajna nigra floro +Any green flower=Ajna verda floro +Any white flower=Ajna blanka floro +Any orange flower=Ajna oranÄkolora floro +Any violet flower=Ajna violkolora floro +Any yellow flower=Ajna flava floro +Any red dye=Ajna ruÄa tinkturo +Any blue dye=Ajna blua tinkturo +Any cyan dye=Ajna bluverda tinkturo +Any grey dye=Ajna griza tinkturo +Any pink dye=Ajna rozkolora tinkturo +Any black dye=Ajna nigra tinkturo +Any brown dye=Ajna bruna tinkturo +Any green dye=Ajna verda tinkturo +Any white dye=Ajna blanka tinkturo +Any orange dye=Ajna oranÄkolora tinkturo +Any violet dye=Ajna violkolora tinkturo +Any yellow dye=Ajna flava tinkturo +Any magenta dye=Ajna fuksina tinkturo +Any dark grey dye=Ajna malhela griza tinkturo +Any dark green dye=Ajna malhela verda tinkturo +# Label for group ingredients +G=A +Any item belonging to the group(s): @1=Ajna objekto de la aro(j): @1 +Unknown Item=Nekonata objekto +Fuel=Brulaĵo +Usage @1 of @2=Uzo @1 el @2 +Recipe @1 of @2=Recepto @1 el @2 +Previous recipe=AntaÅ­a recepto +Next recipe=Sekva recepto +Recipe is too big to be displayed.=La recepto estas tro granda por prezenti. +Shapeless=Senforma +Cooking time: @1=Tempo por kuirado: @1 +Search=Serĉi +Reset=Rekomincigi +Previous page=AntaÅ­a paÄo +Next page=Sekva paÄo +No items to show.=Neniu objekto por prezenti. +No usages.=Neniu uzo. +Click again to show recipes.=Reklaki por prezenti receptojn. +No recipes.=Neniu recepto. +Click again to show usages.=Reklaki por prezenti uzojn. +Recipes=Receptoj diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.es.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.es.tr new file mode 100644 index 00000000..a5b5149d --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.es.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Carbón +Any sand=Arena +Any wool=Lana +Any stick=Palitos +Any vessel=Recipiente +Any wood planks=Tablas de madera +Any kind of stone block=Derivado de bloque de piedra +Any red flower=Flor roja +Any blue flower=Flor azul +Any black flower=Flor negra +Any green flower=Flor verde +Any white flower=Flor blanca +Any orange flower=Flor naranja +Any violet flower=Flor violeta +Any yellow flower=Flor amarilla +Any red dye=Tinte rojo +Any blue dye=Tinte azul +Any cyan dye=Tinte cian +Any grey dye=Tinte gris +Any pink dye=Tinte rosa +Any black dye=Tinte negro +Any brown dye=Tinte marrón +Any green dye=Tinte verde +Any white dye=Tinte blanco +Any orange dye=Tinte naranja +Any violet dye=Tinte violeta +Any yellow dye=Tinte amarillo +Any magenta dye=Tinte magenta +Any dark grey dye=Tinte gris oscuro +Any dark green dye=Tinte verde oscuro +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Objeto del grupo: @1 +Unknown Item=Objeto desconocido +Fuel=Combustible +Usage @1 of @2=Usa @1 en @2 +Recipe @1 of @2=Receta @1 en @2 +Previous recipe=Receta anterior +Next recipe=Próxima Receta +Recipe is too big to be displayed.=La receta es muy grande para ser mostrada. +Shapeless=Sin forma +Cooking time: @1=Tiempo de cocción: @1 +Search=Buscar +Reset=Resetear +Previous page=Página anterior +Next page=Próxima página +No items to show.=No hay objetos para mostrar. +No usages.=Sin usos. +Click again to show recipes.=Clica de nuevo para mostrar recetas. +No recipes.=No hay recetas. +Click again to show usages.=Clica de nuevo para mostrar usos. +Recipes=Recetas diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.fr.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.fr.tr new file mode 100644 index 00000000..afc82249 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.fr.tr @@ -0,0 +1,54 @@ +# textdomain: mtg_craftguide + +Any coal=Quelconque charbon +Any sand=Quelconque sable +Any wool=Quelconque laine +Any stick=Quelconque bâton +Any vessel=Quelconque couvert +Any wood planks=Quelconques planches de bois +Any kind of stone block=Quelconque roche +Any red flower=Quelconque fleur rouge +Any blue flower=Quelconque fleur bleue +Any black flower=Quelconque fleur noire +Any green flower=Quelconque fleur verte +Any white flower=Quelconque fleur blanche +Any orange flower=Quelconque fleur orange +Any violet flower=Quelconque fleur violette +Any yellow flower=Quelconque fleur jaune +Any red dye=Quelconque colorant rouge +Any blue dye=Quelconque colorant bleu +Any cyan dye=Quelconque colorant bleu ciel +Any grey dye=Quelconque colorant gris +Any pink dye=Quelconque colorant rose +Any black dye=Quelconque colorant noir +Any brown dye=Quelconque colorant marron +Any green dye=Quelconque colorant vert +Any white dye=Quelconque colorant blanc +Any orange dye=Quelconque colorant orange +Any violet dye=Quelconque colorant violet +Any yellow dye=Quelconque colorant jaune +Any magenta dye=Quelconque colorant magenta +Any dark grey dye=Quelconque colorant gris foncé +Any dark green dye=Quelconque colorant vert foncé +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Tout item appartenant au(x) groupe(s) : @1 +Unknown Item=Object inconnu +Fuel=Combustible +Usage @1 of @2=Usage @1 sur @2 +Recipe @1 of @2=Recette @1 sur @2 +Previous recipe=Recette précédente +Next recipe=Prochaine recette +Recipe is too big to be displayed.=Recette trop grande pour être affichée. +Shapeless=Sans forme +Cooking time: @1=Temps de cuisson : @1 +Search=Recherche +Reset=Réinitialiser +Previous page=Page précédente +Next page=Prochaine page +No items to show.=Aucun item à afficher. +No usages.=Sans utilité. +Click again to show recipes.=Cliquez encore pour afficher la recette. +No recipes.=Aucune recette. +Click again to show usages.=Cliquez encore pour afficher l'usage. +Recipes=Recettes diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.id.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.id.tr new file mode 100644 index 00000000..d4e6ea08 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.id.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Batu bara apa pun +Any sand=Pasir apa pun +Any wool=Wol apa pun +Any stick=Tongkat apa pun +Any vessel=Bejana apa pun +Any wood planks=Papan kayu apa pun +Any kind of stone block=Blok batu apa pun +Any red flower=Bunga merah apa pun +Any blue flower=Bunga biru apa pun +Any black flower=Bunga hitam apa pun +Any green flower=Bunga hijau apa pun +Any white flower=Bunga putih apa pun +Any orange flower=Bunga oranye apa pun +Any violet flower=Bunga ungu apa pun +Any yellow flower=Bunga kuning apa pun +Any red dye=Pewarna merah apa pun +Any blue dye=Pewarna biru apa pun +Any cyan dye=Pewarna sian apa pun +Any grey dye=Pewarna abu apa pun +Any pink dye=Pewarna merah jambu apa pun +Any black dye=Pewarna hitam apa pun +Any brown dye=Pewarna cokelat apa pun +Any green dye=Pewarna hijau apa pun +Any white dye=Pewarna putih apa pun +Any orange dye=Pewarna oranye apa pun +Any violet dye=Pewarna ungu apa pun +Any yellow dye=Pewarna kuning apa pun +Any magenta dye=Pewarna magenta apa pun +Any dark grey dye=Pewarna abu tua apa pun +Any dark green dye=Pewarna hijau tua apa pun +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Barang apa pun yang termasuk grup: @1 +Unknown Item=Barang Tak Diketahui +Fuel=Bahan Bakar +Usage @1 of @2=Penggunaan @1 dari @2 +Recipe @1 of @2=Resep @1 dari @2 +Previous recipe=Resep sebelumnya +Next recipe=Resep selanjutnya +Recipe is too big to be displayed.=Resep terlalu besar untuk ditampilkan. +Shapeless=Tak berbentuk +Cooking time: @1=Waktu memasak: @1 +Search=Cari +Reset=Atur ulang +Previous page=Halaman sebelumnya +Next page=Halaman selanjutnya +No items to show.=Tidak ada barang untuk ditampilkan. +No usages.=Tidak ada penggunaan. +Click again to show recipes.=Klik lagi untuk menampilkan resep. +No recipes.=Tidak ada resep. +Click again to show usages.=Klik lagi untuk menampilkan penggunaan. +Recipes=Resep diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ja.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ja.tr new file mode 100644 index 00000000..c6ec66ae --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ja.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=石炭 +Any sand=ç ‚ +Any wool=羊毛 +Any stick=棒 +Any vessel=ç“¶ +Any wood planks=æ¿æ +Any kind of stone block=石ã®ãƒ–ロック +Any red flower=赤色ã®èб +Any blue flower=é’色ã®èб +Any black flower=黒色ã®èб +Any green flower=緑色ã®èб +Any white flower=白色ã®èб +Any orange flower=橙色ã®èб +Any violet flower=紫色ã®èб +Any yellow flower=黄色ã®èб +Any red dye=èµ¤è‰²ã®æŸ“æ–™ +Any blue dye=é’è‰²ã®æŸ“æ–™ +Any cyan dye=é’ç·‘è‰²ã®æŸ“æ–™ +Any grey dye=ç°è‰²ã®æŸ“æ–™ +Any pink dye=æ¡ƒè‰²ã®æŸ“æ–™ +Any black dye=é»’è‰²ã®æŸ“æ–™ +Any brown dye=èŒ¶è‰²ã®æŸ“æ–™ +Any green dye=ç·‘è‰²ã®æŸ“æ–™ +Any white dye=ç™½è‰²ã®æŸ“æ–™ +Any orange dye=æ©™è‰²ã®æŸ“æ–™ +Any violet dye=ç´«è‰²ã®æŸ“æ–™ +Any yellow dye=é»„è‰²ã®æŸ“æ–™ +Any magenta dye=èµ¤ç´«è‰²ã®æŸ“æ–™ +Any dark grey dye=濃ç°è‰²ã®æŸ“æ–™ +Any dark green dye=æ¿ƒç·‘è‰²ã®æŸ“æ–™ +# Label for group ingredients +G= +Any item belonging to the group(s): @1=グループã«å±žã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ : @1 +Unknown Item=䏿˜Žãªã‚¢ã‚¤ãƒ†ãƒ  +Fuel=燃料 +Usage @1 of @2=利用方法 @1 / @2 +Recipe @1 of @2=レシピ @1 / @2 +Previous recipe=å‰ã®ãƒ¬ã‚·ãƒ” +Next recipe=次ã®ãƒ¬ã‚·ãƒ” +Recipe is too big to be displayed.=レシピãŒå¤§ãã™ãŽã¦è¡¨ç¤ºã§ãã¾ã›ã‚“。 +Shapeless=ç„¡å½¢ +Cooking time: @1=èª¿ç†æ™‚é–“: @1 +Search=検索 +Reset=リセット +Previous page=å‰ã®ãƒšãƒ¼ã‚¸ +Next page=次ã®ãƒšãƒ¼ã‚¸ +No items to show.=表示ã™ã‚‹é …ç›®ãŒã‚りã¾ã›ã‚“。 +No usages.=利用方法ãŒã‚りã¾ã›ã‚“。 +Click again to show recipes.=ã‚‚ã†ä¸€åº¦ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ãƒ¬ã‚·ãƒ”を表示ã—ã¾ã™ã€‚ +No recipes.=レシピãŒã‚りã¾ã›ã‚“。 +Click again to show usages.=ã‚‚ã†ä¸€åº¦ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ä½¿ç”¨æ–¹æ³•を表示ã—ã¾ã™ã€‚ +Recipes=レシピ diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.jbo.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.jbo.tr new file mode 100644 index 00000000..c9e6fbf0 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.jbo.tr @@ -0,0 +1,54 @@ +# textdomain: mtg_craftguide +Any coal=lo cmina lo'i kolme +Any sand=lo cmima lo'i sance +Any wool=lo cmima lo'i sunla +Any stick=lo cmima lo'i grana +Any vessel=lo cmima lo'i vasru +Any wood planks=lo cmima lo'i mudri tanbo +Any kind of stone block=lo cmima lo'i rokci bliku +Any red flower=lo cmima lo'i xunre xrula +Any blue flower=lo cmima lo'i blanu xrula +Any black flower=lo cmima lo'i xekri xrula +Any green flower=lo cmima lo'i crino xrula +Any white flower=lo cmima lo'i blabi xrula +Any orange flower=lo cmima lo'i narju xrula +Any violet flower=lo cmima lo'i zirpu xrula +Any yellow flower=lo cmima lo'i pelxu xrula +Any red dye=lo cmima lo'i xunre xinmo +Any blue dye=lo cmima lo'i blanu xinmo +Any cyan dye=lo cmima lo'i cicna xinmo +Any grey dye=lo cmima lo'i grusi xinmo +Any pink dye=lo cmima lo'i xunblabi xinmo +Any black dye=lo cmima lo'i xekri xinmo +Any brown dye=lo cmima lo'i bunre xinmo +Any green dye=lo cmima lo'i crino xinmo +Any white dye=lo cmima lo'i blabi xinmo +Any orange dye=lo cmima lo'i narju xinmo +Any violet dye=lo cmima lo'i zirpu xinmo +Any yellow dye=lo cmima lo'i pelxu xinmo +Any magenta dye=lo cmima lo'i nukni xinmo +Any dark grey dye=lo cmima lo'i xekri grusi xinmo +Any dark green dye=lo cmima lo'i xekri crino xinmo +# Label for group ingredients +# c = cmima +G=c +Any item belonging to the group(s): @1=lo cmima lo'i me zoi gi'u.@1.gi'u +Unknown Item=lo na te djuno dacti +Fuel=.i livla +Usage @1 of @2=.i meirmoi fe li @1 li @2@nle'i te zbasu +Recipe @1 of @2=.i meirmoi fe li @1 li @2@nle'i te jukpa +Previous recipe=lidne +Next recipe=selyli'e +Recipe is too big to be displayed.=.i lo te jukpa cu dukse lo ka barda tezu'e lo nu jarco +Shapeless=tarmi claxu +Cooking time: @1=lo pu'u jukpa cu snidu li @1 +Search=sisku +Reset=kraga'igau +Previous page=lidne +Next page=selyli'e +No items to show.=no da dacti cu se jarco +No usages.=na te zbasu +Click again to show recipes.=.i ko rapli .iklki fi lo nu .arco lo te jukpa +No recipes.=na te jukpa +Click again to show usages.=.i ko rapli .iklki fi lo nu .arco lo te zbasu +Recipes=lo te jukpa diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.lv.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.lv.tr new file mode 100644 index 00000000..253aae51 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.lv.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Jebkura ogle +Any sand=Jebkura smilts +Any wool=Jebkura vilna +Any stick=JebkurÅ¡ puļķis +Any vessel=JebkurÅ¡ trauks +Any wood planks=Jebkuri dēļi +Any kind of stone block=Jebkads akmens bloks +Any red flower=JebkÄda sarkana puÄ·e +Any blue flower=JebkÄda zila puÄ·e +Any black flower=JebkÄda melna puÄ·e +Any green flower=JebkÄda zaļa puÄ·e +Any white flower=JebkÄda balta puÄ·e +Any orange flower=JebkÄda oranža puÄ·e +Any violet flower=JebkÄda violeta puÄ·e +Any yellow flower=JebkÄda dzeltena puÄ·e +Any red dye=JebkÄda sarkanÄ krÄsa +Any blue dye=JebkÄda zilÄ krÄsa +Any cyan dye=JebkÄda ciÄnkrÄsas krÄsa +Any grey dye=JebkÄda pelÄ“kÄ krÄsa +Any pink dye=JebkÄda rozÄ krÄsa +Any black dye=JebkÄda melnÄ krÄsa +Any brown dye=JebkÄda brÅ«nÄ krÄsa +Any green dye=JebkÄda zaÄ¼Ä krÄsa +Any white dye=JebkÄda baltÄ krÄsa +Any orange dye=JebkÄda oranÅ¾Ä krÄsa +Any violet dye=JebkÄda violetÄ krÄsa +Any yellow dye=JebkÄda dzeltanÄ krÄsa +Any magenta dye=JebkÄda fuksÄ«na krÄsa +Any dark grey dye=JebkÄda tumÅ¡pelÄ“kÄ krÄsa +Any dark green dye=JebkÄka tumÅ¡i zaÄ¼Ä krÄsa +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=JebkurÅ¡ priekÅ¡mets no grupas/Äm: @1 +Unknown Item=NezinÄms priekÅ¡mets +Fuel=Degviela +Usage @1 of @2=IzmantoÅ¡ana @1 no @2 +Recipe @1 of @2=Recepte @1 no @2 +Previous recipe=IepriekšējÄ recepte +Next recipe=NÄkoÅ¡Ä recepte +Recipe is too big to be displayed.=Recepte ir pÄrÄk liela lai to attÄ“lotu. +Shapeless=Bezformas +Cooking time: @1=ApstÄdÄÅ¡anas laiks @1 +Search=Meklēšana +Reset=AtiestatÄ«t +Previous page=IepriekšējÄ lapa +Next page=NÄkoÅ¡Ä lapa +No items to show.=Nav priekÅ¡metu ko parÄdÄ«t. +No usages.=Nav pielietojumu. +Click again to show recipes.=Uzklikšķiniet atkal lai parÄdÄ«tu receptes. +No recipes.=Nav recepÅ¡u. +Click again to show usages.=Uzklikšķiniet atkal lai parÄdÄ«tu izmantojamÄ«bas. +Recipes=Receptes diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ms.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ms.tr new file mode 100644 index 00000000..0cfb297f --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ms.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Sebarang arang +Any sand=Sebarang pasir +Any wool=Sebarang bulu biri-biri +Any stick=Sebarang serpihan kayu +Any vessel=Sebarang bekas kaca +Any wood planks=Sebarang papan kayu +Any kind of stone block=Sebarang jenis bongkah batu +Any red flower=Sebarang bunga merah +Any blue flower=Sebarang bunga biru +Any black flower=Sebarang bunga hitam +Any green flower=Sebarang bunga hijau +Any white flower=Sebarang bunga putih +Any orange flower=Sebarang bunga jingga +Any violet flower=Sebarang bunga ungu +Any yellow flower=Sebarang bunga kuning +Any red dye=Sebarang pewarna merah +Any blue dye=Sebarang pewarna biru +Any cyan dye=Sebarang pewarna biru kehijauan +Any grey dye=Sebarang pewarna kelabu +Any pink dye=Sebarang pewarna merah jambu +Any black dye=Sebarang pewarna hitam +Any brown dye=Sebarang pewarna perang +Any green dye=Sebarang pewarna hijau +Any white dye=Sebarang pewarna putih +Any orange dye=Sebarang pewarna jingga +Any violet dye=Sebarang pewarna ungu +Any yellow dye=Sebarang pewarna kuning +Any magenta dye=Sebarang pewarna magenta +Any dark grey dye=Sebarang pewarna kelabu tua +Any dark green dye=Sebarang pewarna hijau tua +# Label for group ingredients +G=K +Any item belonging to the group(s): @1=Sebarang item milik kumpulan: @1 +Unknown Item=Item Tidak Diketahui +Fuel=Bahan Api +Usage @1 of @2=Kegunaan @1 daripada @2 +Recipe @1 of @2=Resipi @1 daripada @2 +Previous recipe=Resipi sebelumnya +Next recipe=Resipi seterusnya +Recipe is too big to be displayed.=Resipi terlalu besar untuk dipaparkan. +Shapeless=Tidak Berbentuk +Cooking time: @1=Masa memasak: @1 +Search=Cari +Reset=Tetap Semula +Previous page=Halaman sebelumnya +Next page=Halaman seterusnya +No items to show.=Tiada item untuk ditunjukkan. +No usages.=Tiada kegunaan. +Click again to show recipes.=Klik lagi untuk tunjuk resipi. +No recipes.=Tiada resipi. +Click again to show usages.=Klik lagi untuk tunjuk kegunaan. +Recipes=Resipi diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.pl.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.pl.tr new file mode 100644 index 00000000..88d8e95e --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.pl.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Dowolny wÄ™giel +Any sand=Dowonly piasek +Any wool=Dowolna weÅ‚na +Any stick=Dowolny patyk +Any vessel=Dowolne naczynie +Any wood planks=Dowolne deski +Any kind of stone block=Dowolny rodzaj kamiennego bloku +Any red flower=Dowolny czerwony kwiat +Any blue flower=Dowolny niebieski kwiat +Any black flower=Dowolny czarny kwiat +Any green flower=Dowolny zielony kwiat +Any white flower=Dowolny biaÅ‚y kwiat +Any orange flower=Dowolny pomaraÅ„czowy kwiat +Any violet flower=Dowolny fioletowy kwiat +Any yellow flower=Dowolny żółty kwiat +Any red dye=Dowolny czerwony barwnik +Any blue dye=Dowolny niebieski barwnik +Any cyan dye=Dowolny cyjanowy barwnik +Any grey dye=Dowolny szary barwnik +Any pink dye=Dowolny różowy barwnik +Any black dye=Dowolny czarny barwnik +Any brown dye=Dowolny brÄ…zowy barwnik +Any green dye=Dowolny zielony barwnik +Any white dye=Dowolny biaÅ‚y barwnik +Any orange dye=Dowolny pomaraÅ„czowy barwnik +Any violet dye=Dowolny fioletowy barwnik +Any yellow dye=Dowolny zółty barwnik +Any magenta dye=Dowolny karmazynowy barwnik +Any dark grey dye=Dowolny ciemnoszary barwnik +Any dark green dye=Dowolny ciemnozielony barwnik +# Label for group ingredients +G=G +Any item belonging to the group(s): @1= +Unknown Item=Nieznany przedmiot +Fuel=Paliwo +Usage @1 of @2=Użycie @1 z @2 +Recipe @1 of @2=Receptura @1 z @2 +Previous recipe=Poprzednia receptura +Next recipe=NastÄ™pna receptura +Recipe is too big to be displayed.=Receptura jest zbyt duża aby mogÅ‚a być wyÅ›wietlona. +Shapeless=Bez ksztaÅ‚tu +Cooking time: @1=Czas przepalania: @1 +Search=Wyszukaj +Reset=Zresetuj +Previous page=Poprzednia strona +Next page=NastÄ™pna strona +No items to show.=Brak przedmiotów do pokazania. +No usages.=Brak użyć. +Click again to show recipes.=NaciÅ›nij jeszcze raz aby pokazać receptury. +No recipes.=Brak receptur. +Click again to show usages.=NaciÅ›nij jeszcze raz aby pokazać użycia. +Recipes=Receptury diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.pt_BR.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.pt_BR.tr new file mode 100644 index 00000000..a4bbf7f9 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.pt_BR.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Qualquer carvão +Any sand=Qualquer areia +Any wool=Qualquer madeira +Any stick=Qualquer graveto +Any vessel=Qualquer navio +Any wood planks=Qualquer tábua de madeira +Any kind of stone block=Qualquer tipo de bloco de pedra +Any red flower=Qualquer flor vermelha +Any blue flower=Qualquer flor azul +Any black flower=Qualquer flor preta +Any green flower=Qualquer flor verde +Any white flower=Qualquer flor branca +Any orange flower=Qualquer flor laranja +Any violet flower=Qualquer flor violeta +Any yellow flower=Qualquer flor amarela +Any red dye=Qualquer tinta vermelha +Any blue dye=Qualquer tinta azul +Any cyan dye=Qualquer tinta ciano +Any grey dye=Qualquer tinta cinza +Any pink dye=Qualquer tinta rosa +Any black dye=Qualquer tinta preto +Any brown dye=Qualquer tinta marrom +Any green dye=Qualquer tinta verde +Any white dye=Qualquer tinta branca +Any orange dye=Qualquer tinta laranja +Any violet dye=Qualquer tinta violeta +Any yellow dye=Qualquer tinta amarela +Any magenta dye=Qualquer tinta magenta +Any dark grey dye=Qualquer tinta cinza-escuro +Any dark green dye=Qualquer tinta cinza-escuro +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Qualquer item pertencente ao(s) grupo(s): @1 +Unknown Item=Item Desconhecido +Fuel=Combustível +Usage @1 of @2=Uso @1 de @2 +Recipe @1 of @2=Receita @1 de @2 +Previous recipe=Receita anterior +Next recipe=Próxima receita +Recipe is too big to be displayed.=Receita é muito grande para ser exibida. +Shapeless=Sem forma +Cooking time: @1=Tempo de Cozimento: @1 +Search=Buscar +Reset=Redefinir +Previous page=Página anterior +Next page=Próxima página +No items to show.=Nenhum item para mostrar. +No usages.=Nenhum uso. +Click again to show recipes.=Clique novamente para mostrar receitas. +No recipes.=Nenhuma receita. +Click again to show usages.=Clique novamente para mostrar os usos. +Recipes=Receitas diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ru.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ru.tr new file mode 100644 index 00000000..ea7a717c --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.ru.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Любой уголь +Any sand=Любой пеÑок +Any wool=Ð›ÑŽÐ±Ð°Ñ ÑˆÐµÑ€Ñть +Any stick=Ð›ÑŽÐ±Ð°Ñ Ð¿Ð°Ð»ÐºÐ° +Any vessel=Любой ÑоÑуд +Any wood planks=Любые доÑки +Any kind of stone block=Любой вид ÐºÐ°Ð¼Ð½Ñ +Any red flower=Любой краÑный цветок +Any blue flower=Любой Ñиний цветок +Any black flower=Любой чёрный цветок +Any green flower=Любой зелёный цветок +Any white flower=Любой белый цветок +Any orange flower=Любой оранжевый цветок +Any violet flower=Любой фиолетовый цветок +Any yellow flower=Любой жёлтый цветок +Any red dye=Любой краÑный краÑитель +Any blue dye=Любой Ñиний краÑитель +Any cyan dye=Любой бирюзовый краÑитель +Any grey dye=Любой Ñерый краÑитель +Any pink dye=Любой розовый краÑитель +Any black dye=Любой чёрный краÑитель +Any brown dye=Любой коричневый краÑитель +Any green dye=Любой зелёный краÑитель +Any white dye=Любой белый краÑитель +Any orange dye=Любой оранжевый краÑитель +Any violet dye=Любой фиолетовый краÑитель +Any yellow dye=Любой жёлтый краÑитель +Any magenta dye=Любой Ñиреневый краÑитель +Any dark grey dye=Любой тёмно-Ñерый краÑитель +Any dark green dye=Любой тёмно-зелёный краÑитель +# Label for group ingredients +G=Г +Any item belonging to the group(s): @1=Любой предмет из групп(Ñ‹): @1 +Unknown Item=ÐеизвеÑтный предмет +Fuel=Топливо +Usage @1 of @2=ИÑпользование @1 из @2 +Recipe @1 of @2=Рецепт @1 из @2 +Previous recipe=Предыдущий рецепт +Next recipe=Следующий рецепт +Recipe is too big to be displayed.=Рецепт Ñлишком большой Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. +Shapeless=БеÑформенный +Cooking time: @1=Ð’Ñ€ÐµÐ¼Ñ Ð³Ð¾Ñ‚Ð¾Ð²ÐºÐ¸: @1 +Search=ПоиÑк +Reset=Ð¡Ð±Ñ€Ð¾Ñ +Previous page=ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница +Next page=Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница +No items to show.=Ðет предметов. +No usages.=Ðет иÑпользований. +Click again to show recipes.=Кликните Ñнова чтобы увидеть рецепты. +No recipes.=Ðет рецептов. +Click again to show usages.=Кликните Ñнова чтобы увидеть иÑпользованиÑ. +Recipes=Рецепты diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.sv.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.sv.tr new file mode 100644 index 00000000..00b40564 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.sv.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=NÃ¥gon typ av kol +Any sand=NÃ¥gon typ av sand +Any wool=NÃ¥gon typ av ull +Any stick=NÃ¥gon typ av pinne +Any vessel=NÃ¥gon typ av fartygshylla +Any wood planks=NÃ¥gon typ av träplanka +Any kind of stone block=NÃ¥gon typ av stenblock +Any red flower=NÃ¥gon typ av röd blomma +Any blue flower=NÃ¥gon typ av blÃ¥ blomma +Any black flower=NÃ¥gon typ av svart blomma +Any green flower=NÃ¥gon typ av grön blomma +Any white flower=NÃ¥gon typ av vit blomma +Any orange flower=NÃ¥gon typ av orange blomma +Any violet flower=NÃ¥gon typ av violett blomma +Any yellow flower=NÃ¥gon typ av gul blomma +Any red dye=NÃ¥gon typ av röd färg +Any blue dye=NÃ¥gon typ av blÃ¥ färg +Any cyan dye=NÃ¥gon typ av cyan färg +Any grey dye=NÃ¥gon typ av grÃ¥ färg +Any pink dye=NÃ¥gon typ av rosa färg +Any black dye=NÃ¥gon typ av svart färg +Any brown dye=NÃ¥gon typ av brun färg +Any green dye=NÃ¥gon typ av grön färg +Any white dye=NÃ¥gon typ av vit färg +Any orange dye=NÃ¥gon typ av orange färg +Any violet dye=NÃ¥gon typ av violett färg +Any yellow dye=NÃ¥gon typ av gul färg +Any magenta dye=NÃ¥gon typ av magenta färg +Any dark grey dye=NÃ¥gon typ av mörkgrÃ¥ färg +Any dark green dye=NÃ¥gon typ av mörkgrön färg +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Vilket föremÃ¥l som helst som tillhör grupp(erna): @1 +Unknown Item=Okänt föremÃ¥l +Fuel=Bränsle +Usage @1 of @2=Användning @1 av @2 +Recipe @1 of @2=Recept @1 av @2 +Previous recipe=FöregÃ¥ende recept +Next recipe=Nästa recept +Recipe is too big to be displayed.=Receptet är för stort för att visas. +Shapeless=Formlöst +Cooking time: @1=Tillagningstid: @1 +Search=Sök +Reset=Ã…terställ +Previous page=FöregÃ¥ende sida +Next page=Nästa sida +No items to show.=Inga föremÃ¥l att visa. +No usages.=Inga användningsomrÃ¥den. +Click again to show recipes.=Tryck igen för att visa recept. +No recipes.=Inga recept. +Click again to show usages.=Tryck igen för att visa användningsomrÃ¥den. +Recipes=Recept diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.uk.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.uk.tr new file mode 100644 index 00000000..8fe78a92 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.uk.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Будь-Ñке Ð²ÑƒÐ³Ñ–Ð»Ð»Ñ +Any sand=Будь-Ñкий піÑок +Any wool=Будь-Ñка вовна +Any stick=Будь-Ñка Ð¿Ð°Ð»Ð¸Ñ†Ñ +Any vessel=Будь-Ñкий поÑуд +Any wood planks=Будь-Ñкі дошки +Any kind of stone block=Будь-Ñкий кам'Ñний блок +Any red flower=Будь-Ñка червона квітка +Any blue flower=Будь-Ñка ÑÐ¸Ð½Ñ ÐºÐ²Ñ–Ñ‚ÐºÐ° +Any black flower=Будь-Ñка чорна квітка +Any green flower=Будь-Ñка зелена квітка +Any white flower=Будь-Ñка біла квітка +Any orange flower=Будь-Ñка помаранчева квітка +Any violet flower=Будь-Ñка фіолетова квітка +Any yellow flower=Будь-Ñка жовта квітка +Any red dye=Будь-Ñкий червоний барвник +Any blue dye=Будь-Ñкий Ñиній барвник +Any cyan dye=Будь-Ñкий Ñиньо-зелений барвник +Any grey dye=Будь-Ñкий Ñірий барвник +Any pink dye=Будь-Ñкий рожевий барвник +Any black dye=Будь-Ñкий чорний барвник +Any brown dye=Будь-Ñкий коричневий барвник +Any green dye=Будь-Ñкий зелений барвник +Any white dye=Будь-Ñкий білий барвник +Any orange dye=Будь-Ñкий помаранчевий барвник +Any violet dye=Будь-Ñкий фіолетовий барвник +Any yellow dye=Будь-Ñкий жовтий барвник +Any magenta dye=Будь-Ñкий пурпурний барвник +Any dark grey dye=Будь-Ñкий темно-Ñірий барвник +Any dark green dye=Будь-Ñкий темно-зелений барвник +# Label for group ingredients +G=Г +Any item belonging to the group(s): @1=Будь-Ñкий предмет з груп(и): @1 +Unknown Item=Ðевідомий предмет +Fuel=Паливо +Usage @1 of @2=Матеріал: @1 з @2 +Recipe @1 of @2=Рецепт: @1 з @2 +Previous recipe=Попередній рецепт +Next recipe=ÐаÑтупний рецепт +Recipe is too big to be displayed.=Рецепт завеликий Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ. +Shapeless=Безформний +Cooking time: @1=Ð§Ð°Ñ Ð²Ð¸Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: @1 +Search=Пошук +Reset=Скинути +Previous page=ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка +Next page=ÐаÑтупна Ñторінка +No items to show.=Ðемає результатів. +No usages.=Ðе викориÑтовуєтьÑÑ. +Click again to show recipes.=ÐатиÑніть ще раз Ð´Ð»Ñ Ñ€ÐµÑ†ÐµÐ¿Ñ‚Ñ–Ð². +No recipes.=Ðемає рецептів. +Click again to show usages.=ÐатиÑніть ще раз Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтань. +Recipes=Рецепти diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.zh_CN.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.zh_CN.tr new file mode 100644 index 00000000..56ae7d5a --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.zh_CN.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=任何煤炭 +Any sand=ä»»ä½•æ²™å­ +Any wool=任何羊毛 +Any stick=任何棒 +Any vessel=任何容器 +Any wood planks=ä»»ä½•æœ¨æ¿ +Any kind of stone block=任何ç§ç±»çš„çŸ³å— +Any red flower=任何红色花朵 +Any blue flower=任何è“色花朵 +Any black flower=任何黑色花朵 +Any green flower=任何绿色花朵 +Any white flower=任何白色花朵 +Any orange flower=任何橙色花朵 +Any violet flower=任何紫色花朵 +Any yellow flower=任何黄色花朵 +Any red dye=任何红色染料 +Any blue dye=任何è“色染料 +Any cyan dye=任何é’色染料 +Any grey dye=任何ç°è‰²æŸ“æ–™ +Any pink dye=任何粉色染料 +Any black dye=任何黑色染料 +Any brown dye=任何棕色染料 +Any green dye=任何绿色染料 +Any white dye=任何白色染料 +Any orange dye=任何橙色染料 +Any violet dye=任何紫色染料 +Any yellow dye=任何黄色染料 +Any magenta dye=任何å“红染料 +Any dark grey dye=ä»»ä½•æš—ç°æŸ“æ–™ +Any dark green dye=任何暗绿染料 +# Label for group ingredients +G= +Any item belonging to the group(s): @1=属于该组的任何项目:@1 +Unknown Item=未知项目 +Fuel=燃料 +Usage @1 of @2=用法@1,å…±@2个 +Recipe @1 of @2=é…æ–¹@1,共@2个 +Previous recipe=ä¸Šä¸€é…æ–¹ +Next recipe=䏋䏀酿–¹ +Recipe is too big to be displayed.=é…æ–¹å¤ªå¤§ï¼Œæ— æ³•显示 +Shapeless=没有形状 +Cooking time: @1=烹饪时间:@1 +Search=æœç´¢ +Reset=é‡ç½® +Previous page=上一页 +Next page=下一页 +No items to show.=没有项目å¯ä»¥æ˜¾ç¤ºã€‚ +No usages.=没有用法 +Click again to show recipes.=冿¬¡å•å‡»ä»¥æ˜¾ç¤ºé…æ–¹ã€‚ +No recipes.=æ²¡æœ‰é…æ–¹ã€‚ +Click again to show usages.=冿¬¡å•击以显示用法 +Recipes=é…æ–¹ diff --git a/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.zh_TW.tr b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.zh_TW.tr new file mode 100644 index 00000000..859cdfe6 --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/mtg_craftguide.zh_TW.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=任何煤炭 +Any sand=ä»»ä½•æ²™å­ +Any wool=任何羊毛 +Any stick=任何棒 +Any vessel=任何容器 +Any wood planks=ä»»ä½•æœ¨æ¿ +Any kind of stone block=任何種類的石塊 +Any red flower=任何紅色花朵 +Any blue flower=任何è—色花朵 +Any black flower=任何黑色花朵 +Any green flower=任何綠色花朵 +Any white flower=任何白色花朵 +Any orange flower=任何橙色花朵 +Any violet flower=任何紫色花朵 +Any yellow flower=任何黃色花朵 +Any red dye=任何紅色染料 +Any blue dye=任何è—色染料 +Any cyan dye=任何é’色染料 +Any grey dye=任何ç°è‰²æŸ“æ–™ +Any pink dye=任何粉色染料 +Any black dye=任何黑色染料 +Any brown dye=任何棕色染料 +Any green dye=任何綠色染料 +Any white dye=任何白色染料 +Any orange dye=任何橙色染料 +Any violet dye=任何紫色染料 +Any yellow dye=任何黃色染料 +Any magenta dye=任何å“紅染料 +Any dark grey dye=ä»»ä½•æš—ç°æŸ“æ–™ +Any dark green dye=任何暗綠染料 +# Label for group ingredients +G= +Any item belonging to the group(s): @1=屬於該組的任何項目:@1 +Unknown Item=未知項目 +Fuel=燃料 +Usage @1 of @2=用法@1,å…±@2個 +Recipe @1 of @2=é…æ–¹@1,共@2個 +Previous recipe=ä¸Šä¸€é…æ–¹ +Next recipe=䏋䏀酿–¹ +Recipe is too big to be displayed.=é…æ–¹å¤ªå¤§ï¼Œç„¡æ³•顯示 +Shapeless=沒有形狀 +Cooking time: @1=烹飪時間:@1 +Search=æœç´¢ +Reset=é‡ç½® +Previous page=ä¸Šä¸€é  +Next page=ä¸‹ä¸€é  +No items to show.=沒有項目å¯ä»¥é¡¯ç¤ºã€‚ +No usages.=沒有用法 +Click again to show recipes.=冿¬¡å–®æ“Šä»¥é¡¯ç¤ºé…方。 +No recipes.=æ²’æœ‰é…æ–¹ã€‚ +Click again to show usages.=冿¬¡å–®æ“Šä»¥é¡¯ç¤ºç”¨æ³• +Recipes=é…æ–¹ diff --git a/mods/minetest_game/mtg_craftguide/locale/template.txt b/mods/minetest_game/mtg_craftguide/locale/template.txt new file mode 100644 index 00000000..e02a721d --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/locale/template.txt @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal= +Any sand= +Any wool= +Any stick= +Any vessel= +Any wood planks= +Any kind of stone block= +Any red flower= +Any blue flower= +Any black flower= +Any green flower= +Any white flower= +Any orange flower= +Any violet flower= +Any yellow flower= +Any red dye= +Any blue dye= +Any cyan dye= +Any grey dye= +Any pink dye= +Any black dye= +Any brown dye= +Any green dye= +Any white dye= +Any orange dye= +Any violet dye= +Any yellow dye= +Any magenta dye= +Any dark grey dye= +Any dark green dye= +# Label for group ingredients +G= +Any item belonging to the group(s): @1= +Unknown Item= +Fuel= +Usage @1 of @2= +Recipe @1 of @2= +Previous recipe= +Next recipe= +Recipe is too big to be displayed.= +Shapeless= +Cooking time: @1= +Search= +Reset= +Previous page= +Next page= +No items to show.= +No usages.= +Click again to show recipes.= +No recipes.= +Click again to show usages.= +Recipes= diff --git a/mods/minetest_game/mtg_craftguide/mod.conf b/mods/minetest_game/mtg_craftguide/mod.conf new file mode 100644 index 00000000..3b2d975f --- /dev/null +++ b/mods/minetest_game/mtg_craftguide/mod.conf @@ -0,0 +1,3 @@ +name = mtg_craftguide +description = Minetest Game mod: mtg_craftguide +depends = sfinv diff --git a/mods/minetest_game/mtg_craftguide/textures/craftguide_clear_icon.png b/mods/minetest_game/mtg_craftguide/textures/craftguide_clear_icon.png new file mode 100644 index 00000000..1a0e513f Binary files /dev/null and b/mods/minetest_game/mtg_craftguide/textures/craftguide_clear_icon.png differ diff --git a/mods/minetest_game/mtg_craftguide/textures/craftguide_furnace.png b/mods/minetest_game/mtg_craftguide/textures/craftguide_furnace.png new file mode 100644 index 00000000..60d1a619 Binary files /dev/null and b/mods/minetest_game/mtg_craftguide/textures/craftguide_furnace.png differ diff --git a/mods/minetest_game/mtg_craftguide/textures/craftguide_next_icon.png b/mods/minetest_game/mtg_craftguide/textures/craftguide_next_icon.png new file mode 100644 index 00000000..266c9ba6 Binary files /dev/null and b/mods/minetest_game/mtg_craftguide/textures/craftguide_next_icon.png differ diff --git a/mods/minetest_game/mtg_craftguide/textures/craftguide_prev_icon.png b/mods/minetest_game/mtg_craftguide/textures/craftguide_prev_icon.png new file mode 100644 index 00000000..c8072961 Binary files /dev/null and b/mods/minetest_game/mtg_craftguide/textures/craftguide_prev_icon.png differ diff --git a/mods/minetest_game/mtg_craftguide/textures/craftguide_search_icon.png b/mods/minetest_game/mtg_craftguide/textures/craftguide_search_icon.png new file mode 100644 index 00000000..1c374cad Binary files /dev/null and b/mods/minetest_game/mtg_craftguide/textures/craftguide_search_icon.png differ diff --git a/mods/minetest_game/mtg_craftguide/textures/craftguide_shapeless.png b/mods/minetest_game/mtg_craftguide/textures/craftguide_shapeless.png new file mode 100644 index 00000000..51d8ce50 Binary files /dev/null and b/mods/minetest_game/mtg_craftguide/textures/craftguide_shapeless.png differ diff --git a/mods/minetest_game/player_api/README.txt b/mods/minetest_game/player_api/README.txt new file mode 100644 index 00000000..eade644a --- /dev/null +++ b/mods/minetest_game/player_api/README.txt @@ -0,0 +1,27 @@ +Minetest Game mod: player_api +============================= +See license.txt for license information. + +Provides an API to allow multiple mods to set player models and textures. +Also sets the default model, texture, and player flags. +This mod is only for content related to the Player API and the player object. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures, models and sounds) +---------------------------------------------- +Original model by MirceaKitsune (CC BY-SA 3.0). +Various alterations and fixes by kilbith, sofar, xunto, Rogier-5, TeTpaAka, Desour, +stujones11, An0n3m0us (CC BY-SA 3.0): + character.b3d + character.blend + +Jordach (CC BY-SA 3.0): + character.png + +celeron55, Perttu Ahola (CC BY-SA 3.0): + player.png + player_back.png diff --git a/mods/minetest_game/player_api/api.lua b/mods/minetest_game/player_api/api.lua new file mode 100644 index 00000000..6a572f55 --- /dev/null +++ b/mods/minetest_game/player_api/api.lua @@ -0,0 +1,239 @@ +player_api = {} + +-- Player animation blending +-- Note: This is currently broken due to a bug in Irrlicht, leave at 0 +local animation_blend = 0 + +player_api.registered_models = {} + +-- Local for speed. +local models = player_api.registered_models + +local function collisionbox_equals(collisionbox, other_collisionbox) + if collisionbox == other_collisionbox then + return true + end + for index = 1, 6 do + if collisionbox[index] ~= other_collisionbox[index] then + return false + end + end + return true +end + +function player_api.register_model(name, def) + models[name] = def + def.visual_size = def.visual_size or {x = 1, y = 1} + def.collisionbox = def.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3} + def.stepheight = def.stepheight or 0.6 + def.eye_height = def.eye_height or 1.47 + + -- Sort animations into property classes: + -- Animations with same properties have the same _equals value + for animation_name, animation in pairs(def.animations) do + animation.eye_height = animation.eye_height or def.eye_height + animation.collisionbox = animation.collisionbox or def.collisionbox + animation.override_local = animation.override_local or false + + for _, other_animation in pairs(def.animations) do + if other_animation._equals then + if collisionbox_equals(animation.collisionbox, other_animation.collisionbox) + and animation.eye_height == other_animation.eye_height then + animation._equals = other_animation._equals + break + end + end + end + animation._equals = animation._equals or animation_name + end +end + +-- Player stats and animations +-- model, textures, animation +local players = {} +player_api.player_attached = {} + +local function get_player_data(player) + return assert(players[player:get_player_name()]) +end + +function player_api.get_animation(player) + return get_player_data(player) +end + +-- Called when a player's appearance needs to be updated +function player_api.set_model(player, model_name) + local player_data = get_player_data(player) + if player_data.model == model_name then + return + end + -- Update data + player_data.model = model_name + -- Clear animation data as the model has changed + -- (required for setting the `stand` animation not to be a no-op) + player_data.animation, player_data.animation_speed, player_data.animation_loop = nil, nil, nil + + local model = models[model_name] + if model then + player:set_properties({ + mesh = model_name, + textures = player_data.textures or model.textures, + visual = "mesh", + visual_size = model.visual_size, + stepheight = model.stepheight + }) + -- sets local_animation, collisionbox & eye_height + player_api.set_animation(player, "stand") + else + player:set_properties({ + textures = {"player.png", "player_back.png"}, + visual = "upright_sprite", + visual_size = {x = 1, y = 2}, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3}, + stepheight = 0.6, + eye_height = 1.625, + }) + end +end + +function player_api.get_textures(player) + local player_data = get_player_data(player) + local model = models[player_data.model] + return assert(player_data.textures or (model and model.textures)) +end + +function player_api.set_textures(player, textures) + local player_data = get_player_data(player) + local model = models[player_data.model] + local new_textures = assert(textures or (model and model.textures)) + player_data.textures = new_textures + player:set_properties({textures = new_textures}) +end + +function player_api.set_texture(player, index, texture) + local textures = table.copy(player_api.get_textures(player)) + textures[index] = texture + player_api.set_textures(player, textures) +end + +function player_api.set_animation(player, anim_name, speed, loop) + local player_data = get_player_data(player) + local model = models[player_data.model] + if not (model and model.animations[anim_name]) then + return + end + speed = speed or model.animation_speed + if loop == nil then + loop = true + end + if player_data.animation == anim_name + and player_data.animation_speed == speed + and player_data.animation_loop == loop + then + return + end + local previous_anim = model.animations[player_data.animation] or {} + local anim = model.animations[anim_name] + player_data.animation = anim_name + player_data.animation_speed = speed + player_data.animation_loop = loop + -- If necessary change the local animation (only seen by the client of *that* player) + -- `override_local` <=> suspend local animations while this one is active + -- (this is basically a hack, proper engine feature needed...) + if anim.override_local ~= previous_anim.override_local then + if anim.override_local then + local none = {x=0, y=0} + player:set_local_animation(none, none, none, none, 1) + else + local a = model.animations -- (not specific to the animation being set) + player:set_local_animation( + a.stand, a.walk, a.mine, a.walk_mine, + model.animation_speed or 30 + ) + end + end + -- Set the animation seen by everyone else + player:set_animation(anim, speed, animation_blend, loop) + -- Update related properties if they changed + if anim._equals ~= previous_anim._equals then + player:set_properties({ + collisionbox = anim.collisionbox, + eye_height = anim.eye_height + }) + end +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + players[name] = {} + player_api.player_attached[name] = false +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + players[name] = nil + player_api.player_attached[name] = nil +end) + +-- Localize for better performance. +local player_set_animation = player_api.set_animation +local player_attached = player_api.player_attached + +-- Prevent knockback for attached players +local old_calculate_knockback = minetest.calculate_knockback +function minetest.calculate_knockback(player, ...) + if player_attached[player:get_player_name()] then + return 0 + end + return old_calculate_knockback(player, ...) +end + +-- Check each player and apply animations +function player_api.globalstep() + for _, player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local player_data = players[name] + local model = player_data and models[player_data.model] + if model and not player_attached[name] then + local controls = player:get_player_control() + local animation_speed_mod = model.animation_speed or 30 + + -- Determine if the player is sneaking, and reduce animation speed if so + if controls.sneak then + animation_speed_mod = animation_speed_mod / 2 + end + + -- Apply animations based on what the player is doing + if player:get_hp() == 0 then + player_set_animation(player, "lay") + elseif controls.up or controls.down or controls.left or controls.right then + if controls.LMB or controls.RMB then + player_set_animation(player, "walk_mine", animation_speed_mod) + else + player_set_animation(player, "walk", animation_speed_mod) + end + elseif controls.LMB or controls.RMB then + player_set_animation(player, "mine", animation_speed_mod) + else + player_set_animation(player, "stand", animation_speed_mod) + end + end + end +end + +-- Mods can modify the globalstep by overriding player_api.globalstep +minetest.register_globalstep(function(...) + player_api.globalstep(...) +end) + +for _, api_function in pairs({"get_animation", "set_animation", "set_model", "set_textures"}) do + local original_function = player_api[api_function] + player_api[api_function] = function(player, ...) + if not players[player:get_player_name()] then + -- HACK for keeping backwards compatibility + minetest.log("warning", api_function .. " called on offline player") + return + end + return original_function(player, ...) + end +end diff --git a/mods/minetest_game/player_api/init.lua b/mods/minetest_game/player_api/init.lua new file mode 100644 index 00000000..f258aea7 --- /dev/null +++ b/mods/minetest_game/player_api/init.lua @@ -0,0 +1,26 @@ +dofile(minetest.get_modpath("player_api") .. "/api.lua") + +-- Default player appearance +player_api.register_model("character.b3d", { + animation_speed = 30, + textures = {"character.png"}, + animations = { + -- Standard animations. + stand = {x = 0, y = 79}, + lay = {x = 162, y = 166, eye_height = 0.3, override_local = true, + collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}}, + walk = {x = 168, y = 187}, + mine = {x = 189, y = 198}, + walk_mine = {x = 200, y = 219}, + sit = {x = 81, y = 160, eye_height = 0.8, override_local = true, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}} + }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + stepheight = 0.6, + eye_height = 1.47, +}) + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + player_api.set_model(player, "character.b3d") +end) diff --git a/mods/minetest_game/player_api/license.txt b/mods/minetest_game/player_api/license.txt new file mode 100644 index 00000000..8ddb090e --- /dev/null +++ b/mods/minetest_game/player_api/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011 celeron55, Perttu Ahola +Copyright (C) 2011 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011 celeron55, Perttu Ahola +Copyright (C) 2012 MirceaKitsune +Copyright (C) 2012 Jordach +Copyright (C) 2015 kilbith +Copyright (C) 2016 sofar +Copyright (C) 2016 xunto +Copyright (C) 2016 Rogier-5 +Copyright (C) 2017 TeTpaAka +Copyright (C) 2017 Desour +Copyright (C) 2018 stujones11 +Copyright (C) 2019 An0n3m0us + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/player_api/mod.conf b/mods/minetest_game/player_api/mod.conf new file mode 100644 index 00000000..bf62327b --- /dev/null +++ b/mods/minetest_game/player_api/mod.conf @@ -0,0 +1,2 @@ +name = player_api +description = Minetest Game mod: Manages player visuals diff --git a/mods/minetest_game/player_api/models/character.b3d b/mods/minetest_game/player_api/models/character.b3d new file mode 100644 index 00000000..3e0827e4 Binary files /dev/null and b/mods/minetest_game/player_api/models/character.b3d differ diff --git a/mods/minetest_game/player_api/models/character.png b/mods/minetest_game/player_api/models/character.png new file mode 100644 index 00000000..05021781 Binary files /dev/null and b/mods/minetest_game/player_api/models/character.png differ diff --git a/mods/minetest_game/player_api/textures/player.png b/mods/minetest_game/player_api/textures/player.png new file mode 100644 index 00000000..6d61c434 Binary files /dev/null and b/mods/minetest_game/player_api/textures/player.png differ diff --git a/mods/minetest_game/player_api/textures/player_back.png b/mods/minetest_game/player_api/textures/player_back.png new file mode 100644 index 00000000..5e9ef054 Binary files /dev/null and b/mods/minetest_game/player_api/textures/player_back.png differ diff --git a/mods/minetest_game/screwdriver/README.txt b/mods/minetest_game/screwdriver/README.txt new file mode 100644 index 00000000..aa95e19f --- /dev/null +++ b/mods/minetest_game/screwdriver/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: screwdriver +============================== +See license.txt for license information. + +License of source code +---------------------- +Originally by RealBadAngel, Maciej Kasatkin (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +License of media (textures) +--------------------------- +Created by Gambit (CC BY-SA 3.0): + screwdriver.png diff --git a/mods/minetest_game/screwdriver/init.lua b/mods/minetest_game/screwdriver/init.lua new file mode 100644 index 00000000..e7227bf0 --- /dev/null +++ b/mods/minetest_game/screwdriver/init.lua @@ -0,0 +1,194 @@ +-- screwdriver/init.lua + +screwdriver = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("screwdriver") + + +screwdriver.ROTATE_FACE = 1 +screwdriver.ROTATE_AXIS = 2 +screwdriver.disallow = function(pos, node, user, mode, new_param2) + return false +end +screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end +end + +-- For attached wallmounted nodes: returns true if rotation is valid +-- simplified version of minetest:builtin/game/falling.lua#L148. +local function check_attached_node(pos, rotation) + local d = minetest.wallmounted_to_dir(rotation) + local p2 = vector.add(pos, d) + local n = minetest.get_node(p2).name + local def2 = minetest.registered_nodes[n] + if def2 and not def2.walkable then + return false + end + return true +end + +screwdriver.rotate = {} + +local facedir_tbl = { + [screwdriver.ROTATE_FACE] = { + [0] = 1, [1] = 2, [2] = 3, [3] = 0, + [4] = 5, [5] = 6, [6] = 7, [7] = 4, + [8] = 9, [9] = 10, [10] = 11, [11] = 8, + [12] = 13, [13] = 14, [14] = 15, [15] = 12, + [16] = 17, [17] = 18, [18] = 19, [19] = 16, + [20] = 21, [21] = 22, [22] = 23, [23] = 20, + }, + [screwdriver.ROTATE_AXIS] = { + [0] = 4, [1] = 4, [2] = 4, [3] = 4, + [4] = 8, [5] = 8, [6] = 8, [7] = 8, + [8] = 12, [9] = 12, [10] = 12, [11] = 12, + [12] = 16, [13] = 16, [14] = 16, [15] = 16, + [16] = 20, [17] = 20, [18] = 20, [19] = 20, + [20] = 0, [21] = 0, [22] = 0, [23] = 0, + }, +} + +screwdriver.rotate.facedir = function(pos, node, mode) + local rotation = node.param2 % 32 -- get first 5 bits + local other = node.param2 - rotation + rotation = facedir_tbl[mode][rotation] or 0 + return rotation + other +end + +screwdriver.rotate.colorfacedir = screwdriver.rotate.facedir + +screwdriver.rotate["4dir"] = function(pos, node, mode) + if mode ~= screwdriver.ROTATE_FACE then + -- Can only rotate 4dir nodes in face mode + return nil + end + local rotation = node.param2 % 4 -- get first 2 bits + local other = node.param2 - rotation + rotation = (rotation + 1) % 4 + return rotation + other +end + +screwdriver.rotate["color4dir"] = screwdriver.rotate["4dir"] + +local wallmounted_tbl = { + [screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1}, + [screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3} +} + +screwdriver.rotate.wallmounted = function(pos, node, mode) + local rotation = node.param2 % 8 -- get first 3 bits + local other = node.param2 - rotation + rotation = wallmounted_tbl[mode][rotation] or 0 + if minetest.get_item_group(node.name, "attached_node") ~= 0 then + -- find an acceptable orientation + for i = 1, 5 do + if not check_attached_node(pos, rotation) then + rotation = wallmounted_tbl[mode][rotation] or 0 + else + break + end + end + end + return rotation + other +end + +screwdriver.rotate.colorwallmounted = screwdriver.rotate.wallmounted + +-- Handles rotation +screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + local player_name = user and user:get_player_name() or "" + + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + -- can we rotate this paramtype2? + local fn = screwdriver.rotate[ndef.paramtype2] + if not fn and not ndef.on_rotate then + return itemstack + end + + local should_rotate = true + local new_param2 + if fn then + new_param2 = fn(pos, node, mode) + if not new_param2 then + -- rotation refused + return itemstack + end + else + new_param2 = node.param2 + end + + -- Node provides a handler, so let the handler decide instead if the node can be rotated + if ndef.on_rotate then + -- Copy pos and node because callback can modify it + local result = ndef.on_rotate(vector.new(pos), + {name = node.name, param1 = node.param1, param2 = node.param2}, + user, mode, new_param2) + if result == false then -- Disallow rotation + return itemstack + elseif result == true then + should_rotate = false + end + elseif ndef.on_rotate == false then + return itemstack + elseif ndef.can_dig and not ndef.can_dig(pos, user) then + return itemstack + end + + if should_rotate and new_param2 ~= node.param2 then + node.param2 = new_param2 + minetest.swap_node(pos, node) + minetest.check_for_falling(pos) + end + + if not minetest.is_creative_enabled(player_name) then + itemstack:add_wear_by_uses(uses or 200) + end + + return itemstack +end + +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = S("Screwdriver") .. "\n" .. S("(left-click rotates face, right-click rotates axis)"), + inventory_image = "screwdriver.png", + groups = {tool = 1}, + on_use = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 200) + return itemstack + end, +}) + + +minetest.register_craft({ + output = "screwdriver:screwdriver", + recipe = { + {"default:steel_ingot"}, + {"group:stick"} + } +}) + +minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver") diff --git a/mods/minetest_game/screwdriver/license.txt b/mods/minetest_game/screwdriver/license.txt new file mode 100644 index 00000000..cc5a28d3 --- /dev/null +++ b/mods/minetest_game/screwdriver/license.txt @@ -0,0 +1,50 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2013-2016 RealBadAngel, Maciej Kasatkin +Copyright (C) 2013-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2013-2016 Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.de.tr b/mods/minetest_game/screwdriver/locale/screwdriver.de.tr new file mode 100644 index 00000000..3c48ab4f --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.de.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Schraubendreher +(left-click rotates face, right-click rotates axis)=(Linksklick dreht Seite, Rechtsklick dreht Achse) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.eo.tr b/mods/minetest_game/screwdriver/locale/screwdriver.eo.tr new file mode 100644 index 00000000..7f8fedfa --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.eo.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=ÅœraÅ­bturnilo +(left-click rotates face, right-click rotates axis)=(maldekstra-klako turnas supraĵon, dekstra-klako turnas akson) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.es.tr b/mods/minetest_game/screwdriver/locale/screwdriver.es.tr new file mode 100644 index 00000000..868ffc34 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.es.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Destornillador +(left-click rotates face, right-click rotates axis)=(clic-izquierdo gira la cara, clic-derecho rota el eje) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.fr.tr b/mods/minetest_game/screwdriver/locale/screwdriver.fr.tr new file mode 100644 index 00000000..fe34a9b6 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.fr.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Tournevis +(left-click rotates face, right-click rotates axis)=(clic gauche pour changer de face, clic droit pour changer d'axe) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.id.tr b/mods/minetest_game/screwdriver/locale/screwdriver.id.tr new file mode 100644 index 00000000..ec83c794 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.id.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Obeng +(left-click rotates face, right-click rotates axis)=(klik kiri putar sisi, klik kanan putar sumbu) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.it.tr b/mods/minetest_game/screwdriver/locale/screwdriver.it.tr new file mode 100644 index 00000000..ff44b89f --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.it.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Cacciavite +(left-click rotates face, right-click rotates axis)=(click sinistro ruota la faccia, click destro ruota l'asse) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.ja.tr b/mods/minetest_game/screwdriver/locale/screwdriver.ja.tr new file mode 100644 index 00000000..55690f25 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.ja.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=ドライãƒãƒ¼ +(left-click rotates face, right-click rotates axis)=(左クリックã§é¢ãŒå›žè»¢ã€‚å³ã‚¯ãƒªãƒƒã‚¯ã§è»¸ãŒå›žè»¢) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.jbo.tr b/mods/minetest_game/screwdriver/locale/screwdriver.jbo.tr new file mode 100644 index 00000000..1a85bb61 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.jbo.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=lo lupcartci +(left-click rotates face, right-click rotates axis)=.i tu'a le zulselpevysmacu cu rinka lo nu le sefta cu carna@n.i tu'a le prityselpevysmacu cu rinka lo nu le jendu cu carna diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.lv.tr b/mods/minetest_game/screwdriver/locale/screwdriver.lv.tr new file mode 100644 index 00000000..3296dab5 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.lv.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=SkrÅ«vgrieznis +(left-click rotates face, right-click rotates axis)=(kreisais klikšķis rotÄ“ plakni, labais klikšķis rotÄ“ asi) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.ms.tr b/mods/minetest_game/screwdriver/locale/screwdriver.ms.tr new file mode 100644 index 00000000..f296fc52 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.ms.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Pemutar Skru +(left-click rotates face, right-click rotates axis)=(klik-kiri putar muka, klik-kanan putar paksi) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.pl.tr b/mods/minetest_game/screwdriver/locale/screwdriver.pl.tr new file mode 100644 index 00000000..3b4bfd6e --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.pl.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=ÅšrubokrÄ™t +(left-click rotates face, right-click rotates axis)=(lewy przycisk myszy obraca powierzchniÄ™, prawy przycisk myszy obraca oÅ›) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.pt_BR.tr b/mods/minetest_game/screwdriver/locale/screwdriver.pt_BR.tr new file mode 100644 index 00000000..3e89f40f --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Chave de fenda +(left-click rotates face, right-click rotates axis)=(Clique esquerdo rotaciona a face, clique direito rotaciona o eixo) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.ru.tr b/mods/minetest_game/screwdriver/locale/screwdriver.ru.tr new file mode 100644 index 00000000..d50ee760 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.ru.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Отвёртка +(left-click rotates face, right-click rotates axis)=(левый клик вращает грань, правый клик вращает оÑÑŒ) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.sk.tr b/mods/minetest_game/screwdriver/locale/screwdriver.sk.tr new file mode 100644 index 00000000..74cb4174 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.sk.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=SkrutkovaÄ +(left-click rotates face, right-click rotates axis)=(Ľavý klik otáÄa stranu, pravý klik otáÄa os) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.sv.tr b/mods/minetest_game/screwdriver/locale/screwdriver.sv.tr new file mode 100644 index 00000000..be440a76 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.sv.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Skruvmejsel +(left-click rotates face, right-click rotates axis)=(vänster-klick roterar ansikte, höger-klick roterar axeln) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.uk.tr b/mods/minetest_game/screwdriver/locale/screwdriver.uk.tr new file mode 100644 index 00000000..b88fc2a6 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.uk.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Викрутка +(left-click rotates face, right-click rotates axis)=(ЛКМ повертає грань, ПКМ — віÑÑŒ) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.zh_CN.tr b/mods/minetest_game/screwdriver/locale/screwdriver.zh_CN.tr new file mode 100644 index 00000000..caddf798 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=螺ä¸åˆ€ +(left-click rotates face, right-click rotates axis)=(左键å•击旋转é¢ï¼Œå³é”®å•击旋转轴) diff --git a/mods/minetest_game/screwdriver/locale/screwdriver.zh_TW.tr b/mods/minetest_game/screwdriver/locale/screwdriver.zh_TW.tr new file mode 100644 index 00000000..e638bfa0 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/screwdriver.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=螺絲刀 +(left-click rotates face, right-click rotates axis)=(左éµå–®æ“Šæ—‹è½‰é¢ï¼Œå³éµå–®æ“Šæ—‹è½‰è»¸ï¼‰ diff --git a/mods/minetest_game/screwdriver/locale/template.txt b/mods/minetest_game/screwdriver/locale/template.txt new file mode 100644 index 00000000..4cc8e2a6 --- /dev/null +++ b/mods/minetest_game/screwdriver/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver= +(left-click rotates face, right-click rotates axis)= diff --git a/mods/minetest_game/screwdriver/mod.conf b/mods/minetest_game/screwdriver/mod.conf new file mode 100644 index 00000000..306c52b5 --- /dev/null +++ b/mods/minetest_game/screwdriver/mod.conf @@ -0,0 +1,2 @@ +name = screwdriver +description = Minetest Game mod: screwdriver diff --git a/mods/minetest_game/screwdriver/textures/screwdriver.png b/mods/minetest_game/screwdriver/textures/screwdriver.png new file mode 100644 index 00000000..b2a56d55 Binary files /dev/null and b/mods/minetest_game/screwdriver/textures/screwdriver.png differ diff --git a/mods/minetest_game/sethome/README.txt b/mods/minetest_game/sethome/README.txt new file mode 100644 index 00000000..6f0a282b --- /dev/null +++ b/mods/minetest_game/sethome/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: sethome +========================== +See license.txt for license information. + +Authors of source code +---------------------- +sfan5 (MIT) diff --git a/mods/minetest_game/sethome/init.lua b/mods/minetest_game/sethome/init.lua new file mode 100644 index 00000000..19de9581 --- /dev/null +++ b/mods/minetest_game/sethome/init.lua @@ -0,0 +1,114 @@ +-- sethome/init.lua + +sethome = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("sethome") + + +local homes_file = minetest.get_worldpath() .. "/homes" +local homepos = {} + +local function loadhomes() + local input = io.open(homes_file, "r") + if not input then + return -- no longer an error + end + + -- Iterate over all stored positions in the format "x y z player" for each line + for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do + homepos[name] = minetest.string_to_pos(pos) + end + input:close() +end + +loadhomes() + +sethome.set = function(name, pos) + local player = minetest.get_player_by_name(name) + if not player or not pos then + return false + end + local player_meta = player:get_meta() + player_meta:set_string("sethome:home", minetest.pos_to_string(pos)) + + -- remove `name` from the old storage file + if not homepos[name] then + return true + end + local data = {} + local output = io.open(homes_file, "w") + if output then + homepos[name] = nil + for i, v in pairs(homepos) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i)) + end + output:write(table.concat(data)) + io.close(output) + return true + end + return true -- if the file doesn't exist - don't return an error. +end + +sethome.get = function(name) + local player = minetest.get_player_by_name(name) + if not player then + return false, S("This command can only be executed in-game!") + end + local player_meta = player:get_meta() + local pos = minetest.string_to_pos(player_meta:get_string("sethome:home")) + if pos then + return pos + end + + -- fetch old entry from storage table + pos = homepos[name] + if pos then + return vector.new(pos) + else + return nil + end +end + +sethome.go = function(name) + local pos = sethome.get(name) + local player = minetest.get_player_by_name(name) + if player and pos then + player:set_pos(pos) + return true + end + return false +end + +minetest.register_privilege("home", { + description = S("Can use /sethome and /home"), + give_to_singleplayer = false +}) + +minetest.register_chatcommand("home", { + description = S("Teleport you to your home point"), + privs = {home = true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then + return false, S("This command can only be executed in-game!") + end + if sethome.go(name) then + return true, S("Teleported to home!") + end + return false, S("Set a home using /sethome") + end, +}) + +minetest.register_chatcommand("sethome", { + description = S("Set your home point"), + privs = {home = true}, + func = function(name) + name = name or "" -- fallback to blank name if nil + local player = minetest.get_player_by_name(name) + if player and sethome.set(name, player:get_pos()) then + return true, S("Home set!") + end + return false, S("Player not found!") + end, +}) diff --git a/mods/minetest_game/sethome/license.txt b/mods/minetest_game/sethome/license.txt new file mode 100644 index 00000000..09f03b09 --- /dev/null +++ b/mods/minetest_game/sethome/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 sfan5 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/minetest_game/sethome/locale/sethome.de.tr b/mods/minetest_game/sethome/locale/sethome.de.tr new file mode 100644 index 00000000..c59b26ef --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.de.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Dieser Befehl kann nur im Spiel ausgeführt werden! +Can use /sethome and /home=Kann /sethome und /home benutzen +Teleport you to your home point=Teleportieren Sie sich zu Ihrem Zuhause-Punkt +Teleported to home!=Nach Hause teleportiert! +Set a home using /sethome=Ein Zuhause mit /sethome setzen +Set your home point=Ihren Zuhause-Punkt setzen +Home set!=Zuhause gesetzt! +Player not found!=Spieler nicht gefunden! diff --git a/mods/minetest_game/sethome/locale/sethome.eo.tr b/mods/minetest_game/sethome/locale/sethome.eo.tr new file mode 100644 index 00000000..86ef8149 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.eo.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Povas uzi /sethome kaj /home +Teleport you to your home point=Teletransporti vin al via hejmo +Teleported to home!=Teletransportita al hejmo! +Set a home using /sethome=Fiksi hejmon per /sethome +Set your home point=Fiksi vian hejman punkton +Home set!=Fiksita hejmo! +Player not found!=Ludanto ne troveblas! diff --git a/mods/minetest_game/sethome/locale/sethome.es.tr b/mods/minetest_game/sethome/locale/sethome.es.tr new file mode 100644 index 00000000..661bc621 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.es.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Puedes usar /sethome y /home +Teleport you to your home point=Teletranspórtate a tu hogar +Teleported to home!=¡Teletransportado a tu hogar! +Set a home using /sethome=Establece tu hogar usando /sethome +Set your home point=Establece el sitio de tu hogar +Home set!=¡Hogar establecido! +Player not found!=¡Jugador no encontrado! diff --git a/mods/minetest_game/sethome/locale/sethome.fr.tr b/mods/minetest_game/sethome/locale/sethome.fr.tr new file mode 100644 index 00000000..01345e0e --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.fr.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Cette commande peut seulement être exécutée en jeu ! +Can use /sethome and /home=Peut utiliser /sethome et /home +Teleport you to your home point=Vous téléporter à votre domicile +Teleported to home!=Téléporté à votre domicile ! +Set a home using /sethome=Définir un domicile en utilisant /sethome +Set your home point=Définir votre domicile +Home set!=Domicile défini ! +Player not found!=Joueur non trouvé ! diff --git a/mods/minetest_game/sethome/locale/sethome.id.tr b/mods/minetest_game/sethome/locale/sethome.id.tr new file mode 100644 index 00000000..f5c68ddb --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.id.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Perintah ini hanya bisa dijalankan dalam permainan! +Can use /sethome and /home=Boleh gunakan /sethome dan /home +Teleport you to your home point=Teleportasi ke rumah Anda +Teleported to home!=Teleportasi ke rumah! +Set a home using /sethome=Atur letak rumah dengan /sethome +Set your home point=Atur letak rumah +Home set!=Letak rumah diatur! +Player not found!=Pemain tidak ditemukan! diff --git a/mods/minetest_game/sethome/locale/sethome.it.tr b/mods/minetest_game/sethome/locale/sethome.it.tr new file mode 100644 index 00000000..4f1d7575 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.it.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Può usare /sethome e /home +Teleport you to your home point=Ti teletrasporta al tuo punto di domicilio +Teleported to home!=Teletrasportato a casa! +Set a home using /sethome=Imposta un domicilio usando /sethome +Set your home point=Imposta il tuo punto di domicilio +Home set!=Domicilio impostato! +Player not found!=Giocatore non trovato! diff --git a/mods/minetest_game/sethome/locale/sethome.ja.tr b/mods/minetest_game/sethome/locale/sethome.ja.tr new file mode 100644 index 00000000..e6523878 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.ja.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=/sethomeã¨/homeãŒä½¿ãˆã¾ã™ +Teleport you to your home point=ホーム地点ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ +Teleported to home!=ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆï¼ +Set a home using /sethome=/sethomeを使ã£ã¦ãƒ›ãƒ¼ãƒ ã‚’設定ã—ã¾ã™ +Set your home point=ホーム地点を設定ã—ã¾ã™ +Home set!=ãƒ›ãƒ¼ãƒ åœ°ç‚¹ã‚’ã‚»ãƒƒãƒˆï¼ +Player not found!=プレーヤーãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼ diff --git a/mods/minetest_game/sethome/locale/sethome.jbo.tr b/mods/minetest_game/sethome/locale/sethome.jbo.tr new file mode 100644 index 00000000..2fe7bf0d --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.jbo.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=kakne lo nu pilno lo me zoi gy./sethome.gy. ku .e lo me zoi gy./home.gy. +Teleport you to your home point=sukmu'u lo do zdani mokca +Teleported to home!=puba'o sukmu'u lo zdani +Set a home using /sethome=ko tcimi'e fi lo zdani sepi'o lo me zoi gy./sethome.gy. +Set your home point=tcimi'e fi lo do zdani mokca +Home set!=puba'o tcimi'e fi lo zdani +Player not found!=lo kelci na te facki diff --git a/mods/minetest_game/sethome/locale/sethome.lv.tr b/mods/minetest_game/sethome/locale/sethome.lv.tr new file mode 100644 index 00000000..e4b85972 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.lv.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Å Ä« komanda var tikt izpildÄ«ta tikai atrodoties spÄ“lÄ“! +Can use /sethome and /home=Var izmantot /sethome un /home +Teleport you to your home point=TeleportÄ“t jÅ«s uz mÄjas punktu +Teleported to home!=Esiet teleportÄ“ts mÄjÄs! +Set a home using /sethome=UzstÄdiet mÄju punktu izmantojot /sethome +Set your home point=UzstÄdiet savu mÄjas punktu +Home set!=MÄjas punkts uzstÄdÄ«ts! +Player not found!=SpÄ“lÄ“tÄjs nav atrasts! diff --git a/mods/minetest_game/sethome/locale/sethome.ms.tr b/mods/minetest_game/sethome/locale/sethome.ms.tr new file mode 100644 index 00000000..09721fef --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.ms.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Perintah ini hanya boleh dijalankan dalam permainan! +Can use /sethome and /home=Boleh guna /sethome dan /home +Teleport you to your home point=Teleportasikan anda ke titik rumah anda +Teleported to home!=Diteleportasikan ke rumah! +Set a home using /sethome=Tetapkan rumah menggunakan /sethome +Set your home point=Tetapkan titik rumah anda +Home set!=Rumah ditetapkan! +Player not found!=Pemain tidak dijumpai! diff --git a/mods/minetest_game/sethome/locale/sethome.pl.tr b/mods/minetest_game/sethome/locale/sethome.pl.tr new file mode 100644 index 00000000..b45cb463 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.pl.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Może używać /sethome i /home +Teleport you to your home point=Teleportuj siÄ™ do swojego punktu domowego +Teleported to home!=Teleportowano do punktu domowego +Set a home using /sethome=Ustaw punkt domowy używajÄ…c /sethome +Set your home point=Ustaw swój punkt domowy +Home set!=Punkt domowy ustawiony! +Player not found!=Gracz nie odnaleziony! diff --git a/mods/minetest_game/sethome/locale/sethome.pt_BR.tr b/mods/minetest_game/sethome/locale/sethome.pt_BR.tr new file mode 100644 index 00000000..6abd416d --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Pode usar /sethome e /home +Teleport you to your home point=Teletransportá-lo para seu ponto de origem +Teleported to home!=Teletransportado para o ponto de origem! +Set a home using /sethome=Defina um ponto de origem usando /sethome +Set your home point=Define seu ponto de origem +Home set!=Ponto de origem definido! +Player not found!=Jogador não encontrado! diff --git a/mods/minetest_game/sethome/locale/sethome.ru.tr b/mods/minetest_game/sethome/locale/sethome.ru.tr new file mode 100644 index 00000000..d68cf6e4 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.ru.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Эта команда может быть иÑпользована только в игре! +Can use /sethome and /home=ВозможноÑть иÑпользовать /sethome и /home +Teleport you to your home point=Ð’Ñ‹ телепортируетеÑÑŒ в Ñвою домашнюю точку +Teleported to home!=Ð’Ñ‹ телепортировалиÑÑŒ домой! +Set a home using /sethome=УÑтановите домашнюю точку, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ /sethome +Set your home point=УÑтановите вашу домашнюю точку +Home set!=ДомашнÑÑ Ñ‚Ð¾Ñ‡ÐºÐ° уÑтановлена! +Player not found!=Игрок не найден! diff --git a/mods/minetest_game/sethome/locale/sethome.sk.tr b/mods/minetest_game/sethome/locale/sethome.sk.tr new file mode 100644 index 00000000..c0e6cee8 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.sk.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=MôžeÅ¡ použivaÅ¥ /sethome a /home +Teleport you to your home point=Teleportuj sa domov +Teleported to home!=Teleportovaný domov! +Set a home using /sethome=Nastav si domov použitím /sethome +Set your home point=NastaviÅ¥ si domov +Home set!=Domov nastavený! +Player not found!=HrÃ¡Ä nenájdený! diff --git a/mods/minetest_game/sethome/locale/sethome.sv.tr b/mods/minetest_game/sethome/locale/sethome.sv.tr new file mode 100644 index 00000000..4e100b8b --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.sv.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Kan använda /sethome och /home +Teleport you to your home point=Teleportera dig till din hempunkt +Teleported to home!=Teleporterad hem! +Set a home using /sethome=Ställ in ett hem med /sethome +Set your home point=Ställ in din hempunkt +Home set!=Hem inställt! +Player not found!=Spelare finns inte! diff --git a/mods/minetest_game/sethome/locale/sethome.uk.tr b/mods/minetest_game/sethome/locale/sethome.uk.tr new file mode 100644 index 00000000..f17ac777 --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.uk.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Ð¦Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° може бути виконана тільки у грі! +Can use /sethome and /home=МожливіÑть викориÑÑ‚Ð°Ð½Ð½Ñ /sethome та /home +Teleport you to your home point=ТелепортуватиÑÑ Ð´Ð¾ домашньої точки +Teleported to home!=Телепортовано додому! +Set a home using /sethome=Ð’Ñтановіть домашню точку, викориÑтовуючи /sethome +Set your home point=Ð’Ñтановити домашню точку +Home set!=Домашню точку вÑтановлено! +Player not found!=Ð“Ñ€Ð°Ð²Ñ†Ñ Ð½Ðµ знайдено! diff --git a/mods/minetest_game/sethome/locale/sethome.zh_CN.tr b/mods/minetest_game/sethome/locale/sethome.zh_CN.tr new file mode 100644 index 00000000..6e05576b --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.zh_CN.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=该指令åªèƒ½åœ¨æ¸¸æˆå†…ä½¿ç”¨ï¼ +Can use /sethome and /home=å¯ä»¥ä½¿ç”¨/sethomeå’Œ/home +Teleport you to your home point=将您传é€åˆ°å®¶ +Teleported to home!=已传é€åˆ°å®¶ï¼ +Set a home using /sethome=使用/sethome设定家 +Set your home point=设定您家的地点 +Home set!=å·²è®¾å®šå®¶ï¼ +Player not found!=æœªæ‰¾åˆ°çŽ©å®¶ï¼ diff --git a/mods/minetest_game/sethome/locale/sethome.zh_TW.tr b/mods/minetest_game/sethome/locale/sethome.zh_TW.tr new file mode 100644 index 00000000..c5e455cc --- /dev/null +++ b/mods/minetest_game/sethome/locale/sethome.zh_TW.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=æ­¤æŒ‡ä»¤åƒ…èƒ½åœ¨æ¸¸æˆ²å†…ä½¿ç”¨ï¼ +Can use /sethome and /home=å¯ä»¥ä½¿ç”¨/sethomeå’Œ/home +Teleport you to your home point=傳逿‚¨åˆ°æ‚¨å®¶çš„地點 +Teleported to home!=已傳é€åˆ°å®¶ï¼ +Set a home using /sethome=使用/sethome設定家 +Set your home point=設定您家的地點 +Home set!=å·²è¨­å®šå®¶ï¼ +Player not found!=æœªæ‰¾åˆ°çŽ©å®¶ï¼ diff --git a/mods/minetest_game/sethome/locale/template.txt b/mods/minetest_game/sethome/locale/template.txt new file mode 100644 index 00000000..f91c719c --- /dev/null +++ b/mods/minetest_game/sethome/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home= +Teleport you to your home point= +Teleported to home!= +Set a home using /sethome= +Set your home point= +Home set!= +Player not found!= diff --git a/mods/minetest_game/sethome/mod.conf b/mods/minetest_game/sethome/mod.conf new file mode 100644 index 00000000..00799251 --- /dev/null +++ b/mods/minetest_game/sethome/mod.conf @@ -0,0 +1,2 @@ +name = sethome +description = Minetest Game mod: sethome diff --git a/mods/minetest_game/sfinv/README.txt b/mods/minetest_game/sfinv/README.txt new file mode 100644 index 00000000..2ef83863 --- /dev/null +++ b/mods/minetest_game/sfinv/README.txt @@ -0,0 +1,18 @@ +Minetest Game mod: sfinv +======================== +See license.txt for license information. + +Simple Fast Inventory. +A cleaner, simpler, solution to having an advanced inventory in Luanti. +See game_api.txt for this mod's API. +Available for use outside of MTG here: +https://forum.luanti.org/viewtopic.php?t=19765 + +Authors of source code +---------------------- +rubenwardy (MIT) + +Authors of media +---------------- +paramat (CC BY-SA 3.0): + sfinv_crafting_arrow.png - derived from a texture by BlockMen (CC BY-SA 3.0) diff --git a/mods/minetest_game/sfinv/api.lua b/mods/minetest_game/sfinv/api.lua new file mode 100644 index 00000000..1dbc44a9 --- /dev/null +++ b/mods/minetest_game/sfinv/api.lua @@ -0,0 +1,189 @@ +sfinv = { + pages = {}, + pages_unordered = {}, + contexts = {}, + enabled = true +} + +function sfinv.register_page(name, def) + assert(name, "Invalid sfinv page. Requires a name") + assert(def, "Invalid sfinv page. Requires a def[inition] table") + assert(def.get, "Invalid sfinv page. Def requires a get function.") + assert(not sfinv.pages[name], "Attempt to register already registered sfinv page " .. dump(name)) + + sfinv.pages[name] = def + def.name = name + table.insert(sfinv.pages_unordered, def) +end + +function sfinv.override_page(name, def) + assert(name, "Invalid sfinv page override. Requires a name") + assert(def, "Invalid sfinv page override. Requires a def[inition] table") + local page = sfinv.pages[name] + assert(page, "Attempt to override sfinv page " .. dump(name) .. " which does not exist.") + for key, value in pairs(def) do + page[key] = value + end +end + +function sfinv.get_nav_fs(player, context, nav, current_idx) + -- Only show tabs if there is more than one page + if #nav > 1 then + return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. + ";" .. current_idx .. ";true;false]" + else + return "" + end +end + +local theme_inv = [[ + image[0,5.2;1,1;gui_hb_bg.png] + image[1,5.2;1,1;gui_hb_bg.png] + image[2,5.2;1,1;gui_hb_bg.png] + image[3,5.2;1,1;gui_hb_bg.png] + image[4,5.2;1,1;gui_hb_bg.png] + image[5,5.2;1,1;gui_hb_bg.png] + image[6,5.2;1,1;gui_hb_bg.png] + image[7,5.2;1,1;gui_hb_bg.png] + list[current_player;main;0,5.2;8,1;] + list[current_player;main;0,6.35;8,3;8] + ]] + +function sfinv.make_formspec(player, context, content, show_inv, size) + local tmp = { + size or "size[8,9.1]", + sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), + show_inv and theme_inv or "", + content + } + return table.concat(tmp, "") +end + +function sfinv.get_homepage_name(player) + return "sfinv:crafting" +end + +function sfinv.get_formspec(player, context) + -- Generate navigation tabs + local nav = {} + local nav_ids = {} + local current_idx = 1 + for i, pdef in pairs(sfinv.pages_unordered) do + if not pdef.is_in_nav or pdef:is_in_nav(player, context) then + nav[#nav + 1] = pdef.title + nav_ids[#nav_ids + 1] = pdef.name + if pdef.name == context.page then + current_idx = #nav_ids + end + end + end + context.nav = nav_ids + context.nav_titles = nav + context.nav_idx = current_idx + + -- Generate formspec + local page = sfinv.pages[context.page] or sfinv.pages["404"] + if page then + return page:get(player, context) + else + local old_page = context.page + local home_page = sfinv.get_homepage_name(player) + + if old_page == home_page then + minetest.log("error", "[sfinv] Couldn't find " .. dump(old_page) .. + ", which is also the old page") + + return "" + end + + context.page = home_page + assert(sfinv.pages[context.page], "[sfinv] Invalid homepage") + minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. + " so switching to homepage") + + return sfinv.get_formspec(player, context) + end +end + +function sfinv.get_or_create_context(player) + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + context = { + page = sfinv.get_homepage_name(player) + } + sfinv.contexts[name] = context + end + return context +end + +function sfinv.set_context(player, context) + sfinv.contexts[player:get_player_name()] = context +end + +function sfinv.set_player_inventory_formspec(player, context) + local fs = sfinv.get_formspec(player, + context or sfinv.get_or_create_context(player)) + player:set_inventory_formspec(fs) +end + +function sfinv.set_page(player, pagename) + local context = sfinv.get_or_create_context(player) + local oldpage = sfinv.pages[context.page] + if oldpage and oldpage.on_leave then + oldpage:on_leave(player, context) + end + context.page = pagename + local page = sfinv.pages[pagename] + if page.on_enter then + page:on_enter(player, context) + end + sfinv.set_player_inventory_formspec(player, context) +end + +function sfinv.get_page(player) + local context = sfinv.contexts[player:get_player_name()] + return context and context.page or sfinv.get_homepage_name(player) +end + +minetest.register_on_joinplayer(function(player) + if sfinv.enabled then + sfinv.set_player_inventory_formspec(player) + end +end) + +minetest.register_on_leaveplayer(function(player) + sfinv.contexts[player:get_player_name()] = nil +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" or not sfinv.enabled then + return false + end + + -- Get Context + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + sfinv.set_player_inventory_formspec(player) + return false + end + + -- Was a tab selected? + if fields.sfinv_nav_tabs and context.nav then + local tid = tonumber(fields.sfinv_nav_tabs) + if tid and tid > 0 then + local id = context.nav[tid] + local page = sfinv.pages[id] + if id and page then + sfinv.set_page(player, id) + end + end + else + -- Pass event to page + local page = sfinv.pages[context.page] + if page and page.on_player_receive_fields then + return page:on_player_receive_fields(player, context, fields) + end + end +end) diff --git a/mods/minetest_game/sfinv/init.lua b/mods/minetest_game/sfinv/init.lua new file mode 100644 index 00000000..71e9ee70 --- /dev/null +++ b/mods/minetest_game/sfinv/init.lua @@ -0,0 +1,19 @@ +-- sfinv/init.lua + +dofile(minetest.get_modpath("sfinv") .. "/api.lua") + +-- Load support for MT game translation. +local S = minetest.get_translator("sfinv") + +sfinv.register_page("sfinv:crafting", { + title = S("Crafting"), + get = function(self, player, context) + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;sfinv_crafting_arrow.png] + listring[current_player;main] + listring[current_player;craft] + ]], true) + end +}) diff --git a/mods/minetest_game/sfinv/license.txt b/mods/minetest_game/sfinv/license.txt new file mode 100644 index 00000000..6676d74e --- /dev/null +++ b/mods/minetest_game/sfinv/license.txt @@ -0,0 +1,59 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2016-2018 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +License of media +---------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2019 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/sfinv/locale/sfinv.de.tr b/mods/minetest_game/sfinv/locale/sfinv.de.tr new file mode 100644 index 00000000..044e9ba9 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.de.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Fertigung diff --git a/mods/minetest_game/sfinv/locale/sfinv.eo.tr b/mods/minetest_game/sfinv/locale/sfinv.eo.tr new file mode 100644 index 00000000..1fac1adc --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.eo.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Konstruado diff --git a/mods/minetest_game/sfinv/locale/sfinv.es.tr b/mods/minetest_game/sfinv/locale/sfinv.es.tr new file mode 100644 index 00000000..d3d66091 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.es.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Creación diff --git a/mods/minetest_game/sfinv/locale/sfinv.fr.tr b/mods/minetest_game/sfinv/locale/sfinv.fr.tr new file mode 100644 index 00000000..58ead969 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.fr.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Artisanat diff --git a/mods/minetest_game/sfinv/locale/sfinv.id.tr b/mods/minetest_game/sfinv/locale/sfinv.id.tr new file mode 100644 index 00000000..643196e1 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.id.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Kerajinan diff --git a/mods/minetest_game/sfinv/locale/sfinv.it.tr b/mods/minetest_game/sfinv/locale/sfinv.it.tr new file mode 100644 index 00000000..e449b752 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.it.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Assemblaggio diff --git a/mods/minetest_game/sfinv/locale/sfinv.ja.tr b/mods/minetest_game/sfinv/locale/sfinv.ja.tr new file mode 100644 index 00000000..04122d72 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.ja.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=クラフト diff --git a/mods/minetest_game/sfinv/locale/sfinv.jbo.tr b/mods/minetest_game/sfinv/locale/sfinv.jbo.tr new file mode 100644 index 00000000..0ff0328e --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.jbo.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=nu zbasu diff --git a/mods/minetest_game/sfinv/locale/sfinv.lv.tr b/mods/minetest_game/sfinv/locale/sfinv.lv.tr new file mode 100644 index 00000000..58da91de --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.lv.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Taisīšana diff --git a/mods/minetest_game/sfinv/locale/sfinv.ms.tr b/mods/minetest_game/sfinv/locale/sfinv.ms.tr new file mode 100644 index 00000000..f62ba8ab --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.ms.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Pertukangan diff --git a/mods/minetest_game/sfinv/locale/sfinv.pl.tr b/mods/minetest_game/sfinv/locale/sfinv.pl.tr new file mode 100644 index 00000000..6230d82d --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.pl.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Konstruowanie diff --git a/mods/minetest_game/sfinv/locale/sfinv.pt_BR.tr b/mods/minetest_game/sfinv/locale/sfinv.pt_BR.tr new file mode 100644 index 00000000..f9e57ae7 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Construir diff --git a/mods/minetest_game/sfinv/locale/sfinv.ru.tr b/mods/minetest_game/sfinv/locale/sfinv.ru.tr new file mode 100644 index 00000000..d7c11b2f --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.ru.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Крафтинг diff --git a/mods/minetest_game/sfinv/locale/sfinv.sk.tr b/mods/minetest_game/sfinv/locale/sfinv.sk.tr new file mode 100644 index 00000000..18566f13 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.sk.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Vytváranie diff --git a/mods/minetest_game/sfinv/locale/sfinv.sv.tr b/mods/minetest_game/sfinv/locale/sfinv.sv.tr new file mode 100644 index 00000000..df426b66 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.sv.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Tillverkning diff --git a/mods/minetest_game/sfinv/locale/sfinv.uk.tr b/mods/minetest_game/sfinv/locale/sfinv.uk.tr new file mode 100644 index 00000000..aff94202 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.uk.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=МайÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ diff --git a/mods/minetest_game/sfinv/locale/sfinv.zh_CN.tr b/mods/minetest_game/sfinv/locale/sfinv.zh_CN.tr new file mode 100644 index 00000000..3ec3c729 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.zh_CN.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=åˆæˆ diff --git a/mods/minetest_game/sfinv/locale/sfinv.zh_TW.tr b/mods/minetest_game/sfinv/locale/sfinv.zh_TW.tr new file mode 100644 index 00000000..3ec3c729 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/sfinv.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=åˆæˆ diff --git a/mods/minetest_game/sfinv/locale/template.txt b/mods/minetest_game/sfinv/locale/template.txt new file mode 100644 index 00000000..ace55196 --- /dev/null +++ b/mods/minetest_game/sfinv/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting= diff --git a/mods/minetest_game/sfinv/mod.conf b/mods/minetest_game/sfinv/mod.conf new file mode 100644 index 00000000..2934435f --- /dev/null +++ b/mods/minetest_game/sfinv/mod.conf @@ -0,0 +1,2 @@ +name = sfinv +description = Minetest Game mod: sfinv diff --git a/mods/minetest_game/sfinv/textures/sfinv_crafting_arrow.png b/mods/minetest_game/sfinv/textures/sfinv_crafting_arrow.png new file mode 100644 index 00000000..42bba581 Binary files /dev/null and b/mods/minetest_game/sfinv/textures/sfinv_crafting_arrow.png differ diff --git a/mods/minetest_game/spawn/README.txt b/mods/minetest_game/spawn/README.txt new file mode 100644 index 00000000..fc16c2a6 --- /dev/null +++ b/mods/minetest_game/spawn/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: spawn +======================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) diff --git a/mods/minetest_game/spawn/api.lua b/mods/minetest_game/spawn/api.lua new file mode 100644 index 00000000..bffe32a3 --- /dev/null +++ b/mods/minetest_game/spawn/api.lua @@ -0,0 +1,49 @@ +spawn = {} + +-- provide empty default implementations + +function spawn.get_default_pos() + return nil +end + +function spawn.add_suitable_biome(biome) +end + +-- Callback registration + +spawn.registered_on_spawn = {} + +function spawn.register_on_spawn(func) + table.insert(spawn.registered_on_spawn, func) +end + +-- Logic run on spawn + +local use_engine_spawn = minetest.settings:get("static_spawnpoint") or + minetest.settings:get_bool("engine_spawn") + +local function on_spawn(player, is_new) + -- Ask all callbacks first + for _, cb in ipairs(spawn.registered_on_spawn) do + if cb(player, is_new) then + return true + end + end + -- Fall back to default spawn + if not use_engine_spawn then + local pos = spawn.get_default_pos() + if pos then + player:set_pos(pos) + return true + end + end + return false +end + +minetest.register_on_newplayer(function(player) + on_spawn(player, true) +end) + +minetest.register_on_respawnplayer(function(player) + return on_spawn(player, false) +end) diff --git a/mods/minetest_game/spawn/init.lua b/mods/minetest_game/spawn/init.lua new file mode 100644 index 00000000..b439997f --- /dev/null +++ b/mods/minetest_game/spawn/init.lua @@ -0,0 +1,135 @@ +-- Always load the API +---------------------- +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/api.lua") + +-- Disable biome-search implementation on unsuitable mapgens +------------------------------------------------------------ + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" then + return +end + + +-- Parameters +------------- + +-- Resolution of search grid in nodes. +local res = 64 +-- Number of points checked in the square search grid (edge * edge). +local checks = 128 * 128 +-- Starting point for biome checks. This also sets the y co-ordinate for all +-- points checked, so the suitable biomes must be active at this y. +local pos = {x = 0, y = 8, z = 0} + + +-- Table of suitable biomes and matching API function + +local biome_ids = {} + +function spawn.add_suitable_biome(biome) + local id = minetest.get_biome_id(biome) + assert(id ~= nil) + biome_ids[id] = true +end + +for _, name in ipairs({ + "taiga", "coniferous_forest", "deciduous_forest", "grassland", "savanna" +}) do + local id = minetest.get_biome_id(name) + if id then + biome_ids[id] = true + end +end + +-- End of parameters +-------------------- + +-- Direction table + +local dirs = { + vector.new(0, 0, 1), + vector.new(-1, 0, 0), + vector.new(0, 0, -1), + vector.new(1, 0, 0), +} + + +-- Initial variables + +local edge_len = 1 +local edge_dist = 0 +local dir_step = 0 +local dir_ind = 1 +local searched = false +local success = false +local spawn_pos = {} + + +-- Get world 'mapgen_limit' and 'chunksize' to calculate 'spawn_limit'. +-- This accounts for how mapchunks are not generated if they or their shell exceed +-- 'mapgen_limit'. + +local mapgen_limit = tonumber(minetest.get_mapgen_setting("mapgen_limit")) +local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) +local spawn_limit = math.max(mapgen_limit - (chunksize + 1) * 16, 0) + + +-- Functions +------------ + +-- Get next position on square search spiral + +local function next_pos() + if edge_dist == edge_len then + edge_dist = 0 + dir_ind = dir_ind + 1 + if dir_ind == 5 then + dir_ind = 1 + end + dir_step = dir_step + 1 + edge_len = math.floor(dir_step / 2) + 1 + end + + local dir = dirs[dir_ind] + local move = vector.multiply(dir, res) + + edge_dist = edge_dist + 1 + + return vector.add(pos, move) +end + + +-- Spawn position search + +local function search() + for iter = 1, checks do + local biome_data = minetest.get_biome_data(pos) + -- Sometimes biome_data is nil + if biome_data and biome_ids[biome_data.biome] then + local spawn_y = minetest.get_spawn_level(pos.x, pos.z) + if spawn_y then + spawn_pos = vector.new(pos.x, spawn_y, pos.z) + return true + end + end + + pos = next_pos() + -- Check for position being outside world edge + if math.abs(pos.x) > spawn_limit or math.abs(pos.z) > spawn_limit then + return false + end + end + + return false +end + + +function spawn.get_default_pos() + -- Search for spawn position once per server session + if not searched then + success = search() + searched = true + end + return success and spawn_pos +end diff --git a/mods/minetest_game/spawn/license.txt b/mods/minetest_game/spawn/license.txt new file mode 100644 index 00000000..a466aabd --- /dev/null +++ b/mods/minetest_game/spawn/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/minetest_game/spawn/mod.conf b/mods/minetest_game/spawn/mod.conf new file mode 100644 index 00000000..7a09d4a5 --- /dev/null +++ b/mods/minetest_game/spawn/mod.conf @@ -0,0 +1,3 @@ +name = spawn +description = Minetest Game mod: spawn +depends = default diff --git a/mods/minetest_game/stairs/README.txt b/mods/minetest_game/stairs/README.txt new file mode 100644 index 00000000..e684aed9 --- /dev/null +++ b/mods/minetest_game/stairs/README.txt @@ -0,0 +1,27 @@ +Minetest Game mod: stairs +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Kahrl (LGPLv2.1+) and +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- + +Textures +-------- +Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0): + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_outer_stairside.png + stairs_obsidian_glass_stairside.png + +Copyright (c) 2018 TumeniNodes (CC BY-SA 3.0): + Derived from a texture by celeron55 (CC BY-SA 3.0) and + converted to bright white by Krock (CC BY-SA 3.0): + stairs_glass_stairside.png + stairs_glass_split.png + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_split.png diff --git a/mods/minetest_game/stairs/init.lua b/mods/minetest_game/stairs/init.lua new file mode 100644 index 00000000..05017a17 --- /dev/null +++ b/mods/minetest_game/stairs/init.lua @@ -0,0 +1,1077 @@ +-- stairs/init.lua + +-- Minetest Game mod: stairs +-- See README.txt for licensing and other information. + + +-- Global namespace for functions + +stairs = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("stairs") +-- Same as S, but will be ignored by translation file update scripts +local T = S + + +-- Register aliases for new pine node names + +minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood") +minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") + + +-- Get setting for replace ABM + +local replace = minetest.settings:get_bool("enable_stairs_replace_abm") + +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + if placer then + local placer_pos = placer:get_pos() + if placer_pos then + local diff = vector.subtract(p1, placer_pos) + param2 = minetest.dir_to_facedir(diff) + -- The player places a node on the side face of the node he is standing on + if p0.y == p1.y and math.abs(diff.x) <= 0.5 and math.abs(diff.z) <= 0.5 and diff.y < 0 then + -- reverse node direction + param2 = (param2 + 2) % 4 + end + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end + +local function warn_if_exists(nodename) + if minetest.registered_nodes[nodename] then + minetest.log("warning", "Overwriting stairs node: " .. nodename) + end +end + +-- Set backface culling and world-aligned textures +local function set_textures(images, worldaligntex) + if worldaligntex == nil then + worldaligntex = true + end + + local stair_images = {} + for i, image in ipairs(images) do + stair_images[i] = type(image) == "string" and {name = image} or table.copy(image) + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if worldaligntex and stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end + end + return stair_images +end + +-- Register stair +-- Node will be called stairs:stair_ + +function stairs.register_stair(subname, recipeitem, groups, images, description, + sounds, worldaligntex) + local def = minetest.registered_nodes[recipeitem] or {} + local stair_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.stair = 1 + warn_if_exists("stairs:stair_" .. subname) + minetest.register_node(":stairs:stair_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = stair_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:stair_" .. subname .. "upside_down", { + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + -- Recipe matches appearence in inventory + minetest.register_craft({ + output = "stairs:stair_" .. subname .. " 8", + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Use stairs to craft full blocks again (1:1) + minetest.register_craft({ + output = recipeitem .. " 3", + recipe = { + {"stairs:stair_" .. subname, "stairs:stair_" .. subname}, + {"stairs:stair_" .. subname, "stairs:stair_" .. subname}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:stair_" .. subname, + burntime = math.floor(baseburntime * 0.75), + }) + end + end +end + + +-- Register slab +-- Node will be called stairs:slab_ + +function stairs.register_slab(subname, recipeitem, groups, images, description, + sounds, worldaligntex) + local def = minetest.registered_nodes[recipeitem] or {} + local slab_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.slab = 1 + warn_if_exists("stairs:slab_" .. subname) + minetest.register_node(":stairs:slab_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = slab_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_place = function(itemstack, placer, pointed_thing) + local under = minetest.get_node(pointed_thing.under) + local wield_item = itemstack:get_name() + local player_name = placer and placer:get_player_name() or "" + + if under and under.name:find("^stairs:slab_") then + -- place slab using under node orientation + local dir = minetest.dir_to_facedir(vector.subtract( + pointed_thing.above, pointed_thing.under), true) + + local p2 = under.param2 + + -- Placing a slab on an upside down slab should make it right-side up. + if p2 >= 20 and dir == 8 then + p2 = p2 - 20 + -- same for the opposite case: slab below normal slab + elseif p2 <= 3 and dir == 4 then + p2 = p2 + 20 + end + + -- else attempt to place node with proper param2 + minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + else + return rotate_and_place(itemstack, placer, pointed_thing) + end + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:slab_" .. subname .. "upside_down", { + replace_name = "stairs:slab_".. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + minetest.register_craft({ + output = "stairs:slab_" .. subname .. " 6", + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Use 2 slabs to craft a full block again (1:1) + minetest.register_craft({ + output = recipeitem, + recipe = { + {"stairs:slab_" .. subname}, + {"stairs:slab_" .. subname}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:slab_" .. subname, + burntime = math.floor(baseburntime * 0.5), + }) + end + end +end + + +-- Optionally replace old "upside_down" nodes with new param2 versions. +-- Disabled by default. + +if replace then + minetest.register_abm({ + label = "Slab replace", + nodenames = {"group:slabs_replace"}, + interval = 16, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, + }) +end + + +-- Register inner stair +-- Node will be called stairs:stair_inner_ + +function stairs.register_stair_inner(subname, recipeitem, groups, images, + description, sounds, worldaligntex, full_description) + local def = minetest.registered_nodes[recipeitem] or {} + local stair_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.stair = 1 + if full_description then + description = full_description + else + description = "Inner " .. description + end + warn_if_exists("stairs:stair_inner_" .. subname) + minetest.register_node(":stairs:stair_inner_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = stair_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, + {-0.5, 0.0, -0.5, 0.0, 0.5, 0.0}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + if recipeitem then + minetest.register_craft({ + output = "stairs:stair_inner_" .. subname .. " 7", + recipe = { + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:stair_inner_" .. subname, + burntime = math.floor(baseburntime * 0.875), + }) + end + end +end + + +-- Register outer stair +-- Node will be called stairs:stair_outer_ + +function stairs.register_stair_outer(subname, recipeitem, groups, images, + description, sounds, worldaligntex, full_description) + local def = minetest.registered_nodes[recipeitem] or {} + local stair_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.stair = 1 + if full_description then + description = full_description + else + description = "Outer " .. description + end + warn_if_exists("stairs:stair_outer_" .. subname) + minetest.register_node(":stairs:stair_outer_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = stair_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.0, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + if recipeitem then + minetest.register_craft({ + output = "stairs:stair_outer_" .. subname .. " 6", + recipe = { + {"", recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:stair_outer_" .. subname, + burntime = math.floor(baseburntime * 0.625), + }) + end + end +end + + +-- Stair/slab registration function. +-- Nodes will be called stairs:{stair,slab}_ + +function stairs.register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex, + desc_stair_inner, desc_stair_outer) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_stair_inner(subname, recipeitem, groups, images, + desc_stair, sounds, worldaligntex, desc_stair_inner) + stairs.register_stair_outer(subname, recipeitem, groups, images, + desc_stair, sounds, worldaligntex, desc_stair_outer) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, + sounds, worldaligntex) +end + +-- Local function so we can apply translations +local function my_register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex) + stairs.register_stair(subname, recipeitem, groups, images, S(desc_stair), + sounds, worldaligntex) + stairs.register_stair_inner(subname, recipeitem, groups, images, "", + sounds, worldaligntex, T("Inner " .. desc_stair)) + stairs.register_stair_outer(subname, recipeitem, groups, images, "", + sounds, worldaligntex, T("Outer " .. desc_stair)) + stairs.register_slab(subname, recipeitem, groups, images, S(desc_slab), + sounds, worldaligntex) +end + + +-- Register default stairs and slabs + +my_register_stair_and_slab( + "wood", + "default:wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_wood.png"}, + "Wooden Stair", + "Wooden Slab", + default.node_sound_wood_defaults(), + true +) + +my_register_stair_and_slab( + "junglewood", + "default:junglewood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_junglewood.png"}, + "Jungle Wood Stair", + "Jungle Wood Slab", + default.node_sound_wood_defaults(), + true +) + +my_register_stair_and_slab( + "pine_wood", + "default:pine_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_pine_wood.png"}, + "Pine Wood Stair", + "Pine Wood Slab", + default.node_sound_wood_defaults(), + true +) + +my_register_stair_and_slab( + "acacia_wood", + "default:acacia_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_acacia_wood.png"}, + "Acacia Wood Stair", + "Acacia Wood Slab", + default.node_sound_wood_defaults(), + true +) + +my_register_stair_and_slab( + "aspen_wood", + "default:aspen_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_aspen_wood.png"}, + "Aspen Wood Stair", + "Aspen Wood Slab", + default.node_sound_wood_defaults(), + true +) + +my_register_stair_and_slab( + "stone", + "default:stone", + {cracky = 3}, + {"default_stone.png"}, + "Stone Stair", + "Stone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "cobble", + "default:cobble", + {cracky = 3}, + {"default_cobble.png"}, + "Cobblestone Stair", + "Cobblestone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "mossycobble", + "default:mossycobble", + {cracky = 3}, + {"default_mossycobble.png"}, + "Mossy Cobblestone Stair", + "Mossy Cobblestone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "stonebrick", + "default:stonebrick", + {cracky = 2}, + {"default_stone_brick.png"}, + "Stone Brick Stair", + "Stone Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "stone_block", + "default:stone_block", + {cracky = 2}, + {"default_stone_block.png"}, + "Stone Block Stair", + "Stone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_stone", + "default:desert_stone", + {cracky = 3}, + {"default_desert_stone.png"}, + "Desert Stone Stair", + "Desert Stone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_cobble", + "default:desert_cobble", + {cracky = 3}, + {"default_desert_cobble.png"}, + "Desert Cobblestone Stair", + "Desert Cobblestone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_stonebrick", + "default:desert_stonebrick", + {cracky = 2}, + {"default_desert_stone_brick.png"}, + "Desert Stone Brick Stair", + "Desert Stone Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_stone_block", + "default:desert_stone_block", + {cracky = 2}, + {"default_desert_stone_block.png"}, + "Desert Stone Block Stair", + "Desert Stone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "sandstone", + "default:sandstone", + {crumbly = 1, cracky = 3}, + {"default_sandstone.png"}, + "Sandstone Stair", + "Sandstone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "sandstonebrick", + "default:sandstonebrick", + {cracky = 2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick Stair", + "Sandstone Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "sandstone_block", + "default:sandstone_block", + {cracky = 2}, + {"default_sandstone_block.png"}, + "Sandstone Block Stair", + "Sandstone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_sandstone", + "default:desert_sandstone", + {crumbly = 1, cracky = 3}, + {"default_desert_sandstone.png"}, + "Desert Sandstone Stair", + "Desert Sandstone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_sandstone_brick", + "default:desert_sandstone_brick", + {cracky = 2}, + {"default_desert_sandstone_brick.png"}, + "Desert Sandstone Brick Stair", + "Desert Sandstone Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_sandstone_block", + "default:desert_sandstone_block", + {cracky = 2}, + {"default_desert_sandstone_block.png"}, + "Desert Sandstone Block Stair", + "Desert Sandstone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "silver_sandstone", + "default:silver_sandstone", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone.png"}, + "Silver Sandstone Stair", + "Silver Sandstone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "silver_sandstone_brick", + "default:silver_sandstone_brick", + {cracky = 2}, + {"default_silver_sandstone_brick.png"}, + "Silver Sandstone Brick Stair", + "Silver Sandstone Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "silver_sandstone_block", + "default:silver_sandstone_block", + {cracky = 2}, + {"default_silver_sandstone_block.png"}, + "Silver Sandstone Block Stair", + "Silver Sandstone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "obsidian", + "default:obsidian", + {cracky = 1, level = 2}, + {"default_obsidian.png"}, + "Obsidian Stair", + "Obsidian Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "obsidianbrick", + "default:obsidianbrick", + {cracky = 1, level = 2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Stair", + "Obsidian Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "obsidian_block", + "default:obsidian_block", + {cracky = 1, level = 2}, + {"default_obsidian_block.png"}, + "Obsidian Block Stair", + "Obsidian Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "brick", + "default:brick", + {cracky = 3}, + {"default_brick.png"}, + "Brick Stair", + "Brick Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "steelblock", + "default:steelblock", + {cracky = 1, level = 2}, + {"default_steel_block.png"}, + "Steel Block Stair", + "Steel Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "tinblock", + "default:tinblock", + {cracky = 1, level = 2}, + {"default_tin_block.png"}, + "Tin Block Stair", + "Tin Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "copperblock", + "default:copperblock", + {cracky = 1, level = 2}, + {"default_copper_block.png"}, + "Copper Block Stair", + "Copper Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "bronzeblock", + "default:bronzeblock", + {cracky = 1, level = 2}, + {"default_bronze_block.png"}, + "Bronze Block Stair", + "Bronze Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "goldblock", + "default:goldblock", + {cracky = 1}, + {"default_gold_block.png"}, + "Gold Block Stair", + "Gold Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "ice", + "default:ice", + {cracky = 3, cools_lava = 1, slippery = 3}, + {"default_ice.png"}, + "Ice Stair", + "Ice Slab", + default.node_sound_ice_defaults(), + true +) + +my_register_stair_and_slab( + "snowblock", + "default:snowblock", + {crumbly = 3, cools_lava = 1, snowy = 1}, + {"default_snow.png"}, + "Snow Block Stair", + "Snow Block Slab", + default.node_sound_snow_defaults(), + true +) + +-- Glass stair nodes need to be registered individually to utilize specialized textures. + +stairs.register_stair( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"stairs_glass_split.png", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", + "default_glass.png", "stairs_glass_split.png"}, + S("Glass Stair"), + default.node_sound_glass_defaults(), + true +) + +stairs.register_slab( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, + S("Glass Slab"), + default.node_sound_glass_defaults(), + true +) + +stairs.register_stair_inner( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"stairs_glass_stairside.png^[transformR270", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "default_glass.png", + "default_glass.png", "stairs_glass_stairside.png"}, + "", + default.node_sound_glass_defaults(), + true, + S("Inner Glass Stair") +) + +stairs.register_stair_outer( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"stairs_glass_stairside.png^[transformR90", "default_glass.png", + "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", + "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, + "", + default.node_sound_glass_defaults(), + true, + S("Outer Glass Stair") +) + +stairs.register_stair( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + S("Obsidian Glass Stair"), + default.node_sound_glass_defaults(), + true +) + +stairs.register_slab( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + S("Obsidian Glass Slab"), + default.node_sound_glass_defaults(), + true +) + +stairs.register_stair_inner( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"}, + "", + default.node_sound_glass_defaults(), + true, + S("Inner Obsidian Glass Stair") +) + +stairs.register_stair_outer( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png", + "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png", + "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"}, + "", + default.node_sound_glass_defaults(), + true, + S("Outer Obsidian Glass Stair") +) + +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this add this code to my_register_stair_and_slab: +-- for _,x in ipairs({"","Inner ","Outer "}) do print(("S(%q)"):format(x..desc_stair)) end +-- print(("S(%q)"):format(desc_slab)) + +--[[ +S("Wooden Stair") +S("Inner Wooden Stair") +S("Outer Wooden Stair") +S("Wooden Slab") +S("Jungle Wood Stair") +S("Inner Jungle Wood Stair") +S("Outer Jungle Wood Stair") +S("Jungle Wood Slab") +S("Pine Wood Stair") +S("Inner Pine Wood Stair") +S("Outer Pine Wood Stair") +S("Pine Wood Slab") +S("Acacia Wood Stair") +S("Inner Acacia Wood Stair") +S("Outer Acacia Wood Stair") +S("Acacia Wood Slab") +S("Aspen Wood Stair") +S("Inner Aspen Wood Stair") +S("Outer Aspen Wood Stair") +S("Aspen Wood Slab") +S("Stone Stair") +S("Inner Stone Stair") +S("Outer Stone Stair") +S("Stone Slab") +S("Cobblestone Stair") +S("Inner Cobblestone Stair") +S("Outer Cobblestone Stair") +S("Cobblestone Slab") +S("Mossy Cobblestone Stair") +S("Inner Mossy Cobblestone Stair") +S("Outer Mossy Cobblestone Stair") +S("Mossy Cobblestone Slab") +S("Stone Brick Stair") +S("Inner Stone Brick Stair") +S("Outer Stone Brick Stair") +S("Stone Brick Slab") +S("Stone Block Stair") +S("Inner Stone Block Stair") +S("Outer Stone Block Stair") +S("Stone Block Slab") +S("Desert Stone Stair") +S("Inner Desert Stone Stair") +S("Outer Desert Stone Stair") +S("Desert Stone Slab") +S("Desert Cobblestone Stair") +S("Inner Desert Cobblestone Stair") +S("Outer Desert Cobblestone Stair") +S("Desert Cobblestone Slab") +S("Desert Stone Brick Stair") +S("Inner Desert Stone Brick Stair") +S("Outer Desert Stone Brick Stair") +S("Desert Stone Brick Slab") +S("Desert Stone Block Stair") +S("Inner Desert Stone Block Stair") +S("Outer Desert Stone Block Stair") +S("Desert Stone Block Slab") +S("Sandstone Stair") +S("Inner Sandstone Stair") +S("Outer Sandstone Stair") +S("Sandstone Slab") +S("Sandstone Brick Stair") +S("Inner Sandstone Brick Stair") +S("Outer Sandstone Brick Stair") +S("Sandstone Brick Slab") +S("Sandstone Block Stair") +S("Inner Sandstone Block Stair") +S("Outer Sandstone Block Stair") +S("Sandstone Block Slab") +S("Desert Sandstone Stair") +S("Inner Desert Sandstone Stair") +S("Outer Desert Sandstone Stair") +S("Desert Sandstone Slab") +S("Desert Sandstone Brick Stair") +S("Inner Desert Sandstone Brick Stair") +S("Outer Desert Sandstone Brick Stair") +S("Desert Sandstone Brick Slab") +S("Desert Sandstone Block Stair") +S("Inner Desert Sandstone Block Stair") +S("Outer Desert Sandstone Block Stair") +S("Desert Sandstone Block Slab") +S("Silver Sandstone Stair") +S("Inner Silver Sandstone Stair") +S("Outer Silver Sandstone Stair") +S("Silver Sandstone Slab") +S("Silver Sandstone Brick Stair") +S("Inner Silver Sandstone Brick Stair") +S("Outer Silver Sandstone Brick Stair") +S("Silver Sandstone Brick Slab") +S("Silver Sandstone Block Stair") +S("Inner Silver Sandstone Block Stair") +S("Outer Silver Sandstone Block Stair") +S("Silver Sandstone Block Slab") +S("Obsidian Stair") +S("Inner Obsidian Stair") +S("Outer Obsidian Stair") +S("Obsidian Slab") +S("Obsidian Brick Stair") +S("Inner Obsidian Brick Stair") +S("Outer Obsidian Brick Stair") +S("Obsidian Brick Slab") +S("Obsidian Block Stair") +S("Inner Obsidian Block Stair") +S("Outer Obsidian Block Stair") +S("Obsidian Block Slab") +S("Brick Stair") +S("Inner Brick Stair") +S("Outer Brick Stair") +S("Brick Slab") +S("Steel Block Stair") +S("Inner Steel Block Stair") +S("Outer Steel Block Stair") +S("Steel Block Slab") +S("Tin Block Stair") +S("Inner Tin Block Stair") +S("Outer Tin Block Stair") +S("Tin Block Slab") +S("Copper Block Stair") +S("Inner Copper Block Stair") +S("Outer Copper Block Stair") +S("Copper Block Slab") +S("Bronze Block Stair") +S("Inner Bronze Block Stair") +S("Outer Bronze Block Stair") +S("Bronze Block Slab") +S("Gold Block Stair") +S("Inner Gold Block Stair") +S("Outer Gold Block Stair") +S("Gold Block Slab") +S("Ice Stair") +S("Inner Ice Stair") +S("Outer Ice Stair") +S("Ice Slab") +S("Snow Block Stair") +S("Inner Snow Block Stair") +S("Outer Snow Block Stair") +S("Snow Block Slab") +--]] diff --git a/mods/minetest_game/stairs/license.txt b/mods/minetest_game/stairs/license.txt new file mode 100644 index 00000000..ec758cf4 --- /dev/null +++ b/mods/minetest_game/stairs/license.txt @@ -0,0 +1,16 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2017 Kahrl +Copyright (C) 2011-2017 celeron55, Perttu Ahola +Copyright (C) 2012-2017 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/mods/minetest_game/stairs/locale/stairs.de.tr b/mods/minetest_game/stairs/locale/stairs.de.tr new file mode 100644 index 00000000..beb45798 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.de.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Glastreppe +Glass Slab=Glasplatte +Inner Glass Stair=Innere Glastreppe +Outer Glass Stair=Äußere Glastreppe +Obsidian Glass Stair=Obsidianglastreppe +Obsidian Glass Slab=Obsidianglasplatte +Inner Obsidian Glass Stair=Innere Obsidianglastreppe +Outer Obsidian Glass Stair=Äußere Obsidianglastreppe +Wooden Stair=Holztreppe +Inner Wooden Stair=Innere Holztreppe +Outer Wooden Stair=Äußere Holztreppe +Wooden Slab=Holzplatte +Jungle Wood Stair=Dschungelholztreppe +Inner Jungle Wood Stair=Innere Dschungelholztreppe +Outer Jungle Wood Stair=Äußere Dschungelholztreppe +Jungle Wood Slab=Dschungelholzplatte +Pine Wood Stair=Kiefernholztreppe +Inner Pine Wood Stair=Innere Kiefernholztreppe +Outer Pine Wood Stair=Äußere Kiefernholztreppe +Pine Wood Slab=Kiefernholzplatte +Acacia Wood Stair=Akazienholztreppe +Inner Acacia Wood Stair=Innere Akazienholztreppe +Outer Acacia Wood Stair=Äußere Akazienholztreppe +Acacia Wood Slab=Akazienholzplatte +Aspen Wood Stair=Espenholztreppe +Inner Aspen Wood Stair=Innere Espenholztreppe +Outer Aspen Wood Stair=Äußere Espenholztreppe +Aspen Wood Slab=Espenholzplatte +Stone Stair=Steintreppe +Inner Stone Stair=Innere Steintreppe +Outer Stone Stair=Äußere Steintreppe +Stone Slab=Steinplatte +Cobblestone Stair=Kopfsteinpflastertreppe +Inner Cobblestone Stair=Innere Kopfsteinpflastertreppe +Outer Cobblestone Stair=Äußere Kopfsteinpflastertreppe +Cobblestone Slab=Kopfsteinpflasterplatte +Mossy Cobblestone Stair=Moosige Kopfsteinpflastertreppe +Inner Mossy Cobblestone Stair=Innere moosige Kopfsteinpflastertreppe +Outer Mossy Cobblestone Stair=Äußere moosige Kopfsteinpflastertreppe +Mossy Cobblestone Slab=Moosige Kopfsteinpflasterplatte +Stone Brick Stair=Steinziegeltreppe +Inner Stone Brick Stair=Innere Steinziegeltreppe +Outer Stone Brick Stair=Äußere Steinziegeltreppe +Stone Brick Slab=Steinziegelplatte +Stone Block Stair=Steinblocktreppe +Inner Stone Block Stair=Innere Steinblocktreppe +Outer Stone Block Stair=Äußere Steinblocktreppe +Stone Block Slab=Steinblockplatte +Desert Stone Stair=Wüstensteintreppe +Inner Desert Stone Stair=Innere Wüstensteintreppe +Outer Desert Stone Stair=Äußere Wüstensteintreppe +Desert Stone Slab=Wüstensteinplatte +Desert Cobblestone Stair=Wüstenkopfsteinpflastertreppe +Inner Desert Cobblestone Stair=Innere Wüstenkopfsteinpflastertreppe +Outer Desert Cobblestone Stair=Äußere Wüstenkopfsteinpflastertreppe +Desert Cobblestone Slab=Wüstenkopfsteinpflasterplatte +Desert Stone Brick Stair=Wüstensteinziegeltreppe +Inner Desert Stone Brick Stair=Innere Wüstensteinziegeltreppe +Outer Desert Stone Brick Stair=Äußere Wüstensteinziegeltreppe +Desert Stone Brick Slab=Wüstensteinziegelplatte +Desert Stone Block Stair=Wüstensteinblocktreppe +Inner Desert Stone Block Stair=Innere Wüstensteinblocktreppe +Outer Desert Stone Block Stair=Äußere Wüstensteinblocktreppe +Desert Stone Block Slab=Wüstensteinblockplatte +Sandstone Stair=Sandsteintreppe +Inner Sandstone Stair=Innere Sandsteintreppe +Outer Sandstone Stair=Äußere Sandsteintreppe +Sandstone Slab=Sandsteinplatte +Sandstone Brick Stair=Sandsteinziegeltreppe +Inner Sandstone Brick Stair=Innere Sandsteinziegeltreppe +Outer Sandstone Brick Stair=Äußere Sandsteinziegeltreppe +Sandstone Brick Slab=Sandsteinziegelplatte +Sandstone Block Stair=Sandsteinblocktreppe +Inner Sandstone Block Stair=Innere Sandsteinblocktreppe +Outer Sandstone Block Stair=Äußere Sandsteinblocktreppe +Sandstone Block Slab=Sandsteinblockplatte +Desert Sandstone Stair=Wüstensandsteintreppe +Inner Desert Sandstone Stair=Innere Wüstensandsteintreppe +Outer Desert Sandstone Stair=Äußere Wüstensandsteintreppe +Desert Sandstone Slab=Wüstensandsteinplatte +Desert Sandstone Brick Stair=Wüstensandsteinziegeltreppe +Inner Desert Sandstone Brick Stair=Innere Wüstensandsteinziegeltreppe +Outer Desert Sandstone Brick Stair=Äußere Wüstensandsteinziegeltreppe +Desert Sandstone Brick Slab=Wüstensandsteinziegelplatte +Desert Sandstone Block Stair=Wüstensandsteinblocktreppe +Inner Desert Sandstone Block Stair=Innere Wüstensandsteinblocktreppe +Outer Desert Sandstone Block Stair=Äußere Wüstensandsteinblocktreppe +Desert Sandstone Block Slab=Wüstensandsteinblockplatte +Silver Sandstone Stair=Silbersandsteintreppe +Inner Silver Sandstone Stair=Innere Silbersandsteintreppe +Outer Silver Sandstone Stair=Äußere Silbersandsteintreppe +Silver Sandstone Slab=Silbersandsteinplatte +Silver Sandstone Brick Stair=Silbersandsteinziegeltreppe +Inner Silver Sandstone Brick Stair=Innere Silbersandsteinziegeltreppe +Outer Silver Sandstone Brick Stair=Äußere Silbersandsteinziegeltreppe +Silver Sandstone Brick Slab=Silbersandsteinziegelplatte +Silver Sandstone Block Stair=Silbersandsteinblocktreppe +Inner Silver Sandstone Block Stair=Innere Silbersandsteinblocktreppe +Outer Silver Sandstone Block Stair=Äußere Silbersandsteinblocktreppe +Silver Sandstone Block Slab=Silbersandsteinblockplatte +Obsidian Stair=Obsidiantreppe +Inner Obsidian Stair=Innere Obsidiantreppe +Outer Obsidian Stair=Äußere Obsidiantreppe +Obsidian Slab=Obsidianplatte +Obsidian Brick Stair=Obsidianziegeltreppe +Inner Obsidian Brick Stair=Innere Obsidianziegeltreppe +Outer Obsidian Brick Stair=Äußere Obsidianziegeltreppe +Obsidian Brick Slab=Obsidianziegelplatte +Obsidian Block Stair=Obsidianblocktreppe +Inner Obsidian Block Stair=Innere Obsidianblocktreppe +Outer Obsidian Block Stair=Äußere Obsidianblocktreppe +Obsidian Block Slab=Obsidianblockplatte +Brick Stair=Ziegeltreppe +Inner Brick Stair=Innere Ziegeltreppe +Outer Brick Stair=Äußere Ziegeltreppe +Brick Slab=Ziegelplatte +Steel Block Stair=Stahlblocktreppe +Inner Steel Block Stair=Innere Stahlblocktreppe +Outer Steel Block Stair=Äußere Stahlblocktreppe +Steel Block Slab=Stahlblockplatte +Tin Block Stair=Zinnblocktreppe +Inner Tin Block Stair=Innere Zinnblocktreppe +Outer Tin Block Stair=Äußere Zinnblocktreppe +Tin Block Slab=Zinnblockplatte +Copper Block Stair=Kupferblocktreppe +Inner Copper Block Stair=Innere Kupferblocktreppe +Outer Copper Block Stair=Äußere Kupferblocktreppe +Copper Block Slab=Kupferblockplatte +Bronze Block Stair=Bronzeblocktreppe +Inner Bronze Block Stair=Innere Bronzeblocktreppe +Outer Bronze Block Stair=Äußere Bronzeblocktreppe +Bronze Block Slab=Bronzeblockplatte +Gold Block Stair=Goldblocktreppe +Inner Gold Block Stair=Innere Goldblocktreppe +Outer Gold Block Stair=Äußere Goldblocktreppe +Gold Block Slab=Goldblockplatte +Ice Stair=Eistreppe +Inner Ice Stair=Innere Eistreppe +Outer Ice Stair=Äußere Eistreppe +Ice Slab=Eisplatte +Snow Block Stair=Schneeblocktreppe +Inner Snow Block Stair=Innere Schneeblocktreppe +Outer Snow Block Stair=Äußere Schneeblocktreppe +Snow Block Slab=Schneeblockplatte diff --git a/mods/minetest_game/stairs/locale/stairs.eo.tr b/mods/minetest_game/stairs/locale/stairs.eo.tr new file mode 100644 index 00000000..f018dc9c --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.eo.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Vitra Åtupo +Glass Slab=Vitra plato +Inner Glass Stair=Interna vitra Åtupo +Outer Glass Stair=Ekstera vitra Åtupo +Obsidian Glass Stair=Obsidiana vitra Åtupo +Obsidian Glass Slab=Obsidiana vitra plato +Inner Obsidian Glass Stair=Interna obsidiana vitra Åtupo +Outer Obsidian Glass Stair=Ekstera obsidiana vitra Åtupo +Wooden Stair=Ligna Åtupo +Inner Wooden Stair=Interna ligna Åtupo +Outer Wooden Stair=Ekstera ligna Åtupo +Wooden Slab=Ligna plato +Jungle Wood Stair=Äœangala ligna Åtupo +Inner Jungle Wood Stair=Interna Äangala ligna Åtupo +Outer Jungle Wood Stair=Ekstera Äangala ligna Åtupo +Jungle Wood Slab=Äœangala ligna plato +Pine Wood Stair=Pina ligna Åtupo +Inner Pine Wood Stair=Interna pina ligna Åtupo +Outer Pine Wood Stair=Ekstera pina ligna Åtupo +Pine Wood Slab=Pina ligna plato +Acacia Wood Stair=Akacia ligna Åtupo +Inner Acacia Wood Stair=Interna akacia ligna Åtupo +Outer Acacia Wood Stair=Ekstera akacia ligna Åtupo +Acacia Wood Slab=Akacia ligna plato +Aspen Wood Stair=Tremola ligna Åtupo +Inner Aspen Wood Stair=Interna tremola ligna Åtupo +Outer Aspen Wood Stair=Ekstera tremola ligna Åtupo +Aspen Wood Slab=Tremola ligna plato +Stone Stair=Åœtona Åtupo +Inner Stone Stair=Interna Åtona Åtupo +Outer Stone Stair=Ekstera Åtona Åtupo +Stone Slab=Åœtona plato +Cobblestone Stair=PavimÅtona Åtupo +Inner Cobblestone Stair=Interna pavimÅtona Åtupo +Outer Cobblestone Stair=Ekstera pavimÅtona Åtupo +Cobblestone Slab=PavimÅtona plato +Mossy Cobblestone Stair=Muska pavimÅtona Åtupo +Inner Mossy Cobblestone Stair=Interna muska pavimÅtona Åtupo +Outer Mossy Cobblestone Stair=Ekstera muska pavimÅtona Åtupo +Mossy Cobblestone Slab=Muska pavimÅtona plato +Stone Brick Stair=Åœtona brika Åtupo +Inner Stone Brick Stair=Interna Åtona brika Åtupo +Outer Stone Brick Stair=Ekstera Åtona brika Åtupo +Stone Brick Slab=Åœtona brika plato +Stone Block Stair=Åœtona Åtipa Åtupo +Inner Stone Block Stair=Interna Åtona Åtipa Åtupo +Outer Stone Block Stair=Ekstera Åtona Åtipa Åtupo +Stone Block Slab=Åœtona Åtipa plato +Desert Stone Stair=Dezerta Åtona Åtupo +Inner Desert Stone Stair=Interna dezerta Åtona Åtupo +Outer Desert Stone Stair=Ekstera dezerta Åtona Åtupo +Desert Stone Slab=Dezerta Åtona plato +Desert Cobblestone Stair=Dezerta pavimÅtona Åtupo +Inner Desert Cobblestone Stair=Interna dezerta pavimÅtona Åtupo +Outer Desert Cobblestone Stair=Ekstera dezerta pavimÅtona Åtupo +Desert Cobblestone Slab=Dezerta pavimÅtona plato +Desert Stone Brick Stair=Dezerta Åtona brika Åtupo +Inner Desert Stone Brick Stair=Interna dezerta Åtona brika Åtupo +Outer Desert Stone Brick Stair=Ekstera dezerta Åtona brika Åtupo +Desert Stone Brick Slab=Dezerta Åtona brika plato +Desert Stone Block Stair=Dezerta Åtona bloko Åtupo +Inner Desert Stone Block Stair=Interna dezerta Åtona bloko Åtupo +Outer Desert Stone Block Stair=Ekstera dezerta Åtona bloko Åtupo +Desert Stone Block Slab=Dezerta Åtona bloko plato +Sandstone Stair=SablÅtona Åtupo +Inner Sandstone Stair=Interna ÅablÅtona Åtupo +Outer Sandstone Stair=Ekstera ÅablÅtona Åtupo +Sandstone Slab=ÅœablÅtona plato +Sandstone Brick Stair=ÅœablÅtona brika Åtupo +Inner Sandstone Brick Stair=Interna ÅablÅtona brika Åtupo +Outer Sandstone Brick Stair=Ekstera ÅablÅtona brika Åtupo +Sandstone Brick Slab=ÅœablÅtona brika plato +Sandstone Block Stair=ÅœablÅtona Åtipa Åtupo +Inner Sandstone Block Stair=Interna ÅablÅtona Åtipa Åtupo +Outer Sandstone Block Stair=Ekstera ÅablÅtona Åtipa Åtupo +Sandstone Block Slab=ÅœablÅtona Åtipa plato +Desert Sandstone Stair=Dezerta ÅablÅtona Åtupo +Inner Desert Sandstone Stair=Interna dezerta ÅablÅtona Åtupo +Outer Desert Sandstone Stair=Ekstera dezerta ÅablÅtona Åtupo +Desert Sandstone Slab=Dezerta ÅablÅtona plato +Desert Sandstone Brick Stair=Dezerta ÅablÅtona brika Åtupo +Inner Desert Sandstone Brick Stair=Interna dezerta ÅablÅtona brika Åtupo +Outer Desert Sandstone Brick Stair=Ekstera dezerta ÅablÅtona brika Åtupo +Desert Sandstone Brick Slab=Dezerta ÅablÅtona brika plato +Desert Sandstone Block Stair=Dezerta ÅablÅtona Åtipa Åtupo +Inner Desert Sandstone Block Stair=Interna dezerta ÅablÅtona brika Åtupo +Outer Desert Sandstone Block Stair=Ekstera dezerta ÅablÅtona brika Åtupo +Desert Sandstone Block Slab=Dezerta ÅablÅtona Åtipa plato +Silver Sandstone Stair=ArÄenta ÅablÅtona Åtupo +Inner Silver Sandstone Stair=Interna arÄenta ÅablÅtona Åtupo +Outer Silver Sandstone Stair=Ekstera arÄenta ÅablÅtona Åtupo +Silver Sandstone Slab=ArÄenta ÅablÅtona plato +Silver Sandstone Brick Stair=ArÄenta ÅablÅtona brika Åtupo +Inner Silver Sandstone Brick Stair=Interna arÄenta ÅablÅtona brika Åtupo +Outer Silver Sandstone Brick Stair=Ekstera arÄenta ÅablÅtona brika Åtupo +Silver Sandstone Brick Slab=ArÄenta ÅablÅtona brika plato +Silver Sandstone Block Stair=ArÄenta ÅablÅtona Åtipa Åtupo +Inner Silver Sandstone Block Stair=Interna arÄenta ÅablÅtona Åtipa Åtupo +Outer Silver Sandstone Block Stair=Ekstera arÄenta ÅablÅtona Åtipa Åtupo +Silver Sandstone Block Slab=ArÄenta ÅablÅtona Åtipa plato +Obsidian Stair=Obsidiana Åtupo +Inner Obsidian Stair=Interna obsidiana Åtupo +Outer Obsidian Stair=Ekstera obsidiana Åtupo +Obsidian Slab=Obsidiana plato +Obsidian Brick Stair=Obsidiana brika Åtupo +Inner Obsidian Brick Stair=Interna obsidiana brika Åtupo +Outer Obsidian Brick Stair=Ekstera obsidiana brika Åtupo +Obsidian Brick Slab=Obsidiana brika plato +Obsidian Block Stair=Obsidiana Åtipa Åtupo +Inner Obsidian Block Stair=Interna obsidiana Åtipa Åtupo +Outer Obsidian Block Stair=Ekstera obsidiana Åtipa Åtupo +Obsidian Block Slab=Obsidiana Åtipa plato +Brick Stair=Brika Åtupo +Inner Brick Stair=Interna brika Åtupo +Outer Brick Stair=Ekstera brika Åtupo +Brick Slab=Brika plato +Steel Block Stair=Åœtala Åtipa Åtupo +Inner Steel Block Stair=Interna Åtala Åtipa Åtupo +Outer Steel Block Stair=Ekstera Åtala Åtipa Åtupo +Steel Block Slab=Åœtala Åtipa plato +Tin Block Stair=Stana Åtipa Åtupo +Inner Tin Block Stair=Interna stana Åtipa Åtupo +Outer Tin Block Stair=Ekstera stana Åtipa Åtupo +Tin Block Slab=Stana Åtipa plato +Copper Block Stair=Kupra Åtipa Åtupo +Inner Copper Block Stair=Interna kupra Åtipa Åtupo +Outer Copper Block Stair=Ekstera kupra Åtipa Åtupo +Copper Block Slab=Kupra Åtipa plato +Bronze Block Stair=Bronza Åtipa Åtupo +Inner Bronze Block Stair=Interna bronza Åtipa Åtupo +Outer Bronze Block Stair=Ekstera bronza Åtipa Åtupo +Bronze Block Slab=Bronza Åtipa plato +Gold Block Stair=Ora Åtipa Åtupo +Inner Gold Block Stair=Interna ora Åtipa Åtupo +Outer Gold Block Stair=Ekstera ora Åtipa Åtupo +Gold Block Slab=Ora Åtipa plato +Ice Stair=Glacia Åtupo +Inner Ice Stair=Interna glacia Åtupo +Outer Ice Stair=Ekstera glacia Åtupo +Ice Slab=Glacia plato +Snow Block Stair=NeÄa Åtipa Åtupo +Inner Snow Block Stair=Interna neÄa Åtipa Åtupo +Outer Snow Block Stair=Ekstera neÄa Åtipa Åtupo +Snow Block Slab=NeÄa Åtipa plato diff --git a/mods/minetest_game/stairs/locale/stairs.es.tr b/mods/minetest_game/stairs/locale/stairs.es.tr new file mode 100644 index 00000000..374540c7 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.es.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escalera de vidrio +Glass Slab=Losa de vidrio +Inner Glass Stair=Escalera interior de vidrio +Outer Glass Stair=Escalera exterior de vidrio +Obsidian Glass Stair=Escalera de vidrio de obsidiana +Obsidian Glass Slab=Losa de vidrio de obsidiana +Inner Obsidian Glass Stair=Escalera interior de vidrio de obsidiana +Outer Obsidian Glass Stair=Escalera exterior de vidrio de obsidiana +Wooden Stair=Escalera de madera +Inner Wooden Stair=Escalera interior de madera +Outer Wooden Stair=Escalera exterior de madera +Wooden Slab=Losa de madera +Jungle Wood Stair=Escalera de madera tropical +Inner Jungle Wood Stair=Escalera interior de madera tropical +Outer Jungle Wood Stair=Escalera exterior de madera tropical +Jungle Wood Slab=Losa de madera tropical +Pine Wood Stair=Escalera de pino +Inner Pine Wood Stair=Escalera interior de pino +Outer Pine Wood Stair=Escalera exterior de pino +Pine Wood Slab=Losa de pino +Acacia Wood Stair=Escalera de acacia +Inner Acacia Wood Stair=Escalera interior de acacia +Outer Acacia Wood Stair=Escalera exterior de acacia +Acacia Wood Slab=Losa de acacia +Aspen Wood Stair=Escalera de álamo +Inner Aspen Wood Stair=Escalera interior de álamo +Outer Aspen Wood Stair=Escalera exterior de álamo +Aspen Wood Slab=Losa de álamo +Stone Stair=Escalera de piedra +Inner Stone Stair=Escalera interior de piedra +Outer Stone Stair=Escalera exterior de piedra +Stone Slab=Losa de piedra +Cobblestone Stair=Escalera de adoquines +Inner Cobblestone Stair=Escalera interior de adoquines +Outer Cobblestone Stair=Escalera exterior de adoquines +Cobblestone Slab=Losa de adoquines +Mossy Cobblestone Stair=Escalera de adoquines musgosos +Inner Mossy Cobblestone Stair=Escalera interior de adoquines musgosos +Outer Mossy Cobblestone Stair=Escalera exterior de adoquines musgosos +Mossy Cobblestone Slab=Losa de adoquines musgosos +Stone Brick Stair=Escalera de ladrillos de piedra +Inner Stone Brick Stair=Escalera interior de ladrillos de piedra +Outer Stone Brick Stair=Escalera exterior de ladrillos de piedra +Stone Brick Slab=Losa de ladrillos de piedra +Stone Block Stair=Escalera de bloques de piedra +Inner Stone Block Stair=Escalera interior de bloques de piedra +Outer Stone Block Stair=Escalera exterior de bloques de piedra +Stone Block Slab=Losa de bloques de piedra +Desert Stone Stair=Escalera de piedra desértica +Inner Desert Stone Stair=Escalera interior de piedra desértica +Outer Desert Stone Stair=Escalera exterior de piedra desértica +Desert Stone Slab=Losa de piedra desértica +Desert Cobblestone Stair=Escalera de adoquines desérticos +Inner Desert Cobblestone Stair=Escalera interior de adoquines desérticos +Outer Desert Cobblestone Stair=Escalera exterior de adoquines desérticos +Desert Cobblestone Slab=Losa de adoquines desérticos +Desert Stone Brick Stair=Escalera de ladrillos desérticos +Inner Desert Stone Brick Stair=Escalera interior de ladrillos desérticos +Outer Desert Stone Brick Stair=Escalera exterior de ladrillos desérticos +Desert Stone Brick Slab=Losa de ladrillos desérticos +Desert Stone Block Stair=Escalera de bloques de piedra desértica +Inner Desert Stone Block Stair=Escalera interior de bloques de piedra desértica +Outer Desert Stone Block Stair=Escalera exterior de bloques de piedra desértica +Desert Stone Block Slab=Losa de bloques de piedra desértica +Sandstone Stair=Escalera de arenisca +Inner Sandstone Stair=Escalera interior de arenisca +Outer Sandstone Stair=Escalera exterior de arenisca +Sandstone Slab=Losa de arenisca +Sandstone Brick Stair=Escalera de ladrillos de arenisca +Inner Sandstone Brick Stair=Escalera interior de ladrillos de arenisca +Outer Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca +Sandstone Brick Slab=Losa de ladrillos de arenisca +Sandstone Block Stair=Escalera de bloques de arenisca +Inner Sandstone Block Stair=Escalera interior de bloques de arenisca +Outer Sandstone Block Stair=Escalera exterior de bloques de arenisca +Sandstone Block Slab=Losa de bloques de arenisca +Desert Sandstone Stair=Escalera de arenisca desértica +Inner Desert Sandstone Stair=Escalera interior de arenisca desértica +Outer Desert Sandstone Stair=Escalera exterior de arenisca desértica +Desert Sandstone Slab=Losa de arenisca desértica +Desert Sandstone Brick Stair=Escalera de ladrillos de arenisca desértica +Inner Desert Sandstone Brick Stair=Escalera interior de ladrillos de arenisca desértica +Outer Desert Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca desértica +Desert Sandstone Brick Slab=Losa de ladrillos de arenisca desértica +Desert Sandstone Block Stair=Escalera de bloques de arenisca desértica +Inner Desert Sandstone Block Stair=Escalera interior de bloques de arenisca desértica +Outer Desert Sandstone Block Stair=Escalera exterior de bloques de arenisca desértica +Desert Sandstone Block Slab=Losa de bloques de arenisca desértica +Silver Sandstone Stair=Escalera de arenisca plateada +Inner Silver Sandstone Stair=Escalera interior de arenisca plateada +Outer Silver Sandstone Stair=Escalera exterior de arenisca plateada +Silver Sandstone Slab=Losa de arenisca plateada +Silver Sandstone Brick Stair=Escalera de ladrillos de arenisca plateada +Inner Silver Sandstone Brick Stair=Escalera interior de ladrillos de arenisca plateada +Outer Silver Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca plateada +Silver Sandstone Brick Slab=Losa de ladrillos de arenisca plateada +Silver Sandstone Block Stair=Escalera de bloques de arenisca plateada +Inner Silver Sandstone Block Stair=Escalera interior de bloques de arenisca plateada +Outer Silver Sandstone Block Stair=Escalera exterior de bloques de arenisca plateada +Silver Sandstone Block Slab=Losa de bloques de arenisca plateada +Obsidian Stair=Escalera de obsidiana +Inner Obsidian Stair=Escalera interior de obsidiana +Outer Obsidian Stair=Escalera exterior de obsidiana +Obsidian Slab=Losa de obsidiana +Obsidian Brick Stair=Escalera de ladrillos de obsidiana +Inner Obsidian Brick Stair=Escalera interior de ladrillos de obsidiana +Outer Obsidian Brick Stair=Escalera exterior de ladrillos de obsidiana +Obsidian Brick Slab=Losa de ladrillos de obsidiana +Obsidian Block Stair=Escalera de bloques de obsidiana +Inner Obsidian Block Stair=Escalera interior de bloques de obsidiana +Outer Obsidian Block Stair=Escalera exterior de bloques de obsidiana +Obsidian Block Slab=Losa de bloques de obsidiana +Brick Stair=Escalera de ladrillos +Inner Brick Stair=Escalera interior de ladrillos +Outer Brick Stair=Escalera exterior de ladrillos +Brick Slab=Losa de ladrillos +Steel Block Stair=Escalera de acero +Inner Steel Block Stair=Escalera interior de acero +Outer Steel Block Stair=Escalera exterior de acero +Steel Block Slab=Losa de acero +Tin Block Stair=Escalera de estaño +Inner Tin Block Stair=Escalera interior de estaño +Outer Tin Block Stair=Escalera exterior de estaño +Tin Block Slab=Losa de estaño +Copper Block Stair=Escalera de cobre +Inner Copper Block Stair=Escalera interior de cobre +Outer Copper Block Stair=Escalera exterior de cobre +Copper Block Slab=Losa de cobre +Bronze Block Stair=Escalera de bronce +Inner Bronze Block Stair=Escalera interior de bronce +Outer Bronze Block Stair=Escalera exterior de bronce +Bronze Block Slab=Losa de bronce +Gold Block Stair=Escalera de oro +Inner Gold Block Stair=Escalera interior de oro +Outer Gold Block Stair=Escalera exterior de oro +Gold Block Slab=Losa de oro +Ice Stair=Escalera de hielo +Inner Ice Stair=Escalera interior de hielo +Outer Ice Stair=Escalera exterior de hielo +Ice Slab=Losa de hielo +Snow Block Stair=Escalera de nieve +Inner Snow Block Stair=Escalera interior de nieve +Outer Snow Block Stair=Escalera exterior de nieve +Snow Block Slab=Losa de nieve diff --git a/mods/minetest_game/stairs/locale/stairs.fr.tr b/mods/minetest_game/stairs/locale/stairs.fr.tr new file mode 100644 index 00000000..81b575e6 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.fr.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escalier de verre +Glass Slab=Dalle de verre +Inner Glass Stair=Escalier intérieur de verre +Outer Glass Stair=Escalier extérieur de verre +Obsidian Glass Stair=Escalier de verre d'obsidienne +Obsidian Glass Slab=Dalle de verre d'obsidienne +Inner Obsidian Glass Stair=Escalier intérieur de verre d'obsidienne +Outer Obsidian Glass Stair=Escalier extérieur de verre d'obsidienne +Wooden Stair=Escalier en bois +Inner Wooden Stair=Escalier intérieur en bois +Outer Wooden Stair=Escalier extérieur en bois +Wooden Slab=Dalle de bois +Jungle Wood Stair=Escalier en bois de la jungle +Inner Jungle Wood Stair=Escalier intérieur en bois de la jungle +Outer Jungle Wood Stair=Escalier extérieur en bois de la jungle +Jungle Wood Slab=Dalle en bois de la jungle +Pine Wood Stair=Escalier en pin +Inner Pine Wood Stair=Escalier intérieur en pin +Outer Pine Wood Stair=Escalier extérieur en pin +Pine Wood Slab=Dalle en pin +Acacia Wood Stair=Escalier en acacia +Inner Acacia Wood Stair=Escalier intérieur en acacia +Outer Acacia Wood Stair=Escalier extérieur en acacia +Acacia Wood Slab=Dalle en acacia +Aspen Wood Stair=Escalier en tremble +Inner Aspen Wood Stair=Escalier intérieur en tremble +Outer Aspen Wood Stair=Escalier extérieur en tremble +Aspen Wood Slab=Dalle en tremble +Stone Stair=Escalier de pierre +Inner Stone Stair=Escalier intérieur de pierre +Outer Stone Stair=Escalier extérieur de pierre +Stone Slab=Dalle de pierre +Cobblestone Stair=Escalier en pavé +Inner Cobblestone Stair=Escalier intérieur en pavé +Outer Cobblestone Stair=Escalier extérieur en pavé +Cobblestone Slab=Dalle en pavé +Mossy Cobblestone Stair=Escalier en pavé moussu +Inner Mossy Cobblestone Stair=Escalier intérieur en pavé moussu +Outer Mossy Cobblestone Stair=Escalier extérieur en pavé moussu +Mossy Cobblestone Slab=Dalle en pavé moussu +Stone Brick Stair=Escalier en brique de pierre +Inner Stone Brick Stair=Escalier intérieur en brique de pierre +Outer Stone Brick Stair=Escalier extérieur en brique de pierre +Stone Brick Slab=Dalle en brique de pierre +Stone Block Stair=Escalier en bloc de pierre +Inner Stone Block Stair=Escalier intérieur en bloc de pierre +Outer Stone Block Stair=Escalier extérieur en bloc de pierre +Stone Block Slab=Dalle en bloc de pierre +Desert Stone Stair=Escalier en pierre du désert +Inner Desert Stone Stair=Escalier intérieur en pierre du désert +Outer Desert Stone Stair=Escalier extérieur en pierre du désert +Desert Stone Slab=Dalle en pierre du désert +Desert Cobblestone Stair=Escalier en pavé du désert +Inner Desert Cobblestone Stair=Escalier intérieur en pavé du désert +Outer Desert Cobblestone Stair=Escalier extérieur en pavé du désert +Desert Cobblestone Slab=Dalle en pavé du désert +Desert Stone Brick Stair=Escalier en brique de pierre du désert +Inner Desert Stone Brick Stair=Escalier intérieur en brique de pierre du désert +Outer Desert Stone Brick Stair=Escalier extérieur en brique de pierre du désert +Desert Stone Brick Slab=Dalle en brique de pierre du désert +Desert Stone Block Stair=Escalier en bloc de pierre du désert +Inner Desert Stone Block Stair=Escalier intérieur en bloc de pierre du désert +Outer Desert Stone Block Stair=Escalier extérieur en bloc de pierre du désert +Desert Stone Block Slab=Dalle en bloc de pierre du désert +Sandstone Stair=Escalier en grès +Inner Sandstone Stair=Escalier intérieur en grès +Outer Sandstone Stair=Escalier extérieur en grès +Sandstone Slab=Dalle en grès +Sandstone Brick Stair=Escalier en brique de grès +Inner Sandstone Brick Stair=Escalier intérieur en brique de grès +Outer Sandstone Brick Stair=Escalier extérieur en brique de grès +Sandstone Brick Slab=Dalle en brique de grès +Sandstone Block Stair=Escalier en bloc de grès +Inner Sandstone Block Stair=Escalier intérieur en bloc de grès +Outer Sandstone Block Stair=Escalier extérieur en bloc de grès +Sandstone Block Slab=Dalle en bloc de grès +Desert Sandstone Stair=Escalier en grès du désert +Inner Desert Sandstone Stair=Escalier intérieur en grès du désert +Outer Desert Sandstone Stair=Escalier extérieur en grès du désert +Desert Sandstone Slab=Dalle en grès du désert +Desert Sandstone Brick Stair=Escalier en brique de grès du désert +Inner Desert Sandstone Brick Stair=Escalier intérieur en brique de grès du désert +Outer Desert Sandstone Brick Stair=Escalier extérieur en brique de grès du désert +Desert Sandstone Brick Slab=Dalle en brique de grès du désert +Desert Sandstone Block Stair=Escalier en bloc de grès du désert +Inner Desert Sandstone Block Stair=Escalier intérieur en bloc de grès du désert +Outer Desert Sandstone Block Stair=Escalier extérieur en bloc de grès du désert +Desert Sandstone Block Slab=Dalle en bloc de grès du désert +Silver Sandstone Stair=Escalier en grès argenté +Inner Silver Sandstone Stair=Escalier intérieur en grès argenté +Outer Silver Sandstone Stair=Escalier extérieur en grès argenté +Silver Sandstone Slab=Dalle en grès argenté +Silver Sandstone Brick Stair=Escalier en brique de grès argenté +Inner Silver Sandstone Brick Stair=Escalier intérieur en brique de grès argenté +Outer Silver Sandstone Brick Stair=Escalier extérieur en brique de grès argenté +Silver Sandstone Brick Slab=Dalle en brique de grès argenté +Silver Sandstone Block Stair=Escalier en bloc de grès argenté +Inner Silver Sandstone Block Stair=Escalier intérieur en bloc de grès argenté +Outer Silver Sandstone Block Stair=Escalier extérieur en bloc de grès argenté +Silver Sandstone Block Slab=Dalle en bloc de grès argenté +Obsidian Stair=Escalier en obsidienne +Inner Obsidian Stair=Escalier intérieur en obsidienne +Outer Obsidian Stair=Escalier extérieur en obsidienne +Obsidian Slab=Dalle en obsidienne +Obsidian Brick Stair=Escalier en brique d'obsidienne +Inner Obsidian Brick Stair=Escalier intérieur en brique d'obsidienne +Outer Obsidian Brick Stair=Escalier extérieur en brique d'obsidienne +Obsidian Brick Slab=Dalle en brique d'obsidienne +Obsidian Block Stair=Escalier en bloc d'obsidienne +Inner Obsidian Block Stair=Escalier intérieur en bloc d'obsidienne +Outer Obsidian Block Stair=Escalier extérieur en bloc d'obsidienne +Obsidian Block Slab=Dalle en bloc d'obsidienne +Brick Stair=Escalier en brique +Inner Brick Stair=Escalier intérieur en brique +Outer Brick Stair=Escalier extérieur en brique +Brick Slab=Dalle en brique +Steel Block Stair=Escalier en acier +Inner Steel Block Stair=Escalier intérieur en acier +Outer Steel Block Stair=Escalier extérieur en acier +Steel Block Slab=Dalle en acier +Tin Block Stair=Escalier en bloc d'étain +Inner Tin Block Stair=Escalier intérieur en bloc d'étain +Outer Tin Block Stair=Escalier extérieur en bloc d'étain +Tin Block Slab=Dalle en bloc d'étain +Copper Block Stair=Escalier en bloc de cuivre +Inner Copper Block Stair=Escalier intérieur en bloc de cuivre +Outer Copper Block Stair=Escalier extérieur en bloc de cuivre +Copper Block Slab=Dalle en bloc de cuivre +Bronze Block Stair=Escalier en bronze +Inner Bronze Block Stair=Escalier intérieur en bronze +Outer Bronze Block Stair=Escalier extérieur en bronze +Bronze Block Slab=Dalle en bronze +Gold Block Stair=Escalier en bloc d'or +Inner Gold Block Stair=Escalier intérieur en bloc d'or +Outer Gold Block Stair=Escalier extérieur en bloc d'or +Gold Block Slab=Dalle en bloc d'or +Ice Stair=Escalier de glace +Inner Ice Stair=Escalier intérieur de glace +Outer Ice Stair=Escalier extérieur de glace +Ice Slab=Dalle de glace +Snow Block Stair=Escalier en bloc de neige +Inner Snow Block Stair=Escalier intérieur en bloc de neige +Outer Snow Block Stair=Escalier extérieur en bloc de neige +Snow Block Slab=Dalle en bloc de neige diff --git a/mods/minetest_game/stairs/locale/stairs.id.tr b/mods/minetest_game/stairs/locale/stairs.id.tr new file mode 100644 index 00000000..dbdfaa0f --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.id.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Lempengan Kaca +Inner Glass Stair=Tangga Kaca Dalam +Outer Glass Stair=Tangga Kaca Luar +Obsidian Glass Stair=Tangga Kaca Obsidian +Obsidian Glass Slab=Lempengan Kaca Obsidian +Inner Obsidian Glass Stair=Tangga Kaca Obsidian Dalam +Outer Obsidian Glass Stair=Tangga Kaca Obsidian Luar +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalam +Outer Wooden Stair=Tangga Kayu Luar +Wooden Slab=Lempengan Kayu +Jungle Wood Stair=Tangga Kayu Rimba +Inner Jungle Wood Stair=Tangga Kayu Rimba Dalam +Outer Jungle Wood Stair=Tangga Kayu Rimba Luar +Jungle Wood Slab=Lempengan Kayu Rimba +Pine Wood Stair=Tangga Kayu Pinus +Inner Pine Wood Stair=Tangga Kayu Pinus Dalam +Outer Pine Wood Stair=Tangga Kayu Pinus Luar +Pine Wood Slab=Lempengan Kayu Pinus +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalam +Outer Acacia Wood Stair=Tangga Kayu Akasia Luar +Acacia Wood Slab=Lempengan Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalam +Outer Aspen Wood Stair=Tangga Kayu Aspen Luar +Aspen Wood Slab=Lempengan Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalam +Outer Stone Stair=Tangga Batu Luar +Stone Slab=Lempengan Batu +Cobblestone Stair=Tangga Bongkahan Batu +Inner Cobblestone Stair=Tangga Bongkahan Batu Dalam +Outer Cobblestone Stair=Tangga Bongkahan Batu Luar +Cobblestone Slab=Lempengan Bongkahan Batu +Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut +Inner Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Dalam +Outer Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Luar +Mossy Cobblestone Slab=Lempengan Bongkahan Batu Berlumut +Stone Brick Stair=Tangga Tembok Batu +Inner Stone Brick Stair=Tangga Tembok Batu Dalam +Outer Stone Brick Stair=Tangga Tembok Batu Luar +Stone Brick Slab=Lempengan Tembok Batu +Stone Block Stair=Tangga Balok Batu +Inner Stone Block Stair=Tangga Balok Batu Dalam +Outer Stone Block Stair=Tangga Balok Batu Luar +Stone Block Slab=Lempengan Balok Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalam +Outer Desert Stone Stair=Tangga Batu Gurun Luar +Desert Stone Slab=Lempengan Batu Gurun +Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun +Inner Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Dalam +Outer Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Luar +Desert Cobblestone Slab=Lempengan Bongkahan Batu Gurun +Desert Stone Brick Stair=Tangga Tembok Batu Gurun +Inner Desert Stone Brick Stair=Tangga Tembok Batu Gurun Dalam +Outer Desert Stone Brick Stair=Tangga Tembok Batu Gurun Luar +Desert Stone Brick Slab=Lempengan Tembok Batu Gurun +Desert Stone Block Stair=Tangga Balok Batu Gurun +Inner Desert Stone Block Stair=Tangga Balok Batu Gurun Dalam +Outer Desert Stone Block Stair=Tangga Balok Batu Gurun Luar +Desert Stone Block Slab=Lempengan Balok Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalam +Outer Sandstone Stair=Tangga Batu Pasir Luar +Sandstone Slab=Lempengan Batu Pasir +Sandstone Brick Stair=Tangga Tembok Batu Pasir +Inner Sandstone Brick Stair=Tangga Tembok Batu Pasir Dalam +Outer Sandstone Brick Stair=Tangga Tembok Batu Pasir Luar +Sandstone Brick Slab=Lempengan Tembok Batu Pasir +Sandstone Block Stair=Tangga Balok Batu Pasir +Inner Sandstone Block Stair=Tangga Balok Batu Pasir Dalam +Outer Sandstone Block Stair=Tangga Balok Batu Pasir Luar +Sandstone Block Slab=Lempengan Balok Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalam +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luar +Desert Sandstone Slab=Lempengan Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Dalam +Outer Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Luar +Desert Sandstone Brick Slab=Lempengan Tembok Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Dalam +Outer Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Luar +Desert Sandstone Block Slab=Lempengan Balok Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalam +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luar +Silver Sandstone Slab=Lempengan Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Dalam +Outer Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Luar +Silver Sandstone Brick Slab=Lempengan Tembok Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Dalam +Outer Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Luar +Silver Sandstone Block Slab=Lempengan Balok Batu Pasir Perak +Obsidian Stair=Tangga Obsidian +Inner Obsidian Stair=Tangga Obsidian Dalam +Outer Obsidian Stair=Tangga Obsidian Luar +Obsidian Slab=Lempengan Obsidian +Obsidian Brick Stair=Tangga Tembok Obsidian +Inner Obsidian Brick Stair=Tangga Tembok Obsidian Dalam +Outer Obsidian Brick Stair=Tangga Tembok Obsidian Luar +Obsidian Brick Slab=Lempengan Tembok Obsidian +Obsidian Block Stair=Tangga Balok Obsidian +Inner Obsidian Block Stair=Tangga Balok Obsidian Dalam +Outer Obsidian Block Stair=Tangga Balok Obsidian Luar +Obsidian Block Slab=Lempengan Balok Obsidian +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalam +Outer Brick Stair=Tangga Bata Luar +Brick Slab=Lempengan Bata +Steel Block Stair=Tangga Balok Baja +Inner Steel Block Stair=Tangga Balok Baja Dalam +Outer Steel Block Stair=Tangga Balok Baja Luar +Steel Block Slab=Lempengan Balok Baja +Tin Block Stair=Tangga Balok Timah +Inner Tin Block Stair=Tangga Balok Timah Dalam +Outer Tin Block Stair=Tangga Balok Timah Luar +Tin Block Slab=Lempengan Balok Timah +Copper Block Stair=Tangga Balok Tembaga +Inner Copper Block Stair=Tangga Balok Tembaga Dalam +Outer Copper Block Stair=Tangga Balok Tembaga Luar +Copper Block Slab=Lempengan Balok Tembaga +Bronze Block Stair=Tangga Balok Perunggu +Inner Bronze Block Stair=Tangga Balok Perunggu Dalam +Outer Bronze Block Stair=Tangga Balok Perunggu Luar +Bronze Block Slab=Lempengan Balok Perunggu +Gold Block Stair=Tangga Balok Emas +Inner Gold Block Stair=Tangga Balok Emas Dalam +Outer Gold Block Stair=Tangga Balok Emas Luar +Gold Block Slab=Lempengan Balok Emas +Ice Stair=Tangga Es +Inner Ice Stair=Tangga Es Dalam +Outer Ice Stair=Tangga Es Luar +Ice Slab=Lempengan Es +Snow Block Stair=Tangga Balok Salju +Inner Snow Block Stair=Tangga Balok Salju Dalam +Outer Snow Block Stair=Tangga Balok Salju Luar +Snow Block Slab=Lempengan Balok Salju diff --git a/mods/minetest_game/stairs/locale/stairs.it.tr b/mods/minetest_game/stairs/locale/stairs.it.tr new file mode 100644 index 00000000..16945ec6 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.it.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Scala di vetro +Glass Slab=Lastra di vetro +Inner Glass Stair=Scala di vetro interna +Outer Glass Stair=Scala di vetro esterna +Obsidian Glass Stair=Scala di vetro d'ossidiana +Obsidian Glass Slab=Lastra di vetro d'ossidiana +Inner Obsidian Glass Stair=Scala di vetro d'ossidiana interna +Outer Obsidian Glass Stair=Scala di vetro d'ossidiana esterna +Wooden Stair=Scala di legno +Inner Wooden Stair=Scala di legno interna +Outer Wooden Stair=Scala di legno esterna +Wooden Slab=Lastra di legno +Jungle Wood Stair=Scala di legno della giungla +Inner Jungle Wood Stair=Scala di legno della giungla interna +Outer Jungle Wood Stair=Scala di legno della giungla esterna +Jungle Wood Slab=Lastra di legno della giungla +Pine Wood Stair=Scala di legno di pino +Inner Pine Wood Stair=Scala di legno di pino interna +Outer Pine Wood Stair=Scala di legno di pino esterna +Pine Wood Slab=Lastra di legno di pino +Acacia Wood Stair=Scala di legno d'acacia +Inner Acacia Wood Stair=Scala di legno d'acacia interna +Outer Acacia Wood Stair=Scala di legno d'acacia esterna +Acacia Wood Slab=Lastra di legno d'acacia +Aspen Wood Stair=Scala di legno di pioppo +Inner Aspen Wood Stair=Scala di legno di pioppo interna +Outer Aspen Wood Stair=Scala di legno di pioppo esterna +Aspen Wood Slab=Lastra di legno di pioppo +Stone Stair=Scala di pietra +Inner Stone Stair=Scala di pietra interna +Outer Stone Stair=Scala di pietra esterna +Stone Slab=Lastra di pietra +Cobblestone Stair=Scala di ciottoli +Inner Cobblestone Stair=Scala di ciottoli interna +Outer Cobblestone Stair=Scala di ciottoli esterna +Cobblestone Slab=Lastra di ciottoli +Mossy Cobblestone Stair=Scala di ciottoli muschiosi +Inner Mossy Cobblestone Stair=Scala di ciottoli muschiosi interna +Outer Mossy Cobblestone Stair=Scala di ciottoli muschiosi esterna +Mossy Cobblestone Slab=Lastra di ciottoli muschiosi +Stone Brick Stair=Scala di mattone di pietra +Inner Stone Brick Stair=Scala di mattone di pietra interna +Outer Stone Brick Stair=Scala di mattone di pietra esterna +Stone Brick Slab=Lastra di mattone di pietra +Stone Block Stair=Scala di blocco di pietra +Inner Stone Block Stair=Scala di blocco di pietra interna +Outer Stone Block Stair=Scala di blocco di pietra esterna +Stone Block Slab=Lastra di blocco di pietra +Desert Stone Stair=Scala di pietra del deserto +Inner Desert Stone Stair=Scala di pietra del deserto interna +Outer Desert Stone Stair=Scala di pietra del deserto esterna +Desert Stone Slab=Lastra di pietra del deserto +Desert Cobblestone Stair=Scala di ciottoli del deserto +Inner Desert Cobblestone Stair=Scala di ciottoli del deserto interna +Outer Desert Cobblestone Stair=Scala di ciottoli del deserto esterna +Desert Cobblestone Slab=Lastra di ciottoli del deserto +Desert Stone Brick Stair=Scala di mattone di pietra del deserto +Inner Desert Stone Brick Stair=Scala di mattone di pietra del deserto interna +Outer Desert Stone Brick Stair=Scala di mattone di pietra del deserto esterna +Desert Stone Brick Slab=Lastra di mattone di pietra del deserto +Desert Stone Block Stair=Scala di blocco di pietra del deserto +Inner Desert Stone Block Stair=Scala di blocco di pietra del deserto interna +Outer Desert Stone Block Stair=Scala di blocco di pietra del deserto esterna +Desert Stone Block Slab=Lastra di blocco di pietra del deserto +Sandstone Stair=Scala d'arenaria +Inner Sandstone Stair=Scala d'arenaria interna +Outer Sandstone Stair=Scala d'arenaria esterna +Sandstone Slab=Lastra d'arenaria +Sandstone Brick Stair=Scala di mattone d'arenaria +Inner Sandstone Brick Stair=Scala di mattone d'arenaria interna +Outer Sandstone Brick Stair=Scala di mattone d'arenaria esterna +Sandstone Brick Slab=Lastra di mattone d'arenaria +Sandstone Block Stair=Scala di blocco d'arenaria +Inner Sandstone Block Stair=Scala di blocco d'arenaria interna +Outer Sandstone Block Stair=Scala di blocco d'arenaria esterna +Sandstone Block Slab=Lastra di blocco d'arenaria +Desert Sandstone Stair=Scala d'arenaria del deserto +Inner Desert Sandstone Stair=Scala d'arenaria del deserto interna +Outer Desert Sandstone Stair=Scala d'arenaria del deserto esterna +Desert Sandstone Slab=Lastra d'arenaria del deserto +Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto +Inner Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto interna +Outer Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto esterna +Desert Sandstone Brick Slab=Lastra di mattone d'arenaria del deserto +Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto +Inner Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto interna +Outer Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto esterna +Desert Sandstone Block Slab=Lastra di blocco d'arenaria del deserto +Silver Sandstone Stair=Scala d'arenaria argentata +Inner Silver Sandstone Stair=Scala d'arenaria argentata interna +Outer Silver Sandstone Stair=Scala d'arenaria argentata esterna +Silver Sandstone Slab=Lastra d'arenaria argentata +Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata +Inner Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata interna +Outer Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata esterna +Silver Sandstone Brick Slab=Lastra di mattone d'arenaria argentata +Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata +Inner Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata interna +Outer Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata esterna +Silver Sandstone Block Slab=Lastra di blocco d'arenaria argentata +Obsidian Stair=Scala d'ossidiana +Inner Obsidian Stair=Scala d'ossidiana interna +Outer Obsidian Stair=Scala d'ossidiana esterna +Obsidian Slab=Lastra d'ossidiana +Obsidian Brick Stair=Scala di mattone d'ossidiana +Inner Obsidian Brick Stair=Scala di mattone d'ossidiana interna +Outer Obsidian Brick Stair=Scala di mattone d'ossidiana esterna +Obsidian Brick Slab=Lastra di mattone d'ossidiana +Obsidian Block Stair=Scala di blocco d'ossidiana +Inner Obsidian Block Stair=Scala di blocco d'ossidiana interna +Outer Obsidian Block Stair=Scala di blocco d'ossidiana esterna +Obsidian Block Slab=Lastra di blocco d'ossidiana +Brick Stair=Scala di mattone +Inner Brick Stair=Scala di mattone interna +Outer Brick Stair=Scala di mattone esterna +Brick Slab=Lastra di mattone +Steel Block Stair=Scala di blocco d'acciaio +Inner Steel Block Stair=Scala di blocco d'acciaio interna +Outer Steel Block Stair=Scala di blocco d'acciaio esterna +Steel Block Slab=Lastra di blocco d'acciaio +Tin Block Stair=Scala di blocco di stagno +Inner Tin Block Stair=Scala di blocco di stagno interna +Outer Tin Block Stair=Scala di blocco di stagno esterna +Tin Block Slab=Lastra di blocco di stagno +Copper Block Stair=Scala di blocco di rame +Inner Copper Block Stair=Scala di blocco di rame interna +Outer Copper Block Stair=Scala di blocco di rame esterna +Copper Block Slab=Lastra di blocco di rame +Bronze Block Stair=Scala di blocco di bronzo +Inner Bronze Block Stair=Scala di blocco di bronzo interna +Outer Bronze Block Stair=Scala di blocco di bronzo esterna +Bronze Block Slab=Lastra di blocco di bronzo +Gold Block Stair=Scala di blocco d'oro +Inner Gold Block Stair=Scala di blocco d'oro interna +Outer Gold Block Stair=Scala di blocco d'oro esterna +Gold Block Slab=Lastra di blocco d'oro +Ice Stair=Scala di ghiaccio +Inner Ice Stair=Scala di ghiaccio interna +Outer Ice Stair=Scala di ghiaccio esterna +Ice Slab=Lastra di ghiaccio +Snow Block Stair=Scala di blocco di neve +Inner Snow Block Stair=Scala di blocco di neve interna +Outer Snow Block Stair=Scala di blocco di neve esterna +Snow Block Slab=Lastra di blocco di neve diff --git a/mods/minetest_game/stairs/locale/stairs.ja.tr b/mods/minetest_game/stairs/locale/stairs.ja.tr new file mode 100644 index 00000000..02576cd6 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.ja.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=ガラスã®éšŽæ®µ +Glass Slab=ガラスã®åŽšæ¿ +Inner Glass Stair=ガラスã®å‡¹éšŽæ®µ +Outer Glass Stair=ガラスã®å‡¸éšŽæ®µ +Obsidian Glass Stair=黒曜石ガラスã®éšŽæ®µ +Obsidian Glass Slab=黒曜石ガラスã®åŽšæ¿ +Inner Obsidian Glass Stair=黒曜石ガラスã®å‡¹éšŽæ®µ +Outer Obsidian Glass Stair=黒曜石ガラスã®å‡¸éšŽæ®µ +Wooden Stair=木製ã®éšŽæ®µ +Inner Wooden Stair=木製ã®å‡¹éšŽæ®µ +Outer Wooden Stair=木製ã®å‡¸éšŽæ®µ +Wooden Slab=木製ã®åŽšæ¿ +Jungle Wood Stair=ジャングルæã®éšŽæ®µ +Inner Jungle Wood Stair=ジャングルæã®å‡¹éšŽæ®µ +Outer Jungle Wood Stair=ジャングルæã®å‡¸éšŽæ®µ +Jungle Wood Slab=ジャングルæã®åŽšæ¿ +Pine Wood Stair=マツæã®éšŽæ®µ +Inner Pine Wood Stair=マツæã®å‡¹éšŽæ®µ +Outer Pine Wood Stair=マツæã®å‡¸éšŽæ®µ +Pine Wood Slab=マツæã®åŽšæ¿ +Acacia Wood Stair=アカシアæã®éšŽæ®µ +Inner Acacia Wood Stair=アカシアæã®å‡¹éšŽæ®µ +Outer Acacia Wood Stair=アカシアæã®å‡¸éšŽæ®µ +Acacia Wood Slab=アカシアæã®åŽšæ¿ +Aspen Wood Stair=ãƒãƒ—ラæã®éšŽæ®µ +Inner Aspen Wood Stair=ãƒãƒ—ラæã®å‡¹éšŽæ®µ +Outer Aspen Wood Stair=ãƒãƒ—ラæã®å‡¸éšŽæ®µ +Aspen Wood Slab=ãƒãƒ—ラæã®åŽšæ¿ +Stone Stair=石ã®éšŽæ®µ +Inner Stone Stair=石ã®å‡¹éšŽæ®µ +Outer Stone Stair=石ã®å‡¸éšŽæ®µ +Stone Slab=石ã®åŽšæ¿ +Cobblestone Stair=丸石ã®éšŽæ®µ +Inner Cobblestone Stair=丸石ã®å‡¹éšŽæ®µ +Outer Cobblestone Stair=丸石ã®å‡¸éšŽæ®µ +Cobblestone Slab=丸石ã®åŽšæ¿ +Mossy Cobblestone Stair=苔むã—ãŸä¸¸çŸ³ã®éšŽæ®µ +Inner Mossy Cobblestone Stair=苔むã—ãŸä¸¸çŸ³ã®å‡¹éšŽæ®µ +Outer Mossy Cobblestone Stair=苔むã—ãŸä¸¸çŸ³ã®å‡¸éšŽæ®µ +Mossy Cobblestone Slab=苔むã—ãŸä¸¸çŸ³ã®åŽšæ¿ +Stone Brick Stair=石レンガã®éšŽæ®µ +Inner Stone Brick Stair=石レンガã®å‡¹éšŽæ®µ +Outer Stone Brick Stair=石レンガã®å‡¸éšŽæ®µ +Stone Brick Slab=石レンガã®åŽšæ¿ +Stone Block Stair=石ブロックã®éšŽæ®µ +Inner Stone Block Stair=石ブロックã®å‡¹éšŽæ®µ +Outer Stone Block Stair=石ブロックã®å‡¸éšŽæ®µ +Stone Block Slab=石ブロックã®åŽšæ¿ +Desert Stone Stair=ç ‚æ¼ ã®çŸ³ã®éšŽæ®µ +Inner Desert Stone Stair=ç ‚æ¼ ã®çŸ³ã®å‡¹éšŽæ®µ +Outer Desert Stone Stair=ç ‚æ¼ ã®çŸ³ã®å‡¸éšŽæ®µ +Desert Stone Slab=ç ‚æ¼ ã®çŸ³ã®åŽšæ¿ +Desert Cobblestone Stair=ç ‚æ¼ ã®ä¸¸çŸ³ã®éšŽæ®µ +Inner Desert Cobblestone Stair=ç ‚æ¼ ã®ä¸¸çŸ³ã®å‡¹éšŽæ®µ +Outer Desert Cobblestone Stair=ç ‚æ¼ ã®ä¸¸çŸ³ã®å‡¸éšŽæ®µ +Desert Cobblestone Slab=ç ‚æ¼ ã®ä¸¸çŸ³ã®åŽšæ¿ +Desert Stone Brick Stair=ç ‚æ¼ ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Inner Desert Stone Brick Stair=ç ‚æ¼ ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Outer Desert Stone Brick Stair=ç ‚æ¼ ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Desert Stone Brick Slab=ç ‚æ¼ ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®åŽšæ¿ +Desert Stone Block Stair=ç ‚æ¼ ã®çŸ³ãƒ–ロックã®éšŽæ®µ +Inner Desert Stone Block Stair=ç ‚æ¼ ã®çŸ³ãƒ–ロックã®å‡¹éšŽæ®µ +Outer Desert Stone Block Stair=ç ‚æ¼ ã®çŸ³ãƒ–ロックã®å‡¸éšŽæ®µ +Desert Stone Block Slab=ç ‚æ¼ ã®çŸ³ãƒ–ロックã®åŽšæ¿ +Sandstone Stair=砂岩ã®éšŽæ®µ +Inner Sandstone Stair=砂岩ã®å‡¹éšŽæ®µ +Outer Sandstone Stair=砂岩ã®å‡¸éšŽæ®µ +Sandstone Slab=砂岩ã®åŽšæ¿ +Sandstone Brick Stair=砂岩レンガã®éšŽæ®µ +Inner Sandstone Brick Stair=砂岩レンガã®å‡¹éšŽæ®µ +Outer Sandstone Brick Stair=砂岩レンガã®å‡¸éšŽæ®µ +Sandstone Brick Slab=砂岩レンガã®åŽšæ¿ +Sandstone Block Stair=砂岩ブロックã®éšŽæ®µ +Inner Sandstone Block Stair=砂岩ブロックã®å‡¹éšŽæ®µ +Outer Sandstone Block Stair=砂岩ブロックã®å‡¸éšŽæ®µ +Sandstone Block Slab=砂岩ブロックã®åŽšæ¿ +Desert Sandstone Stair=ç ‚æ¼ ã®ç ‚岩ã®éšŽæ®µ +Inner Desert Sandstone Stair=ç ‚æ¼ ã®ç ‚岩ã®å‡¹éšŽæ®µ +Outer Desert Sandstone Stair=ç ‚æ¼ ã®ç ‚岩ã®å‡¸éšŽæ®µ +Desert Sandstone Slab=ç ‚æ¼ ã®ç ‚岩ã®åŽšæ¿ +Desert Sandstone Brick Stair=ç ‚æ¼ ã®ç ‚岩レンガã®éšŽæ®µ +Inner Desert Sandstone Brick Stair=ç ‚æ¼ ã®ç ‚岩レンガã®å‡¹éšŽæ®µ +Outer Desert Sandstone Brick Stair=ç ‚æ¼ ã®ç ‚岩レンガã®å‡¸éšŽæ®µ +Desert Sandstone Brick Slab=ç ‚æ¼ ã®ç ‚岩レンガã®åŽšæ¿ +Desert Sandstone Block Stair=ç ‚æ¼ ã®ç ‚岩ブロックã®éšŽæ®µ +Inner Desert Sandstone Block Stair=ç ‚æ¼ ã®ç ‚岩ブロックã®å‡¹éšŽæ®µ +Outer Desert Sandstone Block Stair=ç ‚æ¼ ã®ç ‚岩ブロックã®å‡¸éšŽæ®µ +Desert Sandstone Block Slab=ç ‚æ¼ ã®ç ‚岩ブロックã®åŽšæ¿ +Silver Sandstone Stair=銀色ã®ç ‚岩ã®éšŽæ®µ +Inner Silver Sandstone Stair=銀色ã®ç ‚岩ã®å‡¹éšŽæ®µ +Outer Silver Sandstone Stair=銀色ã®ç ‚岩ã®å‡¸éšŽæ®µ +Silver Sandstone Slab=銀色ã®ç ‚岩ã®åŽšæ¿ +Silver Sandstone Brick Stair=銀色ã®ç ‚岩レンガã®éšŽæ®µ +Inner Silver Sandstone Brick Stair=銀色ã®ç ‚岩レンガã®å‡¹éšŽæ®µ +Outer Silver Sandstone Brick Stair=銀色ã®ç ‚岩レンガã®å‡¸éšŽæ®µ +Silver Sandstone Brick Slab=銀色ã®ç ‚岩レンガã®åŽšæ¿ +Silver Sandstone Block Stair=銀色ã®ç ‚岩ブロックã®éšŽæ®µ +Inner Silver Sandstone Block Stair=銀色ã®ç ‚岩ブロックã®å‡¹éšŽæ®µ +Outer Silver Sandstone Block Stair=銀色ã®ç ‚岩ブロックã®å‡¸éšŽæ®µ +Silver Sandstone Block Slab=銀色ã®ç ‚岩ブロックã®åŽšæ¿ +Obsidian Stair=黒曜石ã®éšŽæ®µ +Inner Obsidian Stair=黒曜石ã®å‡¹éšŽæ®µ +Outer Obsidian Stair=黒曜石ã®å‡¸éšŽæ®µ +Obsidian Slab=黒曜石ã®åŽšæ¿ +Obsidian Brick Stair=黒曜石レンガã®éšŽæ®µ +Inner Obsidian Brick Stair=黒曜石レンガã®å‡¹éšŽæ®µ +Outer Obsidian Brick Stair=黒曜石レンガã®å‡¸éšŽæ®µ +Obsidian Brick Slab=黒曜石レンガã®åŽšæ¿ +Obsidian Block Stair=黒曜石ブロックã®éšŽæ®µ +Inner Obsidian Block Stair=黒曜石ブロックã®å‡¹éšŽæ®µ +Outer Obsidian Block Stair=黒曜石ブロックã®å‡¸éšŽæ®µ +Obsidian Block Slab=黒曜石ブロックã®åŽšæ¿ +Brick Stair=レンガã®éšŽæ®µ +Inner Brick Stair=レンガã®å‡¹éšŽæ®µ +Outer Brick Stair=レンガã®å‡¸éšŽæ®µ +Brick Slab=レンガã®åŽšæ¿ +Steel Block Stair=鉄ブロックã®éšŽæ®µ +Inner Steel Block Stair=鉄ブロックã®å‡¹éšŽæ®µ +Outer Steel Block Stair=鉄ブロックã®å‡¸éšŽæ®µ +Steel Block Slab=鉄ブロックã®åŽšæ¿ +Tin Block Stair=スズã®éšŽæ®µ +Inner Tin Block Stair=スズã®å‡¹éšŽæ®µ +Outer Tin Block Stair=スズã®å‡¸éšŽæ®µ +Tin Block Slab=スズã®åŽšæ¿ +Copper Block Stair=銅ブロックã®éšŽæ®µ +Inner Copper Block Stair=銅ブロックã®å‡¹éšŽæ®µ +Outer Copper Block Stair=銅ブロックã®å‡¸éšŽæ®µ +Copper Block Slab=銅ブロックã®åŽšæ¿ +Bronze Block Stair=é’銅ブロックã®éšŽæ®µ +Inner Bronze Block Stair=é’銅ブロックã®å‡¹éšŽæ®µ +Outer Bronze Block Stair=é’銅ブロックã®å‡¸éšŽæ®µ +Bronze Block Slab=é’銅ブロックã®åŽšæ¿ +Gold Block Stair=金ブロックã®éšŽæ®µ +Inner Gold Block Stair=金ブロックã®å‡¹éšŽæ®µ +Outer Gold Block Stair=金ブロックã®å‡¸éšŽæ®µ +Gold Block Slab=金ブロックã®åŽšæ¿ +Ice Stair=æ°·ã®éšŽæ®µ +Inner Ice Stair=æ°·ã®å‡¹éšŽæ®µ +Outer Ice Stair=æ°·ã®å‡¸éšŽæ®µ +Ice Slab=æ°·ã®åŽšæ¿ +Snow Block Stair=雪ã®éšŽæ®µ +Inner Snow Block Stair=雪ã®å‡¹éšŽæ®µ +Outer Snow Block Stair=雪ã®å‡¸éšŽæ®µ +Snow Block Slab=雪ã®åŽšæ¿ diff --git a/mods/minetest_game/stairs/locale/stairs.jbo.tr b/mods/minetest_game/stairs/locale/stairs.jbo.tr new file mode 100644 index 00000000..91d28060 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.jbo.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=lo blaci serti +Glass Slab=lo blaci xadba bliku +Inner Glass Stair=lo zo'i blaci serti +Outer Glass Stair=lo ze'o blaci serti +Obsidian Glass Stair=lo je'erma'ablaci blaci serti +Obsidian Glass Slab=lo je'erma'ablaci blaci ke xadba bliku +Inner Obsidian Glass Stair=lo zo'i je'erma'ablaci blaci serti +Outer Obsidian Glass Stair=lo ze'o je'erma'ablaci blaci serti +Wooden Stair=lo mudri serti +Inner Wooden Stair=lo zo'i mudri serti +Outer Wooden Stair=lo ze'o mudri serti +Wooden Slab=lo mudri ke xadba bliku +Jungle Wood Stair=lo glatimdemricfoi mudri serti +Inner Jungle Wood Stair=lo zo'i glatimdemricfoi mudri serti +Outer Jungle Wood Stair=lo ze'o glatimdemricfoi mudri serti +Jungle Wood Slab=lo glatimdemricfoi mudri ke xadba bliku +Pine Wood Stair=lo ku'urmudri serti +Inner Pine Wood Stair=lo zo'i ku'urmudri serti +Outer Pine Wood Stair=lo ze'o ku'urmudri serti +Pine Wood Slab=lo ku'urmudri ke xadba bliku +Acacia Wood Stair=lo atkaci,ia mudri serti +Inner Acacia Wood Stair=lo zo'i atkaci,ia mudri serti +Outer Acacia Wood Stair=lo ze'o atkaci,ia mudri serti +Acacia Wood Slab=lo atkaci,ia mudri ke xadba bliku +Aspen Wood Stair=lo mudrpopulu serti +Inner Aspen Wood Stair=lo zo'i mudrpopulu serti +Outer Aspen Wood Stair=lo ze'o mudrpopulu serti +Aspen Wood Slab=lo mudrpopulu ke xadba bliku +Stone Stair=lo rokci serti +Inner Stone Stair=lo zo'i rokci serti +Outer Stone Stair=lo ze'o rokci serti +Stone Slab=lo rokci ke xadba bliku +Cobblestone Stair=lo lolro'iboi serti +Inner Cobblestone Stair=lo zo'i lolro'iboi serti +Outer Cobblestone Stair=lo ze'o lolro'iboi serti +Cobblestone Slab=lo lolro'iboi xadba bliku +Mossy Cobblestone Stair=lo clika lolro'iboi serti +Inner Mossy Cobblestone Stair=lo zo'i clika lolro'iboi serti +Outer Mossy Cobblestone Stair=lo ze'o clika lolro'iboi serti +Mossy Cobblestone Slab=lo clika lolro'iboi ke xadba bliku +Stone Brick Stair=lo morna rokci serti +Inner Stone Brick Stair=lo zo'i morna rokci serti +Outer Stone Brick Stair=lo ze'o morna rokci serti +Stone Brick Slab=lo morna rokci ke xadba bliku +Stone Block Stair=lo rokci bliku serti +Inner Stone Block Stair=lo zo'i rokci bliku serti +Outer Stone Block Stair=lo ze'o rokci bliku serti +Stone Block Slab=lo rokci bliku ke xadba bliku +Desert Stone Stair=lo cantu'a rokci serti +Inner Desert Stone Stair=lo zo'i cantu'a rokci serti +Outer Desert Stone Stair=lo ze'o cantu'a rokci serti +Desert Stone Slab=lo cantu'a rokci ke xadba bliku +Desert Cobblestone Stair=lo cantu'a lolro'iboi serti +Inner Desert Cobblestone Stair=lo zo'i cantu'a lolro'iboi serti +Outer Desert Cobblestone Stair=lo ze'o cantu'a lolro'iboi serti +Desert Cobblestone Slab=lo cantu'a lolro'iboi ke xadba bliku +Desert Stone Brick Stair=lo morna ke cantu'a rokci serti +Inner Desert Stone Brick Stair=lo zo'i morna ke cantu'a rokci serti +Outer Desert Stone Brick Stair=lo ze'o morna ke cantu'a rokci serti +Desert Stone Brick Slab=lo morna ke cantu'a rokci ke xadba bliku +Desert Stone Block Stair=lo cantu'a rokci bliku serti +Inner Desert Stone Block Stair=lo zo'i cantu'a rokci bliku serti +Outer Desert Stone Block Stair=lo ze'o cantu'a rokci bliku serti +Desert Stone Block Slab=lo cantu'a rokci bliku ke xadba bliku +Sandstone Stair=lo canro'i serti +Inner Sandstone Stair=lo zo'i canro'i serti +Outer Sandstone Stair=lo ze'o canro'i serti +Sandstone Slab=lo canro'i ke xadba bliku +Sandstone Brick Stair=lo morna ke canro'i serti +Inner Sandstone Brick Stair=lo zo'i morna ke canro'i serti +Outer Sandstone Brick Stair=lo ze'o morna ke canro'i serti +Sandstone Brick Slab=lo morna canro'i ke xadba bliku +Sandstone Block Stair=lo canro'i bliku serti +Inner Sandstone Block Stair=lo zo'i canro'i bliku serti +Outer Sandstone Block Stair=lo ze'o canro'i bliku serti +Sandstone Block Slab=lo canro'i bliku ke xadba bliku +Desert Sandstone Stair=lo cantu'a canro'i serti +Inner Desert Sandstone Stair=lo zo'i cantu'a canro'i serti +Outer Desert Sandstone Stair=lo ze'o cantu'a canro'i serti +Desert Sandstone Slab=lo cantu'a canro'i ke xadba bliku +Desert Sandstone Brick Stair=lo morna ke cantu'a canro'i serti +Inner Desert Sandstone Brick Stair=lo zo'i morna ke cantu'a canro'i serti +Outer Desert Sandstone Brick Stair=lo ze'o morna ke cantu'a canro'i serti +Desert Sandstone Brick Slab=lo morna ke cantu'a canro'i ke xadba bliku +Desert Sandstone Block Stair=lo cantu'a canro'i bliku serti +Inner Desert Sandstone Block Stair=lo zo'i cantu'a canro'i bliku serti +Outer Desert Sandstone Block Stair=lo ze'o cantu'a canro'i bliku serti +Desert Sandstone Block Slab=lo cantu'a canro'i ke xadba bliku +Silver Sandstone Stair=lo rijyska canro'i serti +Inner Silver Sandstone Stair=lo zo'i rijyska canro'i serti +Outer Silver Sandstone Stair=lo ze'o rijyska canro'i serti +Silver Sandstone Slab=lo rijyska canro'i ke xadba bliku +Silver Sandstone Brick Stair=lo morna ke rijyska canro'i serti +Inner Silver Sandstone Brick Stair=lo zo'i morna ke rijyska canro'i serti +Outer Silver Sandstone Brick Stair=lo ze'o morna ke rijyska canro'i serti +Silver Sandstone Brick Slab=lo morna ke rijyska canro'i ke xadba bliku +Silver Sandstone Block Stair=lo rijyska canro'i bliku serti +Inner Silver Sandstone Block Stair=lo zo'i rijyska canro'i bliku serti +Outer Silver Sandstone Block Stair=lo ze'o rijyska canro'i bliku serti +Silver Sandstone Block Slab=lo rijyska canro'i bliku ke xadba bliku +Obsidian Stair=lo je'erma'ablaci serti +Inner Obsidian Stair=lo zo'i je'erma'ablaci serti +Outer Obsidian Stair=lo ze'o je'erma'ablaci serti +Obsidian Slab=lo je'erma'ablaci ke xadba bliku +Obsidian Brick Stair=lo morna ke je'erma'ablaci serti +Inner Obsidian Brick Stair=lo zo'i morna ke je'erma'ablaci serti +Outer Obsidian Brick Stair=lo ze'o morna ke je'erma'ablaci serti +Obsidian Brick Slab=lo morna je'erma'ablaci ke xadba bliku +Obsidian Block Stair=lo je'erma'ablaci bliku serti +Inner Obsidian Block Stair=lo zo'i je'erma'ablaci bliku serti +Outer Obsidian Block Stair=lo ze'o je'erma'ablaci bliku serti +Obsidian Block Slab=lo je'erma'ablaci bliku ke xadba bliku +Brick Stair=lo kitybli serti +Inner Brick Stair=lo zo'i kitybli serti +Outer Brick Stair=lo ze'o kitybli serti +Brick Slab=lo kitybli xadba bliku +Steel Block Stair=lo gasta bliku serti +Inner Steel Block Stair=lo zo'i gasta bliku serti +Outer Steel Block Stair=lo ze'o gasta bliku serti +Steel Block Slab=lo gasta bliku ke xadba bliku +Tin Block Stair=lo tinci bliku serti +Inner Tin Block Stair=lo zo'i tinci bliku serti +Outer Tin Block Stair=lo ze'o tinci bliku serti +Tin Block Slab=lo tinci bliku ke xadba bliku +Copper Block Stair=lo tunka bliku serti +Inner Copper Block Stair=lo zo'i tunka bliku serti +Outer Copper Block Stair=lo ze'o tunka bliku serti +Copper Block Slab=lo tunka xadba bliku +Bronze Block Stair=lo ransu bliku serti +Inner Bronze Block Stair=lo zo'i ransu bliku serti +Outer Bronze Block Stair=lo ze'o ransu bliku serti +Bronze Block Slab=lo ransu xadba bliku +Gold Block Stair=lo solji bliku serti +Inner Gold Block Stair=lo zo'i solji bliku serti +Outer Gold Block Stair=lo ze'o solji bliku serti +Gold Block Slab=lo solji bliku ke xadba bliku +Ice Stair=lo bisli serti +Inner Ice Stair=lo zo'i bisli serti +Outer Ice Stair=lo ze'o bisli serti +Ice Slab=lo bisli ke xadba bliku +Snow Block Stair=lo snime bliku serti +Inner Snow Block Stair=lo zo'i snime bliku serti +Outer Snow Block Stair=lo ze'o snime bliku serti +Snow Block Slab=lo snime bliku ke xadba bliku diff --git a/mods/minetest_game/stairs/locale/stairs.lv.tr b/mods/minetest_game/stairs/locale/stairs.lv.tr new file mode 100644 index 00000000..646040b3 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.lv.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Stikla pakÄpiens +Glass Slab=Stikla plÄtne +Inner Glass Stair=Iekšējs stikla pakÄpiens +Outer Glass Stair=Ä€rÄ“js stikla pakÄpiens +Obsidian Glass Stair=ObsidiÄna stikla pakÄpiens +Obsidian Glass Slab=ObsidiÄna stikla plÄtne +Inner Obsidian Glass Stair=Iekšējs obsidiÄna stikla pakÄpiens +Outer Obsidian Glass Stair=Ä€rÄ“js obsidiÄna stikla pakÄpiens +Wooden Stair=Koka pakÄpiens +Inner Wooden Stair=Iekšējs koka pakÄpiens +Outer Wooden Stair=Ä€rÄ“js koka pakÄpiens +Wooden Slab=Koka plÄtne +Jungle Wood Stair=Džungļu koka pakÄpiens +Inner Jungle Wood Stair=Iekšējs džungļu koka pakÄpiens +Outer Jungle Wood Stair=Ä€rÄ“js džungļu koka pakÄpiens +Jungle Wood Slab=Džungļu koka plÄtne +Pine Wood Stair=Skujkoka koka pakÄpiens +Inner Pine Wood Stair=Iekšējs skujkoka koka pakÄpiens +Outer Pine Wood Stair= ArÄ“js skujkoka koka pakÄpiens +Pine Wood Slab=Skujkoka koka plÄtne +Acacia Wood Stair=AkÄcijas koka pakÄpiens +Inner Acacia Wood Stair=Iekšējs akÄcijas koka pakÄpiens +Outer Acacia Wood Stair=Ä€rÄ“js akÄcijas koka pakÄpiens +Acacia Wood Slab=AkÄcijas koka plÄtne +Aspen Wood Stair=Apses koka pakÄpiens +Inner Aspen Wood Stair=Iekšējs apses koka pakÄpiens +Outer Aspen Wood Stair=Ä€rÄ“js apses koka pakÄpiens +Aspen Wood Slab=Apses koka plÄtne +Stone Stair=Akmens pakÄpiens +Inner Stone Stair=Iekšējs akmens pakÄpiens +Outer Stone Stair=Ä€rÄ“js akmens pakÄpiens +Stone Slab=Akmens plÄtne +Cobblestone Stair=MÅ«rakmens pakÄpiens +Inner Cobblestone Stair=Iekšējs mÅ«rakmens pakÄpiens +Outer Cobblestone Stair=Ä€rÄ“js mÅ«rakmens pakÄpiens +Cobblestone Slab=MÅ«rakmens plÄtne +Mossy Cobblestone Stair=ApsÅ«nÄ“juÅ¡a mÅ«rakmens pakÄpiens +Inner Mossy Cobblestone Stair=ApsÅ«nÄ“juÅ¡a mÅ«rakmens iekšējs pakÄpiens +Outer Mossy Cobblestone Stair=ApsÅ«nÄ“juÅ¡a mÅ«rakmens ÄrÄ“js pakÄpiens +Mossy Cobblestone Slab=ApsÅ«nÄ“juÅ¡a mÅ«rakmens plÄtne +Stone Brick Stair=Akmens Ä·ieÄ£eļu pakÄpiens +Inner Stone Brick Stair=Iekšējs akmens Ä·ieÄ£eļu pakÄpiens +Outer Stone Brick Stair=Ä€rÄ“js akmens Ä·ieÄ£eļu pakÄpiens +Stone Brick Slab=Akmens Ä·ieÄ£eļu plÄtne +Stone Block Stair=Akmens bloka pakÄpiens +Inner Stone Block Stair=Iekšējs akmens bloka pakÄpiens +Outer Stone Block Stair=Ä€rÄ“js akmens bloka pakÄpiens +Stone Block Slab=Akmens bloka plÄtne +Desert Stone Stair=TuksneÅ¡a akmens pakÄpiens +Inner Desert Stone Stair=Iekšējs tuksneÅ¡a akmens pakÄpiens +Outer Desert Stone Stair=Ä€rÄ“js tuksneÅ¡a akmens pakÄpiens +Desert Stone Slab=TuksneÅ¡a akmens plÄtne +Desert Cobblestone Stair=TuksneÅ¡a mÅ«rakmens pakÄpiens +Inner Desert Cobblestone Stair=Iekšējs tuksneÅ¡a mÅ«rakmens pakÄpiens +Outer Desert Cobblestone Stair=Ä€rÄ“js tuksneÅ¡a mÅ«rakmens pakÄpiens +Desert Cobblestone Slab=TuksneÅ¡a mÅ«rakmens plÄtne +Desert Stone Brick Stair=TuksneÅ¡a akmens Ä·ieÄ£eļu pakÄpiens +Inner Desert Stone Brick Stair=Iekšējs tuksneÅ¡a akmens Ä·ieÄ£eļu pakÄpiens +Outer Desert Stone Brick Stair=Ä€rÄ“js tuksneÅ¡a Ä·ieÄ£eļu pakÄpiens +Desert Stone Brick Slab=TuksneÅ¡a Ä·ieÄ£eļu plÄtne +Desert Stone Block Stair=TuksneÅ¡a akmens bloka pakÄpiens +Inner Desert Stone Block Stair=Iekšējs tuksneÅ¡a akmens bloka pakÄpiens +Outer Desert Stone Block Stair=Ä€rÄ“js tuksneÅ¡a akmens bloka pakÄpiens +Desert Stone Block Slab=TuksneÅ¡a akmens bloka plÄtne +Sandstone Stair=SmilÅ¡akmens pakÄpiens +Inner Sandstone Stair=Iekšējs smilÅ¡akmens pakÄpiens +Outer Sandstone Stair=Ä€rÄ“js smilÅ¡akmens pakÄpiens +Sandstone Slab=SmilÅ¡akmens plÄtne +Sandstone Brick Stair=SmilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Inner Sandstone Brick Stair=Iekšējs smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Outer Sandstone Brick Stair=Ä€rÄ“js smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Sandstone Brick Slab=SmilÅ¡akmens Ä·ieÄ£eļu plÄtne +Sandstone Block Stair=SmilÅ¡akmens bloka pakÄpiens +Inner Sandstone Block Stair=Iekšējs smilÅ¡akmens bloka pakÄpiens +Outer Sandstone Block Stair=Ä€rÄ“js smilÅ¡akmens bloka pakÄpiens +Sandstone Block Slab=SmilÅ¡akmens bloka plÄtne +Desert Sandstone Stair=TuksneÅ¡a smilÅ¡akmens pakÄpiens +Inner Desert Sandstone Stair=Iekšējs tuksneÅ¡a smilÅ¡akmens pakÄpiens +Outer Desert Sandstone Stair=Ä€rÄ“js tuksneÅ¡a smilÅ¡akmens pakÄpiens +Desert Sandstone Slab=TuksneÅ¡a smilÅ¡akmens plÄtne +Desert Sandstone Brick Stair=TuksneÅ¡a smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Inner Desert Sandstone Brick Stair=Iekšējs tuksneÅ¡a smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Outer Desert Sandstone Brick Stair=Ä€rÄ“js tuksneÅ¡a smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Desert Sandstone Brick Slab=TuksneÅ¡a smilÅ¡akmens Ä·ieÄ£eļu plÄtne +Desert Sandstone Block Stair=TuksneÅ¡a smilÅ¡akmens bloka pakÄpiens +Inner Desert Sandstone Block Stair=Iekšējs tuksneÅ¡a smilÅ¡akmens bloka pakÄpiens +Outer Desert Sandstone Block Stair=Ä€rÄ“js tuksneÅ¡a smilÅ¡akmens bloka pakÄpiens +Desert Sandstone Block Slab=TuksneÅ¡a smilÅ¡akmens bloka plÄtne +Silver Sandstone Stair=BaltÄ smilÅ¡akmens pakÄpiens +Inner Silver Sandstone Stair=Iekšējs baltÄ smilÅ¡akmens pakÄpiens +Outer Silver Sandstone Stair=Ä€rÄ“js baltÄ smilÅ¡akmens pakÄpiens +Silver Sandstone Slab=BaltÄ smilÅ¡akmens plÄtne +Silver Sandstone Brick Stair=BaltÄ smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Inner Silver Sandstone Brick Stair=Iekšējs baltÄ smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Outer Silver Sandstone Brick Stair=Ä€rÄ“js baltÄ smilÅ¡akmens Ä·ieÄ£eļu pakÄpiens +Silver Sandstone Brick Slab=BaltÄ smilÅ¡akmens Ä·ieÄ£eļu plÄtne +Silver Sandstone Block Stair=BaltÄ smilÅ¡akmens bloka pakÄpiens +Inner Silver Sandstone Block Stair=Iekšējs baltÄ smilÅ¡akmens bloka pakÄpiens +Outer Silver Sandstone Block Stair=Ä€rÄ“js baltÄ smilÅ¡akmens bloka pakÄpiens +Silver Sandstone Block Slab=BaltÄ smilÅ¡akmens bloka plÄtne +Obsidian Stair=ObsidiÄna pakÄpiens +Inner Obsidian Stair=Iekšējs obsidiÄna pakÄpiens +Outer Obsidian Stair=Ä€rÄ“js obsidiÄna pakÄpiens +Obsidian Slab=ObsidiÄna plÄtne +Obsidian Brick Stair=ObsidiÄna Ä·ieÄ£eļu pakÄpiens +Inner Obsidian Brick Stair=Iekšējs obsidiÄna Ä·ieÄ£eļu pakÄpiens +Outer Obsidian Brick Stair=Ä€rÄ“js obsidiÄna Ä·ieÄ£eļu pakÄpiens +Obsidian Brick Slab=ObsidiÄna Ä·ieÄ£eļu plÄtne +Obsidian Block Stair=ObsidiÄna bloka pakÄpiens +Inner Obsidian Block Stair=Iekšējs obsidiÄna bloka pakÄpiens +Outer Obsidian Block Stair=Ä€rejs obsidiÄna bloka pakÄpiens +Obsidian Block Slab=ObsidiÄna bloka plÄtne +Brick Stair=ĶieÄ£eļu pakÄpiens +Inner Brick Stair=Iekšējs Ä·ieÄ£eļu pakÄpiens +Outer Brick Stair=Ä€rÄ“js Ä·ieÄ£eļu pakÄpiens +Brick Slab=ĶieÄ£eļu plÄtne +Steel Block Stair=TÄ“rauda pakÄpiens +Inner Steel Block Stair=Iekšējs tÄ“rauda pakÄpiens +Outer Steel Block Stair=Ä€rÄ“js tÄ“rauda pakÄpiens +Steel Block Slab=TÄ“rauda plÄtne +Tin Block Stair=Alvas pakÄpiens +Inner Tin Block Stair=Iekšējs alvas pakÄpiens +Outer Tin Block Stair=Ä€rÄ“js alvas pakÄpiens +Tin Block Slab=Alvas plÄtne +Copper Block Stair=Vara pakÄpiens +Inner Copper Block Stair=Iekšējs vara pakÄpiens +Outer Copper Block Stair=Ä€rÄ“js vara pakÄpiens +Copper Block Slab=Vara plÄtne +Bronze Block Stair=Bronzas pakÄpiens +Inner Bronze Block Stair=Iekšējs bronza pakÄpiens +Outer Bronze Block Stair=Ä€rÄ“js bronzas pakÄpiens +Bronze Block Slab=Bronzas plÄtne +Gold Block Stair=Zelta pakÄpiens +Inner Gold Block Stair=Iekšējs zelta pakÄpiens +Outer Gold Block Stair=Ä€rÄ“js zelta pakÄpiens +Gold Block Slab=Zelta plÄtne +Ice Stair=Ledus pakÄpiens +Inner Ice Stair=Iekšējs ledus pakÄpiens +Outer Ice Stair=Ä€rÄ“js ledus pakÄpiens +Ice Slab=Ledus plÄtne +Snow Block Stair=Sniega pakÄpiens +Inner Snow Block Stair=Iekšējs sniega pakÄpiens +Outer Snow Block Stair=Ä€rÄ“js sniega pakÄpiens +Snow Block Slab=Sniega plÄtne diff --git a/mods/minetest_game/stairs/locale/stairs.ms.tr b/mods/minetest_game/stairs/locale/stairs.ms.tr new file mode 100644 index 00000000..a39c7f63 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.ms.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Papak Kaca +Inner Glass Stair=Tangga Kaca Dalaman +Outer Glass Stair=Tangga Kaca Luaran +Obsidian Glass Stair=Tangga Obsidia +Obsidian Glass Slab=Papak Obsidia +Inner Obsidian Glass Stair=Tangga Obsidia Dalaman +Outer Obsidian Glass Stair=Tangga Obsidia Luaran +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalaman +Outer Wooden Stair=Tangga Kayu Luaran +Wooden Slab=Papak Kayu +Jungle Wood Stair=Tangga Kayu Hutan +Inner Jungle Wood Stair=Tangga Kayu Hutan Dalaman +Outer Jungle Wood Stair=Tangga Kayu Hutan Luaran +Jungle Wood Slab=Papak Kayu Hutan +Pine Wood Stair=Tangga Kayu Pain +Inner Pine Wood Stair=Tangga Kayu Pain Dalaman +Outer Pine Wood Stair=Tangga Kayu Pain Luaran +Pine Wood Slab=Papak Kayu Pain +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalaman +Outer Acacia Wood Stair=Tangga Kayu Akasia Luaran +Acacia Wood Slab=Papak Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalaman +Outer Aspen Wood Stair=Tangga Kayu Aspen Luaran +Aspen Wood Slab=Papak Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalaman +Outer Stone Stair=Tangga Batu Luaran +Stone Slab=Papak Batu +Cobblestone Stair=Tangga Batu Buntar +Inner Cobblestone Stair=Tangga Batu Buntar Dalaman +Outer Cobblestone Stair=Tangga Batu Buntar Luaran +Cobblestone Slab=Papak Batu Buntar +Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut +Inner Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut Dalaman +Outer Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut Luaran +Mossy Cobblestone Slab=Papak Batu Buntar Berlumut +Stone Brick Stair=Tangga Bata Batu +Inner Stone Brick Stair=Tangga Bata Batu Dalaman +Outer Stone Brick Stair=Tangga Bata Batu Luaran +Stone Brick Slab=Papak Bata Batu +Stone Block Stair=Tangga Bongkah Batu +Inner Stone Block Stair=Tangga Bongkah Batu Dalaman +Outer Stone Block Stair=Tangga Bongkah Batu Luaran +Stone Block Slab=Papak Bongkah Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalaman +Outer Desert Stone Stair=Tangga Batu Gurun Luaran +Desert Stone Slab=Papak Batu Gurun +Desert Cobblestone Stair=Tangga Batu Buntar Gurun +Inner Desert Cobblestone Stair=Tangga Batu Buntar Gurun Dalaman +Outer Desert Cobblestone Stair=Tangga Batu Buntar Gurun Luaran +Desert Cobblestone Slab=Papak Batu Buntar Gurun +Desert Stone Brick Stair=Tangga Bata Batu Gurun +Inner Desert Stone Brick Stair=Tangga Bata Batu Gurun Dalaman +Outer Desert Stone Brick Stair=Tangga Bata Batu Gurun Luaran +Desert Stone Brick Slab=Papak Bata Batu Gurun +Desert Stone Block Stair=Tangga Bongkah Batu Gurun +Inner Desert Stone Block Stair=Tangga Bongkah Batu Gurun Dalaman +Outer Desert Stone Block Stair=Tangga Bongkah Batu Gurun Luaran +Desert Stone Block Slab=Papak Bongkah Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalaman +Outer Sandstone Stair=Tangga Batu Pasir Luaran +Sandstone Slab=Papak Batu Pasir +Sandstone Brick Stair=Tangga Bata Batu Pasir +Inner Sandstone Brick Stair=Tangga Bata Batu Pasir Dalaman +Outer Sandstone Brick Stair=Tangga Bata Batu Pasir Luaran +Sandstone Brick Slab=Papak Bata Batu Pasir +Sandstone Block Stair=Tangga Bongkah Batu Pasir +Inner Sandstone Block Stair=Tangga Bongkah Batu Pasir Dalaman +Outer Sandstone Block Stair=Tangga Bongkah Batu Pasir Luaran +Sandstone Block Slab=Papak Bongkah Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalaman +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luaran +Desert Sandstone Slab=Papak Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun Dalaman +Outer Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun Luaran +Desert Sandstone Brick Slab=Papak Bata Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun Dalaman +Outer Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun Luaran +Desert Sandstone Block Slab=Papak Bongkah Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalaman +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luaran +Silver Sandstone Slab=Papak Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak Dalaman +Outer Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak Luaran +Silver Sandstone Brick Slab=Papak Bata Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak Dalaman +Outer Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak Luaran +Silver Sandstone Block Slab=Papak Bongkah Batu Pasir Perak +Obsidian Stair=Tangga Obsidia +Inner Obsidian Stair=Tangga Obsidia Dalaman +Outer Obsidian Stair=Tangga Obsidia Luaran +Obsidian Slab=Papak Obsidia +Obsidian Brick Stair=Tangga Bata Obsidia +Inner Obsidian Brick Stair=Tangga Bata Obsidia Dalaman +Outer Obsidian Brick Stair=Tangga Bata Obsidia Luaran +Obsidian Brick Slab=Papak Bata Obsidia +Obsidian Block Stair=Tangga Bongkah Obsidia +Inner Obsidian Block Stair=Tangga Bongkah Obsidia Dalaman +Outer Obsidian Block Stair=Tangga Bongkah Obsidia Luaran +Obsidian Block Slab=Papak Bongkah Obsidia +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalaman +Outer Brick Stair=Tangga Bata Luaran +Brick Slab=Papak Bata +Steel Block Stair=Tangga Bongkah Keluli +Inner Steel Block Stair=Tangga Bongkah Keluli Dalaman +Outer Steel Block Stair=Tangga Bongkah Keluli Luaran +Steel Block Slab=Papak Bongkah Keluli +Tin Block Stair=Tangga Bongkah Timah +Inner Tin Block Stair=Tangga Bongkah Timah Dalaman +Outer Tin Block Stair=Tangga Bongkah Timah Luaran +Tin Block Slab=Papak Bongkah Timah +Copper Block Stair=Tangga Bongkah Tembaga +Inner Copper Block Stair=Tangga Bongkah Tembaga Dalaman +Outer Copper Block Stair=Tangga Bongkah Tembaga Luaran +Copper Block Slab=Papak Bongkah Tembaga +Bronze Block Stair=Tangga Bongkah Gangsa +Inner Bronze Block Stair=Tangga Bongkah Gangsa Dalaman +Outer Bronze Block Stair=Tangga Bongkah Gangsa Luaran +Bronze Block Slab=Papak Bongkah Gangsa +Gold Block Stair=Tangga Bongkah Emas +Inner Gold Block Stair=Tangga Bongkah Emas Dalaman +Outer Gold Block Stair=Tangga Bongkah Emas Luaran +Gold Block Slab=Papak Bongkah Emas +Ice Stair=Tangga Ais +Inner Ice Stair=Tangga Ais Dalaman +Outer Ice Stair=Tangga Ais Luaran +Ice Slab=Papak Ais +Snow Block Stair=Tangga Bongkah Salji +Inner Snow Block Stair=Tangga Bongkah Salji Dalaman +Outer Snow Block Stair=Tangga Bongkah Salji Luaran +Snow Block Slab=Papak Bongkah Salji diff --git a/mods/minetest_game/stairs/locale/stairs.pl.tr b/mods/minetest_game/stairs/locale/stairs.pl.tr new file mode 100644 index 00000000..14eed7b9 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.pl.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Schody ze szkÅ‚a +Glass Slab=Półblok ze szkÅ‚a +Inner Glass Stair=WewnÄ™trzne schody ze szkÅ‚a +Outer Glass Stair=ZewnÄ™trzne schody ze szkÅ‚a +Obsidian Glass Stair=Schody z obsydianowego szkÅ‚a +Obsidian Glass Slab=Półblok z obsydianowego szkÅ‚a +Inner Obsidian Glass Stair=WewnÄ™trzne schody z obsydianowego szkÅ‚a +Outer Obsidian Glass Stair=ZewnÄ™trzne schody z obsydianowego szkÅ‚a +Wooden Stair=Schody z drewna +Inner Wooden Stair=WewnÄ™trzne schody z drewna +Outer Wooden Stair=ZewnÄ™trzne schody z drewna +Wooden Slab=Półblok z drewna +Jungle Wood Stair=Schody z dżunglowego drewna +Inner Jungle Wood Stair=WewnÄ™trzne schody z dżunglowego drewna +Outer Jungle Wood Stair=ZewnÄ™trzne schody z dżunglowego drewna +Jungle Wood Slab=Półblok z dżunglowego drewna +Pine Wood Stair=Schody z sosnowego drzewa +Inner Pine Wood Stair=WewnÄ™trzne schody z sosnowego drewna +Outer Pine Wood Stair=ZewnÄ™trzne schody z sosnowego drewna +Pine Wood Slab=Półblok z sosnowego drewna +Acacia Wood Stair=Schody z akacjowego drewna +Inner Acacia Wood Stair=WewnÄ™trzne schody z akacjowego drewna +Outer Acacia Wood Stair=ZewnÄ™trzne schody z akacjowego drewna +Acacia Wood Slab=Półblok z akacjowego drewna +Aspen Wood Stair=Schody z brzozowego drewna +Inner Aspen Wood Stair=WewnÄ™trzne schody z brzozowego drewna +Outer Aspen Wood Stair=ZewnÄ™trzne schody z brzozowego drewna +Aspen Wood Slab=Półblok z brzozowego drewna +Stone Stair=Schody z kamienia +Inner Stone Stair=WewnÄ™trzne schody z kamienia +Outer Stone Stair=ZewnÄ™trzne schody z kamienia +Stone Slab=Półblok z kamienia +Cobblestone Stair=Schody z bruku +Inner Cobblestone Stair=WewnÄ™trzne schody z bruku +Outer Cobblestone Stair=ZewnÄ™trzne schody z bruku +Cobblestone Slab=Półblok z bruku +Mossy Cobblestone Stair=Schody z bruku z mchem +Inner Mossy Cobblestone Stair=WewnÄ™trzne schody z bruku z mchem +Outer Mossy Cobblestone Stair=ZewnÄ™trzne schody z bruku z mchem +Mossy Cobblestone Slab=Półblok z bruku z mchem +Stone Brick Stair=Schody z kamiennych cegieÅ‚ +Inner Stone Brick Stair=WewnÄ™trzne schody z kamiennych cegieÅ‚ +Outer Stone Brick Stair=ZewnÄ™trzne schody z kamiennych cegieÅ‚ +Stone Brick Slab=Półblok z kamiennych cegieÅ‚ +Stone Block Stair=Schody z kamiennego bloku +Inner Stone Block Stair=WewnÄ™trzne schody z kamiennego bloku +Outer Stone Block Stair=ZewnÄ™trzne schody z kamiennego bloku +Stone Block Slab=Półblok z kamiennego bloku +Desert Stone Stair=Schody z pustynnego kamienia +Inner Desert Stone Stair=WewnÄ™trzne schody z pustynnego kamienia +Outer Desert Stone Stair=ZewnÄ™trzne schody z pustynnego kamienia +Desert Stone Slab=Półblok z pustynnego kamienia +Desert Cobblestone Stair=Schody z pustynnego bruku +Inner Desert Cobblestone Stair=WewnÄ™trzne schody z pustynnego bruku +Outer Desert Cobblestone Stair=ZewnÄ™trzne schody z pustynnego bruku +Desert Cobblestone Slab=Półblok z pustynnego bruku +Desert Stone Brick Stair=Schody z pustynnych kamiennych cegieÅ‚ +Inner Desert Stone Brick Stair=WewnÄ™trzne schody z pustynnych kamiennych cegieÅ‚ +Outer Desert Stone Brick Stair=ZewnÄ™trzne schody z pustynnych kamiennych cegieÅ‚ +Desert Stone Brick Slab=Półblok z pustynnych kamiennych cegieÅ‚ +Desert Stone Block Stair=Schody z pustynnego kamiennego bloku +Inner Desert Stone Block Stair=WewnÄ™trzne schody z pustynnego kamiennego bloku +Outer Desert Stone Block Stair=ZewnÄ™trzne schody z pustynnego kamiennego bloku +Desert Stone Block Slab=Półblok z pustynnego kamiennego bloku +Sandstone Stair=Schody z piaskowca +Inner Sandstone Stair=WewnÄ™trzne schody z piaskowca +Outer Sandstone Stair=ZewnÄ™trzne schody z piaskowca +Sandstone Slab=Półblok z piaskowca +Sandstone Brick Stair=Schody z piaskowcowych cegieÅ‚ +Inner Sandstone Brick Stair=WewnÄ™trzne schody z piaskowcowych cegieÅ‚ +Outer Sandstone Brick Stair=ZewnÄ™trzne schody z piaskowcowych cegieÅ‚ +Sandstone Brick Slab=Półblok z piaskowcowych cegieÅ‚ +Sandstone Block Stair=Schody z piaskowcowego bloku +Inner Sandstone Block Stair=WewnÄ™trzne schody z piaskowcowego bloku +Outer Sandstone Block Stair=ZewnÄ™trzne schody z piaskowcowego bloku +Sandstone Block Slab=Półblok z piaskowcowego bloku +Desert Sandstone Stair=Schody z pustynnego piaskowca +Inner Desert Sandstone Stair=WewnÄ™trzne schody z pustynnego piaskowca +Outer Desert Sandstone Stair=ZewnÄ™trzne schody z pustynnego piaskowca +Desert Sandstone Slab=Półblok z pustynnego piaskowca +Desert Sandstone Brick Stair=Schody z pustynnych piaskowcowych cegieÅ‚ +Inner Desert Sandstone Brick Stair=WewnÄ™trzne schody z pustynnych piaskowcowych cegieÅ‚ +Outer Desert Sandstone Brick Stair=ZewnÄ™trzne schody z pustynnych piaskowcowych cegieÅ‚ +Desert Sandstone Brick Slab=Półblok z pustynnych piaskowcowych cegieÅ‚ +Desert Sandstone Block Stair=Schody z pustynnego piaskowcowego bloku +Inner Desert Sandstone Block Stair=WewnÄ™trzne schody z pustynnego piaskowcowego bloku +Outer Desert Sandstone Block Stair=ZewnÄ™trzne schody z pustynnego piaskowcowego bloku +Desert Sandstone Block Slab=Półblok z pustynnego piaskowcowego bloku +Silver Sandstone Stair=Schody z srebrnego piaskowca +Inner Silver Sandstone Stair=WewnÄ™trzne schody z srebrnego piaskowca +Outer Silver Sandstone Stair=ZewnÄ™trzne schody z srebrnego piaskowca +Silver Sandstone Slab=Półblok z srebrnego piaskowca +Silver Sandstone Brick Stair=Schody z srebrnych piaskowcowych cegieÅ‚ +Inner Silver Sandstone Brick Stair=WewnÄ™trzne schody z srebrnych piaskowcowych cegieÅ‚ +Outer Silver Sandstone Brick Stair=ZewnÄ™trzne schody z srebrnych piaskowcowych cegieÅ‚ +Silver Sandstone Brick Slab=Półblok z srebrnych piaskowcowych cegieÅ‚ +Silver Sandstone Block Stair=Schody z srebrnego piaskowcowego bloku +Inner Silver Sandstone Block Stair=WewnÄ™trzne schody z srebrnego piaskowcowego bloku +Outer Silver Sandstone Block Stair=ZewnÄ™trzne schody z srebrnego piaskowcowego bloku +Silver Sandstone Block Slab=Półblok z srebrnego piaskowcowego bloku +Obsidian Stair=Schody z obsydianu +Inner Obsidian Stair=WewnÄ™trzne schody z obsydianu +Outer Obsidian Stair=ZewnÄ™trzne schody z obsydianu +Obsidian Slab=Półblok z obsydianu +Obsidian Brick Stair=Schody z obsydianowych cegieÅ‚ +Inner Obsidian Brick Stair=WewnÄ™trzne schody z obsydianowych cegieÅ‚ +Outer Obsidian Brick Stair=ZewnÄ™trzne schody z obsydianowych cegieÅ‚ +Obsidian Brick Slab=Półblok z obsydianowych cegieÅ‚ +Obsidian Block Stair=Schody z obsydianowego bloku +Inner Obsidian Block Stair=WewnÄ™trzne schody z obsydianowego bloku +Outer Obsidian Block Stair=ZewnÄ™trzne schody z obsydianowego bloku +Obsidian Block Slab=Półblok z obsydianowego bloku +Brick Stair=Schody z cegieÅ‚ +Inner Brick Stair=WewnÄ™trzne schody z cegieÅ‚ +Outer Brick Stair=ZewnÄ™trzne schody z cegieÅ‚ +Brick Slab=Półblok z cegieÅ‚ +Steel Block Stair=Schody z bloku stali +Inner Steel Block Stair=WewnÄ™trzne schody z bloku stali +Outer Steel Block Stair=ZewnÄ™trzne schody z bloku stali +Steel Block Slab=Półblok z bloku stali +Tin Block Stair=Schody z bloku cyny +Inner Tin Block Stair=WewnÄ™trzne schody z bloku cyny +Outer Tin Block Stair=ZewnÄ™trzne schody z bloku cyny +Tin Block Slab=Półblok z bloku cyny +Copper Block Stair=Schody z bloku miedzi +Inner Copper Block Stair=WewnÄ™trzne schody z bloku miedzi +Outer Copper Block Stair=ZewnÄ™trzne schody z bloku miedzi +Copper Block Slab=Półblok z bloku miedzi +Bronze Block Stair=Schody z bloku brÄ…zu +Inner Bronze Block Stair=WewnÄ™trnze schody z bloku brÄ…zu +Outer Bronze Block Stair=ZewnÄ™trzne schody z bloku brÄ…zu +Bronze Block Slab=Półblok z bloku brÄ…zu +Gold Block Stair=Schody z bloku zÅ‚ota +Inner Gold Block Stair=WewnÄ™trzne schody z block zÅ‚ota +Outer Gold Block Stair=ZewnÄ™trzne schody z bloku zÅ‚ota +Gold Block Slab=Półblok z bloku zÅ‚ota +Ice Stair=Schody z lodu +Inner Ice Stair=WewnÄ™trzne schody z lodu +Outer Ice Stair=ZewnÄ™trzne schody z lodu +Ice Slab=Półblok z lodu +Snow Block Stair=Schody ze Å›niegu +Inner Snow Block Stair=WewnÄ™trzne schody ze Å›niegu +Outer Snow Block Stair=ZewnÄ™trzne schody ze Å›niegu +Snow Block Slab=Półblok ze Å›niegu diff --git a/mods/minetest_game/stairs/locale/stairs.pt_BR.tr b/mods/minetest_game/stairs/locale/stairs.pt_BR.tr new file mode 100644 index 00000000..41777a81 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.pt_BR.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escada de vidro +Glass Slab=Placa de vidro +Inner Glass Stair=Escada interior de vidro +Outer Glass Stair=Escada exterior de vidro +Obsidian Glass Stair=Escada de vidro de obsidiana +Obsidian Glass Slab=Placa de vidro de obsidiana +Inner Obsidian Glass Stair=Escada interior de vidro de obsidiana +Outer Obsidian Glass Stair=Escada exterior de vidro de obsidiana +Wooden Stair=Escada de madeira +Inner Wooden Stair=Escada interior de madeira +Outer Wooden Stair=Escada exterior de madeira +Wooden Slab=Laje de madeira +Jungle Wood Stair=Escada de madeira da selva +Inner Jungle Wood Stair=Escada interior de madeira da selva +Outer Jungle Wood Stair=Escada exterior de madeira da selva +Jungle Wood Slab=Laje de madeira da selva +Pine Wood Stair=Escada de madeira de pinho +Inner Pine Wood Stair=Escada interior de madeira de pinho +Outer Pine Wood Stair=Escada exterior de madeira de pinho +Pine Wood Slab=Laje de madeira de pinho +Acacia Wood Stair=Escada de madeira de acácia +Inner Acacia Wood Stair=Escada interior de madeira de acácia +Outer Acacia Wood Stair=Escada exterior de madeira de acácia +Acacia Wood Slab=Placa de madeira de acácia +Aspen Wood Stair=Escada de Ãlamo +Inner Aspen Wood Stair=Escada interior de Ãlamo +Outer Aspen Wood Stair=Escada exterior de Ãlamo +Aspen Wood Slab=Laje de Ãlamo +Stone Stair=Escada de Pedra +Inner Stone Stair=Escada interior de Pedra +Outer Stone Stair=Escada exterior de Pedra +Stone Slab=Laje de pedra +Cobblestone Stair=Escada de paralelepípedo +Inner Cobblestone Stair=Escada interior de paralelepípedo +Outer Cobblestone Stair=Escada exterior de paralelepípedo +Cobblestone Slab=Laje de paralelepípedo +Mossy Cobblestone Stair=Escada de paralelepípedo com musgo +Inner Mossy Cobblestone Stair=Escada interior de paralelepípedo com musgo +Outer Mossy Cobblestone Stair=Escada exterior de paralelepípedo com musgo +Mossy Cobblestone Slab=Laje de paralelepípedo com musgo +Stone Brick Stair=Escada de tijolo de pedra +Inner Stone Brick Stair=Escada interior de tijolo de pedra +Outer Stone Brick Stair=Escada exterior de tijolo de pedra +Stone Brick Slab=Laje de tijolo de pedra +Stone Block Stair=Escada Bloco de Pedra +Inner Stone Block Stair=Escada Interna de Bloco de Pedra +Outer Stone Block Stair=Escada Externa de Bloco de Pedra +Stone Block Slab=Laje de bloco de pedra +Desert Stone Stair=Escada de Pedra do Deserto +Inner Desert Stone Stair=Escada Interior de Pedra do Deserto +Outer Desert Stone Stair=Escada Exterior de Pedra do Deserto +Desert Stone Slab=Laje de pedra do deserto +Desert Cobblestone Stair=Escada de paralelepípedo do deserto +Inner Desert Cobblestone Stair=Escada interior de paralelepípedo do deserto +Outer Desert Cobblestone Stair=Escada exterior de paralelepípedo do deserto +Desert Cobblestone Slab=Laje de paralelepípedo do deserto +Desert Stone Brick Stair=Escada de tijolo de pedra do deserto +Inner Desert Stone Brick Stair=Escada interior de tijolos de pedra do deserto +Outer Desert Stone Brick Stair=Escada exterior de tijolos de pedra do deserto +Desert Stone Brick Slab=Laje de tijolo de pedra do deserto +Desert Stone Block Stair=Escada de Bloco de Pedra do Deserto +Inner Desert Stone Block Stair=Escada interior de bloco de pedra do deserto +Outer Desert Stone Block Stair=Escada exterior de Bloco de Pedra do Deserto +Desert Stone Block Slab=Laje do bloco de pedra do deserto +Sandstone Stair=Escada de arenito +Inner Sandstone Stair=Escada interior de arenito +Outer Sandstone Stair=Escada Exterior de Arenito +Sandstone Slab=Laje de arenito +Sandstone Brick Stair=Escada de tijolo de arenito +Inner Sandstone Brick Stair=Escada interior de tijolos de arenito +Outer Sandstone Brick Stair=Escada Exterior de Tijolo de Arenito +Sandstone Brick Slab=Laje de tijolo de arenito +Sandstone Block Stair=Escada do Bloco de Arenito +Inner Sandstone Block Stair=Escada interior de bloco de arenito +Outer Sandstone Block Stair=Escada exterior de bloco de arenito +Sandstone Block Slab=Laje de bloco de arenito +Desert Sandstone Stair=Escada de arenito do deserto +Inner Desert Sandstone Stair=Escada interior de arenito do deserto +Outer Desert Sandstone Stair=Escada exterior de arenito do deserto +Desert Sandstone Slab=Laje de arenito do deserto +Desert Sandstone Brick Stair=Escada de tijolos de arenito do deserto +Inner Desert Sandstone Brick Stair=Escada interior de tijolos de arenito do deserto +Outer Desert Sandstone Brick Stair=Escada exterior de tijolos de arenito do deserto +Desert Sandstone Brick Slab=Laje de tijolo de arenito do deserto +Desert Sandstone Block Stair=Escada do bloco de arenito do deserto +Inner Desert Sandstone Block Stair=Escada interior do bloco de arenito do deserto +Outer Desert Sandstone Block Stair=Escada exterior de bloco de arenito do deserto +Desert Sandstone Block Slab=Laje de bloco de arenito do deserto +Silver Sandstone Stair=Escada de arenito prateado +Inner Silver Sandstone Stair=Escada interior de Arenito Prateado +Outer Silver Sandstone Stair=Escada exterior de Arenito Prateado +Silver Sandstone Slab=Laje de arenito prateado +Silver Sandstone Brick Stair=Escada de tijolos de arenito prateado +Inner Silver Sandstone Brick Stair=Escada interior de tijolos de arenito prateado +Outer Silver Sandstone Brick Stair=Escada exterior de tijolos de arenito prateado +Silver Sandstone Brick Slab=Laje de tijolo de arenito prateado +Silver Sandstone Block Stair=Escada de blocos de arenito prateado +Inner Silver Sandstone Block Stair=Escada interior de bloco de arenito prateado +Outer Silver Sandstone Block Stair=Escada exterior de bloco de arenito prateado +Silver Sandstone Block Slab=Laje de bloco de arenito prateado +Obsidian Stair=Escada de Obsidiana +Inner Obsidian Stair=Escada interior de Obsidiana +Outer Obsidian Stair=Escada exterior de Obsidiana +Obsidian Slab=Laje de Obsidiana +Obsidian Brick Stair=Escada de Tijolos de Obsidiana +Inner Obsidian Brick Stair=Escada interna de Tijolos de Obsidiana +Outer Obsidian Brick Stair=Escada externa de Tijolos de Obsidiana +Obsidian Brick Slab=Laje de tijolos de obsidiana +Obsidian Block Stair=Escada de Bloco de Obsidiana +Inner Obsidian Block Stair=Escada interior de Bloco de obsidiana +Outer Obsidian Block Stair=Escada exterior de Bloco de obsidiana +Obsidian Block Slab=Laje de bloco de obsidiana +Brick Stair=Escada de Tijolos +Inner Brick Stair=Escada interior de Tijolos +Outer Brick Stair=Escada exterior de Tijolos +Brick Slab=Laje de tijolos +Steel Block Stair=Escada de bloco de aço +Inner Steel Block Stair=Escada interior de bloco de aço +Outer Steel Block Stair=Escada exterior de bloco de aço +Steel Block Slab=Laje de bloco de aço +Tin Block Stair=Escada de bloco de estanho +Inner Tin Block Stair=Escada interior de bloco de estanho +Outer Tin Block Stair=Escada exterior de bloco de lata +Tin Block Slab=Laje de bloco de estanho +Copper Block Stair=Escada de bloco de cobre +Inner Copper Block Stair=Escada interior de Bloco de Cobre +Outer Copper Block Stair=Escada exterior do Bloco de Cobre +Copper Block Slab=Laje de bloco de cobre +Bronze Block Stair=Escada Bloco de Bronze +Inner Bronze Block Stair=Escada interior de bloco de bronze +Outer Bronze Block Stair=Escada exterior de Bloco de Bronze +Bronze Block Slab=Laje de bloco de bronze +Gold Block Stair=Escada Bloco de Ouro +Inner Gold Block Stair=Escada interior de Bloco de Ouro +Outer Gold Block Stair=Escada exterior de Bloco de Ouro +Gold Block Slab=Laje de Bloco de Ouro +Ice Stair=Escada de gelo +Inner Ice Stair=Escada de gelo interior +Outer Ice Stair=Escada de gelo exterior +Ice Slab=Laje de gelo +Snow Block Stair=Escada Bloco de Neve +Inner Snow Block Stair=Escada de bloco de neve interior +Outer Snow Block Stair=Escada de bloco de neve exterior +Snow Block Slab=Laje de bloco de neve diff --git a/mods/minetest_game/stairs/locale/stairs.ru.tr b/mods/minetest_game/stairs/locale/stairs.ru.tr new file mode 100644 index 00000000..1296d4a4 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.ru.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=СтеклÑнные Ñтупени +Glass Slab=СтеклÑÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Inner Glass Stair=Внутренние ÑтеклÑнные Ñтупени +Outer Glass Stair=Внешние ÑтеклÑнные Ñтупени +Obsidian Glass Stair=Ступени из обÑидианового Ñтекла +Obsidian Glass Slab=Плита из обÑидианового Ñтекла +Inner Obsidian Glass Stair=Внутренние Ñтупени из обÑидианового Ñтекла +Outer Obsidian Glass Stair=Внешние Ñтупени из обÑидианового Ñтекла +Wooden Stair=ДеревÑнные Ñтупени +Inner Wooden Stair=Внутренние деревÑнные Ñтупени +Outer Wooden Stair=Внешние деревÑнные Ñтупени +Wooden Slab=ДеревÑÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Jungle Wood Stair=Ступени из тропичеÑкого дерева +Inner Jungle Wood Stair=Внутренние Ñтупени из тропичеÑкого дерева +Outer Jungle Wood Stair=Внешние Ñтупени из тропичеÑкого дерева +Jungle Wood Slab=Плита из тропичеÑкого дерева +Pine Wood Stair=СоÑновые Ñтупени +Inner Pine Wood Stair=Внутренние ÑоÑновые Ñтупени +Outer Pine Wood Stair=Внешние ÑоÑновые Ñтупени +Pine Wood Slab=СоÑÐ½Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Acacia Wood Stair=Ðкациевые Ñтупени +Inner Acacia Wood Stair=Внутренние акациевые Ñтупени +Outer Acacia Wood Stair=Внешние акациевые Ñтупени +Acacia Wood Slab=ÐÐºÐ°Ñ†Ð¸ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Aspen Wood Stair=ОÑиновые Ñтупени +Inner Aspen Wood Stair=Внутренние оÑиновые Ñтупени +Outer Aspen Wood Stair=Внешние оÑиновые Ñтупени +Aspen Wood Slab=ОÑÐ¸Ð½Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Stone Stair=Каменные Ñтупени +Inner Stone Stair=Внутренние каменные Ñтупени +Outer Stone Stair=Внешние каменные Ñтупени +Stone Slab=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cobblestone Stair=Булыжниковые Ñтупени +Inner Cobblestone Stair=Внутренние булыжниковые Ñтупени +Outer Cobblestone Stair=Внешние булыжниковые Ñтупени +Cobblestone Slab=Ð‘ÑƒÐ»Ñ‹Ð¶Ð½Ð¸ÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Mossy Cobblestone Stair=Ступени из замшелого булыжника +Inner Mossy Cobblestone Stair=Внутренние Ñтупени из замшелого булыжника +Outer Mossy Cobblestone Stair=Внешние Ñтупени из замшелого булыжника +Mossy Cobblestone Slab=Плита из замшелого булыжника +Stone Brick Stair=Cтупени из каменных кирпичей +Inner Stone Brick Stair=Внутренние Ñтупени из каменных кирпичей +Outer Stone Brick Stair=Внешние Ñтупени из каменных кирпичей +Stone Brick Slab=Плита из каменных кирпичей +Stone Block Stair=Ступени из ÐºÐ°Ð¼Ð½Ñ +Inner Stone Block Stair=Внутренние Ñтупени из ÐºÐ°Ð¼Ð½Ñ +Outer Stone Block Stair=Внешние Ñтупени из ÐºÐ°Ð¼Ð½Ñ +Stone Block Slab=Плита из ÐºÐ°Ð¼Ð½Ñ +Desert Stone Stair=Ступени из пуÑтынного ÐºÐ°Ð¼Ð½Ñ +Inner Desert Stone Stair=Внутренние Ñтупени из пуÑтынного ÐºÐ°Ð¼Ð½Ñ +Outer Desert Stone Stair=Внешние Ñтупени из пуÑтынного ÐºÐ°Ð¼Ð½Ñ +Desert Stone Slab=Плита из пуÑтынного ÐºÐ°Ð¼Ð½Ñ +Desert Cobblestone Stair=Ступени из пуÑтынного булыжника +Inner Desert Cobblestone Stair=Внутренние Ñтупени из пуÑтынного булыжника +Outer Desert Cobblestone Stair=Внешние Ñтупени из пуÑтынного булыжника +Desert Cobblestone Slab=Плита из пуÑтынного булыжника +Desert Stone Brick Stair=Ступени из пуÑтынных каменных кирпичей +Inner Desert Stone Brick Stair=Внутренние Ñтупени из пуÑтынных каменных кирпичей +Outer Desert Stone Brick Stair=Внешние Ñтупени из пуÑтынных каменных кирпичей +Desert Stone Brick Slab=Плита из пуÑтынных каменных кирпичей +Desert Stone Block Stair=Ступени из пуÑтынного каменного блока +Inner Desert Stone Block Stair=Внутренние Ñтупени из пуÑтынного каменного блока +Outer Desert Stone Block Stair=Внешние Ñтупени из пуÑтынного каменного блока +Desert Stone Block Slab=Плита из пуÑтынного каменного блока +Sandstone Stair=ПеÑчаниковые Ñтупени +Inner Sandstone Stair=Внутренние пеÑчаниковые Ñтупени +Outer Sandstone Stair=Внешние пеÑчаниковые Ñтупени +Sandstone Slab=ПеÑÑ‡Ð°Ð½Ð¸ÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Sandstone Brick Stair=Ступени из пеÑчаниковых кирпичей +Inner Sandstone Brick Stair=Внутренние Ñтупени из пеÑчаниковых кирпичей +Outer Sandstone Brick Stair=Внешние Ñтупени из пеÑчаниковых кирпичей +Sandstone Brick Slab=Плита из пеÑчаниковых кирпичей +Sandstone Block Stair=Ступени из пеÑчаникового блока +Inner Sandstone Block Stair=Внутренние Ñтупени из пеÑчаникового блока +Outer Sandstone Block Stair=Внешние Ñтупени из пеÑчаникового блока +Sandstone Block Slab=Плита из пеÑчаникового блока +Desert Sandstone Stair=Ступени из пуÑтынного пеÑчаника +Inner Desert Sandstone Stair=Внутренние Ñтупени из пуÑтынного пеÑчаника +Outer Desert Sandstone Stair=Внешние Ñтупени из пуÑтынного пеÑчаника +Desert Sandstone Slab=Плита из пуÑтынного пеÑчаника +Desert Sandstone Brick Stair=Ступени из пуÑтынных пеÑчаниковых кирпичей +Inner Desert Sandstone Brick Stair=Внутренние Ñтупени из пуÑтынных пеÑчаниковых кирпичей +Outer Desert Sandstone Brick Stair=Внешние Ñтупени из пуÑтынных пеÑчаниковых кирпичей +Desert Sandstone Brick Slab=Плита из пуÑтынных пеÑчаниковых кирпичей +Desert Sandstone Block Stair=Ступени из пуÑтынного пеÑчаникового блока +Inner Desert Sandstone Block Stair=Внутренние Ñтупени из пуÑтынного пеÑчаникового блока +Outer Desert Sandstone Block Stair=Внешние Ñтупени из пуÑтынного пеÑчаникового блока +Desert Sandstone Block Slab=Плита из пуÑтынного пеÑчаникового блока +Silver Sandstone Stair=Ступени из ÑеребриÑтого пеÑчаника +Inner Silver Sandstone Stair=Внутренние Ñтупени из ÑеребриÑтого пеÑчаника +Outer Silver Sandstone Stair=Внешние Ñтупени из ÑеребриÑтого пеÑчаника +Silver Sandstone Slab=Плита из ÑеребриÑтого пеÑчаника +Silver Sandstone Brick Stair=Ступени из ÑеребриÑтых пеÑчаниковых кирпичей +Inner Silver Sandstone Brick Stair=Внутренние Ñтупени из ÑеребриÑтых пеÑчаниковых кирпичей +Outer Silver Sandstone Brick Stair=Внешние Ñтупени из ÑеребриÑтых пеÑчаниковых кирпичей +Silver Sandstone Brick Slab=Плита из ÑеребриÑтых пеÑчаниковых кирпичей +Silver Sandstone Block Stair=Ступени из ÑеребриÑтого пеÑчаникового блока +Inner Silver Sandstone Block Stair=Внутренние Ñтупени из ÑеребриÑтого пеÑчаникового блока +Outer Silver Sandstone Block Stair=Внешние Ñтупени из ÑеребриÑтого пеÑчаникового блока +Silver Sandstone Block Slab=Плита из ÑеребриÑтого пеÑчаникового блока +Obsidian Stair=ОбÑидиановые Ñтупени +Inner Obsidian Stair=Внутренние обÑидиановые Ñтупени +Outer Obsidian Stair=Внешние обÑидиановые Ñтупени +Obsidian Slab=ОбÑÐ¸Ð´Ð¸Ð°Ð½Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Obsidian Brick Stair=Ступени из обÑидиановых кирпичей +Inner Obsidian Brick Stair=Внутренние Ñтупени из обÑидиановых кирпичей +Outer Obsidian Brick Stair=Внешние Ñтупени из обÑидиановых кирпичей +Obsidian Brick Slab=Плита из обÑидиановых кирпичей +Obsidian Block Stair=Ступени из обÑидианового блока +Inner Obsidian Block Stair=Внутренние Ñтупени из обÑидианового блока +Outer Obsidian Block Stair=Внешние Ñтупени из обÑидианового блока +Obsidian Block Slab=Плита из обÑидианового блока +Brick Stair=Кирпичные Ñтупени +Inner Brick Stair=Внутренние кирпичные Ñтупени +Outer Brick Stair=Внешние кирпичные Ñтупени +Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Steel Block Stair=Стальные Ñтупени +Inner Steel Block Stair=Внутренние Ñтальные Ñтупени +Outer Steel Block Stair=Внешние Ñтальные Ñтупени +Steel Block Slab=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Tin Block Stair=ОловÑнные Ñтупени +Inner Tin Block Stair=Внутренние оловÑнные Ñтупени +Outer Tin Block Stair=Внешние оловÑнные Ñтупени +Tin Block Slab=ОловÑÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Copper Block Stair=Медные Ñтупени +Inner Copper Block Stair=Внутренние медные Ñтупени +Outer Copper Block Stair=Внешние медные Ñтупени +Copper Block Slab=ÐœÐµÐ´Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Bronze Block Stair=Бронзовые Ñтупени +Inner Bronze Block Stair=Внутренние бронзовые Ñтупени +Outer Bronze Block Stair=Внешние бронзовые Ñтупени +Bronze Block Slab=Ð‘Ñ€Ð¾Ð½Ð·Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Gold Block Stair=Золотые Ñтупени +Inner Gold Block Stair=Внутренние золотые Ñтупени +Outer Gold Block Stair=Внешние золотые Ñтупени +Gold Block Slab=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Ice Stair=ЛедÑные Ñтупени +Inner Ice Stair=Внутренние ледÑные Ñтупени +Outer Ice Stair=Внешние ледÑные Ñтупени +Ice Slab=ЛедÑÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Snow Block Stair=Снежные Ñтупени +Inner Snow Block Stair=Внутренние Ñнежные Ñтупени +Outer Snow Block Stair=Внешние Ñнежные Ñтупени +Snow Block Slab=Ð¡Ð½ÐµÐ¶Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° diff --git a/mods/minetest_game/stairs/locale/stairs.sk.tr b/mods/minetest_game/stairs/locale/stairs.sk.tr new file mode 100644 index 00000000..b006fdb5 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.sk.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Sklenené schod +Glass Slab=Sklenený stupienok +Inner Glass Stair=Vnútorný sklenené schod +Outer Glass Stair=Vonkajší sklenené schod +Obsidian Glass Stair=Obsidiánové sklenené schod +Obsidian Glass Slab=Obsidiánový sklenený stupienok +Inner Obsidian Glass Stair=Vnútorný obsidiánové sklenené schod +Outer Obsidian Glass Stair=Vonkajší obsidiánové sklenené schod +Wooden Stair=Drevené schod +Inner Wooden Stair=Vnútorný drevené schod +Outer Wooden Stair=Vonkajší drevené schod +Wooden Slab=Drevený stupienok +Jungle Wood Stair=Drevené schod z džungľového dreva +Inner Jungle Wood Stair=Vnútorný drevené schod z džungľového dreva +Outer Jungle Wood Stair=Vonkajší drevené schod z džungľového dreva +Jungle Wood Slab=Stupienok z džungľového dreva +Pine Wood Stair=Drevené schod z borovicového dreva +Inner Pine Wood Stair=Vnútorný drevené schod z borovicového dreva +Outer Pine Wood Stair=Vonkajší drevené schod z borovicového dreva +Pine Wood Slab=Stupienok z borovicového dreva +Acacia Wood Stair=Drevené schod z akáciového dreva +Inner Acacia Wood Stair=Vnútorný drevené schod z akáciového dreva +Outer Acacia Wood Stair=Vonkajší drevené schod z akáciového dreva +Acacia Wood Slab=Stupienok z akáciového dreva +Aspen Wood Stair=Drevené schod z osiky +Inner Aspen Wood Stair=Vnútorný drevené schod z osiky +Outer Aspen Wood Stair=Vonkajší drevené schod z osiky +Aspen Wood Slab=Stupienok z osiky +Stone Stair=Kamenné schod +Inner Stone Stair=Vnútorný kamenné schod +Outer Stone Stair=Vonkajší kamenné schod +Stone Slab=Kamenný stupienok +Cobblestone Stair=Schod z dlažbového kameňa +Inner Cobblestone Stair=Vnútorný schod z dlažbového kameňa +Outer Cobblestone Stair=Vonkajší schod z dlažbového kameňa +Cobblestone Slab=Stupienok z dlažbového kameňa +Mossy Cobblestone Stair=Schod dlažbového kameňa obrastené machom +Inner Mossy Cobblestone Stair=Vnútorný schod dlažbového kameňa obrastené machom +Outer Mossy Cobblestone Stair=Vonkajší schod dlažbového kameňa obrastené machom +Mossy Cobblestone Slab=Stupienok z dlažbového kameňa obrastený machom +Stone Brick Stair=Schod z kamenných tehál +Inner Stone Brick Stair=Vnútorný schod z kamenných tehál +Outer Stone Brick Stair=Vonkajší schod z kamenných tehál +Stone Brick Slab=Stupienok z kamenných tehál +Stone Block Stair=Schod z kameňa +Inner Stone Block Stair=Vnútorný schod z kameňa +Outer Stone Block Stair=Vonkajší schod z kameňa +Stone Block Slab=Stupienok z kameňa +Desert Stone Stair=Schod z púštneho kameňa +Inner Desert Stone Stair=Vnútorný schod z púštneho kameňa +Outer Desert Stone Stair=Vonkajší schod z púštneho kameňa +Desert Stone Slab=Stupienok z púštneho kameňa +Desert Cobblestone Stair=Schod z púštneho dlažbového kameňa +Inner Desert Cobblestone Stair=Vnútorný schod z púštneho dlažbového kameňa +Outer Desert Cobblestone Stair=Vonkajší schod z púštneho dlažbového kameňa +Desert Cobblestone Slab=Stupienok z púštneho dlažbového kameňa +Desert Stone Brick Stair=Schod z tehiel z púštneho kameňa +Inner Desert Stone Brick Stair=Vnútorný schod z tehiel z púštneho kameňa +Outer Desert Stone Brick Stair=Vonkajší schod z tehiel z púštneho kameňa +Desert Stone Brick Slab=Stupienok z tehiel z púštneho kameňa +Desert Stone Block Stair=Schod z blokov púštneho kameňa +Inner Desert Stone Block Stair=Vnútorný schod z blokov púštneho kameňa +Outer Desert Stone Block Stair=Vonkajší schod z blokov púštneho kameňa +Desert Stone Block Slab=Stupienok z blokov púštneho kameňa +Sandstone Stair=Schod z pieskovca +Inner Sandstone Stair=Vnútorný schod z pieskovca +Outer Sandstone Stair=Vonkajší schod z pieskovca +Sandstone Slab=Stupienok z pieskovca +Sandstone Brick Stair=Schod z tehál pieskovca +Inner Sandstone Brick Stair=Vnútorný schod z tehál pieskovca +Outer Sandstone Brick Stair=Vonkajší schod z tehál pieskovca +Sandstone Brick Slab=Stupienok z tehál pieskovca +Sandstone Block Stair=Schod z blokov pieskovca +Inner Sandstone Block Stair=Vnútorný schod z blokov pieskovca +Outer Sandstone Block Stair=Vonkajší schod z blokov pieskovca +Sandstone Block Slab=Stupienok z blokov pieskovca +Desert Sandstone Stair=Schod z púštneho pieskovca +Inner Desert Sandstone Stair=Vnútorný schod z púštneho pieskovca +Outer Desert Sandstone Stair=Vonkajší schod z púštneho pieskovca +Desert Sandstone Slab=Stupienok z púštneho pieskovca +Desert Sandstone Brick Stair=Schod z tehál z púštneho pieskovca +Inner Desert Sandstone Brick Stair=Vnútorný schod z tehál z púštneho pieskovca +Outer Desert Sandstone Brick Stair=Vonkajší schod z tehál z púštneho pieskovca +Desert Sandstone Brick Slab=Stupienok z tehál z púštneho pieskovca +Desert Sandstone Block Stair=Schod z blokov púštneho pieskovca +Inner Desert Sandstone Block Stair=Vnútorný schod z blokov púštneho pieskovca +Outer Desert Sandstone Block Stair=Vonkajší schod z blokov púštneho pieskovca +Desert Sandstone Block Slab=Stupienok z blokov púštneho pieskovca +Silver Sandstone Stair=Schod zo strieborného pieskovca +Inner Silver Sandstone Stair=Vnútorný schod zo strieborného pieskovca +Outer Silver Sandstone Stair=Vonkajší schod zo strieborného pieskovca +Silver Sandstone Slab=Stupienok zo strieborného pieskovca +Silver Sandstone Brick Stair=Schod z tehál zo strieborného pieskovca +Inner Silver Sandstone Brick Stair=Vnútorný schod z tehál zo strieborného pieskovca +Outer Silver Sandstone Brick Stair=Vonkajší schod z tehál zo strieborného pieskovca +Silver Sandstone Brick Slab=Stupienok z tehál zo strieborného pieskovca +Silver Sandstone Block Stair=Schod z blokov strieborného pieskovca +Inner Silver Sandstone Block Stair=Vnútorný schod z blokov strieborného pieskovca +Outer Silver Sandstone Block Stair=Vonkajší schod z blokov strieborného pieskovca +Silver Sandstone Block Slab=Stupienok z blokov strieborného pieskovca +Obsidian Stair=Schod z obsidiánu +Inner Obsidian Stair=Vnútorný schod z obsidiánu +Outer Obsidian Stair=Vonkajší schod z obsidiánu +Obsidian Slab=Stupienok z obsidiánu +Obsidian Brick Stair=Schod z tehál obsidiánu +Inner Obsidian Brick Stair=Vnútorný schod z tehál obsidiánu +Outer Obsidian Brick Stair=Vonkajší schod z tehál obsidiánu +Obsidian Brick Slab=Stupienok z tehál obsidiánu +Obsidian Block Stair=Schod z bloku obsidiánu +Inner Obsidian Block Stair=Vnútorný schod z bloku obsidiánu +Outer Obsidian Block Stair=Vonkajší schod z bloku obsidiánu +Obsidian Block Slab=Stupienok z bloku obsidiánu +Brick Stair=Schod z tehál +Inner Brick Stair=Vnútorný schod z tehál +Outer Brick Stair=Vonkajší schod z tehál +Brick Slab=Stupienok z tehál +Steel Block Stair=Oceľový schod +Inner Steel Block Stair=Vnútorný oceľový schod +Outer Steel Block Stair=Vonkajší oceľový schod +Steel Block Slab=Oceľový stupienok +Tin Block Stair=Cínový schod +Inner Tin Block Stair=Vnútorný cínový schod +Outer Tin Block Stair=Vonkajší cínový schod +Tin Block Slab=Cínový stupienok +Copper Block Stair=Medený schod +Inner Copper Block Stair=Vnútorný medený schod +Outer Copper Block Stair=Vonkajší medený schod +Copper Block Slab=Medený stupienok +Bronze Block Stair=Bronzový schod +Inner Bronze Block Stair=Vnútorný bronzový schod +Outer Bronze Block Stair=Vonkajší bronzový schod +Bronze Block Slab=Bronzový stupienok +Gold Block Stair=Zlatý schod +Inner Gold Block Stair=Vnútorný zlatý schod +Outer Gold Block Stair=Vonkajší zlatý schod +Gold Block Slab=Zlatý stupienok +Ice Stair=Ľadový schod +Inner Ice Stair=Vnútorný ľadový schod +Outer Ice Stair=Vonkajší ľadový schod +Ice Slab=Ľadový stupienok +Snow Block Stair=Snehový schod +Inner Snow Block Stair=Vnútorný snehový schod +Outer Snow Block Stair=Vonkajší snehový schod +Snow Block Slab=Snehový stupienok diff --git a/mods/minetest_game/stairs/locale/stairs.sv.tr b/mods/minetest_game/stairs/locale/stairs.sv.tr new file mode 100644 index 00000000..8044af81 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.sv.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Glastrappa +Glass Slab=Glasplatta +Inner Glass Stair=Inre glasstrappa +Outer Glass Stair=Yttre glasstrappa +Obsidian Glass Stair=Obsidianglasstrappa +Obsidian Glass Slab=Obsidianglasplatta +Inner Obsidian Glass Stair=Inre obsidianglastrappa +Outer Obsidian Glass Stair=Yttre obsidianglastrappa +Wooden Stair=Trätrappa +Inner Wooden Stair=Inre trätrappa +Outer Wooden Stair=Yttre trätrappa +Wooden Slab=Träplatta +Jungle Wood Stair=Djungelträtrappa +Inner Jungle Wood Stair=Inre djungelträtrappa +Outer Jungle Wood Stair=Ytter djungelträtrappa +Jungle Wood Slab=Djungelträplatta +Pine Wood Stair=Tallträplatta +Inner Pine Wood Stair=Inre tallträplatta +Outer Pine Wood Stair=Ytter tallträplatta +Pine Wood Slab=Tallskiva +Acacia Wood Stair=Acaciatrappa +Inner Acacia Wood Stair=Inre acaciatrappa +Outer Acacia Wood Stair=Yttre acaciatrappa +Acacia Wood Slab=Acaciaplatta +Aspen Wood Stair=Aspträtrappa +Inner Aspen Wood Stair=Inre aspträtrappa +Outer Aspen Wood Stair=Yttre aspträtrappa +Aspen Wood Slab=Aspträplatta +Stone Stair=Stentrappa +Inner Stone Stair=Inre stentrappa +Outer Stone Stair=Yttre stentrappa +Stone Slab=Stenplatta +Cobblestone Stair=Kullerstenstrappa +Inner Cobblestone Stair=Inre kullerstenstrappa +Outer Cobblestone Stair=Yttre kullerstenstrappa +Cobblestone Slab=Kullerstenplatta +Mossy Cobblestone Stair=Mossig kullerstenstrappa +Inner Mossy Cobblestone Stair=Inre mossig kullerstenstrappa +Outer Mossy Cobblestone Stair=Yttre mossig kullerstenstrappa +Mossy Cobblestone Slab=Mossig kullerstenplatta +Stone Brick Stair=Stentegeltrappa +Inner Stone Brick Stair=Inre stentegeltrappa +Outer Stone Brick Stair=Yttre stentegeltrappa +Stone Brick Slab=Stentegelplatta +Stone Block Stair=Stenblockstrappa +Inner Stone Block Stair=Inre stenblockstrappa +Outer Stone Block Stair=Yttre stenblockstrappa +Stone Block Slab=Stenblocksplatta +Desert Stone Stair=Ökenstentrappa +Inner Desert Stone Stair=Inre ökenstentrappa +Outer Desert Stone Stair=Yttre ökenstentrappa +Desert Stone Slab=Ökenstenplatta +Desert Cobblestone Stair=Ökenkullerstenstrappa +Inner Desert Cobblestone Stair=Inre ökenkullerstenstrappa +Outer Desert Cobblestone Stair=Yttre ökenkullerstenstrappa +Desert Cobblestone Slab=Ökenkullerstensplatta +Desert Stone Brick Stair=Ökentegelstenstrappa +Inner Desert Stone Brick Stair=Inre Ökentegelstenstrappa +Outer Desert Stone Brick Stair=Yttre Ökentegelstenstrappa +Desert Stone Brick Slab=Ökentegelstensplatta +Desert Stone Block Stair=Ökenstenblockstrappa +Inner Desert Stone Block Stair=Inre ökenstenblockstrappa +Outer Desert Stone Block Stair=Yttre ökenstenblockstrappa +Desert Stone Block Slab=Ökenstenblocksplatta +Sandstone Stair=Sandstenstrappa +Inner Sandstone Stair=Inre Sandstenstrappa +Outer Sandstone Stair=Yttre Sandstenstrappa +Sandstone Slab=Sandstenplatta +Sandstone Brick Stair=Sandstentegeltrappa +Inner Sandstone Brick Stair=Inre Sandstentegeltrappa +Outer Sandstone Brick Stair=Yttre Sandstentegeltrappa +Sandstone Brick Slab=Sandstentegelplatta +Sandstone Block Stair=Sandstenblockstrappa +Inner Sandstone Block Stair=Inre Sandstenblockstrappa +Outer Sandstone Block Stair=Yttre Sandstenblockstrappa +Sandstone Block Slab=Sandstenblocksplatta +Desert Sandstone Stair=Ökensandstenstrappa +Inner Desert Sandstone Stair=Inre ökensandstenstrappa +Outer Desert Sandstone Stair=Yttre ökensandstenstrappa +Desert Sandstone Slab=Ökensandstensplatta +Desert Sandstone Brick Stair=Ökensandstentegeltrappa +Inner Desert Sandstone Brick Stair=Inre ökensandstentegeltrappa +Outer Desert Sandstone Brick Stair=Yttre ökensandstentegeltrappa +Desert Sandstone Brick Slab=Ökensandstentegelplatta +Desert Sandstone Block Stair=Ökensandstentegeltrappa +Inner Desert Sandstone Block Stair=Inre ökensandstentegeltrappa +Outer Desert Sandstone Block Stair=Yttre ökensandstentegeltrappa +Desert Sandstone Block Slab=Ökensandstentegelplatta +Silver Sandstone Stair=Silversandstenstrappa +Inner Silver Sandstone Stair=Inre silversandstenstrappa +Outer Silver Sandstone Stair=Yttre silversandstenstrappa +Silver Sandstone Slab=Silversandstenstrappa +Silver Sandstone Brick Stair=Silversandstenstegeltrappa +Inner Silver Sandstone Brick Stair=Inre silversandstenstegeltrappa +Outer Silver Sandstone Brick Stair=Yttre silversandstenstegeltrappa +Silver Sandstone Brick Slab=Silversandstenstegelplatta +Silver Sandstone Block Stair=Silversandstenblockstrappa +Inner Silver Sandstone Block Stair=Inre silversandstenblockstrappa +Outer Silver Sandstone Block Stair=Yttre silversandstenblockstrappa +Silver Sandstone Block Slab=Silversandstenblocksplatta +Obsidian Stair=Obsidiantrappa +Inner Obsidian Stair=Inre obsidiantrappa +Outer Obsidian Stair=Yttre obsidiantrappa +Obsidian Slab=Obsidianplatta +Obsidian Brick Stair=Obsidiantegeltrappa +Inner Obsidian Brick Stair=Inre obsidiantegeltrappa +Outer Obsidian Brick Stair=Yttre obsidiantegeltrappa +Obsidian Brick Slab=Obsidiantegelplatta +Obsidian Block Stair=Obsidianblocktrappa +Inner Obsidian Block Stair=Inre Obsidianblocktrappa +Outer Obsidian Block Stair=Yttre Obsidianblocktrappa +Obsidian Block Slab=Obsidianblockplatta +Brick Stair=Tegeltrappa +Inner Brick Stair=Inre tegeltrappa +Outer Brick Stair=Yttre tegeltrappa +Brick Slab=Tegelplatta +Steel Block Stair=StÃ¥ltrappa +Inner Steel Block Stair=Inre stÃ¥ltrappa +Outer Steel Block Stair=Yttre stÃ¥ltrappa +Steel Block Slab=StÃ¥lplatta +Tin Block Stair=Tenntrappa +Inner Tin Block Stair=Inre tenntrappa +Outer Tin Block Stair=Yttre tenntrappa +Tin Block Slab=Tennplatta +Copper Block Stair=Koppartrappa +Inner Copper Block Stair=Inre koppartrappa +Outer Copper Block Stair=Yttre koppartrappa +Copper Block Slab=Kopparplatta +Bronze Block Stair=Bronstrappa +Inner Bronze Block Stair=Inre bronstrappa +Outer Bronze Block Stair=Yttre bronstrappa +Bronze Block Slab=Bronsplatta +Gold Block Stair=Guldtrappa +Inner Gold Block Stair=Inre guldtrappa +Outer Gold Block Stair=Yttre guldtrappa +Gold Block Slab=Guldplatta +Ice Stair=Istrappa +Inner Ice Stair=Inre istrappa +Outer Ice Stair=Yttre istrappa +Ice Slab=Isplatta +Snow Block Stair=Snöblockstrappa +Inner Snow Block Stair=Inre snöblockstrappa +Outer Snow Block Stair=Yttre snöblockstrappa +Snow Block Slab=Snöblocksplatta diff --git a/mods/minetest_game/stairs/locale/stairs.uk.tr b/mods/minetest_game/stairs/locale/stairs.uk.tr new file mode 100644 index 00000000..bf729a03 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.uk.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=СклÑна Ñходинка +Glass Slab=СклÑна плита +Inner Glass Stair=Кутова ÑклÑна Ñходинка (внутрішній кут) +Outer Glass Stair=Кутова ÑклÑна Ñходинка (зовнішній кут) +Obsidian Glass Stair=Сходинка з обÑидіанового Ñкла +Obsidian Glass Slab=Плита з обÑидіанового Ñкла +Inner Obsidian Glass Stair=Кутова Ñходинка з обÑидіанового Ñкла (внутрішній кут) +Outer Obsidian Glass Stair=Кутова Ñходинка з обÑидіанового Ñкла (зовнішній кут) +Wooden Stair=Дерев'Ñна Ñходинка +Inner Wooden Stair=Кутова дерев'Ñна Ñходинка (внутрішній кут) +Outer Wooden Stair=Кутова дерев'Ñна Ñходинка (зовнішній кут) +Wooden Slab=Дерев'Ñна плита +Jungle Wood Stair=Сходинка з тропічного дерева +Inner Jungle Wood Stair=Кутова Ñходинка з тропічного дерева (внутрішній кут) +Outer Jungle Wood Stair=Кутова Ñходинка з тропічного дерева (зовнішній кут) +Jungle Wood Slab=Плита з тропічного дерева +Pine Wood Stair=СоÑнова Ñходинка +Inner Pine Wood Stair=Кутова ÑоÑнова Ñходинка (внутрішній кут) +Outer Pine Wood Stair=Кутова ÑоÑнова Ñходинка (зовнішній кут) +Pine Wood Slab=СоÑнова плита +Acacia Wood Stair=Ðкацієва Ñходинка +Inner Acacia Wood Stair=Кутова акацієва Ñходинка (внутрішній кут) +Outer Acacia Wood Stair=Кутова акацієва Ñходинка (зовнішній кут) +Acacia Wood Slab=Ðкацієва плита +Aspen Wood Stair=ОÑикова Ñходинка +Inner Aspen Wood Stair=Кутова оÑикова Ñходинка (внутрішній кут) +Outer Aspen Wood Stair=Кутова оÑикова Ñходинка (зовнішній кут) +Aspen Wood Slab=ОÑикова плита +Stone Stair=Кам'Ñна Ñходинка +Inner Stone Stair=Кутова кам'Ñна Ñходинка (внутрішній кут) +Outer Stone Stair=Кутова кам'Ñна Ñходинка (зовнішній кут) +Stone Slab=Кам'Ñна плита +Cobblestone Stair=КруглÑкова Ñходинка +Inner Cobblestone Stair=Кутова круглÑкова Ñходинка (внутрішній кут) +Outer Cobblestone Stair=Кутова круглÑкова Ñходинка (зовнішній кут) +Cobblestone Slab=КруглÑкова плита +Mossy Cobblestone Stair=Сходинка з моховитого круглÑку +Inner Mossy Cobblestone Stair=Кутова Ñходинка з моховитого круглÑку (внутрішній кут) +Outer Mossy Cobblestone Stair=Кутова Ñходинка з моховитого круглÑку (зовнішній кут) +Mossy Cobblestone Slab=Плита з моховитого круглÑку +Stone Brick Stair=Сходинка з кам'Ñної цегли +Inner Stone Brick Stair=Кутова Ñходинка з кам'Ñної цегли (внутрішній кут) +Outer Stone Brick Stair=Кутова Ñходинка з кам'Ñної цегли (зовнішній кут) +Stone Brick Slab=Плита з кам'Ñної цегли +Stone Block Stair=Сходинка з блоку каменю +Inner Stone Block Stair=Кутова Ñходинка з блоку каменю (внутрішній кут) +Outer Stone Block Stair=Кутова Ñходинка з блоку каменю (зовнішній кут) +Stone Block Slab=Плита з блоку каменю +Desert Stone Stair=Сходинка з пуÑтельного каменю +Inner Desert Stone Stair=Кутова Ñходинка з пуÑтельного каменю (внутрішній кут) +Outer Desert Stone Stair=Кутова Ñходинка з пуÑтельного каменю (зовнішній кут) +Desert Stone Slab=Плита з пуÑтельного каменю +Desert Cobblestone Stair=Сходинка з пуÑтельного круглÑку +Inner Desert Cobblestone Stair=Кутова Ñходинка з пуÑтельного круглÑку (внутрішній кут) +Outer Desert Cobblestone Stair=Кутова Ñходинка з пуÑтельного круглÑку (зовнішній кут) +Desert Cobblestone Slab=Плита з пуÑтельного круглÑку +Desert Stone Brick Stair=Сходинка з цегли з пуÑтельного каменю +Inner Desert Stone Brick Stair=Кутова Ñходинка з цегли з пуÑтельного каменю (внутрішній кут) +Outer Desert Stone Brick Stair=Кутова Ñходинка з цегли з пуÑтельного каменю (зовнішній кут) +Desert Stone Brick Slab=Плита з цегли з пуÑтельного каменю +Desert Stone Block Stair=Сходинка з блоку пуÑтельного каменю +Inner Desert Stone Block Stair=Кутова Ñходинка з блоку пуÑтельного каменю (внутрішній кут) +Outer Desert Stone Block Stair=Кутова Ñходинка з блоку пуÑтельного каменю (зовнішній кут) +Desert Stone Block Slab=Плита з блоку пуÑтельного каменю +Sandstone Stair=ПіÑковикова Ñходинка +Inner Sandstone Stair=Кутова піÑковикова Ñходинка (внутрішній кут) +Outer Sandstone Stair=Кутова піÑковикова Ñходинка (зовнішній кут) +Sandstone Slab=ПіÑковикова плита +Sandstone Brick Stair=Сходинка з піÑковикової цегли +Inner Sandstone Brick Stair=Кутова Ñходинка з піÑковикової цегли (внутрішній кут) +Outer Sandstone Brick Stair=Кутова Ñходинка з піÑковикової цегли (зовнішній кут) +Sandstone Brick Slab=Плита з піÑковикової цегли +Sandstone Block Stair=Сходинка з блоку піÑковику +Inner Sandstone Block Stair=Кутова Ñходинка з блоку піÑковику (внутрішній кут) +Outer Sandstone Block Stair=Кутова Ñходинка з блоку піÑковику (зовнішній кут) +Sandstone Block Slab=Плита з блоку піÑковику +Desert Sandstone Stair=Сходинка з пуÑтельного піÑковику +Inner Desert Sandstone Stair=Кутова Ñходинка з пуÑтельного піÑковику (внутрішній кут) +Outer Desert Sandstone Stair=Кутова Ñходинка з пуÑтельного піÑковику (зовнішній кут) +Desert Sandstone Slab=Плита з пуÑтельного піÑковику +Desert Sandstone Brick Stair=Сходинка з цегли з пуÑтельного піÑковику +Inner Desert Sandstone Brick Stair=Кутова Ñходинка з цегли з пуÑтельного піÑковику (внутрішній кут) +Outer Desert Sandstone Brick Stair=Кутова Ñходинка з цегли з пуÑтельного піÑковику (зовнішній кут) +Desert Sandstone Brick Slab=Плита з цегли з пуÑтельного піÑковику +Desert Sandstone Block Stair=Сходинка з блоку пуÑтельного піÑковику +Inner Desert Sandstone Block Stair=Кутова Ñходинка з блоку пуÑтельного піÑковику (внутрішній кут) +Outer Desert Sandstone Block Stair=Кутова Ñходинка з блоку пуÑтельного піÑковику (зовнішній кут) +Desert Sandstone Block Slab=Плита з блоку пуÑтельного піÑковику +Silver Sandstone Stair=Сходинка зі Ñрібного піÑковику +Inner Silver Sandstone Stair=Кутова Ñходинка зі Ñрібного піÑковику (внутрішній кут) +Outer Silver Sandstone Stair=Кутова Ñходинка зі Ñрібного піÑковику (зовнішній кут) +Silver Sandstone Slab=Плита зі Ñрібного піÑковику +Silver Sandstone Brick Stair=Сходинка з цегли зі Ñрібного піÑковику +Inner Silver Sandstone Brick Stair=Кутова Ñходинка з цегли зі Ñрібного піÑковику (внутрішній кут) +Outer Silver Sandstone Brick Stair=Кутова Ñходинка з цегли зі Ñрібного піÑковику (зовнішній кут) +Silver Sandstone Brick Slab=Плита з цегли зі Ñрібного піÑковику +Silver Sandstone Block Stair=Сходинка з блоку Ñрібного піÑковику +Inner Silver Sandstone Block Stair=Кутова Ñходинка з блоку Ñрібного піÑковику (внутрішній кут) +Outer Silver Sandstone Block Stair=Кутова Ñходинка з блоку Ñрібного піÑковику (зовнішній кут) +Silver Sandstone Block Slab=Плита з блоку Ñрібного піÑковику +Obsidian Stair=ОбÑидіанова Ñходинка +Inner Obsidian Stair=Кутова обÑидіанова Ñходинка (внутрішній кут) +Outer Obsidian Stair=Кутова обÑидіанова Ñходинка (зовнішній кут) +Obsidian Slab=ОбÑидіанова плита +Obsidian Brick Stair=Сходинка з обÑидіанової цегли +Inner Obsidian Brick Stair=Кутова Ñходинка з обÑидіанової цегли (внутрішній кут) +Outer Obsidian Brick Stair=Кутова Ñходинка з обÑидіанової цегли (зовнішній кут) +Obsidian Brick Slab=Плита з обÑидіанової цегли +Obsidian Block Stair=Сходинка з блоку обÑидіану +Inner Obsidian Block Stair=Кутова Ñходинка з блоку обÑидіану (внутрішній кут) +Outer Obsidian Block Stair=Кутова Ñходинка з блоку обÑидіану (зовнішній кут) +Obsidian Block Slab=Плита з блоку обÑидіану +Brick Stair=ЦеглÑна Ñходинка +Inner Brick Stair=Кутова цеглÑна Ñходинка (внутрішній кут) +Outer Brick Stair=Кутова цеглÑна Ñходинка (зовнішній кут) +Brick Slab=ЦеглÑна плита +Steel Block Stair=Сходинка з блоку Ñталі +Inner Steel Block Stair=Кутова Ñходинка з блоку Ñталі (внутрішній кут) +Outer Steel Block Stair=Кутова Ñходинка з блоку Ñталі (зовнішній кут) +Steel Block Slab=Плита з блоку Ñталі +Tin Block Stair=Сходинка з блоку олова +Inner Tin Block Stair=Кутова Ñходинка з блоку олова (внутрішній кут) +Outer Tin Block Stair=Кутова Ñходинка з блоку олова (зовнішній кут) +Tin Block Slab=Плита з блоку олова +Copper Block Stair=Сходинка з блоку міді +Inner Copper Block Stair=Кутова Ñходинка з блоку міді (внутрішній кут) +Outer Copper Block Stair=Кутова Ñходинка з блоку міді (зовнішній кут) +Copper Block Slab=Плита з блоку міді +Bronze Block Stair=Сходинка з блоку бронзи +Inner Bronze Block Stair=Кутова Ñходинка з блоку бронзи (внутрішній кут) +Outer Bronze Block Stair=Кутова Ñходинка з блоку бронзи (зовнішній кут) +Bronze Block Slab=Плита з блоку бронзи +Gold Block Stair=Сходинка з блоку золота +Inner Gold Block Stair=Кутова Ñходинка з блоку золота (внутрішній кут) +Outer Gold Block Stair=Кутова Ñходинка з блоку золота (зовнішній кут) +Gold Block Slab=Плита з блоку золота +Ice Stair=Крижана Ñходинка +Inner Ice Stair=Кутова крижана Ñходинка (внутрішній кут) +Outer Ice Stair=Кутова крижана Ñходинка (зовнішній кут) +Ice Slab=Крижана плита +Snow Block Stair=Сходинка з блоку Ñнігу +Inner Snow Block Stair=Кутова Ñходинка з блоку Ñнігу (внутрішній кут) +Outer Snow Block Stair=Кутова Ñходинка з блоку Ñнігу (зовнішній кут) +Snow Block Slab=Плита з блоку Ñнігу diff --git a/mods/minetest_game/stairs/locale/stairs.zh_CN.tr b/mods/minetest_game/stairs/locale/stairs.zh_CN.tr new file mode 100644 index 00000000..e37ebcbb --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.zh_CN.tr @@ -0,0 +1,153 @@ +# textdomain: stairs +Glass Stair=玻璃楼梯 +Glass Slab=玻璃å°é˜¶ +Inner Glass Stair=玻璃楼梯(内) +Outer Glass Stair=玻璃楼梯(外) +Obsidian Glass Stair=黑曜石玻璃楼梯 +Obsidian Glass Slab=黑曜石玻璃å°é˜¶ +Inner Obsidian Glass Stair=黑曜石玻璃楼梯(内) +Outer Obsidian Glass Stair=黑曜石玻璃楼梯(外) +Wooden Stair=木楼梯 +Inner Wooden Stair=木楼梯(内) +Outer Wooden Stair=木楼梯(外) +Wooden Slab=木å°é˜¶ +Jungle Wood Stair=丛林木楼梯 +Inner Jungle Wood Stair=丛林木楼梯(内) +Outer Jungle Wood Stair=丛林木楼梯(外) +Jungle Wood Slab=丛林木å°é˜¶ +Pine Wood Stair=æ¾æœ¨æ¥¼æ¢¯ +Inner Pine Wood Stair=æ¾æœ¨æ¥¼æ¢¯(内) +Outer Pine Wood Stair=æ¾æœ¨æ¥¼æ¢¯(外) +Pine Wood Slab=æ¾æœ¨å°é˜¶ +Acacia Wood Stair=é‡‘åˆæ¬¢æœ¨æ¥¼æ¢¯ +Inner Acacia Wood Stair=é‡‘åˆæ¬¢æœ¨æ¥¼æ¢¯(内) +Outer Acacia Wood Stair=é‡‘åˆæ¬¢æœ¨æ¥¼æ¢¯(外) +Acacia Wood Slab=é‡‘åˆæ¬¢æœ¨å°é˜¶ +Aspen Wood Stair=ç™½æ¨æœ¨æ¥¼æ¢¯ +Inner Aspen Wood Stair=ç™½æ¨æœ¨æ¥¼æ¢¯(内) +Outer Aspen Wood Stair=ç™½æ¨æœ¨æ¥¼æ¢¯(外) +Aspen Wood Slab=ç™½æ¨æœ¨å°é˜¶ +Stone Stair=石楼梯 +Inner Stone Stair=石楼梯(内) +Outer Stone Stair=石楼梯(外) +Stone Slab=石å°é˜¶ +Cobblestone Stair=é¹…åµçŸ³æ¥¼æ¢¯ +Inner Cobblestone Stair=é¹…åµçŸ³æ¥¼æ¢¯(内) +Outer Cobblestone Stair=é¹…åµçŸ³æ¥¼æ¢¯(外) +Cobblestone Slab=é¹…åµçŸ³å°é˜¶ +Mossy Cobblestone Stair=苔藓覆盖的鹅åµçŸ³æ¥¼æ¢¯ +Inner Mossy Cobblestone Stair=苔藓覆盖的鹅åµçŸ³æ¥¼æ¢¯(内) +Outer Mossy Cobblestone Stair=苔藓覆盖的鹅åµçŸ³æ¥¼æ¢¯(外) +Mossy Cobblestone Slab=苔藓覆盖的鹅åµçŸ³å°é˜¶ +Stone Brick Stair=石砖楼梯 +Inner Stone Brick Stair=石砖楼梯(内) +Outer Stone Brick Stair=石砖楼梯(外) +Stone Brick Slab=石砖å°é˜¶ +Stone Block Stair=çŸ³å—æ¥¼æ¢¯ +Inner Stone Block Stair=çŸ³å—æ¥¼æ¢¯(内) +Outer Stone Block Stair=çŸ³å—æ¥¼æ¢¯(外) +Stone Block Slab=石å—å°é˜¶ +Desert Stone Stair=沙漠石楼梯 +Inner Desert Stone Stair=沙漠石楼梯(内) +Outer Desert Stone Stair=沙漠石楼梯(外) +Desert Stone Slab=沙漠石å°é˜¶ +Desert Cobblestone Stair=沙漠鹅åµçŸ³æ¥¼æ¢¯ +Inner Desert Cobblestone Stair=沙漠鹅åµçŸ³æ¥¼æ¢¯(内) +Outer Desert Cobblestone Stair=沙漠鹅åµçŸ³æ¥¼æ¢¯(外) +Desert Cobblestone Slab=沙漠鹅åµçŸ³å°é˜¶ +Desert Stone Brick Stair=沙漠石砖楼梯 +Inner Desert Stone Brick Stair=沙漠石砖楼梯(内) +Outer Desert Stone Brick Stair=沙漠石砖楼梯(外) +Desert Stone Brick Slab=沙漠石砖å°é˜¶ +Desert Stone Block Stair=æ²™æ¼ çŸ³å—æ¥¼æ¢¯ +Inner Desert Stone Block Stair=æ²™æ¼ çŸ³å—æ¥¼æ¢¯(内) +Outer Desert Stone Block Stair=æ²™æ¼ çŸ³å—æ¥¼æ¢¯(外) +Desert Stone Block Slab=沙漠石å—å°é˜¶ +Sandstone Stair=沙石楼梯 +Inner Sandstone Stair=沙石楼梯(内) +Outer Sandstone Stair=沙石楼梯(外) +Sandstone Slab=沙石å°é˜¶ +Sandstone Brick Stair=沙石砖楼梯 +Inner Sandstone Brick Stair=沙石砖楼梯(内) +Outer Sandstone Brick Stair=沙石砖楼梯(外) +Sandstone Brick Slab=沙石砖å°é˜¶ +Sandstone Block Stair=æ²™çŸ³å—æ¥¼æ¢¯ +Inner Sandstone Block Stair=æ²™çŸ³å—æ¥¼æ¢¯(内) +Outer Sandstone Block Stair=æ²™çŸ³å—æ¥¼æ¢¯(外) +Sandstone Block Slab=沙石å—å°é˜¶ +Desert Sandstone Stair=沙漠沙石楼梯 +Inner Desert Sandstone Stair=沙漠沙石楼梯(内) +Outer Desert Sandstone Stair=沙漠沙石楼梯(外) +Desert Sandstone Slab=沙漠沙石å°é˜¶ +Desert Sandstone Brick Stair=沙漠沙石砖楼梯 +Inner Desert Sandstone Brick Stair=沙漠沙石砖楼梯(内) +Outer Desert Sandstone Brick Stair=沙漠沙石砖楼梯(外) +Desert Sandstone Brick Slab=沙漠沙石砖å°é˜¶ +Desert Sandstone Block Stair=æ²™æ¼ æ²™çŸ³å—æ¥¼æ¢¯ +Inner Desert Sandstone Block Stair=æ²™æ¼ æ²™çŸ³å—æ¥¼æ¢¯(内) +Outer Desert Sandstone Block Stair=æ²™æ¼ æ²™çŸ³å—æ¥¼æ¢¯(外) +Desert Sandstone Block Slab=沙漠沙石å—å°é˜¶ +Silver Sandstone Stair=银沙石楼梯 +Inner Silver Sandstone Stair=银沙石楼梯(内) +Outer Silver Sandstone Stair=银沙石楼梯(外) +Silver Sandstone Slab=银沙石å°é˜¶ +Silver Sandstone Brick Stair=银沙石砖楼梯 +Inner Silver Sandstone Brick Stair=银沙石砖楼梯(内) +Outer Silver Sandstone Brick Stair=银沙石砖楼梯(外) +Silver Sandstone Brick Slab=银沙石砖å°é˜¶ +Silver Sandstone Block Stair=é“¶æ²™çŸ³å—æ¥¼æ¢¯ +Inner Silver Sandstone Block Stair=é“¶æ²™çŸ³å—æ¥¼æ¢¯(内) +Outer Silver Sandstone Block Stair=é“¶æ²™çŸ³å—æ¥¼æ¢¯(外) +Silver Sandstone Block Slab=银沙石å—å°é˜¶ +Obsidian Stair=黑曜石楼梯 +Inner Obsidian Stair=黑曜石楼梯(内) +Outer Obsidian Stair=黑曜石楼梯(外) +Obsidian Slab=黑曜石å°é˜¶ +Obsidian Brick Stair=黑曜石砖楼梯 +Inner Obsidian Brick Stair=黑曜石砖楼梯(内) +Outer Obsidian Brick Stair=黑曜石砖楼梯(外) +Obsidian Brick Slab=黑曜石砖å°é˜¶ +Obsidian Block Stair=é»‘æ›œçŸ³å—æ¥¼æ¢¯ +Inner Obsidian Block Stair=é»‘æ›œçŸ³å—æ¥¼æ¢¯(内) +Outer Obsidian Block Stair=é»‘æ›œçŸ³å—æ¥¼æ¢¯(外) +Obsidian Block Slab=黑曜石å—å°é˜¶ +Brick Stair=砖楼梯 +Inner Brick Stair=砖楼梯(内) +Outer Brick Stair=砖楼梯(外) +Brick Slab=ç –å°é˜¶ +Steel Block Stair=é“å—æ¥¼æ¢¯ +Inner Steel Block Stair=é“å—æ¥¼æ¢¯(内) +Outer Steel Block Stair=é“å—æ¥¼æ¢¯(外) +Steel Block Slab=é“å—å°é˜¶ +Tin Block Stair=锡嗿¥¼æ¢¯ +Inner Tin Block Stair=锡嗿¥¼æ¢¯(内) +Outer Tin Block Stair=锡嗿¥¼æ¢¯(外) +Tin Block Slab=锡å—å°é˜¶ +Copper Block Stair=é“œå—æ¥¼æ¢¯ +Inner Copper Block Stair=é“œå—æ¥¼æ¢¯(内) +Outer Copper Block Stair=é“œå—æ¥¼æ¢¯(外) +Copper Block Slab=铜å—å°é˜¶ +Bronze Block Stair=é’é“œå—æ¥¼æ¢¯ +Inner Bronze Block Stair=é’é“œå—æ¥¼æ¢¯(内) +Outer Bronze Block Stair=é’é“œå—æ¥¼æ¢¯(外) +Bronze Block Slab=é’铜å—å°é˜¶ +Gold Block Stair=金嗿¥¼æ¢¯ +Inner Gold Block Stair=金嗿¥¼æ¢¯(内) +Outer Gold Block Stair=金嗿¥¼æ¢¯(外) +Gold Block Slab=金å—å°é˜¶ +Ice Stair=冰楼梯 +Inner Ice Stair=冰嗿¥¼æ¢¯(内) +Outer Ice Stair=冰嗿¥¼æ¢¯(外) +Ice Slab=冰å°é˜¶ +Snow Block Stair=é›ªå—æ¥¼æ¢¯ +Inner Snow Block Stair=é›ªå—æ¥¼æ¢¯(内) +Outer Snow Block Stair=é›ªå—æ¥¼æ¢¯(外) +Snow Block Slab=雪å—å°é˜¶ + + +##### not used anymore ##### + +Blue Stained Stair=è“æœ¨æ¥¼æ¢¯ +Inner Blue Stained Stair=è“æœ¨æ¥¼æ¢¯(内) +Outer Blue Stained Stair=è“æœ¨æ¥¼æ¢¯(外) +Blue Stained Slab=è“æœ¨å°é˜¶ diff --git a/mods/minetest_game/stairs/locale/stairs.zh_TW.tr b/mods/minetest_game/stairs/locale/stairs.zh_TW.tr new file mode 100644 index 00000000..eaed61f9 --- /dev/null +++ b/mods/minetest_game/stairs/locale/stairs.zh_TW.tr @@ -0,0 +1,153 @@ +# textdomain: stairs +Glass Stair=玻璃樓梯 +Glass Slab=玻璃臺階 +Inner Glass Stair=玻璃樓梯(å…§) +Outer Glass Stair=玻璃樓梯(外) +Obsidian Glass Stair=黑曜石玻璃樓梯 +Obsidian Glass Slab=黑曜石玻璃臺階 +Inner Obsidian Glass Stair=黑曜石玻璃樓梯(å…§) +Outer Obsidian Glass Stair=黑曜石玻璃樓梯(外) +Wooden Stair=木製樓梯 +Inner Wooden Stair=木樓梯(å…§) +Outer Wooden Stair=木樓梯(外) +Wooden Slab=木製臺階 +Jungle Wood Stair=墿ž—木樓梯 +Inner Jungle Wood Stair=墿ž—木樓梯(å…§) +Outer Jungle Wood Stair=墿ž—木樓梯(外) +Jungle Wood Slab=墿ž—木臺階 +Pine Wood Stair=æ¾æœ¨æ¨“梯 +Inner Pine Wood Stair=æ¾æœ¨æ¨“梯(å…§) +Outer Pine Wood Stair=æ¾æœ¨æ¨“梯(外) +Pine Wood Slab=æ¾æœ¨è‡ºéšŽ +Acacia Wood Stair=é‡‘åˆæ­¡æœ¨æ¨“梯 +Inner Acacia Wood Stair=é‡‘åˆæ­¡æœ¨æ¨“梯(å…§) +Outer Acacia Wood Stair=é‡‘åˆæ­¡æœ¨æ¨“梯(外) +Acacia Wood Slab=é‡‘åˆæ­¡æœ¨è‡ºéšŽ +Aspen Wood Stair=白楊木樓梯 +Inner Aspen Wood Stair=白楊木樓梯(å…§) +Outer Aspen Wood Stair=白楊木樓梯(外) +Aspen Wood Slab=白楊木臺階 +Stone Stair=石樓梯 +Inner Stone Stair=石樓梯(å…§) +Outer Stone Stair=石樓梯(外) +Stone Slab=石臺階 +Cobblestone Stair=圓石樓梯 +Inner Cobblestone Stair=圓石樓梯(å…§) +Outer Cobblestone Stair=圓石樓梯(外) +Cobblestone Slab=圓石臺階 +Mossy Cobblestone Stair=苔石樓梯 +Inner Mossy Cobblestone Stair=苔石樓梯(å…§) +Outer Mossy Cobblestone Stair=苔石樓梯(外) +Mossy Cobblestone Slab=苔石臺階 +Stone Brick Stair=石磚樓梯 +Inner Stone Brick Stair=石磚樓梯(å…§) +Outer Stone Brick Stair=石磚樓梯(外) +Stone Brick Slab=石磚臺階 +Stone Block Stair=石塊樓梯 +Inner Stone Block Stair=石塊樓梯(å…§) +Outer Stone Block Stair=石塊樓梯(外) +Stone Block Slab=石塊臺階 +Desert Stone Stair=沙漠石樓梯 +Inner Desert Stone Stair=沙漠石樓梯(å…§) +Outer Desert Stone Stair=沙漠石樓梯(外) +Desert Stone Slab=沙漠石臺階 +Desert Cobblestone Stair=沙漠圓石樓梯 +Inner Desert Cobblestone Stair=沙漠圓石樓梯(å…§) +Outer Desert Cobblestone Stair=沙漠圓石樓梯(外) +Desert Cobblestone Slab=沙漠圓石臺階 +Desert Stone Brick Stair=沙漠石磚樓梯 +Inner Desert Stone Brick Stair=沙漠石磚樓梯(å…§) +Outer Desert Stone Brick Stair=沙漠石磚樓梯(外) +Desert Stone Brick Slab=沙漠石磚臺階 +Desert Stone Block Stair=沙漠石塊樓梯 +Inner Desert Stone Block Stair=沙漠石塊樓梯(å…§) +Outer Desert Stone Block Stair=沙漠石塊樓梯(外) +Desert Stone Block Slab=沙漠石塊臺階 +Sandstone Stair=沙石樓梯 +Inner Sandstone Stair=沙石樓梯(å…§) +Outer Sandstone Stair=沙石樓梯(外) +Sandstone Slab=沙石臺階 +Sandstone Brick Stair=沙石磚樓梯 +Inner Sandstone Brick Stair=沙石磚樓梯(å…§) +Outer Sandstone Brick Stair=沙石磚樓梯(外) +Sandstone Brick Slab=沙石磚臺階 +Sandstone Block Stair=沙石塊樓梯 +Inner Sandstone Block Stair=沙石塊樓梯(å…§) +Outer Sandstone Block Stair=沙石塊樓梯(外) +Sandstone Block Slab=沙石塊臺階 +Desert Sandstone Stair=沙漠沙石樓梯 +Inner Desert Sandstone Stair=沙漠沙石樓梯(å…§) +Outer Desert Sandstone Stair=沙漠沙石樓梯(外) +Desert Sandstone Slab=沙漠沙石臺階 +Desert Sandstone Brick Stair=沙漠沙石磚樓梯 +Inner Desert Sandstone Brick Stair=沙漠沙石磚樓梯(å…§) +Outer Desert Sandstone Brick Stair=沙漠沙石磚樓梯(外) +Desert Sandstone Brick Slab=沙漠沙石磚臺階 +Desert Sandstone Block Stair=沙漠沙石塊樓梯 +Inner Desert Sandstone Block Stair=沙漠沙石塊樓梯(å…§) +Outer Desert Sandstone Block Stair=沙漠沙石塊樓梯(外) +Desert Sandstone Block Slab=沙漠沙石塊臺階 +Silver Sandstone Stair=銀沙石樓梯 +Inner Silver Sandstone Stair=銀沙石樓梯(å…§) +Outer Silver Sandstone Stair=銀沙石樓梯(外) +Silver Sandstone Slab=銀沙石臺階 +Silver Sandstone Brick Stair=銀沙石磚樓梯 +Inner Silver Sandstone Brick Stair=銀沙石磚樓梯(å…§) +Outer Silver Sandstone Brick Stair=銀沙石磚樓梯(外) +Silver Sandstone Brick Slab=銀沙石磚臺階 +Silver Sandstone Block Stair=銀沙石塊樓梯 +Inner Silver Sandstone Block Stair=銀沙石塊樓梯(å…§) +Outer Silver Sandstone Block Stair=銀沙石塊樓梯(外) +Silver Sandstone Block Slab=銀沙石塊臺階 +Obsidian Stair=黑曜石樓梯 +Inner Obsidian Stair=黑曜石樓梯(å…§) +Outer Obsidian Stair=黑曜石樓梯(外) +Obsidian Slab=黑曜石臺階 +Obsidian Brick Stair=黑曜石磚樓梯 +Inner Obsidian Brick Stair=黑曜石磚樓梯(å…§) +Outer Obsidian Brick Stair=黑曜石磚樓梯(外) +Obsidian Brick Slab=黑曜石磚臺階 +Obsidian Block Stair=黑曜石塊樓梯 +Inner Obsidian Block Stair=黑曜石塊樓梯(å…§) +Outer Obsidian Block Stair=黑曜石塊樓梯(外) +Obsidian Block Slab=黑曜石塊臺階 +Brick Stair=磚樓梯 +Inner Brick Stair=磚樓梯(å…§) +Outer Brick Stair=磚樓梯(外) +Brick Slab=磚制臺階 +Steel Block Stair=éµå¡Šæ¨“梯 +Inner Steel Block Stair=éµå¡Šæ¨“梯(å…§) +Outer Steel Block Stair=éµå¡Šæ¨“梯(外) +Steel Block Slab=éµå¡Šè‡ºéšŽ +Tin Block Stair=錫塊樓梯 +Inner Tin Block Stair=錫塊樓梯(å…§) +Outer Tin Block Stair=錫塊樓梯(外) +Tin Block Slab=錫塊臺階 +Copper Block Stair=銅塊樓梯 +Inner Copper Block Stair=銅塊樓梯(å…§) +Outer Copper Block Stair=銅塊樓梯(外) +Copper Block Slab=銅塊臺階 +Bronze Block Stair=é’銅塊樓梯 +Inner Bronze Block Stair=é’銅塊樓梯(å…§) +Outer Bronze Block Stair=é’銅塊樓梯(外) +Bronze Block Slab=é’銅塊臺階 +Gold Block Stair=金塊樓梯 +Inner Gold Block Stair=金塊樓梯(å…§) +Outer Gold Block Stair=金塊樓梯(外) +Gold Block Slab=金塊臺階 +Ice Stair=冰階梯 +Inner Ice Stair=冰塊樓梯(å…§) +Outer Ice Stair=冰塊樓梯(外) +Ice Slab=冰臺階 +Snow Block Stair=雪塊樓梯 +Inner Snow Block Stair=雪塊樓梯(å…§) +Outer Snow Block Stair=雪塊樓梯(外) +Snow Block Slab=雪塊臺階 + + +##### not used anymore ##### + +Blue Stained Stair=è—æœ¨æ¨“梯 +Inner Blue Stained Stair=è—æœ¨æ¨“梯(å…§) +Outer Blue Stained Stair=è—æœ¨æ¨“梯(外) +Blue Stained Slab=è—æœ¨è‡ºéšŽ diff --git a/mods/minetest_game/stairs/locale/template.txt b/mods/minetest_game/stairs/locale/template.txt new file mode 100644 index 00000000..ca2c8657 --- /dev/null +++ b/mods/minetest_game/stairs/locale/template.txt @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair= +Glass Slab= +Inner Glass Stair= +Outer Glass Stair= +Obsidian Glass Stair= +Obsidian Glass Slab= +Inner Obsidian Glass Stair= +Outer Obsidian Glass Stair= +Wooden Stair= +Inner Wooden Stair= +Outer Wooden Stair= +Wooden Slab= +Jungle Wood Stair= +Inner Jungle Wood Stair= +Outer Jungle Wood Stair= +Jungle Wood Slab= +Pine Wood Stair= +Inner Pine Wood Stair= +Outer Pine Wood Stair= +Pine Wood Slab= +Acacia Wood Stair= +Inner Acacia Wood Stair= +Outer Acacia Wood Stair= +Acacia Wood Slab= +Aspen Wood Stair= +Inner Aspen Wood Stair= +Outer Aspen Wood Stair= +Aspen Wood Slab= +Stone Stair= +Inner Stone Stair= +Outer Stone Stair= +Stone Slab= +Cobblestone Stair= +Inner Cobblestone Stair= +Outer Cobblestone Stair= +Cobblestone Slab= +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Stone Brick Stair= +Inner Stone Brick Stair= +Outer Stone Brick Stair= +Stone Brick Slab= +Stone Block Stair= +Inner Stone Block Stair= +Outer Stone Block Stair= +Stone Block Slab= +Desert Stone Stair= +Inner Desert Stone Stair= +Outer Desert Stone Stair= +Desert Stone Slab= +Desert Cobblestone Stair= +Inner Desert Cobblestone Stair= +Outer Desert Cobblestone Stair= +Desert Cobblestone Slab= +Desert Stone Brick Stair= +Inner Desert Stone Brick Stair= +Outer Desert Stone Brick Stair= +Desert Stone Brick Slab= +Desert Stone Block Stair= +Inner Desert Stone Block Stair= +Outer Desert Stone Block Stair= +Desert Stone Block Slab= +Sandstone Stair= +Inner Sandstone Stair= +Outer Sandstone Stair= +Sandstone Slab= +Sandstone Brick Stair= +Inner Sandstone Brick Stair= +Outer Sandstone Brick Stair= +Sandstone Brick Slab= +Sandstone Block Stair= +Inner Sandstone Block Stair= +Outer Sandstone Block Stair= +Sandstone Block Slab= +Desert Sandstone Stair= +Inner Desert Sandstone Stair= +Outer Desert Sandstone Stair= +Desert Sandstone Slab= +Desert Sandstone Brick Stair= +Inner Desert Sandstone Brick Stair= +Outer Desert Sandstone Brick Stair= +Desert Sandstone Brick Slab= +Desert Sandstone Block Stair= +Inner Desert Sandstone Block Stair= +Outer Desert Sandstone Block Stair= +Desert Sandstone Block Slab= +Silver Sandstone Stair= +Inner Silver Sandstone Stair= +Outer Silver Sandstone Stair= +Silver Sandstone Slab= +Silver Sandstone Brick Stair= +Inner Silver Sandstone Brick Stair= +Outer Silver Sandstone Brick Stair= +Silver Sandstone Brick Slab= +Silver Sandstone Block Stair= +Inner Silver Sandstone Block Stair= +Outer Silver Sandstone Block Stair= +Silver Sandstone Block Slab= +Obsidian Stair= +Inner Obsidian Stair= +Outer Obsidian Stair= +Obsidian Slab= +Obsidian Brick Stair= +Inner Obsidian Brick Stair= +Outer Obsidian Brick Stair= +Obsidian Brick Slab= +Obsidian Block Stair= +Inner Obsidian Block Stair= +Outer Obsidian Block Stair= +Obsidian Block Slab= +Brick Stair= +Inner Brick Stair= +Outer Brick Stair= +Brick Slab= +Steel Block Stair= +Inner Steel Block Stair= +Outer Steel Block Stair= +Steel Block Slab= +Tin Block Stair= +Inner Tin Block Stair= +Outer Tin Block Stair= +Tin Block Slab= +Copper Block Stair= +Inner Copper Block Stair= +Outer Copper Block Stair= +Copper Block Slab= +Bronze Block Stair= +Inner Bronze Block Stair= +Outer Bronze Block Stair= +Bronze Block Slab= +Gold Block Stair= +Inner Gold Block Stair= +Outer Gold Block Stair= +Gold Block Slab= +Ice Stair= +Inner Ice Stair= +Outer Ice Stair= +Ice Slab= +Snow Block Stair= +Inner Snow Block Stair= +Outer Snow Block Stair= +Snow Block Slab= diff --git a/mods/minetest_game/stairs/mod.conf b/mods/minetest_game/stairs/mod.conf new file mode 100644 index 00000000..7548fa72 --- /dev/null +++ b/mods/minetest_game/stairs/mod.conf @@ -0,0 +1,3 @@ +name = stairs +description = Minetest Game mod: stairs +depends = default diff --git a/mods/minetest_game/stairs/textures/stairs_glass_outer_stairside.png b/mods/minetest_game/stairs/textures/stairs_glass_outer_stairside.png new file mode 100644 index 00000000..9b298c8b Binary files /dev/null and b/mods/minetest_game/stairs/textures/stairs_glass_outer_stairside.png differ diff --git a/mods/minetest_game/stairs/textures/stairs_glass_split.png b/mods/minetest_game/stairs/textures/stairs_glass_split.png new file mode 100644 index 00000000..62879597 Binary files /dev/null and b/mods/minetest_game/stairs/textures/stairs_glass_split.png differ diff --git a/mods/minetest_game/stairs/textures/stairs_glass_stairside.png b/mods/minetest_game/stairs/textures/stairs_glass_stairside.png new file mode 100644 index 00000000..c4242943 Binary files /dev/null and b/mods/minetest_game/stairs/textures/stairs_glass_stairside.png differ diff --git a/mods/minetest_game/stairs/textures/stairs_obsidian_glass_outer_stairside.png b/mods/minetest_game/stairs/textures/stairs_obsidian_glass_outer_stairside.png new file mode 100644 index 00000000..0098f683 Binary files /dev/null and b/mods/minetest_game/stairs/textures/stairs_obsidian_glass_outer_stairside.png differ diff --git a/mods/minetest_game/stairs/textures/stairs_obsidian_glass_split.png b/mods/minetest_game/stairs/textures/stairs_obsidian_glass_split.png new file mode 100644 index 00000000..7647b9b0 Binary files /dev/null and b/mods/minetest_game/stairs/textures/stairs_obsidian_glass_split.png differ diff --git a/mods/minetest_game/stairs/textures/stairs_obsidian_glass_stairside.png b/mods/minetest_game/stairs/textures/stairs_obsidian_glass_stairside.png new file mode 100644 index 00000000..40b17545 Binary files /dev/null and b/mods/minetest_game/stairs/textures/stairs_obsidian_glass_stairside.png differ diff --git a/mods/minetest_game/tnt/README.txt b/mods/minetest_game/tnt/README.txt new file mode 100644 index 00000000..ad9ca0e7 --- /dev/null +++ b/mods/minetest_game/tnt/README.txt @@ -0,0 +1,73 @@ +Minetest Game mod: tnt +====================== +See license.txt for license information. + +Authors of source code +---------------------- +PilzAdam (MIT) +ShadowNinja (MIT) +sofar (sofar@foo-projects.org) (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media +---------------- +BlockMen (CC BY-SA 3.0): +All textures not mentioned below. + +ShadowNinja (CC BY-SA 3.0): +tnt_smoke.png + +Wuzzy (CC BY-SA 3.0): +All gunpowder textures except tnt_gunpowder_inventory.png. + +sofar (sofar@foo-projects.org) (CC BY-SA 3.0): +tnt_blast.png + +paramat (CC BY-SA 3.0) +tnt_tnt_stick.png - Derived from a texture by benrob0329. + +TumeniNodes (CC0 1.0) +tnt_explode.ogg +renamed, edited, and converted to .ogg from Explosion2.wav +by steveygos93 (CC0 1.0) + + +tnt_ignite.ogg +renamed, edited, and converted to .ogg from sparkler_fuse_nm.wav +by theneedle.tv (CC0 1.0) + + +tnt_gunpowder_burning.ogg +renamed, edited, and converted to .ogg from road flare ignite burns.wav +by frankelmedico (CC0 1.0) + + + +Introduction +------------ +This mod adds TNT. TNT is a tool to help the player in mining. + +How to use the mod: + +Craft gunpowder by placing coal and gravel in the crafting area. +The gunpowder can be used to craft TNT sticks or as a fuse trail for TNT. + +To craft 2 TNT sticks: +G_G +GPG +G_G +G = gunpowder +P = paper +The sticks are not usable as an explosive. + +Craft TNT from 9 TNT sticks. + +There are different ways to ignite TNT: + 1. Hit it with a torch. + 2. Hit a gunpowder fuse trail that leads to TNT with a torch or + flint-and-steel. + 3. Activate it with mesecons (fastest way). + +For 1 TNT: +Node destruction radius is 3 nodes. +Player and object damage radius is 6 nodes. diff --git a/mods/minetest_game/tnt/init.lua b/mods/minetest_game/tnt/init.lua new file mode 100644 index 00000000..05f01e3d --- /dev/null +++ b/mods/minetest_game/tnt/init.lua @@ -0,0 +1,713 @@ +-- tnt/init.lua + +tnt = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("tnt") + + +-- Default to enabled when in singleplayer +local enable_tnt = minetest.settings:get_bool("enable_tnt") +if enable_tnt == nil then + enable_tnt = minetest.is_singleplayer() +end + +-- loss probabilities array (one in X will be lost) +local loss_prob = {} + +loss_prob["default:cobble"] = 3 +loss_prob["default:dirt"] = 4 + +local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3) + +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + on_blast = def.on_blast, + } + end +end) + +local function rand_pos(center, pos, radius) + local def + local reg_nodes = minetest.registered_nodes + local i = 0 + repeat + -- Give up and use the center if this takes too long + if i > 4 then + pos.x, pos.z = center.x, center.z + break + end + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) + def = reg_nodes[minetest.get_node(pos).name] + i = i + 1 + until def and not def.walkable +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + for _, item in pairs(drops) do + local count = math.min(item:get_count(), item:get_stack_max()) + while count > 0 do + local take = math.max(1,math.min(radius * radius, + count, + item:get_stack_max())) + rand_pos(pos, drop_pos, radius) + local dropitem = ItemStack(item) + dropitem:set_count(take) + local obj = minetest.add_item(drop_pos, dropitem) + if obj then + obj:get_luaentity().collect = true + obj:set_acceleration({x = 0, y = -10, z = 0}) + obj:set_velocity({x = math.random(-3, 3), + y = math.random(0, 10), + z = math.random(-3, 3)}) + end + count = count - take + end + end +end + +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return + end + + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local basic_flame_on_construct -- cached value +local function destroy(drops, npos, cid, c_air, c_fire, + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast, owner) + if not ignore_protection and minetest.is_protected(npos, owner) then + return cid + end + + local def = cid_data[cid] + + if not def then + return c_air + elseif not ignore_on_blast and def.on_blast then + on_blast_queue[#on_blast_queue + 1] = { + pos = vector.new(npos), + on_blast = def.on_blast + } + return cid + elseif def.flammable then + on_construct_queue[#on_construct_queue + 1] = { + fn = basic_flame_on_construct, + pos = vector.new(npos) + } + return c_fire + else + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + return c_air + end +end + +local function calc_velocity(pos1, pos2, old_vel, power) + -- Avoid errors caused by a vector of zero length + if vector.equals(pos1, pos2) then + return old_vel + end + + local vel = vector.direction(pos1, pos2) + vel = vector.normalize(vel) + vel = vector.multiply(vel, power) + + -- Divide by distance + local dist = vector.distance(pos1, pos2) + dist = math.max(dist, 1) + vel = vector.divide(vel, dist) + + -- Add old velocity + vel = vector.add(vel, old_vel) + + -- randomize it a bit + vel = vector.add(vel, { + x = math.random() - 0.5, + y = math.random() - 0.5, + z = math.random() - 0.5, + }) + + -- Limit to terminal velocity + dist = vector.length(vel) + if dist > 250 then + vel = vector.divide(vel, dist / 250) + end + return vel +end + +local function entity_physics(pos, radius, drops) + local objs = minetest.get_objects_inside_radius(pos, radius) + for _, obj in pairs(objs) do + local obj_pos = obj:get_pos() + if obj_pos then + local dist = math.max(1, vector.distance(pos, obj_pos)) + + local damage = (4 / dist) * radius + if obj:is_player() then + local dir = vector.normalize(vector.subtract(obj_pos, pos)) + local moveoff = vector.multiply(dir, 2 / dist * radius) + obj:add_velocity(moveoff) + + obj:set_hp(obj:get_hp() - damage) + else + local luaobj = obj:get_luaentity() + + -- object might have disappeared somehow + if luaobj then + local do_damage = true + local do_knockback = true + local entity_drops = {} + local objdef = minetest.registered_entities[luaobj.name] + + if objdef and objdef.on_blast then + do_damage, do_knockback, entity_drops = objdef.on_blast(luaobj, damage) + end + + if do_knockback then + local obj_vel = obj:get_velocity() + obj:set_velocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + if do_damage then + if not obj:get_armor_groups().immortal then + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + end + end + for _, item in pairs(entity_drops) do + add_drop(drops, item) + end + end + end + end + end +end + +local function add_effects(pos, radius, drops) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = radius * 10, + collisiondetection = false, + vertical = false, + texture = "tnt_boom.png", + glow = 15, + }) + minetest.add_particlespawner({ + amount = 64, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 2.5, + minsize = radius * 3, + maxsize = radius * 5, + texture = "tnt_smoke.png", + }) + + -- we just dropped some items. Look at the items entities and pick + -- one of them to use as texture + local texture = "tnt_blast.png" --fallback texture + local node + local most = 0 + for name, stack in pairs(drops) do + local count = stack:get_count() + if count > most then + most = count + local def = minetest.registered_nodes[name] + if def then + node = { name = name } + if def.tiles and type(def.tiles[1]) == "string" then + texture = def.tiles[1] + end + end + end + end + + minetest.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -3, y = 0, z = -3}, + maxvel = {x = 3, y = 5, z = 3}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = radius * 0.33, + maxsize = radius, + texture = texture, + -- ^ only as fallback for clients without support for `node` parameter + node = node, + collisiondetection = true, + }) +end + +function tnt.burn(pos, nodename) + local name = nodename or minetest.get_node(pos).name + local def = minetest.registered_nodes[name] + if not def then + return + elseif def.on_ignite then + def.on_ignite(pos) + elseif minetest.get_item_group(name, "tnt") > 0 then + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.sound_play("tnt_ignite", {pos = pos, gain = 1.0}, true) + minetest.get_node_timer(pos):start(1) + end +end + +local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner, explode_center) + pos = vector.round(pos) + -- scan for adjacent TNT nodes first, and enlarge the explosion + local vm1 = VoxelManip() + local p1 = vector.subtract(pos, 2) + local p2 = vector.add(pos, 2) + local minp, maxp = vm1:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm1:get_data() + local count = 0 + local c_tnt + local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") + local c_tnt_boom = minetest.get_content_id("tnt:boom") + local c_air = minetest.CONTENT_AIR + local c_ignore = minetest.CONTENT_IGNORE + if enable_tnt then + c_tnt = minetest.get_content_id("tnt:tnt") + else + c_tnt = c_tnt_burning -- tnt is not registered if disabled + end + -- make sure we still have explosion even when centre node isnt tnt related + if explode_center then + count = 1 + end + + for z = pos.z - 2, pos.z + 2 do + for y = pos.y - 2, pos.y + 2 do + local vi = a:index(pos.x - 2, y, z) + for x = pos.x - 2, pos.x + 2 do + local cid = data[vi] + if cid == c_tnt or cid == c_tnt_boom or cid == c_tnt_burning then + count = count + 1 + data[vi] = c_air + end + vi = vi + 1 + end + end + end + + vm1:set_data(data) + vm1:write_to_map() + + -- recalculate new radius + radius = math.floor(radius * math.pow(count, 1/3)) + + -- perform the explosion + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + p1 = vector.subtract(pos, radius) + p2 = vector.add(pos, radius) + minp, maxp = vm:read_from_map(p1, p2) + a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + data = vm:get_data() + + local drops = {} + local on_blast_queue = {} + local on_construct_queue = {} + basic_flame_on_construct = minetest.registered_nodes["fire:basic_flame"].on_construct + + -- Used to efficiently remove metadata of nodes that were destroyed. + -- Metadata is probably sparse, so this may save us some work. + local has_meta = {} + for _, p in ipairs(minetest.find_nodes_with_meta(p1, p2)) do + has_meta[a:indexp(p)] = true + end + + local c_fire = minetest.get_content_id("fire:basic_flame") + for z = -radius, radius do + for y = -radius, radius do + local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + for x = -radius, radius do + local r = vector.length(vector.new(x, y, z)) + if (radius * radius) / (r * r) >= (pr:next(80, 125) / 100) then + local cid = data[vi] + local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} + if cid ~= c_air and cid ~= c_ignore then + local new_cid = destroy(drops, p, cid, c_air, c_fire, + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast, owner) + + if new_cid ~= data[vi] then + data[vi] = new_cid + if has_meta[vi] then + minetest.get_meta(p):from_table(nil) + end + end + end + end + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() + vm:update_liquids() + + -- call check_single_for_falling for everything within 1.5x blast radius + for y = -radius * 1.5, radius * 1.5 do + for z = -radius * 1.5, radius * 1.5 do + for x = -radius * 1.5, radius * 1.5 do + local rad = {x = x, y = y, z = z} + local s = vector.add(pos, rad) + local r = vector.length(rad) + if r / radius < 1.4 then + minetest.check_single_for_falling(s) + end + end + end + end + + for _, queued_data in pairs(on_blast_queue) do + local dist = math.max(1, vector.distance(queued_data.pos, pos)) + local intensity = (radius * radius) / (dist * dist) + local node_drops = queued_data.on_blast(queued_data.pos, intensity) + if node_drops then + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + end + end + + for _, queued_data in pairs(on_construct_queue) do + queued_data.fn(queued_data.pos) + end + + minetest.log("action", "TNT owned by " .. owner .. " detonated at " .. + minetest.pos_to_string(pos) .. " with radius " .. radius) + + return drops, radius +end + +function tnt.boom(pos, def) + def = def or {} + def.radius = def.radius or 1 + def.damage_radius = def.damage_radius or def.radius * 2 + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if not def.explode_center and def.ignore_protection ~= true then + minetest.set_node(pos, {name = "tnt:boom"}) + end + local sound = def.sound or "tnt_explode" + minetest.sound_play(sound, {pos = pos, gain = 2.5, + max_hear_distance = math.min(def.radius * 20, 128)}, true) + local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, + def.ignore_on_blast, owner, def.explode_center) + -- append entity drops + local damage_radius = (radius / math.max(1, def.radius)) * def.damage_radius + entity_physics(pos, damage_radius, drops) + if not def.disable_drops then + eject_drops(drops, pos, radius) + end + add_effects(pos, radius, drops) + minetest.log("action", "A TNT explosion occurred at " .. minetest.pos_to_string(pos) .. + " with radius " .. radius) +end + +minetest.register_node("tnt:boom", { + drawtype = "airlike", + inventory_image = "tnt_boom.png", + wield_image = "tnt_boom.png", + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + -- unaffected by explosions + on_blast = function() end, +}) + +minetest.register_node("tnt:gunpowder", { + description = S("Gun Powder"), + drawtype = "raillike", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + tiles = { + "tnt_gunpowder_straight.png", + "tnt_gunpowder_curved.png", + "tnt_gunpowder_t_junction.png", + "tnt_gunpowder_crossing.png" + }, + inventory_image = "tnt_gunpowder_inventory.png", + wield_image = "tnt_gunpowder_inventory.png", + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {dig_immediate = 2, attached_node = 1, flammable = 5, + connect_to_raillike = minetest.raillike_group("gunpowder")}, + sounds = default.node_sound_leaves_defaults(), + + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + default.log_player_action(puncher, "ignites tnt:gunpowder at", pos) + end + end, + on_blast = function(pos, intensity) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, + on_burn = function(pos) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, + on_ignite = function(pos, igniter) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, +}) + +minetest.register_node("tnt:gunpowder_burning", { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + light_source = 5, + tiles = {{ + name = "tnt_gunpowder_burning_straight_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_curved_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_t_junction_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_crossing_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }}, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + drop = "", + groups = { + dig_immediate = 2, + attached_node = 1, + connect_to_raillike = minetest.raillike_group("gunpowder"), + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + for dx = -1, 1 do + for dz = -1, 1 do + if math.abs(dx) + math.abs(dz) == 1 then + for dy = -1, 1 do + tnt.burn({ + x = pos.x + dx, + y = pos.y + dy, + z = pos.z + dz, + }) + end + end + end + end + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_gunpowder_burning", {pos = pos, + gain = 1.0}, true) + minetest.get_node_timer(pos):start(1) + end, +}) + +minetest.register_craft({ + output = "tnt:gunpowder 5", + type = "shapeless", + recipe = {"default:coal_lump", "default:gravel"} +}) + +minetest.register_craftitem("tnt:tnt_stick", { + description = S("TNT Stick"), + inventory_image = "tnt_tnt_stick.png", + groups = {flammable = 5}, +}) + +if enable_tnt then + minetest.register_craft({ + output = "tnt:tnt_stick 2", + recipe = { + {"tnt:gunpowder", "", "tnt:gunpowder"}, + {"tnt:gunpowder", "default:paper", "tnt:gunpowder"}, + {"tnt:gunpowder", "", "tnt:gunpowder"}, + } + }) + + minetest.register_craft({ + output = "tnt:tnt", + recipe = { + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"} + } + }) + + minetest.register_abm({ + label = "TNT ignition", + nodenames = {"group:tnt", "tnt:gunpowder"}, + neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, + interval = 4, + chance = 1, + action = function(pos, node) + tnt.burn(pos, node.name) + end, + }) +end + +function tnt.register_tnt(def) + local name + if not def.name:find(':') then + name = "tnt:" .. def.name + else + name = def.name + def.name = def.name:match(":([%w_]+)") + end + if not def.tiles then def.tiles = {} end + local tnt_top = def.tiles.top or def.name .. "_top.png" + local tnt_bottom = def.tiles.bottom or def.name .. "_bottom.png" + local tnt_side = def.tiles.side or def.name .. "_side.png" + local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png" + if not def.damage_radius then def.damage_radius = def.radius * 2 end + + if enable_tnt then + minetest.register_node(":" .. name, { + description = def.description, + tiles = {tnt_top, tnt_bottom, tnt_side}, + is_ground_content = false, + groups = {dig_immediate = 2, mesecon = 2, tnt = 1, flammable = 5}, + sounds = default.node_sound_wood_defaults(), + after_place_node = function(pos, placer) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + end + end, + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.registered_nodes[name .. "_burning"].on_construct(pos) + default.log_player_action(puncher, "ignites", node.name, "at", pos) + end + end, + on_blast = function(pos, intensity) + minetest.after(0.1, function() + tnt.boom(pos, def) + end) + end, + mesecons = {effector = + {action_on = + function(pos) + tnt.boom(pos, def) + end + } + }, + on_burn = function(pos) + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.registered_nodes[name .. "_burning"].on_construct(pos) + end, + on_ignite = function(pos, igniter) + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.registered_nodes[name .. "_burning"].on_construct(pos) + end, + }) + end + + minetest.register_node(":" .. name .. "_burning", { + tiles = { + { + name = tnt_burning, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + tnt_bottom, tnt_side + }, + light_source = 5, + drop = "", + sounds = default.node_sound_wood_defaults(), + groups = {falling_node = 1, not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + tnt.boom(pos, def) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_ignite", {pos = pos}, true) + minetest.get_node_timer(pos):start(4) + minetest.check_for_falling(pos) + end, + }) +end + +tnt.register_tnt({ + name = "tnt:tnt", + description = S("TNT"), + radius = tnt_radius, +}) diff --git a/mods/minetest_game/tnt/license.txt b/mods/minetest_game/tnt/license.txt new file mode 100644 index 00000000..903d4b09 --- /dev/null +++ b/mods/minetest_game/tnt/license.txt @@ -0,0 +1,100 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 PilzAdam +Copyright (C) 2014-2016 ShadowNinja +Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +=================================== + +Licenses of media +----------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 ShadowNinja +Copyright (C) 2015-2016 Wuzzy +Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2018 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +==================================================== + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +for audio files (found in sounds folder) +TumeniNodes +steveygos93 +theneedle.tv +frankelmedico + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public domain +by waiving all of his or her rights to the work worldwide under copyright law, including all +related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as publicity +or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this deed makes no +warranties about the work, and disclaims liability for all uses of the work, to the fullest +extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author or the affirmer. + +This license is acceptable for Free Cultural Works. +For more Information: +https://creativecommons.org/publicdomain/zero/1.0/ + diff --git a/mods/minetest_game/tnt/locale/template.txt b/mods/minetest_game/tnt/locale/template.txt new file mode 100644 index 00000000..62bcb150 --- /dev/null +++ b/mods/minetest_game/tnt/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder= +TNT Stick= +TNT= diff --git a/mods/minetest_game/tnt/locale/tnt.de.tr b/mods/minetest_game/tnt/locale/tnt.de.tr new file mode 100644 index 00000000..09d2ac26 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.de.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Schießpulver +TNT Stick=TNT-Stange +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.eo.tr b/mods/minetest_game/tnt/locale/tnt.eo.tr new file mode 100644 index 00000000..b467d2f5 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.eo.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pulvo +TNT Stick=Dinamita bastono +TNT=Dinamito diff --git a/mods/minetest_game/tnt/locale/tnt.es.tr b/mods/minetest_game/tnt/locale/tnt.es.tr new file mode 100644 index 00000000..d9f3f205 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.es.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pólvora +TNT Stick=Cartucho de TNT +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.fr.tr b/mods/minetest_game/tnt/locale/tnt.fr.tr new file mode 100644 index 00000000..3fe48fb0 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.fr.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Poudre à canon +TNT Stick=Bâton de TNT +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.id.tr b/mods/minetest_game/tnt/locale/tnt.id.tr new file mode 100644 index 00000000..2652ae0c --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.id.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Bubuk Mesiu +TNT Stick=Tongkat TNT +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.it.tr b/mods/minetest_game/tnt/locale/tnt.it.tr new file mode 100644 index 00000000..6437c003 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.it.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Polvere da sparo +TNT Stick=Candelotto di TNT +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.ja.tr b/mods/minetest_game/tnt/locale/tnt.ja.tr new file mode 100644 index 00000000..d7af9f58 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.ja.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=ç«è–¬ +TNT Stick=ダイナマイト +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.jbo.tr b/mods/minetest_game/tnt/locale/tnt.jbo.tr new file mode 100644 index 00000000..b1b425ac --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=lo tercelpu'o +TNT Stick=lo granrti'enti +TNT=lo bamrti'enti diff --git a/mods/minetest_game/tnt/locale/tnt.lv.tr b/mods/minetest_game/tnt/locale/tnt.lv.tr new file mode 100644 index 00000000..2af9c2e0 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.lv.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Å aujampulveris +TNT Stick=DinamÄ«ta kociņš +TNT=DinamÄ«ts diff --git a/mods/minetest_game/tnt/locale/tnt.ms.tr b/mods/minetest_game/tnt/locale/tnt.ms.tr new file mode 100644 index 00000000..8f537c79 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.ms.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Serbuk Letupan +TNT Stick=Batang TNT +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.pl.tr b/mods/minetest_game/tnt/locale/tnt.pl.tr new file mode 100644 index 00000000..1ede267d --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.pl.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Proch strzelniczy +TNT Stick=Dynamit +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.pt_BR.tr b/mods/minetest_game/tnt/locale/tnt.pt_BR.tr new file mode 100644 index 00000000..d4fc1742 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pólvora +TNT Stick=Banana de Dinamite +TNT=Dinamite diff --git a/mods/minetest_game/tnt/locale/tnt.ru.tr b/mods/minetest_game/tnt/locale/tnt.ru.tr new file mode 100644 index 00000000..d8f55f1e --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.ru.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Порох +TNT Stick=Ð”Ð¸Ð½Ð°Ð¼Ð¸Ñ‚Ð½Ð°Ñ ÑˆÐ°ÑˆÐºÐ° +TNT=Динамит diff --git a/mods/minetest_game/tnt/locale/tnt.sk.tr b/mods/minetest_game/tnt/locale/tnt.sk.tr new file mode 100644 index 00000000..639b8c87 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.sk.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=PuÅ¡ný prach +TNT Stick=ÄŒasÅ¥ TNT +TNT=TNT diff --git a/mods/minetest_game/tnt/locale/tnt.sv.tr b/mods/minetest_game/tnt/locale/tnt.sv.tr new file mode 100644 index 00000000..fd08913f --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.sv.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Krut +TNT Stick=Dynamitpinne +TNT=Dynamit diff --git a/mods/minetest_game/tnt/locale/tnt.uk.tr b/mods/minetest_game/tnt/locale/tnt.uk.tr new file mode 100644 index 00000000..51865497 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.uk.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Порох +TNT Stick=Тротилова шашка +TNT=Тротил diff --git a/mods/minetest_game/tnt/locale/tnt.zh_CN.tr b/mods/minetest_game/tnt/locale/tnt.zh_CN.tr new file mode 100644 index 00000000..4cb2e949 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=ç«è¯ç²‰ +TNT Stick=三ç¡åŸºç”²è‹¯æ£’ +TNT=三ç¡åŸºç”²è‹¯ diff --git a/mods/minetest_game/tnt/locale/tnt.zh_TW.tr b/mods/minetest_game/tnt/locale/tnt.zh_TW.tr new file mode 100644 index 00000000..c1b3caf3 --- /dev/null +++ b/mods/minetest_game/tnt/locale/tnt.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=ç«è—¥ç²‰ +TNT Stick=炸藥棒 +TNT=炸藥包 diff --git a/mods/minetest_game/tnt/mod.conf b/mods/minetest_game/tnt/mod.conf new file mode 100644 index 00000000..9385e825 --- /dev/null +++ b/mods/minetest_game/tnt/mod.conf @@ -0,0 +1,3 @@ +name = tnt +description = Minetest Game mod: tnt +depends = default, fire diff --git a/mods/minetest_game/tnt/sounds/tnt_explode.ogg b/mods/minetest_game/tnt/sounds/tnt_explode.ogg new file mode 100644 index 00000000..e00a16c1 Binary files /dev/null and b/mods/minetest_game/tnt/sounds/tnt_explode.ogg differ diff --git a/mods/minetest_game/tnt/sounds/tnt_gunpowder_burning.ogg b/mods/minetest_game/tnt/sounds/tnt_gunpowder_burning.ogg new file mode 100644 index 00000000..8581c2d6 Binary files /dev/null and b/mods/minetest_game/tnt/sounds/tnt_gunpowder_burning.ogg differ diff --git a/mods/minetest_game/tnt/sounds/tnt_ignite.ogg b/mods/minetest_game/tnt/sounds/tnt_ignite.ogg new file mode 100644 index 00000000..1a7062e9 Binary files /dev/null and b/mods/minetest_game/tnt/sounds/tnt_ignite.ogg differ diff --git a/mods/minetest_game/tnt/textures/tnt_blast.png b/mods/minetest_game/tnt/textures/tnt_blast.png new file mode 100644 index 00000000..92be28ba Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_blast.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_boom.png b/mods/minetest_game/tnt/textures/tnt_boom.png new file mode 100644 index 00000000..c848bfcd Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_boom.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_bottom.png b/mods/minetest_game/tnt/textures/tnt_bottom.png new file mode 100644 index 00000000..95f66cb9 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_bottom.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_crossing_animated.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_crossing_animated.png new file mode 100644 index 00000000..efab2a9e Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_crossing_animated.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_curved_animated.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_curved_animated.png new file mode 100644 index 00000000..bd1437fe Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_curved_animated.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_straight_animated.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_straight_animated.png new file mode 100644 index 00000000..654e5396 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_straight_animated.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png new file mode 100644 index 00000000..5b567e38 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_crossing.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_crossing.png new file mode 100644 index 00000000..c0487a09 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_crossing.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_curved.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_curved.png new file mode 100644 index 00000000..8ed01db8 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_curved.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_inventory.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_inventory.png new file mode 100644 index 00000000..105a2d25 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_inventory.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_straight.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_straight.png new file mode 100644 index 00000000..427feb90 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_straight.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_gunpowder_t_junction.png b/mods/minetest_game/tnt/textures/tnt_gunpowder_t_junction.png new file mode 100644 index 00000000..b30c2b46 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_gunpowder_t_junction.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_side.png b/mods/minetest_game/tnt/textures/tnt_side.png new file mode 100644 index 00000000..d3034732 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_side.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_smoke.png b/mods/minetest_game/tnt/textures/tnt_smoke.png new file mode 100644 index 00000000..6788974a Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_smoke.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_tnt_stick.png b/mods/minetest_game/tnt/textures/tnt_tnt_stick.png new file mode 100644 index 00000000..bc47a291 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_tnt_stick.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_top.png b/mods/minetest_game/tnt/textures/tnt_top.png new file mode 100644 index 00000000..31b807cb Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_top.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_top_burning.png b/mods/minetest_game/tnt/textures/tnt_top_burning.png new file mode 100644 index 00000000..fc0d4905 Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_top_burning.png differ diff --git a/mods/minetest_game/tnt/textures/tnt_top_burning_animated.png b/mods/minetest_game/tnt/textures/tnt_top_burning_animated.png new file mode 100644 index 00000000..18a270fb Binary files /dev/null and b/mods/minetest_game/tnt/textures/tnt_top_burning_animated.png differ diff --git a/mods/minetest_game/vessels/README.txt b/mods/minetest_game/vessels/README.txt new file mode 100644 index 00000000..c101c0c6 --- /dev/null +++ b/mods/minetest_game/vessels/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: vessels +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Vanessa Ezekowitz (LGPLv2.1+) +Modified by Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- +All not listed below, Vanessa Ezekowitz (CC BY-SA 3.0) + +The following textures were modified by Thomas-S (CC BY-SA 3.0): + vessels_drinking_glass.png + vessels_drinking_glass_inv.png + vessels_glass_bottle.png + vessels_steel_bottle.png + +The following texture was created by Wuzzy (CC BY-SA 3.0): + vessels_shelf_slot.png (based on vessels_glass_bottle.png) diff --git a/mods/minetest_game/vessels/init.lua b/mods/minetest_game/vessels/init.lua new file mode 100644 index 00000000..a2f24716 --- /dev/null +++ b/mods/minetest_game/vessels/init.lua @@ -0,0 +1,233 @@ +-- vessels/init.lua + +-- Minetest Game mod: vessels +-- See README.txt for licensing and other information. + +-- Load support for MT game translation. +local S = minetest.get_translator("vessels") + + +local vessels_shelf_formspec = + "size[8,7;]" .. + "list[context;vessels;0,0.3;8,2;]" .. + "list[current_player;main;0,2.85;8,1;]" .. + "list[current_player;main;0,4.08;8,3;8]" .. + "listring[context;vessels]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0, 2.85) + +local function update_vessels_shelf(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("vessels") + + local formspec = vessels_shelf_formspec + -- Inventory slots overlay + local vx, vy = 0, 0.3 + local n_items = 0 + for i = 1, 16 do + if i == 9 then + vx = 0 + vy = vy + 1 + end + if not invlist or invlist[i]:is_empty() then + formspec = formspec .. + "image[" .. vx .. "," .. vy .. ";1,1;vessels_shelf_slot.png]" + else + local stack = invlist[i] + if not stack:is_empty() then + n_items = n_items + stack:get_count() + end + end + vx = vx + 1 + end + meta:set_string("formspec", formspec) + if n_items == 0 then + meta:set_string("infotext", S("Empty Vessels Shelf")) + else + meta:set_string("infotext", S("Vessels Shelf (@1 items)", n_items)) + end +end + +local vessels_shelf_def = { + description = S("Vessels Shelf"), + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "vessels_shelf.png", "vessels_shelf.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + update_vessels_shelf(pos) + local inv = meta:get_inventory() + inv:set_size("vessels", 8 * 2) + end, + can_dig = function(pos,player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("vessels") + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.get_item_group(stack:get_name(), "vessel") ~= 0 then + return stack:get_count() + end + return 0 + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "vessels", drops) + drops[#drops + 1] = "vessels:shelf" + minetest.remove_node(pos) + return drops + end, + on_metadata_inventory_put = function(pos) + update_vessels_shelf(pos) + end, + on_metadata_inventory_take = function(pos) + update_vessels_shelf(pos) + end, + on_metadata_inventory_move = function(pos) + update_vessels_shelf(pos) + end, +} +default.set_inventory_action_loggers(vessels_shelf_def, "vessels shelf") +minetest.register_node("vessels:shelf", vessels_shelf_def) + +minetest.register_craft({ + output = "vessels:shelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:vessel", "group:vessel", "group:vessel"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_node("vessels:glass_bottle", { + description = S("Empty Glass Bottle"), + drawtype = "plantlike", + tiles = {"vessels_glass_bottle.png"}, + inventory_image = "vessels_glass_bottle.png", + wield_image = "vessels_glass_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:glass_bottle 10", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "", "default:glass"}, + {"", "default:glass", ""} + } +}) + +minetest.register_node("vessels:drinking_glass", { + description = S("Empty Drinking Glass"), + drawtype = "plantlike", + tiles = {"vessels_drinking_glass.png"}, + inventory_image = "vessels_drinking_glass_inv.png", + wield_image = "vessels_drinking_glass.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:drinking_glass 14", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "", "default:glass"}, + {"default:glass", "default:glass", "default:glass"} + } +}) + +minetest.register_node("vessels:steel_bottle", { + description = S("Empty Heavy Steel Bottle"), + drawtype = "plantlike", + tiles = {"vessels_steel_bottle.png"}, + inventory_image = "vessels_steel_bottle.png", + wield_image = "vessels_steel_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft( { + output = "vessels:steel_bottle 5", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""} + } +}) + + +-- Glass and steel recycling + +minetest.register_craftitem("vessels:glass_fragments", { + description = S("Glass Fragments"), + inventory_image = "vessels_glass_fragments.png", +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:glass_bottle", + "vessels:glass_bottle", + }, +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:drinking_glass", + "vessels:drinking_glass", + }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "vessels:glass_fragments", +}) + +minetest.register_craft( { + type = "cooking", + output = "default:steel_ingot", + recipe = "vessels:steel_bottle", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "vessels:shelf", + burntime = 30, +}) + +-- Register glass fragments as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + name = "vessels:glass_fragments", chance = 0.35, count = {1, 4} + }) +end diff --git a/mods/minetest_game/vessels/license.txt b/mods/minetest_game/vessels/license.txt new file mode 100644 index 00000000..3bd2951e --- /dev/null +++ b/mods/minetest_game/vessels/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 Vanessa Ezekowitz +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Vanessa Ezekowitz +Copyright (C) 2016 Thomas-S + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/vessels/locale/template.txt b/mods/minetest_game/vessels/locale/template.txt new file mode 100644 index 00000000..e6e5f69a --- /dev/null +++ b/mods/minetest_game/vessels/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf= +Vessels Shelf (@1 items)= +Vessels Shelf= +Empty Glass Bottle= +Empty Drinking Glass= +Empty Heavy Steel Bottle= +Glass Fragments= diff --git a/mods/minetest_game/vessels/locale/vessels.de.tr b/mods/minetest_game/vessels/locale/vessels.de.tr new file mode 100644 index 00000000..162e3595 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.de.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Leeres Gefäßregal +Vessels Shelf (@1 items)=Gefäßregal (@1 Gegenstände) +Vessels Shelf=Gefäßregal +Empty Glass Bottle=Leere Glasflasche +Empty Drinking Glass=Leeres Trinkglas +Empty Heavy Steel Bottle=Leere schwere Stahlflasche +Glass Fragments=Glasfragmente diff --git a/mods/minetest_game/vessels/locale/vessels.eo.tr b/mods/minetest_game/vessels/locale/vessels.eo.tr new file mode 100644 index 00000000..63a955d8 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.eo.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Malplena vaza plataĵo +Vessels Shelf (@1 items)=Vaza plataĵo (@1 objektoj) +Vessels Shelf=Vaza plataĵo +Empty Glass Bottle=Malplena vitra botelo +Empty Drinking Glass=Malplena glaso +Empty Heavy Steel Bottle=Malplena peza Åtala botelo +Glass Fragments=Vitraj eroj diff --git a/mods/minetest_game/vessels/locale/vessels.es.tr b/mods/minetest_game/vessels/locale/vessels.es.tr new file mode 100644 index 00000000..d6131d89 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.es.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Estante de vasijas vacío +Vessels Shelf (@1 items)=Estante de vasijas (@1 objetos) +Vessels Shelf=Estante de vasijas +Empty Glass Bottle=Botella de vidrio vacía +Empty Drinking Glass=Vaso para beber vacío +Empty Heavy Steel Bottle=Botella de acero vacía +Glass Fragments=Fragmentos de vidrio diff --git a/mods/minetest_game/vessels/locale/vessels.fr.tr b/mods/minetest_game/vessels/locale/vessels.fr.tr new file mode 100644 index 00000000..f099c197 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.fr.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Etagère à récipient vide +Vessels Shelf (@1 items)=Etagère à récipient (@1 articles) +Vessels Shelf=Etagère à récipient +Empty Glass Bottle=Bouteille de verre vide +Empty Drinking Glass=Verre vide +Empty Heavy Steel Bottle=Bouteille d'acier lourde vide +Glass Fragments=Fragments de verre diff --git a/mods/minetest_game/vessels/locale/vessels.id.tr b/mods/minetest_game/vessels/locale/vessels.id.tr new file mode 100644 index 00000000..f80fbc3d --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.id.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Rak Bejana Kosong +Vessels Shelf (@1 items)=Rak Bejana (@1 barang) +Vessels Shelf=Rak Bejana +Empty Glass Bottle=Botol Kaca Kosong +Empty Drinking Glass=Gelas Minum Kosong +Empty Heavy Steel Bottle=Botol Baja Berat Kosong +Glass Fragments=Pecahan Kaca diff --git a/mods/minetest_game/vessels/locale/vessels.it.tr b/mods/minetest_game/vessels/locale/vessels.it.tr new file mode 100644 index 00000000..70ea5759 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.it.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Scaffale per contenitori vuoto +Vessels Shelf (@1 items)=Scaffale per contenitori (@1 oggetti) +Vessels Shelf=Scaffale per contenitori +Empty Glass Bottle=Bottiglia di vetro vuota +Empty Drinking Glass=Bicchiere di vetro vuoto +Empty Heavy Steel Bottle=Bottigia di metallo pesante vuota +Glass Fragments=Frammenti di vetro diff --git a/mods/minetest_game/vessels/locale/vessels.ja.tr b/mods/minetest_game/vessels/locale/vessels.ja.tr new file mode 100644 index 00000000..451489a5 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.ja.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=空ã®ç“¶ã®æ£š +Vessels Shelf (@1 items)=ç“¶ã®æ£š(@1 本) +Vessels Shelf=ç“¶ã®æ£š +Empty Glass Bottle=空ã®ã‚¬ãƒ©ã‚¹ç“¶ +Empty Drinking Glass=空ã®ã‚¬ãƒ©ã‚¹ã‚³ãƒƒãƒ— +Empty Heavy Steel Bottle=空ã®é‡ã„鉄瓶 +Glass Fragments=ガラスã®ç ´ç‰‡ diff --git a/mods/minetest_game/vessels/locale/vessels.jbo.tr b/mods/minetest_game/vessels/locale/vessels.jbo.tr new file mode 100644 index 00000000..6e1145e6 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.jbo.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=.i ti kunti ke vasru kajna +Vessels Shelf (@1 items)=.i lo ti vasru kajna cu vasru lo @1 dacti +Vessels Shelf=lo vasru kajna +Empty Glass Bottle=lo blacybo'i be no da +Empty Drinking Glass=lo blacykabri be no da +Empty Heavy Steel Bottle=lo tilju ke gasta botpi be no da +Glass Fragments=lo derxi be lo blaci spisa diff --git a/mods/minetest_game/vessels/locale/vessels.lv.tr b/mods/minetest_game/vessels/locale/vessels.lv.tr new file mode 100644 index 00000000..2e5127f7 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.lv.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=TukÅ¡s trauku plaukts +Vessels Shelf (@1 items)=Trauku plaukts ar @1 priekÅ¡metiem +Vessels Shelf=Trauku plaukts +Empty Glass Bottle=TukÅ¡a stikla pudele +Empty Drinking Glass=TukÅ¡a glÄze +Empty Heavy Steel Bottle=TukÅ¡a tÄ“rauda pudele +Glass Fragments=Stikla skaidas diff --git a/mods/minetest_game/vessels/locale/vessels.ms.tr b/mods/minetest_game/vessels/locale/vessels.ms.tr new file mode 100644 index 00000000..db6e62f4 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.ms.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Rak Bekas Kaca Kosong +Vessels Shelf (@1 items)=Rak Bekas Kaca (@1 item) +Vessels Shelf=Rak Bekas Kaca +Empty Glass Bottle=Botol Kaca Kosong +Empty Drinking Glass=Gelas Minuman Kosong +Empty Heavy Steel Bottle=Botol Keluli Berat Kosong +Glass Fragments=Serpihan Kaca diff --git a/mods/minetest_game/vessels/locale/vessels.pl.tr b/mods/minetest_game/vessels/locale/vessels.pl.tr new file mode 100644 index 00000000..5e91da9f --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.pl.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Pusta półka na naczynia +Vessels Shelf (@1 items)=Półka na naczynia (@1 przedmiotów) +Vessels Shelf=Półka na naczynia +Empty Glass Bottle=Pusta szklana butelka +Empty Drinking Glass=Pusta butelka do picia +Empty Heavy Steel Bottle=Pusta stalowa butelka +Glass Fragments=OdÅ‚amki szkÅ‚a diff --git a/mods/minetest_game/vessels/locale/vessels.pt_BR.tr b/mods/minetest_game/vessels/locale/vessels.pt_BR.tr new file mode 100644 index 00000000..c22cb062 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Prateleira de Vasos Vazia +Vessels Shelf (@1 items)=Prateleira de Vasos (@1 itens) +Vessels Shelf=Prateleira de Vasos +Empty Glass Bottle=Garrafa de Vidro Vazia +Empty Drinking Glass=Copo Vazio +Empty Heavy Steel Bottle=Garrafa de Aço Pesada Vazia +Glass Fragments=Cacos de Vidro diff --git a/mods/minetest_game/vessels/locale/vessels.ru.tr b/mods/minetest_game/vessels/locale/vessels.ru.tr new file mode 100644 index 00000000..e9f276af --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.ru.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Полка Ñ Ð¿ÑƒÑтыми ÑоÑудами +Vessels Shelf (@1 items)=Полка Ñ ÑоÑудами (@1 штук) +Vessels Shelf=Полка Ñ ÑоÑудами +Empty Glass Bottle=ПуÑÑ‚Ð°Ñ ÑтеклÑÐ½Ð½Ð°Ñ Ð±ÑƒÑ‚Ñ‹Ð»ÐºÐ° +Empty Drinking Glass=ПуÑтой Ñтакан +Empty Heavy Steel Bottle=ПуÑÑ‚Ð°Ñ ÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð±ÑƒÑ‚Ñ‹Ð»ÐºÐ° +Glass Fragments=СтеклÑнные оÑколки diff --git a/mods/minetest_game/vessels/locale/vessels.sk.tr b/mods/minetest_game/vessels/locale/vessels.sk.tr new file mode 100644 index 00000000..6ec640b1 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.sk.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Prázdna polica na fľaÅ¡ky +Vessels Shelf (@1 items)=Polica na fľaÅ¡ky (@1 položka/y) +Vessels Shelf=Polica na fľaÅ¡ky +Empty Glass Bottle=Prázdna sklenená fľaÅ¡a +Empty Drinking Glass=Prázdny pohár na pitie +Empty Heavy Steel Bottle=Prázdna oceľová fľaÅ¡a +Glass Fragments=ÄŒasti skla diff --git a/mods/minetest_game/vessels/locale/vessels.sv.tr b/mods/minetest_game/vessels/locale/vessels.sv.tr new file mode 100644 index 00000000..48e76e29 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.sv.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Tom kärlhylla +Vessels Shelf (@1 items)=Kärlhylla (@1 saker) +Vessels Shelf=Kärlhylla +Empty Glass Bottle=Tom glasflaska +Empty Drinking Glass=Tom drycksflaska +Empty Heavy Steel Bottle=Tom tungstÃ¥lsflaska +Glass Fragments=Glasbitar diff --git a/mods/minetest_game/vessels/locale/vessels.uk.tr b/mods/minetest_game/vessels/locale/vessels.uk.tr new file mode 100644 index 00000000..34165d97 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.uk.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=ПуÑта Ð¿Ð¾Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ Ð¿Ð¾Ñуду +Vessels Shelf (@1 items)=ÐŸÐ¾Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ Ð¿Ð¾Ñуду (@1 предм.) +Vessels Shelf=ÐŸÐ¾Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ Ð¿Ð¾Ñуду +Empty Glass Bottle=ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ ÑклÑна плÑшка +Empty Drinking Glass=ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ ÑклÑнка +Empty Heavy Steel Bottle=ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ Ð²Ð°Ð¶ÐºÐ° Ñталева плÑшка +Glass Fragments=СклÑні уламки diff --git a/mods/minetest_game/vessels/locale/vessels.zh_CN.tr b/mods/minetest_game/vessels/locale/vessels.zh_CN.tr new file mode 100644 index 00000000..e303e24f --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=空容器架 +Vessels Shelf (@1 items)=容器架(@1项) +Vessels Shelf=容器架 +Empty Glass Bottle=空玻璃瓶 +Empty Drinking Glass=ç©ºæ°´æ¯ +Empty Heavy Steel Bottle=空é‡åž‹é’¢ç“¶ +Glass Fragments=玻璃碎片 diff --git a/mods/minetest_game/vessels/locale/vessels.zh_TW.tr b/mods/minetest_game/vessels/locale/vessels.zh_TW.tr new file mode 100644 index 00000000..6aecb357 --- /dev/null +++ b/mods/minetest_game/vessels/locale/vessels.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=空容器架 +Vessels Shelf (@1 items)=容器架(@1項) +Vessels Shelf=容器架 +Empty Glass Bottle=空玻璃瓶 +Empty Drinking Glass=ç©ºæ°´æ¯ +Empty Heavy Steel Bottle=空é‡åž‹é‹¼ç“¶ +Glass Fragments=玻璃碎片 diff --git a/mods/minetest_game/vessels/mod.conf b/mods/minetest_game/vessels/mod.conf new file mode 100644 index 00000000..eba9076f --- /dev/null +++ b/mods/minetest_game/vessels/mod.conf @@ -0,0 +1,4 @@ +name = vessels +description = Minetest Game mod: vessels +depends = default +optional_depends = dungeon_loot diff --git a/mods/minetest_game/vessels/textures/vessels_drinking_glass.png b/mods/minetest_game/vessels/textures/vessels_drinking_glass.png new file mode 100644 index 00000000..aef73296 Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_drinking_glass.png differ diff --git a/mods/minetest_game/vessels/textures/vessels_drinking_glass_inv.png b/mods/minetest_game/vessels/textures/vessels_drinking_glass_inv.png new file mode 100644 index 00000000..e50c8c72 Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_drinking_glass_inv.png differ diff --git a/mods/minetest_game/vessels/textures/vessels_glass_bottle.png b/mods/minetest_game/vessels/textures/vessels_glass_bottle.png new file mode 100644 index 00000000..2a46aafd Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_glass_bottle.png differ diff --git a/mods/minetest_game/vessels/textures/vessels_glass_fragments.png b/mods/minetest_game/vessels/textures/vessels_glass_fragments.png new file mode 100644 index 00000000..acf2d380 Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_glass_fragments.png differ diff --git a/mods/minetest_game/vessels/textures/vessels_shelf.png b/mods/minetest_game/vessels/textures/vessels_shelf.png new file mode 100644 index 00000000..87c69b28 Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_shelf.png differ diff --git a/mods/minetest_game/vessels/textures/vessels_shelf_slot.png b/mods/minetest_game/vessels/textures/vessels_shelf_slot.png new file mode 100644 index 00000000..93a729e5 Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_shelf_slot.png differ diff --git a/mods/minetest_game/vessels/textures/vessels_steel_bottle.png b/mods/minetest_game/vessels/textures/vessels_steel_bottle.png new file mode 100644 index 00000000..169930a3 Binary files /dev/null and b/mods/minetest_game/vessels/textures/vessels_steel_bottle.png differ diff --git a/mods/minetest_game/walls/README.txt b/mods/minetest_game/walls/README.txt new file mode 100644 index 00000000..ba33bd77 --- /dev/null +++ b/mods/minetest_game/walls/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: walls +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Auke Kok (LGPLv2.1+) diff --git a/mods/minetest_game/walls/init.lua b/mods/minetest_game/walls/init.lua new file mode 100644 index 00000000..0f7425c8 --- /dev/null +++ b/mods/minetest_game/walls/init.lua @@ -0,0 +1,73 @@ +-- walls/init.lua + +walls = {} + +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +-- Load support for MT game translation. +local S = minetest.get_translator("walls") + +walls.register = function(wall_name, wall_desc, wall_texture_table, wall_mat, wall_sounds) + --make wall_texture_table paramenter backwards compatible for mods passing single texture + if type(wall_texture_table) ~= "table" then + wall_texture_table = { wall_texture_table } + end + -- inventory node, and pole-type wall start item + minetest.register_node(wall_name, { + description = wall_desc, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + -- connect_bottom = + connect_front = {-3/16, -1/2, -1/2, 3/16, 3/8, -1/4}, + connect_left = {-1/2, -1/2, -3/16, -1/4, 3/8, 3/16}, + connect_back = {-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}, + connect_right = { 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}, + }, + collision_box = { + type = "connected", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2 + fence_collision_extra, 1/4}, + -- connect_top = + -- connect_bottom = + connect_front = {-1/4,-1/2,-1/2,1/4,1/2 + fence_collision_extra,-1/4}, + connect_left = {-1/2,-1/2,-1/4,-1/4,1/2 + fence_collision_extra,1/4}, + connect_back = {-1/4,-1/2,1/4,1/4,1/2 + fence_collision_extra,1/2}, + connect_right = {1/4,-1/2,-1/4,1/2,1/2 + fence_collision_extra,1/4}, + }, + connects_to = { "group:wall", "group:stone", "group:fence", "group:wall_connected" }, + paramtype = "light", + is_ground_content = false, + tiles = wall_texture_table, + walkable = true, + groups = { cracky = 3, wall = 1, stone = 2 }, + sounds = wall_sounds, + }) + + -- crafting recipe + -- HACK: + -- Walls have no crafts, when register new wall via API from another mod, but in the same namespace (`walls`). + -- So we should remove `":"` at the beginning of the name. + if wall_name:sub(1, 1) == ":" then + wall_name = wall_name:sub(2) + end + minetest.register_craft({ + output = wall_name .. " 6", + recipe = { + { "", "", "" }, + { wall_mat, wall_mat, wall_mat}, + { wall_mat, wall_mat, wall_mat}, + } + }) + +end + +walls.register("walls:cobble", S("Cobblestone Wall"), {"default_cobble.png"}, + "default:cobble", default.node_sound_stone_defaults()) + +walls.register("walls:mossycobble", S("Mossy Cobblestone Wall"), {"default_mossycobble.png"}, + "default:mossycobble", default.node_sound_stone_defaults()) + +walls.register("walls:desertcobble", S("Desert Cobblestone Wall"), {"default_desert_cobble.png"}, + "default:desert_cobble", default.node_sound_stone_defaults()) + diff --git a/mods/minetest_game/walls/license.txt b/mods/minetest_game/walls/license.txt new file mode 100644 index 00000000..ccfaf1cd --- /dev/null +++ b/mods/minetest_game/walls/license.txt @@ -0,0 +1,14 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2015 Auke Kok + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/mods/minetest_game/walls/locale/template.txt b/mods/minetest_game/walls/locale/template.txt new file mode 100644 index 00000000..6721dc6f --- /dev/null +++ b/mods/minetest_game/walls/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall= +Mossy Cobblestone Wall= +Desert Cobblestone Wall= diff --git a/mods/minetest_game/walls/locale/walls.de.tr b/mods/minetest_game/walls/locale/walls.de.tr new file mode 100644 index 00000000..c31d4f67 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.de.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Kopfsteinpflastermauer +Mossy Cobblestone Wall=Moosige Kopfsteinpflastermauer +Desert Cobblestone Wall=Wüstenkopfsteinpflastermauer diff --git a/mods/minetest_game/walls/locale/walls.eo.tr b/mods/minetest_game/walls/locale/walls.eo.tr new file mode 100644 index 00000000..95b8ceda --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.eo.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=PavimÅtona muro +Mossy Cobblestone Wall=Muska pavimÅtona muro +Desert Cobblestone Wall=Dezerta pavimÅtona muro diff --git a/mods/minetest_game/walls/locale/walls.es.tr b/mods/minetest_game/walls/locale/walls.es.tr new file mode 100644 index 00000000..796710fe --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.es.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Pared de adoquines +Mossy Cobblestone Wall=Pared de adoquines musgosos +Desert Cobblestone Wall=Pared de adoquines desérticos diff --git a/mods/minetest_game/walls/locale/walls.fr.tr b/mods/minetest_game/walls/locale/walls.fr.tr new file mode 100644 index 00000000..8dcb6252 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.fr.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Mur en pavé +Mossy Cobblestone Wall=Mur en pavé moussu +Desert Cobblestone Wall=Mur en pavé du désert diff --git a/mods/minetest_game/walls/locale/walls.id.tr b/mods/minetest_game/walls/locale/walls.id.tr new file mode 100644 index 00000000..8bfd9c77 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.id.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Tembok Bongkahan Batu +Mossy Cobblestone Wall=Tembok Bongkahan Batu Berlumut +Desert Cobblestone Wall=Tembok Bongkahan Batu Gurun diff --git a/mods/minetest_game/walls/locale/walls.it.tr b/mods/minetest_game/walls/locale/walls.it.tr new file mode 100644 index 00000000..4babad23 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.it.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Muro di ciottoli +Mossy Cobblestone Wall=Muro di ciottoli muschiosi +Desert Cobblestone Wall=Muro di ciottoli del deserto diff --git a/mods/minetest_game/walls/locale/walls.ja.tr b/mods/minetest_game/walls/locale/walls.ja.tr new file mode 100644 index 00000000..c907aed5 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.ja.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=丸石ã®å¡€ +Mossy Cobblestone Wall=苔むã—ãŸä¸¸çŸ³ã®å¡€ +Desert Cobblestone Wall=ç ‚æ¼ ã®ä¸¸çŸ³ã®å¡€ diff --git a/mods/minetest_game/walls/locale/walls.jbo.tr b/mods/minetest_game/walls/locale/walls.jbo.tr new file mode 100644 index 00000000..aba765cf --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=lo lolro'iboi bitmu +Mossy Cobblestone Wall=lo clika lolro'iboi bitmu +Desert Cobblestone Wall=lo cantu'a lolro'iboi bitmu diff --git a/mods/minetest_game/walls/locale/walls.lv.tr b/mods/minetest_game/walls/locale/walls.lv.tr new file mode 100644 index 00000000..5d50ddfe --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.lv.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=MÅ«rakmens siena +Mossy Cobblestone Wall=ApsÅ«nÄ“juÅ¡a mÅ«rakmens siena +Desert Cobblestone Wall=TuksneÅ¡a mÅ«rakmens siena diff --git a/mods/minetest_game/walls/locale/walls.ms.tr b/mods/minetest_game/walls/locale/walls.ms.tr new file mode 100644 index 00000000..93753429 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.ms.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Pagar Batu Buntar +Mossy Cobblestone Wall=Pagar Batu Buntar Berlumut +Desert Cobblestone Wall=Pagar Batu Buntar Gurun diff --git a/mods/minetest_game/walls/locale/walls.pl.tr b/mods/minetest_game/walls/locale/walls.pl.tr new file mode 100644 index 00000000..ff544e20 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.pl.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Brukowa Å›ciana +Mossy Cobblestone Wall=Brukowa Å›ciana z mchem +Desert Cobblestone Wall=Pustynno-brukowa Å›ciana diff --git a/mods/minetest_game/walls/locale/walls.pt_BR.tr b/mods/minetest_game/walls/locale/walls.pt_BR.tr new file mode 100644 index 00000000..58c3d122 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Parede de Paralelepípedo +Mossy Cobblestone Wall=Parede de Paralelepípedo com Musgo +Desert Cobblestone Wall=Parede de Paralelepípedo do Deserto diff --git a/mods/minetest_game/walls/locale/walls.ru.tr b/mods/minetest_game/walls/locale/walls.ru.tr new file mode 100644 index 00000000..2f615368 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.ru.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Стена из булыжника +Mossy Cobblestone Wall=Стена из замшелого булыжника +Desert Cobblestone Wall=Стена из пуÑтынного булыжника diff --git a/mods/minetest_game/walls/locale/walls.sk.tr b/mods/minetest_game/walls/locale/walls.sk.tr new file mode 100644 index 00000000..69cf3a93 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.sk.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Múr z dlažbových kociek +Mossy Cobblestone Wall=Múr z dlažbových kociek obrastených machom +Desert Cobblestone Wall=Múr z púštnych dlažbových kociek diff --git a/mods/minetest_game/walls/locale/walls.sv.tr b/mods/minetest_game/walls/locale/walls.sv.tr new file mode 100644 index 00000000..1ad4a29e --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.sv.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Kullerstensvägg +Mossy Cobblestone Wall=Mossig kullerstensvägg +Desert Cobblestone Wall=Ökenkullerstensvägg diff --git a/mods/minetest_game/walls/locale/walls.uk.tr b/mods/minetest_game/walls/locale/walls.uk.tr new file mode 100644 index 00000000..25bdd268 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.uk.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=КруглÑковий паркан +Mossy Cobblestone Wall=Паркан з моховитого круглÑку +Desert Cobblestone Wall=Паркан з пуÑтельного круглÑку diff --git a/mods/minetest_game/walls/locale/walls.zh_CN.tr b/mods/minetest_game/walls/locale/walls.zh_CN.tr new file mode 100644 index 00000000..f590e825 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=é¹…åµçŸ³å¢™ +Mossy Cobblestone Wall=苔藓覆盖的鹅åµçŸ³å¢™ +Desert Cobblestone Wall=沙漠鹅åµçŸ³å¢™ diff --git a/mods/minetest_game/walls/locale/walls.zh_TW.tr b/mods/minetest_game/walls/locale/walls.zh_TW.tr new file mode 100644 index 00000000..ba1285f6 --- /dev/null +++ b/mods/minetest_game/walls/locale/walls.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=éµåµçŸ³ç‰† +Mossy Cobblestone Wall=苔蘚覆蓋的éµåµçŸ³ç‰† +Desert Cobblestone Wall=沙漠éµåµçŸ³ç‰† diff --git a/mods/minetest_game/walls/mod.conf b/mods/minetest_game/walls/mod.conf new file mode 100644 index 00000000..9b8bbe84 --- /dev/null +++ b/mods/minetest_game/walls/mod.conf @@ -0,0 +1,3 @@ +name = walls +description = Minetest Game mod: walls +depends = default diff --git a/mods/minetest_game/weather/README.txt b/mods/minetest_game/weather/README.txt new file mode 100644 index 00000000..67334600 --- /dev/null +++ b/mods/minetest_game/weather/README.txt @@ -0,0 +1,4 @@ +Minetest Game mod: weather +========================== +See license.txt for license information. +Source code by paramat (MIT). diff --git a/mods/minetest_game/weather/api.lua b/mods/minetest_game/weather/api.lua new file mode 100644 index 00000000..818e26a3 --- /dev/null +++ b/mods/minetest_game/weather/api.lua @@ -0,0 +1,32 @@ +local CYCLE = 8 -- Time period of cyclic clouds update in seconds + +weather = {} + +-- default implementation is empty +function weather.get(player) + return {} +end + +local function do_update() + for _, player in ipairs(minetest.get_connected_players()) do + local params = weather.get(player) + assert(params ~= nil, "weather.get() must not return nil") + if params.clouds then + player:set_clouds(params.clouds) + end + if params.lighting then + player:set_lighting(params.lighting) + end + end +end + +local function cyclic_update() + do_update() + minetest.after(CYCLE, cyclic_update) +end +minetest.after(0, cyclic_update) + +-- Update on player join to instantly alter clouds from the default +minetest.register_on_joinplayer(function(player) + do_update() +end) diff --git a/mods/minetest_game/weather/init.lua b/mods/minetest_game/weather/init.lua new file mode 100644 index 00000000..68743285 --- /dev/null +++ b/mods/minetest_game/weather/init.lua @@ -0,0 +1,129 @@ +-- Always load the API +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/api.lua") + +-- Disable by mapgen or setting + +if minetest.settings:get_bool("enable_weather") == false then + return +end + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" then + -- set a default shadow intensity for mgv6 and singlenode + minetest.register_on_joinplayer(function(player) + player:set_lighting({ + shadows = { intensity = 0.33 }, + bloom = { intensity = 0.05 }, + volumetric_light = { strength = 0.2 }, + }) + end) + + return +end + +-- Default implementation for noise based cloud appearance + +local TSCALE = 600 -- Time scale of noise variation in seconds + +local np_density = { + offset = 0.5, + scale = 0.5, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 813, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local np_thickness = { + offset = 0.5, + scale = 0.5, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 96, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local np_speedx = { + offset = 0, + scale = 1, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 911923, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local np_speedz = { + offset = 0, + scale = 1, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 5728, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local nobj_density = nil +local nobj_thickness = nil +local nobj_speedx = nil +local nobj_speedz = nil + +local function rangelim(value, lower, upper) + return math.min(math.max(value, lower), upper) +end + +local t_offset +do + local meta = minetest.get_mod_storage() + if meta:contains("time_offset") then + t_offset = meta:get_int("time_offset") + else + -- Use random offset so not each new world behaves the same. + t_offset = math.random(0, 300000) + meta:set_int("time_offset", t_offset) + end +end + +function weather.get(player) + -- Adjusted time in seconds + local time = math.floor(minetest.get_gametime() - t_offset) + + nobj_density = nobj_density or minetest.get_perlin(np_density) + nobj_thickness = nobj_thickness or minetest.get_perlin(np_thickness) + nobj_speedx = nobj_speedx or minetest.get_perlin(np_speedx) + nobj_speedz = nobj_speedz or minetest.get_perlin(np_speedz) + + local n_density = nobj_density:get_2d({x = time, y = 0}) -- 0 to 1 + local n_thickness = nobj_thickness:get_2d({x = time, y = 0}) -- 0 to 1 + local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) -- -1 to 1 + local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1 + + -- Fallback to mid-value 50 for very old worlds + local humid = minetest.get_humidity(player:get_pos()) or 50 + -- Default and classic density value is 0.4, make this happen + -- at humidity midvalue 50 when n_density is at midvalue 0.5. + -- density_max = 0.25 at humid = 0. + -- density_max = 0.8 at humid = 50. + -- density_max = 1.35 at humid = 100. + local density_max = 0.8 + ((humid - 50) / 50) * 0.55 + -- Range limit density_max to always have occasional + -- small scattered clouds at extreme low humidity. + local density = rangelim(density_max, 0.2, 1.0) * n_density + + return { + clouds = { + density = density, + thickness = math.max(math.floor( + rangelim(32 * humid / 100, 8, 32) * n_thickness + ), 2), + speed = {x = n_speedx * 4, z = n_speedz * 4}, + }, + lighting = { + shadows = { intensity = 0.7 * (1 - density) }, + bloom = { intensity = 0.05 }, + volumetric_light = { strength = 0.2 }, + } + } +end diff --git a/mods/minetest_game/weather/license.txt b/mods/minetest_game/weather/license.txt new file mode 100644 index 00000000..33baa06d --- /dev/null +++ b/mods/minetest_game/weather/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2019 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/minetest_game/weather/mod.conf b/mods/minetest_game/weather/mod.conf new file mode 100644 index 00000000..436ce678 --- /dev/null +++ b/mods/minetest_game/weather/mod.conf @@ -0,0 +1,2 @@ +name = weather +description = Minetest Game mod: weather diff --git a/mods/minetest_game/wool/README.txt b/mods/minetest_game/wool/README.txt new file mode 100644 index 00000000..31febdf2 --- /dev/null +++ b/mods/minetest_game/wool/README.txt @@ -0,0 +1,16 @@ +Minetest Game mod: wool +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Cisoun (CC BY-SA 3.0): + wool_black.png wool_brown.png wool_dark_green.png wool_green.png + wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png + wool_blue.png wool_cyan.png wool_dark_grey.png wool_grey.png + wool_orange.png wool_red.png wool_white.png diff --git a/mods/minetest_game/wool/init.lua b/mods/minetest_game/wool/init.lua new file mode 100644 index 00000000..87bd4274 --- /dev/null +++ b/mods/minetest_game/wool/init.lua @@ -0,0 +1,54 @@ +-- wool/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("wool") + +local dyes = dye.dyes + +for i = 1, #dyes do + local name, desc = unpack(dyes[i]) + + local color_group = "color_" .. name + + minetest.register_node("wool:" .. name, { + description = S(desc .. " Wool"), + tiles = {"wool_" .. name .. ".png"}, + is_ground_content = false, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1, [color_group] = 1}, + sounds = default.node_sound_defaults(), + }) + + minetest.register_craft{ + type = "shapeless", + output = "wool:" .. name, + recipe = {"group:dye," .. color_group, "group:wool"}, + } +end + +-- Legacy +-- Backwards compatibility with jordach's 16-color wool mod +minetest.register_alias("wool:dark_blue", "wool:blue") +minetest.register_alias("wool:gold", "wool:yellow") + +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this run: +-- for _,e in ipairs(dye.dyes) do print(("S(%q)"):format(e[2].." Wool")) end + +--[[ +S("White Wool") +S("Grey Wool") +S("Dark Grey Wool") +S("Black Wool") +S("Violet Wool") +S("Blue Wool") +S("Cyan Wool") +S("Dark Green Wool") +S("Green Wool") +S("Yellow Wool") +S("Brown Wool") +S("Orange Wool") +S("Red Wool") +S("Magenta Wool") +S("Pink Wool") +--]] diff --git a/mods/minetest_game/wool/license.txt b/mods/minetest_game/wool/license.txt new file mode 100644 index 00000000..5dfc7519 --- /dev/null +++ b/mods/minetest_game/wool/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Cisoun + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/wool/locale/template.txt b/mods/minetest_game/wool/locale/template.txt new file mode 100644 index 00000000..316cd2c0 --- /dev/null +++ b/mods/minetest_game/wool/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool= +Grey Wool= +Dark Grey Wool= +Black Wool= +Violet Wool= +Blue Wool= +Cyan Wool= +Dark Green Wool= +Green Wool= +Yellow Wool= +Brown Wool= +Orange Wool= +Red Wool= +Magenta Wool= +Pink Wool= diff --git a/mods/minetest_game/wool/locale/wool.de.tr b/mods/minetest_game/wool/locale/wool.de.tr new file mode 100644 index 00000000..9b6b8ab8 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.de.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Weiße Wolle +Grey Wool=Graue Wolle +Dark Grey Wool=Dunkelgraue Wolle +Black Wool=Schwarze Wolle +Violet Wool=Violette Wolle +Blue Wool=Blaue Wolle +Cyan Wool=Türkise Wolle +Dark Green Wool=Dunkelgrüne Wolle +Green Wool=Grüne Wolle +Yellow Wool=Gelbe Wolle +Brown Wool=Braune Wolle +Orange Wool=Orange Wolle +Red Wool=Rote Wolle +Magenta Wool=Magenta Wolle +Pink Wool=Rosa Wolle diff --git a/mods/minetest_game/wool/locale/wool.eo.tr b/mods/minetest_game/wool/locale/wool.eo.tr new file mode 100644 index 00000000..78242cd7 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.eo.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Blanka lano +Grey Wool=Griza lano +Dark Grey Wool=Malhela griza lano +Black Wool=Nigra lano +Violet Wool=Violkolora lano +Blue Wool=Blua lano +Cyan Wool=Bluverda lano +Dark Green Wool=Malhela verda lano +Green Wool=Verda lano +Yellow Wool=Flava lano +Brown Wool=Bruna lano +Orange Wool=OranÄkolora lano +Red Wool=RuÄa lano +Magenta Wool=Fuksina lano +Pink Wool=Rozkolora lano diff --git a/mods/minetest_game/wool/locale/wool.es.tr b/mods/minetest_game/wool/locale/wool.es.tr new file mode 100644 index 00000000..ac155920 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.es.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lana blanca +Grey Wool=Lana gris +Dark Grey Wool=Lana gris oscuro +Black Wool=Lana negra +Violet Wool=Lana violeta +Blue Wool=Lana azul +Cyan Wool=Lana cián +Dark Green Wool=Lana verde oscuro +Green Wool=Lana verde +Yellow Wool=Lana amarilla +Brown Wool=Lana marrón +Orange Wool=Lana naranja +Red Wool=Lana roja +Magenta Wool=Lana magenta +Pink Wool=Lana rosa diff --git a/mods/minetest_game/wool/locale/wool.fr.tr b/mods/minetest_game/wool/locale/wool.fr.tr new file mode 100644 index 00000000..48a60a7e --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.fr.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Laine blanche +Grey Wool=Laine grise +Dark Grey Wool=Laine grise foncée +Black Wool=Laine noire +Violet Wool=Laine violette +Blue Wool=Laine bleue +Cyan Wool=Laine cyan +Dark Green Wool=Laine verte foncée +Green Wool=Laine verte +Yellow Wool=Laine jaune +Brown Wool=Laine marron +Orange Wool=Laine orange +Red Wool=Laine rouge +Magenta Wool=Laine magenta +Pink Wool=Laine rose diff --git a/mods/minetest_game/wool/locale/wool.id.tr b/mods/minetest_game/wool/locale/wool.id.tr new file mode 100644 index 00000000..603277fd --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.id.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Wol Putih +Grey Wool=Wol Abu +Dark Grey Wool=Wol Abu Tua +Black Wool=Wol Hitam +Violet Wool=Wol Ungu +Blue Wool=Wol Biru +Cyan Wool=Wol Sian +Dark Green Wool=Wol Hijau Tua +Green Wool=Wol Hijau +Yellow Wool=Wol Kuning +Brown Wool=Wol Cokelat +Orange Wool=Wol Oranye +Red Wool=Wol Merah +Magenta Wool=Wol Magenta +Pink Wool=Wol Merah Muda diff --git a/mods/minetest_game/wool/locale/wool.it.tr b/mods/minetest_game/wool/locale/wool.it.tr new file mode 100644 index 00000000..8108f2fc --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.it.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lana bianca +Grey Wool=Lana grigia +Dark Grey Wool=Lana grigia scura +Black Wool=Lana nera +Violet Wool=Lana viola +Blue Wool=Lana blu +Cyan Wool=Lana ciano +Dark Green Wool=Lana verde scura +Green Wool=Lana verde +Yellow Wool=Lana gialla +Brown Wool=Lana marrone +Orange Wool=Lana arancione +Red Wool=Lana rossa +Magenta Wool=Lana magenta +Pink Wool=Lana rosa diff --git a/mods/minetest_game/wool/locale/wool.ja.tr b/mods/minetest_game/wool/locale/wool.ja.tr new file mode 100644 index 00000000..5051f9e7 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.ja.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白色ã®ç¾Šæ¯› +Grey Wool=ç°è‰²ã®ç¾Šæ¯› +Dark Grey Wool=濃ç°è‰²ã®ç¾Šæ¯› +Black Wool=黒色ã®ç¾Šæ¯› +Violet Wool=紫色ã®ç¾Šæ¯› +Blue Wool=é’色ã®ç¾Šæ¯› +Cyan Wool=é’緑色ã®ç¾Šæ¯› +Dark Green Wool=濃緑色ã®ç¾Šæ¯› +Green Wool=緑色ã®ç¾Šæ¯› +Yellow Wool=黄色ã®ç¾Šæ¯› +Brown Wool=茶色ã®ç¾Šæ¯› +Orange Wool=橙色ã®ç¾Šæ¯› +Red Wool=赤色ã®ç¾Šæ¯› +Magenta Wool=赤紫色ã®ç¾Šæ¯› +Pink Wool=桃色ã®ç¾Šæ¯› diff --git a/mods/minetest_game/wool/locale/wool.jbo.tr b/mods/minetest_game/wool/locale/wool.jbo.tr new file mode 100644 index 00000000..4bf44ecf --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.jbo.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=lo blabi sunla +Grey Wool=lo grusi sunla +Dark Grey Wool=lo xekri grusi sunla +Black Wool=lo xekri sunla +Violet Wool=lo zirpu sunla +Blue Wool=lo blanu sunla +Cyan Wool=lo cicna sunla +Dark Green Wool=lo xekri crino sunla +Green Wool=lo crino sunla +Yellow Wool=lo pelxu sunla +Brown Wool=lo bunre sunla +Orange Wool=lo narju sunla +Red Wool=lo xunre sunla +Magenta Wool=lo nukni sunla +Pink Wool=lo xunblabi sunla diff --git a/mods/minetest_game/wool/locale/wool.lv.tr b/mods/minetest_game/wool/locale/wool.lv.tr new file mode 100644 index 00000000..72e514e4 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.lv.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Balta vilna +Grey Wool=PelÄ“ka vilna +Dark Grey Wool=TumÅ¡pelÄ“ka vilna +Black Wool=Melna vilna +Violet Wool=Violeta vilna +Blue Wool=Zila vilna +Cyan Wool=CiÄnkrÄsas vilna +Dark Green Wool=TumÅ¡zaļa vilna +Green Wool=Zaļa vilna +Yellow Wool=Dzeltena vilna +Brown Wool=BrÅ«na vilna +Orange Wool=Oranža vilna +Red Wool=Sarkana vilna +Magenta Wool=FuksÄ«na krÄsas vilna +Pink Wool=RozÄ vilna diff --git a/mods/minetest_game/wool/locale/wool.ms.tr b/mods/minetest_game/wool/locale/wool.ms.tr new file mode 100644 index 00000000..8b597d14 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.ms.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Bulu Biri-Biri Putih +Grey Wool=Bulu Biri-Biri Kelabu +Dark Grey Wool=Bulu Biri-Biri Kelabu Tua +Black Wool=Bulu Biri-Biri Hitam +Violet Wool=Bulu Biri-Biri Ungu +Blue Wool=Bulu Biri-Biri Biru +Cyan Wool=Bulu Biri-Biri Biru Kehijauan +Dark Green Wool=Bulu Biri-Biri Hijau Tua +Green Wool=Bulu Biri-Biri Hijau +Yellow Wool=Bulu Biri-Biri Kuning +Brown Wool=Bulu Biri-Biri Perang +Orange Wool=Bulu Biri-Biri Jingga +Red Wool=Bulu Biri-Biri Merah +Magenta Wool=Bulu Biri-Biri Magenta +Pink Wool=Bulu Biri-Biri Merah Jambu diff --git a/mods/minetest_game/wool/locale/wool.pl.tr b/mods/minetest_game/wool/locale/wool.pl.tr new file mode 100644 index 00000000..9c411c81 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.pl.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=BiaÅ‚a weÅ‚na +Grey Wool=Szara weÅ‚na +Dark Grey Wool=Ciemnoszara weÅ‚na +Black Wool=Czarna weÅ‚na +Violet Wool=Fioletowa weÅ‚na +Blue Wool=Niebieska weÅ‚na +Cyan Wool=Cyjanowa weÅ‚na +Dark Green Wool=Ciemnozielona weÅ‚na +Green Wool=Zielona weÅ‚na +Yellow Wool=Żółta weÅ‚na +Brown Wool=BrÄ…zowa weÅ‚na +Orange Wool=PomaraÅ„czowa weÅ‚na +Red Wool=Czerwona weÅ‚na +Magenta Wool=Karmazynowa weÅ‚na +Pink Wool=Różowa weÅ‚na diff --git a/mods/minetest_game/wool/locale/wool.pt.tr b/mods/minetest_game/wool/locale/wool.pt.tr new file mode 100644 index 00000000..9b4232f7 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.pt.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Tecido Branco +Grey Wool=Tecido Cinza +Dark Grey Wool=Tecido Cinza-escuro +Black Wool=Tecido Preto +Violet Wool=Tecido Violeta +Blue Wool=Tecido Azul +Cyan Wool=Tecido Ciano +Dark Green Wool=Tecido Verde-escuro +Green Wool=Tecido Verde +Yellow Wool=Tecido Amarelo +Brown Wool=Tecido Marrom +Orange Wool=Tecido Laranja +Red Wool=Tecido Vermelho +Magenta Wool=Tecido Magenta +Pink Wool=Tecido Rosa diff --git a/mods/minetest_game/wool/locale/wool.pt_BR.tr b/mods/minetest_game/wool/locale/wool.pt_BR.tr new file mode 100644 index 00000000..9b4232f7 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Tecido Branco +Grey Wool=Tecido Cinza +Dark Grey Wool=Tecido Cinza-escuro +Black Wool=Tecido Preto +Violet Wool=Tecido Violeta +Blue Wool=Tecido Azul +Cyan Wool=Tecido Ciano +Dark Green Wool=Tecido Verde-escuro +Green Wool=Tecido Verde +Yellow Wool=Tecido Amarelo +Brown Wool=Tecido Marrom +Orange Wool=Tecido Laranja +Red Wool=Tecido Vermelho +Magenta Wool=Tecido Magenta +Pink Wool=Tecido Rosa diff --git a/mods/minetest_game/wool/locale/wool.ru.tr b/mods/minetest_game/wool/locale/wool.ru.tr new file mode 100644 index 00000000..9893a085 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.ru.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Ð‘ÐµÐ»Ð°Ñ ÑˆÐµÑ€Ñть +Grey Wool=Ð¡ÐµÑ€Ð°Ñ ÑˆÐµÑ€Ñть +Dark Grey Wool=Тёмно-Ð¡ÐµÑ€Ð°Ñ ÑˆÐµÑ€Ñть +Black Wool=Ð§Ñ‘Ñ€Ð½Ð°Ñ ÑˆÐµÑ€Ñть +Violet Wool=Ð¤Ð¸Ð¾Ð»ÐµÑ‚Ð¾Ð²Ð°Ñ ÑˆÐµÑ€Ñть +Blue Wool=СинÑÑ ÑˆÐµÑ€Ñть +Cyan Wool=Ð‘Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ ÑˆÐµÑ€Ñть +Dark Green Wool=Тёмно-Ð—ÐµÐ»Ñ‘Ð½Ð°Ñ ÑˆÐµÑ€Ñть +Green Wool=Ð—ÐµÐ»Ñ‘Ð½Ð°Ñ ÑˆÐµÑ€Ñть +Yellow Wool=Ð–Ñ‘Ð»Ñ‚Ð°Ñ ÑˆÐµÑ€Ñть +Brown Wool=ÐšÐ¾Ñ€Ð¸Ñ‡Ð½ÐµÐ²Ð°Ñ ÑˆÐµÑ€Ñть +Orange Wool=ÐžÑ€Ð°Ð½Ð¶ÐµÐ²Ð°Ñ ÑˆÐµÑ€Ñть +Red Wool=КраÑÐ½Ð°Ñ ÑˆÐµÑ€Ñть +Magenta Wool=Ð¡Ð¸Ñ€ÐµÐ½ÐµÐ²Ð°Ñ ÑˆÐµÑ€Ñть +Pink Wool=Ð Ð¾Ð·Ð¾Ð²Ð°Ñ ÑˆÐµÑ€Ñть diff --git a/mods/minetest_game/wool/locale/wool.sk.tr b/mods/minetest_game/wool/locale/wool.sk.tr new file mode 100644 index 00000000..755370e8 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.sk.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Biela vlna +Grey Wool=Å edá vlna +Dark Grey Wool=TmavoÅ¡edá vlna +Black Wool=ÄŒierna vlna +Violet Wool=Fialová vlna +Blue Wool=Modrá vlna +Cyan Wool=Tyrkysová vlna +Dark Green Wool=Tmavozelená vlna +Green Wool=Zelená vlna +Yellow Wool=Žltá vlna +Brown Wool=Hnedá vlna +Orange Wool=Oranžová vlna +Red Wool=ÄŒervená vlna +Magenta Wool=Purpurová vlna +Pink Wool=Ružová vlna diff --git a/mods/minetest_game/wool/locale/wool.sv.tr b/mods/minetest_game/wool/locale/wool.sv.tr new file mode 100644 index 00000000..bfce2140 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.sv.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Vit ull +Grey Wool=GrÃ¥ ull +Dark Grey Wool=MörkgrÃ¥ ull +Black Wool=Svart ull +Violet Wool=Violett ull +Blue Wool=BlÃ¥ ull +Cyan Wool=Cyan ull +Dark Green Wool=Mörkgrön ull +Green Wool=Grön ull +Yellow Wool=Gul ull +Brown Wool=Brun ull +Orange Wool=Orange ull +Red Wool=Röd ull +Magenta Wool=Magenta ull +Pink Wool=Rosa ull diff --git a/mods/minetest_game/wool/locale/wool.uk.tr b/mods/minetest_game/wool/locale/wool.uk.tr new file mode 100644 index 00000000..24dbed7f --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.uk.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Біла вовна +Grey Wool=Сіра вовна +Dark Grey Wool=Темно-Ñіра вовна +Black Wool=Чорна вовна +Violet Wool=Фіолетова вовна +Blue Wool=Ð¡Ð¸Ð½Ñ Ð²Ð¾Ð²Ð½Ð° +Cyan Wool=Синьо-зелена вовна +Dark Green Wool=Темно-зелена вовна +Green Wool=Зелена вовна +Yellow Wool=Жовта вовна +Brown Wool=Коричнева вовна +Orange Wool=Помаранчева вовна +Red Wool=Червона вовна +Magenta Wool=Пурпурна вовна +Pink Wool=Рожева вовна diff --git a/mods/minetest_game/wool/locale/wool.zh_CN.tr b/mods/minetest_game/wool/locale/wool.zh_CN.tr new file mode 100644 index 00000000..caac9ee2 --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.zh_CN.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=ç°ç¾Šæ¯› +Dark Grey Wool=æš—ç°ç¾Šæ¯› +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=è“羊毛 +Cyan Wool=é’羊毛 +Dark Green Wool=暗绿羊毛 +Green Wool=绿羊毛 +Yellow Wool=黄羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=红羊毛 +Magenta Wool=å“红羊毛 +Pink Wool=粉红羊毛 diff --git a/mods/minetest_game/wool/locale/wool.zh_TW.tr b/mods/minetest_game/wool/locale/wool.zh_TW.tr new file mode 100644 index 00000000..290a1fed --- /dev/null +++ b/mods/minetest_game/wool/locale/wool.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=ç°ç¾Šæ¯› +Dark Grey Wool=æš—ç°ç¾Šæ¯› +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=è—羊毛 +Cyan Wool=é’羊毛 +Dark Green Wool=暗綠羊毛 +Green Wool=綠羊毛 +Yellow Wool=黃羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=紅羊毛 +Magenta Wool=å“紅羊毛 +Pink Wool=粉紅羊毛 diff --git a/mods/minetest_game/wool/mod.conf b/mods/minetest_game/wool/mod.conf new file mode 100644 index 00000000..a0ca3f0e --- /dev/null +++ b/mods/minetest_game/wool/mod.conf @@ -0,0 +1,3 @@ +name = wool +description = Minetest Game mod: wool +depends = default, dye diff --git a/mods/minetest_game/wool/textures/wool_black.png b/mods/minetest_game/wool/textures/wool_black.png new file mode 100644 index 00000000..700d439d Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_black.png differ diff --git a/mods/minetest_game/wool/textures/wool_blue.png b/mods/minetest_game/wool/textures/wool_blue.png new file mode 100644 index 00000000..a0749867 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_blue.png differ diff --git a/mods/minetest_game/wool/textures/wool_brown.png b/mods/minetest_game/wool/textures/wool_brown.png new file mode 100644 index 00000000..2620dfdb Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_brown.png differ diff --git a/mods/minetest_game/wool/textures/wool_cyan.png b/mods/minetest_game/wool/textures/wool_cyan.png new file mode 100644 index 00000000..395b6ac7 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_cyan.png differ diff --git a/mods/minetest_game/wool/textures/wool_dark_green.png b/mods/minetest_game/wool/textures/wool_dark_green.png new file mode 100644 index 00000000..0e73999e Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_dark_green.png differ diff --git a/mods/minetest_game/wool/textures/wool_dark_grey.png b/mods/minetest_game/wool/textures/wool_dark_grey.png new file mode 100644 index 00000000..7253696e Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_dark_grey.png differ diff --git a/mods/minetest_game/wool/textures/wool_green.png b/mods/minetest_game/wool/textures/wool_green.png new file mode 100644 index 00000000..dcb663be Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_green.png differ diff --git a/mods/minetest_game/wool/textures/wool_grey.png b/mods/minetest_game/wool/textures/wool_grey.png new file mode 100644 index 00000000..2f4c3380 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_grey.png differ diff --git a/mods/minetest_game/wool/textures/wool_magenta.png b/mods/minetest_game/wool/textures/wool_magenta.png new file mode 100644 index 00000000..5c2c4a7a Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_magenta.png differ diff --git a/mods/minetest_game/wool/textures/wool_orange.png b/mods/minetest_game/wool/textures/wool_orange.png new file mode 100644 index 00000000..a059f364 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_orange.png differ diff --git a/mods/minetest_game/wool/textures/wool_pink.png b/mods/minetest_game/wool/textures/wool_pink.png new file mode 100644 index 00000000..8e901407 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_pink.png differ diff --git a/mods/minetest_game/wool/textures/wool_red.png b/mods/minetest_game/wool/textures/wool_red.png new file mode 100644 index 00000000..da12ecff Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_red.png differ diff --git a/mods/minetest_game/wool/textures/wool_violet.png b/mods/minetest_game/wool/textures/wool_violet.png new file mode 100644 index 00000000..d7d67831 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_violet.png differ diff --git a/mods/minetest_game/wool/textures/wool_white.png b/mods/minetest_game/wool/textures/wool_white.png new file mode 100644 index 00000000..88f1e2f5 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_white.png differ diff --git a/mods/minetest_game/wool/textures/wool_yellow.png b/mods/minetest_game/wool/textures/wool_yellow.png new file mode 100644 index 00000000..2b0f0489 Binary files /dev/null and b/mods/minetest_game/wool/textures/wool_yellow.png differ diff --git a/mods/minetest_game/xpanes/README.txt b/mods/minetest_game/xpanes/README.txt new file mode 100644 index 00000000..7e2a1bed --- /dev/null +++ b/mods/minetest_game/xpanes/README.txt @@ -0,0 +1,32 @@ +Minetest Game mod: xpanes +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by xyz (MIT) +BlockMen (MIT) +sofar (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +xyz (CC BY-SA 3.0): + All textures not mentioned below. + +Gambit (CC BY-SA 3.0): + xpanes_bar.png + +paramat (CC BY-SA 3.0): + xpanes_bar_top.png + +Krock (CC0 1.0): + xpanes_edge.png + +TumeniNodes (CC BY-SA 3.0): + xpanes_door_steel_bar.png + xpanes_item_steel_bar.png + xpanes_trapdoor_steel_bar.png + xpanes_trapdoor_steel_bar_side.png + xpanes_steel_bar_door_close.ogg + xpanes_steel_bar_door_open.ogg diff --git a/mods/minetest_game/xpanes/init.lua b/mods/minetest_game/xpanes/init.lua new file mode 100644 index 00000000..a02dbfe4 --- /dev/null +++ b/mods/minetest_game/xpanes/init.lua @@ -0,0 +1,261 @@ +-- xpanes/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("xpanes") + + +local function is_pane(pos) + return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 +end + +local function connects_dir(pos, name, dir) + local aside = vector.add(pos, minetest.facedir_to_dir(dir)) + if is_pane(aside) then + return true + end + + local connects_to = minetest.registered_nodes[name].connects_to + if not connects_to then + return false + end + local list = minetest.find_nodes_in_area(aside, aside, connects_to) + + if #list > 0 then + return true + end + + return false +end + +local function swap(pos, node, name, param2) + if node.name == name and node.param2 == param2 then + return + end + + minetest.swap_node(pos, {name = name, param2 = param2}) +end + +local function update_pane(pos) + if not is_pane(pos) then + return + end + local node = minetest.get_node(pos) + local name = node.name + if name:sub(-5) == "_flat" then + name = name:sub(1, -6) + end + + local any = node.param2 + local c = {} + local count = 0 + for dir = 0, 3 do + c[dir] = connects_dir(pos, name, dir) + if c[dir] then + any = dir + count = count + 1 + end + end + + if count == 0 then + swap(pos, node, name .. "_flat", any) + elseif count == 1 then + swap(pos, node, name .. "_flat", (any + 1) % 4) + elseif count == 2 then + if (c[0] and c[2]) or (c[1] and c[3]) then + swap(pos, node, name .. "_flat", (any + 1) % 4) + else + swap(pos, node, name, 0) + end + else + swap(pos, node, name, 0) + end +end + +minetest.register_on_placenode(function(pos, node) + if minetest.get_item_group(node, "pane") then + update_pane(pos) + end + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end +end) + +minetest.register_on_dignode(function(pos) + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end +end) + +xpanes = {} +function xpanes.register_pane(name, def) + for i = 1, 15 do + minetest.register_alias("xpanes:" .. name .. "_" .. i, "xpanes:" .. name .. "_flat") + end + + local flatgroups = table.copy(def.groups) + flatgroups.pane = 1 + minetest.register_node(":xpanes:" .. name .. "_flat", { + description = def.description, + drawtype = "nodebox", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + paramtype2 = "facedir", + tiles = { + def.textures[3], + def.textures[3], + def.textures[3], + def.textures[3], + def.textures[1], + def.textures[1] + }, + groups = flatgroups, + drop = "xpanes:" .. name .. "_flat", + sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha and "blend" or "clip", + node_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + selection_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + connect_sides = { "left", "right" }, + }) + + local groups = table.copy(def.groups) + groups.pane = 1 + groups.not_in_creative_inventory = 1 + minetest.register_node(":xpanes:" .. name, { + drawtype = "nodebox", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + description = def.description, + tiles = { + def.textures[3], + def.textures[3], + def.textures[1] + }, + groups = groups, + drop = "xpanes:" .. name .. "_flat", + sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha and "blend" or "clip", + node_box = { + type = "connected", + fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}}, + connect_front = {{-1/32, -1/2, -1/2, 1/32, 1/2, -1/32}}, + connect_left = {{-1/2, -1/2, -1/32, -1/32, 1/2, 1/32}}, + connect_back = {{-1/32, -1/2, 1/32, 1/32, 1/2, 1/2}}, + connect_right = {{1/32, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + connects_to = {"group:pane", "group:stone", "group:glass", "group:wood", "group:tree"}, + }) + + minetest.register_craft({ + output = "xpanes:" .. name .. "_flat 16", + recipe = def.recipe + }) +end + +xpanes.register_pane("pane", { + description = S("Glass Pane"), + textures = {"default_glass.png", "", "xpanes_edge.png"}, + inventory_image = "default_glass.png", + wield_image = "default_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3}, + recipe = { + {"default:glass", "default:glass", "default:glass"}, + {"default:glass", "default:glass", "default:glass"} + } +}) + +xpanes.register_pane("obsidian_pane", { + description = S("Obsidian Glass Pane"), + textures = {"default_obsidian_glass.png", "", "xpanes_edge_obsidian.png"}, + inventory_image = "default_obsidian_glass.png", + wield_image = "default_obsidian_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3}, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"} + } +}) + +xpanes.register_pane("bar", { + description = S("Steel Bars"), + textures = {"xpanes_bar.png", "", "xpanes_bar_top.png"}, + inventory_image = "xpanes_bar.png", + wield_image = "xpanes_bar.png", + groups = {cracky=2}, + sounds = default.node_sound_metal_defaults(), + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) + +minetest.register_lbm({ + name = "xpanes:gen2", + nodenames = {"group:pane"}, + action = function(pos, node) + update_pane(pos) + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end + end +}) + +-- Register steel bar doors and trapdoors + +if minetest.get_modpath("doors") then + + doors.register("xpanes:door_steel_bar", { + tiles = {{name = "xpanes_door_steel_bar.png", backface_culling = true}}, + description = S("Steel Bar Door"), + inventory_image = "xpanes_item_steel_bar.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + sound_open = "xpanes_steel_bar_door_open", + sound_close = "xpanes_steel_bar_door_close", + gain_open = 0.15, + gain_close = 0.13, + recipe = { + {"xpanes:bar_flat", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "xpanes:bar_flat"}, + }, + }) + + doors.register_trapdoor("xpanes:trapdoor_steel_bar", { + description = S("Steel Bar Trapdoor"), + inventory_image = "xpanes_trapdoor_steel_bar.png", + wield_image = "xpanes_trapdoor_steel_bar.png", + tile_front = "xpanes_trapdoor_steel_bar.png", + tile_side = "xpanes_trapdoor_steel_bar_side.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2, door = 1}, + sounds = default.node_sound_metal_defaults(), + sound_open = "xpanes_steel_bar_door_open", + sound_close = "xpanes_steel_bar_door_close", + gain_open = 0.15, + gain_close = 0.13, + }) + + minetest.register_craft({ + output = "xpanes:trapdoor_steel_bar", + recipe = { + {"xpanes:bar_flat", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "xpanes:bar_flat"}, + } + }) +end diff --git a/mods/minetest_game/xpanes/license.txt b/mods/minetest_game/xpanes/license.txt new file mode 100644 index 00000000..c1f31e34 --- /dev/null +++ b/mods/minetest_game/xpanes/license.txt @@ -0,0 +1,65 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 xyz +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2016 Auke Kok +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 xyz +Copyright (C) 2013-2016 Gambit +Copyright (C) 2016 paramat +Copyright (C) 2019 TumeniNodes + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/minetest_game/xpanes/locale/template.txt b/mods/minetest_game/xpanes/locale/template.txt new file mode 100644 index 00000000..08dfbbae --- /dev/null +++ b/mods/minetest_game/xpanes/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane= +Obsidian Glass Pane= +Steel Bars= +Steel Bar Door= +Steel Bar Trapdoor= diff --git a/mods/minetest_game/xpanes/locale/xpanes.de.tr b/mods/minetest_game/xpanes/locale/xpanes.de.tr new file mode 100644 index 00000000..9852753f --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.de.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Glasscheibe +Obsidian Glass Pane=Obsidianglasscheibe +Steel Bars=Stahlgitter +Steel Bar Door=Stahlgittertür +Steel Bar Trapdoor=Stahlgitterfalltür diff --git a/mods/minetest_game/xpanes/locale/xpanes.eo.tr b/mods/minetest_game/xpanes/locale/xpanes.eo.tr new file mode 100644 index 00000000..cfbbfb56 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.eo.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Vitra vitraĵo +Obsidian Glass Pane=Obsidiana vitra vitraĵo +Steel Bars=Åœtalaj baraĵoj +Steel Bar Door=Åœtala baraĵa pordo +Steel Bar Trapdoor=Åœtala baraĵa plankpordo diff --git a/mods/minetest_game/xpanes/locale/xpanes.es.tr b/mods/minetest_game/xpanes/locale/xpanes.es.tr new file mode 100644 index 00000000..9902be70 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.es.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panel de vidrio +Obsidian Glass Pane=Panel de vidrio de obsidiana +Steel Bars=Barras de acero +Steel Bar Door=Puerta de barras de acero +Steel Bar Trapdoor=Trampilla de barras de acero diff --git a/mods/minetest_game/xpanes/locale/xpanes.fr.tr b/mods/minetest_game/xpanes/locale/xpanes.fr.tr new file mode 100644 index 00000000..c7517996 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.fr.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panneau de verre +Obsidian Glass Pane=Panneau de verre d'obsidienne +Steel Bars=Barreaux d'acier +Steel Bar Door=Porte en barreaux d'acier +Steel Bar Trapdoor=Trappe en barreaux d'acier diff --git a/mods/minetest_game/xpanes/locale/xpanes.id.tr b/mods/minetest_game/xpanes/locale/xpanes.id.tr new file mode 100644 index 00000000..906cc0f8 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.id.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panel Kaca +Obsidian Glass Pane=Panel Kaca Obsidian +Steel Bars=Batang Baja +Steel Bar Door=Pintu Batang Baja +Steel Bar Trapdoor=Pintu Kolong Batang Baja diff --git a/mods/minetest_game/xpanes/locale/xpanes.it.tr b/mods/minetest_game/xpanes/locale/xpanes.it.tr new file mode 100644 index 00000000..63c8b62a --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.it.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Pannello di vetro +Obsidian Glass Pane=Pannello di vetro d'ossidiana +Steel Bars=Sbarre d'acciaio +Steel Bar Door=Porta con sbarre d'acciaio +Steel Bar Trapdoor=Botola con sbarre d'acciaio diff --git a/mods/minetest_game/xpanes/locale/xpanes.ja.tr b/mods/minetest_game/xpanes/locale/xpanes.ja.tr new file mode 100644 index 00000000..06e0bed5 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.ja.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=æ¿ã‚¬ãƒ©ã‚¹ +Obsidian Glass Pane=é»’æ›œçŸ³ã®æ¿ã‚¬ãƒ©ã‚¹ +Steel Bars=é‰„æ£’ã®æŸµ +Steel Bar Door=鉄棒ã®ãƒ‰ã‚¢ +Steel Bar Trapdoor=鉄棒ã®ãƒˆãƒ©ãƒƒãƒ—ドア diff --git a/mods/minetest_game/xpanes/locale/xpanes.jbo.tr b/mods/minetest_game/xpanes/locale/xpanes.jbo.tr new file mode 100644 index 00000000..333b5313 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.jbo.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=lo blaci plita +Obsidian Glass Pane=lo je'erma'ablaci blaci plita +Steel Bars=lo gasta garna +Steel Bar Door=lo gasta garna vrogai +Steel Bar Trapdoor=lo gasta garna lolvrogai diff --git a/mods/minetest_game/xpanes/locale/xpanes.lv.tr b/mods/minetest_game/xpanes/locale/xpanes.lv.tr new file mode 100644 index 00000000..c75849c3 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.lv.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Stikla panelis +Obsidian Glass Pane=ObsidiÄna stikla panelis +Steel Bars=TÄ“rauda režģis +Steel Bar Door=TÄ“rauda režģa durvis +Steel Bar Trapdoor=TÄ“rauda režģa lÅ«ka diff --git a/mods/minetest_game/xpanes/locale/xpanes.ms.tr b/mods/minetest_game/xpanes/locale/xpanes.ms.tr new file mode 100644 index 00000000..dedfefa8 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.ms.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Kaca Tingkap +Obsidian Glass Pane=Kaca Tingkap Obsidia +Steel Bars=Jeriji Keluli +Steel Bar Door=Pintu Jeriji Keluli +Steel Bar Trapdoor=Pintu Kolong Jeriji Keluli diff --git a/mods/minetest_game/xpanes/locale/xpanes.pl.tr b/mods/minetest_game/xpanes/locale/xpanes.pl.tr new file mode 100644 index 00000000..0ebb386e --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.pl.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Szyba +Obsidian Glass Pane=Obsydianowa szyba +Steel Bars=Stalowe kraty +Steel Bar Door=Drzwi ze stalowych krat +Steel Bar Trapdoor=WÅ‚az ze stalowych krat diff --git a/mods/minetest_game/xpanes/locale/xpanes.pt_BR.tr b/mods/minetest_game/xpanes/locale/xpanes.pt_BR.tr new file mode 100644 index 00000000..c1ca3b26 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Painel de Vidro +Obsidian Glass Pane=Painel de Vidro de Obsidiana +Steel Bars=Barras de Aço +Steel Bar Door=Porta de Barras de Aço +Steel Bar Trapdoor=Alçapão de Barras de Aço diff --git a/mods/minetest_game/xpanes/locale/xpanes.ru.tr b/mods/minetest_game/xpanes/locale/xpanes.ru.tr new file mode 100644 index 00000000..cd7173e7 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.ru.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=СтеклÑÐ½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ +Obsidian Glass Pane=Панель из обÑидианового Ñтекла +Steel Bars=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÑˆÐµÑ‚ÐºÐ° +Steel Bar Door=Ð¡Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÑˆÑ‘Ñ‚Ñ‡Ð°Ñ‚Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +Steel Bar Trapdoor=Стальной решётчатый люк diff --git a/mods/minetest_game/xpanes/locale/xpanes.sk.tr b/mods/minetest_game/xpanes/locale/xpanes.sk.tr new file mode 100644 index 00000000..0d07e08a --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.sk.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Tabuľa skla +Obsidian Glass Pane=Tabuľa obsidiánového skla +Steel Bars=Oceľové mreže +Steel Bar Door=Dvere z oceľových mreží +Steel Bar Trapdoor=Padajúce dvere z oceľových mreží diff --git a/mods/minetest_game/xpanes/locale/xpanes.sv.tr b/mods/minetest_game/xpanes/locale/xpanes.sv.tr new file mode 100644 index 00000000..7b615dd3 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.sv.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Glasruta +Obsidian Glass Pane=Obsidianglasruta +Steel Bars=StÃ¥lgaller +Steel Bar Door=StÃ¥lgallerdörr +Steel Bar Trapdoor=StÃ¥lgallerfallucka diff --git a/mods/minetest_game/xpanes/locale/xpanes.uk.tr b/mods/minetest_game/xpanes/locale/xpanes.uk.tr new file mode 100644 index 00000000..41033bd6 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.uk.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=СклÑна панель +Obsidian Glass Pane=Панель з обÑидіанового Ñкла +Steel Bars=Òрати +Steel Bar Door=Двері з ґратами +Steel Bar Trapdoor=Люк з ґратами diff --git a/mods/minetest_game/xpanes/locale/xpanes.zh_CN.tr b/mods/minetest_game/xpanes/locale/xpanes.zh_CN.tr new file mode 100644 index 00000000..7b1871c9 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.zh_CN.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=玻璃窗 +Obsidian Glass Pane=黑曜石玻璃窗 +Steel Bars=钢筋 +Steel Bar Door=钢筋门 +Steel Bar Trapdoor=钢筋活æ¿é—¨ diff --git a/mods/minetest_game/xpanes/locale/xpanes.zh_TW.tr b/mods/minetest_game/xpanes/locale/xpanes.zh_TW.tr new file mode 100644 index 00000000..97ee7a28 --- /dev/null +++ b/mods/minetest_game/xpanes/locale/xpanes.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=玻璃窗 +Obsidian Glass Pane=黑曜石玻璃窗 +Steel Bars=鋼筋 +Steel Bar Door=鋼筋門 +Steel Bar Trapdoor=鋼筋活æ¿é–€ diff --git a/mods/minetest_game/xpanes/mod.conf b/mods/minetest_game/xpanes/mod.conf new file mode 100644 index 00000000..dcb07167 --- /dev/null +++ b/mods/minetest_game/xpanes/mod.conf @@ -0,0 +1,4 @@ +name = xpanes +description = Minetest Game mod: xpanes +depends = default +optional_depends = doors diff --git a/mods/minetest_game/xpanes/sounds/xpanes_steel_bar_door_close.ogg b/mods/minetest_game/xpanes/sounds/xpanes_steel_bar_door_close.ogg new file mode 100644 index 00000000..0620bfb8 Binary files /dev/null and b/mods/minetest_game/xpanes/sounds/xpanes_steel_bar_door_close.ogg differ diff --git a/mods/minetest_game/xpanes/sounds/xpanes_steel_bar_door_open.ogg b/mods/minetest_game/xpanes/sounds/xpanes_steel_bar_door_open.ogg new file mode 100644 index 00000000..d159be9b Binary files /dev/null and b/mods/minetest_game/xpanes/sounds/xpanes_steel_bar_door_open.ogg differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_bar.png b/mods/minetest_game/xpanes/textures/xpanes_bar.png new file mode 100644 index 00000000..3ea62a93 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_bar.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_bar_top.png b/mods/minetest_game/xpanes/textures/xpanes_bar_top.png new file mode 100644 index 00000000..2955d72c Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_bar_top.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_door_steel_bar.png b/mods/minetest_game/xpanes/textures/xpanes_door_steel_bar.png new file mode 100644 index 00000000..39f45c30 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_door_steel_bar.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_edge.png b/mods/minetest_game/xpanes/textures/xpanes_edge.png new file mode 100644 index 00000000..5768d663 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_edge.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_edge_obsidian.png b/mods/minetest_game/xpanes/textures/xpanes_edge_obsidian.png new file mode 100644 index 00000000..abdd14e3 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_edge_obsidian.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_item_steel_bar.png b/mods/minetest_game/xpanes/textures/xpanes_item_steel_bar.png new file mode 100644 index 00000000..46e4d9c6 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_item_steel_bar.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_trapdoor_steel_bar.png b/mods/minetest_game/xpanes/textures/xpanes_trapdoor_steel_bar.png new file mode 100644 index 00000000..a56c5ee3 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_trapdoor_steel_bar.png differ diff --git a/mods/minetest_game/xpanes/textures/xpanes_trapdoor_steel_bar_side.png b/mods/minetest_game/xpanes/textures/xpanes_trapdoor_steel_bar_side.png new file mode 100644 index 00000000..a71231e8 Binary files /dev/null and b/mods/minetest_game/xpanes/textures/xpanes_trapdoor_steel_bar_side.png differ diff --git a/mods/music_modpack/README.md b/mods/music_modpack/README.md new file mode 100644 index 00000000..844efe76 --- /dev/null +++ b/mods/music_modpack/README.md @@ -0,0 +1,69 @@ +# music_modpack + +![Screenshot](screenshot.png) + +## Overview +Music modpack with API for easy in-game music playback and custom track registration. + +## Requirements + +- Minetest 5.0.0+ +- Minetest_game 5.0.0+ +- [sfinv_buttons](https://repo.or.cz/minetest_sfinv_buttons.git) (Optional, but highly recommended: easy way to open music settings menu) + +## Features + +- Time-based music +- Elevation-based music +- Formspec for music settings + +## Settings +By default, settings menu is only available with `/musicsettings` command. If you have sfinv_buttons installed, music menu is available in inventory->more->music settings + +## Adding your own music +Call music.register_track() with following definition: + +```Lua +music.register_track({ + name = "my_track", + length = 200, + gain = 1, + day = true, + night = true, + ymin = 0, + ymax = 31000, +}) +``` + +- name - name of the sound file in your mod sounds folder, without extension (.ogg) +- length - length of the track in seconds +- gain - volume, value from 0 to 1 +- day - track will be played at day +- night - track will be played at night +- ymin - minimum elevation for track to play +- ymax - maximum elevation for track to play + +## Settingtypes +Available settings that you can put in your minetest.conf directly, or access them via "Settings->All Settings->Mods->music_modpack" menu. + +``` +music_time_interval = integer, Interval between attempts to play music, default is 60 +music_cleanup_interval = integer, interval between attempts to clean up player state, default is 5 +music_global_gain = float, global music volume, default is 0.3 +music_add_random_delay = boolean, if to add a random delay to interval between attempts, default is true +music_maximum_random_delay = - integer, maximum random delay in seconds, default is 30 +music_display_playback_messages = boolean, display messages when music starts for a certain player, default is true +``` + +Music packs also provide settingtypes with corresponding height limits. + +## Content +Default pack features 11 tracks from composer Kevin McLeod. Tracks are split into day tracks and night tracks. If music_dfcaverns is not enabled, night tracks also play underground (up to -31000). +Music_dfcaverns is an additional pack of music for underground layers from [dfcaverns](https://github.com/FaceDeer/dfcaverns/), featuring 13 tracks from composer Kevin McLeod. Tracks split into three categories, each for one cavern layer from dfcaverns, and their heights are set accordingly. Dfcaverns modpack is not required, however, and it is recommended to enable this pack even without dfcaverns, unless client connection speed is an issue. + +## License + +Code is licensed under GPLv3. + +All music used in this mod was produced by Kevin McLeod and released under CC BY 4.0. [link to the license](https://creativecommons.org/licenses/by/4.0/). +Original music can be found [here](https://incompetech.com/music/royalty-free/music.html). \ No newline at end of file diff --git a/mods/music_modpack/description.txt b/mods/music_modpack/description.txt new file mode 100644 index 00000000..7b833c0c --- /dev/null +++ b/mods/music_modpack/description.txt @@ -0,0 +1 @@ +Music modpack with API for easy in-game music playback and custom track registration. \ No newline at end of file diff --git a/mods/music_modpack/modpack.txt b/mods/music_modpack/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/music_modpack/music_api/api.lua b/mods/music_modpack/music_api/api.lua new file mode 100644 index 00000000..cfa4bde8 --- /dev/null +++ b/mods/music_modpack/music_api/api.lua @@ -0,0 +1,288 @@ +music = {} +local players = {} +local tracks = {} + +--Settingtypes +local time_interval = tonumber(minetest.settings:get("music_time_interval")) or 90 +local cleanup_interval = tonumber(minetest.settings:get("music_cleanup_interval")) or 5 +local global_gain = tonumber(minetest.settings:get("music_global_gain")) or 0.1 +local add_random_delay = minetest.settings:get_bool("music_add_random_delay", true) +local maximum_random_delay = tonumber(minetest.settings:get("music_maximum_random_delay")) or 45 +local display_playback_messages = minetest.settings:get_bool("music_display_playback_messages", true) +local random_delay = 0 + +--Initialize random delay on the first run +if add_random_delay then + random_delay = math.random(maximum_random_delay) +end + +--Internal functions +local function load_player_settings(name) + + local file = io.open(minetest.get_worldpath() .. "/music_settings.mt", "r") + + if file then + local rawfile = file:read() + io.close(file) + if rawfile then + local settings = minetest.deserialize(rawfile) + if settings[name] then + players[name].settings = settings[name] + end + else + minetest.log("error", "[Music_api] Unable to read volume settings!") + end + end + +end + +local function save_player_settings(name) + + local path = minetest.get_worldpath() .. "/music_settings.mt" + local file = io.open(path, "r") + local settings = {} + + if file then + local rawfile = file:read() + io.close(file) + if rawfile then + settings = minetest.deserialize(rawfile) or {} + end + end + + settings[name] = players[name].settings + + file = io.open(path, "w") + + if file then + local rawfile = minetest.serialize(settings) + file:write(rawfile) + io.close(file) + minetest.log("action", "[Music_api] Saving volume settings for " .. name) + else + minetest.log("error", "[Music_api] Unable to save volume settings!") + end + +end + +local function play_track(name) + + -- Do not play music for dead players or if music is already playing + local p = players[name] + if not p or p.is_dead or p.playing then + return + end + + local player = minetest.get_player_by_name(name) + local player_pos = player:get_pos() + local possible_tracks = {} + local time = minetest.get_timeofday() + + --Assemble list of fitting tracks + for _,track in pairs(tracks) do + if track.name ~= p.previous and ((track.day and time > 0.25 and time < 0.75) or + (track.night and ((time < 0.25 and time >= 0) or (time > 0.75 and time <= 1)))) and + player_pos.y >= track.ymin and player_pos.y < track.ymax + then + table.insert(possible_tracks, track) + end + end + + --Return if no music fits + if #possible_tracks == 0 then + p.previous = nil + return + end + + --Select random track from fitting + local track = possible_tracks[math.random(#possible_tracks)] + + --Start playback + if display_playback_messages then + minetest.log("action", "[Music_api]: Starting playblack for: " .. name .. " " .. track.name .. " Available tracks for user: " .. #possible_tracks .. " Random delay: " .. random_delay) + end + p.track_handle = minetest.sound_play(track.name, {to_player = name, gain = track.gain * global_gain * p.settings.gain}) + p.playing = true + p.previous = track.name + p.playback_started = os.time() + p.track_def = track + +end + +local function stop_track(name,step) + local p = players[name] + if p and p.playing and p.track_handle then + minetest.sound_fade(p.track_handle,step or 0.01,0) + p.playing = false + p.track_handle = nil + p.playback_started = nil + p.track_def = nil + if display_playback_messages then + minetest.log("action", "[Music_api]: Stopping playback for: " .. name) + end + end +end + +local function display_music_settings(name) + + local user + if type(name) ~= "string" and name:is_player() then + user = name:get_player_name() + else + user = name + end + + local volume = math.floor(players[user].settings.gain * 1000) + local formspec = "size[5,2]" .. default.gui_bg .. default.gui_bg_img .. + "textarea[0.3,0.06;2,1;;Volume:;]" .. + "scrollbar[0,0.6;4.8,0.25;horizontal;volume;" .. tostring(volume) .. "]" .. + "button[0,1.5;1,0.3;play;Play]" .. + "button[0.9,1.5;1,0.3;stop;Stop]" .. + "button_exit[3,1.5;2,0.3;accept;Accept]" + minetest.show_formspec(user, "music_settings", formspec) + +end + +--Registrations +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "music_settings" then return end + local name = player:get_player_name() + local p = players[name] + if fields.volume then + local params = minetest.explode_scrollbar_event(fields.volume) + p.settings.gain = params.value / 1000 + end + if fields.play then + if p.playing then + stop_track(name,0.05) + end + play_track(name) + end + if fields.stop then + stop_track(name,0.05) + end + if fields.accept or fields.quit then + save_player_settings(name) + end +end) + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + players[name] = {playing = false, playback_started = nil, track_handle = nil, track_def = nil, previous = nil, settings = {gain = 0.5}, is_dead = player:get_hp() <= 0} + load_player_settings(name) +end +) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + players[name] = nil +end +) + +minetest.register_chatcommand("musicsettings",{ + params = "", + description = "Displays music settings menu", + privs = {shout = true}, + func = display_music_settings +}) + +if minetest.get_modpath("sfinv_buttons") then + sfinv_buttons.register_button("show_music_settings", + { + title = "Music Settings", + action = display_music_settings, + tooltip = "Show music settings", + image = "music_sfinv_buttons_icon.png", + }) +end + + +local cleanup_timer = 0 +minetest.register_globalstep(function(dtime) + + cleanup_timer = cleanup_timer + dtime + if cleanup_timer < cleanup_interval then return end + cleanup_timer = 0 + + for k,v in pairs(players) do + local track = v.track_def + if track then + if v.playing and os.time() > v.playback_started + track.length then + stop_track(k) + end + + -- Stop music when it is no longer appropriate for the given conditions + if v.playing then + local time = minetest.get_timeofday() + local player = minetest.get_player_by_name(k) + if player then + local player_pos = player:get_pos() + if not ((track.day and time > 0.205 and time < 0.76) or + (track.night and ((time < 0.205 and time >= 0) or (time > 0.76 and time <= 1)))) or + player_pos.y < track.ymin or player_pos.y > track.ymax + then + stop_track(k) + play_track(k) -- start new track for the appropriate conditions + end + end + end + end + end +end) + +local track_timer = 0 +minetest.register_globalstep(function(dtime) + + --Increment timer, return if it doesn't, reset it if it does and continue with function execution + track_timer = track_timer + dtime + if track_timer < time_interval + random_delay then return end + track_timer = 0 + + --Return if no tracks are defined + if next(tracks) == nil then return end + + --Play music for every player + for k,v in pairs(players) do + play_track(k) + end + + --Change random delay if enabled on each play attempt + if add_random_delay then + random_delay = math.random(maximum_random_delay) + end + +end) + +--API function +function music.register_track(def) + + if def.name == nil or def.length == nil then + minetest.log("error", "[Music_api] Missing track definition parameters!") + return + end + + local track_def = { + name = def.name, + length = def.length, + gain = def.gain or 1, + day = def.day or false, + night = def.night or false, + ymin = def.ymin or -31000, + ymax = def.ymax or 31000, + } + + table.insert(tracks, track_def) +end + +-- Don't play music for dead players +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + stop_track(name,0.025) + players[name].is_dead = true +end) + +-- Enable music for respawned players +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + players[name].is_dead = false +end) \ No newline at end of file diff --git a/mods/music_modpack/music_api/depends.txt b/mods/music_modpack/music_api/depends.txt new file mode 100644 index 00000000..84ff3c09 --- /dev/null +++ b/mods/music_modpack/music_api/depends.txt @@ -0,0 +1 @@ +sfinv_buttons? diff --git a/mods/music_modpack/music_api/description.txt b/mods/music_modpack/music_api/description.txt new file mode 100644 index 00000000..2f8e005b --- /dev/null +++ b/mods/music_modpack/music_api/description.txt @@ -0,0 +1 @@ +An api and manager for in-game music diff --git a/mods/music_modpack/music_api/init.lua b/mods/music_modpack/music_api/init.lua new file mode 100644 index 00000000..bfb44c11 --- /dev/null +++ b/mods/music_modpack/music_api/init.lua @@ -0,0 +1,2 @@ +local path = minetest.get_modpath("music_api") +dofile(path .. "/api.lua") diff --git a/mods/music_modpack/music_api/mod.conf b/mods/music_modpack/music_api/mod.conf new file mode 100644 index 00000000..c91ad0b3 --- /dev/null +++ b/mods/music_modpack/music_api/mod.conf @@ -0,0 +1 @@ +name = music_api diff --git a/mods/music_modpack/music_api/settingtypes.txt b/mods/music_modpack/music_api/settingtypes.txt new file mode 100644 index 00000000..b82e858a --- /dev/null +++ b/mods/music_modpack/music_api/settingtypes.txt @@ -0,0 +1,17 @@ +#Interval between attempts to play music +music_time_interval (Interval between attempts to play music) int 60 + +#Interval between attempts to clean up player playback state +music_cleanup_interval (Interval between attempts to clean up player playback state) int 5 + +#Music volume +music_global_gain (Music volume) float 0.3 0.0 1.0 + +#Add random delay to music +music_add_random_delay (Add random delay to each music start attempt) bool true + +#Maximum random delay (from 0) to add +music_maximum_random_delay (Maximum random delay to add) int 30 + +#Display info messages in server console +music_display_playback_messages (Display info messages in server console) bool true \ No newline at end of file diff --git a/mods/music_modpack/music_api/textures/music_sfinv_buttons_icon.png b/mods/music_modpack/music_api/textures/music_sfinv_buttons_icon.png new file mode 100644 index 00000000..a33489ac Binary files /dev/null and b/mods/music_modpack/music_api/textures/music_sfinv_buttons_icon.png differ diff --git a/mods/naturalbiomes/LICENSE b/mods/naturalbiomes/LICENSE new file mode 100644 index 00000000..7bb56d2c --- /dev/null +++ b/mods/naturalbiomes/LICENSE @@ -0,0 +1,26 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Textures and Models by Liil/Wilhelmine/ under (MIT) License (c) 2022 +Thanks to ShadMOrdre (https://github.com/ShadMOrdre) for fixing the schematics/leaf decay. + diff --git a/mods/naturalbiomes/alderswamp.lua b/mods/naturalbiomes/alderswamp.lua new file mode 100644 index 00000000..caaa0027 --- /dev/null +++ b/mods/naturalbiomes/alderswamp.lua @@ -0,0 +1,620 @@ + +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:alderswamp_litter", { + description = S("Alder Swamp dirt with Grass"), + tiles = {"naturalbiomes_alderswamp_litter.png", "naturalbiomes_alderswamp_dirt.png", + {name = "naturalbiomes_alderswamp_dirt.png^naturalbiomes_alderswamp_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:alderswamp_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:alderswamp_dirt", { + description = S("Alder Swamp Dirt"), + tiles = {"naturalbiomes_alderswamp_dirt.png"}, + groups = {crumbly = 3, soil = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:alderswamp", + node_top = "naturalbiomes:alderswamp_litter", + depth_top = 1, + node_filler = "naturalbiomes:alderswamp_dirt", + depth_filler = 3, + node_riverbed = "naturalbiomes:alderswamp_dirt", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 5, + y_min = 0, + heat_point = 55, + humidity_point = 70, +}) + +-- Schematics + +minetest.register_decoration({ + name = "naturalbiomes:alder_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.002, + scale = 0.01, + spread = {x = 100, y = 20, z = 100}, + seed = 5555, + octaves = 1, + persistence = 0.75, + flags = "eased" + }, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_aldertree_0_270.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ +name = "naturalbiomes:alder_tree2", +deco_type = "schematic", +place_on = {"naturalbiomes:alderswamp_litter"}, +place_offset_y = 0, +sidelen = 16, +noise_params = { + offset = -0.002, + scale = 0.01, + spread = {x = 100, y = 20, z = 100}, + seed = 5556, + octaves = 1, + persistence = 0.75, + flags = "eased" +}, +biomes = {"naturalbiomes:alderswamp"}, +y_max = 31000, +y_min = 1, +schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_aldertree2_0_270.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ +name = "naturalbiomes:alder_tree3", +deco_type = "schematic", +place_on = {"naturalbiomes:alderswamp_litter"}, +place_offset_y = 0, +sidelen = 16, +noise_params = { + offset = -0.002, + scale = 0.01, + spread = {x = 100, y = 20, z = 100}, + seed = 5557, + octaves = 1, + persistence = 0.75, + flags = "eased" +}, +biomes = {"naturalbiomes:alderswamp"}, +y_max = 31000, +y_min = 1, +schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_aldertree3_0_270.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +-- +-- Tree generation +-- + +-- New alder tree + +local function grow_new_alder_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_aldertree_0_270.mts", "0", nil, false) + +end + +-- alder trunk +minetest.register_node("naturalbiomes:alder_trunk", { + description = S("Alder Trunk"), + tiles = { + "naturalbiomes_alderswamp_alder_trunk_top.png", + "naturalbiomes_alderswamp_alder_trunk_top.png", + "naturalbiomes_alderswamp_alder_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- alder wood +minetest.register_node("naturalbiomes:alder_wood", { + description = S("Alder Wood"), + tiles = {"naturalbiomes_alderswamp_alder_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:alder_wood 4", + recipe = {{"naturalbiomes:alder_trunk"}} +}) + +minetest.register_node("naturalbiomes:alder_leaves", { + description = S("Alder Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_alderswamp_alder_leaves.png"}, + special_tiles = {"naturalbiomes_alderswamp_alder_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:alder_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:alder_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alder_sapling", { + description = S("Alder Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alderswamp_sapling.png"}, + inventory_image = "naturalbiomes_alderswamp_sapling.png", + wield_image = "naturalbiomes_alderswamp_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alder_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alder_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_alderswamp_alder_wood", + "naturalbiomes:alder_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alderswamp_alder_wood.png"}, + S("Alder Stair"), + S("Alder Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alderswamp_alder_trunk", + "naturalbiomes:alder_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alderswamp_alder_trunk_top.png", "naturalbiomes_alderswamp_alder_trunk_top.png", "naturalbiomes_alderswamp_alder_trunk.png"}, + S("Alder Trunk Stair"), + S("Alder Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_alder_wood", + { + description = S("Alder Wood Fence Gate"), + texture = "naturalbiomes_alderswamp_alder_wood.png", + material = "naturalbiomes:alder_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_alder_wood", + { + description = S("Alder Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_alderswamp_alder_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_alderswamp_alder_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alder_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_alder_wood", + { + description = S("Alder Fence Rail"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_alderswamp_alder_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_alderswamp_alder_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alder_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_node("naturalbiomes:alderswamp_reed", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds.png", + wield_image = "naturalbiomes_alderswamp_reeds.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_reed", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_reed", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_reed", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds.png", + wield_image = "naturalbiomes_alderswamp_reeds.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_reed2", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 3, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_reed2", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_reed2", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds2.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds2.png", + wield_image = "naturalbiomes_alderswamp_reeds2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_reed3", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + fill_ratio = 0.09, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_reed3", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_reed3", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds3.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds3.png", + wield_image = "naturalbiomes_alderswamp_reeds3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alder_log", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alder_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:alderswamp_litter", + num_spawn_by = 8, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + spawn_by = {"naturalbiomes:alderswamp_litter"}, + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.00085, + y_max = 31000, + y_min = 1, + place_offset_y = -1, + decoration = "default:water_source", + biomes = {"alderswamp"}, + flags = "force_placement", + }) + + minetest.register_decoration({ + name = "naturalbiomes:waterlily", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + y_max = 0, + y_min = 0, + decoration = "naturalbiomes:waterlily", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) + +minetest.register_node("naturalbiomes:waterlily", { + description = S("Waterlily"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"naturalbiomes_alderswamp_waterlily.png", "naturalbiomes_alderswamp_waterlily_bottom.png"}, + inventory_image = "naturalbiomes_alderswamp_waterlily.png", + wield_image = "naturalbiomes_alderswamp_waterlily.png", + use_texture_alpha = "clip", + liquids_pointable = true, + walkable = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + node_placement_prediction = "", + node_box = { + type = "fixed", + fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5} + }, + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16} + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, + pointed_thing) + end + + if def and def.liquidtype == "source" and + minetest.get_item_group(node.name, "water") > 0 then + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = "naturalbiomes:waterlily", + param2 = math.random(0, 3)}) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, ("Node is protected.")) + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +}) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_yellowflower", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_yellowflower", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_yellowflower", { + description = S"Alderswamp flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_adler_yellowflower.png"}, + inventory_image = "naturalbiomes_adler_yellowflower.png", + wield_image = "naturalbiomes_adler_yellowflower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_brownreed", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 1, + y_min = 0, + decoration = "naturalbiomes:alderswamp_brownreed", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_brownreed", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reedbrown.png"}, + inventory_image = "naturalbiomes_alderswamp_reedbrown.png", + wield_image = "naturalbiomes_alderswamp_reedbrown.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + fill_ratio = 0.35, + y_min = 1, + y_max = 31000, + decoration = {"default:grass_2", "default:grass_3", "default:grass_4","default:grass_5"} + }) \ No newline at end of file diff --git a/mods/naturalbiomes/alpine.lua b/mods/naturalbiomes/alpine.lua new file mode 100644 index 00000000..c38e7827 --- /dev/null +++ b/mods/naturalbiomes/alpine.lua @@ -0,0 +1,786 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:alpine_litter", { + description = S("Dirt with Alpine Grass"), + tiles = {"naturalbiomes_alpine_litter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_alpine_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:alpine_rock", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:alpine_rock", { + description = S("Alpine Rock"), + tiles = {"naturalbiomes_alpine_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:alpine_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:alpine", + node_top = "naturalbiomes:alpine_litter", + depth_top = 1, + node_filler = "naturalbiomes:alpine_rock", + depth_filler = 50, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:stone", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 30, + heat_point = 55, + humidity_point = 60, +}) + +-- Schematics + +minetest.register_decoration({ + name = "naturalbiomes:alppine1_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 12, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_alpine_pine1_0_90.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:alppine2_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00715, + biomes = {"naturalbiomes:alpine"}, + y_max = 11, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_alpine_pine2_0_90.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:cowberry_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 30, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alpine_cowberrybush.mts", + flags = "place_center_x, place_center_z", +}) + +-- Tree generation +-- + +-- New pine tree + +local function grow_new_alppine1_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 5, y = pos.y - 0, z = pos.z - 5}, modpath.."/schematics/naturalbiomes_alpine_pine1_0_90.mts", "0", nil, false) +end + +-- Pine1 trunk +minetest.register_node("naturalbiomes:alppine1_trunk", { + description = S("Silver Fir Trunk"), + tiles = { + "naturalbiomes_alpine_pine1_trunk_top.png", + "naturalbiomes_alpine_pine1_trunk_top.png", + "naturalbiomes_alpine_pine1_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- Pine wood +minetest.register_node("naturalbiomes:alppine1_wood", { + description = S("Silver Fir Wood"), + tiles = {"naturalbiomes_alpine_pine1_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:alppine1_wood 4", + recipe = {{"naturalbiomes:alppine1_trunk"}} +}) + +minetest.register_node("naturalbiomes:alppine1_leaves", { + description = S("Silver Fir Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_alpine_pine1_leaves.png"}, + special_tiles = {"naturalbiomes_alpine_pine1_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:alppine1_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:alppine1_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alppine1_sapling", { + description = S("Silver Fir Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alpine_pine1_sapling.png"}, + inventory_image = "naturalbiomes_alpine_pine1_sapling.png", + wield_image = "naturalbiomes_alpine_pine1_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alppine1_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alppine1_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine1_wood", + "naturalbiomes:alppine1_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine1_wood.png"}, + S("Silver Fir Stair"), + S("Silver Fir Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine1_trunk", + "naturalbiomes:alppine1_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine1_trunk_top.png", "naturalbiomes_alpine_pine1_trunk_top.png", "naturalbiomes_alpine_pine1_trunk.png"}, + S("Silver Fir Trunk Stair"), + S("Silver Fir Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_alppine1_wood", + { + description = S("Silver Fir Wood Fence Gate"), + texture = "naturalbiomes_alpine_pine1_wood.png", + material = "naturalbiomes:alppine1_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_alppine1_wood", + { + description = S("Silver Fir Fence"), + texture = "naturalbiomes_pine_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_alpine_pine1_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_alpine_pine1_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine1_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_alppine1_wood", + { + description = S("Silver Fir Fence Rail"), + texture = "naturalbiomes_pine_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine1_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine1_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine1_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +-- Tree generation +-- + +-- New alppine2 tree + +local function grow_new_alppine2_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_alpine_pine2_0_90.mts", "0", nil, false) +end + +-- Pine2 trunk +minetest.register_node("naturalbiomes:alppine2_trunk", { + description = S("Jack Pine Trunk"), + tiles = { + "naturalbiomes_alpine_pine2_trunk_top.png", + "naturalbiomes_alpine_pine2_trunk_top.png", + "naturalbiomes_alpine_pine2_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- Pine2 wood +minetest.register_node("naturalbiomes:alppine2_wood", { + description = S("Jack Pine Wood"), + tiles = {"naturalbiomes_alpine_pine2_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:alppine2_wood 4", + recipe = {{"naturalbiomes:alppine2_trunk"}} +}) + +minetest.register_node("naturalbiomes:alppine2_leaves", { + description = S("Jack Pine Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_alpine_pine2_leaves.png"}, + special_tiles = {"naturalbiomes_alpine_pine2_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:alppine2_sapling'}, + rarity = 15, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:alppine2_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alppine2_sapling", { + description = S("Jack Pine Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alpine_pine2_sapling.png"}, + inventory_image = "naturalbiomes_alpine_pine2_sapling.png", + wield_image = "naturalbiomes_alpine_pine2_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alppine2_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alppine2_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine2_wood", + "naturalbiomes:alppine2_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine2_wood.png"}, + S("Jack Pine Stair"), + S("Jack Pine Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine2_trunk", + "naturalbiomes:alppine2_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine2_trunk_top.png", "naturalbiomes_alpine_pine2_trunk_top.png", "naturalbiomes_alpine_pine2_trunk.png"}, + S("Jack Pine Trunk Stair"), + S("Jack Pine Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_alppine2_wood", + { + description = S("Jack Pine Wood Fence Gate"), + texture = "naturalbiomes_alpine_pine2_wood.png", + material = "naturalbiomes:alppine2_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_pine2_wood", + { + description = S("Jack Pine Fence"), + texture = "naturalbiomes_pine2_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_alpine_pine2_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_alpine_pine2_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine2_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_pine2_wood", + { + description = S("Jack Pine Fence Rail"), + texture = "naturalbiomes_pine2_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine2_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine2_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine2_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +-- Tree generation +-- + +-- New cowberry bush + +local function grow_new_outback_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_alpine_cowberrybush.mts", "0", nil, false) +end + +minetest.register_node("naturalbiomes:alpine_cowberrybush_stem", { + description = S("Cowberry Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_alpine_cowberry_stem.png"}, + inventory_image = "naturalbiomes_alpine_cowberry_stem.png", + wield_image = "naturalbiomes_alpine_cowberry_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:alpine_cowberrybush_leaves", { + description = S("Cowberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_alpine_cowberry_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:alpine_cowberrybush_sapling"}, rarity = 20}, + {items = {"naturalbiomes:cowberry"}, rarity = 2}, + {items = {"naturalbiomes:alpine_cowberrybush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alpine_cowberrybush_sapling", { + description = S("Cowberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alpine_cowberry_sapling.png"}, + inventory_image = "naturalbiomes_alpine_cowberry_sapling.png", + wield_image = "naturalbiomes_alpine_cowberry_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_outback_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alpine_cowberrybush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:cowberry", { + description = S("Cowberry"), + drawtype = "torchlike", + tiles = {"naturalbiomes_alpine_cowberry_fruit.png"}, + inventory_image = "naturalbiomes_alpine_cowberry_fruit.png", + wield_image = "naturalbiomes_alpine_cowberry_fruit.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:cowberry", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:cowberry", param2 = 1}) + end + end +}) + +minetest.register_node("naturalbiomes:alpine_mushroom", { + description = S("Alpine Mushroom"), + tiles = {"naturalbiomes_alpine_mushroom.png"}, + inventory_image = "naturalbiomes_alpine_mushroom.png", + wield_image = "naturalbiomes_alpine_mushroom.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {mushroom = 1, food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(1), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } +}) + +minetest.register_node("naturalbiomes:alpine_grass1", { + description = S"Alpine Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_grass1.png"}, + inventory_image = "naturalbiomes_alpine_grass1.png", + wield_image = "naturalbiomes_alpine_grass1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_node("naturalbiomes:alpine_grass2", { + description = S"Alpine Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_grass2.png"}, + inventory_image = "naturalbiomes_alpine_grass2.png", + wield_image = "naturalbiomes_alpine_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_node("naturalbiomes:alpine_grass3", { + description = S"Alpine Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_grass3.png"}, + inventory_image = "naturalbiomes_alpine_grass3.png", + wield_image = "naturalbiomes_alpine_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + fill_ratio = 0.175, + y_max = 31000, + y_min = 1, + decoration = { + "naturalbiomes:alpine_grass1", + "naturalbiomes:alpine_grass2", + "naturalbiomes:alpine_grass3", + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_dandelion", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 4, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:alpine_dandelion", + spawn_by = "naturalbiomes:alpine_litter" + }) + +minetest.register_node("naturalbiomes:alpine_dandelion", { + description = S"Alpine Dandelion Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_dandelion.png"}, + inventory_image = "naturalbiomes_alpine_dandelion.png", + wield_image = "naturalbiomes_alpine_dandelion.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, color_yellow = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_edelweiss", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 4, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:alpine_edelweiss", + }) + +minetest.register_node("naturalbiomes:alpine_edelweiss", { + description = S"Edelweiss Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_edelweiss.png"}, + inventory_image = "naturalbiomes_alpine_edelweiss.png", + wield_image = "naturalbiomes_alpine_edelweiss.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, color_white = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_log", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes__alpine_pine1_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:alpine_litter", + num_spawn_by = 4, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_log2", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alpine_pine2_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:alpine_litter", + num_spawn_by = 4, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "naturalbiomes:alpine_litter", + "naturalbiomes:alppine1_leaves", + "naturalbiomes:alppine2_leaves", + }, + sidelen = 16, + noise_params = { + offset = -0.75, + scale = -1, + spread = {x = 100, y = 100, z = 100}, + seed = 456, + octaves = 2, + persist = 1.0 + }, + biomes = {"alpine"}, + y_max = 31000, + y_min = 1, + decoration = "default:snow", + }) \ No newline at end of file diff --git a/mods/naturalbiomes/bambooforest.lua b/mods/naturalbiomes/bambooforest.lua new file mode 100644 index 00000000..56a1d534 --- /dev/null +++ b/mods/naturalbiomes/bambooforest.lua @@ -0,0 +1,544 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:bambooforest_litter", { + description = S("Bamboo Forest Litter"), + tiles = {"naturalbiomes_bambooforest_litter.png", "naturalbiomes_bambooforest_rock.png", + {name = "naturalbiomes_bambooforest_rock.png^naturalbiomes_bambooforest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:bambooforest_rock", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_biome({ + name = "bambooforest", + node_top = "naturalbiomes:bambooforest_litter", + depth_top = 1, + node_filler = "naturalbiomes:bambooforest_rock", + depth_filler = 70, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 5, + heat_point = 89, + humidity_point = 77, +}) + +-- Tree generation +-- + +-- New bamboo tree + +local function grow_new_bamboo_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_bambootree_large_0_270.mts", "0", nil, false) +end + +-- bamboo trunk +minetest.register_node("naturalbiomes:bamboo_trunk", { + description = S("Bamboo Trunk"), + tiles = { + "naturalbiomes_bambooforest_bamboo_trunk_top.png", + "naturalbiomes_bambooforest_bamboo_trunk_top.png", + "naturalbiomes_bambooforest_bamboo_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- bamboo wood +minetest.register_node("naturalbiomes:bamboo_wood", { + description = S("Bamboo Wood"), + tiles = {"naturalbiomes_bambooforest_bamboo_wood2.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:bamboo_wood 4", + recipe = {{"naturalbiomes:bamboo_trunk"}} +}) + +minetest.register_node("naturalbiomes:bamboo_leaves", { + description = S("Bamboo Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_Bambooforest_bamboo_leaves.png"}, + special_tiles = {"naturalbiomes_Bambooforest_bamboo_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:bamboo_sapling'}, + rarity = 10, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:bamboo_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bamboo_sapling", { + description = S("Bamboo Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bambooforest_bamboo_sapling.png"}, + inventory_image = "naturalbiomes_bambooforest_bamboo_sapling.png", + wield_image = "naturalbiomes_bambooforest_bamboo_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_bamboo_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bamboo_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_bambooforest_bamboo_wood2", + "naturalbiomes:bamboo_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_bambooforest_bamboo_wood2.png"}, + S("Bamboo Stair"), + S("Bamboo Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_bambooforest_bamboo_trunk", + "naturalbiomes:bamboo_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_bambooforest_bamboo_trunk_top.png", "naturalbiomes_bambooforest_bamboo_trunk_top.png", "naturalbiomes_bambooforest_bamboo_trunk.png"}, + S("Bamboo Trunk Stair"), + S("Bamboo Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_bamboo_wood", + { + description = S("Bamboo Wood Fence Gate"), + texture = "naturalbiomes_bambooforest_bamboo_wood2.png", + material = "naturalbiomes:bamboo_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_bamboo_wood", + { + description = S("Bamboo Fence"), + texture = "naturalbiomes_bamboo_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:bamboo_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_bamboo_wood", + { + description = S("Bamboo Fence Rail"), + texture = "naturalbiomes_bamboo_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:bamboo_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:bamboo_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.02115, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_bambootree_large_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:bamboo_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.02115, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_bambootree_small_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + + minetest.register_decoration({ + name = "naturalbiomes:smallbamboo", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.05, + spread = {x = 100, y = 100, z = 100}, + seed = 936, + octaves = 3, + persist = 0.7 + }, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 0, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bambootree_small_micro_0_270.mts", + }) + +minetest.register_node("naturalbiomes:smallbamboo", { + description = S("Small Bamboo Grass"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bambooforest_bamboo_trunksmall.png"}, + inventory_image = "naturalbiomes_bambooforest_bamboo_trunksmall.png", + wield_image = "naturalbiomes_bambooforest_bamboo_trunksmall.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("naturalbiomes:bambooforest_rock", { + description = S("Bamboo Forest Rock"), + tiles = {"naturalbiomes_bambooforest_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:bambooforest_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "naturalbiomes:bambooforest_groundgrass", + deco_type = "simple", + place_on = {"naturalbiomes:bambooforest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:bambooforest_groundgrass", + spawn_by = "naturalbiomes:bambooforest_litter" + }) + +minetest.register_node("naturalbiomes:bambooforest_groundgrass", { + description = S"Babmooforest Gorund Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bambooforest_groundgrass.png"}, + inventory_image = "naturalbiomes_bambooforest_groundgrass.png", + wield_image = "naturalbiomes_bambooforest_groundgrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:bambooforest_groundgrass2", + deco_type = "simple", + place_on = {"naturalbiomes:bambooforest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:bambooforest_groundgrass2", + spawn_by = "naturalbiomes:bambooforest_litter" + }) + +minetest.register_node("naturalbiomes:bambooforest_groundgrass2", { + description = S"Babmooforest Gorund Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bambooforest_groundgrass2.png"}, + inventory_image = "naturalbiomes_bambooforest_groundgrass2.png", + wield_image = "naturalbiomes_bambooforest_groundgrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +-- +-- Tree generation +-- + +-- New banana tree + +local function grow_new_banana_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_banana_palm_0_90.mts", "0", nil, false) +end + +-- banana trunk +minetest.register_node("naturalbiomes:banana_trunk", { + description = S("Banana Trunk"), + tiles = { + "naturalbiomes__banana_trunk_top.png", + "naturalbiomes__banana_trunk_top.png", + "naturalbiomes__banana_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- banana wood +minetest.register_node("naturalbiomes:banana_wood", { + description = S("Banana Wood"), + tiles = {"naturalbiomes__banana_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:banana_wood 4", + recipe = {{"naturalbiomes:banana_trunk"}} +}) + +minetest.register_node("naturalbiomes:banana_leaves", { + description = S("Banana Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes__banana_leaf.png"}, + special_tiles = {"naturalbiomes__banana_leaf.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:banana_sapling'}, + rarity = 10, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:banana_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:banana_sapling", { + description = S("Banana Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes__banana_tree_sapling.png"}, + inventory_image = "naturalbiomes__banana_tree_sapling.png", + wield_image = "naturalbiomes__banana_tree_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_banana_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:banana_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_banana_wood", + "naturalbiomes:banana_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_banana_wood.png"}, + S("Banana Stair"), + S("Banana Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_banana_trunk", + "naturalbiomes:banana_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_banana_trunk_top.png", "naturalbiomes_banana_trunk_top.png", "naturalbiomes_banana_trunk.png"}, + S("Banana Trunk Stair"), + S("Banana Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_banana_wood", + { + description = S("Banana Wood Fence Gate"), + texture = "naturalbiomes_banana_wood.png", + material = "naturalbiomes:banana_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_banana_wood", + { + description = S("Banana Fence"), + texture = "naturalbiomes_banana_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_banana_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_banana_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:banana_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_banana_wood", + { + description = S("Banana Fence Rail"), + texture = "naturalbiomes_banana_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_banana_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_banana_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:banana_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:banana_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00515, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_banana_palm_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) diff --git a/mods/naturalbiomes/bushland.lua b/mods/naturalbiomes/bushland.lua new file mode 100644 index 00000000..9ea42cb2 --- /dev/null +++ b/mods/naturalbiomes/bushland.lua @@ -0,0 +1,992 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:bushland_bushlandlitter2", { + description = S("Bushland Litter"), + tiles = { + "naturalbiomes_bushland_bushlandlitter2_top.png", + "naturalbiomes_bushland_bushlandlitter2_bottom.png", + "naturalbiomes_bushland_bushlandlitter2_right.png", + "naturalbiomes_bushland_bushlandlitter2_left.png", + "naturalbiomes_bushland_bushlandlitter2_back.png", + "naturalbiomes_bushland_bushlandlitter2_front.png"}, + groups = {crumbly = 3, sand = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("naturalbiomes:bushland_bushlandlitter3", { + description = S("Bushland Litter"), + tiles = { + "naturalbiomes_bushland_bushlandlitter3_top.png", + "naturalbiomes_bushland_bushlandlitter3_bottom.png", + "naturalbiomes_bushland_bushlandlitter3_right.png", + "naturalbiomes_bushland_bushlandlitter3_left.png", + "naturalbiomes_bushland_bushlandlitter3_back.png", + "naturalbiomes_bushland_bushlandlitter3_front.png"}, + groups = {crumbly = 3, sand = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:bushland", + node_top = "naturalbiomes:bushland_bushlandlitter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 5, + node_riverbed = "default:sand", + depth_riverbed = 3, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone", + y_max = 500, + y_min = 1, + heat_point = 68, + humidity_point = 83, +}) + +minetest.register_node("naturalbiomes:bushland_bushlandlitter", { + description = S("Bushland Litter"), + tiles = {"naturalbiomes_bushland_bushlandlitter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_bushland_bushlandlitter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.3, + y_max = 20, + y_min = 3, + decoration = "naturalbiomes:bushland_bushlandlitter2" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.3, + y_max = 500, + y_min = 3, + decoration = "naturalbiomes:bushland_bushlandlitter3" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 10, + y_max = 3, + y_min = 0, + decoration = "default:sand" + }) + +-- Schematics + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_blackberrybush.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_blackberrybush2.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_blackberrybush3.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_wildrosebush.mts", + flags = "place_center_x, place_center_z", +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_wildrosebush2.mts", + flags = "place_center_x, place_center_z", +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_wildrosebush3.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00215, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_hazelnutbush.mts", + flags = "place_center_x, place_center_z", +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00215, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_hazelnutbush2.mts", + flags = "place_center_x, place_center_z", +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00215, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_hazelnutbush3.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_deadbush3.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_deadbush2.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_deadbush.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_node("naturalbiomes:bushland_grass", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_grass.png"}, + inventory_image = "naturalbiomes_bushland_grass.png", + wield_image = "naturalbiomes_bushland_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 9478, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass", + }) + +minetest.register_node("naturalbiomes:bushland_grass2", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_grass2.png"}, + inventory_image = "naturalbiomes_bushland_grass2.png", + wield_image = "naturalbiomes_bushland_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass2", + }) + +minetest.register_node("naturalbiomes:bushland_grass3", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_grass3.png"}, + inventory_image = "naturalbiomes_bushland_grass3.png", + wield_image = "naturalbiomes_bushland_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter2", "naturalbiomes:bushland_bushlandlitter3"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 1549, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass3", + }) + +minetest.register_node("naturalbiomes:bushland_grass4", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass4.png"}, + inventory_image = "naturalbiomes_bushland_grass4.png", + wield_image = "naturalbiomes_bushland_grass4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 6687, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass4", + }) + +minetest.register_node("naturalbiomes:bushland_grass5", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass5.png"}, + inventory_image = "naturalbiomes_bushland_grass5.png", + wield_image = "naturalbiomes_bushland_grass5.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter2", "naturalbiomes:bushland_bushlandlitter3"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4663, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass5", + }) + +minetest.register_node("naturalbiomes:bushland_grass6", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass6.png"}, + inventory_image = "naturalbiomes_bushland_grass6.png", + wield_image = "naturalbiomes_bushland_grass6.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter2", "naturalbiomes:bushland_bushlandlitter3"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass6", + }) + +minetest.register_node("naturalbiomes:bushland_grass7", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass7.png"}, + inventory_image = "naturalbiomes_bushland_grass7.png", + wield_image = "naturalbiomes_bushland_grass7.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 9932, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass7", + }) + +-- New blackberry bush + +local function grow_new_blackberry_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_bushland_blackberrybush.mts", "0", nil, false) +end + +minetest.register_node("naturalbiomes:bushland_blackberry_stem", { + description = S("Blackberry Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_blackberry_stem.png"}, + inventory_image = "naturalbiomes_bushland_blackberry_stem.png", + wield_image = "naturalbiomes_bushland_blackberry_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:bushland_blackberry_leaves2", { + description = S("Blackberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_blackberry_leaves2.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_blackberrybush_sapling"}, rarity = 3}, + {items = {"naturalbiomes:blackberry"}, rarity = 2}, + {items = {"naturalbiomes:bushland_blackberry_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_blackberry_leaves", { + description = S("Blackberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_blackberry_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_blackberrybush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:blackberry"}, rarity = 2}, + {items = {"naturalbiomes:bushland_blackberry_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_blackberrybush_sapling", { + description = S("Blackberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bushland_blackberry_sapling.png"}, + inventory_image = "naturalbiomes_bushland_blackberry_sapling.png", + wield_image = "naturalbiomes_bushland_blackberry_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_blackberry_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bushland_blackberrybush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:blackberry", { + description = S("Blackberry"), + drawtype = "torchlike", + tiles = {"naturalbiomes_bushland_blackberries.png"}, + inventory_image = "naturalbiomes_bushland_blackberries.png", + wield_image = "naturalbiomes_bushland_blackberries.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:blackberry", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:blackberry", param2 = 1}) + end + end +}) + + +-- New wildrose bush + +local function grow_new_wildrose_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 1, y = pos.y - 0, z = pos.z - 1}, modpath.."/schematics/naturalbiomes_bushland_wildrosebush.mts", "0", nil, false) +end + +minetest.register_node("naturalbiomes:bushland_wildrose_stem", { + description = S("Wildrose Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.40, + tiles = {"naturalbiomes_bushland_wildrose_stem.png"}, + inventory_image = "naturalbiomes_bushland_wildrose_stem.png", + wield_image = "naturalbiomes_bushland_wildrose_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:bushland_wildrose_leaves2", { + description = S("Wildrose Bush Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_bushland_wildrose_leaves2.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_wildrosebush_sapling"}, rarity = 3}, + {items = {"naturalbiomes:wildrose"}, rarity = 2}, + {items = {"naturalbiomes:bushland_wildrose_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_wildrose_leaves", { + description = S("Wildrose Bush Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_bushland_wildrose_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_wildrosebush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:wildrose"}, rarity = 2}, + {items = {"naturalbiomes:bushland_wildrose_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_wildrosebush_sapling", { + description = S("Wildrose Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bushland_wildrose_sapling.png"}, + inventory_image = "naturalbiomes_bushland_wildrose_sapling.png", + wield_image = "naturalbiomes_bushland_wildrose_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_wildrose_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bushland_wildrosebush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:wildrose", { + description = S("Wildrose"), + drawtype = "torchlike", + tiles = {"naturalbiomes_bushland_wildrose.png"}, + inventory_image = "naturalbiomes_bushland_wildrose.png", + wield_image = "naturalbiomes_bushland_wildrose.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:wildrose", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:wildrose", param2 = 1}) + end + end +}) + +-- New hazelnut bush + +local function grow_new_hazelnut_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_bushland_hazelnutbush.mts", "0", nil, false) +end + +minetest.register_node("naturalbiomes:bushland_hazelnut_stem", { + description = S("Hazelnut Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_hazelnut_stem.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut_stem.png", + wield_image = "naturalbiomes_bushland_hazelnut_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:bushland_hazelnut_leaves2", { + description = S("Hazelnut Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_hazelnut_leaves2.png"}, + paramtype = "light", + waving = 1, + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_hazelnutbush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:hazelnut"}, rarity = 2}, + {items = {"naturalbiomes:bushland_hazelnut_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_hazelnut_leaves", { + description = S("Hazelnut Bush Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_bushland_hazelnut_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_hazelnutbush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:hazelnut"}, rarity = 2}, + {items = {"naturalbiomes:bushland_hazelnut_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_hazelnutbush_sapling", { + description = S("Hazelnut Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bushland_hazelnut_sapling.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut_sapling.png", + wield_image = "naturalbiomes_bushland_hazelnut_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_hazelnut_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bushland_hazelnutbush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:hazelnut", { + description = S("Hazelnut"), + drawtype = "torchlike", + tiles = {"naturalbiomes_bushland_hazelnut.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut.png", + wield_image = "naturalbiomes_bushland_hazelnut.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:hazelnut", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:hazelnut", param2 = 1}) + end + end +}) + +--- dead bush + +minetest.register_node("naturalbiomes:bushland_deadbush_leaves", { + description = S("Dead Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_deadbush_leaves.png"}, + paramtype = "light", + waving = 1, + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_deadbush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +-- cracked hazelnut +minetest.register_craftitem("naturalbiomes:hazelnut_cracked", { + description = S("Cracked Hazelnut"), + inventory_image = "naturalbiomes_bushland_hazelnut_cracked.png", + on_use = minetest.item_eat(5), + groups = {food = 1, flammable = 2}, +}) + +xpanes.register_pane("hazelnut_pane", { + description = S("Hazelnut Woven Fence"), + textures = {"naturalbiomes_bushland_hazelnut_fence.png", "", "naturalbiomes_bushland_hazelnut_fence.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut_fence.png", + wield_image = "naturalbiomes_bushland_hazelnut_fence.png", + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, +recipe = { + {"", "farming:string", ""}, + {"naturalbiomes:bushland_hazelnut_stem", "naturalbiomes:bushland_hazelnut_stem", "naturalbiomes:bushland_hazelnut_stem"} + } +}) \ No newline at end of file diff --git a/mods/naturalbiomes/crafting.lua b/mods/naturalbiomes/crafting.lua new file mode 100644 index 00000000..d940925f --- /dev/null +++ b/mods/naturalbiomes/crafting.lua @@ -0,0 +1,692 @@ +local S = minetest.get_translator("naturalbiomes") + + stairs.register_stair_and_slab( + "naturalbiomes_adler_reed_bundle", + "naturalbiomes:reed_bundle", + {snappy = 3, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_adler_reed_bundle.png"}, + S("Reed Bundle Stair"), + S("Reed Bundle Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_rock_brick", + "naturalbiomes:alpine_brick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_alpine_rock_brick.png"}, + S("Alpine Brick Stair"), + S("Alpine Brick Slab"), + default.node_sound_wood_defaults() + ) + + + --[[stairs.register_stair_and_slab( -- bamboo is disabled + "naturalbiomes_bambooforest_rock_brick", + "naturalbiomes:bamboo_brick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_bambooforest_rock_brick.png"}, + S("Bamboo Brick Stair"), + S("Bamboo Brick Slab"), + default.node_sound_wood_defaults() + )]] + + + --[[stairs.register_stair_and_slab( + "naturalbiomes_beach_rock_brick", + "naturalbiomes:beach_brick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_beach_rock_brick.png"}, + S("Beach Brick Stair"), + S("Beach Brick Slab"), + default.node_sound_wood_defaults() + )]] + + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_rock_brick", + "naturalbiomes:med_brick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_mediterran_rock_brick.png"}, + S("Med Brick Stair"), + S("Med Brick Slab"), + default.node_sound_wood_defaults() + ) + + + stairs.register_stair_and_slab( + "naturalbiomes_outback_rock_brick", + "naturalbiomes:outback_brick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_outback_rock_brick.png"}, + S("Outback Brick Stair"), + S("Outback Brick Slab"), + default.node_sound_wood_defaults() + ) + +walls.register(":naturalbiomes:alpine_brick_wall", S"Alpine Brick Wall", "naturalbiomes_alpine_rock_brick.png", + "naturalbiomes:alpine_brick_wall", default.node_sound_stone_defaults()) + +--[[walls.register(":naturalbiomes:bamboo_brick_wall", S"Bambooforest Wall", "naturalbiomes_bambooforest_rock_brick.png", + "naturalbiomes:bamboo_brick_wall", default.node_sound_stone_defaults())]] + +walls.register(":naturalbiomes:med_brick_wall", S"Mediterranean Wall", "naturalbiomes_mediterran_rock_brick.png", + "naturalbiomes:med_brick_wall", default.node_sound_stone_defaults()) + +walls.register(":naturalbiomes:outback_brick_wall", S"Outback Wall", "naturalbiomes_outback_rock_brick.png", + "naturalbiomes:outback_brick_wall", default.node_sound_stone_defaults()) + +--[[walls.register(":naturalbiomes:beach_brick_wall", S"Palmbeach Wall", "naturalbiomes_beach_rock_brick.png", + "naturalbiomes:beach_brick_wall", default.node_sound_stone_defaults())]] + +minetest.register_node("naturalbiomes:reed_bundle", { + description = S("Reed Bundle"), + tiles = { + "naturalbiomes_adler_reed_bundle_top.png", + "naturalbiomes_adler_reed_bundle_top.png", + "naturalbiomes_adler_reed_bundle.png" + }, + is_ground_content = false, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("naturalbiomes:alpine_brick", { + description = S("Alpine Brick"), + tiles = {"naturalbiomes_alpine_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +--[[minetest.register_node("naturalbiomes:bamboo_brick", { + description = S("Bambooforest Brick"), + tiles = {"naturalbiomes_bambooforest_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +})]] + +--[[minetest.register_node("naturalbiomes:beach_brick", { + description = S("Beach Brick"), + tiles = {"naturalbiomes_beach_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +})]] + +minetest.register_node("naturalbiomes:med_brick", { + description = S("Meditteranean Brick"), + tiles = {"naturalbiomes_mediterran_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:outback_brick", { + description = S("Outback Brick"), + tiles = {"naturalbiomes_outback_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:reed_bundle", + type = "shapeless", + recipe = + {"naturalbiomes:alderswamp_reed", "naturalbiomes:alderswamp_reed"} + +}) + +minetest.register_craft({ + output = "naturalbiomes:reed_bundle", + type = "shapeless", + recipe = + {"naturalbiomes:alderswamp_reed2", "naturalbiomes:alderswamp_reed2"} + +}) + +minetest.register_craft({ + output = "naturalbiomes:reed_bundle", + type = "shapeless", + recipe = + {"naturalbiomes:alderswamp_reed3", "naturalbiomes:alderswamp_reed3"} + +}) + +minetest.register_craft({ + output = "naturalbiomes:alpine_brick", + type = "shapeless", + recipe = + {"naturalbiomes:alpine_rock", "naturalbiomes:alpine_rock"} + + +}) + +--[[minetest.register_craft({ + output = "naturalbiomes:bamboo_brick", + type = "shapeless", + recipe = + {"naturalbiomes:bambooforest_rock", "naturalbiomes:bambooforest_rock"} + + +})]] + +--[[minetest.register_craft({ + output = "naturalbiomes:beach_brick", + type = "shapeless", + recipe = + {"naturalbiomes:palmbeach_rock", "naturalbiomes:palmbeach_rock"} + + +})]] + +minetest.register_craft({ + output = "naturalbiomes:med_brick", + type = "shapeless", + recipe = + {"naturalbiomes:mediterran_rock", "naturalbiomes:mediterran_rock"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:outback_brick", + type = "shapeless", + recipe = + {"naturalbiomes:outback_rock", "naturalbiomes:outback_rock"} + + +}) + +---- + +minetest.register_craft({ + output = "naturalbiomes:alpine_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:alpine_brick"} + + +}) + +--[[minetest.register_craft({ + output = "naturalbiomes:bamboo_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:bamboo_brick"} + + +})]] + +--[[minetest.register_craft({ + output = "naturalbiomes:beach_brick", + type = "shapeless", + recipe = + {"naturalbiomes:beach_brick"} + + +})]] + +minetest.register_craft({ + output = "naturalbiomes:med_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:med_brick"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:outback_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:outback_brick"} + + +}) + +--- doors + +doors.register_trapdoor("naturalbiomes:acacia_trapdoor", { + description = S"Wet Savanna Acacia Trapdoor", + inventory_image = "naturalbiomes_acacia_trapdoor.png", + wield_image = "naturalbiomes_acacia_trapdoor.png", + tile_front = "naturalbiomes_acacia_trapdoor.png", + tile_side = "naturalbiomes_acacia_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:acacia_trapdoor 2", + recipe = { + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood"}, + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_trunk", "naturalbiomes:acacia_wood"}, + } +}) + +doors.register("naturalbiomes_acacia_door", { + tiles = {{ name = "naturalbiomes_acacia_door.png", backface_culling = true }}, + description = S"Wet Savanna Acacia Door", + inventory_image = "naturalbiomes_item_acacia_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood"}, + {"naturalbiomes:acacia_trunk", "naturalbiomes:acacia_trunk"}, + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:alder_trapdoor", { + description = S"Alder Trapdoor", + inventory_image = "naturalbiomes_alder_trapdoor.png", + wield_image = "naturalbiomes_alder_trapdoor.png", + tile_front = "naturalbiomes_alder_trapdoor.png", + tile_side = "naturalbiomes_alder_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:alder_trapdoor 2", + recipe = { + {"naturalbiomes:alder_wood", "naturalbiomes:alder_wood", "naturalbiomes:alder_wood"}, + {"naturalbiomes:alder_wood", "naturalbiomes:alder_trunk", "naturalbiomes:alder_wood"}, + } +}) + +doors.register("naturalbiomes_alder_door", { + tiles = {{ name = "naturalbiomes_alder_door.png", backface_culling = true }}, + description = S"Alder Door", + inventory_image = "naturalbiomes_item_alder_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:alder_wood", "naturalbiomes:alder_wood"}, + {"naturalbiomes:alder_trunk", "naturalbiomes:alder_trunk"}, + {"naturalbiomes:alder_wood", "naturalbiomes:alder_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:alpine_trapdoor", { + description = S"Alpine Underground Trapdoor", + inventory_image = "naturalbiomes_alpine1_trapdoor.png", + wield_image = "naturalbiomes_alpine1_trapdoor.png", + tile_front = "naturalbiomes_alpine1_trapdoor.png", + tile_side = "naturalbiomes_alpine1_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:alpine_trapdoor 2", + recipe = { + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood"}, + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_trunk", "naturalbiomes:alppine1_wood"}, + } +}) + +doors.register("naturalbiomes_alpine_door", { + tiles = {{ name = "naturalbiomes_alpine1_door.png", backface_culling = true }}, + description = S"Alpine Underground Door", + inventory_image = "naturalbiomes_item_alpine1_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood"}, + {"naturalbiomes:alppine1_trunk", "naturalbiomes:alppine1_trunk"}, + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:alpine2_trapdoor", { + description = S"Alpine Trapdoor", + inventory_image = "naturalbiomes_alpine2_trapdoor.png", + wield_image = "naturalbiomes_alpine2_trapdoor.png", + tile_front = "naturalbiomes_alpine2_trapdoor.png", + tile_side = "naturalbiomes_alpine2_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:alpine2_trapdoor 2", + recipe = { + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood"}, + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_trunk", "naturalbiomes:alppine2_wood"}, + } +}) + +doors.register("naturalbiomes_alpine2_door", { + tiles = {{ name = "naturalbiomes_alpine2_door.png", backface_culling = true }}, + description = S"Alpine Door", + inventory_image = "naturalbiomes_item_alpine2_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood"}, + {"naturalbiomes:alppine2_trunk", "naturalbiomes:alppine2_trunk"}, + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood"}, + } +}) + +--[[doors.register_trapdoor("naturalbiomes:bamboo_trapdoor", { + description = S"Bamboo Trapdoor", + inventory_image = "naturalbiomes_bamboo_trapdoor.png", + wield_image = "naturalbiomes_bamboo_trapdoor.png", + tile_front = "naturalbiomes_bamboo_trapdoor.png", + tile_side = "naturalbiomes_bamboo_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +})]] + +--[[minetest.register_craft({ + output = "naturalbiomes:bamboo_trapdoor 2", + recipe = { + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood"}, + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_trunk", "naturalbiomes:bamboo_wood"}, + } +})]] + +--[[doors.register("naturalbiomes_bamboo_door", { + tiles = {{ name = "naturalbiomes_bamboo_door.png", backface_culling = true }}, + description = S"Bamboo Door", + inventory_image = "naturalbiomes_item_bamboo_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood"}, + {"naturalbiomes:bamboo_trunk", "naturalbiomes:bamboo_trunk"}, + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood"}, + } +})]] + +--[[doors.register_trapdoor("naturalbiomes:banana_trapdoor", { + description = S"Banana Trapdoor", + inventory_image = "naturalbiomes_banana_trapdoor.png", + wield_image = "naturalbiomes_banana_trapdoor.png", + tile_front = "naturalbiomes_banana_trapdoor.png", + tile_side = "naturalbiomes_banana_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +})]] + +--[[minetest.register_craft({ + output = "naturalbiomes:banana_trapdoor 2", + recipe = { + {"naturalbiomes:banana_wood", "naturalbiomes:banana_wood", "naturalbiomes:banana_wood"}, + {"naturalbiomes:banana_wood", "naturalbiomes:banana_trunk", "naturalbiomes:banana_wood"}, + } +})]] + +--[[doors.register("naturalbiomes_banana_door", { + tiles = {{ name = "naturalbiomes_banana_door.png", backface_culling = true }}, + description = S"Banana Door", + inventory_image = "naturalbiomes_item_banana_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:banana_wood", "naturalbiomes:banana_wood"}, + {"naturalbiomes:banana_trunk", "naturalbiomes:banana_trunk"}, + {"naturalbiomes:banana_wood", "naturalbiomes:banana_wood"}, + } +})]] + +doors.register_trapdoor("naturalbiomes:birch_trapdoor", { + description = S"Birch Trapdoor", + inventory_image = "naturalbiomes_birch_trapdoor.png", + wield_image = "naturalbiomes_birch_trapdoor.png", + tile_front = "naturalbiomes_birch_trapdoor.png", + tile_side = "naturalbiomes_birch_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:birch_trapdoor 2", + recipe = { + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood"}, + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_trunk", "naturalbiomes:heath_birch_wood"}, + } +}) + +doors.register("naturalbiomes_birch_door", { + tiles = {{ name = "naturalbiomes_birch_door.png", backface_culling = true }}, + description = S"Birch Door", + inventory_image = "naturalbiomes_item_birch_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood"}, + {"naturalbiomes:heath_birch_trunk", "naturalbiomes:heath_birch_trunk"}, + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood"}, + } +}) + +--[[doors.register_trapdoor("naturalbiomes:coconut_trapdoor", { + description = S"Coconut Trapdoor", + inventory_image = "naturalbiomes_cocopalm_trapdoor.png", + wield_image = "naturalbiomes_cocopalm_trapdoor.png", + tile_front = "naturalbiomes_cocopalm_trapdoor.png", + tile_side = "naturalbiomes_cocopalm_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +})]] + +--[[minetest.register_craft({ + output = "naturalbiomes:coconut_trapdoor 2", + recipe = { + {"naturalbiomes:palm_wood", "naturalbiomes:palm_wood", "naturalbiomes:palm_wood"}, + {"naturalbiomes:palm_wood", "naturalbiomes:palm_trunk", "naturalbiomes:palm_wood"}, + } +})]] + +--[[doors.register("naturalbiomes_coconut_door", { + tiles = {{ name = "naturalbiomes_cocopalm_door.png", backface_culling = true }}, + description = S"Coconut Door", + inventory_image = "naturalbiomes_item_cocopalm_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:palm_wood", "naturalbiomes:palm_wood"}, + {"naturalbiomes:palm_trunk", "naturalbiomes:palm_trunk"}, + {"naturalbiomes:palm_wood", "naturalbiomes:palm_wood"}, + } +})]] + +doors.register_trapdoor("naturalbiomes:juniper_trapdoor", { + description = S"Juniper Trapdoor", + inventory_image = "naturalbiomes_juniper_trapdoor.png", + wield_image = "naturalbiomes_juniper_trapdoor.png", + tile_front = "naturalbiomes_juniper_trapdoor.png", + tile_side = "naturalbiomes_juniper_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:juniper_trapdoor 2", + recipe = { + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood"}, + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_trunk", "naturalbiomes:heath_juniper_wood"}, + } +}) + +doors.register("naturalbiomes_juniper_door", { + tiles = {{ name = "naturalbiomes_juniper_door.png", backface_culling = true }}, + description = S"Juniper Door", + inventory_image = "naturalbiomes_item_juniper_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood"}, + {"naturalbiomes:heath_juniper_trunk", "naturalbiomes:heath_juniper_trunk"}, + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:medpine_trapdoor", { + description = S"Mediterranean Pine Trapdoor", + inventory_image = "naturalbiomes_medpine_trapdoor.png", + wield_image = "naturalbiomes_medpine_trapdoor.png", + tile_front = "naturalbiomes_medpine_trapdoor.png", + tile_side = "naturalbiomes_medpine_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:medpine_trapdoor 2", + recipe = { + {"naturalbiomes:pine_wood", "naturalbiomes:pine_wood", "naturalbiomes:pine_wood"}, + {"naturalbiomes:pine_wood", "naturalbiomes:pine_trunk", "naturalbiomes:pine_wood"}, + } +}) + +doors.register("naturalbiomes_medpine_door", { + tiles = {{ name = "naturalbiomes_medpine_door.png", backface_culling = true }}, + description = S"Mediterranean Pine Door", + inventory_image = "naturalbiomes_item_medpine_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:pine_wood", "naturalbiomes:pine_wood"}, + {"naturalbiomes:pine_trunk", "naturalbiomes:pine_trunk"}, + {"naturalbiomes:pine_wood", "naturalbiomes:pine_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:olive_trapdoor", { + description = S"Olive Trapdoor", + inventory_image = "naturalbiomes_olive_trapdoor.png", + wield_image = "naturalbiomes_olive_trapdoor.png", + tile_front = "naturalbiomes_olive_trapdoor.png", + tile_side = "naturalbiomes_olive_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:olive_trapdoor 2", + recipe = { + {"naturalbiomes:olive_wood", "naturalbiomes:olive_wood", "naturalbiomes:olive_wood"}, + {"naturalbiomes:olive_wood", "naturalbiomes:olive_trunk", "naturalbiomes:olive_wood"}, + } +}) + +doors.register("naturalbiomes_olive_door", { + tiles = {{ name = "naturalbiomes_olive_door.png", backface_culling = true }}, + description = S"Olive Door", + inventory_image = "naturalbiomes_item_olive_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:olive_wood", "naturalbiomes:olive_wood"}, + {"naturalbiomes:olive_trunk", "naturalbiomes:olive_trunk"}, + {"naturalbiomes:olive_wood", "naturalbiomes:olive_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:eucalyptus_trapdoor", { + description = S"Eucalyptus Trapdoor", + inventory_image = "naturalbiomes_outback_trapdoor.png", + wield_image = "naturalbiomes_outback_trapdoor.png", + tile_front = "naturalbiomes_outback_trapdoor.png", + tile_side = "naturalbiomes_outback_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:eucalyptus_trapdoor 2", + recipe = { + {"naturalbiomes:outback_wood", "naturalbiomes:outback_wood", "naturalbiomes:outback_wood"}, + {"naturalbiomes:outback_wood", "naturalbiomes:outback_trunk", "naturalbiomes:outback_wood"}, + } +}) + +doors.register("naturalbiomes_eucalyptus_door", { + tiles = {{ name = "naturalbiomes_outback_door.png", backface_culling = true }}, + description = S"Eucalyptus Door", + inventory_image = "naturalbiomes_item_outback_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:outback_wood", "naturalbiomes:outback_wood"}, + {"naturalbiomes:outback_trunk", "naturalbiomes:outback_trunk"}, + {"naturalbiomes:outback_wood", "naturalbiomes:outback_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:willow_trapdoor", { + description = S"Willow Trapdoor", + inventory_image = "naturalbiomes_willow_trapdoor.png", + wield_image = "naturalbiomes_willow_trapdoor.png", + tile_front = "naturalbiomes_willow_trapdoor.png", + tile_side = "naturalbiomes_willow_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:willow_trapdoor 2", + recipe = { + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood"}, + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_trunk", "naturalbiomes:heath_willow_wood"}, + } +}) + +doors.register("naturalbiomes_willow_door", { + tiles = {{ name = "naturalbiomes_willow_door.png", backface_culling = true }}, + description = S"Willow Door", + inventory_image = "naturalbiomes_item_willow_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood"}, + {"naturalbiomes:heath_willow_trunk", "naturalbiomes:heath_willow_trunk"}, + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood"}, + } +}) \ No newline at end of file diff --git a/mods/naturalbiomes/depends.txt b/mods/naturalbiomes/depends.txt new file mode 100644 index 00000000..82a0196a --- /dev/null +++ b/mods/naturalbiomes/depends.txt @@ -0,0 +1,6 @@ +default +stairs +doors +xpanes +hunger_ng? +ethereal? diff --git a/mods/naturalbiomes/description.txt b/mods/naturalbiomes/description.txt new file mode 100644 index 00000000..6216af1d --- /dev/null +++ b/mods/naturalbiomes/description.txt @@ -0,0 +1 @@ +Adds 7 new biomes to your Minetest Game world. \ No newline at end of file diff --git a/mods/naturalbiomes/dye.lua b/mods/naturalbiomes/dye.lua new file mode 100644 index 00000000..908654b3 --- /dev/null +++ b/mods/naturalbiomes/dye.lua @@ -0,0 +1,127 @@ +local S = minetest.get_translator("naturalbiomes") + +minetest.register_craft({ + output = "dye:yellow 2", + recipe = { + {"naturalbiomes:alderswamp_yellowflower"} + }, +}) + +minetest.register_craft({ + output = "dye:orange 2", + recipe = { + {"naturalbiomes:alpine_dandelion"} + }, +}) + +minetest.register_craft({ + output = "dye:red 2", + recipe = { + {"naturalbiomes:cowberry"} + }, +}) + +minetest.register_craft({ + output = "dye:white 2", + recipe = { + {"naturalbiomes:alpine_edelweiss"} + }, +}) + +minetest.register_craft({ + output = "dye:pink 2", + recipe = { + {"naturalbiomes:med_flower1"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"naturalbiomes:med_flower3"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"naturalbiomes:med_grass2"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"naturalbiomes:med_grass1"} + }, +}) + +minetest.register_craft({ + output = "dye:orange 2", + recipe = { + {"naturalbiomes:outback_grass6"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"naturalbiomes:savanna_flowergrass"} + }, +}) + +minetest.register_craft({ + output = "dye:green 2", + recipe = { + {"naturalbiomes:palmbeach_grass1"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"naturalbiomes:heatherflower"} + }, +}) + +minetest.register_craft({ + output = "dye:magenta 2", + recipe = { + {"naturalbiomes:heatherflower2"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"naturalbiomes:heatherflower3"} + }, +}) + +minetest.register_craft({ + output = "dye:pink 2", + recipe = { + {"naturalbiomes:heatherflower4"} + }, +}) + +minetest.register_craft({ + output = "dye:white 2", + recipe = { + {"naturalbiomes:med_flower2"} + }, +}) + +minetest.register_craft({ + output = "dye:grey 2", + recipe = { + {"naturalbiomes:outback_grass5"} + }, +}) + +minetest.register_craft({ + output = "dye:dark_green 2", + recipe = { + {"naturalbiomes:outback_grass2"} + }, +}) \ No newline at end of file diff --git a/mods/naturalbiomes/heath.lua b/mods/naturalbiomes/heath.lua new file mode 100644 index 00000000..68f17292 --- /dev/null +++ b/mods/naturalbiomes/heath.lua @@ -0,0 +1,1189 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:heath_litter", { + description = S("Heath sand with dirt"), + tiles = {"naturalbiomes_heath_litter.png", "default_sand.png", + {name = "default_sand.png^naturalbiomes_heath_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:heath_litter2", { + description = S("Heath sand with dirt"), + tiles = {"naturalbiomes_heath_litter2.png", "default_sand.png", + {name = "default_sand.png^naturalbiomes_heath_litter_side2.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + noise_params = { + offset = 0.25, + scale = 2, + spread = {x = 80, y = 80, z = 80}, + seed = 12345, + octaves = 2, + persist = 0.5, + lacunarity = 0.8, + }, + y_max = 31000, + y_min = 5, + decoration = "naturalbiomes:heath_litter3" + }) + +minetest.register_node("naturalbiomes:heath_litter3", { + description = S("Heath sand with dirt"), + tiles = {"naturalbiomes_heath_litter3.png", "default_sand.png", + {name = "default_sand.png^naturalbiomes_heath_litter_side3.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 8, + place_offset_y = -1, + flags = "force_placement", + noise_params = { + offset = -0.1, + scale = 3, + spread = {x = 100, y = 100, z = 100}, + seed = 54321, + octaves = 3, + persist = 0.5, + lacunarity = 0.9, + }, + y_max = 31000, + y_min = 5, + decoration = "naturalbiomes:heath_litter2" + }) + +minetest.register_biome({ + name = "naturalbiomes:heath", + node_top = "naturalbiomes:heath_litter", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 50, + y_min = 0, + heat_point = 47, + humidity_point = 89, +}) + +-- Schematics + +minetest.register_decoration({ + name = "naturalbiomes:heath_juniper_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter3"}, + place_offset_y = 1, + sidelen = 8, + noise_params = { + offset = -0.001725, + scale = 0.01, + spread = {x = 100, y = 20, z = 100}, + seed = 494, + octaves = 2, + persistence = 0.8, + lacunarity = 0.9, + }, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_junipertree.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_juniper_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter3"}, + place_offset_y = 1, + sidelen = 8, + noise_params = { + offset = -0.001725, + scale = 0.01, + spread = {x = 100, y = 20, z = 100}, + seed = 672, + octaves = 2, + persistence = 0.8, + lacunarity = 0.9, + }, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_junipertree2.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_birch_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_birchtree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "naturalbiomes:heath_litter", + num_spawn_by = 6, +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_birch_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_birchtree2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "naturalbiomes:heath_litter", + num_spawn_by = 6, +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_willow_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00125, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_willowtree11.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_willow_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00125, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_willowtree22.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + + minetest.register_decoration({ + name = "naturalbiomes:heath_grass", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.04115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:heath_grass", + }) + +minetest.register_node("naturalbiomes:heath_grass", { + description = S"Heath Grass", + drawtype = "plantlike", + waving = 2, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_grass.png"}, + inventory_image = "naturalbiomes_heath_grass.png", + wield_image = "naturalbiomes_heath_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + fill_ratio = 0.06115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:heath_grass2", + }) + +minetest.register_node("naturalbiomes:heath_grass2", { + description = S"Heath Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_grass2.png"}, + inventory_image = "naturalbiomes_heath_grass2.png", + wield_image = "naturalbiomes_heath_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:heath_grass3", + }) + +minetest.register_node("naturalbiomes:heath_grass3", { + description = S"Heath Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_grass3.png"}, + inventory_image = "naturalbiomes_heath_grass3.png", + wield_image = "naturalbiomes_heath_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2","naturalbiomes:heath_litter3"}, + sidelen = 16, + fill_ratio = 0.0275, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower", { + description = S"Pale Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_heatherflower.png"}, + inventory_image = "naturalbiomes_heath_heatherflower.png", + wield_image = "naturalbiomes_heath_heatherflower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower2", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2","naturalbiomes:heath_litter3"}, + sidelen = 16, + fill_ratio = 0.0275, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower2", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower2", { + description = S"Blush Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_heatherflower2.png"}, + inventory_image = "naturalbiomes_heath_heatherflower2.png", + wield_image = "naturalbiomes_heath_heatherflower2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower3", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2","naturalbiomes:heath_litter3"}, + sidelen = 16, + fill_ratio = 0.0275, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower3", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower3", { + description = S"Dusk Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.5, + tiles = {"naturalbiomes_heath_heatherflower3.png"}, + inventory_image = "naturalbiomes_heath_heatherflower3.png", + wield_image = "naturalbiomes_heath_heatherflower3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower4", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2","naturalbiomes:heath_litter3"}, + sidelen = 16, + fill_ratio = 0.0275, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower4", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower4", { + description = S"Cute Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.5, + tiles = {"naturalbiomes_heath_heatherflower4.png"}, + inventory_image = "naturalbiomes_heath_heatherflower4.png", + wield_image = "naturalbiomes_heath_heatherflower4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:swampgrass", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = -1, + decoration = "naturalbiomes:swampgrass", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:swampgrass", { + description = S"Swamp Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_swampgrass.png"}, + inventory_image = "naturalbiomes_heath_swampgrass.png", + wield_image = "naturalbiomes_heath_swampgrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:swampgrass2", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = -1, + decoration = "naturalbiomes:swampgrass2", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:swampgrass2", { + description = S"Swamp Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_swampgrass2.png"}, + inventory_image = "naturalbiomes_heath_swampgrass2.png", + wield_image = "naturalbiomes_heath_swampgrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +-- Tree generation +-- + +-- New willow tree + +local function grow_new_willow_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_willowtree11.mts", "0", nil, false) + +end + +-- willow trunk +minetest.register_node("naturalbiomes:heath_willow_trunk", { + description = S("Willow Trunk"), + tiles = { + "naturalbiomes_heath_willow_trunk_top.png", + "naturalbiomes_heath_willow_trunk_top.png", + "naturalbiomes_heath_willow_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- willow wood +minetest.register_node("naturalbiomes:heath_willow_wood", { + description = S("Willow Wood"), + tiles = {"naturalbiomes_heath_willow_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:heath_willow_wood 4", + recipe = {{"naturalbiomes:heath_willow_trunk"}} +}) + +minetest.register_node("naturalbiomes:heath_willow_leaves", { + description = S("Willow Leaves"), + drawtype = "plantlike", + visual_scale = 4.0, + waving = 1, + tiles = {"naturalbiomes_heath_willow_leaves.png"}, + special_tiles = {"naturalbiomes_heath_willow_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:willow_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_willow_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:heath_willow_leaves2", { + description = S("Willow Leaves"), + drawtype = "allfaces_optional", + visual_scale = 1.0, + waving = 1, + tiles = {"naturalbiomes_heath_willow_leaves2.png"}, + special_tiles = {"naturalbiomes_heath_willow_leaves2.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:willow_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_willow_leaves2'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:willow_sapling", { + description = S("Willow Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_heath_willow_sapling.png"}, + inventory_image = "naturalbiomes_heath_willow_sapling.png", + wield_image = "naturalbiomes_heath_willow_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_willow_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:willow_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_heath_willow_wood", + "naturalbiomes:heath_willow_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_willow_wood.png"}, + S("Willow Stair"), + S("Willow Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_heath_willow_trunk", + "naturalbiomes:heath_willow_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_willow_trunk_top.png", "naturalbiomes_heath_willow_trunk_top.png", "naturalbiomes_heath_willow_trunk.png"}, + S("Willow Trunk Stair"), + S("Willow Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_willow_wood", + { + description = S("Willow Wood Fence Gate"), + texture = "naturalbiomes_heath_willow_wood.png", + material = "naturalbiomes:heath_willow_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_willow_wood", + { + description = S("Willow Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_heath_willow_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_heath_willow_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_willow_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_willow_wood", + { + description = S("Willow Fence Rail"), + texture = "naturalbiomes_heath_willow_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_heath_willow_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_heath_willow_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_willow_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +-- New juniper tree + +local function grow_new_juniper_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_junipertree.mts", "0", nil, false) + +end + +-- juniper trunk +minetest.register_node("naturalbiomes:heath_juniper_trunk", { + description = S("Juniper Trunk"), + tiles = { + "naturalbiomes_heath_juniper_trunk_top.png", + "naturalbiomes_heath_juniper_trunk_top.png", + "naturalbiomes_heath_juniper_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- juniper wood +minetest.register_node("naturalbiomes:heath_juniper_wood", { + description = S("Juniper Wood"), + tiles = {"naturalbiomes_heath_juniper_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:heath_juniper_wood 4", + recipe = {{"naturalbiomes:heath_juniper_trunk"}} +}) + +minetest.register_node("naturalbiomes:heath_juniper_leaves", { + description = S("Juniper Leaves"), + drawtype = "allfaces_optional", + visual_scale = 1.0, + waving = 1, + tiles = {"naturalbiomes_heath_juniper_leaves.png"}, + special_tiles = {"naturalbiomes_heath_juniper_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:juniper_sapling'}, + rarity = 6, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_juniper_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:juniper_sapling", { + description = S("Juniper Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_heath_juniper_sapling.png"}, + inventory_image = "naturalbiomes_heath_juniper_sapling.png", + wield_image = "naturalbiomes_heath_juniper_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_juniper_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:juniper_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_heath_juniper_wood", + "naturalbiomes:heath_juniper_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_juniper_wood.png"}, + S("Juniper Stair"), + S("Juniper Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_heath_juniper_trunk", + "naturalbiomes:heath_juniper_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_juniper_trunk_top.png", "naturalbiomes_heath_juniper_trunk_top.png", "naturalbiomes_heath_juniper_trunk.png"}, + S("Juniper Trunk Stair"), + S("Juniper Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_juniper_wood", + { + description = S("Juniper Wood Fence Gate"), + texture = "naturalbiomes_heath_juniper_wood.png", + material = "naturalbiomes:heath_juniper_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_juniper_wood", + { + description = S("Juniper Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_heath_juniper_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_heath_juniper_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_juniper_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_juniper_wood", + { + description = S("Juniper Fence Rail"), + texture = "naturalbiomes_heath_juniper_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_heath_juniper_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_heath_juniper_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_juniper_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +-- New birch tree + +local function grow_new_birch_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_birchtree.mts", "0", nil, false) + +end + +-- birch trunk +minetest.register_node("naturalbiomes:heath_birch_trunk", { + description = S("Silver Birch Trunk"), + tiles = { + "naturalbiomes_heath_birch_trunk_top.png", + "naturalbiomes_heath_birch_trunk_top.png", + "naturalbiomes_heath_birch_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- birch wood +minetest.register_node("naturalbiomes:heath_birch_wood", { + description = S("Silver Birch Wood"), + tiles = {"naturalbiomes_heath_birch_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:heath_birch_wood 4", + recipe = {{"naturalbiomes:heath_birch_trunk"}} +}) + +minetest.register_node("naturalbiomes:heath_birch_leaves", { + description = S("Silver Birch Leaves"), + drawtype = "allfaces_optional", + visual_scale = 1.0, + waving = 1, + tiles = {"naturalbiomes_heath_birch_leaves.png"}, + special_tiles = {"naturalbiomes_heath_birch_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:birch_sapling'}, + rarity = 40, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_birch_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:birch_sapling", { + description = S("Silver Birch Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_heath_birch_sapling.png"}, + inventory_image = "naturalbiomes_heath_birch_sapling.png", + wield_image = "naturalbiomes_heath_birch_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_birch_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:birch_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_heath_birch_wood", + "naturalbiomes:heath_birch_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_birch_wood.png"}, + S("Silver Birch Stair"), + S("Silver Birch Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_heath_birch_trunk", + "naturalbiomes:heath_birch_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_birch_trunk_top.png", "naturalbiomes_heath_birch_trunk_top.png", "naturalbiomes_heath_birch_trunk.png"}, + S("Silver Birch Trunk Stair"), + S("Silver Birch Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_birch_wood", + { + description = S("Silver Birch Wood Fence Gate"), + texture = "naturalbiomes_heath_birch_wood.png", + material = "naturalbiomes:heath_birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_birch_wood", + { + description = S("Silver Birch Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_heath_birch_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_heath_birch_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_birch_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_birch_wood", + { + description = S("Silver Birch Fence Rail"), + texture = "naturalbiomes_heath_birch_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_heath_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_heath_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_birch_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflowernode", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 8, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0.75, + scale = 2.5, + spread = {x = 25, y = 25, z = 25}, + seed = 1456, + octaves = 3, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflowernode", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflowernode", { + description = S"Pale Heather Flower Bush", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_heatherflowernode.png"}, + inventory_image = "naturalbiomes_heath_heatherflowernode.png", + wield_image = "naturalbiomes_heath_heatherflowernode.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower2node", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 8, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0.75, + scale = 2.5, + spread = {x = 25, y = 25, z = 25}, + seed = 7358, + octaves = 3, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower2node", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower2node", { + description = S"Blush Heather Flower Bush", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1, + tiles = {"naturalbiomes_heath_heatherflower2node.png"}, + inventory_image = "naturalbiomes_heath_heatherflower2node.png", + wield_image = "naturalbiomes_heath_heatherflower2node.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower3node", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 8, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0.75, + scale = 2.5, + spread = {x = 25, y = 25, z = 25}, + seed = 2935, + octaves = 3, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower3node", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower3node", { + description = S"Dusk Heather Flower Bush", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1, + tiles = {"naturalbiomes_heath_heatherflower3node.png"}, + inventory_image = "naturalbiomes_heath_heatherflower3node.png", + wield_image = "naturalbiomes_heath_heatherflower3node.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower4node", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 8, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0.75, + scale = 2.5, + spread = {x = 25, y = 25, z = 25}, + seed = 989, + octaves = 3, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower4node", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower4node", { + description = S"Cute Heather Flower Bush", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1, + tiles = {"naturalbiomes_heath_heatherflower4node.png"}, + inventory_image = "naturalbiomes_heath_heatherflower4node.png", + wield_image = "naturalbiomes_heath_heatherflower4node.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + }) \ No newline at end of file diff --git a/mods/naturalbiomes/hunger.lua b/mods/naturalbiomes/hunger.lua new file mode 100644 index 00000000..101a01cb --- /dev/null +++ b/mods/naturalbiomes/hunger.lua @@ -0,0 +1,42 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('naturalbiomes:alpine_mushroom', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:olives', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:coconut', { + satiates = 3.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:coconut_slice', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:banana', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:banana_bunch', { + satiates = 5.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:cowberry', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:blackberry', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:wildrose', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:hazelnut_cracked', { + satiates = 2.0, + }) + +end diff --git a/mods/naturalbiomes/init.lua b/mods/naturalbiomes/init.lua new file mode 100644 index 00000000..194c0357 --- /dev/null +++ b/mods/naturalbiomes/init.lua @@ -0,0 +1,49 @@ +--This creates the naturalbiomes object. +naturalbiomes = {} + +--This creates the naturalbiomes.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +naturalbiomes.settings = { + clear_biomes = minetest.settings:get_bool("naturalbiomes.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("naturalbiomes.clear_decos") or false, + clear_ores = minetest.settings:get_bool("naturalbiomes.clear_ores") or false, +} + +if naturalbiomes.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if naturalbiomes.settings.clear_decos then + minetest.clear_registered_decorations() +end +if naturalbiomes.settings.clear_ores then + minetest.clear_registered_ores() +end + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("naturalbiomes") or + dofile(path .. "intllib.lua") + + +-- biomes + +dofile(path .. "wetsavanna.lua") -- +dofile(path .. "alderswamp.lua") -- +dofile(path .. "alpine.lua") -- +--dofile(path .. "bambooforest.lua") -- biome is disabled +--dofile(path .. "palmbeach.lua") -- biome is disabled +dofile(path .. "outback.lua") -- +dofile(path .. "mediterranean.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "heath.lua") -- +dofile(path .. "dye.lua") -- +dofile(path .. "bushland.lua") -- +dofile(path .. "leafdecay.lua") -- +dofile(path .. "hunger.lua") -- + + + diff --git a/mods/naturalbiomes/intllib.lua b/mods/naturalbiomes/intllib.lua new file mode 100644 index 00000000..adb0f886 --- /dev/null +++ b/mods/naturalbiomes/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/naturalbiomes/leafdecay.lua b/mods/naturalbiomes/leafdecay.lua new file mode 100644 index 00000000..ee4483ad --- /dev/null +++ b/mods/naturalbiomes/leafdecay.lua @@ -0,0 +1,114 @@ + +default.register_leafdecay({ + trunks = {"naturalbiomes:alder_trunk"}, + leaves = {"naturalbiomes:alder_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:alppine1_trunk"}, + leaves = {"naturalbiomes:alppine1_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:alppine2_trunk"}, + leaves = {"naturalbiomes:alppine2_leaves"}, + radius = 6 +}) + +--[[default.register_leafdecay({ -- bamboo is disabled + trunks = {"naturalbiomes:bamboo_trunk"}, + leaves = {"naturalbiomes:bamboo_leaves"}, + radius = 4 +})]] + +--[[default.register_leafdecay({ -- banana is disabled + trunks = {"naturalbiomes:banana_trunk"}, + leaves = {"naturalbiomes:banana_leaves", "naturalbiomes:banana", "naturalbiomes:banana_bunch"}, + radius = 4 +})]] + +default.register_leafdecay({ + trunks = {"naturalbiomes:olive_trunk"}, + leaves = {"naturalbiomes:olive_leaves", "naturalbiomes:olives"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:pine_trunk"}, + leaves = {"naturalbiomes:pine_leaves"}, + radius = 8 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:med_bush_stem"}, + leaves = {"naturalbiomes:med_bush_leaves"}, + radius = 16 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:outback_trunk"}, + leaves = {"naturalbiomes:outback_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:outback_bush_stem"}, + leaves = {"naturalbiomes:outback_bush_leaves"}, + radius = 6 +}) + +--[[default.register_leafdecay({ + trunks = {"naturalbiomes:palm_trunk"}, + leaves = {"naturalbiomes:palm_leaves", "naturalbiomes:coconut"}, + radius = 6 +})]] + +--[[default.register_leafdecay({ + trunks = {"naturalbiomes:beach_bush_stem"}, + leaves = {"naturalbiomes:beach_bush_leaves"}, + radius = 6 +})]] + +default.register_leafdecay({ + trunks = {"naturalbiomes:acacia_trunk"}, + leaves = {"naturalbiomes:acacia_leaves"}, + radius = 7 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:heath_willow_trunk"}, + leaves = {"naturalbiomes:heath_willow_leaves2"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:heath_juniper_trunk"}, + leaves = {"naturalbiomes:heath_juniper_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:heath_birch_trunk"}, + leaves = {"naturalbiomes:heath_birch_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bushland_hazelnut_stem"}, + leaves = {"naturalbiomes:bushland_hazelnut_leaves", "naturalbiomes:bushland_hazelnut_leaves2"}, + radius = 4 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bushland_wildrose_stem"}, + leaves = {"naturalbiomes:bushland_wildrose_leaves2", "naturalbiomes:bushland_wildrose_leaves"}, + radius = 4 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bushland_blackberry_stem"}, + leaves = {"naturalbiomes:bushland_blackberry_leaves2", "naturalbiomes:bushland_blackberry_leaves"}, + radius = 4 +}) diff --git a/mods/naturalbiomes/locale/naturalbiomes.de.tr b/mods/naturalbiomes/locale/naturalbiomes.de.tr new file mode 100644 index 00000000..e814cee3 --- /dev/null +++ b/mods/naturalbiomes/locale/naturalbiomes.de.tr @@ -0,0 +1,280 @@ +# textdomain: naturalbiomes + +Alder Swamp dirt with Grass=Erlensumpfschlamm mit Gras +Alder Swamp Dirt=Erlensumpfschlamm +Alder Trunk=Erlenstamm +Alder Wood=Erlenholz +Alder Leaves=Erlenblätter +Alder Sapling=Erlensetzling +Alder Stair=Erlenholztreppe +Alder Slab=Erlenholzplatte +Alder Trunk Stair=Erlenstamm Treppe +Alder Trunk Slab=Erlenstamm Platte +Alder Wood Fence Gate=Erlenholz Zauntor +Alder Fence=Erlenzaun +Alder Fence Rail=Erlenholz Geländer +Alderswamp reed=Erlensumpf Schilf +Waterlily=Kleine Seerosen +Alderswamp flower=Sumpfdotterblume +Dirt with Alpine Grass=Dreck mit Alpinem Gras +Alpine Rock=Alpiner Stein +Silver Fir Trunk=Weißtannenstamm +Silver Fir Wood=Weißtannenholz +Silver Fir Leaves=Weißtannen Nadeln +Silver Fir Sapling=Weißtannensetzling +Silver Fir Stair=Weißtannentreppe +Silver Fir Slab=Weißtannenplatte +Silver Fir Trunk Stair=Weißtannen Stamm Treppe +Silver Fir Trunk Slab=Weißtannen Stamm Platte +Silver Fir Wood Fence Gate=Weißtannen Holzzauntor +Silver Fir Fence=Weißtannenzaun +Silver Fir Fence Rail=Weißtannengeländer +Jack Pine Trunk=Banks Kiefer Stamm +Jack Pine Wood=Banks Kiefer Holz +Jack Pine Leaves=Banks Kiefer Nadeln +Jack Pine Sapling=Banks Kiefer Setzling +Jack Pine Stair=Banks Kiefer Holztreppe +Jack Pine Slab=Banks Kiefer Holzplatte +Jack Pine Trunk Stair=Banks Kiefer Stamm Treppe +Jack Pine Trunk Slab=Banks Kiefer Stamm Platte +Jack Pine Wood Fence Gate=Banks Kiefer Holzzauntor +Jack Pine Fence=Banks Kiefer Holzzaun +Jack Pine Fence Rail=Banks Kiefer Geländer +Cowberry Bush Stem=Preiselbeerstamm +Cowberry Bush Leaves=Preiselbeerblätter +Cowberry Bush Sapling=Preiselbeer Setzling +Cowberry=Preiselbeeren +Alpine Mushroom=Alpiner Pilz +Alpine Grass=Alpines Gras +Alpine Dandelion Flower=Alpiner Löwenzahn +Edelweiss Flower=Eidelweiss +Bamboo Forest Litter=Bumbuswald Boden +Bamboo Trunk=Bambusstamm +Bamboo Wood=Bambusholz +Bamboo Leaves=Bambusblätter +Bamboo Sapling=Bambussetzling +Bamboo Stair=Bambus Holztreppe +Bamboo Slab=Bambus Holzplatte +Bamboo Trunk Stair=Bambus Stammtreppe +Bamboo Trunk Slab=Bambus Stammplatte +Bamboo Wood Fence Gate=Bambus Holzzauntor +Bamboo Fence=Bambuszaun +Bamboo Fence Rail=Bambusgeländer +Small Bamboo Grass=Kleiner Bambus +Bamboo Forest Rock=Bambuswald Fels +Babmooforest Gorund Grass=Bambuswald Bodenbewuchs +Banana Trunk=Bananenstamm +Banana Wood=Bananenholz +Banana Leaves=Bananenwedel +Banana Sapling=Bananensetzling +Banana Stair=Bananenholz Treppe +Banana Slab=Bananenholz Platte +Banana Trunk Stair=Bananenstamm Streppe +Banana Trunk Slab=Bananenstamm Platte +Banana Wood Fence Gate=Bananen Holzzauntor +Banana Fence=Bananenzaun +Banana Fence Rail=Bananengeländer +Reed Bundle Stair=Schilfbündeltreppe +Reed Bundle Slab=Schilfbündelplatte +Alpine Brick Stair=Alpine Ziegeltreppe +Alpine Brick Slab=Alpine Ziegelplatte +Bamboo Brick Stair=Bambuswald Ziegeltreppe +Bamboo Brick Slab=Bambuswald Ziegelplatte +Beach Brick Stair=Strandziegel Treppe +Beach Brick Slab=Strandziegel Platte +Med Brick Stair=Mediterrane Ziegeltreppe +Med Brick Slab=Mediterrane Ziegelplatte +Outback Brick Stair=Outback Ziegeltreppe +Outback Brick Slab=Outback Ziegelplatte +Alpine Brick Wall=Alpine Ziegelmauer +Bambooforest Wall=Bambuswald Ziegelmauer +Mediterranean Wall=Mediterrane Ziegelmauer +Outback Wall=Outback Ziegelmauer +Palmbeach Wall=Strand Ziegelmauer +Reed Bundle=Schilfbündel +Alpine Brick=Alpine Ziegel +Bambooforest Brick=Bambuswald Ziegel +Beach Brick=Strandziegel +Meditteranean Brick=Mediterrane Ziegel +Outback Brick=Outback Ziegel +Heath sand with dirt=Heidesand mit Dreck +Heath Grass=Heidegras +Heather Flower=Heideblume +Swamp Grass=Sumpfgras +Willow Trunk=Weidenstamm +Willow Wood=Weidenholz +Willow Leaves=Weidenblätter +Willow Sapling=Weidensetzling +Willow Stair=Weidenholztreppe +Willow Slab=Weidenholzplatte +Willow Trunk Stair=Weidenstamm Treppe +Willow Trunk Slab=Weidenstamm Platte +Willow Wood Fence Gate=Weiden Holzzauntor +Willow Fence=Weidenholzzaun +Willow Fence Rail=Weidengeländer +Juniper Trunk=Wacholder Stamm +Juniper Wood=Wacholder Holz +Juniper Leaves=Wacholder Nadeln +Juniper Sapling=Wacholder Setzling +Juniper Stair=Wacholder Treppe +Juniper Slab=Wacholder Platte +Juniper Trunk Stair=Wacholder Stammtreppe +Juniper Trunk Slab=Wacholder Stammplatte +Juniper Wood Fence Gate=Wacholder Holzzauntor +Juniper Fence=Wacholderzaun +Juniper Fence Rail= Wacholder Geländer +Birch Trunk=Birkenstamm +Birch Wood=Birkenholz +Birch Leaves=Birkenblätter +Birch Sapling=Birkensetzling +Birch Stair=Birkenholz Treppe +Birch Slab=Birkenholz Platte +Birch Trunk Stair=Birkenstamm Treppe +Birch Trunk Slab=Birkenstamm Platte +Birch Wood Fence Gate=Birken Zauntor +Birch Fence=Birkenzaun +Birch Fence Rail=Birkengeländer +Heather Flower Node=Heidekrautblock +Mediterranean litter with grass=Mediterraner Boden mit Gras +Mediterranean Rock=Mediterraner Fels +Mediterranean Ruin=Mediterrane Ruine +Mediterranean Ruin Column=Mediterrane Säule +Olive Trunk=Olivenstamm +Olive Wood=Olivenholz +Olive Leaves=Olivenblätter +Olive Sapling=Olivensetzling +Olive Stair=Olivenholz Treppe +Olive Slab=Olivenholz Platte +Alder Trunk Stair=Olivenstamm Treppe +Alder Trunk Slab=Olivenstamm Platte +Olive Wood Fence Gate=Oliven Holzzauntor +Olive Fence=Olivenzaun +Olive Fence Rail=Olivengeländer +Mediterranean Pine Trunk=Mediterraner Kiefernstamm +Mediterranean Pine Wood=Mediterranes Kiefernholz +Mediterranean Pine Leaves=Mediterrane Kiefernnadeln +Mediterranean Pine Sapling=Mediterraner Kiefernsetzling +Mediterranean Pine Stair=Mediterrane Kiefernholz Treppe +Mediterranean Pine Slab=Mediterrane Kiefernholz Platte +Mediterranean Pine Trunk Stair=Mediterrane Kiefernstamm Treppe +Mediterranean Pine Trunk Slab=Mediterrane Kiefernstamm Platte +Mediterranean Pine Wood Fence Gate=Mediterranes Kiefernholztor +Mediterranean Pine Fence=Mediterraner Kiefernzaun +Mediterranean Pine Fence Rail=Mediterranes Kieferngeländer +Cypress Bush Stem=Zypressenstamm +Cypress Bush Leaves=Zypressennadeln +Cypress Bush Sapling=Zypressensetzling +Mediterranean Flower=Mediterrane Blume +Lavender=Lavendel +Mediterranean Grass=Mediterranes Gras +Fresh Olives=Frische Oliven +Outback ground with grass=Outback Boden +Outback Rock=Outback Fels +Outback Ground Sand=Outback Bodensand +Outback Eucalyptus Trunk=Eukalyptus Stamm +Outback Eucalyptus Wood=Eukalyptus Holz +Outback Eucalyptus Leaves=Eukalyptus Blätter +Outback Eucalyptus Sapling=Eukalyptus Setzling +Outback Eucalyptus Stair=Eukalyptus Holztreppe +Outback Eucalyptus Slab=Eukalyptus Holzplatte +Outback Eucalyptus Trunk Stair=Eukalyptus Stammtreppe +Outback Eucalyptus Trunk Slab=Eukalyptus Stammplatte +Outback Eucalyptus Wood Fence Gate=Eukalyptus Holzzauntor +Outback Eucalyptus Fence=Eukalyptus Zaun +Outback Eucalyptus Fence Rail=Eukalyptus Geländer +Outback Bush Stem=Outback Buschstamm +Outback Bush Leaves=Outback Buschblätter +Outback Bush Sapling=Outback Buschsetzling +Outback Grass=Outback Gras +Outback Rock Formation=Outback Fels +Beach Sand=Strandsand +Beach Rock=Strandfels +Coconut Palm Trunk=Kokospalmen Stamm +Coconut Palm Wood=Kokospalmen Holz +Coconut Palm Leaves=Kokospalmen Wedel +Coconut Palm Sapling=Kokospalmen Setzling +Coconut Palm Stair=Kokospalmen Holztreppe +Coconut Palm Slab=Kokospalmen Holzplatte +Coconut Palm Trunk Stair=Kokospalmen Stammtreppe +Coconut Palm Trunk Slab=Kokospalmen Stammplatte +Coconut Palm Wood Fence Gate=Kokospalmen Holzzauntor +Coconut Palm Fence=Kokospalmenzaun +Coconut Palm Fence Rail=Kokospalmengeländer +Beach Bush Stem=Strandbuschstamm +Beach Bush Leaves=Strandbuschblätter +Beach Bush Sapling=Strandbuschsetzling +Palmbeach Grass=Strandgras +Banana Bunch=Bananenstaude +Banana=Banane +Coconut Slice=Kokosnusstück +Coconut=Kokosnuss +Wet Savanna dirt with Grass=Feuchtsavannenboden mit Gras +Acacia Trunk=Akazienstamm +Acacia Wood=Akazienholz +Acacia Leaves=Akazienblätter +Acacia Sapling=Akaziensetzling +Acacia Stair=Akazien Holztreppe +Acacia Slab=Akazien Holzplatte +Acacia Trunk Stair=Akazien Stammtreppe +Acacia Trunk Slab=Akazien Stammplatte +Acacia Wood Fence Gate=Akazien Holzzauntor +Acacia Fence=Akazienzaun +Acacia Fence Rail=Akaziengeländer +Savanna Grass=Savannengras +Savanna Flowergrass=Savannen Blumengras +Bushland Litter=Buschland Boden +Bushland Grass=Buschland Gras +Blackberry Bush Stem=Brombeerbusch Stamm +Blackberry Bush Leaves=Brombeerblätter +Blackberry Bush Sapling=Brombeerbusch Setzling +Blackberry=Brombeere +Wildrose Bush Stem=Wildrosenbusch Stamm +Wildrose Bush Leaves=Wildrosenbusch Blätter +Wildrose Bush Sapling=Wildrosenbusch Setzling +Wildrose=Hagebutte +Hazelnut Bush Stem=Haselnussbusch Stamm +Hazelnut Bush Leaves=Haselnussbusch Blätter +Hazelnut Bush Sapling=Haselnussbusch Setzling +Hazelnut=Haselnuss +Dead Bush Leaves=Verwelkte Buschblätter +Cracked Hazelnut=Geknackte Haselnuss +Hazelnut Woven Fence=Haselnuss Flechtzaun +Wet Savanna Acacia Trapdoor=Akazien Falltür +Wet Savanna Acacia Door=Akazientür +Alder Trapdoor=Erlen Falltür +Alder Door=Erlentür +Alpine Underground Door=Alpine Untergrundtür +Alpine Underground Trapdoor=Alpine Untergrundfalltür +Alpine Trapdoor=Alm Falltür +Alpine Door=Almtür +Bamboo Trapdoor=Bambus Falltür +Bamboo Door=Bambustür +Banana Door=Bananentür +Banana Trapdoor=Bananen Falltür +Birch Trapdoor=Birken Falltür +Birch Door=Birkentür +Coconut Trapdoor=Kokospalmen Falltür +Coconut Door=Kokospalmentür +Juniper Trapdoor=Wacholder Falltür +Juniper Door=Wacholder Tür +Mediterranean Pine Trapdoor=Mediterrane Pinien Falltür +Mediterranean Pine Door=Mediterrane Pinientür +Olive Trapdoor=Oliven Falltür +Olive Door=Oliventür +Eucalyptus Trapdoor=Eukalyptus Falltür +Eucalyptus Door=Eukalyptus Tür +Willow Trapdoor=Weiden Falltür +Willow Door=Weidentür + + + + + + + + + + + + + diff --git a/mods/naturalbiomes/mediterranean.lua b/mods/naturalbiomes/mediterranean.lua new file mode 100644 index 00000000..8d1aa7f0 --- /dev/null +++ b/mods/naturalbiomes/mediterranean.lua @@ -0,0 +1,820 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:mediterran_litter", { + description = S("Mediterranean litter with grass"), + tiles = {"naturalbiomes_mediterran_litter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_mediterran_litte_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:mediterran_rock", { + description = S("Mediterranean Rock"), + tiles = {"naturalbiomes_mediterran_rock.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:mediterran_ruin", { + description = S("Mediterranean Ruin"), + tiles = {"naturalbiomes_mediterran_ruins.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:mediterran_ruin2", { + description = S("Mediterranean Ruin Column"), + tiles = {"naturalbiomes_mediterran_ruins2.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:mediterranean", + node_top = "naturalbiomes:mediterran_litter", + depth_top = 1, + node_filler = "naturalbiomes:mediterran_rock", + depth_filler = 50, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:sandstone", + node_dungeon_alt = "default:desert_stonebrick", + node_dungeon_stair = "stairs:stair_desert_stone", + y_max = 100, + y_min = 5, + heat_point = 58, + humidity_point = 30, +}) + +-- Tree generation +-- + +-- New olive tree + +local function grow_new_olive_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 5, y = pos.y - 0, z = pos.z - 5}, modpath.."/schematics/naturalbiomes_olive_tree2_0_90.mts", "0", nil, false) +end + +-- olive trunk +minetest.register_node("naturalbiomes:olive_trunk", { + description = S("Olive Trunk"), + tiles = { + "naturalbiomes_mediterran_olive_trunk_top.png", + "naturalbiomes_mediterran_olive_trunk_top.png", + "naturalbiomes_mediterran_olive_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- olive wood +minetest.register_node("naturalbiomes:olive_wood", { + description = S("Olive Wood"), + tiles = {"naturalbiomes_mediterran_olive_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:olive_wood 4", + recipe = {{"naturalbiomes:olive_trunk"}} +}) + +minetest.register_node("naturalbiomes:olive_leaves", { + description = S("Olive Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_mediterran_olive_leaves.png"}, + special_tiles = {"naturalbiomes_mediterran_olive_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:olive_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:olive_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:olive_sapling", { + description = S("Olive Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_mediterran_olive_sapling.png"}, + inventory_image = "naturalbiomes_mediterran_olive_sapling.png", + wield_image = "naturalbiomes_mediterran_olive_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_olive_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:olive_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_olive_wood", + "naturalbiomes:olive_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_olive_wood.png"}, + S("Olive Stair"), + S("Olive Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_olive_trunk", + "naturalbiomes:olive_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_olive_trunk_top.png", "naturalbiomes_mediterran_olive_trunk_top.png", "naturalbiomes_mediterran_olive_trunk.png"}, + S("Alder Trunk Stair"), + S("Alder Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_olive_wood", + { + description = S("Olive Wood Fence Gate"), + texture = "naturalbiomes_mediterran_olive_wood.png", + material = "naturalbiomes:olive_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_olive_wood", + { + description = S("Olive Fence"), + texture = "naturalbiomes_olive_fence_woode.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_mediterran_olive_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_mediterran_olive_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:olive_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_olive_wood", + { + description = S("Olive Fence Rail"), + texture = "naturalbiomes_olive_fence_woode.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_olive_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_olive_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:olive_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:olive_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00105, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_olive_tree2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- Tree generation +-- + +-- New pine tree + +local function grow_new_pine_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 9, y = pos.y - 0, z = pos.z - 8}, modpath.."/schematics/naturalbiomes_med_pinetree_0_90.mts", "0", nil, false) +end + + +-- pine trunk +minetest.register_node("naturalbiomes:pine_trunk", { + description = S("Mediterranean Pine Trunk"), + tiles = { + "naturalbiomes_mediterran_pine_trunk_top.png", + "naturalbiomes_mediterran_pine_trunk_top.png", + "naturalbiomes_mediterran_pine_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- pine wood +minetest.register_node("naturalbiomes:pine_wood", { + description = S("Mediterranean Pine Wood"), + tiles = {"naturalbiomes_mediterran_pine_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:pine_wood 4", + recipe = {{"naturalbiomes:pine_trunk"}} +}) + +minetest.register_node("naturalbiomes:pine_leaves", { + description = S("Mediterranean Pine Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_mediterran_pine_leaves.png"}, + special_tiles = {"naturalbiomes_mediterran_pine_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:pine_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:pine_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:pine_sapling", { + description = S("Mediterranean Pine Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_mediterran_pine_sapling.png"}, + inventory_image = "naturalbiomes_mediterran_pine_sapling.png", + wield_image = "naturalbiomes_mediterran_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_pine_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:pine_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_pine_wood", + "naturalbiomes:pine_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_pine_wood.png"}, + S("Mediterranean Pine Stair"), + S("Mediterranean Pine Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_pine_trunk", + "naturalbiomes:pine_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_pine_trunk_top.png", "naturalbiomes_mediterran_pine_trunk_top.png", "naturalbiomes_mediterran_pine_trunk.png"}, + S("Mediterranean Pine Trunk Stair"), + S("Mediterranean Pine Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_pine_wood", + { + description = S("Mediterranean Pine Wood Fence Gate"), + texture = "naturalbiomes_mediterran_pine_wood.png", + material = "naturalbiomes:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_pine_wood", + { + description = S("Mediterranean Pine Fence"), + texture = "naturalbiomes_medpine_fence_woode.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_mediterran_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_mediterran_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_pine_wood", + { + description = S("Mediterranean Pine Fence Rail"), + texture = "naturalbiomes_medpine_fence_woode.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:pine_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_med_pinetree_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:pine_treesmall", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00105, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_med_pinetree_small_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + -- Cypress Bush + +-- New cypress tree + +local function grow_new_cypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_cypress_0_90.mts", "0", nil, false) +end + + + minetest.register_decoration({ + name = "naturalbiomes:med_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 3876, + octaves = 3, + persist = 0.4, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_cypress_0_90.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:med_bush_stem", { + description = S("Cypress Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_mediterran_cypress_stem.png"}, + inventory_image = "naturalbiomes_mediterran_cypress_stem.png", + wield_image = "naturalbiomes_mediterran_cypress_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:med_bush_leaves", { + description = S("Cypress Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_mediterran_cypress_leavese.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:med_bush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:med_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:med_bush_sapling", { + description = S("Cypress Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_mediterran_cypress_stem.png"}, + inventory_image = "naturalbiomes_mediterran_cypress_stem.png", + wield_image = "naturalbiomes_mediterran_cypress_stem.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_cypress_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:med_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:med_flower1", + deco_type = "simple", + place_on = {"naturalbiomes:mediterranean_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 4, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_flower1", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_flower1", { + description = S"Mediterranean Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_flower1.png"}, + inventory_image = "naturalbiomes_mediterran_flower1.png", + wield_image = "naturalbiomes_mediterran_flower1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_flower2", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 4, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_flower2", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_flower2", { + description = S"Mediterranean Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_flower2.png"}, + inventory_image = "naturalbiomes_mediterran_flower2.png", + wield_image = "naturalbiomes_mediterran_flower2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_flower3", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 4, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_flower3", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_flower3", { + description = S"Lavender", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_flower3.png"}, + inventory_image = "naturalbiomes_mediterran_flower3.png", + wield_image = "naturalbiomes_mediterran_flower3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_grass1", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + fill_ratio = 0.075, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_grass1", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_grass1", { + description = S"Mediterranean Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_grass.png"}, + inventory_image = "naturalbiomes_mediterran_grass.png", + wield_image = "naturalbiomes_mediterran_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + fill_ratio = 0.075, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_grass2", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_grass2", { + description = S"Mediterranean Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_grass2.png"}, + inventory_image = "naturalbiomes_mediterran_grass2.png", + wield_image = "naturalbiomes_mediterran_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_ruin1", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 1, + persist = 0.1, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_medruin1_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_ruin2", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 1, + persist = 0.1, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_medruin2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_ruin3", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 1, + persist = 0.1, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_medruin3_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +-- Olives +minetest.register_node("naturalbiomes:olives", { + description = S("Fresh Olives"), + drawtype = "plantlike", + tiles = {"naturalbiomes__fresholives.png"}, + inventory_image = "naturalbiomes__fresholives.png", + wield_image = "naturalbiomes__fresholives.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:olives", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:olives", param2 = 1}) + end + end +}) diff --git a/mods/naturalbiomes/mod.conf b/mods/naturalbiomes/mod.conf new file mode 100644 index 00000000..d6b22326 --- /dev/null +++ b/mods/naturalbiomes/mod.conf @@ -0,0 +1,4 @@ +name = naturalbiomes +description = 7 New Biomes +depends = default, stairs, doors, xpanes +optional_depends = hunger_ng, ethereal \ No newline at end of file diff --git a/mods/naturalbiomes/outback.lua b/mods/naturalbiomes/outback.lua new file mode 100644 index 00000000..7a56d477 --- /dev/null +++ b/mods/naturalbiomes/outback.lua @@ -0,0 +1,698 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:outback_litter", { + description = S("Outback ground with grass"), + tiles = {"naturalbiomes_outbacklitter.png", "naturalbiomes_outback_ground.png", + {name = "naturalbiomes_outback_ground.png^naturalbiomes_outbacklitter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:outback_ground", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:outback_rock", { + description = S("Outback Rock"), + tiles = {"naturalbiomes_outback_rock.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:outback_ground", { + description = S("Outback Ground Sand"), + tiles = {"naturalbiomes_outback_ground.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:outback", + node_top = "naturalbiomes:outback_litter", + depth_top = 1, + node_filler = "naturalbiomes:outback_ground", + depth_filler = 50, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:sandstone", + node_dungeon_alt = "default:desert_stonebrick", + node_dungeon_stair = "stairs:stair_desert_stone", + y_max = 40, + y_min = 3, + heat_point = 82, + humidity_point = 32, +}) + +-- Schematics + +minetest.register_decoration({ + name = "naturalbiomes:outback_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.001, + biomes = {"naturalbiomes:outback"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_outback_tree1_0_90.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:outback_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00075, + biomes = {"naturalbiomes:outback"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_outback_tree2_0_90.mts", +flags = "place_center_x, place_center_z", +rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:outback_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 391, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_bush_small2_0_270.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + name = "naturalbiomes:outback_rockformation1", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_rock1_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + +minetest.register_decoration({ + name = "naturalbiomes:outback_rockformation2", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_rock2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + + +minetest.register_decoration({ + name = "naturalbiomes:outback_rockformation3", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_rock3_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:outback_bush2", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 391, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_bush2_0_90.mts", + flags = "place_center_x, place_center_z", +}) + +-- Tree generation +-- + +-- New outback tree + +local function grow_new_outback_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_outback_tree1_0_90.mts", "0", nil, false) +end + +-- outback trunk +minetest.register_node("naturalbiomes:outback_trunk", { + description = S("Outback Eucalyptus Trunk"), + tiles = { + "naturalbiomes_outbackeukalyptus_trunk_top.png", + "naturalbiomes_outbackeukalyptus_trunk_top.png", + "naturalbiomes_outbackeucalyptus_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- outback wood +minetest.register_node("naturalbiomes:outback_wood", { + description = S("Outback Eucalyptus Wood"), + tiles = {"naturalbiomes_outback_eukalyptus_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:outback_wood 4", + recipe = {{"naturalbiomes:outback_trunk"}} +}) + +minetest.register_node("naturalbiomes:outback_leaves", { + description = S("Outback Eucalyptus Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_outbackeukalyptus_leaves.png"}, + special_tiles = {"naturalbiomes_outbackeukalyptus_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:outback_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:outback_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:outback_sapling", { + description = S("Outback Eucalyptus Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_outbackeukaplyptus_sapling.png"}, + inventory_image = "naturalbiomes_outbackeukaplyptus_sapling.png", + wield_image = "naturalbiomes_outbackeukaplyptus_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_outback_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:outback_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_outback_eukalyptus_wood", + "naturalbiomes:outback_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_outback_eukalyptus_wood.png"}, + S("Outback Eucalyptus Stair"), + S("Outback Eucalyptus Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_outbackeucalyptus_trunk", + "naturalbiomes:outback_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_outbackeukalyptus_trunk_top.png", "naturalbiomes_outbackeukalyptus_trunk_top.png", "naturalbiomes_outbackeucalyptus_trunk.png"}, + S("Outback Eucalyptus Trunk Stair"), + S("Outback Eucalyptus Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_outback_wood", + { + description = S("Outback Eucalyptus Wood Fence Gate"), + texture = "naturalbiomes_outback_eukalyptus_wood.png", + material = "naturalbiomes:outback_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_outback_wood", + { + description = S("Outback Eucalyptus Fence"), + texture = "naturalbiomes_eukalyptus_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:outback_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_outback_wood", + { + description = S("Outback Eucalyptus Fence Rail"), + texture = "naturalbiomes_eukalyptus_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:outback_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + + minetest.register_decoration({ + name = "naturalbiomes:outback_log", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0002, + scale = 0.0005, + spread = {x = 550, y = 550, z = 550}, + seed = 2, + octaves = 3, + persist = 0.36 + }, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:outback_litter", + num_spawn_by = 2, + }) + + -- Outback Bush + +-- New outback bush + +local function grow_new_outback_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_outback_bush_small2_0_270.mts", "0", nil, false) +end + +minetest.register_node("naturalbiomes:outback_bush_stem", { + description = S("Outback Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_outback_bush_stem.png"}, + inventory_image = "naturalbiomes_outback_bush_stem.png", + wield_image = "naturalbiomes_outback_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:outback_bush_leaves", { + description = S("Outback Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_outbackbush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:outback_bush_sapling"}, rarity = 50}, + {items = {"naturalbiomes:outback_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:outback_bush_sapling", { + description = S("Outback Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_outback_bush_stem.png"}, + inventory_image = "naturalbiomes_outback_bush_stem.png", + wield_image = "naturalbiomes_outback_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_outback_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:outback_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 4, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass.png"}, + inventory_image = "naturalbiomes_outbackgrass.png", + wield_image = "naturalbiomes_outbackgrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 500, y = 500, z = 500}, + seed = 687, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass2", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass2", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass2.png"}, + inventory_image = "naturalbiomes_outbackgrass2.png", + wield_image = "naturalbiomes_outbackgrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 500, y = 500, z = 500}, + seed = 6072, + octaves = 2, + persist = 3, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass3", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass3", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass3.png"}, + inventory_image = "naturalbiomes_outbackgrass3.png", + wield_image = "naturalbiomes_outbackgrass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass4", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 500, y = 500, z = 500}, + seed = 457, + octaves = 3, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:outback_grass4", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass4", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass4.png"}, + inventory_image = "naturalbiomes_outbackgrass4.png", + wield_image = "naturalbiomes_outbackgrass4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass5", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:outback_grass5", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass5", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 500, y = 500, z = 500}, + seed = 457, + octaves = 3, + persist = 1, + }, + tiles = {"naturalbiomes_outbackgrass5.png"}, + inventory_image = "naturalbiomes_outbackgrass5.png", + wield_image = "naturalbiomes_outbackgrass5.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass6", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass6", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass6", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass6.png"}, + inventory_image = "naturalbiomes_outbackgrass6.png", + wield_image = "naturalbiomes_outbackgrass6.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_node("naturalbiomes:outback_rockformation1", { + description = S("Outback Rock Formation"), + tiles = {"naturalbiomes_beach_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:palmbeach_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + diff --git a/mods/naturalbiomes/palmbeach.lua b/mods/naturalbiomes/palmbeach.lua new file mode 100644 index 00000000..80a1641d --- /dev/null +++ b/mods/naturalbiomes/palmbeach.lua @@ -0,0 +1,668 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:palmbeach_sand", { + description = S("Beach Sand"), + tiles = {"naturalbiomes_beach_sand.png"}, + groups = {crumbly = 3, sand = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:palmbeach", + node_top = "naturalbiomes:palmbeach_sand", + depth_top = 3, + node_filler = "default:sandstone", + depth_filler = 5, + node_riverbed = "naturalbiomes:palmbeach_sand", + depth_riverbed = 3, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone", + y_max = 5, + y_min = -1, + heat_point = 86, + humidity_point = 78, +}) + +minetest.register_node("naturalbiomes:palmbeach_rock", { + description = S("Beach Rock"), + tiles = {"naturalbiomes_beach_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:palmbeach_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_large_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock2", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_small_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock3", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = -2, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_medium2_0_180.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock4", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = -2, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_medium_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +-- Tree generation +-- + +-- New palm tree + +local function grow_new_palm_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_cocopalm_tree_0_270.mts", "0", nil, false) +end + + +-- palm trunk +minetest.register_node("naturalbiomes:palm_trunk", { + description = S("Coconut Palm Trunk"), + tiles = { + "naturalbiomes_savannapalm_trunk_top.png", + "naturalbiomes_savannapalm_trunk_top.png", + "naturalbiomes_savannapalm_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- palm wood +minetest.register_node("naturalbiomes:palm_wood", { + description = S("Coconut Palm Wood"), + tiles = {"naturalbiomes_savannapalm_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:palm_wood 4", + recipe = {{"naturalbiomes:palm_trunk"}} +}) + +minetest.register_node("naturalbiomes:palm_leaves", { + description = S("Coconut Palm Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_savannapalm_leaves.png"}, + special_tiles = {"naturalbiomes_savannapalm_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:palm_sapling'}, + rarity = 35, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:palm_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:palm_sapling", { + description = S("Coconut Palm Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannapalm_sapling.png"}, + inventory_image = "naturalbiomes_savannapalm_sapling.png", + wield_image = "naturalbiomes_savannapalm_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_palm_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:palm_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_savannapalm_wood", + "naturalbiomes:palm_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannapalm_wood.png"}, + S("Coconut Palm Stair"), + S("Coconut Palm Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_savannapalm_trunk", + "naturalbiomes:palm_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannapalm_trunk_top.png", "naturalbiomes_savannapalm_trunk_top.png", "naturalbiomes_savannapalm_trunk.png"}, + S("Coconut Palm Trunk Stair"), + S("Coconut Palm Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_palm_wood", + { + description = S("Coconut Palm Wood Fence Gate"), + texture = "naturalbiomes_savannapalm_wood.png", + material = "naturalbiomes:palm_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_palm_wood", + { + description = S("Coconut Palm Fence"), + texture = "naturalbiomes_palm_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_savannapalm_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_savannapalm_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:palm_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_palm_wood", + { + description = S("Coconut Palm Fence Rail"), + texture = "naturalbiomes_palm_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_savannapalm_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_savannapalm_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:palm_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:palm_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.01115, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 5, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_cocopalm_tree_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + -- Beach Bush + +-- New palm buh + +local function grow_new_palm_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 1, y = pos.y - 0, z = pos.z - 1}, modpath.."/schematics/naturalbiomes_beach_bush_0_270.mts", "0", nil, false) +end + + minetest.register_decoration({ + name = "naturalbiomes:beach_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.06, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beach_bush_0_270.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:beach_bush_stem", { + description = S("Beach Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_beach_bush_stem.png"}, + inventory_image = "naturalbiomes_beach_bush_stem.png", + wield_image = "naturalbiomes_beach_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:beach_bush_leaves", { + description = S("Beach Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_beach_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:beach_bush_sapling"}, rarity = 3}, + {items = {"naturalbiomes:beach_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:beach_bush_sapling", { + description = S("Beach Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_beach_bush_stem.png"}, + inventory_image = "naturalbiomes_beach_bush_stem.png", + wield_image = "naturalbiomes_beach_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_palm_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:beach_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:palmbeach_grass1", + deco_type = "simple", + place_on = {"naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 1987, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 2, + decoration = "naturalbiomes:palmbeach_grass1", + spawn_by = "naturalbiomes:palmbeach_sand" + }) + +minetest.register_node("naturalbiomes:palmbeach_grass1", { + description = S"Palmbeach Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_beach_grass.png"}, + inventory_image = "naturalbiomes_beach_grass.png", + wield_image = "naturalbiomes_beach_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:palmbeach_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 834, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 2, + decoration = "naturalbiomes:palmbeach_grass2", + spawn_by = "naturalbiomes:palmbeach_sand" + }) + +minetest.register_node("naturalbiomes:palmbeach_grass2", { + description = S"Palmbeach Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_beach_grass2.png"}, + inventory_image = "naturalbiomes_beach_grass2.png", + wield_image = "naturalbiomes_beach_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:palmbeach_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 834, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 2, + decoration = "naturalbiomes:palmbeach_grass3", + spawn_by = "naturalbiomes:palmbeach:_sand" + }) + +minetest.register_node("naturalbiomes:palmbeach_grass3", { + description = S"Palmbeach Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_beach_grass3.png"}, + inventory_image = "naturalbiomes_beach_grass3.png", + wield_image = "naturalbiomes_beach_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +-- Banana Bunch +minetest.register_node("naturalbiomes:banana_bunch", { + description = S("Banana Bunch"), + drawtype = "plantlike", + tiles = {"naturalbiomes_banana_bunch.png"}, + inventory_image = "naturalbiomes_banana_bunch.png", + wield_image = "naturalbiomes_banana_bunch.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:banana_bunch", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:banana_bunch", param2 = 1}) + end + end +}) + +-- Bunch to Single +minetest.register_craft({ + type = "shapeless", + output = "naturalbiomes:banana 3", + recipe = {"naturalbiomes:banana_bunch"} +}) + +minetest.register_craft({ + type = "shapeless", + output = "naturalbiomes:banana_bunch", + recipe = {"naturalbiomes:banana", "naturalbiomes:banana", "naturalbiomes:banana"} +}) + +minetest.register_node("naturalbiomes:banana", { + description = S("Banana"), + drawtype = "torchlike", + tiles = {"naturalbiomes_banana_single.png"}, + inventory_image = "naturalbiomes_banana_single.png", + wield_image = "naturalbiomes_banana_single.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:banana", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:banana", param2 = 1}) + end + end +}) + +minetest.register_node("naturalbiomes:coconut_slice", { + description = S("Coconut Slice"), + drawtype = "torchlike", + tiles = {"naturalbiomes_coconut_slice.png"}, + inventory_image = "naturalbiomes_coconut_slice.png", + wield_image = "naturalbiomes_coconut_slice.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:naturalbiomes:coconut_slice", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:coconut_slice", param2 = 1}) + end + end +}) + +-- Coco +minetest.register_node("naturalbiomes:coconut", { + description = S("Coconut"), + drawtype = "plantlike", + tiles = {"naturalbiomes_coconut.png"}, + inventory_image = "naturalbiomes_coconut.png", + wield_image = "naturalbiomes_coconut.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:coconut", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:coconut", param2 = 1}) + end + end +}) + +-- Bunch to Single + + +minetest.register_craft({ + type = "shapeless", + output = "naturalbiomes:coconut_bunch", + recipe = {"naturalbiomes:coconut_slice", "naturalbiomes:coconut_slice", "naturalbiomes:coconut_slice"} +}) + diff --git a/mods/naturalbiomes/schematics/naturalbiomes__alpine_pine1_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes__alpine_pine1_log_0_90.mts new file mode 100644 index 00000000..27d24bfc Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes__alpine_pine1_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acacia_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_acacia_log_0_90.mts new file mode 100644 index 00000000..68e257d1 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acacia_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acaciatree3.mts b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree3.mts new file mode 100644 index 00000000..6e94996f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acaciatree4.mts b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree4.mts new file mode 100644 index 00000000..f0e49aa9 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree4.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acaciatree_0_180.mts b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree_0_180.mts new file mode 100644 index 00000000..c4ccf46f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree_0_180.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alder_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alder_log_0_90.mts new file mode 100644 index 00000000..23771200 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alder_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_boghole_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_boghole_0_270.mts new file mode 100644 index 00000000..780883bd Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_boghole_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts new file mode 100644 index 00000000..16e3780f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_aldertree2_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_aldertree2_0_270.mts new file mode 100644 index 00000000..05e5fe07 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_aldertree2_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_aldertree3_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_aldertree3_0_270.mts new file mode 100644 index 00000000..f8603706 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_aldertree3_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_aldertree_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_aldertree_0_270.mts new file mode 100644 index 00000000..1c9c6834 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_aldertree_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_berrybush_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_berrybush_0_90.mts new file mode 100644 index 00000000..b784644c Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_berrybush_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush.mts new file mode 100644 index 00000000..624b5f68 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush2.mts new file mode 100644 index 00000000..4497a360 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush3.mts new file mode 100644 index 00000000..8194870b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_cowberrybush.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_cowberrybush.mts new file mode 100644 index 00000000..09d1ce36 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_cowberrybush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine1_0_90.mts new file mode 100644 index 00000000..b998c312 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_0_90.mts new file mode 100644 index 00000000..f3809c3e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_log_0_90.mts new file mode 100644 index 00000000..c4fde8b0 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bambootree_large_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_large_0_270.mts new file mode 100644 index 00000000..955cc81e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_large_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_0_270.mts new file mode 100644 index 00000000..eb2b8beb Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_micro_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_micro_0_270.mts new file mode 100644 index 00000000..5c78d0ff Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_micro_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_banana_palm_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_banana_palm_0_90.mts new file mode 100644 index 00000000..1b67941a Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_banana_palm_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beach_bush_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beach_bush_0_270.mts new file mode 100644 index 00000000..72761a3f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beach_bush_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_large_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_large_0_270.mts new file mode 100644 index 00000000..56af121b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_large_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium2_0_180.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium2_0_180.mts new file mode 100644 index 00000000..a7d936ef Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium2_0_180.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium_0_270.mts new file mode 100644 index 00000000..4d369684 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_small_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_small_0_270.mts new file mode 100644 index 00000000..d2a17214 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_small_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_birchtree.mts b/mods/naturalbiomes/schematics/naturalbiomes_birchtree.mts new file mode 100644 index 00000000..6701e624 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_birchtree.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_birchtree2.mts b/mods/naturalbiomes/schematics/naturalbiomes_birchtree2.mts new file mode 100644 index 00000000..cd0abc54 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_birchtree2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush.mts new file mode 100644 index 00000000..46e451bb Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush2.mts new file mode 100644 index 00000000..13a679cc Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush3.mts new file mode 100644 index 00000000..16444999 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush.mts new file mode 100644 index 00000000..ccf1acd3 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush2.mts new file mode 100644 index 00000000..92f2e626 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush3.mts new file mode 100644 index 00000000..cb84496e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush.mts new file mode 100644 index 00000000..84cbe08a Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush2.mts new file mode 100644 index 00000000..4bc9973e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush3.mts new file mode 100644 index 00000000..7e278439 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush.mts new file mode 100644 index 00000000..7cbd5eb3 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush2.mts new file mode 100644 index 00000000..892a8962 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush3.mts new file mode 100644 index 00000000..e49385c6 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_cocopalm_tree_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_cocopalm_tree_0_270.mts new file mode 100644 index 00000000..ca1490e5 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_cocopalm_tree_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_cypress_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_cypress_0_90.mts new file mode 100644 index 00000000..8bb92d58 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_cypress_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation.mts b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation.mts new file mode 100644 index 00000000..2e60b2c0 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation2.mts b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation2.mts new file mode 100644 index 00000000..28cdb0fc Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation3.mts b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation3.mts new file mode 100644 index 00000000..430609db Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_junipertree.mts b/mods/naturalbiomes/schematics/naturalbiomes_junipertree.mts new file mode 100644 index 00000000..cc18e711 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_junipertree.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_junipertree2.mts b/mods/naturalbiomes/schematics/naturalbiomes_junipertree2.mts new file mode 100644 index 00000000..a49e1d9b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_junipertree2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_0_90.mts new file mode 100644 index 00000000..74e9253d Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_small_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_small_0_90.mts new file mode 100644 index 00000000..c1de727b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_small_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_medruin1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_medruin1_0_90.mts new file mode 100644 index 00000000..feca153c Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_medruin1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_medruin2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_medruin2_0_90.mts new file mode 100644 index 00000000..8ca18b1b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_medruin2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_medruin3_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_medruin3_0_90.mts new file mode 100644 index 00000000..b2a26836 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_medruin3_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_olive_tree2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree2_0_90.mts new file mode 100644 index 00000000..f4c98654 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_olive_tree_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree_0_90.mts new file mode 100644 index 00000000..f4c98654 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_bush2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush2_0_90.mts new file mode 100644 index 00000000..f2fce13f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_bush_small2_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush_small2_0_270.mts new file mode 100644 index 00000000..28df820b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush_small2_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_log_0_90.mts new file mode 100644 index 00000000..fc3bafd2 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_rock1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock1_0_90.mts new file mode 100644 index 00000000..406fe03c Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_rock2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock2_0_90.mts new file mode 100644 index 00000000..2393c6fe Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_rock3_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock3_0_90.mts new file mode 100644 index 00000000..27636c27 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock3_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_tree1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree1_0_90.mts new file mode 100644 index 00000000..a3bba0d6 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_tree2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree2_0_90.mts new file mode 100644 index 00000000..424940e4 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_savannagrass1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass1_0_90.mts new file mode 100644 index 00000000..1f8ed718 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_savannagrass2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass2_0_90.mts new file mode 100644 index 00000000..7fd76a7e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree.mts new file mode 100644 index 00000000..8bc8ffbf Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree11.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree11.mts new file mode 100644 index 00000000..b5aceb1f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree11.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree2.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree2.mts new file mode 100644 index 00000000..34522f53 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree22.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree22.mts new file mode 100644 index 00000000..6e8f533e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree22.mts differ diff --git a/mods/naturalbiomes/settingtypes.txt b/mods/naturalbiomes/settingtypes.txt new file mode 100644 index 00000000..f7e7b5d6 --- /dev/null +++ b/mods/naturalbiomes/settingtypes.txt @@ -0,0 +1,10 @@ +#naturalbiomes settings + +#If enabled, will clear all registered biomes. +naturalbiomes.clear_biomes (Enable to clear registered biomes. true / false) bool true + +#If enabled, will clear all registered decorations. +naturalbiomes.clear_decos (Enable to clear registered decorations. true / false) bool true + +#If enabled, will clear all registered ores. +naturalbiomes.clear_ores (Enable to clear registered ores. true / false) bool false diff --git a/mods/naturalbiomes/textures/naturalbiomes_Bambooforest_bamboo_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_Bambooforest_bamboo_leaves.png new file mode 100644 index 00000000..e13e76b2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_Bambooforest_bamboo_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_leaf.png b/mods/naturalbiomes/textures/naturalbiomes__banana_leaf.png new file mode 100644 index 00000000..329d9bf8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_leaf.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_tree_sapling.png b/mods/naturalbiomes/textures/naturalbiomes__banana_tree_sapling.png new file mode 100644 index 00000000..467dd29e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_tree_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_trunk.png b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk.png new file mode 100644 index 00000000..cf61977c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk_top.png new file mode 100644 index 00000000..f5580925 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_wood.png b/mods/naturalbiomes/textures/naturalbiomes__banana_wood.png new file mode 100644 index 00000000..144cc7b3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__fresholives.png b/mods/naturalbiomes/textures/naturalbiomes__fresholives.png new file mode 100644 index 00000000..3ea65eaa Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__fresholives.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_door.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_door.png new file mode 100644 index 00000000..de1d88f8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_fence_wood.png new file mode 100644 index 00000000..39df52c7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor.png new file mode 100644 index 00000000..8ddd5a25 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor_side.png new file mode 100644 index 00000000..5cd3a570 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_adler_fence_wood.png new file mode 100644 index 00000000..e2a2bc2e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle.png b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle.png new file mode 100644 index 00000000..a61ed229 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle_top.png b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle_top.png new file mode 100644 index 00000000..7fd7b150 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_yellowflower.png b/mods/naturalbiomes/textures/naturalbiomes_adler_yellowflower.png new file mode 100644 index 00000000..e0019f1f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_yellowflower.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alder_door.png b/mods/naturalbiomes/textures/naturalbiomes_alder_door.png new file mode 100644 index 00000000..7a900b7f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alder_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor.png new file mode 100644 index 00000000..f24046e6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor_side.png new file mode 100644 index 00000000..018ba6ec Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_leaves.png new file mode 100644 index 00000000..4c73464e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk.png new file mode 100644 index 00000000..79400dd6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk_top.png new file mode 100644 index 00000000..9b51dcfe Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_wood.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_wood.png new file mode 100644 index 00000000..27d0110f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_dirt.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_dirt.png new file mode 100644 index 00000000..23f989c6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_dirt.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter.png new file mode 100644 index 00000000..f3a06874 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter_side.png new file mode 100644 index 00000000..ee5cbad3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reedbrown.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reedbrown.png new file mode 100644 index 00000000..b441f213 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reedbrown.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds.png new file mode 100644 index 00000000..fe5b994f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds2.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds2.png new file mode 100644 index 00000000..07c10241 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds3.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds3.png new file mode 100644 index 00000000..4c1225f4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_sapling.png new file mode 100644 index 00000000..88a49606 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily.png new file mode 100644 index 00000000..61e41c58 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily_bottom.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily_bottom.png new file mode 100644 index 00000000..ec3fc13f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily_bottom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine1_door.png b/mods/naturalbiomes/textures/naturalbiomes_alpine1_door.png new file mode 100644 index 00000000..6f33b301 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine1_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor.png new file mode 100644 index 00000000..b1b75504 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor_side.png new file mode 100644 index 00000000..9eb75525 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine2_door.png b/mods/naturalbiomes/textures/naturalbiomes_alpine2_door.png new file mode 100644 index 00000000..664b6d0a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine2_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor.png new file mode 100644 index 00000000..37b9b130 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor_side.png new file mode 100644 index 00000000..c4613209 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_fruit.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_fruit.png new file mode 100644 index 00000000..f1171329 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_fruit.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_leaves.png new file mode 100644 index 00000000..75c8dd8c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_sapling.png new file mode 100644 index 00000000..7a988895 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_stem.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_stem.png new file mode 100644 index 00000000..4f32095b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_dandelion.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_dandelion.png new file mode 100644 index 00000000..4f9fa959 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_dandelion.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_edelweiss.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_edelweiss.png new file mode 100644 index 00000000..bc331d37 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_edelweiss.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_grass1.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass1.png new file mode 100644 index 00000000..dc71ed16 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass1.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass2.png new file mode 100644 index 00000000..5fd0c1a9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass3.png new file mode 100644 index 00000000..ba436a25 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_litter.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter.png new file mode 100644 index 00000000..92b68538 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter_side.png new file mode 100644 index 00000000..91773f84 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_mushroom.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_mushroom.png new file mode 100644 index 00000000..af418c89 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_mushroom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_leaves.png new file mode 100644 index 00000000..2a98c894 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_sapling.png new file mode 100644 index 00000000..3b6f2697 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk.png new file mode 100644 index 00000000..43b42dc3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk_top.png new file mode 100644 index 00000000..6dc1fa6f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_wood.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_wood.png new file mode 100644 index 00000000..ba10a617 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_leaves.png new file mode 100644 index 00000000..377f7cfc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_sapling.png new file mode 100644 index 00000000..71b4f06a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk.png new file mode 100644 index 00000000..13c9ad71 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk_top.png new file mode 100644 index 00000000..59db722d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_wood.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_wood.png new file mode 100644 index 00000000..dbd3bef2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_rock.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock.png new file mode 100644 index 00000000..a5b3af6d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock_brick.png new file mode 100644 index 00000000..97f3cde3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_door.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_door.png new file mode 100644 index 00000000..20115a2a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_fence_wood.png new file mode 100644 index 00000000..8a4fae80 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor.png new file mode 100644 index 00000000..f65d18c2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor_side.png new file mode 100644 index 00000000..01e8984c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_sapling.png new file mode 100644 index 00000000..07abbf07 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk.png new file mode 100644 index 00000000..9bf5151a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk_top.png new file mode 100644 index 00000000..a9161cd7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunksmall.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunksmall.png new file mode 100644 index 00000000..a15afe26 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunksmall.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood.png new file mode 100644 index 00000000..bf3364a7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood2.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood2.png new file mode 100644 index 00000000..e9a5ef06 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass.png new file mode 100644 index 00000000..62a9790a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass2.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass2.png new file mode 100644 index 00000000..ce8d009b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter.png new file mode 100644 index 00000000..a01ea652 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter_side.png new file mode 100644 index 00000000..a2cb96ff Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock.png new file mode 100644 index 00000000..144ec45f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock_brick.png new file mode 100644 index 00000000..d8a1536a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_small_bamboo.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_small_bamboo.png new file mode 100644 index 00000000..11feb3dc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_small_bamboo.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_bunch.png b/mods/naturalbiomes/textures/naturalbiomes_banana_bunch.png new file mode 100644 index 00000000..b295415e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_bunch.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_door.png b/mods/naturalbiomes/textures/naturalbiomes_banana_door.png new file mode 100644 index 00000000..ae8cabce Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_single.png b/mods/naturalbiomes/textures/naturalbiomes_banana_single.png new file mode 100644 index 00000000..9c24d18d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_single.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor.png new file mode 100644 index 00000000..2f3a11ee Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor_side.png new file mode 100644 index 00000000..05fe2b3c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk.png new file mode 100644 index 00000000..cf61977c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk_top.png new file mode 100644 index 00000000..f5580925 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_wood.png b/mods/naturalbiomes/textures/naturalbiomes_banana_wood.png new file mode 100644 index 00000000..144cc7b3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_bush_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_leaves.png new file mode 100644 index 00000000..be6ade16 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_bush_stem.png b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_stem.png new file mode 100644 index 00000000..0b1147f1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_grass.png b/mods/naturalbiomes/textures/naturalbiomes_beach_grass.png new file mode 100644 index 00000000..9d8216e2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_beach_grass2.png new file mode 100644 index 00000000..b5b79c38 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_beach_grass3.png new file mode 100644 index 00000000..c2894999 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_rock.png b/mods/naturalbiomes/textures/naturalbiomes_beach_rock.png new file mode 100644 index 00000000..63fdaa9d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_beach_rock_brick.png new file mode 100644 index 00000000..f1d949ed Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_sand.png b/mods/naturalbiomes/textures/naturalbiomes_beach_sand.png new file mode 100644 index 00000000..787ee3e6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_sand.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_birch_door.png b/mods/naturalbiomes/textures/naturalbiomes_birch_door.png new file mode 100644 index 00000000..48657834 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_birch_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor.png new file mode 100644 index 00000000..18b2be3b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor_side.png new file mode 100644 index 00000000..55b2ec08 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberries.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberries.png new file mode 100644 index 00000000..20cfbf3a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberries.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves.png new file mode 100644 index 00000000..4581769d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves2.png new file mode 100644 index 00000000..d5ec6387 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_sapling.png new file mode 100644 index 00000000..25a7a382 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_stem.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_stem.png new file mode 100644 index 00000000..fe0f9c59 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter.png new file mode 100644 index 00000000..020833c2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2.png new file mode 100644 index 00000000..602b2abb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_back.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_back.png new file mode 100644 index 00000000..1fe230d0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_back.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_bottom.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_bottom.png new file mode 100644 index 00000000..facd0579 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_bottom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_front.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_front.png new file mode 100644 index 00000000..feb1b73c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_front.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_left.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_left.png new file mode 100644 index 00000000..2209026a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_left.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_right.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_right.png new file mode 100644 index 00000000..6bed6277 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_right.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_top.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_top.png new file mode 100644 index 00000000..602b2abb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3.png new file mode 100644 index 00000000..c87e2d53 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_back.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_back.png new file mode 100644 index 00000000..016fffc2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_back.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_bottom.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_bottom.png new file mode 100644 index 00000000..facd0579 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_bottom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_front.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_front.png new file mode 100644 index 00000000..621490e9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_front.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_left.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_left.png new file mode 100644 index 00000000..2d194963 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_left.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_right.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_right.png new file mode 100644 index 00000000..a005b8a2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_right.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_top.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_top.png new file mode 100644 index 00000000..c87e2d53 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter_side.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter_side.png new file mode 100644 index 00000000..ae58a19f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_deadbush_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_deadbush_leaves.png new file mode 100644 index 00000000..09427cb8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_deadbush_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass.png new file mode 100644 index 00000000..0beab82e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass2.png new file mode 100644 index 00000000..bdd731a4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass3.png new file mode 100644 index 00000000..f6df49aa Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass4.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass4.png new file mode 100644 index 00000000..29a2ba8f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass4.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass5.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass5.png new file mode 100644 index 00000000..b1176c8a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass5.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass6.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass6.png new file mode 100644 index 00000000..86bfa173 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass6.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass7.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass7.png new file mode 100644 index 00000000..9bfd96c3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass7.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut.png new file mode 100644 index 00000000..10235e6e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_cracked.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_cracked.png new file mode 100644 index 00000000..6286917c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_cracked.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_fence.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_fence.png new file mode 100644 index 00000000..e3b4584f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_fence.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves.png new file mode 100644 index 00000000..9432b3c3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves2.png new file mode 100644 index 00000000..5d320698 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_sapling.png new file mode 100644 index 00000000..21056d91 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_stem.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_stem.png new file mode 100644 index 00000000..babf0e33 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose.png new file mode 100644 index 00000000..7f1c3c93 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves.png new file mode 100644 index 00000000..695fcec3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves2.png new file mode 100644 index 00000000..d2af93d9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_sapling.png new file mode 100644 index 00000000..9d79f1ae Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_stem.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_stem.png new file mode 100644 index 00000000..a2d08b11 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_coconut.png b/mods/naturalbiomes/textures/naturalbiomes_coconut.png new file mode 100644 index 00000000..e1225e44 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_coconut.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_coconut_slice.png b/mods/naturalbiomes/textures/naturalbiomes_coconut_slice.png new file mode 100644 index 00000000..351a1855 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_coconut_slice.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_cocopalm_door.png b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_door.png new file mode 100644 index 00000000..00fb61c2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor.png new file mode 100644 index 00000000..6a9831fc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor_side.png new file mode 100644 index 00000000..87d6ba0f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_eukalyptus_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_eukalyptus_fence_wood.png new file mode 100644 index 00000000..82613964 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_eukalyptus_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_fence_wood.png new file mode 100644 index 00000000..04b875d1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_leaves.png new file mode 100644 index 00000000..1d319388 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_sapling.png new file mode 100644 index 00000000..245de8d8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk.png new file mode 100644 index 00000000..b44fa4ae Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk_top.png new file mode 100644 index 00000000..97d7d15f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_wood.png new file mode 100644 index 00000000..3553f661 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_grass.png b/mods/naturalbiomes/textures/naturalbiomes_heath_grass.png new file mode 100644 index 00000000..6e58e5e4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_grass2.png new file mode 100644 index 00000000..cd76d70f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_grass3.png new file mode 100644 index 00000000..9e87ebbf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower.png new file mode 100644 index 00000000..6605a1df Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2.png new file mode 100644 index 00000000..13e2c495 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2node.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2node.png new file mode 100644 index 00000000..cba50d62 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2node.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3.png new file mode 100644 index 00000000..e6efd4b1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3node.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3node.png new file mode 100644 index 00000000..6c06e1b7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3node.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4.png new file mode 100644 index 00000000..bb7c8911 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4node.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4node.png new file mode 100644 index 00000000..0a43bf92 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4node.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflowernode.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflowernode.png new file mode 100644 index 00000000..26ea48cf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflowernode.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_fence_wood.png new file mode 100644 index 00000000..15658dd5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_leaves.png new file mode 100644 index 00000000..3e26408c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_sapling.png new file mode 100644 index 00000000..25c2b8e8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk.png new file mode 100644 index 00000000..560369f4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk_top.png new file mode 100644 index 00000000..8c68d83d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_wood.png new file mode 100644 index 00000000..5d3fad18 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter.png new file mode 100644 index 00000000..8c84348f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter2.png new file mode 100644 index 00000000..ecdbebf1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter3.png new file mode 100644 index 00000000..70e80d41 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side.png new file mode 100644 index 00000000..34d70f8b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side2.png new file mode 100644 index 00000000..c37bfcc2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side3.png new file mode 100644 index 00000000..66b7c946 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass.png b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass.png new file mode 100644 index 00000000..591e7549 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass2.png new file mode 100644 index 00000000..177cf692 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_fence_wood.png new file mode 100644 index 00000000..0689a9a5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves.png new file mode 100644 index 00000000..531e1ca0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves2.png new file mode 100644 index 00000000..0cd826f7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_sapling.png new file mode 100644 index 00000000..3870286b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk.png new file mode 100644 index 00000000..23962c90 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk_top.png new file mode 100644 index 00000000..f2901f97 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_wood.png new file mode 100644 index 00000000..de0eba93 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_acacia_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_acacia_door.png new file mode 100644 index 00000000..2dc6cb43 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_acacia_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_alder_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_alder_door.png new file mode 100644 index 00000000..47ae4468 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_alder_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_alpine1_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_alpine1_door.png new file mode 100644 index 00000000..2872c3c2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_alpine1_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_alpine2_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_alpine2_door.png new file mode 100644 index 00000000..de663462 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_alpine2_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_bamboo_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_bamboo_door.png new file mode 100644 index 00000000..486375e7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_bamboo_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_banana_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_banana_door.png new file mode 100644 index 00000000..f00d173f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_banana_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_birch_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_birch_door.png new file mode 100644 index 00000000..d9704654 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_birch_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_cocopalm_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_cocopalm_door.png new file mode 100644 index 00000000..f8b676cb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_cocopalm_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_juniper_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_juniper_door.png new file mode 100644 index 00000000..81eaa9c7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_juniper_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_medpine_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_medpine_door.png new file mode 100644 index 00000000..e91f468b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_medpine_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_olive_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_olive_door.png new file mode 100644 index 00000000..3c8a92d7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_olive_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_outback_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_outback_door.png new file mode 100644 index 00000000..5e83cb46 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_outback_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_willow_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_willow_door.png new file mode 100644 index 00000000..b208ad30 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_willow_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_juniper_door.png b/mods/naturalbiomes/textures/naturalbiomes_juniper_door.png new file mode 100644 index 00000000..e3b176bc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_juniper_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor.png new file mode 100644 index 00000000..29ccf179 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor_side.png new file mode 100644 index 00000000..93488c15 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_leavese.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_leavese.png new file mode 100644 index 00000000..03c5dfda Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_leavese.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_stem.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_stem.png new file mode 100644 index 00000000..0555bba0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower1.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower1.png new file mode 100644 index 00000000..cc893fa0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower1.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower2.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower2.png new file mode 100644 index 00000000..8b5d835e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower3.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower3.png new file mode 100644 index 00000000..610fbb10 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass.png new file mode 100644 index 00000000..a3fc8598 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass2.png new file mode 100644 index 00000000..0728fb8a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_litte_side.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litte_side.png new file mode 100644 index 00000000..184f3c8c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litte_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_litter.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litter.png new file mode 100644 index 00000000..8b20d0be Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_leaves.png new file mode 100644 index 00000000..111d0293 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_sapling.png new file mode 100644 index 00000000..3cd61cf6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk.png new file mode 100644 index 00000000..d4161b4b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk_top.png new file mode 100644 index 00000000..894bf819 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_wood.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_wood.png new file mode 100644 index 00000000..4b19eab9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_leaves.png new file mode 100644 index 00000000..84c0999c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_sapling.png new file mode 100644 index 00000000..26261779 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk.png new file mode 100644 index 00000000..fa86028c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk_top.png new file mode 100644 index 00000000..f4a92525 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_wood.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_wood.png new file mode 100644 index 00000000..889c36b3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock.png new file mode 100644 index 00000000..58428bf7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock_brick.png new file mode 100644 index 00000000..cb7ef7a4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins.png new file mode 100644 index 00000000..3aeb350f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins2.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins2.png new file mode 100644 index 00000000..a2194c5f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_door.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_door.png new file mode 100644 index 00000000..34e7442d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_fence_woode.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_fence_woode.png new file mode 100644 index 00000000..9eb46aa1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_fence_woode.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor.png new file mode 100644 index 00000000..09ecaefe Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor_side.png new file mode 100644 index 00000000..2431a742 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_door.png b/mods/naturalbiomes/textures/naturalbiomes_olive_door.png new file mode 100644 index 00000000..f486ff95 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_fence_woode.png b/mods/naturalbiomes/textures/naturalbiomes_olive_fence_woode.png new file mode 100644 index 00000000..07e04e3b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_fence_woode.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor.png new file mode 100644 index 00000000..b378fe7c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor_side.png new file mode 100644 index 00000000..5fd90a62 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_bush_stem.png b/mods/naturalbiomes/textures/naturalbiomes_outback_bush_stem.png new file mode 100644 index 00000000..137cc112 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_bush_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_door.png b/mods/naturalbiomes/textures/naturalbiomes_outback_door.png new file mode 100644 index 00000000..174e5b2f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_eukalyptus_wood.png b/mods/naturalbiomes/textures/naturalbiomes_outback_eukalyptus_wood.png new file mode 100644 index 00000000..592bd75b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_eukalyptus_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_ground.png b/mods/naturalbiomes/textures/naturalbiomes_outback_ground.png new file mode 100644 index 00000000..cd39a9ce Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_ground.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_ground2.png b/mods/naturalbiomes/textures/naturalbiomes_outback_ground2.png new file mode 100644 index 00000000..c39c3a3e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_ground2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_ground3.png b/mods/naturalbiomes/textures/naturalbiomes_outback_ground3.png new file mode 100644 index 00000000..60205b9b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_ground3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_rock.png b/mods/naturalbiomes/textures/naturalbiomes_outback_rock.png new file mode 100644 index 00000000..eda5a7cd Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_outback_rock_brick.png new file mode 100644 index 00000000..3490c4a2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor.png new file mode 100644 index 00000000..067ae942 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor_side.png new file mode 100644 index 00000000..850e237f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackbush_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_outbackbush_leaves.png new file mode 100644 index 00000000..3d3f4ad9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackbush_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeucalyptus_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeucalyptus_trunk.png new file mode 100644 index 00000000..48187be6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeucalyptus_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_leaves.png new file mode 100644 index 00000000..dd35d630 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_trunk_top.png new file mode 100644 index 00000000..fa5813ec Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeukaplyptus_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeukaplyptus_sapling.png new file mode 100644 index 00000000..614ac342 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeukaplyptus_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass.png new file mode 100644 index 00000000..8a6d9f5a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass2.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass2.png new file mode 100644 index 00000000..78796e8a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass3.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass3.png new file mode 100644 index 00000000..52ff54ea Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass4.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass4.png new file mode 100644 index 00000000..4e26289a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass4.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass5.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass5.png new file mode 100644 index 00000000..005e54b2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass5.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass6.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass6.png new file mode 100644 index 00000000..cc772d57 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass6.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbacklitter.png b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter.png new file mode 100644 index 00000000..83035a65 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbacklitter_side.png b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter_side.png new file mode 100644 index 00000000..fa65313d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_palm_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_palm_fence_wood.png new file mode 100644 index 00000000..b35a9027 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_palm_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_pine2_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_pine2_fence_wood.png new file mode 100644 index 00000000..19ea1009 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_pine2_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_pine_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_pine_fence_wood.png new file mode 100644 index 00000000..026de46a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_pine_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_leaves.png new file mode 100644 index 00000000..5081cb58 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_trunk.png new file mode 100644 index 00000000..8d01ff80 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_wood.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_wood.png new file mode 100644 index 00000000..3de04d4d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_sapling.png new file mode 100644 index 00000000..a5a211c3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_trunk_top.png new file mode 100644 index 00000000..2e3829b9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrass.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrass.png new file mode 100644 index 00000000..3cd54669 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrass2.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrass2.png new file mode 100644 index 00000000..7acc9d65 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrass3.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrass3.png new file mode 100644 index 00000000..702e922b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrasssmall.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrasssmall.png new file mode 100644 index 00000000..3b821335 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrasssmall.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannalitter.png b/mods/naturalbiomes/textures/naturalbiomes_savannalitter.png new file mode 100644 index 00000000..9241246d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannalitter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannalitter_side.png b/mods/naturalbiomes/textures/naturalbiomes_savannalitter_side.png new file mode 100644 index 00000000..46faacb6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannalitter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_leaves.png new file mode 100644 index 00000000..c6e64002 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_sapling.png new file mode 100644 index 00000000..9aae1723 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk.png new file mode 100644 index 00000000..b2d64c7b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk_top.png new file mode 100644 index 00000000..f061c7ad Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_wood.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_wood.png new file mode 100644 index 00000000..9861b7f4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_willow_door.png b/mods/naturalbiomes/textures/naturalbiomes_willow_door.png new file mode 100644 index 00000000..2010f598 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_willow_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor.png new file mode 100644 index 00000000..d2056651 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor_side.png new file mode 100644 index 00000000..c225a445 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor_side.png differ diff --git a/mods/naturalbiomes/wetsavanna.lua b/mods/naturalbiomes/wetsavanna.lua new file mode 100644 index 00000000..7342bdf9 --- /dev/null +++ b/mods/naturalbiomes/wetsavanna.lua @@ -0,0 +1,590 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:savannalitter", { + description = S("Wet Savanna dirt with Grass"), + tiles = {"naturalbiomes_savannalitter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_savannalitter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_biome({ + name = "naturalbiomes:wetsavanna", + node_top = "naturalbiomes:savannalitter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 5, + heat_point = 86, + humidity_point = 60, +}) + +-- +-- Everness +-- + +minetest.register_decoration({ + name = 'naturalbiomes:baobab_tree', + deco_type = 'schematic', + place_on = { + 'default:dry_dirt_with_dry_grass', + 'naturalbiomes:savannalitter', + }, + spawn_by = { + 'default:dry_dirt_with_dry_grass', + 'naturalbiomes:savannalitter', + }, + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.0001, + biomes = { + 'savanna', + }, + y_max = 31000, + y_min = 6, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts', + flags = 'place_center_x,place_center_z', + rotation = 'random', +}) + +local did_baobab = minetest.get_decoration_id('naturalbiomes:baobab_tree') +minetest.set_gen_notify('decoration',{ did_baobab }) +did_baobab = 'decoration#' .. did_baobab + +minetest.register_on_generated(function(minp, maxp) + if maxp.y > 4 then + -- + -- Baobab Tree - fix light + -- + local gennotify = minetest.get_mapgen_object('gennotify') + for _, pos in ipairs(gennotify[did_baobab] or {}) do + minetest.after(0.2,function() minetest.fix_light(pos:offset(-12, -1, -12), pos:offset(12, 39, 12)) end) + end + end +end) + +minetest.register_decoration({ + name = 'everness:baobab_savanna_baobab_log', + deco_type = 'schematic', + place_on = { + 'default:dry_dirt_with_dry_grass', + 'naturalbiomes:savannalitter', + }, + sidelen = 80, + place_offset_y = 1, + fill_ratio = 0.0001, + biomes = { 'savanna' }, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath('everness') .. '/schematics/everness_baobab_log.mts', + flags = 'place_center_x', + rotation = 'random', + spawn_by = { + 'default:dry_dirt_with_dry_grass', + 'naturalbiomes:savannalitter', + }, + num_spawn_by = 8, +}) + +-- Tree generation +-- + +-- New acacia tree + +local function grow_new_acacia_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 7, y = pos.y - 0, z = pos.z - 7}, modpath.."/schematics/naturalbiomes_acaciatree_0_180.mts", "0", nil, false) + +end + + +-- acacia trunk +minetest.register_node("naturalbiomes:acacia_trunk", { + description = S("Acacia Trunk"), + tiles = { + "naturalbiomes_savannaacaia_trunk_top.png", + "naturalbiomes_savannaacaia_trunk_top.png", + "naturalbiomes_savannaacacia_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- acacia wood +minetest.register_node("naturalbiomes:acacia_wood", { + description = S("Acacia Wood"), + tiles = {"naturalbiomes_savannaacacia_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:acacia_wood 4", + recipe = {{"naturalbiomes:acacia_trunk"}} +}) + +minetest.register_node("naturalbiomes:acacia_leaves", { + description = S("Acacia Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_savannaacacia_leaves.png"}, + special_tiles = {"naturalbiomes_savannaacacia_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:acacia_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:acacia_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:acacia_sapling", { + description = S("Acacia Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannaacaia_sapling.png"}, + inventory_image = "naturalbiomes_savannaacaia_sapling.png", + wield_image = "naturalbiomes_savannaacaia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_acacia_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:acacia_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_savannaacacia_wood", + "naturalbiomes:acacia_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannaacacia_wood.png"}, + S("Acacia Stair"), + S("Acacia Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_savannaacacia_trunk", + "naturalbiomes:acacia_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannaacaia_trunk_top.png", "naturalbiomes_savannaacaia_trunk_top.png", "naturalbiomes_savannaacacia_trunk.png"}, + S("Acacia Trunk Stair"), + S("Acacia Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_acacia_wood", + { + description = S("Acacia Wood Fence Gate"), + texture = "naturalbiomes_savannaacacia_wood.png", + material = "naturalbiomes:acacia_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_acacia_wood", + { + description = S("Acacia Fence"), + texture = "naturalbiomes_acacia_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_savannaacacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_savannaacacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_acacia_wood", + { + description = S("Acacia Fence Rail"), + texture = "naturalbiomes_acacia_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_savannaacacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_savannaacacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 2, + noise_params = { + offset = -0.25, + scale = -1.125, + spread = {x = 100, y = 100, z = 100}, + seed = 7777, + octaves = 3, + persist = 1.0 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "default:dry_dirt_with_dry_grass", + place_offset_y = -1, + flags = "force_placement", +}) + +minetest.register_decoration({ + name = "naturalbiomes:acacia_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"savanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_acaciatree_0_180.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:acacia_tree3", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"savanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_acaciatree3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:acacia_tree4", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"savanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_acaciatree4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + minetest.register_decoration({ + name = "naturalbiomes:savannagras", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_savannagrass1_0_90.mts", + }) + +minetest.register_node("naturalbiomes:savannagrass", { + description = S("Savanna Grass"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannagrass.png"}, + inventory_image = "naturalbiomes_savannagrass.png", + wield_image = "naturalbiomes_savannagrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:savannagrassmall", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_savannagrass2_0_90.mts", + }) + +minetest.register_node("naturalbiomes:savannagrasssmall", { + description = S("Savanna Grass"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannagrass.png"}, + inventory_image = "naturalbiomes_savannagrass.png", + wield_image = "naturalbiomes_savannagrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:savanna_flowergrass", + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"savanna"}, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:savanna_flowergrass", + }) + +minetest.register_node("naturalbiomes:savanna_flowergrass", { + description = S"Savanna Flowergrass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_savannagrasssmall.png"}, + inventory_image = "naturalbiomes_savannagrasssmall.png", + wield_image = "naturalbiomes_savannagrasssmall.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:savanna_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 1987, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:savanna_grass2", + }) + +minetest.register_node("naturalbiomes:savanna_grass2", { + description = S"Savanna Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_savannagrass2.png"}, + inventory_image = "naturalbiomes_savannagrass2.png", + wield_image = "naturalbiomes_savannagrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:savanna_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + fill_ratio = 0.1, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:savanna_grass3", + spawn_by = "naturalbiomes:savannalitter" + }) + +minetest.register_node("naturalbiomes:savanna_grass3", { + description = S"Savanna Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_savannagrass3.png"}, + inventory_image = "naturalbiomes_savannagrass3.png", + wield_image = "naturalbiomes_savannagrass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:acacia_log", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = 1, + sidelen = 16, + fill_ratio = 0.0005, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_acacia_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:savannalitter", + num_spawn_by = 8, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "naturalbiomes:savannalitter", + }, + sidelen = 16, + fill_ratio = 0.15, + y_max = 30000, + y_min = 1, + decoration = { + "default:dry_grass_2", + "default:dry_grass_3", + "default:dry_grass_4", + "default:dry_grass_5", + }, + biomes = "savanna" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dry_dirt_with_dry_grass", + }, + sidelen = 16, + fill_ratio = 0.75, + y_max = 30000, + y_min = 1, + decoration = { + "default:dry_grass_4", + "default:dry_grass_5", + }, + biomes = "savanna" + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.0005, + biomes = {"savanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) \ No newline at end of file diff --git a/mods/plantlife_modpack/.luacheckrc b/mods/plantlife_modpack/.luacheckrc new file mode 100644 index 00000000..a8b6e7c9 --- /dev/null +++ b/mods/plantlife_modpack/.luacheckrc @@ -0,0 +1,21 @@ +unused_args = false +allow_defined_top = true +max_line_length = 185 + +exclude_files = {".luacheckrc"} + +globals = { + "biome_lib", + "bushes_classic", +} + +read_globals = { + table = {fields = {"copy"}}, + + "minetest", "ItemStack", + "vector", + + "default", + "moretrees", + "dump", +} diff --git a/mods/plantlife_modpack/LICENSE b/mods/plantlife_modpack/LICENSE new file mode 100644 index 00000000..624a8eca --- /dev/null +++ b/mods/plantlife_modpack/LICENSE @@ -0,0 +1,603 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +These licenses apply to all modules and components in this modpack, +unless otherwise stated. + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.†The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/plantlife_modpack/README b/mods/plantlife_modpack/README new file mode 100644 index 00000000..8c62e494 --- /dev/null +++ b/mods/plantlife_modpack/README @@ -0,0 +1,72 @@ +README file for Plantlife mod, by Vanessa Ezekowitz +--------------------------------------------------- + +Plantlife is a combined form of my Flowers and Poison Ivy mods and an expanded +version of the old Bushes mod, now called bushes_classic. The entire package +has been significantly rewritten and re-organized. This mod supplies all +three of these components and should be 100% compatible with mods that used +the old versions. + +Its purpose is to add various kinds of flowers, cotton plants, water foliage, +poison ivy, and fruit bushes, obviously. :-) All of these are spawned as +normal nodes and can be collected and used in any recipes that depend on the +old mods. + +Spawning of plants is sensitive to the amount of available light. Flowers, +cotton, and waterlilies only spawn when there at least a signficant amount of +light. Seaweed will grow only in dimly-lit areas. Poison ivy also grows only +in the daytime, but require less light than flowers. + +Growing of poison ivy will only occur for plants that are on the same surface +that is necessary for them to spawn on, so they won't grow if placed on e.g. +cobble or homedecor flower pot, etc. This doesn't affect wall-climbing poison +ivy, since it uses a different growth pattern. + +All plants use multiple controls provided by biome_lib, to keep where they +grow under control - no more random spread of plants! In addition, the density +of the plants in any region they appear in has been fixed and brought under +control. + +Poison ivy is found sparsely among junglegrass, but will not grow near flowers. + +------------------------------------------------------------------------------ + +Important details: + +Configuration: Any of the three components of this mod can be disabled +by just removing their respective directories. + +Dependencies: Just the game's default stuff. + +Recommends: Nothing in particular. + +Conflicts: This mod should not be installed alongside the original, separate +Poison Ivy, or old Bushes mods. If those exist, delete them, as this mod +supplies their functionality. If you still use the old Jungle Grass mod +either as previously supplied with this modpack, or in its standalone form, +you'll want to delete the "junglegrass" directory from this modpack to get rid +of the aliases-to-air that it supplies. + +Software Requirements: This mod requires Minetest 0.4.11 or later. It is +unlikely to work with old versions. + +------------------------------------------------------------------------------ + +Crafting: + +For crafting recipes, please see the forum thread for this modpack: + +https://forum.minetest.net/viewtopic.php?f=11&t=3898 + +------------------------------------------------------------------------------ + +Notes: + +Poison Ivy will spawn on grass and in some cases, on vertical surfaces +including trees and jungle trees where they meet the dirt or grass. Ivy +previously spawned on the ground taller/thicker or start climbing up said +vertical surfaces and trees. + +At present, the poison ivy presents little more than an annoyance - they can +only be cut down and either re-planted or thrown away. No damage is done by +harvesting them, yet. ;-) diff --git a/mods/plantlife_modpack/copyright.txt b/mods/plantlife_modpack/copyright.txt new file mode 100644 index 00000000..63d2431b --- /dev/null +++ b/mods/plantlife_modpack/copyright.txt @@ -0,0 +1,10 @@ +Ironzorg's Flowers mod served as the basis for the three mods that eventually +went into creating this file. Any code still remaining from that mod is +entirely his work (though I'm pretty sure it's all been phased out). + +Flowers textures by Ironzorg. + +Junglegrass textures are modified copies of the original one from the game's +default set. + +All remaining code, textures, etc. by Vanessa Ezekowitz. diff --git a/mods/plantlife_modpack/ferns/crafting.lua b/mods/plantlife_modpack/ferns/crafting.lua new file mode 100644 index 00000000..db419ef5 --- /dev/null +++ b/mods/plantlife_modpack/ferns/crafting.lua @@ -0,0 +1,109 @@ +-- support for i18n +local S = minetest.get_translator("ferns") +----------------------------------------------------------------------------------------------- +-- Ferns - Crafting 0.0.5 +----------------------------------------------------------------------------------------------- +-- (by Mossmanikin) +----------------------------------------------------------------------------------------------- + +local fern1 = minetest.registered_items["default:fern_1"] or false +fern1 = (fern1 and fern1.name) or "ferns:fern_01" + + +minetest.register_craft({ + type = "shapeless", + output = "ferns:fiddlehead 3", + recipe = {"ferns:fern_01"}, + replacements = { + {fern1, "ferns:ferntuber"} + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "ferns:fiddlehead 3", + recipe = {"ferns:tree_fern_leaves"}, + replacements = { + {"ferns:tree_fern_leaves", "ferns:sapling_tree_fern"} + }, +}) +----------------------------------------------------------------------------------------------- +-- FIDDLEHEAD +----------------------------------------------------------------------------------------------- +minetest.register_alias("archaeplantae:fiddlehead", "ferns:fiddlehead") + +minetest.register_craftitem("ferns:fiddlehead", { + description = S("Fiddlehead"), + inventory_image = "ferns_fiddlehead.png", + on_use = minetest.item_eat(-1), -- slightly poisonous when raw +}) +minetest.register_craft({ + type = "cooking", + output = "ferns:fiddlehead_roasted", + recipe = "ferns:fiddlehead", + cooktime = 1, +}) +minetest.register_craftitem("ferns:fiddlehead_roasted", { + description = S("Roasted Fiddlehead"), + inventory_image = "ferns_fiddlehead_roasted.png", + on_use = minetest.item_eat(1), -- edible when cooked +}) +----------------------------------------------------------------------------------------------- +-- FERN TUBER +----------------------------------------------------------------------------------------------- +minetest.register_alias("archaeplantae:ferntuber", "ferns:ferntuber") + +minetest.register_craftitem("ferns:ferntuber", { + description = S("Fern Tuber"), + inventory_image = "ferns_ferntuber.png", +}) +minetest.register_craft({ + type = "cooking", + output = "ferns:ferntuber_roasted", + recipe = "ferns:ferntuber", + cooktime = 3, +}) + +minetest.register_alias("archaeplantae:ferntuber_roasted", "ferns:ferntuber_roasted") + +minetest.register_craftitem("ferns:ferntuber_roasted", { + description = S("Roasted Fern Tuber"), + inventory_image = "ferns_ferntuber_roasted.png", + on_use = minetest.item_eat(3), +}) +----------------------------------------------------------------------------------------------- +-- HORSETAIL (EQUISETUM) --> GREEN DYE https://en.wikipedia.org/wiki/Equisetum +----------------------------------------------------------------------------------------------- +minetest.register_craft({ + type = "shapeless", + output = "dye:green", + recipe = {"group:horsetail"}, +}) +----------------------------------------------------------------------------------------------- +-- GLUE WOODEN TOOLS with RESIN & POLISH them with HORSETAIL (planned) +----------------------------------------------------------------------------------------------- +--[[minetest.register_craft({ + type = "shapeless", + output = "default:pick_wood", + recipe = {"default:pick_wood","group:horsetail","farming:string","default:stick"}, +}) +minetest.register_craft({ + type = "shapeless", + output = "default:shovel_wood", + recipe = {"default:shovel_wood","group:horsetail","farming:string","default:stick"}, +}) +minetest.register_craft({ + type = "shapeless", + output = "default:axe_wood", + recipe = {"default:axe_wood","group:horsetail","farming:string","default:stick"}, +}) +minetest.register_craft({ + type = "shapeless", + output = "default:sword_wood", + recipe = {"default:sword_wood","group:horsetail","farming:string","default:stick"}, +}) +minetest.register_craft({ + type = "shapeless", + output = "farming:hoe_wood", + recipe = {"farming:hoe_wood","group:horsetail","farming:string","default:stick"}, +})]] diff --git a/mods/plantlife_modpack/ferns/fern.lua b/mods/plantlife_modpack/ferns/fern.lua new file mode 100644 index 00000000..f29e459d --- /dev/null +++ b/mods/plantlife_modpack/ferns/fern.lua @@ -0,0 +1,215 @@ +----------------------------------------------------------------------------------------------- +-- Ferns - Fern 0.1.0 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: default, flowers, painting, trees +-- Dependencies: biome_lib +-- Supports: dryplants, stoneage, sumpf +----------------------------------------------------------------------------------------------- +-- some inspiration from here +-- https://en.wikipedia.org/wiki/Athyrium_yokoscense +-- http://www.mygarden.net.au/gardening/athyrium-yokoscense/3900/1 +----------------------------------------------------------------------------------------------- + +assert(abstract_ferns.config.enable_lady_fern == true) + +-- support for i18n +local S = minetest.get_translator("ferns") + +-- Maintain backward compatibilty +-- minetest-0.5: Begin +local default_ferns = minetest.registered_items["default:fern_1"] or false +if default_ferns then + minetest.register_alias("ferns:fern_03", "default:fern_3") + minetest.register_alias("ferns:fern_02", "default:fern_2") + minetest.register_alias("ferns:fern_01", "default:fern_1") +end +-- minetest-0.5: End +minetest.register_alias("archaeplantae:fern", "ferns:fern_03") +minetest.register_alias("archaeplantae:fern_mid", "ferns:fern_02") +minetest.register_alias("archaeplantae:fern_small", "ferns:fern_01") +minetest.register_alias("ferns:fern_04", "ferns:fern_02") -- for placing + +local nodenames = {} + +local function create_nodes() + local images = { "ferns_fern.png", "ferns_fern_mid.png", "ferns_fern_big.png" } + local vscales = { 1, math.sqrt(8), math.sqrt(11) } + local descs = { S("Lady-fern (Athyrium)"), nil, nil } + + for i = 1, 3 do + local node_on_place = nil + if i == 1 then + node_on_place = function(itemstack, placer, pointed_thing) + -- place a random fern + local stack = ItemStack("ferns:fern_0"..math.random(1,4)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("ferns:fern_01 "..itemstack:get_count()-(1-ret:get_count())) -- TODO FIXME? + end + end + nodenames[i] = "ferns:fern_"..string.format("%02d", i) + minetest.register_node(nodenames[i], { + description = descs[i] or (S("Lady-fern (Athyrium)").." " .. string.format("%02d", i)), + inventory_image = "ferns_fern.png", + drawtype = "plantlike", + visual_scale = vscales[i], + paramtype = "light", + tiles = { images[i] }, + walkable = false, + buildable_to = true, + groups = {snappy=3,flammable=2,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, + drop = "ferns:fern_01", + on_place = node_on_place + }) + end +end + +----------------------------------------------------------------------------------------------- +-- Init +----------------------------------------------------------------------------------------------- + +if default_ferns then + for i = 1, 3 do + nodenames[i] = "ferns:fern_"..string.format("%02d", i) + end +else + create_nodes() +end + +----------------------------------------------------------------------------------------------- +-- Spawning +----------------------------------------------------------------------------------------------- + +if abstract_ferns.config.lady_ferns_near_tree == true then + biome_lib.register_on_generate({ -- near trees (woodlands) + surface = { + "default:dirt_with_grass", + "default:mossycobble", + "default:desert_sand", + "default:sand", + "default:jungletree", + "stoneage:grass_with_silex", + "sumpf:sumpf" + }, + max_count = 30, + rarity = 62,--63, + min_elevation = 1, -- above sea level + near_nodes = {"group:tree"}, + near_nodes_size = 3,--4, + near_nodes_vertical = 2,--3, + near_nodes_count = 1, + plantlife_limit = -0.9, + humidity_max = -1.0, + humidity_min = 0.4, + temp_max = -0.5, -- 55 °C (too hot?) + temp_min = 0.75, -- -12 °C + random_facedir = { 0, 179 }, + }, + nodenames + ) +end + +if abstract_ferns.config.lady_ferns_near_rock == true then + biome_lib.register_on_generate({ -- near stone (mountains) + surface = { + "default:dirt_with_grass", + "default:mossycobble", + "group:falling_node", + --"default:jungletree", + "stoneage:grass_with_silex", + "sumpf:sumpf" + }, + max_count = 35, + rarity = 40, + min_elevation = 1, -- above sea level + near_nodes = {"group:stone"}, + near_nodes_size = 1, + near_nodes_count = 16, + plantlife_limit = -0.9, + humidity_max = -1.0, + humidity_min = 0.4, + temp_max = -0.5, -- 55 °C (too hot?) + temp_min = 0.75, -- -12 °C + random_facedir = { 0, 179 }, + }, + nodenames + ) +end + +if abstract_ferns.config.lady_ferns_near_ores == true then -- this one causes a huge fps drop + biome_lib.register_on_generate({ -- near ores (potential mining sites) + surface = { + "default:dirt_with_grass", + "default:mossycobble", + "default:stone_with_coal", + "default:stone_with_iron", + "default:stone_with_tin", -- minetest >= 0.4.16 + "moreores:mineral_tin", + "moreores:mineral_silver", + "sumpf:sumpf" + }, + max_count = 1200,--1600, -- maybe too much? :D + rarity = 25,--15, + min_elevation = 1, -- above sea level + near_nodes = { + "default:stone_with_iron", + --"default:stone_with_copper", + --"default:stone_with_mese", + --"default:stone_with_gold", + --"default:stone_with_diamond", + "default:stone_with_tin", -- minetest >= 0.4.16 + "moreores:mineral_tin", + "moreores:mineral_silver" + --"moreores:mineral_mithril" + }, + near_nodes_size = 2, + near_nodes_vertical = 4,--5,--6, + near_nodes_count = 2,--3, + plantlife_limit = -0.9, + humidity_max = -1.0, + humidity_min = 0.4, + temp_max = -0.5, -- 55 °C (too hot?) + temp_min = 0.75, -- -12 °C + random_facedir = { 0, 179 }, + }, + nodenames + ) +end + +if abstract_ferns.config.lady_ferns_in_groups == true then -- this one is meant as a replacement of Ferns_near_Ores + biome_lib.register_on_generate({ + surface = { + "default:dirt_with_grass", + "default:mossycobble", + "default:stone_with_coal", + "default:stone_with_iron", + "default:stone_with_tin", -- minetest >= 0.4.16 + "moreores:mineral_tin", + "moreores:mineral_silver", + "sumpf:sumpf" + }, + max_count = 70, + rarity = 25,--15, + min_elevation = 1, -- above sea level + near_nodes = { + "default:stone" + }, + near_nodes_size = 2, + near_nodes_vertical = 2,--6, + near_nodes_count = 3, + plantlife_limit = -0.9, + humidity_max = -1.0, + humidity_min = 0.4, + temp_max = -0.5, -- 55 °C (too hot?) + temp_min = 0.75, -- -12 °C + random_facedir = { 0, 179 }, + }, + nodenames + ) +end diff --git a/mods/plantlife_modpack/ferns/gianttreefern.lua b/mods/plantlife_modpack/ferns/gianttreefern.lua new file mode 100644 index 00000000..b0077891 --- /dev/null +++ b/mods/plantlife_modpack/ferns/gianttreefern.lua @@ -0,0 +1,351 @@ +----------------------------------------------------------------------------------------------- +-- Ferns - Giant Tree Fern 0.1.1 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: 4seasons, default +-- Supports: vines +----------------------------------------------------------------------------------------------- + +assert(abstract_ferns.config.enable_giant_treefern == true) + +-- support for i18n +local S = minetest.get_translator("ferns") +-- lot of code, lot to load + +function abstract_ferns.can_grow_giant_tree_fern(pos) + local node_name = minetest.get_node(pos).name + if node_name ~= "air" and node_name ~= "ferns:sapling_giant_tree_fern" and node_name ~= "default:junglegrass" then + return false + end + + local below_name = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)).name + if minetest.get_item_group(below_name, "soil") == 0 and minetest.get_item_group(below_name, "sand") == 0 then + return false + end + + local light = minetest.get_node_light(pos, 0.5) + if light <= 8 then + return false + end + + return true +end + +abstract_ferns.grow_giant_tree_fern = function(pos) + local pos_aux = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(pos_aux).name + if name ~= "air" and name ~= "ferns:sapling_giant_tree_fern" + and name ~= "default:junglegrass" then + return + end + + local size = math.random(12,16) -- min of range must be >= 4 + + local leafchecks = { + { + direction = 3, + positions = { + {x = pos.x + 1, y = pos.y + size - 1, z = pos.z }, + {x = pos.x + 2, y = pos.y + size , z = pos.z }, + {x = pos.x + 3, y = pos.y + size - 1, z = pos.z }, + {x = pos.x + 4, y = pos.y + size - 2, z = pos.z } + } + }, + { + direction = 1, + positions = { + {x = pos.x - 1, y = pos.y + size - 1, z = pos.z }, + {x = pos.x - 2, y = pos.y + size, z = pos.z }, + {x = pos.x - 3, y = pos.y + size - 1, z = pos.z }, + {x = pos.x - 4, y = pos.y + size - 2, z = pos.z } + } + }, + { + direction = 2, + positions = { + {x = pos.x , y = pos.y + size - 1, z = pos.z + 1}, + {x = pos.x , y = pos.y + size , z = pos.z + 2}, + {x = pos.x , y = pos.y + size - 1, z = pos.z + 3}, + {x = pos.x , y = pos.y + size - 2, z = pos.z + 4} + } + }, + { + direction = 0, + positions = { + {x = pos.x , y = pos.y + size - 1, z = pos.z - 1}, + {x = pos.x , y = pos.y + size , z = pos.z - 2}, + {x = pos.x , y = pos.y + size - 1, z = pos.z - 3}, + {x = pos.x , y = pos.y + size - 2, z = pos.z - 4} + } + } + } + + local brk = false + for i = 1, size-3 do + pos_aux.y = pos.y + i + local nodename = minetest.get_node(pos_aux).name + if not (nodename == "air" or (i == 1 and nodename == "ferns:sapling_giant_tree_fern")) then + brk = true + break + end + minetest.swap_node({x = pos.x, y = pos.y + i, z = pos.z}, {name="ferns:fern_trunk_big"}) + end + if not brk then + minetest.swap_node({x = pos.x, y = pos.y + size-2, z = pos.z}, {name="ferns:fern_trunk_big_top"}) + minetest.swap_node({x = pos.x, y = pos.y + size-1, z = pos.z}, {name="ferns:tree_fern_leaves_giant"}) + + -- all the checking for air below is to prevent some ugly bugs (incomplete trunks of neighbouring trees), it's a bit slower, but worth the result + + -- assert(#leafchecks == 4) + for i = 1, 4 do + local positions = leafchecks[i].positions + local rot = leafchecks[i].direction + local endpos = 4 -- If the loop below adds all intermediate leaves then the "terminating" leaf will be at positions[4] + -- assert(#positions == 4) + -- add leaves so long as the destination nodes are air + for j = 1, 3 do + if minetest.get_node(positions[j]).name == "air" then + minetest.swap_node(positions[j], {name="ferns:tree_fern_leave_big"}) + else + endpos = j + break + end + end + -- add the terminating leaf if required and possible + if endpos == 4 and minetest.get_node(positions[endpos]).name == "air" then + minetest.swap_node(positions[endpos], {name="ferns:tree_fern_leave_big_end", param2=rot}) + end + end + end +end + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN LEAVES +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:tree_fern_leaves_giant", { + description = S("Tree Fern Crown (Dicksonia)"), + drawtype = "plantlike", + visual_scale = math.sqrt(11), + wield_scale = {x=0.175, y=0.175, z=0.175}, + paramtype = "light", + tiles = {"ferns_fern_tree_giant.png"}, + inventory_image = "ferns_fern_tree.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + attached_node=1, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = { + max_items = 2, + items = { + { + -- occasionally, drop a second sapling instead of leaves + -- (extra saplings can also be obtained by replanting and + -- reharvesting leaves) + items = {"ferns:sapling_giant_tree_fern"}, + rarity = 10, + }, + { + items = {"ferns:sapling_giant_tree_fern"}, + }, + { + items = {"ferns:tree_fern_leaves_giant"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN LEAVE PART +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:tree_fern_leave_big", { + description = S("Giant Tree Fern Leaves"), + drawtype = "raillike", + paramtype = "light", + tiles = { + "ferns_tree_fern_leave_big.png", + }, + walkable = false, + groups = { + snappy=3, + flammable=2, + attached_node=1, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = "", + sounds = default.node_sound_leaves_defaults(), + after_destruct = function(pos,oldnode) + for _, d in pairs({{x=-1,z=0},{x=1,z=0},{x=0,z=-1},{x=0,z=1}}) do + local node = minetest.get_node({x=pos.x+d.x,y=pos.y+1,z=pos.z+d.z}) + if node.name == "ferns:tree_fern_leave_big" then + minetest.dig_node({x=pos.x+d.x,y=pos.y+1,z=pos.z+d.z}) + end + end + end, +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN LEAVE END +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:tree_fern_leave_big_end", { + description = S("Giant Tree Fern Leave End"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = { "ferns_tree_fern_leave_big_end.png" }, + use_texture_alpha = "clip", + walkable = false, + node_box = { + type = "fixed", +-- {left, bottom, front, right, top, back } + fixed = {-1/2, -1/2, 1/2, 1/2, 33/64, 1/2}, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, 1/2, 1/2, 33/64, 1/2}, + }, + groups = { + snappy=3, + flammable=2, + attached_node=1, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = "", + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN TRUNK TOP +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:fern_trunk_big_top", { + description = S("Giant Fern Trunk"), + drawtype = "nodebox", + paramtype = "light", + tiles = { + "ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png", + "ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png", + "ferns_fern_trunk_big.png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", +-- {left, bottom, front, right, top, back } + fixed = { + {-1/2, 33/64, -1/2, 1/2, 33/64, 1/2}, + {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + } + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + }, + groups = { + tree=1, + choppy=2, + oddly_breakable_by_hand=2, + flammable=3, + wood=1, + not_in_creative_inventory=1, + leafdecay=3 -- to support vines + }, + is_ground_content = false, + drop = "ferns:fern_trunk_big", + sounds = default.node_sound_wood_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN TRUNK +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:fern_trunk_big", { + description = S("Giant Fern Trunk"), + drawtype = "nodebox", + paramtype = "light", + tiles = { + "ferns_fern_trunk_big_top.png", + "ferns_fern_trunk_big_top.png", + "ferns_fern_trunk_big.png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + }, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + after_destruct = function(pos,oldnode) + local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if node.name == "ferns:fern_trunk_big" or node.name == "ferns:fern_trunk_big_top" then + minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z}) + minetest.add_item(pos,"ferns:fern_trunk_big") + end + end, +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN SAPLING +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:sapling_giant_tree_fern", { + description = S("Giant Tree Fern Sapling"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"ferns_sapling_tree_fern_giant.png"}, + inventory_image = "ferns_sapling_tree_fern_giant.png", + walkable = false, + groups = {snappy=3,flammable=2,flora=1,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) + +-- abm +minetest.register_abm({ + nodenames = "ferns:sapling_giant_tree_fern", + interval = 1000, + chance = 4, + action = function(pos, node, _, _) + if abstract_ferns.can_grow_giant_tree_fern(pos) then + abstract_ferns.grow_giant_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + end + end +}) + +----------------------------------------------------------------------------------------------- +-- GENERATE GIANT TREE FERN +----------------------------------------------------------------------------------------------- + +minetest.register_decoration({ + deco_type = "schematic", + place_on = { + "ethereal:grove_dirt", + "default:dirt_with_rainforest_litter", + "bambooforest:dirt_with_bamboo", + }, + sidelen = 80, + fill_ratio = 0.00045, + biomes = { + "rainforest", + "grove", + }, + y_min = 3, + y_max = 31000, + place_offset_y = 1, + schematic = minetest.get_modpath("ferns") .. "/schematics/tree_fern.mts", + flags = "place_center_x, place_center_z,force_placement", +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/ferns/horsetail.lua b/mods/plantlife_modpack/ferns/horsetail.lua new file mode 100644 index 00000000..50a0c256 --- /dev/null +++ b/mods/plantlife_modpack/ferns/horsetail.lua @@ -0,0 +1,94 @@ +----------------------------------------------------------------------------------------------- +-- Archae Plantae - Horsetail 0.0.5 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: default, flowers, trees +-- Dependencies: biome_lib +-- Supports: dryplants, stoneage, sumpf +----------------------------------------------------------------------------------------------- + +assert(abstract_ferns.config.enable_horsetails == true) + +-- support for i18n +local S = minetest.get_translator("ferns") +----------------------------------------------------------------------------------------------- +-- HORSETAIL (EQUISETUM) +----------------------------------------------------------------------------------------------- + +local node_names = {} + +local function create_nodes() + local selection_boxes = { + { -0.15, -1/2, -0.15, 0.15, -1/16, 0.15 }, + { -0.15, -1/2, -0.15, 0.15, 1/16, 0.15 }, + { -0.15, -1/2, -0.15, 0.15, 4/16, 0.15 }, + { -0.15, -1/2, -0.15, 0.15, 7/16, 0.15 }, + } + + for i = 1, 4 do + local node_name = "ferns:horsetail_" .. string.format("%02d", i) + local node_img = "ferns_horsetail_" .. string.format("%02d", i) .. ".png" + local node_desc + local node_on_use = nil + local node_drop = "ferns:horsetail_04" + + if i == 1 then + node_desc = S("Young Horsetail (Equisetum) @1", 1) + node_on_use = minetest.item_eat(1) -- young ones edible https://en.wikipedia.org/wiki/Equisetum + node_drop = node_name + elseif i == 4 then + node_desc = S("Horsetail (Equisetum)") + else + node_desc = S("Horsetail (Equisetum) @1", i) + end + + node_names[i] = node_name + + minetest.register_node(node_name, { + description = node_desc, + drawtype = "plantlike", + paramtype = "light", + tiles = { node_img }, + inventory_image = node_img, + walkable = false, + buildable_to = true, + groups = {snappy=3,flammable=2,attached_node=1,horsetail=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = selection_boxes[i], + }, + on_use = node_on_use, + drop = node_drop, + }) + end +end + +----------------------------------------------------------------------------------------------- +-- Init +----------------------------------------------------------------------------------------------- + +create_nodes() + +----------------------------------------------------------------------------------------------- +-- Generating +----------------------------------------------------------------------------------------------- + +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:coniferous_litter", + }, + sidelen = 80, + fill_ratio = 0.0011, + y_min = 1, + y_max = 31000, + decoration = { + "ferns:horsetail_01", + "ferns:horsetail_02", + "ferns:horsetail_03", + "ferns:horsetail_04", + } +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/ferns/init.lua b/mods/plantlife_modpack/ferns/init.lua new file mode 100644 index 00000000..14249b34 --- /dev/null +++ b/mods/plantlife_modpack/ferns/init.lua @@ -0,0 +1,21 @@ +abstract_ferns = {} + +dofile(minetest.get_modpath("ferns").."/settings.lua") + +if abstract_ferns.config.enable_lady_fern == true then + dofile(minetest.get_modpath("ferns").."/fern.lua") +end + +if abstract_ferns.config.enable_horsetails == true then + dofile(minetest.get_modpath("ferns").."/horsetail.lua") +end + +if abstract_ferns.config.enable_treefern == true then + dofile(minetest.get_modpath("ferns").."/treefern.lua") +end + +if abstract_ferns.config.enable_giant_treefern == true then + dofile(minetest.get_modpath("ferns").."/gianttreefern.lua") +end + +dofile(minetest.get_modpath("ferns").."/crafting.lua") diff --git a/mods/plantlife_modpack/ferns/locale/ferns.de.tr b/mods/plantlife_modpack/ferns/locale/ferns.de.tr new file mode 100644 index 00000000..ed949453 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.de.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Geigenkopf +Roasted Fiddlehead=Gerösteter Geigenkopf +Fern Tuber=Farnknolle +Roasted Fern Tuber=Geröstete Farnknolle +Lady-fern (Athyrium)=Frauenfarn (Athyrium) +Giant Tree Fern Leaves=Riesige Baumfarnblätter +Giant Tree Fern Leave End=Riesiges Baumfarnblattende +Giant Fern Trunk=Riesiger Baumfarnstamm +Giant Tree Fern Sapling=Riesiger Baumfarnsetzling +Tree Fern Crown (Dicksonia)=Baumfarnkrone (Dicksonia) +Young Horsetail (Equisetum) @1=Junger Schachtelhalm (Equisetum) @1 +Horsetail (Equisetum)=Schachtelhalm (Equisetum) +Horsetail (Equisetum) @1= Schachtelhalm (Equisetum) @1 +Fern Trunk (Dicksonia)=Farnstamm (Dicksonia) +Tree Fern Sapling (Dicksonia)=Baumfarnsetzling (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/ferns.eo.tr b/mods/plantlife_modpack/ferns/locale/ferns.eo.tr new file mode 100644 index 00000000..11d0893f --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.eo.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Filika Supro +Roasted Fiddlehead=Rostita Filika Supro +Fern Tuber=Filika Tubero +Roasted Fern Tuber=Rostita Filika Tubero +Lady-fern (Athyrium)=Afiriumo (Athyrium) +Giant Tree Fern Leaves=Folioj de Giganta Arba Filiko +Giant Tree Fern Leave End=Folifino de Giganta Arba Filiko +Giant Fern Trunk=Trunko de Giganta Arba Filiko +Giant Tree Fern Sapling=Arbido de Giganta Arba Filiko +Tree Fern Crown (Dicksonia)=Krono de Arba Filiko +Young Horsetail (Equisetum) @1=Juna Ekvizeto (Equisetum) @1 +Horsetail (Equisetum)=Ekvizeto (Equisetum) +Horsetail (Equisetum) @1=Ekvizeto (Equisetum) @1 +Fern Trunk (Dicksonia)=Trunko de Arba Filiko (Dicksonia) +Tree Fern Sapling (Dicksonia)=Arbido de Arba Filiko (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/ferns.fr.tr b/mods/plantlife_modpack/ferns/locale/ferns.fr.tr new file mode 100644 index 00000000..f7364f5c --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.fr.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Crosse de fougère +Roasted Fiddlehead=Crosse de fougère rôtie +Fern Tuber=Tubercule de fougère +Roasted Fern Tuber=Tubercule de fougère rôti +Lady-fern (Athyrium)=Fougère (Athyrium) +Giant Tree Fern Leaves=Feuilles de fougère géante +Giant Tree Fern Leave End=Feuilles de fougère géante (extrémité) +Giant Fern Trunk=Tronc de fougère géante +Giant Tree Fern Sapling=Pousse de fougère géante +Tree Fern Crown (Dicksonia)=Fougère en couronne (Dicksonia) +Young Horsetail (Equisetum) @1=Pousse de prêle (Equisetum) @1 +Horsetail (Equisetum)=Prêle (Equisetum) +Horsetail (Equisetum) @1=Prêle (Equisetum) @1 +Fern Trunk (Dicksonia)=Tronc de fougère en couronne (Dicksonia) +Tree Fern Sapling (Dicksonia)=Pousse de fougère en couronne (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/template.txt b/mods/plantlife_modpack/ferns/locale/template.txt new file mode 100644 index 00000000..80002575 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead= +Roasted Fiddlehead= +Fern Tuber= +Roasted Fern Tuber= +Lady-fern (Athyrium)= +Giant Tree Fern Leaves= +Giant Tree Fern Leave End= +Giant Fern Trunk= +Giant Tree Fern Sapling= +Tree Fern Crown (Dicksonia)= +Young Horsetail (Equisetum) @1= +Horsetail (Equisetum)= +Horsetail (Equisetum) @1= +Fern Trunk (Dicksonia)= +Tree Fern Sapling (Dicksonia)= diff --git a/mods/plantlife_modpack/ferns/mod.conf b/mods/plantlife_modpack/ferns/mod.conf new file mode 100644 index 00000000..a332a595 --- /dev/null +++ b/mods/plantlife_modpack/ferns/mod.conf @@ -0,0 +1,2 @@ +name = ferns +depends = default, abdecor diff --git a/mods/plantlife_modpack/ferns/schematics/tree_fern.mts b/mods/plantlife_modpack/ferns/schematics/tree_fern.mts new file mode 100644 index 00000000..61e910ed Binary files /dev/null and b/mods/plantlife_modpack/ferns/schematics/tree_fern.mts differ diff --git a/mods/plantlife_modpack/ferns/settings.lua b/mods/plantlife_modpack/ferns/settings.lua new file mode 100644 index 00000000..760730d1 --- /dev/null +++ b/mods/plantlife_modpack/ferns/settings.lua @@ -0,0 +1,43 @@ +-- In case you don't wanna have errors: + +-- Only change what's behind a "=" (or "--"). +-- Don't use caps (behind a "="). + +-- If there's a "false" (behind a "=") you can change it to "true" (and the other way around). +-- Spelling is important. +-- If "true" or "false" is necessary as setting, everything(!) which is not spelled "true" will be read as if it were "false" (even "1", "True"...) + +-- If you wanna comment something (for example to remember the default value), you can do this by putting "--" in front of the comment. +-- You can put "--" at the end of a line with "=" in it, or at the beginning of an empty/new line (minetest will ignore what's behind it then). +-- But don't put "--" in front of a line with "=" in it (or else minetest will ignore the setting and you might get an error). + +-- If something is still unclear, don't hesitate to post your question @ https://forum.minetest.net/viewtopic.php?id=6921 + +abstract_ferns.config = {} + +-- Which plants should generate/spawn? +abstract_ferns.config.enable_lady_fern = false +abstract_ferns.config.enable_horsetails = true +abstract_ferns.config.enable_treefern = false +abstract_ferns.config.enable_giant_treefern = true + +-- Where should they generate/spawn? (if they generate/spawn) +-- +-- Lady-Fern +abstract_ferns.config.lady_ferns_near_tree = true +abstract_ferns.config.lady_ferns_near_rock = true +abstract_ferns.config.lady_ferns_near_ores = true -- if there's a bunch of ferns there's ores nearby, this one causes a huge fps drop +abstract_ferns.config.lady_ferns_in_groups = false -- this one is meant as a replacement of Ferns_near_Ores: ferns tend to generate in groups, less fps drop, no hint for nearby ores +-- +-- Horsetails +abstract_ferns.config.enable_horsetails_spawning = false -- horsetails will grow in already explored areas, over time, near water or gravel +abstract_ferns.config.enable_horsetails_on_grass = true -- on dirt with grass and swamp (sumpf mod) +abstract_ferns.config.enable_horsetails_on_stones = true -- on gravel, mossy cobble and silex (stoneage mod) +-- +-- Tree_Fern +abstract_ferns.config.enable_treeferns_in_jungle = true +abstract_ferns.config.enable_treeferns_in_oases = true -- for oases and tropical beaches +-- +-- Giant_Tree_Fern +abstract_ferns.config.enable_giant_treeferns_in_jungle = true +abstract_ferns.config.enable_giant_treeferns_in_oases = true -- for oases and tropical beaches diff --git a/mods/plantlife_modpack/ferns/textures/ferns_5.png b/mods/plantlife_modpack/ferns/textures/ferns_5.png new file mode 100644 index 00000000..7e406651 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_5.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_6.png b/mods/plantlife_modpack/ferns/textures/ferns_6.png new file mode 100644 index 00000000..107bbf6e Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_6.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_7.png b/mods/plantlife_modpack/ferns/textures/ferns_7.png new file mode 100644 index 00000000..b1ac1f51 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_7.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_8.png b/mods/plantlife_modpack/ferns/textures/ferns_8.png new file mode 100644 index 00000000..db5510ba Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_8.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern.png b/mods/plantlife_modpack/ferns/textures/ferns_fern.png new file mode 100644 index 00000000..7884e5a3 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_big.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_big.png new file mode 100644 index 00000000..42deb953 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_big.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_mid.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_mid.png new file mode 100644 index 00000000..32133088 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_mid.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree.png new file mode 100644 index 00000000..8daeafd8 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png new file mode 100644 index 00000000..bc9cd457 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_inv.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_inv.png new file mode 100644 index 00000000..54176691 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_inv.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tl.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tl.png new file mode 100644 index 00000000..16b6e3a0 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tl.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tr.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tr.png new file mode 100644 index 00000000..768430fc Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tr.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png new file mode 100644 index 00000000..5465ef82 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big.png new file mode 100644 index 00000000..24ede0aa Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big_top.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big_top.png new file mode 100644 index 00000000..3e3c829e Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big_top.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_top.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_top.png new file mode 100644 index 00000000..8b259cc4 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_top.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_ferntuber.png b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber.png new file mode 100644 index 00000000..2d6785da Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_ferntuber_roasted.png b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber_roasted.png new file mode 100644 index 00000000..f62a88d6 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber_roasted.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead.png b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead.png new file mode 100644 index 00000000..0925c780 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead_roasted.png b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead_roasted.png new file mode 100644 index 00000000..9f4943ce Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead_roasted.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_01.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_01.png new file mode 100644 index 00000000..60d3ca67 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_01.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_02.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_02.png new file mode 100644 index 00000000..3c7edf73 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_02.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_03.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_03.png new file mode 100644 index 00000000..5d28a468 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_03.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_04.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_04.png new file mode 100644 index 00000000..a8254ed5 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_04.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern.png b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern.png new file mode 100644 index 00000000..b459d481 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern_giant.png b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern_giant.png new file mode 100644 index 00000000..e5560166 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern_giant.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big.png b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big.png new file mode 100644 index 00000000..09cc0012 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_cross.png b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_cross.png new file mode 100644 index 00000000..48f7e2cb Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_cross.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_end.png b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_end.png new file mode 100644 index 00000000..d0064fee Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_end.png differ diff --git a/mods/plantlife_modpack/ferns/treefern.lua b/mods/plantlife_modpack/ferns/treefern.lua new file mode 100644 index 00000000..7869dff5 --- /dev/null +++ b/mods/plantlife_modpack/ferns/treefern.lua @@ -0,0 +1,261 @@ +----------------------------------------------------------------------------------------------- +-- Ferns - Tree Fern 0.1.1 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: default , trees +----------------------------------------------------------------------------------------------- + +-- support for i18n +local S = minetest.get_translator("ferns") + +assert(abstract_ferns.config.enable_treefern == true) + +function abstract_ferns.can_grow_tree_fern(pos) + local node_name = minetest.get_node(pos).name + if node_name ~= "air" and node_name ~= "ferns:sapling_tree_fern" and node_name ~= "default:junglegrass" then + return false + end + + local below_name = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)).name + if minetest.get_item_group(below_name, "soil") == 0 and minetest.get_item_group(below_name, "sand") == 0 then + return false + end + + local light = minetest.get_node_light(pos, 0.5) + if light <= 8 then + return false + end + + return true +end + +abstract_ferns.grow_tree_fern = function(pos) + + local pos_aux = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(pos_aux).name + if name ~= "air" and name ~= "ferns:sapling_tree_fern" + and name ~= "default:junglegrass" then + return + end + + local size = math.random(1, 4) + math.random(1, 4) + if (size > 5) then + size = 10 - size + end + size = size + 1 + local crown = ({ "ferns:tree_fern_leaves", "ferns:tree_fern_leaves_02" })[math.random(1, 2)] + + local i = 1 + local brk = false + while (i < size) do + pos_aux.y = pos.y + i + name = minetest.get_node(pos_aux).name + if not (name == "air" or (i == 1 and name == "ferns:sapling_tree_fern")) then + brk = true + break + end + minetest.swap_node({x = pos.x, y = pos.y + i, z = pos.z}, { name = "ferns:fern_trunk" }) + i = i + 1 + end + if not brk then + minetest.swap_node({x = pos.x, y = pos.y + i - 1, z = pos.z}, { name = crown }) + end +end + +----------------------------------------------------------------------------------------------- +-- TREE FERN LEAVES +----------------------------------------------------------------------------------------------- + +-- TODO: Both of these nodes look the same? + +minetest.register_node("ferns:tree_fern_leaves", { + description = S("Tree Fern Crown (Dicksonia)"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + paramtype2 = "facedir", + --tiles = {"[combine:32x32:0,0=top_left.png:0,16=bottom_left.png:16,0=top_right.png:16,16=bottom_right.png"}, + tiles = {"ferns_fern_tree.png"}, + inventory_image = "ferns_fern_tree_inv.png", + walkable = false, + groups = {snappy=3,flammable=2,attached_node=1}, + is_ground_content = false, + drop = { + max_items = 2, + items = { + { + -- occasionally, drop a second sapling instead of leaves + -- (extra saplings can also be obtained by replanting and + -- reharvesting leaves) + items = {"ferns:sapling_tree_fern"}, + rarity = 10, + }, + { + items = {"ferns:sapling_tree_fern"}, + }, + { + items = {"ferns:tree_fern_leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +minetest.register_node("ferns:tree_fern_leaves_02", { + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"ferns_fern_big.png"}, + walkable = false, + groups = {snappy=3,flammable=2,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, + drop = { + max_items = 2, + items = { + { + -- occasionally, drop a second sapling instead of leaves + -- (extra saplings can also be obtained by replanting and + -- reharvesting leaves) + items = {"ferns:sapling_tree_fern"}, + rarity = 10, + }, + { + items = {"ferns:sapling_tree_fern"}, + }, + { + items = {"ferns:tree_fern_leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +----------------------------------------------------------------------------------------------- +-- FERN TRUNK +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:fern_trunk", { + description = S("Fern Trunk (Dicksonia)"), + drawtype = "nodebox", + paramtype = "light", + tiles = { + "ferns_fern_trunk_top.png", + "ferns_fern_trunk_top.png", + "ferns_fern_trunk.png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, + }, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + after_destruct = function(pos,oldnode) + local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if node.name == "ferns:fern_trunk" then + minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z}) + minetest.add_item(pos,"ferns:fern_trunk") + end + end, +}) + +----------------------------------------------------------------------------------------------- +-- TREE FERN SAPLING +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:sapling_tree_fern", { + description = S("Tree Fern Sapling (Dicksonia)"), + drawtype = "plantlike", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"ferns_sapling_tree_fern.png"}, + inventory_image = "ferns_sapling_tree_fern.png", + walkable = false, + groups = {snappy=3,flammable=2,flora=1,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +-- abm +minetest.register_abm({ + nodenames = "ferns:sapling_tree_fern", + interval = 1000, + chance = 4, + action = function(pos, node, _, _) + if abstract_ferns.can_grow_tree_fern(pos) then + abstract_ferns.grow_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + end + end +}) + +----------------------------------------------------------------------------------------------- +-- GENERATE TREE FERN +----------------------------------------------------------------------------------------------- + +-- in jungles +if abstract_ferns.config.enable_treeferns_in_jungle == true then + biome_lib.register_on_generate({ + surface = { + "default:dirt_with_grass", + "default:dirt_with_rainforest_litter", -- minetest >= 0.4.16 + "default:sand", + "default:desert_sand", + }, + max_count = 35,--27, + avoid_nodes = {"default:tree"}, + avoid_radius = 4, + rarity = 50, + seed_diff = 329, + min_elevation = -10, + near_nodes = {"default:jungletree"}, + near_nodes_size = 6, + near_nodes_vertical = 2,--4, + near_nodes_count = 1, + plantlife_limit = -0.9, + humidity_max = -1.0, + humidity_min = 0.4, + temp_max = -0.5, + temp_min = 0.13, + }, + abstract_ferns.grow_tree_fern + ) +end + +-- for oases & tropical beaches +if abstract_ferns.config.enable_treeferns_in_oases == true then + biome_lib.register_on_generate({ + surface = { + "default:sand"--, + --"default:desert_sand" + }, + max_count = 35, + rarity = 50, + seed_diff = 329, + neighbors = {"default:desert_sand"}, + ncount = 1, + min_elevation = 1, + near_nodes = {"default:water_source","default:river_water_source"}, + near_nodes_size = 2, + near_nodes_vertical = 1, + near_nodes_count = 1, + plantlife_limit = -0.9, + humidity_max = -1.0, + humidity_min = 1.0, + temp_max = -1.0, + temp_min = 1.0, + }, + abstract_ferns.grow_tree_fern +) +end diff --git a/mods/plantlife_modpack/modpack.conf b/mods/plantlife_modpack/modpack.conf new file mode 100644 index 00000000..7469b3de --- /dev/null +++ b/mods/plantlife_modpack/modpack.conf @@ -0,0 +1 @@ +min_minetest_version = 5.3.0 diff --git a/mods/plantlife_modpack/pl_seaweed/init.lua b/mods/plantlife_modpack/pl_seaweed/init.lua new file mode 100644 index 00000000..f134e223 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/init.lua @@ -0,0 +1,239 @@ +-- support for i18n +local S = minetest.get_translator("pl_seaweed") + +local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06 + +local function get_ndef(name) + return minetest.registered_nodes[name] or {} +end + +local algae_list = { {nil}, {2}, {3}, {4} } + +for i in ipairs(algae_list) do + local num = "" + local algae_groups = {snappy = 3,flammable=2} + + if algae_list[i][1] ~= nil then + num = "_"..algae_list[i][1] + algae_groups = { snappy = 3,flammable=2, not_in_creative_inventory=1 } + end + + minetest.register_node(":flowers:seaweed"..num, { + description = S("Seaweed"), + drawtype = "nodebox", + tiles = { + "flowers_seaweed"..num..".png", + "flowers_seaweed"..num..".png^[transformFY" + }, + use_texture_alpha = "clip", + inventory_image = "flowers_seaweed_2.png", + wield_image = "flowers_seaweed_2.png", + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + groups = algae_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = { -0.4, -0.5, -0.4, 0.4, -0.45, 0.4 }, + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.49, -0.5, 0.5, -0.49, 0.5 }, + }, + buildable_to = true, + + liquids_pointable = true, + drop = "flowers:seaweed", + on_place = function(itemstack, placer, pointed_thing) + if not itemstack or not placer or not pointed_thing then + return + end + + local keys = placer:get_player_control() + local pt = pointed_thing + + local place_pos = nil + local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local under_node = minetest.get_node(pt.under) + local above_node = minetest.get_node(pt.above) + local top_node = minetest.get_node(top_pos) + if get_ndef(under_node.name)["buildable_to"] then + if under_node.name ~= "default:water_source" then + place_pos = pt.under + elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then + place_pos = top_pos + else + return + end + elseif get_ndef(above_node.name)["buildable_to"] then + place_pos = pt.above + end + if not place_pos then return end -- something went wrong :P + + local pname = placer:get_player_name() + if not minetest.is_protected(place_pos, pname) then + + local nodename = "default:cobble" -- :D + + if not keys["sneak"] then + --local node = minetest.get_node(pt.under) + local seaweed = math.random(1,4) + if seaweed == 1 then + nodename = "flowers:seaweed" + elseif seaweed == 2 then + nodename = "flowers:seaweed_2" + elseif seaweed == 3 then + nodename = "flowers:seaweed_3" + elseif seaweed == 4 then + nodename = "flowers:seaweed_4" + end + minetest.swap_node(place_pos, {name = nodename, param2 = math.random(0,3) }) + else + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.swap_node(place_pos, {name = "flowers:seaweed", param2 = fdir}) + end + + if not minetest.is_creative_enabled(pname) then + itemstack:take_item() + end + return itemstack + end + end, + }) +end + +minetest.register_alias("flowers:flower_seaweed", "flowers:seaweed") +minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed") +minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed") +minetest.register_alias("along_shore:seaweed_2", "flowers:seaweed_2") +minetest.register_alias("along_shore:seaweed_3", "flowers:seaweed_3") +minetest.register_alias("along_shore:seaweed_4", "flowers:seaweed_4") + +-- Register seaweed decorations +local warm_shores = {} +for _,biome in ipairs(asuna.features.ocean.temperate) do + table.insert(warm_shores,biome .. "_shore") +end +for _,biome in ipairs(asuna.features.ocean.tropical) do + table.insert(warm_shores,biome .. "_shore") +end + +local seaweed_selector = { + minetest.get_content_id("flowers:seaweed"), + minetest.get_content_id("flowers:seaweed_2"), + minetest.get_content_id("flowers:seaweed_3"), +} + +local cids = { + air = minetest.get_content_id("air"), + water = minetest.get_content_id("default:water_source"), +} + +abdecor.register_advanced_decoration("plantlife_seaweed",{ + target = { + place_on = { + "default:sand", + "default:dirt_with_grass", + "default:dirt_with_rainforest_litter", + "livingjungle:jungleground", + "livingjungle:leafyjungleground", + "naturalbiomes:alderswamp_litter", + }, + spawn_by = "default:water_source", + num_spawn_by = 3, + sidelen = 80, + fill_ratio = 0.25, + biomes = warm_shores, + y_max = 1, + y_min = 1, + }, + fn = function(mapgen) + -- Get provided values + local va = mapgen.voxelarea + local pos = va:index(mapgen.pos.x,mapgen.pos.y,mapgen.pos.z) + local vdata = mapgen.data + + -- Get stride values + local ystride = va.ystride + local zstride = va.zstride + + -- Set mapgen node to air + vdata[pos + ystride] = cids.air + + -- List of potential open water spots where seaweed can be placed + local open_water = {0,0,0,0} + + -- Semi-pseudo-random number for how many nodes from shore to place seaweed + local pcgr = PcgRandom(pos) + local scan_limit + + -- Scan -x for the furthest available open water + scan_limit = pcgr:next(1,4) + 1 + for xscan = 1, scan_limit do + local ipos = pos - xscan + if vdata[ipos] == cids.water then + open_water[1] = ipos + ystride + else + break + end + end + + -- Scan +x for the furthest available open water + scan_limit = pcgr:next(1,4) + 1 + for xscan = 1, scan_limit do + local ipos = pos + xscan + if vdata[ipos] == cids.water then + open_water[2] = ipos + ystride + else + break + end + end + + -- Scan -z for the furthest available open water + scan_limit = pcgr:next(1,4) + 1 + for zscan = 1, scan_limit do + local ipos = pos - zscan * zstride + if vdata[ipos] == cids.water then + open_water[3] = ipos + ystride + else + break + end + end + + -- Scan +z for the furthest available open water + scan_limit = pcgr:next(1,4) + 1 + for zscan = 1, scan_limit do + local ipos = pos + zscan * zstride + if vdata[ipos] == cids.water then + open_water[4] = ipos + ystride + else + break + end + end + + -- Iterate through open water and generate seaweed where possible + for i = 1, 4 do + local owpos = open_water[i] + if owpos ~= 0 then -- valid open water + vdata[owpos] = seaweed_selector[pcgr:next(1,3)] + end + end + end, +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = "default:sand", + sidelen = 80, + fill_ratio = 0.00275, + biomes = warm_shores, + y_max = 1, + y_min = 1, + decoration = { + "flowers:seaweed_2", + "flowers:seaweed_3", + "flowers:seaweed_4", + }, + }) diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr new file mode 100644 index 00000000..989d7c06 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Seegras diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr new file mode 100644 index 00000000..39dbbcf0 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algues diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr new file mode 100644 index 00000000..0e11bb13 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Deniz yosunu diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr new file mode 100644 index 00000000..f76dfe23 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algo diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr new file mode 100644 index 00000000..bcd13a21 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algas marinas diff --git a/mods/plantlife_modpack/pl_seaweed/locale/template.txt b/mods/plantlife_modpack/pl_seaweed/locale/template.txt new file mode 100644 index 00000000..e2f00f6e --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed= diff --git a/mods/plantlife_modpack/pl_seaweed/mod.conf b/mods/plantlife_modpack/pl_seaweed/mod.conf new file mode 100644 index 00000000..c36ef3bf --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/mod.conf @@ -0,0 +1,3 @@ +name = pl_seaweed +depends = default, abdecor +optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_seaweed/settingtypes.txt b/mods/plantlife_modpack/pl_seaweed/settingtypes.txt new file mode 100644 index 00000000..8c073c5b --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/settingtypes.txt @@ -0,0 +1,2 @@ +# Seaweed rarity (higher number -> higher probability) +pl_seaweed.seaweed_rarity (Seaweed rarity) float 0.06 0.0001 1 diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed.png new file mode 100644 index 00000000..b5bd99c5 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweedLight.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweedLight.png new file mode 100644 index 00000000..7595ebc9 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweedLight.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_2.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_2.png new file mode 100644 index 00000000..0b24730c Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_2.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_3.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_3.png new file mode 100644 index 00000000..d9b7f439 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_3.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_4.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_4.png new file mode 100644 index 00000000..887c1839 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_4.png differ diff --git a/mods/player_monoids/.luacheckrc b/mods/player_monoids/.luacheckrc new file mode 100644 index 00000000..ede251ea --- /dev/null +++ b/mods/player_monoids/.luacheckrc @@ -0,0 +1,9 @@ + +read_globals = { + "minetest", + "vector", +} + +globals = { + "player_monoids", +} diff --git a/mods/player_monoids/API.md b/mods/player_monoids/API.md new file mode 100644 index 00000000..a032112b --- /dev/null +++ b/mods/player_monoids/API.md @@ -0,0 +1,76 @@ +#Player Monoids + +The idea behind this library is that global player state (physics overrides, +armor values, etc.) changes from multiple mods should mesh nicely with each +other. This means they must be combinable in a sane way. + +Monoids +======= +A player monoid covers a single kind of player state a mod might want to change. +These can be built-in player state, like speed multipliers or fly permissions, +or could be custom state introduced by mods, such as corruption or reputation +level. When you make a player monoid, you must choose some type of value to +represent state changes - for example, numbers for speed multipliers, or vectors +for "lucky direction". Each mod can contribute different changes, represented +by this type of value, and they are all combined together. This combined value +is interpreted and converted into actual effects on the player's state. +Privileges could be set, physics overrides would be used to effect speed +changes, and a mod might change some value to match the monoid. + +Definition +---------- +A player monoid definition is a table with the following: + + * ```combine(elem1, elem2)``` - An associative binary operation + * ```fold({elems})``` - Equivalent to combining a whole list with ```combine``` + * ```identity``` - An identity element for ```combine``` + * ```apply(value, player)``` - Apply the effect represented by ```value``` + to ```player``` + * ```on_change(val1, val2, player)``` - Do something when the value on a + player changes. (optional) + +Additionally, you should document what values are valid representatives of +your monoid's effects. When something says that a value is "in a monoid", it +means that value is a valid representative of your monoid's effects. + +combine and fold +---------------- +```combine``` should take two values in your monoid and produce a third value in +your monoid. It should also be an associative operation. ```fold`` should take a +table containing elements of your monoid as input and combine them together in +key order. It should be equivalent to using ```combine``` to combine all the +values together. For example, ```combine``` could multiply two speed multipliers +together, and ```fold``` could multiply every value together. + +identity +-------- +```identity```, when combined with any other value, should result in the other +value. It also represents the "default" or "neutral" state of the player, and +will be used when there are no status effects active for a particular monoid. +For example, the identity of a speed monoid could be the multiplier ```1```. + +apply +----- +```apply``` is the function that interprets a value in your monoid to do +something to the player's state. For example, you could set a speed multiplier +as the speed physics override for the player. + +Functions +========= +```player_monoids.make_monoid(monoid_def)``` - Creates a new monoid that can be +used to make changes to the player state. Returns a monoid. + +Monoid Methods +-------------- +```monoid:add_change(player, value[, "id"])``` - Applies the change represented +by ```value``` to ```player```. Returns an ID for the change. If the optional +string argument ```"id"``` is supplied, that is used as the ID instead, and any +existing change with that ID is removed. IDs are only guaranteed to be unique +per-player. Conversely, you are allowed to make multiple changes with the same +ID as long as they are all on different players. + +```monoid:del_change(player, id)``` - Removes the change with the given ID, from +the given player, if it exists. + +```monoid:value(player)``` - The current combined value of the monoid for the +given player. diff --git a/mods/player_monoids/COPYING b/mods/player_monoids/COPYING new file mode 100644 index 00000000..8034ed73 --- /dev/null +++ b/mods/player_monoids/COPYING @@ -0,0 +1,13 @@ +Copyright 2015-2016 raymoo + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/mods/player_monoids/README.md b/mods/player_monoids/README.md new file mode 100644 index 00000000..47ae77fa --- /dev/null +++ b/mods/player_monoids/README.md @@ -0,0 +1,207 @@ +# Player Monoids + +This is a small library for managing global player state, so that changes made +from different mods do not result in unexpected behavior. The README gives an +introduction to the mod, but you might want to reference API.md along the way. +This mod, combined with playereffects, deprecates monoidal_effects. + +Global Player State +=================== +Players have behavior-affecting state that can be modified through mods. A couple +examples are physics overrides and armor groups. If more than one mod tries to +change them, it can result in unexpected results. + +For example, a player could be +under a speed boost effect from a playereffects effect, and then sleep in a bed. +The bed sets the player's speed to 0, and sets it back to 1 when they get out. +Because the beds mod had no way of knowing that the player was supposed to have +a speed boost, it effectively removed it. One hack to "fix" it would be to save +the player's speed and restore it on wakeup, but this would have its own problems +if the effect wears off in bed. The beds mod would restore the boosted speed, +which wouldn't be removed, since the effect already went away. Thus an exploit +allowing a permanent (until log out) speed boost is introduced. + +Player Monoids manages this by creating layers (monoids) on top of player state, +which can keep track of different changes and combine them usefully. + +Monoids +======= + +Creation +-------- +A monoid in Player Monoids is an interface to one piece of player state. For +example, you could have one monoid covering physics overrides, and another +covering fly privilege. You could define a speed monoids like this: +``` +-- The values in my speed monoid must be speed multipliers (numbers). +mymod.speed_monoid = player_monoids.make_monoid({ + combine = function(speed1, speed2) + return speed1 * speed2 + end, + fold = function(tab) + local res = 1 + for _, speed in pairs(tab) do + res = res * speed + end + return res + end, + identity = 1, + apply = function(speed, player) + local override = player:get_physics_override() + override.speed = speed + player:set_physics_override(override) + end, + on_change = function() return end, +}) +``` + +This says that two speed multipliers can be combined by multiplication, that +1 can be used as a neutral element, and that the "interpretation" of the speed +multiplier is to set the player's speed physics override to that value. It also +says that nothing in particular needs to happen when the speed changes, other +than applying the new speed multiplier. + +Use +--- +To add or remove change through a monoid, you must use the ```add_change``` +and ```del_change``` methods. For example, you could speed the player up +temporarily like this: +``` +-- Zoom! +local zoom_id = mymod.speed_monoid:add_change(some_player, 10) + +minetest.after(5,function() mymod.speed_monoid:del_change(some_player, zoom_id) end) +``` +You could also specify a string ID to use, instead of the numerical one that +is automatically provided: +``` +-- Zoom Mk. II +mymod.speed_monoid:add_change(some_player, 10, "mymod:zoom") + +minetest.after(5,function() mymod.speed_monoid:del_change(some_player, "mymod:zoom") end) +``` + +Reading Values +-------------- +You can use ```monoid:value(player)``` to read the current value of the monoid, +for that player. This could be useful if it doesn't just represent built-in +player state. For example, it could represent gardening skill, and you might use +it to calculate the chance of success when harvesting spices. + +Nesting Monoids +--------------- +You may have already noticed one limitation of this design. That is, for each +kind of player state, you can only combine state changes in one way. If the +standard speed monoid combines speed multipliers by multiplication, you cannot +change it to instead choose the highest speed multiplier. Unfortunately, there +is currently no way change this - you will have to hope that the given monoid +combines in a useful way. However, it is possible to manage a subset of the +values in a custom way. + +Suppose that a speed monoid (```mymod.speed_monoid```) already exists, using +multiplication, but you want to write a mod with speed boosts, and only apply +the strongest boost. Most of it could be done the same way: +``` +-- My speed boosts monoid takes speed multipliers (numbers) that are at least 1. +newmod.speed_boosts = player_monoids.make_monoid({ + combine = function(speed1, speed2) + return math.max(speed1, speed2) + end, + fold = function(tab) + local res = 1 + for _, speed in pairs(tab) do + res = math.max(res, speed) + end + return res + end, + identity = 1, + apply = ??? + on_change = function() return end, +}) +``` +But we cannot just change the player speed in ```apply```, otherwise we will +break compatibility with the original speed monoid! The trick here is to use +the original monoid as a proxy for our effects. +``` +apply = function(speed, player) + mymod.speed_monoid:add_change(player, speed, "newmod:speed_boosts") +end +``` +This means the speed boosts we control can be limited to the strongest boost, but +the resulting boost will still play nice with speed effects from other mods. +You could even add another "nested monoid" just for speed maluses, that takes +the worst speed drain and applies it as a multiplier. + +Standard Monoids +================ +In the spirit of compatibility, this mod provides some canonical monoids for +commonly used player state. They combine values in a way that should allow +different mods to affect player state fairly. If you make another monoid handling +the same state as one of these, you will break compatibility with any mods using +the standard monoid. + +Physics Overrides +----------------- +These monoids set the multiplier of the override they are named after. All three +take non-negative numbers as values and combine them with multiplication. They +are: + * ```player_monoids.speed``` + * ```player_monoids.jump``` + * ```player_monoids.gravity``` + +Privileges +---------- +These monoids set privileges that affect the player's ordinary gameplay. They +take booleans as input and combine them with logical or. They are: + * ```player_monoids.fly``` + * ```player_monoids.noclip``` + +Other +----- + * ```player_monoids.collisionbox``` - Sets the player's collisionbox. Values are + 3D multiplier vectors, which are combined with component-wise multiplication. + * ```player_monoids.visual_size``` - Sets the player's collisionbox. Values are + 2D multiplier vectors (x and y), which are combined with component-wise + multiplication. + +Use with playereffects +====================== +Player Monoids does not provide anything special for persistent effects with +limited lifetime. By using monoids with Wuzzy's playereffects, you can easily +create temporary effects that stack with each other. As an example, an effect +that gives the player 2x speed: +``` +local speed = player_monoids.speed + +local function apply(player) + speed:add_change(player, 2, "mymod:2x_speed") +end + +local function cancel(player) + speed:del_change(player, "mymod:2x_speed") +end + +local groups = { "mymod:2x_speed" } + +playereffects.register_effect_type("mymod:2x_speed", "2x Speed", groups, apply, cancel) +``` + +Note that this effect does NOT use the "speed" effect group. As long as other +speed effects use the speed monoid, we do not want them to be cancelled, since +the goal is to combine the effects together. It does use a singleton group to +prevent multiple instances of the same effect. I think that playereffects require +effects to belong to at least one group, but I am not sure. + +Caveats +======= +* If the global state managed by a monoid is modified by something other than +the monoid, you will have the same problem as when two mods both independently +try to modify global state without going through a monoid. + * This includes playereffects effects that affect global player state without +going through a monoid. +* You will also get problems if you use multiple monoids to manage the same +global state. +* The order that different effects get combined together is based on key order, +which may not be predictable. So you should try to make your monoids commutative +in addition to associative, or at least not care if the order of two changes +is swapped. diff --git a/mods/player_monoids/bower.json b/mods/player_monoids/bower.json new file mode 100644 index 00000000..830c0d49 --- /dev/null +++ b/mods/player_monoids/bower.json @@ -0,0 +1,19 @@ +{ + "name": "player_monoids", + "description": "Library for making player state changes combinable\n", + "keywords": [ + "player_monoids", + "monoid", + "monoids", + "effect", + "playereffects" + ], + "homepage": "https://github.com/raymoo/player_monoids", + "forum": "https://forum.minetest.net/viewtopic.php?f=9&t=14895", + "screenshots": [ + "https://example.com/screenshot1.png" + ], + "authors": [ + "raymoo" + ] +} diff --git a/mods/player_monoids/init.lua b/mods/player_monoids/init.lua new file mode 100644 index 00000000..65271548 --- /dev/null +++ b/mods/player_monoids/init.lua @@ -0,0 +1,118 @@ +-- Copyright (c) raymoo 2016 +-- Licensed under Apache 2.0 license. See COPYING for details. + +-- Any documentation here are internal details, please avoid using them in your +-- mod. + +local modpath = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +player_monoids = {} + +local mon_meta = {} + +mon_meta.__index = mon_meta + +local nop = function() end + +-- A monoid object is a table with the following fields: +-- def: The monoid definition +-- player_map: A map from player names to their effect tables. Effect tables +-- are maps from effect IDs to values. +-- value_cache: A map from player names to the cached value for the monoid. +-- next_id: The next unique ID to assign an effect. + +local function monoid(def) + local mon = {} + + local actual_def = {} + + for k, v in pairs(def) do + actual_def[k] = v + end + + if not actual_def.apply then + actual_def.apply = nop + end + + if not actual_def.on_change then + actual_def.on_change = nop + end + + mon.def = actual_def + + local p_map = {} + mon.player_map = p_map + + mon.next_id = 1 + + local v_cache = {} + mon.value_cache = v_cache + + setmetatable(mon, mon_meta) + + minetest.register_on_leaveplayer(function(player) + local p_name = player:get_player_name() + p_map[p_name] = nil + v_cache[p_name] = nil + end) + + return mon +end + +player_monoids.make_monoid = monoid + +function mon_meta:add_change(player, value, id) + local p_name = player:get_player_name() + + local def = self.def + + local p_effects = self.player_map[p_name] + if p_effects == nil then + p_effects = {} + self.player_map[p_name] = p_effects + end + + local actual_id + + if id then + actual_id = id + else + actual_id = self.next_id + self.next_id = actual_id + 1 + end + + local old_total = self.value_cache[p_name] + p_effects[actual_id] = value + local new_total = def.fold(p_effects) + self.value_cache[p_name] = new_total + + def.apply(new_total, player) + def.on_change(old_total, new_total, player) + + return actual_id +end + +function mon_meta:del_change(player, id) + local p_name = player:get_player_name() + + local def = self.def + + local p_effects = self.player_map[p_name] + if p_effects == nil then return end + + local old_total = self.value_cache[p_name] + p_effects[id] = nil + local new_total = def.fold(p_effects) + self.value_cache[p_name] = new_total + + def.apply(new_total, player) + def.on_change(old_total, new_total, player) +end + +function mon_meta:value(player) + local p_name = player:get_player_name() + return self.value_cache[p_name] or self.def.identity +end + +dofile(modpath .. "standard_monoids.lua") +dofile(modpath .. "test.lua") diff --git a/mods/player_monoids/mod.conf b/mods/player_monoids/mod.conf new file mode 100644 index 00000000..393bbeae --- /dev/null +++ b/mods/player_monoids/mod.conf @@ -0,0 +1,5 @@ +name = player_monoids +description = """ +A library for managing global player state, +such as physics overrides or player visual size. +""" \ No newline at end of file diff --git a/mods/player_monoids/standard_monoids.lua b/mods/player_monoids/standard_monoids.lua new file mode 100644 index 00000000..1ea87da2 --- /dev/null +++ b/mods/player_monoids/standard_monoids.lua @@ -0,0 +1,156 @@ +-- Standard effect monoids, to provide canonicity. + +local function mult(x, y) return x * y end + +local function mult_fold(elems) + local tot = 1 + + for _, v in pairs(elems) do + tot = tot * v + end + + return tot +end + +local function v_mult(v1, v2) + local res = {} + + for k, v in pairs(v1) do + res[k] = v * v2[k] + end + + return res +end + +local function v_mult_fold(identity) + return function(elems) + local tot = identity + + for _, v in pairs(elems) do + tot = v_mult(tot, v) + end + + return tot + end +end + +local monoid = player_monoids.make_monoid + +-- Speed monoid. Effect values are speed multipliers. Must be nonnegative +-- numbers. +player_monoids.speed = monoid({ + combine = mult, + fold = mult_fold, + identity = 1, + apply = function(multiplier, player) + local ov = player:get_physics_override() + ov.speed = multiplier + player:set_physics_override(ov) + end, +}) + + +-- Jump monoid. Effect values are jump multipliers. Must be nonnegative +-- numbers. +player_monoids.jump = monoid({ + combine = mult, + fold = mult_fold, + identity = 1, + apply = function(multiplier, player) + local ov = player:get_physics_override() + ov.jump = multiplier + player:set_physics_override(ov) + end, +}) + +-- Gravity monoid. Effect values are gravity multipliers. +player_monoids.gravity = monoid({ + combine = mult, + fold = mult_fold, + identity = 1, + apply = function(multiplier, player) + local ov = player:get_physics_override() + ov.gravity = multiplier + player:set_physics_override(ov) + end, +}) + +-- Fly ability monoid. The values are booleans, which are combined by or. A true +-- value indicates having the ability to fly. +player_monoids.fly = monoid({ + combine = function(p, q) return p or q end, + fold = function(elems) + for _, v in pairs(elems) do + if v then return true end + end + + return false + end, + identity = false, + apply = function(can_fly, player) + local p_name = player:get_player_name() + local privs = minetest.get_player_privs(p_name) + + if can_fly then + privs.fly = true + else + privs.fly = nil + end + + minetest.set_player_privs(p_name, privs) + + end, +}) + +-- Noclip ability monoid. Works the same as fly monoid. +player_monoids.noclip = monoid({ + combine = function(p, q) return p or q end, + fold = function(elems) + for _, v in pairs(elems) do + if v then return true end + end + + return false + end, + identity = false, + apply = function(can_noclip, player) + local p_name = player:get_player_name() + local privs = minetest.get_player_privs(p_name) + + if can_noclip then + privs.noclip = true + else + privs.noclip = nil + end + + minetest.set_player_privs(p_name, privs) + + end, +}) + +local def_col_scale = { x=0.3, y=1, z=0.3 } + +-- Collisionbox scaling factor. Values are a vector of x, y, z multipliers. +player_monoids.collisionbox = monoid({ + combine = v_mult, + fold = v_mult_fold({x=1, y=1, z=1}), + identity = {x=1, y=1, z=1}, + apply = function(multiplier, player) + local v = vector.multiply(def_col_scale, multiplier) + + player:set_properties({ + collisionbox = { -v.x, -v.y, -v.z, v.z, v.y, v.z } + }) + end, +}) + +player_monoids.visual_size = monoid({ + combine = v_mult, + fold = v_mult_fold({x=1, y=1}), + identity = {x=1, y=1}, + apply = function(multiplier, player) + player:set_properties({ + visual_size = multiplier + }) + end, +}) diff --git a/mods/player_monoids/test.lua b/mods/player_monoids/test.lua new file mode 100644 index 00000000..6cc8d3d9 --- /dev/null +++ b/mods/player_monoids/test.lua @@ -0,0 +1,30 @@ + +local speed = player_monoids.speed + +minetest.register_privilege("monoid_master", { + description = "Allows testing of player monoids.", + give_to_singleplayer = false, + give_to_admin = true, +}) + +local function test(player) + local ch_id = speed:add_change(player, 10) + local p_name = player:get_player_name() + + minetest.chat_send_player(p_name, "Your speed is: " .. speed:value(player)) + + minetest.after(3, function() + local player = minetest.get_player_by_name(p_name) + if not player then return end + speed:del_change(player, ch_id) + minetest.chat_send_player(p_name, "Your speed is: " .. speed:value(player)) + end) +end + +minetest.register_chatcommand("test_monoids", { + description = "Runs a test on monoids", + privs = { monoid_master = true }, + func = function(p_name) + test(minetest.get_player_by_name(p_name)) + end, +}) diff --git a/mods/researcher/.gitattributes b/mods/researcher/.gitattributes new file mode 100644 index 00000000..6e48e4a5 --- /dev/null +++ b/mods/researcher/.gitattributes @@ -0,0 +1,4 @@ +*.xcf export-ignore +*.blend export-ignore +*.bbmodel export-ignore +*.json export-ignore \ No newline at end of file diff --git a/mods/researcher/CREDITS.md b/mods/researcher/CREDITS.md new file mode 100644 index 00000000..eb931e66 --- /dev/null +++ b/mods/researcher/CREDITS.md @@ -0,0 +1,13 @@ +# Sounds + +- `sounds/researcher_level_up.ogg` derived from ["Game Pickup" by INEBA](https://freesound.org/people/IENBA/sounds/698768/) at FreeSound.org, licensed [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +- `sounds/researcher_research.ogg` derived from ["Supershort Ping, Or Short Notification.wav" by MATRIXXX_](https://freesound.org/people/MATRIXXX_/sounds/495650/) at FreeSound.org, licensed [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +- `sounds/researcher_duplicate.ogg` derived from ["Rattle Egg" by qubodup](https://freesound.org/people/qubodup/sounds/171935/) at FreeSound.org, licensed [CC0](https://creativecommons.org/publicdomain/zero/1.0/) + +# Textures + +- `textures/researcher_gui_hb_bg.png` is a copy of [gui_hb_bg.png in Minetest Game](https://github.com/minetest/minetest_game/blob/master/mods/default/textures/gui_hb_bg.png) by paramat et. al., licensed [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/), or [CC0](https://creativecommons.org/publicdomain/zero/1.0/); see [Minetest Game license.txt](https://github.com/minetest/minetest_game/blob/master/mods/default/license.txt) for more info +- `textures/researcher_research_table_surface.png` made by Mirtilo as part of the [Baunilha texture pack](https://content.minetest.net/packages/Mirtilo/baunilha/), licensed [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) +- `textures/researcher_research_table_frame.png` made by JoeEnderman, dedicated to the public domain via [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +- `textures/researcher_icon*` files derived from "Erlenmeyer icon" by Lorc and downloaded from , licensed [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/) +- The light bulb icon used in `screenshot.png` and `screenshot.xcf` is derivied from ["Light Bulb by Anamika Singh"](https://thenounproject.com/icon/light-bulb-6757220/), licensed [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/) \ No newline at end of file diff --git a/mods/researcher/LICENSE b/mods/researcher/LICENSE new file mode 100644 index 00000000..83d55d5a --- /dev/null +++ b/mods/researcher/LICENSE @@ -0,0 +1,13 @@ +MIT License + +Copyright © 2024 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +Additional license information and appropriate attributions can be found in `CREDITS.md`. \ No newline at end of file diff --git a/mods/researcher/README.md b/mods/researcher/README.md new file mode 100644 index 00000000..bd64339a --- /dev/null +++ b/mods/researcher/README.md @@ -0,0 +1,76 @@ +Researcher +========== + +Unlock the limitless creative potential of your world with Researcher! This mod adds a thematic "earned creative" mode to Minetest through which you can earn infinite duplication of the items in your world. When applied to a survival world, research becomes an enticing goal that rewards your gameplay efforts with endless command of the items you study the most. + +Research +-------- + +Research is the mechanism by which items are permanently destroyed in order to gain the ability to duplicate them. You gain *research points* when you destroy an item, a score which is tracked per player and per item such that every player has their own research point total for each item in the game. + +Reaching certain research point milestones known as *research levels* will grant you permanent bonuses towards future research of similar items. Reaching maximum research levels for an item will grant you the permanent ability to duplicate the item. + +### How to Research + +To research an item, open the Researcher menu in your inventory or via `/research`, place an item into the research box, then click the "Research" button. Researching an item will immediately destroy the researched item and grant you research points in return. The amount of research points gained per research is a constant amount plus any research bonuses you've gained. + +### Duplication + +Once you've reached the maximum research level for an item (level 10 by default), you are granted the permanent ability to duplicate the item as many times as you'd like at no cost. When duplication is unlocked for an item, the "Research" button in the research menu will change to "Duplicate" for the item, and clicking the button will add a full stack of the item to your main inventory. + +Bonuses +------- + +You can earn bonuses towards research by researching under certain conditions. These bonuses encourage players to specialize in a particular field of research. + +### Group Research + +Gaining research levels for a particular item will earn permanent bonuses on future items that match any of the item's groups. For example, cobblestone will have the `stone` group, and five research levels in cobblestone will add +5 research points for all `stone` items, including cobblestone itself. + +### Focused Research + +Focusing your research on a particular item will grant you cumulative bonuses to continuous research of the item and its groups. Whenever you research an item, the item becomes your current research focus. + +You will gain additional research points for each successive research that matches the focus item or its groups, up to a certain maximum. More points are given for an exact match and fewer points are given for a group match. All focus bonuses are reset to zero if you research a non-matching item. + +### Research Table + +A research table is a special node that allows you to gain significant bonuses to your research. A research table has its own focus item that must be set and matched in order to use it for research. + +To use a research table, craft it, place it, then right-click it in order to access its menu. Place an item into its "focus" slot to set its focus item. The research table can then be used to research items that match its focus item or the item's groups. + +Placing items near the research table that match the groups of the research table's focus item will increase the research bonus it grants, up to a certain maximum (10 items by default). This can be done by placing matching nodes in the world near the research table or by placing a node with an inventory that contains matching items (e.g., a nearby chest full of swords to gain research bonuses to swords). + +The crafing recipe for a research table requires wood (`[W]`) and stone (`[S]`) as illustrated below: + +``` +[S] [S] [S] +[W] [W] [W] +[W] [ ] [W] +``` + +Slash Commands +-------------- + +Researcher can be controlled via the `/research` slash command. + +- `/research` - Opens the research interface, or prompts you to use your inventory for research if a supported inventory mod is being used (see next section for complete list) +- `/research reset` - Reset your entire research progress for all items +- `/research reset ` - Reset your research progress for the item specified by its item ID, e.g., `default:cobble` + +Supported Games/Mods +-------------------- + +Researcher supports a number of games and mods. Popular games include: + +- [Minetest Game](https://content.minetest.net/packages/Minetest/minetest_game/) and its derivatives, e.g., [MeseCraft](https://content.minetest.net/packages/MeseCraft/mesecraft/), [Asuna](https://content.minetest.net/packages/EmptyStar/asuna/), etc. +- [Mineclonia](https://content.minetest.net/packages/ryvnf/mineclonia/) +- [VoxeLibre](https://content.minetest.net/packages/Wuzzy/mineclone2/) +- Any Minetest game in theory, but those not listed above are untested + +Supported mods include: + +- [Awards](https://content.minetest.net/packages/rubenwardy/awards/) - Adds awards for certain research milestones +- [sfinv](https://content.minetest.net/packages/rubenwardy/sfinv/) (Minetest Game default) - Adds an integrated research tab where research can be performed +- [i3](https://content.minetest.net/packages/mt-mods/i3/) - Adds an integrated research tab +- [Unified Inventory](https://content.minetest.net/packages/RealBadAngel/unified_inventory/) - Adds an integrated research tab \ No newline at end of file diff --git a/mods/researcher/init.lua b/mods/researcher/init.lua new file mode 100644 index 00000000..03fb39c5 --- /dev/null +++ b/mods/researcher/init.lua @@ -0,0 +1,120 @@ +-- Globals +researcher = { + settings = { + -- Research points and levels + points_per_level = tonumber(minetest.settings:get("researcher.points_per_level",600) or 600), + points_per_research = tonumber(minetest.settings:get("researcher.points_per_research",100) or 100), + level_max = tonumber(minetest.settings:get("researcher.level_max",10) or 10), + level_scale = tonumber(minetest.settings:get("researcher.level_scale",1.25) or 1.25), + + -- Bonuses for group research + group_research_bonus = tonumber(minetest.settings:get("researcher.group_research_bonus",1) or 1), + group_research_bonus_max = tonumber(minetest.settings:get("researcher.group_research_bonus_max",150) or 150), + + -- Bonuses for focused research + focused_research_bonus_exact = tonumber(minetest.settings:get("researcher.focused_research_bonus_exact",5) or 5), + focused_research_bonus_group = tonumber(minetest.settings:get("researcher.focused_research_bonus_group",1) or 1), + focused_research_bonus_max = tonumber(minetest.settings:get("researcher.focused_research_bonus_max",150) or 150), + + -- Bonuses for using a research table + research_table_bonus_exact = tonumber(minetest.settings:get("researcher.research_table_bonus_exact",25) or 25), + research_table_bonus_group = tonumber(minetest.settings:get("researcher.research_table_bonus_group",5) or 5), + research_table_adjacency_bonus = tonumber(minetest.settings:get("researcher.research_table_adjacency_bonus",10) or 10), + research_table_adjacency_max = tonumber(minetest.settings:get("researcher.research_table_adjacency_max",10) or 10), + research_table_adjacency_radius = tonumber(minetest.settings:get("researcher.research_table_adjacency_radius",3) or 3), + research_table_player_radius = tonumber(minetest.settings:get("researcher.research_table_player_radius",2) or 2), + research_table_bonus_max = tonumber(minetest.settings:get("researcher.research_table_bonus_max",150) or 150), + + -- Built-in item discount amounts + discount_stack_max = tonumber(minetest.settings:get("researcher.discount_stack_max",-250) or -250), + discount_mapgen = tonumber(minetest.settings:get("researcher.discount_mapgen",-400) or -400), + discount_not_craftable = tonumber(minetest.settings:get("researcher.discount_not_craftable",-250) or -250), + + -- Use research awards + awards = minetest.settings:get_bool("researcher.awards",true) and minetest.get_modpath("awards") and true or false, + + -- Groups that are excluded from group matching + excluded_groups = minetest.settings:get("researcher.excluded_groups") or table.concat({ + "not_in_creative_inventory", + "attached_node", + "connect_to_raillike", + "dig_immediate", + "disable_jump", + "disable_descend", + "fall_damage_add_percent", + "falling_node", + "float", + "level", + "oddly_breakable_by_hand", + "immortal", + "disable_repair", + "creative_breakable", + "opaque", + "solid", + }," "), + }, + + -- Cached mod data + data = { + save = {}, + }, + + -- Mod storage + storage = minetest.get_mod_storage(), + + -- Registered data + registered_items = {}, + registered_adjustments = {}, + registered_bonuses = {}, + registered_on_research = {}, + + -- Item groups indexed by group name + groups = {}, + + -- Dependency info + dependencies = (function(deps) + for _,mod in ipairs({ + "default", + "mcl_sounds", + "mcl_inventory", + "sfinv", + "awards", + "unified_inventory", + "i3", + }) do + deps[mod] = minetest.get_modpath(mod) + end + return deps + end)({}), +} + +-- Get excluded groups from settings +researcher.excluded_groups = (function() + local groups = researcher.settings.excluded_groups:split("[ \n\r\t]+",false,-1,true) + local exclude = {} + for _,group in ipairs(groups) do + exclude[group] = true + end + return exclude +end)() + +-- Load secondary files if the Research content pack is enabled in Asuna settings +if asuna.content.research.enabled then + local mpath = minetest.get_modpath("researcher") + local function runfile(file) + dofile(mpath .. "/src/" .. file .. ".lua") + end + + for _,file in ipairs({ + "api", + "inventory", + "bonuses", + "research_table", + "scan", + "commands", + "gui", + "awards", + }) do + runfile(file) + end +end \ No newline at end of file diff --git a/mods/researcher/mod.conf b/mods/researcher/mod.conf new file mode 100644 index 00000000..b47d8696 --- /dev/null +++ b/mods/researcher/mod.conf @@ -0,0 +1,5 @@ +name = researcher +title = Researcher +description = Research items to unlock duplication +author = EmptyStar +optional_depends = sfinv, awards, default, mcl_sounds, mcl_inventory, unified_inventory, i3 \ No newline at end of file diff --git a/mods/researcher/models/research_table.obj b/mods/researcher/models/research_table.obj new file mode 100644 index 00000000..04b84d90 --- /dev/null +++ b/mods/researcher/models/research_table.obj @@ -0,0 +1,901 @@ +v -0.25 0 -0.25 +v -0.25 0 -0.40625 +v -0.25 -0.25 -0.25 +v -0.25 -0.25 -0.40625 +v -0.40625 0 -0.40625 +v -0.40625 0 -0.25 +v -0.40625 -0.25 -0.40625 +v -0.40625 -0.25 -0.25 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +v -0.23125 0.0625 -0.23125 +v -0.23125 0.0625 -0.425 +v -0.23125 0 -0.23125 +v -0.23125 0 -0.425 +v -0.425 0.0625 -0.425 +v -0.425 0.0625 -0.23125 +v -0.425 0 -0.425 +v -0.425 0 -0.23125 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +v -0.21875 -0.25 -0.21875 +v -0.21875 -0.25 -0.4375 +v -0.21875 -0.375 -0.21875 +v -0.21875 -0.375 -0.4375 +v -0.4375 -0.25 -0.4375 +v -0.4375 -0.25 -0.21875 +v -0.4375 -0.375 -0.4375 +v -0.4375 -0.375 -0.21875 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +v -0.1875 -0.375 -0.1875 +v -0.1875 -0.375 -0.46875 +v -0.1875 -0.5 -0.1875 +v -0.1875 -0.5 -0.46875 +v -0.46875 -0.375 -0.46875 +v -0.46875 -0.375 -0.1875 +v -0.46875 -0.5 -0.46875 +v -0.46875 -0.5 -0.1875 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.625 1 +vt 0.625 0.8125 +vt 0.4375 0.8125 +vt 0.1875 0.9375 +vt 0.75 0.9375 +vt 0.75 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +v 0.40625 0 -0.25 +v 0.40625 0 -0.40625 +v 0.40625 -0.25 -0.25 +v 0.40625 -0.25 -0.40625 +v 0.25 0 -0.40625 +v 0.25 0 -0.25 +v 0.25 -0.25 -0.40625 +v 0.25 -0.25 -0.25 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +v 0.42500000000000004 0.0625 -0.23125 +v 0.42500000000000004 0.0625 -0.425 +v 0.42500000000000004 0 -0.23125 +v 0.42500000000000004 0 -0.425 +v 0.23124999999999996 0.0625 -0.425 +v 0.23124999999999996 0.0625 -0.23125 +v 0.23124999999999996 0 -0.425 +v 0.23124999999999996 0 -0.23125 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +v 0.4375 -0.25 -0.21875 +v 0.4375 -0.25 -0.4375 +v 0.4375 -0.375 -0.21875 +v 0.4375 -0.375 -0.4375 +v 0.21875 -0.25 -0.4375 +v 0.21875 -0.25 -0.21875 +v 0.21875 -0.375 -0.4375 +v 0.21875 -0.375 -0.21875 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +v 0.46875 -0.375 -0.1875 +v 0.46875 -0.375 -0.46875 +v 0.46875 -0.5 -0.1875 +v 0.46875 -0.5 -0.46875 +v 0.1875 -0.375 -0.46875 +v 0.1875 -0.375 -0.1875 +v 0.1875 -0.5 -0.46875 +v 0.1875 -0.5 -0.1875 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.625 1 +vt 0.625 0.8125 +vt 0.4375 0.8125 +vt 0.1875 0.9375 +vt 0.75 0.9375 +vt 0.75 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +v 0.40625 0 0.40625 +v 0.40625 0 0.25 +v 0.40625 -0.25 0.40625 +v 0.40625 -0.25 0.25 +v 0.25 0 0.25 +v 0.25 0 0.40625 +v 0.25 -0.25 0.25 +v 0.25 -0.25 0.40625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +v 0.42500000000000004 0.0625 0.42500000000000004 +v 0.42500000000000004 0.0625 0.23124999999999996 +v 0.42500000000000004 0 0.42500000000000004 +v 0.42500000000000004 0 0.23124999999999996 +v 0.23124999999999996 0.0625 0.23124999999999996 +v 0.23124999999999996 0.0625 0.42500000000000004 +v 0.23124999999999996 0 0.23124999999999996 +v 0.23124999999999996 0 0.42500000000000004 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +v 0.4375 -0.25 0.4375 +v 0.4375 -0.25 0.21875 +v 0.4375 -0.375 0.4375 +v 0.4375 -0.375 0.21875 +v 0.21875 -0.25 0.21875 +v 0.21875 -0.25 0.4375 +v 0.21875 -0.375 0.21875 +v 0.21875 -0.375 0.4375 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +v 0.46875 -0.375 0.46875 +v 0.46875 -0.375 0.1875 +v 0.46875 -0.5 0.46875 +v 0.46875 -0.5 0.1875 +v 0.1875 -0.375 0.1875 +v 0.1875 -0.375 0.46875 +v 0.1875 -0.5 0.1875 +v 0.1875 -0.5 0.46875 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.625 1 +vt 0.625 0.8125 +vt 0.4375 0.8125 +vt 0.1875 0.9375 +vt 0.75 0.9375 +vt 0.75 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +v -0.25 0 0.40625 +v -0.25 0 0.25 +v -0.25 -0.25 0.40625 +v -0.25 -0.25 0.25 +v -0.40625 0 0.25 +v -0.40625 0 0.40625 +v -0.40625 -0.25 0.25 +v -0.40625 -0.25 0.40625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0 1 +vt 0.375 1 +vt 0.375 0.625 +vt 0 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vt 0.5625 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 0.5625 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +v -0.23125 0.0625 0.42500000000000004 +v -0.23125 0.0625 0.23124999999999996 +v -0.23125 0 0.42500000000000004 +v -0.23125 0 0.23124999999999996 +v -0.425 0.0625 0.23124999999999996 +v -0.425 0.0625 0.42500000000000004 +v -0.425 0 0.23124999999999996 +v -0.425 0 0.42500000000000004 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.4375 0.375 +vt 0.9375 0.375 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vt 0.75 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +v -0.21875 -0.25 0.4375 +v -0.21875 -0.25 0.21875 +v -0.21875 -0.375 0.4375 +v -0.21875 -0.375 0.21875 +v -0.4375 -0.25 0.21875 +v -0.4375 -0.25 0.4375 +v -0.4375 -0.375 0.21875 +v -0.4375 -0.375 0.4375 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 0.5 +vt 0.9375 0.5 +vt 0.9375 0.25 +vt 0.4375 0.25 +vt 0 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0 0.75 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.8125 +vt 0.4375 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 + +v -0.1875 -0.375 0.46875 +v -0.1875 -0.375 0.1875 +v -0.1875 -0.5 0.46875 +v -0.1875 -0.5 0.1875 +v -0.46875 -0.375 0.1875 +v -0.46875 -0.375 0.46875 +v -0.46875 -0.5 0.1875 +v -0.46875 -0.5 0.46875 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.9375 1 +vt 0.9375 0.75 +vt 0.4375 0.75 +vt 0 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0 0.25 +vt 0.4375 1 +vt 0.625 1 +vt 0.625 0.8125 +vt 0.4375 0.8125 +vt 0.1875 0.9375 +vt 0.75 0.9375 +vt 0.75 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 +v 0.34375 -0.28125 0.34375 +v 0.34375 -0.28125 -0.34375 +v 0.34375 -0.34375 0.34375 +v 0.34375 -0.34375 -0.34375 +v -0.34375 -0.28125 -0.34375 +v -0.34375 -0.28125 0.34375 +v -0.34375 -0.34375 -0.34375 +v -0.34375 -0.34375 0.34375 +vt 0.1875 0.4375 +vt 1 0.4375 +vt 1 0.375 +vt 0.1875 0.375 +vt 0.1875 0.4375 +vt 1 0.4375 +vt 1 0.375 +vt 0.1875 0.375 +vt 0.1875 0.4375 +vt 1 0.4375 +vt 1 0.375 +vt 0.1875 0.375 +vt 0.1875 0.4375 +vt 1 0.4375 +vt 1 0.375 +vt 0.1875 0.375 +vt 0.0625 1 +vt 0.875 1 +vt 0.875 0.1875 +vt 0.0625 0.1875 +vt 0.0625 1 +vt 0.875 1 +vt 0.875 0.1875 +vt 0.0625 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 1 +f 132/388/97 135/387/97 133/386/97 130/385/97 +f 131/392/98 132/391/98 130/390/98 129/389/98 +f 136/396/99 131/395/99 129/394/99 134/393/99 +f 135/400/100 136/399/100 134/398/100 133/397/100 +f 134/404/101 129/403/101 130/402/101 133/401/101 +f 135/408/102 132/407/102 131/406/102 136/405/102 +v 0.4375 0.25 0.4375 +v 0.4375 0.25 -0.4375 +v 0.4375 0.0625 0.4375 +v 0.4375 0.0625 -0.4375 +v -0.4375 0.25 -0.4375 +v -0.4375 0.25 0.4375 +v -0.4375 0.0625 -0.4375 +v -0.4375 0.0625 0.4375 +vt 1 1 +vt 0 1 +vt 0 0.5 +vt 1 0.5 +vt 0 0.5 +vt 1 0.5 +vt 1 0 +vt 0 0 +vt 0 1 +vt 1 1 +vt 1 0.5 +vt 0 0.5 +vt 0 0.5 +vt 1 0.5 +vt 1 0 +vt 0 0 +vt 0 1 +vt 1 1 +vt 1 0 +vt 0 0 +vt 0 1 +vt 1 1 +vt 1 0 +vt 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 2 +f 140/412/103 143/411/103 141/410/103 138/409/103 +f 139/416/104 140/415/104 138/414/104 137/413/104 +f 144/420/105 139/419/105 137/418/105 142/417/105 +f 143/424/106 144/423/106 142/422/106 141/421/106 +f 142/428/107 137/427/107 138/426/107 141/425/107 +f 143/432/108 140/431/108 139/430/108 144/429/108 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v 0.5 0.3125 0.5 +v 0.5 0.3125 -0.5 +v -0.5 0.5 -0.5 +v -0.5 0.5 0.5 +v -0.5 0.3125 -0.5 +v -0.5 0.3125 0.5 +vt 0 0.3125 +vt 1 0.3125 +vt 1 0.125 +vt 0 0.125 +vt 0 0.3125 +vt 1 0.3125 +vt 1 0.125 +vt 0 0.125 +vt 0 0.3125 +vt 1 0.3125 +vt 1 0.125 +vt 0 0.125 +vt 0 0.3125 +vt 1 0.3125 +vt 1 0.125 +vt 0 0.125 +vt 0 1 +vt 1 1 +vt 1 0 +vt 0 0 +vt 0 1 +vt 1 1 +vt 1 0 +vt 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 1 +f 148/436/109 151/435/109 149/434/109 146/433/109 +f 147/440/110 148/439/110 146/438/110 145/437/110 +f 152/444/111 147/443/111 145/442/111 150/441/111 +f 151/448/112 152/447/112 150/446/112 149/445/112 +f 150/452/113 145/451/113 146/450/113 149/449/113 +f 151/456/114 148/455/114 147/454/114 152/453/114 +v 0.46875 0.3125 0.46875 +v 0.46875 0.3125 -0.46875 +v 0.46875 0.25 0.46875 +v 0.46875 0.25 -0.46875 +v -0.46875 0.3125 -0.46875 +v -0.46875 0.3125 0.46875 +v -0.46875 0.25 -0.46875 +v -0.46875 0.25 0.46875 +vt 0 0.8125 +vt 1 0.8125 +vt 1 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 1 0.8125 +vt 1 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 1 0.8125 +vt 1 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 1 0.8125 +vt 1 0.75 +vt 0 0.75 +vt 0 1 +vt 0.9375 1 +vt 0.9375 0.0625 +vt 0 0.0625 +vt 0 1 +vt 0.9375 1 +vt 0.9375 0.0625 +vt 0 0.0625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +g 1 +f 156/460/115 159/459/115 157/458/115 154/457/115 +f 155/464/116 156/463/116 154/462/116 153/461/116 +f 160/468/117 155/467/117 153/466/117 158/465/117 +f 159/472/118 160/471/118 158/470/118 157/469/118 +f 158/476/119 153/475/119 154/474/119 157/473/119 +f 159/480/120 156/479/120 155/478/120 160/477/120 \ No newline at end of file diff --git a/mods/researcher/settingtypes.txt b/mods/researcher/settingtypes.txt new file mode 100644 index 00000000..de18083f --- /dev/null +++ b/mods/researcher/settingtypes.txt @@ -0,0 +1,76 @@ +[Research Points and Levels] + +# How many points a player needs per item to advance to the next research level for a given item. More points required will require more research and vice-versa. +researcher.points_per_level (Points per research level) int 600 100 10000 + +# How many research points a successful research gives per item. +researcher.points_per_research (Points per successful research) int 100 1 10000 + +# The maximum research level that can be reached for an item. Duplication is unlocked for any item at max research level. +researcher.level_max (Max research level) int 10 1 10000 + +# The scale at which the points to the next research level increase. This is an exponential multiplier for each research level. +researcher.level_scale (Research level scale) float 1.25 1.0 2.0 + +[Group Research] + +# The number of bonus research points granted for each research level of items that match the groups of a researched item. +researcher.group_research_bonus (Research group bonus) int 1 0 10000 + +# The maximum level group bonus that can be given. +researcher.group_research_bonus_max (Research group bonus max) int 100 0 10000 + +[Focused Research] + +# How many bonus research points granted per combo that matches player focus item exactly. This value is cumulative for each successive research. This rewards players who continuously research the same item. +researcher.focused_research_bonus_exact (Focused research bonus, exact) int 5 0 10000 + +# How many bonus research points granted per combo that matches player focus item group. This value is cumulative for each successive research. This rewards players who continuously research items similar to their focus. +researcher.focused_research_bonus_group (Focused research bonus, grouped) int 1 0 10000 + +# The maximum bonus that focused research can contribute. +researcher.focused_research_bonus_max (Focused research max bonus) int 150 0 10000 + +[Research Table] + +# How many bonus research points granted for research at a research table that matches its item exactly? +researcher.research_table_bonus_exact (Research table bonus, exact) int 25 0 10000 + +# How many bonus research points granted for research at a research table that matches one of its item groups? +researcher.research_table_bonus_group (Research table bonus, group) int 5 0 10000 + +# How many bonus research points are given for each matching item near a research table. +researcher.research_table_adjacency_bonus (Research table adjacency bonus, per item) int 10 0 100000 + +# The maximum number of items that can contribute to research table adjacency bonus. +researcher.research_table_adjacency_max (Max research table adjacency) int 10 0 50 + +# The node radius in which research tables will search for matching adjacency. +researcher.research_table_adjacency_radius (Research table adjacency radius) int 3 1 10 + +# The node radius in which players can gain benefits from a nearby research table. +researcher.research_table_player_radius (Research table player radius) int 2 1 3 + +# The maximum bonus that research tables can contribute. +researcher.research_table_bonus_max (Max research table bonus) int 150 0 10000 + +[Item Research Cost Discounts] + +# The research point discount for items with a lower max stack value. +researcher.discount_stack_max (Discount for items with low max stacks) int -250 -10000 0 + +# The research point discount for items not found commonly in the world. +researcher.discount_mapgen (Discount for items not in mapgen) int -400 -10000 0 + +# The research point discount for items that cannot be crafted +researcher.discount_not_craftable (Discount for non-craftable items) int -250 -10000 0 + +[Awards] + +# If this setting is enabled and the Awards mod is enabled, then Researcher awards will be registered. +researcher.awards (Enable awards?) bool true + +[Advanced] + +# Which groups to exclude from Researcher. This list should include system groups and other "non-useful" groups that don't make sense to players. +researcher.excluded_groups (Item groups to exclude) string not_in_creative_inventory attached_node connect_to_raillike dig_immediate disable_jump disable_descend fall_damage_add_percent falling_node float level oddly_breakable_by_hand immortal disable_repair creative_breakable opaque solid \ No newline at end of file diff --git a/mods/researcher/sounds/researcher_duplicate.ogg b/mods/researcher/sounds/researcher_duplicate.ogg new file mode 100644 index 00000000..42dd4d56 Binary files /dev/null and b/mods/researcher/sounds/researcher_duplicate.ogg differ diff --git a/mods/researcher/sounds/researcher_level_up.ogg b/mods/researcher/sounds/researcher_level_up.ogg new file mode 100644 index 00000000..dbed8581 Binary files /dev/null and b/mods/researcher/sounds/researcher_level_up.ogg differ diff --git a/mods/researcher/sounds/researcher_research.ogg b/mods/researcher/sounds/researcher_research.ogg new file mode 100644 index 00000000..37c25418 Binary files /dev/null and b/mods/researcher/sounds/researcher_research.ogg differ diff --git a/mods/researcher/src/api.lua b/mods/researcher/src/api.lua new file mode 100644 index 00000000..ab74c8a0 --- /dev/null +++ b/mods/researcher/src/api.lua @@ -0,0 +1,456 @@ +-- ----------------- -- +-- GROUP FUNCTIONS -- +-- ----------------- -- + +-- Add an item to a group +function researcher.add_item_to_group(item,group) + researcher.groups[group] = researcher.groups[group] or {} + researcher.groups[group][item] = true + return true +end + +-- Iterate over items in a group +function researcher.for_item_in_group(group,fn) + for item,_ in pairs(researcher.groups[group]) do + if fn(item) then + return true + end + end + return true +end + +-- Iterate over groups of an item +function researcher.for_group_in_item(item,fn) + item = researcher.registered_items[item] + if not item then + return false + end + + for group,_ in pairs(item.groups) do + if fn(group) then + return true + end + end + return true +end + +-- Determine if item is in a specific group +function researcher.is_item_in_group(item,group) + return researcher.groups[group] and researcher.groups[group][item] and true or false +end + +-- Determine if two items have any groups in common +function researcher.do_items_share_groups(item1,item2) + item1 = researcher.registered_items[item1] + item2 = researcher.registered_items[item2] + if not item1 or not item2 then + return false + end + + for group,_ in pairs(item1.groups) do + if item2.groups[group] then + return true + end + end + return false +end + +-- ---------------- -- +-- ITEM FUNCTIONS -- +-- ---------------- -- + +-- Register an item with Researcher +function researcher.register_item(def) + -- Do not register duplicate items + if researcher.registered_items[def.name] then + return false + end + + -- Create internal item definition + local item = { + name = def.name, + groups = {}, + } + + -- Determine base research points per level for this item + item.points_per_level = def.points_per_level + + -- Determine research point adjustments that apply to this item + item.adjustments = {} + for _,adjustment in ipairs(researcher.registered_adjustments) do + local amount = adjustment.calculate(item.name) + if amount ~= 0 then + item.points_per_level = math.max(researcher.settings.points_per_research,item.points_per_level + amount) + table.insert(item.adjustments,{ + name = adjustment.name, + amount = amount, + }) + end + end + + -- Determine groups for this item + local groups = def.groups or {} + for _,group in ipairs(groups) do + item.groups[group] = true + researcher.add_item_to_group(def.name,group) + end + + -- Register the item + researcher.registered_items[def.name] = item + + return true +end + +-- ---------------------- -- +-- ADJUSTMENT FUNCTIONS -- +-- ---------------------- -- + +-- Register a adjustment function that will return a adjustment amount +function researcher.register_adjustment(def) + -- Do not register duplicate adjustments + if researcher.registered_adjustments[def.name] then + return false + end + + -- Register the new adjustment + local adjustment = { + name = def.name, + reason = def.reason, + calculate = def.calculate, + } + + researcher.registered_adjustments[def.name] = adjustment + table.insert(researcher.registered_adjustments,adjustment) + + return true +end + +function researcher.get_adjustments_for_item(item) + item = researcher.registered_items[item] + if not item then + return {} + end + + return item.adjustments +end + +-- ----------------- -- +-- BONUS FUNCTIONS -- +-- ----------------- -- + +-- Register a bonus +function researcher.register_bonus(def) + -- Do not register duplicate bonuses + if researcher.registered_bonuses[def.name] then + return false + end + + -- Register the new bonus + local bonus = { + name = def.name, + reason = def.reason, + calculate = def.calculate, + initialize_player_data = def.initialize_player_data or function() end, + } + + researcher.registered_bonuses[def.name] = bonus + table.insert(researcher.registered_bonuses,bonus) + + return true +end + +-- ---------------- -- +-- DATA FUNCTIONS -- +-- ---------------- -- + +-- Initialize player data +function researcher.initialize_player_data(player_name) + -- Create new player data + local player_data = { + -- The player's name + name = player_name, + + -- All of the player's research progress indexed by item name + research = {}, + + -- The current subject of the player's research + subject = { + image = nil, + description = "", + groups = "(Research an item on the left to see info)", + research = nil, + }, + } + + -- Initialize bonus-specific data + for _,bonus in ipairs(researcher.registered_bonuses) do + bonus.initialize_player_data(player_data) + end + + -- Save initialized player data to mod storage + researcher.save_player_data(player_name) + + -- Return initialized data + return player_data +end + +-- Get player data +function researcher.get_player_data(player_name) + -- Attempt to load player data from cache + local pstring = "player_" .. player_name + local player_data = researcher.data[pstring] + if not player_data then + -- Attempt to load player data from mod storage + player_data = researcher.storage:get(pstring) + + -- Initialize new player data if not found or parse string if found + if not player_data then + player_data = researcher.initialize_player_data(player_name) + else + player_data = minetest.deserialize(player_data) + end + + -- Link research subject to actual research + if player_data.subject.research then + player_data.subject.research = player_data.research[player_data.subject.item.name] + end + + -- Cache player data + researcher.data[pstring] = player_data + end + + -- Return player data + return player_data +end + +-- Determine the number of points to the next level +-- FIXME should be (item,level)? +function researcher.get_points_to_next_level(player,item) + item = researcher.registered_items[item] + if item then + local research = (type(player) == "string" and researcher.get_player_data(player) or player).research[item.name] + if research then + local level = research.level + if research.level <= researcher.settings.level_max then + return math.round(item.points_per_level * math.pow(research.level,researcher.settings.level_scale) / 100) * 100 + end + end + else + return 0 + end + return item.points_per_level +end + +-- Save player data; can be called many times during the current tick but will +-- only execute once on the next tick +function researcher.save_player_data(player_name) + if not researcher.data.save[player_name] then + researcher.data.save[player_name] = true + minetest.after(0,function() + researcher.storage:set_string("player_" .. player_name,minetest.serialize(researcher.get_player_data(player_name))) + researcher.data.save[player_name] = nil + end) + end +end + +-- -------------------- -- +-- RESEARCH FUNCTIONS -- +-- -------------------- -- + +-- Research an item +function researcher.research_item(player,item) + -- Initialize result + local result = { + item = item, + base = researcher.settings.points_per_research, + bonuses = {}, + total = researcher.settings.points_per_research, + success = true, + } + + -- Get player data + local player_data = type(player) == "string" and researcher.get_player_data(player) or player + + -- Cannot research beyond max research level + if player_data.research[item] and player_data.research[item].level > researcher.settings.level_max then + result = { + item = item, + base = 0, + bonuses = {}, + total = 0, + success = false, + } + return result + end + + -- Calculate bonuses + for _,bonus in ipairs(researcher.registered_bonuses) do + local amount = bonus.calculate(item,player_data) + if amount ~= 0 then + result.total = result.total + amount + table.insert(result.bonuses,{ + name = bonus.name, + reason = bonus.reason, + points = amount, + }) + end + end + + -- Get research entry + local research = player_data.research[item] or { + level = 1, + points = 0, + } + player_data.research[item] = research + player_data.subject.research = research + + -- Look up item + item = researcher.registered_items[item] + + if not item then + return { + item = "???", + base = 0, + bonuses = {}, + total = 0, + success = false, + } + end + + -- Level up research + local points_tally = research.points + result.total + local points_level = researcher.get_points_to_next_level(player_data,item.name) + while points_tally >= points_level do + research.level = math.min(researcher.settings.level_max + 1,research.level + 1) + points_tally = points_tally - points_level + points_level = researcher.get_points_to_next_level(player_data,item.name) + end + research.points = points_tally + + -- Unlock award for basic research + if researcher.settings.awards then + awards.unlock(player.name,"researcher:apprentice") + end + + -- Set points to 0 at max level and unlock Prodigious award + if research.level > researcher.settings.level_max then + research.points = 0 + if researcher.settings.awards then + awards.unlock(player.name,"researcher:prodigious") + end + end + + -- Save data + researcher.save_player_data(player_data.name) + + -- Return final research result + return result +end + +-- Research an ItemStack +function researcher.research_itemstack(player,itemstack) + if itemstack:is_empty() then + return { + item = itemstack:get_name(), + success = false, + remainder = ItemStack(itemstack:get_name() .. " 0"), + } + end + + -- Get player data for entire stack + local player_data = type(player) == "string" and researcher.get_player_data(player) or player + + -- Research each item in the stack individually + local name = itemstack:get_name() + local results = { + name = name, + success = false, + remainder = ItemStack(name .. " 0"), + } + + for i = 1, itemstack:get_count() do + local result = researcher.research_item(player_data,name) + results.success = results.success or result.success + if result.success then + table.insert(results,result) + elseif player_data.research[name].level > researcher.settings.level_max then + itemstack:set_count(itemstack:get_count() - i + 1) + results.remainder = itemstack + return results + else + return results + end + end + + -- Return all results + return results +end + +-- Research an entire inventory list +function researcher.research_inventory(player,inventory,list) + -- Get player data + local player_data = type(player) == "string" and researcher.get_player_data(player) or player + + -- Research each ItemStack in the inventory + local results = { + success = false, + } + + for i = 1, inventory:get_size(list) do + local itemstack = inventory:get_stack(list,i) + local result = researcher.research_itemstack(player_data,itemstack) + results.success = results.success or result.success + if result.success then + inventory:set_stack(list,i,result.remainder) + end + table.insert(results,result) + end + + -- Return full inventory results + return results +end + +-- ----------------------- -- +-- DUPLICATION FUNCTIONS -- +-- ----------------------- -- + +-- Duplicate the item in the player's research inventory +function researcher.duplicate_research(player) + local inventory = player:get_inventory() + local itemstack = inventory:get_stack("research",1) + if itemstack and not itemstack:is_empty() then + local item = itemstack:get_name() + local idef = minetest.registered_items[item] + if idef then + inventory:add_item("main",ItemStack(itemstack:get_name() .. " " .. itemstack:get_stack_max())) + end + end +end + +-- --------------- -- +-- GUI FUNCTIONS -- +-- --------------- -- + +-- Return a formspec that implements research +function researcher.get_formspec_data(player_name) + local player_data = researcher.get_player_data(player_name) + local subject = player_data.subject + local data = { + subject = subject, + current_points = subject.research and subject.research.points or 0, + points_to_next_level = subject.research and researcher.get_points_to_next_level(player_name,subject.item.name) or 0, + is_max_level = subject.research and (subject.research.level > researcher.settings.level_max) and true or false, + is_inventory_empty = minetest.get_inventory({ type = "player", name = player_name, }):get_stack("research",1):is_empty(), + last_result = player_data.last_result, + } + player_data.last_result = nil -- last result is only available once immediately after research + return data +end + +-- -------------------- -- +-- CALLBACK FUNCTIONS -- +-- -------------------- -- + +function researcher.register_on_research(fn) + table.insert(researcher.registered_on_research,fn) +end \ No newline at end of file diff --git a/mods/researcher/src/awards.lua b/mods/researcher/src/awards.lua new file mode 100644 index 00000000..87c170c4 --- /dev/null +++ b/mods/researcher/src/awards.lua @@ -0,0 +1,43 @@ +if researcher.settings.awards then + -- Use the available registration function, if any + local register_award = (function() + if awards.register_award then + return function(...) + awards.register_award(...) + end + elseif awards.register_achievement then + return function(...) + awards.register_achievement(...) + end + else + minetest.log("warn","Researcher does not support the loaded awards mod.") + return function() + -- unsupported awards mod, noop + end + end + end)() + + -- Apprentice: awarded for a player's first successful research + register_award("researcher:apprentice",{ + title = "Apprentice", + description = "Research any item", + difficulty = 5, + icon = "researcher_icon_bronze.png", + }) + + -- Eureka!: awarded for a player's first gained research level + register_award("researcher:eureka",{ + title = "Eureka!", + description = "Earn a research level for any item", + difficulty = 50, + icon = "researcher_icon_silver.png", + }) + + -- Prodigious: awarded for a player's first max research level + register_award("researcher:prodigious",{ + title = "Prodigious", + description = "Earn max research level for any item", + difficulty = 150, + icon = "researcher_icon_gold.png", + }) +end \ No newline at end of file diff --git a/mods/researcher/src/bonuses.lua b/mods/researcher/src/bonuses.lua new file mode 100644 index 00000000..112a5f54 --- /dev/null +++ b/mods/researcher/src/bonuses.lua @@ -0,0 +1,183 @@ +-- Research level group bonus +if researcher.settings.group_research_bonus > 0 and researcher.settings.group_research_bonus_max > 0 then + researcher.register_bonus({ + name = "researcher:research_group_research_bonus", + reason = "Group Research", + calculate = function(item,player_data) + local bonus = 0 + for subject,research in pairs(player_data.research) do + if researcher.do_items_share_groups(item,subject) then + bonus = bonus + (research.level - 1) * researcher.settings.group_research_bonus + end + end + return bonus + end, + initialize_player_data = function() + -- all bonus calculation comes from research; nothing to initialize + end, + }) +else + researcher.register_bonus({ + name = "researcher:research_group_research_bonus", + reason = "Group Research", + calculate = function() return 0 end, + initialize_player_data = function() + -- bonus is calculated from research; nothing to initialize + end, + }) +end + +-- Focused research bonus +if researcher.settings.focused_research_bonus_max > 0 and (researcher.settings.focused_research_bonus_exact > 0 or researcher.settings.focused_research_bonus_group > 0) then + researcher.register_bonus({ + name = "researcher:focused_research_bonus", + reason = "Focused Research", + calculate = function(item,player_data) + -- Calculate bonus value + if item == player_data.focused_research.item then + player_data.focused_research.bonus = player_data.focused_research.bonus + researcher.settings.focused_research_bonus_exact + elseif researcher.do_items_share_groups(item,player_data.focused_research.item) then + player_data.focused_research.bonus = player_data.focused_research.bonus + researcher.settings.focused_research_bonus_group + else + player_data.focused_research.bonus = 0 + end + + -- Set focused item + player_data.focused_research.item = item + + -- Return capped bonus value + player_data.focused_research.bonus = math.min(player_data.focused_research.bonus,researcher.settings.focused_research_bonus_max) + return player_data.focused_research.bonus + end, + initialize_player_data = function(player_data) + player_data.focused_research = { + item = "", + bonus = 0, + } + end, + }) +else + researcher.register_bonus({ + name = "researcher:focused_research_bonus", + reason = "Focused Research", + calculate = function() return 0 end, + initialize_player_data = function(player_data) + player_data.focused_research = { + item = "", + bonus = 0, + } + end, + }) +end + +-- Research table bonus +if researcher.settings.research_table_bonus_exact > 0 or researcher.settings.research_table_bonus_group > 0 or (researcher.settings.research_table_adjacency_bonus > 0 and researcher.settings.research_table_adjacency_max > 0) then + researcher.register_bonus({ + name = "researcher:research_table_bonus", + reason = "Research Table", + calculate = function(item,player_data) + -- Initialize bonus and max flag + local bonus = 0 + local bonusmax = false + + -- Track limits when tallying bonuses + local nadj = 0 + local function rtbonus(bonus,increment,adjacency) + local result = bonus + if adjacency then + local adj_bounded = math.min(adjacency,researcher.settings.research_table_adjacency_max - nadj) + nadj = nadj + adj_bounded + result = result + researcher.settings.research_table_adjacency_bonus * adj_bounded + else + result = bonus + increment + end + return math.min(result,researcher.settings.research_table_bonus_max), (result >= researcher.settings.research_table_bonus_max or nadj >= researcher.settings.research_table_adjacency_max) + end + + -- Scan radius around player for research tables + local player = minetest.get_player_by_name(player_data.name) + local research_table = nil + if player then + local pos = player:get_pos() + local radius = researcher.settings.research_table_player_radius + for _,rt in ipairs(minetest.find_nodes_in_area(pos:add(-radius),pos:add(radius),"researcher:research_table")) do + -- Get research table's focus + local meta = minetest.get_meta(rt) + local inventory = meta:get_inventory() + local itemstack = inventory:get_stack("focus",1) + local name = itemstack:get_name() + + -- If the focus item matches the item in question, then add to the + -- calculated bonus accordingly + if item == name then + bonus, bonusmax = rtbonus(bonus,(research_table and (researcher.settings.research_table_bonus_exact - researcher.settings.research_table_bonus_group) or researcher.settings.research_table_bonus_exact)) + if bonusmax then + return bonus + end + research_table = rt + break -- cannot do better than an exact match + elseif not research_table and researcher.do_items_share_groups(item,name) then + bonus, bonusmax = rtbonus(bonus,researcher.settings.research_table_bonus_group) + if bonusmax then + return bonus + end + research_table = rt + -- keep scanning for better matches + end + end + + -- Calculate adjacency bonus for research table + if research_table then + local radius = researcher.settings.research_table_adjacency_radius + local pos1 = research_table:add(-radius) + local pos2 = research_table:add(radius) + + -- Check nearby node groups + bonus, bonusmax = rtbonus(bonus,researcher.settings.research_table_adjacency_bonus,#minetest.find_nodes_in_area(pos1,pos2,(function() + local groups = {} + for group,_ in pairs(researcher.registered_items[item].groups) do + table.insert(groups,"group:" .. group) + end + return groups + end)())) + if bonusmax then + return bonus + end + + -- Check nearby node inventories + for _,node in ipairs(minetest.find_nodes_with_meta(pos1,pos2)) do + if not node:equals(research_table) then + local nodemeta = minetest.get_meta(node) + local nodeinventory = nodemeta:get_inventory() + if nodeinventory then + for list,stacks in pairs(nodeinventory:get_lists() or {}) do + for _,itemstack in ipairs(stacks or {}) do + if not itemstack:is_empty() and researcher.do_items_share_groups(item,itemstack:get_name()) then + bonus, bonusmax = rtbonus(bonus,researcher.settings.research_table_adjacency_bonus,itemstack:get_count()) + if bonusmax then + return bonus + end + end + end + end + end + end + end + else + return 0 -- no bonus if no research table was found + end + else + return 0 -- no bonus if player is mysteriously not found + end + + -- Return partial bonus total + return bonus + end, + }) +else + researcher.register_bonus({ + name = "researcher:research_table_bonus", + reason = "Research Table", + calculate = function() return 0 end, + }) +end \ No newline at end of file diff --git a/mods/researcher/src/commands.lua b/mods/researcher/src/commands.lua new file mode 100644 index 00000000..aa490867 --- /dev/null +++ b/mods/researcher/src/commands.lua @@ -0,0 +1,51 @@ +local show_formspec = (function() + if researcher.dependencies.sfinv and sfinv.enabled then + return function(name) + local player = minetest.get_player_by_name(name) + sfinv.set_page(player,"researcher:player_research") + return "Use the inventory (default key 'i') to perform research." + end + elseif researcher.dependencies.mcl_inventory then + return function(name) + return "Use the inventory (default key 'i') to perform research." + end + elseif researcher.dependencies.unified_inventory then + return function(name) + return "Use the inventory (default key 'i') to perform research." + end + elseif researcher.dependencies.i3 then + return function(name) + local player = minetest.get_player_by_name(name) + i3.set_tab(player,"research") + return "Use the inventory (default key 'i') to perform research." + end + else + return function(name) + minetest.show_formspec(name,"researcher:player_research",researcher.get_formspec(name)) + end + end +end)() + +minetest.register_chatcommand("research",{ + params = " ", + description = "interact with researcher", + func = function(name,params) + if params == "reset" then + researcher.data["player_" .. name] = researcher.initialize_player_data(name) + return true, "Research has been fully reset." + end + + if params:find("^reset .+$") then + local item = params:split(" ")[2] + researcher.get_player_data(name).research[item] = nil + researcher.save_player_data(name) + return true, "Research has been reset for " .. item + end + + if not params or params == "" or params == "show" then + return true, show_formspec(name) + end + + return false, "Unknown or incorrect researcher command" + end +}) \ No newline at end of file diff --git a/mods/researcher/src/gui.lua b/mods/researcher/src/gui.lua new file mode 100644 index 00000000..9ce0aa83 --- /dev/null +++ b/mods/researcher/src/gui.lua @@ -0,0 +1,484 @@ +-- ----------------- -- +-- LOCAL FUNCTIONS -- +-- ----------------- -- + +local function format_formspec(formspec,...) + return string.format(string.gsub(formspec,"%-%-[^\n]*",""),...) +end + +local get_ui = (function() + if researcher.dependencies.sfinv and sfinv.enabled and not researcher.dependencies.i3 then + -- Get sfinv formspec + return function(player_name) + local data = researcher.get_formspec_data(player_name) + + local status_string = "hypertext[0.3,2.3;4,4;;(place item above to analyze)]" + if data.last_result then + status_string = "hypertext[0.3,2.3;4,4;;Research successful!\n\n" .. data.last_result .. "]" + end + + local progress_bar = data.subject.image and string.format([[ + box[4.475,3.675;%f,0.625;#00ff00] + image[4.45,3.65;3.65,0.8;researcher_research_points_border.png;7] + hypertext[4.3,3.65;4,0.9;;Level %s%s] + ]], + data.is_max_level and 2.85 or (2.85 * (data.current_points / data.points_to_next_level)), + data.is_max_level and "MAX" or (data.subject.research and data.subject.research.level or 1), + data.is_max_level and "" or ("\n" .. (data.subject.research and data.subject.research.points or 0) .. " / " .. researcher.get_points_to_next_level(player_name,data.subject.item.name))) + + local decor = data.is_inventory_empty and "inactive" or "active" + + return format_formspec([[ + -- Background boxes; research/duplication on the left, info/progress on the right + box[0,0;3.8,4.9;#00000040] + box[4,0;3.8,4.9;#00000040] + + -- Player's 1x1 research inventory with optional research/duplication button + -- at the bottom + image[1.5,0.8;1,1;researcher_gui_hb_bg.png] + image[1.1,0.375;2,2;researcher_research_inventory_decor_%s.png] + list[current_player;research;1.5,0.8;1,1;0] + listring[current_player;main] + listring[current_player;research] + %s + + -- Current research item image, name, and groups + item_image[5,0.2;2.2,2.2;%s] + hypertext[4.3,2.3;4,0.5;;%s] + box[4.3,2.6;3.2,0.001;#00000099] + hypertext[4.3,2.7;4,1.5;;%s] + + -- Research level/points progress bar + %s + ]], + decor, + data.is_inventory_empty and status_string or string.format("button[0.4,3.3;3.15,1.6;%s;%s]",data.is_max_level and "duplicate" or "research",data.is_max_level and "Duplicate" or "Research"), + data.subject.image or "", + data.subject.description, + data.subject.research and data.subject.groups or "(research to learn item groups)", + progress_bar or "") + end + + -- Get Mineclonia/VoxelLibre formspec + elseif researcher.dependencies.mcl_inventory then + return function(player_name) + local data = researcher.get_formspec_data(player_name) + + local status_string = "hypertext[1,2.75;4.5,4;;(place item above to analyze)]" + if data.last_result then + status_string = "hypertext[1,2.75;4.5,4;;Research successful!\n\n" .. data.last_result .. "]" + end + + local progress_bar = data.subject.image and string.format([[ + box[6.55,4.41;%f,0.73;#00ff00] + image[6.5,4.4;3.725,0.75;researcher_research_points_border.png;7] + hypertext[6.1,4.325;4.5,0.9;;Level %s%s] + ]], + data.is_max_level and 3.66 or (3.66 * (data.current_points / data.points_to_next_level)), + data.is_max_level and "MAX" or (data.subject.research and data.subject.research.level or 1), + data.is_max_level and "" or ("\n" .. (data.subject.research and data.subject.research.points or 0) .. " / " .. researcher.get_points_to_next_level(player_name,data.subject.item.name))) + + local decor = data.is_inventory_empty and "inactive" or "active" + + return format_formspec([[ + -- Background boxes; research/duplication on the left, info/progress on the right + box[1,0.2;4.5,5.1;#00000040] + box[6.1,0.2;4.5,5.1;#00000040] + + -- Player's 1x1 research inventory with optional research/duplication button + -- at the bottom + image[2.75,1;1,1;researcher_gui_hb_bg.png] + image[2.25,0.5;2,2;researcher_research_inventory_decor_%s.png] + list[current_player;research;2.75,1;1,1;0] + listring[current_player;main] + listring[current_player;research] + %s + + -- Current research item image, name, and groups + item_image[7.325,0.4;2,2;%s] + hypertext[6.1,2.5;4.5,0.5;;%s] + box[6.5,2.8;3.75,0.001;#00000099] + hypertext[6.1,2.9;4.5,1.5;;%s] + + -- Research level/points progress bar + %s + ]], + decor, + data.is_inventory_empty and status_string or string.format("button[1.25,4.4;4,0.75;%s;%s]",data.is_max_level and "duplicate" or "research",data.is_max_level and "Duplicate" or "Research"), + data.subject.image or "", + data.subject.description, + data.subject.research and data.subject.groups or "(research to learn item groups)", + progress_bar or "") + end + + -- Get Unified Inventory formspec + elseif researcher.dependencies.unified_inventory then + return function(player_name) + local data = researcher.get_formspec_data(player_name) + + local status_string = "hypertext[0.5,2.75;4.5,4;;(place item above to analyze)]" + if data.last_result then + status_string = "hypertext[0.5,2.75;4.5,4;;Research successful!\n\n" .. data.last_result .. "]" + end + + local progress_bar = data.subject.image and string.format([[ + box[6.05,4.61;%f,0.73;#00ff00] + image[6,4.6;3.725,0.75;researcher_research_points_border.png;7] + hypertext[5.6,4.525;4.5,0.9;;Level %s%s] + ]], + data.is_max_level and 3.66 or (3.66 * (data.current_points / data.points_to_next_level)), + data.is_max_level and "MAX" or (data.subject.research and data.subject.research.level or 1), + data.is_max_level and "" or ("\n" .. (data.subject.research and data.subject.research.points or 0) .. " / " .. researcher.get_points_to_next_level(player_name,data.subject.item.name))) + + local decor = data.is_inventory_empty and "inactive" or "active" + + return format_formspec([[ + -- Background boxes; research/duplication on the left, info/progress on the right + box[0.5,0.2;4.5,5.4;#00000040] + box[5.6,0.2;4.5,5.4;#00000040] + + -- Player's 1x1 research inventory with optional research/duplication button + -- at the bottom + image[2.25,1;1,1;researcher_gui_hb_bg.png] + image[1.75,0.5;2,2;researcher_research_inventory_decor_%s.png] + list[current_player;research;2.25,1;1,1;0] + listring[current_player;main] + listring[current_player;research] + %s + + -- Current research item image, name, and groups + item_image[6.825,0.4;2,2;%s] + hypertext[5.6,2.5;4.5,0.5;;%s] + box[6,2.8;3.75,0.001;#00000099] + hypertext[5.6,2.9;4.5,1.5;;%s] + + -- Research level/points progress bar + %s + ]], + decor, + data.is_inventory_empty and status_string or string.format("button[0.75,4.6;4,0.75;%s;%s]",data.is_max_level and "duplicate" or "research",data.is_max_level and "Duplicate" or "Research"), + data.subject.image or "", + data.subject.description, + data.subject.research and data.subject.groups or "(research to learn item groups)", + progress_bar or "") + end + + -- Get i3 formspec + elseif researcher.dependencies.i3 then + return function(player_name) + local data = researcher.get_formspec_data(player_name) + + local status_string = "hypertext[0.5,3.05;4.5,4;;(place item above to analyze)]" + if data.last_result then + status_string = "hypertext[0.5,3.05;4.5,4;;Research successful!\n\n" .. data.last_result .. "]" + end + + local progress_bar = data.subject.image and string.format([[ + box[5.75,4.925;%f,0.715;#00ff00] + image[5.7,4.9;3.725,0.75;researcher_research_points_border.png;7] + hypertext[5.3,4.825;4.5,0.9;;Level %s%s] + ]], + data.is_max_level and 3.64 or (3.64 * (data.current_points / data.points_to_next_level)), + data.is_max_level and "MAX" or (data.subject.research and data.subject.research.level or 1), + data.is_max_level and "" or ("\n" .. (data.subject.research and data.subject.research.points or 0) .. " / " .. researcher.get_points_to_next_level(player_name,data.subject.item.name))) + + local decor = data.is_inventory_empty and "inactive" or "active" + + return format_formspec([[ + -- Background boxes; research/duplication on the left, info/progress on the right + box[0.5,0.5;4.5,5.4;#00000040] + box[5.3,0.5;4.5,5.4;#00000040] + + -- Player's 1x1 research inventory with optional research/duplication button + -- at the bottom + image[2.25,1.3;1,1;researcher_gui_hb_bg.png] + image[1.75,0.8;2,2;researcher_research_inventory_decor_%s.png] + list[current_player;research;2.25,1.3;1,1;0] + listring[current_player;main] + listring[current_player;research] + %s + + -- Current research item image, name, and groups + item_image[6.525,0.7;2,2;%s] + hypertext[5.3,2.8;4.5,0.5;;%s] + box[5.7,3.1;3.75,0.001;#00000099] + hypertext[5.3,3.2;4.5,1.5;;%s] + + -- Research level/points progress bar + %s + ]], + decor, + data.is_inventory_empty and status_string or string.format("button[0.75,4.9;4,0.75;%s;%s]",data.is_max_level and "duplicate" or "research",data.is_max_level and "Duplicate" or "Research"), + data.subject.image or "", + data.subject.description, + data.subject.research and data.subject.groups or "(research to learn item groups)", + progress_bar or "") + end + + -- Get universal formspec + else + return function(player_name) + local data = researcher.get_formspec_data(player_name) + + local status_string = "hypertext[0.3,2.3;4,4;;(place item above to analyze)]" + if data.last_result then + status_string = "hypertext[0.3,2.3;4,4;;Research successful!\n\n" .. data.last_result .. "]" + end + + local progress_bar = data.subject.image and string.format([[ + box[4.475,3.675;%f,0.625;#00ff00] + image[4.45,3.65;3.65,0.8;researcher_research_points_border.png;7] + hypertext[4.3,3.65;4,0.9;;Level %s%s] + ]], + data.is_max_level and 2.85 or (2.85 * (data.current_points / data.points_to_next_level)), + data.is_max_level and "MAX" or (data.subject.research and data.subject.research.level or 1), + data.is_max_level and "" or ("\n" .. (data.subject.research and data.subject.research.points or 0) .. " / " .. researcher.get_points_to_next_level(player_name,data.subject.item.name))) + + local decor = data.is_inventory_empty and "inactive" or "active" + + return format_formspec([[ + -- sfinv size + padding + size[8,9.1] + + -- Background boxes; research/duplication on the left, info/progress on the right + box[0,0;3.8,4.9;#00000040] + box[4,0;3.8,4.9;#00000040] + + -- Player's 1x1 research inventory with optional research/duplication button + -- at the bottom + image[1.5,0.8;1,1;researcher_gui_hb_bg.png] + image[1.1,0.375;2,2;researcher_research_inventory_decor_%s.png] + list[current_player;research;1.5,0.8;1,1;0] + listring[current_player;main] + listring[current_player;research] + %s + + -- Current research item image, name, and groups + item_image[5,0.2;2.2,2.2;%s] + hypertext[4.3,2.3;4,0.5;;%s] + box[4.3,2.6;3.2,0.001;#00000099] + hypertext[4.3,2.7;4,1.5;;%s] + + -- Research level/points progress bar + %s + + -- Player's main inventory a la sfinv + image[0,5.2;1,1;researcher_gui_hb_bg.png] + image[1,5.2;1,1;researcher_gui_hb_bg.png] + image[2,5.2;1,1;researcher_gui_hb_bg.png] + image[3,5.2;1,1;researcher_gui_hb_bg.png] + image[4,5.2;1,1;researcher_gui_hb_bg.png] + image[5,5.2;1,1;researcher_gui_hb_bg.png] + image[6,5.2;1,1;researcher_gui_hb_bg.png] + image[7,5.2;1,1;researcher_gui_hb_bg.png] + list[current_player;main;0,5.2;8,1;] + list[current_player;main;0,6.35;8,3;8] + ]], + decor, + data.is_inventory_empty and status_string or string.format("button[0.4,3.3;3.15,1.6;%s;%s]",data.is_max_level and "duplicate" or "research",data.is_max_level and "Duplicate" or "Research"), + data.subject.image or "", + data.subject.description, + data.subject.research and data.subject.groups or "(research to learn item groups)", + progress_bar or "") + end + end +end)() + +local refresh_ui = (function() + -- Refresh sfinv formspec + if researcher.dependencies.sfinv and sfinv.enabled and not researcher.dependencies.i3 then + return function(player) + sfinv.set_player_inventory_formspec(player,sfinv.get_or_create_context(player)) + end + + -- Refresh Mineclone formspec + elseif researcher.dependencies.mcl_inventory then + return function(player) + mcl_inventory.update_inventory_formspec(player) + end + + -- Refresh Unified Inventory formspec + elseif researcher.dependencies.unified_inventory then + return function(player) + unified_inventory.set_inventory_formspec(player,"Research") + end + + -- Refresh i3 formspec + elseif researcher.dependencies.i3 then + return function(player) + i3.set_fs(player) + end + + -- Refresh universal formspec + else + return function(player) + local name = player:get_player_name() + minetest.show_formspec(name,"researcher:player_research",get_ui(name)) + end + end +end)() + +local do_research = function(player,fields,refresh) + if fields.research then + local player_name = player:get_player_name() + local inventory = player:get_inventory() + local item = inventory:get_stack("research",1) + if not item:is_empty() then + -- Get research level to compare with after research + local player_data = researcher.get_player_data(player_name) + local research = player_data.research[item:get_name()] + local level_before = 1 + if research then + level_before = research.level + end + + -- Perform research + local results = researcher.research_inventory(player_name,inventory,"research") + + -- Aggregate results + local totals = { + items = 0, + base = 0, + bonuses = {}, + } + for _,itemstack in ipairs(results) do + for _,i in ipairs(itemstack) do + totals.items = totals.items + 1 + totals.base = totals.base + i.base + for _,bonus in ipairs(i.bonuses) do + totals.bonuses[bonus.reason] = totals.bonuses[bonus.reason] or 0 + totals.bonuses[bonus.reason] = totals.bonuses[bonus.reason] + bonus.points + end + end + end + player_data.last_result = "Items researched: \nBase points: \n" + for reason,points in pairs(totals.bonuses) do + player_data.last_result = player_data.last_result .. reason .. ": " .. (points > 0 and "\n" + end + + -- Refresh UI + if refresh ~= false then + refresh_ui(player) + end + + -- Determine level up progress + research = player_data.research[item:get_name()] + if research and research.level > level_before then + -- Unlock eureka award + if researcher.settings.awards then + awards.unlock(player_name,"researcher:eureka") + end + + -- Play research level up sound + minetest.sound_play({ + name = "researcher_level_up", + gain = 0.5, + },{ to_player = player_name },true) + else + -- Play normal research sound + minetest.sound_play({ + name = "researcher_research", + gain = 0.1, + pitch = 1 + (math.random(1,4) / 10), + },{ to_player = player_name },true) + end + end + elseif fields.duplicate then + researcher.duplicate_research(player) + minetest.sound_play({ + name = "researcher_duplicate", + gain = 0.5, + pitch = 1.5, + },{ to_player = player_name },true) + end +end + +-- ------------------ -- +-- GUI INTEGRATIONS -- +-- ------------------ -- + +-- Configure sfinv UI +if researcher.dependencies.sfinv and sfinv.enabled and not researcher.dependencies.i3 then + sfinv.register_page("researcher:player_research",{ + title = "Research", + get = function(self,player,context) + return sfinv.make_formspec(player,context,get_ui(player:get_player_name()),true) + end, + is_in_nav = function() + return true + end, + on_player_receive_fields = function(self,player,context,fields) + do_research(player,fields) + end, + }) + +-- Configure Mineclonia/VoxelLibre UI +elseif researcher.dependencies.mcl_inventory then + mcl_inventory.register_survival_inventory_tab({ + id = "research", + description = "Research", + item_icon = "researcher:research_table", + show_inventory = true, + build = function(player) + return get_ui(player:get_player_name()) + end, + handle = function(player, fields) + do_research(player,fields) + end, + }) + +-- Configure Unified Inventory UI +elseif researcher.dependencies.unified_inventory then + unified_inventory.register_page("Research",{ + get_formspec = function(player,formspec) + return { formspec = formspec.standard_inv_bg .. get_ui(player:get_player_name()) } + end, + }) + + unified_inventory.register_button("Research",{ + type = "image", + image = "researcher_icon_black.png", + tooltip = "Research", + hide_lite = false, + }) + + minetest.register_on_player_receive_fields(function(player,formname,fields) + if formname == "" and (fields.research or fields.duplicate) then + do_research(player,fields) + return + end + end) + +-- Configure i3 UI +elseif researcher.dependencies.i3 then + i3.new_tab("research",{ + description = "Research", + slots = true, + formspec = function(player, data, fs) + fs(get_ui(player:get_player_name())) + end, + fields = function(player, data, fields) + if fields.research or fields.duplicate then + do_research(player,fields,false) + end + end, + }) + +-- Configure universal/standalone UI +else + minetest.register_on_player_receive_fields(function(player,formname,fields) + if formname == "researcher:player_research" then + do_research(player,fields) + return + end + end) +end + +-- Refresh UI when research inventory changes +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if inventory_info.listname == "research" or inventory_info.to_list == "research" or inventory_info.from_list == "research" then + refresh_ui(player) + return true + end + return false +end) \ No newline at end of file diff --git a/mods/researcher/src/inventory.lua b/mods/researcher/src/inventory.lua new file mode 100644 index 00000000..e78e150f --- /dev/null +++ b/mods/researcher/src/inventory.lua @@ -0,0 +1,62 @@ +-- Initialize player research inventory +minetest.register_on_joinplayer(function(player) + player:get_inventory():set_size("research",1) +end) + +-- Set the subject of the player's research based on their research inventory +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if inventory_info.listname == "research" or inventory_info.to_list == "research" or inventory_info.from_list == "research" then + -- Get item info from research inventory + local item = inventory:get_stack("research",1) + + -- Get player name and data + local player_name = player:get_player_name() + local player_data = researcher.get_player_data(player_name) + + -- Cache inventory empty status + player_data.subject.is_empty = item:is_empty() + + -- Set the player's research subject if research inventory has an item in it + local name = item:get_name() + local subject = player_data.subject + local description, groups + if not item:is_empty() then + subject.name = name + subject.item = researcher.registered_items[name] + subject.image = name + description = minetest.registered_items[name] + if description then + subject.description = description.description:split("\n",1)[1] + else + subject.description = "???" + end + + if subject.item then + subject.groups = (function() + local str = "" + local grouplist = {} + for group,_ in pairs(subject.item.groups) do + table.insert(grouplist,group) + end + table.sort(grouplist) + return table.concat(grouplist,", ") + end)() + subject.research = player_data.research[name] + else + subject.groups = "(groups unknown)" + subject.research = nil + subject.item = { + name = "???", + groups = {}, + adjustments = {}, + } + end + end + + -- Save player data + researcher.save_player_data(player_name) + + return true + end + return false +end) \ No newline at end of file diff --git a/mods/researcher/src/research_table.lua b/mods/researcher/src/research_table.lua new file mode 100644 index 00000000..5533609f --- /dev/null +++ b/mods/researcher/src/research_table.lua @@ -0,0 +1,178 @@ +-- Function to get formspec string +local function get_formspec(item) + -- Set item info string + local iteminfo = [[ + box[1,2.75;6,0.001;#00000099] + hypertext[2.3,3.15;4,1.5;;(place item above to set focus)] + ]] + if item then + local description = minetest.registered_items[item] and minetest.registered_items[item].description:split("\n")[1] + local groups = researcher.registered_items[item] and (function() + local str = "" + local grouplist = {} + for group,_ in pairs(researcher.registered_items[item].groups) do + table.insert(grouplist,group) + end + table.sort(grouplist) + return table.concat(grouplist,", ") + end)() + iteminfo = string.format([[ + box[1,2.75;6,0.001;#00000099] + hypertext[2.3,3;4,0.5;;%s] + hypertext[2.3,3.35;4,1.5;;%s] + ]], + description or "???", + groups or "(groups unknown)") + end + + return string.format([[ + size[8,9.1] + box[0,0;7.8,5;#00000040] + + image[3.1,0.575;2,2;researcher_research_inventory_decor_%s.png] + list[context;focus;3.5,1;1,1;0] + listring[current_player;main] + listring[context;focus] + + %s + + image[0,5.2;1,1;researcher_gui_hb_bg.png] + image[1,5.2;1,1;researcher_gui_hb_bg.png] + image[2,5.2;1,1;researcher_gui_hb_bg.png] + image[3,5.2;1,1;researcher_gui_hb_bg.png] + image[4,5.2;1,1;researcher_gui_hb_bg.png] + image[5,5.2;1,1;researcher_gui_hb_bg.png] + image[6,5.2;1,1;researcher_gui_hb_bg.png] + image[7,5.2;1,1;researcher_gui_hb_bg.png] + list[current_player;main;0,5.2;8,1;] + list[current_player;main;0,6.35;8,3;8] + ]], + item and "active" or "inactive", + iteminfo) +end + +-- Function for refreshing infotext when node meta inventory changes +local function update_metadata(pos) + local meta = minetest.get_meta(pos) + local item = meta:get_inventory():get_stack("focus",1) + if item and not item:is_empty() then + local iname = item:get_name() + item = minetest.registered_items[iname] + description = "" + if item and item.description then + meta:set_string("infotext","Research Table: " .. item.description:split("\n")[1]) + end + meta:set_string("formspec",get_formspec(iname)) + else + meta:set_string("formspec",get_formspec(nil)) + meta:set_string("infotext","Research Table") + end +end + +-- Register research table node +minetest.register_node("researcher:research_table",{ + -- Node definition fields + description = "Research Table", + short_description = "Research Table", + drawtype = "mesh", + mesh = "research_table.obj", + tiles = { + { name = "researcher_research_table_frame.png" }, + { name = "researcher_research_table_surface.png" }, + }, + paramtype2 = "4dir", + stack_max = 1, + sounds = (function() + if researcher.dependencies.default then + return default.node_sound_wood_defaults() + elseif researcher.dependencies.mcl_sounds then + return mcl_sounds.node_sound_wood_defaults() + else + return nil -- no specific sounds + end + end)(), + + -- Set research table groups + groups = { + oddly_breakable_by_hand = 1, + }, + + -- Initialize research table data + on_construct = function(pos) + -- Set inventory size + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + inventory:set_size("focus", 1) + + -- Set infotext + meta:set_string("infotext","Research Table") + + -- Set meta formspec + meta:set_string("formspec",get_formspec(nil)) + end, + + -- Drop inventory contents when destroyed + on_destruct = function(pos) + local item = minetest.get_meta(pos):get_inventory():get_stack("focus",1) + if item and not item:is_empty() then + minetest.add_item(pos,item) + end + end, + + -- Update infotext when inventory changes + on_metadata_inventory_move = update_metadata, + on_metadata_inventory_take = update_metadata, + on_metadata_inventory_put = update_metadata, +}) + +-- Register research table crafting recipe +minetest.register_craft({ + output = "researcher:research_table", + recipe = { + {"group:stone", "group:stone", "group:stone"}, + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "", "group:wood"}, + }, +}) + +-- Register ABM for activation particles +minetest.register_abm({ + label = "Researcher: Research Table Activation Particles", + nodenames = {"researcher:research_table"}, + interval = 4, + chance = 1, + catch_up = false, + action = function(pos) + -- Do nothing if research table is empty + if minetest.get_meta(pos):get_inventory():get_stack("focus",1):is_empty() then + return + end + + -- Show item particles to nearby players + local radius = researcher.settings.research_table_player_radius + for object in minetest.objects_in_area(pos:add(-2),pos:add(2)) do + if object:is_player() then + minetest.add_particlespawner({ + playername = object:get_player_name(), + amount = 16, + time = 4, + pos = { + min = pos:add(vector.new(-0.6,0,-0.6)), + max = pos:add(vector.new(0.6,0,0.6)), + }, + minsize = 1, + maxsize = 1.5, + minvel = { x = 0, y = 0.05, z = 0 }, + maxvel = { x = 0, y = 0.1, z = 0 }, + minacc = { x = 0, y = 0.1, z = 0 }, + maxacc = { x = 0, y = 0.2, z = 0 }, + minexptime = 4.5, + maxexptime = 3, + texture = "plus.png^[colorize:#ffff77^[opacity:180", + glow = 14, + collisiondetection = false, + }) + end + end + end, +}) \ No newline at end of file diff --git a/mods/researcher/src/scan.lua b/mods/researcher/src/scan.lua new file mode 100644 index 00000000..579c2442 --- /dev/null +++ b/mods/researcher/src/scan.lua @@ -0,0 +1,195 @@ +-- Scan all items for groups +minetest.register_on_mods_loaded(function() + -- Reduce research difficulty for items not present in mapgen + local mapgen_nodes = {} + if researcher.settings.discount_mapgen < 0 then + mapgen_nodes = { + map_drop = function(self,node) + local def = minetest.registered_nodes[node] + if not def then + return "" + end + + local drop = def.drop + if not drop or drop == "" then + self[node] = true + return node + elseif type(drop) == "string" then + self[drop] = true + return drop + elseif type(drop) == "table" then + for _,item in ipairs(drop.items or {}) do + if type(item) == "table" then + for _,i in ipairs(item.items) do + self[i] = true + end + end + end + end + end, + } + + for _,def in pairs(minetest.registered_biomes) do + for _,node_type in ipairs({ + "node_top", + "node_filler", + "node_stone", + "node_water_top", + "node_water", + "node_river_water", + "node_riverbed", + "node_cave_liquid", + "node_dungeon", + "node_dungeon_alt", + "node_dungeon_stair", + }) do + if def[node_type] then + local node = def[node_type] + if type(node) == "string" then + mapgen_nodes[node] = true + mapgen_nodes:map_drop(node) + elseif type(node) == "table" then + for _,n in ipairs(node) do + if type(n) == "string" then + mapgen_nodes[n] = true + mapgen_nodes:map_drop(n) + end + end + end + end + end + end + + local read_schematics = {} + for _,def in pairs(minetest.registered_decorations) do + if (not def.deco_type or def.deco_type == "simple") and def.decoration then + if type(def.decoration) == "string" then + mapgen_nodes[def.decoration] = true + mapgen_nodes:map_drop(def.decoration) + elseif type(def.decoration) == "table" then + for _,node in ipairs(def.decoration) do + if type(node) == "string" then + mapgen_nodes[node] = true + local to = mapgen_nodes:map_drop(node) + end + end + end + elseif def.deco_type == "schematic" and def.schematic then + local schematic + if type(def.schematic) == "string" and not read_schematics[def.schematic] then + read_schematics[def.schematic] = true + schematic = minetest.read_schematic(def.schematic,{ write_yslice_prob = "none" }) + elseif type(def.schematic) == "table" then + schematic = def.schematic + end + + if schematic then + for _,node in ipairs(schematic.data) do + if type(node.name) == "string" and node.name ~= "air" then + mapgen_nodes[node.name] = true + mapgen_nodes:map_drop(node.name) + end + end + end + end + end + + for _,def in pairs(minetest.registered_ores) do + if type(def.ore) == "string" then + mapgen_nodes[def.ore] = true + mapgen_nodes:map_drop(def.ore) + end + end + + researcher.register_adjustment({ + name = "researcher:discount_mapgen", + reason = "Item not abundant in the world", + calculate = function(item) + return (not mapgen_nodes[item]) and researcher.settings.discount_mapgen or 0 + end, + }) + else + researcher.register_adjustment({ + name = "researcher:discount_mapgen", + reason = "Item not abundant in world", + calculate = function() return 0 end, + }) + end + + -- Register low stack discount + local stack_max = researcher.dependencies.mcl_inventory and 64 or tonumber(minetest.settings:get("default_stack_max",99) or 99) + local low_stack = {} + if researcher.settings.discount_stack_max < 0 then + researcher.register_adjustment({ + name = "researcher:discount_stack_max", + reason = "Item has a stack max less than the default max", + calculate = function(item) + return low_stack[item] and researcher.settings.discount_stack_max or 0 + end, + }) + else + researcher.register_adjustment({ + name = "researcher:discount_stack_max", + reason = "Item has a stack max less than the default max", + calculate = function() return 0 end, + }) + end + + -- Reduce research difficulty for items that are not craftable + local not_craftable = {} + if researcher.settings.discount_not_craftable < 0 then + researcher.register_adjustment({ + name = "researcher:discount_not_craftable", + reason = "Item is not craftable", + calculate = function(item) + return (not mapgen_nodes[item] and not_craftable[item]) and researcher.settings.discount_not_craftable or 0 + end, + }) + else + researcher.register_adjustment({ + name = "researcher:discount_not_craftable", + reason = "Item is not craftable", + calculate = function() return 0 end, + }) + end + + -- Register items with Researcher + for name,def in pairs(minetest.registered_items) do + -- Get low stack data + if def.tool_capabilities or ((def.stack_max or stack_max) < stack_max) then + low_stack[name] = def.stack_max or (def.tool_capabilities and 1) or stack_max + end + + -- Filter out unwanted groups + local groups = def.groups + local keep_groups = {} + + if groups then + for group,value in pairs(groups) do + if value > 0 and not researcher.excluded_groups[group] then + table.insert(keep_groups,group) + end + end + end + + -- Check for valid recipes + local recipes = minetest.get_all_craft_recipes(name) or {} + for _,recipe in ipairs(recipes) do + if recipe.method == "normal" or recipe.method == "cooking" then + recipes = 1 + break + end + end + + if recipes ~= 1 then + not_craftable[name] = true + end + + -- Register item + researcher.register_item({ + name = name, + points_per_level = researcher.settings.points_per_level, + groups = keep_groups, + }) + end +end) \ No newline at end of file diff --git a/mods/researcher/textures/researcher_gui_hb_bg.png b/mods/researcher/textures/researcher_gui_hb_bg.png new file mode 100644 index 00000000..99248e17 Binary files /dev/null and b/mods/researcher/textures/researcher_gui_hb_bg.png differ diff --git a/mods/researcher/textures/researcher_icon_black.png b/mods/researcher/textures/researcher_icon_black.png new file mode 100644 index 00000000..dbaaa9bf Binary files /dev/null and b/mods/researcher/textures/researcher_icon_black.png differ diff --git a/mods/researcher/textures/researcher_icon_bronze.png b/mods/researcher/textures/researcher_icon_bronze.png new file mode 100644 index 00000000..059c60f8 Binary files /dev/null and b/mods/researcher/textures/researcher_icon_bronze.png differ diff --git a/mods/researcher/textures/researcher_icon_gold.png b/mods/researcher/textures/researcher_icon_gold.png new file mode 100644 index 00000000..3be31cb9 Binary files /dev/null and b/mods/researcher/textures/researcher_icon_gold.png differ diff --git a/mods/researcher/textures/researcher_icon_silver.png b/mods/researcher/textures/researcher_icon_silver.png new file mode 100644 index 00000000..d4de71a0 Binary files /dev/null and b/mods/researcher/textures/researcher_icon_silver.png differ diff --git a/mods/researcher/textures/researcher_research_inventory_decor_active.png b/mods/researcher/textures/researcher_research_inventory_decor_active.png new file mode 100644 index 00000000..84875fbf Binary files /dev/null and b/mods/researcher/textures/researcher_research_inventory_decor_active.png differ diff --git a/mods/researcher/textures/researcher_research_inventory_decor_inactive.png b/mods/researcher/textures/researcher_research_inventory_decor_inactive.png new file mode 100644 index 00000000..d0c0c892 Binary files /dev/null and b/mods/researcher/textures/researcher_research_inventory_decor_inactive.png differ diff --git a/mods/researcher/textures/researcher_research_points_border.png b/mods/researcher/textures/researcher_research_points_border.png new file mode 100644 index 00000000..ee3cb590 Binary files /dev/null and b/mods/researcher/textures/researcher_research_points_border.png differ diff --git a/mods/researcher/textures/researcher_research_table_frame.png b/mods/researcher/textures/researcher_research_table_frame.png new file mode 100644 index 00000000..1c9ebc7a Binary files /dev/null and b/mods/researcher/textures/researcher_research_table_frame.png differ diff --git a/mods/researcher/textures/researcher_research_table_surface.png b/mods/researcher/textures/researcher_research_table_surface.png new file mode 100644 index 00000000..52a4bba7 Binary files /dev/null and b/mods/researcher/textures/researcher_research_table_surface.png differ diff --git a/mods/sfinv_buttons/.mailmap b/mods/sfinv_buttons/.mailmap new file mode 100644 index 00000000..3d78b584 --- /dev/null +++ b/mods/sfinv_buttons/.mailmap @@ -0,0 +1,2 @@ +Wuzzy +Wuzzy diff --git a/mods/sfinv_buttons/API.md b/mods/sfinv_buttons/API.md new file mode 100644 index 00000000..667821fe --- /dev/null +++ b/mods/sfinv_buttons/API.md @@ -0,0 +1,30 @@ +# API documentation for [`sfinv_buttons`] + +Use this very simple API to add your own buttons to the new tab. There is only +one function: `sfinv_buttons.register_button`. + +## `sfinv_buttons.register_button(name, def)` + +* `name`: Unique button identifier +* `def`: Configuration table (see below) + +### Fields of `def` +* `title`: Human-readable text on the button +* `action(player)`: Function is called when button is triggered + * `player`: The `ObjectRef` of the player who triggered the button + * Default behaviour: Nothing happens +* `tooltip`: A tooltip for the button (optional, only use it for an additional, + non-critical explanation) +* `image`: Texture name for the image to show left of the button (optional) +* `show(player)`: Shall return `true` if the button should be displayed (optional) + * `player`: ObjectRef to player who triggered the button + * Default: Always shows button + +## Recommendations + +* Try to summarize the most important information on the button +* Test if the button title still fits when having >= 9 and <= 18 buttons at a + resolution of 800×600 +* It is recommended to only add buttons to access core mod functionality and + not for every minor feature. The rule of thumb is to add at most 1 button per mod +* If you like to add many buttons, consider adding your own `sfinv` page instead diff --git a/mods/sfinv_buttons/README.md b/mods/sfinv_buttons/README.md new file mode 100644 index 00000000..f85692a1 --- /dev/null +++ b/mods/sfinv_buttons/README.md @@ -0,0 +1,17 @@ +# Simple Fast Inventory Buttons [`sfinv_buttons`] +This mod adds a new tab (“Moreâ€) to the Simple Fast Inventory [`sfinv`] on +which other mods can add their buttons to make it easier to access their +core functionality. + +The idea is to free users from typing in boring chat commands. ;-) + +Minetest version 5.0.0 or later is required. + +Version: 1.1.2 +(This mod uses [semantic versioning](http://semver.org/) as of version 2.0.0 of the standard.) + +## API +The API is documented in `API.md`. + +## Mod license +MIT License diff --git a/mods/sfinv_buttons/init.lua b/mods/sfinv_buttons/init.lua new file mode 100644 index 00000000..3abcf4a4 --- /dev/null +++ b/mods/sfinv_buttons/init.lua @@ -0,0 +1,146 @@ +local S = minetest.get_translator("sfinv_buttons") + +local buttons = {} +local button_names_sorted = {} +local buttons_num = 0 + +local button_prefix = "sfinv_button_" + +-- Stores selected index in textlist +local player_indexes = {} +local player_selections = {} + +sfinv_buttons = {} + +sfinv_buttons.register_button = function(name, def) + buttons[name] = def + table.insert(button_names_sorted, name) + buttons_num = buttons_num + 1 +end + +-- Turns a textlist index to a button name +local index_to_button_name = function(index, player) + local internal_index = 1 + for i=1, #button_names_sorted do + local name = button_names_sorted[i] + local def = buttons[name] + if internal_index == index then + if def.show == nil or def.show(player) == true then + return name + end + end + internal_index = internal_index + 1 + end + return nil +end + +local MAX_ROWS = 9 +local MAX_COLS = 2 +local MAX_BUTTONS = MAX_ROWS * MAX_COLS + +sfinv.register_page("sfinv_buttons:buttons", { + title = S("More"), + is_in_nav = function(self, player, context) + -- Tab is shown only if at least 1 button is visible to player + for _, def in pairs(buttons) do + if def.show == nil or def.show(player) == true then + return true + end + end + return false + end, + get = function(self, player, context) + local f = "" + local y = 0 + local x = 0 + local w + if buttons_num > MAX_ROWS then + w = 3 + else + w = 7 + end + if buttons_num > MAX_BUTTONS then + f = f .. "textlist[0,0;7.8,8;sfinv_buttons_textlist;" + end + local buttons_added = 0 + for i=1, #button_names_sorted do + local name = button_names_sorted[i] + local def = buttons[name] + if def.show == nil or def.show(player) == true then + if buttons_num > MAX_BUTTONS then + if buttons_added >= 1 then + f = f .. "," + end + f = f .. minetest.formspec_escape(def.title) + else + if def.image ~= nil then + f = f .. "image["..(x+0.1)..","..(y+0.1)..";0.8,0.8;"..def.image.."]" + end + local button_id = minetest.formspec_escape(button_prefix .. name) + f = f .. "button[".. + (x+1)..","..y..";"..w..",1;".. + button_id..";".. + minetest.formspec_escape(def.title).. + "]" + if def.tooltip ~= nil then + f = f .. "tooltip["..button_id..";".. + minetest.formspec_escape(def.tooltip).."]" + end + y = y + 1 + if y >= MAX_ROWS then + y = 0 + x = x + 4 + end + end + buttons_added = buttons_added + 1 + end + end + if buttons_num > MAX_BUTTONS then + local index = player_indexes[player:get_player_name()] + if index ~= nil then + f = f .. ";" .. index + end + f = f .. "]" + f = f .. "button[0,8;8,1;sfinv_buttons_action;"..minetest.formspec_escape(S("Go")).."]" + end + return sfinv.make_formspec(player, context, f) + end, + on_player_receive_fields = function(self, player, context, fields) + local player_name = player:get_player_name() + -- TODO: Test support case when some buttons are hidden for player + if fields.sfinv_buttons_action then + local button = buttons[player_selections[player_name]] + if button ~= nil and button.action ~= nil then + button.action(player) + end + elseif fields.sfinv_buttons_textlist then + local explode = minetest.explode_textlist_event(fields.sfinv_buttons_textlist) + if explode.type == "CHG" then + player_indexes[player_name] = explode.index + player_selections[player_name] = index_to_button_name(explode.index, player) + elseif explode.type == "DCL" then + local button = buttons[button_names_sorted[explode.index]] + if button ~= nil and button.action ~= nil then + button.action(player) + end + end + else + for widget_name, _ in pairs(fields) do + local id = string.sub(widget_name, string.len(button_prefix) + 1, -1) + if buttons[id] ~= nil and buttons[id].action ~= nil then + buttons[id].action(player) + end + end + end + end, +}) + +minetest.register_on_joinplayer(function(player) + player_indexes[player:get_player_name()] = nil + player_selections[player:get_player_name()] = nil +end) + +minetest.register_on_leaveplayer(function(player) + player_indexes[player:get_player_name()] = nil + player_selections[player:get_player_name()] = nil +end) diff --git a/mods/sfinv_buttons/locale/sfinv_buttons.de.tr b/mods/sfinv_buttons/locale/sfinv_buttons.de.tr new file mode 100644 index 00000000..041fbecb --- /dev/null +++ b/mods/sfinv_buttons/locale/sfinv_buttons.de.tr @@ -0,0 +1,3 @@ +# textdomain: sfinv_buttons +More=Mehr +Go=Los diff --git a/mods/sfinv_buttons/locale/template.txt b/mods/sfinv_buttons/locale/template.txt new file mode 100644 index 00000000..f89b96c2 --- /dev/null +++ b/mods/sfinv_buttons/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: sfinv_buttons +More= +Go= diff --git a/mods/sfinv_buttons/mod.conf b/mods/sfinv_buttons/mod.conf new file mode 100644 index 00000000..d4b4d386 --- /dev/null +++ b/mods/sfinv_buttons/mod.conf @@ -0,0 +1,4 @@ +name = sfinv_buttons +title = Simple Fast Inventory Buttons +depends = sfinv +description = Adds a tab to the Simple Fast Inventory on which mods can add buttons for easy access. diff --git a/mods/show_wielded_item/.mailmap b/mods/show_wielded_item/.mailmap new file mode 100644 index 00000000..3d78b584 --- /dev/null +++ b/mods/show_wielded_item/.mailmap @@ -0,0 +1,2 @@ +Wuzzy +Wuzzy diff --git a/mods/show_wielded_item/README.md b/mods/show_wielded_item/README.md new file mode 100644 index 00000000..4e9a58d8 --- /dev/null +++ b/mods/show_wielded_item/README.md @@ -0,0 +1,32 @@ +# Show Wielded Item [`show_wielded_item`] +This mod displays the name of the wielded item above the hotbar and +statbars. + +This mod is compatible with the HUD Bars [`hudbars`] mod. +This mod *disables* itself if Unified Inventory is detected to show item names. +Compatibility with other HUD-related mods is possible, but not guaranteed. + +Version: 1.2.1 + +## A note for Unified Inventory users + +The mod Unified Inventory adds its own wielded item display (as of 16/08/2024). +So if you use that mod and have the item names features of that mod +enabled, then Unified Inventory takes precedence. + +If the Unified Inventory mod was detected, and the setting +`unified_inventory_item_names` is set to `true`, then +`show_wielded_item` won’t do anything and let Unified Inventory +display the wielded item instead. A message will appear in +the debug log if this happens. + +## Credits +Released by Wuzzy. +The original mod code was taken from the file “`item_names.lua`†+found in the Unified Inventory mod maintained by VanessaE. This code +has been later modified. +Original author: 4aiman + +## License +This mod is licensed under GNU LGPLv2 or later +(see ). diff --git a/mods/show_wielded_item/depends.txt b/mods/show_wielded_item/depends.txt new file mode 100644 index 00000000..391ce5eb --- /dev/null +++ b/mods/show_wielded_item/depends.txt @@ -0,0 +1,3 @@ +hudbars? +unified_inventory? +stamina? \ No newline at end of file diff --git a/mods/show_wielded_item/init.lua b/mods/show_wielded_item/init.lua new file mode 100644 index 00000000..5551f44f --- /dev/null +++ b/mods/show_wielded_item/init.lua @@ -0,0 +1,163 @@ +-- Based on 4itemnames mod by 4aiman + +-- Function to determine if show item name functionality is already implemented +local function show_already_implemented() + return minetest.get_modpath("unified_inventory") and true or false +end + +local wield = {} +local wieldindex = {} +local huds = {} +local dtimes = {} +local dlimit = 3 -- HUD element will be hidden after this many seconds + +local hudbars_mod = minetest.get_modpath("hudbars") +local unified_inventory_mod = minetest.get_modpath("unified_inventory") +local stamina_mod = minetest.get_modpath("stamina") + +-- Legacy support: Name of the HUD type field for 'hud_add'. +local hud_type_field_name +if minetest.features.hud_def_type_field then + -- engine version 5.9.0 and later + hud_type_field_name = "type" +else + -- All engine versions before 5.9.0 + hud_type_field_name = "hud_elem_type" +end + +-- Disable mod if Unified Inventory item names feature is enabled +if unified_inventory_mod and minetest.settings:get_bool("unified_inventory_item_names") ~= false then + minetest.log("action", "[show_wielded_item] Unified Inventory's item names feature was detected! Running show_wielded_item is pointless now, so it won't do anything") + return +end + +local function set_hud(player) + if not player:is_player() then return end + local player_name = player:get_player_name() + -- Fixed offset in config file + local fixed = tonumber(minetest.settings:get("show_wielded_item_y_offset")) + local off + if fixed and fixed ~= -1 then + -- Manual offset + off = {x=0, y=-fixed} + else + -- Default offset + off = {x=0, y=-101} + + if hudbars_mod then + -- Tweak offset if hudbars mod was found + + local rows = math.floor((#hb.get_hudbar_identifiers()-1) / 2) + 1 + local vmargin = tonumber(minetest.settings:get("hudbars_vmargin")) or 24 + off.y = -76 - vmargin*rows + elseif stamina_mod then + -- Tweak offset if stamina mod was found + off.y = off.y - 22 + end + + -- Dirty trick to avoid collision with Luanti's status text (e.g. “Volume changed to 0%â€) + if off.y >= -167 and off.y <= -156 then + off.y = -181 + end + end + + huds[player_name] = player:hud_add({ + [hud_type_field_name] = "text", + position = {x=0.5, y=1}, + offset = off, + alignment = {x=0, y=0}, + number = 0xFFFFFF , + text = "", + z_index = 100, + style = 1, + }) +end + +minetest.register_on_joinplayer(function(player) + set_hud(player) + + local name = player:get_player_name() + wield[name] = player:get_wielded_item():get_name() + wieldindex[name] = player:get_wield_index() +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + wield[name] = nil + wieldindex[name] = nil +end) + +local function get_first_line(text) + -- Cut off text after first newline + local firstnewline = string.find(text, "\n") + if firstnewline then + text = string.sub(text, 1, firstnewline-1) + end + return text +end + +if not show_already_implemented() then + minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local wstack = player:get_wielded_item() + local wname = wstack:get_name() + local windex = player:get_wield_index() + + if dtimes[player_name] and dtimes[player_name] < dlimit then + dtimes[player_name] = dtimes[player_name] + dtime + if dtimes[player_name] > dlimit and huds[player_name] then + player:hud_change(huds[player_name], 'text', "") + end + end + + -- Update HUD when wielded item or wielded index changed + if wname ~= wield[player_name] or windex ~= wieldindex[player_name] then + wieldindex[player_name] = windex + wield[player_name] = wname + dtimes[player_name] = 0 + + if huds[player_name] then + + -- Get description (various fallback checks for old Luanti/Minetest versions) + local def = minetest.registered_items[wname] + local desc + if wstack.get_short_description then + -- get_short_description() + desc = wstack:get_short_description() + end + if (not desc or desc == "") and wstack.get_description then + -- get_description() + desc = wstack:get_description() + desc = get_first_line(desc) + end + if (not desc or desc == "") and not wstack.get_description then + -- Metadata (old versions only) + local meta = wstack:get_meta() + desc = meta:get_string("description") + desc = get_first_line(desc) + end + if not desc or desc == "" then + -- Item definition + desc = def.description + desc = get_first_line(desc) + end + if not desc or desc == "" then + -- Final fallback: itemstring + desc = wname + end + + -- Print description + if desc then + -- Optionally append the 'technical' itemname + local tech = minetest.settings:get_bool("show_wielded_item_itemname", false) + if tech and desc ~= "" then + desc = desc .. " ["..wname.."]" + end + player:hud_change(huds[player_name], 'text', desc) + end + end + end + end + end) +end diff --git a/mods/show_wielded_item/locale/show_wielded_item.de.tr b/mods/show_wielded_item/locale/show_wielded_item.de.tr new file mode 100644 index 00000000..3106b174 --- /dev/null +++ b/mods/show_wielded_item/locale/show_wielded_item.de.tr @@ -0,0 +1,4 @@ +# textdomain: show_wielded_item +Show Wielded Item=Getragenen Gegenstand anzeigen +Displays the name of the wielded item.=Zeigt den Namen des getragenen Gegenstands an. + diff --git a/mods/show_wielded_item/locale/template.txt b/mods/show_wielded_item/locale/template.txt new file mode 100644 index 00000000..fbc893de --- /dev/null +++ b/mods/show_wielded_item/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: show_wielded_item +Show Wielded Item= +Displays the name of the wielded item.= + diff --git a/mods/show_wielded_item/mod.conf b/mods/show_wielded_item/mod.conf new file mode 100644 index 00000000..016b9112 --- /dev/null +++ b/mods/show_wielded_item/mod.conf @@ -0,0 +1,4 @@ +name = show_wielded_item +title = Show Wielded Item +description = Displays the name of the wielded item. +optional_depends = hudbars, unified_inventory, stamina diff --git a/mods/show_wielded_item/settingtypes.txt b/mods/show_wielded_item/settingtypes.txt new file mode 100644 index 00000000..05abcf2a --- /dev/null +++ b/mods/show_wielded_item/settingtypes.txt @@ -0,0 +1,8 @@ +#If true, also append the 'technical' itemname. +show_wielded_item_itemname (Show technical itemname) bool false + +#Use this setting to manually set the vertical offset of the label which shows +#the name of the wielded item. The offset is in pixels from the bottom of the +#screen. +#Set this to -1 to let the mod guess the offset automatically (recommended). +show_wielded_item_y_offset (Vertical offset of wielded item name display) int -1 -1 diff --git a/mods/signs_lib/.gitattributes b/mods/signs_lib/.gitattributes new file mode 100644 index 00000000..17e824ed --- /dev/null +++ b/mods/signs_lib/.gitattributes @@ -0,0 +1 @@ +util/blender export-ignore \ No newline at end of file diff --git a/mods/signs_lib/.luacheckrc b/mods/signs_lib/.luacheckrc new file mode 100644 index 00000000..5c9af0f8 --- /dev/null +++ b/mods/signs_lib/.luacheckrc @@ -0,0 +1,16 @@ +unused_args = false +max_line_length = 180 + +globals = { + "minetest", + "signs_lib", +} + +read_globals = { + -- Builtin + table = {fields = {"copy"}}, + "ItemStack", "vector", "default", + + -- Mod deps + "screwdriver", +} diff --git a/mods/signs_lib/API.md b/mods/signs_lib/API.md new file mode 100644 index 00000000..7491c95d --- /dev/null +++ b/mods/signs_lib/API.md @@ -0,0 +1,353 @@ +# Signs_lib API + +In this text, common terms such as `pos`, `node`, or `placer`/`digger` will not be explained unless they have a different meaning than what's usually used in Minetest mods. See [minetest/doc/lua_api.txt](https://github.com/minetest/minetest/blob/master/doc/lua_api.txt) for details on these and other common terms, if necessary. Similarly, common shorthand such as `int`, `float`, etc. should require no explanation. + +## Registering a sign + +* `signs_lib.register_sign(nodename, def)` + + To put it simply, where you'd have used `minetest.register_node()` before, just replace it with this call. The syntax is identical, and in general, all settings/items allowed there are allowed here as well. Anything that `signs_lib` doesn't need to override or alter will be passed straight through to `register_node()`, unchanged (such as `description`, `tiles`, or `inventory_image`). + + The supplied node name will be prepended with ":", so that any mod can register signs under any other mod's namespace, if desired. + + Many items have default settings applied when omitted, most of which would produce something equivalent to "default:sign_wall_wood" if enough other node defintion settings were to be included. + + * `drawtype = "string"` + + Default: "mesh" + + * `tiles = {table}` + + Since this is a sign-specific library, this parameter behaves rather different from what you would normally use in `minetest.register_node()`. The first two entries are mandatory. The third, fourth and fifth entries are optional, depending on which mounting styles are enabled for a given node. + + * entry 1: the front and back of the sign. + * entry 2: the sides/edges + * entry 3: texture for the pole mount. If unspecified, the standard pole mount image is used, if needed. + * entry 4: texture for the hanging part. If unspecified, the standard hanging chains image is used, if needed. + * entry 5: texture for the yard sign stick. If unspecified, "default_wood.png" is used, if needed. + * entry 6: ignored. + + * `mesh = "string"` + + Default: "signs_lib_standard_wall_sign.obj". + + * `paramtype = "string"` + + Default: "light" + + * `paramtype2 = "string"` + + As with any other node, this determines how param2 is interpreted. Since these are signs, only two modes make sense: "wallmounted" and "facedir". Any other string is the same as "facedir". + + Default: "wallmounted" + + * `wield_image = "string"` + + Default: whatever the `inventory_image` is set to (if anything). + + * `selection_box = {table}` + + Works the same as usual. A helper function exists to create boxes by specifying only and X/Y size and offset: + `signs_lib.make_selection_boxes()` (see below). + + * `groups = {table}` + + Sets the sign's groups, as usual. In addition to whatever arbitrary groups you may have in mind, there are two presets available (both of which have `attached_node` removed, and `sign = 1` added): + + * `signs_lib.standard_wood_groups`, inherited from "default:sign_wall_wood" + * `signs_lib.standard_steel_groups`, inherited from "default:sign_wall_steel" + + Default: `signs_lib.standard_wood_groups` + + * `sounds = something` + + Sets the sign's sound profile, as usual. In addition to whatever sound profile you may have in mind, there are two presets available: + + * `signs_lib.standard_wood_sign_sounds`, inherited from "default:sign_wall_wood" + * `signs_lib.standard_steel_sign_sounds`, inherited from "default:sign_wall_steel" + + Default: `signs_lib.standard_wood_sign_sounds` + + * `drop = something` + + Default: inherited from the `nodename` argument given to `signs_lib.register_sign()` + + * `after_place_node = function(pos, placer, itemstack, pointed_thing, locked)` + + See below under "Main functions". + + Default: `signs_lib.after_place_node` + + * `on_rightclick = function(pos, node, player, itemstack, pointed_thing)` + + See below under "Main functions". + + Default: `signs_lib.rightclick_sign` + + * `on_destruct = function(pos)` + + See below under "Main functions". + + Default: `signs_lib.destruct_sign` + + * `on_punch = function(pos)` + + See below under "Main functions". + + Default: `signs_lib.update_sign` + + * `onpole_mesh = "string"` + * `hanging_mesh = "string"` + * `yard_mesh = "string"` + + If your node needs a custom model for its on-pole, hanging, and/or yard variants, specify them here, as needed. The materials and textures behave the same on these as on other sign models. All sign model filenames are still derived from the base sign model, when not overridden here (so these can be totally arbitrary filenames). + + Defaults: the normal "_onpole", "_hanging", or "_yard" version of the model specified by `mesh`. + + * `selection_box = {table}` + * `node_box = {table}` + + As usual, the former sets the sign's selection box, while the latter sets its collision information (since signs use model meshes). At the very least, you'll want to specify `selection_box`. If the sign node is in "wallmounted" mode, this must contain proper `wall_top`, `wall_side`, and `wall_bottom` entries, as one normally uses with such nodes. Signs that use "facedir" mode just need the usual `fixed` setting. + + Defaults: `selection_box` is a box that fits the standard wall sign, if not specified. `node_box` takes on the value given to `selection_box`, if not specified (or the standard wall sign setting, if neither is present). + + * `onpole_selection_box = {table}` + * `hanging_selection_box = {table}` + * `yard_selection_box = {table}` + * `onpole_node_box = {table}` + * `hanging_node_box = {table}` + * `yard_node_box = {table}` + + If your node needs special handling for its onpole-, hanging-, or yard-mode selection boxes or for their collision info (which `signs_lib` always uses the node's `node_box` item for), you can specify them here. Same syntax as the regular `selection_box` setting. + + Defaults: whatever the `selection_box` and `node_box` entries are set to. + + * `default_color = "string"` + + Sets the default text color for this sign, in hexadecimal (one digit, lowercase), from the standard Linux/IRC/CGA color palette. Same as the colors shown in the sign's formspec. + + Default: "0" (black) + + * `number_of_lines = int` + + Just what it says on the tin. How many lines you can fit will vary with overall sign node size, font size, scaling, line spacing, etc. + + Default: 6 + + * `horiz_scaling = float` + * `vert_scaling = float` + + Scaling factor applied to the entity texture horizontal or vertical resolution. Larger values increase the resolution. Since a given sign's entity is always displayed at a fixed visual scale, increasing these squeezes more pixels into the same space, making the text appear narrower or shorter. Increasing `vert_scaling` also increases the number of lines of text the sign will hold. + + Defaults: 1.0 for both + + * `line_spacing = int` + + Number of blank pixels to add between lines. + + Default: 1 + + * `font_size = int` + + Selects which font to use, either 16 or 32 (pixel height). This setting directly affects the sign's vertical resolution. + + Default: 16 + + Note: Valid values were formerly 15 and 31, these are now aliases of 16 and 32 respectively. + + * `x_offset = int` + * `y_offset = int` + + Starting X and Y position in pixels, relative to the text entity UV map upper-left corner. + + Defaults: 4 for X, 0 for Y + + * `chars_per_line = int` + + Approximate number of characters that should fit on a line. This, the selected font's average character width, and the `horiz_scaling` together set the horizontal resolution of the text entity's texture. + + Default: 35 + + * `entity_info = something` + + Describes the entity model and yaw table to use. May be one of: + + * A table specifying the two settings directly, such as: + + ```lua + entity_info = { + mesh = "signs_lib_standard_wall_sign_entity.obj", + yaw = signs_lib.wallmounted_yaw + } + ``` + * `signs_lib.standard_yaw` is also available as a yaw preset, if desired. + + * a string reading "standard", which tells `signs_lib` to use the standard wood/steel sign model, in wallmounted mode. Equivalent to the example above. + * nothing at all: if omitted, the sign will not have a formspec, basically all text-related settings will be ignored and/or omitted entirely, and no entity will be spawned for this sign, thus the sign will not be writable. This is the default, and is of course what one would want for any sign that's just an image wrapped around a model, as in most of the signs in [my street signs mod](https://forum.minetest.net/viewtopic.php?t=20866). + + Default: **nil** + + * `allow_hanging = bool` + * `allow_onpole = bool` + * `allow_onpole_horizontal = bool` + * `allow_yard = bool` + + + If **true**, these allow the registration function to create versions of the initial, base sign node that either hang from the ceiling, are mounted on a vertical pole/post, are mounted on a horizontal pole, or are free-standing, on a small stick. Their node names will be the same as the base wall sign node, except with "_hanging", "_onpole", "_onpole_horiz", or "_yard", respectively, appended to the end of the node name. If the base node name has "_wall" in it, that bit is deleted before appending the above. + + These options are independent of one another. + + Defaults: all **nil** + + * `allow_widefont = bool` + + Just what it says on the tin. If enabled, the formspec will have a little "on/off switch" left of the "Write" button, to select the font width. + + Default: **nil** + + * `locked = bool` + + Sets this sign to be locked/owned, like the original default steel wall sign. + + Default: **nil** + +### Example sign definition: + +```lua +signs_lib.register_sign("basic_signs:sign_wall_glass", { + description = S("Glass Sign"), + yard_mesh = "signs_lib_standard_sign_yard_two_sticks.obj", + tiles = { + { name = "basic_signs_sign_wall_glass.png", backface_culling = true}, + "basic_signs_sign_wall_glass_edges.png", + "basic_signs_pole_mount_glass.png", + nil, + nil, + "default_steel_block.png" -- the sticks on back of the yard sign model + }, + inventory_image = "basic_signs_sign_wall_glass_inv.png", + default_color = "c", + locked = true, + entity_info = "standard", + sounds = default.node_sound_glass_defaults(), + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + allow_hanging = true, + allow_widefont = true, + allow_onpole = true, + allow_onpole_horizontal = true, + allow_yard = true, + use_texture_alpha = "blend", +}) +``` + +### Main functions used within a sign definition + +* `signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locked)` + + Determines if the `pointed_thing` is a wall, floor, ceiling, or pole/post, and swaps the placed sign for the correct model. + + * `locked`: if set to **true**, the sign's meta will be tweaked to indicate its ownership by the `placer`. + +* `signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing)` + + Open the default sign formspec, if the player has the `signslib_edit` privilege. (privilege can be set by `signs_lib.edit_priv` setting) + +* `signs_lib.destruct_sign(pos)` + + Deletes the sign's entity, if any, when the sign is dug. + +* `signs_lib.update_sign(pos, fields)` + + If the sign's writable, this deletes any sign-related entities in the sign's node space, spawns a new one, and renders whatever text is in the sign's meta. + +* `signs_lib.can_modify(pos, player)` + + Returns **true** if the player is allowed to dig, edit, or change the font width of the sign. + +* `signs_lib.handle_rotation(pos, node, player, mode)` + + Just what it says on the tin. Limits the sign's rotation as needed (for example, a sign on a horizontal pole can only flip from one side to the other). + + * `mode`: the screwdriver's mode, as passed from the screwdriver mod. + + Returns **false** if the user tried to right-click with the screwdriver, **true** otherwise. + +* `signs_lib.make_selection_boxes(x_size, y_size, foo, x_offset, y_offset, z_offset, is_facedir)` + + * `x_size`/`y_size`: dimensions in inches. One node is 39.37 inches on a side. This function uses inches instead of metric because it started out as a selection box maker for [MUTCD-2009](https://mutcd.fhwa.dot.gov/pdfs/2009r1r2/mutcd2009r1r2edition.pdf)-compliant signs, which are measured in inches. + * `x_offset`/`y_offset`/`z_offset`: shift the selection box (inches, defaults to centered, with the back face flush with the back of the node). + * `is_facedir`: if unset, the selection boxes will be created with the assumption that `paramtype2 = "wallmounted"` mode is set on the node the box will be used on. Any other value creates a selection box for "facedir" mode. + * `foo` is ignored (leftover from an argument that's long since been rendered obsolete. + + Returns a table suitable for the `selection_box` node definition entry. + +#### Helper functions + +You probably won't need to call any of these directly. + +* `signs_lib.read_image_size(filename)` + + Returns width and height of the indicated PNG file (return values will be gibberish if it isn't a PNG). + +* `signs_lib.split_lines_and_words(text)` + + Just what it says on the tin. + + Returns a table of lines, each line entry being a table of words. + +* `signs_lib.delete_objects(pos)` + + Deletes all entities within the node space given by `pos`. + +* `signs_lib.spawn_entity(pos, texture)` + + Spawns a new text entity at the given position and assigns the supplied `texture` to it, if any. + +* `signs_lib.check_for_pole(pos, pointed_thing)` + + Attempts to determine if the `pointed_thing` qualifies as a vertical pole or post of some kind. + + Returns **true** if a suitable pole/post is found + +* `signs_lib.check_for_horizontal_pole(pos, pointed_thing)` + + Same idea, but for horizontal poles/posts. + + Returns **true** if a suitable pole/post is found. + +* `signs_lib.check_for_ceiling(pointed_thing)` + + Returns **true** if the `pointed_thing` appears to be the bottom of a node. + +* `signs_lib.check_for_floor(pointed_thing)` + + Returns **true** if the `pointed_thing` appears to be the top of a node. + +* `signs_lib.set_obj_text(pos, text)` + + Cooks the supplied `text` as needed and passes it to the entity rendering code. Essentially, this is where rendering text into an image starts. + +## Options for pole/post nodes + +Occasionally, you'll run into a node that either looks like a pole/post, or has one in the middle of its node space (with room to fit a sign in there), but which isn't detected as a pole/post by the standard sign placement code. In these situations, some kind of special check is needed. + +Supplying one or both of the following in the pole/post node's definition will cause `signs_lib` to skip its usual pole/post detection code, in favor of the supplied function(s). + + * `check_for_pole = function(pos, node, def, pole_pos, pole_node, pole_def)` + + If supplied, this function will be run when the mod is looking for a normal vertical pole/post. Useful if the target node's orientation and/or shape determine what sides a sign can attach to. For example, [Pipeworks](https://forum.minetest.net/viewtopic.php?pid=27794) uses this to figure out if a sign can be attached to a tube or pipe, depending on the tube's/pipe's number of junctions, and on its orientation and that of the placed sign. + + * `def`: the placed sign's node defintion + * `pole_pos`: the target node's position + * `pole_node`: the target node itself + * `pole_def`: its node definition + + Your code must return **true** if the sign should attach to the target node. + + If desired, this entry may simply be set to `check_for_pole = true` if a sign can always attach to this node regardless of facing direction (for example, [Home Decor](https://forum.minetest.net/viewtopic.php?pid=26061) has a round brass pole/post, which always stands vertical, and [Cottages](https://forum.minetest.net/viewtopic.php?id=5120) has a simple table that's basically a fencepost with a platform on top). + + * `check_for_horiz_pole = function(pos, node, def, pole_pos, pole_node, pole_def)` + + If supplied, this does the same thing for horizontal poles. + + Your code must return **true** if the sign should attach to the target node. diff --git a/mods/signs_lib/LICENSE b/mods/signs_lib/LICENSE new file mode 100644 index 00000000..c5885ae9 --- /dev/null +++ b/mods/signs_lib/LICENSE @@ -0,0 +1,600 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.†The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/signs_lib/MODELS.md b/mods/signs_lib/MODELS.md new file mode 100644 index 00000000..e12046e0 --- /dev/null +++ b/mods/signs_lib/MODELS.md @@ -0,0 +1,104 @@ +# Anatomy of a sign model + +In the model files: + +* The base sign model should be designed to look like a flat board placed on one side of the node space. The first material entry in the model file must be assigned to the front and back faces of the sign, the second material must be the sign's edges. The filename should be something along the lines of "mymod_my_cool_sign_wall.obj". + + In each of the variants below, generally-speaking, the third material in the model must be assigned to whatever it is that that model uses for the sign's mounting method, and the mounting style will be the last word in the model filename. + +* For most signs that are allowed to sit on a vertical pole/post such as a fencepost, the pole-mounted model is just a copy of the base model, shifted back a bit, with a pole mount added to the back. In these models, the third material in the model file must be assigned to the pole mount. Name the model file the same as the base sign, but end the name with "_onpole" instead of "_wall". For example, "mymod_my_cool_sign_onpole.obj". + + For signs that allow mounting onto a horizontal pole (such as a Streets mod horizontal "bigpole"), the third material is still the vertical pole mount as above, but there must also be another the pole mount included, designed to wrap around such a pole/post, to which fourth material must be assigned. In most cases, this alternate mount will just be a copy of the vertical pole mount, but rotated by 90°, and explicitly centered vertically in the node space. + + While vertical and horizontal pole/post mounting options are independent in the code, if horizontal mounting is enabled, the on-pole model must still have *four* materials, even if the third material is unused, with the horizontal pole mount assigned to the fourth material. In most situations, you'll probably have both vertical and horizontal pole mounts assigned to the third and fourth materials, as above. + +* For hanging sign models, the third material must be assigned to whatever it is that makes the sign look like it's hanging from the ceiling (default signs have a simple, flat rectangle, meant to show an image of a simple pair of chains). The model file for these must be named the same as the base model, but ending with "_hanging". For example, "mymod_my_cool_sign_hanging.obj". + +* For yard sign models, the third material must be assigned to the "stick" on the back of the sign. The model for this type must be named the same as the base model, but ending with "_yard". For example, "mymod_my_cool_sign_yard.obj". + +* For most signs, the sign entity (if applicable) will be a simple rectangle, sized just slightly smaller than the width and height of the sign, and centered relative to the sign face. Its UV map should cover the entire image area, so that the image is shrunk down to fit within the sign's intended text area. The rectangle must be positioned slightly in front of the sign (by 10 millimeters or so, due to engine position precision limitations). + + The entity should be named the same as the corresponding wall, on-pole, hanging, and/or yard models, but with "_entity" added just before the mounting style. For example: a sign using "mymod_my_cool_sign_wall.obj" for the base model file should have an entity model file named "mymod_my_cool_sign_entity_wall.obj", if one will be needed. + +In your code: + +* The first `tiles{}` entry in the sign definition needs to be the front-back texture (how things are arranged within the image file is up to you, provided you match your sign model's UV map to the layout of your image). The second entry will be the texture for the sign's edges. + +* For signs that can be mounted on a pole/post, the third item in your `tiles{}` setting specifies the pole mount image to use. When `signs_lib` goes to register the on-pole node(s), the image you specified here will be passed to `register_node()` as either the third or *fourth* tile item, setting the other to the standard blank/empty image, thus revealing only the vertical or horizontal pole mount, respectively. If you don't specify a pole mount image, the standard pole mount texture will be used instead, if needed. + +* For signs that can hang from a ceiling, the fourth entry in your `tiles{}` setting specifies the image to apply to the part of the model that makes it look like it's hanging. If not specified, the standard hanging chains image will be used instead, if needed. + +* For signs that can stand up in the yard, the fifth `tiles{}` entry specifies the image to be wrapped around the "stick" that the sign's mounted on. If not specified, "default_wood.png" will be used instead, if needed. + +* Some signs may allow for more complex entity shapes, images, and UV mapping. For example, [street_signs](https://forum.minetest.net/viewtopic.php?t=20866) has a standard city street intersection sign, the entity mesh for which consists of four simple rectangles. Two of them are identically UV-mapped to the top portion of the texture image, and placed on either side of the upper half of the sign portion of the model. The other two rectangles are also identically UV-mapped, but point to a lower section of the texture, and are rotated by 90° and shifted down in the model, to place them on either side of the lower half of the sign. This causes the first line of text to appear on both sides of the upper half of the sign, with the second line of text appearing on both sides of the lower half. + + Signs which don't use the simple models described above may not be compatible with the wall/pole/ceiling/yard placement code, but these things can be overridden/disabled in the node definition, if needed (as with the above intersection sign). + +* `signs_lib` automatically blanks-out all redundant `tiles{}` entries for each node. + +## Blender users + +Start a new project, open the "Sidebar" (usually by pressing `N`), and scroll down to the Display section. Set the Grid floor to 5 lines, Scale to 0.5, and Subdivisions to 8. + +This will create an environment where the world origin/center will be the center of a node space at (0,0,0), with major divisions at half-node intervals. With the camera aligned to an axis, zooming in so that one node space fills the window should put the grid at 16 minor divisions per meter, so the grid will correspond to pixels in a typical 16px-apparent texture, if your UV mapping is correct (though a standard sign model uses 32px-apparent textures). + +Zoom in a bit more, and you'll see 256 divisions per meter, which can be thought of as 16 divisions per pixel. This is where you'll want to be when positioning the sign entity. In my configuration, the grid maxes out at 256 divisions per meter, even when zoomed in extremely close (this may be standard behavior). + +For signs that will use "wallmounted" mode, the model must be lying flat, with its front side facing up along Blender's Z axis, and centered on the X and Y axes. The back of the sign should be exactly flush with the -0.5m mark on the Z axis, putting the whole sign below the world center. The bottom edge of the sign faces the negative end of the Y axis. + +For signs that will use "facedir" mode, the sign must be upright, with its back flush with the +0.5m mark along the Y axis, centered on X/Z, with the bottom edge of the sign facing down along the Z axis. + +When adding materials, you MUST add them in the order you want them to appear in the exported model, as Blender provides no easy way to enforce a particular order if they come out wrong. + +If you look in the `models/` directory, you'll find the standard sign project file, "standard wooden sign.blend", which contains all four variants of the standard sign model ("wallmounted" and "facedir", on-wall and on-pole), designed per the above requirements. This file also contains both entity variants (on-wall and on-pole). You'll notice that there are only two entities. This is because entity rotation has no concept of "wallmounted", "facedir", etc., so all standard signs use the same pair of entities. + +To create the text entity model, assuming you're starting with a properly-UV-mapped, "wallmounted" base sign model with a simple one-piece flat design (comparable to, say, a standard wall sign or a [street_signs](https://forum.minetest.net/viewtopic.php?t=20866) warning diamond), do these steps: + +1. Snap the cursor to the world center, and set your viewport to Orthographic (usually `5` on the keypad). +2. Switch to Object Mode. +3. Select the sign model. +4. Create a linked duplicate (`Alt-D` in my keymap), as distinct from a simple duplicate (`Shift-D`). Blender will automatically select the duplicate and immediately go into move/translate mode to let you move it around. +5. Without bothering to move the duplicate, press `R` `X` to go into rotatation mode around the X axis, which will also snap the duplicate back to its precise starting point in the process. +6. Rotate the duplicate by 90°, thus putting it upright, with its back side flush with the +0.5m mark on the Y axis. +7. With the duplicate still selected, switch to Edit Mode. +8. Select only the duplicate sign's front face. +9. Rotate your view to the right or left side (usually `3` or `Ctrl-3` on the keypad). +10. Zoom in close enough to get the grid to show 256 divisions per meter, while keeping the selected face in view. +11. Make a simple duplicate of the selected face (`Shift-D`). Blender will automatically select just the new, duplicate face and go into move/translate mode. Yeah, you're making a copy of a copy. 🙂 +12. Press `Y` to limit movement to just the Y axis, and move the duplicate face in the negative direction, while snapping to the grid. Put it at least 2 minor divisions from the front of the sign (that is, 2/256 of a meter). +13. Zoom out far enough to get the grid back to 16 divisions per meter, and align your view forward along the Y axis (usually `1` on the keypad). +14. With the duplicate face still selected, scale it along X and/or Z until its edges are just within the limits of your sign model's intended text area. You could also directly move the face's edges inward, perhaps while snapping to the grid, if the sign shape lends itself to that. Make sure the face stays properly-positioned (usually centered) relative to the sign's front! +15. UV-map the duplicate face: `Mesh` → `UV Unwrap` → `Reset` followed by `Mesh` → `UV Unwrap` → `Project from view (bounds)`. +16. Separate the duplicate face into a new object (`P` in my keymap, then `Selection` in the menu that pops-up). +17. Switch to Object Mode +18. In the model/data tree at the upper-right (well, on my layout), rename the original sign mesh, its duplicate, and the entity mesh to something meaningful. +19. With only the text entity mesh selected, delete all materials from the list on the right, below the model/data tree (these were inherited from the base sign, and aren't needed with an entity mesh). +20. Save your project file. +21. Export the text entity mesh. It is highly recommended that you export to "Wavefront (.obj)" format, as with most other Minetest node models. + +Note that the duplicate sign model you created can also be used directly as a "facedir" sign model, as well as being a position reference for the text entity mesh, so I suggest leaving it in your project file when you save. + +Use the following export settings (I strongly advise saving them as an Operator Preset; applies to all models and modes): + + Forward: [_Z_Forward_] + Up: [_Y_Up______] + 🆇 Selection Only + 🞎 Animation + 🆇 Apply Modifiers + 🞎 Use Modifiers Render Settings + 🞎 Include Edges + 🞎 Smooth Groups + 🞎 Bitflag Smooth Groups + 🆇 Write Normals + 🆇 Include UVs + 🞎 Write Materials + 🞎 Triangulate Faces + 🞎 Write Nurbs + 🞎 Polygroups + 🆇 Objects as OBJ Objects + 🞎 Objects as OBJ Groups + 🆇 Material Groups + 🞎 Keep Vertex Order + (_Scale:________1.00_) + Path Mode: [_Auto____] + diff --git a/mods/signs_lib/README.md b/mods/signs_lib/README.md new file mode 100644 index 00000000..bb33427c --- /dev/null +++ b/mods/signs_lib/README.md @@ -0,0 +1,70 @@ +# signs_lib + +This is kaeza's and my signs library mod, originally forked from PilzAdam's version and rewritten mostly by kaeza to include a number of new features, then rewritten again a couple more times (finding its way into my [street_signs](https://forum.minetest.net/viewtopic.php?t=20866) mod for a while, where it developed nicely 🙂). + +The purpose of PilzAdam's original mod was to just provide a no-frills way make default signs show their text, via an entity placed right in front. It was hacky, but it worked! + +While still hacky, this library is a modernized, feature-enhanced version of his code, which not only has visible text, but which allows that text to be colored, and displayed at any reasonable size, with any reasonable amount of text (as configured in a given node definition), with two font resolutions available. Plus, almost any sign can be attached to almost any kind of suitable pole or fencepost. Most signs that use the standard wall sign model can also be hung from a ceiling, or placed upright as a yard sign, in addition to being flat on a wall or floor. Unlike previous incarnations of this code, signs' text is visible when the sign is flat on the floor or ceiling, as well as all other supported orientations/mounting styles. + +Without any other add-ons, this mod upgrades only the default wooden and steel signs. + +## Text formatting + +In general, text is rendered exactly as-written, left-to-right, top to bottom, without any translations or modifications. The standard fonts support 7-bit ASCII as well as Cyrllic. + +That said, there are some basic text formatting options: + +* Paragraph breaks (blank lines) may be inserted by simply hitting `Enter` twice. + +* Eight arrow symbols are available, occupying positions 0x81 through 0x88 in the character set. These are produced by writing a "^" followed by a number 1 to 8: + + "^1" = `⬆`, "^2" = `⬈`, "^3" = `âž¡`, "^4" = `⬊`, "^5" = `⬇`, "^6" = `⬋`, "^7" = `⬅`, "^8" = `⬉` + + Writing "^" followed by a letter "a" through "h" will produce double-wide versions of these arrows, in the same order. These wide arrows occupy 0x89 to 0x91 in the character set. + + To write a "^" on a sign, wirte "#^" + +* A color may be specified in the sign text by using "#" followed by a single hexadcimal digit (0-9 or a-f). These colors come from the standard Linux/IRC/CGA color set, and are shown in the sign's formspec. Any color change will remain in effect until changed again, or until the next line break. Any number of color changes in any arbitrary arrangement is allowed. + + To write "#" on a sign, write "##". + +* Most writable signs can display double-wide text by flipping a switch in the sign's formspec. + +* Support full Unicode Plane 0 charset (63000+ characters). The "Unicode font" switch on each sign can be turned on for a more consistent letter style in multilingual text. + +## Sign placement and rotation notes + +* Pointing at a wall while placing will, of course, place the sign on the wall. + +* For most signs that use the standard sign model, pointing at the ground while placing creates an upright standalone yard sign. Others not using the standard model will most often end up flat on the ground. + +* For most standard signs, pointing at the ceiling while placing will hang the sign from the ceiling by a pair of chains. Others not using the standard model will usually end up flat on the ceiling. + +* Pointing at an X or Z side of something that's detected as a pole/post will mount the sign onto that pole, if possible. Note that the sign actually occupies the node space in front of the pole, since they're still separate nodes. But, I figure, no one's going to want to use the space in front of the sign anyway, because doing so would of course obscure the sign, so it doesn't matter if the sign logically occupies that node space. + +* If you're holding the "Sneak" key (usually `Shift`) while placing, the on-pole/hanging/yard checks are skipped, allowing you to just place a sign flat onto the ground, ceiling, or top/bottom of a pole/post, like they used to work before `signs_lib` was a thing. + +* If a sign is on the wall or flat on the ground, the screwdriver will spin it from one wall to the next, in clockwise order, whether there's a wall to attach to or not, followed by putting it flat on the ground, then flat against the ceiling, then back to wall orientation. + +* If a sign is hanging from the ceiling (not flat against it), the screwdriver will just rotate it around its Y axis. + +* If a sign is on a vertical pole/post, the screwdriver will rotate it around the pole, but only if there's nothing in the way. + +* If a sign is on a horizontal pole/post, the screwdriver will flip it from one side to the other as long as there's nothing in the way. + +## Chat commands + +At present, only one command is defined: + +* `/regen_signs` + +This will read through the list of currently-loaded blocks known to contain one or more signs, delete all entities found in each sign's node space, and respawn and re-render each from scratch. + +The list of loaded, sign-bearing blocks is created/populated by an LBM (and trimmed by this command if any listed blocks are found to have been unloaded). + +## Privileges + +* `signslib_edit` + +Allows to rotate signs and to open (and consequently edit) any default sign formspec. +(privilege can be set by `signs_lib.edit_priv` setting) diff --git a/mods/signs_lib/api.lua b/mods/signs_lib/api.lua new file mode 100644 index 00000000..edcb3ef9 --- /dev/null +++ b/mods/signs_lib/api.lua @@ -0,0 +1,1435 @@ +-- signs_lib api, backported from street_signs + +local S = signs_lib.S +local FS = function(...) return minetest.formspec_escape(S(...)) end +local has_default_mod = minetest.get_modpath("default") + +local function log(level, messagefmt, ...) + minetest.log(level, "[signs_lib] " .. messagefmt:format(...)) +end + +local function get_sign_formspec() end + +signs_lib.glow_item = "basic_materials:energy_crystal_simple" + +signs_lib.lbm_restore_nodes = {} +signs_lib.old_fenceposts = {} +signs_lib.old_fenceposts_replacement_signs = {} +signs_lib.old_fenceposts_with_signs = {} + +-- Settings used for a standard wood or steel wall sign +signs_lib.standard_lines = 6 +signs_lib.standard_hscale = 1 +signs_lib.standard_vscale = 1 +signs_lib.standard_lspace = 1 +signs_lib.standard_fsize = 16 +signs_lib.standard_xoffs = 4 +signs_lib.standard_yoffs = 0 +signs_lib.standard_cpl = 35 + +signs_lib.standard_wood_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].groups or {}) +signs_lib.standard_wood_groups.attached_node = nil + +signs_lib.standard_steel_groups = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].groups or {}) +signs_lib.standard_steel_groups.attached_node = nil + +signs_lib.standard_wood_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_wood"].sounds or {}) +signs_lib.standard_steel_sign_sounds = table.copy(has_default_mod and minetest.registered_items["default:sign_wall_steel"].sounds or {}) + +signs_lib.default_text_scale = {x=10, y=10} + +signs_lib.old_widefont_signs = {} + +signs_lib.block_list = {} +signs_lib.totalblocks = 0 + +signs_lib.standard_yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, +} + +signs_lib.wallmounted_yaw = { + nil, + nil, + math.pi / -2, + math.pi / 2, + 0, + math.pi, +} + +signs_lib.fdir_to_back = { + { 0, -1 }, + { -1, 0 }, + { 0, 1 }, + { 1, 0 }, +} + +signs_lib.wall_fdir_to_back = { + nil, + nil, + { 0, 1 }, + { 0, -1 }, + { -1, 0 }, + { 1, 0 }, +} + +signs_lib.fdir_flip_to_back = { + [0] = { 0, 2 }, + [1] = { 2, 0 }, + [2] = { 0, -2 }, + [3] = { -2, 0 } +} + +signs_lib.wall_fdir_flip_to_back = { + [2] = { 2, 0 }, + [3] = { -2, 0 }, + [4] = { 0, 2 }, + [5] = { 0, -2 }, +} + +signs_lib.fdir_to_back_left = { + [0] = { -1, 1 }, + [1] = { 1, 1 }, + [2] = { 1, -1 }, + [3] = { -1, -1 } +} + +signs_lib.wall_fdir_to_back_left = { + [2] = { 1, 1 }, + [3] = { -1, -1 }, + [4] = { -1, 1 }, + [5] = { 1, -1 } +} + +signs_lib.rotate_walldir = { + [0] = 4, + [1] = 0, + [2] = 5, + [3] = 1, + [4] = 2, + [5] = 3 +} + +signs_lib.rotate_walldir_simple = { + [0] = 4, + [1] = 4, + [2] = 5, + [3] = 4, + [4] = 2, + [5] = 3 +} + +signs_lib.rotate_facedir = { + [0] = 1, + [1] = 2, + [2] = 3, + [3] = 4, + [4] = 6, + [5] = 6, + [6] = 0 +} + +signs_lib.rotate_facedir_simple = { + [0] = 1, + [1] = 2, + [2] = 3, + [3] = 0, + [4] = 0, + [5] = 0 +} + +signs_lib.flip_facedir = { + [0] = 2, + [1] = 3, + [2] = 0, + [3] = 1, + [4] = 6, + [5] = 4, + [6] = 4 +} + +signs_lib.flip_walldir = { + [0] = 1, + [1] = 0, + [2] = 3, + [3] = 2, + [4] = 5, + [5] = 4 +} + +-- Initialize character texture cache +local ctexcache = {} +local ctexcache_wide = {} + +-- entity handling + +minetest.register_entity("signs_lib:text", { + initial_properties = { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "mesh", + mesh = "signs_lib_standard_sign_entity_wall.obj", + textures = {}, + static_save = true, + backface_culling = false, + }, + on_activate = function(self) + local node = minetest.get_node(self.object:get_pos()) + if minetest.get_item_group(node.name, "sign") == 0 then + self.object:remove() + end + end, + on_blast = function(self, damage) + return false, false, {} + end, +}) + +function signs_lib.delete_objects(pos) + local objects = minetest.get_objects_inside_radius(pos, 0.5) + for _, v in ipairs(objects) do + if v then + local e = v:get_luaentity() + if e and string.match(e.name, "sign.*text") then + v:remove() + end + end + end +end + +function signs_lib.spawn_entity(pos, texture, glow) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + if not def or not def.entity_info then return end + + local text_scale = (node and node.text_scale) or signs_lib.default_text_scale + local objects = minetest.get_objects_inside_radius(pos, 0.5) + local obj + + if #objects > 0 then + for _, v in ipairs(objects) do + if v then + local e = v:get_luaentity() + if e and e.name == "signs_lib:text" then + obj = v + end + end + end + end + + if not obj then + obj = minetest.add_entity(pos, "signs_lib:text") + end + + local yaw = def.entity_info.yaw[node.param2 + 1] + local pitch = 0 + + if not string.find(node.name, "onpole") and not string.find(node.name, "hanging") then + local rot90 = math.pi/2 + + if def.paramtype2 == "wallmounted" then + if node.param2 == 1 then -- on floor + pitch = -rot90 + yaw = 0 + elseif node.param2 == 0 then -- on ceiling + pitch = rot90 + yaw = math.pi + end + elseif def.paramtype2 == "facedir" then + if node.param2 == 4 then + pitch = -rot90 + yaw = 0 + elseif node.param2 == 6 then + pitch = rot90 + yaw = math.pi + end + end + end + + if glow ~= "" then + obj:set_properties( {glow = tonumber(glow * 5)} ) + end + + if yaw then + obj:set_rotation({x = pitch, y = yaw, z=0}) + + if not texture then + obj:set_properties({ + mesh = def.entity_info.mesh, + visual_size = text_scale, + }) + else + obj:set_properties({ + mesh = def.entity_info.mesh, + visual_size = text_scale, + textures={texture}, + }) + end + end +end + +function signs_lib.set_obj_text(pos, text, glow) + local split = signs_lib.split_lines_and_words + local text_ansi = signs_lib.Utf8ToAnsi(text) + signs_lib.delete_objects(pos) + -- only create sign entity for actual text + if text_ansi and text_ansi ~= "" then + signs_lib.spawn_entity(pos, + signs_lib.make_sign_texture(split(text_ansi), pos), glow) + end +end + +-- rotation + +function signs_lib.handle_rotation(pos, node, user, mode) + if not signs_lib.can_modify(pos, user) + or mode ~= screwdriver.ROTATE_FACE then + return false + end + local newparam2 + local tpos = pos + local def = minetest.registered_items[node.name] + + if string.match(node.name, "_onpole") then + if not string.match(node.name, "_horiz") then + newparam2 = signs_lib.rotate_walldir_simple[node.param2] or 4 + local t = signs_lib.wall_fdir_to_back_left + + if def.paramtype2 ~= "wallmounted" then + newparam2 = signs_lib.rotate_facedir_simple[node.param2] or 0 + t = signs_lib.fdir_to_back_left + end + + tpos = { + x = pos.x + t[node.param2][1], + y = pos.y, + z = pos.z + t[node.param2][2] + } + else + -- flip the sign to the other side of the horizontal pole + newparam2 = signs_lib.flip_walldir[node.param2] or 4 + local t = signs_lib.wall_fdir_flip_to_back + + if def.paramtype2 ~= "wallmounted" then + newparam2 = signs_lib.flip_facedir[node.param2] or 0 + t = signs_lib.fdir_flip_to_back + end + + tpos = { + x = pos.x + t[node.param2][1], + y = pos.y, + z = pos.z + t[node.param2][2] + } + end + local node2 = minetest.get_node(tpos) + local def2 = minetest.registered_items[node2.name] + if not def2 or not def2.buildable_to then return true end -- undefined, or not buildable_to. + + minetest.set_node(tpos, {name = node.name, param2 = newparam2}) + minetest.get_meta(tpos):from_table(minetest.get_meta(pos):to_table()) + minetest.remove_node(pos) + signs_lib.delete_objects(pos) + elseif string.match(node.name, "_hanging") or string.match(node.name, "yard") then + minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_facedir_simple[node.param2] or 0 }) + elseif minetest.registered_items[node.name].paramtype2 == "wallmounted" then + minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_walldir[node.param2] or 0 }) + else + minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_facedir[node.param2] or 0 }) + end + + signs_lib.update_sign(tpos) + return true +end + +-- infinite stacks + +if not minetest.settings:get_bool("creative_mode") then + signs_lib.expect_infinite_stacks = false +else + signs_lib.expect_infinite_stacks = true +end + +-- CONSTANTS + +-- Path to the textures. +local TP = signs_lib.path .. "/textures" +-- Font file formatter +local CHAR_FILE = "%s_%02x.png" +local CHAR_FILE_WIDE = "%s_%s.png" +local UNIFONT_TEX = "signs_lib_uni%02x.png\\^[sheet\\:16x16\\:%d,%d" +-- Fonts path +local CHAR_PATH = TP .. "/" .. CHAR_FILE +local CHAR_PATH_WIDE = TP .. "/" .. CHAR_FILE_WIDE + +-- Lots of overkill here. KISS advocates, go away, shoo! ;) -- kaeza + +local PNG_HDR = string.char(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A) + +-- check if a file does exist +-- to avoid reopening file after checking again +-- pass TRUE as second argument +local function file_exists(name, return_handle, mode) + mode = mode or "r"; + local f = io.open(name, mode) + if f ~= nil then + if (return_handle) then + return f + end + io.close(f) + return true + else + return false + end +end + +-- Read the image size from a PNG file. +-- Returns image_w, image_h. +-- Only the LSB is read from each field! +function signs_lib.read_image_size(filename) + local f = file_exists(filename, true, "rb") + -- file might not exist (don't crash the game) + if (not f) then + return 0, 0 + end + f:seek("set", 0x0) + local hdr = f:read(string.len(PNG_HDR)) + if hdr ~= PNG_HDR then + f:close() + return + end + f:seek("set", 0x13) + local ws = f:read(1) + f:seek("set", 0x17) + local hs = f:read(1) + f:close() + return ws:byte(), hs:byte() +end + +-- 4 rows, max 80 chars per, plus a bit of fudge to +-- avoid excess trimming (e.g. due to color codes) + +local MAX_INPUT_CHARS = 400 + +-- helper functions to trim sign text input/output + +local function trim_input(text) + return text:sub(1, math.min(MAX_INPUT_CHARS, text:len())) +end + +local function build_char_db(font_size) + + local cw = {} + local cw_wide = {} + + -- To calculate average char width. + local total_width = 0 + local char_count = 0 + + for c = 32, 255 do + local w, h = signs_lib.read_image_size(CHAR_PATH:format("signs_lib_font_"..font_size.."px", c)) + if w and h then + local ch = string.char(c) + cw[ch] = w + total_width = total_width + w + char_count = char_count + 1 + end + end + + for i = 1, #signs_lib.wide_character_codes do + local ch = signs_lib.wide_character_codes[i] + local w, h = signs_lib.read_image_size(CHAR_PATH_WIDE:format("signs_lib_font_"..font_size.."px", ch)) + if w and h then + cw_wide[ch] = w + total_width = total_width + w + char_count = char_count + 1 + end + end + + local cbw, cbh = signs_lib.read_image_size(TP.."/signs_lib_color_"..font_size.."px_n.png") + assert(cbw and cbh, "error reading bg dimensions") + return cw, cbw, cbh, (total_width / char_count), cw_wide +end + +signs_lib.charwidth16, +signs_lib.colorbgw16, +signs_lib.lineheight16, +signs_lib.avgwidth16, +signs_lib.charwidth_wide16 = build_char_db(16) + +signs_lib.charwidth32, +signs_lib.colorbgw32, +signs_lib.lineheight32, +signs_lib.avgwidth32, +signs_lib.charwidth_wide32 = build_char_db(32) + + +-- some local helper functions + +local math_max = math.max + +local function fill_line(x, y, w, c, font_size, colorbgw) + c = c or "0" + local tex = { } + for xx = x, w, colorbgw do + table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%s.png"):format(xx, y, c)) + end + return table.concat(tex) +end + +-- make char texture file name +-- if texture file does not exist use fallback texture instead +local function char_tex(font_name, ch) + if ctexcache[font_name..ch] then + return ctexcache[font_name..ch], true + else + local c = ch:byte() + local exists = file_exists(CHAR_PATH:format(font_name, c)) + local tex + if exists and c ~= 14 then + tex = CHAR_FILE:format(font_name, c) + else + tex = CHAR_FILE:format(font_name, 0x0) + end + ctexcache[font_name..ch] = tex + return tex, exists + end +end + +local function char_tex_wide(font_name, ch) + if ctexcache_wide[font_name..ch] then + return ctexcache_wide[font_name..ch], true + else + local exists = file_exists(CHAR_PATH_WIDE:format(font_name, ch)) + local tex + if exists then + tex = CHAR_FILE_WIDE:format(font_name, ch) + else + tex = CHAR_FILE:format(font_name, 0x5f) + end + ctexcache_wide[font_name..ch] = tex + return tex, exists + end +end + +local function make_line_texture(line, lineno, pos, line_width, line_height, cwidth_tab, font_size, colorbgw, cwidth_tab_wide, force_unicode_font) + local width = 0 + local maxw = 0 + local font_name = "signs_lib_font_"..font_size.."px" + + local words = { } + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + local default_color = def.default_color or 0 + + local cur_color = tonumber(default_color, 16) + + -- We check which chars are available here. + for word_i, word in ipairs(line) do + local chars = { } + local ch_offs = 0 + local word_l = #word + local i = 1 + local escape = 0 + while i <= word_l do + local wide_type, wide_c = string.match(word:sub(i), "^&#([xu])(%x+);") + local c = word:sub(i, i) + local c2 = word:sub(i+1, i+1) + + if escape > 0 then escape = escape - 1 end + if c == "^" and escape == 0 and c2:find("[1-8a-h]") then + c = string.char(tonumber(c2,18)+0x80) + i = i + 1 + end + + local wide_skip = 0 + if force_unicode_font then + if wide_c then + wide_skip = #wide_c + 3 + wide_type = "u" + elseif c:byte() < 0x80 or c:byte() >= 0xa0 then + wide_type = "u" + local uchar = signs_lib.AnsiToUtf8(c) + local code + if #uchar == 1 then + code = uchar:byte() + else + code = uchar:byte() % (2 ^ (7 - #uchar)) + for j = 1, #uchar do + code = code * (2 ^ 6) + uchar:byte(j) - 0x80 + end + end + wide_c = string.format("%04x", code) + end + elseif wide_c then + wide_skip = #wide_c + 3 + end + + if c == "#" and escape == 0 and c2:find("[0-9A-Fa-f#^]") then + if c2 == "#" or c2 == "^" then + escape = 2 + else + i = i + 1 + cur_color = tonumber(c2, 16) + end + elseif wide_c then + local w, code + if wide_type == "x" then + w = cwidth_tab_wide[wide_c] + elseif wide_type == "u" and #wide_c <= 4 then + w = font_size + code = tonumber(wide_c, 16) + if signs_lib.unifont_halfwidth[code] then + w = math.floor(w / 2) + end + end + if w then + width = width + w + if width > line_width then + width = 0 + else + maxw = math_max(width, maxw) + end + if #chars < MAX_INPUT_CHARS then + local tex + if wide_type == "u" then + local page = math.floor(code / 256) + local idx = code % 256 + local x = idx % 16 + local y = math.floor(idx / 16) + tex = UNIFONT_TEX:format(page, x, y) + if font_size == 32 then + tex = tex .. "\\^[resize\\:32x32" + end + else + tex = char_tex_wide(font_name, wide_c) + end + table.insert(chars, { + off = ch_offs, + tex = tex, + col = ("%X"):format(cur_color), + w = w, + }) + end + ch_offs = ch_offs + w + end + i = i + wide_skip + else + local w = cwidth_tab[c] + if w then + width = width + w + if width > line_width then + width = 0 + else + maxw = math_max(width, maxw) + end + if #chars < MAX_INPUT_CHARS then + table.insert(chars, { + off = ch_offs, + tex = char_tex(font_name, c), + col = ("%X"):format(cur_color), + w = w, + }) + end + ch_offs = ch_offs + w + end + end + i = i + 1 + end + width = width + cwidth_tab[" "] + maxw = math_max(width, maxw) + table.insert(words, { chars=chars, w=ch_offs }) + end + + -- Okay, we actually build the "line texture" here. + + local texture = { } + + local start_xpos = math.max(0, math.floor((line_width - maxw) / 2)) + def.x_offset + local end_xpos = math.min(start_xpos + maxw, line_width) + + local xpos = start_xpos + local ypos = (line_height + def.line_spacing)* lineno + def.y_offset + + cur_color = nil + + for word_i, word in ipairs(words) do + local xoffs = (xpos - start_xpos) + if (xoffs > 0) and ((xoffs + word.w) > end_xpos) then + table.insert(texture, fill_line(xpos, ypos, end_xpos, "n", font_size, colorbgw)) + xpos = start_xpos + ypos = ypos + line_height + def.line_spacing + lineno = lineno + 1 + if lineno >= def.number_of_lines then break end + table.insert(texture, fill_line(xpos, ypos, end_xpos, cur_color, font_size, colorbgw)) + end + for ch_i, ch in ipairs(word.chars) do + if xpos + ch.off + ch.w > end_xpos then + table.insert(texture, fill_line(xpos + ch.off, ypos, end_xpos, "n", font_size, colorbgw)) + break + end + if ch.col ~= cur_color then + cur_color = ch.col + table.insert(texture, fill_line(xpos + ch.off, ypos, end_xpos, cur_color, font_size, colorbgw)) + end + table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex)) + end + xpos = xpos + word.w + if xpos < end_xpos then + table.insert(texture, (":%d,%d="):format(xpos, ypos) .. char_tex(font_name, " ")) + xpos = xpos + cwidth_tab[" "] + end + end + + table.insert(texture, fill_line(xpos, ypos, end_xpos, "n", font_size, colorbgw)) + + return table.concat(texture), lineno +end + +function signs_lib.make_sign_texture(lines, pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + + local def = minetest.registered_items[node.name] + if not def or not def.entity_info then return end + + local font_size + local line_width + local line_height + local char_width + local char_width_wide + local colorbgw + local widemult = meta:get_int("widefont") == 1 and 0.5 or 1 + local force_unicode_font = meta:get_int("unifont") == 1 + + if def.font_size and (def.font_size == 32 or def.font_size == 31) then + font_size = 32 + line_width = math.floor(signs_lib.avgwidth32 * def.chars_per_line) * (def.horiz_scaling * widemult) + line_height = signs_lib.lineheight32 + char_width = signs_lib.charwidth32 + char_width_wide = signs_lib.charwidth_wide32 + colorbgw = signs_lib.colorbgw32 + else + font_size = 16 + line_width = math.floor(signs_lib.avgwidth16 * def.chars_per_line) * (def.horiz_scaling * widemult) + line_height = signs_lib.lineheight16 + char_width = signs_lib.charwidth16 + char_width_wide = signs_lib.charwidth_wide16 + colorbgw = signs_lib.colorbgw16 + end + + local texture = { ("[combine:%dx%d"):format(line_width, (line_height + def.line_spacing) * def.number_of_lines * def.vert_scaling) } + + local lineno = 0 + for i = 1, #lines do + if lineno >= def.number_of_lines then break end + local linetex, ln = make_line_texture(lines[i], lineno, pos, line_width, line_height, char_width, font_size, colorbgw, char_width_wide, force_unicode_font) + table.insert(texture, linetex) + lineno = ln + 1 + end + table.insert(texture, "^[makealpha:0,0,0") + return table.concat(texture, "") +end + +function signs_lib.split_lines_and_words(text) + if not text then return end + local lines = { } + for _, line in ipairs(text:split("\n", true)) do + table.insert(lines, line:split(" ")) + end + return lines +end + +function signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing) + + if not player or not signs_lib.can_modify(pos, player) then return end + if not player.get_meta then return end + + player:get_meta():set_string("signslib:pos", minetest.pos_to_string(pos)) + minetest.show_formspec(player:get_player_name(), "signs_lib:sign", get_sign_formspec(pos, node.name)) +end + +function signs_lib.destruct_sign(pos) + local meta = minetest.get_meta(pos) + local glow = meta:get_string("glow") + if glow ~= "" and not minetest.is_creative_enabled("") then + local num = tonumber(glow) + minetest.add_item(pos, ItemStack(signs_lib.glow_item .. " " .. num)) + end + signs_lib.delete_objects(pos) +end + +function signs_lib.blast_sign(pos, intensity) + if signs_lib.can_modify(pos, "") then + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node, "tnt:blast") + minetest.remove_node(pos) + return drops + end +end + +local function make_infotext(text) + text = trim_input(text) + local lines = signs_lib.split_lines_and_words(text) or {} + local lines2 = { } + for _, line in ipairs(lines) do + table.insert(lines2, (table.concat(line, " "):gsub("#[0-9a-fA-F#^]", function (s) + return s:sub(2):find("[#^]") and s:sub(2) or "" + end))) + end + return table.concat(lines2, "\n") +end + +function signs_lib.glow(pos, node, puncher) + local name = puncher:get_player_name() + if minetest.is_protected(pos, name) then + return + end + local tool = puncher:get_wielded_item() + if tool:get_name() == signs_lib.glow_item then + local meta = minetest.get_meta(pos) + local glow = tonumber(meta:get_string("glow")) + if not glow then + glow = 1 + elseif glow < 3 then + glow = glow + 1 + else + return -- already at brightest level + end + if not minetest.is_creative_enabled(name) then + tool:take_item() + puncher:set_wielded_item(tool) + end + meta:set_string("glow", glow) + end +end + +function signs_lib.update_sign(pos, fields) + local meta = minetest.get_meta(pos) + + -- legacy udpate + if meta:get_string("formspec") ~= "" then + meta:set_string("formspec", "") + end + + local text = fields and fields.text or meta:get_string("text") + text = trim_input(text) + + local owner = meta:get_string("owner") + local ownstr = "" + if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end + + -- Fix pasting from Windows: CR instead of LF + text = string.gsub(text, "\r\n?", "\n") + + meta:set_string("text", text) + meta:set_string("infotext", ownstr..make_infotext(text).." ") + + local glow = meta:get_string("glow") + signs_lib.set_obj_text(pos, text, glow) +end + +function signs_lib.can_modify(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local playername + if type(player) == "userdata" then + playername = player:get_player_name() + + elseif type(player) == "string" then + playername = player + + else + playername = "" + end + + if minetest.is_protected(pos, playername) then + minetest.record_protection_violation(pos, playername) + return false + end + + if owner == "" + or playername == owner + or minetest.get_player_privs(playername)[signs_lib.edit_priv] + or (playername == minetest.settings:get("name")) then + return true + end + minetest.record_protection_violation(pos, playername) + return false +end + +-- make selection boxes +-- sizex/sizey specified in inches because that's what MUTCD uses. + +function signs_lib.make_selection_boxes(sizex, sizey, foo, xoffs, yoffs, zoffs, is_facedir) + + local tx = (sizex * 0.0254 ) / 2 + local ty = (sizey * 0.0254 ) / 2 + local xo = xoffs and xoffs * 0.0254 or 0 + local yo = yoffs and yoffs * 0.0254 or 0 + local zo = zoffs and zoffs * 0.0254 or 0 + + if not is_facedir then + return { + type = "wallmounted", + wall_side = { -0.5 + zo, -ty + yo, -tx + xo, -0.4375 + zo, ty + yo, tx + xo }, + wall_top = { -tx - xo, 0.5 + zo, -ty + yo, tx - xo, 0.4375 + zo, ty + yo}, + wall_bottom = { -tx - xo, -0.5 + zo, -ty + yo, tx - xo, -0.4375 + zo, ty + yo } + } + else + return { + type = "fixed", + fixed = { -tx + xo, -ty + yo, 0.5 + zo, tx + xo, ty + yo, 0.4375 + zo} + } + end +end + +function signs_lib.check_for_pole(pos, pointed_thing) + local ppos = minetest.get_pointed_thing_position(pointed_thing) + local pnode = minetest.get_node(ppos) + local pdef = minetest.registered_items[pnode.name] + + if not pdef then return end + + if signs_lib.check_for_ceiling(pointed_thing) or signs_lib.check_for_floor(pointed_thing) then + return false + end + + if type(pdef.check_for_pole) == "function" then + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + return pdef.check_for_pole(pos, node, def, ppos, pnode, pdef) + elseif pdef.check_for_pole + or pdef.drawtype == "fencelike" + or string.find(pnode.name, "_post") + or string.find(pnode.name, "fencepost") then + return true + end +end + +function signs_lib.check_for_horizontal_pole(pos, pointed_thing) + local ppos = minetest.get_pointed_thing_position(pointed_thing) + local pnode = minetest.get_node(ppos) + local pdef = minetest.registered_items[pnode.name] + + if not pdef then return end + + if signs_lib.check_for_ceiling(pointed_thing) or signs_lib.check_for_floor(pointed_thing) then + return false + end + + if type(pdef.check_for_horiz_pole) == "function" then + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + return pdef.check_for_horiz_pole(pos, node, def, ppos, pnode, pdef) + end +end + +function signs_lib.check_for_ceiling(pointed_thing) + if pointed_thing.above.x == pointed_thing.under.x + and pointed_thing.above.z == pointed_thing.under.z + and pointed_thing.above.y < pointed_thing.under.y then + return true + end +end + +function signs_lib.check_for_floor(pointed_thing) + if pointed_thing.above.x == pointed_thing.under.x + and pointed_thing.above.z == pointed_thing.under.z + and pointed_thing.above.y > pointed_thing.under.y then + return true + end +end + +function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locked) + local playername = placer:get_player_name() + + local controls = placer:get_player_control() + + local signname = itemstack:get_name() + + -- in case player has sign nodes they shouldn't, remove extensions for normal sign + local no_wall_name = string.gsub(signname, "_wall", "") + no_wall_name = string.gsub(no_wall_name, "_yard", "") + no_wall_name = string.gsub(no_wall_name, "_hanging", "") + no_wall_name = string.gsub(no_wall_name, "_onpole_horiz", "") + no_wall_name = string.gsub(no_wall_name, "_onpole", "") + + local def = minetest.registered_items[signname] + + if def.allow_onpole and signs_lib.check_for_pole(pos, pointed_thing) and not controls.sneak then + local newparam2 + local lookdir = minetest.yaw_to_dir(placer:get_look_horizontal()) + if def.paramtype2 == "wallmounted" then + newparam2 = minetest.dir_to_wallmounted(lookdir) + else + newparam2 = minetest.dir_to_facedir(lookdir) + end + minetest.swap_node(pos, {name = no_wall_name.."_onpole", param2 = newparam2}) + elseif def.allow_onpole_horizontal and signs_lib.check_for_horizontal_pole(pos, pointed_thing) and not controls.sneak then + local newparam2 + local lookdir = minetest.yaw_to_dir(placer:get_look_horizontal()) + if def.paramtype2 == "wallmounted" then + newparam2 = minetest.dir_to_wallmounted(lookdir) + else + newparam2 = minetest.dir_to_facedir(lookdir) + end + minetest.swap_node(pos, {name = no_wall_name.."_onpole_horiz", param2 = newparam2}) + elseif def.allow_hanging and signs_lib.check_for_ceiling(pointed_thing) and not controls.sneak then + local newparam2 = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.swap_node(pos, {name = no_wall_name.."_hanging", param2 = newparam2}) + elseif def.allow_yard and signs_lib.check_for_floor(pointed_thing) and not controls.sneak then + local newparam2 = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.swap_node(pos, {name = no_wall_name.."_yard", param2 = newparam2}) + elseif def.paramtype2 == "facedir" and signs_lib.check_for_ceiling(pointed_thing) then + minetest.swap_node(pos, {name = signname, param2 = 6}) + elseif def.paramtype2 == "facedir" and signs_lib.check_for_floor(pointed_thing) then + minetest.swap_node(pos, {name = signname, param2 = 4}) + end + + if locked then + local meta = minetest.get_meta(pos) + meta:set_string("owner", playername) + meta:set_string("infotext", S("Locked sign, owned by @1\n", playername)) + end +end + +function signs_lib.register_fence_with_sign() + log("warning", "Attempt to call no longer used function signs_lib.register_fence_with_sign()") +end + +local use_glow = function(pos, node, puncher, pointed_thing) + if puncher then -- if e.g. a machine tries to punch; only a real person should change the lighting + signs_lib.glow(pos, node, puncher) + end + return signs_lib.update_sign(pos) +end + +local glow_drops = function(pos, oldnode, oldmetadata, digger) + if digger and minetest.is_creative_enabled(digger:get_player_name()) then + return + end + local glow = oldmetadata and oldmetadata.fields and oldmetadata.fields.glow + if glow then + minetest.add_item(pos, ItemStack(signs_lib.glow_item .. " " .. glow)) + end +end + +function signs_lib.register_sign(name, raw_def) + local def = table.copy(raw_def) + def.is_ground_content = false + + if raw_def.entity_info == "standard" then + def.entity_info = { + mesh = "signs_lib_standard_sign_entity_wall.obj", + yaw = signs_lib.wallmounted_yaw + } + elseif raw_def.entity_info then + def.entity_info = raw_def.entity_info + end + + def.after_place_node = raw_def.after_place_node or signs_lib.after_place_node + def.on_blast = raw_def.on_blast or signs_lib.blast_sign + + if raw_def.entity_info then + + if def.allow_glow ~= false then + def.on_punch = raw_def.on_punch or use_glow + def.after_dig_node = raw_def.after_dig_node or glow_drops + else + def.on_punch = raw_def.on_punch or signs_lib.update_sign + end + + def.on_rightclick = raw_def.on_rightclick or signs_lib.rightclick_sign + def.on_destruct = raw_def.on_destruct or signs_lib.destruct_sign + def.number_of_lines = raw_def.number_of_lines or signs_lib.standard_lines + def.horiz_scaling = raw_def.horiz_scaling or signs_lib.standard_hscale + def.vert_scaling = raw_def.vert_scaling or signs_lib.standard_vscale + def.line_spacing = raw_def.line_spacing or signs_lib.standard_lspace + def.font_size = raw_def.font_size or signs_lib.standard_fsize + def.x_offset = raw_def.x_offset or signs_lib.standard_xoffs + def.y_offset = raw_def.y_offset or signs_lib.standard_yoffs + def.chars_per_line = raw_def.chars_per_line or signs_lib.standard_cpl + def.default_color = raw_def.default_color or "0" + if raw_def.locked and not raw_def.after_place_node then + def.after_place_node = function(pos, placer, itemstack, pointed_thing) + signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, true) + end + end + end + + def.paramtype = raw_def.paramtype or "light" + def.drawtype = raw_def.drawtype or "mesh" + def.mesh = raw_def.mesh or "signs_lib_standard_sign_wall.obj" + def.wield_image = raw_def.wield_image or def.inventory_image + def.drop = raw_def.drop or name + def.sounds = raw_def.sounds or signs_lib.standard_wood_sign_sounds + def.paramtype2 = raw_def.paramtype2 or "wallmounted" + def.on_rotate = raw_def.on_rotate or signs_lib.handle_rotation + + if raw_def.groups then + def.groups = raw_def.groups + else + def.groups = signs_lib.standard_wood_groups + end + + -- force all signs into the sign group + def.groups.sign = def.groups.sign or 1 + + local cbox = signs_lib.make_selection_boxes(35, 25) + + def.selection_box = raw_def.selection_box or cbox + def.node_box = table.copy(raw_def.node_box or raw_def.selection_box or cbox) + + if def.sunlight_propagates ~= false then + def.sunlight_propagates = true + end + + def.tiles[3] = "signs_lib_blank.png" + def.tiles[4] = "signs_lib_blank.png" + def.tiles[5] = "signs_lib_blank.png" + def.tiles[6] = "signs_lib_blank.png" + + minetest.register_node(":"..name, def) + table.insert(signs_lib.lbm_restore_nodes, name) + + local no_wall_name = string.gsub(name, "_wall", "") + + local othermounts_def = table.copy(def) + + if raw_def.allow_onpole or raw_def.allow_onpole_horizontal then + + local offset = 0.3125 + if othermounts_def.uses_slim_pole_mount then + offset = 0.35 + end + + othermounts_def.selection_box = raw_def.onpole_selection_box or othermounts_def.selection_box + othermounts_def.node_box = raw_def.onpole_node_box or othermounts_def.selection_box + + if othermounts_def.paramtype2 == "wallmounted" then + othermounts_def.node_box.wall_side[1] = def.node_box.wall_side[1] - offset + othermounts_def.node_box.wall_side[4] = def.node_box.wall_side[4] - offset + + othermounts_def.selection_box.wall_side[1] = def.selection_box.wall_side[1] - offset + othermounts_def.selection_box.wall_side[4] = def.selection_box.wall_side[4] - offset + else + othermounts_def.node_box.fixed[3] = def.node_box.fixed[3] + offset + othermounts_def.node_box.fixed[6] = def.node_box.fixed[6] + offset + + othermounts_def.selection_box.fixed[3] = def.selection_box.fixed[3] + offset + othermounts_def.selection_box.fixed[6] = def.selection_box.fixed[6] + offset + end + + othermounts_def.groups.not_in_creative_inventory = 1 + othermounts_def.mesh = raw_def.onpole_mesh or string.gsub(othermounts_def.mesh, "wall.obj$", "onpole.obj") + + if othermounts_def.entity_info then + othermounts_def.entity_info.mesh = string.gsub(othermounts_def.entity_info.mesh, "entity_wall.obj$", "entity_onpole.obj") + end + end + + -- setting one of item 3 or 4 to a texture and leaving the other "blank", + -- reveals either the vertical or horizontal pole mount part of the model + + if raw_def.allow_onpole then + othermounts_def.tiles[3] = raw_def.tiles[3] or "signs_lib_pole_mount.png" + othermounts_def.tiles[4] = "signs_lib_blank.png" + othermounts_def.tiles[5] = "signs_lib_blank.png" + othermounts_def.tiles[6] = "signs_lib_blank.png" + + minetest.register_node(":"..no_wall_name.."_onpole", othermounts_def) + table.insert(signs_lib.lbm_restore_nodes, no_wall_name.."_onpole") + end + + if raw_def.allow_onpole_horizontal then + local onpole_horiz_def = table.copy(othermounts_def) + + onpole_horiz_def.tiles[3] = "signs_lib_blank.png" + onpole_horiz_def.tiles[4] = raw_def.tiles[3] or "signs_lib_pole_mount.png" + onpole_horiz_def.tiles[5] = "signs_lib_blank.png" + onpole_horiz_def.tiles[6] = "signs_lib_blank.png" + + minetest.register_node(":"..no_wall_name.."_onpole_horiz", onpole_horiz_def) + table.insert(signs_lib.lbm_restore_nodes, no_wall_name.."_onpole_horiz") + end + + if raw_def.allow_hanging then + + local hanging_def = table.copy(def) + hanging_def.paramtype2 = "facedir" + + local hcbox = signs_lib.make_selection_boxes(35, 32, nil, 0, 3, -18.5, true) + + hanging_def.selection_box = raw_def.hanging_selection_box or hcbox + hanging_def.node_box = raw_def.hanging_node_box or raw_def.hanging_selection_box or hcbox + + hanging_def.groups.not_in_creative_inventory = 1 + hanging_def.tiles[3] = raw_def.tiles[4] or "signs_lib_hangers.png" + hanging_def.tiles[4] = "signs_lib_blank.png" + hanging_def.tiles[5] = "signs_lib_blank.png" + hanging_def.tiles[6] = "signs_lib_blank.png" + + hanging_def.mesh = raw_def.hanging_mesh or string.gsub(string.gsub(hanging_def.mesh, "wall.obj$", "hanging.obj"), "_facedir", "") + + if hanging_def.entity_info then + hanging_def.entity_info.mesh = string.gsub(string.gsub(hanging_def.entity_info.mesh, "entity_wall.obj$", "entity_hanging.obj"), "_facedir", "") + hanging_def.entity_info.yaw = signs_lib.standard_yaw + end + + minetest.register_node(":"..no_wall_name.."_hanging", hanging_def) + table.insert(signs_lib.lbm_restore_nodes, no_wall_name.."_hanging") + end + + if raw_def.allow_yard then + + local ydef = table.copy(def) + ydef.paramtype2 = "facedir" + + local ycbox = signs_lib.make_selection_boxes(35, 34.5, false, 0, -1.25, -19.69, true) + + ydef.selection_box = raw_def.yard_selection_box or ycbox + ydef.tiles[3] = raw_def.tiles[5] or "default_wood.png" + ydef.tiles[4] = "signs_lib_blank.png" + ydef.tiles[5] = "signs_lib_blank.png" + ydef.tiles[6] = "signs_lib_blank.png" + + ydef.node_box = raw_def.yard_node_box or raw_def.yard_selection_box or ycbox + + ydef.groups.not_in_creative_inventory = 1 + ydef.mesh = raw_def.yard_mesh or string.gsub(string.gsub(ydef.mesh, "wall.obj$", "yard.obj"), "_facedir", "") + + if ydef.entity_info then + ydef.entity_info.mesh = string.gsub(string.gsub(ydef.entity_info.mesh, "entity_wall.obj$", "entity_yard.obj"), "_facedir", "") + ydef.entity_info.yaw = signs_lib.standard_yaw + end + + minetest.register_node(":"..no_wall_name.."_yard", ydef) + table.insert(signs_lib.lbm_restore_nodes, no_wall_name.."_yard") + end + + if raw_def.allow_widefont then + table.insert(signs_lib.old_widefont_signs, name.."_widefont") + table.insert(signs_lib.old_widefont_signs, name.."_widefont_onpole") + table.insert(signs_lib.old_widefont_signs, name.."_widefont_hanging") + table.insert(signs_lib.old_widefont_signs, name.."_widefont_yard") + end +end + +-- restore signs' text after /clearobjects and the like, the next time +-- a block is reloaded by the server. + +minetest.register_lbm({ + nodenames = signs_lib.lbm_restore_nodes, + name = "signs_lib:restore_sign_text", + label = "Restore sign text", + run_at_every_load = true, + action = function(pos, node) + signs_lib.update_sign(pos,nil,nil,node) + end +}) + +-- Convert old signs on fenceposts into signs on.. um.. fence posts :P + +minetest.register_lbm({ + nodenames = signs_lib.old_fenceposts_with_signs, + name = "signs_lib:fix_fencepost_signs", + label = "Change single-node signs on fences into normal", + run_at_every_load = true, + action = function(pos, node) + + local fdir = node.param2 % 8 + local signpos = { + x = pos.x + signs_lib.fdir_to_back[fdir+1][1], + y = pos.y, + z = pos.z + signs_lib.fdir_to_back[fdir+1][2] + } + + if minetest.get_node(signpos).name == "air" then + local new_wmdir = minetest.dir_to_wallmounted(minetest.facedir_to_dir(fdir)) + local oldfence = signs_lib.old_fenceposts[node.name] + local newsign = signs_lib.old_fenceposts_replacement_signs[node.name] + + signs_lib.delete_objects(pos) + + local oldmeta = minetest.get_meta(pos):to_table() + minetest.set_node(pos, {name = oldfence}) + minetest.set_node(signpos, { name = newsign, param2 = new_wmdir }) + local newmeta = minetest.get_meta(signpos) + newmeta:from_table(oldmeta) + signs_lib.update_sign(signpos) + end + end +}) + +-- Convert widefont sign nodes to use one base node with meta flag to select wide mode + +minetest.register_lbm({ + nodenames = signs_lib.old_widefont_signs, + name = "signs_lib:convert_widefont_signs", + label = "Convert widefont sign nodes", + run_at_every_load = false, + action = function(pos, node) + local basename = string.gsub(node.name, "_widefont", "") + minetest.swap_node(pos, {name = basename, param2 = node.param2}) + local meta = minetest.get_meta(pos) + meta:set_int("widefont", 1) + signs_lib.update_sign(pos) + end +}) + +-- Maintain a list of currently-loaded blocks +minetest.register_lbm({ + nodenames = {"group:sign"}, + name = "signs_lib:update_block_list", + label = "Update list of loaded blocks, log only those with signs", + run_at_every_load = true, + action = function(pos, node) + -- yeah, yeah... I know I'm hashing a block pos, but it's still just a set of coords + local hash = minetest.hash_node_position(vector.floor(vector.divide(pos, minetest.MAP_BLOCKSIZE))) + if not signs_lib.block_list[hash] then + signs_lib.block_list[hash] = true + signs_lib.totalblocks = signs_lib.totalblocks + 1 + end + end +}) + +minetest.register_chatcommand("regen_signs", { + params = "", + privs = {server = true}, + description = S("Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any."), + func = function(player_name, params) + local allsigns = {} + local totalsigns = 0 + for b in pairs(signs_lib.block_list) do + local blockpos = minetest.get_position_from_hash(b) + local pos1 = vector.multiply(blockpos, minetest.MAP_BLOCKSIZE) + local pos2 = vector.add(pos1, minetest.MAP_BLOCKSIZE - 1) + if minetest.get_node_or_nil(vector.add(pos1, minetest.MAP_BLOCKSIZE/2)) then + local signs_in_block = minetest.find_nodes_in_area(pos1, pos2, {"group:sign"}) + allsigns[#allsigns + 1] = signs_in_block + totalsigns = totalsigns + #signs_in_block + else + signs_lib.block_list[b] = nil -- if the block is no longer loaded, remove it from the table + signs_lib.totalblocks = signs_lib.totalblocks - 1 + end + end + if signs_lib.totalblocks < 0 then signs_lib.totalblocks = 0 end + if totalsigns == 0 then + minetest.chat_send_player(player_name, S("There are no signs in the currently-loaded terrain.")) + signs_lib.block_list = {} + return + end + + minetest.chat_send_player(player_name, S("Found a total of @1 sign nodes across @2 blocks.", totalsigns, signs_lib.totalblocks)) + minetest.chat_send_player(player_name, S("Regenerating sign entities ...")) + + for _, b in pairs(allsigns) do + for _, pos in ipairs(b) do + signs_lib.delete_objects(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + if def and def.entity_info then + signs_lib.update_sign(pos) + end + end + end + minetest.chat_send_player(player_name, S("Finished.")) + end +}) + +minetest.register_on_mods_loaded(function() + if not minetest.registered_privileges[signs_lib.edit_priv] then + minetest.register_privilege("signslib_edit", {}) + end +end) + + + +-- +-- local functions +-- + +function get_sign_formspec(pos, nodename) + + local meta = minetest.get_meta(pos) + local txt = meta:get_string("text") + local state = meta:get_int("unifont") == 1 and "on" or "off" + + local formspec = { + "size[6,4]", + "background[-0.5,-0.5;7,5;signs_lib_sign_bg.png]", + "image[0.1,2.4;7,1;signs_lib_sign_color_palette.png]", + "textarea[0.15,-0.2;6.3,2.8;text;;" .. minetest.formspec_escape(txt) .. "]", + "button_exit[3.7,3.4;2,1;ok;" .. S("Write") .. "]", + "label[0.3,3.4;"..FS("Unicode font").."]", + "image_button[0.6,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;uni_" + .. state .. ";;;false;signs_lib_switch_interm.png]", + } + + if minetest.registered_nodes[nodename].allow_widefont then + state = meta:get_int("widefont") == 1 and "on" or "off" + formspec[#formspec+1] = "label[2.1,3.4;"..FS("Wide font").."]" + formspec[#formspec+1] = "image_button[2.3,3.7;1,0.6;signs_lib_switch_" .. state .. ".png;wide_" + .. state .. ";;;false;signs_lib_switch_interm.png]" + end + + return table.concat(formspec, "") +end + + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname ~= "signs_lib:sign" then return end + + local pos_string = player:get_meta():get_string("signslib:pos") + local pos = minetest.string_to_pos(pos_string) + local playername = player:get_player_name() + + if fields.text and fields.ok then + log("action", "%s wrote %q to sign at %s", + (playername or ""), + fields.text:gsub("\n", "\\n"), + pos_string + ) + signs_lib.update_sign(pos, fields) + elseif fields.wide_on or fields.wide_off or fields.uni_on or fields.uni_off then + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local change_wide + local change_uni + + if fields.wide_on and meta:get_int("widefont") == 1 then + meta:set_int("widefont", 0) + change_wide = true + elseif fields.wide_off and meta:get_int("widefont") == 0 then + meta:set_int("widefont", 1) + change_wide = true + end + if fields.uni_on and meta:get_int("unifont") == 1 then + meta:set_int("unifont", 0) + change_uni = true + elseif fields.uni_off and meta:get_int("unifont") == 0 then + meta:set_int("unifont", 1) + change_uni = true + end + + if change_wide then + log("action", "%s flipped the wide-font switch to %q at %s", + (playername or ""), + (fields.wide_on and "off" or "on"), + minetest.pos_to_string(pos) + ) + signs_lib.update_sign(pos, fields) + minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) + end + if change_uni then + log("action", "%s flipped the unicode-font switch to %q at %s", + (playername or ""), + (fields.uni_on and "off" or "on"), + minetest.pos_to_string(pos) + ) + signs_lib.update_sign(pos, fields) + minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) + end + end +end) diff --git a/mods/signs_lib/compat.lua b/mods/signs_lib/compat.lua new file mode 100644 index 00000000..137d77ef --- /dev/null +++ b/mods/signs_lib/compat.lua @@ -0,0 +1,200 @@ +if minetest.get_modpath("default") then + local default_fences = { + "default:fence_wood", + "default:fence_acacia_wood", + "default:fence_aspen_wood", + "default:fence_junglewood", + "default:fence_pine_wood" + } + + for _, n in ipairs(default_fences) do + minetest.override_item(n, { + check_for_pole = true + }) + end +end + +if minetest.get_modpath("cottages") then + local cbox = table.copy(minetest.registered_items["cottages:table"].node_box) + minetest.override_item("cottages:table", { + check_for_pole = true, + selection_box = cbox + }) +end + +if minetest.get_modpath("prefab_redo") then + minetest.override_item("prefab_redo:concrete_railing", { + check_for_pole = true, + selection_box = { + type = "connected", + connect_right = { -0.125, -0.5, -0.125, 0.5, 0.375, 0.125 }, + connect_left = { -0.5, -0.5, -0.125, 0.125, 0.375, 0.125 }, + connect_back = { -0.125, -0.5, -0.125, 0.125, 0.375, 0.5 }, + connect_front = { -0.125, -0.5, -0.5, 0.125, 0.375, 0.125 }, + disconnected = { -0.125, -0.5, -0.125, 0.125, 0.25, 0.125 }, + fixed = {} + } + }) +end + +if minetest.get_modpath("streetspoles") then + + local htj_north = { + [1] = true, + [3] = true, + [9] = true, + [11] = true, + [21] = true, + [23] = true + } + + local htj_east = { + [0] = true, + [2] = true, + [16] = true, + [18] = true, + [20] = true, + [22] = true + } + + local htj_south = { + [1] = true, + [3] = true, + [5] = true, + [7] = true, + [21] = true, + [23] = true + } + + local htj_west = { + [0] = true, + [2] = true, + [12] = true, + [14] = true, + [20] = true, + [22] = true + } + + local vtj_north = { + [8] = true, + [10] = true, + [13] = true, + [15] = true, + [17] = true, + [19] = true + } + + local vtj_east = { + [4] = true, + [6] = true, + [8] = true, + [10] = true, + [17] = true, + [19] = true + } + + local vtj_south = { + [4] = true, + [6] = true, + [13] = true, + [15] = true, + [17] = true, + [10] = true + } + + local vtj_west = { + [4] = true, + [6] = true, + [8] = true, + [10] = true, + [13] = true, + [15] = true + } + + minetest.override_item("streets:bigpole", { + check_for_pole = function(pos, node, def, ppos, pnode, pdef) + if pnode.param2 < 4 + or (pnode.param2 > 19 and pnode.param2 < 24) + and (pos.x ~= ppos.x or pos.z ~= ppos.z) then + return true + end + end, + + check_for_horiz_pole = function(pos, node, def, ppos, pnode, pdef) + if pnode.param2 > 3 and pnode.param2 < 12 then + if def.paramtype2 == "wallmounted" then + if node.param2 == 2 or node.param2 == 3 -- E/W + then return true + end + else + if node.param2 == 1 or node.param2 == 3 -- E/W + then return true + end + end + elseif pnode.param2 > 11 and pnode.param2 < 20 then + if def.paramtype2 == "wallmounted" then + if node.param2 == 4 or node.param2 == 5 then + return true + end + else + if node.param2 == 0 or node.param2 == 2 then + return true + end + end + end + end + }) + + minetest.override_item("streets:bigpole_tjunction", { + check_for_pole = function(pos, node, def, ppos, pnode, pdef) + if def.paramtype2 == "wallmounted" then + if (node.param2 == 4 and vtj_north[pnode.param2]) + or (node.param2 == 2 and vtj_east[pnode.param2]) + or (node.param2 == 5 and vtj_south[pnode.param2]) + or (node.param2 == 3 and vtj_west[pnode.param2]) then + return true + end + else + if (node.param2 == 0 and vtj_north[pnode.param2]) + or (node.param2 == 1 and vtj_east[pnode.param2]) + or (node.param2 == 2 and vtj_south[pnode.param2]) + or (node.param2 == 3 and vtj_west[pnode.param2]) then + return true + end + end + end, + + check_for_horiz_pole = function(pos, node, def, ppos, pnode, pdef) + if def.paramtype2 == "wallmounted" then + if (node.param2 == 4 and htj_north[pnode.param2]) + or (node.param2 == 2 and htj_east[pnode.param2]) + or (node.param2 == 5 and htj_south[pnode.param2]) + or (node.param2 == 3 and htj_west[pnode.param2]) then + return true + end + else + if (node.param2 == 0 and htj_north[pnode.param2]) + or (node.param2 == 1 and htj_east[pnode.param2]) + or (node.param2 == 2 and htj_south[pnode.param2]) + or (node.param2 == 3 and htj_west[pnode.param2]) then + return true + end + end + end + }) + +end + +if minetest.get_modpath("streetlamps") then + minetest.override_item("streets:streetlamp_basic_top_on", { + selection_box = { + type = "fixed", + fixed = { + {-0.3,-0.4,-0.3,0.3,0.5,0.3}, + {-0.15,-0.4,-0.15,0.15,-1.55,0.15}, + {-0.18,-1.55,-0.18,0.18,-2.5,0.18}, + } + }, + check_for_pole = true + }) +end diff --git a/mods/signs_lib/copyright.txt b/mods/signs_lib/copyright.txt new file mode 100644 index 00000000..6885da78 --- /dev/null +++ b/mods/signs_lib/copyright.txt @@ -0,0 +1,4 @@ +Most code and all textures by Vanessa Dannenberg. + +Some code copied and modified from the game's default mods (especially +doors) and ironzorg's flowers mod. diff --git a/mods/signs_lib/encoding.lua b/mods/signs_lib/encoding.lua new file mode 100644 index 00000000..fbb77313 --- /dev/null +++ b/mods/signs_lib/encoding.lua @@ -0,0 +1,335 @@ +-- encoding borrowed from signs_lib fork at https://github.com/lord-server/lord + +-- The "ANSI" encoding here actually refers to "windows-1251", which shows up as +-- "ANSI" on Russian version of MS Windows + +local ansi_decode = { + [128] = "\208\130", + [129] = "\208\131", + [130] = "\226\128\154", + [131] = "\209\147", + [132] = "\226\128\158", + [133] = "\226\128\166", + [134] = "\226\128\160", + [135] = "\226\128\161", + [136] = "\226\130\172", + [137] = "\226\128\176", + [138] = "\208\137", + [139] = "\226\128\185", + [140] = "\208\138", + [141] = "\208\140", + [142] = "\208\139", + [143] = "\208\143", + [144] = "\209\146", + [145] = "\226\128\152", + [146] = "\226\128\153", + [147] = "\226\128\156", + [148] = "\226\128\157", + [149] = "\226\128\162", + [150] = "\226\128\147", + [151] = "\226\128\148", + [152] = "\194\152", + [153] = "\226\132\162", + [154] = "\209\153", + [155] = "\226\128\186", + [156] = "\209\154", + [157] = "\209\156", + [158] = "\209\155", + [159] = "\209\159", + [160] = "\194\160", + [161] = "\209\142", + [162] = "\209\158", + [163] = "\208\136", + [164] = "\194\164", + [165] = "\210\144", + [166] = "\194\166", + [167] = "\194\167", + [168] = "\208\129", + [169] = "\194\169", + [170] = "\208\132", + [171] = "\194\171", + [172] = "\194\172", + [173] = "\194\173", + [174] = "\194\174", + [175] = "\208\135", + [176] = "\194\176", + [177] = "\194\177", + [178] = "\208\134", + [179] = "\209\150", + [180] = "\210\145", + [181] = "\194\181", + [182] = "\194\182", + [183] = "\194\183", + [184] = "\209\145", + [185] = "\226\132\150", + [186] = "\209\148", + [187] = "\194\187", + [188] = "\209\152", + [189] = "\208\133", + [190] = "\209\149", + [191] = "\209\151" +} +local utf8_decode = { + [128] = { + [147] = "\150", + [148] = "\151", + [152] = "\145", + [153] = "\146", + [154] = "\130", + [156] = "\147", + [157] = "\148", + [158] = "\132", + [160] = "\134", + [161] = "\135", + [162] = "\149", + [166] = "\133", + [176] = "\137", + [185] = "\139", + [186] = "\155" + }, + [130] = {[172] = "\136"}, + [132] = {[150] = "\185", [162] = "\153"}, + [194] = { + [152] = "\152", + [160] = "\160", + [164] = "\164", + [166] = "\166", + [167] = "\167", + [169] = "\169", + [171] = "\171", + [172] = "\172", + [173] = "\173", + [174] = "\174", + [176] = "\176", + [177] = "\177", + [181] = "\181", + [182] = "\182", + [183] = "\183", + [187] = "\187" + }, + [208] = { + [129] = "\168", + [130] = "\128", + [131] = "\129", + [132] = "\170", + [133] = "\189", + [134] = "\178", + [135] = "\175", + [136] = "\163", + [137] = "\138", + [138] = "\140", + [139] = "\142", + [140] = "\141", + [143] = "\143", + [144] = "\192", + [145] = "\193", + [146] = "\194", + [147] = "\195", + [148] = "\196", + [149] = "\197", + [150] = "\198", + [151] = "\199", + [152] = "\200", + [153] = "\201", + [154] = "\202", + [155] = "\203", + [156] = "\204", + [157] = "\205", + [158] = "\206", + [159] = "\207", + [160] = "\208", + [161] = "\209", + [162] = "\210", + [163] = "\211", + [164] = "\212", + [165] = "\213", + [166] = "\214", + [167] = "\215", + [168] = "\216", + [169] = "\217", + [170] = "\218", + [171] = "\219", + [172] = "\220", + [173] = "\221", + [174] = "\222", + [175] = "\223", + [176] = "\224", + [177] = "\225", + [178] = "\226", + [179] = "\227", + [180] = "\228", + [181] = "\229", + [182] = "\230", + [183] = "\231", + [184] = "\232", + [185] = "\233", + [186] = "\234", + [187] = "\235", + [188] = "\236", + [189] = "\237", + [190] = "\238", + [191] = "\239" + }, + [209] = { + [128] = "\240", + [129] = "\241", + [130] = "\242", + [131] = "\243", + [132] = "\244", + [133] = "\245", + [134] = "\246", + [135] = "\247", + [136] = "\248", + [137] = "\249", + [138] = "\250", + [139] = "\251", + [140] = "\252", + [141] = "\253", + [142] = "\254", + [143] = "\255", + [144] = "\161", + [145] = "\184", + [146] = "\144", + [147] = "\131", + [148] = "\186", + [149] = "\190", + [150] = "\179", + [151] = "\191", + [152] = "\188", + [153] = "\154", + [154] = "\156", + [155] = "\158", + [156] = "\157", + [158] = "\162", + [159] = "\159" + }, + [210] = {[144] = "\165", [145] = "\180"} +} + +local wide_character_codes = { +} + +signs_lib.unicode_install = function( + numbers +) + local scope = utf8_decode + for i = 1,#numbers-2 do + if not scope[numbers[i]] then + scope[numbers[i]] = {} + end + scope = scope[numbers[i]] + end + scope[numbers[#numbers-1]] = "&#x" .. numbers[#numbers] .. ";" + table.insert( + wide_character_codes, + numbers[#numbers] + ) +end + +signs_lib.unicode_install({38,"26"}) + +dofile(signs_lib.path.."/nonascii-de.lua") +dofile(signs_lib.path.."/nonascii-fr.lua") +dofile(signs_lib.path.."/nonascii-pl.lua") +dofile(signs_lib.path.."/nonascii-ua.lua") + +local nmdc = { + [36] = "$", + [124] = "|" +} + +function signs_lib.AnsiToUtf8(s) + local r, b = "" + for i = 1, s and s:len() or 0 do + b = s:byte(i) + if b < 128 then + r = r .. string.char(b) + else + if b > 239 then + r = r .. "\209" .. string.char(b - 112) + elseif b > 191 then + r = r .. "\208" .. string.char(b - 48) + elseif ansi_decode[b] then + r = r .. ansi_decode[b] + else + r = r .. "_" + end + end + end + return r +end + +function signs_lib.Utf8ToAnsi(s) + local r, b = "" + local scope + local j, l, u + for i = 1, s and s:len() or 0 do + b = s:byte(i) + + -- legacy parser + if b == 0x26 then + r = r .. "&" + elseif b < 128 then + if nmdc[b] then + r = r .. nmdc[b] + else + r = r .. string.char(b) + end + elseif scope then + if scope[b] then + scope = scope[b] + if "string" == type(scope) then + r, scope = r .. scope, nil + j = -1 -- supress general UTF-8 parser + end + else + scope = nil + end + elseif utf8_decode[b] then + scope = utf8_decode[b] + end + + -- general UTF-8 parser + if j == -1 then -- supressed by legacy parser + j = nil + elseif b < 0x80 then + if j then + r = r .. "&#ufffd;" + j = nil + end + -- ASCII handled by legacy parser + elseif b >= 0xc0 then + if j then + r = r .. "&#ufffd;" + end + j = i + if b >= 0xf8 then + r = r .. "&#ufffd;" + j = nil + elseif b >= 0xf0 then + l, u = 4, b % (2 ^ 3) + elseif b >= 0xe0 then + l, u = 3, b % (2 ^ 4) + else + l, u = 2, b % (2 ^ 5) + end + else + if j then + u = u * (2 ^ 6) + b % (2 ^ 6) + if i == j + l - 1 then + r = r .. string.format("&#u%x;", u) + j = nil + end + else + r = r .. "&#ufffd;" + end + end + end + if j then + r = r .. "&#ufffd;" + end + return r +end + +signs_lib.wide_character_codes = wide_character_codes +signs_lib.unifont_halfwidth = dofile(signs_lib.path.."/unifont-halfwidth.lua") diff --git a/mods/signs_lib/init.lua b/mods/signs_lib/init.lua new file mode 100644 index 00000000..7518df46 --- /dev/null +++ b/mods/signs_lib/init.lua @@ -0,0 +1,17 @@ +-- This mod provides the visible text on signs library used by Home Decor +-- and perhaps other mods at some point in the future. Forked from thexyz's/ +-- PilzAdam's original text-on-signs mod and rewritten by Vanessa Ezekowitz +-- and Diego Martinez + +signs_lib = {} + +signs_lib.path = minetest.get_modpath(minetest.get_current_modname()) + +signs_lib.S = minetest.get_translator(minetest.get_current_modname()) + +signs_lib.edit_priv = minetest.settings:get("signs_lib.edit_priv") or "signslib_edit" + +dofile(signs_lib.path.."/encoding.lua") +dofile(signs_lib.path.."/api.lua") +dofile(signs_lib.path.."/standard_signs.lua") +dofile(signs_lib.path.."/compat.lua") diff --git a/mods/signs_lib/locale/signs_lib.de.tr b/mods/signs_lib/locale/signs_lib.de.tr new file mode 100644 index 00000000..7152cdea --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.de.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Abgeschlossenes Schild, gehört @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Iteriert durch alle derzeit geladenen Kartenblöcke, die Schilder enthalten, löscht alle Entities innerhalb des Node-Raums eines jeden Schildes und erzeugt ihre Text-Entities, falls vorhanden, neu. +There are no signs in the currently-loaded terrain.=Im derzeit geladenen Gelände befinden sich keine Schilder. +Found a total of @1 sign nodes across @2 blocks.=Insgesamt wurden @1 Schild-Nodes über @2 Kartenblöcke gefunden. +Regenerating sign entities ...=Schild-Entities werden neu erzeugt ... +Finished.=Fertig. +Write=Schreiben +Unicode font=Unicode-Schrift +Wide font=Weite Schrift +Wooden Wall Sign=Holzwandschild +Steel Wall Sign=Stahlwandschild diff --git a/mods/signs_lib/locale/signs_lib.es.tr b/mods/signs_lib/locale/signs_lib.es.tr new file mode 100644 index 00000000..1b0f79ce --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.es.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Cartel bloqueado, propiedad de @1 +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.=Examina todos los bloques de mapas que contienen letreros cargados actualmente, elimina cualquier entidad dentro del espacio de nodo de cada cartel y regenera sus entidades de texto, si las hay. +There are no signs in the currently-loaded terrain.=No hay carteles en el terreno actual cargado. +Found a total of @1 sign nodes across @2 blocks.=Se han encontrado un total de @1 cartel(es) a traves de @2 bloque(s). +Regenerating sign entities ...=Regenerando entidades de los carteles... +Finished.=Terminado +Write=Escribir +Unicode font=Fuente unicode +Wide font=Fuente ancha +Wooden Wall Sign=Cartel de Madera +Steel Wall Sign=Cartel de Acero diff --git a/mods/signs_lib/locale/signs_lib.fr.tr b/mods/signs_lib/locale/signs_lib.fr.tr new file mode 100644 index 00000000..a2525d19 --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.fr.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Panneau verrouillé, appartient à @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write= +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/locale/signs_lib.ms.tr b/mods/signs_lib/locale/signs_lib.ms.tr new file mode 100644 index 00000000..8cd632af --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.ms.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Papan tanda berkunci, milik @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write= +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/locale/signs_lib.ru.tr b/mods/signs_lib/locale/signs_lib.ru.tr new file mode 100644 index 00000000..8b9f8f50 --- /dev/null +++ b/mods/signs_lib/locale/signs_lib.ru.tr @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n=Ð·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡ÐºÐ°, пренадлежит @1@n +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write=запиÑать +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/locale/template.txt b/mods/signs_lib/locale/template.txt new file mode 100644 index 00000000..b20520b3 --- /dev/null +++ b/mods/signs_lib/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: signs_lib +Locked sign, owned by @1@n= +Skims through all currently-loaded sign-bearing mapblocks, clears away any entities within each sign's node space, and regenerates their text entities, if any.= +There are no signs in the currently-loaded terrain.= +Found a total of @1 sign nodes across @2 blocks.= +Regenerating sign entities ...= +Finished.= +Write= +Unicode font= +Wide font= +Wooden Wall Sign= +Steel Wall Sign= diff --git a/mods/signs_lib/mod.conf b/mods/signs_lib/mod.conf new file mode 100644 index 00000000..84414c99 --- /dev/null +++ b/mods/signs_lib/mod.conf @@ -0,0 +1,5 @@ +name = signs_lib +author = VanessaE +optional_depends = screwdriver, streetspoles, streetlamps, cottages, prefab_redo, default +description = Adds signs with readable text. +min_minetest_version = 5.4.0 diff --git a/mods/signs_lib/models/signs_lib_standard_facedir_sign_onpole.obj b/mods/signs_lib/models/signs_lib_standard_facedir_sign_onpole.obj new file mode 100644 index 00000000..58e505b2 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_facedir_sign_onpole.obj @@ -0,0 +1,232 @@ +# Blender v2.79 (sub 0) OBJ File: 'standard wooden sign.blend' +# www.blender.org +o facedir,_on_pole_Cube.005 +v 0.437500 -0.312500 0.812500 +v 0.437500 -0.312500 0.750000 +v 0.437500 0.312500 0.750000 +v -0.437500 -0.312500 0.812500 +v -0.437500 -0.312500 0.750000 +v -0.437500 0.312500 0.812500 +v 0.437500 0.312500 0.812500 +v -0.437500 0.312500 0.750000 +v -0.125000 -0.187500 0.812500 +v -0.125000 -0.187500 0.875000 +v -0.125000 0.187500 0.875000 +v 0.125000 -0.187500 0.812500 +v 0.164062 -0.125000 1.164063 +v -0.164063 -0.125000 1.164063 +v 0.164062 -0.187500 1.164063 +v -0.164063 -0.187500 1.164063 +v 0.125000 0.125000 0.812500 +v -0.125000 -0.125000 1.125000 +v 0.164062 0.187500 0.812500 +v 0.164062 0.187500 1.125000 +v 0.164062 0.125000 0.812500 +v 0.164062 0.125000 1.125000 +v 0.125000 -0.125000 0.812500 +v 0.125000 -0.125000 1.125000 +v 0.164062 -0.125000 0.812500 +v 0.164062 -0.187500 0.812500 +v -0.164063 0.187500 0.812500 +v -0.164063 0.125000 0.812500 +v -0.125000 0.125000 0.812500 +v -0.125000 0.125000 1.125000 +v -0.164063 -0.125000 0.812500 +v -0.164063 -0.125000 1.125000 +v -0.164063 -0.187500 0.812500 +v -0.164063 -0.187500 1.125000 +v -0.125000 -0.125000 0.812500 +v 0.125000 0.187500 0.875000 +v 0.125000 -0.187500 0.875000 +v 0.125000 0.187500 0.812500 +v -0.125000 0.187500 0.812500 +v 0.164062 -0.187500 1.125000 +v 0.164062 -0.125000 1.125000 +v -0.164063 0.125000 1.164063 +v 0.164062 0.125000 1.164063 +v -0.164063 0.187500 1.164063 +v 0.164062 0.187500 1.164063 +v -0.164063 0.125000 1.125000 +v -0.164063 0.187500 1.125000 +v 0.125000 -0.187500 1.125000 +v 0.125000 0.187500 1.125000 +v 0.125000 0.125000 1.125000 +v -0.125000 0.187500 1.125000 +v -0.125000 -0.187500 1.125000 +v 0.125000 -0.125000 0.875000 +v 0.125000 0.125000 0.875000 +v -0.125000 0.125000 0.875000 +v -0.125000 -0.125000 0.875000 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vt 0.843750 0.507812 +vt 0.703125 0.507812 +vt 0.703125 0.093750 +vt 0.843750 0.093750 +vt 0.015625 0.507812 +vt 0.015625 0.093750 +vt 0.156250 0.093750 +vt 0.156250 0.507812 +vt 0.453125 0.640625 +vt 0.453125 0.593750 +vt 0.312500 0.593750 +vt 0.312500 0.640625 +vt 0.234375 0.593750 +vt 0.234375 0.640625 +vt 0.093750 0.640625 +vt 0.093750 0.593750 +vt 0.312500 0.640625 +vt 0.312500 0.921875 +vt 0.453125 0.921875 +vt 0.453125 0.640625 +vt 0.703125 0.664062 +vt 0.703125 0.992188 +vt 0.781250 0.992188 +vt 0.781250 0.664062 +vt 0.484375 0.664062 +vt 0.484375 0.992188 +vt 0.562500 0.992188 +vt 0.562500 0.664062 +vt 0.921875 0.992188 +vt 0.921875 0.664062 +vt 0.453125 0.640625 +vt 0.453125 0.593750 +vt 0.312500 0.593750 +vt 0.312500 0.640625 +vt 0.234375 0.593750 +vt 0.234375 0.640625 +vt 0.093750 0.640625 +vt 0.093750 0.593750 +vt 0.703125 0.664062 +vt 0.703125 0.992188 +vt 0.781250 0.992188 +vt 0.781250 0.664062 +vt 0.484375 0.664062 +vt 0.484375 0.992188 +vt 0.562500 0.992188 +vt 0.562500 0.664062 +vt 0.234375 0.640625 +vt 0.234375 0.921875 +vt 0.093750 0.921875 +vt 0.093750 0.640625 +vt 0.921875 0.992188 +vt 0.921875 0.664062 +vt 0.093750 0.640625 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.234375 0.640625 +vt 0.234375 0.921875 +vt 0.093750 0.921875 +vt 0.312500 0.992188 +vt 0.453125 0.992188 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.312500 0.992188 +vt 0.453125 0.992188 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.992188 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.992188 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.703125 0.578125 +vt 0.156250 0.578125 +vt 0.156250 0.031250 +vt 0.703125 0.031250 +vt 0.312500 0.640625 +vt 0.312500 0.921875 +vt 0.453125 0.921875 +vt 0.453125 0.640625 +vt 0.703125 0.703125 +vt 0.562500 0.703125 +vt 0.562500 0.953125 +vt 0.703125 0.953125 +vt 0.703125 0.703125 +vt 0.562500 0.703125 +vt 0.562500 0.953125 +vt 0.703125 0.953125 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +g facedir,_on_pole_Cube.005_front-back +s off +f 8/1/1 3/2/1 2/3/1 5/4/1 +f 7/5/2 6/6/2 4/7/2 1/8/2 +g facedir,_on_pole_Cube.005_edges +f 4/9/3 5/10/3 2/11/3 1/12/3 +f 7/13/4 3/14/4 8/15/4 6/16/4 +f 7/13/5 1/17/5 2/18/5 3/14/5 +f 4/9/6 6/16/6 8/15/6 5/10/6 +g facedir,_on_pole_Cube.005_pole_mount +f 9/19/6 10/20/6 11/21/6 39/22/6 +f 12/23/5 38/24/5 36/25/5 37/26/5 +f 20/27/5 45/28/5 43/29/5 22/30/5 +f 44/31/6 47/32/6 46/33/6 42/34/6 +f 52/35/5 10/36/5 56/37/5 18/38/5 +f 46/39/3 22/40/3 43/41/3 42/42/3 +f 44/43/4 45/44/4 20/45/4 47/46/4 +f 42/42/2 43/41/2 45/47/2 44/48/2 +f 41/49/5 13/50/5 15/51/5 40/52/5 +f 14/53/6 32/54/6 34/55/6 16/56/6 +f 34/57/3 40/58/3 15/59/3 16/60/3 +f 14/61/4 13/62/4 41/63/4 32/64/4 +f 24/65/6 53/66/6 37/67/6 48/68/6 +f 16/60/2 15/59/2 13/69/2 14/70/2 +f 50/71/3 17/72/3 21/73/3 22/74/3 +f 20/75/4 19/76/4 38/77/4 49/78/4 +f 49/79/6 36/80/6 54/81/6 50/71/6 +f 22/30/5 21/82/5 19/83/5 20/27/5 +f 48/68/3 12/84/3 26/85/3 40/86/3 +f 41/87/4 25/88/4 23/89/4 24/90/4 +f 40/52/5 26/91/5 25/92/5 41/49/5 +f 46/33/3 28/93/3 29/94/3 30/95/3 +f 47/32/6 27/96/6 28/93/6 46/33/6 +f 51/97/4 39/98/4 27/99/4 47/100/4 +f 34/55/3 33/101/3 9/102/3 52/103/3 +f 32/54/6 31/104/6 33/101/6 34/55/6 +f 18/105/4 35/106/4 31/107/4 32/108/4 +f 10/20/2 37/26/2 36/25/2 11/21/2 +f 9/109/3 12/110/3 37/26/3 10/20/3 +f 11/21/4 36/25/4 38/111/4 39/112/4 +f 30/113/5 55/114/5 11/115/5 51/116/5 +f 52/117/1 18/118/1 24/119/1 48/120/1 +f 30/121/1 51/122/1 49/123/1 50/124/1 diff --git a/mods/signs_lib/models/signs_lib_standard_facedir_sign_wall.obj b/mods/signs_lib/models/signs_lib_standard_facedir_sign_wall.obj new file mode 100644 index 00000000..580a5ae7 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_facedir_sign_wall.obj @@ -0,0 +1,52 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend' +# www.blender.org +o sign_(3)_Cube +v 0.437500 -0.312500 0.500000 +v 0.437500 -0.312500 0.437500 +v 0.437500 0.312500 0.500000 +v 0.437500 0.312500 0.437500 +v -0.437500 -0.312500 0.500000 +v -0.437500 -0.312500 0.437500 +v -0.437500 0.312500 0.500000 +v -0.437500 0.312500 0.437500 +v 0.437500 -0.312500 0.500000 +v 0.437500 -0.312500 0.437500 +v 0.437500 0.312500 0.500000 +v 0.437500 0.312500 0.437500 +v -0.437500 -0.312500 0.500000 +v -0.437500 -0.312500 0.437500 +v -0.437500 0.312500 0.500000 +v -0.437500 0.312500 0.437500 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +g sign_(3)_Cube_front-back +s off +f 8/1/1 4/2/1 2/3/1 6/4/1 +f 3/5/2 7/6/2 5/7/2 1/8/2 +g sign_(3)_Cube_edges +f 13/9/3 14/10/3 10/11/3 9/12/3 +f 11/13/4 12/14/4 16/15/4 15/16/4 +f 11/13/5 9/17/5 10/18/5 12/14/5 +f 13/9/6 15/16/6 16/15/6 14/10/6 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_entity_hanging.obj b/mods/signs_lib/models/signs_lib_standard_sign_entity_hanging.obj new file mode 100644 index 00000000..34fa86b4 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_entity_hanging.obj @@ -0,0 +1,15 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden hanging sign.blend' +# www.blender.org +o Plane +v 0.406250 -0.281250 -0.042969 +v -0.406250 -0.281250 -0.042969 +v 0.406250 0.281250 -0.042969 +v -0.406250 0.281250 -0.042969 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.0000 -1.0000 +g Plane_Plane_None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_entity_onpole.obj b/mods/signs_lib/models/signs_lib_standard_sign_entity_onpole.obj new file mode 100644 index 00000000..5b630c37 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_entity_onpole.obj @@ -0,0 +1,15 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend' +# www.blender.org +o text_entity.001_Plane +v 0.406250 -0.281250 0.738281 +v -0.406250 -0.281250 0.738281 +v 0.406250 0.281250 0.738281 +v -0.406250 0.281250 0.738281 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.0000 -1.0000 +g text_entity.001_Plane_text_entity +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_entity_wall.obj b/mods/signs_lib/models/signs_lib_standard_sign_entity_wall.obj new file mode 100644 index 00000000..54ae3b2e --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_entity_wall.obj @@ -0,0 +1,15 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden sign.blend' +# www.blender.org +o text_entity_Plane +v 0.406250 -0.281250 0.425781 +v -0.406250 -0.281250 0.425781 +v 0.406250 0.281250 0.425781 +v -0.406250 0.281250 0.425781 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.0000 -1.0000 +g text_entity_Plane_text_entity +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_entity_yard.obj b/mods/signs_lib/models/signs_lib_standard_sign_entity_yard.obj new file mode 100644 index 00000000..fde001b9 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_entity_yard.obj @@ -0,0 +1,15 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden yard sign.blend' +# www.blender.org +o Plane +v 0.406250 -0.218750 -0.074219 +v -0.406250 -0.218750 -0.074219 +v 0.406250 0.343750 -0.074219 +v -0.406250 0.343750 -0.074219 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.0000 -1.0000 +g Plane_Plane_None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_hanging.obj b/mods/signs_lib/models/signs_lib_standard_sign_hanging.obj new file mode 100644 index 00000000..85057ff9 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_hanging.obj @@ -0,0 +1,62 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden hanging sign.blend' +# www.blender.org +o Cube +v 0.437500 -0.312500 0.031250 +v 0.437500 -0.312500 -0.031250 +v 0.437500 0.312500 0.031250 +v 0.437500 0.312500 -0.031250 +v -0.437500 -0.312500 0.031250 +v -0.437500 -0.312500 -0.031250 +v -0.437500 0.312500 0.031250 +v -0.437500 0.312500 -0.031250 +v 0.437500 -0.312500 0.031250 +v 0.437500 -0.312500 -0.031250 +v 0.437500 0.312500 0.031250 +v 0.437500 0.312500 -0.031250 +v -0.437500 -0.312500 0.031250 +v -0.437500 -0.312500 -0.031250 +v -0.437500 0.312500 0.031250 +v -0.437500 0.312500 -0.031250 +v 0.500000 0.312500 -0.000000 +v 0.500000 0.500000 0.000000 +v -0.500000 0.312500 -0.000000 +v -0.500000 0.500000 0.000000 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vt 1.000000 0.812500 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.812500 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +g Cube_Cube_front-back +s off +f 8/1/1 4/2/1 2/3/1 6/4/1 +f 3/5/2 7/6/2 5/7/2 1/8/2 +g Cube_Cube_edges +f 13/9/3 14/10/3 10/11/3 9/12/3 +f 11/13/4 12/14/4 16/15/4 15/16/4 +f 11/13/5 9/17/5 10/18/5 12/14/5 +f 13/9/6 15/16/6 16/15/6 14/10/6 +g Cube_Cube_hangers +f 19/19/1 20/20/1 18/21/1 17/22/1 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_onpole.obj b/mods/signs_lib/models/signs_lib_standard_sign_onpole.obj new file mode 100644 index 00000000..b3275d00 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_onpole.obj @@ -0,0 +1,232 @@ +# Blender v2.79 (sub 0) OBJ File: 'standard wooden sign.blend' +# www.blender.org +o wallmounted,_on_pole_Cube.002 +v 0.437500 -0.812500 -0.312500 +v 0.437500 -0.750000 -0.312500 +v 0.437500 -0.750000 0.312500 +v -0.437500 -0.812500 -0.312500 +v -0.437500 -0.750000 -0.312500 +v -0.437500 -0.812500 0.312500 +v 0.437500 -0.812500 0.312500 +v -0.437500 -0.750000 0.312500 +v -0.125000 -0.812500 -0.187500 +v -0.125000 -0.875000 -0.187500 +v -0.125000 -0.875000 0.187500 +v 0.125000 -0.812500 -0.187500 +v 0.164062 -1.164063 -0.125000 +v -0.164063 -1.164063 -0.125000 +v 0.164062 -1.164063 -0.187500 +v -0.164063 -1.164063 -0.187500 +v 0.125000 -0.812500 0.125000 +v -0.125000 -1.125000 -0.125000 +v 0.164062 -0.812500 0.187500 +v 0.164062 -1.125000 0.187500 +v 0.164062 -0.812500 0.125000 +v 0.164062 -1.125000 0.125000 +v 0.125000 -0.812500 -0.125000 +v 0.125000 -1.125000 -0.125000 +v 0.164062 -0.812500 -0.125000 +v 0.164062 -0.812500 -0.187500 +v -0.164063 -0.812500 0.187500 +v -0.164063 -0.812500 0.125000 +v -0.125000 -0.812500 0.125000 +v -0.125000 -1.125000 0.125000 +v -0.164063 -0.812500 -0.125000 +v -0.164063 -1.125000 -0.125000 +v -0.164063 -0.812500 -0.187500 +v -0.164063 -1.125000 -0.187500 +v -0.125000 -0.812500 -0.125000 +v 0.125000 -0.875000 0.187500 +v 0.125000 -0.875000 -0.187500 +v 0.125000 -0.812500 0.187500 +v -0.125000 -0.812500 0.187500 +v 0.164062 -1.125000 -0.187500 +v 0.164062 -1.125000 -0.125000 +v -0.164063 -1.164063 0.125000 +v 0.164062 -1.164063 0.125000 +v -0.164063 -1.164063 0.187500 +v 0.164062 -1.164063 0.187500 +v -0.164063 -1.125000 0.125000 +v -0.164063 -1.125000 0.187500 +v 0.125000 -1.125000 -0.187500 +v 0.125000 -1.125000 0.187500 +v 0.125000 -1.125000 0.125000 +v -0.125000 -1.125000 0.187500 +v -0.125000 -1.125000 -0.187500 +v 0.125000 -0.875000 -0.125000 +v 0.125000 -0.875000 0.125000 +v -0.125000 -0.875000 0.125000 +v -0.125000 -0.875000 -0.125000 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vt 0.843750 0.507812 +vt 0.703125 0.507812 +vt 0.703125 0.093750 +vt 0.843750 0.093750 +vt 0.015625 0.507812 +vt 0.015625 0.093750 +vt 0.156250 0.093750 +vt 0.156250 0.507812 +vt 0.453125 0.640625 +vt 0.453125 0.593750 +vt 0.312500 0.593750 +vt 0.312500 0.640625 +vt 0.234375 0.593750 +vt 0.234375 0.640625 +vt 0.093750 0.640625 +vt 0.093750 0.593750 +vt 0.312500 0.640625 +vt 0.312500 0.921875 +vt 0.453125 0.921875 +vt 0.453125 0.640625 +vt 0.703125 0.664062 +vt 0.703125 0.992188 +vt 0.781250 0.992188 +vt 0.781250 0.664062 +vt 0.484375 0.664062 +vt 0.484375 0.992188 +vt 0.562500 0.992188 +vt 0.562500 0.664062 +vt 0.921875 0.992188 +vt 0.921875 0.664062 +vt 0.453125 0.640625 +vt 0.453125 0.593750 +vt 0.312500 0.593750 +vt 0.312500 0.640625 +vt 0.234375 0.593750 +vt 0.234375 0.640625 +vt 0.093750 0.640625 +vt 0.093750 0.593750 +vt 0.703125 0.664062 +vt 0.703125 0.992188 +vt 0.781250 0.992188 +vt 0.781250 0.664062 +vt 0.484375 0.664062 +vt 0.484375 0.992188 +vt 0.562500 0.992188 +vt 0.562500 0.664062 +vt 0.234375 0.640625 +vt 0.234375 0.921875 +vt 0.093750 0.921875 +vt 0.093750 0.640625 +vt 0.921875 0.992188 +vt 0.921875 0.664062 +vt 0.093750 0.640625 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.234375 0.640625 +vt 0.234375 0.921875 +vt 0.093750 0.921875 +vt 0.312500 0.992188 +vt 0.453125 0.992188 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.312500 0.992188 +vt 0.453125 0.992188 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.992188 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.093750 0.992188 +vt 0.015625 0.992188 +vt 0.015625 0.640625 +vt 0.234375 0.992188 +vt 0.234375 0.640625 +vt 0.234375 0.992188 +vt 0.312500 0.992188 +vt 0.312500 0.640625 +vt 0.703125 0.578125 +vt 0.156250 0.578125 +vt 0.156250 0.031250 +vt 0.703125 0.031250 +vt 0.312500 0.640625 +vt 0.312500 0.921875 +vt 0.453125 0.921875 +vt 0.453125 0.640625 +vt 0.703125 0.703125 +vt 0.562500 0.703125 +vt 0.562500 0.953125 +vt 0.703125 0.953125 +vt 0.703125 0.703125 +vt 0.562500 0.703125 +vt 0.562500 0.953125 +vt 0.703125 0.953125 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +g wallmounted,_on_pole_Cube.002_front-back +s off +f 8/1/1 3/2/1 2/3/1 5/4/1 +f 7/5/2 6/6/2 4/7/2 1/8/2 +g wallmounted,_on_pole_Cube.002_edges +f 4/9/3 5/10/3 2/11/3 1/12/3 +f 7/13/4 3/14/4 8/15/4 6/16/4 +f 7/13/5 1/17/5 2/18/5 3/14/5 +f 4/9/6 6/16/6 8/15/6 5/10/6 +g wallmounted,_on_pole_Cube.002_pole_mount +f 9/19/6 10/20/6 11/21/6 39/22/6 +f 12/23/5 38/24/5 36/25/5 37/26/5 +f 20/27/5 45/28/5 43/29/5 22/30/5 +f 44/31/6 47/32/6 46/33/6 42/34/6 +f 52/35/5 10/36/5 56/37/5 18/38/5 +f 46/39/3 22/40/3 43/41/3 42/42/3 +f 44/43/4 45/44/4 20/45/4 47/46/4 +f 42/42/2 43/41/2 45/47/2 44/48/2 +f 41/49/5 13/50/5 15/51/5 40/52/5 +f 14/53/6 32/54/6 34/55/6 16/56/6 +f 34/57/3 40/58/3 15/59/3 16/60/3 +f 14/61/4 13/62/4 41/63/4 32/64/4 +f 24/65/6 53/66/6 37/67/6 48/68/6 +f 16/60/2 15/59/2 13/69/2 14/70/2 +f 50/71/3 17/72/3 21/73/3 22/74/3 +f 20/75/4 19/76/4 38/77/4 49/78/4 +f 49/79/6 36/80/6 54/81/6 50/71/6 +f 22/30/5 21/82/5 19/83/5 20/27/5 +f 48/68/3 12/84/3 26/85/3 40/86/3 +f 41/87/4 25/88/4 23/89/4 24/90/4 +f 40/52/5 26/91/5 25/92/5 41/49/5 +f 46/33/3 28/93/3 29/94/3 30/95/3 +f 47/32/6 27/96/6 28/93/6 46/33/6 +f 51/97/4 39/98/4 27/99/4 47/100/4 +f 34/55/3 33/101/3 9/102/3 52/103/3 +f 32/54/6 31/104/6 33/101/6 34/55/6 +f 18/105/4 35/106/4 31/107/4 32/108/4 +f 10/20/2 37/26/2 36/25/2 11/21/2 +f 9/109/3 12/110/3 37/26/3 10/20/3 +f 11/21/4 36/25/4 38/111/4 39/112/4 +f 30/113/5 55/114/5 11/115/5 51/116/5 +f 52/117/1 18/118/1 24/119/1 48/120/1 +f 30/121/1 51/122/1 49/123/1 50/124/1 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_wall.obj b/mods/signs_lib/models/signs_lib_standard_sign_wall.obj new file mode 100644 index 00000000..639444ff --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_wall.obj @@ -0,0 +1,52 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden wall sign.blend' +# www.blender.org +o Cube +v 0.437500 -0.500000 -0.312500 +v 0.437500 -0.437500 -0.312500 +v 0.437500 -0.500000 0.312500 +v 0.437500 -0.437500 0.312500 +v -0.437500 -0.500000 -0.312500 +v -0.437500 -0.437500 -0.312500 +v -0.437500 -0.500000 0.312500 +v -0.437500 -0.437500 0.312500 +v 0.437500 -0.500000 -0.312500 +v 0.437500 -0.437500 -0.312500 +v 0.437500 -0.500000 0.312500 +v 0.437500 -0.437500 0.312500 +v -0.437500 -0.500000 -0.312500 +v -0.437500 -0.437500 -0.312500 +v -0.437500 -0.500000 0.312500 +v -0.437500 -0.437500 0.312500 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +g Cube_Cube_front-back +s off +f 8/1/1 4/2/1 2/3/1 6/4/1 +f 3/5/2 7/6/2 5/7/2 1/8/2 +g Cube_Cube_edges +f 13/9/3 14/10/3 10/11/3 9/12/3 +f 11/13/4 12/14/4 16/15/4 15/16/4 +f 11/13/5 9/17/5 10/18/5 12/14/5 +f 13/9/6 15/16/6 16/15/6 14/10/6 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_yard.obj b/mods/signs_lib/models/signs_lib_standard_sign_yard.obj new file mode 100644 index 00000000..b6ed3655 --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_yard.obj @@ -0,0 +1,85 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden yard sign.blend' +# www.blender.org +o Cube +v 0.437500 -0.250000 -0.000000 +v 0.437500 -0.250000 -0.062500 +v 0.437500 0.375000 0.000000 +v 0.437500 0.375000 -0.062500 +v -0.437500 -0.250000 -0.000000 +v -0.437500 -0.250000 -0.062500 +v -0.437500 0.375000 0.000000 +v -0.437500 0.375000 -0.062500 +v 0.437500 -0.250000 -0.000000 +v 0.437500 -0.250000 -0.062500 +v 0.437500 0.375000 0.000000 +v 0.437500 0.375000 -0.062500 +v -0.437500 -0.250000 -0.000000 +v -0.437500 -0.250000 -0.062500 +v -0.437500 0.375000 0.000000 +v -0.437500 0.375000 -0.062500 +v 0.062500 -0.500000 0.000000 +v 0.062500 0.250000 0.000000 +v 0.062500 -0.500000 0.062500 +v 0.062500 0.250000 0.062500 +v -0.062500 -0.500000 0.000000 +v -0.062500 0.250000 0.000000 +v -0.062500 -0.500000 0.062500 +v -0.062500 0.250000 0.062500 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vt 0.000000 0.750000 +vt 2.000000 0.750000 +vt 2.000000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.125000 +vt 2.000000 0.125000 +vt 2.000000 0.375000 +vt 0.000000 0.375000 +vt 2.000000 0.500000 +vt 0.000000 0.500000 +vt 0.812500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 1.000000 +vt 0.812500 1.000000 +vt 0.125000 0.875000 +vt 0.375000 0.875000 +vt 0.375000 1.000000 +vt 0.125000 1.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +g Cube_Cube_front-back +s off +f 8/1/1 4/2/1 2/3/1 6/4/1 +f 3/5/2 7/6/2 5/7/2 1/8/2 +g Cube_Cube_edges +f 13/9/3 14/10/3 10/11/3 9/12/3 +f 11/13/4 12/14/4 16/15/4 15/16/4 +f 11/13/5 9/17/5 10/18/5 12/14/5 +f 13/9/6 15/16/6 16/15/6 14/10/6 +g Cube_Cube_default_wood +f 17/19/5 18/20/5 20/21/5 19/22/5 +f 19/23/2 20/24/2 24/25/2 23/26/2 +f 23/26/6 24/25/6 22/27/6 21/28/6 +f 21/28/1 22/27/1 18/20/1 17/19/1 +f 19/29/3 23/30/3 21/31/3 17/32/3 +f 24/33/4 20/34/4 18/35/4 22/36/4 diff --git a/mods/signs_lib/models/signs_lib_standard_sign_yard_two_sticks.obj b/mods/signs_lib/models/signs_lib_standard_sign_yard_two_sticks.obj new file mode 100644 index 00000000..92a7e36c --- /dev/null +++ b/mods/signs_lib/models/signs_lib_standard_sign_yard_two_sticks.obj @@ -0,0 +1,110 @@ +# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden yard sign two sticks.blend' +# www.blender.org +o Cube +v 0.437500 -0.250000 -0.000000 +v 0.437500 -0.250000 -0.062500 +v 0.437500 0.375000 0.000000 +v -0.437500 0.375000 0.000000 +v -0.437500 0.375000 -0.062500 +v 0.437500 0.375000 -0.062500 +v -0.437500 -0.250000 -0.000000 +v -0.437500 -0.250000 -0.062500 +v 0.421875 -0.500000 0.000000 +v 0.421875 0.250000 0.000000 +v 0.421875 -0.500000 0.031250 +v 0.390625 -0.500000 0.000000 +v 0.390625 0.250000 0.000000 +v 0.390625 -0.500000 0.031250 +v -0.390625 -0.500000 0.000000 +v -0.390625 -0.500000 0.031250 +v -0.421875 -0.500000 0.000000 +v -0.421875 0.250000 0.000000 +v -0.421875 -0.500000 0.031250 +v 0.421875 0.218750 0.031250 +v 0.390625 0.218750 0.031250 +v -0.390625 0.250000 0.000000 +v -0.390625 0.218750 0.031250 +v -0.421875 0.218750 0.031250 +vt 0.468750 0.812500 +vt 0.031250 0.812500 +vt 0.031250 0.187500 +vt 0.468750 0.187500 +vt 0.531250 0.812500 +vt 0.968750 0.812500 +vt 0.968750 0.187500 +vt 0.531250 0.187500 +vt 0.234375 0.000000 +vt 0.234375 1.000000 +vt 0.015625 1.000000 +vt 0.015625 -0.000000 +vt 0.609375 -0.000000 +vt 0.609375 1.000000 +vt 0.390625 1.000000 +vt 0.390625 -0.000000 +vt 0.765625 0.000000 +vt 0.765625 1.000000 +vt 0.000000 0.375000 +vt 1.437500 0.375000 +vt 1.437500 0.437500 +vt 0.000000 0.437500 +vt 1.500000 0.500000 +vt 0.000000 0.500000 +vt 1.500000 0.562500 +vt 0.000000 0.562500 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 1.437500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.375000 +vt 1.437500 0.375000 +vt 1.437500 0.437500 +vt 0.000000 0.437500 +vt 1.500000 0.500000 +vt 0.000000 0.500000 +vt 1.500000 0.562500 +vt 0.000000 0.562500 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 1.437500 0.625000 +vt 0.000000 0.625000 +vt 0.312500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 0.875000 +vt 0.312500 0.875000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 0.7071 0.7071 +g Cube_Cube_front-back +s off +f 5/1/1 6/2/1 2/3/1 8/4/1 +f 3/5/2 4/6/2 7/7/2 1/8/2 +g Cube_Cube_edges +f 7/9/3 8/10/3 2/11/3 1/12/3 +f 3/13/4 6/14/4 5/15/4 4/16/4 +f 3/13/5 1/17/5 2/18/5 6/14/5 +f 7/9/6 4/16/6 5/15/6 8/10/6 +g Cube_Cube_sticks +f 11/19/2 20/20/2 21/21/2 14/22/2 +f 14/22/6 21/21/6 13/23/6 12/24/6 +f 12/24/1 13/23/1 10/25/1 9/26/1 +f 11/27/3 14/28/3 12/29/3 9/30/3 +f 9/26/5 10/25/5 20/31/5 11/32/5 +f 16/33/2 23/34/2 24/35/2 19/36/2 +f 19/36/6 24/35/6 18/37/6 17/38/6 +f 17/38/1 18/37/1 22/39/1 15/40/1 +f 16/41/3 19/42/3 17/43/3 15/44/3 +f 15/40/5 22/39/5 23/45/5 16/46/5 +f 10/47/7 13/48/7 21/49/7 20/50/7 +f 22/51/7 18/52/7 24/53/7 23/54/7 diff --git a/mods/signs_lib/nonascii-de.lua b/mods/signs_lib/nonascii-de.lua new file mode 100644 index 00000000..5ca5f901 --- /dev/null +++ b/mods/signs_lib/nonascii-de.lua @@ -0,0 +1,7 @@ +signs_lib.unicode_install({195,132,"00c4"}) +signs_lib.unicode_install({195,150,"00d6"}) +signs_lib.unicode_install({195,156,"00dc"}) +signs_lib.unicode_install({195,159,"00df"}) +signs_lib.unicode_install({195,164,"00e4"}) +signs_lib.unicode_install({195,182,"00f6"}) +signs_lib.unicode_install({195,188,"00fc"}) diff --git a/mods/signs_lib/nonascii-fr.lua b/mods/signs_lib/nonascii-fr.lua new file mode 100644 index 00000000..185bd869 --- /dev/null +++ b/mods/signs_lib/nonascii-fr.lua @@ -0,0 +1,16 @@ +signs_lib.unicode_install({195,128,"00c0"}) +signs_lib.unicode_install({195,134,"00c6"}) +signs_lib.unicode_install({195,135,"00c7"}) +signs_lib.unicode_install({195,136,"00c8"}) +signs_lib.unicode_install({195,137,"00c9"}) +signs_lib.unicode_install({195,138,"00ca"}) +signs_lib.unicode_install({195,148,"00d4"}) +signs_lib.unicode_install({195,153,"00d9"}) +signs_lib.unicode_install({195,160,"00e0"}) +signs_lib.unicode_install({195,166,"00e6"}) +signs_lib.unicode_install({195,167,"00e7"}) +signs_lib.unicode_install({195,168,"00e8"}) +signs_lib.unicode_install({195,169,"00e9"}) +signs_lib.unicode_install({195,170,"00ea"}) +signs_lib.unicode_install({195,180,"00f4"}) +signs_lib.unicode_install({195,185,"00f9"}) diff --git a/mods/signs_lib/nonascii-pl.lua b/mods/signs_lib/nonascii-pl.lua new file mode 100644 index 00000000..0924f8f8 --- /dev/null +++ b/mods/signs_lib/nonascii-pl.lua @@ -0,0 +1,16 @@ +signs_lib.unicode_install({195,147,"00d3"}) +signs_lib.unicode_install({195,179,"00f3"}) +signs_lib.unicode_install({196,132,"0104"}) +signs_lib.unicode_install({196,133,"0105"}) +signs_lib.unicode_install({196,134,"0106"}) +signs_lib.unicode_install({196,135,"0107"}) +signs_lib.unicode_install({196,152,"0118"}) +signs_lib.unicode_install({196,153,"0119"}) +signs_lib.unicode_install({197,129,"0141"}) +signs_lib.unicode_install({197,130,"0142"}) +signs_lib.unicode_install({197,154,"015a"}) +signs_lib.unicode_install({197,155,"015b"}) +signs_lib.unicode_install({197,185,"0179"}) +signs_lib.unicode_install({197,186,"017a"}) +signs_lib.unicode_install({197,187,"017b"}) +signs_lib.unicode_install({197,188,"017c"}) diff --git a/mods/signs_lib/nonascii-ua.lua b/mods/signs_lib/nonascii-ua.lua new file mode 100644 index 00000000..09b05130 --- /dev/null +++ b/mods/signs_lib/nonascii-ua.lua @@ -0,0 +1,8 @@ +signs_lib.unicode_install({208,132,"0404"}) +signs_lib.unicode_install({208,134,"0406"}) +signs_lib.unicode_install({208,135,"0407"}) +signs_lib.unicode_install({209,148,"0454"}) +signs_lib.unicode_install({209,150,"0456"}) +signs_lib.unicode_install({209,151,"0457"}) +signs_lib.unicode_install({210,144,"0490"}) +signs_lib.unicode_install({210,145,"0491"}) diff --git a/mods/signs_lib/settingstypes.txt b/mods/signs_lib/settingstypes.txt new file mode 100644 index 00000000..81ba0352 --- /dev/null +++ b/mods/signs_lib/settingstypes.txt @@ -0,0 +1 @@ +signs_lib.edit_priv (Allows to rotate signs and to open (and consequently edit) any default sign formspec) string signslib_edit diff --git a/mods/signs_lib/standard_signs.lua b/mods/signs_lib/standard_signs.lua new file mode 100644 index 00000000..edbfefca --- /dev/null +++ b/mods/signs_lib/standard_signs.lua @@ -0,0 +1,73 @@ +-- Definitions for standard minetest_game wooden and steel wall signs + +local S = signs_lib.S + +if minetest.get_modpath("default") then + signs_lib.register_sign("default:sign_wall_wood", { + description = S("Wooden Wall Sign"), + inventory_image = "signs_lib_sign_wall_wooden_inv.png", + tiles = { + "signs_lib_sign_wall_wooden.png", + "signs_lib_sign_wall_wooden_edges.png", + -- items 3 - 5 are not set, so signs_lib will use its standard pole + -- mount, hanging, and yard sign stick textures. + }, + entity_info = "standard", + allow_hanging = true, + allow_widefont = true, + allow_onpole = true, + allow_onpole_horizontal = true, + allow_yard = true, + use_texture_alpha = "clip", + }) + + signs_lib.register_sign("default:sign_wall_steel", { + description = S("Steel Wall Sign"), + inventory_image = "signs_lib_sign_wall_steel_inv.png", + tiles = { + "signs_lib_sign_wall_steel.png", + "signs_lib_sign_wall_steel_edges.png", + nil, -- not set, so it'll use the standard pole mount texture + nil, -- not set, so it'll use the standard hanging chains texture + "default_steel_block.png" -- for the yard sign's stick + }, + groups = signs_lib.standard_steel_groups, + sounds = signs_lib.standard_steel_sign_sounds, + locked = true, + entity_info = "standard", + allow_hanging = true, + allow_widefont = true, + allow_onpole = true, + allow_onpole_horizontal = true, + allow_yard = true, + use_texture_alpha = "clip", + }) + + minetest.register_alias("signs:sign_hanging", "default:sign_wood_hanging") + minetest.register_alias("basic_signs:hanging_sign", "default:sign_wood_hanging") + minetest.register_alias("signs:sign_yard", "default:sign_wood_yard") + minetest.register_alias("basic_signs:yard_sign", "default:sign_wood_yard") + + minetest.register_alias("default:sign_wall_wood_onpole", "default:sign_wood_onpole") + minetest.register_alias("default:sign_wall_wood_onpole_horiz", "default:sign_wood_onpole_horiz") + minetest.register_alias("default:sign_wall_wood_hanging", "default:sign_wood_hanging") + minetest.register_alias("default:sign_wall_wood_yard", "default:sign_wood_yard") + + minetest.register_alias("default:sign_wall_steel_onpole", "default:sign_steel_onpole") + minetest.register_alias("default:sign_wall_steel_onpole_horiz", "default:sign_steel_onpole_horiz") + minetest.register_alias("default:sign_wall_steel_hanging", "default:sign_steel_hanging") + minetest.register_alias("default:sign_wall_steel_yard", "default:sign_steel_yard") +end + +table.insert(signs_lib.lbm_restore_nodes, "signs:sign_hanging") +table.insert(signs_lib.lbm_restore_nodes, "basic_signs:hanging_sign") +table.insert(signs_lib.lbm_restore_nodes, "signs:sign_yard") +table.insert(signs_lib.lbm_restore_nodes, "basic_signs:yard_sign") +table.insert(signs_lib.lbm_restore_nodes, "default:sign_wood_yard") +table.insert(signs_lib.lbm_restore_nodes, "default:sign_wall_wood_yard") + +-- insert the old wood sign-on-fencepost into signs_lib's conversion LBM + +table.insert(signs_lib.old_fenceposts_with_signs, "signs:sign_post") +signs_lib.old_fenceposts["signs:sign_post"] = "default:fence_wood" +signs_lib.old_fenceposts_replacement_signs["signs:sign_post"] = "default:sign_wall_wood_onpole" diff --git a/mods/signs_lib/textures/signs_lib_blank.png b/mods/signs_lib/textures/signs_lib_blank.png new file mode 100644 index 00000000..af367b99 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_blank.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_0.png b/mods/signs_lib/textures/signs_lib_color_16px_0.png new file mode 100644 index 00000000..18605c93 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_0.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_1.png b/mods/signs_lib/textures/signs_lib_color_16px_1.png new file mode 100644 index 00000000..7bd3936a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_1.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_2.png b/mods/signs_lib/textures/signs_lib_color_16px_2.png new file mode 100644 index 00000000..3d4fe9f7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_2.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_3.png b/mods/signs_lib/textures/signs_lib_color_16px_3.png new file mode 100644 index 00000000..1d4dfa4a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_3.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_4.png b/mods/signs_lib/textures/signs_lib_color_16px_4.png new file mode 100644 index 00000000..91c859fb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_4.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_5.png b/mods/signs_lib/textures/signs_lib_color_16px_5.png new file mode 100644 index 00000000..878d7dfd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_5.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_6.png b/mods/signs_lib/textures/signs_lib_color_16px_6.png new file mode 100644 index 00000000..145e1acc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_6.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_7.png b/mods/signs_lib/textures/signs_lib_color_16px_7.png new file mode 100644 index 00000000..de9214b5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_7.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_8.png b/mods/signs_lib/textures/signs_lib_color_16px_8.png new file mode 100644 index 00000000..dceaf1a3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_8.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_9.png b/mods/signs_lib/textures/signs_lib_color_16px_9.png new file mode 100644 index 00000000..a166e780 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_9.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_A.png b/mods/signs_lib/textures/signs_lib_color_16px_A.png new file mode 100644 index 00000000..a3566ecc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_A.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_B.png b/mods/signs_lib/textures/signs_lib_color_16px_B.png new file mode 100644 index 00000000..737d3dd6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_B.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_C.png b/mods/signs_lib/textures/signs_lib_color_16px_C.png new file mode 100644 index 00000000..ead3533a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_C.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_D.png b/mods/signs_lib/textures/signs_lib_color_16px_D.png new file mode 100644 index 00000000..7ef3be16 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_D.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_E.png b/mods/signs_lib/textures/signs_lib_color_16px_E.png new file mode 100644 index 00000000..d333bd91 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_E.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_F.png b/mods/signs_lib/textures/signs_lib_color_16px_F.png new file mode 100644 index 00000000..1c7f9231 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_F.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_16px_n.png b/mods/signs_lib/textures/signs_lib_color_16px_n.png new file mode 100644 index 00000000..f7013f43 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_16px_n.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_0.png b/mods/signs_lib/textures/signs_lib_color_32px_0.png new file mode 100644 index 00000000..3fa2c831 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_0.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_1.png b/mods/signs_lib/textures/signs_lib_color_32px_1.png new file mode 100644 index 00000000..89ba8101 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_1.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_2.png b/mods/signs_lib/textures/signs_lib_color_32px_2.png new file mode 100644 index 00000000..be3ed8fc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_2.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_3.png b/mods/signs_lib/textures/signs_lib_color_32px_3.png new file mode 100644 index 00000000..216f251f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_3.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_4.png b/mods/signs_lib/textures/signs_lib_color_32px_4.png new file mode 100644 index 00000000..84607413 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_4.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_5.png b/mods/signs_lib/textures/signs_lib_color_32px_5.png new file mode 100644 index 00000000..ce78c3c2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_5.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_6.png b/mods/signs_lib/textures/signs_lib_color_32px_6.png new file mode 100644 index 00000000..352dc0fa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_6.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_7.png b/mods/signs_lib/textures/signs_lib_color_32px_7.png new file mode 100644 index 00000000..776afbeb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_7.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_8.png b/mods/signs_lib/textures/signs_lib_color_32px_8.png new file mode 100644 index 00000000..7e054a4a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_8.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_9.png b/mods/signs_lib/textures/signs_lib_color_32px_9.png new file mode 100644 index 00000000..93b42755 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_9.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_A.png b/mods/signs_lib/textures/signs_lib_color_32px_A.png new file mode 100644 index 00000000..024d2c6e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_A.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_B.png b/mods/signs_lib/textures/signs_lib_color_32px_B.png new file mode 100644 index 00000000..b6f71cad Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_B.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_C.png b/mods/signs_lib/textures/signs_lib_color_32px_C.png new file mode 100644 index 00000000..b248b088 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_C.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_D.png b/mods/signs_lib/textures/signs_lib_color_32px_D.png new file mode 100644 index 00000000..db670934 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_D.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_E.png b/mods/signs_lib/textures/signs_lib_color_32px_E.png new file mode 100644 index 00000000..48a2a31f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_E.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_F.png b/mods/signs_lib/textures/signs_lib_color_32px_F.png new file mode 100644 index 00000000..258402b6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_F.png differ diff --git a/mods/signs_lib/textures/signs_lib_color_32px_n.png b/mods/signs_lib/textures/signs_lib_color_32px_n.png new file mode 100644 index 00000000..50a03944 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_color_32px_n.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00.png b/mods/signs_lib/textures/signs_lib_font_16px_00.png new file mode 100644 index 00000000..fadeeade Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00c0.png b/mods/signs_lib/textures/signs_lib_font_16px_00c0.png new file mode 100644 index 00000000..37b51c7e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00c0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00c4.png b/mods/signs_lib/textures/signs_lib_font_16px_00c4.png new file mode 100644 index 00000000..4e11e8e5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00c4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00c6.png b/mods/signs_lib/textures/signs_lib_font_16px_00c6.png new file mode 100644 index 00000000..be546a44 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00c6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00c7.png b/mods/signs_lib/textures/signs_lib_font_16px_00c7.png new file mode 100644 index 00000000..411010ef Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00c7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00c8.png b/mods/signs_lib/textures/signs_lib_font_16px_00c8.png new file mode 100644 index 00000000..d62b02ef Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00c8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00c9.png b/mods/signs_lib/textures/signs_lib_font_16px_00c9.png new file mode 100644 index 00000000..0e59dfa6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00c9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00ca.png b/mods/signs_lib/textures/signs_lib_font_16px_00ca.png new file mode 100644 index 00000000..bd34971a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00ca.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00d3.png b/mods/signs_lib/textures/signs_lib_font_16px_00d3.png new file mode 100644 index 00000000..faef078f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00d3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00d4.png b/mods/signs_lib/textures/signs_lib_font_16px_00d4.png new file mode 100644 index 00000000..bc1fa0fe Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00d4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00d6.png b/mods/signs_lib/textures/signs_lib_font_16px_00d6.png new file mode 100644 index 00000000..a32bd0b0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00d6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00d9.png b/mods/signs_lib/textures/signs_lib_font_16px_00d9.png new file mode 100644 index 00000000..c6ad1e31 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00d9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00dc.png b/mods/signs_lib/textures/signs_lib_font_16px_00dc.png new file mode 100644 index 00000000..ec452f6f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00dc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00df.png b/mods/signs_lib/textures/signs_lib_font_16px_00df.png new file mode 100644 index 00000000..b81790b5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00df.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00e0.png b/mods/signs_lib/textures/signs_lib_font_16px_00e0.png new file mode 100644 index 00000000..7aeb40d1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00e0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00e4.png b/mods/signs_lib/textures/signs_lib_font_16px_00e4.png new file mode 100644 index 00000000..3618df3f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00e4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00e6.png b/mods/signs_lib/textures/signs_lib_font_16px_00e6.png new file mode 100644 index 00000000..e253baaa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00e6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00e7.png b/mods/signs_lib/textures/signs_lib_font_16px_00e7.png new file mode 100644 index 00000000..4311add8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00e7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00e8.png b/mods/signs_lib/textures/signs_lib_font_16px_00e8.png new file mode 100644 index 00000000..8bd6cbba Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00e8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00e9.png b/mods/signs_lib/textures/signs_lib_font_16px_00e9.png new file mode 100644 index 00000000..5626f882 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00e9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00ea.png b/mods/signs_lib/textures/signs_lib_font_16px_00ea.png new file mode 100644 index 00000000..1d1c9842 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00ea.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00f3.png b/mods/signs_lib/textures/signs_lib_font_16px_00f3.png new file mode 100644 index 00000000..e8b9bd60 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00f3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00f4.png b/mods/signs_lib/textures/signs_lib_font_16px_00f4.png new file mode 100644 index 00000000..313eb36b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00f4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00f6.png b/mods/signs_lib/textures/signs_lib_font_16px_00f6.png new file mode 100644 index 00000000..292fd29d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00f6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00f9.png b/mods/signs_lib/textures/signs_lib_font_16px_00f9.png new file mode 100644 index 00000000..e38bce66 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00f9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_00fc.png b/mods/signs_lib/textures/signs_lib_font_16px_00fc.png new file mode 100644 index 00000000..3df89647 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_00fc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0104.png b/mods/signs_lib/textures/signs_lib_font_16px_0104.png new file mode 100644 index 00000000..26218510 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0104.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0105.png b/mods/signs_lib/textures/signs_lib_font_16px_0105.png new file mode 100644 index 00000000..0b5e280f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0105.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0106.png b/mods/signs_lib/textures/signs_lib_font_16px_0106.png new file mode 100644 index 00000000..f5d78cdd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0106.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0107.png b/mods/signs_lib/textures/signs_lib_font_16px_0107.png new file mode 100644 index 00000000..3bccb3d1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0107.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0118.png b/mods/signs_lib/textures/signs_lib_font_16px_0118.png new file mode 100644 index 00000000..3879ced7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0118.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0119.png b/mods/signs_lib/textures/signs_lib_font_16px_0119.png new file mode 100644 index 00000000..eca9b2a8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0119.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0141.png b/mods/signs_lib/textures/signs_lib_font_16px_0141.png new file mode 100644 index 00000000..a19e7661 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0141.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0142.png b/mods/signs_lib/textures/signs_lib_font_16px_0142.png new file mode 100644 index 00000000..ec5f8a7d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0142.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_015a.png b/mods/signs_lib/textures/signs_lib_font_16px_015a.png new file mode 100644 index 00000000..d2282ec8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_015a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_015b.png b/mods/signs_lib/textures/signs_lib_font_16px_015b.png new file mode 100644 index 00000000..26b3f8a1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_015b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0179.png b/mods/signs_lib/textures/signs_lib_font_16px_0179.png new file mode 100644 index 00000000..b4f6d81a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0179.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_017a.png b/mods/signs_lib/textures/signs_lib_font_16px_017a.png new file mode 100644 index 00000000..3349f4d8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_017a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_017b.png b/mods/signs_lib/textures/signs_lib_font_16px_017b.png new file mode 100644 index 00000000..b5cbe42c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_017b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_017c.png b/mods/signs_lib/textures/signs_lib_font_16px_017c.png new file mode 100644 index 00000000..41715769 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_017c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0404.png b/mods/signs_lib/textures/signs_lib_font_16px_0404.png new file mode 100644 index 00000000..80ac21c7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0404.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0406.png b/mods/signs_lib/textures/signs_lib_font_16px_0406.png new file mode 100644 index 00000000..6828ac27 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0406.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0407.png b/mods/signs_lib/textures/signs_lib_font_16px_0407.png new file mode 100644 index 00000000..26746330 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0407.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0454.png b/mods/signs_lib/textures/signs_lib_font_16px_0454.png new file mode 100644 index 00000000..2dbfd19e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0454.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0456.png b/mods/signs_lib/textures/signs_lib_font_16px_0456.png new file mode 100644 index 00000000..285cd499 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0456.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0457.png b/mods/signs_lib/textures/signs_lib_font_16px_0457.png new file mode 100644 index 00000000..62b99aa6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0457.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0490.png b/mods/signs_lib/textures/signs_lib_font_16px_0490.png new file mode 100644 index 00000000..796629f9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0490.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_0491.png b/mods/signs_lib/textures/signs_lib_font_16px_0491.png new file mode 100644 index 00000000..653d14a1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_0491.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_20.png b/mods/signs_lib/textures/signs_lib_font_16px_20.png new file mode 100644 index 00000000..16991ed5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_20.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_21.png b/mods/signs_lib/textures/signs_lib_font_16px_21.png new file mode 100644 index 00000000..bee4fd4a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_21.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_22.png b/mods/signs_lib/textures/signs_lib_font_16px_22.png new file mode 100644 index 00000000..73aa1684 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_22.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_23.png b/mods/signs_lib/textures/signs_lib_font_16px_23.png new file mode 100644 index 00000000..1e7b1678 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_23.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_24.png b/mods/signs_lib/textures/signs_lib_font_16px_24.png new file mode 100644 index 00000000..8a34cbca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_24.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_25.png b/mods/signs_lib/textures/signs_lib_font_16px_25.png new file mode 100644 index 00000000..2c13d337 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_25.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_26.png b/mods/signs_lib/textures/signs_lib_font_16px_26.png new file mode 100644 index 00000000..f85e4cc7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_26.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_27.png b/mods/signs_lib/textures/signs_lib_font_16px_27.png new file mode 100644 index 00000000..bc6c4728 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_27.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_28.png b/mods/signs_lib/textures/signs_lib_font_16px_28.png new file mode 100644 index 00000000..edbedb68 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_28.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_29.png b/mods/signs_lib/textures/signs_lib_font_16px_29.png new file mode 100644 index 00000000..b8735f46 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_29.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_2a.png b/mods/signs_lib/textures/signs_lib_font_16px_2a.png new file mode 100644 index 00000000..8e385022 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_2a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_2b.png b/mods/signs_lib/textures/signs_lib_font_16px_2b.png new file mode 100644 index 00000000..2b7c509a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_2b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_2c.png b/mods/signs_lib/textures/signs_lib_font_16px_2c.png new file mode 100644 index 00000000..8cec24c0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_2c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_2d.png b/mods/signs_lib/textures/signs_lib_font_16px_2d.png new file mode 100644 index 00000000..df82418e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_2d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_2e.png b/mods/signs_lib/textures/signs_lib_font_16px_2e.png new file mode 100644 index 00000000..2a1d6ed6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_2e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_2f.png b/mods/signs_lib/textures/signs_lib_font_16px_2f.png new file mode 100644 index 00000000..94e785fc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_2f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_30.png b/mods/signs_lib/textures/signs_lib_font_16px_30.png new file mode 100644 index 00000000..0b8270fd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_30.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_31.png b/mods/signs_lib/textures/signs_lib_font_16px_31.png new file mode 100644 index 00000000..ebfd8e9c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_31.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_32.png b/mods/signs_lib/textures/signs_lib_font_16px_32.png new file mode 100644 index 00000000..39b24440 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_32.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_33.png b/mods/signs_lib/textures/signs_lib_font_16px_33.png new file mode 100644 index 00000000..0cb73072 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_33.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_34.png b/mods/signs_lib/textures/signs_lib_font_16px_34.png new file mode 100644 index 00000000..8e03023b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_34.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_35.png b/mods/signs_lib/textures/signs_lib_font_16px_35.png new file mode 100644 index 00000000..58039a06 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_35.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_36.png b/mods/signs_lib/textures/signs_lib_font_16px_36.png new file mode 100644 index 00000000..8707d180 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_36.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_37.png b/mods/signs_lib/textures/signs_lib_font_16px_37.png new file mode 100644 index 00000000..0f9b0c13 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_37.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_38.png b/mods/signs_lib/textures/signs_lib_font_16px_38.png new file mode 100644 index 00000000..fc244793 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_38.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_39.png b/mods/signs_lib/textures/signs_lib_font_16px_39.png new file mode 100644 index 00000000..b43c7582 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_39.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_3a.png b/mods/signs_lib/textures/signs_lib_font_16px_3a.png new file mode 100644 index 00000000..17b5eaf5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_3a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_3b.png b/mods/signs_lib/textures/signs_lib_font_16px_3b.png new file mode 100644 index 00000000..c40a7d4d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_3b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_3c.png b/mods/signs_lib/textures/signs_lib_font_16px_3c.png new file mode 100644 index 00000000..eddab4fc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_3c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_3d.png b/mods/signs_lib/textures/signs_lib_font_16px_3d.png new file mode 100644 index 00000000..7f87da42 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_3d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_3e.png b/mods/signs_lib/textures/signs_lib_font_16px_3e.png new file mode 100644 index 00000000..08693414 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_3e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_3f.png b/mods/signs_lib/textures/signs_lib_font_16px_3f.png new file mode 100644 index 00000000..53a32108 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_3f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_40.png b/mods/signs_lib/textures/signs_lib_font_16px_40.png new file mode 100644 index 00000000..875c88c3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_40.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_41.png b/mods/signs_lib/textures/signs_lib_font_16px_41.png new file mode 100644 index 00000000..59ba59f2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_41.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_42.png b/mods/signs_lib/textures/signs_lib_font_16px_42.png new file mode 100644 index 00000000..3df5b8bf Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_42.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_43.png b/mods/signs_lib/textures/signs_lib_font_16px_43.png new file mode 100644 index 00000000..6d7dac76 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_43.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_44.png b/mods/signs_lib/textures/signs_lib_font_16px_44.png new file mode 100644 index 00000000..0c9abe6b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_44.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_45.png b/mods/signs_lib/textures/signs_lib_font_16px_45.png new file mode 100644 index 00000000..ebafeafc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_45.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_46.png b/mods/signs_lib/textures/signs_lib_font_16px_46.png new file mode 100644 index 00000000..b82a67eb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_46.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_47.png b/mods/signs_lib/textures/signs_lib_font_16px_47.png new file mode 100644 index 00000000..b978b136 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_47.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_48.png b/mods/signs_lib/textures/signs_lib_font_16px_48.png new file mode 100644 index 00000000..ae6241f0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_48.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_49.png b/mods/signs_lib/textures/signs_lib_font_16px_49.png new file mode 100644 index 00000000..611a00dd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_49.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_4a.png b/mods/signs_lib/textures/signs_lib_font_16px_4a.png new file mode 100644 index 00000000..0f560874 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_4a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_4b.png b/mods/signs_lib/textures/signs_lib_font_16px_4b.png new file mode 100644 index 00000000..ede77b16 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_4b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_4c.png b/mods/signs_lib/textures/signs_lib_font_16px_4c.png new file mode 100644 index 00000000..49629149 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_4c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_4d.png b/mods/signs_lib/textures/signs_lib_font_16px_4d.png new file mode 100644 index 00000000..354132c3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_4d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_4e.png b/mods/signs_lib/textures/signs_lib_font_16px_4e.png new file mode 100644 index 00000000..881bffb9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_4e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_4f.png b/mods/signs_lib/textures/signs_lib_font_16px_4f.png new file mode 100644 index 00000000..8b7ca84b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_4f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_50.png b/mods/signs_lib/textures/signs_lib_font_16px_50.png new file mode 100644 index 00000000..cd624a0c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_50.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_51.png b/mods/signs_lib/textures/signs_lib_font_16px_51.png new file mode 100644 index 00000000..ba02933b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_51.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_52.png b/mods/signs_lib/textures/signs_lib_font_16px_52.png new file mode 100644 index 00000000..c99e4407 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_52.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_53.png b/mods/signs_lib/textures/signs_lib_font_16px_53.png new file mode 100644 index 00000000..7b005067 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_53.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_54.png b/mods/signs_lib/textures/signs_lib_font_16px_54.png new file mode 100644 index 00000000..0e678e2e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_54.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_55.png b/mods/signs_lib/textures/signs_lib_font_16px_55.png new file mode 100644 index 00000000..d009462b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_55.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_56.png b/mods/signs_lib/textures/signs_lib_font_16px_56.png new file mode 100644 index 00000000..2dff8812 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_56.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_57.png b/mods/signs_lib/textures/signs_lib_font_16px_57.png new file mode 100644 index 00000000..5a51c52c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_57.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_58.png b/mods/signs_lib/textures/signs_lib_font_16px_58.png new file mode 100644 index 00000000..a0c9bcde Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_58.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_59.png b/mods/signs_lib/textures/signs_lib_font_16px_59.png new file mode 100644 index 00000000..06bb98d7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_59.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_5a.png b/mods/signs_lib/textures/signs_lib_font_16px_5a.png new file mode 100644 index 00000000..513a22a3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_5a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_5b.png b/mods/signs_lib/textures/signs_lib_font_16px_5b.png new file mode 100644 index 00000000..ca3742df Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_5b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_5c.png b/mods/signs_lib/textures/signs_lib_font_16px_5c.png new file mode 100644 index 00000000..b8507bc5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_5c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_5d.png b/mods/signs_lib/textures/signs_lib_font_16px_5d.png new file mode 100644 index 00000000..778d7365 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_5d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_5e.png b/mods/signs_lib/textures/signs_lib_font_16px_5e.png new file mode 100644 index 00000000..f7d53e12 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_5e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_5f.png b/mods/signs_lib/textures/signs_lib_font_16px_5f.png new file mode 100644 index 00000000..ca8c6718 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_5f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_60.png b/mods/signs_lib/textures/signs_lib_font_16px_60.png new file mode 100644 index 00000000..12ab7edc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_60.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_61.png b/mods/signs_lib/textures/signs_lib_font_16px_61.png new file mode 100644 index 00000000..f37ec048 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_61.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_62.png b/mods/signs_lib/textures/signs_lib_font_16px_62.png new file mode 100644 index 00000000..9fc1b8cd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_62.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_63.png b/mods/signs_lib/textures/signs_lib_font_16px_63.png new file mode 100644 index 00000000..34ec15c6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_63.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_64.png b/mods/signs_lib/textures/signs_lib_font_16px_64.png new file mode 100644 index 00000000..4d840773 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_64.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_65.png b/mods/signs_lib/textures/signs_lib_font_16px_65.png new file mode 100644 index 00000000..1fe0d277 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_65.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_66.png b/mods/signs_lib/textures/signs_lib_font_16px_66.png new file mode 100644 index 00000000..417f90f6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_66.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_67.png b/mods/signs_lib/textures/signs_lib_font_16px_67.png new file mode 100644 index 00000000..2085767d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_67.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_68.png b/mods/signs_lib/textures/signs_lib_font_16px_68.png new file mode 100644 index 00000000..76e16eb2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_68.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_69.png b/mods/signs_lib/textures/signs_lib_font_16px_69.png new file mode 100644 index 00000000..aacb33aa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_69.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_6a.png b/mods/signs_lib/textures/signs_lib_font_16px_6a.png new file mode 100644 index 00000000..4c8eaaa2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_6a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_6b.png b/mods/signs_lib/textures/signs_lib_font_16px_6b.png new file mode 100644 index 00000000..f0653cc8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_6b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_6c.png b/mods/signs_lib/textures/signs_lib_font_16px_6c.png new file mode 100644 index 00000000..6eedfe30 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_6c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_6d.png b/mods/signs_lib/textures/signs_lib_font_16px_6d.png new file mode 100644 index 00000000..bc389b31 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_6d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_6e.png b/mods/signs_lib/textures/signs_lib_font_16px_6e.png new file mode 100644 index 00000000..77140c94 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_6e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_6f.png b/mods/signs_lib/textures/signs_lib_font_16px_6f.png new file mode 100644 index 00000000..9a8eefca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_6f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_70.png b/mods/signs_lib/textures/signs_lib_font_16px_70.png new file mode 100644 index 00000000..62609315 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_70.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_71.png b/mods/signs_lib/textures/signs_lib_font_16px_71.png new file mode 100644 index 00000000..18bd8c82 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_71.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_72.png b/mods/signs_lib/textures/signs_lib_font_16px_72.png new file mode 100644 index 00000000..0c1da004 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_72.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_73.png b/mods/signs_lib/textures/signs_lib_font_16px_73.png new file mode 100644 index 00000000..0b347382 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_73.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_74.png b/mods/signs_lib/textures/signs_lib_font_16px_74.png new file mode 100644 index 00000000..5b24599b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_74.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_75.png b/mods/signs_lib/textures/signs_lib_font_16px_75.png new file mode 100644 index 00000000..5065df90 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_75.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_76.png b/mods/signs_lib/textures/signs_lib_font_16px_76.png new file mode 100644 index 00000000..9b239ba7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_76.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_77.png b/mods/signs_lib/textures/signs_lib_font_16px_77.png new file mode 100644 index 00000000..9660bbba Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_77.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_78.png b/mods/signs_lib/textures/signs_lib_font_16px_78.png new file mode 100644 index 00000000..b64bd3c6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_78.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_79.png b/mods/signs_lib/textures/signs_lib_font_16px_79.png new file mode 100644 index 00000000..2989235f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_79.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_7a.png b/mods/signs_lib/textures/signs_lib_font_16px_7a.png new file mode 100644 index 00000000..73a5aaab Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_7a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_7b.png b/mods/signs_lib/textures/signs_lib_font_16px_7b.png new file mode 100644 index 00000000..a25b4cce Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_7b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_7c.png b/mods/signs_lib/textures/signs_lib_font_16px_7c.png new file mode 100644 index 00000000..44cd3196 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_7c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_7d.png b/mods/signs_lib/textures/signs_lib_font_16px_7d.png new file mode 100644 index 00000000..8f497375 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_7d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_7e.png b/mods/signs_lib/textures/signs_lib_font_16px_7e.png new file mode 100644 index 00000000..b6772332 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_7e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_81.png b/mods/signs_lib/textures/signs_lib_font_16px_81.png new file mode 100644 index 00000000..19261856 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_81.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_82.png b/mods/signs_lib/textures/signs_lib_font_16px_82.png new file mode 100644 index 00000000..96e2118e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_82.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_83.png b/mods/signs_lib/textures/signs_lib_font_16px_83.png new file mode 100644 index 00000000..b0c03e70 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_83.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_84.png b/mods/signs_lib/textures/signs_lib_font_16px_84.png new file mode 100644 index 00000000..f4f33dc2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_84.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_85.png b/mods/signs_lib/textures/signs_lib_font_16px_85.png new file mode 100644 index 00000000..2a678e0b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_85.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_86.png b/mods/signs_lib/textures/signs_lib_font_16px_86.png new file mode 100644 index 00000000..63ad90d4 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_86.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_87.png b/mods/signs_lib/textures/signs_lib_font_16px_87.png new file mode 100644 index 00000000..1bf6b452 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_87.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_88.png b/mods/signs_lib/textures/signs_lib_font_16px_88.png new file mode 100644 index 00000000..1ed88c1d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_88.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_8a.png b/mods/signs_lib/textures/signs_lib_font_16px_8a.png new file mode 100644 index 00000000..f9af7518 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_8a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_8b.png b/mods/signs_lib/textures/signs_lib_font_16px_8b.png new file mode 100644 index 00000000..254e295d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_8b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_8c.png b/mods/signs_lib/textures/signs_lib_font_16px_8c.png new file mode 100644 index 00000000..cfc3e4e8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_8c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_8d.png b/mods/signs_lib/textures/signs_lib_font_16px_8d.png new file mode 100644 index 00000000..419055d0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_8d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_8e.png b/mods/signs_lib/textures/signs_lib_font_16px_8e.png new file mode 100644 index 00000000..cadaae60 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_8e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_8f.png b/mods/signs_lib/textures/signs_lib_font_16px_8f.png new file mode 100644 index 00000000..2db38b8d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_8f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_90.png b/mods/signs_lib/textures/signs_lib_font_16px_90.png new file mode 100644 index 00000000..d23d9559 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_90.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_91.png b/mods/signs_lib/textures/signs_lib_font_16px_91.png new file mode 100644 index 00000000..090dfc84 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_91.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_a8.png b/mods/signs_lib/textures/signs_lib_font_16px_a8.png new file mode 100644 index 00000000..3d674a32 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_a8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_b8.png b/mods/signs_lib/textures/signs_lib_font_16px_b8.png new file mode 100644 index 00000000..67f422f8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_b8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_b9.png b/mods/signs_lib/textures/signs_lib_font_16px_b9.png new file mode 100644 index 00000000..c6eaa597 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_b9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c0.png b/mods/signs_lib/textures/signs_lib_font_16px_c0.png new file mode 100644 index 00000000..44930c20 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c1.png b/mods/signs_lib/textures/signs_lib_font_16px_c1.png new file mode 100644 index 00000000..8beede29 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c1.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c2.png b/mods/signs_lib/textures/signs_lib_font_16px_c2.png new file mode 100644 index 00000000..a4a14ba3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c2.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c3.png b/mods/signs_lib/textures/signs_lib_font_16px_c3.png new file mode 100644 index 00000000..11442814 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c4.png b/mods/signs_lib/textures/signs_lib_font_16px_c4.png new file mode 100644 index 00000000..db1abec2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c5.png b/mods/signs_lib/textures/signs_lib_font_16px_c5.png new file mode 100644 index 00000000..8ef3141c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c5.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c6.png b/mods/signs_lib/textures/signs_lib_font_16px_c6.png new file mode 100644 index 00000000..e3dc8a56 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c7.png b/mods/signs_lib/textures/signs_lib_font_16px_c7.png new file mode 100644 index 00000000..e9f8cac2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c8.png b/mods/signs_lib/textures/signs_lib_font_16px_c8.png new file mode 100644 index 00000000..13c445b6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_c9.png b/mods/signs_lib/textures/signs_lib_font_16px_c9.png new file mode 100644 index 00000000..c9d3dc6d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_c9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ca.png b/mods/signs_lib/textures/signs_lib_font_16px_ca.png new file mode 100644 index 00000000..75cc0efb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ca.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_cb.png b/mods/signs_lib/textures/signs_lib_font_16px_cb.png new file mode 100644 index 00000000..97364b08 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_cb.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_cc.png b/mods/signs_lib/textures/signs_lib_font_16px_cc.png new file mode 100644 index 00000000..efd70650 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_cc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_cd.png b/mods/signs_lib/textures/signs_lib_font_16px_cd.png new file mode 100644 index 00000000..8234bab5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_cd.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ce.png b/mods/signs_lib/textures/signs_lib_font_16px_ce.png new file mode 100644 index 00000000..b2022a53 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ce.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_cf.png b/mods/signs_lib/textures/signs_lib_font_16px_cf.png new file mode 100644 index 00000000..00b86c9f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_cf.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d0.png b/mods/signs_lib/textures/signs_lib_font_16px_d0.png new file mode 100644 index 00000000..d6851713 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d1.png b/mods/signs_lib/textures/signs_lib_font_16px_d1.png new file mode 100644 index 00000000..8f43d110 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d1.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d2.png b/mods/signs_lib/textures/signs_lib_font_16px_d2.png new file mode 100644 index 00000000..e317c62b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d2.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d3.png b/mods/signs_lib/textures/signs_lib_font_16px_d3.png new file mode 100644 index 00000000..b84bbcb7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d4.png b/mods/signs_lib/textures/signs_lib_font_16px_d4.png new file mode 100644 index 00000000..02a467bb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d5.png b/mods/signs_lib/textures/signs_lib_font_16px_d5.png new file mode 100644 index 00000000..cc0d7496 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d5.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d6.png b/mods/signs_lib/textures/signs_lib_font_16px_d6.png new file mode 100644 index 00000000..a7f5e6c5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d7.png b/mods/signs_lib/textures/signs_lib_font_16px_d7.png new file mode 100644 index 00000000..a857dd85 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d8.png b/mods/signs_lib/textures/signs_lib_font_16px_d8.png new file mode 100644 index 00000000..35f38c89 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_d9.png b/mods/signs_lib/textures/signs_lib_font_16px_d9.png new file mode 100644 index 00000000..3c1e817d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_d9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_da.png b/mods/signs_lib/textures/signs_lib_font_16px_da.png new file mode 100644 index 00000000..29166520 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_da.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_db.png b/mods/signs_lib/textures/signs_lib_font_16px_db.png new file mode 100644 index 00000000..ccf26ce1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_db.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_dc.png b/mods/signs_lib/textures/signs_lib_font_16px_dc.png new file mode 100644 index 00000000..2e5099fb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_dc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_dd.png b/mods/signs_lib/textures/signs_lib_font_16px_dd.png new file mode 100644 index 00000000..8d5c3e93 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_dd.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_de.png b/mods/signs_lib/textures/signs_lib_font_16px_de.png new file mode 100644 index 00000000..e6eb1402 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_de.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_df.png b/mods/signs_lib/textures/signs_lib_font_16px_df.png new file mode 100644 index 00000000..fa5f3b91 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_df.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e0.png b/mods/signs_lib/textures/signs_lib_font_16px_e0.png new file mode 100644 index 00000000..2e7920bf Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e1.png b/mods/signs_lib/textures/signs_lib_font_16px_e1.png new file mode 100644 index 00000000..decd142a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e1.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e2.png b/mods/signs_lib/textures/signs_lib_font_16px_e2.png new file mode 100644 index 00000000..8c8541d0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e2.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e3.png b/mods/signs_lib/textures/signs_lib_font_16px_e3.png new file mode 100644 index 00000000..6445f8e0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e4.png b/mods/signs_lib/textures/signs_lib_font_16px_e4.png new file mode 100644 index 00000000..ebe695ee Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e5.png b/mods/signs_lib/textures/signs_lib_font_16px_e5.png new file mode 100644 index 00000000..b6f58ac8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e5.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e6.png b/mods/signs_lib/textures/signs_lib_font_16px_e6.png new file mode 100644 index 00000000..ef9001ff Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e7.png b/mods/signs_lib/textures/signs_lib_font_16px_e7.png new file mode 100644 index 00000000..83732a7e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e8.png b/mods/signs_lib/textures/signs_lib_font_16px_e8.png new file mode 100644 index 00000000..b11e6b2c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_e9.png b/mods/signs_lib/textures/signs_lib_font_16px_e9.png new file mode 100644 index 00000000..f2c4a492 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_e9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ea.png b/mods/signs_lib/textures/signs_lib_font_16px_ea.png new file mode 100644 index 00000000..616de9fd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ea.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_eb.png b/mods/signs_lib/textures/signs_lib_font_16px_eb.png new file mode 100644 index 00000000..1b25947b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_eb.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ec.png b/mods/signs_lib/textures/signs_lib_font_16px_ec.png new file mode 100644 index 00000000..ca71c256 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ec.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ed.png b/mods/signs_lib/textures/signs_lib_font_16px_ed.png new file mode 100644 index 00000000..3eb50ca9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ed.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ee.png b/mods/signs_lib/textures/signs_lib_font_16px_ee.png new file mode 100644 index 00000000..a5cdd886 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ee.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ef.png b/mods/signs_lib/textures/signs_lib_font_16px_ef.png new file mode 100644 index 00000000..ca20e4da Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ef.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f0.png b/mods/signs_lib/textures/signs_lib_font_16px_f0.png new file mode 100644 index 00000000..e027b05f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f1.png b/mods/signs_lib/textures/signs_lib_font_16px_f1.png new file mode 100644 index 00000000..d0e1318d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f1.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f2.png b/mods/signs_lib/textures/signs_lib_font_16px_f2.png new file mode 100644 index 00000000..954f03b0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f2.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f3.png b/mods/signs_lib/textures/signs_lib_font_16px_f3.png new file mode 100644 index 00000000..0abdb227 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f4.png b/mods/signs_lib/textures/signs_lib_font_16px_f4.png new file mode 100644 index 00000000..745439bc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f5.png b/mods/signs_lib/textures/signs_lib_font_16px_f5.png new file mode 100644 index 00000000..a3d6d7c1 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f5.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f6.png b/mods/signs_lib/textures/signs_lib_font_16px_f6.png new file mode 100644 index 00000000..0b713925 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f7.png b/mods/signs_lib/textures/signs_lib_font_16px_f7.png new file mode 100644 index 00000000..ffa2f537 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f8.png b/mods/signs_lib/textures/signs_lib_font_16px_f8.png new file mode 100644 index 00000000..34cfb1a5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_f9.png b/mods/signs_lib/textures/signs_lib_font_16px_f9.png new file mode 100644 index 00000000..1a66cafc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_f9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_fa.png b/mods/signs_lib/textures/signs_lib_font_16px_fa.png new file mode 100644 index 00000000..1729fb30 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_fa.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_fb.png b/mods/signs_lib/textures/signs_lib_font_16px_fb.png new file mode 100644 index 00000000..b9be0702 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_fb.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_fc.png b/mods/signs_lib/textures/signs_lib_font_16px_fc.png new file mode 100644 index 00000000..d084ccdc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_fc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_fd.png b/mods/signs_lib/textures/signs_lib_font_16px_fd.png new file mode 100644 index 00000000..dd0a1888 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_fd.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_fe.png b/mods/signs_lib/textures/signs_lib_font_16px_fe.png new file mode 100644 index 00000000..de189c7d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_fe.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_16px_ff.png b/mods/signs_lib/textures/signs_lib_font_16px_ff.png new file mode 100644 index 00000000..c3fa03a6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_16px_ff.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00c0.png b/mods/signs_lib/textures/signs_lib_font_32px_00c0.png new file mode 100644 index 00000000..59ae2d21 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00c0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00c4.png b/mods/signs_lib/textures/signs_lib_font_32px_00c4.png new file mode 100644 index 00000000..1f317208 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00c4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00c6.png b/mods/signs_lib/textures/signs_lib_font_32px_00c6.png new file mode 100644 index 00000000..811c6f0a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00c6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00c7.png b/mods/signs_lib/textures/signs_lib_font_32px_00c7.png new file mode 100644 index 00000000..4d82db8b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00c7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00c8.png b/mods/signs_lib/textures/signs_lib_font_32px_00c8.png new file mode 100644 index 00000000..4fe869c4 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00c8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00c9.png b/mods/signs_lib/textures/signs_lib_font_32px_00c9.png new file mode 100644 index 00000000..9d5c408d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00c9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00ca.png b/mods/signs_lib/textures/signs_lib_font_32px_00ca.png new file mode 100644 index 00000000..cf6b31f4 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00ca.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00d3.png b/mods/signs_lib/textures/signs_lib_font_32px_00d3.png new file mode 100644 index 00000000..2c0510f3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00d3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00d4.png b/mods/signs_lib/textures/signs_lib_font_32px_00d4.png new file mode 100644 index 00000000..5908b0b4 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00d4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00d6.png b/mods/signs_lib/textures/signs_lib_font_32px_00d6.png new file mode 100644 index 00000000..9e7b7e7d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00d6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00d9.png b/mods/signs_lib/textures/signs_lib_font_32px_00d9.png new file mode 100644 index 00000000..6cdea525 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00d9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00dc.png b/mods/signs_lib/textures/signs_lib_font_32px_00dc.png new file mode 100644 index 00000000..307d2e24 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00dc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00df.png b/mods/signs_lib/textures/signs_lib_font_32px_00df.png new file mode 100644 index 00000000..13c4ee12 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00df.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00e0.png b/mods/signs_lib/textures/signs_lib_font_32px_00e0.png new file mode 100644 index 00000000..b7e78d6e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00e0.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00e4.png b/mods/signs_lib/textures/signs_lib_font_32px_00e4.png new file mode 100644 index 00000000..a41382ea Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00e4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00e6.png b/mods/signs_lib/textures/signs_lib_font_32px_00e6.png new file mode 100644 index 00000000..70e7c5ba Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00e6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00e7.png b/mods/signs_lib/textures/signs_lib_font_32px_00e7.png new file mode 100644 index 00000000..a3a661ce Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00e7.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00e8.png b/mods/signs_lib/textures/signs_lib_font_32px_00e8.png new file mode 100644 index 00000000..e0bfce92 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00e8.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00e9.png b/mods/signs_lib/textures/signs_lib_font_32px_00e9.png new file mode 100644 index 00000000..b046f8ea Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00e9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00ea.png b/mods/signs_lib/textures/signs_lib_font_32px_00ea.png new file mode 100644 index 00000000..36fd46fb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00ea.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00f3.png b/mods/signs_lib/textures/signs_lib_font_32px_00f3.png new file mode 100644 index 00000000..313cd862 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00f3.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00f4.png b/mods/signs_lib/textures/signs_lib_font_32px_00f4.png new file mode 100644 index 00000000..751d288b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00f4.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00f6.png b/mods/signs_lib/textures/signs_lib_font_32px_00f6.png new file mode 100644 index 00000000..1fb8ed8d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00f6.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00f9.png b/mods/signs_lib/textures/signs_lib_font_32px_00f9.png new file mode 100644 index 00000000..f61cb3eb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00f9.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_00fc.png b/mods/signs_lib/textures/signs_lib_font_32px_00fc.png new file mode 100644 index 00000000..c367c45e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_00fc.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0104.png b/mods/signs_lib/textures/signs_lib_font_32px_0104.png new file mode 100644 index 00000000..51a3f9cd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0104.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0105.png b/mods/signs_lib/textures/signs_lib_font_32px_0105.png new file mode 100644 index 00000000..4d370413 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0105.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0106.png b/mods/signs_lib/textures/signs_lib_font_32px_0106.png new file mode 100644 index 00000000..72325e35 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0106.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0107.png b/mods/signs_lib/textures/signs_lib_font_32px_0107.png new file mode 100644 index 00000000..a6f1cacc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0107.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0118.png b/mods/signs_lib/textures/signs_lib_font_32px_0118.png new file mode 100644 index 00000000..5d22ad4f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0118.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0119.png b/mods/signs_lib/textures/signs_lib_font_32px_0119.png new file mode 100644 index 00000000..82f61b50 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0119.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0141.png b/mods/signs_lib/textures/signs_lib_font_32px_0141.png new file mode 100644 index 00000000..8ed676bb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0141.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0142.png b/mods/signs_lib/textures/signs_lib_font_32px_0142.png new file mode 100644 index 00000000..d7c6db86 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0142.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_015a.png b/mods/signs_lib/textures/signs_lib_font_32px_015a.png new file mode 100644 index 00000000..871f252b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_015a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_015b.png b/mods/signs_lib/textures/signs_lib_font_32px_015b.png new file mode 100644 index 00000000..144ebd96 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_015b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0179.png b/mods/signs_lib/textures/signs_lib_font_32px_0179.png new file mode 100644 index 00000000..b39a5a26 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0179.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_017a.png b/mods/signs_lib/textures/signs_lib_font_32px_017a.png new file mode 100644 index 00000000..b5b168f6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_017a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_017b.png b/mods/signs_lib/textures/signs_lib_font_32px_017b.png new file mode 100644 index 00000000..6b64ce3c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_017b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_017c.png b/mods/signs_lib/textures/signs_lib_font_32px_017c.png new file mode 100644 index 00000000..79289f32 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_017c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0404.png b/mods/signs_lib/textures/signs_lib_font_32px_0404.png new file mode 100644 index 00000000..3f11bc67 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0404.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0406.png b/mods/signs_lib/textures/signs_lib_font_32px_0406.png new file mode 100644 index 00000000..f47b5229 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0406.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0407.png b/mods/signs_lib/textures/signs_lib_font_32px_0407.png new file mode 100644 index 00000000..1fc4bc4e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0407.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0454.png b/mods/signs_lib/textures/signs_lib_font_32px_0454.png new file mode 100644 index 00000000..a0693cd3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0454.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0456.png b/mods/signs_lib/textures/signs_lib_font_32px_0456.png new file mode 100644 index 00000000..31a601dd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0456.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0457.png b/mods/signs_lib/textures/signs_lib_font_32px_0457.png new file mode 100644 index 00000000..a4195b01 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0457.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0490.png b/mods/signs_lib/textures/signs_lib_font_32px_0490.png new file mode 100644 index 00000000..930fd462 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0490.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_0491.png b/mods/signs_lib/textures/signs_lib_font_32px_0491.png new file mode 100644 index 00000000..f697b553 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_0491.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_20.png b/mods/signs_lib/textures/signs_lib_font_32px_20.png new file mode 100644 index 00000000..16ff6650 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_20.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_21.png b/mods/signs_lib/textures/signs_lib_font_32px_21.png new file mode 100644 index 00000000..a25504cf Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_21.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_22.png b/mods/signs_lib/textures/signs_lib_font_32px_22.png new file mode 100644 index 00000000..949941ac Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_22.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_23.png b/mods/signs_lib/textures/signs_lib_font_32px_23.png new file mode 100644 index 00000000..5431928f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_23.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_24.png b/mods/signs_lib/textures/signs_lib_font_32px_24.png new file mode 100644 index 00000000..62df1116 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_24.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_25.png b/mods/signs_lib/textures/signs_lib_font_32px_25.png new file mode 100644 index 00000000..05cea814 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_25.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_26.png b/mods/signs_lib/textures/signs_lib_font_32px_26.png new file mode 100644 index 00000000..8d477415 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_26.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_27.png b/mods/signs_lib/textures/signs_lib_font_32px_27.png new file mode 100644 index 00000000..effad7c8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_27.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_28.png b/mods/signs_lib/textures/signs_lib_font_32px_28.png new file mode 100644 index 00000000..f0c1c3f2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_28.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_29.png b/mods/signs_lib/textures/signs_lib_font_32px_29.png new file mode 100644 index 00000000..a60fb28c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_29.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_2a.png b/mods/signs_lib/textures/signs_lib_font_32px_2a.png new file mode 100644 index 00000000..00a12967 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_2a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_2b.png b/mods/signs_lib/textures/signs_lib_font_32px_2b.png new file mode 100644 index 00000000..15651208 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_2b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_2c.png b/mods/signs_lib/textures/signs_lib_font_32px_2c.png new file mode 100644 index 00000000..d9a8b186 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_2c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_2d.png b/mods/signs_lib/textures/signs_lib_font_32px_2d.png new file mode 100644 index 00000000..1fd42a58 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_2d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_2e.png b/mods/signs_lib/textures/signs_lib_font_32px_2e.png new file mode 100644 index 00000000..29b62080 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_2e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_2f.png b/mods/signs_lib/textures/signs_lib_font_32px_2f.png new file mode 100644 index 00000000..977d3b73 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_2f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_30.png b/mods/signs_lib/textures/signs_lib_font_32px_30.png new file mode 100644 index 00000000..f8a6ca48 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_30.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_31.png b/mods/signs_lib/textures/signs_lib_font_32px_31.png new file mode 100644 index 00000000..49e0ffa6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_31.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_32.png b/mods/signs_lib/textures/signs_lib_font_32px_32.png new file mode 100644 index 00000000..ee1eb9a8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_32.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_33.png b/mods/signs_lib/textures/signs_lib_font_32px_33.png new file mode 100644 index 00000000..7b306f17 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_33.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_34.png b/mods/signs_lib/textures/signs_lib_font_32px_34.png new file mode 100644 index 00000000..d01a9edb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_34.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_35.png b/mods/signs_lib/textures/signs_lib_font_32px_35.png new file mode 100644 index 00000000..f291c35e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_35.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_36.png b/mods/signs_lib/textures/signs_lib_font_32px_36.png new file mode 100644 index 00000000..c4c3b08f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_36.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_37.png b/mods/signs_lib/textures/signs_lib_font_32px_37.png new file mode 100644 index 00000000..3c966f95 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_37.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_38.png b/mods/signs_lib/textures/signs_lib_font_32px_38.png new file mode 100644 index 00000000..6af893e0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_38.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_39.png b/mods/signs_lib/textures/signs_lib_font_32px_39.png new file mode 100644 index 00000000..505d4efe Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_39.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_3a.png b/mods/signs_lib/textures/signs_lib_font_32px_3a.png new file mode 100644 index 00000000..a3be83bb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_3a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_3b.png b/mods/signs_lib/textures/signs_lib_font_32px_3b.png new file mode 100644 index 00000000..85c0effe Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_3b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_3c.png b/mods/signs_lib/textures/signs_lib_font_32px_3c.png new file mode 100644 index 00000000..11276a9d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_3c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_3d.png b/mods/signs_lib/textures/signs_lib_font_32px_3d.png new file mode 100644 index 00000000..67975c46 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_3d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_3e.png b/mods/signs_lib/textures/signs_lib_font_32px_3e.png new file mode 100644 index 00000000..e60033aa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_3e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_3f.png b/mods/signs_lib/textures/signs_lib_font_32px_3f.png new file mode 100644 index 00000000..4e7c5d39 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_3f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_40.png b/mods/signs_lib/textures/signs_lib_font_32px_40.png new file mode 100644 index 00000000..d8a25a75 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_40.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_41.png b/mods/signs_lib/textures/signs_lib_font_32px_41.png new file mode 100644 index 00000000..92afd76c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_41.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_42.png b/mods/signs_lib/textures/signs_lib_font_32px_42.png new file mode 100644 index 00000000..82f6e2fe Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_42.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_43.png b/mods/signs_lib/textures/signs_lib_font_32px_43.png new file mode 100644 index 00000000..fb97e417 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_43.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_44.png b/mods/signs_lib/textures/signs_lib_font_32px_44.png new file mode 100644 index 00000000..d41641fb Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_44.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_45.png b/mods/signs_lib/textures/signs_lib_font_32px_45.png new file mode 100644 index 00000000..18276bb6 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_45.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_46.png b/mods/signs_lib/textures/signs_lib_font_32px_46.png new file mode 100644 index 00000000..418a2cd2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_46.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_47.png b/mods/signs_lib/textures/signs_lib_font_32px_47.png new file mode 100644 index 00000000..0835ca01 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_47.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_48.png b/mods/signs_lib/textures/signs_lib_font_32px_48.png new file mode 100644 index 00000000..6d5ad44c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_48.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_49.png b/mods/signs_lib/textures/signs_lib_font_32px_49.png new file mode 100644 index 00000000..45de8ab9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_49.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_4a.png b/mods/signs_lib/textures/signs_lib_font_32px_4a.png new file mode 100644 index 00000000..5be30e8e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_4a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_4b.png b/mods/signs_lib/textures/signs_lib_font_32px_4b.png new file mode 100644 index 00000000..ab0efc7f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_4b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_4c.png b/mods/signs_lib/textures/signs_lib_font_32px_4c.png new file mode 100644 index 00000000..47560c85 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_4c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_4d.png b/mods/signs_lib/textures/signs_lib_font_32px_4d.png new file mode 100644 index 00000000..8e151b39 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_4d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_4e.png b/mods/signs_lib/textures/signs_lib_font_32px_4e.png new file mode 100644 index 00000000..ebafa68c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_4e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_4f.png b/mods/signs_lib/textures/signs_lib_font_32px_4f.png new file mode 100644 index 00000000..2077f248 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_4f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_50.png b/mods/signs_lib/textures/signs_lib_font_32px_50.png new file mode 100644 index 00000000..750bac46 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_50.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_51.png b/mods/signs_lib/textures/signs_lib_font_32px_51.png new file mode 100644 index 00000000..b62295ab Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_51.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_52.png b/mods/signs_lib/textures/signs_lib_font_32px_52.png new file mode 100644 index 00000000..cb6a9ed0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_52.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_53.png b/mods/signs_lib/textures/signs_lib_font_32px_53.png new file mode 100644 index 00000000..3916bbc0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_53.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_54.png b/mods/signs_lib/textures/signs_lib_font_32px_54.png new file mode 100644 index 00000000..d1c99f9e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_54.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_55.png b/mods/signs_lib/textures/signs_lib_font_32px_55.png new file mode 100644 index 00000000..e7d21030 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_55.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_56.png b/mods/signs_lib/textures/signs_lib_font_32px_56.png new file mode 100644 index 00000000..201e59cd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_56.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_57.png b/mods/signs_lib/textures/signs_lib_font_32px_57.png new file mode 100644 index 00000000..fa0910d5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_57.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_58.png b/mods/signs_lib/textures/signs_lib_font_32px_58.png new file mode 100644 index 00000000..596f5d60 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_58.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_59.png b/mods/signs_lib/textures/signs_lib_font_32px_59.png new file mode 100644 index 00000000..772b5c41 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_59.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_5a.png b/mods/signs_lib/textures/signs_lib_font_32px_5a.png new file mode 100644 index 00000000..82168f5d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_5a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_5b.png b/mods/signs_lib/textures/signs_lib_font_32px_5b.png new file mode 100644 index 00000000..c9565378 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_5b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_5c.png b/mods/signs_lib/textures/signs_lib_font_32px_5c.png new file mode 100644 index 00000000..bd1839af Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_5c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_5d.png b/mods/signs_lib/textures/signs_lib_font_32px_5d.png new file mode 100644 index 00000000..d913d75a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_5d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_5e.png b/mods/signs_lib/textures/signs_lib_font_32px_5e.png new file mode 100644 index 00000000..692b2970 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_5e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_5f.png b/mods/signs_lib/textures/signs_lib_font_32px_5f.png new file mode 100644 index 00000000..7fa3a937 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_5f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_60.png b/mods/signs_lib/textures/signs_lib_font_32px_60.png new file mode 100644 index 00000000..0e1c3bfa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_60.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_61.png b/mods/signs_lib/textures/signs_lib_font_32px_61.png new file mode 100644 index 00000000..61e3ee94 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_61.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_62.png b/mods/signs_lib/textures/signs_lib_font_32px_62.png new file mode 100644 index 00000000..22926faf Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_62.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_63.png b/mods/signs_lib/textures/signs_lib_font_32px_63.png new file mode 100644 index 00000000..44668aa0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_63.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_64.png b/mods/signs_lib/textures/signs_lib_font_32px_64.png new file mode 100644 index 00000000..0b5b0256 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_64.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_65.png b/mods/signs_lib/textures/signs_lib_font_32px_65.png new file mode 100644 index 00000000..283e724c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_65.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_66.png b/mods/signs_lib/textures/signs_lib_font_32px_66.png new file mode 100644 index 00000000..2506a07b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_66.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_67.png b/mods/signs_lib/textures/signs_lib_font_32px_67.png new file mode 100644 index 00000000..9cbd2d8c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_67.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_68.png b/mods/signs_lib/textures/signs_lib_font_32px_68.png new file mode 100644 index 00000000..bf365823 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_68.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_69.png b/mods/signs_lib/textures/signs_lib_font_32px_69.png new file mode 100644 index 00000000..459752bd Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_69.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_6a.png b/mods/signs_lib/textures/signs_lib_font_32px_6a.png new file mode 100644 index 00000000..dc57b287 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_6a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_6b.png b/mods/signs_lib/textures/signs_lib_font_32px_6b.png new file mode 100644 index 00000000..fe496ede Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_6b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_6c.png b/mods/signs_lib/textures/signs_lib_font_32px_6c.png new file mode 100644 index 00000000..9f008ee8 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_6c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_6d.png b/mods/signs_lib/textures/signs_lib_font_32px_6d.png new file mode 100644 index 00000000..1423d8e5 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_6d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_6e.png b/mods/signs_lib/textures/signs_lib_font_32px_6e.png new file mode 100644 index 00000000..1b7e087e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_6e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_6f.png b/mods/signs_lib/textures/signs_lib_font_32px_6f.png new file mode 100644 index 00000000..5f304d9c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_6f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_70.png b/mods/signs_lib/textures/signs_lib_font_32px_70.png new file mode 100644 index 00000000..55d93a8c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_70.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_71.png b/mods/signs_lib/textures/signs_lib_font_32px_71.png new file mode 100644 index 00000000..35dc8aae Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_71.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_72.png b/mods/signs_lib/textures/signs_lib_font_32px_72.png new file mode 100644 index 00000000..25634a95 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_72.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_73.png b/mods/signs_lib/textures/signs_lib_font_32px_73.png new file mode 100644 index 00000000..97b61bfa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_73.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_74.png b/mods/signs_lib/textures/signs_lib_font_32px_74.png new file mode 100644 index 00000000..8d7946ec Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_74.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_75.png b/mods/signs_lib/textures/signs_lib_font_32px_75.png new file mode 100644 index 00000000..7ba022ca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_75.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_76.png b/mods/signs_lib/textures/signs_lib_font_32px_76.png new file mode 100644 index 00000000..93f7f9e3 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_76.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_77.png b/mods/signs_lib/textures/signs_lib_font_32px_77.png new file mode 100644 index 00000000..330db2a4 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_77.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_78.png b/mods/signs_lib/textures/signs_lib_font_32px_78.png new file mode 100644 index 00000000..eb089a63 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_78.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_79.png b/mods/signs_lib/textures/signs_lib_font_32px_79.png new file mode 100644 index 00000000..eed9db75 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_79.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_7a.png b/mods/signs_lib/textures/signs_lib_font_32px_7a.png new file mode 100644 index 00000000..412f4eca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_7a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_7b.png b/mods/signs_lib/textures/signs_lib_font_32px_7b.png new file mode 100644 index 00000000..669469fa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_7b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_7c.png b/mods/signs_lib/textures/signs_lib_font_32px_7c.png new file mode 100644 index 00000000..9f04691d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_7c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_7d.png b/mods/signs_lib/textures/signs_lib_font_32px_7d.png new file mode 100644 index 00000000..010383ca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_7d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_7e.png b/mods/signs_lib/textures/signs_lib_font_32px_7e.png new file mode 100644 index 00000000..6e5683fa Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_7e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_81.png b/mods/signs_lib/textures/signs_lib_font_32px_81.png new file mode 100644 index 00000000..ab1b435a Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_81.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_82.png b/mods/signs_lib/textures/signs_lib_font_32px_82.png new file mode 100644 index 00000000..96bc59d9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_82.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_83.png b/mods/signs_lib/textures/signs_lib_font_32px_83.png new file mode 100644 index 00000000..3f7e1441 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_83.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_84.png b/mods/signs_lib/textures/signs_lib_font_32px_84.png new file mode 100644 index 00000000..cdf3698e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_84.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_85.png b/mods/signs_lib/textures/signs_lib_font_32px_85.png new file mode 100644 index 00000000..5a8f46ca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_85.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_86.png b/mods/signs_lib/textures/signs_lib_font_32px_86.png new file mode 100644 index 00000000..58db9183 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_86.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_87.png b/mods/signs_lib/textures/signs_lib_font_32px_87.png new file mode 100644 index 00000000..9b12772c Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_87.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_88.png b/mods/signs_lib/textures/signs_lib_font_32px_88.png new file mode 100644 index 00000000..dbd0a6ca Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_88.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_8a.png b/mods/signs_lib/textures/signs_lib_font_32px_8a.png new file mode 100644 index 00000000..c255c15d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_8a.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_8b.png b/mods/signs_lib/textures/signs_lib_font_32px_8b.png new file mode 100644 index 00000000..a0071988 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_8b.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_8c.png b/mods/signs_lib/textures/signs_lib_font_32px_8c.png new file mode 100644 index 00000000..16da7d1d Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_8c.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_8d.png b/mods/signs_lib/textures/signs_lib_font_32px_8d.png new file mode 100644 index 00000000..de4a5d29 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_8d.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_8e.png b/mods/signs_lib/textures/signs_lib_font_32px_8e.png new file mode 100644 index 00000000..e0a6724e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_8e.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_8f.png b/mods/signs_lib/textures/signs_lib_font_32px_8f.png new file mode 100644 index 00000000..537454fc Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_8f.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_90.png b/mods/signs_lib/textures/signs_lib_font_32px_90.png new file mode 100644 index 00000000..a387589e Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_90.png differ diff --git a/mods/signs_lib/textures/signs_lib_font_32px_91.png b/mods/signs_lib/textures/signs_lib_font_32px_91.png new file mode 100644 index 00000000..2c648044 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_font_32px_91.png differ diff --git a/mods/signs_lib/textures/signs_lib_hangers.png b/mods/signs_lib/textures/signs_lib_hangers.png new file mode 100644 index 00000000..446ba46b Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_hangers.png differ diff --git a/mods/signs_lib/textures/signs_lib_pole_mount.png b/mods/signs_lib/textures/signs_lib_pole_mount.png new file mode 100644 index 00000000..4bf0edb2 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_pole_mount.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_bg.png b/mods/signs_lib/textures/signs_lib_sign_bg.png new file mode 100644 index 00000000..96729e15 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_bg.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_color_palette.png b/mods/signs_lib/textures/signs_lib_sign_color_palette.png new file mode 100644 index 00000000..9c34e6c0 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_color_palette.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_wall_steel.png b/mods/signs_lib/textures/signs_lib_sign_wall_steel.png new file mode 100644 index 00000000..c2731ccf Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_wall_steel.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_wall_steel_edges.png b/mods/signs_lib/textures/signs_lib_sign_wall_steel_edges.png new file mode 100644 index 00000000..e0cf0235 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_wall_steel_edges.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_wall_steel_inv.png b/mods/signs_lib/textures/signs_lib_sign_wall_steel_inv.png new file mode 100644 index 00000000..735e4e5f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_wall_steel_inv.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_wall_wooden.png b/mods/signs_lib/textures/signs_lib_sign_wall_wooden.png new file mode 100644 index 00000000..fd8fcbd9 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_wall_wooden.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_wall_wooden_edges.png b/mods/signs_lib/textures/signs_lib_sign_wall_wooden_edges.png new file mode 100644 index 00000000..8a27b976 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_wall_wooden_edges.png differ diff --git a/mods/signs_lib/textures/signs_lib_sign_wall_wooden_inv.png b/mods/signs_lib/textures/signs_lib_sign_wall_wooden_inv.png new file mode 100644 index 00000000..0e82580f Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_sign_wall_wooden_inv.png differ diff --git a/mods/signs_lib/textures/signs_lib_switch_interm.png b/mods/signs_lib/textures/signs_lib_switch_interm.png new file mode 100644 index 00000000..ff2ffd43 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_switch_interm.png differ diff --git a/mods/signs_lib/textures/signs_lib_switch_off.png b/mods/signs_lib/textures/signs_lib_switch_off.png new file mode 100644 index 00000000..25519be7 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_switch_off.png differ diff --git a/mods/signs_lib/textures/signs_lib_switch_on.png b/mods/signs_lib/textures/signs_lib_switch_on.png new file mode 100644 index 00000000..8ad96921 Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_switch_on.png differ diff --git a/mods/signs_lib/textures/signs_lib_wide_font_overlay_inv.png b/mods/signs_lib/textures/signs_lib_wide_font_overlay_inv.png new file mode 100644 index 00000000..740438be Binary files /dev/null and b/mods/signs_lib/textures/signs_lib_wide_font_overlay_inv.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni00.png b/mods/signs_lib/textures/unifont/signs_lib_uni00.png new file mode 100644 index 00000000..2368d05d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni00.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni01.png b/mods/signs_lib/textures/unifont/signs_lib_uni01.png new file mode 100644 index 00000000..60ba4f73 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni01.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni02.png b/mods/signs_lib/textures/unifont/signs_lib_uni02.png new file mode 100644 index 00000000..e8a2aff9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni02.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni03.png b/mods/signs_lib/textures/unifont/signs_lib_uni03.png new file mode 100644 index 00000000..8717647c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni03.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni04.png b/mods/signs_lib/textures/unifont/signs_lib_uni04.png new file mode 100644 index 00000000..b376463e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni04.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni05.png b/mods/signs_lib/textures/unifont/signs_lib_uni05.png new file mode 100644 index 00000000..e6e73d10 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni05.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni06.png b/mods/signs_lib/textures/unifont/signs_lib_uni06.png new file mode 100644 index 00000000..7da26c7c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni06.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni07.png b/mods/signs_lib/textures/unifont/signs_lib_uni07.png new file mode 100644 index 00000000..1245f53b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni07.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni08.png b/mods/signs_lib/textures/unifont/signs_lib_uni08.png new file mode 100644 index 00000000..7696d36d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni08.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni09.png b/mods/signs_lib/textures/unifont/signs_lib_uni09.png new file mode 100644 index 00000000..feafa68f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni09.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni0a.png b/mods/signs_lib/textures/unifont/signs_lib_uni0a.png new file mode 100644 index 00000000..8239199b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni0a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni0b.png b/mods/signs_lib/textures/unifont/signs_lib_uni0b.png new file mode 100644 index 00000000..7493a876 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni0b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni0c.png b/mods/signs_lib/textures/unifont/signs_lib_uni0c.png new file mode 100644 index 00000000..8ecdf8fb Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni0c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni0d.png b/mods/signs_lib/textures/unifont/signs_lib_uni0d.png new file mode 100644 index 00000000..61039108 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni0d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni0e.png b/mods/signs_lib/textures/unifont/signs_lib_uni0e.png new file mode 100644 index 00000000..7c17642c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni0e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni0f.png b/mods/signs_lib/textures/unifont/signs_lib_uni0f.png new file mode 100644 index 00000000..39198928 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni0f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni10.png b/mods/signs_lib/textures/unifont/signs_lib_uni10.png new file mode 100644 index 00000000..a586e0f9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni10.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni11.png b/mods/signs_lib/textures/unifont/signs_lib_uni11.png new file mode 100644 index 00000000..e14d7cfb Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni11.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni12.png b/mods/signs_lib/textures/unifont/signs_lib_uni12.png new file mode 100644 index 00000000..94457ba8 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni12.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni13.png b/mods/signs_lib/textures/unifont/signs_lib_uni13.png new file mode 100644 index 00000000..7831b9ca Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni13.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni14.png b/mods/signs_lib/textures/unifont/signs_lib_uni14.png new file mode 100644 index 00000000..35810e9b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni14.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni15.png b/mods/signs_lib/textures/unifont/signs_lib_uni15.png new file mode 100644 index 00000000..7daa8ec3 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni15.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni16.png b/mods/signs_lib/textures/unifont/signs_lib_uni16.png new file mode 100644 index 00000000..d429583c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni16.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni17.png b/mods/signs_lib/textures/unifont/signs_lib_uni17.png new file mode 100644 index 00000000..c759b46f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni17.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni18.png b/mods/signs_lib/textures/unifont/signs_lib_uni18.png new file mode 100644 index 00000000..f2ef048e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni18.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni19.png b/mods/signs_lib/textures/unifont/signs_lib_uni19.png new file mode 100644 index 00000000..1793ae4c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni19.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni1a.png b/mods/signs_lib/textures/unifont/signs_lib_uni1a.png new file mode 100644 index 00000000..f6f887ea Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni1a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni1b.png b/mods/signs_lib/textures/unifont/signs_lib_uni1b.png new file mode 100644 index 00000000..fc847416 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni1b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni1c.png b/mods/signs_lib/textures/unifont/signs_lib_uni1c.png new file mode 100644 index 00000000..117121c7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni1c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni1d.png b/mods/signs_lib/textures/unifont/signs_lib_uni1d.png new file mode 100644 index 00000000..6591f85a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni1d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni1e.png b/mods/signs_lib/textures/unifont/signs_lib_uni1e.png new file mode 100644 index 00000000..6c890b87 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni1e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni1f.png b/mods/signs_lib/textures/unifont/signs_lib_uni1f.png new file mode 100644 index 00000000..471d39c6 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni1f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni20.png b/mods/signs_lib/textures/unifont/signs_lib_uni20.png new file mode 100644 index 00000000..43f7c2ad Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni20.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni21.png b/mods/signs_lib/textures/unifont/signs_lib_uni21.png new file mode 100644 index 00000000..9d156da5 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni21.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni22.png b/mods/signs_lib/textures/unifont/signs_lib_uni22.png new file mode 100644 index 00000000..c95c4098 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni22.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni23.png b/mods/signs_lib/textures/unifont/signs_lib_uni23.png new file mode 100644 index 00000000..bae014f0 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni23.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni24.png b/mods/signs_lib/textures/unifont/signs_lib_uni24.png new file mode 100644 index 00000000..85e41140 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni24.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni25.png b/mods/signs_lib/textures/unifont/signs_lib_uni25.png new file mode 100644 index 00000000..d4bb2eba Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni25.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni26.png b/mods/signs_lib/textures/unifont/signs_lib_uni26.png new file mode 100644 index 00000000..536785c2 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni26.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni27.png b/mods/signs_lib/textures/unifont/signs_lib_uni27.png new file mode 100644 index 00000000..d0592485 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni27.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni28.png b/mods/signs_lib/textures/unifont/signs_lib_uni28.png new file mode 100644 index 00000000..e89d637a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni28.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni29.png b/mods/signs_lib/textures/unifont/signs_lib_uni29.png new file mode 100644 index 00000000..126bb575 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni29.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni2a.png b/mods/signs_lib/textures/unifont/signs_lib_uni2a.png new file mode 100644 index 00000000..927910b7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni2a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni2b.png b/mods/signs_lib/textures/unifont/signs_lib_uni2b.png new file mode 100644 index 00000000..770d2933 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni2b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni2c.png b/mods/signs_lib/textures/unifont/signs_lib_uni2c.png new file mode 100644 index 00000000..99202112 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni2c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni2d.png b/mods/signs_lib/textures/unifont/signs_lib_uni2d.png new file mode 100644 index 00000000..dbe8ed43 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni2d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni2e.png b/mods/signs_lib/textures/unifont/signs_lib_uni2e.png new file mode 100644 index 00000000..92e2979c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni2e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni2f.png b/mods/signs_lib/textures/unifont/signs_lib_uni2f.png new file mode 100644 index 00000000..b0025d7b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni2f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni30.png b/mods/signs_lib/textures/unifont/signs_lib_uni30.png new file mode 100644 index 00000000..f16e41f8 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni30.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni31.png b/mods/signs_lib/textures/unifont/signs_lib_uni31.png new file mode 100644 index 00000000..5ad73849 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni31.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni32.png b/mods/signs_lib/textures/unifont/signs_lib_uni32.png new file mode 100644 index 00000000..5841b731 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni32.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni33.png b/mods/signs_lib/textures/unifont/signs_lib_uni33.png new file mode 100644 index 00000000..d35757a6 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni33.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni34.png b/mods/signs_lib/textures/unifont/signs_lib_uni34.png new file mode 100644 index 00000000..4301b755 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni34.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni35.png b/mods/signs_lib/textures/unifont/signs_lib_uni35.png new file mode 100644 index 00000000..1cda960a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni35.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni36.png b/mods/signs_lib/textures/unifont/signs_lib_uni36.png new file mode 100644 index 00000000..0cddb997 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni36.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni37.png b/mods/signs_lib/textures/unifont/signs_lib_uni37.png new file mode 100644 index 00000000..310fe92f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni37.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni38.png b/mods/signs_lib/textures/unifont/signs_lib_uni38.png new file mode 100644 index 00000000..85a913b8 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni38.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni39.png b/mods/signs_lib/textures/unifont/signs_lib_uni39.png new file mode 100644 index 00000000..37eb8a14 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni39.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni3a.png b/mods/signs_lib/textures/unifont/signs_lib_uni3a.png new file mode 100644 index 00000000..df8db582 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni3a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni3b.png b/mods/signs_lib/textures/unifont/signs_lib_uni3b.png new file mode 100644 index 00000000..82e33a0c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni3b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni3c.png b/mods/signs_lib/textures/unifont/signs_lib_uni3c.png new file mode 100644 index 00000000..58d25440 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni3c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni3d.png b/mods/signs_lib/textures/unifont/signs_lib_uni3d.png new file mode 100644 index 00000000..9a9734a7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni3d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni3e.png b/mods/signs_lib/textures/unifont/signs_lib_uni3e.png new file mode 100644 index 00000000..6eb60132 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni3e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni3f.png b/mods/signs_lib/textures/unifont/signs_lib_uni3f.png new file mode 100644 index 00000000..8c2c3219 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni3f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni40.png b/mods/signs_lib/textures/unifont/signs_lib_uni40.png new file mode 100644 index 00000000..8aafb7f1 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni40.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni41.png b/mods/signs_lib/textures/unifont/signs_lib_uni41.png new file mode 100644 index 00000000..2b02af11 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni41.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni42.png b/mods/signs_lib/textures/unifont/signs_lib_uni42.png new file mode 100644 index 00000000..e29d9a9b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni42.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni43.png b/mods/signs_lib/textures/unifont/signs_lib_uni43.png new file mode 100644 index 00000000..c7583f31 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni43.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni44.png b/mods/signs_lib/textures/unifont/signs_lib_uni44.png new file mode 100644 index 00000000..c27faa9d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni44.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni45.png b/mods/signs_lib/textures/unifont/signs_lib_uni45.png new file mode 100644 index 00000000..ce40689a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni45.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni46.png b/mods/signs_lib/textures/unifont/signs_lib_uni46.png new file mode 100644 index 00000000..051addb3 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni46.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni47.png b/mods/signs_lib/textures/unifont/signs_lib_uni47.png new file mode 100644 index 00000000..6309f61a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni47.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni48.png b/mods/signs_lib/textures/unifont/signs_lib_uni48.png new file mode 100644 index 00000000..1f7c1f85 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni48.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni49.png b/mods/signs_lib/textures/unifont/signs_lib_uni49.png new file mode 100644 index 00000000..44aa2b6c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni49.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni4a.png b/mods/signs_lib/textures/unifont/signs_lib_uni4a.png new file mode 100644 index 00000000..0df8be37 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni4a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni4b.png b/mods/signs_lib/textures/unifont/signs_lib_uni4b.png new file mode 100644 index 00000000..9a6427e0 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni4b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni4c.png b/mods/signs_lib/textures/unifont/signs_lib_uni4c.png new file mode 100644 index 00000000..d31bd42a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni4c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni4d.png b/mods/signs_lib/textures/unifont/signs_lib_uni4d.png new file mode 100644 index 00000000..0d2559f2 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni4d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni4e.png b/mods/signs_lib/textures/unifont/signs_lib_uni4e.png new file mode 100644 index 00000000..2e51a567 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni4e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni4f.png b/mods/signs_lib/textures/unifont/signs_lib_uni4f.png new file mode 100644 index 00000000..b2d64d99 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni4f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni50.png b/mods/signs_lib/textures/unifont/signs_lib_uni50.png new file mode 100644 index 00000000..048ba7d7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni50.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni51.png b/mods/signs_lib/textures/unifont/signs_lib_uni51.png new file mode 100644 index 00000000..e0f0d2ab Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni51.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni52.png b/mods/signs_lib/textures/unifont/signs_lib_uni52.png new file mode 100644 index 00000000..4ba4aac2 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni52.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni53.png b/mods/signs_lib/textures/unifont/signs_lib_uni53.png new file mode 100644 index 00000000..bcfff795 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni53.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni54.png b/mods/signs_lib/textures/unifont/signs_lib_uni54.png new file mode 100644 index 00000000..74eabb3a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni54.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni55.png b/mods/signs_lib/textures/unifont/signs_lib_uni55.png new file mode 100644 index 00000000..ab796f32 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni55.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni56.png b/mods/signs_lib/textures/unifont/signs_lib_uni56.png new file mode 100644 index 00000000..1c344e1d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni56.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni57.png b/mods/signs_lib/textures/unifont/signs_lib_uni57.png new file mode 100644 index 00000000..fafdccb1 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni57.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni58.png b/mods/signs_lib/textures/unifont/signs_lib_uni58.png new file mode 100644 index 00000000..73b147a7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni58.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni59.png b/mods/signs_lib/textures/unifont/signs_lib_uni59.png new file mode 100644 index 00000000..874e5f53 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni59.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni5a.png b/mods/signs_lib/textures/unifont/signs_lib_uni5a.png new file mode 100644 index 00000000..30e7d338 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni5a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni5b.png b/mods/signs_lib/textures/unifont/signs_lib_uni5b.png new file mode 100644 index 00000000..c13bd0a9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni5b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni5c.png b/mods/signs_lib/textures/unifont/signs_lib_uni5c.png new file mode 100644 index 00000000..df583f05 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni5c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni5d.png b/mods/signs_lib/textures/unifont/signs_lib_uni5d.png new file mode 100644 index 00000000..65c8545a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni5d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni5e.png b/mods/signs_lib/textures/unifont/signs_lib_uni5e.png new file mode 100644 index 00000000..2cfc939a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni5e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni5f.png b/mods/signs_lib/textures/unifont/signs_lib_uni5f.png new file mode 100644 index 00000000..fc458b89 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni5f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni60.png b/mods/signs_lib/textures/unifont/signs_lib_uni60.png new file mode 100644 index 00000000..e344432e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni60.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni61.png b/mods/signs_lib/textures/unifont/signs_lib_uni61.png new file mode 100644 index 00000000..e04a9ac0 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni61.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni62.png b/mods/signs_lib/textures/unifont/signs_lib_uni62.png new file mode 100644 index 00000000..1127307a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni62.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni63.png b/mods/signs_lib/textures/unifont/signs_lib_uni63.png new file mode 100644 index 00000000..3c752ed3 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni63.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni64.png b/mods/signs_lib/textures/unifont/signs_lib_uni64.png new file mode 100644 index 00000000..b40ff4ec Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni64.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni65.png b/mods/signs_lib/textures/unifont/signs_lib_uni65.png new file mode 100644 index 00000000..3ce950da Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni65.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni66.png b/mods/signs_lib/textures/unifont/signs_lib_uni66.png new file mode 100644 index 00000000..363699e7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni66.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni67.png b/mods/signs_lib/textures/unifont/signs_lib_uni67.png new file mode 100644 index 00000000..79b6e571 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni67.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni68.png b/mods/signs_lib/textures/unifont/signs_lib_uni68.png new file mode 100644 index 00000000..1c1a4ee7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni68.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni69.png b/mods/signs_lib/textures/unifont/signs_lib_uni69.png new file mode 100644 index 00000000..79f8f725 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni69.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni6a.png b/mods/signs_lib/textures/unifont/signs_lib_uni6a.png new file mode 100644 index 00000000..55774de4 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni6a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni6b.png b/mods/signs_lib/textures/unifont/signs_lib_uni6b.png new file mode 100644 index 00000000..4ccde240 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni6b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni6c.png b/mods/signs_lib/textures/unifont/signs_lib_uni6c.png new file mode 100644 index 00000000..4ec8eea1 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni6c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni6d.png b/mods/signs_lib/textures/unifont/signs_lib_uni6d.png new file mode 100644 index 00000000..7bc60d97 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni6d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni6e.png b/mods/signs_lib/textures/unifont/signs_lib_uni6e.png new file mode 100644 index 00000000..52ddeb7c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni6e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni6f.png b/mods/signs_lib/textures/unifont/signs_lib_uni6f.png new file mode 100644 index 00000000..a86afd3f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni6f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni70.png b/mods/signs_lib/textures/unifont/signs_lib_uni70.png new file mode 100644 index 00000000..cd8b468a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni70.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni71.png b/mods/signs_lib/textures/unifont/signs_lib_uni71.png new file mode 100644 index 00000000..9a9ae59d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni71.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni72.png b/mods/signs_lib/textures/unifont/signs_lib_uni72.png new file mode 100644 index 00000000..cc2302b1 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni72.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni73.png b/mods/signs_lib/textures/unifont/signs_lib_uni73.png new file mode 100644 index 00000000..c69d3f82 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni73.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni74.png b/mods/signs_lib/textures/unifont/signs_lib_uni74.png new file mode 100644 index 00000000..0a288a28 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni74.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni75.png b/mods/signs_lib/textures/unifont/signs_lib_uni75.png new file mode 100644 index 00000000..0b2e5a7d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni75.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni76.png b/mods/signs_lib/textures/unifont/signs_lib_uni76.png new file mode 100644 index 00000000..de756749 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni76.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni77.png b/mods/signs_lib/textures/unifont/signs_lib_uni77.png new file mode 100644 index 00000000..fffcd14c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni77.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni78.png b/mods/signs_lib/textures/unifont/signs_lib_uni78.png new file mode 100644 index 00000000..e5c0cf90 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni78.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni79.png b/mods/signs_lib/textures/unifont/signs_lib_uni79.png new file mode 100644 index 00000000..5c522043 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni79.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni7a.png b/mods/signs_lib/textures/unifont/signs_lib_uni7a.png new file mode 100644 index 00000000..7ba18107 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni7a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni7b.png b/mods/signs_lib/textures/unifont/signs_lib_uni7b.png new file mode 100644 index 00000000..70bdcfb3 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni7b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni7c.png b/mods/signs_lib/textures/unifont/signs_lib_uni7c.png new file mode 100644 index 00000000..e6627317 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni7c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni7d.png b/mods/signs_lib/textures/unifont/signs_lib_uni7d.png new file mode 100644 index 00000000..26dd43c7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni7d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni7e.png b/mods/signs_lib/textures/unifont/signs_lib_uni7e.png new file mode 100644 index 00000000..e3a28037 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni7e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni7f.png b/mods/signs_lib/textures/unifont/signs_lib_uni7f.png new file mode 100644 index 00000000..2f08a9c6 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni7f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni80.png b/mods/signs_lib/textures/unifont/signs_lib_uni80.png new file mode 100644 index 00000000..af709a0a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni80.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni81.png b/mods/signs_lib/textures/unifont/signs_lib_uni81.png new file mode 100644 index 00000000..5643b964 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni81.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni82.png b/mods/signs_lib/textures/unifont/signs_lib_uni82.png new file mode 100644 index 00000000..f4ea75c7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni82.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni83.png b/mods/signs_lib/textures/unifont/signs_lib_uni83.png new file mode 100644 index 00000000..43478cdc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni83.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni84.png b/mods/signs_lib/textures/unifont/signs_lib_uni84.png new file mode 100644 index 00000000..ddeae15d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni84.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni85.png b/mods/signs_lib/textures/unifont/signs_lib_uni85.png new file mode 100644 index 00000000..67440b24 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni85.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni86.png b/mods/signs_lib/textures/unifont/signs_lib_uni86.png new file mode 100644 index 00000000..44783755 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni86.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni87.png b/mods/signs_lib/textures/unifont/signs_lib_uni87.png new file mode 100644 index 00000000..438839c6 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni87.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni88.png b/mods/signs_lib/textures/unifont/signs_lib_uni88.png new file mode 100644 index 00000000..8b1b423d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni88.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni89.png b/mods/signs_lib/textures/unifont/signs_lib_uni89.png new file mode 100644 index 00000000..236eefcd Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni89.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni8a.png b/mods/signs_lib/textures/unifont/signs_lib_uni8a.png new file mode 100644 index 00000000..7d580e7d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni8a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni8b.png b/mods/signs_lib/textures/unifont/signs_lib_uni8b.png new file mode 100644 index 00000000..8ca4bc7c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni8b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni8c.png b/mods/signs_lib/textures/unifont/signs_lib_uni8c.png new file mode 100644 index 00000000..eca01833 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni8c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni8d.png b/mods/signs_lib/textures/unifont/signs_lib_uni8d.png new file mode 100644 index 00000000..dccb52db Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni8d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni8e.png b/mods/signs_lib/textures/unifont/signs_lib_uni8e.png new file mode 100644 index 00000000..d58441ef Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni8e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni8f.png b/mods/signs_lib/textures/unifont/signs_lib_uni8f.png new file mode 100644 index 00000000..5b309610 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni8f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni90.png b/mods/signs_lib/textures/unifont/signs_lib_uni90.png new file mode 100644 index 00000000..7ce5343a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni90.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni91.png b/mods/signs_lib/textures/unifont/signs_lib_uni91.png new file mode 100644 index 00000000..3947fe81 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni91.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni92.png b/mods/signs_lib/textures/unifont/signs_lib_uni92.png new file mode 100644 index 00000000..b1403197 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni92.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni93.png b/mods/signs_lib/textures/unifont/signs_lib_uni93.png new file mode 100644 index 00000000..0f9d5774 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni93.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni94.png b/mods/signs_lib/textures/unifont/signs_lib_uni94.png new file mode 100644 index 00000000..73cc1581 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni94.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni95.png b/mods/signs_lib/textures/unifont/signs_lib_uni95.png new file mode 100644 index 00000000..aa56278b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni95.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni96.png b/mods/signs_lib/textures/unifont/signs_lib_uni96.png new file mode 100644 index 00000000..d17d0339 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni96.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni97.png b/mods/signs_lib/textures/unifont/signs_lib_uni97.png new file mode 100644 index 00000000..7fa2b91c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni97.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni98.png b/mods/signs_lib/textures/unifont/signs_lib_uni98.png new file mode 100644 index 00000000..42ee0b02 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni98.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni99.png b/mods/signs_lib/textures/unifont/signs_lib_uni99.png new file mode 100644 index 00000000..1114e500 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni99.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni9a.png b/mods/signs_lib/textures/unifont/signs_lib_uni9a.png new file mode 100644 index 00000000..50f1a6da Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni9a.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni9b.png b/mods/signs_lib/textures/unifont/signs_lib_uni9b.png new file mode 100644 index 00000000..1e75a869 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni9b.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni9c.png b/mods/signs_lib/textures/unifont/signs_lib_uni9c.png new file mode 100644 index 00000000..802ed73a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni9c.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni9d.png b/mods/signs_lib/textures/unifont/signs_lib_uni9d.png new file mode 100644 index 00000000..c831925b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni9d.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni9e.png b/mods/signs_lib/textures/unifont/signs_lib_uni9e.png new file mode 100644 index 00000000..cecfd96a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni9e.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uni9f.png b/mods/signs_lib/textures/unifont/signs_lib_uni9f.png new file mode 100644 index 00000000..c1300a92 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uni9f.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia0.png b/mods/signs_lib/textures/unifont/signs_lib_unia0.png new file mode 100644 index 00000000..fc564bc2 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia0.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia1.png b/mods/signs_lib/textures/unifont/signs_lib_unia1.png new file mode 100644 index 00000000..439c0658 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia1.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia2.png b/mods/signs_lib/textures/unifont/signs_lib_unia2.png new file mode 100644 index 00000000..f9a6e39c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia2.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia3.png b/mods/signs_lib/textures/unifont/signs_lib_unia3.png new file mode 100644 index 00000000..ded426a5 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia3.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia4.png b/mods/signs_lib/textures/unifont/signs_lib_unia4.png new file mode 100644 index 00000000..372cd520 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia4.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia5.png b/mods/signs_lib/textures/unifont/signs_lib_unia5.png new file mode 100644 index 00000000..027c3fac Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia5.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia6.png b/mods/signs_lib/textures/unifont/signs_lib_unia6.png new file mode 100644 index 00000000..c5c3c384 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia6.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia7.png b/mods/signs_lib/textures/unifont/signs_lib_unia7.png new file mode 100644 index 00000000..11852b8c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia7.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia8.png b/mods/signs_lib/textures/unifont/signs_lib_unia8.png new file mode 100644 index 00000000..2506b53f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia8.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unia9.png b/mods/signs_lib/textures/unifont/signs_lib_unia9.png new file mode 100644 index 00000000..1d0bd09c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unia9.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniaa.png b/mods/signs_lib/textures/unifont/signs_lib_uniaa.png new file mode 100644 index 00000000..c3c6a8ac Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniaa.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniab.png b/mods/signs_lib/textures/unifont/signs_lib_uniab.png new file mode 100644 index 00000000..3595e053 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniab.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniac.png b/mods/signs_lib/textures/unifont/signs_lib_uniac.png new file mode 100644 index 00000000..6a9dce1c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniac.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniad.png b/mods/signs_lib/textures/unifont/signs_lib_uniad.png new file mode 100644 index 00000000..7415a479 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniad.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniae.png b/mods/signs_lib/textures/unifont/signs_lib_uniae.png new file mode 100644 index 00000000..a938273e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniae.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniaf.png b/mods/signs_lib/textures/unifont/signs_lib_uniaf.png new file mode 100644 index 00000000..aad03fd9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniaf.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib0.png b/mods/signs_lib/textures/unifont/signs_lib_unib0.png new file mode 100644 index 00000000..62819090 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib0.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib1.png b/mods/signs_lib/textures/unifont/signs_lib_unib1.png new file mode 100644 index 00000000..780656db Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib1.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib2.png b/mods/signs_lib/textures/unifont/signs_lib_unib2.png new file mode 100644 index 00000000..d19930e2 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib2.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib3.png b/mods/signs_lib/textures/unifont/signs_lib_unib3.png new file mode 100644 index 00000000..2b3347c7 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib3.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib4.png b/mods/signs_lib/textures/unifont/signs_lib_unib4.png new file mode 100644 index 00000000..402f3c90 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib4.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib5.png b/mods/signs_lib/textures/unifont/signs_lib_unib5.png new file mode 100644 index 00000000..e2c76b4e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib5.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib6.png b/mods/signs_lib/textures/unifont/signs_lib_unib6.png new file mode 100644 index 00000000..9248a464 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib6.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib7.png b/mods/signs_lib/textures/unifont/signs_lib_unib7.png new file mode 100644 index 00000000..837a8d12 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib7.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib8.png b/mods/signs_lib/textures/unifont/signs_lib_unib8.png new file mode 100644 index 00000000..f3964be5 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib8.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unib9.png b/mods/signs_lib/textures/unifont/signs_lib_unib9.png new file mode 100644 index 00000000..cf726794 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unib9.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniba.png b/mods/signs_lib/textures/unifont/signs_lib_uniba.png new file mode 100644 index 00000000..678b7958 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniba.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unibb.png b/mods/signs_lib/textures/unifont/signs_lib_unibb.png new file mode 100644 index 00000000..72fc16b1 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unibb.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unibc.png b/mods/signs_lib/textures/unifont/signs_lib_unibc.png new file mode 100644 index 00000000..a4dd710d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unibc.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unibd.png b/mods/signs_lib/textures/unifont/signs_lib_unibd.png new file mode 100644 index 00000000..a22ca38b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unibd.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unibe.png b/mods/signs_lib/textures/unifont/signs_lib_unibe.png new file mode 100644 index 00000000..d5d7900d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unibe.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unibf.png b/mods/signs_lib/textures/unifont/signs_lib_unibf.png new file mode 100644 index 00000000..2d2e3c35 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unibf.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic0.png b/mods/signs_lib/textures/unifont/signs_lib_unic0.png new file mode 100644 index 00000000..2cfe488a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic0.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic1.png b/mods/signs_lib/textures/unifont/signs_lib_unic1.png new file mode 100644 index 00000000..9cf3ad78 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic1.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic2.png b/mods/signs_lib/textures/unifont/signs_lib_unic2.png new file mode 100644 index 00000000..ee32feee Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic2.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic3.png b/mods/signs_lib/textures/unifont/signs_lib_unic3.png new file mode 100644 index 00000000..b3cc7415 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic3.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic4.png b/mods/signs_lib/textures/unifont/signs_lib_unic4.png new file mode 100644 index 00000000..603344f8 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic4.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic5.png b/mods/signs_lib/textures/unifont/signs_lib_unic5.png new file mode 100644 index 00000000..883355c1 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic5.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic6.png b/mods/signs_lib/textures/unifont/signs_lib_unic6.png new file mode 100644 index 00000000..0894ae73 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic6.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic7.png b/mods/signs_lib/textures/unifont/signs_lib_unic7.png new file mode 100644 index 00000000..037cc712 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic7.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic8.png b/mods/signs_lib/textures/unifont/signs_lib_unic8.png new file mode 100644 index 00000000..161253f0 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic8.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unic9.png b/mods/signs_lib/textures/unifont/signs_lib_unic9.png new file mode 100644 index 00000000..e0d39729 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unic9.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unica.png b/mods/signs_lib/textures/unifont/signs_lib_unica.png new file mode 100644 index 00000000..ecaf984a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unica.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unicb.png b/mods/signs_lib/textures/unifont/signs_lib_unicb.png new file mode 100644 index 00000000..4d9bf765 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unicb.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unicc.png b/mods/signs_lib/textures/unifont/signs_lib_unicc.png new file mode 100644 index 00000000..61a94afc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unicc.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unicd.png b/mods/signs_lib/textures/unifont/signs_lib_unicd.png new file mode 100644 index 00000000..ed329a2c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unicd.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unice.png b/mods/signs_lib/textures/unifont/signs_lib_unice.png new file mode 100644 index 00000000..edf216b9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unice.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unicf.png b/mods/signs_lib/textures/unifont/signs_lib_unicf.png new file mode 100644 index 00000000..852bc0c9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unicf.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid0.png b/mods/signs_lib/textures/unifont/signs_lib_unid0.png new file mode 100644 index 00000000..87424f38 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid0.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid1.png b/mods/signs_lib/textures/unifont/signs_lib_unid1.png new file mode 100644 index 00000000..4a18a441 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid1.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid2.png b/mods/signs_lib/textures/unifont/signs_lib_unid2.png new file mode 100644 index 00000000..f4c41943 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid2.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid3.png b/mods/signs_lib/textures/unifont/signs_lib_unid3.png new file mode 100644 index 00000000..3bf3c206 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid3.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid4.png b/mods/signs_lib/textures/unifont/signs_lib_unid4.png new file mode 100644 index 00000000..9192d440 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid4.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid5.png b/mods/signs_lib/textures/unifont/signs_lib_unid5.png new file mode 100644 index 00000000..01cc707e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid5.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid6.png b/mods/signs_lib/textures/unifont/signs_lib_unid6.png new file mode 100644 index 00000000..96af502f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid6.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid7.png b/mods/signs_lib/textures/unifont/signs_lib_unid7.png new file mode 100644 index 00000000..78d8118c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid7.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid8.png b/mods/signs_lib/textures/unifont/signs_lib_unid8.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid8.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unid9.png b/mods/signs_lib/textures/unifont/signs_lib_unid9.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unid9.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unida.png b/mods/signs_lib/textures/unifont/signs_lib_unida.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unida.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unidb.png b/mods/signs_lib/textures/unifont/signs_lib_unidb.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unidb.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unidc.png b/mods/signs_lib/textures/unifont/signs_lib_unidc.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unidc.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unidd.png b/mods/signs_lib/textures/unifont/signs_lib_unidd.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unidd.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unide.png b/mods/signs_lib/textures/unifont/signs_lib_unide.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unide.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unidf.png b/mods/signs_lib/textures/unifont/signs_lib_unidf.png new file mode 100644 index 00000000..59ad1bcc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unidf.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie0.png b/mods/signs_lib/textures/unifont/signs_lib_unie0.png new file mode 100644 index 00000000..c93088fd Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie0.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie1.png b/mods/signs_lib/textures/unifont/signs_lib_unie1.png new file mode 100644 index 00000000..be77355a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie1.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie2.png b/mods/signs_lib/textures/unifont/signs_lib_unie2.png new file mode 100644 index 00000000..d5584cfa Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie2.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie3.png b/mods/signs_lib/textures/unifont/signs_lib_unie3.png new file mode 100644 index 00000000..fa79bcb3 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie3.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie4.png b/mods/signs_lib/textures/unifont/signs_lib_unie4.png new file mode 100644 index 00000000..47436434 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie4.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie5.png b/mods/signs_lib/textures/unifont/signs_lib_unie5.png new file mode 100644 index 00000000..8bbdddec Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie5.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie6.png b/mods/signs_lib/textures/unifont/signs_lib_unie6.png new file mode 100644 index 00000000..aba2d69d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie6.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie7.png b/mods/signs_lib/textures/unifont/signs_lib_unie7.png new file mode 100644 index 00000000..a03845b4 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie7.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie8.png b/mods/signs_lib/textures/unifont/signs_lib_unie8.png new file mode 100644 index 00000000..10a1663b Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie8.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unie9.png b/mods/signs_lib/textures/unifont/signs_lib_unie9.png new file mode 100644 index 00000000..54ac4a20 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unie9.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniea.png b/mods/signs_lib/textures/unifont/signs_lib_uniea.png new file mode 100644 index 00000000..c53b698d Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniea.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unieb.png b/mods/signs_lib/textures/unifont/signs_lib_unieb.png new file mode 100644 index 00000000..3ae53fe9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unieb.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniec.png b/mods/signs_lib/textures/unifont/signs_lib_uniec.png new file mode 100644 index 00000000..5b3a7c81 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniec.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unied.png b/mods/signs_lib/textures/unifont/signs_lib_unied.png new file mode 100644 index 00000000..60cd657a Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unied.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniee.png b/mods/signs_lib/textures/unifont/signs_lib_uniee.png new file mode 100644 index 00000000..ea73ec55 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniee.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unief.png b/mods/signs_lib/textures/unifont/signs_lib_unief.png new file mode 100644 index 00000000..ea989de5 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unief.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif0.png b/mods/signs_lib/textures/unifont/signs_lib_unif0.png new file mode 100644 index 00000000..14329311 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif0.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif1.png b/mods/signs_lib/textures/unifont/signs_lib_unif1.png new file mode 100644 index 00000000..30374e3e Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif1.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif2.png b/mods/signs_lib/textures/unifont/signs_lib_unif2.png new file mode 100644 index 00000000..5d1701fe Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif2.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif3.png b/mods/signs_lib/textures/unifont/signs_lib_unif3.png new file mode 100644 index 00000000..432b9ff8 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif3.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif4.png b/mods/signs_lib/textures/unifont/signs_lib_unif4.png new file mode 100644 index 00000000..388939e6 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif4.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif5.png b/mods/signs_lib/textures/unifont/signs_lib_unif5.png new file mode 100644 index 00000000..d6554063 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif5.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif6.png b/mods/signs_lib/textures/unifont/signs_lib_unif6.png new file mode 100644 index 00000000..da04d1de Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif6.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif7.png b/mods/signs_lib/textures/unifont/signs_lib_unif7.png new file mode 100644 index 00000000..515aa24f Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif7.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif8.png b/mods/signs_lib/textures/unifont/signs_lib_unif8.png new file mode 100644 index 00000000..607a35f9 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif8.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unif9.png b/mods/signs_lib/textures/unifont/signs_lib_unif9.png new file mode 100644 index 00000000..5028e0ce Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unif9.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unifa.png b/mods/signs_lib/textures/unifont/signs_lib_unifa.png new file mode 100644 index 00000000..75ec174c Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unifa.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unifb.png b/mods/signs_lib/textures/unifont/signs_lib_unifb.png new file mode 100644 index 00000000..a630a2e4 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unifb.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unifc.png b/mods/signs_lib/textures/unifont/signs_lib_unifc.png new file mode 100644 index 00000000..c17f1acc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unifc.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unifd.png b/mods/signs_lib/textures/unifont/signs_lib_unifd.png new file mode 100644 index 00000000..a76770bc Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unifd.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_unife.png b/mods/signs_lib/textures/unifont/signs_lib_unife.png new file mode 100644 index 00000000..c7743793 Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_unife.png differ diff --git a/mods/signs_lib/textures/unifont/signs_lib_uniff.png b/mods/signs_lib/textures/unifont/signs_lib_uniff.png new file mode 100644 index 00000000..b322b6bf Binary files /dev/null and b/mods/signs_lib/textures/unifont/signs_lib_uniff.png differ diff --git a/mods/signs_lib/unifont-halfwidth.lua b/mods/signs_lib/unifont-halfwidth.lua new file mode 100644 index 00000000..aa1c485c --- /dev/null +++ b/mods/signs_lib/unifont-halfwidth.lua @@ -0,0 +1,7199 @@ +-- Generated from .hex file from GNU Unifont +return { +[0x0020] = true, +[0x0021] = true, +[0x0022] = true, +[0x0023] = true, +[0x0024] = true, +[0x0025] = true, +[0x0026] = true, +[0x0027] = true, +[0x0028] = true, +[0x0029] = true, +[0x002A] = true, +[0x002B] = true, +[0x002C] = true, +[0x002D] = true, +[0x002E] = true, +[0x002F] = true, +[0x0030] = true, +[0x0031] = true, +[0x0032] = true, +[0x0033] = true, +[0x0034] = true, +[0x0035] = true, +[0x0036] = true, +[0x0037] = true, +[0x0038] = true, +[0x0039] = true, +[0x003A] = true, +[0x003B] = true, +[0x003C] = true, +[0x003D] = true, +[0x003E] = true, +[0x003F] = true, +[0x0040] = true, +[0x0041] = true, +[0x0042] = true, +[0x0043] = true, +[0x0044] = true, +[0x0045] = true, +[0x0046] = true, +[0x0047] = true, +[0x0048] = true, +[0x0049] = true, +[0x004A] = true, +[0x004B] = true, +[0x004C] = true, +[0x004D] = true, +[0x004E] = true, +[0x004F] = true, +[0x0050] = true, +[0x0051] = true, +[0x0052] = true, +[0x0053] = true, +[0x0054] = true, +[0x0055] = true, +[0x0056] = true, +[0x0057] = true, +[0x0058] = true, +[0x0059] = true, +[0x005A] = true, +[0x005B] = true, +[0x005C] = true, +[0x005D] = true, +[0x005E] = true, +[0x005F] = true, +[0x0060] = true, +[0x0061] = true, +[0x0062] = true, +[0x0063] = true, +[0x0064] = true, +[0x0065] = true, +[0x0066] = true, +[0x0067] = true, +[0x0068] = true, +[0x0069] = true, +[0x006A] = true, +[0x006B] = true, +[0x006C] = true, +[0x006D] = true, +[0x006E] = true, +[0x006F] = true, +[0x0070] = true, +[0x0071] = true, +[0x0072] = true, +[0x0073] = true, +[0x0074] = true, +[0x0075] = true, +[0x0076] = true, +[0x0077] = true, +[0x0078] = true, +[0x0079] = true, +[0x007A] = true, +[0x007B] = true, +[0x007C] = true, +[0x007D] = true, +[0x007E] = true, +[0x00A0] = true, +[0x00A1] = true, +[0x00A2] = true, +[0x00A3] = true, +[0x00A4] = true, +[0x00A5] = true, +[0x00A6] = true, +[0x00A7] = true, +[0x00A8] = true, +[0x00A9] = true, +[0x00AA] = true, +[0x00AB] = true, +[0x00AC] = true, +[0x00AE] = true, +[0x00AF] = true, +[0x00B0] = true, +[0x00B1] = true, +[0x00B2] = true, +[0x00B3] = true, +[0x00B4] = true, +[0x00B5] = true, +[0x00B6] = true, +[0x00B7] = true, +[0x00B8] = true, +[0x00B9] = true, +[0x00BA] = true, +[0x00BB] = true, +[0x00BC] = true, +[0x00BD] = true, +[0x00BE] = true, +[0x00BF] = true, +[0x00C0] = true, +[0x00C1] = true, +[0x00C2] = true, +[0x00C3] = true, +[0x00C4] = true, +[0x00C5] = true, +[0x00C6] = true, +[0x00C7] = true, +[0x00C8] = true, +[0x00C9] = true, +[0x00CA] = true, +[0x00CB] = true, +[0x00CC] = true, +[0x00CD] = true, +[0x00CE] = true, +[0x00CF] = true, +[0x00D0] = true, +[0x00D1] = true, +[0x00D2] = true, +[0x00D3] = true, +[0x00D4] = true, +[0x00D5] = true, +[0x00D6] = true, +[0x00D7] = true, +[0x00D8] = true, +[0x00D9] = true, +[0x00DA] = true, +[0x00DB] = true, +[0x00DC] = true, +[0x00DD] = true, +[0x00DE] = true, +[0x00DF] = true, +[0x00E0] = true, +[0x00E1] = true, +[0x00E2] = true, +[0x00E3] = true, +[0x00E4] = true, +[0x00E5] = true, +[0x00E6] = true, +[0x00E7] = true, +[0x00E8] = true, +[0x00E9] = true, +[0x00EA] = true, +[0x00EB] = true, +[0x00EC] = true, +[0x00ED] = true, +[0x00EE] = true, +[0x00EF] = true, +[0x00F0] = true, +[0x00F1] = true, +[0x00F2] = true, +[0x00F3] = true, +[0x00F4] = true, +[0x00F5] = true, +[0x00F6] = true, +[0x00F7] = true, +[0x00F8] = true, +[0x00F9] = true, +[0x00FA] = true, +[0x00FB] = true, +[0x00FC] = true, +[0x00FD] = true, +[0x00FE] = true, +[0x00FF] = true, +[0x0100] = true, +[0x0101] = true, +[0x0102] = true, +[0x0103] = true, +[0x0104] = true, +[0x0105] = true, +[0x0106] = true, +[0x0107] = true, +[0x0108] = true, +[0x0109] = true, +[0x010A] = true, +[0x010B] = true, +[0x010C] = true, +[0x010D] = true, +[0x010E] = true, +[0x010F] = true, +[0x0110] = true, +[0x0111] = true, +[0x0112] = true, +[0x0113] = true, +[0x0114] = true, +[0x0115] = true, +[0x0116] = true, +[0x0117] = true, +[0x0118] = true, +[0x0119] = true, +[0x011A] = true, +[0x011B] = true, +[0x011C] = true, +[0x011D] = true, +[0x011E] = true, +[0x011F] = true, +[0x0120] = true, +[0x0121] = true, +[0x0122] = true, +[0x0123] = true, +[0x0124] = true, +[0x0125] = true, +[0x0126] = true, +[0x0127] = true, +[0x0128] = true, +[0x0129] = true, +[0x012A] = true, +[0x012B] = true, +[0x012C] = true, +[0x012D] = true, +[0x012E] = true, +[0x012F] = true, +[0x0130] = true, +[0x0131] = true, +[0x0132] = true, +[0x0133] = true, +[0x0134] = true, +[0x0135] = true, +[0x0136] = true, +[0x0137] = true, +[0x0138] = true, +[0x0139] = true, +[0x013A] = true, +[0x013B] = true, +[0x013C] = true, +[0x013D] = true, +[0x013E] = true, +[0x013F] = true, +[0x0140] = true, +[0x0141] = true, +[0x0142] = true, +[0x0143] = true, +[0x0144] = true, +[0x0145] = true, +[0x0146] = true, +[0x0147] = true, +[0x0148] = true, +[0x0149] = true, +[0x014A] = true, +[0x014B] = true, +[0x014C] = true, +[0x014D] = true, +[0x014E] = true, +[0x014F] = true, +[0x0150] = true, +[0x0151] = true, +[0x0152] = true, +[0x0153] = true, +[0x0154] = true, +[0x0155] = true, +[0x0156] = true, +[0x0157] = true, +[0x0158] = true, +[0x0159] = true, +[0x015A] = true, +[0x015B] = true, +[0x015C] = true, +[0x015D] = true, +[0x015E] = true, +[0x015F] = true, +[0x0160] = true, +[0x0161] = true, +[0x0162] = true, +[0x0163] = true, +[0x0164] = true, +[0x0165] = true, +[0x0166] = true, +[0x0167] = true, +[0x0168] = true, +[0x0169] = true, +[0x016A] = true, +[0x016B] = true, +[0x016C] = true, +[0x016D] = true, +[0x016E] = true, +[0x016F] = true, +[0x0170] = true, +[0x0171] = true, +[0x0172] = true, +[0x0173] = true, +[0x0174] = true, +[0x0175] = true, +[0x0176] = true, +[0x0177] = true, +[0x0178] = true, +[0x0179] = true, +[0x017A] = true, +[0x017B] = true, +[0x017C] = true, +[0x017D] = true, +[0x017E] = true, +[0x017F] = true, +[0x0180] = true, +[0x0181] = true, +[0x0182] = true, +[0x0183] = true, +[0x0184] = true, +[0x0185] = true, +[0x0186] = true, +[0x0187] = true, +[0x0188] = true, +[0x0189] = true, +[0x018A] = true, +[0x018B] = true, +[0x018C] = true, +[0x018D] = true, +[0x018E] = true, +[0x018F] = true, +[0x0190] = true, +[0x0191] = true, +[0x0192] = true, +[0x0193] = true, +[0x0194] = true, +[0x0195] = true, +[0x0196] = true, +[0x0197] = true, +[0x0198] = true, +[0x0199] = true, +[0x019A] = true, +[0x019B] = true, +[0x019C] = true, +[0x019D] = true, +[0x019E] = true, +[0x019F] = true, +[0x01A0] = true, +[0x01A1] = true, +[0x01A2] = true, +[0x01A3] = true, +[0x01A4] = true, +[0x01A5] = true, +[0x01A6] = true, +[0x01A7] = true, +[0x01A8] = true, +[0x01A9] = true, +[0x01AA] = true, +[0x01AB] = true, +[0x01AC] = true, +[0x01AD] = true, +[0x01AE] = true, +[0x01AF] = true, +[0x01B0] = true, +[0x01B1] = true, +[0x01B2] = true, +[0x01B3] = true, +[0x01B4] = true, +[0x01B5] = true, +[0x01B6] = true, +[0x01B7] = true, +[0x01B8] = true, +[0x01B9] = true, +[0x01BA] = true, +[0x01BB] = true, +[0x01BC] = true, +[0x01BD] = true, +[0x01BE] = true, +[0x01BF] = true, +[0x01C0] = true, +[0x01C1] = true, +[0x01C2] = true, +[0x01C3] = true, +[0x01C4] = true, +[0x01C5] = true, +[0x01C6] = true, +[0x01C7] = true, +[0x01C8] = true, +[0x01C9] = true, +[0x01CA] = true, +[0x01CB] = true, +[0x01CC] = true, +[0x01CD] = true, +[0x01CE] = true, +[0x01CF] = true, +[0x01D0] = true, +[0x01D1] = true, +[0x01D2] = true, +[0x01D3] = true, +[0x01D4] = true, +[0x01D5] = true, +[0x01D6] = true, +[0x01D7] = true, +[0x01D8] = true, +[0x01D9] = true, +[0x01DA] = true, +[0x01DB] = true, +[0x01DC] = true, +[0x01DD] = true, +[0x01DE] = true, +[0x01DF] = true, +[0x01E0] = true, +[0x01E1] = true, +[0x01E2] = true, +[0x01E3] = true, +[0x01E4] = true, +[0x01E5] = true, +[0x01E6] = true, +[0x01E7] = true, +[0x01E8] = true, +[0x01E9] = true, +[0x01EA] = true, +[0x01EB] = true, +[0x01EC] = true, +[0x01ED] = true, +[0x01EE] = true, +[0x01EF] = true, +[0x01F0] = true, +[0x01F1] = true, +[0x01F2] = true, +[0x01F3] = true, +[0x01F4] = true, +[0x01F5] = true, +[0x01F6] = true, +[0x01F7] = true, +[0x01F8] = true, +[0x01F9] = true, +[0x01FA] = true, +[0x01FB] = true, +[0x01FC] = true, +[0x01FD] = true, +[0x01FE] = true, +[0x01FF] = true, +[0x0200] = true, +[0x0201] = true, +[0x0202] = true, +[0x0203] = true, +[0x0204] = true, +[0x0205] = true, +[0x0206] = true, +[0x0207] = true, +[0x0208] = true, +[0x0209] = true, +[0x020A] = true, +[0x020B] = true, +[0x020C] = true, +[0x020D] = true, +[0x020E] = true, +[0x020F] = true, +[0x0210] = true, +[0x0211] = true, +[0x0212] = true, +[0x0213] = true, +[0x0214] = true, +[0x0215] = true, +[0x0216] = true, +[0x0217] = true, +[0x0218] = true, +[0x0219] = true, +[0x021A] = true, +[0x021B] = true, +[0x021C] = true, +[0x021D] = true, +[0x021E] = true, +[0x021F] = true, +[0x0220] = true, +[0x0221] = true, +[0x0222] = true, +[0x0223] = true, +[0x0224] = true, +[0x0225] = true, +[0x0226] = true, +[0x0227] = true, +[0x0228] = true, +[0x0229] = true, +[0x022A] = true, +[0x022B] = true, +[0x022C] = true, +[0x022D] = true, +[0x022E] = true, +[0x022F] = true, +[0x0230] = true, +[0x0231] = true, +[0x0232] = true, +[0x0233] = true, +[0x0234] = true, +[0x0235] = true, +[0x0236] = true, +[0x0237] = true, +[0x0238] = true, +[0x0239] = true, +[0x023A] = true, +[0x023B] = true, +[0x023C] = true, +[0x023D] = true, +[0x023E] = true, +[0x023F] = true, +[0x0240] = true, +[0x0241] = true, +[0x0242] = true, +[0x0243] = true, +[0x0244] = true, +[0x0245] = true, +[0x0246] = true, +[0x0247] = true, +[0x0248] = true, +[0x0249] = true, +[0x024A] = true, +[0x024B] = true, +[0x024C] = true, +[0x024D] = true, +[0x024E] = true, +[0x024F] = true, +[0x0250] = true, +[0x0251] = true, +[0x0252] = true, +[0x0253] = true, +[0x0254] = true, +[0x0255] = true, +[0x0256] = true, +[0x0257] = true, +[0x0258] = true, +[0x0259] = true, +[0x025A] = true, +[0x025B] = true, +[0x025C] = true, +[0x025D] = true, +[0x025E] = true, +[0x025F] = true, +[0x0260] = true, +[0x0261] = true, +[0x0262] = true, +[0x0263] = true, +[0x0264] = true, +[0x0265] = true, +[0x0266] = true, +[0x0267] = true, +[0x0268] = true, +[0x0269] = true, +[0x026A] = true, +[0x026B] = true, +[0x026C] = true, +[0x026D] = true, +[0x026E] = true, +[0x026F] = true, +[0x0270] = true, +[0x0271] = true, +[0x0272] = true, +[0x0273] = true, +[0x0274] = true, +[0x0275] = true, +[0x0276] = true, +[0x0277] = true, +[0x0278] = true, +[0x0279] = true, +[0x027A] = true, +[0x027B] = true, +[0x027C] = true, +[0x027D] = true, +[0x027E] = true, +[0x027F] = true, +[0x0280] = true, +[0x0281] = true, +[0x0282] = true, +[0x0283] = true, +[0x0284] = true, +[0x0285] = true, +[0x0286] = true, +[0x0287] = true, +[0x0288] = true, +[0x0289] = true, +[0x028A] = true, +[0x028B] = true, +[0x028C] = true, +[0x028D] = true, +[0x028E] = true, +[0x028F] = true, +[0x0290] = true, +[0x0291] = true, +[0x0292] = true, +[0x0293] = true, +[0x0294] = true, +[0x0295] = true, +[0x0296] = true, +[0x0297] = true, +[0x0298] = true, +[0x0299] = true, +[0x029A] = true, +[0x029B] = true, +[0x029C] = true, +[0x029D] = true, +[0x029E] = true, +[0x029F] = true, +[0x02A0] = true, +[0x02A1] = true, +[0x02A2] = true, +[0x02A3] = true, +[0x02A4] = true, +[0x02A5] = true, +[0x02A6] = true, +[0x02A7] = true, +[0x02A8] = true, +[0x02A9] = true, +[0x02AA] = true, +[0x02AB] = true, +[0x02AC] = true, +[0x02AD] = true, +[0x02AE] = true, +[0x02AF] = true, +[0x02B0] = true, +[0x02B1] = true, +[0x02B2] = true, +[0x02B3] = true, +[0x02B4] = true, +[0x02B5] = true, +[0x02B6] = true, +[0x02B7] = true, +[0x02B8] = true, +[0x02B9] = true, +[0x02BA] = true, +[0x02BB] = true, +[0x02BC] = true, +[0x02BD] = true, +[0x02BE] = true, +[0x02BF] = true, +[0x02C0] = true, +[0x02C1] = true, +[0x02C2] = true, +[0x02C3] = true, +[0x02C4] = true, +[0x02C5] = true, +[0x02C6] = true, +[0x02C7] = true, +[0x02C8] = true, +[0x02C9] = true, +[0x02CA] = true, +[0x02CB] = true, +[0x02CC] = true, +[0x02CD] = true, +[0x02CE] = true, +[0x02CF] = true, +[0x02D0] = true, +[0x02D1] = true, +[0x02D2] = true, +[0x02D3] = true, +[0x02D4] = true, +[0x02D5] = true, +[0x02D6] = true, +[0x02D7] = true, +[0x02D8] = true, +[0x02D9] = true, +[0x02DA] = true, +[0x02DB] = true, +[0x02DC] = true, +[0x02DD] = true, +[0x02DE] = true, +[0x02DF] = true, +[0x02E0] = true, +[0x02E1] = true, +[0x02E2] = true, +[0x02E3] = true, +[0x02E4] = true, +[0x02E5] = true, +[0x02E6] = true, +[0x02E7] = true, +[0x02E8] = true, +[0x02E9] = true, +[0x02EA] = true, +[0x02EB] = true, +[0x02EC] = true, +[0x02ED] = true, +[0x02EE] = true, +[0x02EF] = true, +[0x02F0] = true, +[0x02F1] = true, +[0x02F2] = true, +[0x02F3] = true, +[0x02F4] = true, +[0x02F5] = true, +[0x02F6] = true, +[0x02F7] = true, +[0x02F8] = true, +[0x02F9] = true, +[0x02FA] = true, +[0x02FB] = true, +[0x02FC] = true, +[0x02FD] = true, +[0x02FE] = true, +[0x02FF] = true, +[0x0300] = true, +[0x0301] = true, +[0x0302] = true, +[0x0303] = true, +[0x0304] = true, +[0x0305] = true, +[0x0306] = true, +[0x0307] = true, +[0x0308] = true, +[0x0309] = true, +[0x030A] = true, +[0x030B] = true, +[0x030C] = true, +[0x030D] = true, +[0x030E] = true, +[0x030F] = true, +[0x0310] = true, +[0x0311] = true, +[0x0312] = true, +[0x0313] = true, +[0x0314] = true, +[0x0315] = true, +[0x0316] = true, +[0x0317] = true, +[0x0318] = true, +[0x0319] = true, +[0x031A] = true, +[0x031B] = true, +[0x031C] = true, +[0x031D] = true, +[0x031E] = true, +[0x031F] = true, +[0x0320] = true, +[0x0321] = true, +[0x0322] = true, +[0x0323] = true, +[0x0324] = true, +[0x0325] = true, +[0x0326] = true, +[0x0327] = true, +[0x0328] = true, +[0x0329] = true, +[0x032A] = true, +[0x032B] = true, +[0x032C] = true, +[0x032D] = true, +[0x032E] = true, +[0x032F] = true, +[0x0330] = true, +[0x0331] = true, +[0x0332] = true, +[0x0333] = true, +[0x0334] = true, +[0x0335] = true, +[0x0336] = true, +[0x0337] = true, +[0x0338] = true, +[0x0339] = true, +[0x033A] = true, +[0x033B] = true, +[0x033C] = true, +[0x033D] = true, +[0x033E] = true, +[0x033F] = true, +[0x0340] = true, +[0x0341] = true, +[0x0342] = true, +[0x0343] = true, +[0x0344] = true, +[0x0345] = true, +[0x0346] = true, +[0x0347] = true, +[0x0348] = true, +[0x0349] = true, +[0x034A] = true, +[0x034B] = true, +[0x034C] = true, +[0x034D] = true, +[0x034E] = true, +[0x0350] = true, +[0x0351] = true, +[0x0352] = true, +[0x0353] = true, +[0x0354] = true, +[0x0355] = true, +[0x0356] = true, +[0x0357] = true, +[0x0358] = true, +[0x0359] = true, +[0x035A] = true, +[0x035B] = true, +[0x0363] = true, +[0x0364] = true, +[0x0365] = true, +[0x0366] = true, +[0x0367] = true, +[0x0368] = true, +[0x0369] = true, +[0x036A] = true, +[0x036B] = true, +[0x036C] = true, +[0x036D] = true, +[0x036E] = true, +[0x036F] = true, +[0x0370] = true, +[0x0371] = true, +[0x0372] = true, +[0x0373] = true, +[0x0374] = true, +[0x0375] = true, +[0x0376] = true, +[0x0377] = true, +[0x037A] = true, +[0x037B] = true, +[0x037C] = true, +[0x037D] = true, +[0x037E] = true, +[0x037F] = true, +[0x0384] = true, +[0x0385] = true, +[0x0386] = true, +[0x0387] = true, +[0x0388] = true, +[0x0389] = true, +[0x038A] = true, +[0x038C] = true, +[0x038E] = true, +[0x038F] = true, +[0x0390] = true, +[0x0391] = true, +[0x0392] = true, +[0x0393] = true, +[0x0394] = true, +[0x0395] = true, +[0x0396] = true, +[0x0397] = true, +[0x0398] = true, +[0x0399] = true, +[0x039A] = true, +[0x039B] = true, +[0x039C] = true, +[0x039D] = true, +[0x039E] = true, +[0x039F] = true, +[0x03A0] = true, +[0x03A1] = true, +[0x03A3] = true, +[0x03A4] = true, +[0x03A5] = true, +[0x03A6] = true, +[0x03A7] = true, +[0x03A8] = true, +[0x03A9] = true, +[0x03AA] = true, +[0x03AB] = true, +[0x03AC] = true, +[0x03AD] = true, +[0x03AE] = true, +[0x03AF] = true, +[0x03B0] = true, +[0x03B1] = true, +[0x03B2] = true, +[0x03B3] = true, +[0x03B4] = true, +[0x03B5] = true, +[0x03B6] = true, +[0x03B7] = true, +[0x03B8] = true, +[0x03B9] = true, +[0x03BA] = true, +[0x03BB] = true, +[0x03BC] = true, +[0x03BD] = true, +[0x03BE] = true, +[0x03BF] = true, +[0x03C0] = true, +[0x03C1] = true, +[0x03C2] = true, +[0x03C3] = true, +[0x03C4] = true, +[0x03C5] = true, +[0x03C6] = true, +[0x03C7] = true, +[0x03C8] = true, +[0x03C9] = true, +[0x03CA] = true, +[0x03CB] = true, +[0x03CC] = true, +[0x03CD] = true, +[0x03CE] = true, +[0x03CF] = true, +[0x03D0] = true, +[0x03D1] = true, +[0x03D2] = true, +[0x03D3] = true, +[0x03D4] = true, +[0x03D5] = true, +[0x03D6] = true, +[0x03D7] = true, +[0x03D8] = true, +[0x03D9] = true, +[0x03DA] = true, +[0x03DB] = true, +[0x03DC] = true, +[0x03DD] = true, +[0x03DE] = true, +[0x03DF] = true, +[0x03E0] = true, +[0x03E1] = true, +[0x03E2] = true, +[0x03E3] = true, +[0x03E4] = true, +[0x03E5] = true, +[0x03E6] = true, +[0x03E7] = true, +[0x03E8] = true, +[0x03E9] = true, +[0x03EA] = true, +[0x03EB] = true, +[0x03EC] = true, +[0x03ED] = true, +[0x03EE] = true, +[0x03EF] = true, +[0x03F0] = true, +[0x03F1] = true, +[0x03F2] = true, +[0x03F3] = true, +[0x03F4] = true, +[0x03F5] = true, +[0x03F6] = true, +[0x03F7] = true, +[0x03F8] = true, +[0x03F9] = true, +[0x03FA] = true, +[0x03FB] = true, +[0x03FC] = true, +[0x03FD] = true, +[0x03FE] = true, +[0x03FF] = true, +[0x0400] = true, +[0x0401] = true, +[0x0402] = true, +[0x0403] = true, +[0x0404] = true, +[0x0405] = true, +[0x0406] = true, +[0x0407] = true, +[0x0408] = true, +[0x0409] = true, +[0x040A] = true, +[0x040B] = true, +[0x040C] = true, +[0x040D] = true, +[0x040E] = true, +[0x040F] = true, +[0x0410] = true, +[0x0411] = true, +[0x0412] = true, +[0x0413] = true, +[0x0414] = true, +[0x0415] = true, +[0x0416] = true, +[0x0417] = true, +[0x0418] = true, +[0x0419] = true, +[0x041A] = true, +[0x041B] = true, +[0x041C] = true, +[0x041D] = true, +[0x041E] = true, +[0x041F] = true, +[0x0420] = true, +[0x0421] = true, +[0x0422] = true, +[0x0423] = true, +[0x0424] = true, +[0x0425] = true, +[0x0426] = true, +[0x0427] = true, +[0x0428] = true, +[0x0429] = true, +[0x042A] = true, +[0x042B] = true, +[0x042C] = true, +[0x042D] = true, +[0x042E] = true, +[0x042F] = true, +[0x0430] = true, +[0x0431] = true, +[0x0432] = true, +[0x0433] = true, +[0x0434] = true, +[0x0435] = true, +[0x0436] = true, +[0x0437] = true, +[0x0438] = true, +[0x0439] = true, +[0x043A] = true, +[0x043B] = true, +[0x043C] = true, +[0x043D] = true, +[0x043E] = true, +[0x043F] = true, +[0x0440] = true, +[0x0441] = true, +[0x0442] = true, +[0x0443] = true, +[0x0444] = true, +[0x0445] = true, +[0x0446] = true, +[0x0447] = true, +[0x0448] = true, +[0x0449] = true, +[0x044A] = true, +[0x044B] = true, +[0x044C] = true, +[0x044D] = true, +[0x044E] = true, +[0x044F] = true, +[0x0450] = true, +[0x0451] = true, +[0x0452] = true, +[0x0453] = true, +[0x0454] = true, +[0x0455] = true, +[0x0456] = true, +[0x0457] = true, +[0x0458] = true, +[0x0459] = true, +[0x045A] = true, +[0x045B] = true, +[0x045C] = true, +[0x045D] = true, +[0x045E] = true, +[0x045F] = true, +[0x0460] = true, +[0x0461] = true, +[0x0462] = true, +[0x0463] = true, +[0x0464] = true, +[0x0465] = true, +[0x0466] = true, +[0x0467] = true, +[0x0468] = true, +[0x0469] = true, +[0x046A] = true, +[0x046B] = true, +[0x046C] = true, +[0x046D] = true, +[0x046E] = true, +[0x046F] = true, +[0x0470] = true, +[0x0471] = true, +[0x0472] = true, +[0x0473] = true, +[0x0474] = true, +[0x0475] = true, +[0x0476] = true, +[0x0477] = true, +[0x0478] = true, +[0x0479] = true, +[0x047A] = true, +[0x047B] = true, +[0x047C] = true, +[0x047D] = true, +[0x047E] = true, +[0x047F] = true, +[0x0480] = true, +[0x0481] = true, +[0x0482] = true, +[0x0483] = true, +[0x0484] = true, +[0x0485] = true, +[0x0486] = true, +[0x0487] = true, +[0x048A] = true, +[0x048B] = true, +[0x048C] = true, +[0x048D] = true, +[0x048E] = true, +[0x048F] = true, +[0x0490] = true, +[0x0491] = true, +[0x0492] = true, +[0x0493] = true, +[0x0494] = true, +[0x0495] = true, +[0x0496] = true, +[0x0497] = true, +[0x0498] = true, +[0x0499] = true, +[0x049A] = true, +[0x049B] = true, +[0x049C] = true, +[0x049D] = true, +[0x049E] = true, +[0x049F] = true, +[0x04A0] = true, +[0x04A1] = true, +[0x04A2] = true, +[0x04A3] = true, +[0x04A4] = true, +[0x04A5] = true, +[0x04A6] = true, +[0x04A7] = true, +[0x04A8] = true, +[0x04A9] = true, +[0x04AA] = true, +[0x04AB] = true, +[0x04AC] = true, +[0x04AD] = true, +[0x04AE] = true, +[0x04AF] = true, +[0x04B0] = true, +[0x04B1] = true, +[0x04B2] = true, +[0x04B3] = true, +[0x04B4] = true, +[0x04B5] = true, +[0x04B6] = true, +[0x04B7] = true, +[0x04B8] = true, +[0x04B9] = true, +[0x04BA] = true, +[0x04BB] = true, +[0x04BC] = true, +[0x04BD] = true, +[0x04BE] = true, +[0x04BF] = true, +[0x04C0] = true, +[0x04C1] = true, +[0x04C2] = true, +[0x04C3] = true, +[0x04C4] = true, +[0x04C5] = true, +[0x04C6] = true, +[0x04C7] = true, +[0x04C8] = true, +[0x04C9] = true, +[0x04CA] = true, +[0x04CB] = true, +[0x04CC] = true, +[0x04CD] = true, +[0x04CE] = true, +[0x04CF] = true, +[0x04D0] = true, +[0x04D1] = true, +[0x04D2] = true, +[0x04D3] = true, +[0x04D4] = true, +[0x04D5] = true, +[0x04D6] = true, +[0x04D7] = true, +[0x04D8] = true, +[0x04D9] = true, +[0x04DA] = true, +[0x04DB] = true, +[0x04DC] = true, +[0x04DD] = true, +[0x04DE] = true, +[0x04DF] = true, +[0x04E0] = true, +[0x04E1] = true, +[0x04E2] = true, +[0x04E3] = true, +[0x04E4] = true, +[0x04E5] = true, +[0x04E6] = true, +[0x04E7] = true, +[0x04E8] = true, +[0x04E9] = true, +[0x04EA] = true, +[0x04EB] = true, +[0x04EC] = true, +[0x04ED] = true, +[0x04EE] = true, +[0x04EF] = true, +[0x04F0] = true, +[0x04F1] = true, +[0x04F2] = true, +[0x04F3] = true, +[0x04F4] = true, +[0x04F5] = true, +[0x04F6] = true, +[0x04F7] = true, +[0x04F8] = true, +[0x04F9] = true, +[0x04FA] = true, +[0x04FB] = true, +[0x04FC] = true, +[0x04FD] = true, +[0x04FE] = true, +[0x04FF] = true, +[0x0500] = true, +[0x0501] = true, +[0x0502] = true, +[0x0503] = true, +[0x0504] = true, +[0x0505] = true, +[0x0506] = true, +[0x0507] = true, +[0x0508] = true, +[0x0509] = true, +[0x050A] = true, +[0x050B] = true, +[0x050C] = true, +[0x050D] = true, +[0x050E] = true, +[0x050F] = true, +[0x0510] = true, +[0x0511] = true, +[0x0512] = true, +[0x0513] = true, +[0x0514] = true, +[0x0515] = true, +[0x0516] = true, +[0x0517] = true, +[0x0518] = true, +[0x0519] = true, +[0x051A] = true, +[0x051B] = true, +[0x051C] = true, +[0x051D] = true, +[0x051E] = true, +[0x051F] = true, +[0x0520] = true, +[0x0521] = true, +[0x0522] = true, +[0x0523] = true, +[0x0524] = true, +[0x0525] = true, +[0x0526] = true, +[0x0527] = true, +[0x0528] = true, +[0x0529] = true, +[0x052C] = true, +[0x052D] = true, +[0x052E] = true, +[0x052F] = true, +[0x0531] = true, +[0x0532] = true, +[0x0533] = true, +[0x0534] = true, +[0x0535] = true, +[0x0536] = true, +[0x0537] = true, +[0x0538] = true, +[0x0539] = true, +[0x053A] = true, +[0x053B] = true, +[0x053C] = true, +[0x053D] = true, +[0x053E] = true, +[0x053F] = true, +[0x0540] = true, +[0x0541] = true, +[0x0542] = true, +[0x0543] = true, +[0x0544] = true, +[0x0545] = true, +[0x0546] = true, +[0x0547] = true, +[0x0548] = true, +[0x0549] = true, +[0x054A] = true, +[0x054B] = true, +[0x054C] = true, +[0x054D] = true, +[0x054E] = true, +[0x054F] = true, +[0x0550] = true, +[0x0551] = true, +[0x0552] = true, +[0x0553] = true, +[0x0554] = true, +[0x0555] = true, +[0x0556] = true, +[0x0559] = true, +[0x055A] = true, +[0x055B] = true, +[0x055C] = true, +[0x055D] = true, +[0x055E] = true, +[0x055F] = true, +[0x0560] = true, +[0x0561] = true, +[0x0562] = true, +[0x0563] = true, +[0x0564] = true, +[0x0565] = true, +[0x0566] = true, +[0x0567] = true, +[0x0568] = true, +[0x0569] = true, +[0x056A] = true, +[0x056B] = true, +[0x056C] = true, +[0x056D] = true, +[0x056E] = true, +[0x056F] = true, +[0x0570] = true, +[0x0571] = true, +[0x0572] = true, +[0x0573] = true, +[0x0574] = true, +[0x0575] = true, +[0x0576] = true, +[0x0577] = true, +[0x0578] = true, +[0x0579] = true, +[0x057A] = true, +[0x057B] = true, +[0x057C] = true, +[0x057D] = true, +[0x057E] = true, +[0x057F] = true, +[0x0580] = true, +[0x0581] = true, +[0x0582] = true, +[0x0583] = true, +[0x0584] = true, +[0x0585] = true, +[0x0586] = true, +[0x0587] = true, +[0x0588] = true, +[0x0589] = true, +[0x058A] = true, +[0x058F] = true, +[0x0591] = true, +[0x0592] = true, +[0x0593] = true, +[0x0594] = true, +[0x0595] = true, +[0x0596] = true, +[0x0597] = true, +[0x0598] = true, +[0x0599] = true, +[0x059A] = true, +[0x059B] = true, +[0x059C] = true, +[0x059D] = true, +[0x059E] = true, +[0x059F] = true, +[0x05A0] = true, +[0x05A1] = true, +[0x05A2] = true, +[0x05A3] = true, +[0x05A4] = true, +[0x05A5] = true, +[0x05A6] = true, +[0x05A7] = true, +[0x05A8] = true, +[0x05A9] = true, +[0x05AA] = true, +[0x05AB] = true, +[0x05AC] = true, +[0x05AD] = true, +[0x05AE] = true, +[0x05AF] = true, +[0x05B0] = true, +[0x05B1] = true, +[0x05B2] = true, +[0x05B3] = true, +[0x05B4] = true, +[0x05B5] = true, +[0x05B6] = true, +[0x05B7] = true, +[0x05B8] = true, +[0x05B9] = true, +[0x05BA] = true, +[0x05BB] = true, +[0x05BC] = true, +[0x05BD] = true, +[0x05BE] = true, +[0x05BF] = true, +[0x05C0] = true, +[0x05C1] = true, +[0x05C2] = true, +[0x05C3] = true, +[0x05C4] = true, +[0x05C5] = true, +[0x05C6] = true, +[0x05C7] = true, +[0x05D0] = true, +[0x05D1] = true, +[0x05D2] = true, +[0x05D3] = true, +[0x05D4] = true, +[0x05D5] = true, +[0x05D6] = true, +[0x05D7] = true, +[0x05D8] = true, +[0x05D9] = true, +[0x05DA] = true, +[0x05DB] = true, +[0x05DC] = true, +[0x05DD] = true, +[0x05DE] = true, +[0x05DF] = true, +[0x05E0] = true, +[0x05E1] = true, +[0x05E2] = true, +[0x05E3] = true, +[0x05E4] = true, +[0x05E5] = true, +[0x05E6] = true, +[0x05E7] = true, +[0x05E8] = true, +[0x05E9] = true, +[0x05EA] = true, +[0x05EF] = true, +[0x05F0] = true, +[0x05F1] = true, +[0x05F2] = true, +[0x05F3] = true, +[0x05F4] = true, +[0x0609] = true, +[0x060A] = true, +[0x060C] = true, +[0x060D] = true, +[0x0610] = true, +[0x0618] = true, +[0x0619] = true, +[0x061A] = true, +[0x061B] = true, +[0x061D] = true, +[0x061F] = true, +[0x0620] = true, +[0x0621] = true, +[0x0622] = true, +[0x0623] = true, +[0x0624] = true, +[0x0625] = true, +[0x0626] = true, +[0x0627] = true, +[0x0628] = true, +[0x0629] = true, +[0x062A] = true, +[0x062B] = true, +[0x062C] = true, +[0x062D] = true, +[0x062E] = true, +[0x062F] = true, +[0x0630] = true, +[0x0631] = true, +[0x0632] = true, +[0x0633] = true, +[0x0634] = true, +[0x0635] = true, +[0x0636] = true, +[0x0637] = true, +[0x0638] = true, +[0x0639] = true, +[0x063A] = true, +[0x063B] = true, +[0x063C] = true, +[0x063D] = true, +[0x063E] = true, +[0x063F] = true, +[0x0640] = true, +[0x0641] = true, +[0x0642] = true, +[0x0643] = true, +[0x0644] = true, +[0x0645] = true, +[0x0646] = true, +[0x0647] = true, +[0x0648] = true, +[0x0649] = true, +[0x064A] = true, +[0x064B] = true, +[0x064C] = true, +[0x064D] = true, +[0x064E] = true, +[0x064F] = true, +[0x0650] = true, +[0x0651] = true, +[0x0652] = true, +[0x0653] = true, +[0x0654] = true, +[0x0655] = true, +[0x0657] = true, +[0x0658] = true, +[0x0659] = true, +[0x065A] = true, +[0x065B] = true, +[0x065C] = true, +[0x065D] = true, +[0x065E] = true, +[0x065F] = true, +[0x0660] = true, +[0x0661] = true, +[0x0662] = true, +[0x0663] = true, +[0x0664] = true, +[0x0665] = true, +[0x0666] = true, +[0x0667] = true, +[0x0668] = true, +[0x0669] = true, +[0x066A] = true, +[0x066B] = true, +[0x066C] = true, +[0x066D] = true, +[0x066E] = true, +[0x066F] = true, +[0x0670] = true, +[0x0671] = true, +[0x0672] = true, +[0x0673] = true, +[0x0674] = true, +[0x0675] = true, +[0x0676] = true, +[0x0677] = true, +[0x0678] = true, +[0x0679] = true, +[0x067A] = true, +[0x067B] = true, +[0x067C] = true, +[0x067D] = true, +[0x067E] = true, +[0x067F] = true, +[0x0680] = true, +[0x0681] = true, +[0x0682] = true, +[0x0683] = true, +[0x0684] = true, +[0x0685] = true, +[0x0686] = true, +[0x0687] = true, +[0x0688] = true, +[0x0689] = true, +[0x068A] = true, +[0x068B] = true, +[0x068C] = true, +[0x068D] = true, +[0x068E] = true, +[0x068F] = true, +[0x0690] = true, +[0x0691] = true, +[0x0692] = true, +[0x0693] = true, +[0x0694] = true, +[0x0695] = true, +[0x0696] = true, +[0x0697] = true, +[0x0698] = true, +[0x0699] = true, +[0x069A] = true, +[0x069B] = true, +[0x069C] = true, +[0x069D] = true, +[0x069E] = true, +[0x069F] = true, +[0x06A0] = true, +[0x06A1] = true, +[0x06A2] = true, +[0x06A3] = true, +[0x06A4] = true, +[0x06A5] = true, +[0x06A6] = true, +[0x06A7] = true, +[0x06A8] = true, +[0x06A9] = true, +[0x06AB] = true, +[0x06AC] = true, +[0x06AD] = true, +[0x06AE] = true, +[0x06AF] = true, +[0x06B0] = true, +[0x06B1] = true, +[0x06B2] = true, +[0x06B3] = true, +[0x06B4] = true, +[0x06B5] = true, +[0x06B6] = true, +[0x06B7] = true, +[0x06B8] = true, +[0x06B9] = true, +[0x06BA] = true, +[0x06BB] = true, +[0x06BC] = true, +[0x06BD] = true, +[0x06BE] = true, +[0x06BF] = true, +[0x06C0] = true, +[0x06C1] = true, +[0x06C2] = true, +[0x06C3] = true, +[0x06C4] = true, +[0x06C5] = true, +[0x06C6] = true, +[0x06C7] = true, +[0x06C8] = true, +[0x06C9] = true, +[0x06CA] = true, +[0x06CB] = true, +[0x06CC] = true, +[0x06CD] = true, +[0x06CE] = true, +[0x06CF] = true, +[0x06D0] = true, +[0x06D1] = true, +[0x06D2] = true, +[0x06D3] = true, +[0x06D4] = true, +[0x06D5] = true, +[0x06DB] = true, +[0x06DF] = true, +[0x06E0] = true, +[0x06E1] = true, +[0x06E4] = true, +[0x06E5] = true, +[0x06E6] = true, +[0x06E7] = true, +[0x06EE] = true, +[0x06EF] = true, +[0x06F0] = true, +[0x06F1] = true, +[0x06F2] = true, +[0x06F3] = true, +[0x06F4] = true, +[0x06F5] = true, +[0x06F6] = true, +[0x06F7] = true, +[0x06F8] = true, +[0x06F9] = true, +[0x06FA] = true, +[0x06FB] = true, +[0x06FC] = true, +[0x06FD] = true, +[0x06FE] = true, +[0x06FF] = true, +[0x0750] = true, +[0x0751] = true, +[0x0752] = true, +[0x0753] = true, +[0x0754] = true, +[0x0755] = true, +[0x0756] = true, +[0x0757] = true, +[0x0758] = true, +[0x0759] = true, +[0x075A] = true, +[0x075B] = true, +[0x075C] = true, +[0x075D] = true, +[0x075E] = true, +[0x075F] = true, +[0x0760] = true, +[0x0761] = true, +[0x0762] = true, +[0x0763] = true, +[0x0764] = true, +[0x0765] = true, +[0x0766] = true, +[0x0767] = true, +[0x0768] = true, +[0x0769] = true, +[0x076A] = true, +[0x076B] = true, +[0x076C] = true, +[0x076D] = true, +[0x076E] = true, +[0x076F] = true, +[0x0770] = true, +[0x0771] = true, +[0x0772] = true, +[0x0773] = true, +[0x0774] = true, +[0x0775] = true, +[0x0776] = true, +[0x0777] = true, +[0x0778] = true, +[0x0779] = true, +[0x077A] = true, +[0x077B] = true, +[0x077C] = true, +[0x077D] = true, +[0x077E] = true, +[0x077F] = true, +[0x0780] = true, +[0x0781] = true, +[0x0782] = true, +[0x0783] = true, +[0x0784] = true, +[0x0785] = true, +[0x0786] = true, +[0x0787] = true, +[0x0788] = true, +[0x0789] = true, +[0x078A] = true, +[0x078B] = true, +[0x078C] = true, +[0x078D] = true, +[0x078E] = true, +[0x078F] = true, +[0x0791] = true, +[0x0792] = true, +[0x0793] = true, +[0x0794] = true, +[0x0795] = true, +[0x0796] = true, +[0x0797] = true, +[0x0798] = true, +[0x0799] = true, +[0x079A] = true, +[0x079B] = true, +[0x079C] = true, +[0x07A0] = true, +[0x07A1] = true, +[0x07A2] = true, +[0x07A3] = true, +[0x07A4] = true, +[0x07A5] = true, +[0x07A6] = true, +[0x07A7] = true, +[0x07A8] = true, +[0x07A9] = true, +[0x07AA] = true, +[0x07AB] = true, +[0x07AC] = true, +[0x07AD] = true, +[0x07AE] = true, +[0x07AF] = true, +[0x07B0] = true, +[0x07B1] = true, +[0x07C0] = true, +[0x07C1] = true, +[0x07C2] = true, +[0x07C3] = true, +[0x07C4] = true, +[0x07C5] = true, +[0x07C6] = true, +[0x07C7] = true, +[0x07C8] = true, +[0x07C9] = true, +[0x07CA] = true, +[0x07CB] = true, +[0x07CC] = true, +[0x07CD] = true, +[0x07CE] = true, +[0x07CF] = true, +[0x07D0] = true, +[0x07D1] = true, +[0x07D2] = true, +[0x07D3] = true, +[0x07D4] = true, +[0x07D5] = true, +[0x07D6] = true, +[0x07D7] = true, +[0x07D8] = true, +[0x07D9] = true, +[0x07DA] = true, +[0x07DB] = true, +[0x07DC] = true, +[0x07DD] = true, +[0x07DE] = true, +[0x07DF] = true, +[0x07E0] = true, +[0x07E1] = true, +[0x07E2] = true, +[0x07E3] = true, +[0x07E4] = true, +[0x07E5] = true, +[0x07E6] = true, +[0x07E7] = true, +[0x07E8] = true, +[0x07E9] = true, +[0x07EA] = true, +[0x07EB] = true, +[0x07EC] = true, +[0x07ED] = true, +[0x07EE] = true, +[0x07EF] = true, +[0x07F0] = true, +[0x07F1] = true, +[0x07F2] = true, +[0x07F3] = true, +[0x07F4] = true, +[0x07F5] = true, +[0x07F6] = true, +[0x07F7] = true, +[0x07F8] = true, +[0x07F9] = true, +[0x07FA] = true, +[0x07FD] = true, +[0x07FE] = true, +[0x07FF] = true, +[0x0870] = true, +[0x0871] = true, +[0x0872] = true, +[0x0873] = true, +[0x0874] = true, +[0x0875] = true, +[0x0876] = true, +[0x0877] = true, +[0x0878] = true, +[0x0879] = true, +[0x087A] = true, +[0x087B] = true, +[0x087C] = true, +[0x087D] = true, +[0x087E] = true, +[0x087F] = true, +[0x0880] = true, +[0x0881] = true, +[0x0882] = true, +[0x0883] = true, +[0x0884] = true, +[0x0885] = true, +[0x0886] = true, +[0x0887] = true, +[0x0888] = true, +[0x0889] = true, +[0x088A] = true, +[0x088B] = true, +[0x088C] = true, +[0x088D] = true, +[0x088E] = true, +[0x089C] = true, +[0x089D] = true, +[0x089E] = true, +[0x089F] = true, +[0x08A0] = true, +[0x08A1] = true, +[0x08A2] = true, +[0x08A3] = true, +[0x08A4] = true, +[0x08A5] = true, +[0x08A6] = true, +[0x08A7] = true, +[0x08A8] = true, +[0x08A9] = true, +[0x08AA] = true, +[0x08AB] = true, +[0x08AC] = true, +[0x08AD] = true, +[0x08AE] = true, +[0x08AF] = true, +[0x08B0] = true, +[0x08B1] = true, +[0x08B2] = true, +[0x08B3] = true, +[0x08B4] = true, +[0x08B5] = true, +[0x08B6] = true, +[0x08B7] = true, +[0x08B8] = true, +[0x08B9] = true, +[0x08BA] = true, +[0x08BB] = true, +[0x08BC] = true, +[0x08BD] = true, +[0x08BE] = true, +[0x08BF] = true, +[0x08C0] = true, +[0x08C1] = true, +[0x08C2] = true, +[0x08C3] = true, +[0x08C4] = true, +[0x08C5] = true, +[0x08C6] = true, +[0x08C7] = true, +[0x08C8] = true, +[0x08C9] = true, +[0x08CA] = true, +[0x08CB] = true, +[0x08CE] = true, +[0x08CF] = true, +[0x08D0] = true, +[0x08D1] = true, +[0x08D2] = true, +[0x08D3] = true, +[0x08D5] = true, +[0x08D6] = true, +[0x08D7] = true, +[0x08D8] = true, +[0x08D9] = true, +[0x08E0] = true, +[0x08E1] = true, +[0x08E2] = true, +[0x08E3] = true, +[0x08E4] = true, +[0x08E5] = true, +[0x08E6] = true, +[0x08E7] = true, +[0x08E8] = true, +[0x08E9] = true, +[0x08EA] = true, +[0x08EB] = true, +[0x08EC] = true, +[0x08ED] = true, +[0x08EE] = true, +[0x08EF] = true, +[0x08F0] = true, +[0x08F1] = true, +[0x08F2] = true, +[0x08F3] = true, +[0x08F4] = true, +[0x08F5] = true, +[0x08F6] = true, +[0x08F7] = true, +[0x08F8] = true, +[0x08F9] = true, +[0x08FA] = true, +[0x08FB] = true, +[0x08FC] = true, +[0x08FD] = true, +[0x08FE] = true, +[0x08FF] = true, +[0x0E01] = true, +[0x0E02] = true, +[0x0E03] = true, +[0x0E04] = true, +[0x0E05] = true, +[0x0E06] = true, +[0x0E07] = true, +[0x0E08] = true, +[0x0E09] = true, +[0x0E0A] = true, +[0x0E0B] = true, +[0x0E0C] = true, +[0x0E0D] = true, +[0x0E0E] = true, +[0x0E0F] = true, +[0x0E10] = true, +[0x0E11] = true, +[0x0E12] = true, +[0x0E13] = true, +[0x0E14] = true, +[0x0E15] = true, +[0x0E16] = true, +[0x0E17] = true, +[0x0E18] = true, +[0x0E19] = true, +[0x0E1A] = true, +[0x0E1B] = true, +[0x0E1C] = true, +[0x0E1D] = true, +[0x0E1E] = true, +[0x0E1F] = true, +[0x0E20] = true, +[0x0E21] = true, +[0x0E22] = true, +[0x0E23] = true, +[0x0E24] = true, +[0x0E25] = true, +[0x0E26] = true, +[0x0E27] = true, +[0x0E28] = true, +[0x0E29] = true, +[0x0E2A] = true, +[0x0E2B] = true, +[0x0E2C] = true, +[0x0E2D] = true, +[0x0E2E] = true, +[0x0E2F] = true, +[0x0E30] = true, +[0x0E31] = true, +[0x0E32] = true, +[0x0E33] = true, +[0x0E34] = true, +[0x0E35] = true, +[0x0E36] = true, +[0x0E37] = true, +[0x0E38] = true, +[0x0E39] = true, +[0x0E3A] = true, +[0x0E3F] = true, +[0x0E40] = true, +[0x0E41] = true, +[0x0E42] = true, +[0x0E43] = true, +[0x0E44] = true, +[0x0E45] = true, +[0x0E46] = true, +[0x0E47] = true, +[0x0E48] = true, +[0x0E49] = true, +[0x0E4A] = true, +[0x0E4B] = true, +[0x0E4C] = true, +[0x0E4D] = true, +[0x0E4E] = true, +[0x0E4F] = true, +[0x0E50] = true, +[0x0E51] = true, +[0x0E52] = true, +[0x0E53] = true, +[0x0E54] = true, +[0x0E55] = true, +[0x0E56] = true, +[0x0E57] = true, +[0x0E58] = true, +[0x0E59] = true, +[0x0E5A] = true, +[0x0E81] = true, +[0x0E82] = true, +[0x0E84] = true, +[0x0E86] = true, +[0x0E87] = true, +[0x0E88] = true, +[0x0E89] = true, +[0x0E8A] = true, +[0x0E8C] = true, +[0x0E8D] = true, +[0x0E8E] = true, +[0x0E8F] = true, +[0x0E90] = true, +[0x0E91] = true, +[0x0E92] = true, +[0x0E93] = true, +[0x0E94] = true, +[0x0E95] = true, +[0x0E96] = true, +[0x0E97] = true, +[0x0E98] = true, +[0x0E99] = true, +[0x0E9A] = true, +[0x0E9B] = true, +[0x0E9C] = true, +[0x0E9D] = true, +[0x0E9E] = true, +[0x0E9F] = true, +[0x0EA0] = true, +[0x0EA1] = true, +[0x0EA2] = true, +[0x0EA3] = true, +[0x0EA5] = true, +[0x0EA7] = true, +[0x0EA8] = true, +[0x0EA9] = true, +[0x0EAA] = true, +[0x0EAB] = true, +[0x0EAC] = true, +[0x0EAD] = true, +[0x0EAE] = true, +[0x0EAF] = true, +[0x0EB0] = true, +[0x0EB1] = true, +[0x0EB2] = true, +[0x0EB3] = true, +[0x0EB4] = true, +[0x0EB5] = true, +[0x0EB6] = true, +[0x0EB7] = true, +[0x0EB8] = true, +[0x0EB9] = true, +[0x0EBA] = true, +[0x0EBB] = true, +[0x0EBC] = true, +[0x0EBD] = true, +[0x0EC0] = true, +[0x0EC1] = true, +[0x0EC2] = true, +[0x0EC3] = true, +[0x0EC4] = true, +[0x0EC6] = true, +[0x0EC8] = true, +[0x0EC9] = true, +[0x0ECA] = true, +[0x0ECB] = true, +[0x0ECC] = true, +[0x0ECD] = true, +[0x0ED0] = true, +[0x0ED1] = true, +[0x0ED2] = true, +[0x0ED3] = true, +[0x0ED4] = true, +[0x0ED5] = true, +[0x0ED6] = true, +[0x0ED7] = true, +[0x0ED8] = true, +[0x0ED9] = true, +[0x0EDC] = true, +[0x0EDD] = true, +[0x0EDE] = true, +[0x0EDF] = true, +[0x0F00] = true, +[0x0F01] = true, +[0x0F04] = true, +[0x0F05] = true, +[0x0F06] = true, +[0x0F07] = true, +[0x0F08] = true, +[0x0F09] = true, +[0x0F0A] = true, +[0x0F0B] = true, +[0x0F0C] = true, +[0x0F0D] = true, +[0x0F0E] = true, +[0x0F0F] = true, +[0x0F10] = true, +[0x0F11] = true, +[0x0F12] = true, +[0x0F13] = true, +[0x0F14] = true, +[0x0F15] = true, +[0x0F19] = true, +[0x0F1A] = true, +[0x0F1B] = true, +[0x0F1C] = true, +[0x0F1D] = true, +[0x0F1E] = true, +[0x0F1F] = true, +[0x0F20] = true, +[0x0F21] = true, +[0x0F22] = true, +[0x0F23] = true, +[0x0F24] = true, +[0x0F25] = true, +[0x0F26] = true, +[0x0F27] = true, +[0x0F28] = true, +[0x0F29] = true, +[0x0F2A] = true, +[0x0F2B] = true, +[0x0F2C] = true, +[0x0F2D] = true, +[0x0F2E] = true, +[0x0F2F] = true, +[0x0F30] = true, +[0x0F31] = true, +[0x0F32] = true, +[0x0F33] = true, +[0x0F34] = true, +[0x0F35] = true, +[0x0F36] = true, +[0x0F37] = true, +[0x0F38] = true, +[0x0F39] = true, +[0x0F3C] = true, +[0x0F3D] = true, +[0x0F3E] = true, +[0x0F3F] = true, +[0x0F40] = true, +[0x0F41] = true, +[0x0F42] = true, +[0x0F43] = true, +[0x0F44] = true, +[0x0F45] = true, +[0x0F46] = true, +[0x0F47] = true, +[0x0F49] = true, +[0x0F4A] = true, +[0x0F4B] = true, +[0x0F4C] = true, +[0x0F4D] = true, +[0x0F4E] = true, +[0x0F4F] = true, +[0x0F50] = true, +[0x0F51] = true, +[0x0F52] = true, +[0x0F53] = true, +[0x0F54] = true, +[0x0F55] = true, +[0x0F56] = true, +[0x0F57] = true, +[0x0F58] = true, +[0x0F59] = true, +[0x0F5A] = true, +[0x0F5B] = true, +[0x0F5C] = true, +[0x0F5D] = true, +[0x0F5E] = true, +[0x0F5F] = true, +[0x0F60] = true, +[0x0F61] = true, +[0x0F62] = true, +[0x0F63] = true, +[0x0F64] = true, +[0x0F65] = true, +[0x0F66] = true, +[0x0F67] = true, +[0x0F68] = true, +[0x0F69] = true, +[0x0F6A] = true, +[0x0F6B] = true, +[0x0F6C] = true, +[0x0F71] = true, +[0x0F72] = true, +[0x0F73] = true, +[0x0F74] = true, +[0x0F75] = true, +[0x0F76] = true, +[0x0F77] = true, +[0x0F78] = true, +[0x0F79] = true, +[0x0F7A] = true, +[0x0F7B] = true, +[0x0F7C] = true, +[0x0F7D] = true, +[0x0F7E] = true, +[0x0F7F] = true, +[0x0F80] = true, +[0x0F81] = true, +[0x0F82] = true, +[0x0F83] = true, +[0x0F84] = true, +[0x0F85] = true, +[0x0F86] = true, +[0x0F87] = true, +[0x0F89] = true, +[0x0F8A] = true, +[0x0F8B] = true, +[0x0F8C] = true, +[0x0F8D] = true, +[0x0F8E] = true, +[0x0F8F] = true, +[0x0F90] = true, +[0x0F91] = true, +[0x0F92] = true, +[0x0F93] = true, +[0x0F94] = true, +[0x0F95] = true, +[0x0F96] = true, +[0x0F97] = true, +[0x0F99] = true, +[0x0F9A] = true, +[0x0F9B] = true, +[0x0F9C] = true, +[0x0F9D] = true, +[0x0F9E] = true, +[0x0F9F] = true, +[0x0FA0] = true, +[0x0FA1] = true, +[0x0FA2] = true, +[0x0FA3] = true, +[0x0FA4] = true, +[0x0FA5] = true, +[0x0FA6] = true, +[0x0FA7] = true, +[0x0FA8] = true, +[0x0FA9] = true, +[0x0FAA] = true, +[0x0FAB] = true, +[0x0FAC] = true, +[0x0FAD] = true, +[0x0FAE] = true, +[0x0FAF] = true, +[0x0FB0] = true, +[0x0FB1] = true, +[0x0FB2] = true, +[0x0FB3] = true, +[0x0FB4] = true, +[0x0FB5] = true, +[0x0FB6] = true, +[0x0FB7] = true, +[0x0FB8] = true, +[0x0FB9] = true, +[0x0FBA] = true, +[0x0FBB] = true, +[0x0FBC] = true, +[0x0FBE] = true, +[0x0FBF] = true, +[0x0FC0] = true, +[0x0FC1] = true, +[0x0FC2] = true, +[0x0FC3] = true, +[0x0FC4] = true, +[0x0FCE] = true, +[0x0FCF] = true, +[0x0FD1] = true, +[0x0FD2] = true, +[0x0FD3] = true, +[0x0FD4] = true, +[0x10A0] = true, +[0x10A1] = true, +[0x10A2] = true, +[0x10A3] = true, +[0x10A4] = true, +[0x10A5] = true, +[0x10A6] = true, +[0x10A7] = true, +[0x10A8] = true, +[0x10A9] = true, +[0x10AA] = true, +[0x10AB] = true, +[0x10AC] = true, +[0x10AD] = true, +[0x10AE] = true, +[0x10AF] = true, +[0x10B0] = true, +[0x10B1] = true, +[0x10B2] = true, +[0x10B3] = true, +[0x10B4] = true, +[0x10B5] = true, +[0x10B6] = true, +[0x10B7] = true, +[0x10B8] = true, +[0x10B9] = true, +[0x10BA] = true, +[0x10BB] = true, +[0x10BC] = true, +[0x10BD] = true, +[0x10BE] = true, +[0x10BF] = true, +[0x10C0] = true, +[0x10C1] = true, +[0x10C2] = true, +[0x10C3] = true, +[0x10C4] = true, +[0x10C5] = true, +[0x10C7] = true, +[0x10CD] = true, +[0x10D0] = true, +[0x10D1] = true, +[0x10D2] = true, +[0x10D3] = true, +[0x10D4] = true, +[0x10D5] = true, +[0x10D6] = true, +[0x10D7] = true, +[0x10D8] = true, +[0x10D9] = true, +[0x10DA] = true, +[0x10DB] = true, +[0x10DC] = true, +[0x10DD] = true, +[0x10DE] = true, +[0x10DF] = true, +[0x10E0] = true, +[0x10E1] = true, +[0x10E2] = true, +[0x10E3] = true, +[0x10E4] = true, +[0x10E5] = true, +[0x10E6] = true, +[0x10E7] = true, +[0x10E8] = true, +[0x10E9] = true, +[0x10EA] = true, +[0x10EB] = true, +[0x10EC] = true, +[0x10ED] = true, +[0x10EE] = true, +[0x10EF] = true, +[0x10F0] = true, +[0x10F1] = true, +[0x10F2] = true, +[0x10F3] = true, +[0x10F4] = true, +[0x10F5] = true, +[0x10F6] = true, +[0x10F7] = true, +[0x10F8] = true, +[0x10F9] = true, +[0x10FA] = true, +[0x10FB] = true, +[0x10FC] = true, +[0x10FD] = true, +[0x10FE] = true, +[0x10FF] = true, +[0x1343] = true, +[0x1361] = true, +[0x1390] = true, +[0x1391] = true, +[0x1392] = true, +[0x1393] = true, +[0x1394] = true, +[0x1396] = true, +[0x1399] = true, +[0x13A0] = true, +[0x13A1] = true, +[0x13A2] = true, +[0x13A3] = true, +[0x13A4] = true, +[0x13A5] = true, +[0x13A6] = true, +[0x13A7] = true, +[0x13A8] = true, +[0x13A9] = true, +[0x13AA] = true, +[0x13AB] = true, +[0x13AC] = true, +[0x13AD] = true, +[0x13AE] = true, +[0x13AF] = true, +[0x13B0] = true, +[0x13B1] = true, +[0x13B2] = true, +[0x13B3] = true, +[0x13B4] = true, +[0x13B5] = true, +[0x13B6] = true, +[0x13B7] = true, +[0x13B8] = true, +[0x13B9] = true, +[0x13BA] = true, +[0x13BB] = true, +[0x13BC] = true, +[0x13BD] = true, +[0x13BE] = true, +[0x13BF] = true, +[0x13C0] = true, +[0x13C1] = true, +[0x13C2] = true, +[0x13C3] = true, +[0x13C4] = true, +[0x13C5] = true, +[0x13C6] = true, +[0x13C7] = true, +[0x13C8] = true, +[0x13C9] = true, +[0x13CA] = true, +[0x13CB] = true, +[0x13CC] = true, +[0x13CD] = true, +[0x13CE] = true, +[0x13CF] = true, +[0x13D0] = true, +[0x13D1] = true, +[0x13D2] = true, +[0x13D3] = true, +[0x13D4] = true, +[0x13D5] = true, +[0x13D6] = true, +[0x13D7] = true, +[0x13D8] = true, +[0x13D9] = true, +[0x13DA] = true, +[0x13DB] = true, +[0x13DC] = true, +[0x13DD] = true, +[0x13DE] = true, +[0x13DF] = true, +[0x13E0] = true, +[0x13E1] = true, +[0x13E2] = true, +[0x13E3] = true, +[0x13E4] = true, +[0x13E5] = true, +[0x13E6] = true, +[0x13E7] = true, +[0x13E8] = true, +[0x13E9] = true, +[0x13EA] = true, +[0x13EB] = true, +[0x13EC] = true, +[0x13ED] = true, +[0x13EE] = true, +[0x13EF] = true, +[0x13F0] = true, +[0x13F1] = true, +[0x13F2] = true, +[0x13F3] = true, +[0x13F4] = true, +[0x13F5] = true, +[0x13F8] = true, +[0x13F9] = true, +[0x13FA] = true, +[0x13FB] = true, +[0x13FC] = true, +[0x13FD] = true, +[0x1400] = true, +[0x141E] = true, +[0x141F] = true, +[0x1420] = true, +[0x1421] = true, +[0x1422] = true, +[0x1423] = true, +[0x1424] = true, +[0x1425] = true, +[0x1426] = true, +[0x1427] = true, +[0x1428] = true, +[0x1429] = true, +[0x142A] = true, +[0x1433] = true, +[0x1434] = true, +[0x1435] = true, +[0x1436] = true, +[0x1437] = true, +[0x1438] = true, +[0x1439] = true, +[0x1449] = true, +[0x144A] = true, +[0x144B] = true, +[0x1466] = true, +[0x146B] = true, +[0x146C] = true, +[0x146D] = true, +[0x146E] = true, +[0x146F] = true, +[0x1470] = true, +[0x1471] = true, +[0x1472] = true, +[0x1473] = true, +[0x1474] = true, +[0x1475] = true, +[0x1476] = true, +[0x1477] = true, +[0x1478] = true, +[0x1479] = true, +[0x147A] = true, +[0x147B] = true, +[0x147C] = true, +[0x147D] = true, +[0x147E] = true, +[0x147F] = true, +[0x1480] = true, +[0x1481] = true, +[0x1482] = true, +[0x1483] = true, +[0x1484] = true, +[0x1485] = true, +[0x1486] = true, +[0x1487] = true, +[0x1488] = true, +[0x1489] = true, +[0x148A] = true, +[0x148B] = true, +[0x148C] = true, +[0x148D] = true, +[0x148E] = true, +[0x148F] = true, +[0x1490] = true, +[0x1491] = true, +[0x1492] = true, +[0x1493] = true, +[0x1494] = true, +[0x1495] = true, +[0x1496] = true, +[0x1497] = true, +[0x1498] = true, +[0x1499] = true, +[0x149A] = true, +[0x149B] = true, +[0x149C] = true, +[0x149D] = true, +[0x149E] = true, +[0x149F] = true, +[0x14A0] = true, +[0x14A1] = true, +[0x14A2] = true, +[0x14A3] = true, +[0x14A4] = true, +[0x14A5] = true, +[0x14A6] = true, +[0x14A7] = true, +[0x14A8] = true, +[0x14A9] = true, +[0x14AA] = true, +[0x14AB] = true, +[0x14AC] = true, +[0x14AD] = true, +[0x14AE] = true, +[0x14AF] = true, +[0x14B0] = true, +[0x14B1] = true, +[0x14B2] = true, +[0x14B3] = true, +[0x14B4] = true, +[0x14B5] = true, +[0x14B6] = true, +[0x14B7] = true, +[0x14B8] = true, +[0x14B9] = true, +[0x14BA] = true, +[0x14BB] = true, +[0x14BC] = true, +[0x14BD] = true, +[0x14BE] = true, +[0x14BF] = true, +[0x14D0] = true, +[0x14D1] = true, +[0x14D2] = true, +[0x14EA] = true, +[0x14EB] = true, +[0x14EC] = true, +[0x14ED] = true, +[0x14EE] = true, +[0x14EF] = true, +[0x14F0] = true, +[0x14F1] = true, +[0x14F2] = true, +[0x14F3] = true, +[0x14F4] = true, +[0x14F5] = true, +[0x14F6] = true, +[0x14F7] = true, +[0x14F8] = true, +[0x14F9] = true, +[0x14FA] = true, +[0x14FB] = true, +[0x14FC] = true, +[0x14FD] = true, +[0x14FE] = true, +[0x14FF] = true, +[0x1500] = true, +[0x1501] = true, +[0x1502] = true, +[0x1503] = true, +[0x1504] = true, +[0x1505] = true, +[0x1506] = true, +[0x1507] = true, +[0x1508] = true, +[0x1509] = true, +[0x150A] = true, +[0x150B] = true, +[0x1525] = true, +[0x1526] = true, +[0x1527] = true, +[0x1528] = true, +[0x1529] = true, +[0x152A] = true, +[0x152B] = true, +[0x152C] = true, +[0x152D] = true, +[0x152E] = true, +[0x152F] = true, +[0x1530] = true, +[0x1531] = true, +[0x1532] = true, +[0x1533] = true, +[0x1534] = true, +[0x1535] = true, +[0x1536] = true, +[0x1537] = true, +[0x1538] = true, +[0x1539] = true, +[0x153A] = true, +[0x153B] = true, +[0x153C] = true, +[0x153D] = true, +[0x153E] = true, +[0x153F] = true, +[0x1540] = true, +[0x1541] = true, +[0x1548] = true, +[0x1549] = true, +[0x154A] = true, +[0x154B] = true, +[0x154C] = true, +[0x154D] = true, +[0x154E] = true, +[0x154F] = true, +[0x1550] = true, +[0x1551] = true, +[0x1552] = true, +[0x155D] = true, +[0x156A] = true, +[0x157B] = true, +[0x157C] = true, +[0x157D] = true, +[0x1586] = true, +[0x1587] = true, +[0x1588] = true, +[0x1589] = true, +[0x1597] = true, +[0x1598] = true, +[0x1599] = true, +[0x159A] = true, +[0x159F] = true, +[0x15A6] = true, +[0x15A7] = true, +[0x15A8] = true, +[0x15A9] = true, +[0x15AA] = true, +[0x15AB] = true, +[0x15AC] = true, +[0x15AD] = true, +[0x15AE] = true, +[0x15AF] = true, +[0x15B0] = true, +[0x15B1] = true, +[0x15B2] = true, +[0x15B3] = true, +[0x15B4] = true, +[0x15B5] = true, +[0x15B6] = true, +[0x15B7] = true, +[0x15EE] = true, +[0x1601] = true, +[0x1646] = true, +[0x1647] = true, +[0x165A] = true, +[0x166D] = true, +[0x166E] = true, +[0x1677] = true, +[0x1678] = true, +[0x1679] = true, +[0x167A] = true, +[0x167B] = true, +[0x167C] = true, +[0x167D] = true, +[0x167E] = true, +[0x167F] = true, +[0x16A0] = true, +[0x16A1] = true, +[0x16A2] = true, +[0x16A3] = true, +[0x16A4] = true, +[0x16A5] = true, +[0x16A6] = true, +[0x16A7] = true, +[0x16A8] = true, +[0x16A9] = true, +[0x16AA] = true, +[0x16AB] = true, +[0x16AC] = true, +[0x16AD] = true, +[0x16AE] = true, +[0x16AF] = true, +[0x16B0] = true, +[0x16B1] = true, +[0x16B2] = true, +[0x16B3] = true, +[0x16B4] = true, +[0x16B5] = true, +[0x16B6] = true, +[0x16B7] = true, +[0x16B8] = true, +[0x16B9] = true, +[0x16BA] = true, +[0x16BB] = true, +[0x16BC] = true, +[0x16BD] = true, +[0x16BE] = true, +[0x16BF] = true, +[0x16C0] = true, +[0x16C1] = true, +[0x16C2] = true, +[0x16C3] = true, +[0x16C4] = true, +[0x16C5] = true, +[0x16C6] = true, +[0x16C7] = true, +[0x16C8] = true, +[0x16C9] = true, +[0x16CA] = true, +[0x16CB] = true, +[0x16CC] = true, +[0x16CD] = true, +[0x16CE] = true, +[0x16CF] = true, +[0x16D0] = true, +[0x16D1] = true, +[0x16D2] = true, +[0x16D3] = true, +[0x16D4] = true, +[0x16D5] = true, +[0x16D6] = true, +[0x16D7] = true, +[0x16D8] = true, +[0x16D9] = true, +[0x16DA] = true, +[0x16DB] = true, +[0x16DC] = true, +[0x16DD] = true, +[0x16DE] = true, +[0x16DF] = true, +[0x16E1] = true, +[0x16E3] = true, +[0x16E4] = true, +[0x16E5] = true, +[0x16E6] = true, +[0x16E7] = true, +[0x16E8] = true, +[0x16E9] = true, +[0x16EA] = true, +[0x16EB] = true, +[0x16EC] = true, +[0x16ED] = true, +[0x16EE] = true, +[0x16EF] = true, +[0x16F0] = true, +[0x16F1] = true, +[0x16F2] = true, +[0x16F3] = true, +[0x16F4] = true, +[0x16F5] = true, +[0x16F6] = true, +[0x16F7] = true, +[0x16F8] = true, +[0x1762] = true, +[0x17BB] = true, +[0x17CB] = true, +[0x17D6] = true, +[0x17DC] = true, +[0x17F0] = true, +[0x17F1] = true, +[0x17F2] = true, +[0x17F3] = true, +[0x17F4] = true, +[0x17F5] = true, +[0x17F6] = true, +[0x17F7] = true, +[0x17F8] = true, +[0x17F9] = true, +[0x18B4] = true, +[0x18B5] = true, +[0x18B6] = true, +[0x18B8] = true, +[0x18B9] = true, +[0x18BA] = true, +[0x18BE] = true, +[0x18BF] = true, +[0x18C3] = true, +[0x18C4] = true, +[0x18C5] = true, +[0x18D4] = true, +[0x18D5] = true, +[0x18D6] = true, +[0x18D7] = true, +[0x18D8] = true, +[0x18D9] = true, +[0x18DA] = true, +[0x18DB] = true, +[0x18DC] = true, +[0x18DD] = true, +[0x18DE] = true, +[0x18DF] = true, +[0x18E9] = true, +[0x18EB] = true, +[0x18F3] = true, +[0x18F4] = true, +[0x18F5] = true, +[0x1950] = true, +[0x1951] = true, +[0x1952] = true, +[0x1953] = true, +[0x1954] = true, +[0x1955] = true, +[0x1956] = true, +[0x1957] = true, +[0x1958] = true, +[0x1959] = true, +[0x195A] = true, +[0x195B] = true, +[0x195C] = true, +[0x195D] = true, +[0x195E] = true, +[0x195F] = true, +[0x1960] = true, +[0x1961] = true, +[0x1962] = true, +[0x1963] = true, +[0x1964] = true, +[0x1965] = true, +[0x1966] = true, +[0x1967] = true, +[0x1968] = true, +[0x1969] = true, +[0x196A] = true, +[0x196B] = true, +[0x196C] = true, +[0x196D] = true, +[0x1970] = true, +[0x1971] = true, +[0x1972] = true, +[0x1973] = true, +[0x1974] = true, +[0x1983] = true, +[0x198F] = true, +[0x1991] = true, +[0x199A] = true, +[0x199E] = true, +[0x19A1] = true, +[0x19A3] = true, +[0x19A4] = true, +[0x19A7] = true, +[0x19B0] = true, +[0x19B1] = true, +[0x19B2] = true, +[0x19B3] = true, +[0x19B7] = true, +[0x19B8] = true, +[0x19B9] = true, +[0x19BA] = true, +[0x19C1] = true, +[0x19C6] = true, +[0x19C8] = true, +[0x19C9] = true, +[0x19D0] = true, +[0x19D1] = true, +[0x19D2] = true, +[0x19D3] = true, +[0x19D4] = true, +[0x19D6] = true, +[0x19D8] = true, +[0x19D9] = true, +[0x1AB0] = true, +[0x1AB1] = true, +[0x1AB2] = true, +[0x1AB3] = true, +[0x1AB4] = true, +[0x1AB5] = true, +[0x1AB6] = true, +[0x1AB7] = true, +[0x1AB8] = true, +[0x1AB9] = true, +[0x1ABA] = true, +[0x1ABB] = true, +[0x1ABC] = true, +[0x1ABD] = true, +[0x1ABE] = true, +[0x1ABF] = true, +[0x1AC0] = true, +[0x1AC1] = true, +[0x1AC2] = true, +[0x1AC3] = true, +[0x1AC4] = true, +[0x1AC5] = true, +[0x1AC6] = true, +[0x1AC7] = true, +[0x1AC8] = true, +[0x1AC9] = true, +[0x1ACA] = true, +[0x1ACB] = true, +[0x1ACC] = true, +[0x1ACD] = true, +[0x1ACE] = true, +[0x1C50] = true, +[0x1C51] = true, +[0x1C52] = true, +[0x1C53] = true, +[0x1C54] = true, +[0x1C55] = true, +[0x1C56] = true, +[0x1C57] = true, +[0x1C58] = true, +[0x1C59] = true, +[0x1C5A] = true, +[0x1C5B] = true, +[0x1C5C] = true, +[0x1C5D] = true, +[0x1C5E] = true, +[0x1C5F] = true, +[0x1C60] = true, +[0x1C61] = true, +[0x1C62] = true, +[0x1C63] = true, +[0x1C64] = true, +[0x1C65] = true, +[0x1C66] = true, +[0x1C67] = true, +[0x1C68] = true, +[0x1C69] = true, +[0x1C6A] = true, +[0x1C6B] = true, +[0x1C6C] = true, +[0x1C6D] = true, +[0x1C6E] = true, +[0x1C6F] = true, +[0x1C70] = true, +[0x1C71] = true, +[0x1C72] = true, +[0x1C73] = true, +[0x1C74] = true, +[0x1C75] = true, +[0x1C76] = true, +[0x1C77] = true, +[0x1C78] = true, +[0x1C79] = true, +[0x1C7A] = true, +[0x1C7B] = true, +[0x1C7C] = true, +[0x1C7D] = true, +[0x1C7E] = true, +[0x1C7F] = true, +[0x1C80] = true, +[0x1C81] = true, +[0x1C82] = true, +[0x1C83] = true, +[0x1C84] = true, +[0x1C85] = true, +[0x1C86] = true, +[0x1C87] = true, +[0x1C88] = true, +[0x1C90] = true, +[0x1C91] = true, +[0x1C92] = true, +[0x1C93] = true, +[0x1C94] = true, +[0x1C95] = true, +[0x1C96] = true, +[0x1C97] = true, +[0x1C98] = true, +[0x1C99] = true, +[0x1C9A] = true, +[0x1C9B] = true, +[0x1C9C] = true, +[0x1C9D] = true, +[0x1C9E] = true, +[0x1C9F] = true, +[0x1CA0] = true, +[0x1CA1] = true, +[0x1CA2] = true, +[0x1CA3] = true, +[0x1CA4] = true, +[0x1CA5] = true, +[0x1CA6] = true, +[0x1CA7] = true, +[0x1CA8] = true, +[0x1CA9] = true, +[0x1CAA] = true, +[0x1CAB] = true, +[0x1CAC] = true, +[0x1CAD] = true, +[0x1CAE] = true, +[0x1CAF] = true, +[0x1CB0] = true, +[0x1CB1] = true, +[0x1CB2] = true, +[0x1CB3] = true, +[0x1CB4] = true, +[0x1CB5] = true, +[0x1CB6] = true, +[0x1CB7] = true, +[0x1CB8] = true, +[0x1CB9] = true, +[0x1CBA] = true, +[0x1CBD] = true, +[0x1CBE] = true, +[0x1CBF] = true, +[0x1D00] = true, +[0x1D01] = true, +[0x1D02] = true, +[0x1D03] = true, +[0x1D04] = true, +[0x1D05] = true, +[0x1D06] = true, +[0x1D07] = true, +[0x1D08] = true, +[0x1D09] = true, +[0x1D0A] = true, +[0x1D0B] = true, +[0x1D0C] = true, +[0x1D0D] = true, +[0x1D0E] = true, +[0x1D0F] = true, +[0x1D10] = true, +[0x1D11] = true, +[0x1D12] = true, +[0x1D13] = true, +[0x1D14] = true, +[0x1D15] = true, +[0x1D16] = true, +[0x1D17] = true, +[0x1D18] = true, +[0x1D19] = true, +[0x1D1A] = true, +[0x1D1B] = true, +[0x1D1C] = true, +[0x1D1D] = true, +[0x1D1E] = true, +[0x1D1F] = true, +[0x1D20] = true, +[0x1D21] = true, +[0x1D22] = true, +[0x1D23] = true, +[0x1D24] = true, +[0x1D25] = true, +[0x1D26] = true, +[0x1D27] = true, +[0x1D28] = true, +[0x1D29] = true, +[0x1D2A] = true, +[0x1D2B] = true, +[0x1D2C] = true, +[0x1D2D] = true, +[0x1D2E] = true, +[0x1D2F] = true, +[0x1D30] = true, +[0x1D31] = true, +[0x1D32] = true, +[0x1D33] = true, +[0x1D34] = true, +[0x1D35] = true, +[0x1D36] = true, +[0x1D37] = true, +[0x1D38] = true, +[0x1D39] = true, +[0x1D3A] = true, +[0x1D3B] = true, +[0x1D3C] = true, +[0x1D3D] = true, +[0x1D3E] = true, +[0x1D3F] = true, +[0x1D40] = true, +[0x1D41] = true, +[0x1D42] = true, +[0x1D43] = true, +[0x1D44] = true, +[0x1D45] = true, +[0x1D46] = true, +[0x1D47] = true, +[0x1D48] = true, +[0x1D49] = true, +[0x1D4A] = true, +[0x1D4B] = true, +[0x1D4C] = true, +[0x1D4D] = true, +[0x1D4E] = true, +[0x1D4F] = true, +[0x1D50] = true, +[0x1D51] = true, +[0x1D52] = true, +[0x1D53] = true, +[0x1D54] = true, +[0x1D55] = true, +[0x1D56] = true, +[0x1D57] = true, +[0x1D58] = true, +[0x1D59] = true, +[0x1D5A] = true, +[0x1D5B] = true, +[0x1D5C] = true, +[0x1D5D] = true, +[0x1D5E] = true, +[0x1D5F] = true, +[0x1D60] = true, +[0x1D61] = true, +[0x1D62] = true, +[0x1D63] = true, +[0x1D64] = true, +[0x1D65] = true, +[0x1D66] = true, +[0x1D67] = true, +[0x1D68] = true, +[0x1D69] = true, +[0x1D6A] = true, +[0x1D6B] = true, +[0x1D6C] = true, +[0x1D6D] = true, +[0x1D6E] = true, +[0x1D6F] = true, +[0x1D70] = true, +[0x1D71] = true, +[0x1D72] = true, +[0x1D73] = true, +[0x1D74] = true, +[0x1D75] = true, +[0x1D76] = true, +[0x1D77] = true, +[0x1D78] = true, +[0x1D79] = true, +[0x1D7B] = true, +[0x1D7C] = true, +[0x1D7D] = true, +[0x1D7E] = true, +[0x1D7F] = true, +[0x1D80] = true, +[0x1D81] = true, +[0x1D82] = true, +[0x1D83] = true, +[0x1D84] = true, +[0x1D85] = true, +[0x1D86] = true, +[0x1D87] = true, +[0x1D88] = true, +[0x1D89] = true, +[0x1D8A] = true, +[0x1D8B] = true, +[0x1D8C] = true, +[0x1D8D] = true, +[0x1D8E] = true, +[0x1D8F] = true, +[0x1D90] = true, +[0x1D91] = true, +[0x1D92] = true, +[0x1D93] = true, +[0x1D94] = true, +[0x1D95] = true, +[0x1D96] = true, +[0x1D97] = true, +[0x1D98] = true, +[0x1D99] = true, +[0x1D9A] = true, +[0x1D9B] = true, +[0x1D9C] = true, +[0x1D9D] = true, +[0x1D9E] = true, +[0x1D9F] = true, +[0x1DA0] = true, +[0x1DA1] = true, +[0x1DA2] = true, +[0x1DA3] = true, +[0x1DA4] = true, +[0x1DA5] = true, +[0x1DA6] = true, +[0x1DA7] = true, +[0x1DA8] = true, +[0x1DA9] = true, +[0x1DAA] = true, +[0x1DAB] = true, +[0x1DAC] = true, +[0x1DAD] = true, +[0x1DAE] = true, +[0x1DAF] = true, +[0x1DB0] = true, +[0x1DB1] = true, +[0x1DB2] = true, +[0x1DB3] = true, +[0x1DB4] = true, +[0x1DB5] = true, +[0x1DB6] = true, +[0x1DB7] = true, +[0x1DB8] = true, +[0x1DB9] = true, +[0x1DBA] = true, +[0x1DBB] = true, +[0x1DBC] = true, +[0x1DBD] = true, +[0x1DBE] = true, +[0x1DBF] = true, +[0x1DC0] = true, +[0x1DC1] = true, +[0x1DC2] = true, +[0x1DC3] = true, +[0x1DC4] = true, +[0x1DC5] = true, +[0x1DC6] = true, +[0x1DC7] = true, +[0x1DC8] = true, +[0x1DC9] = true, +[0x1DCA] = true, +[0x1DCB] = true, +[0x1DCC] = true, +[0x1DCE] = true, +[0x1DCF] = true, +[0x1DD0] = true, +[0x1DD1] = true, +[0x1DD2] = true, +[0x1DD3] = true, +[0x1DD4] = true, +[0x1DD5] = true, +[0x1DD6] = true, +[0x1DD7] = true, +[0x1DD8] = true, +[0x1DD9] = true, +[0x1DDA] = true, +[0x1DDB] = true, +[0x1DDC] = true, +[0x1DDD] = true, +[0x1DDE] = true, +[0x1DDF] = true, +[0x1DE0] = true, +[0x1DE1] = true, +[0x1DE2] = true, +[0x1DE3] = true, +[0x1DE4] = true, +[0x1DE5] = true, +[0x1DE6] = true, +[0x1DE7] = true, +[0x1DE8] = true, +[0x1DE9] = true, +[0x1DEA] = true, +[0x1DEB] = true, +[0x1DEC] = true, +[0x1DED] = true, +[0x1DEE] = true, +[0x1DEF] = true, +[0x1DF0] = true, +[0x1DF1] = true, +[0x1DF2] = true, +[0x1DF3] = true, +[0x1DF4] = true, +[0x1DF5] = true, +[0x1DF6] = true, +[0x1DF7] = true, +[0x1DF8] = true, +[0x1DF9] = true, +[0x1DFA] = true, +[0x1DFB] = true, +[0x1DFD] = true, +[0x1DFE] = true, +[0x1DFF] = true, +[0x1E00] = true, +[0x1E01] = true, +[0x1E02] = true, +[0x1E03] = true, +[0x1E04] = true, +[0x1E05] = true, +[0x1E06] = true, +[0x1E07] = true, +[0x1E08] = true, +[0x1E09] = true, +[0x1E0A] = true, +[0x1E0B] = true, +[0x1E0C] = true, +[0x1E0D] = true, +[0x1E0E] = true, +[0x1E0F] = true, +[0x1E10] = true, +[0x1E11] = true, +[0x1E12] = true, +[0x1E13] = true, +[0x1E14] = true, +[0x1E15] = true, +[0x1E16] = true, +[0x1E17] = true, +[0x1E18] = true, +[0x1E19] = true, +[0x1E1A] = true, +[0x1E1B] = true, +[0x1E1C] = true, +[0x1E1D] = true, +[0x1E1E] = true, +[0x1E1F] = true, +[0x1E20] = true, +[0x1E21] = true, +[0x1E22] = true, +[0x1E23] = true, +[0x1E24] = true, +[0x1E25] = true, +[0x1E26] = true, +[0x1E27] = true, +[0x1E28] = true, +[0x1E29] = true, +[0x1E2A] = true, +[0x1E2B] = true, +[0x1E2C] = true, +[0x1E2D] = true, +[0x1E2E] = true, +[0x1E2F] = true, +[0x1E30] = true, +[0x1E31] = true, +[0x1E32] = true, +[0x1E33] = true, +[0x1E34] = true, +[0x1E35] = true, +[0x1E36] = true, +[0x1E37] = true, +[0x1E38] = true, +[0x1E39] = true, +[0x1E3A] = true, +[0x1E3B] = true, +[0x1E3C] = true, +[0x1E3D] = true, +[0x1E3E] = true, +[0x1E3F] = true, +[0x1E40] = true, +[0x1E41] = true, +[0x1E42] = true, +[0x1E43] = true, +[0x1E44] = true, +[0x1E45] = true, +[0x1E46] = true, +[0x1E47] = true, +[0x1E48] = true, +[0x1E49] = true, +[0x1E4A] = true, +[0x1E4B] = true, +[0x1E4C] = true, +[0x1E4D] = true, +[0x1E4E] = true, +[0x1E4F] = true, +[0x1E50] = true, +[0x1E51] = true, +[0x1E52] = true, +[0x1E53] = true, +[0x1E54] = true, +[0x1E55] = true, +[0x1E56] = true, +[0x1E57] = true, +[0x1E58] = true, +[0x1E59] = true, +[0x1E5A] = true, +[0x1E5B] = true, +[0x1E5C] = true, +[0x1E5D] = true, +[0x1E5E] = true, +[0x1E5F] = true, +[0x1E60] = true, +[0x1E61] = true, +[0x1E62] = true, +[0x1E63] = true, +[0x1E64] = true, +[0x1E65] = true, +[0x1E66] = true, +[0x1E67] = true, +[0x1E68] = true, +[0x1E69] = true, +[0x1E6A] = true, +[0x1E6B] = true, +[0x1E6C] = true, +[0x1E6D] = true, +[0x1E6E] = true, +[0x1E6F] = true, +[0x1E70] = true, +[0x1E71] = true, +[0x1E72] = true, +[0x1E73] = true, +[0x1E74] = true, +[0x1E75] = true, +[0x1E76] = true, +[0x1E77] = true, +[0x1E78] = true, +[0x1E79] = true, +[0x1E7A] = true, +[0x1E7B] = true, +[0x1E7C] = true, +[0x1E7D] = true, +[0x1E7E] = true, +[0x1E7F] = true, +[0x1E80] = true, +[0x1E81] = true, +[0x1E82] = true, +[0x1E83] = true, +[0x1E84] = true, +[0x1E85] = true, +[0x1E86] = true, +[0x1E87] = true, +[0x1E88] = true, +[0x1E89] = true, +[0x1E8A] = true, +[0x1E8B] = true, +[0x1E8C] = true, +[0x1E8D] = true, +[0x1E8E] = true, +[0x1E8F] = true, +[0x1E90] = true, +[0x1E91] = true, +[0x1E92] = true, +[0x1E93] = true, +[0x1E94] = true, +[0x1E95] = true, +[0x1E96] = true, +[0x1E97] = true, +[0x1E98] = true, +[0x1E99] = true, +[0x1E9A] = true, +[0x1E9B] = true, +[0x1E9C] = true, +[0x1E9D] = true, +[0x1E9E] = true, +[0x1E9F] = true, +[0x1EA0] = true, +[0x1EA1] = true, +[0x1EA2] = true, +[0x1EA3] = true, +[0x1EA4] = true, +[0x1EA5] = true, +[0x1EA6] = true, +[0x1EA7] = true, +[0x1EA8] = true, +[0x1EA9] = true, +[0x1EAA] = true, +[0x1EAB] = true, +[0x1EAC] = true, +[0x1EAD] = true, +[0x1EAE] = true, +[0x1EAF] = true, +[0x1EB0] = true, +[0x1EB1] = true, +[0x1EB2] = true, +[0x1EB3] = true, +[0x1EB4] = true, +[0x1EB5] = true, +[0x1EB6] = true, +[0x1EB7] = true, +[0x1EB8] = true, +[0x1EB9] = true, +[0x1EBA] = true, +[0x1EBB] = true, +[0x1EBC] = true, +[0x1EBD] = true, +[0x1EBE] = true, +[0x1EBF] = true, +[0x1EC0] = true, +[0x1EC1] = true, +[0x1EC2] = true, +[0x1EC3] = true, +[0x1EC4] = true, +[0x1EC5] = true, +[0x1EC6] = true, +[0x1EC7] = true, +[0x1EC8] = true, +[0x1EC9] = true, +[0x1ECA] = true, +[0x1ECB] = true, +[0x1ECC] = true, +[0x1ECD] = true, +[0x1ECE] = true, +[0x1ECF] = true, +[0x1ED0] = true, +[0x1ED1] = true, +[0x1ED2] = true, +[0x1ED3] = true, +[0x1ED4] = true, +[0x1ED5] = true, +[0x1ED6] = true, +[0x1ED7] = true, +[0x1ED8] = true, +[0x1ED9] = true, +[0x1EDA] = true, +[0x1EDB] = true, +[0x1EDC] = true, +[0x1EDD] = true, +[0x1EDE] = true, +[0x1EDF] = true, +[0x1EE0] = true, +[0x1EE1] = true, +[0x1EE2] = true, +[0x1EE3] = true, +[0x1EE4] = true, +[0x1EE5] = true, +[0x1EE6] = true, +[0x1EE7] = true, +[0x1EE8] = true, +[0x1EE9] = true, +[0x1EEA] = true, +[0x1EEB] = true, +[0x1EEC] = true, +[0x1EED] = true, +[0x1EEE] = true, +[0x1EEF] = true, +[0x1EF0] = true, +[0x1EF1] = true, +[0x1EF2] = true, +[0x1EF3] = true, +[0x1EF4] = true, +[0x1EF5] = true, +[0x1EF6] = true, +[0x1EF7] = true, +[0x1EF8] = true, +[0x1EF9] = true, +[0x1EFA] = true, +[0x1EFB] = true, +[0x1EFC] = true, +[0x1EFD] = true, +[0x1EFE] = true, +[0x1EFF] = true, +[0x1F00] = true, +[0x1F01] = true, +[0x1F02] = true, +[0x1F03] = true, +[0x1F04] = true, +[0x1F05] = true, +[0x1F06] = true, +[0x1F07] = true, +[0x1F08] = true, +[0x1F09] = true, +[0x1F0A] = true, +[0x1F0B] = true, +[0x1F0C] = true, +[0x1F0D] = true, +[0x1F0E] = true, +[0x1F0F] = true, +[0x1F10] = true, +[0x1F11] = true, +[0x1F12] = true, +[0x1F13] = true, +[0x1F14] = true, +[0x1F15] = true, +[0x1F18] = true, +[0x1F19] = true, +[0x1F1A] = true, +[0x1F1B] = true, +[0x1F1C] = true, +[0x1F1D] = true, +[0x1F20] = true, +[0x1F21] = true, +[0x1F22] = true, +[0x1F23] = true, +[0x1F24] = true, +[0x1F25] = true, +[0x1F26] = true, +[0x1F27] = true, +[0x1F28] = true, +[0x1F29] = true, +[0x1F2A] = true, +[0x1F2B] = true, +[0x1F2C] = true, +[0x1F2D] = true, +[0x1F2E] = true, +[0x1F2F] = true, +[0x1F30] = true, +[0x1F31] = true, +[0x1F32] = true, +[0x1F33] = true, +[0x1F34] = true, +[0x1F35] = true, +[0x1F36] = true, +[0x1F37] = true, +[0x1F38] = true, +[0x1F39] = true, +[0x1F3A] = true, +[0x1F3B] = true, +[0x1F3C] = true, +[0x1F3D] = true, +[0x1F3E] = true, +[0x1F3F] = true, +[0x1F40] = true, +[0x1F41] = true, +[0x1F42] = true, +[0x1F43] = true, +[0x1F44] = true, +[0x1F45] = true, +[0x1F48] = true, +[0x1F49] = true, +[0x1F4A] = true, +[0x1F4B] = true, +[0x1F4C] = true, +[0x1F4D] = true, +[0x1F50] = true, +[0x1F51] = true, +[0x1F52] = true, +[0x1F53] = true, +[0x1F54] = true, +[0x1F55] = true, +[0x1F56] = true, +[0x1F57] = true, +[0x1F59] = true, +[0x1F5B] = true, +[0x1F5D] = true, +[0x1F5F] = true, +[0x1F60] = true, +[0x1F61] = true, +[0x1F62] = true, +[0x1F63] = true, +[0x1F64] = true, +[0x1F65] = true, +[0x1F66] = true, +[0x1F67] = true, +[0x1F68] = true, +[0x1F69] = true, +[0x1F6A] = true, +[0x1F6B] = true, +[0x1F6C] = true, +[0x1F6D] = true, +[0x1F6E] = true, +[0x1F6F] = true, +[0x1F70] = true, +[0x1F71] = true, +[0x1F72] = true, +[0x1F73] = true, +[0x1F74] = true, +[0x1F75] = true, +[0x1F76] = true, +[0x1F77] = true, +[0x1F78] = true, +[0x1F79] = true, +[0x1F7A] = true, +[0x1F7B] = true, +[0x1F7C] = true, +[0x1F7D] = true, +[0x1F80] = true, +[0x1F81] = true, +[0x1F82] = true, +[0x1F83] = true, +[0x1F84] = true, +[0x1F85] = true, +[0x1F86] = true, +[0x1F87] = true, +[0x1F88] = true, +[0x1F89] = true, +[0x1F8A] = true, +[0x1F8B] = true, +[0x1F8C] = true, +[0x1F8D] = true, +[0x1F8E] = true, +[0x1F8F] = true, +[0x1F90] = true, +[0x1F91] = true, +[0x1F92] = true, +[0x1F93] = true, +[0x1F94] = true, +[0x1F95] = true, +[0x1F96] = true, +[0x1F97] = true, +[0x1F98] = true, +[0x1F99] = true, +[0x1F9A] = true, +[0x1F9B] = true, +[0x1F9C] = true, +[0x1F9D] = true, +[0x1F9E] = true, +[0x1F9F] = true, +[0x1FA0] = true, +[0x1FA1] = true, +[0x1FA2] = true, +[0x1FA3] = true, +[0x1FA4] = true, +[0x1FA5] = true, +[0x1FA6] = true, +[0x1FA7] = true, +[0x1FA8] = true, +[0x1FA9] = true, +[0x1FAA] = true, +[0x1FAB] = true, +[0x1FAC] = true, +[0x1FAD] = true, +[0x1FAE] = true, +[0x1FAF] = true, +[0x1FB0] = true, +[0x1FB1] = true, +[0x1FB2] = true, +[0x1FB3] = true, +[0x1FB4] = true, +[0x1FB6] = true, +[0x1FB7] = true, +[0x1FB8] = true, +[0x1FB9] = true, +[0x1FBA] = true, +[0x1FBB] = true, +[0x1FBC] = true, +[0x1FBD] = true, +[0x1FBE] = true, +[0x1FBF] = true, +[0x1FC0] = true, +[0x1FC1] = true, +[0x1FC2] = true, +[0x1FC3] = true, +[0x1FC4] = true, +[0x1FC6] = true, +[0x1FC7] = true, +[0x1FC8] = true, +[0x1FC9] = true, +[0x1FCA] = true, +[0x1FCB] = true, +[0x1FCC] = true, +[0x1FCD] = true, +[0x1FCE] = true, +[0x1FCF] = true, +[0x1FD0] = true, +[0x1FD1] = true, +[0x1FD2] = true, +[0x1FD3] = true, +[0x1FD6] = true, +[0x1FD7] = true, +[0x1FD8] = true, +[0x1FD9] = true, +[0x1FDA] = true, +[0x1FDB] = true, +[0x1FDD] = true, +[0x1FDE] = true, +[0x1FDF] = true, +[0x1FE0] = true, +[0x1FE1] = true, +[0x1FE2] = true, +[0x1FE3] = true, +[0x1FE4] = true, +[0x1FE5] = true, +[0x1FE6] = true, +[0x1FE7] = true, +[0x1FE8] = true, +[0x1FE9] = true, +[0x1FEA] = true, +[0x1FEB] = true, +[0x1FEC] = true, +[0x1FED] = true, +[0x1FEE] = true, +[0x1FEF] = true, +[0x1FF2] = true, +[0x1FF3] = true, +[0x1FF4] = true, +[0x1FF6] = true, +[0x1FF7] = true, +[0x1FF8] = true, +[0x1FF9] = true, +[0x1FFA] = true, +[0x1FFB] = true, +[0x1FFC] = true, +[0x1FFD] = true, +[0x1FFE] = true, +[0x2000] = true, +[0x2001] = true, +[0x2002] = true, +[0x2003] = true, +[0x2004] = true, +[0x2005] = true, +[0x2006] = true, +[0x2007] = true, +[0x2008] = true, +[0x2009] = true, +[0x200A] = true, +[0x2010] = true, +[0x2011] = true, +[0x2012] = true, +[0x2013] = true, +[0x2014] = true, +[0x2015] = true, +[0x2016] = true, +[0x2017] = true, +[0x2018] = true, +[0x2019] = true, +[0x201A] = true, +[0x201B] = true, +[0x201C] = true, +[0x201D] = true, +[0x201E] = true, +[0x201F] = true, +[0x2020] = true, +[0x2021] = true, +[0x2022] = true, +[0x2023] = true, +[0x2024] = true, +[0x2025] = true, +[0x2026] = true, +[0x2027] = true, +[0x202F] = true, +[0x2030] = true, +[0x2031] = true, +[0x2032] = true, +[0x2033] = true, +[0x2034] = true, +[0x2035] = true, +[0x2036] = true, +[0x2037] = true, +[0x2038] = true, +[0x2039] = true, +[0x203A] = true, +[0x203B] = true, +[0x203C] = true, +[0x203D] = true, +[0x203E] = true, +[0x203F] = true, +[0x2040] = true, +[0x2041] = true, +[0x2042] = true, +[0x2043] = true, +[0x2044] = true, +[0x2045] = true, +[0x2046] = true, +[0x2047] = true, +[0x2048] = true, +[0x2049] = true, +[0x204A] = true, +[0x204B] = true, +[0x204C] = true, +[0x204D] = true, +[0x204E] = true, +[0x204F] = true, +[0x2050] = true, +[0x2051] = true, +[0x2052] = true, +[0x2053] = true, +[0x2054] = true, +[0x2055] = true, +[0x2056] = true, +[0x2058] = true, +[0x2059] = true, +[0x205A] = true, +[0x205B] = true, +[0x205C] = true, +[0x205D] = true, +[0x205E] = true, +[0x205F] = true, +[0x2070] = true, +[0x2071] = true, +[0x2074] = true, +[0x2075] = true, +[0x2076] = true, +[0x2077] = true, +[0x2078] = true, +[0x2079] = true, +[0x207A] = true, +[0x207B] = true, +[0x207C] = true, +[0x207D] = true, +[0x207E] = true, +[0x207F] = true, +[0x2080] = true, +[0x2081] = true, +[0x2082] = true, +[0x2083] = true, +[0x2084] = true, +[0x2085] = true, +[0x2086] = true, +[0x2087] = true, +[0x2088] = true, +[0x2089] = true, +[0x208A] = true, +[0x208B] = true, +[0x208C] = true, +[0x208D] = true, +[0x208E] = true, +[0x2090] = true, +[0x2091] = true, +[0x2092] = true, +[0x2093] = true, +[0x2094] = true, +[0x2095] = true, +[0x2096] = true, +[0x2097] = true, +[0x2098] = true, +[0x2099] = true, +[0x209A] = true, +[0x209B] = true, +[0x209C] = true, +[0x20A0] = true, +[0x20A1] = true, +[0x20A2] = true, +[0x20A3] = true, +[0x20A4] = true, +[0x20A5] = true, +[0x20A6] = true, +[0x20A7] = true, +[0x20A8] = true, +[0x20A9] = true, +[0x20AA] = true, +[0x20AB] = true, +[0x20AC] = true, +[0x20AD] = true, +[0x20AE] = true, +[0x20AF] = true, +[0x20B0] = true, +[0x20B1] = true, +[0x20B2] = true, +[0x20B3] = true, +[0x20B4] = true, +[0x20B5] = true, +[0x20B6] = true, +[0x20B7] = true, +[0x20B8] = true, +[0x20BA] = true, +[0x20BB] = true, +[0x20BC] = true, +[0x20BD] = true, +[0x20BE] = true, +[0x20BF] = true, +[0x20C0] = true, +[0x20D0] = true, +[0x20D1] = true, +[0x20D2] = true, +[0x20D3] = true, +[0x20D4] = true, +[0x20D5] = true, +[0x20D6] = true, +[0x20D7] = true, +[0x20D8] = true, +[0x20D9] = true, +[0x20DA] = true, +[0x20DB] = true, +[0x20DC] = true, +[0x20E1] = true, +[0x20E5] = true, +[0x20E6] = true, +[0x20E8] = true, +[0x20E9] = true, +[0x20EB] = true, +[0x20EC] = true, +[0x20ED] = true, +[0x20EE] = true, +[0x20EF] = true, +[0x20F0] = true, +[0x2100] = true, +[0x2101] = true, +[0x2102] = true, +[0x2103] = true, +[0x2104] = true, +[0x2105] = true, +[0x2106] = true, +[0x2107] = true, +[0x2108] = true, +[0x2109] = true, +[0x210A] = true, +[0x210B] = true, +[0x210C] = true, +[0x210D] = true, +[0x2110] = true, +[0x2111] = true, +[0x2112] = true, +[0x2113] = true, +[0x2114] = true, +[0x2115] = true, +[0x2116] = true, +[0x2117] = true, +[0x2118] = true, +[0x2119] = true, +[0x211A] = true, +[0x211B] = true, +[0x211C] = true, +[0x211D] = true, +[0x211E] = true, +[0x211F] = true, +[0x2120] = true, +[0x2121] = true, +[0x2122] = true, +[0x2123] = true, +[0x2124] = true, +[0x2125] = true, +[0x2126] = true, +[0x2127] = true, +[0x2128] = true, +[0x2129] = true, +[0x212A] = true, +[0x212B] = true, +[0x212C] = true, +[0x212D] = true, +[0x212F] = true, +[0x2130] = true, +[0x2131] = true, +[0x2132] = true, +[0x2133] = true, +[0x2134] = true, +[0x2135] = true, +[0x2136] = true, +[0x2137] = true, +[0x2138] = true, +[0x2139] = true, +[0x213E] = true, +[0x2141] = true, +[0x2142] = true, +[0x2143] = true, +[0x2144] = true, +[0x214A] = true, +[0x214B] = true, +[0x214D] = true, +[0x214E] = true, +[0x2150] = true, +[0x2151] = true, +[0x2152] = true, +[0x2153] = true, +[0x2154] = true, +[0x2155] = true, +[0x2156] = true, +[0x2157] = true, +[0x2158] = true, +[0x2159] = true, +[0x215A] = true, +[0x215B] = true, +[0x215C] = true, +[0x215D] = true, +[0x215E] = true, +[0x215F] = true, +[0x2160] = true, +[0x2161] = true, +[0x2162] = true, +[0x2163] = true, +[0x2164] = true, +[0x2165] = true, +[0x2166] = true, +[0x2167] = true, +[0x2168] = true, +[0x2169] = true, +[0x216A] = true, +[0x216B] = true, +[0x216C] = true, +[0x216D] = true, +[0x216E] = true, +[0x216F] = true, +[0x2170] = true, +[0x2171] = true, +[0x2172] = true, +[0x2173] = true, +[0x2174] = true, +[0x2175] = true, +[0x2176] = true, +[0x2177] = true, +[0x2178] = true, +[0x2179] = true, +[0x217A] = true, +[0x217B] = true, +[0x217C] = true, +[0x217D] = true, +[0x217E] = true, +[0x217F] = true, +[0x2180] = true, +[0x2181] = true, +[0x2183] = true, +[0x2184] = true, +[0x2185] = true, +[0x2186] = true, +[0x2187] = true, +[0x2189] = true, +[0x218A] = true, +[0x218B] = true, +[0x2190] = true, +[0x2191] = true, +[0x2192] = true, +[0x2193] = true, +[0x2194] = true, +[0x2195] = true, +[0x2196] = true, +[0x2197] = true, +[0x2198] = true, +[0x2199] = true, +[0x219A] = true, +[0x219B] = true, +[0x219E] = true, +[0x219F] = true, +[0x21A0] = true, +[0x21A1] = true, +[0x21A2] = true, +[0x21A3] = true, +[0x21A4] = true, +[0x21A5] = true, +[0x21A6] = true, +[0x21A7] = true, +[0x21A8] = true, +[0x21A9] = true, +[0x21AA] = true, +[0x21AB] = true, +[0x21AC] = true, +[0x21AD] = true, +[0x21AE] = true, +[0x21AF] = true, +[0x21B0] = true, +[0x21B1] = true, +[0x21B2] = true, +[0x21B3] = true, +[0x21B4] = true, +[0x21B5] = true, +[0x21B6] = true, +[0x21B7] = true, +[0x21B8] = true, +[0x21B9] = true, +[0x21BA] = true, +[0x21BB] = true, +[0x21BC] = true, +[0x21BD] = true, +[0x21BE] = true, +[0x21BF] = true, +[0x21C0] = true, +[0x21C1] = true, +[0x21C2] = true, +[0x21C3] = true, +[0x21C4] = true, +[0x21C5] = true, +[0x21C6] = true, +[0x21C7] = true, +[0x21C8] = true, +[0x21C9] = true, +[0x21CA] = true, +[0x21CB] = true, +[0x21CC] = true, +[0x21CD] = true, +[0x21CE] = true, +[0x21CF] = true, +[0x21D0] = true, +[0x21D1] = true, +[0x21D2] = true, +[0x21D3] = true, +[0x21D4] = true, +[0x21D5] = true, +[0x21D6] = true, +[0x21D7] = true, +[0x21D8] = true, +[0x21D9] = true, +[0x21DA] = true, +[0x21DB] = true, +[0x21DC] = true, +[0x21DD] = true, +[0x21DE] = true, +[0x21DF] = true, +[0x21E0] = true, +[0x21E1] = true, +[0x21E2] = true, +[0x21E3] = true, +[0x21E4] = true, +[0x21E5] = true, +[0x21E6] = true, +[0x21E7] = true, +[0x21E8] = true, +[0x21E9] = true, +[0x21EA] = true, +[0x21EB] = true, +[0x21EC] = true, +[0x21ED] = true, +[0x21EE] = true, +[0x21EF] = true, +[0x21F0] = true, +[0x21F1] = true, +[0x21F2] = true, +[0x21F3] = true, +[0x21F5] = true, +[0x21F6] = true, +[0x21F7] = true, +[0x21F8] = true, +[0x21FD] = true, +[0x21FE] = true, +[0x2200] = true, +[0x2201] = true, +[0x2202] = true, +[0x2203] = true, +[0x2204] = true, +[0x2205] = true, +[0x2206] = true, +[0x2207] = true, +[0x2208] = true, +[0x2209] = true, +[0x220A] = true, +[0x220B] = true, +[0x220C] = true, +[0x220D] = true, +[0x220E] = true, +[0x220F] = true, +[0x2210] = true, +[0x2211] = true, +[0x2212] = true, +[0x2213] = true, +[0x2214] = true, +[0x2215] = true, +[0x2216] = true, +[0x2217] = true, +[0x2218] = true, +[0x2219] = true, +[0x221A] = true, +[0x221B] = true, +[0x221C] = true, +[0x221D] = true, +[0x221E] = true, +[0x221F] = true, +[0x2220] = true, +[0x2221] = true, +[0x2222] = true, +[0x2223] = true, +[0x2224] = true, +[0x2225] = true, +[0x2226] = true, +[0x2227] = true, +[0x2228] = true, +[0x2229] = true, +[0x222A] = true, +[0x222B] = true, +[0x222C] = true, +[0x222D] = true, +[0x222E] = true, +[0x222F] = true, +[0x2230] = true, +[0x2231] = true, +[0x2232] = true, +[0x2233] = true, +[0x2234] = true, +[0x2235] = true, +[0x2236] = true, +[0x2237] = true, +[0x2238] = true, +[0x2239] = true, +[0x223A] = true, +[0x223B] = true, +[0x223C] = true, +[0x223D] = true, +[0x223E] = true, +[0x223F] = true, +[0x2240] = true, +[0x2241] = true, +[0x2242] = true, +[0x2243] = true, +[0x2244] = true, +[0x2245] = true, +[0x2246] = true, +[0x2247] = true, +[0x2248] = true, +[0x2249] = true, +[0x224A] = true, +[0x224B] = true, +[0x224C] = true, +[0x224D] = true, +[0x224E] = true, +[0x224F] = true, +[0x2250] = true, +[0x2251] = true, +[0x2252] = true, +[0x2253] = true, +[0x2254] = true, +[0x2255] = true, +[0x2256] = true, +[0x2257] = true, +[0x2258] = true, +[0x2259] = true, +[0x225A] = true, +[0x225B] = true, +[0x225C] = true, +[0x225D] = true, +[0x225E] = true, +[0x225F] = true, +[0x2260] = true, +[0x2261] = true, +[0x2262] = true, +[0x2263] = true, +[0x2264] = true, +[0x2265] = true, +[0x2266] = true, +[0x2267] = true, +[0x2268] = true, +[0x2269] = true, +[0x226A] = true, +[0x226B] = true, +[0x226C] = true, +[0x226D] = true, +[0x226E] = true, +[0x226F] = true, +[0x2270] = true, +[0x2271] = true, +[0x2272] = true, +[0x2273] = true, +[0x2274] = true, +[0x2275] = true, +[0x2276] = true, +[0x2277] = true, +[0x2278] = true, +[0x2279] = true, +[0x227A] = true, +[0x227B] = true, +[0x227C] = true, +[0x227D] = true, +[0x227E] = true, +[0x227F] = true, +[0x2280] = true, +[0x2281] = true, +[0x2282] = true, +[0x2283] = true, +[0x2284] = true, +[0x2285] = true, +[0x2286] = true, +[0x2287] = true, +[0x2288] = true, +[0x2289] = true, +[0x228A] = true, +[0x228B] = true, +[0x228C] = true, +[0x228D] = true, +[0x228E] = true, +[0x228F] = true, +[0x2290] = true, +[0x2291] = true, +[0x2292] = true, +[0x2293] = true, +[0x2294] = true, +[0x2295] = true, +[0x2296] = true, +[0x2297] = true, +[0x2298] = true, +[0x2299] = true, +[0x229A] = true, +[0x229B] = true, +[0x229C] = true, +[0x229D] = true, +[0x229E] = true, +[0x229F] = true, +[0x22A0] = true, +[0x22A1] = true, +[0x22A2] = true, +[0x22A3] = true, +[0x22A4] = true, +[0x22A5] = true, +[0x22A6] = true, +[0x22A7] = true, +[0x22A8] = true, +[0x22A9] = true, +[0x22AA] = true, +[0x22AB] = true, +[0x22AC] = true, +[0x22AD] = true, +[0x22AE] = true, +[0x22AF] = true, +[0x22B0] = true, +[0x22B1] = true, +[0x22B2] = true, +[0x22B3] = true, +[0x22B4] = true, +[0x22B5] = true, +[0x22B9] = true, +[0x22BA] = true, +[0x22BB] = true, +[0x22BC] = true, +[0x22BD] = true, +[0x22BE] = true, +[0x22BF] = true, +[0x22C0] = true, +[0x22C1] = true, +[0x22C2] = true, +[0x22C3] = true, +[0x22C4] = true, +[0x22C5] = true, +[0x22C6] = true, +[0x22C7] = true, +[0x22C8] = true, +[0x22C9] = true, +[0x22CA] = true, +[0x22CB] = true, +[0x22CC] = true, +[0x22CD] = true, +[0x22CE] = true, +[0x22CF] = true, +[0x22D0] = true, +[0x22D1] = true, +[0x22D2] = true, +[0x22D3] = true, +[0x22D4] = true, +[0x22D5] = true, +[0x22D6] = true, +[0x22D7] = true, +[0x22DA] = true, +[0x22DB] = true, +[0x22DC] = true, +[0x22DD] = true, +[0x22DE] = true, +[0x22DF] = true, +[0x22E0] = true, +[0x22E1] = true, +[0x22E2] = true, +[0x22E3] = true, +[0x22E4] = true, +[0x22E5] = true, +[0x22E6] = true, +[0x22E7] = true, +[0x22E8] = true, +[0x22E9] = true, +[0x22EA] = true, +[0x22EB] = true, +[0x22EC] = true, +[0x22ED] = true, +[0x22EE] = true, +[0x22EF] = true, +[0x22F0] = true, +[0x22F1] = true, +[0x22F4] = true, +[0x22F7] = true, +[0x22F8] = true, +[0x22FC] = true, +[0x22FE] = true, +[0x2301] = true, +[0x2302] = true, +[0x2303] = true, +[0x2304] = true, +[0x2305] = true, +[0x2306] = true, +[0x2307] = true, +[0x2308] = true, +[0x2309] = true, +[0x230A] = true, +[0x230B] = true, +[0x230C] = true, +[0x230D] = true, +[0x230E] = true, +[0x230F] = true, +[0x2310] = true, +[0x2311] = true, +[0x2312] = true, +[0x2313] = true, +[0x2314] = true, +[0x2315] = true, +[0x2317] = true, +[0x2318] = true, +[0x2319] = true, +[0x231A] = true, +[0x231B] = true, +[0x231C] = true, +[0x231D] = true, +[0x231E] = true, +[0x231F] = true, +[0x2320] = true, +[0x2321] = true, +[0x2322] = true, +[0x2323] = true, +[0x2324] = true, +[0x2325] = true, +[0x2326] = true, +[0x2327] = true, +[0x2328] = true, +[0x232B] = true, +[0x2336] = true, +[0x2337] = true, +[0x2338] = true, +[0x2339] = true, +[0x233A] = true, +[0x233B] = true, +[0x233C] = true, +[0x233D] = true, +[0x233E] = true, +[0x233F] = true, +[0x2340] = true, +[0x2341] = true, +[0x2342] = true, +[0x2343] = true, +[0x2344] = true, +[0x2345] = true, +[0x2346] = true, +[0x2347] = true, +[0x2348] = true, +[0x2349] = true, +[0x234A] = true, +[0x234B] = true, +[0x234C] = true, +[0x234D] = true, +[0x234E] = true, +[0x234F] = true, +[0x2350] = true, +[0x2351] = true, +[0x2352] = true, +[0x2353] = true, +[0x2354] = true, +[0x2355] = true, +[0x2356] = true, +[0x2357] = true, +[0x2358] = true, +[0x2359] = true, +[0x235A] = true, +[0x235B] = true, +[0x235C] = true, +[0x235D] = true, +[0x235E] = true, +[0x235F] = true, +[0x2360] = true, +[0x2361] = true, +[0x2362] = true, +[0x2363] = true, +[0x2364] = true, +[0x2365] = true, +[0x2366] = true, +[0x2367] = true, +[0x2368] = true, +[0x2369] = true, +[0x236A] = true, +[0x236B] = true, +[0x236C] = true, +[0x236D] = true, +[0x236E] = true, +[0x236F] = true, +[0x2370] = true, +[0x2371] = true, +[0x2372] = true, +[0x2373] = true, +[0x2374] = true, +[0x2375] = true, +[0x2376] = true, +[0x2377] = true, +[0x2378] = true, +[0x2379] = true, +[0x237A] = true, +[0x237F] = true, +[0x2380] = true, +[0x2395] = true, +[0x2396] = true, +[0x239B] = true, +[0x239C] = true, +[0x239D] = true, +[0x239E] = true, +[0x239F] = true, +[0x23A0] = true, +[0x23A1] = true, +[0x23A2] = true, +[0x23A3] = true, +[0x23A4] = true, +[0x23A5] = true, +[0x23A6] = true, +[0x23A7] = true, +[0x23A8] = true, +[0x23A9] = true, +[0x23AA] = true, +[0x23AB] = true, +[0x23AC] = true, +[0x23AD] = true, +[0x23AE] = true, +[0x23AF] = true, +[0x23B0] = true, +[0x23B1] = true, +[0x23B7] = true, +[0x23B8] = true, +[0x23B9] = true, +[0x23BA] = true, +[0x23BB] = true, +[0x23BC] = true, +[0x23BD] = true, +[0x23BE] = true, +[0x23BF] = true, +[0x23CB] = true, +[0x23CC] = true, +[0x23CF] = true, +[0x23D0] = true, +[0x23D1] = true, +[0x23D2] = true, +[0x23D3] = true, +[0x23DA] = true, +[0x23E8] = true, +[0x2422] = true, +[0x2423] = true, +[0x2424] = true, +[0x2425] = true, +[0x2426] = true, +[0x2440] = true, +[0x2441] = true, +[0x2442] = true, +[0x2443] = true, +[0x2444] = true, +[0x2445] = true, +[0x2446] = true, +[0x2447] = true, +[0x2448] = true, +[0x2449] = true, +[0x244A] = true, +[0x2500] = true, +[0x2501] = true, +[0x2502] = true, +[0x2503] = true, +[0x2504] = true, +[0x2505] = true, +[0x2506] = true, +[0x2507] = true, +[0x2508] = true, +[0x2509] = true, +[0x250A] = true, +[0x250B] = true, +[0x250C] = true, +[0x250D] = true, +[0x250E] = true, +[0x250F] = true, +[0x2510] = true, +[0x2511] = true, +[0x2512] = true, +[0x2513] = true, +[0x2514] = true, +[0x2515] = true, +[0x2516] = true, +[0x2517] = true, +[0x2518] = true, +[0x2519] = true, +[0x251A] = true, +[0x251B] = true, +[0x251C] = true, +[0x251D] = true, +[0x251E] = true, +[0x251F] = true, +[0x2520] = true, +[0x2521] = true, +[0x2522] = true, +[0x2523] = true, +[0x2524] = true, +[0x2525] = true, +[0x2526] = true, +[0x2527] = true, +[0x2528] = true, +[0x2529] = true, +[0x252A] = true, +[0x252B] = true, +[0x252C] = true, +[0x252D] = true, +[0x252E] = true, +[0x252F] = true, +[0x2530] = true, +[0x2531] = true, +[0x2532] = true, +[0x2533] = true, +[0x2534] = true, +[0x2535] = true, +[0x2536] = true, +[0x2537] = true, +[0x2538] = true, +[0x2539] = true, +[0x253A] = true, +[0x253B] = true, +[0x253C] = true, +[0x253D] = true, +[0x253E] = true, +[0x253F] = true, +[0x2540] = true, +[0x2541] = true, +[0x2542] = true, +[0x2543] = true, +[0x2544] = true, +[0x2545] = true, +[0x2546] = true, +[0x2547] = true, +[0x2548] = true, +[0x2549] = true, +[0x254A] = true, +[0x254B] = true, +[0x254C] = true, +[0x254D] = true, +[0x254E] = true, +[0x254F] = true, +[0x2550] = true, +[0x2551] = true, +[0x2552] = true, +[0x2553] = true, +[0x2554] = true, +[0x2555] = true, +[0x2556] = true, +[0x2557] = true, +[0x2558] = true, +[0x2559] = true, +[0x255A] = true, +[0x255B] = true, +[0x255C] = true, +[0x255D] = true, +[0x255E] = true, +[0x255F] = true, +[0x2560] = true, +[0x2561] = true, +[0x2562] = true, +[0x2563] = true, +[0x2564] = true, +[0x2565] = true, +[0x2566] = true, +[0x2567] = true, +[0x2568] = true, +[0x2569] = true, +[0x256A] = true, +[0x256B] = true, +[0x256C] = true, +[0x256D] = true, +[0x256E] = true, +[0x256F] = true, +[0x2570] = true, +[0x2571] = true, +[0x2572] = true, +[0x2573] = true, +[0x2574] = true, +[0x2575] = true, +[0x2576] = true, +[0x2577] = true, +[0x2578] = true, +[0x2579] = true, +[0x257A] = true, +[0x257B] = true, +[0x257C] = true, +[0x257D] = true, +[0x257E] = true, +[0x257F] = true, +[0x2580] = true, +[0x2581] = true, +[0x2582] = true, +[0x2583] = true, +[0x2584] = true, +[0x2585] = true, +[0x2586] = true, +[0x2587] = true, +[0x2588] = true, +[0x2589] = true, +[0x258A] = true, +[0x258B] = true, +[0x258C] = true, +[0x258D] = true, +[0x258E] = true, +[0x258F] = true, +[0x2590] = true, +[0x2591] = true, +[0x2592] = true, +[0x2593] = true, +[0x2594] = true, +[0x2595] = true, +[0x2596] = true, +[0x2597] = true, +[0x2598] = true, +[0x2599] = true, +[0x259A] = true, +[0x259B] = true, +[0x259C] = true, +[0x259D] = true, +[0x259E] = true, +[0x259F] = true, +[0x25A0] = true, +[0x25A1] = true, +[0x25A2] = true, +[0x25A3] = true, +[0x25A4] = true, +[0x25A5] = true, +[0x25A6] = true, +[0x25A7] = true, +[0x25A8] = true, +[0x25A9] = true, +[0x25AA] = true, +[0x25AB] = true, +[0x25AC] = true, +[0x25AD] = true, +[0x25AE] = true, +[0x25AF] = true, +[0x25B0] = true, +[0x25B1] = true, +[0x25B2] = true, +[0x25B3] = true, +[0x25B4] = true, +[0x25B5] = true, +[0x25B6] = true, +[0x25B7] = true, +[0x25B8] = true, +[0x25B9] = true, +[0x25BA] = true, +[0x25BB] = true, +[0x25BC] = true, +[0x25BD] = true, +[0x25BE] = true, +[0x25BF] = true, +[0x25C0] = true, +[0x25C1] = true, +[0x25C2] = true, +[0x25C3] = true, +[0x25C4] = true, +[0x25C5] = true, +[0x25C6] = true, +[0x25C7] = true, +[0x25C8] = true, +[0x25C9] = true, +[0x25CA] = true, +[0x25CB] = true, +[0x25CC] = true, +[0x25CD] = true, +[0x25CE] = true, +[0x25CF] = true, +[0x25D0] = true, +[0x25D1] = true, +[0x25D2] = true, +[0x25D3] = true, +[0x25D4] = true, +[0x25D5] = true, +[0x25D6] = true, +[0x25D7] = true, +[0x25D8] = true, +[0x25D9] = true, +[0x25DA] = true, +[0x25DB] = true, +[0x25DC] = true, +[0x25DD] = true, +[0x25DE] = true, +[0x25DF] = true, +[0x25E0] = true, +[0x25E1] = true, +[0x25E2] = true, +[0x25E3] = true, +[0x25E4] = true, +[0x25E5] = true, +[0x25E6] = true, +[0x25E7] = true, +[0x25E8] = true, +[0x25E9] = true, +[0x25EA] = true, +[0x25EB] = true, +[0x25EC] = true, +[0x25ED] = true, +[0x25EE] = true, +[0x25F0] = true, +[0x25F1] = true, +[0x25F2] = true, +[0x25F3] = true, +[0x25F4] = true, +[0x25F5] = true, +[0x25F6] = true, +[0x25F7] = true, +[0x25F8] = true, +[0x25F9] = true, +[0x25FA] = true, +[0x25FB] = true, +[0x25FC] = true, +[0x25FD] = true, +[0x25FE] = true, +[0x25FF] = true, +[0x2600] = true, +[0x2601] = true, +[0x2602] = true, +[0x2604] = true, +[0x2605] = true, +[0x2606] = true, +[0x2607] = true, +[0x2608] = true, +[0x2609] = true, +[0x260A] = true, +[0x260B] = true, +[0x260C] = true, +[0x260D] = true, +[0x260E] = true, +[0x260F] = true, +[0x2613] = true, +[0x2614] = true, +[0x261A] = true, +[0x261B] = true, +[0x261C] = true, +[0x261D] = true, +[0x261E] = true, +[0x261F] = true, +[0x2620] = true, +[0x2621] = true, +[0x2625] = true, +[0x2626] = true, +[0x2627] = true, +[0x2628] = true, +[0x2629] = true, +[0x262A] = true, +[0x262D] = true, +[0x262E] = true, +[0x2638] = true, +[0x2639] = true, +[0x263A] = true, +[0x263B] = true, +[0x263C] = true, +[0x263D] = true, +[0x263E] = true, +[0x263F] = true, +[0x2640] = true, +[0x2641] = true, +[0x2642] = true, +[0x2643] = true, +[0x2644] = true, +[0x2645] = true, +[0x2646] = true, +[0x2647] = true, +[0x2648] = true, +[0x2649] = true, +[0x264A] = true, +[0x264B] = true, +[0x264C] = true, +[0x264D] = true, +[0x264E] = true, +[0x264F] = true, +[0x2650] = true, +[0x2651] = true, +[0x2652] = true, +[0x2653] = true, +[0x2654] = true, +[0x2655] = true, +[0x2656] = true, +[0x2657] = true, +[0x2658] = true, +[0x2659] = true, +[0x265A] = true, +[0x265B] = true, +[0x265C] = true, +[0x265D] = true, +[0x265E] = true, +[0x265F] = true, +[0x2660] = true, +[0x2661] = true, +[0x2662] = true, +[0x2663] = true, +[0x2664] = true, +[0x2665] = true, +[0x2666] = true, +[0x2667] = true, +[0x2668] = true, +[0x2669] = true, +[0x266A] = true, +[0x266B] = true, +[0x266C] = true, +[0x266D] = true, +[0x266E] = true, +[0x266F] = true, +[0x2670] = true, +[0x2671] = true, +[0x2690] = true, +[0x2691] = true, +[0x26A1] = true, +[0x26A8] = true, +[0x26AA] = true, +[0x26AB] = true, +[0x26AC] = true, +[0x26B2] = true, +[0x26B3] = true, +[0x26B4] = true, +[0x26B5] = true, +[0x26B7] = true, +[0x26B8] = true, +[0x26B9] = true, +[0x26BA] = true, +[0x26BB] = true, +[0x26BC] = true, +[0x26E2] = true, +[0x2768] = true, +[0x2769] = true, +[0x276A] = true, +[0x276B] = true, +[0x276C] = true, +[0x276D] = true, +[0x276E] = true, +[0x276F] = true, +[0x2770] = true, +[0x2771] = true, +[0x2772] = true, +[0x2773] = true, +[0x2774] = true, +[0x2775] = true, +[0x27B0] = true, +[0x27C0] = true, +[0x27C2] = true, +[0x27C5] = true, +[0x27C6] = true, +[0x27C7] = true, +[0x27CA] = true, +[0x27D1] = true, +[0x27D3] = true, +[0x27D4] = true, +[0x27DF] = true, +[0x27E0] = true, +[0x27E6] = true, +[0x27E7] = true, +[0x27E8] = true, +[0x27E9] = true, +[0x27EA] = true, +[0x27EB] = true, +[0x27EC] = true, +[0x27ED] = true, +[0x27EE] = true, +[0x27EF] = true, +[0x2800] = true, +[0x2801] = true, +[0x2802] = true, +[0x2803] = true, +[0x2804] = true, +[0x2805] = true, +[0x2806] = true, +[0x2807] = true, +[0x2808] = true, +[0x2809] = true, +[0x280A] = true, +[0x280B] = true, +[0x280C] = true, +[0x280D] = true, +[0x280E] = true, +[0x280F] = true, +[0x2810] = true, +[0x2811] = true, +[0x2812] = true, +[0x2813] = true, +[0x2814] = true, +[0x2815] = true, +[0x2816] = true, +[0x2817] = true, +[0x2818] = true, +[0x2819] = true, +[0x281A] = true, +[0x281B] = true, +[0x281C] = true, +[0x281D] = true, +[0x281E] = true, +[0x281F] = true, +[0x2820] = true, +[0x2821] = true, +[0x2822] = true, +[0x2823] = true, +[0x2824] = true, +[0x2825] = true, +[0x2826] = true, +[0x2827] = true, +[0x2828] = true, +[0x2829] = true, +[0x282A] = true, +[0x282B] = true, +[0x282C] = true, +[0x282D] = true, +[0x282E] = true, +[0x282F] = true, +[0x2830] = true, +[0x2831] = true, +[0x2832] = true, +[0x2833] = true, +[0x2834] = true, +[0x2835] = true, +[0x2836] = true, +[0x2837] = true, +[0x2838] = true, +[0x2839] = true, +[0x283A] = true, +[0x283B] = true, +[0x283C] = true, +[0x283D] = true, +[0x283E] = true, +[0x283F] = true, +[0x2840] = true, +[0x2841] = true, +[0x2842] = true, +[0x2843] = true, +[0x2844] = true, +[0x2845] = true, +[0x2846] = true, +[0x2847] = true, +[0x2848] = true, +[0x2849] = true, +[0x284A] = true, +[0x284B] = true, +[0x284C] = true, +[0x284D] = true, +[0x284E] = true, +[0x284F] = true, +[0x2850] = true, +[0x2851] = true, +[0x2852] = true, +[0x2853] = true, +[0x2854] = true, +[0x2855] = true, +[0x2856] = true, +[0x2857] = true, +[0x2858] = true, +[0x2859] = true, +[0x285A] = true, +[0x285B] = true, +[0x285C] = true, +[0x285D] = true, +[0x285E] = true, +[0x285F] = true, +[0x2860] = true, +[0x2861] = true, +[0x2862] = true, +[0x2863] = true, +[0x2864] = true, +[0x2865] = true, +[0x2866] = true, +[0x2867] = true, +[0x2868] = true, +[0x2869] = true, +[0x286A] = true, +[0x286B] = true, +[0x286C] = true, +[0x286D] = true, +[0x286E] = true, +[0x286F] = true, +[0x2870] = true, +[0x2871] = true, +[0x2872] = true, +[0x2873] = true, +[0x2874] = true, +[0x2875] = true, +[0x2876] = true, +[0x2877] = true, +[0x2878] = true, +[0x2879] = true, +[0x287A] = true, +[0x287B] = true, +[0x287C] = true, +[0x287D] = true, +[0x287E] = true, +[0x287F] = true, +[0x2880] = true, +[0x2881] = true, +[0x2882] = true, +[0x2883] = true, +[0x2884] = true, +[0x2885] = true, +[0x2886] = true, +[0x2887] = true, +[0x2888] = true, +[0x2889] = true, +[0x288A] = true, +[0x288B] = true, +[0x288C] = true, +[0x288D] = true, +[0x288E] = true, +[0x288F] = true, +[0x2890] = true, +[0x2891] = true, +[0x2892] = true, +[0x2893] = true, +[0x2894] = true, +[0x2895] = true, +[0x2896] = true, +[0x2897] = true, +[0x2898] = true, +[0x2899] = true, +[0x289A] = true, +[0x289B] = true, +[0x289C] = true, +[0x289D] = true, +[0x289E] = true, +[0x289F] = true, +[0x28A0] = true, +[0x28A1] = true, +[0x28A2] = true, +[0x28A3] = true, +[0x28A4] = true, +[0x28A5] = true, +[0x28A6] = true, +[0x28A7] = true, +[0x28A8] = true, +[0x28A9] = true, +[0x28AA] = true, +[0x28AB] = true, +[0x28AC] = true, +[0x28AD] = true, +[0x28AE] = true, +[0x28AF] = true, +[0x28B0] = true, +[0x28B1] = true, +[0x28B2] = true, +[0x28B3] = true, +[0x28B4] = true, +[0x28B5] = true, +[0x28B6] = true, +[0x28B7] = true, +[0x28B8] = true, +[0x28B9] = true, +[0x28BA] = true, +[0x28BB] = true, +[0x28BC] = true, +[0x28BD] = true, +[0x28BE] = true, +[0x28BF] = true, +[0x28C0] = true, +[0x28C1] = true, +[0x28C2] = true, +[0x28C3] = true, +[0x28C4] = true, +[0x28C5] = true, +[0x28C6] = true, +[0x28C7] = true, +[0x28C8] = true, +[0x28C9] = true, +[0x28CA] = true, +[0x28CB] = true, +[0x28CC] = true, +[0x28CD] = true, +[0x28CE] = true, +[0x28CF] = true, +[0x28D0] = true, +[0x28D1] = true, +[0x28D2] = true, +[0x28D3] = true, +[0x28D4] = true, +[0x28D5] = true, +[0x28D6] = true, +[0x28D7] = true, +[0x28D8] = true, +[0x28D9] = true, +[0x28DA] = true, +[0x28DB] = true, +[0x28DC] = true, +[0x28DD] = true, +[0x28DE] = true, +[0x28DF] = true, +[0x28E0] = true, +[0x28E1] = true, +[0x28E2] = true, +[0x28E3] = true, +[0x28E4] = true, +[0x28E5] = true, +[0x28E6] = true, +[0x28E7] = true, +[0x28E8] = true, +[0x28E9] = true, +[0x28EA] = true, +[0x28EB] = true, +[0x28EC] = true, +[0x28ED] = true, +[0x28EE] = true, +[0x28EF] = true, +[0x28F0] = true, +[0x28F1] = true, +[0x28F2] = true, +[0x28F3] = true, +[0x28F4] = true, +[0x28F5] = true, +[0x28F6] = true, +[0x28F7] = true, +[0x28F8] = true, +[0x28F9] = true, +[0x28FA] = true, +[0x28FB] = true, +[0x28FC] = true, +[0x28FD] = true, +[0x28FE] = true, +[0x28FF] = true, +[0x2908] = true, +[0x2909] = true, +[0x2912] = true, +[0x2913] = true, +[0x2938] = true, +[0x2939] = true, +[0x2949] = true, +[0x294C] = true, +[0x294D] = true, +[0x294F] = true, +[0x2951] = true, +[0x2954] = true, +[0x2955] = true, +[0x2958] = true, +[0x2959] = true, +[0x295C] = true, +[0x295D] = true, +[0x2960] = true, +[0x2961] = true, +[0x297C] = true, +[0x297D] = true, +[0x2980] = true, +[0x2981] = true, +[0x2982] = true, +[0x2983] = true, +[0x2984] = true, +[0x2985] = true, +[0x2986] = true, +[0x2987] = true, +[0x2988] = true, +[0x2989] = true, +[0x298A] = true, +[0x298B] = true, +[0x298C] = true, +[0x298D] = true, +[0x298E] = true, +[0x298F] = true, +[0x2990] = true, +[0x2991] = true, +[0x2992] = true, +[0x2997] = true, +[0x2998] = true, +[0x2999] = true, +[0x299A] = true, +[0x299B] = true, +[0x299C] = true, +[0x299D] = true, +[0x299F] = true, +[0x29A0] = true, +[0x29A1] = true, +[0x29A2] = true, +[0x29A3] = true, +[0x29A4] = true, +[0x29A5] = true, +[0x29A6] = true, +[0x29A7] = true, +[0x29D1] = true, +[0x29D2] = true, +[0x29D3] = true, +[0x29D4] = true, +[0x29D5] = true, +[0x29D6] = true, +[0x29D7] = true, +[0x29D8] = true, +[0x29D9] = true, +[0x29DC] = true, +[0x29DD] = true, +[0x29DE] = true, +[0x29E1] = true, +[0x29EB] = true, +[0x29EE] = true, +[0x29EF] = true, +[0x29F0] = true, +[0x29F1] = true, +[0x29F2] = true, +[0x29F3] = true, +[0x29F5] = true, +[0x29F6] = true, +[0x29F7] = true, +[0x29F8] = true, +[0x29F9] = true, +[0x29FA] = true, +[0x29FB] = true, +[0x29FC] = true, +[0x29FD] = true, +[0x2A0B] = true, +[0x2A0D] = true, +[0x2A0E] = true, +[0x2A0F] = true, +[0x2A10] = true, +[0x2A11] = true, +[0x2A12] = true, +[0x2A13] = true, +[0x2A14] = true, +[0x2A15] = true, +[0x2A16] = true, +[0x2A17] = true, +[0x2A18] = true, +[0x2A19] = true, +[0x2A1A] = true, +[0x2A1B] = true, +[0x2A1C] = true, +[0x2A1E] = true, +[0x2A1F] = true, +[0x2A21] = true, +[0x2A22] = true, +[0x2A23] = true, +[0x2A24] = true, +[0x2A25] = true, +[0x2A26] = true, +[0x2A27] = true, +[0x2A28] = true, +[0x2A29] = true, +[0x2A2A] = true, +[0x2A2B] = true, +[0x2A2C] = true, +[0x2A2F] = true, +[0x2A30] = true, +[0x2A31] = true, +[0x2A32] = true, +[0x2A3C] = true, +[0x2A3D] = true, +[0x2A3E] = true, +[0x2A3F] = true, +[0x2A40] = true, +[0x2A41] = true, +[0x2A42] = true, +[0x2A43] = true, +[0x2A44] = true, +[0x2A45] = true, +[0x2A46] = true, +[0x2A47] = true, +[0x2A48] = true, +[0x2A49] = true, +[0x2A4A] = true, +[0x2A4B] = true, +[0x2A4C] = true, +[0x2A4D] = true, +[0x2A66] = true, +[0x2A67] = true, +[0x2A6A] = true, +[0x2A6B] = true, +[0x2A6C] = true, +[0x2A6D] = true, +[0x2A6E] = true, +[0x2A6F] = true, +[0x2A70] = true, +[0x2A71] = true, +[0x2A72] = true, +[0x2A73] = true, +[0x2A77] = true, +[0x2A8B] = true, +[0x2A8C] = true, +[0x2A8F] = true, +[0x2A90] = true, +[0x2A91] = true, +[0x2A92] = true, +[0x2A93] = true, +[0x2A94] = true, +[0x2ABF] = true, +[0x2AC0] = true, +[0x2AC1] = true, +[0x2AC2] = true, +[0x2AC3] = true, +[0x2AC4] = true, +[0x2AC5] = true, +[0x2AC6] = true, +[0x2AC7] = true, +[0x2AC8] = true, +[0x2AC9] = true, +[0x2ACA] = true, +[0x2ACB] = true, +[0x2ACC] = true, +[0x2AD3] = true, +[0x2AD4] = true, +[0x2AD5] = true, +[0x2AD6] = true, +[0x2ADE] = true, +[0x2AEE] = true, +[0x2AEF] = true, +[0x2AF0] = true, +[0x2AF1] = true, +[0x2AF2] = true, +[0x2AF6] = true, +[0x2AFE] = true, +[0x2AFF] = true, +[0x2B06] = true, +[0x2B07] = true, +[0x2B0D] = true, +[0x2B1D] = true, +[0x2B1E] = true, +[0x2B25] = true, +[0x2B26] = true, +[0x2B27] = true, +[0x2B28] = true, +[0x2B29] = true, +[0x2B2A] = true, +[0x2B2B] = true, +[0x2B2E] = true, +[0x2B2F] = true, +[0x2B31] = true, +[0x2B4E] = true, +[0x2B4F] = true, +[0x2BC9] = true, +[0x2BFF] = true, +[0x2C00] = true, +[0x2C01] = true, +[0x2C02] = true, +[0x2C03] = true, +[0x2C04] = true, +[0x2C05] = true, +[0x2C06] = true, +[0x2C07] = true, +[0x2C08] = true, +[0x2C09] = true, +[0x2C0A] = true, +[0x2C0B] = true, +[0x2C0C] = true, +[0x2C0D] = true, +[0x2C0E] = true, +[0x2C10] = true, +[0x2C11] = true, +[0x2C12] = true, +[0x2C13] = true, +[0x2C14] = true, +[0x2C15] = true, +[0x2C16] = true, +[0x2C17] = true, +[0x2C18] = true, +[0x2C19] = true, +[0x2C1A] = true, +[0x2C1B] = true, +[0x2C1C] = true, +[0x2C1D] = true, +[0x2C1E] = true, +[0x2C20] = true, +[0x2C21] = true, +[0x2C22] = true, +[0x2C23] = true, +[0x2C24] = true, +[0x2C25] = true, +[0x2C26] = true, +[0x2C2A] = true, +[0x2C2B] = true, +[0x2C2C] = true, +[0x2C2D] = true, +[0x2C2E] = true, +[0x2C2F] = true, +[0x2C30] = true, +[0x2C31] = true, +[0x2C32] = true, +[0x2C33] = true, +[0x2C34] = true, +[0x2C35] = true, +[0x2C36] = true, +[0x2C37] = true, +[0x2C38] = true, +[0x2C39] = true, +[0x2C3A] = true, +[0x2C3B] = true, +[0x2C3C] = true, +[0x2C3D] = true, +[0x2C3E] = true, +[0x2C40] = true, +[0x2C41] = true, +[0x2C42] = true, +[0x2C43] = true, +[0x2C44] = true, +[0x2C45] = true, +[0x2C46] = true, +[0x2C47] = true, +[0x2C48] = true, +[0x2C49] = true, +[0x2C4A] = true, +[0x2C4B] = true, +[0x2C4C] = true, +[0x2C4D] = true, +[0x2C4E] = true, +[0x2C50] = true, +[0x2C51] = true, +[0x2C52] = true, +[0x2C53] = true, +[0x2C54] = true, +[0x2C55] = true, +[0x2C56] = true, +[0x2C5A] = true, +[0x2C5B] = true, +[0x2C5C] = true, +[0x2C5D] = true, +[0x2C5E] = true, +[0x2C5F] = true, +[0x2C60] = true, +[0x2C61] = true, +[0x2C62] = true, +[0x2C63] = true, +[0x2C64] = true, +[0x2C65] = true, +[0x2C66] = true, +[0x2C67] = true, +[0x2C68] = true, +[0x2C69] = true, +[0x2C6A] = true, +[0x2C6B] = true, +[0x2C6C] = true, +[0x2C6D] = true, +[0x2C6E] = true, +[0x2C6F] = true, +[0x2C70] = true, +[0x2C71] = true, +[0x2C72] = true, +[0x2C73] = true, +[0x2C74] = true, +[0x2C75] = true, +[0x2C76] = true, +[0x2C77] = true, +[0x2C78] = true, +[0x2C79] = true, +[0x2C7A] = true, +[0x2C7B] = true, +[0x2C7C] = true, +[0x2C7D] = true, +[0x2C7E] = true, +[0x2C7F] = true, +[0x2C80] = true, +[0x2C81] = true, +[0x2C82] = true, +[0x2C83] = true, +[0x2C84] = true, +[0x2C85] = true, +[0x2C86] = true, +[0x2C87] = true, +[0x2C88] = true, +[0x2C89] = true, +[0x2C8A] = true, +[0x2C8B] = true, +[0x2C8C] = true, +[0x2C8D] = true, +[0x2C8E] = true, +[0x2C8F] = true, +[0x2C90] = true, +[0x2C91] = true, +[0x2C92] = true, +[0x2C93] = true, +[0x2C94] = true, +[0x2C95] = true, +[0x2C96] = true, +[0x2C97] = true, +[0x2C98] = true, +[0x2C99] = true, +[0x2C9A] = true, +[0x2C9B] = true, +[0x2C9C] = true, +[0x2C9D] = true, +[0x2C9E] = true, +[0x2C9F] = true, +[0x2CA0] = true, +[0x2CA1] = true, +[0x2CA2] = true, +[0x2CA3] = true, +[0x2CA4] = true, +[0x2CA5] = true, +[0x2CA6] = true, +[0x2CA7] = true, +[0x2CA8] = true, +[0x2CA9] = true, +[0x2CAA] = true, +[0x2CAB] = true, +[0x2CAC] = true, +[0x2CAD] = true, +[0x2CAE] = true, +[0x2CAF] = true, +[0x2CB0] = true, +[0x2CB1] = true, +[0x2CB2] = true, +[0x2CB3] = true, +[0x2CB4] = true, +[0x2CB5] = true, +[0x2CB6] = true, +[0x2CB7] = true, +[0x2CB8] = true, +[0x2CB9] = true, +[0x2CBA] = true, +[0x2CBB] = true, +[0x2CBC] = true, +[0x2CBD] = true, +[0x2CBE] = true, +[0x2CBF] = true, +[0x2CC0] = true, +[0x2CC1] = true, +[0x2CC2] = true, +[0x2CC3] = true, +[0x2CC4] = true, +[0x2CC5] = true, +[0x2CC6] = true, +[0x2CC7] = true, +[0x2CC8] = true, +[0x2CC9] = true, +[0x2CCA] = true, +[0x2CCB] = true, +[0x2CCC] = true, +[0x2CCD] = true, +[0x2CCE] = true, +[0x2CCF] = true, +[0x2CD0] = true, +[0x2CD1] = true, +[0x2CD2] = true, +[0x2CD3] = true, +[0x2CD4] = true, +[0x2CD5] = true, +[0x2CD6] = true, +[0x2CD7] = true, +[0x2CD8] = true, +[0x2CD9] = true, +[0x2CDA] = true, +[0x2CDB] = true, +[0x2CDC] = true, +[0x2CDD] = true, +[0x2CDE] = true, +[0x2CDF] = true, +[0x2CE0] = true, +[0x2CE1] = true, +[0x2CE2] = true, +[0x2CE3] = true, +[0x2CE4] = true, +[0x2CE5] = true, +[0x2CE6] = true, +[0x2CE8] = true, +[0x2CE9] = true, +[0x2CEB] = true, +[0x2CEC] = true, +[0x2CED] = true, +[0x2CEE] = true, +[0x2CF0] = true, +[0x2CF1] = true, +[0x2CF2] = true, +[0x2CF3] = true, +[0x2CF9] = true, +[0x2CFA] = true, +[0x2CFB] = true, +[0x2CFC] = true, +[0x2CFD] = true, +[0x2CFE] = true, +[0x2CFF] = true, +[0x2D00] = true, +[0x2D01] = true, +[0x2D02] = true, +[0x2D03] = true, +[0x2D04] = true, +[0x2D06] = true, +[0x2D08] = true, +[0x2D09] = true, +[0x2D0B] = true, +[0x2D0C] = true, +[0x2D0E] = true, +[0x2D0F] = true, +[0x2D11] = true, +[0x2D12] = true, +[0x2D15] = true, +[0x2D16] = true, +[0x2D17] = true, +[0x2D18] = true, +[0x2D19] = true, +[0x2D1A] = true, +[0x2D1D] = true, +[0x2D1E] = true, +[0x2D1F] = true, +[0x2D21] = true, +[0x2D22] = true, +[0x2D23] = true, +[0x2D24] = true, +[0x2D27] = true, +[0x2D2D] = true, +[0x2D30] = true, +[0x2D31] = true, +[0x2D32] = true, +[0x2D33] = true, +[0x2D34] = true, +[0x2D35] = true, +[0x2D36] = true, +[0x2D37] = true, +[0x2D38] = true, +[0x2D39] = true, +[0x2D3A] = true, +[0x2D3B] = true, +[0x2D3C] = true, +[0x2D3D] = true, +[0x2D3E] = true, +[0x2D3F] = true, +[0x2D40] = true, +[0x2D41] = true, +[0x2D42] = true, +[0x2D43] = true, +[0x2D44] = true, +[0x2D45] = true, +[0x2D46] = true, +[0x2D47] = true, +[0x2D49] = true, +[0x2D4A] = true, +[0x2D4B] = true, +[0x2D4C] = true, +[0x2D4D] = true, +[0x2D4E] = true, +[0x2D4F] = true, +[0x2D50] = true, +[0x2D51] = true, +[0x2D52] = true, +[0x2D53] = true, +[0x2D54] = true, +[0x2D55] = true, +[0x2D56] = true, +[0x2D57] = true, +[0x2D58] = true, +[0x2D59] = true, +[0x2D5A] = true, +[0x2D5B] = true, +[0x2D5C] = true, +[0x2D5D] = true, +[0x2D5E] = true, +[0x2D5F] = true, +[0x2D60] = true, +[0x2D61] = true, +[0x2D62] = true, +[0x2D63] = true, +[0x2D64] = true, +[0x2D65] = true, +[0x2D66] = true, +[0x2D67] = true, +[0x2D6F] = true, +[0x2D70] = true, +[0x2D7F] = true, +[0x2DE0] = true, +[0x2DE1] = true, +[0x2DE2] = true, +[0x2DE3] = true, +[0x2DE4] = true, +[0x2DE5] = true, +[0x2DE6] = true, +[0x2DE7] = true, +[0x2DE8] = true, +[0x2DE9] = true, +[0x2DEA] = true, +[0x2DEB] = true, +[0x2DEC] = true, +[0x2DED] = true, +[0x2DEE] = true, +[0x2DEF] = true, +[0x2DF0] = true, +[0x2DF1] = true, +[0x2DF2] = true, +[0x2DF3] = true, +[0x2DF4] = true, +[0x2DF5] = true, +[0x2DF6] = true, +[0x2DF7] = true, +[0x2DF8] = true, +[0x2DF9] = true, +[0x2DFA] = true, +[0x2DFB] = true, +[0x2DFC] = true, +[0x2DFD] = true, +[0x2DFE] = true, +[0x2DFF] = true, +[0x2E00] = true, +[0x2E01] = true, +[0x2E02] = true, +[0x2E03] = true, +[0x2E04] = true, +[0x2E05] = true, +[0x2E06] = true, +[0x2E07] = true, +[0x2E08] = true, +[0x2E09] = true, +[0x2E0A] = true, +[0x2E0B] = true, +[0x2E0C] = true, +[0x2E0D] = true, +[0x2E12] = true, +[0x2E16] = true, +[0x2E17] = true, +[0x2E18] = true, +[0x2E19] = true, +[0x2E1A] = true, +[0x2E1B] = true, +[0x2E1C] = true, +[0x2E1D] = true, +[0x2E1E] = true, +[0x2E1F] = true, +[0x2E20] = true, +[0x2E21] = true, +[0x2E22] = true, +[0x2E23] = true, +[0x2E24] = true, +[0x2E25] = true, +[0x2E26] = true, +[0x2E27] = true, +[0x2E28] = true, +[0x2E29] = true, +[0x2E2A] = true, +[0x2E2B] = true, +[0x2E2C] = true, +[0x2E2D] = true, +[0x2E2E] = true, +[0x2E2F] = true, +[0x2E30] = true, +[0x2E31] = true, +[0x2E32] = true, +[0x2E33] = true, +[0x2E34] = true, +[0x2E35] = true, +[0x2E36] = true, +[0x2E37] = true, +[0x2E38] = true, +[0x2E39] = true, +[0x2E3C] = true, +[0x2E3D] = true, +[0x2E3E] = true, +[0x2E3F] = true, +[0x2E40] = true, +[0x2E41] = true, +[0x2E42] = true, +[0x2E44] = true, +[0x2E45] = true, +[0x2E46] = true, +[0x2E47] = true, +[0x2E48] = true, +[0x2E49] = true, +[0x2E4A] = true, +[0x2E4B] = true, +[0x2E4C] = true, +[0x2E4D] = true, +[0x2E4E] = true, +[0x2E4F] = true, +[0x2E52] = true, +[0x2E53] = true, +[0x2E54] = true, +[0x2E55] = true, +[0x2E56] = true, +[0x2E57] = true, +[0x2E58] = true, +[0x2E59] = true, +[0x2E5A] = true, +[0x2E5B] = true, +[0x2E5C] = true, +[0x2E5D] = true, +[0x303F] = true, +[0xA4D0] = true, +[0xA4D1] = true, +[0xA4D2] = true, +[0xA4D3] = true, +[0xA4D4] = true, +[0xA4D5] = true, +[0xA4D6] = true, +[0xA4D7] = true, +[0xA4D8] = true, +[0xA4D9] = true, +[0xA4DA] = true, +[0xA4DB] = true, +[0xA4DC] = true, +[0xA4DD] = true, +[0xA4DE] = true, +[0xA4DF] = true, +[0xA4E0] = true, +[0xA4E1] = true, +[0xA4E2] = true, +[0xA4E3] = true, +[0xA4E4] = true, +[0xA4E5] = true, +[0xA4E6] = true, +[0xA4E7] = true, +[0xA4E8] = true, +[0xA4E9] = true, +[0xA4EA] = true, +[0xA4EB] = true, +[0xA4EC] = true, +[0xA4ED] = true, +[0xA4EE] = true, +[0xA4EF] = true, +[0xA4F0] = true, +[0xA4F1] = true, +[0xA4F2] = true, +[0xA4F3] = true, +[0xA4F4] = true, +[0xA4F5] = true, +[0xA4F6] = true, +[0xA4F7] = true, +[0xA4F8] = true, +[0xA4F9] = true, +[0xA4FA] = true, +[0xA4FB] = true, +[0xA4FC] = true, +[0xA4FD] = true, +[0xA4FE] = true, +[0xA4FF] = true, +[0xA640] = true, +[0xA641] = true, +[0xA642] = true, +[0xA643] = true, +[0xA644] = true, +[0xA645] = true, +[0xA646] = true, +[0xA647] = true, +[0xA648] = true, +[0xA649] = true, +[0xA64A] = true, +[0xA64B] = true, +[0xA64E] = true, +[0xA64F] = true, +[0xA650] = true, +[0xA651] = true, +[0xA652] = true, +[0xA653] = true, +[0xA654] = true, +[0xA655] = true, +[0xA656] = true, +[0xA657] = true, +[0xA658] = true, +[0xA659] = true, +[0xA65A] = true, +[0xA65B] = true, +[0xA65C] = true, +[0xA65D] = true, +[0xA65F] = true, +[0xA660] = true, +[0xA661] = true, +[0xA668] = true, +[0xA669] = true, +[0xA66A] = true, +[0xA66B] = true, +[0xA66F] = true, +[0xA671] = true, +[0xA673] = true, +[0xA674] = true, +[0xA675] = true, +[0xA676] = true, +[0xA677] = true, +[0xA678] = true, +[0xA679] = true, +[0xA67A] = true, +[0xA67B] = true, +[0xA67C] = true, +[0xA67D] = true, +[0xA67E] = true, +[0xA67F] = true, +[0xA680] = true, +[0xA681] = true, +[0xA682] = true, +[0xA683] = true, +[0xA686] = true, +[0xA687] = true, +[0xA688] = true, +[0xA689] = true, +[0xA68A] = true, +[0xA68B] = true, +[0xA68C] = true, +[0xA68D] = true, +[0xA68E] = true, +[0xA68F] = true, +[0xA690] = true, +[0xA691] = true, +[0xA692] = true, +[0xA693] = true, +[0xA694] = true, +[0xA695] = true, +[0xA696] = true, +[0xA697] = true, +[0xA69A] = true, +[0xA69B] = true, +[0xA69C] = true, +[0xA69D] = true, +[0xA69E] = true, +[0xA69F] = true, +[0xA6A0] = true, +[0xA6A1] = true, +[0xA6A2] = true, +[0xA6A3] = true, +[0xA6A4] = true, +[0xA6A5] = true, +[0xA6A6] = true, +[0xA6A7] = true, +[0xA6A8] = true, +[0xA6A9] = true, +[0xA6AA] = true, +[0xA6AB] = true, +[0xA6AC] = true, +[0xA6AD] = true, +[0xA6AE] = true, +[0xA6AF] = true, +[0xA6B0] = true, +[0xA6B1] = true, +[0xA6B2] = true, +[0xA6B3] = true, +[0xA6B4] = true, +[0xA6B5] = true, +[0xA6B6] = true, +[0xA6B7] = true, +[0xA6B8] = true, +[0xA6B9] = true, +[0xA6BA] = true, +[0xA6BB] = true, +[0xA6BC] = true, +[0xA6BD] = true, +[0xA6BE] = true, +[0xA6BF] = true, +[0xA6C0] = true, +[0xA6C1] = true, +[0xA6C2] = true, +[0xA6C3] = true, +[0xA6C4] = true, +[0xA6C5] = true, +[0xA6C6] = true, +[0xA6C7] = true, +[0xA6C8] = true, +[0xA6C9] = true, +[0xA6CA] = true, +[0xA6CB] = true, +[0xA6CC] = true, +[0xA6CD] = true, +[0xA6CE] = true, +[0xA6CF] = true, +[0xA6D0] = true, +[0xA6D1] = true, +[0xA6D2] = true, +[0xA6D3] = true, +[0xA6D4] = true, +[0xA6D5] = true, +[0xA6D6] = true, +[0xA6D7] = true, +[0xA6D8] = true, +[0xA6D9] = true, +[0xA6DA] = true, +[0xA6DB] = true, +[0xA6DC] = true, +[0xA6DD] = true, +[0xA6DE] = true, +[0xA6DF] = true, +[0xA6E0] = true, +[0xA6E1] = true, +[0xA6E2] = true, +[0xA6E3] = true, +[0xA6E4] = true, +[0xA6E5] = true, +[0xA6E6] = true, +[0xA6E7] = true, +[0xA6E8] = true, +[0xA6E9] = true, +[0xA6EA] = true, +[0xA6EB] = true, +[0xA6EC] = true, +[0xA6ED] = true, +[0xA6EE] = true, +[0xA6EF] = true, +[0xA6F0] = true, +[0xA6F1] = true, +[0xA6F2] = true, +[0xA6F3] = true, +[0xA6F4] = true, +[0xA6F5] = true, +[0xA6F6] = true, +[0xA6F7] = true, +[0xA700] = true, +[0xA701] = true, +[0xA702] = true, +[0xA703] = true, +[0xA704] = true, +[0xA705] = true, +[0xA706] = true, +[0xA707] = true, +[0xA708] = true, +[0xA709] = true, +[0xA70A] = true, +[0xA70B] = true, +[0xA70C] = true, +[0xA70D] = true, +[0xA70E] = true, +[0xA70F] = true, +[0xA710] = true, +[0xA711] = true, +[0xA712] = true, +[0xA713] = true, +[0xA714] = true, +[0xA715] = true, +[0xA716] = true, +[0xA717] = true, +[0xA718] = true, +[0xA719] = true, +[0xA71A] = true, +[0xA71B] = true, +[0xA71C] = true, +[0xA71D] = true, +[0xA71E] = true, +[0xA71F] = true, +[0xA720] = true, +[0xA721] = true, +[0xA722] = true, +[0xA723] = true, +[0xA724] = true, +[0xA725] = true, +[0xA726] = true, +[0xA727] = true, +[0xA72A] = true, +[0xA72B] = true, +[0xA72C] = true, +[0xA72D] = true, +[0xA72E] = true, +[0xA72F] = true, +[0xA730] = true, +[0xA731] = true, +[0xA73E] = true, +[0xA73F] = true, +[0xA740] = true, +[0xA741] = true, +[0xA742] = true, +[0xA743] = true, +[0xA744] = true, +[0xA745] = true, +[0xA746] = true, +[0xA747] = true, +[0xA748] = true, +[0xA749] = true, +[0xA74A] = true, +[0xA74B] = true, +[0xA74C] = true, +[0xA74D] = true, +[0xA750] = true, +[0xA751] = true, +[0xA752] = true, +[0xA753] = true, +[0xA754] = true, +[0xA755] = true, +[0xA756] = true, +[0xA757] = true, +[0xA75A] = true, +[0xA75B] = true, +[0xA75C] = true, +[0xA75D] = true, +[0xA75E] = true, +[0xA75F] = true, +[0xA760] = true, +[0xA761] = true, +[0xA762] = true, +[0xA763] = true, +[0xA764] = true, +[0xA765] = true, +[0xA766] = true, +[0xA767] = true, +[0xA768] = true, +[0xA769] = true, +[0xA76A] = true, +[0xA76B] = true, +[0xA76C] = true, +[0xA76D] = true, +[0xA76E] = true, +[0xA76F] = true, +[0xA770] = true, +[0xA778] = true, +[0xA779] = true, +[0xA77A] = true, +[0xA77B] = true, +[0xA77C] = true, +[0xA77D] = true, +[0xA77E] = true, +[0xA77F] = true, +[0xA780] = true, +[0xA781] = true, +[0xA782] = true, +[0xA783] = true, +[0xA784] = true, +[0xA785] = true, +[0xA786] = true, +[0xA787] = true, +[0xA788] = true, +[0xA789] = true, +[0xA78A] = true, +[0xA78B] = true, +[0xA78C] = true, +[0xA78D] = true, +[0xA78E] = true, +[0xA78F] = true, +[0xA790] = true, +[0xA791] = true, +[0xA792] = true, +[0xA793] = true, +[0xA794] = true, +[0xA795] = true, +[0xA796] = true, +[0xA797] = true, +[0xA798] = true, +[0xA799] = true, +[0xA79A] = true, +[0xA79B] = true, +[0xA79C] = true, +[0xA79D] = true, +[0xA79E] = true, +[0xA79F] = true, +[0xA7A0] = true, +[0xA7A1] = true, +[0xA7A2] = true, +[0xA7A3] = true, +[0xA7A4] = true, +[0xA7A5] = true, +[0xA7A6] = true, +[0xA7A7] = true, +[0xA7A8] = true, +[0xA7A9] = true, +[0xA7AA] = true, +[0xA7AB] = true, +[0xA7AC] = true, +[0xA7AD] = true, +[0xA7AE] = true, +[0xA7AF] = true, +[0xA7B0] = true, +[0xA7B1] = true, +[0xA7B2] = true, +[0xA7B3] = true, +[0xA7B4] = true, +[0xA7B5] = true, +[0xA7B6] = true, +[0xA7B7] = true, +[0xA7B8] = true, +[0xA7B9] = true, +[0xA7BA] = true, +[0xA7BB] = true, +[0xA7BC] = true, +[0xA7BD] = true, +[0xA7BE] = true, +[0xA7BF] = true, +[0xA7C0] = true, +[0xA7C1] = true, +[0xA7C4] = true, +[0xA7C5] = true, +[0xA7C6] = true, +[0xA7C7] = true, +[0xA7C8] = true, +[0xA7C9] = true, +[0xA7CA] = true, +[0xA7D0] = true, +[0xA7D1] = true, +[0xA7D3] = true, +[0xA7D5] = true, +[0xA7D6] = true, +[0xA7D7] = true, +[0xA7D8] = true, +[0xA7D9] = true, +[0xA7F2] = true, +[0xA7F3] = true, +[0xA7F4] = true, +[0xA7F5] = true, +[0xA7F6] = true, +[0xA7F7] = true, +[0xA7F8] = true, +[0xA7F9] = true, +[0xA7FA] = true, +[0xA7FB] = true, +[0xA7FC] = true, +[0xA7FD] = true, +[0xA7FE] = true, +[0xA828] = true, +[0xA829] = true, +[0xAB30] = true, +[0xAB31] = true, +[0xAB32] = true, +[0xAB33] = true, +[0xAB34] = true, +[0xAB35] = true, +[0xAB36] = true, +[0xAB37] = true, +[0xAB38] = true, +[0xAB39] = true, +[0xAB3A] = true, +[0xAB3B] = true, +[0xAB3C] = true, +[0xAB3D] = true, +[0xAB3E] = true, +[0xAB3F] = true, +[0xAB40] = true, +[0xAB41] = true, +[0xAB42] = true, +[0xAB43] = true, +[0xAB44] = true, +[0xAB45] = true, +[0xAB46] = true, +[0xAB47] = true, +[0xAB48] = true, +[0xAB49] = true, +[0xAB4A] = true, +[0xAB4B] = true, +[0xAB4C] = true, +[0xAB4D] = true, +[0xAB4E] = true, +[0xAB4F] = true, +[0xAB50] = true, +[0xAB51] = true, +[0xAB52] = true, +[0xAB53] = true, +[0xAB54] = true, +[0xAB55] = true, +[0xAB56] = true, +[0xAB57] = true, +[0xAB58] = true, +[0xAB59] = true, +[0xAB5A] = true, +[0xAB5B] = true, +[0xAB5C] = true, +[0xAB5D] = true, +[0xAB5E] = true, +[0xAB5F] = true, +[0xAB60] = true, +[0xAB61] = true, +[0xAB62] = true, +[0xAB63] = true, +[0xAB64] = true, +[0xAB65] = true, +[0xAB68] = true, +[0xAB69] = true, +[0xAB6A] = true, +[0xAB6B] = true, +[0xAB70] = true, +[0xAB71] = true, +[0xAB72] = true, +[0xAB73] = true, +[0xAB74] = true, +[0xAB75] = true, +[0xAB76] = true, +[0xAB77] = true, +[0xAB78] = true, +[0xAB79] = true, +[0xAB7A] = true, +[0xAB7B] = true, +[0xAB7C] = true, +[0xAB7D] = true, +[0xAB7E] = true, +[0xAB7F] = true, +[0xAB80] = true, +[0xAB81] = true, +[0xAB82] = true, +[0xAB83] = true, +[0xAB84] = true, +[0xAB85] = true, +[0xAB86] = true, +[0xAB87] = true, +[0xAB88] = true, +[0xAB89] = true, +[0xAB8A] = true, +[0xAB8B] = true, +[0xAB8C] = true, +[0xAB8D] = true, +[0xAB8E] = true, +[0xAB8F] = true, +[0xAB90] = true, +[0xAB91] = true, +[0xAB92] = true, +[0xAB93] = true, +[0xAB94] = true, +[0xAB95] = true, +[0xAB96] = true, +[0xAB97] = true, +[0xAB98] = true, +[0xAB99] = true, +[0xAB9A] = true, +[0xAB9B] = true, +[0xAB9C] = true, +[0xAB9D] = true, +[0xAB9E] = true, +[0xAB9F] = true, +[0xABA0] = true, +[0xABA1] = true, +[0xABA2] = true, +[0xABA3] = true, +[0xABA4] = true, +[0xABA5] = true, +[0xABA6] = true, +[0xABA7] = true, +[0xABA8] = true, +[0xABA9] = true, +[0xABAA] = true, +[0xABAB] = true, +[0xABAC] = true, +[0xABAD] = true, +[0xABAE] = true, +[0xABAF] = true, +[0xABB0] = true, +[0xABB1] = true, +[0xABB2] = true, +[0xABB3] = true, +[0xABB4] = true, +[0xABB5] = true, +[0xABB6] = true, +[0xABB7] = true, +[0xABB8] = true, +[0xABB9] = true, +[0xABBA] = true, +[0xABBB] = true, +[0xABBC] = true, +[0xABBD] = true, +[0xABBE] = true, +[0xABBF] = true, +[0xFB00] = true, +[0xFB01] = true, +[0xFB02] = true, +[0xFB03] = true, +[0xFB04] = true, +[0xFB05] = true, +[0xFB06] = true, +[0xFB13] = true, +[0xFB14] = true, +[0xFB15] = true, +[0xFB16] = true, +[0xFB17] = true, +[0xFB1D] = true, +[0xFB1E] = true, +[0xFB1F] = true, +[0xFB20] = true, +[0xFB29] = true, +[0xFB2A] = true, +[0xFB2B] = true, +[0xFB2C] = true, +[0xFB2D] = true, +[0xFB2E] = true, +[0xFB2F] = true, +[0xFB30] = true, +[0xFB31] = true, +[0xFB32] = true, +[0xFB33] = true, +[0xFB34] = true, +[0xFB35] = true, +[0xFB36] = true, +[0xFB38] = true, +[0xFB39] = true, +[0xFB3A] = true, +[0xFB3B] = true, +[0xFB3C] = true, +[0xFB3E] = true, +[0xFB40] = true, +[0xFB41] = true, +[0xFB43] = true, +[0xFB44] = true, +[0xFB46] = true, +[0xFB47] = true, +[0xFB48] = true, +[0xFB49] = true, +[0xFB4A] = true, +[0xFB4B] = true, +[0xFB4C] = true, +[0xFB4D] = true, +[0xFB4E] = true, +[0xFB4F] = true, +[0xFB50] = true, +[0xFB51] = true, +[0xFB52] = true, +[0xFB53] = true, +[0xFB54] = true, +[0xFB55] = true, +[0xFB56] = true, +[0xFB57] = true, +[0xFB58] = true, +[0xFB59] = true, +[0xFB5A] = true, +[0xFB5B] = true, +[0xFB5C] = true, +[0xFB5D] = true, +[0xFB5E] = true, +[0xFB5F] = true, +[0xFB60] = true, +[0xFB61] = true, +[0xFB62] = true, +[0xFB63] = true, +[0xFB64] = true, +[0xFB65] = true, +[0xFB66] = true, +[0xFB67] = true, +[0xFB68] = true, +[0xFB69] = true, +[0xFB6A] = true, +[0xFB6B] = true, +[0xFB6C] = true, +[0xFB6D] = true, +[0xFB6E] = true, +[0xFB6F] = true, +[0xFB70] = true, +[0xFB71] = true, +[0xFB72] = true, +[0xFB73] = true, +[0xFB74] = true, +[0xFB75] = true, +[0xFB76] = true, +[0xFB77] = true, +[0xFB78] = true, +[0xFB79] = true, +[0xFB7A] = true, +[0xFB7B] = true, +[0xFB7C] = true, +[0xFB7D] = true, +[0xFB7E] = true, +[0xFB7F] = true, +[0xFB80] = true, +[0xFB81] = true, +[0xFB82] = true, +[0xFB83] = true, +[0xFB84] = true, +[0xFB85] = true, +[0xFB86] = true, +[0xFB87] = true, +[0xFB88] = true, +[0xFB89] = true, +[0xFB8A] = true, +[0xFB8B] = true, +[0xFB8C] = true, +[0xFB8D] = true, +[0xFB8E] = true, +[0xFB8F] = true, +[0xFB90] = true, +[0xFB91] = true, +[0xFB92] = true, +[0xFB93] = true, +[0xFB94] = true, +[0xFB95] = true, +[0xFB96] = true, +[0xFB97] = true, +[0xFB98] = true, +[0xFB99] = true, +[0xFB9A] = true, +[0xFB9B] = true, +[0xFB9C] = true, +[0xFB9D] = true, +[0xFB9E] = true, +[0xFB9F] = true, +[0xFBA0] = true, +[0xFBA1] = true, +[0xFBA2] = true, +[0xFBA3] = true, +[0xFBA4] = true, +[0xFBA5] = true, +[0xFBA6] = true, +[0xFBA7] = true, +[0xFBA8] = true, +[0xFBA9] = true, +[0xFBAA] = true, +[0xFBAB] = true, +[0xFBAC] = true, +[0xFBAD] = true, +[0xFBAE] = true, +[0xFBAF] = true, +[0xFBB0] = true, +[0xFBB1] = true, +[0xFBB2] = true, +[0xFBB3] = true, +[0xFBB4] = true, +[0xFBB5] = true, +[0xFBB6] = true, +[0xFBB7] = true, +[0xFBB8] = true, +[0xFBB9] = true, +[0xFBBA] = true, +[0xFBBB] = true, +[0xFBBC] = true, +[0xFBBD] = true, +[0xFBBE] = true, +[0xFBBF] = true, +[0xFBC0] = true, +[0xFBC1] = true, +[0xFBC2] = true, +[0xFBD3] = true, +[0xFBD4] = true, +[0xFBD5] = true, +[0xFBD6] = true, +[0xFBD7] = true, +[0xFBD8] = true, +[0xFBD9] = true, +[0xFBDA] = true, +[0xFBDB] = true, +[0xFBDC] = true, +[0xFBDD] = true, +[0xFBDE] = true, +[0xFBDF] = true, +[0xFBE0] = true, +[0xFBE1] = true, +[0xFBE2] = true, +[0xFBE3] = true, +[0xFBE4] = true, +[0xFBE5] = true, +[0xFBE6] = true, +[0xFBE7] = true, +[0xFBE8] = true, +[0xFBE9] = true, +[0xFBEA] = true, +[0xFBEB] = true, +[0xFBEC] = true, +[0xFBED] = true, +[0xFBEE] = true, +[0xFBEF] = true, +[0xFBF0] = true, +[0xFBF1] = true, +[0xFBF2] = true, +[0xFBF3] = true, +[0xFBF4] = true, +[0xFBF5] = true, +[0xFBF6] = true, +[0xFBF7] = true, +[0xFBF8] = true, +[0xFBF9] = true, +[0xFBFA] = true, +[0xFBFB] = true, +[0xFBFC] = true, +[0xFBFD] = true, +[0xFBFE] = true, +[0xFBFF] = true, +[0xFC00] = true, +[0xFC01] = true, +[0xFC02] = true, +[0xFC03] = true, +[0xFC04] = true, +[0xFC05] = true, +[0xFC06] = true, +[0xFC07] = true, +[0xFC08] = true, +[0xFC09] = true, +[0xFC0A] = true, +[0xFC0B] = true, +[0xFC0C] = true, +[0xFC0D] = true, +[0xFC0E] = true, +[0xFC0F] = true, +[0xFC10] = true, +[0xFC11] = true, +[0xFC12] = true, +[0xFC13] = true, +[0xFC14] = true, +[0xFC15] = true, +[0xFC16] = true, +[0xFC17] = true, +[0xFC18] = true, +[0xFC19] = true, +[0xFC1A] = true, +[0xFC1B] = true, +[0xFC1C] = true, +[0xFC1D] = true, +[0xFC1E] = true, +[0xFC20] = true, +[0xFC22] = true, +[0xFC23] = true, +[0xFC24] = true, +[0xFC26] = true, +[0xFC27] = true, +[0xFC28] = true, +[0xFC29] = true, +[0xFC2A] = true, +[0xFC2B] = true, +[0xFC2C] = true, +[0xFC2D] = true, +[0xFC2E] = true, +[0xFC2F] = true, +[0xFC30] = true, +[0xFC31] = true, +[0xFC32] = true, +[0xFC33] = true, +[0xFC34] = true, +[0xFC35] = true, +[0xFC36] = true, +[0xFC37] = true, +[0xFC38] = true, +[0xFC39] = true, +[0xFC3A] = true, +[0xFC3B] = true, +[0xFC3C] = true, +[0xFC3F] = true, +[0xFC40] = true, +[0xFC41] = true, +[0xFC42] = true, +[0xFC43] = true, +[0xFC44] = true, +[0xFC45] = true, +[0xFC46] = true, +[0xFC47] = true, +[0xFC48] = true, +[0xFC49] = true, +[0xFC4A] = true, +[0xFC4B] = true, +[0xFC4C] = true, +[0xFC4D] = true, +[0xFC4E] = true, +[0xFC4F] = true, +[0xFC50] = true, +[0xFC51] = true, +[0xFC52] = true, +[0xFC53] = true, +[0xFC54] = true, +[0xFC55] = true, +[0xFC56] = true, +[0xFC57] = true, +[0xFC58] = true, +[0xFC59] = true, +[0xFC5A] = true, +[0xFC5B] = true, +[0xFC5C] = true, +[0xFC5D] = true, +[0xFC5E] = true, +[0xFC5F] = true, +[0xFC60] = true, +[0xFC61] = true, +[0xFC62] = true, +[0xFC63] = true, +[0xFC64] = true, +[0xFC65] = true, +[0xFC66] = true, +[0xFC67] = true, +[0xFC68] = true, +[0xFC69] = true, +[0xFC6A] = true, +[0xFC6B] = true, +[0xFC6C] = true, +[0xFC6D] = true, +[0xFC6E] = true, +[0xFC6F] = true, +[0xFC70] = true, +[0xFC71] = true, +[0xFC72] = true, +[0xFC73] = true, +[0xFC74] = true, +[0xFC75] = true, +[0xFC76] = true, +[0xFC77] = true, +[0xFC78] = true, +[0xFC79] = true, +[0xFC7A] = true, +[0xFC7B] = true, +[0xFC7C] = true, +[0xFC7D] = true, +[0xFC7E] = true, +[0xFC7F] = true, +[0xFC80] = true, +[0xFC81] = true, +[0xFC82] = true, +[0xFC83] = true, +[0xFC84] = true, +[0xFC85] = true, +[0xFC86] = true, +[0xFC87] = true, +[0xFC88] = true, +[0xFC89] = true, +[0xFC8A] = true, +[0xFC8B] = true, +[0xFC8C] = true, +[0xFC8D] = true, +[0xFC8E] = true, +[0xFC8F] = true, +[0xFC90] = true, +[0xFC91] = true, +[0xFC92] = true, +[0xFC93] = true, +[0xFC94] = true, +[0xFC95] = true, +[0xFC96] = true, +[0xFC97] = true, +[0xFC98] = true, +[0xFC99] = true, +[0xFC9A] = true, +[0xFC9B] = true, +[0xFC9C] = true, +[0xFC9D] = true, +[0xFC9E] = true, +[0xFC9F] = true, +[0xFCA0] = true, +[0xFCA1] = true, +[0xFCA2] = true, +[0xFCA3] = true, +[0xFCA4] = true, +[0xFCA5] = true, +[0xFCA6] = true, +[0xFCA7] = true, +[0xFCA8] = true, +[0xFCA9] = true, +[0xFCAA] = true, +[0xFCAB] = true, +[0xFCAC] = true, +[0xFCB0] = true, +[0xFCB8] = true, +[0xFCB9] = true, +[0xFCBA] = true, +[0xFCBB] = true, +[0xFCBC] = true, +[0xFCBD] = true, +[0xFCBE] = true, +[0xFCBF] = true, +[0xFCC0] = true, +[0xFCC1] = true, +[0xFCC2] = true, +[0xFCC3] = true, +[0xFCC4] = true, +[0xFCC5] = true, +[0xFCC6] = true, +[0xFCC7] = true, +[0xFCC8] = true, +[0xFCC9] = true, +[0xFCCA] = true, +[0xFCCB] = true, +[0xFCCC] = true, +[0xFCCD] = true, +[0xFCCE] = true, +[0xFCCF] = true, +[0xFCD0] = true, +[0xFCD1] = true, +[0xFCD2] = true, +[0xFCD3] = true, +[0xFCD4] = true, +[0xFCD5] = true, +[0xFCD6] = true, +[0xFCD7] = true, +[0xFCD8] = true, +[0xFCD9] = true, +[0xFCDA] = true, +[0xFCDB] = true, +[0xFCDC] = true, +[0xFCDD] = true, +[0xFCDE] = true, +[0xFCDF] = true, +[0xFCE0] = true, +[0xFCE1] = true, +[0xFCE2] = true, +[0xFCE3] = true, +[0xFCE4] = true, +[0xFCE5] = true, +[0xFCE6] = true, +[0xFCEB] = true, +[0xFCEC] = true, +[0xFCED] = true, +[0xFCEE] = true, +[0xFCEF] = true, +[0xFCF0] = true, +[0xFCF1] = true, +[0xFCF2] = true, +[0xFCF3] = true, +[0xFCF4] = true, +[0xFCF5] = true, +[0xFCF6] = true, +[0xFCF7] = true, +[0xFCF8] = true, +[0xFCF9] = true, +[0xFCFA] = true, +[0xFCFF] = true, +[0xFD00] = true, +[0xFD01] = true, +[0xFD02] = true, +[0xFD03] = true, +[0xFD04] = true, +[0xFD05] = true, +[0xFD06] = true, +[0xFD07] = true, +[0xFD08] = true, +[0xFD09] = true, +[0xFD0A] = true, +[0xFD0B] = true, +[0xFD0C] = true, +[0xFD0D] = true, +[0xFD0E] = true, +[0xFD0F] = true, +[0xFD10] = true, +[0xFD11] = true, +[0xFD12] = true, +[0xFD13] = true, +[0xFD14] = true, +[0xFD15] = true, +[0xFD16] = true, +[0xFD21] = true, +[0xFD22] = true, +[0xFD23] = true, +[0xFD24] = true, +[0xFD25] = true, +[0xFD26] = true, +[0xFD27] = true, +[0xFD28] = true, +[0xFD29] = true, +[0xFD2A] = true, +[0xFD2B] = true, +[0xFD2C] = true, +[0xFD33] = true, +[0xFD3A] = true, +[0xFD3B] = true, +[0xFD3C] = true, +[0xFD3D] = true, +[0xFE20] = true, +[0xFE21] = true, +[0xFE22] = true, +[0xFE23] = true, +[0xFE24] = true, +[0xFE25] = true, +[0xFE26] = true, +[0xFE27] = true, +[0xFE28] = true, +[0xFE29] = true, +[0xFE2A] = true, +[0xFE2B] = true, +[0xFE2C] = true, +[0xFE2D] = true, +[0xFE2E] = true, +[0xFE2F] = true, +[0xFE70] = true, +[0xFE71] = true, +[0xFE72] = true, +[0xFE73] = true, +[0xFE74] = true, +[0xFE76] = true, +[0xFE77] = true, +[0xFE78] = true, +[0xFE79] = true, +[0xFE7A] = true, +[0xFE7B] = true, +[0xFE7C] = true, +[0xFE7D] = true, +[0xFE7E] = true, +[0xFE7F] = true, +[0xFE80] = true, +[0xFE81] = true, +[0xFE82] = true, +[0xFE83] = true, +[0xFE84] = true, +[0xFE85] = true, +[0xFE86] = true, +[0xFE87] = true, +[0xFE88] = true, +[0xFE89] = true, +[0xFE8A] = true, +[0xFE8B] = true, +[0xFE8C] = true, +[0xFE8D] = true, +[0xFE8E] = true, +[0xFE8F] = true, +[0xFE90] = true, +[0xFE91] = true, +[0xFE92] = true, +[0xFE93] = true, +[0xFE94] = true, +[0xFE95] = true, +[0xFE96] = true, +[0xFE97] = true, +[0xFE98] = true, +[0xFE99] = true, +[0xFE9A] = true, +[0xFE9B] = true, +[0xFE9C] = true, +[0xFE9D] = true, +[0xFE9E] = true, +[0xFE9F] = true, +[0xFEA0] = true, +[0xFEA1] = true, +[0xFEA2] = true, +[0xFEA3] = true, +[0xFEA4] = true, +[0xFEA5] = true, +[0xFEA6] = true, +[0xFEA7] = true, +[0xFEA8] = true, +[0xFEA9] = true, +[0xFEAA] = true, +[0xFEAB] = true, +[0xFEAC] = true, +[0xFEAD] = true, +[0xFEAE] = true, +[0xFEAF] = true, +[0xFEB0] = true, +[0xFEB1] = true, +[0xFEB2] = true, +[0xFEB3] = true, +[0xFEB4] = true, +[0xFEB5] = true, +[0xFEB6] = true, +[0xFEB7] = true, +[0xFEB8] = true, +[0xFEB9] = true, +[0xFEBA] = true, +[0xFEBB] = true, +[0xFEBC] = true, +[0xFEBD] = true, +[0xFEBE] = true, +[0xFEBF] = true, +[0xFEC0] = true, +[0xFEC1] = true, +[0xFEC2] = true, +[0xFEC3] = true, +[0xFEC4] = true, +[0xFEC5] = true, +[0xFEC6] = true, +[0xFEC7] = true, +[0xFEC8] = true, +[0xFEC9] = true, +[0xFECA] = true, +[0xFECB] = true, +[0xFECC] = true, +[0xFECD] = true, +[0xFECE] = true, +[0xFECF] = true, +[0xFED0] = true, +[0xFED1] = true, +[0xFED2] = true, +[0xFED3] = true, +[0xFED4] = true, +[0xFED5] = true, +[0xFED6] = true, +[0xFED7] = true, +[0xFED8] = true, +[0xFED9] = true, +[0xFEDA] = true, +[0xFEDB] = true, +[0xFEDC] = true, +[0xFEDD] = true, +[0xFEDE] = true, +[0xFEDF] = true, +[0xFEE0] = true, +[0xFEE1] = true, +[0xFEE2] = true, +[0xFEE3] = true, +[0xFEE4] = true, +[0xFEE5] = true, +[0xFEE6] = true, +[0xFEE7] = true, +[0xFEE8] = true, +[0xFEE9] = true, +[0xFEEA] = true, +[0xFEEB] = true, +[0xFEEC] = true, +[0xFEED] = true, +[0xFEEE] = true, +[0xFEEF] = true, +[0xFEF0] = true, +[0xFEF1] = true, +[0xFEF2] = true, +[0xFEF3] = true, +[0xFEF4] = true, +[0xFEF5] = true, +[0xFEF6] = true, +[0xFEF7] = true, +[0xFEF8] = true, +[0xFEF9] = true, +[0xFEFA] = true, +[0xFEFB] = true, +[0xFEFC] = true, +[0xFF61] = true, +[0xFF62] = true, +[0xFF63] = true, +[0xFF64] = true, +[0xFF65] = true, +[0xFF66] = true, +[0xFF67] = true, +[0xFF68] = true, +[0xFF69] = true, +[0xFF6A] = true, +[0xFF6B] = true, +[0xFF6C] = true, +[0xFF6D] = true, +[0xFF6E] = true, +[0xFF6F] = true, +[0xFF70] = true, +[0xFF71] = true, +[0xFF72] = true, +[0xFF73] = true, +[0xFF74] = true, +[0xFF75] = true, +[0xFF76] = true, +[0xFF77] = true, +[0xFF78] = true, +[0xFF79] = true, +[0xFF7A] = true, +[0xFF7B] = true, +[0xFF7C] = true, +[0xFF7D] = true, +[0xFF7E] = true, +[0xFF7F] = true, +[0xFF80] = true, +[0xFF81] = true, +[0xFF82] = true, +[0xFF83] = true, +[0xFF84] = true, +[0xFF85] = true, +[0xFF86] = true, +[0xFF87] = true, +[0xFF88] = true, +[0xFF89] = true, +[0xFF8A] = true, +[0xFF8B] = true, +[0xFF8C] = true, +[0xFF8D] = true, +[0xFF8E] = true, +[0xFF8F] = true, +[0xFF90] = true, +[0xFF91] = true, +[0xFF92] = true, +[0xFF93] = true, +[0xFF94] = true, +[0xFF95] = true, +[0xFF96] = true, +[0xFF97] = true, +[0xFF98] = true, +[0xFF99] = true, +[0xFF9A] = true, +[0xFF9B] = true, +[0xFF9C] = true, +[0xFF9D] = true, +[0xFF9E] = true, +[0xFF9F] = true, +[0xFFA0] = true, +[0xFFA1] = true, +[0xFFA2] = true, +[0xFFA3] = true, +[0xFFA4] = true, +[0xFFA5] = true, +[0xFFA6] = true, +[0xFFA7] = true, +[0xFFA8] = true, +[0xFFA9] = true, +[0xFFAA] = true, +[0xFFAB] = true, +[0xFFAC] = true, +[0xFFAD] = true, +[0xFFAE] = true, +[0xFFAF] = true, +[0xFFB0] = true, +[0xFFB1] = true, +[0xFFB2] = true, +[0xFFB3] = true, +[0xFFB4] = true, +[0xFFB5] = true, +[0xFFB6] = true, +[0xFFB7] = true, +[0xFFB8] = true, +[0xFFB9] = true, +[0xFFBA] = true, +[0xFFBB] = true, +[0xFFBC] = true, +[0xFFBD] = true, +[0xFFBE] = true, +[0xFFC2] = true, +[0xFFC3] = true, +[0xFFC4] = true, +[0xFFC5] = true, +[0xFFC6] = true, +[0xFFC7] = true, +[0xFFCA] = true, +[0xFFCB] = true, +[0xFFCC] = true, +[0xFFCD] = true, +[0xFFCE] = true, +[0xFFCF] = true, +[0xFFD2] = true, +[0xFFD3] = true, +[0xFFD4] = true, +[0xFFD5] = true, +[0xFFD6] = true, +[0xFFD7] = true, +[0xFFDA] = true, +[0xFFDB] = true, +[0xFFDC] = true, +[0xFFE8] = true, +[0xFFE9] = true, +[0xFFEA] = true, +[0xFFEB] = true, +[0xFFEC] = true, +[0xFFED] = true, +[0xFFEE] = true, +[0xFFFD] = true, +} diff --git a/mods/signs_lib/util/LICENSE b/mods/signs_lib/util/LICENSE new file mode 100644 index 00000000..632f8526 --- /dev/null +++ b/mods/signs_lib/util/LICENSE @@ -0,0 +1,167 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + diff --git a/mods/signs_lib/util/README.md b/mods/signs_lib/util/README.md new file mode 100644 index 00000000..5bbc9246 --- /dev/null +++ b/mods/signs_lib/util/README.md @@ -0,0 +1,36 @@ +# signs-font-generate + +This is a collection of helper shell scripts to create textures for +international characters to be used with the +[signs_lib](https://gitlab.com/VanessaE/signs_lib) Minetest mod. + +They currently expect the +[Liberation Fonts](https://github.com/liberationfonts/liberation-fonts) to be +installed at "/usr/share/fonts/truetype/liberation". + +ImageMagick is also required. + +## Basic usage + +sh create-signs-lib-overlay.sh + +For example, this command will write textures for the non-ASCII characters +of the French language to "/home/user/signs_lib": + +sh create-signs-lib-overlay.sh /home/user/signs_lib fr + +Currently, there is support for German (de), French (fr) and Polish (pl) +non-ASCII characters. + +## Character alignment + +I chose the image processing parameters in order fairly match the alignment of +the existing signs_lib textures. In order to get even better alignment at +the expense of slightly smaller textures, it is possible to also replace +existing ASCII character textures: + +sh write-ascii.sh + +For example, with signs_lib residing at "/home/user/signs_lib": + +sh write-ascii.sh /home/user/signs_lib/textures diff --git a/mods/signs_lib/util/nonascii-de b/mods/signs_lib/util/nonascii-de new file mode 100644 index 00000000..0b5dfce4 --- /dev/null +++ b/mods/signs_lib/util/nonascii-de @@ -0,0 +1,7 @@ +ä +ö +ü +ß +Ä +Ö +Ü diff --git a/mods/signs_lib/util/nonascii-fr b/mods/signs_lib/util/nonascii-fr new file mode 100644 index 00000000..01747254 --- /dev/null +++ b/mods/signs_lib/util/nonascii-fr @@ -0,0 +1,16 @@ +à +æ +ç +é +è +ê +ô +ù +À +Æ +Ç +É +È +Ê +Ô +Ù diff --git a/mods/signs_lib/util/nonascii-pl b/mods/signs_lib/util/nonascii-pl new file mode 100644 index 00000000..c43767be --- /dev/null +++ b/mods/signs_lib/util/nonascii-pl @@ -0,0 +1,16 @@ +ż +ź +ć +Å› +ó +Ä… +Ä™ +Å‚ +Å» +Ź +Ć +Åš +Ó +Ä„ +Ę +Å diff --git a/mods/signs_lib/util/nonascii-ua b/mods/signs_lib/util/nonascii-ua new file mode 100644 index 00000000..ac014151 --- /dev/null +++ b/mods/signs_lib/util/nonascii-ua @@ -0,0 +1,8 @@ +Ò‘ +Ñ– +Ñ— +Ñ” +Ò +І +Ї +Є \ No newline at end of file diff --git a/mods/skinsdb/.luacheckrc b/mods/skinsdb/.luacheckrc new file mode 100644 index 00000000..3b47b2d6 --- /dev/null +++ b/mods/skinsdb/.luacheckrc @@ -0,0 +1,14 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +globals = { + "minetest", "unified_inventory", "core", + "player_api", "clothing", "armor", "sfinv", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + "hand_monoid", +} diff --git a/mods/skinsdb/API.md b/mods/skinsdb/API.md new file mode 100644 index 00000000..c60c7606 --- /dev/null +++ b/mods/skinsdb/API.md @@ -0,0 +1,128 @@ +# Skinsdb Interface + +## skins.get_player_skin(player) +Return the skin object assigned to the player. Returns default if nothing assigned + +## skins.assign_player_skin(player, skin) +Check if allowed and assign the skin for the player without visual updates. The "skin" parameter could be the skin key or the skin object +Returns false if skin is not valid or applicable to player + +## skins.update_player_skin(player) +Update selected skin visuals on player + +## skins.set_player_skin(player, skin) +Function for external usage on skin selection. This function assign the skin, call the skin:set_skin(player) hook to update dynamic skins, then update the visuals + +## skins.get_skin_format(file) +Returns the skin format version ("1.0" or "1.8"). File is an open file handle to the texture file + + +## skins.get_skinlist(assignment, select_unassigned) +Obsolete - use get_skinlist_for_player() or get_skinlist_with_meta() instead + +## skins.get_skinlist_for_player(playername) +Get all allowed skins for player. All public and all player's private skins. If playername not given only public skins returned + +## skins.get_skinlist_with_meta(key, value) +Get all skins with metadata key is set to value. Example: +skins.get_skinlist_with_meta("playername", playername) - Get all private skins (w.o. public) for playername + +## skins.register_skin(path, filename) +Registers a new skin based on the texture file path specified by `path` and `filename`. + + * `path` (string): points to the parent directory of the texture `filename`. + Generally, this should be in the format `mymod.modpath .. "/textures"`. + * `filename` (string): full file name, without any path specifications. + The file name must adhere to [one of the accepted naming formats](textures/readme.txt). + +Note: this function takes the following files into consideration: + +1. `/` (required) + * Main skin texture +2. `/preview.png` (optional) + * Pre-generated preview image +3. `/../meta/.txt` (optional) + * Metadata regarding the skin + +Return values: + + * On failure: `false, reason` + * `reason` (string): human readable reason string (similar to `io.open` errors) + * On success: `true, key` + * `key`: unique skins key for use with e.g. `skins.get(key)` for subsequent + fine-tuning of the skin registration. + + +## skins.new(key, object) +Create and register a new skin object for given key + - key: Unique skins key, like "character_1" + - object: Optional. Could be a prepared object with redefinitions + +## skins.get(key) +Get existing skin object + +HINT: During build-up phase maybe the next statement is usefull +``` +local skin = skins.get(name) or skins.new(name) +``` + + +# Skin object + +## skin:get_key() +Get the unique skin key + +## skin:set_texture(texture) +Set the skin texture - usually at the init time only + +## skin:get_texture() +Get the skin texture for any reason. Note to apply them the skin:set_skin() should be used + +Could be redefined for dynamic texture generation + +## skin:set_hand(hand_node) +Set the hand node to be used with this skin + +## skin:set_hand_from_texture() +Register and set hand node based on skin texture. +Uses different model depending on get_meta("format") ("1.0" or "1.8") +Only works on mod load + +## skin:get_hand() +Get hand node. Returns ItemStack + +## skin:set_preview(texture) +Set the skin preview - usually at the init time only + +## skin:get_preview() +Get the skin preview + +Could be redefined for dynamic preview texture generation + +## skin:set_skin(player) +Hook for dynamic skins updates on select. Is called in skins.set_player_skin() +In skinsdb the default implementation for this function is empty. + +## skin:apply_skin_to_player(player) +Apply the skin to the player. Called in skins.update_player_skin() to update visuals + +## skin:set_meta(key, value) +Add a meta information to the skin object + +Note: the information is not stored, therefore should be filled each time during skins registration + +## skin:get_meta(key) +The next metadata keys are filled or/and used interally in skinsdb framework + - name - A name for the skin + - author - The skin author + - license - THe skin texture license + - assignment - (obsolete) is "player:playername" in case the skin is assigned to be private for a player + - playername - Player assignment for private skin. Set false for skins not usable by all players (like NPC-Skins), true or nothing for all player skins + - in_inventory_list - If set to false the skin is not visible in inventory skins selection but can be still applied to the player + - _sort_id - Thi skins lists are sorted by this field for output (internal key) + +## skin:get_meta_string(key) +Same as get_meta() but does return "" instead of nil if the meta key does not exists + +## skin:is_applicable_for_player(playername) +Returns whether this skin is applicable for player "playername" or not, like private skins diff --git a/mods/skinsdb/CREDITS.md b/mods/skinsdb/CREDITS.md new file mode 100644 index 00000000..4b930359 --- /dev/null +++ b/mods/skinsdb/CREDITS.md @@ -0,0 +1,14 @@ +The character textures in this mod are listed/credited below by license and author. Textures and metadata were downloaded from [the online SkinsDB service](https://skinsdb.terraqueststudios.net/). Changes were not made to these works; they are distributed in their original form. + +- Characters released under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) + - "Farmer1" by sdzen (character_1.png) + - "Male" by TenPlus1 (character_2.png) + - "Female" by TenPlus1 (character_3.png) + - "Adventer girl" by lovehart (character_5.png) + - "Oliver_MV" by hansuke123 (character_6.png) + - "Flower Girl" by julito (character_7.png) + - "Trader 1" by TenPlus1 (character_8.png) + - "Angelo" by Extex (character_9.png) + - "santa" by jordan4ibanez (character_10.png) +- Characters released under [CC0](https://creativecommons.org/publicdomain/zero/1.0/) + - "mbb_old" by mbb (character_4.png) \ No newline at end of file diff --git a/mods/skinsdb/README.md b/mods/skinsdb/README.md new file mode 100644 index 00000000..4c5c26b6 --- /dev/null +++ b/mods/skinsdb/README.md @@ -0,0 +1,68 @@ +# skinsdb + +This Minetest mod offers changeable player skins with a graphical interface for multiple inventory mods. + +## Features + +- Flexible skins API to manage the database +- [character_creator](https://github.com/minetest-mods/character_creator) support for custom skins +- Skin change menu for sfinv (in minetest_game) and [unified_inventory](https://forum.minetest.net/viewtopic.php?t=12767) +- Skins change menu and command line using chat command /skinsdb (set | show | list | list private | list public | ui) +- Supported by [smart_inventory](https://forum.minetest.net/viewtopic.php?t=16597) for the skin selection +- Supported by [i3](https://github.com/minetest-mods/i3) inventory mod +- Skin previews supported in selection +- Additional information for each skin +- Support for different skins lists: public and a per-player list are currently implemented +- Full [3d_armor](https://forum.minetest.net/viewtopic.php?t=4654) support +- Compatible to 1.0 and 1.8 Minecraft skins format +- Skinned hand in 1st person view (1.0 skins only) + + +## Installing skins + +### Download from the [database](https://skinsdb.terraqueststudios.net/) + +#### Ingame Downloader + +1) Get Minetest 5.1.0-dev-cb00632 or newer +2) In the settings menu show advanced options, find the "Developer Options" tab and add "skinsdb" to "Trusted mods" (secure.trusted_mods in minetest.conf) +3) Start your world +4) Run `/skinsdb_download_skins ` +5) Wait for the Minetest server to shut down +6) Start the server again + +You might want to run `minetest` in a Terminal/Console window to check the log output instantly. + +#### Python Download script + +**Requirements:** + + * Python 3 + * `requests` library: `pip3 install requests` + +Go to the updater folder of this mod and run `python3 update_skins.py` +The Script will download all the skins from the database for you. + +### Manual addition + +1) Copy your skin textures to `textures` as documented in `textures/readme.txt` +2) Create `meta/character_.txt` with the following fields (separated by new lines): + * Skin name + * Author + * Skin license + + +## License: +- GPLv3 +- skin texture licenses: See "meta" folder +- hand model: CC0 + +### Credits + +- RealBadAngel (unified_inventory) +- Zeg9 (skinsdb) +- cornernote (source code) +- Krock (source code) +- bell07 (source code) +- stujones11 (player models) +- jordan4ibanez (1st person view hand) diff --git a/mods/skinsdb/api.lua b/mods/skinsdb/api.lua new file mode 100644 index 00000000..c4088107 --- /dev/null +++ b/mods/skinsdb/api.lua @@ -0,0 +1,94 @@ +-- get current skin +local storage = minetest.get_mod_storage() + +function skins.get_player_skin(player) + local player_name = player:get_player_name() + local meta = player:get_meta() + if meta:get("skinsdb:skin_key") then + -- Move player data prior July 2018 to mod storage + storage:set_string(player_name, meta:get_string("skinsdb:skin_key")) + meta:set_string("skinsdb:skin_key", "") + end + + local skin_name = storage:get_string(player_name) + local skin = skins.get(skin_name) + if #skin_name > 0 and not skin then + -- Migration step to convert `_`-delimited skins to `.` (if possible) + skin = skins.__fuzzy_match_skin_name(player_name, skin_name, true) + if skin then + storage:set_string(player_name, skin:get_key()) + else + storage:set_string(player_name, "") + end + end + return skin or skins.get(skins.default) +end + +-- Assign skin to player +function skins.assign_player_skin(player, skin) + local skin_obj + if type(skin) == "string" then + skin_obj = skins.get(skin) + else + skin_obj = skin + end + + if not skin_obj then + return false + end + + if skin_obj:is_applicable_for_player(player:get_player_name()) then + local skin_key = skin_obj:get_key() + if skin_key == skins.default then + skin_key = "" + end + storage:set_string(player:get_player_name(), skin_key) + else + return false + end + return true, skin_obj +end + +-- update visuals +function skins.update_player_skin(player) + if skins.armor_loaded then + -- all needed is wrapped and implemented in 3d_armor mod + armor:set_player_armor(player) + else + -- do updates manually without 3d_armor + skins.get_player_skin(player):apply_skin_to_player(player) + if minetest.global_exists("sfinv") and sfinv.enabled then + sfinv.set_player_inventory_formspec(player) + end + end +end + +-- Assign and update - should be used on selection externally +function skins.set_player_skin(player, skin) + local success, skin_obj = skins.assign_player_skin(player, skin) + if success then + skins.get_player_skin(player):set_skin(player) + skins.update_player_skin(player) + minetest.log("action", player:get_player_name().." set skin to "..skin_obj:get_key("")) + end + return success +end + +-- Check Skin format (code stohlen from stu's multiskin) +function skins.get_skin_format(file) + file:seek("set", 1) + if file:read(3) == "PNG" then + file:seek("set", 16) + local ws = file:read(4) + local hs = file:read(4) + local w = ws:sub(3, 3):byte() * 256 + ws:sub(4, 4):byte() + local h = hs:sub(3, 3):byte() * 256 + hs:sub(4, 4):byte() + if w >= 64 then + if w == h then + return "1.8" + elseif w == h * 2 then + return "1.0" + end + end + end +end diff --git a/mods/skinsdb/chatcommands.lua b/mods/skinsdb/chatcommands.lua new file mode 100644 index 00000000..a60c1ca7 --- /dev/null +++ b/mods/skinsdb/chatcommands.lua @@ -0,0 +1,103 @@ +local S = minetest.get_translator("skinsdb") + +local function show_selection_formspec(player) + local context = skins.get_formspec_context(player) + local name = player:get_player_name() + local skin = skins.get_player_skin(player) + local formspec = "size[8,8]"..skins.get_skin_info_formspec(skin) + formspec = formspec..skins.get_skin_selection_formspec(player, context, 3.5) + minetest.show_formspec(name, 'skinsdb_show_ui', formspec) +end + + +minetest.register_chatcommand("skinsdb", { + params = S("[set] | show [] | list | list private | list public | [ui]"), + description = S("Show, list or set player's skin"), + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then + return false, S("Player not found") + end + + -- parse command line + local command, parameter + local words = param:split(" ") + local word = words[1] + if word == 'set' or word == 'list' or word == 'show' or word == 'ui' then + command = word + parameter = words[2] + elseif skins.get(word) then + command = 'set' + parameter = word + elseif not word then + command = 'ui' + else + return false, S("unknown command").." "..word..", "..S("see /help skinsdb for supported parameters") + end + + if command == "set" then + if parameter then + local success = skins.set_player_skin(player, parameter) + if success then + return true, S("skin set to").." "..parameter + else + return false, S("invalid skin").." "..parameter + end + else return false, S("Requires skin key") + end + elseif command == "list" then + local list + if parameter == "private" then + list = skins.get_skinlist_with_meta("playername", name) + elseif parameter == "public" then + list = skins.get_skinlist_for_player() + elseif not parameter then + list = skins.get_skinlist_for_player(name) + else + return false, S("unknown parameter"), parameter + end + + local current_skin_key = skins.get_player_skin(player):get_key() + for _, skin in ipairs(list) do + local info = skin:get_key().." - " + ..S("Name").."="..skin:get_meta_string("name").." " + ..S("Author").."="..skin:get_meta_string("author").." " + ..S("License").."="..skin:get_meta_string("license") + if skin:get_key() == current_skin_key then + info = minetest.colorize("#00FFFF", info) + end + minetest.chat_send_player(name, info) + end + elseif command == "show" then + local skin + if parameter then + skin = skins.get(parameter) + else + skin = skins.get_player_skin(player) + end + if not skin then + return false, S("invalid skin") + end + local formspec = "size[8,3]"..skins.get_skin_info_formspec(skin) + minetest.show_formspec(name, 'skinsdb_show_skin', formspec) + elseif command == "ui" then + show_selection_formspec(player) + end + end, +}) + + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "skinsdb_show_ui" then + return + end + + local context = skins.get_formspec_context(player) + + local action = skins.on_skin_selection_receive_fields(player, context, fields) + if action == 'set' then + minetest.close_formspec(player:get_player_name(), formname) + elseif action == 'page' then + show_selection_formspec(player) + end +end) diff --git a/mods/skinsdb/formspecs.lua b/mods/skinsdb/formspecs.lua new file mode 100644 index 00000000..3241143f --- /dev/null +++ b/mods/skinsdb/formspecs.lua @@ -0,0 +1,172 @@ +local S = minetest.get_translator("skinsdb") +local ui = minetest.global_exists("unified_inventory") and unified_inventory + +function skins.get_formspec_context(player) + if player then + local playername = player:get_player_name() + skins.ui_context[playername] = skins.ui_context[playername] or {} + return skins.ui_context[playername] + else + return {} + end +end + +-- Show skin info +function skins.get_skin_info_formspec(skin, perplayer_formspec) + local texture = skin:get_texture() + local m_name = skin:get_meta_string("name") + local m_author = skin:get_meta_string("author") + local m_license = skin:get_meta_string("license") + local m_format = skin:get_meta("format") + -- overview page + local raw_size = m_format == "1.8" and "2,2" or "2,1" + + local lxoffs = 0.8 + local cxoffs = 2 + local rxoffs = 5.5 + + if type(perplayer_formspec) == "table" then -- we're using Unified Inventory + lxoffs = 1.5 + cxoffs = 3.75 + rxoffs = 7.5 + end + + local formspec = "image["..lxoffs..",.6;1,2;"..minetest.formspec_escape(skin:get_preview()).."]" + if texture then + formspec = formspec.."label["..rxoffs..",.5;"..S("Raw texture")..":]" + .."image["..rxoffs..",1;"..raw_size..";"..texture.."]" + end + if m_name ~= "" then + formspec = formspec.."label["..cxoffs..",.5;"..S("Name")..": "..minetest.formspec_escape(m_name).."]" + end + if m_author ~= "" then + formspec = formspec.."label["..cxoffs..",1;"..S("Author")..": "..minetest.formspec_escape(m_author).."]" + end + if m_license ~= "" then + formspec = formspec.."label["..cxoffs..",1.5;"..S("License")..": "..minetest.formspec_escape(m_license).."]" + end + return formspec +end + +function skins.get_skin_selection_formspec(player, context, perplayer_formspec) + context.skins_list = skins.get_skinlist_for_player(player:get_player_name()) + context.total_pages = 1 + local xoffs = 0 + local yoffs = 4 + local xspc = 1 + local yspc = 2 + local skinwidth = 1 + local skinheight = 2 + local xscale = 1 -- luacheck: ignore + local btn_y = 8.15 + local drop_y = 8 + local btn_width = 1 + local droppos = 1 + local droplen = 6.25 + local btn_right = 7 + local maxdisp = 16 + + local ctrls_height = 0.5 + + if type(perplayer_formspec) == "table" then -- it's being used under Unified Inventory + xoffs = perplayer_formspec.std_inv_x + xspc = ui.imgscale + yspc = ui.imgscale*2 + skinwidth = ui.imgscale*0.9 + skinheight = ui.imgscale*1.9 + xscale = ui.imgscale + btn_width = ui.imgscale + droppos = xoffs + btn_width + 0.1 + droplen = ui.imgscale * 6 - 0.2 + btn_right = droppos + droplen + 0.1 + + if perplayer_formspec.pagecols == 4 then -- and we're in lite mode + yoffs = 1 + maxdisp = 8 + drop_y = yoffs + skinheight + 0.1 + else + yoffs = 0.2 + drop_y = yoffs + skinheight*2 + 0.2 + end + + btn_y = drop_y + + end + + for i, skin in ipairs(context.skins_list ) do + local page = math.floor((i-1) / maxdisp)+1 + skin:set_meta("inv_page", page) + skin:set_meta("inv_page_index", (i-1)%maxdisp+1) + context.total_pages = page + end + context.skins_page = context.skins_page or skins.get_player_skin(player):get_meta("inv_page") or 1 + context.dropdown_values = nil + + local page = context.skins_page + local formspec = "" + + for i = (page-1)*maxdisp+1, page*maxdisp do + local skin = context.skins_list[i] + if not skin then + break + end + + local index_p = skin:get_meta("inv_page_index") + local x = ((index_p-1) % 8) * xspc + xoffs + local y + if index_p > 8 then + y = yoffs + yspc + else + y = yoffs + end + formspec = formspec.. + string.format("image_button[%f,%f;%f,%f;%s;skins_set$%i;]", + x, y, skinwidth, skinheight, + minetest.formspec_escape(skin:get_preview()), i).. + "tooltip[skins_set$"..i..";"..minetest.formspec_escape(skin:get_meta_string("name")).."]" + end + + if context.total_pages > 1 then + local page_prev = page - 1 + local page_next = page + 1 + if page_prev < 1 then + page_prev = context.total_pages + end + if page_next > context.total_pages then + page_next = 1 + end + local page_list = "" + context.dropdown_values = {} + for pg=1, context.total_pages do + local pagename = S("Page").." "..pg.."/"..context.total_pages + context.dropdown_values[pagename] = pg + if pg > 1 then page_list = page_list.."," end + page_list = page_list..pagename + end + formspec = formspec.. + string.format("button[%f,%f;%f,%f;skins_page$%i;<<]", + xoffs, btn_y, btn_width, ctrls_height, page_prev).. + string.format("button[%f,%f;%f,%f;skins_page$%i;>>]", + btn_right, btn_y, btn_width, ctrls_height, page_next).. + string.format("dropdown[%f,%f;%f,%f;skins_selpg;%s;%i]", + droppos, drop_y, droplen, ctrls_height, page_list, page) + end + return formspec +end + +function skins.on_skin_selection_receive_fields(player, context, fields) + for field, _ in pairs(fields) do + local current = string.split(field, "$", 2) + if current[1] == "skins_set" then + skins.set_player_skin(player, context.skins_list[tonumber(current[2])]) + return 'set' + elseif current[1] == "skins_page" then + context.skins_page = tonumber(current[2]) + return 'page' + end + end + if fields.skins_selpg then + context.skins_page = tonumber(context.dropdown_values[fields.skins_selpg]) + return 'page' + end +end diff --git a/mods/skinsdb/init.lua b/mods/skinsdb/init.lua new file mode 100644 index 00000000..836f2bc8 --- /dev/null +++ b/mods/skinsdb/init.lua @@ -0,0 +1,116 @@ +-- Unified Skins for Minetest - based modified Bags from unfied_inventory and skins from inventory_plus + +-- Copyright (c) 2012 cornernote, Dean Montgomery +-- Rework 2017 by bell07 +-- License: GPLv3 + +skins = {} +skins.modpath = minetest.get_modpath(minetest.get_current_modname()) +skins.default = "character" + +dofile(skins.modpath.."/skin_meta_api.lua") +dofile(skins.modpath.."/api.lua") +dofile(skins.modpath.."/skinlist.lua") +dofile(skins.modpath.."/formspecs.lua") +dofile(skins.modpath.."/chatcommands.lua") +-- Unified inventory page/integration +if minetest.get_modpath("unified_inventory") then + dofile(skins.modpath.."/unified_inventory_page.lua") +end + +if minetest.get_modpath("sfinv") then + dofile(skins.modpath.."/sfinv_page.lua") +end + +-- ie.loadfile does not exist? +skins.ie = minetest.request_insecure_environment() +skins.http = minetest.request_http_api() +dofile(skins.modpath.."/skins_updater.lua") +skins.ie = nil +skins.http = nil + +-- 3d_armor compatibility +if minetest.global_exists("armor") then + skins.armor_loaded = true + armor.get_player_skin = function(self, name) + local skin = skins.get_player_skin(minetest.get_player_by_name(name)) + return skin:get_texture() + end + armor.get_preview = function(self, name) + local skin = skins.get_player_skin(minetest.get_player_by_name(name)) + return skin:get_preview() + end + armor.update_player_visuals = function(self, player) + if not player then + return + end + local skin = skins.get_player_skin(player) + skin:apply_skin_to_player(player) + armor:run_callbacks("on_update", player) + end +end + +if minetest.global_exists("clothing") and clothing.player_textures then + skins.clothing_loaded = true + clothing:register_on_update(skins.update_player_skin) +end + +-- Update skin on join +skins.ui_context = {} +minetest.register_on_joinplayer(function(player) + skins.update_player_skin(player) +end) + +minetest.register_on_leaveplayer(function(player) + skins.ui_context[player:get_player_name()] = nil + player:get_inventory():set_size("hand", 0) +end) + +minetest.register_on_shutdown(function() + for _, player in pairs(minetest.get_connected_players()) do + player:get_inventory():set_size("hand", 0) + end +end) + +player_api.register_model("skinsdb_3d_armor_character_5.b3d", { + animation_speed = 30, + textures = { + "blank.png", + "blank.png", + "blank.png", + "blank.png" + }, + animations = { + stand = {x=0, y=79}, + lay = {x=162, y=166}, + walk = {x=168, y=187}, + mine = {x=189, y=198}, + walk_mine = {x=200, y=219}, + sit = {x=81, y=160}, + -- compatibility w/ the emote mod + wave = {x = 192, y = 196, override_local = true}, + point = {x = 196, y = 196, override_local = true}, + freeze = {x = 205, y = 205, override_local = true}, + }, +}) + +-- Register default character.png if not part of this mod +local default_skin_obj = skins.get(skins.default) +if not default_skin_obj then + default_skin_obj = skins.new(skins.default) + default_skin_obj:set_texture("character.png") + default_skin_obj:set_meta("format", '1.0') + default_skin_obj:set_meta("_sort_id", 0) + default_skin_obj:set_meta("name", "Sam") + default_skin_obj:set_hand_from_texture() +end + +-- Secure hand inventory slot +minetest.register_allow_player_inventory_action(function(player, action, inv, data) + if data.to_list == "hand" or data.from_list == "hand" or data.listname == "hand" then + return 0 + end +end) + +--dofile(skins.modpath.."/unittest.lua") + diff --git a/mods/skinsdb/locale/skinsdb.de.tr b/mods/skinsdb/locale/skinsdb.de.tr new file mode 100644 index 00000000..dc15284a --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.de.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Anzeigen oder setzen der Spieler-Skins +Player not found=Spieler nicht da +unknown command=unbekannter Befehl +see /help skinsdb for supported parameters=Lese /help für erlaubte Parameter +skin set to=Skin ist jetzt +invalid skin=unbekannter Skin +Requires skin key=Benötigt Skin-Name +unknown parameter=unbekannter Parameter +Raw texture=Rohtextur +Page=Seite +Name=Name +Author=Autor +License=Lizenz + = +Downloads the specified range of skins and shuts down the server= +Change=Wechseln +Skins=Aussehen diff --git a/mods/skinsdb/locale/skinsdb.eo.tr b/mods/skinsdb/locale/skinsdb.eo.tr new file mode 100644 index 00000000..f683d7a1 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.eo.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]=[set] | show [] | list | list private | list public | [ui] +Show, list or set player's skin=Montri haÅ­tojn («show»), listigi haÅ­tojn («list»), aÅ­ agordi onian haÅ­ton («set») +Player not found=Ludanto ne trovita +unknown command=nekonata ordono +see /help skinsdb for supported parameters=rulu «/help skinsdb» por vidi subtenatajn parametrojn +skin set to=haÅ­to agordita al +invalid skin=nevalida haÅ­to +Requires skin key=Postulas haÅ­tonomon +unknown parameter=nekonata parametro +Raw texture=Kruda bildo +Page=PaÄo +Name=Nomo +Author=AÅ­toro +License=Permesilo + = +Downloads the specified range of skins and shuts down the server=ElÅutinte haÅ­tojn el skindb inter la donitaj paÄoj, restartigas la servilon +Change=ÅœanÄi +Skins=HaÅ­toj diff --git a/mods/skinsdb/locale/skinsdb.fr.tr b/mods/skinsdb/locale/skinsdb.fr.tr new file mode 100644 index 00000000..5b072b56 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.fr.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Afficher, lister ou définir le skin du joueur +Player not found=Joueur non trouvé +unknown command=commande inconnue +see /help skinsdb for supported parameters=voir /help skinsdb pour les paramètres supportés +skin set to=skin définie sur +invalid skin=skin peau invalide +Requires skin key= +unknown parameter=paramètre inconnu +Raw texture=Texture +Page=Page +Name=Nom +Author=Auteur +License=Licence + = +Downloads the specified range of skins and shuts down the server= +Change=Changer +Skins= diff --git a/mods/skinsdb/locale/skinsdb.ms.tr b/mods/skinsdb/locale/skinsdb.ms.tr new file mode 100644 index 00000000..02fc27cb --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.ms.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Tunjukkan, senaraikan atau tetapkan kulit pemain +Player not found=Pemain tidak dijumpai +unknown command=perintah tidak diketahui +see /help skinsdb for supported parameters=lihat /help skinsdb untuk parameter yang disokong +skin set to=kulit ditetapkan kepada +invalid skin=kulit tidak sah +Requires skin key= +unknown parameter=parameter tidak diketahui +Raw texture=Tekstur mentah +Page=Halaman +Name=Nama +Author=Pencipta +License=Lesen + = +Downloads the specified range of skins and shuts down the server= +Change=Ubah +Skins= diff --git a/mods/skinsdb/locale/skinsdb.pt_BR.tr b/mods/skinsdb/locale/skinsdb.pt_BR.tr new file mode 100644 index 00000000..d1246e24 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Mostrar, listar ou definir a skin do jogador +Player not found=Jogador não encontrado +unknown command=Comando desconhecido +see /help skinsdb for supported parameters= consulte /help skinsdb para obter os parâmetros suportados +skin set to=Aparência definida para +invalid skin=Aparência inválida +Requires skin key=Requer chave de aparência +unknown parameter=parâmetro desconhecido +Raw texture=Textura crua +Page=Página +Name=Nome +Author=Autor +License=Licença + = +Downloads the specified range of skins and shuts down the server=Baixa o intervalo especificado de capas e desliga o servidor +Change=Mudar +Skins=Aparência diff --git a/mods/skinsdb/locale/skinsdb.ru.tr b/mods/skinsdb/locale/skinsdb.ru.tr new file mode 100644 index 00000000..cab06185 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.ru.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Показать Ñкин, ÑпиÑок Ñкинов, уÑтановить Ñкин игрока +Player not found=Игрок не найден +unknown command=неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° +see /help skinsdb for supported parameters=Ñмотрите /help skinsdb Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра параметров +skin set to=уÑтановлено Ñкин +invalid skin=некорректный Ñкин +Requires skin key=ЗавиÑимый идентификатор Ñкина +unknown parameter=неопределенный параметр +Raw texture=ТекÑтура +Page=Страница +Name=Ð˜Ð¼Ñ +Author=Ðвтор +License=Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ + = +Downloads the specified range of skins and shuts down the server=Загрузить маÑÑив Ñкинов и оÑтановить Ñервер +Change=Изменить +Skins=Скины diff --git a/mods/skinsdb/locale/skinsdb.uk.tr b/mods/skinsdb/locale/skinsdb.uk.tr new file mode 100644 index 00000000..dca44f50 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.uk.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=Показати Ñкін, ÑпиÑок Ñкінів, вÑтановити Ñкін Ð³Ñ€Ð°Ð²Ñ†Ñ +Player not found=Гравець не знайдений +unknown command=невідома команда +see /help skinsdb for supported parameters=дивітьÑÑ /help skinsdb Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду параметрів +skin set to=вÑтановлено Ñкін +invalid skin=некоректний Ñкін +Requires skin key=Залежний ідентифікатор Ñкіна +unknown parameter=невизначений параметр +Raw texture=ТекÑтура +Page=Сторінка +Name=Ім'Ñ +Author=Ðвтор +License=Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ + = +Downloads the specified range of skins and shuts down the server=Завантажити маÑив Ñкінів та зупинити Ñервер +Change=Змінити +Skins=Скіни diff --git a/mods/skinsdb/locale/skinsdb.zh_CN.tr b/mods/skinsdb/locale/skinsdb.zh_CN.tr new file mode 100644 index 00000000..f608a1f7 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.zh_CN.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=显示,列出或者设置玩家的皮肤 +Player not found=玩家未找到 +unknown command=未知命令 +see /help skinsdb for supported parameters=有关skinsdb支æŒçš„傿•°ï¼Œå‚è§ /help +skin set to=皮肤设置为 +invalid skin=无效皮肤 +Requires skin key= +unknown parameter=æœªçŸ¥å‚æ•° +Raw texture=自然状æ€çš„çº¹ç† +Page=é¡µé¢ +Name=åç§° +Author=作者 +License=许å¯è¯ + = +Downloads the specified range of skins and shuts down the server=下载指定范围的皮肤并关闭æœåС噍 +Change=æ›´æ¢ +Skins=皮肤 diff --git a/mods/skinsdb/locale/skinsdb.zh_TW.tr b/mods/skinsdb/locale/skinsdb.zh_TW.tr new file mode 100644 index 00000000..e51d5536 --- /dev/null +++ b/mods/skinsdb/locale/skinsdb.zh_TW.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=顯示,列出或者設定玩家的皮膚 +Player not found=玩家未找到 +unknown command=未知命令 +see /help skinsdb for supported parameters=有關skinsdb支æŒçš„åƒæ•¸ï¼Œåƒè¦‹/help +skin set to=皮膚設定為 +invalid skin=無效皮膚 +Requires skin key= +unknown parameter=æœªçŸ¥åƒæ•¸ +Raw texture=è‡ªç„¶ç‹€æ…‹çš„ç´‹ç† +Page=é é¢ +Name=å稱 +Author=作者 +License=許å¯è­‰ + = +Downloads the specified range of skins and shuts down the server=下載指定範åœçš„皮膚並關閉æœå‹™å™¨ +Change=æ›´æ› +Skins=皮膚 diff --git a/mods/skinsdb/locale/template.txt b/mods/skinsdb/locale/template.txt new file mode 100644 index 00000000..d2285fc4 --- /dev/null +++ b/mods/skinsdb/locale/template.txt @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin= +Player not found= +unknown command= +see /help skinsdb for supported parameters= +skin set to= +invalid skin= +Requires skin key= +unknown parameter= +Raw texture= +Page= +Name= +Author= +License= + = +Downloads the specified range of skins and shuts down the server= +Change= +Skins= diff --git a/mods/skinsdb/meta/character_1.txt b/mods/skinsdb/meta/character_1.txt new file mode 100644 index 00000000..68024ad9 --- /dev/null +++ b/mods/skinsdb/meta/character_1.txt @@ -0,0 +1,3 @@ +Farmer1 +sdzen +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_10.txt b/mods/skinsdb/meta/character_10.txt new file mode 100644 index 00000000..76eb142d --- /dev/null +++ b/mods/skinsdb/meta/character_10.txt @@ -0,0 +1,3 @@ +santa +jordan4ibanez +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_2.txt b/mods/skinsdb/meta/character_2.txt new file mode 100644 index 00000000..2d4ecab4 --- /dev/null +++ b/mods/skinsdb/meta/character_2.txt @@ -0,0 +1,3 @@ +Male +TenPlus1 +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_3.txt b/mods/skinsdb/meta/character_3.txt new file mode 100644 index 00000000..404387d4 --- /dev/null +++ b/mods/skinsdb/meta/character_3.txt @@ -0,0 +1,3 @@ +Female +TenPlus1 +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_4.txt b/mods/skinsdb/meta/character_4.txt new file mode 100644 index 00000000..a45cb6a6 --- /dev/null +++ b/mods/skinsdb/meta/character_4.txt @@ -0,0 +1,3 @@ +mbb_old +mbb +CC 0 (1.0) \ No newline at end of file diff --git a/mods/skinsdb/meta/character_5.txt b/mods/skinsdb/meta/character_5.txt new file mode 100644 index 00000000..bcdc60f1 --- /dev/null +++ b/mods/skinsdb/meta/character_5.txt @@ -0,0 +1,3 @@ +Adventer girl +lovehart +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_6.txt b/mods/skinsdb/meta/character_6.txt new file mode 100644 index 00000000..c6966314 --- /dev/null +++ b/mods/skinsdb/meta/character_6.txt @@ -0,0 +1,3 @@ +Oliver_MV +hansuke123 +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_7.txt b/mods/skinsdb/meta/character_7.txt new file mode 100644 index 00000000..11a878e4 --- /dev/null +++ b/mods/skinsdb/meta/character_7.txt @@ -0,0 +1,3 @@ +Flower Girl +julito +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_8.txt b/mods/skinsdb/meta/character_8.txt new file mode 100644 index 00000000..b8801f2d --- /dev/null +++ b/mods/skinsdb/meta/character_8.txt @@ -0,0 +1,3 @@ +Trader 1 +TenPlus1 +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/character_9.txt b/mods/skinsdb/meta/character_9.txt new file mode 100644 index 00000000..f17f5365 --- /dev/null +++ b/mods/skinsdb/meta/character_9.txt @@ -0,0 +1,3 @@ +Angelo +Extex +CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/skinsdb/meta/readme.txt b/mods/skinsdb/meta/readme.txt new file mode 100644 index 00000000..77882e9d --- /dev/null +++ b/mods/skinsdb/meta/readme.txt @@ -0,0 +1,5 @@ +For each skin in textures folder a metadata file can be applied with "txt" suffilx. See character.txt for skin character.png for reference. +The file contains: +Skin name +Author +License diff --git a/mods/skinsdb/mod.conf b/mods/skinsdb/mod.conf new file mode 100644 index 00000000..38a62c3b --- /dev/null +++ b/mods/skinsdb/mod.conf @@ -0,0 +1,5 @@ +name = skinsdb +description = Player skin mod, supporting unified_inventory, sfinv and smart_inventory +depends = player_api +optional_depends = unified_inventory,3d_armor,clothing,sfinv,hand_monoid +min_minetest_version = 5.4.0 diff --git a/mods/skinsdb/models/skinsdb_3d_armor_character_5.b3d b/mods/skinsdb/models/skinsdb_3d_armor_character_5.b3d new file mode 100644 index 00000000..1287690d Binary files /dev/null and b/mods/skinsdb/models/skinsdb_3d_armor_character_5.b3d differ diff --git a/mods/skinsdb/models/skinsdb_hand.b3d b/mods/skinsdb/models/skinsdb_hand.b3d new file mode 100644 index 00000000..a38124c6 Binary files /dev/null and b/mods/skinsdb/models/skinsdb_hand.b3d differ diff --git a/mods/skinsdb/models/skinsdb_hand_18.b3d b/mods/skinsdb/models/skinsdb_hand_18.b3d new file mode 100644 index 00000000..88449c6d Binary files /dev/null and b/mods/skinsdb/models/skinsdb_hand_18.b3d differ diff --git a/mods/skinsdb/sfinv_page.lua b/mods/skinsdb/sfinv_page.lua new file mode 100644 index 00000000..5a3fcf5a --- /dev/null +++ b/mods/skinsdb/sfinv_page.lua @@ -0,0 +1,21 @@ +local S = minetest.get_translator("skinsdb") + +-- generate the current formspec +local function get_formspec(player, context) + local skin = skins.get_player_skin(player) + local formspec = skins.get_skin_info_formspec(skin) + formspec = formspec..skins.get_skin_selection_formspec(player, context, 4) + return formspec +end + +sfinv.register_page("skins:overview", { + title = S("Skins"), + get = function(self, player, context) + -- collect skins data + return sfinv.make_formspec(player, context, get_formspec(player, context)) + end, + on_player_receive_fields = function(self, player, context, fields) + skins.on_skin_selection_receive_fields(player, context, fields) + sfinv.set_player_inventory_formspec(player) + end +}) diff --git a/mods/skinsdb/skin_meta_api.lua b/mods/skinsdb/skin_meta_api.lua new file mode 100644 index 00000000..1ce04ed8 --- /dev/null +++ b/mods/skinsdb/skin_meta_api.lua @@ -0,0 +1,240 @@ +skins.meta = {} + +local has_hand_monoid = minetest.get_modpath("hand_monoid") + +local skin_class = {} +skin_class.__index = skin_class +skins.skin_class = skin_class +----------------------- +-- Class methods +----------------------- +-- constructor +function skins.new(key, object) + assert(key, 'Unique skins key required, like "character_1"') + local self = object or {} + setmetatable(self, skin_class) + self.__index = skin_class + + self._key = key + self._sort_id = 0 + skins.meta[key] = self + return self +end + +-- getter +function skins.get(key) + return skins.meta[key] +end + +-- Skin methods +-- In this implementation it is just access to attrubutes wrapped +-- but this way allow to redefine the functionality for more complex skins provider +function skin_class:get_key() + return self._key +end + +function skin_class:set_meta(key, value) + self[key] = value +end + +function skin_class:get_meta(key) + return self[key] +end + +function skin_class:get_meta_string(key) + return tostring(self:get_meta(key) or "") +end + +function skin_class:set_texture(value) + self._texture = value +end + +function skin_class:get_texture() + return self._texture +end + +function skin_class:set_hand(hand) + self._hand = hand +end + +local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true +function skin_class:set_hand_from_texture() + local hand = core.get_current_modname()..':'..self._texture:gsub('[%p%c%s]', '') + local hand_def = {} + for k,v in pairs(minetest.registered_items[""]) do + if k ~= "mod_origin" and k ~= "type" and k ~= "wield_image" then + hand_def[k] = v + end + end + hand_def.tiles = {self:get_texture()} + hand_def.visual_scale = 1 + hand_def.wield_scale = {x=1,y=1,z=1} + hand_def.paramtype = "light" + hand_def.drawtype = "mesh" + if(self:get_meta("format") == "1.0") then + hand_def.mesh = "skinsdb_hand.b3d" + else + hand_def.mesh = "skinsdb_hand_18.b3d" + end + hand_def.use_texture_alpha = ALPHA_CLIP + minetest.register_node(hand, hand_def) + self:set_hand(hand) +end + +function skin_class:get_hand() + return self._hand +end + +function skin_class:set_preview(value) + self._preview = value +end + +function skin_class:get_preview() + if self._preview then + return self._preview + end + + local player_skin = "("..self:get_texture()..")" + local skin = "" + + -- Consistent on both sizes: + --Chest + skin = skin .. "([combine:16x32:-16,-12=" .. player_skin .. "^[mask:skindb_mask_chest.png)^" + --Head + skin = skin .. "([combine:16x32:-4,-8=" .. player_skin .. "^[mask:skindb_mask_head.png)^" + --Hat + skin = skin .. "([combine:16x32:-36,-8=" .. player_skin .. "^[mask:skindb_mask_head.png)^" + --Right Arm + skin = skin .. "([combine:16x32:-44,-12=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^" + --Right Leg + skin = skin .. "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" + + -- 64x skins have non-mirrored arms and legs + local left_arm + local left_leg + + if self:get_meta("format") == "1.8" then + left_arm = "([combine:16x32:-24,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^" + left_leg = "([combine:16x32:-12,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))^" + else + left_arm = "([combine:16x32:-44,-12=" .. player_skin .. "^[mask:skindb_mask_rarm.png^[transformFX)^" + left_leg = "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png^[transformFX)^" + end + + -- Left Arm + skin = skin .. left_arm + --Left Leg + skin = skin .. left_leg + + -- Add overlays for 64x skins. these wont appear if skin is 32x because it will be cropped out + --Chest Overlay + skin = skin .. "([combine:16x32:-16,-28=" .. player_skin .. "^[mask:skindb_mask_chest.png)^" + --Right Arm Overlay + skin = skin .. "([combine:16x32:-44,-28=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^" + --Right Leg Overlay + skin = skin .. "([combine:16x32:0,-16=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" + --Left Arm Overlay + skin = skin .. "([combine:16x32:-40,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^" + --Left Leg Overlay + skin = skin .. "([combine:16x32:4,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))" + + -- Full Preview + skin = "(((" .. skin .. ")^[resize:64x128)^[mask:skindb_transform.png)" + + return skin +end + +function skin_class:apply_skin_to_player(player) + + local function concat_texture(base, ext) + if base == "blank.png" then + return ext + elseif ext == "blank.png" then + return base + else + return base .. "^" .. ext + end + end + + local playername = player:get_player_name() + local ver = self:get_meta("format") or "1.0" + + player_api.set_model(player, "skinsdb_3d_armor_character_5.b3d") + + local v10_texture = "blank.png" + local v18_texture = "blank.png" + local armor_texture = "blank.png" + local wielditem_texture = "blank.png" + + if ver == "1.8" then + v18_texture = self:get_texture() + else + v10_texture = self:get_texture() + end + + -- Support for clothing + if skins.clothing_loaded and clothing.player_textures[playername] then + local cape = clothing.player_textures[playername].cape + local layers = {} + for k, v in pairs(clothing.player_textures[playername]) do + if k ~= "skin" and k ~= "cape" then + table.insert(layers, v) + end + end + local overlay = table.concat(layers, "^") + v10_texture = concat_texture(v10_texture, cape) + v18_texture = concat_texture(v18_texture, overlay) + end + + -- Support for armor + if skins.armor_loaded then + local armor_textures = armor.textures[playername] + if armor_textures then + armor_texture = concat_texture(armor_texture, armor_textures.armor) + wielditem_texture = concat_texture(wielditem_texture, armor_textures.wielditem) + end + end + + player_api.set_textures(player, { + v10_texture, + v18_texture, + armor_texture, + wielditem_texture, + }) + + player:set_properties({ + visual_size = { + x = self:get_meta("visual_size_x") or 1, + y = self:get_meta("visual_size_y") or 1 + } + }) + + local hand = self:get_hand() + if has_hand_monoid then + if hand then + hand_monoid.monoid:add_change(player, {name = hand}, "skinsdb:hand") + else + hand_monoid.monoid:del_change(player, "skinsdb:hand") + end + else + if hand then + player:get_inventory():set_size("hand", 1) + player:get_inventory():set_stack("hand", 1, hand) + else + player:get_inventory():set_stack("hand", 1, "") + end + end +end + +function skin_class:set_skin(player) + -- The set_skin is used on skins selection + -- This means the method could be redefined to start an furmslec + -- See character_creator for example +end + +function skin_class:is_applicable_for_player(playername) + local assigned_player = self:get_meta("playername") + return assigned_player == nil or assigned_player == true or + playername and (minetest.check_player_privs(playername, {server=true}) or + assigned_player:lower() == playername:lower()) +end diff --git a/mods/skinsdb/skinlist.lua b/mods/skinsdb/skinlist.lua new file mode 100644 index 00000000..66045eda --- /dev/null +++ b/mods/skinsdb/skinlist.lua @@ -0,0 +1,201 @@ +local dbgprint = false and print or function() end + +--- @param path Path to the "textures" directory, without tailing slash. +--- @param filename Current file name, such as "player.groot.17.png". +--- @return On error: false, error message. On success: true, skin key +function skins.register_skin(path, filename) + -- See "textures/readme.txt" for allowed formats + + local prefix, sep, identifier, extension = filename:match("^(%a+)([_.])([%w_.-]+)%.(%a+)$") + --[[ + prefix: "character" or "player" + sep: "." (new) or "_" (legacy) + identifier: number, name or (name + sep + number) + ^ previews are explicity skipped + extension: "png" only due `skins.get_skin_format` + ]] + + -- Filter out files that do not match the allowed patterns + if not extension or extension:lower() ~= "png" then + return false, "invalid skin name" + end + if prefix ~= "player" and prefix ~= "character" then + return false, "unknown type" + end + + local preview_suffix = sep .. "preview" + if identifier:sub(-#preview_suffix) == preview_suffix then + -- The preview texture is added by the main skin texture (if exists) + return false, "preview texture" + end + + assert(path) + if path == ":UNITTEST:" then + path = nil + end + + dbgprint("Found skin", prefix, identifier, extension) + + local sort_id -- number, sorting "rank" in the skin list + local playername -- string, if player-specific + if prefix == "player" then + -- Allow "player.PLAYERNAME.png" and "player.PLAYERNAME.123.png" + local splits = identifier:split(sep) + + playername = splits[1] + -- Put in front + sort_id = 0 + (tonumber(splits[2]) or 0) + + if #splits > 1 and sep == "_" then + minetest.log("warning", "skinsdb: The skin name '" .. filename .. "' is ambigous." .. + " Please use the separator '.' to lock it down to the correct player name.") + end + else -- Public skin "character*" + -- Less priority + sort_id = 5000 + (tonumber(identifier) or 0) + end + + local filename_noext = prefix .. sep .. identifier + + dbgprint("Register skin", filename_noext, playername, sort_id) + + -- Register skin texture + local skin_obj = skins.get(filename_noext) or skins.new(filename_noext) + skin_obj:set_texture(filename) + skin_obj:set_meta("_sort_id", sort_id) + if sep ~= "_" then + skin_obj._legacy_name = filename_noext:gsub("[._]+", "_") + end + + if playername then + skin_obj:set_meta("assignment", "player:"..playername) + skin_obj:set_meta("playername", playername) + end + + if path then + -- Get type of skin based on dimensions + local file = io.open(path .. "/" .. filename, "r") + local skin_format = skins.get_skin_format(file) + skin_obj:set_meta("format", skin_format) + file:close() + end + + skin_obj:set_hand_from_texture() + skin_obj:set_meta("name", identifier) + + if path then + -- Optional skin information + local file = io.open(path .. "/../meta/" .. filename_noext .. ".txt", "r") + if file then + dbgprint("Found meta") + local data = string.split(file:read("*all"), "\n", 3) + skin_obj:set_meta("name", data[1]) + skin_obj:set_meta("author", data[2]) + skin_obj:set_meta("license", data[3]) + file:close() -- do not rely on delayed GC + end + end + + if path then + -- Optional preview texture + local preview_name = filename_noext .. sep .. "preview.png" + local fh = io.open(path .. "/" .. preview_name) + if fh then + dbgprint("Found preview", preview_name) + skin_obj:set_preview(preview_name) + fh:close() -- do not rely on delayed GC + end + end + + return true, skin_obj:get_key() +end + +--- Internal function. Fallback/migration code for `.`-delimited skin names that +--- were equipped between d3c7fa7 and 312780c (master branch). +--- During this period, `.`-delimited skin names were internally registered with +--- `_` delimiters. This function tries to find a matching skin. +--- @param player_name (string) +--- @param skin_name (string) e.g. `player_foo_mc_bar` +--- @param be_noisy (boolean) whether to print a warning in case of mismatches` +--- @return On match, the new skin (skins.skin_class) or `nil` if nothing matched. +function skins.__fuzzy_match_skin_name(player_name, skin_name, be_noisy) + if select(2, skin_name:gsub("%.", "")) > 0 then + -- Not affected by ambiguity + return + end + + for _, skin in pairs(skins.meta) do + if skin._legacy_name == skin_name then + dbgprint("Match", skin_name, skin:get_key()) + return skin + end + --dbgprint("Try match", skin_name, skin:get_key(), skin._legacy_name) + end + + if be_noisy then + minetest.log("warning", "skinsdb: cannot find matching skin '" .. + skin_name .. "' for player '" .. player_name .. "'.") + end +end + +do + -- Load skins from the current mod directory + local skins_path = skins.modpath.."/textures" + local skins_dir_list = minetest.get_dir_list(skins_path) + + for _, fn in pairs(skins_dir_list) do + skins.register_skin(skins_path, fn) + end +end + +local function skins_sort(skinslist) + table.sort(skinslist, function(a,b) + local a_id = a:get_meta("_sort_id") or 10000 + local b_id = b:get_meta("_sort_id") or 10000 + if a_id ~= b_id then + return a_id < b_id + else + return (a:get_meta("name") or 'ZZ') < (b:get_meta("name") or 'ZZ') + end + end) +end + +-- (obsolete) get skinlist. If assignment given ("mod:wardrobe" or "player:bell07") select skins matches the assignment. select_unassigned selects the skins without any assignment too +function skins.get_skinlist(assignment, select_unassigned) + minetest.log("deprecated", "skins.get_skinlist() is deprecated. Use skins.get_skinlist_for_player() instead") + local skinslist = {} + for _, skin in pairs(skins.meta) do + if not assignment or + assignment == skin:get_meta("assignment") or + (select_unassigned and skin:get_meta("assignment") == nil) then + table.insert(skinslist, skin) + end + end + skins_sort(skinslist) + return skinslist +end + +-- Get skinlist for player. If no player given, public skins only selected +function skins.get_skinlist_for_player(playername) + local skinslist = {} + for _, skin in pairs(skins.meta) do + if skin:is_applicable_for_player(playername) and skin:get_meta("in_inventory_list") ~= false then + table.insert(skinslist, skin) + end + end + skins_sort(skinslist) + return skinslist +end + +-- Get skinlist selected by metadata +function skins.get_skinlist_with_meta(key, value) + assert(key, "key parameter for skins.get_skinlist_with_meta() missed") + local skinslist = {} + for _, skin in pairs(skins.meta) do + if skin:get_meta(key) == value then + table.insert(skinslist, skin) + end + end + skins_sort(skinslist) + return skinslist +end diff --git a/mods/skinsdb/skins_updater.lua b/mods/skinsdb/skins_updater.lua new file mode 100644 index 00000000..41bb48e5 --- /dev/null +++ b/mods/skinsdb/skins_updater.lua @@ -0,0 +1,151 @@ +-- Skins update script + +local S = minetest.get_translator("skinsdb") +local _ID_ = "Lua Skins Updater" + +local internal = {} +internal.errors = {} + +-- Binary downloads are required +if not core.features.httpfetch_binary_data then + internal.errors[#internal.errors + 1] = + "Feature 'httpfetch_binary_data' is missing. Update Minetest." +end + +-- Insecure environment for saving textures and meta +local ie, http = skins.ie, skins.http +if not ie or not http then + internal.errors[#internal.errors + 1] = "Insecure environment is required. " .. + "Please add skinsdb to `secure.trusted_mods` in minetest.conf" +end + +minetest.register_chatcommand("skinsdb_download_skins", { + params = S(" "), + description = S("Downloads the specified range of skins and shuts down the server"), + privs = {server=true}, + func = function(name, param) + if #internal.errors > 0 then + return false, "Cannot run " .. _ID_ .. ":\n\t" .. + table.concat(internal.errors, "\n\t") + end + + local parts = string.split(param, " ") + local start = tonumber(parts[1]) + local len = tonumber(parts[2]) + if not (start and len and len > 0) then + return false, "Invalid page number or amount of pages" + end + + internal.get_pages_count(internal.fetch_function, start, len) + return true, "Started downloading..." + end, +}) + + +if #internal.errors > 0 then + return -- Nonsense to load something that's not working +end + +-- http://minetest.fensta.bplaced.net/api/apidoku.md +local root_url = "http://skinsdb.terraqueststudios.net" +local page_url = root_url .. "/api/v1/content?client=mod&page=%i" -- [1] = Page# + +local download_path = skins.modpath +local meta_path = download_path .. "/meta/" +local skins_path = download_path .. "/textures/" + +-- Fancy debug wrapper to download an URL +local function fetch_url(url, callback) + http.fetch({ + url = url, + user_agent = _ID_ + }, function(result) + if result.succeeded then + if result.code ~= 200 then + core.log("warning", ("%s: STATUS=%i URL=%s"):format( + _ID_, result.code, url)) + end + return callback(result.data) + end + core.log("warning", ("%s: Failed to download URL=%s"):format( + _ID_, url)) + end) +end + +-- Insecure workaround since meta/ and textures/ cannot be written to +local function unsafe_file_write(path, contents) + local f = ie.io.open(path, "wb") + f:write(contents) + f:close() +end + +-- Takes a valid skin table from the Skins Database and saves it +local function save_single_skin(skin) + local meta = { + skin.name, + skin.author, + skin.license + } + + local name = "character." .. skin.id + do + local legacy_name = "character_" .. skin.id + local fh = ie.io.open(skins_path .. legacy_name .. ".png", "r") + -- Use the old name if either the texture ... + if fh then + name = legacy_name + end + end + + -- core.safe_file_write does not work here + unsafe_file_write( + meta_path .. name .. ".txt", + table.concat(meta, "\n") + ) + + unsafe_file_write( + skins_path .. name .. ".png", + core.decode_base64(skin.img) + ) + core.log("action", ("%s: Completed skin %s"):format(_ID_, name)) +end + +-- Get total pages since it'll just return the last page all over again +internal.get_pages_count = function(callback, ...) + local vars = {...} + fetch_url(page_url:format(1) .. "&per_page=1", function(data) + local list = core.parse_json(data) + -- "per_page" defaults to 20 if left away (docs say something else, though) + callback(math.ceil(list.pages / 20), unpack(vars)) + end) +end + +-- Function to fetch a range of pages +internal.fetch_function = function(pages_total, start_page, len) + start_page = math.max(start_page, 1) + local end_page = math.min(start_page + len - 1, pages_total) + + for page_n = start_page, end_page do + local page_cpy = page_n + fetch_url(page_url:format(page_n), function(data) + core.log("action", ("%s: Page %i"):format(_ID_, page_cpy)) + + local list = core.parse_json(data) + for i, skin in pairs(list.skins) do + assert(skin.type == "image/png") + assert(skin.id ~= "") + + if skin.id ~= 1 then -- Skin 1 is bundled with skinsdb + save_single_skin(skin) + end + end + + if page_cpy == end_page then + local log = _ID_ .. " finished downloading all skins. " .. + "Shutting down server to reload media cache" + core.log("action", log) + core.request_shutdown(log, true, 3 --[[give some time for pending requests]]) + end + end) + end +end diff --git a/mods/skinsdb/textures/character_1.png b/mods/skinsdb/textures/character_1.png new file mode 100644 index 00000000..de67edd4 Binary files /dev/null and b/mods/skinsdb/textures/character_1.png differ diff --git a/mods/skinsdb/textures/character_10.png b/mods/skinsdb/textures/character_10.png new file mode 100644 index 00000000..cc7c131d Binary files /dev/null and b/mods/skinsdb/textures/character_10.png differ diff --git a/mods/skinsdb/textures/character_2.png b/mods/skinsdb/textures/character_2.png new file mode 100644 index 00000000..93563989 Binary files /dev/null and b/mods/skinsdb/textures/character_2.png differ diff --git a/mods/skinsdb/textures/character_3.png b/mods/skinsdb/textures/character_3.png new file mode 100644 index 00000000..a9d1a2c2 Binary files /dev/null and b/mods/skinsdb/textures/character_3.png differ diff --git a/mods/skinsdb/textures/character_4.png b/mods/skinsdb/textures/character_4.png new file mode 100644 index 00000000..f59678bd Binary files /dev/null and b/mods/skinsdb/textures/character_4.png differ diff --git a/mods/skinsdb/textures/character_5.png b/mods/skinsdb/textures/character_5.png new file mode 100644 index 00000000..3c7fa364 Binary files /dev/null and b/mods/skinsdb/textures/character_5.png differ diff --git a/mods/skinsdb/textures/character_6.png b/mods/skinsdb/textures/character_6.png new file mode 100644 index 00000000..7d42e092 Binary files /dev/null and b/mods/skinsdb/textures/character_6.png differ diff --git a/mods/skinsdb/textures/character_7.png b/mods/skinsdb/textures/character_7.png new file mode 100644 index 00000000..621ac7d3 Binary files /dev/null and b/mods/skinsdb/textures/character_7.png differ diff --git a/mods/skinsdb/textures/character_8.png b/mods/skinsdb/textures/character_8.png new file mode 100644 index 00000000..4c469c98 Binary files /dev/null and b/mods/skinsdb/textures/character_8.png differ diff --git a/mods/skinsdb/textures/character_9.png b/mods/skinsdb/textures/character_9.png new file mode 100644 index 00000000..dd7c5afe Binary files /dev/null and b/mods/skinsdb/textures/character_9.png differ diff --git a/mods/skinsdb/textures/character_nora_flat.png b/mods/skinsdb/textures/character_nora_flat.png new file mode 100644 index 00000000..cffbcdb6 Binary files /dev/null and b/mods/skinsdb/textures/character_nora_flat.png differ diff --git a/mods/skinsdb/textures/character_nora_half.png b/mods/skinsdb/textures/character_nora_half.png new file mode 100644 index 00000000..9433d585 Binary files /dev/null and b/mods/skinsdb/textures/character_nora_half.png differ diff --git a/mods/skinsdb/textures/readme.txt b/mods/skinsdb/textures/readme.txt new file mode 100644 index 00000000..73885f13 --- /dev/null +++ b/mods/skinsdb/textures/readme.txt @@ -0,0 +1,33 @@ +This location is where you can put your custom skins. + + +List of accepted texture names +------------------------------ + +Public skin available for all users: + character.[number or name].png + ^ The allowed characters in "[number or name]" are "[A-z0-9_.-]+". + +One or multiple private skins for player "[nick]": + player.[nick].png + player.[nick].[number or name].png + +Skin previews for public and private skins: + character.[number or name].preview.png + player.[nick].preview.png + player.[nick].[number or name].preview.png + + Note: This is optional and overrides automatically generated preciewws. + + +Legacy texture names +-------------------- + +The character `_` is accepted in player names, thus it is not recommended to +use such file names. For compatibility reasons, they are still recognized. + + character_[number or name].png + player_[nick].png + player_[nick]_[number or name].png + +... and corresponding previews that end in `_preview.png`. diff --git a/mods/skinsdb/textures/skindb_mask_chest.png b/mods/skinsdb/textures/skindb_mask_chest.png new file mode 100644 index 00000000..b0456da4 Binary files /dev/null and b/mods/skinsdb/textures/skindb_mask_chest.png differ diff --git a/mods/skinsdb/textures/skindb_mask_head.png b/mods/skinsdb/textures/skindb_mask_head.png new file mode 100644 index 00000000..50586731 Binary files /dev/null and b/mods/skinsdb/textures/skindb_mask_head.png differ diff --git a/mods/skinsdb/textures/skindb_mask_rarm.png b/mods/skinsdb/textures/skindb_mask_rarm.png new file mode 100644 index 00000000..dfe18135 Binary files /dev/null and b/mods/skinsdb/textures/skindb_mask_rarm.png differ diff --git a/mods/skinsdb/textures/skindb_mask_rleg.png b/mods/skinsdb/textures/skindb_mask_rleg.png new file mode 100644 index 00000000..d06c3d8a Binary files /dev/null and b/mods/skinsdb/textures/skindb_mask_rleg.png differ diff --git a/mods/skinsdb/textures/skindb_transform.png b/mods/skinsdb/textures/skindb_transform.png new file mode 100644 index 00000000..a36bf543 Binary files /dev/null and b/mods/skinsdb/textures/skindb_transform.png differ diff --git a/mods/skinsdb/textures/skins_button.png b/mods/skinsdb/textures/skins_button.png new file mode 100644 index 00000000..f4c006c4 Binary files /dev/null and b/mods/skinsdb/textures/skins_button.png differ diff --git a/mods/skinsdb/unified_inventory_page.lua b/mods/skinsdb/unified_inventory_page.lua new file mode 100644 index 00000000..d39ee4f4 --- /dev/null +++ b/mods/skinsdb/unified_inventory_page.lua @@ -0,0 +1,52 @@ +local S = minetest.get_translator("skinsdb") + +unified_inventory.register_page("skins", { + get_formspec = function(player, perplayer_formspec) + local skin = skins.get_player_skin(player) + local boffs = (type(perplayer_formspec) == "table") and 2 or 0.75 + + local formspec = perplayer_formspec.standard_inv_bg.. + skins.get_skin_info_formspec(skin, perplayer_formspec).. + "button["..boffs..",3;6.5,.5;skins_page;"..S("Change").."]" + return {formspec=formspec} + end, +}) + +unified_inventory.register_button("skins", { + type = "image", + image = "skins_button.png", + tooltip = S("Skins"), +}) + +local function get_formspec(player, perplayer_formspec) + local context = skins.get_formspec_context(player) + local formspec = perplayer_formspec.standard_inv_bg.. + skins.get_skin_selection_formspec(player, context, perplayer_formspec) + return formspec +end + +unified_inventory.register_page("skins_page", { + get_formspec = function(player, perplayer_formspec) + return {formspec=get_formspec(player, perplayer_formspec)} + end +}) + +-- click button handlers +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.skins then + unified_inventory.set_inventory_formspec(player, "craft") + return + end + + if formname ~= "" then + return + end + + local context = skins.get_formspec_context(player) + local action = skins.on_skin_selection_receive_fields(player, context, fields) + if action == 'set' then + unified_inventory.set_inventory_formspec(player, "skins") + elseif action == 'page' then + unified_inventory.set_inventory_formspec(player, "skins_page") + end +end) diff --git a/mods/skinsdb/unittest.lua b/mods/skinsdb/unittest.lua new file mode 100644 index 00000000..bf476d2b --- /dev/null +++ b/mods/skinsdb/unittest.lua @@ -0,0 +1,51 @@ +local function get_skin(skin_name) + local skin = skins.get(skin_name) + or skins.__fuzzy_match_skin_name("(unittest)", skin_name, true) + return skin and skin:get_key() or nil +end + +local function run_unittest() + local PATH = ":UNITTEST:" + + -- ----- + -- `.`: Simple register + retrieve operations + assert(skins.register_skin(PATH, "player.DotSep.png")) + assert(skins.register_skin(PATH, "player._DotSep_666_.1.png")) + assert(skins.register_skin(PATH, "character._DotSep_With-Dash-.png")) + + assert(get_skin("player.DotSep")) + assert(get_skin("player._DotSep_666_.1")) + assert(get_skin("player.DotSep.1") == nil) + assert(get_skin("character._DotSep_With-Dash-")) + + -- ----- + -- Ambiguous skin names (filenames without extension). Register + retrieve + skins.new("player_AmbSki") + skins.new("player_AmbSki_1") + skins.new("player_AmbSki_666_1") + + assert(get_skin("player_AmbSki")) + assert(get_skin("player_AmbSki_") == nil) + assert(get_skin("player_AmbSki_1")) + assert(get_skin("player_AmbSki_666_1")) + -- There are no `__` patterns as they were silently removed by string.split + + + -- ----- + -- Mod Storage backwards compatibility + -- Match the old `_` notation to `.`-separated skins + skins.register_skin(PATH, "player.ComPat42.png") + skins.register_skin(PATH, "player.ComPat42.5.png") + skins.register_skin(PATH, "player._Com_Pat_42.png") + skins.register_skin(PATH, "player._Com_Pat_42.1.png") + + assert(get_skin("player_ComPat42") == "player.ComPat42") + assert(get_skin("player_ComPat42_5") == "player.ComPat42.5") + assert(get_skin("player_Com_Pat_42") == "player._Com_Pat_42") + assert(get_skin("player_Com_Pat_42_1") == "player._Com_Pat_42.1") + + error("Unittest passed! Please disable them now.") +end + +run_unittest() + diff --git a/mods/soup/LICENSE.md b/mods/soup/LICENSE.md new file mode 100644 index 00000000..f6518278 --- /dev/null +++ b/mods/soup/LICENSE.md @@ -0,0 +1,384 @@ +License for Code: + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + + + License for Textures: + + CC0 + + JoeEnderman + + 2023 diff --git a/mods/soup/README.md b/mods/soup/README.md new file mode 100644 index 00000000..6581702b --- /dev/null +++ b/mods/soup/README.md @@ -0,0 +1,8 @@ +This is a collection of soup food items for Minetest. + + + +That is all... + + +This project is licensed under the Mozilla Public License 2.0. diff --git a/mods/soup/cover.png b/mods/soup/cover.png new file mode 100644 index 00000000..396a9a19 Binary files /dev/null and b/mods/soup/cover.png differ diff --git a/mods/soup/init.lua b/mods/soup/init.lua new file mode 100644 index 00000000..15815bab --- /dev/null +++ b/mods/soup/init.lua @@ -0,0 +1,20 @@ +-- Soup items +minetest.register_alias("soup:tomato_soup","farming:tomato_soup") + +minetest.register_alias("soup:mushroom_soup","ethereal:mushroom_soup") + +minetest.register_craftitem("soup:chicken_noodle_soup", { + description = "Chicken Noodle Soup", + inventory_image = "chicken_noodle_soup.png", + on_use = minetest.item_eat(8,"ethereal:bowl"), +}) + +-- Soup recipes +minetest.register_craft({ + output = "soup:chicken_noodle_soup", + recipe = { + {"","animalia:poultry_cooked", ""}, + {"","bottles:bottle_of_water", ""}, + {"","group:food_bowl", ""} + } +}) \ No newline at end of file diff --git a/mods/soup/mod.conf b/mods/soup/mod.conf new file mode 100644 index 00000000..f840d2a4 --- /dev/null +++ b/mods/soup/mod.conf @@ -0,0 +1,3 @@ +name = soup +description = A mod that adds a few new food items. +depends = default, ethereal, bottles, animalia, farming \ No newline at end of file diff --git a/mods/soup/textures/chicken_noodle_soup.png b/mods/soup/textures/chicken_noodle_soup.png new file mode 100644 index 00000000..f7bf533f Binary files /dev/null and b/mods/soup/textures/chicken_noodle_soup.png differ diff --git a/mods/soup/textures/mushroom_soup.png b/mods/soup/textures/mushroom_soup.png new file mode 100644 index 00000000..74b6afed Binary files /dev/null and b/mods/soup/textures/mushroom_soup.png differ diff --git a/mods/soup/textures/tomato_soup.png b/mods/soup/textures/tomato_soup.png new file mode 100644 index 00000000..84104173 Binary files /dev/null and b/mods/soup/textures/tomato_soup.png differ diff --git a/mods/stamina/.luacheckrc b/mods/stamina/.luacheckrc new file mode 100644 index 00000000..a6b40039 --- /dev/null +++ b/mods/stamina/.luacheckrc @@ -0,0 +1,20 @@ +unused_args = false +allow_defined_top = true + +read_globals = { + "DIR_DELIM", + "minetest", + "dump", + "vector", "nodeupdate", + "VoxelManip", "VoxelArea", + "PseudoRandom", "ItemStack", + "intllib", + "default", + "armor", + "player_monoids", +} + +globals = { + minetest = { fields = { "do_item_eat" }}, +} + diff --git a/mods/stamina/API.txt b/mods/stamina/API.txt new file mode 100644 index 00000000..334a2d0f --- /dev/null +++ b/mods/stamina/API.txt @@ -0,0 +1,64 @@ +stamina.get_saturation(player) + Gets a player's saturation + +stamina.set_saturation(player, level) + Set a player's saturation. + Updates the HUD to reflect saturation level. + +stamina.update_saturation(player, level) + Update's a player's saturation. + Callbacks are processed first. + +stamina.change_saturation(player, change) + Update a player's saturation by a delta, instead of an absolute value. + +stamina.register_on_update_saturation(function(player, level)) + Register a callback for when saturation is updated. + If the callback returns True, no further callbacks are called, + and the default behavior is bypassed. +----------------------- +stamina.is_poisoned(player) + Check if a player is poisoned + +stamina.set_poisoned(player, poisoned) + Set a player's "poisoned" status (boolean) + Updates the HUD to reflect poison status. + +stamina.poison(player, ticks, interval) + Poison a player for a certain amount of time. + Ticks is how many times to poison the player. + Interval is the time between poison ticks. + Processes callbacks before changing status. + +stamina.register_on_poison(function(player, ticks, interval)) + Register a callback for when a player is poisoned. + If the callback returns True, no further callbacks are called, + and the default behavior is bypassed. +------------------------- +stamina.get_exhaustion(player) + Gets a player's exhaustion level. + Value is between 0 and `stamina.exhaust_lvl` (default: 160) + +stamina.set_exhaustion(player, level) + Sets a player's exhaustion level. + +stamina.exhaust_player(player, change, cause) + Update a player's exhaustion by "change". + If the player's exhaustion exceeds `stamina.exhaust_lvl`, stamina + is taken and exhaustion is reset. + Cause is an optional argument indicating the origin of the exhaustion. + Callbacks are processed before exhausting the player. + +stamina.register_on_exhaust_player(function(player, change, cause)) + Register a callback for when exhaustion is updated. + If the callback returns True, no further callbacks are called, + and the default behavior is bypassed. +------------------------ +stamina.set_sprinting(name, sprinting) + Sets whether a player is sprinting or not. + Callbacks are processed before setting sprint status. + +stamina.register_on_sprinting(function(player, sprinting)) + Register a callback for when a player's sprinting status is updated. + If the callback returns True, no further callbacks are called, + and the default behavior is bypassed. diff --git a/mods/stamina/README.txt b/mods/stamina/README.txt new file mode 100644 index 00000000..388c32bf --- /dev/null +++ b/mods/stamina/README.txt @@ -0,0 +1,50 @@ +Minetest mod "Stamina" +===================== + +(C) 2015 - BlockMen +(C) 2016 - Auke Kok + + +About this mod: +--------------- +This mod adds a stamina, or "hunger" mechanic to Minetest. Actions like +crafting, walking, digging or fighting make the player exhausted. When +enough exhaustion has been accumulated, the player gets more hungry, +and loses stamina. + +If a player is low on stamina, they start taking periodical damage, +and ultimately will die if they do not eat food. + +Eating food no longer heals the player. Instead, it increases the +stamina of the player. The stamina bar shows how well fed the player +is. More bread pieces means more stamina. + + +Q&A time: Why won't I move the stamina bar to the right? + +Answer: this conflicts with the builtin breath bar. To move the +builtin breath bar, I basically have to entirely re-implement it +in lua including timers to catch breath changes for each online +player, which is all a waste of time, just to move a few pixels +around. + + +For Modders: +------------ +This mod intercepts minetest.item_eat(), and applies the hp_change +as stamina change. The value can be positive (increase stamina) or +negative (periodically damage the player by 1 hp). + +See API.txt for information on the API. + +License: +-------- +Code: +- all code LGPL-2.1+ +Textures: +- stamina_hud_poison.png - BlockMen (CC-BY 3.0) +- stamina_hud_fg.png - PilzAdam (WTFPL), modified by BlockMen +- stamina_hud_bg.png - PilzAdam (WTFPL), modified by BlockMen +Sounds: +- stamina_eat.*.ogg - http://www.freesound.org/people/sonictechtonic/sounds/242215/ CC-BY-3.0 + diff --git a/mods/stamina/bower.json b/mods/stamina/bower.json new file mode 100644 index 00000000..34362013 --- /dev/null +++ b/mods/stamina/bower.json @@ -0,0 +1,14 @@ +{ + "name": "stamina", + "description": "This mod adds a stamina, or hunger mechanic to Minetest. Actions like crafting, walking, digging or fighting make the player exhausted.", + "homepage": "https://github.com/minetest-mods/stamina", + "authors": [ + "BlockMen - 2015", + "Auke Kok - 2016" + ], + "license": "LGPL-2.1+", + "keywords": [ + "hunger", + "stamina" + ] +} \ No newline at end of file diff --git a/mods/stamina/init.lua b/mods/stamina/init.lua new file mode 100644 index 00000000..59280a49 --- /dev/null +++ b/mods/stamina/init.lua @@ -0,0 +1,570 @@ +if not minetest.settings:get_bool("asuna.nutrition",true) then + return -- mod is disabled +end + +-- Translate Asuna nutrition settings to Stamina settings +minetest.settings:set("stamina.exhaust_lvl",asuna.content.nutrition.exhaustion_level) +minetest.settings:set("stamina.starve_lvl",asuna.content.nutrition.starvation and 1 or 0) + +stamina = {} +local modname = minetest.get_current_modname() +local armor_mod = minetest.get_modpath("3d_armor") and minetest.global_exists("armor") and armor.def +local player_monoids_mod = minetest.get_modpath("player_monoids") and minetest.global_exists("player_monoids") + +function stamina.log(level, message, ...) + return minetest.log(level, ("[%s] %s"):format(modname, message:format(...))) +end + +local function get_setting(key, default) + local value = minetest.settings:get("stamina." .. key) + local num_value = tonumber(value) + if value and not num_value then + stamina.log("warning", "Invalid value for setting %s: %q. Using default %q.", key, value, default) + end + return num_value or default +end + +stamina.settings = { + -- see settingtypes.txt for descriptions + eat_particles = minetest.settings:get_bool("stamina.eat_particles", true), + sprint = minetest.settings:get_bool("stamina.sprint", true), + sprint_particles = minetest.settings:get_bool("stamina.sprint_particles", true), + sprint_lvl = get_setting("sprint_lvl", 0), + sprint_speed = get_setting("sprint_speed", 1), + sprint_jump = get_setting("sprint_jump", 0), + sprint_with_fast = minetest.settings:get_bool("stamina.sprint_with_fast", true), + tick = get_setting("tick", 1200), + tick_min = get_setting("tick_min", 0), + health_tick = get_setting("health_tick", 5), + move_tick = get_setting("move_tick", 0.25), + poison_tick = get_setting("poison_tick", 2.0), + exhaust_dig = get_setting("exhaust_dig", 0.5), + exhaust_place = get_setting("exhaust_place", 0.5), + exhaust_move = get_setting("exhaust_move", 0.1), + exhaust_jump = get_setting("exhaust_jump", 0.1), + exhaust_craft = get_setting("exhaust_craft", 0.5), + exhaust_punch = get_setting("exhaust_punch", 0.5), + exhaust_sprint = get_setting("exhaust_sprint", 2), + exhaust_lvl = get_setting("exhaust_lvl", 160), + heal = get_setting("heal", 1), + heal_lvl = get_setting("heal_lvl", 1), + starve = get_setting("starve", 1), + starve_lvl = get_setting("starve_lvl", 0), + visual_max = get_setting("visual_max", 20), +} +local settings = stamina.settings + +local attribute = { + saturation = "stamina:level", + poisoned = "stamina:poisoned", + exhaustion = "stamina:exhaustion", +} + +local function is_player(player) + return ( + minetest.is_player(player) and + not player.is_fake_player + ) +end + +local function set_player_attribute(player, key, value) + local meta = player:get_meta() + if value == nil then + meta:set_string(key, "") + else + meta:set_string(key, tostring(value)) + end +end + +local function get_player_attribute(player, key) + local meta = player:get_meta() + return meta:get_string(key) +end + +local hud_ids_by_player_name = {} + +local function get_hud_id(player) + return hud_ids_by_player_name[player:get_player_name()] +end + +local function set_hud_id(player, hud_id) + hud_ids_by_player_name[player:get_player_name()] = hud_id +end + +--- SATURATION API --- +function stamina.get_saturation(player) + return tonumber(get_player_attribute(player, attribute.saturation)) +end + +function stamina.set_saturation(player, level) + set_player_attribute(player, attribute.saturation, level) + player_monoids.speed:add_change(player, 1 + (level / 80), "stamina:passive_speed") + player:hud_change( + get_hud_id(player), + "number", + math.min(settings.visual_max, level) + ) +end + +stamina.registered_on_update_saturations = {} +function stamina.register_on_update_saturation(fun) + table.insert(stamina.registered_on_update_saturations, fun) +end + +function stamina.update_saturation(player, level) + for _, callback in ipairs(stamina.registered_on_update_saturations) do + local result = callback(player, level) + if result then + return result + end + end + + local old = stamina.get_saturation(player) + + if level == old then -- To suppress HUD update + return + end + + -- players without interact priv cannot eat + if old < settings.heal_lvl and not minetest.check_player_privs(player, {interact=true}) then + return + end + + stamina.set_saturation(player, level) +end + +function stamina.change_saturation(player, change) + if not is_player(player) or not change or change == 0 then + return false + end + local level = stamina.get_saturation(player) + change + level = math.max(level, 0) + level = math.min(level, settings.visual_max) + stamina.update_saturation(player, level) + return true +end + +stamina.change = stamina.change_saturation -- for backwards compatablity +--- END SATURATION API --- +--- POISON API --- +function stamina.is_poisoned(player) + return get_player_attribute(player, attribute.poisoned) == "yes" +end + +function stamina.set_poisoned(player, poisoned) + local hud_id = get_hud_id(player) + if poisoned then + player:hud_change(hud_id, "text", "stamina_hud_poison.png") + set_player_attribute(player, attribute.poisoned, "yes") + else + player:hud_change(hud_id, "text", "stamina_hud_fg.png") + set_player_attribute(player, attribute.poisoned, nil) + end +end + +local function poison_tick(player_name, ticks, interval, elapsed) + local player = minetest.get_player_by_name(player_name) + if not player or not stamina.is_poisoned(player) then + return + elseif elapsed > ticks then + stamina.set_poisoned(player, false) + else + -- Subtract from either HP or saturation randomly based on current saturation + local saturation = stamina.get_saturation(player) + local subtract_hp = math.random(20) > saturation + local hp = player:get_hp() - 1 + if subtract_hp and hp > 0 then + player:set_hp(hp, {type = "set_hp", cause = "stamina:poison"}) + else + stamina.set_saturation(player,saturation - 1) + end + minetest.after(interval, poison_tick, player_name, ticks, interval, elapsed + 1) + end +end + +stamina.registered_on_poisons = {} +function stamina.register_on_poison(fun) + table.insert(stamina.registered_on_poisons, fun) +end + +function stamina.poison(player, ticks, interval) + for _, fun in ipairs(stamina.registered_on_poisons) do + local rv = fun(player, ticks, interval) + if rv == true then + return + end + end + if not is_player(player) then + return + end + stamina.set_poisoned(player, true) + local player_name = player:get_player_name() + poison_tick(player_name, ticks, interval, 0) +end +--- END POISON API --- +--- EXHAUSTION API --- +stamina.exhaustion_reasons = { + craft = "craft", + dig = "dig", + heal = "heal", + jump = "jump", + move = "move", + place = "place", + punch = "punch", + sprint = "sprint", +} + +function stamina.get_exhaustion(player) + return tonumber(get_player_attribute(player, attribute.exhaustion)) +end + +function stamina.set_exhaustion(player, exhaustion) + set_player_attribute(player, attribute.exhaustion, exhaustion) +end + +stamina.registered_on_exhaust_players = {} +function stamina.register_on_exhaust_player(fun) + table.insert(stamina.registered_on_exhaust_players, fun) +end + +function stamina.exhaust_player(player, change, cause) + for _, callback in ipairs(stamina.registered_on_exhaust_players) do + local result = callback(player, change, cause) + if result then + return result + end + end + + if not is_player(player) then + return + end + + local exhaustion = stamina.get_exhaustion(player) or 0 + + exhaustion = exhaustion + change + + if exhaustion >= settings.exhaust_lvl then + exhaustion = exhaustion - settings.exhaust_lvl + stamina.change_saturation(player, -1) + end + + stamina.set_exhaustion(player, exhaustion) +end +--- END EXHAUSTION API --- +--- SPRINTING API --- +stamina.registered_on_sprintings = {} +function stamina.register_on_sprinting(fun) + table.insert(stamina.registered_on_sprintings, fun) +end + +function stamina.set_sprinting(player, sprinting) + for _, fun in ipairs(stamina.registered_on_sprintings) do + local rv = fun(player, sprinting) + if rv == true then + return + end + end + + if player_monoids_mod then + if sprinting then + player_monoids.speed:add_change(player, 1 + settings.sprint_speed, "stamina:physics") + player_monoids.jump:add_change(player, 1 + settings.sprint_jump, "stamina:physics") + else + player_monoids.speed:del_change(player, "stamina:physics") + player_monoids.jump:del_change(player, "stamina:physics") + end + else + local def + if armor_mod then + -- Get player physics from 3d_armor mod + local name = player:get_player_name() + def = { + speed=armor.def[name].speed, + jump=armor.def[name].jump, + gravity=armor.def[name].gravity + } + else + def = { + speed=1, + jump=1, + gravity=1 + } + end + + if sprinting then + def.speed = def.speed + settings.sprint_speed + def.jump = def.jump + settings.sprint_jump + end + + player:set_physics_override(def) + end + + if settings.sprint_particles and sprinting then + local pos = player:get_pos() + local node = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}) + local def = minetest.registered_nodes[node.name] or {} + local drawtype = def.drawtype + if drawtype ~= "airlike" and drawtype ~= "liquid" and drawtype ~= "flowingliquid" then + minetest.add_particlespawner({ + amount = 5, + time = 0.01, + minpos = {x = pos.x - 0.25, y = pos.y + 0.1, z = pos.z - 0.25}, + maxpos = {x = pos.x + 0.25, y = pos.y + 0.1, z = pos.z + 0.25}, + minvel = {x = -0.5, y = 1, z = -0.5}, + maxvel = {x = 0.5, y = 2, z = 0.5}, + minacc = {x = 0, y = -5, z = 0}, + maxacc = {x = 0, y = -12, z = 0}, + minexptime = 0.25, + maxexptime = 0.5, + minsize = 0.5, + maxsize = 1.0, + vertical = false, + collisiondetection = false, + texture = "default_dirt.png", + }) + end + end +end +--- END SPRINTING API --- + +-- Time based stamina functions +local function move_tick() + for _,player in ipairs(minetest.get_connected_players()) do + local controls = player:get_player_control() + local is_moving = controls.up or controls.down or controls.left or controls.right + local velocity = player:get_velocity() + velocity.y = 0 + local horizontal_speed = vector.length(velocity) + local has_velocity = horizontal_speed > 0.05 + + if controls.jump then + stamina.exhaust_player(player, settings.exhaust_jump, stamina.exhaustion_reasons.jump) + elseif is_moving and has_velocity then + stamina.exhaust_player(player, settings.exhaust_move, stamina.exhaustion_reasons.move) + end + + if settings.sprint then + local can_sprint = ( + controls.aux1 and + not player:get_attach() and + (settings.sprint_with_fast or not minetest.check_player_privs(player, {fast = true})) and + stamina.get_saturation(player) > settings.sprint_lvl + ) + + if can_sprint then + stamina.set_sprinting(player, true) + if is_moving and has_velocity then + stamina.exhaust_player(player, settings.exhaust_sprint, stamina.exhaustion_reasons.sprint) + end + else + stamina.set_sprinting(player, false) + end + end + end +end + +local function stamina_tick() + -- lower saturation by 1 point after settings.tick second(s) + for _,player in ipairs(minetest.get_connected_players()) do + local saturation = stamina.get_saturation(player) + if saturation > settings.tick_min then + stamina.update_saturation(player, saturation - 1) + end + end +end + +local function health_tick() + -- heal or damage player, depending on saturation + for _,player in ipairs(minetest.get_connected_players()) do + local air = player:get_breath() or 0 + local hp = player:get_hp() + local hp_max = player:get_properties().hp_max + local saturation = stamina.get_saturation(player) + + -- don't heal if dead, drowning, or poisoned + local should_heal = ( + saturation >= settings.heal_lvl and + hp < hp_max and + hp > 0 and + air > 0 and + not stamina.is_poisoned(player) and + math.random(20) <= saturation -- random chance to heal + ) + -- or damage player by 1 hp if saturation is < 2 (of 30) + local is_starving = ( + saturation < settings.starve_lvl and + hp > 0 + ) + + if should_heal then + player:set_hp(hp + settings.heal, {type = "set_hp", cause = "stamina:heal"}) + stamina.exhaust_player(player, settings.exhaust_lvl, stamina.exhaustion_reasons.heal) + elseif is_starving then + player:set_hp(hp - settings.starve, {type = "set_hp", cause = "stamina:starve"}) + end + end +end + +local stamina_timer = 0 +local health_timer = 0 +local action_timer = 0 + +local function stamina_globaltimer(dtime) + stamina_timer = stamina_timer + dtime + health_timer = health_timer + dtime + action_timer = action_timer + dtime + + if action_timer > settings.move_tick then + action_timer = 0 + move_tick() + end + + if stamina_timer > settings.tick then + stamina_timer = 0 + stamina_tick() + end + + if health_timer > settings.health_tick then + health_timer = 0 + health_tick() + end +end + +local function show_eat_particles(player, itemname) + -- particle effect when eating + local pos = player:get_pos() + pos.y = pos.y + (player:get_properties().eye_height * .923) -- assume mouth is slightly below eye_height + local dir = player:get_look_dir() + + local def = minetest.registered_items[itemname] + local texture = def.inventory_image or def.wield_image + + local particle_def = { + amount = 5, + time = 0.1, + minpos = pos, + maxpos = pos, + minvel = {x = dir.x - 1, y = dir.y, z = dir.z - 1}, + maxvel = {x = dir.x + 1, y = dir.y, z = dir.z + 1}, + minacc = {x = 0, y = -5, z = 0}, + maxacc = {x = 0, y = -9, z = 0}, + minexptime = 1, + maxexptime = 1, + minsize = 1, + maxsize = 2, + } + + if texture and texture ~= "" then + particle_def.texture = texture + + elseif def.type == "node" then + particle_def.node = {name = itemname, param2 = 0} + + else + particle_def.texture = "blank.png" + end + + minetest.add_particlespawner(particle_def) +end + +-- override minetest.do_item_eat() so we can redirect hp_change to stamina +stamina.core_item_eat = minetest.do_item_eat +function minetest.do_item_eat(hp_change, replace_with_item, itemstack, player, pointed_thing) + for _, callback in ipairs(minetest.registered_on_item_eats) do + local result = callback(hp_change, replace_with_item, itemstack, player, pointed_thing) + if result then + return result + end + end + + if not is_player(player) or not itemstack then + return itemstack + end + + local level = stamina.get_saturation(player) or 0 + if level >= settings.visual_max and hp_change > 0 then + -- don't eat if player is full and item provides saturation + return itemstack + end + + local itemname = itemstack:get_name() + if replace_with_item then + stamina.log("action", "%s eats %s for %s stamina, replace with %s", + player:get_player_name(), itemname, hp_change, replace_with_item) + else + stamina.log("action", "%s eats %s for %s stamina", + player:get_player_name(), itemname, hp_change) + end + minetest.sound_play("stamina_eat", {to_player = player:get_player_name(), gain = 0.7}, true) + + if hp_change > 0 then + stamina.change_saturation(player, hp_change) + stamina.set_exhaustion(player, 0) + elseif hp_change < 0 then + stamina.poison(player, -hp_change, settings.poison_tick) + end + + if settings.eat_particles then + show_eat_particles(player, itemname) + end + + itemstack:take_item() + player:set_wielded_item(itemstack) + replace_with_item = ItemStack(replace_with_item) + if not replace_with_item:is_empty() then + local inv = player:get_inventory() + replace_with_item = inv:add_item("main", replace_with_item) + if not replace_with_item:is_empty() then + local pos = player:get_pos() + pos.y = math.floor(pos.y - 1.0) + minetest.add_item(pos, replace_with_item) + end + end + + return nil -- don't overwrite wield item a second time +end + +minetest.register_on_joinplayer(function(player) + local level = stamina.get_saturation(player) or settings.visual_max + local id = player:hud_add({ + name = "stamina", + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + size = {x = 24, y = 24}, + text = "stamina_hud_fg.png", + number = level, + text2 = "stamina_hud_bg.png", + item = settings.visual_max, + alignment = {x = -1, y = -1}, + offset = {x = -266, y = -110}, + max = 0, + }) + set_hud_id(player, id) + stamina.set_saturation(player, level) + -- reset poisoned + stamina.set_poisoned(player, false) + -- remove legacy hud_id from player metadata + set_player_attribute(player, "stamina:hud_id", nil) +end) + +minetest.register_on_leaveplayer(function(player) + set_hud_id(player, nil) +end) + +minetest.register_globalstep(stamina_globaltimer) + +minetest.register_on_placenode(function(pos, oldnode, player, ext) + stamina.exhaust_player(player, settings.exhaust_place, stamina.exhaustion_reasons.place) +end) +minetest.register_on_dignode(function(pos, oldnode, player, ext) + stamina.exhaust_player(player, settings.exhaust_dig, stamina.exhaustion_reasons.dig) +end) +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + stamina.exhaust_player(player, settings.exhaust_craft, stamina.exhaustion_reasons.craft) +end) +minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + stamina.exhaust_player(hitter, settings.exhaust_punch, stamina.exhaustion_reasons.punch) +end) +minetest.register_on_respawnplayer(function(player) + stamina.update_saturation(player, settings.visual_max) +end) diff --git a/mods/stamina/mod.conf b/mods/stamina/mod.conf new file mode 100644 index 00000000..43bd36ea --- /dev/null +++ b/mods/stamina/mod.conf @@ -0,0 +1,6 @@ +name = stamina +title = Stamina +description = Adds stamina and hunger effects. +min_minetest_version = 5.4 +depends = default +optional_depends = 3d_armor, player_monoids diff --git a/mods/stamina/settingtypes.txt b/mods/stamina/settingtypes.txt new file mode 100644 index 00000000..116726a8 --- /dev/null +++ b/mods/stamina/settingtypes.txt @@ -0,0 +1,24 @@ +stamina.enabled (Is stamina enabled?) bool true +stamina.sprint (Is sprint enabled?) bool true +stamina.sprint_particles (Are sprint particles enabled?) bool true +stamina.tick (time in seconds after that 1 saturation point is taken) float 1200 +stamina.tick_min (stamina ticks won't reduce saturation below this level) int 0 +stamina.health_tick (time in seconds after player gets healed/damaged) float 5 +stamina.move_tick (time in seconds after the movement is checked) float 0.25 +stamina.exhaust_dig (exhaustion for digging a node) float 0.5 +stamina.exhaust_place (exhaustion for placing a node) float 0.5 +stamina.exhaust_move (exhaustion for moving) float 0.1 +stamina.exhaust_jump (exhaustion for jumping) float 0.1 +stamina.exhaust_craft (exhaustion for crafting) float 0.5 +stamina.exhaust_punch (exhaustion for punching) float 0.5 +stamina.exhaust_sprint (exhaustion for sprinting) float 2 +stamina.exhaust_lvl (exhaustion level at which saturation gets lowered) float 160 +stamina.heal (amount of HP a player gains per stamina.health_tick) int 1 0 20 +stamina.heal_lvl (minimum saturation needed for healing) int 1 0 20 +stamina.starve (amount of HP a player loses per stamina.health_tick) int 1 0 20 +stamina.starve_lvl (maximum stamina needed for starving) int 0 0 19 +stamina.visual_max (hud bar only extends to 20) int 20 2 20 +stamina.sprint_speed (how much faster a player can run if satiated) float 1 0 2 +stamina.sprint_jump (how much faster a player can jump if satiated) float 0 0 2 +stamina.eat_particles (Whether to generate particles when eating) bool true +stamina.sprint_with_fast (Sprint when player has fast privilege?) bool true diff --git a/mods/stamina/sounds/stamina_eat.1.ogg b/mods/stamina/sounds/stamina_eat.1.ogg new file mode 100644 index 00000000..da2b68b2 Binary files /dev/null and b/mods/stamina/sounds/stamina_eat.1.ogg differ diff --git a/mods/stamina/sounds/stamina_eat.2.ogg b/mods/stamina/sounds/stamina_eat.2.ogg new file mode 100644 index 00000000..edca4239 Binary files /dev/null and b/mods/stamina/sounds/stamina_eat.2.ogg differ diff --git a/mods/stamina/sounds/stamina_eat.3.ogg b/mods/stamina/sounds/stamina_eat.3.ogg new file mode 100644 index 00000000..1f06ea58 Binary files /dev/null and b/mods/stamina/sounds/stamina_eat.3.ogg differ diff --git a/mods/stamina/textures/stamina_hud_bg.png b/mods/stamina/textures/stamina_hud_bg.png new file mode 100644 index 00000000..e5b57612 Binary files /dev/null and b/mods/stamina/textures/stamina_hud_bg.png differ diff --git a/mods/stamina/textures/stamina_hud_fg.png b/mods/stamina/textures/stamina_hud_fg.png new file mode 100644 index 00000000..df7713c6 Binary files /dev/null and b/mods/stamina/textures/stamina_hud_fg.png differ diff --git a/mods/stamina/textures/stamina_hud_poison.png b/mods/stamina/textures/stamina_hud_poison.png new file mode 100644 index 00000000..b4ac02e8 Binary files /dev/null and b/mods/stamina/textures/stamina_hud_poison.png differ diff --git a/mods/telemosaic/.luacheckrc b/mods/telemosaic/.luacheckrc new file mode 100644 index 00000000..6e56b4ad --- /dev/null +++ b/mods/telemosaic/.luacheckrc @@ -0,0 +1,18 @@ +unused_args = false + +globals = { + "telemosaic" +} + +read_globals = { + -- Stdlib + string = {fields = {"split"}}, + + -- Minetest + "minetest", + "vector", "ItemStack", + + -- Deps + "default", + "digilines" +} diff --git a/mods/telemosaic/LICENSE b/mods/telemosaic/LICENSE new file mode 100644 index 00000000..5f2dd7fc --- /dev/null +++ b/mods/telemosaic/LICENSE @@ -0,0 +1,505 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + diff --git a/mods/telemosaic/README.md b/mods/telemosaic/README.md new file mode 100644 index 00000000..18f2533b --- /dev/null +++ b/mods/telemosaic/README.md @@ -0,0 +1,59 @@ +# Telemosaic [telemosaic] + +[![luacheck](https://github.com/mt-mods/telemosaic/workflows/luacheck/badge.svg)](https://github.com/mt-mods/telemosaic/actions) + +A Minetest mod for user-generated teleportation pads. + +![screenshot](screenshot.png?raw=true "screenshot") + +## Description + +This is a mod for Minetest. It provides teleportation pads, called "beacons". Unlike other teleportation mods, no menus or GUIs are used; you set the destination with a simple "key" item. There is no tooltip for the destination either, so signs are recommended. + +Another difference is the limited default range of the beacons. To increase the range, you need to place "extenders" around the beacon. The extenders come in different colors, allowing the extenders to form a pretty pattern; hence the name "telemosaic". + +## Notes + +This is a maintained fork of https://github.com/bendeutsch/minetest-telemosaic with various improvements and changes, optimized for multiplayer environments. + +* Beacons no longer teleport players automatically, they must be right-clicked by a player. +* More chat messages are sent to inform and help players with non-functional telemosaics. +* Telemosaic keys can be preserved by holding shift when right-clicking a beacon. +* Beacons can be enabled and disabled by punching them with a telemosaic key. +* If the `digilines` mod is installed, beacons can be controlled by digilines. +* and other small changes... + +## Usage + +Right-clicking a beacon with a default mese crystal fragment creates a telemosaic key with the position of the beacon. + +Right-clicking a second beacon with the key sets the destination of the second beacon to the position of the first beacon. To set up a return path, right-click the second beacon with the fragment, and then first beacon with the resulting key again. + +The beacons do not need to be strictly paired this way: rings or star-shaped networks are also possible. Each beacon has only a single destination, but can itself be the destination of several others. + +Once linked, you teleport between beacons by right-clicking them. Before teleporting, beacons will check that their destination is sane: the destination still needs to be a beacon, and the two nodes above it should be clear for walking/standing in. + +Beacons have a default range of 20 nodes. If the destination is too far away, the beacon will turn red and will not function. To extend the range for a beacon, place "extenders" next to it, within a 7x7 horizontal square centered on the beacon, and at the same level or one node below the beacon. + +Extenders come in three tiers, with each being more powerful than the tier below. By default, tier 1, tier 2, and tier 3 extenders increase the range of nearby beacons by 5, 20, and 80 nodes, respectively. + +Extenders can be colored with any of the dyes found in the `dye` mod. Colored extenders work just like regular extenders, both for teleporting and for recipes. + +## Digilines + +When the `digilines` mod is installed, telemosaic beacons can be controlled by sending digiline messages. By default, all beacons use the channel "telemosaic", but you can change the channel name via digilines. + +For full documentaion, see [digilines.md](digilines.md). + +## Dependencies + +* `default` +* `doors` +* `dye` (optional) +* `digilines` (optional) + +## License + +* Code: LGPL 2.1 (see included LICENSE file) +* Textures: CC-BY-SA (see http://creativecommons.org/licenses/by-sa/4.0/) +* textures/telemosaic_beacon_protected_overlay.png MIT (https://notabug.org/TenPlus1/protector) diff --git a/mods/telemosaic/abm.lua b/mods/telemosaic/abm.lua new file mode 100644 index 00000000..103dbd49 --- /dev/null +++ b/mods/telemosaic/abm.lua @@ -0,0 +1,22 @@ + +minetest.register_abm({ + label = "Telemosaic beacon effect", + nodenames = {"group:telemosaic_active"}, + interval = 2.0, + chance = 2, + catch_up = false, + action = function(pos) + minetest.add_particlespawner({ + amount = 4, + time = 2, + minpos = vector.add(pos, {x=-0.2, y=0, z=-0.2}), + maxpos = vector.add(pos, {x=0.2, y=0, z=0.2}), + minvel = {x=0, y=1, z=0}, + maxvel = {x=0, y=2, z=0}, + maxexptime = 2, + maxsize = 1.7, + texture = "telemosaic_particle_arrival.png", + glow = 9 + }) + end +}) diff --git a/mods/telemosaic/beacon.lua b/mods/telemosaic/beacon.lua new file mode 100644 index 00000000..7ca64ae6 --- /dev/null +++ b/mods/telemosaic/beacon.lua @@ -0,0 +1,92 @@ +local S = minetest.get_translator("telemosaic") + +for _,protected in pairs({true, false}) do + + local node_name_suffix = protected and "_protected" or "" + local texture_overlay = protected and "^telemosaic_beacon_protected_overlay.png" or "" + local description = protected and "Protected Telemosaic Beacon" + or "Telemosaic Beacon" + local description_prefix = protected and "Protected " or "" + + minetest.register_node("telemosaic:beacon_off"..node_name_suffix, { + description = S(description), + tiles = { + "telemosaic_beacon_off.png"..texture_overlay, + "telemosaic_beacon_side.png", + }, + paramtype = "light", + groups = {cracky = 2, telemosaic = 1, telemosaic_off = 1}, + is_ground_content = false, + on_rightclick = telemosaic.rightclick, + digilines = telemosaic.digilines, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("telemosaic:beacon"..node_name_suffix, { + description = S(description_prefix .. + "Telemosaic Beacon Active (you hacker you!)"), + tiles = { + "telemosaic_beacon_top.png"..texture_overlay, + "telemosaic_beacon_side.png", + }, + paramtype = "light", + groups = {cracky = 2, not_in_creative_inventory = 1, telemosaic = 1, telemosaic_active = 1}, + is_ground_content = false, + drop = "telemosaic:beacon_off"..node_name_suffix, + on_rightclick = telemosaic.rightclick, + digilines = telemosaic.digilines, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("telemosaic:beacon_err"..node_name_suffix, { + description = S(description_prefix .. + "Telemosaic Beacon Error (you hacker you!)"), + tiles = { + "telemosaic_beacon_err.png"..texture_overlay, + "telemosaic_beacon_side.png", + }, + paramtype = "light", + groups = {cracky = 2, not_in_creative_inventory = 1, telemosaic = 1, telemosaic_error = 1}, + is_ground_content = false, + drop = "telemosaic:beacon_off"..node_name_suffix, + on_rightclick = telemosaic.rightclick, + digilines = telemosaic.digilines, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("telemosaic:beacon_disabled"..node_name_suffix, { + description = S(description_prefix .. + "Telemosaic Beacon Disabled (you hacker you!)"), + tiles = { + "telemosaic_beacon_disabled.png"..texture_overlay, + "telemosaic_beacon_side.png", + }, + paramtype = "light", + groups = {cracky = 2, not_in_creative_inventory = 1, telemosaic = 1, telemosaic_disabled = 1}, + is_ground_content = false, + drop = "telemosaic:beacon_off"..node_name_suffix, + on_rightclick = telemosaic.rightclick, + digilines = telemosaic.digilines, + sounds = default.node_sound_metal_defaults(), + }) +end + +minetest.register_craft({ + output = "telemosaic:beacon_off", + recipe = { + {"default:diamond", "doors:door_wood", "default:diamond"}, + {"default:obsidian","default:obsidian","default:obsidian"} + } +}) + +minetest.register_craft({ + output = "telemosaic:beacon_off_protected", + type = "shapeless", + recipe = {"telemosaic:beacon_off", "default:steel_ingot"} +}) + +minetest.register_craft({ + output = "telemosaic:beacon_off", + type = "shapeless", + recipe = {"telemosaic:beacon_off_protected"} +}) diff --git a/mods/telemosaic/digilines.lua b/mods/telemosaic/digilines.lua new file mode 100644 index 00000000..c582a99d --- /dev/null +++ b/mods/telemosaic/digilines.lua @@ -0,0 +1,81 @@ + +local function digiline_receive(pos, _, channel, msg) + local meta = minetest.get_meta(pos) + + local set_channel = meta:get("channel") or telemosaic.default_channel + if channel ~= set_channel then + return + end + + if type(msg) == "string" then + -- Convert string command to table + if msg == "get" or msg == "GET" then + msg = {command = "get"} + + elseif msg == "enable" or msg == "disable" then + msg = {command = msg} + + elseif msg:match("^setchannel .+") then + local c = string.split(msg, " ", true, 1) + msg = {command = c[1], channel = c[2]} + + elseif msg:match("^setdest .+") then + local c = string.split(msg, " ", true, 1) + local p = string.split(c[2], ",") + msg = {command = c[1], x = p[1], y = p[2], z = p[3]} + end + end + + if type(msg) ~= "table" or not msg.command then + return + end + + if msg.command == "get" then + local dest = telemosaic.get_destination(pos) + digilines.receptor_send(pos, digilines.rules.default, set_channel, { + state = telemosaic.get_state(pos), + origin = pos, + target = dest, + pos = pos, + destination = dest, + }) + + elseif msg.command == "setchannel" then + if type(msg.channel) == "string" then + meta:set_string("channel", msg.channel) + end + + elseif msg.command == "enable" then + if telemosaic.get_state(pos) == "disabled" then + telemosaic.set_state(pos, "active") + end + + elseif msg.command == "disable" then + if telemosaic.get_state(pos) == "active" then + telemosaic.set_state(pos, "disabled") + end + + elseif msg.command == "setdest" then + local dest = msg.pos or { + x = msg.x, + y = msg.y, + z = msg.z + } + if type(dest) ~= "table" then + return + end + dest.x = tonumber(dest.x) + dest.y = tonumber(dest.y) + dest.z = tonumber(dest.z) + if dest.x and dest.y and dest.z then + telemosaic.set_destination(pos, dest) + end + end +end + +telemosaic.digilines = { + receptor = {}, + effector = { + action = digiline_receive + } +} diff --git a/mods/telemosaic/digilines.md b/mods/telemosaic/digilines.md new file mode 100644 index 00000000..1b1f8022 --- /dev/null +++ b/mods/telemosaic/digilines.md @@ -0,0 +1,75 @@ +# Telemosaic digilines documentation + +An overview of all commands and functionality, with example Lua code. + +For convenience, and for using digiline buttons, all commands can also be sent as text. + +### Change the digiline channel + +**Lua:** + +```lua +digiline_send("telemosaic", {command = "setchannel", channel = "whatever"}) +``` + +**Text:** `setchannel whatever` + +### Disable a beacon + +**Lua:** + +```lua +digiline_send("telemosaic", {command = "disable"}) +``` + +**Text:** `disable` + +### Enable a beacon + +**Lua:** + +```lua +digiline_send("telemosaic", {command = "enable"}) +``` + +**Text:** `enable` + +### Set a new destination + +**Lua:** + +```lua +digiline_send("telemosaic", {command = "setdest", x = 0, y = 0, z = 0}) +``` + +or + +```lua +digiline_send("telemosaic", {command = "setdest", pos = {x = 0, y = 0, z = 0}}) +``` + +**Text:** `setdest 0,0,0` + +Note that the destination will only be set if it's valid (beacon at destination). + +### Get data from a beacon + +**Lua** + +```lua +digiline_send("telemosaic", {command = "get"}) +``` + +**Text:** `get` or `GET` + +Returns a table containing the following: + +```lua +{ + state = "active", -- or "disabled", "off", or "error" + pos = {x = 1, y = 2, z = 3}, + destination = {x = 4, y = 5, z = 6}, + origin = {x = 1, y = 2, z = 3}, -- same as 'pos' + target = {x = 4, y = 5, z = 6}, -- same as 'destination' +} +``` diff --git a/mods/telemosaic/extender.lua b/mods/telemosaic/extender.lua new file mode 100644 index 00000000..d069938d --- /dev/null +++ b/mods/telemosaic/extender.lua @@ -0,0 +1,98 @@ +local S = minetest.get_translator("telemosaic") + +local has_dye = minetest.get_modpath("dye") + +local function pretty_str(s) + s = string.upper(string.sub(s, 1, 1))..string.sub(s, 2) + local i = string.find(s, "_") + if i then + local c = string.upper(string.sub(s, i + 1, i + 1)) + s = string.gsub(s, "_.", " "..c) + end + return s +end + +local tiers = {"one", "two", "three"} + +for i, range in pairs(telemosaic.extender_ranges) do + local tier = tiers[i] + + local common_desc, basic_desc + if has_dye then + common_desc = "Telemosaic Extender, Tier @1 (@2)" + basic_desc = S(common_desc, i, S("Grey")) + else + common_desc = "Telemosaic Extender, Tier @1" + basic_desc = S(common_desc, i) + end + + minetest.register_node("telemosaic:extender_"..tier, { + description = basic_desc, + tiles = { + "telemosaic_extender_"..tier..".png" + }, + paramtype = "light", + groups = {cracky = 2, telemosaic_extender = range, ["telemosaic_extender_"..tier] = 1}, + is_ground_content = false, + after_place_node = telemosaic.extender_place, + after_dig_node = telemosaic.extender_dig, + sounds = default.node_sound_metal_defaults(), + }) + + if has_dye then + minetest.register_craft({ + type = "shapeless", + output = "telemosaic:extender_"..tier, + recipe = {"group:telemosaic_extender_"..tier, "dye:grey"}, + }) + + for name, color in pairs(telemosaic.extender_colors) do + minetest.register_node("telemosaic:extender_"..tier.."_"..name, { + description = S(common_desc, i, S(pretty_str(name))), + tiles = { + "telemosaic_extender_"..tier..".png^[colorize:"..color + }, + paramtype = "light", + groups = { + cracky = 2, not_in_creative_inventory = 1, + telemosaic_extender = range, ["telemosaic_extender_"..tier] = 1 + }, + is_ground_content = false, + after_place_node = telemosaic.extender_place, + after_dig_node = telemosaic.extender_dig, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_craft({ + type = "shapeless", + output = "telemosaic:extender_"..tier.."_"..name, + recipe = {"group:telemosaic_extender_"..tier, "dye:"..name}, + }) + end + end +end + +minetest.register_craft({ + output = "telemosaic:extender_one", + recipe = { + {"default:obsidian", "doors:door_wood", "default:obsidian"} + } +}) + +minetest.register_craft({ + output = "telemosaic:extender_two", + recipe = { + {"", "group:telemosaic_extender_one", ""}, + {"group:telemosaic_extender_one", "default:obsidian", "group:telemosaic_extender_one"}, + {"", "group:telemosaic_extender_one", ""} + } +}) + +minetest.register_craft({ + output = "telemosaic:extender_three", + recipe = { + {"", "group:telemosaic_extender_two", ""}, + {"group:telemosaic_extender_two", "default:obsidian", "group:telemosaic_extender_two"}, + {"", "group:telemosaic_extender_two", ""} + } +}) diff --git a/mods/telemosaic/functions.lua b/mods/telemosaic/functions.lua new file mode 100644 index 00000000..4a625839 --- /dev/null +++ b/mods/telemosaic/functions.lua @@ -0,0 +1,385 @@ +local S = minetest.get_translator("telemosaic") + +-- Keeps a track of players to prevent teleport spamming +local recent_teleports = {} + + +-- Not the same as `minetest.hash_node_position` and `minetest.get_position_from_hash` +local function hash_pos(pos) + return math.floor(pos.x + 0.5)..':'.. + math.floor(pos.y + 0.5)..':'.. + math.floor(pos.z + 0.5) +end + +local function unhash_pos(hash) + local list = string.split(hash, ':') + local p = { + x = tonumber(list[1]), + y = tonumber(list[2]), + z = tonumber(list[3]) + } + if p.x and p.y and p.z then + return p + end +end + + +-- Wrap this function to incorporate travel checks from another mod +function telemosaic.travel_allowed(player, src, dest) + return true +end + + +function telemosaic.is_protected_beacon(pos, player_name) + local node_name = minetest.get_node(pos).name + if node_name:match("^telemosaic:beacon_.*protected$") then + if minetest.is_protected(pos, player_name) then + return true + end + end + return false +end + +function telemosaic.get_state(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + + if not def or not def.groups then return "invalid" end + + if def.groups.telemosaic_off then return "off" end + if def.groups.telemosaic_active then return "active" end + if def.groups.telemosaic_disabled then return "disabled" end + if def.groups.telemosaic_error then return "error" end + + return "invalid" +end + +function telemosaic.set_state(pos, state) + local node = minetest.get_node(pos) + + if not string.match(node.name, "^telemosaic:beacon") then + return -- Not a telemosaic! + end + + local new_name = "telemosaic:beacon" + + if state == "off" then + new_name = new_name.."_off" + elseif state == "error" then + new_name = new_name.."_err" + elseif state == "disabled" then + new_name = new_name.."_disabled" + elseif state ~= "active" then + return -- Can't set a state that doesn't exist + end + + if string.match(node.name, "protected$") then + new_name = new_name.."_protected" + end + + -- Swap node instead of set node to keep the metadata + minetest.swap_node(pos, {name = new_name}) +end + +function telemosaic.is_valid_destination(pos) + local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_top = {x = pos.x, y = pos.y + 2, z = pos.z} + + local node = minetest.get_node_or_nil(pos) + local node_above = minetest.get_node_or_nil(pos_above) + local node_top = minetest.get_node_or_nil(pos_top) + + if not node or not node_above or not node_top then + -- Need to load the map + minetest.get_voxel_manip():read_from_map(pos, pos_top) + node = node or minetest.get_node(pos) + node_above = node_above or minetest.get_node(pos_above) + node_top = node_top or minetest.get_node(pos_top) + end + + local valid = true + + -- Check if there is a telemosaic at the destination + if not string.match(node.name, "^telemosaic:beacon") then + valid = false + end + + -- Check if the nodes above are not walkable (yes, confusing naming) + if node_above.name ~= "air" and node_above.name ~= "vacuum:vacuum" then + local def = minetest.registered_nodes[node_above.name] + if def and def.walkable then + return valid, false + end + end + if node_top.name ~= "air" and node_top.name ~= "vacuum:vacuum" then + local def = minetest.registered_nodes[node_top.name] + if def and def.walkable then + return valid, false + end + end + + return valid, true +end + +function telemosaic.check_beacon(pos, player_name, all_checks) + local meta = minetest.get_meta(pos) + + local dest = unhash_pos(meta:get_string("telemosaic:dest")) + local state = telemosaic.get_state(pos) + if not dest or state == "invalid" then + return false + end + + local dist = vector.distance(pos, dest) + local range = telemosaic.beacon_range + + local pos1 = {x = pos.x - 3, y = pos.y - 1, z = pos.z - 3} + local pos2 = {x = pos.x + 3, y = pos.y, z = pos.z + 3} + local _, nodes = minetest.find_nodes_in_area(pos1, pos2, "group:telemosaic_extender") + + for node_name, num in pairs(nodes) do + range = range + (minetest.get_item_group(node_name, "telemosaic_extender") * num) + end + + if dist > range then + -- Destination out of range, set beacon to error state + telemosaic.set_state(pos, "error") + if player_name then + local needed = math.ceil(dist - range) + minetest.chat_send_player(player_name, + S("You need to add extenders for @1 node(s).", needed) + ) + end + return false + elseif state == "error" or state == "off" then + -- Not out of range anymore, set to active + telemosaic.set_state(pos, "active") + end + + if not all_checks then + return true -- Skip the destination check + end + + if player_name then + if telemosaic.is_protected_beacon(dest, player_name) then + minetest.chat_send_player(player_name, + S("Destination is protected.") + ) + return false + end + end + + local valid, open = telemosaic.is_valid_destination(dest) + if not valid then + if player_name then + minetest.chat_send_player(player_name, + S("No telemosaic at destination.") + ) + end + return false + elseif not open then + if player_name then + minetest.chat_send_player(player_name, + S("Destination is blocked.") + ) + end + return false + end + + return true +end + +function telemosaic.get_destination(pos) + local dest_hash = minetest.get_meta(pos):get_string("telemosaic:dest") + return unhash_pos(dest_hash) +end + +function telemosaic.set_destination(pos, dest) + local dest_hash = hash_pos(dest) + local src_hash = hash_pos(pos) + if src_hash == dest_hash or not telemosaic.is_valid_destination(dest) then + return -- Don't allow setting invalid destination + end + minetest.get_meta(pos):set_string("telemosaic:dest", dest_hash) + telemosaic.check_beacon(pos) +end + +function telemosaic.teleport(player, src, dest) + local player_name = player:get_player_name() + + -- Prevent teleport spamming + recent_teleports[player_name] = true + minetest.after(telemosaic.teleport_delay, + function(name) + recent_teleports[name] = nil + end, + player_name + ) + + if telemosaic.digilines then + -- Send a digiline message about the teleport + local channel = minetest.get_meta(src):get("channel") or telemosaic.default_channel + digilines.receptor_send(src, digilines.rules.default, channel, { + player = player_name, + origin = src, + target = dest, + pos = src, + destination = dest, + }) + end + + dest.y = dest.y + 0.5 -- Teleport the player to above the telemosaic + player:set_pos(dest) + + minetest.sound_play({name = "telemosaic_departure", gain = 1}, {pos = src, max_hear_distance = 30}) + minetest.sound_play({name = "telemosaic_arrival", gain = 1}, {pos = dest, max_hear_distance = 30}) + + minetest.add_particlespawner({ + amount = 100, + time = 0.25, + minpos = {x = src.x, y = src.y + 0.3, z = src.z}, + maxpos = {x = src.x, y = src.y + 2, z = src.z}, + minvel = {x = 1, y = -6, z = 1}, + maxvel = {x = -1, y = -1, z = -1}, + minacc = {x = 0, y = -2, z = 0}, + maxacc = {x = 0, y = -6, z = 0}, + minexptime = 0.1, + minsize = 0.5, + maxsize = 1.5, + texture = "telemosaic_particle_departure.png", + glow = 15, + }) + minetest.add_particlespawner({ + amount = 100, + time = 0.25, + minpos = {x = dest.x, y = dest.y + 0.3, z = dest.z}, + maxpos = {x = dest.x, y = dest.y + 2, z = dest.z}, + minvel = {x = -1, y = 1, z = -1}, + maxvel = {x = 1, y = 6, z = 1}, + minacc = {x = 0, y = -2, z = 0}, + maxacc = {x = 0, y = -6, z = 0}, + minexptime = 0.1, + minsize = 0.5, + maxsize = 1.5, + texture = "telemosaic_particle_arrival.png", + glow = 15, + }) +end + +function telemosaic.rightclick(pos, node, player, itemstack, pointed_thing) + if not itemstack or player.is_fake_player or not minetest.is_player(player) then + return itemstack -- No fake players! + end + + local item = itemstack:get_name() + local player_name = player:get_player_name() + local state = telemosaic.get_state(pos) + + if item == "default:mese_crystal_fragment" then + -- Try to create a telemosaic key + if itemstack:get_count() ~= 1 then + minetest.chat_send_player(player_name, + S("You can only use a singular mese crystal fragment to create a telemosaic key.") + ) + else + minetest.log("action", "[telemosaic] " .. player_name .. + " created a key for the telemosaic at " + .. minetest.pos_to_string(pos)) + return ItemStack({name = "telemosaic:key", metadata = hash_pos(pos)}) + end + + elseif item == "telemosaic:key" then + -- Try to set a new destination + local dest_hash = itemstack:get_meta():get_string("") + local src_hash = hash_pos(pos) + if dest_hash ~= src_hash and not minetest.is_protected(pos, player_name) then + local dest = unhash_pos(dest_hash) + if not dest then + -- This should never happen, but tell the player if it does + minetest.chat_send_player(player_name, + S("Telemosaic key is invalid.") + ) + elseif not telemosaic.is_valid_destination(dest) then + -- No point setting a destination that doesn't exist + minetest.chat_send_player(player_name, + S("No telemosaic at new destination.") + ) + else + -- Everything is good, set the destination and update the telemosaic + minetest.get_meta(pos):set_string("telemosaic:dest", dest_hash) + telemosaic.check_beacon(pos, player_name) + minetest.log("action", "[telemosaic] " .. player_name .. " set the destination pos of the telemosaic at " + .. minetest.pos_to_string(pos) .. " to " .. minetest.pos_to_string(dest)) + end + if player:get_player_control().sneak then + return itemstack -- Don't destroy key + end + return ItemStack("default:mese_crystal_fragment") + end + + elseif state == "off" or player:get_player_control().sneak then + -- Allow player to build on telemosaic + local def = minetest.registered_nodes[item] + if def and def.on_place and pointed_thing and not vector.equals(pos, pointed_thing.above) then + -- Need to create a fake pointed_thing to prevent recursion + local new_pointed_thing = { + type = "node", + under = vector.new(pointed_thing.above), + above = vector.new(pointed_thing.above) + } + return def.on_place(itemstack, player, new_pointed_thing) + end + + elseif state == "active" and not telemosaic.is_protected_beacon(pos, player_name) then + if recent_teleports[player_name] then + return itemstack -- Prevent teleport spamming, fail silently + end + local meta = minetest.get_meta(pos) + local dest = unhash_pos(meta:get_string("telemosaic:dest")) + if telemosaic.check_beacon(pos, player_name, true) then + if telemosaic.travel_allowed(player, pos, dest) then + -- Teleport the player! + minetest.log("action", "[telemosaic] teleporting " .. player_name .. " from " + .. minetest.pos_to_string(pos) .. " to " .. minetest.pos_to_string(dest)) + telemosaic.teleport(player, pos, dest) + else + minetest.chat_send_player(player_name, + S("Travel to destination is not allowed.") + ) + end + end + + elseif state == "disabled" then + -- Tell the player why they can't use this telemosaic + minetest.chat_send_player(player_name, + S("Telemosaic is disabled.") + ) + + elseif state == "error" then + -- Check why the beacon is in error state, and tell the player + telemosaic.check_beacon(pos, player_name) + end + return itemstack +end + +function telemosaic.extender_place(pos, player, itemstack, pointed_thing) + local pos1 = {x = pos.x - 3, y = pos.y, z = pos.z - 3} + local pos2 = {x = pos.x + 3, y = pos.y + 1, z = pos.z + 3} + local nodes = minetest.find_nodes_in_area(pos1, pos2, "group:telemosaic_error") + + for _, node_pos in pairs(nodes) do + -- Update telemosaic, and tell them if they need more extenders + telemosaic.check_beacon(node_pos, player:get_player_name()) + end +end + +function telemosaic.extender_dig(pos, oldnode, oldmetadata, player) + local pos1 = {x = pos.x - 3, y = pos.y, z = pos.z - 3} + local pos2 = {x = pos.x + 3, y = pos.y + 1, z = pos.z + 3} + local nodes = minetest.find_nodes_in_area(pos1, pos2, {"group:telemosaic_active", "group:telemosaic_disabled"}) + + for _, node_pos in pairs(nodes) do + -- Update the telemosaic, but don't tell the player anything, they are probably removing it anyway + telemosaic.check_beacon(node_pos) + end +end diff --git a/mods/telemosaic/init.lua b/mods/telemosaic/init.lua new file mode 100644 index 00000000..ac5932c7 --- /dev/null +++ b/mods/telemosaic/init.lua @@ -0,0 +1,49 @@ +--[[ + +Telemosaic [telemosaic] +======================= + +A mod which provides player-placed teleport pads + +Copyright (C) 2015 Ben Deutsch + +]] + +telemosaic = { + teleport_delay = tonumber(minetest.settings:get("telemosaic_teleport_delay")) or 1.0, + beacon_range = tonumber(minetest.settings:get("telemosaic_beacon_range")) or 20.0, + default_channel = minetest.settings:get("telemosaic_default_channel") or "telemosaic", + extender_ranges = { + tonumber(minetest.settings:get("telemosaic_extender_one_range")) or 5.0, + tonumber(minetest.settings:get("telemosaic_extender_two_range")) or 20.0, + tonumber(minetest.settings:get("telemosaic_extender_three_range")) or 80.0, + }, + extender_colors = { + white = "#ffffffa0", + dark_grey = "#00000090", + black = "#000000e0", + violet = "#400080b0", + blue = "#0000ffb0", + cyan = "#00ffffb0", + dark_green = "#007000b0", + green = "#00ff00b0", + yellow = "#ffff00b0", + brown = "#402000c0", + orange = "#ff8000b0", + red = "#ff0000b0", + magenta = "#ff00ffb0", + pink = "#ff8080b0", + }, +} + +local MP = minetest.get_modpath("telemosaic") + +if minetest.get_modpath("digilines") then + dofile(MP.."/digilines.lua") +end + +dofile(MP.."/functions.lua") +dofile(MP.."/beacon.lua") +dofile(MP.."/extender.lua") +dofile(MP.."/key.lua") +dofile(MP.."/abm.lua") diff --git a/mods/telemosaic/key.lua b/mods/telemosaic/key.lua new file mode 100644 index 00000000..175b9fb8 --- /dev/null +++ b/mods/telemosaic/key.lua @@ -0,0 +1,38 @@ +local S = minetest.get_translator("telemosaic") + +minetest.register_tool("telemosaic:key", { + description = S("Telemosaic Key"), + inventory_image = "telemosaic_key.png", + stack_max = 1, + groups = {not_in_creative_inventory = 1}, + on_use = function(itemstack, player, pointed_thing) + if pointed_thing.type == "node" then + -- Use key to toggle telemosaic on/off + local name = player:get_player_name() + local pos = pointed_thing.under + local state = telemosaic.get_state(pos) + if state == "active" and not minetest.is_protected(pos, name) then + telemosaic.set_state(pos, "disabled") + elseif state == "disabled" and not minetest.is_protected(pos, name) then + telemosaic.set_state(pos, "active") + end + end + return itemstack + end, + on_place = function(itemstack, player, pointed_thing) + -- Call on_rightclick, even if sneak is pressed + if pointed_thing.type == "node" and player then + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, player, itemstack, pointed_thing) or itemstack + end + end + end, +}) + +minetest.register_craft({ + type = "shapeless", + recipe = {"telemosaic:key"}, + output = "default:mese_crystal_fragment" +}) diff --git a/mods/telemosaic/locale/telemosaic.de.tr b/mods/telemosaic/locale/telemosaic.de.tr new file mode 100644 index 00000000..f5ae79ba --- /dev/null +++ b/mods/telemosaic/locale/telemosaic.de.tr @@ -0,0 +1,44 @@ +# textdomain: telemosaic +##[ beacon.lua ]## +Protected Telemosaic Beacon=Geschütztes Telemosaik-Leuchtfeuer +Telemosaic Beacon=Telemosaik-Leuchtfeuer +Telemosaic Beacon Active (you hacker you!)=Telemosaik-Leuchtfeuer aktiv (du Hacker du!) +Protected Telemosaic Beacon Active (you hacker you!)=Geschütztes Telemosaik-Leuchtfeuer aktiv (du Hacker du!) +Telemosaic Beacon Error (you hacker you!)=Telemosaik-Leuchtfeuer fehlerhaft (du Hacker du!) +Protected Telemosaic Beacon Error (you hacker you!)=Geschütztes Telemosaik-Leuchtfeuer fehlerhaft (du Hacker du!) +Telemosaic Beacon Disabled (you hacker you!)=Telemosaik-Leuchtfeuer deaktiviert (du Hacker du!) +Protected Telemosaic Beacon Disabled (you hacker you!)=Geschütztes Telemosaik-Leuchtfeuer deaktiviert (du Hacker du!) + +##[ extender.lua ]## +Telemosaic Extender, Tier @1 (@2)=Telemosaik-Verstärker Stufe @1 (@2) +Telemosaic Extender, Tier @1=Telemosaik-Verstärker Stufe @1 +# Aus MTG Wolle +Grey=Grau +White=Weiß +Dark Grey=Dunkelgrau +Black=Schwarz +Violet=Violett +Blue=Blau +Cyan=Türkis +Dark Green=Dunkelgrün +Green=Grün +Yellow=Gelb +Brown=Braun +Orange=Orange +Red=Rot +Magenta=Magenta +Pink=Rosa + +##[ functions.lua ]## +You need to add extenders for @1 node(s).=Sie müssen Verstärker für @1 Node(n) hinzufügen. +Destination is protected.=Zielort ist geschützt. +No telemosaic at destination.=Kein Telemosaik am Zielort. +Destination is blocked.=Zielort ist blockiert. +You can only use a singular mese crystal fragment to create a telemosaic key.=Sie können nur ein einzelnes Mesekristallfragment verwenden, um einen Telemosaik-Schlüssel zu erstellen. +Telemosaic key is invalid.=Telemosaik-Schlüssel ist ungültig. +No telemosaic at new destination.=Kein Telemosaik am neuen Zielort. +Travel to destination is not allowed.=Reisen zum Zielort ist nicht erlaubt. +Telemosaic is disabled.=Telemosaik ist deaktiviert. + +##[ key.lua ]## +Telemosaic Key=Telemosaik-Schlüssel diff --git a/mods/telemosaic/locale/template.txt b/mods/telemosaic/locale/template.txt new file mode 100644 index 00000000..aa65ed3f --- /dev/null +++ b/mods/telemosaic/locale/template.txt @@ -0,0 +1,44 @@ +# textdomain: telemosaic +##[ beacon.lua ]## +Protected Telemosaic Beacon= +Telemosaic Beacon= +Telemosaic Beacon Active (you hacker you!)= +Protected Telemosaic Beacon Active (you hacker you!)= +Telemosaic Beacon Error (you hacker you!)= +Protected Telemosaic Beacon Error (you hacker you!)= +Telemosaic Beacon Disabled (you hacker you!)= +Protected Telemosaic Beacon Disabled (you hacker you!)= + +##[ extender.lua ]## +Telemosaic Extender, Tier @1 (@2)= +Telemosaic Extender, Tier @1= +Grey= +# from MTG wool +White= +Dark Grey= +Black= +Violet= +Blue= +Cyan= +Dark Green= +Green= +Yellow= +Brown= +Orange= +Red= +Magenta= +Pink= + +##[ functions.lua ]## +You need to add extenders for @1 node(s).= +Destination is protected.= +No telemosaic at destination.= +Destination is blocked.= +You can only use a singular mese crystal fragment to create a telemosaic key.= +Telemosaic key is invalid.= +No telemosaic at new destination.= +Travel to destination is not allowed.= +Telemosaic is disabled.= + +##[ key.lua ]## +Telemosaic Key= diff --git a/mods/telemosaic/mod.conf b/mods/telemosaic/mod.conf new file mode 100644 index 00000000..64739fcc --- /dev/null +++ b/mods/telemosaic/mod.conf @@ -0,0 +1,4 @@ +name = telemosaic +description = A Minetest mod for user-generated teleportation pads. +depends = default, doors +optional_depends = dye, digilines diff --git a/mods/telemosaic/settingtypes.txt b/mods/telemosaic/settingtypes.txt new file mode 100644 index 00000000..2a4ee915 --- /dev/null +++ b/mods/telemosaic/settingtypes.txt @@ -0,0 +1,17 @@ +#The base range of the teleport beacon +telemosaic_beacon_range (Beacon range) int 20 + +#The extending range of the tier 1 extender +telemosaic_extender_one_range (Extender tier 1 range) int 5 + +#The extending range of the tier 2 extender +telemosaic_extender_two_range (Extender tier 2 range) int 20 + +#The extending range of the tier 3 extender +telemosaic_extender_three_range (Extender tier 2 range) int 80 + +#The minimum delay between player teleports +telemosaic_teleport_delay (Teleport delay) float 1.0 + +# The default digilines channel for beacons +telemosaic_default_channel (Default channel) string telemosaic diff --git a/mods/telemosaic/sounds/telemosaic_arrival.ogg b/mods/telemosaic/sounds/telemosaic_arrival.ogg new file mode 100644 index 00000000..b8752e88 Binary files /dev/null and b/mods/telemosaic/sounds/telemosaic_arrival.ogg differ diff --git a/mods/telemosaic/sounds/telemosaic_departure.ogg b/mods/telemosaic/sounds/telemosaic_departure.ogg new file mode 100644 index 00000000..9b37efc1 Binary files /dev/null and b/mods/telemosaic/sounds/telemosaic_departure.ogg differ diff --git a/mods/telemosaic/textures/telemosaic_beacon_disabled.png b/mods/telemosaic/textures/telemosaic_beacon_disabled.png new file mode 100644 index 00000000..e14a53f4 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_beacon_disabled.png differ diff --git a/mods/telemosaic/textures/telemosaic_beacon_err.png b/mods/telemosaic/textures/telemosaic_beacon_err.png new file mode 100644 index 00000000..3267a480 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_beacon_err.png differ diff --git a/mods/telemosaic/textures/telemosaic_beacon_off.png b/mods/telemosaic/textures/telemosaic_beacon_off.png new file mode 100644 index 00000000..2cc56ed1 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_beacon_off.png differ diff --git a/mods/telemosaic/textures/telemosaic_beacon_protected_overlay.png b/mods/telemosaic/textures/telemosaic_beacon_protected_overlay.png new file mode 100644 index 00000000..649ea267 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_beacon_protected_overlay.png differ diff --git a/mods/telemosaic/textures/telemosaic_beacon_side.png b/mods/telemosaic/textures/telemosaic_beacon_side.png new file mode 100644 index 00000000..634f4d53 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_beacon_side.png differ diff --git a/mods/telemosaic/textures/telemosaic_beacon_top.png b/mods/telemosaic/textures/telemosaic_beacon_top.png new file mode 100644 index 00000000..e2e00a46 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_beacon_top.png differ diff --git a/mods/telemosaic/textures/telemosaic_extender_one.png b/mods/telemosaic/textures/telemosaic_extender_one.png new file mode 100644 index 00000000..b2872454 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_extender_one.png differ diff --git a/mods/telemosaic/textures/telemosaic_extender_three.png b/mods/telemosaic/textures/telemosaic_extender_three.png new file mode 100644 index 00000000..b677dfd3 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_extender_three.png differ diff --git a/mods/telemosaic/textures/telemosaic_extender_two.png b/mods/telemosaic/textures/telemosaic_extender_two.png new file mode 100644 index 00000000..d2c9112d Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_extender_two.png differ diff --git a/mods/telemosaic/textures/telemosaic_key.png b/mods/telemosaic/textures/telemosaic_key.png new file mode 100644 index 00000000..2e93674a Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_key.png differ diff --git a/mods/telemosaic/textures/telemosaic_particle_arrival.png b/mods/telemosaic/textures/telemosaic_particle_arrival.png new file mode 100644 index 00000000..1e041d49 Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_particle_arrival.png differ diff --git a/mods/telemosaic/textures/telemosaic_particle_departure.png b/mods/telemosaic/textures/telemosaic_particle_departure.png new file mode 100644 index 00000000..b2db1c1c Binary files /dev/null and b/mods/telemosaic/textures/telemosaic_particle_departure.png differ diff --git a/mods/too_many_stones/1.0.0_Mapgen.png b/mods/too_many_stones/1.0.0_Mapgen.png new file mode 100644 index 00000000..210a34fc Binary files /dev/null and b/mods/too_many_stones/1.0.0_Mapgen.png differ diff --git a/mods/too_many_stones/LICENSE.txt b/mods/too_many_stones/LICENSE.txt new file mode 100644 index 00000000..e57fef08 --- /dev/null +++ b/mods/too_many_stones/LICENSE.txt @@ -0,0 +1,96 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + + +License of wall code +-------------------- + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + + + +License of textures +------------------- + +MIT License + +Copyright (c) 2022 JoeEnderman + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +License of geode generation +--------------------------- + +(C) AwesomeDragon97 + +LGPL-3.0 + + +License of geodes_lib geode generation and nodes_crystal functionality +---------------------------------------------------------------------- + +(C) alerikaisattera + +LGPL-3.0 + + +License of all node sounds +-------------------------- + +(C) OpenGameArt.Org + +CC0 + +(C) freesound.org + +CC0 + +(C) JoeEnderman + +CC0 + +All sounds from Minetest Game: + +(C) various minetest contributors + +(CC BY-SA 3.0) + +CC0 + +License of humidity and neat based stone placement code +------------------------------------------------------- + +(C) EmptyStar + +LGPL 2.1 only diff --git a/mods/too_many_stones/README.md b/mods/too_many_stones/README.md new file mode 100644 index 00000000..4654e821 --- /dev/null +++ b/mods/too_many_stones/README.md @@ -0,0 +1,100 @@ +# Too Many Stones + +A Minetest mod that adds as many stones as I can make good textures for. TMS has support for nearly all Minetest subgames including Fogblox, Hades Revisited, Nodecore, and Mineclone2. It currently features 88 stone types (7 of which glow), cobble for most of them, and bricks, cracked bricks, and blocks for all stone types. There are optional features that each require different mods to add: Stairs and Slabs require stairs, Walls require walls, and geodes require either geode mod. More stones may be added, and you can put a feature request on ContentDB or the repo for new ones. I will prioritize stones that are unique. Japanese, Spanish, Portuguese, German, French and Russian translations by me and ChatGPT. So, sorry for bad grammar in advance. + +## Done: +##### Blue Agate-(blue and white) +##### Gray Agate-(light gray and white) +##### Green Agate-(light green) +##### Moss Agate-(olive and white) +##### Orange Agate-(orange and white) +##### Purple Agate-(indigo and lavender) +##### Red Agate-(red and white) +##### Amazonite-(light green) +##### Amber-(dark orange) +##### Amethyst-(dark purple) +##### Ammolite-(rainbow) +##### Andesite-(dark gray) +##### Black Moonstone-(black) +##### Black Opal-(black to green) +##### Basalt-(dark greenish grey) +##### Columnar Basalt-(reddish light gray) +##### Grey Calcite-(light grey) +##### Calcite-(light grey) +##### Orange Calcite-(orange) +##### Carnotite-(mustard yellow) +##### Celestine-(sky blue) +##### Chalcanthite-(neon blue) +##### Chrysoprase-(apple green) +##### Citrine-(dark yellow) +##### Covellite-(dark cobalt blue) +##### Crocoite-(bright orange) +##### Diorite-(white) +##### Erythrite-(dark purpley red) +##### Eudialite-(dark red) +##### Fluorite-(blueish lavender) +##### Fire Opal-(orange) +##### Gabbro-(dark grey) +##### Galena-(silver) +##### Glow Apatite-(light purple) +##### Glow Calcite-(red) +##### Glow Esperite-(yellow) +##### Glow Fluorite-(indigo) +##### Glow Selenite-(light blue) +##### Glow Sodalite-(orange) +##### Glow Willemite-(lime green) +##### Black Granite-(black) +##### Blue Granite-(bright blue) +##### Gray Granite-(light gray) +##### Green Granite-(green) +##### Pink Granite-(pale pink) +##### Red Granite-(red) +##### White Granite-(white) +##### Yellow Granite-(dark yellow) +##### Heliodor-(yellow) +##### Howlite-(white) +##### Ilvaite-(black) +##### Jade-(dark green) was Greenstone +##### Red Jasper-(red) +##### Kyanite-(light blue) +##### Lapis Lazuli-(blue with gold streaks) +##### Lepidolite-(pink) +##### Blue Limestone-(blue grey) +##### White Limestone-(yellow grey) +##### Marble-(white) +##### Moonstone-(sky blue) +##### Morion Quartz-(black) +##### Mudstone-(brown) +##### Picture Jasper-(tan) +##### Prasiolite-(glass bottle green) +##### Opal-(white to blue) +##### Pumice-(grey) +##### Pyrite-(bright yellow) +##### Quartz-(white) +##### Rhodonite-(hot pink) +##### Rose Quartz-(pink) +##### Scoria-(red) +##### Serpentine-(dark green) +##### Shale-(dark greenish grey) +##### Slate-(dark grey) +##### Smokey Quartz-(dark tan) +##### Soapstone-(black with white streaks) +##### Sodalite-(dark blue) was Bluestone +##### Sugilite-(purple) +##### Green Tourmaline-(green) +##### Paraiba Tourmaline-(pale turquoise) +##### Pink Tourmaline-(dark pink) +##### Travertine-(light tan) +##### Yellow Travertine-(yellow) +##### Beige Tuff-(beige) +##### Grey Tuff-(dirty gray) +##### Red Tuff-(orange) +##### Turquoise-(light blue) +##### Vivianite-(dark green) + +## To Do: +##### Find and add ore mods to optional depends + +# Credits: +# +##### Based on code from Minetest game, all walls mod, and geodes mod. Textures created by JoeEnderman with Stable Diffusion (rough versions), Krita (Agates and other complicated textures), Gimp (cleaning up from the others), Planet Minecraft (block and brick variants), Blockbench (cobblestones, granites, and cracked bricks), Libresprite is now my main tool. From V0.2.2+: Many textures have been cleaned up or made using Libresprite. Code rebase with help from Mineclone2 and Minebase. All node sounds are CC0 except where they are from minetest game in which case they are (CC BY-SA 3.0). The ones not from MTG (break glass 1 and 2), (all break node hard), (all dig cracky), (glass footstep 1-3), (hard_footstep 1-3), (place node hard3) are sourced from opengameart.org, freesound.org, and myself. Some are a combination of both. Jasper Boerstra is the biggest influence on my texture style, and I hope it shows. I love what he did for most Minecraft textures. AwesomeDragon97 gave me the idea to use mapgen_stone instead of each game's individual stone types. Thank you to EmptyStar for continuing to support TMS and help me with development. And thanks to backdaniel for help with translations and bugfixing. diff --git a/mods/too_many_stones/V1.1.0 b/mods/too_many_stones/V1.1.0 new file mode 100644 index 00000000..d16fcd7b --- /dev/null +++ b/mods/too_many_stones/V1.1.0 @@ -0,0 +1 @@ +Mod version will be the name of this document. diff --git a/mods/too_many_stones/changelog.txt b/mods/too_many_stones/changelog.txt new file mode 100644 index 00000000..50b77bd8 --- /dev/null +++ b/mods/too_many_stones/changelog.txt @@ -0,0 +1,165 @@ +No changes available for versions before v0.2.0 Beta + +V0.2.0 +Added Pink Granite +Added White Granite +Added Gray Granite +Added Black Granite +Fixed the internal names of Sodalite and Jade +Changed all cracked bricks to be unique +Added several new geodes if you have it installed +Added Amber +Added Amethyst +Added Citrine +Added Crocoite +Added Eudialite +Added Gabbro +Added Mudstone +Added Opal +Added Pyrite +Added Serpentine +Added Smokey Quartz +Added Travertine +Added Vivianite +Made the translation template easier to read + +V0.2.1 +Added Glow Apatite +Added Glow Calcite +Added Glow Esperite +Added Glow Fluorite +Added Glow Selenite +Added Glow Sodalite +Added Glow Willemite +Added Geodes Library comapatibility +Added Heliodor +Added Black Opal + +V0.2.2 +Added Celestine +Added Crysoprase +Added Covellite +Added Erythrite +Added Galena +Added Howlite +Adjusted Some cobblestone colors to match their stone types better +Added Lapis Lazuli +Change the crack pattern on several stones +Added Soapstone +Added Pumice + +V0.2.3 +Added Budding crystals +Added Crystal items and crystal blocks +Improve Geodes +Redo some textures + +V0.2.4 +Added Prasiolite +Added Quartz + +V0.3.0 +Default is now optional +Stair and Slab names can now be translated into other languages +Hades Revisted is now a mapgen supported game and can spawn Geodes with geodes_lib only +Turquoise ore no longer uses default textures from MTG, TMS supplies them +TMS now uses its own sound library +Crystals and polished Crystals now make crystalline sounds +French now supported by TMS + +V0.3.1 +Cave Game is now supported with mapgen and optional geodes +Fogblox is now supported with mapgen and optional geodes +Minebase is now supported with mapgen and optional geodes +Nodecore is now supported with mapgen and optional geodes +Fixed the no sound bug from 0.3.0 by registering sounds for nodes that don't exist and including sound files for them + +V0.3.2 +Added Blue Agate +Added Gray Agate +Added Green Agate +Added Moss Agate +Added Orange Agate +Added Purple Agate +Added Red Agate +Added Basalt +Added Columnar Basalt +Added more geodes (mostly agate) and removed slate as a geode shell for realism +Each Geode mod now supplies a vastly different experience, geodes does not supply budding blocks, but has full agate geodes, geodes_lib supplies geodes in every game I made mapgen for and has budding blocks + +V0.3.3 +Fixed a bug where several stones still required default for no reason +All games that use mapgen_stone are now supported: i.e. Anything that actually has mapgen and not a premade map or otherwise has no terrain +Removed several uneeded files + +V0.3.4 +Added Fire Opal +Redo Black Opal, remove its transparency as it was ugly +Crystals now pop off of broken blocks +Add Covellite Cobblestone +Add Andesite +Add Beige tuff +Add Grey Tuff +Add Red Tuff +Add Howlite Cobble +Add Glass Batch +Redo Mapgen to spread stones better +Add Slate Tiles + +V0.3.5 +Added Black Moonstone +Added Fluorite +Added Yellow Granite +Added Morion Quartz +Added Yellow Travertine + +V0.3.6 +Fixed Travertine bug +Added Howlite Cobblestone + +V0.3.7 +Added Ammolite + +V0.3.8 +Added Diorite +Added Picture Jasper +Added Basalt Tile + +V0.3.9 +Added Shale +Fix Yellow Travertine not tiling + +V0.4.0 +Updated Textures to take less space without affecting looks +Changed Turquoise ore to be my own MIT texture instead of the default ore overlay +Updated some old cobblestones to match my current skill level +Updated all translations to finally include all blocks and items +Added Spanish Translation +Fixed a bug where all granite cobblestones were caleed dark grey interally +Added German Translation + +V0.4.1/0.9.0 +Added Portuguese Translation +Added Japanese Translation +Fixed a bug where Turquoise ore was considered a normal useable stone block +Fixed Turquoise drop rate not being random +Fix stray pixel on travertine brick +Fixed Schlammstein accidentally being called Schluffstein +Removed Crystal shards as they were simply placeholders for the normal crystals +Fixed TMS stones being persistent in instances they should not: i.e. not being carved out by mods which add their own cave gen +Minor bugfixes and code cleaning + +V0.4.2/1.0.0 +Added Grey Calcite +Added Orange Calcite +Added Chalcanthite +Added Red Jasper +Added Lepidolite +Added Moonstone +Added Rhodonite +Added Green Tourmaline +Added Paraiba Tourmaline +Added Pink Tourmaline +Minor bugfixing +Fixed Carnotite Textures to match my newer quality +A few texture updates, mainly cracked bricks diff --git a/mods/too_many_stones/crafting.lua b/mods/too_many_stones/crafting.lua new file mode 100644 index 00000000..d27a0467 --- /dev/null +++ b/mods/too_many_stones/crafting.lua @@ -0,0 +1,2695 @@ +-- mods/too_many_stones/crafting.lua + +--[[ +-- Placeholder Crystal Crafts +minetest.register_craft({ + output = "too_many_stones:placeholder", + recipe = { + {"too_many_stones:placeholder_crystal", "too_many_stones:placeholder_crystal", "too_many_stones:placeholder_crystal"}, + {"too_many_stones:placeholder_crystal", "too_many_stones:placeholder_crystal", "too_many_stones:placeholder_crystal"}, + {"too_many_stones:placeholder_crystal", "too_many_stones:placeholder_crystal", "too_many_stones:placeholder_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:placeholder_brick 4", + recipe = { + {"too_many_stones:placeholder", "too_many_stones:placeholder"}, + {"too_many_stones:placeholder", "too_many_stones:placeholder"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:placeholder_block 9", + recipe = { + {"too_many_stones:placeholder", "too_many_stones:placeholder", "too_many_stones:placeholder"}, + {"too_many_stones:placeholder", "too_many_stones:placeholder", "too_many_stones:placeholder"}, + {"too_many_stones:placeholder", "too_many_stones:placeholder", "too_many_stones:placeholder"}, + } +}) +]] + +--[[ +-- Placeholder Stone Crafts +minetest.register_craft({ + output = "too_many_stones:placeholder_brick 4", + recipe = { + {"too_many_stones:placeholder", "too_many_stones:placeholder"}, + {"too_many_stones:placeholder", "too_many_stones:placeholder"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:placeholder_block 9", + recipe = { + {"too_many_stones:placeholder", "too_many_stones:placeholder", "too_many_stones:placeholder"}, + {"too_many_stones:placeholder", "too_many_stones:placeholder", "too_many_stones:placeholder"}, + {"too_many_stones:placeholder", "too_many_stones:placeholder", "too_many_stones:placeholder"}, + } +}) +]] + +-- Amazonite +minetest.register_craft({ + output = "too_many_stones:amazonite", + recipe = { + {"too_many_stones:amazonite_crystal", "too_many_stones:amazonite_crystal", "too_many_stones:amazonite_crystal"}, + {"too_many_stones:amazonite_crystal", "too_many_stones:amazonite_crystal", "too_many_stones:amazonite_crystal"}, + {"too_many_stones:amazonite_crystal", "too_many_stones:amazonite_crystal", "too_many_stones:amazonite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:amazonite_brick 4", + recipe = { + {"too_many_stones:amazonite", "too_many_stones:amazonite"}, + {"too_many_stones:amazonite", "too_many_stones:amazonite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:amazonite_block 9", + recipe = { + {"too_many_stones:amazonite", "too_many_stones:amazonite", "too_many_stones:amazonite"}, + {"too_many_stones:amazonite", "too_many_stones:amazonite", "too_many_stones:amazonite"}, + {"too_many_stones:amazonite", "too_many_stones:amazonite", "too_many_stones:amazonite"}, + } +}) +-- Amber +minetest.register_craft({ + output = "too_many_stones:amber", + recipe = { + {"too_many_stones:amber_crystal", "too_many_stones:amber_crystal", "too_many_stones:amber_crystal"}, + {"too_many_stones:amber_crystal", "too_many_stones:amber_crystal", "too_many_stones:amber_crystal"}, + {"too_many_stones:amber_crystal", "too_many_stones:amber_crystal", "too_many_stones:amber_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:amber_brick 4", + recipe = { + {"too_many_stones:amber", "too_many_stones:amber"}, + {"too_many_stones:amber", "too_many_stones:amber"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:amber_block 9", + recipe = { + {"too_many_stones:amber", "too_many_stones:amber", "too_many_stones:amber"}, + {"too_many_stones:amber", "too_many_stones:amber", "too_many_stones:amber"}, + {"too_many_stones:amber", "too_many_stones:amber", "too_many_stones:amber"}, + } +}) +-- Amethyst + +minetest.register_craft({ + output = "too_many_stones:amethyst", + recipe = { + {"too_many_stones:amethyst_crystal", "too_many_stones:amethyst_crystal", "too_many_stones:amethyst_crystal"}, + {"too_many_stones:amethyst_crystal", "too_many_stones:amethyst_crystal", "too_many_stones:amethyst_crystal"}, + {"too_many_stones:amethyst_crystal", "too_many_stones:amethyst_crystal", "too_many_stones:amethyst_crystal"}, + } +}) + + +minetest.register_craft({ + output = "too_many_stones:amethyst_brick 4", + recipe = { + {"too_many_stones:amethyst", "too_many_stones:amethyst"}, + {"too_many_stones:amethyst", "too_many_stones:amethyst"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:amethyst_block 9", + recipe = { + {"too_many_stones:amethyst", "too_many_stones:amethyst", "too_many_stones:amethyst"}, + {"too_many_stones:amethyst", "too_many_stones:amethyst", "too_many_stones:amethyst"}, + {"too_many_stones:amethyst", "too_many_stones:amethyst", "too_many_stones:amethyst"}, + } +}) +-- Andesite +minetest.register_craft({ + output = "too_many_stones:andesite_brick 4", + recipe = { + {"too_many_stones:andesite", "too_many_stones:andesite"}, + {"too_many_stones:andesite", "too_many_stones:andesite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:andesite_block 9", + recipe = { + {"too_many_stones:andesite", "too_many_stones:andesite", "too_many_stones:andesite"}, + {"too_many_stones:andesite", "too_many_stones:andesite", "too_many_stones:andesite"}, + {"too_many_stones:andesite", "too_many_stones:andesite", "too_many_stones:andesite"}, + } +}) +-- Basalt +minetest.register_craft({ + output = "too_many_stones:basalt_brick 4", + recipe = { + {"too_many_stones:basalt", "too_many_stones:basalt"}, + {"too_many_stones:basalt", "too_many_stones:basalt"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:basalt_tile 4", + recipe = { + {"too_many_stones:basalt_brick", "too_many_stones:basalt_brick"}, + {"too_many_stones:basalt_brick", "too_many_stones:basalt_brick"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:basalt_block 9", + recipe = { + {"too_many_stones:basalt", "too_many_stones:basalt", "too_many_stones:basalt"}, + {"too_many_stones:basalt", "too_many_stones:basalt", "too_many_stones:basalt"}, + {"too_many_stones:basalt", "too_many_stones:basalt", "too_many_stones:basalt"}, + } +}) +-- Black Moonstone +minetest.register_craft({ + output = "too_many_stones:black_moonstone_brick 4", + recipe = { + {"too_many_stones:black_moonstone", "too_many_stones:black_moonstone"}, + {"too_many_stones:black_moonstone", "too_many_stones:black_moonstone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:black_moonstone_block 9", + recipe = { + {"too_many_stones:black_moonstone", "too_many_stones:black_moonstone", "too_many_stones:black_moonstone"}, + {"too_many_stones:black_moonstone", "too_many_stones:black_moonstone", "too_many_stones:black_moonstone"}, + {"too_many_stones:black_moonstone", "too_many_stones:black_moonstone", "too_many_stones:black_moonstone"}, + } +}) +-- Grey Calcite +minetest.register_craft({ + output = "too_many_stones:calcite_grey_brick 4", + recipe = { + {"too_many_stones:calcite_grey", "too_many_stones:calcite_grey"}, + {"too_many_stones:calcite_grey", "too_many_stones:calcite_grey"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:calcite_grey_block 9", + recipe = { + {"too_many_stones:calcite_grey", "too_many_stones:calcite_grey", "too_many_stones:calcite_grey"}, + {"too_many_stones:calcite_grey", "too_many_stones:calcite_grey", "too_many_stones:calcite_grey"}, + {"too_many_stones:calcite_grey", "too_many_stones:calcite_grey", "too_many_stones:calcite_grey"}, + } +}) +-- Calcite +minetest.register_craft({ + output = "too_many_stones:calcite_brick 4", + recipe = { + {"too_many_stones:calcite", "too_many_stones:calcite"}, + {"too_many_stones:calcite", "too_many_stones:calcite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:calcite_block 9", + recipe = { + {"too_many_stones:calcite", "too_many_stones:calcite", "too_many_stones:calcite"}, + {"too_many_stones:calcite", "too_many_stones:calcite", "too_many_stones:calcite"}, + {"too_many_stones:calcite", "too_many_stones:calcite", "too_many_stones:calcite"}, + } +}) +-- Orange Calcite +minetest.register_craft({ + output = "too_many_stones:calcite_orange_brick 4", + recipe = { + {"too_many_stones:calcite_orange", "too_many_stones:calcite_orange"}, + {"too_many_stones:calcite_orange", "too_many_stones:calcite_orange"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:calcite_orange_block 9", + recipe = { + {"too_many_stones:calcite_orange", "too_many_stones:calcite_orange", "too_many_stones:calcite_orange"}, + {"too_many_stones:calcite_orange", "too_many_stones:calcite_orange", "too_many_stones:calcite_orange"}, + {"too_many_stones:calcite_orange", "too_many_stones:calcite_orange", "too_many_stones:calcite_orange"}, + } +}) +-- Carnotite +minetest.register_craft({ + output = "too_many_stones:carnotite_brick 4", + recipe = { + {"too_many_stones:carnotite", "too_many_stones:carnotite"}, + {"too_many_stones:carnotite", "too_many_stones:carnotite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:carnotite_block 9", + recipe = { + {"too_many_stones:carnotite", "too_many_stones:carnotite", "too_many_stones:carnotite"}, + {"too_many_stones:carnotite", "too_many_stones:carnotite", "too_many_stones:carnotite"}, + {"too_many_stones:carnotite", "too_many_stones:carnotite", "too_many_stones:carnotite"}, + } +}) +-- Celestine +minetest.register_craft({ + output = "too_many_stones:celestine", + recipe = { + {"too_many_stones:celestine_crystal", "too_many_stones:celestine_crystal", "too_many_stones:celestine_crystal"}, + {"too_many_stones:celestine_crystal", "too_many_stones:celestine_crystal", "too_many_stones:celestine_crystal"}, + {"too_many_stones:celestine_crystal", "too_many_stones:celestine_crystal", "too_many_stones:celestine_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:celestine_brick 4", + recipe = { + {"too_many_stones:celestine", "too_many_stones:celestine"}, + {"too_many_stones:celestine", "too_many_stones:celestine"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:celestine_block 9", + recipe = { + {"too_many_stones:celestine", "too_many_stones:celestine", "too_many_stones:celestine"}, + {"too_many_stones:celestine", "too_many_stones:celestine", "too_many_stones:celestine"}, + {"too_many_stones:celestine", "too_many_stones:celestine", "too_many_stones:celestine"}, + } +}) +-- Chalcanthite +minetest.register_craft({ + output = "too_many_stones:chalcanthite", + recipe = { + {"too_many_stones:chalcanthite_crystal", "too_many_stones:chalcanthite_crystal", "too_many_stones:chalcanthite_crystal"}, + {"too_many_stones:chalcanthite_crystal", "too_many_stones:chalcanthite_crystal", "too_many_stones:chalcanthite_crystal"}, + {"too_many_stones:chalcanthite_crystal", "too_many_stones:chalcanthite_crystal", "too_many_stones:chalcanthite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:chalcanthite_brick 4", + recipe = { + {"too_many_stones:chalcanthite", "too_many_stones:chalcanthite"}, + {"too_many_stones:chalcanthite", "too_many_stones:chalcanthite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:chalcanthite_block 9", + recipe = { + {"too_many_stones:chalcanthite", "too_many_stones:chalcanthite", "too_many_stones:chalcanthite"}, + {"too_many_stones:chalcanthite", "too_many_stones:chalcanthite", "too_many_stones:chalcanthite"}, + {"too_many_stones:chalcanthite", "too_many_stones:chalcanthite", "too_many_stones:chalcanthite"}, + } +}) +-- Chrysoprase +minetest.register_craft({ + output = "too_many_stones:chrysoprase_brick 4", + recipe = { + {"too_many_stones:chrysoprase", "too_many_stones:chrysoprase"}, + {"too_many_stones:chrysoprase", "too_many_stones:chrysoprase"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:chrysoprase_block 9", + recipe = { + {"too_many_stones:chrysoprase", "too_many_stones:chrysoprase", "too_many_stones:chrysoprase"}, + {"too_many_stones:chrysoprase", "too_many_stones:chrysoprase", "too_many_stones:chrysoprase"}, + {"too_many_stones:chrysoprase", "too_many_stones:chrysoprase", "too_many_stones:chrysoprase"}, + } +}) +-- Citrine +minetest.register_craft({ + output = "too_many_stones:citrine", + recipe = { + {"too_many_stones:citrine_crystal", "too_many_stones:citrine_crystal", "too_many_stones:citrine_crystal"}, + {"too_many_stones:citrine_crystal", "too_many_stones:citrine_crystal", "too_many_stones:citrine_crystal"}, + {"too_many_stones:citrine_crystal", "too_many_stones:citrine_crystal", "too_many_stones:citrine_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:citrine_brick 4", + recipe = { + {"too_many_stones:citrine", "too_many_stones:citrine"}, + {"too_many_stones:citrine", "too_many_stones:citrine"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:citrine_block 9", + recipe = { + {"too_many_stones:citrine", "too_many_stones:citrine", "too_many_stones:citrine"}, + {"too_many_stones:citrine", "too_many_stones:citrine", "too_many_stones:citrine"}, + {"too_many_stones:citrine", "too_many_stones:citrine", "too_many_stones:citrine"}, + } +}) +-- Covellite +minetest.register_craft({ + output = "too_many_stones:covellite_brick 4", + recipe = { + {"too_many_stones:covellite", "too_many_stones:covellite"}, + {"too_many_stones:covellite", "too_many_stones:covellite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:covellite_block 9", + recipe = { + {"too_many_stones:covellite", "too_many_stones:covellite", "too_many_stones:covellite"}, + {"too_many_stones:covellite", "too_many_stones:covellite", "too_many_stones:covellite"}, + {"too_many_stones:covellite", "too_many_stones:covellite", "too_many_stones:covellite"}, + } +}) +-- Crocoite +minetest.register_craft({ + output = "too_many_stones:crocoite", + recipe = { + {"too_many_stones:crocoite_crystal", "too_many_stones:crocoite_crystal", "too_many_stones:crocoite_crystal"}, + {"too_many_stones:crocoite_crystal", "too_many_stones:crocoite_crystal", "too_many_stones:crocoite_crystal"}, + {"too_many_stones:crocoite_crystal", "too_many_stones:crocoite_crystal", "too_many_stones:crocoite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:crocoite_brick 4", + recipe = { + {"too_many_stones:crocoite", "too_many_stones:crocoite"}, + {"too_many_stones:crocoite", "too_many_stones:crocoite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:crocoite_block 9", + recipe = { + {"too_many_stones:crocoite", "too_many_stones:crocoite", "too_many_stones:crocoite"}, + {"too_many_stones:crocoite", "too_many_stones:crocoite", "too_many_stones:crocoite"}, + {"too_many_stones:crocoite", "too_many_stones:crocoite", "too_many_stones:crocoite"}, + } +}) +-- Diorite +minetest.register_craft({ + output = "too_many_stones:diorite_brick 4", + recipe = { + {"too_many_stones:diorite", "too_many_stones:diorite"}, + {"too_many_stones:diorite", "too_many_stones:diorite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:diorite_block 9", + recipe = { + {"too_many_stones:diorite", "too_many_stones:diorite", "too_many_stones:diorite"}, + {"too_many_stones:diorite", "too_many_stones:diorite", "too_many_stones:diorite"}, + {"too_many_stones:diorite", "too_many_stones:diorite", "too_many_stones:diorite"}, + } +}) +-- Erythrite +minetest.register_craft({ + output = "too_many_stones:erythrite_brick 4", + recipe = { + {"too_many_stones:erythrite", "too_many_stones:erythrite"}, + {"too_many_stones:erythrite", "too_many_stones:erythrite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:erythrite_block 9", + recipe = { + {"too_many_stones:erythrite", "too_many_stones:erythrite", "too_many_stones:erythrite"}, + {"too_many_stones:erythrite", "too_many_stones:erythrite", "too_many_stones:erythrite"}, + {"too_many_stones:erythrite", "too_many_stones:erythrite", "too_many_stones:erythrite"}, + } +}) +-- Eudialite +minetest.register_craft({ + output = "too_many_stones:eudialite", + recipe = { + {"too_many_stones:eudialite_crystal", "too_many_stones:eudialite_crystal", "too_many_stones:eudialite_crystal"}, + {"too_many_stones:eudialite_crystal", "too_many_stones:eudialite_crystal", "too_many_stones:eudialite_crystal"}, + {"too_many_stones:eudialite_crystal", "too_many_stones:eudialite_crystal", "too_many_stones:eudialite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:eudialite_brick 4", + recipe = { + {"too_many_stones:eudialite", "too_many_stones:eudialite"}, + {"too_many_stones:eudialite", "too_many_stones:eudialite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:eudialite_block 9", + recipe = { + {"too_many_stones:eudialite", "too_many_stones:eudialite", "too_many_stones:eudialite"}, + {"too_many_stones:eudialite", "too_many_stones:eudialite", "too_many_stones:eudialite"}, + {"too_many_stones:eudialite", "too_many_stones:eudialite", "too_many_stones:eudialite"}, + } +}) +-- Fluorite +minetest.register_craft({ + output = "too_many_stones:fluorite_brick 4", + recipe = { + {"too_many_stones:fluorite", "too_many_stones:fluorite"}, + {"too_many_stones:fluorite", "too_many_stones:fluorite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:fluorite_block 9", + recipe = { + {"too_many_stones:fluorite", "too_many_stones:fluorite", "too_many_stones:fluorite"}, + {"too_many_stones:fluorite", "too_many_stones:fluorite", "too_many_stones:fluorite"}, + {"too_many_stones:fluorite", "too_many_stones:fluorite", "too_many_stones:fluorite"}, + } +}) +-- Gabbro +minetest.register_craft({ + output = "too_many_stones:gabbro_brick 4", + recipe = { + {"too_many_stones:gabbro", "too_many_stones:gabbro"}, + {"too_many_stones:gabbro", "too_many_stones:gabbro"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:gabbro_block 9", + recipe = { + {"too_many_stones:gabbro", "too_many_stones:gabbro", "too_many_stones:gabbro"}, + {"too_many_stones:gabbro", "too_many_stones:gabbro", "too_many_stones:gabbro"}, + {"too_many_stones:gabbro", "too_many_stones:gabbro", "too_many_stones:gabbro"}, + } +}) +-- Galena +minetest.register_craft({ + output = "too_many_stones:galena_brick 4", + recipe = { + {"too_many_stones:galena", "too_many_stones:galena"}, + {"too_many_stones:galena", "too_many_stones:galena"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:galena_block 9", + recipe = { + {"too_many_stones:galena", "too_many_stones:galena", "too_many_stones:galena"}, + {"too_many_stones:galena", "too_many_stones:galena", "too_many_stones:galena"}, + {"too_many_stones:galena", "too_many_stones:galena", "too_many_stones:galena"}, + } +}) +-- Black Granite +minetest.register_craft({ + output = "too_many_stones:granite_black_brick 4", + recipe = { + {"too_many_stones:granite_black", "too_many_stones:granite_black"}, + {"too_many_stones:granite_black", "too_many_stones:granite_black"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_black_block 9", + recipe = { + {"too_many_stones:granite_black", "too_many_stones:granite_black", "too_many_stones:granite_black"}, + {"too_many_stones:granite_black", "too_many_stones:granite_black", "too_many_stones:granite_black"}, + {"too_many_stones:granite_black", "too_many_stones:granite_black", "too_many_stones:granite_black"}, + } +}) +-- Blue Granite +minetest.register_craft({ + output = "too_many_stones:granite_blue_brick 4", + recipe = { + {"too_many_stones:granite_blue", "too_many_stones:granite_blue"}, + {"too_many_stones:granite_blue", "too_many_stones:granite_blue"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_blue_block 9", + recipe = { + {"too_many_stones:granite_blue", "too_many_stones:granite_blue", "too_many_stones:granite_blue"}, + {"too_many_stones:granite_blue", "too_many_stones:granite_blue", "too_many_stones:granite_blue"}, + {"too_many_stones:granite_blue", "too_many_stones:granite_blue", "too_many_stones:granite_blue"}, + } +}) +-- Gray Granite +minetest.register_craft({ + output = "too_many_stones:granite_gray_brick 4", + recipe = { + {"too_many_stones:granite_gray", "too_many_stones:granite_gray"}, + {"too_many_stones:granite_gray", "too_many_stones:granite_gray"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_gray_block 9", + recipe = { + {"too_many_stones:granite_gray", "too_many_stones:granite_gray", "too_many_stones:granite_gray"}, + {"too_many_stones:granite_gray", "too_many_stones:granite_gray", "too_many_stones:granite_gray"}, + {"too_many_stones:granite_gray", "too_many_stones:granite_gray", "too_many_stones:granite_gray"}, + } +}) +-- Green Granite +minetest.register_craft({ + output = "too_many_stones:granite_green_brick 4", + recipe = { + {"too_many_stones:granite_green", "too_many_stones:granite_green"}, + {"too_many_stones:granite_green", "too_many_stones:granite_green"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_green_block 9", + recipe = { + {"too_many_stones:granite_green", "too_many_stones:granite_green", "too_many_stones:granite_green"}, + {"too_many_stones:granite_green", "too_many_stones:granite_green", "too_many_stones:granite_green"}, + {"too_many_stones:granite_green", "too_many_stones:granite_green", "too_many_stones:granite_green"}, + } +}) +-- Pink Granite +minetest.register_craft({ + output = "too_many_stones:granite_pink_brick 4", + recipe = { + {"too_many_stones:granite_pink", "too_many_stones:granite_pink"}, + {"too_many_stones:granite_pink", "too_many_stones:granite_pink"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_pink_block 9", + recipe = { + {"too_many_stones:granite_pink", "too_many_stones:granite_pink", "too_many_stones:granite_pink"}, + {"too_many_stones:granite_pink", "too_many_stones:granite_pink", "too_many_stones:granite_pink"}, + {"too_many_stones:granite_pink", "too_many_stones:granite_pink", "too_many_stones:granite_pink"}, + } +}) +-- Red Granite +minetest.register_craft({ + output = "too_many_stones:granite_red_brick 4", + recipe = { + {"too_many_stones:granite_red", "too_many_stones:granite_red"}, + {"too_many_stones:granite_red", "too_many_stones:granite_red"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_red_block 9", + recipe = { + {"too_many_stones:granite_red", "too_many_stones:granite_red", "too_many_stones:granite_red"}, + {"too_many_stones:granite_red", "too_many_stones:granite_red", "too_many_stones:granite_red"}, + {"too_many_stones:granite_red", "too_many_stones:granite_red", "too_many_stones:granite_red"}, + } +}) +-- White Granite +minetest.register_craft({ + output = "too_many_stones:granite_white_brick 4", + recipe = { + {"too_many_stones:granite_white", "too_many_stones:granite_white"}, + {"too_many_stones:granite_white", "too_many_stones:granite_white"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_white_block 9", + recipe = { + {"too_many_stones:granite_white", "too_many_stones:granite_white", "too_many_stones:granite_white"}, + {"too_many_stones:granite_white", "too_many_stones:granite_white", "too_many_stones:granite_white"}, + {"too_many_stones:granite_white", "too_many_stones:granite_white", "too_many_stones:granite_white"}, + } +}) +-- Yellow Granite +minetest.register_craft({ + output = "too_many_stones:granite_yellow_brick 4", + recipe = { + {"too_many_stones:granite_yellow", "too_many_stones:granite_yellow"}, + {"too_many_stones:granite_yellow", "too_many_stones:granite_yellow"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_yellow_block 9", + recipe = { + {"too_many_stones:granite_yellow", "too_many_stones:granite_yellow", "too_many_stones:granite_yellow"}, + {"too_many_stones:granite_yellow", "too_many_stones:granite_yellow", "too_many_stones:granite_yellow"}, + {"too_many_stones:granite_yellow", "too_many_stones:granite_yellow", "too_many_stones:granite_yellow"}, + } +}) +-- Heliodor +minetest.register_craft({ + output = "too_many_stones:heliodor", + recipe = { + {"too_many_stones:heliodor_crystal", "too_many_stones:heliodor_crystal", "too_many_stones:heliodor_crystal"}, + {"too_many_stones:heliodor_crystal", "too_many_stones:heliodor_crystal", "too_many_stones:heliodor_crystal"}, + {"too_many_stones:heliodor_crystal", "too_many_stones:heliodor_crystal", "too_many_stones:heliodor_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:heliodor_brick 4", + recipe = { + {"too_many_stones:heliodor", "too_many_stones:heliodor"}, + {"too_many_stones:heliodor", "too_many_stones:heliodor"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:heliodor_block 9", + recipe = { + {"too_many_stones:heliodor", "too_many_stones:heliodor", "too_many_stones:heliodor"}, + {"too_many_stones:heliodor", "too_many_stones:heliodor", "too_many_stones:heliodor"}, + {"too_many_stones:heliodor", "too_many_stones:heliodor", "too_many_stones:heliodor"}, + } +}) +-- Howlite +minetest.register_craft({ + output = "too_many_stones:howlite_brick 4", + recipe = { + {"too_many_stones:howlite", "too_many_stones:howlite"}, + {"too_many_stones:howlite", "too_many_stones:howlite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:howlite_block 9", + recipe = { + {"too_many_stones:howlite", "too_many_stones:howlite", "too_many_stones:howlite"}, + {"too_many_stones:howlite", "too_many_stones:howlite", "too_many_stones:howlite"}, + {"too_many_stones:howlite", "too_many_stones:howlite", "too_many_stones:howlite"}, + } +}) +-- Ilvaite +minetest.register_craft({ + output = "too_many_stones:ilvaite_brick 4", + recipe = { + {"too_many_stones:ilvaite", "too_many_stones:ilvaite"}, + {"too_many_stones:ilvaite", "too_many_stones:ilvaite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:ilvaite_block 9", + recipe = { + {"too_many_stones:ilvaite", "too_many_stones:ilvaite", "too_many_stones:ilvaite"}, + {"too_many_stones:ilvaite", "too_many_stones:ilvaite", "too_many_stones:ilvaite"}, + {"too_many_stones:ilvaite", "too_many_stones:ilvaite", "too_many_stones:ilvaite"}, + } +}) +-- Jade +minetest.register_craft({ + output = "too_many_stones:jade_brick 4", + recipe = { + {"too_many_stones:jade", "too_many_stones:jade"}, + {"too_many_stones:jade", "too_many_stones:jade"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:jade_block 9", + recipe = { + {"too_many_stones:jade", "too_many_stones:jade", "too_many_stones:jade"}, + {"too_many_stones:jade", "too_many_stones:jade", "too_many_stones:jade"}, + {"too_many_stones:jade", "too_many_stones:jade", "too_many_stones:jade"}, + } +}) +-- Red Jasper +minetest.register_craft({ + output = "too_many_stones:jasper_red_brick 4", + recipe = { + {"too_many_stones:jasper_red", "too_many_stones:jasper_red"}, + {"too_many_stones:jasper_red", "too_many_stones:jasper_red"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:jasper_red_block 9", + recipe = { + {"too_many_stones:jasper_red", "too_many_stones:jasper_red", "too_many_stones:jasper_red"}, + {"too_many_stones:jasper_red", "too_many_stones:jasper_red", "too_many_stones:jasper_red"}, + {"too_many_stones:jasper_red", "too_many_stones:jasper_red", "too_many_stones:jasper_red"}, + } +}) +-- Kyanite +minetest.register_craft({ + output = "too_many_stones:kyanite", + recipe = { + {"too_many_stones:kyanite_crystal", "too_many_stones:kyanite_crystal", "too_many_stones:kyanite_crystal"}, + {"too_many_stones:kyanite_crystal", "too_many_stones:kyanite_crystal", "too_many_stones:kyanite_crystal"}, + {"too_many_stones:kyanite_crystal", "too_many_stones:kyanite_crystal", "too_many_stones:kyanite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:kyanite_brick 4", + recipe = { + {"too_many_stones:kyanite", "too_many_stones:kyanite"}, + {"too_many_stones:kyanite", "too_many_stones:kyanite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:kyanite_block 9", + recipe = { + {"too_many_stones:kyanite", "too_many_stones:kyanite", "too_many_stones:kyanite"}, + {"too_many_stones:kyanite", "too_many_stones:kyanite", "too_many_stones:kyanite"}, + {"too_many_stones:kyanite", "too_many_stones:kyanite", "too_many_stones:kyanite"}, + } +}) +-- Lapis Lazuli +minetest.register_craft({ + output = "too_many_stones:lapis_lazuli_brick 4", + recipe = { + {"too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli"}, + {"too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:lapis_lazuli_block 9", + recipe = { + {"too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli"}, + {"too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli"}, + {"too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli", "too_many_stones:lapis_lazuli"}, + } +}) +-- Lepidolite +minetest.register_craft({ + output = "too_many_stones:lepidolite_brick 4", + recipe = { + {"too_many_stones:lepidolite", "too_many_stones:lepidolite"}, + {"too_many_stones:lepidolite", "too_many_stones:lepidolite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:lepidolite_block 9", + recipe = { + {"too_many_stones:lepidolite", "too_many_stones:lepidolite", "too_many_stones:lepidolite"}, + {"too_many_stones:lepidolite", "too_many_stones:lepidolite", "too_many_stones:lepidolite"}, + {"too_many_stones:lepidolite", "too_many_stones:lepidolite", "too_many_stones:lepidolite"}, + } +}) +-- Blue Limestone +minetest.register_craft({ + output = "too_many_stones:limestone_blue_brick 4", + recipe = { + {"too_many_stones:limestone_blue", "too_many_stones:limestone_blue"}, + {"too_many_stones:limestone_blue", "too_many_stones:limestone_blue"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:limestone_blue_block 9", + recipe = { + {"too_many_stones:limestone_blue", "too_many_stones:limestone_blue", "too_many_stones:limestone_blue"}, + {"too_many_stones:limestone_blue", "too_many_stones:limestone_blue", "too_many_stones:limestone_blue"}, + {"too_many_stones:limestone_blue", "too_many_stones:limestone_blue", "too_many_stones:limestone_blue"}, + } +}) +-- White Limestone +minetest.register_craft({ + output = "too_many_stones:limestone_white_brick 4", + recipe = { + {"too_many_stones:limestone_white", "too_many_stones:limestone_white"}, + {"too_many_stones:limestone_white", "too_many_stones:limestone_white"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:limestone_white_block 9", + recipe = { + {"too_many_stones:limestone_white", "too_many_stones:limestone_white", "too_many_stones:limestone_white"}, + {"too_many_stones:limestone_white", "too_many_stones:limestone_white", "too_many_stones:limestone_white"}, + {"too_many_stones:limestone_white", "too_many_stones:limestone_white", "too_many_stones:limestone_white"}, + } +}) +-- Marble +minetest.register_craft({ + output = "too_many_stones:marble_brick 4", + recipe = { + {"too_many_stones:marble", "too_many_stones:marble"}, + {"too_many_stones:marble", "too_many_stones:marble"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:marble_block 9", + recipe = { + {"too_many_stones:marble", "too_many_stones:marble", "too_many_stones:marble"}, + {"too_many_stones:marble", "too_many_stones:marble", "too_many_stones:marble"}, + {"too_many_stones:marble", "too_many_stones:marble", "too_many_stones:marble"}, + } +}) +-- Moonstone +minetest.register_craft({ + output = "too_many_stones:moonstone", + recipe = { + {"too_many_stones:moonstone_crystal", "too_many_stones:moonstone_crystal", "too_many_stones:moonstone_crystal"}, + {"too_many_stones:moonstone_crystal", "too_many_stones:moonstone_crystal", "too_many_stones:moonstone_crystal"}, + {"too_many_stones:moonstone_crystal", "too_many_stones:moonstone_crystal", "too_many_stones:moonstone_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:moonstone_brick 4", + recipe = { + {"too_many_stones:moonstone", "too_many_stones:moonstone"}, + {"too_many_stones:moonstone", "too_many_stones:moonstone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:moonstone_block 9", + recipe = { + {"too_many_stones:moonstone", "too_many_stones:moonstone", "too_many_stones:moonstone"}, + {"too_many_stones:moonstone", "too_many_stones:moonstone", "too_many_stones:moonstone"}, + {"too_many_stones:moonstone", "too_many_stones:moonstone", "too_many_stones:moonstone"}, + } +}) +-- Morion Quartz +minetest.register_craft({ + output = "too_many_stones:morion_quartz", + recipe = { + {"too_many_stones:morion_quartz_crystal", "too_many_stones:morion_quartz_crystal", "too_many_stones:morion_quartz_crystal"}, + {"too_many_stones:morion_quartz_crystal", "too_many_stones:morion_quartz_crystal", "too_many_stones:morion_quartz_crystal"}, + {"too_many_stones:morion_quartz_crystal", "too_many_stones:morion_quartz_crystal", "too_many_stones:morion_quartz_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:morion_quartz_brick 4", + recipe = { + {"too_many_stones:morion_quartz", "too_many_stones:morion_quartz"}, + {"too_many_stones:morion_quartz", "too_many_stones:morion_quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:morion_quartz_block 9", + recipe = { + {"too_many_stones:morion_quartz", "too_many_stones:morion_quartz", "too_many_stones:morion_quartz"}, + {"too_many_stones:morion_quartz", "too_many_stones:morion_quartz", "too_many_stones:morion_quartz"}, + {"too_many_stones:morion_quartz", "too_many_stones:morion_quartz", "too_many_stones:morion_quartz"}, + } +}) +-- Mudstone +minetest.register_craft({ + output = "too_many_stones:mudstone_brick 4", + recipe = { + {"too_many_stones:mudstone", "too_many_stones:mudstone"}, + {"too_many_stones:mudstone", "too_many_stones:mudstone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:mudstone_block 9", + recipe = { + {"too_many_stones:mudstone", "too_many_stones:mudstone", "too_many_stones:mudstone"}, + {"too_many_stones:mudstone", "too_many_stones:mudstone", "too_many_stones:mudstone"}, + {"too_many_stones:mudstone", "too_many_stones:mudstone", "too_many_stones:mudstone"}, + } +}) +-- Prasiolite +minetest.register_craft({ + output = "too_many_stones:prasiolite", + recipe = { + {"too_many_stones:prasiolite_crystal", "too_many_stones:prasiolite_crystal", "too_many_stones:prasiolite_crystal"}, + {"too_many_stones:prasiolite_crystal", "too_many_stones:prasiolite_crystal", "too_many_stones:prasiolite_crystal"}, + {"too_many_stones:prasiolite_crystal", "too_many_stones:prasiolite_crystal", "too_many_stones:prasiolite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:prasiolite_brick 4", + recipe = { + {"too_many_stones:prasiolite", "too_many_stones:prasiolite"}, + {"too_many_stones:prasiolite", "too_many_stones:prasiolite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:prasiolite_block 9", + recipe = { + {"too_many_stones:prasiolite", "too_many_stones:prasiolite", "too_many_stones:prasiolite"}, + {"too_many_stones:prasiolite", "too_many_stones:prasiolite", "too_many_stones:prasiolite"}, + {"too_many_stones:prasiolite", "too_many_stones:prasiolite", "too_many_stones:prasiolite"}, + } +}) + +-- Pumice +minetest.register_craft({ + output = "too_many_stones:pumice_brick 4", + recipe = { + {"too_many_stones:pumice", "too_many_stones:pumice"}, + {"too_many_stones:pumice", "too_many_stones:pumice"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:pumice_block 9", + recipe = { + {"too_many_stones:pumice", "too_many_stones:pumice", "too_many_stones:pumice"}, + {"too_many_stones:pumice", "too_many_stones:pumice", "too_many_stones:pumice"}, + {"too_many_stones:pumice", "too_many_stones:pumice", "too_many_stones:pumice"}, + } +}) +-- Pyrite +minetest.register_craft({ + output = "too_many_stones:pyrite_brick 4", + recipe = { + {"too_many_stones:pyrite", "too_many_stones:pyrite"}, + {"too_many_stones:pyrite", "too_many_stones:pyrite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:pyrite_block 9", + recipe = { + {"too_many_stones:pyrite", "too_many_stones:pyrite", "too_many_stones:pyrite"}, + {"too_many_stones:pyrite", "too_many_stones:pyrite", "too_many_stones:pyrite"}, + {"too_many_stones:pyrite", "too_many_stones:pyrite", "too_many_stones:pyrite"}, + } +}) +-- Quartz +minetest.register_craft({ + output = "too_many_stones:quartz", + recipe = { + {"too_many_stones:quartz_crystal", "too_many_stones:quartz_crystal", "too_many_stones:quartz_crystal"}, + {"too_many_stones:quartz_crystal", "too_many_stones:quartz_crystal", "too_many_stones:quartz_crystal"}, + {"too_many_stones:quartz_crystal", "too_many_stones:quartz_crystal", "too_many_stones:quartz_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:quartz_brick 4", + recipe = { + {"too_many_stones:quartz", "too_many_stones:quartz"}, + {"too_many_stones:quartz", "too_many_stones:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:quartz_block 9", + recipe = { + {"too_many_stones:quartz", "too_many_stones:quartz", "too_many_stones:quartz"}, + {"too_many_stones:quartz", "too_many_stones:quartz", "too_many_stones:quartz"}, + {"too_many_stones:quartz", "too_many_stones:quartz", "too_many_stones:quartz"}, + } +}) +-- Rhodonite +minetest.register_craft({ + output = "too_many_stones:rhodonite_brick 4", + recipe = { + {"too_many_stones:rhodonite", "too_many_stones:rhodonite"}, + {"too_many_stones:rhodonite", "too_many_stones:rhodonite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:rhodonite_block 9", + recipe = { + {"too_many_stones:rhodonite", "too_many_stones:rhodonite", "too_many_stones:rhodonite"}, + {"too_many_stones:rhodonite", "too_many_stones:rhodonite", "too_many_stones:rhodonite"}, + {"too_many_stones:rhodonite", "too_many_stones:rhodonite", "too_many_stones:rhodonite"}, + } +}) +-- Rose_Quartz +minetest.register_craft({ + output = "too_many_stones:rose_quartz", + recipe = { + {"too_many_stones:rose_quartz_crystal", "too_many_stones:rose_quartz_crystal", "too_many_stones:rose_quartz_crystal"}, + {"too_many_stones:rose_quartz_crystal", "too_many_stones:rose_quartz_crystal", "too_many_stones:rose_quartz_crystal"}, + {"too_many_stones:rose_quartz_crystal", "too_many_stones:rose_quartz_crystal", "too_many_stones:rose_quartz_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:rose_quartz_brick 4", + recipe = { + {"too_many_stones:rose_quartz", "too_many_stones:rose_quartz"}, + {"too_many_stones:rose_quartz", "too_many_stones:rose_quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:rose_quartz_block 9", + recipe = { + {"too_many_stones:rose_quartz", "too_many_stones:rose_quartz", "too_many_stones:rose_quartz"}, + {"too_many_stones:rose_quartz", "too_many_stones:rose_quartz", "too_many_stones:rose_quartz"}, + {"too_many_stones:rose_quartz", "too_many_stones:rose_quartz", "too_many_stones:rose_quartz"}, + } +}) +-- Scoria +minetest.register_craft({ + output = "too_many_stones:scoria_brick 4", + recipe = { + {"too_many_stones:scoria", "too_many_stones:scoria"}, + {"too_many_stones:scoria", "too_many_stones:scoria"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:scoria_block 9", + recipe = { + {"too_many_stones:scoria", "too_many_stones:scoria", "too_many_stones:scoria"}, + {"too_many_stones:scoria", "too_many_stones:scoria", "too_many_stones:scoria"}, + {"too_many_stones:scoria", "too_many_stones:scoria", "too_many_stones:scoria"}, + } +}) +-- Serpentine +minetest.register_craft({ + output = "too_many_stones:serpentine_brick 4", + recipe = { + {"too_many_stones:serpentine", "too_many_stones:serpentine"}, + {"too_many_stones:serpentine", "too_many_stones:serpentine"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:serpentine_block 9", + recipe = { + {"too_many_stones:serpentine", "too_many_stones:serpentine", "too_many_stones:serpentine"}, + {"too_many_stones:serpentine", "too_many_stones:serpentine", "too_many_stones:serpentine"}, + {"too_many_stones:serpentine", "too_many_stones:serpentine", "too_many_stones:serpentine"}, + } +}) +-- Shale +minetest.register_craft({ + output = "too_many_stones:shale_brick 4", + recipe = { + {"too_many_stones:shale", "too_many_stones:shale"}, + {"too_many_stones:shale", "too_many_stones:shale"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:shale_block 9", + recipe = { + {"too_many_stones:shale", "too_many_stones:shale", "too_many_stones:shale"}, + {"too_many_stones:shale", "too_many_stones:shale", "too_many_stones:shale"}, + {"too_many_stones:shale", "too_many_stones:shale", "too_many_stones:shale"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:shale_tile 4", + recipe = { + {"too_many_stones:shale_brick", "too_many_stones:shale_brick"}, + {"too_many_stones:shale_brick", "too_many_stones:shale_brick"}, + } +}) +-- Slate +minetest.register_craft({ + output = "too_many_stones:slate_brick 4", + recipe = { + {"too_many_stones:slate", "too_many_stones:slate"}, + {"too_many_stones:slate", "too_many_stones:slate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:slate_block 9", + recipe = { + {"too_many_stones:slate", "too_many_stones:slate", "too_many_stones:slate"}, + {"too_many_stones:slate", "too_many_stones:slate", "too_many_stones:slate"}, + {"too_many_stones:slate", "too_many_stones:slate", "too_many_stones:slate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:slate_tile 4", + recipe = { + {"too_many_stones:slate_brick", "too_many_stones:slate_brick"}, + {"too_many_stones:slate_brick", "too_many_stones:slate_brick"}, + } +}) +-- Smokey Quartz +minetest.register_craft({ + output = "too_many_stones:smokey_quartz", + recipe = { + {"too_many_stones:smokey_quartz_crystal", "too_many_stones:smokey_quartz_crystal", "too_many_stones:smokey_quartz_crystal"}, + {"too_many_stones:smokey_quartz_crystal", "too_many_stones:smokey_quartz_crystal", "too_many_stones:smokey_quartz_crystal"}, + {"too_many_stones:smokey_quartz_crystal", "too_many_stones:smokey_quartz_crystal", "too_many_stones:smokey_quartz_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:smokey_quartz_brick 4", + recipe = { + {"too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz"}, + {"too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:smokey_quartz_block 9", + recipe = { + {"too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz"}, + {"too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz"}, + {"too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz"}, + } +}) +-- Soapstone +minetest.register_craft({ + output = "too_many_stones:soapstone_brick 4", + recipe = { + {"too_many_stones:soapstone", "too_many_stones:soapstone"}, + {"too_many_stones:soapstone", "too_many_stones:soapstone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:soapstone_block 9", + recipe = { + {"too_many_stones:soapstone", "too_many_stones:soapstone", "too_many_stones:soapstone"}, + {"too_many_stones:soapstone", "too_many_stones:soapstone", "too_many_stones:soapstone"}, + {"too_many_stones:soapstone", "too_many_stones:soapstone", "too_many_stones:soapstone"}, + } +}) +-- Sodalite +minetest.register_craft({ + output = "too_many_stones:sodalite_brick 4", + recipe = { + {"too_many_stones:sodalite", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "too_many_stones:sodalite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:sodalite_block 9", + recipe = { + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + } +}) +-- Sugilite +minetest.register_craft({ + output = "too_many_stones:sugilite_brick 4", + recipe = { + {"too_many_stones:sugilite", "too_many_stones:sugilite"}, + {"too_many_stones:sugilite", "too_many_stones:sugilite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:sugilite_block 9", + recipe = { + {"too_many_stones:sugilite", "too_many_stones:sugilite", "too_many_stones:sugilite"}, + {"too_many_stones:sugilite", "too_many_stones:sugilite", "too_many_stones:sugilite"}, + {"too_many_stones:sugilite", "too_many_stones:sugilite", "too_many_stones:sugilite"}, + } +}) +-- Green Tourmaline +minetest.register_craft({ + output = "too_many_stones:tourmaline_green", + recipe = { + {"too_many_stones:tourmaline_green_crystal", "too_many_stones:tourmaline_green_crystal", "too_many_stones:tourmaline_green_crystal"}, + {"too_many_stones:tourmaline_green_crystal", "too_many_stones:tourmaline_green_crystal", "too_many_stones:tourmaline_green_crystal"}, + {"too_many_stones:tourmaline_green_crystal", "too_many_stones:tourmaline_green_crystal", "too_many_stones:tourmaline_green_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tourmaline_green_brick 4", + recipe = { + {"too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green"}, + {"too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tourmaline_green_block 9", + recipe = { + {"too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green"}, + {"too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green"}, + {"too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green"}, + } +}) +-- Paraiba Tourmaline +minetest.register_craft({ + output = "too_many_stones:tourmaline_paraiba", + recipe = { + {"too_many_stones:tourmaline_paraiba_crystal", "too_many_stones:tourmaline_paraiba_crystal", "too_many_stones:tourmaline_paraiba_crystal"}, + {"too_many_stones:tourmaline_paraiba_crystal", "too_many_stones:tourmaline_paraiba_crystal", "too_many_stones:tourmaline_paraiba_crystal"}, + {"too_many_stones:tourmaline_paraiba_crystal", "too_many_stones:tourmaline_paraiba_crystal", "too_many_stones:tourmaline_paraiba_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tourmaline_paraiba_brick 4", + recipe = { + {"too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba"}, + {"too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tourmaline_paraiba_block 9", + recipe = { + {"too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba"}, + {"too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba"}, + {"too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba"}, + } +}) +-- Pink Tourmaline +minetest.register_craft({ + output = "too_many_stones:tourmaline_pink", + recipe = { + {"too_many_stones:tourmaline_pink_crystal", "too_many_stones:tourmaline_pink_crystal", "too_many_stones:tourmaline_pink_crystal"}, + {"too_many_stones:tourmaline_pink_crystal", "too_many_stones:tourmaline_pink_crystal", "too_many_stones:tourmaline_pink_crystal"}, + {"too_many_stones:tourmaline_pink_crystal", "too_many_stones:tourmaline_pink_crystal", "too_many_stones:tourmaline_pink_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tourmaline_pink_brick 4", + recipe = { + {"too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink"}, + {"too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tourmaline_pink_block 9", + recipe = { + {"too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink"}, + {"too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink"}, + {"too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink"}, + } +}) +-- Travertine +minetest.register_craft({ + output = "too_many_stones:travertine_brick 4", + recipe = { + {"too_many_stones:travertine", "too_many_stones:travertine"}, + {"too_many_stones:travertine", "too_many_stones:travertine"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:travertine_block 9", + recipe = { + {"too_many_stones:travertine", "too_many_stones:travertine", "too_many_stones:travertine"}, + {"too_many_stones:travertine", "too_many_stones:travertine", "too_many_stones:travertine"}, + {"too_many_stones:travertine", "too_many_stones:travertine", "too_many_stones:travertine"}, + } +}) +-- Turquoise +minetest.register_craft({ + output = "too_many_stones:turquoise_cobble", + recipe = { + {"too_many_stones:turquoise_pebble", "too_many_stones:turquoise_pebble", "too_many_stones:turquoise_pebble"}, + {"too_many_stones:turquoise_pebble", "too_many_stones:turquoise_pebble", "too_many_stones:turquoise_pebble"}, + {"too_many_stones:turquoise_pebble", "too_many_stones:turquoise_pebble", "too_many_stones:turquoise_pebble"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:turquoise_brick 4", + recipe = { + {"too_many_stones:turquoise", "too_many_stones:turquoise"}, + {"too_many_stones:turquoise", "too_many_stones:turquoise"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:turquoise_block 9", + recipe = { + {"too_many_stones:turquoise", "too_many_stones:turquoise", "too_many_stones:turquoise"}, + {"too_many_stones:turquoise", "too_many_stones:turquoise", "too_many_stones:turquoise"}, + {"too_many_stones:turquoise", "too_many_stones:turquoise", "too_many_stones:turquoise"}, + } +}) +-- Beige Tuff +minetest.register_craft({ + output = "too_many_stones:tuff_beige_brick 4", + recipe = { + {"too_many_stones:tuff_beige", "too_many_stones:tuff_beige"}, + {"too_many_stones:tuff_beige", "too_many_stones:tuff_beige"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tuff_beige_block 9", + recipe = { + {"too_many_stones:tuff_beige", "too_many_stones:tuff_beige", "too_many_stones:tuff_beige"}, + {"too_many_stones:tuff_beige", "too_many_stones:tuff_beige", "too_many_stones:tuff_beige"}, + {"too_many_stones:tuff_beige", "too_many_stones:tuff_beige", "too_many_stones:tuff_beige"}, + } +}) +-- Grey Tuff +minetest.register_craft({ + output = "too_many_stones:tuff_grey_brick 4", + recipe = { + {"too_many_stones:tuff_grey", "too_many_stones:tuff_grey"}, + {"too_many_stones:tuff_grey", "too_many_stones:tuff_grey"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tuff_grey_block 9", + recipe = { + {"too_many_stones:tuff_grey", "too_many_stones:tuff_grey", "too_many_stones:tuff_grey"}, + {"too_many_stones:tuff_grey", "too_many_stones:tuff_grey", "too_many_stones:tuff_grey"}, + {"too_many_stones:tuff_grey", "too_many_stones:tuff_grey", "too_many_stones:tuff_grey"}, + } +}) +-- Red Tuff +minetest.register_craft({ + output = "too_many_stones:tuff_red_brick 4", + recipe = { + {"too_many_stones:tuff_red", "too_many_stones:tuff_red"}, + {"too_many_stones:tuff_red", "too_many_stones:tuff_red"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:tuff_red_block 9", + recipe = { + {"too_many_stones:tuff_red", "too_many_stones:tuff_red", "too_many_stones:tuff_red"}, + {"too_many_stones:tuff_red", "too_many_stones:tuff_red", "too_many_stones:tuff_red"}, + {"too_many_stones:tuff_red", "too_many_stones:tuff_red", "too_many_stones:tuff_red"}, + } +}) +-- Vivianite +minetest.register_craft({ + output = "too_many_stones:vivianite", + recipe = { + {"too_many_stones:vivianite_crystal", "too_many_stones:vivianite_crystal", "too_many_stones:vivianite_crystal"}, + {"too_many_stones:vivianite_crystal", "too_many_stones:vivianite_crystal", "too_many_stones:vivianite_crystal"}, + {"too_many_stones:vivianite_crystal", "too_many_stones:vivianite_crystal", "too_many_stones:vivianite_crystal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:vivianite_brick 4", + recipe = { + {"too_many_stones:vivianite", "too_many_stones:vivianite"}, + {"too_many_stones:vivianite", "too_many_stones:vivianite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:vivianite_block 9", + recipe = { + {"too_many_stones:vivianite", "too_many_stones:vivianite", "too_many_stones:vivianite"}, + {"too_many_stones:vivianite", "too_many_stones:vivianite", "too_many_stones:vivianite"}, + {"too_many_stones:vivianite", "too_many_stones:vivianite", "too_many_stones:vivianite"}, + } +}) + +-- +-- Cooking recipes +-- + +--[[ +-- Placeholder Crystal Cooking Recipes +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:placeholder_cracked_brick", + recipe = "too_many_stones:placeholder_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:placeholder_budding", + recipe = "too_many_stones:placeholder", +}) +]] + +--[[ +-- Placeholder Stone Cooking Recipes +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:placeholder", + recipe = "too_many_stones:placeholder_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:placeholder_cracked_brick", + recipe = "too_many_stones:placeholder_brick", +}) +]] + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amazonite", + recipe = "too_many_stones:amazonite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amazonite_cracked_brick", + recipe = "too_many_stones:amazonite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amazonite_budding", + recipe = "too_many_stones:amazonite", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amber_cracked_brick", + recipe = "too_many_stones:amber_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amber_budding", + recipe = "too_many_stones:amber", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amethyst_cracked_brick", + recipe = "too_many_stones:amethyst_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:amethyst_budding", + recipe = "too_many_stones:amethyst", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:andesite", + recipe = "too_many_stones:andesite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:andesite_cracked_brick", + recipe = "too_many_stones:andesite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:basalt", + recipe = "too_many_stones:basalt_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:basalt_cracked_brick", + recipe = "too_many_stones:basalt_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:black_moonstone_cracked_brick", + recipe = "too_many_stones:black_moonstone_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:calcite_grey_cracked_brick", + recipe = "too_many_stones:calcite_grey_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:calcite_cracked_brick", + recipe = "too_many_stones:calcite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:calcite_orange_cracked_brick", + recipe = "too_many_stones:calcite_orange_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:carnotite", + recipe = "too_many_stones:carnotite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:carnotite_cracked_brick", + recipe = "too_many_stones:carnotite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:celestine_cracked_brick", + recipe = "too_many_stones:celestine_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:celestine_budding", + recipe = "too_many_stones:celestine", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:chalcanthite_cracked_brick", + recipe = "too_many_stones:chalcanthite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:chalcanthite_budding", + recipe = "too_many_stones:chalcanthite", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:chrysoprase", + recipe = "too_many_stones:chrysoprase_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:chrysoprase_cracked_brick", + recipe = "too_many_stones:chrysoprase_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:citrine_cracked_brick", + recipe = "too_many_stones:citrine_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:citrine_budding", + recipe = "too_many_stones:citrine", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:covellite", + recipe = "too_many_stones:covellite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:covellite_cracked_brick", + recipe = "too_many_stones:covellite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:crocoite_cracked_brick", + recipe = "too_many_stones:crocoite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:crocoite_budding", + recipe = "too_many_stones:crocoite", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:diorite", + recipe = "too_many_stones:diorite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:diorite_cracked_brick", + recipe = "too_many_stones:diorite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:erythrite_cracked_brick", + recipe = "too_many_stones:erythrite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:eudialite_cracked_brick", + recipe = "too_many_stones:eudialite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:eudialite_budding", + recipe = "too_many_stones:eudialite", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:fluorite_cracked_brick", + recipe = "too_many_stones:fluorite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:gabbro", + recipe = "too_many_stones:gabbro_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:gabbro_cracked_brick", + recipe = "too_many_stones:gabbro_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:galena_cracked_brick", + recipe = "too_many_stones:galena_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_black", + recipe = "too_many_stones:granite_black_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_black_cracked_brick", + recipe = "too_many_stones:granite_black_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_blue", + recipe = "too_many_stones:granite_blue_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_blue_cracked_brick", + recipe = "too_many_stones:granite_blue_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_gray", + recipe = "too_many_stones:granite_gray_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_gray_cracked_brick", + recipe = "too_many_stones:granite_gray_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_green", + recipe = "too_many_stones:granite_green_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_green_cracked_brick", + recipe = "too_many_stones:granite_green_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_pink", + recipe = "too_many_stones:granite_pink_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_pink_cracked_brick", + recipe = "too_many_stones:granite_pink_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_red", + recipe = "too_many_stones:granite_red_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_red_cracked_brick", + recipe = "too_many_stones:granite_red_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_white", + recipe = "too_many_stones:granite_white_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_white_cracked_brick", + recipe = "too_many_stones:granite_white_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_yellow", + recipe = "too_many_stones:granite_yellow_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:granite_yellow_cracked_brick", + recipe = "too_many_stones:granite_yellow_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:heliodor_cracked_brick", + recipe = "too_many_stones:heliodor_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:heliodor_budding", + recipe = "too_many_stones:heliodor", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:howlite", + recipe = "too_many_stones:howlite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:howlite_cracked_brick", + recipe = "too_many_stones:howlite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:ilvaite", + recipe = "too_many_stones:ilvaite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:ilvaite_cracked_brick", + recipe = "too_many_stones:ilvaite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:jade", + recipe = "too_many_stones:jade_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:jade_cracked_brick", + recipe = "too_many_stones:jade_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:jasper_red", + recipe = "too_many_stones:jasper_red_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:jasper_red_cracked_brick", + recipe = "too_many_stones:jasper_red_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:kyanite", + recipe = "too_many_stones:kyanite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:kyanite_cracked_brick", + recipe = "too_many_stones:kyanite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:kyanite_budding", + recipe = "too_many_stones:kyanite", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:lapis_lazuli_cracked_brick", + recipe = "too_many_stones:lapis_lazuli_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:lepidolite", + recipe = "too_many_stones:lepidolite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:lepidolite_cracked_brick", + recipe = "too_many_stones:lepidolite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:limestone_blue", + recipe = "too_many_stones:limestone_blue_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:limestone_blue_cracked_brick", + recipe = "too_many_stones:limestone_blue_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:limestone_white", + recipe = "too_many_stones:limestone_white_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:limestone_white_cracked_brick", + recipe = "too_many_stones:limestone_white_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:marble", + recipe = "too_many_stones:marble_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:marble_cracked_brick", + recipe = "too_many_stones:marble_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:moonstone_budding", + recipe = "too_many_stones:moonstone", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:moonstone_cracked_brick", + recipe = "too_many_stones:moonstone_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:morion_quartz_budding", + recipe = "too_many_stones:morion_quartz", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:morion_quartz_cracked_brick", + recipe = "too_many_stones:morion_quartz_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:mudstone", + recipe = "too_many_stones:mudstone_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:mudstone_cracked_brick", + recipe = "too_many_stones:mudstone_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:prasiolite_cracked_brick", + recipe = "too_many_stones:prasiolite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:prasiolite_budding", + recipe = "too_many_stones:prasiolite", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:pumice_cracked_brick", + recipe = "too_many_stones:pumice_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:pyrite_cracked_brick", + recipe = "too_many_stones:pyrite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:quartz_cracked_brick", + recipe = "too_many_stones:quartz_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:quartz_budding", + recipe = "too_many_stones:quartz", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:rhodonite", + recipe = "too_many_stones:rhodonite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:rhodonite_cracked_brick", + recipe = "too_many_stones:rhodonite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:rose_quartz_cracked_brick", + recipe = "too_many_stones:rose_quartz_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:rose_quartz_budding", + recipe = "too_many_stones:rose_quartz", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:scoria", + recipe = "too_many_stones:scoria_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:scoria_cracked_brick", + recipe = "too_many_stones:scoria_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:serpentine", + recipe = "too_many_stones:serpentine_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:serpentine_cracked_brick", + recipe = "too_many_stones:serpentine_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:shale", + recipe = "too_many_stones:shale_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:shale_cracked_brick", + recipe = "too_many_stones:shale_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:slate", + recipe = "too_many_stones:slate_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:slate_cracked_brick", + recipe = "too_many_stones:slate_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:smokey_quartz_cracked_brick", + recipe = "too_many_stones:smokey_quartz_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:smokey_quartz_budding", + recipe = "too_many_stones:smokey_quartz", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:soapstone_cracked_brick", + recipe = "too_many_stones:soapstone_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:sodalite", + recipe = "too_many_stones:sodalite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:sodalite_cracked_brick", + recipe = "too_many_stones:sodalite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:sugilite", + recipe = "too_many_stones:sugilite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:sugilite_cracked_brick", + recipe = "too_many_stones:sugilite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tourmaline_green_cracked_brick", + recipe = "too_many_stones:tourmaline_green_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tourmaline_green_budding", + recipe = "too_many_stones:tourmaline_green", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tourmaline_paraiba_cracked_brick", + recipe = "too_many_stones:tourmaline_paraiba_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tourmaline_paraiba_budding", + recipe = "too_many_stones:tourmaline_paraiba", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tourmaline_pink_cracked_brick", + recipe = "too_many_stones:tourmaline_pink_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tourmaline_pink_budding", + recipe = "too_many_stones:tourmaline_pink", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:travertine", + recipe = "too_many_stones:travertine_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:travertine_cracked_brick", + recipe = "too_many_stones:travertine_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:travertine_yellow", + recipe = "too_many_stones:travertine_yellow_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:travertine_yellow_cracked_brick", + recipe = "too_many_stones:travertine_yellow_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tuff_beige", + recipe = "too_many_stones:tuff_beige_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tuff_beige_cracked_brick", + recipe = "too_many_stones:tuff_beige_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tuff_grey", + recipe = "too_many_stones:tuff_grey_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tuff_grey_cracked_brick", + recipe = "too_many_stones:tuff_grey_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tuff_red", + recipe = "too_many_stones:tuff_red_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:tuff_red_cracked_brick", + recipe = "too_many_stones:tuff_red_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:turquoise", + recipe = "too_many_stones:turquoise_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:turquoise_cracked_brick", + recipe = "too_many_stones:turquoise_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:vivianite_cracked_brick", + recipe = "too_many_stones:vivianite_brick", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:vivianite_budding", + recipe = "too_many_stones:vivianite", +}) + +-- Various Stone Group Recipes + +minetest.register_craft({ + output = "too_many_stones:batch", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "group:limestone", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:lapis_lazuli", + recipe = { + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "too_many_stones:pyrite", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + } +}) + +if minetest.get_modpath("dye") ~= nil then + +minetest.register_craft({ + output = "dye:black 9", + recipe = { + {"group:black_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:blue 9", + recipe = { + {"group:blue_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:brown 9", + recipe = { + {"group:brown_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:cyan 9", + recipe = { + {"group:cyan_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:dark_green 9", + recipe = { + {"group:dark_green_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:dark_grey 9", + recipe = { + {"group:dark_grey_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:green 9", + recipe = { + {"group:green_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:grey 9", + recipe = { + {"group:grey_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:magenta 9", + recipe = { + {"group:magenta_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:orange 9", + recipe = { + {"group:orange_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:pink 9", + recipe = { + {"group:pink_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:red 9", + recipe = { + {"group:red_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:violet 9", + recipe = { + {"group:violet_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:white 9", + recipe = { + {"group:white_stone"}, + } +}) + +minetest.register_craft({ + output = "dye:yellow 9", + recipe = { + {"group:yellow_stone"}, + } +}) + +-- Agate + +minetest.register_craft({ + output = "too_many_stones:agate_blue 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:blue", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:agate_gray 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:grey", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:agate_green 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:green", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:agate_moss 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:dark_green", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:agate_orange 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:orange", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:agate_purple 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:violet", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:agate_red 8", + recipe = { + {"group:agate", "group:agate", "group:agate"}, + {"group:agate", "dye:red", "group:agate"}, + {"group:agate", "group:agate", "group:agate"}, + } +}) + +-- Quartz + +minetest.register_craft({ + output = "too_many_stones:amethyst 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:violet", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:citrine 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:yellow", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:morion_quartz 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:black", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:prasiolite 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:dark_green", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:quartz 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:white", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:rose_quartz 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:pink", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:smokey_quartz 8", + recipe = { + {"group:quartz", "group:quartz", "group:quartz"}, + {"group:quartz", "dye:brown", "group:quartz"}, + {"group:quartz", "group:quartz", "group:quartz"}, + } +}) + +-- Opal + +minetest.register_craft({ + output = "too_many_stones:black_opal 8", + recipe = { + {"group:opal", "group:opal", "group:opal"}, + {"group:opal", "dye:green", "group:opal"}, + {"group:opal", "group:opal", "group:opal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:fire_opal 8", + recipe = { + {"group:opal", "group:opal", "group:opal"}, + {"group:opal", "dye:orange", "group:opal"}, + {"group:opal", "group:opal", "group:opal"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:opal 8", + recipe = { + {"group:opal", "group:opal", "group:opal"}, + {"group:opal", "dye:cyan", "group:opal"}, + {"group:opal", "group:opal", "group:opal"}, + } +}) + +-- Granite + +minetest.register_craft({ + output = "too_many_stones:granite_black 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:black", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_blue 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:blue", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_gray 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:grey", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_green 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:dark_green", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_pink 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:pink", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_red 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:red", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_white 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:white", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:granite_yellow 8", + recipe = { + {"group:granite", "group:granite", "group:granite"}, + {"group:granite", "dye:yellow", "group:granite"}, + {"group:granite", "group:granite", "group:granite"}, + } +}) + +-- Glow Stones + +minetest.register_craft({ + output = "too_many_stones:glow_apatite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:violet", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_calcite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:red", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_esperite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:yellow", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_fluorite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:blue", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_selenite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:cyan", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_sodalite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:orange", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_willemite 8", + recipe = { + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + {"group:glow_stone", "dye:green", "group:glow_stone"}, + {"group:glow_stone", "group:glow_stone", "group:glow_stone"}, + } +}) + +-- Dyed stones to represent how many fakes are made + +minetest.register_craft({ + output = "too_many_stones:turquoise 8", + recipe = { + {"too_many_stones:howlite", "too_many_stones:howlite", "too_many_stones:howlite"}, + {"too_many_stones:howlite", "dye:cyan", "too_many_stones:howlite"}, + {"too_many_stones:howlite", "too_many_stones:howlite", "too_many_stones:howlite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:sugilite 8", + recipe = { + {"too_many_stones:serpentine", "too_many_stones:serpentine", "too_many_stones:serpentine"}, + {"too_many_stones:serpentine", "dye:violet", "too_many_stones:serpentine"}, + {"too_many_stones:serpentine", "too_many_stones:serpentine", "too_many_stones:serpentine"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:travertine_yellow 8", + recipe = { + {"too_many_stones:travertine", "too_many_stones:travertine", "too_many_stones:travertine"}, + {"too_many_stones:travertine", "dye:yellow", "too_many_stones:travertine"}, + {"too_many_stones:travertine", "too_many_stones:travertine", "too_many_stones:travertine"}, + } +}) + +end + +if minetest.get_modpath("default") ~= nil then + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "too_many_stones:batch", +}) + +minetest.register_craft({ + output = "too_many_stones:glow_calcite 8", + recipe = { + {"group:calcite", "group:calcite", "group:calcite"}, + {"group:calcite", "default:mese_shard", "group:calcite"}, + {"group:calcite", "group:calcite", "group:calcite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_fluorite 8", + recipe = { + {"too_many_stones:fluorite", "too_many_stones:fluorite", "too_many_stones:fluorite"}, + {"too_many_stones:fluorite", "default:mese_shard", "too_many_stones:fluorite"}, + {"too_many_stones:fluorite", "too_many_stones:fluorite", "too_many_stones:fluorite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_sodalite 8", + recipe = { + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "default:mese_shard", "too_many_stones:sodalite"}, + {"too_many_stones:sodalite", "too_many_stones:sodalite", "too_many_stones:sodalite"}, + } +}) + +end diff --git a/mods/too_many_stones/flowstones.lua b/mods/too_many_stones/flowstones.lua new file mode 100644 index 00000000..70a3675b --- /dev/null +++ b/mods/too_many_stones/flowstones.lua @@ -0,0 +1,96 @@ +-- mods/too_many_stones/flowstones.lua + +-- support for MT game translation. +local S = minetest.get_translator("too_many_stones") + +function too_many_stones.register_flowstone(stone_name, description, texture1, texture2, texture3, texture4, groups) + -- Attempt to deserialize the provided groups string + local node_groups = groups + + -- Check if deserialization failed and use a default group table if so + if not node_groups then + node_groups = {cracky = 3, attached_node = 1, grey_stone = 1, stone = 1, flowstone = 1} + end + + -- Register 8 flowstone nodes + for i = 1, 8 do + local node_name = "too_many_stones:" .. stone_name .. "_flowstone_" .. i + local node_description = S(description .. " Pointed Flowstone") + local node_texture + + -- Assign textures for each variant + if i <= 4 then + -- First four use the provided textures + node_texture = "tms_" .. stone_name .. "_flowstone_" .. i .. ".png" + else + -- Last four use mirrored textures of the first four + local mirrored_index = i - 4 + node_texture = "tms_" .. stone_name .. "_flowstone_" .. mirrored_index .. ".png^[transformFY" + end + + minetest.register_node(node_name, { + description = node_description, + drawtype = "plantlike", + tiles = {node_texture}, + use_texture_alpha = "clip", + sunlight_propagates = true, + paramtype = "light", + groups = node_groups, + drop = "too_many_stones:" .. stone_name .. "_flowstone_8", + sounds = too_many_stones.node_sound_stone_defaults(), + is_ground_content = false, + }) + end +end + +-- Register Flowstones: +too_many_stones.register_flowstone( + "limestone_blue", + "Blue Limestone", + "tms_limestone_blue_flowstone_1.png", + "tms_limestone_blue_flowstone_2.png", + "tms_limestone_blue_flowstone_3.png", + "tms_limestone_blue_flowstone_4.png", + {limestone = 1, cracky = 3, attached_node = 1, grey_stone = 1, stone = 1, flowstone = 1} +) + +too_many_stones.register_flowstone( + "limestone_white", + "White Limestone", + "tms_limestone_white_flowstone_1.png", + "tms_limestone_white_flowstone_2.png", + "tms_limestone_white_flowstone_3.png", + "tms_limestone_white_flowstone_4.png", + {limestone = 1, cracky = 3, attached_node = 1, white_stone = 1, stone = 1, flowstone = 1} +) + +too_many_stones.register_flowstone( + "travertine", + "Travertine", + "tms_travertine_flowstone_1.png", + "tms_travertine_flowstone_2.png", + "tms_travertine_flowstone_3.png", + "tms_travertine_flowstone_4.png", + {limestone = 1, cracky = 3, attached_node = 1, yellow_stone = 1, stone = 1, flowstone = 1} +) + + +too_many_stones.register_flowstone( + "travertine_yellow", + "Yellow Travertine", + "tms_travertine_yellow_flowstone_1.png", + "tms_travertine_yellow_flowstone_2.png", + "tms_travertine_yellow_flowstone_3.png", + "tms_travertine_yellow_flowstone_4.png", + {limestone = 1, cracky = 3, attached_node = 1, yellow_stone = 1, stone = 1, flowstone = 1} +) + +too_many_stones.register_flowstone( + "geyserite", + "Geyserite", + "tms_geyserite_flowstone_1.png", + "tms_geyserite_flowstone_2.png", + "tms_geyserite_flowstone_3.png", + "tms_geyserite_flowstone_4.png", + {limestone = 1, cracky = 3, attached_node = 1, grey_stone = 1, stone = 1, flowstone = 1} +) diff --git a/mods/too_many_stones/geodes.lua b/mods/too_many_stones/geodes.lua new file mode 100644 index 00000000..ac6ad4a5 --- /dev/null +++ b/mods/too_many_stones/geodes.lua @@ -0,0 +1,61 @@ +if minetest.get_modpath("geodes") and minetest.get_modpath("default") ~= nil then + +geodes.register_geode("too_many_stones:limestone_white", "too_many_stones:calcite_grey", "too_many_stones:agate_blue", "too_many_stones:agate_blue", "too_many_stones:agate_blue") + +geodes.register_geode("too_many_stones:pumice", "too_many_stones:calcite_grey", "too_many_stones:agate_gray", "too_many_stones:agate_gray", "too_many_stones:agate_gray") + +geodes.register_geode("too_many_stones:basalt", "too_many_stones:calcite", "too_many_stones:agate_green", "too_many_stones:agate_green", "too_many_stones:agate_green") + +geodes.register_geode("too_many_stones:mudstone", "too_many_stones:calcite", "too_many_stones:agate_moss", "too_many_stones:agate_moss", "too_many_stones:agate_moss") + +geodes.register_geode("too_many_stones:limestone_blue", "too_many_stones:calcite_orange", "too_many_stones:agate_orange", "too_many_stones:agate_orange", "too_many_stones:agate_orange") + +geodes.register_geode("too_many_stones:gabbro", "too_many_stones:calcite_grey", "too_many_stones:agate_purple", "too_many_stones:agate_purple", "too_many_stones:agate_purple") + +geodes.register_geode("too_many_stones:limestone_white", "too_many_stones:calcite", "too_many_stones:agate_red", "too_many_stones:agate_red", "too_many_stones:agate_red") + +geodes.register_geode("too_many_stones:travertine", "too_many_stones:calcite", "too_many_stones:black_opal", "too_many_stones:black_opal") + +geodes.register_geode("too_many_stones:basalt", "too_many_stones:calcite", "too_many_stones:fire_opal", "too_many_stones:fire_opal") + +geodes.register_geode("too_many_stones:mudstone", "too_many_stones:calcite", "too_many_stones:amazonite", "too_many_stones:amazonite_crystal") + +geodes.register_geode("too_many_stones:gabbro", "too_many_stones:calcite_grey", "too_many_stones:amethyst", "too_many_stones:amethyst_crystal") + +geodes.register_geode("too_many_stones:basalt", "too_many_stones:calcite_grey", "too_many_stones:chalcanthite", "too_many_stones:chalcanthite_crystal") + +geodes.register_geode("too_many_stones:basalt", "too_many_stones:calcite", "too_many_stones:citrine", "too_many_stones:citrine_crystal") + +geodes.register_geode("too_many_stones:basalt", "too_many_stones:calcite_orange", "too_many_stones:crocoite", "too_many_stones:crocoite_crystal") + +geodes.register_geode("too_many_stones:mudstone", "too_many_stones:calcite", "too_many_stones:eudialite", "too_many_stones:eudialite_crystal") + +geodes.register_geode("too_many_stones:mudstone", "too_many_stones:calcite", "too_many_stones:kyanite", "too_many_stones:kyanite_crystal") + +geodes.register_geode("too_many_stones:limestone_white", "too_many_stones:calcite_grey", "too_many_stones:moonstone", "too_many_stones:moonstone_crystal") + +geodes.register_geode("too_many_stones:travertine", "too_many_stones:calcite", "too_many_stones:rose_quartz", "too_many_stones:rose_quartz_crystal") + +geodes.register_geode("too_many_stones:serpentine", "too_many_stones:calcite", "too_many_stones:smokey_quartz", "too_many_stones:smokey_quartz_crystal") + +geodes.register_geode("too_many_stones:serpentine", "too_many_stones:calcite_grey", "too_many_stones:tourmaline_green", "too_many_stones:tourmaline_green_crystal") + +geodes.register_geode("too_many_stones:granite_pink", "too_many_stones:calcite_grey", "too_many_stones:tourmaline_paraiba", "too_many_stones:tourmaline_paraiba_crystal") + +geodes.register_geode("too_many_stones:serpentine", "too_many_stones:calcite", "too_many_stones:tourmaline_pink", "too_many_stones:tourmaline_pink_crystal") + +geodes.register_geode("too_many_stones:travertine", "too_many_stones:calcite_grey", "too_many_stones:vivianite", "too_many_stones:vivianite_crystal") + +geodes.register_geode("too_many_stones:travertine", "too_many_stones:calcite_grey", "too_many_stones:opal", "too_many_stones:opal") + +geodes.register_geode("too_many_stones:serpentine", "too_many_stones:calcite", "too_many_stones:heliodor", "too_many_stones:heliodor_crystal") + +geodes.register_geode("too_many_stones:pumice", "too_many_stones:calcite_grey", "too_many_stones:celestine", "too_many_stones:celestine_crystal") + +geodes.register_geode("too_many_stones:pumice", "too_many_stones:calcite_grey", "too_many_stones:quartz", "too_many_stones:quartz_crystal") + +geodes.register_geode("too_many_stones:limestone_white", "too_many_stones:calcite_grey", "too_many_stones:prasiolite", "too_many_stones:prasiolite_crystal") + +geodes.register_geode("too_many_stones:travertine_yellow", "too_many_stones:calcite_grey", "too_many_stones:morion_quartz", "too_many_stones:morion_quartz_crystal") + +end diff --git a/mods/too_many_stones/geodes_lib.lua b/mods/too_many_stones/geodes_lib.lua new file mode 100644 index 00000000..58d7b946 --- /dev/null +++ b/mods/too_many_stones/geodes_lib.lua @@ -0,0 +1,412 @@ + +-- Geodes for most games + +if minetest.get_modpath("geodes_lib") ~= nil then + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_blue", + core_alt = "too_many_stones:agate_blue", + core_alt_chance = 100, + shell = {"too_many_stones:limestone_white", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_gray", + core_alt = "too_many_stones:agate_gray", + core_alt_chance = 100, + shell = {"too_many_stones:pumice", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_green", + core_alt = "too_many_stones:agate_green", + core_alt_chance = 100, + shell = {"too_many_stones:basalt", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_moss", + core_alt = "too_many_stones:agate_moss", + core_alt_chance = 100, + shell = {"too_many_stones:mudstone", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_orange", + core_alt = "too_many_stones:agate_orange", + core_alt_chance = 100, + shell = {"too_many_stones:limestone_blue", "too_many_stones:calcite_orange"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_purple", + core_alt = "too_many_stones:agate_purple", + core_alt_chance = 100, + shell = {"too_many_stones:gabbro", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:agate_red", + core_alt = "too_many_stones:agate_red", + core_alt_chance = 100, + shell = {"too_many_stones:limestone_white", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:black_opal", + core_alt = "too_many_stones:black_opal", + core_alt_chance = 100, + shell = {"too_many_stones:travertine", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:fire_opal", + core_alt = "too_many_stones:fire_opal", + core_alt_chance = 100, + shell = {"too_many_stones:basalt", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:amazonite", + core_alt = "too_many_stones:amazonite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:mudstone", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:amethyst", + core_alt = "too_many_stones:amethyst_budding", + core_alt_chance = 100, + shell = {"too_many_stones:gabbro", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:chalcanthite", + core_alt = "too_many_stones:chalcanthite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:basalt", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:citrine", + core_alt = "too_many_stones:citrine_budding", + core_alt_chance = 100, + shell = {"too_many_stones:basalt", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:crocoite", + core_alt = "too_many_stones:crocoite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:basalt", "too_many_stones:calcite_orange"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:eudialite", + core_alt = "too_many_stones:eudialite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:mudstone", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:kyanite", + core_alt = "too_many_stones:kyanite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:mudstone", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:moonstone", + core_alt = "too_many_stones:moonstone_budding", + core_alt_chance = 100, + shell = {"too_many_stones:limestone_white", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:rose_quartz", + core_alt = "too_many_stones:rose_quartz_budding", + core_alt_chance = 100, + shell = {"too_many_stones:travertine", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:smokey_quartz", + core_alt = "too_many_stones:smokey_quartz_budding", + core_alt_chance = 100, + shell = {"too_many_stones:serpentine", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:tourmaline_green", + core_alt = "too_many_stones:tourmaline_green_budding", + core_alt_chance = 100, + shell = {"too_many_stones:serpentine", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:tourmaline_paraiba", + core_alt = "too_many_stones:tourmaline_paraiba_budding", + core_alt_chance = 100, + shell = {"too_many_stones:granite_pink", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:tourmaline_pink", + core_alt = "too_many_stones:tourmaline_pink_budding", + core_alt_chance = 100, + shell = {"too_many_stones:serpentine", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:vivianite", + core_alt = "too_many_stones:vivianite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:travertine", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:opal", + core_alt = "too_many_stones:opal", + core_alt_chance = 100, + shell = {"too_many_stones:travertine", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:heliodor", + core_alt = "too_many_stones:heliodor_budding", + core_alt_chance = 100, + shell = {"too_many_stones:serpentine", "too_many_stones:calcite"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:celestine", + core_alt = "too_many_stones:celestine_budding", + core_alt_chance = 100, + shell = {"too_many_stones:pumice", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:quartz", + core_alt = "too_many_stones:quartz_budding", + core_alt_chance = 100, + shell = {"too_many_stones:pumice", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:prasiolite", + core_alt = "too_many_stones:prasiolite_budding", + core_alt_chance = 100, + shell = {"too_many_stones:limestone_white", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +geodes_lib:register_geode({ + wherein = "mapgen_stone", + y_min = -31000, + y_max = -10, + scarcity = 80, + core = "too_many_stones:morion_quartz", + core_alt = "too_many_stones:morion_quartz_budding", + core_alt_chance = 100, + shell = {"too_many_stones:travertine_yellow", "too_many_stones:calcite_grey"}, + radius_min = 2, + radius_max = 10, + generation_chance = 10, +}) + +end diff --git a/mods/too_many_stones/init.lua b/mods/too_many_stones/init.lua new file mode 100644 index 00000000..383689f5 --- /dev/null +++ b/mods/too_many_stones/init.lua @@ -0,0 +1,38 @@ +-- Minetest 5.3 mod: too many stones +-- See README.txt for licensing and other information. + +-- Definitions made by this mod that other mods can use too +too_many_stones = {} + +local S = minetest.get_translator("too_many_stones") + +-- Mod support +too_many_stones.mods = (function() + local mods = {} + for _,mod in ipairs({ + "default", + "everness", + "naturalbiomes", + "dorwinion", + "asuna_core", + "base_earth", + }) do + mods[mod] = minetest.get_modpath(mod) ~= nil + end + return mods +end)() + +-- Load files +local tms_path = minetest.get_modpath("too_many_stones") + +dofile(tms_path .. "/sounds.lua") +dofile(tms_path .. "/nodes.lua") +dofile(tms_path .. "/crafting.lua") +dofile(tms_path .. "/mapgen.lua") +dofile(tms_path .. "/wall.lua") +dofile(tms_path .. "/stairs.lua") +dofile(tms_path .. "/geodes.lua") +dofile(tms_path .. "/geodes_lib.lua") +dofile(tms_path .. "/nodes_glowing.lua") +dofile(tms_path .. "/nodes_crystal.lua") +--dofile(tms_path .. "/flowstones.lua") diff --git a/mods/too_many_stones/locale/template.txt b/mods/too_many_stones/locale/template.txt new file mode 100644 index 00000000..b6cdab57 --- /dev/null +++ b/mods/too_many_stones/locale/template.txt @@ -0,0 +1,2471 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate= +Gray Agate= +Green Agate= +Moss Agate= +Orange Agate= +Purple Agate= +Red Agate= + +Amazonite= +Amazonite Block= +Cobbled Amazonite= +Amazonite Brick= +Cracked Amazonite Brick= + +Amber= +Amber Block= +Amber Brick= +Cracked Amber Brick= + +Amethyst= +Amethyst Block= +Amethyst Brick= +Cracked Amethyst Brick= + +Andesite= +Andesite Block= +Andesite Brick= +Cracked Andesite Brick= +Cobbled Andesite= + +Basalt= +Basalt Block= +Basalt Brick= +Cracked Basalt Brick= +Cobbled Basalt= +Basalt Tile= + +Columnar Basalt= + +Batch= + +Black Moonstone= +Black Moonstone Block= +Black Moonstone Brick= +Cracked Black Moonstone Brick= + +Black Opal= + +Calcite= +Calcite Block= +Calcite Brick= +Cracked Calcite Brick= + +Grey Calcite= +Grey Calcite Block= +Grey Calcite Brick= +Cracked Grey Calcite Brick= + +Orange Calcite= +Orange Calcite Block= +Orange Calcite Brick= +Cracked Orange Calcite Brick= + +Carnotite= +Carnotite Block= +Carnotite Brick= +Cracked Carnotite Brick= +Cobbled Carnotite= + +Celestine= +Celestine Block= +Celestine Brick= +Cracked Celestine Brick= + +Chalcanthite= +Chalcanthite Block= +Chalcanthite Brick= +Cracked Chalcanthite Brick= +Cobbled Chalcanthite= + +Chrysoprase= +Chrysoprase Block= +Chrysoprase Brick= +Cracked Chrysoprase Brick= + +Citrine= +Citrine Block= +Citrine Brick= +Cracked Citrine Brick= + +Covellite= +Covellite Block= +Covellite Brick= +Cracked Covellite Brick= +Cobbled Covellite= + +Crocoite= +Crocoite Block= +Crocoite Brick= +Cracked Crocoite Brick= + +Diorite= +Diorite Block= +Diorite Brick= +Cracked Diorite Brick= +Cobbled Diorite= + +Erythrite= +Erythrite Block= +Erythrite Brick= +Cracked Erythrite Brick= + +Eudialite= +Eudialite Block= +Eudialite Brick= +Cracked Eudialite Brick= + +Fluorite= +Fluorite Block= +Fluorite Brick= +Cracked Fluorite Brick= + +Fire Opal= + +Gabbro= +Gabbro Block= +Cobbled Gabbro= +Gabbro Brick= +Cracked Gabbro Brick= + +Galena= +Galena Block= +Galena Brick= +Cracked Galena Brick= + +Black Granite= +Black Granite Block= +Black Granite Brick= +Cracked Black Granite Brick= +Cobbled Black Granite= + +Blue Granite= +Blue Granite Block= +Blue Granite Brick= +Cracked Blue Granite Brick= +Cobbled Blue Granite= + +Gray Granite= +Gray Granite Block= +Gray Granite Brick= +Cracked Gray Granite Brick= +Cobbled Gray Granite= + +Green Granite= +Green Granite Block= +Green Granite Brick= +Cracked Green Granite Brick= +Cobbled Green Granite= + +Pink Granite= +Pink Granite Block= +Pink Granite Brick= +Cracked Pink Granite Brick= +Cobbled Pink Granite= + +Red Granite= +Red Granite Block= +Red Granite Brick= +Cracked Red Granite Brick= +Cobbled Red Granite= + +White Granite= +White Granite Block= +White Granite Brick= +Cracked White Granite Brick= +Cobbled White Granite= + +Yellow Granite= +Yellow Granite Block= +Yellow Granite Brick= +Cracked Yellow Granite Brick= +Cobbled Yellow Granite= + +Heliodor= +Heliodor Block= +Heliodor Brick= +Cracked Heliodor Brick= + +Howlite= +Howlite Block= +Howlite Brick= +Cracked Howlite Brick= +Cobbled Howlite= + +Ilvaite= +Ilvaite Block= +Ilvaite Brick= +Cracked Ilvaite Brick= +Cobbled Ilvaite= + +Jade= +Jade Block= +Jade Brick= +Cracked Jade Brick= +Cobbled Jade= + +Red Jasper= +Red Jasper Block= +Red Jasper Brick= +Cracked Red Jasper Brick= +Cobbled Red Jasper= + +Kyanite= +Kyanite Block= +Kyanite Brick= +Cracked Kyanite Brick= +Cobbled Kyanite= + +Lapis Lazuli= +Lapis Lazuli Block= +Lapis Lazuli Brick= +Cracked Lapis Lazuli Brick= + +Lepidolite= +Lepidolite Block= +Lepidolite Brick= +Cracked Lepidolite Brick= +Cobbled Lepidolite= + +Blue Limestone= +Blue Limestone Block= +Blue Limestone Brick= +Cracked Blue Limestone Brick= +Cobbled Blue Limestone= + +White Limestone= +White Limestone Block= +White Limestone Brick= +Cracked White Limestone Brick= +Cobbled White Limestone= + +Marble= +Marble Block= +Marble Brick= +Cracked Marble Brick= +Cobbled Marble= + +Moonstone= +Moonstone Block= +Moonstone Brick= +Cracked Moonstone Brick= + +Morion Quartz= +Morion Quartz Block= +Morion Quartz Brick= +Cracked Morion Quartz Brick= + +Mudstone= +Mudstone Block= +Cobbled Mudstone= +Mudstone Brick= +Cracked Mudstone Brick= + +Opal= + +Prasiolite= +Prasiolite Block= +Prasiolite Brick= +Cracked Prasiolite Brick= + +Pumice= +Pumice Block= +Pumice Brick= +Cracked Pumice Brick= + +Pyrite= +Pyrite Block= +Cobbled Pyrite= +Pyrite Brick= +Cracked Pyrite Brick= + +Quartz= +Quartz Block= +Quartz Brick= +Cracked Quartz Brick= + +Rhodonite= +Rhodonite Block= +Rhodonite Brick= +Cracked Rhodonite Brick= +Cobbled Rhodonite= + +Rose Quartz= +Rose Quartz Block= +Rose Quartz Brick= +Cracked Rose Quartz Brick= + +Scoria= +Scoria Block= +Scoria Brick= +Cracked Scoria Brick= +Cobbled Scoria= + +Serpentine= +Serpentine Block= +Cobbled Serpentine= +Serpentine Brick= +Cracked Serpentine Brick= + +Shale= +Shale Block= +Shale Brick= +Cracked Shale Brick= +Cobbled Shale= + +Slate= +Slate Block= +Slate Brick= +Cracked Slate Brick= +Cobbled Slate= +Slate Tile= + +Smokey Quartz= +Smokey Quartz Block= +Smokey Quartz Brick= +Cracked Smokey Quartz Brick= + +Soapstone= +Soapstone Block= +Soapstone Brick= +Cracked Soapstone Brick= + +Sodalite= +Sodalite Block= +Cobbled Sodalite= +Sodalite Brick= +Cracked Sodalite Brick= + +Sugilite= +Sugilite Block= +Sugilite Brick= +Cracked Sugilite Brick= +Cobbled Sugilite= + +Green Tourmaline= +Green Tourmaline Block= +Green Tourmaline Brick= +Cracked Green Tourmaline Brick= + +Paraiba Tourmaline= +Paraiba Tourmaline Block= +Paraiba Tourmaline Brick= +Cracked Paraiba Tourmaline Brick= + +Pink Tourmaline= +Pink Tourmaline Block= +Pink Tourmaline Brick= +Cracked Pink Tourmaline Brick= + +Travertine= +Travertine Block= +Cobbled Travertine= +Travertine Brick= +Cracked Travertine Brick= + +Yellow Travertine= +Yellow Travertine Block= +Cobbled Yellow Travertine= +Yellow Travertine Brick= +Cracked Yellow Travertine Brick= + +Beige Tuff= +Beige Tuff Block= +Cobbled Beige Tuff= +Beige Tuff Brick= +Cracked Beige Tuff= + +Grey Tuff= +Grey Tuff Block= +Cobbled Grey Tuff= +Grey Tuff Brick= +Cracked Grey Tuff= + +Red Tuff= +Red Tuff Block= +Cobbled Red Tuff= +Red Tuff Brick= +Cracked Red Tuff= + +Turquoise= +Turquoise Block= +Turquoise Brick= +Cracked Turquoise Brick= +Cobbled Turquoise= +Turquoise Pebble= + +Vivianite= +Vivianite Block= +Vivianite Brick= +Cracked Vivianite Brick= + +### wall.lua ### + +Blue Agate Wall= +Gray Agate Wall= +Green Agate Wall= +Moss Agate Wall= +Orange Agate Wall= +Purple Agate Wall= +Red Agate Wall= + +Amazonite Wall= +Cobbled Amazonite Wall= +Amazonite Brick Wall= +Amazonite Block Wall= +Cracked Amazonite Brick Wall= + +Amber Wall= +Amber Brick Wall= +Amber Block Wall= +Cracked Amber Brick Wall= + +Amethyst Wall= +Amethyst Brick Wall= +Amethyst Block Wall= +Cracked Amethyst Brick Wall= + +Ammolite= + +Andesite Wall= +Andesite Block Wall= +Andesite Brick Wall= +Cracked Andesite Brick Wall= +Cobbled Andesite Wall= + +Basalt Wall= +Basalt Block Wall= +Basalt Brick Wall= +Cracked Basalt Brick Wall= +Cobbled Basalt Wall= +Basalt Tile Wall= + +Black Moonstone Wall= +Black Moonstone Brick Wall= +Black Moonstone Block Wall= +Cracked Black Moonstone Brick Wall= + +Calcite Wall= +Calcite Brick Wall= +Calcite Block Wall= +Cracked Calcite Brick Wall= + +Grey Calcite Wall= +Grey Calcite Brick Wall= +Grey Calcite Block Wall= +Cracked Grey Calcite Brick Wall= + +Orange Calcite Wall= +Orange Calcite Brick Wall= +Orange Calcite Block Wall= +Cracked Orange Calcite Brick Wall= + +Carnotite Wall= +Carnotite Brick Wall= +Carnotite Block Wall= +Cracked Carnotite Brick Wall= +Cobbled Carnotite Wall= + +Celestine Wall= +Celestine Brick Wall= +Celestine Block Wall= +Cracked Celestine Brick Wall= + +Chalcanthite Wall= +Chalcanthite Brick Wall= +Chalcanthite Block Wall= +Cracked Chalcanthite Brick Wall= +Cobbled Chalcanthite Wall= + +Chrysoprase Wall= +Chrysoprase Brick Wall= +Chrysoprase Block Wall= +Cracked Chrysoprase Brick Wall= + +Citrine Wall= +Citrine Brick Wall= +Citrine Block Wall= +Cracked Citrine Brick Wall= + +Covellite Wall= +Covellite Brick Wall= +Covellite Block Wall= +Cracked Covellite Brick Wall= +Cobbled Covellite Wall= + +Crocoite Wall= +Crocoite Brick Wall= +Crocoite Block Wall= +Cracked Crocoite Brick Wall= + +Diorite Wall= +Diorite Brick Wall= +Diorite Block Wall= +Cracked Diorite Brick Wall= +Cobbled Diorite Wall= + +Erythrite Wall= +Erythrite Brick Wall= +Erythrite Block Wall= +Cracked Erythrite Brick Wall= + +Eudialite Wall= +Eudialite Brick Wall= +Eudialite Block Wall= +Cracked Eudialite Brick Wall= + +Fluorite Wall= +Fluorite Brick Wall= +Fluorite Block Wall= +Cracked Fluorite Brick Wall= + +Gabbro Wall= +Cobbled Gabbro Wall= +Gabbro Brick Wall= +Gabbro Block Wall= +Cracked Gabbro Brick Wall= + +Galena Wall= +Galena Brick Wall= +Galena Block Wall= +Cracked Galena Brick Wall= + +Black Granite Wall= +Black Granite Brick Wall= +Black Granite Block Wall= +Cracked Black Granite Brick Wall= +Cobbled Black Granite Wall= + +Blue Granite Wall= +Blue Granite Brick Wall= +Blue Granite Block Wall= +Cracked Blue Granite Brick Wall= +Cobbled Blue Granite Wall= + +Gray Granite Wall= +Gray Granite Brick Wall= +Gray Granite Block Wall= +Cracked Gray Granite Brick Wall= +Cobble Gray Granite Wall= + +Green Granite Wall= +Green Granite Brick Wall= +Green Granite Block Wall= +Cracked Green Granite Brick Wall= +Cobbled Green Granite Wall= + +Pink Granite Wall= +Pink Granite Brick Wall= +Pink Granite Block Wall= +Cracked Pink Granite Brick Wall= +Cobbled Pink Granite Wall= + +Red Granite Wall= +Red Granite Brick Wall= +Red Granite Block Wall= +Cracked Red Granite Brick Wall= +Cobbled Red Granite Wall= + +White Granite Wall= +White Granite Brick Wall= +White Granite Block Wall= +Cracked White Granite Brick Wall= +Cobbled White Granite Wall= + +Yellow Granite Wall= +Yellow Granite Brick Wall= +Yellow Granite Block Wall= +Cracked Yellow Granite Brick Wall= +Cobbled Yellow Granite Wall= + +Heliodor Wall= +Heliodor Brick Wall= +Heliodor Block Wall= +Cracked Heliodor Brick Wall= + +Howlite Wall= +Howlite Brick Wall= +Howlite Block Wall= +Cracked Howlite Brick Wall= +Cobbled Howlite Wall= + +Ilvaite Wall= +Ilvaite Brick Wall= +Ilvaite Block Wall= +Cracked Ilvaite Brick Wall= +Cobbled Ilvaite Wall= + +Jade Wall= +Jade Brick Wall= +Jade Block Wall= +Cracked Jade Brick Wall= +Cobbled Jade Wall= + +Red Jasper Wall= +Red Jasper Brick Wall= +Red Jasper Block Wall= +Cracked Red Jasper Brick Wall= +Cobbled Red Jasper Wall= + +Kyanite Wall= +Kyanite Brick Wall= +Kyanite Block Wall= +Cracked Kyanite Brick Wall= +Cobbled Kyanite Wall= + +Lapis Lazuli Wall= +Lapis Lazuli Brick Wall= +Lapis Lazuli Block Wall= +Cracked Lapis Lazuli Brick Wall= + +Lepidolite Wall= +Lepidolite Brick Wall= +Lepidolite Block Wall= +Cracked Lepidolite Brick Wall= +Cobbled Lepidolite Wall= + +Blue Limestone Wall= +Blue Limestone Brick Wall= +Blue Limestone Block Wall= +Cracked Blue Limestone Brick Wall= +Cobbled Blue Limestone Wall= + +White Limestone Wall= +White Limestone Brick Wall= +White Limestone Block Wall= +Cracked White Limestone Brick Wall= +Cobbled White Limestone Wall= + +Marble Wall= +Marble Brick Wall= +Marble Block Wall= +Cracked Marble Brick Wall= +Cobbled Marble Wall= + +Moonstone Wall= +Moonstone Brick Wall= +Moonstone Block Wall= +Cracked Moonstone Brick Wall= + +Morion Quartz Wall= +Morion Quartz Brick Wall= +Morion Quartz Block Wall= +Cracked Morion Quartz Brick Wall= + +Mudstone Wall= +Cobbled Mudstone Wall= +Mudstone Brick Wall= +Mudstone Block Wall= +Cracked Mudstone Brick Wall= + +Prasiolite Wall= +Prasiolite Brick Wall= +Prasiolite Block Wall= +Cracked Prasiolite Brick Wall= + +Pumice Wall= +Pumice Brick Wall= +Pumice Block Wall= +Cracked Pumice Brick Wall= + +Pyrite Wall= +Pyrite Brick Wall= +Pyrite Block Wall= +Cracked Pyrite Brick Wall= + +Quartz Wall= +Quartz Brick Wall= +Quartz Block Wall= +Cracked Quartz Brick Wall= + +Rhodonite Wall= +Rhodonite Brick Wall= +Rhodonite Block Wall= +Cracked Rhodonite Brick Wall= +Cobbled Rhodonite Wall= + +Rose Quartz Wall= +Rose Quartz Brick Wall= +Rose Quartz Block Wall= +Cracked Rose Quartz Brick Wall= + +Scoria Wall= +Scoria Brick Wall= +Scoria Block Wall= +Cracked Scoria Brick Wall= +Cobbled Scoria Wall= + +Serpentine Wall= +Cobbled Serpentine Wall= +Serpentine Brick Wall= +Serpentine Block Wall= +Cracked Serpentine Brick Wall= + +Shale Wall= +Shale Brick Wall= +Shale Block Wall= +Cracked Shale Brick Wall= +Cobbled Shale Wall= + +Slate Wall= +Slate Brick Wall= +Slate Block Wall= +Cracked Slate Brick Wall= +Cobbled Slate Wall= +Slate Tile Wall= + +Smokey Quartz Wall= +Smokey Quartz Brick Wall= +Smokey Quartz Block Wall= +Cracked Smokey Quartz Brick Wall= + +Soapstone Wall= +Soapstone Brick Wall= +Soapstone Block Wall= +Cracked Soapstone Brick Wall= + +Sodalite Wall= +Cobbled Sodalite Wall= +Sodalite Brick Wall= +Sodalite Block Wall= +Cracked Sodalite Brick Wall= + +Sugilite Wall= +Sugilite Brick Wall= +Sugilite Block Wall= +Cracked Sugilite Brick Wall= +Cobbled Sugilite Wall= + +Green Tourmaline Wall= +Green Tourmaline Brick Wall= +Green Tourmaline Block Wall= +Cracked Green Tourmaline Brick Wall= + +Paraiba Tourmaline Wall= +Paraiba Tourmaline Brick Wall= +Paraiba Tourmaline Block Wall= +Cracked Paraiba Tourmaline Brick Wall= + +Pink Tourmaline Wall= +Pink Tourmaline Brick Wall= +Pink Tourmaline Block Wall= +Cracked Pink Tourmaline Brick Wall= + +Travertine Wall= +Cobbled Travertine Wall= +Travertine Brick Wall= +Travertine Block Wall= +Cracked Travertine Brick Wall= + +Yellow Travertine Wall= +Cobbled Yellow Travertine Wall= +Yellow Travertine Brick Wall= +Yellow Travertine Block Wall= +Cracked Yellow Travertine Brick Wall= + +Beige Tuff Wall= +Cobbled Beige Tuff Wall= +Beige Tuff Block Wall= +Beige Tuff Brick Wall= +Cracked Beige Tuff Brick Wall= + +Grey Tuff Wall= +Cobbled Grey Tuff Wall= +Grey Tuff Block Wall= +Grey Tuff Brick Wall= +Cracked Grey Tuff Brick Wall= + +Red Tuff Wall= +Cobbled Red Tuff Wall= +Red Tuff Block Wall= +Red Tuff Brick Wall= +Cracked Red Tuff Brick Wall= + +Turquoise Wall= +Turquoise Brick Wall= +Turquoise Block Wall= +Cracked Turquoise Brick Wall= +Cobbled Turquoise Wall= + +Vivianite Wall= +Vivianite Brick Wall= +Vivianite Block Wall= +Cracked Vivianite Brick Wall= + +### stairs.lua ### + +Blue Agate Slab= +Gray Agate Slab= +Green Agate Slab= +Moss Agate Slab= +Orange Agate Slab= +Purple Agate Slab= +Red Agate Slab= + +Amazonite Slab= +Cobbled Amazonite Slab= +Amazonite Brick Slab= +Amazonite Block Slab= +Cracked Amazonite Brick Slab= + +Amber Slab= +Amber Brick Slab= +Amber Block Slab= +Cracked Amber Brick Slab= + +Amethyst Slab= +Amethyst Brick Slab= +Amethyst Block Slab= +Cracked Amethyst Brick Slab= + +Andesite Slab= +Andesite Block Slab= +Cobbled Andesite Slab= +Andesite Brick Slab= +Cobbled Andesite Brick Slab= + +Basalt Slab= +Basalt Block Slab= +Basalt Brick Slab= +Cracked Basalt Brick Slab= +Cobbled Basalt Slab= +Basalt Tile Slab= + +Black Moonstone Slab= +Black Moonstone Brick Slab= +Black Moonstone Block Slab= +Cracked Black Moonstone Brick Slab= + +Calcite Slab= +Calcite Brick Slab= +Calcite Block Slab= +Cracked Calcite Brick Slab= + +Grey Calcite Slab= +Grey Calcite Brick Slab= +Grey Calcite Block Slab= +Cracked Grey Calcite Brick Slab= + +Orange Calcite Slab= +Orange Calcite Brick Slab= +Orange Calcite Block Slab= +Cracked Orange Calcite Brick Slab= + +Carnotite Slab= +Carnotite Brick Slab= +Carnotite Block Slab= +Cracked Carnotite Brick Slab= +Cobbled Carnotite Slab= + +Celestine Slab= +Celestine Brick Slab= +Celestine Block Slab= +Cracked Celestine Brick Slab= + +Chalcanthite Slab= +Chalcanthite Brick Slab= +Chalcanthite Block Slab= +Cracked Chalcanthite Brick Slab= +Cobbled Chalcanthite Slab= + +Chrysoprase Slab= +Chrysoprase Brick Slab= +Chrysoprase Block Slab= +Cracked Chrysoprase Brick Slab= + +Citrine Slab= +Citrine Brick Slab= +Citrine Block Slab= +Cracked Citrine Brick Slab= + +Covellite Slab= +Covellite Brick Slab= +Covellite Block Slab= +Cracked Covellite Brick Slab= +Cobbled Covellite Slab= + +Crocoite Slab= +Crocoite Brick Slab= +Crocoite Block Slab= +Cracked Crocoite Brick Slab= + +Diorite Slab= +Diorite Brick Slab= +Diorite Block Slab= +Cracked Diorite Brick Slab= +Cobbled Diorite Slab= + +Erythrite Slab= +Erythrite Brick Slab= +Erythrite Block Slab= +Cracked Erythrite Brick Slab= + +Eudialite Slab= +Eudialite Brick Slab= +Eudialite Block Slab= +Cracked Eudialite Brick Slab= + +Fluorite Slab= +Fluorite Brick Slab= +Fluorite Block Slab= +Cracked Fluorite Brick Slab= + +Gabbro Slab= +Cobbled Gabbro Slab= +Gabbro Brick Slab= +Gabbro Block Slab= +Cracked Gabbro Brick Slab= + +Galena Slab= +Galena Brick Slab= +Galena Block Slab= +Cracked Galena Brick Slab= + +Black Granite Slab= +Black Granite Brick Slab= +Black Granite Block Slab= +Cracked Black Granite Brick Slab= +Cobbled Black Granite Slab= + +Blue Granite Slab= +Blue Granite Brick Slab= +Blue Granite Block Slab= +Cracked Blue Granite Brick Slab= +Cobbled Blue Granite Slab= + +Gray Granite Slab= +Gray Granite Brick Slab= +Gray Granite Block Slab= +Cracked Gray Granite Brick Slab= +Cobbled Gray Granite Slab= + +Green Granite Slab= +Green Granite Brick Slab= +Green Granite Block Slab= +Cracked Green Granite Brick Slab= +Cobbled Green Granite Slab= + +Pink Granite Slab= +Pink Granite Brick Slab= +Pink Granite Block Slab= +Cracked Pink Granite Brick Slab= +Cobbled Pink Granite Slab= + +Red Granite Slab= +Red Granite Brick Slab= +Red Granite Block Slab= +Cracked Red Granite Brick Slab= +Cobbled Red Granite Slab= + +White Granite Slab= +White Granite Brick Slab= +White Granite Block Slab= +Cracked White Granite Brick Slab= +Cobbled White Granite Slab= + +Yellow Granite Slab= +Yellow Granite Brick Slab= +Yellow Granite Block Slab= +Cracked Yellow Granite Brick Slab= +Cobbled Yellow Granite Slab= + +Heliodor Slab= +Heliodor Brick Slab= +Heliodor Block Slab= +Cracked Heliodor Brick Slab= + +Howlite Slab= +Howlite Brick Slab= +Howlite Block Slab= +Cracked Howlite Brick Slab= +Cobbled Howlite Slab= + +Ilvaite Slab= +Ilvaite Brick Slab= +Ilvaite Block Slab= +Cracked Ilvaite Brick Slab= +Cobbled Ilvaite Slab= + +Jade Slab= +Jade Brick Slab= +Jade Block Slab= +Cracked Jade Brick Slab= +Cobbled Jade Slab= + +Red Jasper Slab= +Red Jasper Brick Slab= +Red Jasper Block Slab= +Cracked Red Jasper Brick Slab= +Cobbled Red Jasper Slab= + +Kyanite Slab= +Kyanite Brick Slab= +Kyanite Block Slab= +Cracked Kyanite Brick Slab= +Cobbled Kyanite Slab= + +Lapis Lazuli Slab= +Lapis Lazuli Brick Slab= +Lapis Lazuli Block Slab= +Cracked Lapis Lazuli Brick Slab= + +Lepidolite Slab= +Lepidolite Brick Slab= +Lepidolite Block Slab= +Cracked Lepidolite Brick Slab= +Cobbled Lepidolite Slab= + +Blue Limestone Slab= +Blue Limestone Brick Slab= +Blue Limestone Block Slab= +Cracked Blue Limestone Brick Slab= +Cobbled Blue Limestone Slab= + +White Limestone Slab= +White Limestone Brick Slab= +White Limestone Block Slab= +Cracked White Limestone Brick Slab= +Cobbled White Limestone Slab= + +Marble Slab= +Marble Brick Slab= +Marble Block Slab= +Cracked Marble Brick Slab= +Cobbled Marble Slab= + +Moonstone Slab= +Moonstone Brick Slab= +Moonstone Block Slab= +Cracked Moonstone Brick Slab= + +Morion Quartz Slab= +Morion Quartz Brick Slab= +Morion Quartz Block Slab= +Cracked Morion Quartz Brick Slab= + +Mudstone Slab= +Cobbled Mudstone Slab= +Mudstone Brick Slab= +Mudstone Block Slab= +Cracked Mudstone Brick Slab= + +Prasiolite Slab= +Cobbled Prasiolite Slab= +Prasiolite Brick Slab= +Prasiolite Block Slab= +Cracked Prasiolite Brick Slab= + +Pumice Slab= +Pumice Brick Slab= +Pumice Block Slab= +Cracked Pumice Brick Slab= + +Pyrite Slab= +Pyrite Brick Slab= +Pyrite Block Slab= +Cracked Pyrite Brick Slab= + +Quartz Slab= +Cobbled Quartz Slab= +Quartz Brick Slab= +Quartz Block Slab= +Cracked Quartz Brick Slab= + +Rhodonite Slab= +Rhodonite Brick Slab= +Rhodonite Block Slab= +Cracked Rhodonite Brick Slab= +Cobbled Rhodonite Slab= + +Rose Quartz Slab= +Rose Quartz Brick Slab= +Rose Quartz Block Slab= +Cracked Rose Quartz Brick Slab= + +Scoria Slab= +Scoria Brick Slab= +Scoria Block Slab= +Cracked Scoria Brick Slab= +Cobbled Scoria Slab= + +Serpentine Slab= +Cobbled Serpentine Slab= +Serpentine Brick Slab= +Serpentine Block Slab= +Cracked Serpentine Brick Slab= + +Shale Slab= +Shale Brick Slab= +Shale Block Slab= +Cracked Shale Brick Slab= +Cobbled Shale Slab= + +Slate Slab= +Slate Brick Slab= +Slate Block Slab= +Cracked Slate Brick Slab= +Cobbled Slate Slab= +Slate Tile Slab= + +Smokey Quartz Slab= +Smokey Quartz Brick Slab= +Smokey Quartz Block Slab= +Cracked Smokey Quartz Brick Slab= + +Soapstone Slab= +Soapstone Brick Slab= +Soapstone Block Slab= +Cracked Soapstone Brick Slab= + +Sodalite Slab= +Cobbled Sodalite Slab= +Sodalite Brick Slab= +Sodalite Block Slab= +Cracked Sodalite Brick Slab= + +Sugilite Slab= +Sugilite Brick Slab= +Sugilite Block Slab= +Cracked Sugilite Brick Slab= +Cobbled Sugilite Slab= + +Green Tourmaline Slab= +Green Tourmaline Brick Slab= +Green Tourmaline Block Slab= +Cracked Green Tourmaline Brick Slab= + +Paraiba Tourmaline Slab= +Paraiba Tourmaline Brick Slab= +Paraiba Tourmaline Block Slab= +Cracked Paraiba Tourmaline Brick Slab= + +Pink Tourmaline Slab= +Pink Tourmaline Brick Slab= +Pink Tourmaline Block Slab= +Cracked Pink Tourmaline Brick Slab= + +Travertine Slab= +Cobbled Travertine Slab= +Travertine Brick Slab= +Travertine Block Slab= +Cracked Travertine Brick Slab= + +Yellow Travertine Slab= +Cobbled Yellow Travertine Slab= +Yellow Travertine Brick Slab= +Yellow Travertine Block Slab= +Cracked Yellow Travertine Brick Slab= + +Beige Tuff Slab= +Cobbled Beige Tuff Slab= +Beige Tuff Block Slab= +Beige Tuff Brick Slab= +Cracked Beige Tuff Brick Slab= + +Grey Tuff Slab= +Cobbled Grey Tuff Slab= +Grey Tuff Block Slab= +Grey Tuff Brick Slab= +Cracked Grey Tuff Brick Slab= + +Red Tuff Slab= +Cobbled Red Tuff Slab= +Red Tuff Block Slab= +Red Tuff Brick Slab= +Cracked Red Tuff Brick Slab= + +Turquoise Slab= +Turquoise Brick Slab= +Turquoise Block Slab= +Cracked Turquoise Brick Slab= +Cobbled Turquoise Slab= + +Vivianite Slab= +Cobbled Vivianite Slab= +Vivianite Brick Slab= +Vivianite Block Slab= +Cracked Vivianite Brick Slab= + + + +Blue Agate Stair= +Gray Agate Stair= +Green Agate Stair= +Moss Agate Stair= +Orange Agate Stair= +Purple Agate Stair= +Red Agate Stair= + +Amazonite Stair= +Cobbled Amazonite Stair= +Amazonite Brick Stair= +Amazonite Block Stair= +Cracked Amazonite Brick Stair= + +Amber Stair= +Amber Brick Stair= +Amber Block Stair= +Cracked Amber Brick Stair= + +Amethyst Stair= +Amethyst Brick Stair= +Amethyst Block Stair= +Cracked Amethyst Brick Stair= + +Andesite Stair= +Andesite Block Stair= +Cobbled Andesite Stair= +Andesite Brick Stair= +Cobbled Andesite Brick Stair= + +Basalt Stair= +Basalt Block Stair= +Basalt Brick Stair= +Cracked Basalt Brick Stair= +Cobbled Basalt Stair= +Basalt Tile Stair= + +Black Moonstone Stair= +Black Moonstone Brick Stair= +Black Moonstone Block Stair= +Cracked Black Moonstone Brick Stair= + +Calcite Stair= +Calcite Brick Stair= +Calcite Block Stair= +Cracked Calcite Brick Stair= + +Grey Calcite Stair= +Grey Calcite Brick Stair= +Grey Calcite Block Stair= +Cracked Grey Calcite Brick Stair= + +Orange Calcite Stair= +Orange Calcite Brick Stair= +Orange Calcite Block Stair= +Cracked Orange Calcite Brick Stair= + +Carnotite Stair= +Carnotite Brick Stair= +Carnotite Block Stair= +Cracked Carnotite Brick Stair= +Cobbled Carnotite Stair= + +Celestine Stair= +Celestine Brick Stair= +Celestine Block Stair= +Cracked Celestine Brick Stair= + +Chalcanthite Stair= +Chalcanthite Brick Stair= +Chalcanthite Block Stair= +Cracked Chalcanthite Brick Stair= +Cobbled Chalcanthite Stair= + +Chrysoprase Stair= +Chrysoprase Brick Stair= +Chrysoprase Block Stair= +Cracked Chrysoprase Brick Stair= + +Citrine Stair= +Citrine Brick Stair= +Citrine Block Stair= +Cracked Citrine Brick Stair= + +Covellite Stair= +Covellite Brick Stair= +Covellite Block Stair= +Cracked Covellite Brick Stair= +Cobbled Covellite Stair= + +Crocoite Stair= +Crocoite Brick Stair= +Crocoite Block Stair= +Cracked Crocoite Brick Stair= + +Diorite Stair= +Diorite Brick Stair= +Diorite Block Stair= +Cracked Diorite Brick Stair= +Cobbled Diorite Stair= + +Erythrite Stair= +Erythrite Brick Stair= +Erythrite Block Stair= +Cracked Erythrite Brick Stair= + +Eudialite Stair= +Eudialite Brick Stair= +Eudialite Block Stair= +Cracked Eudialite Brick Stair= + +Fluorite Stair= +Fluorite Brick Stair= +Fluorite Block Stair= +Cracked Fluorite Brick Stair= + +Gabbro Stair= +Cobbled Gabbro Stair= +Gabbro Brick Stair= +Gabbro Block Stair= +Cracked Gabbro Brick Stair= + +Galena Stair= +Galena Brick Stair= +Galena Block Stair= +Cracked Galena Brick Stair= + +Black Granite Stair= +Black Granite Brick Stair= +Black Granite Block Stair= +Cracked Black Granite Brick Stair= +Cobbled Black Granite Stair= + +Blue Granite Stair= +Blue Granite Brick Stair= +Blue Granite Block Stair= +Cracked Blue Granite Brick Stair= +Cobbled Blue Granite Stair= + +Gray Granite Stair= +Gray Granite Brick Stair= +Gray Granite Block Stair= +Cracked Gray Granite Brick Stair= +Cobbled Gray Granite Stair= + +Green Granite Stair= +Green Granite Brick Stair= +Green Granite Block Stair= +Cracked Green Granite Brick Stair= +Cobbled Green Granite Stair= + +Pink Granite Stair= +Pink Granite Brick Stair= +Pink Granite Block Stair= +Cracked Pink Granite Brick Stair= +Cobbled Pink Granite Stair= + +Red Granite Stair= +Red Granite Brick Stair= +Red Granite Block Stair= +Cracked Red Granite Brick Stair= +Cobbled Red Granite Stair= + +White Granite Stair= +White Granite Brick Stair= +White Granite Block Stair= +Cracked White Granite Brick Stair= +Cobbled White Granite Stair= + +Yellow Granite Stair= +Yellow Granite Brick Stair= +Yellow Granite Block Stair= +Cracked Yellow Granite Brick Stair= +Cobbled Yellow Granite Stair= + +Heliodor Stair= +Heliodor Brick Stair= +Heliodor Block Stair= +Cracked Heliodor Brick Stair= + +Howlite Stair= +Howlite Brick Stair= +Howlite Block Stair= +Cracked Howlite Brick Stair= +Cobbled Howlite Stair= + +Ilvaite Stair= +Ilvaite Brick Stair= +Ilvaite Block Stair= +Cracked Ilvaite Brick Stair= +Cobbled Ilvaite Stair= + +Jade Stair= +Jade Brick Stair= +Jade Block Stair= +Cracked Jade Brick Stair= +Cobbled Jade Stair= + +Red Jasper Stair= +Red Jasper Brick Stair= +Red Jasper Block Stair= +Cracked Red Jasper Brick Stair= +Cobbled Red Jasper Stair= + +Kyanite Stair= +Kyanite Brick Stair= +Kyanite Block Stair= +Cracked Kyanite Brick Stair= +Cobbled Kyanite Stair= + +Lapis Lazuli Stair= +Lapis Lazuli Brick Stair= +Lapis Lazuli Block Stair= +Cracked Lapis Lazuli Brick Stair= + +Lepidolite Stair= +Lepidolite Brick Stair= +Lepidolite Block Stair= +Cracked Lepidolite Brick Stair= +Cobbled Lepidolite Stair= + +Blue Limestone Stair= +Blue Limestone Brick Stair= +Blue Limestone Block Stair= +Cracked Blue Limestone Brick Stair= +Cobbled Blue Limestone Stair= + +White Limestone Stair= +White Limestone Brick Stair= +White Limestone Block Stair= +Cracked White Limestone Brick Stair= +Cobbled White Limestone Stair= + +Marble Stair= +Marble Brick Stair= +Marble Block Stair= +Cracked Marble Brick Stair= +Cobbled Marble Stair= + +Moonstone Stair= +Moonstone Brick Stair= +Moonstone Block Stair= +Cracked Moonstone Brick Stair= + +Morion Quartz Stair= +Morion Quartz Brick Stair= +Morion Quartz Block Stair= +Cracked Morion Quartz Brick Stair= + +Mudstone Stair= +Cobbled Mudstone Stair= +Mudstone Brick Stair= +Mudstone Block Stair= +Cracked Mudstone Brick Stair= + +Prasiolite Stair= +Prasiolite Brick Stair= +Prasiolite Block Stair= +Cracked Prasiolite Brick Stair= + +Pumice Stair= +Pumice Brick Stair= +Pumice Block Stair= +Cracked Pumice Brick Stair= + +Pyrite Stair= +Pyrite Brick Stair= +Pyrite Block Stair= +Cracked Pyrite Brick Stair= + +Quartz Stair= +Quartz Brick Stair= +Quartz Block Stair= +Cracked Quartz Brick Stair= + +Rhodonite Stair= +Rhodonite Brick Stair= +Rhodonite Block Stair= +Cracked Rhodonite Brick Stair= +Cobbled Rhodonite Stair= + +Rose Quartz Stair= +Rose Quartz Brick Stair= +Rose Quartz Block Stair= +Cracked Rose Quartz Brick Stair= + +Scoria Stair= +Scoria Brick Stair= +Scoria Block Stair= +Cracked Scoria Brick Stair= +Cobbled Scoria Stair= + +Serpentine Stair= +Cobbled Serpentine Stair= +Serpentine Brick Stair= +Serpentine Block Stair= +Cracked Serpentine Brick Stair= + +Shale Stair= +Shale Brick Stair= +Shale Block Stair= +Cracked Shale Brick Stair= +Cobbled Shale Stair= + +Slate Stair= +Slate Brick Stair= +Slate Block Stair= +Cracked Slate Brick Stair= +Cobbled Slate Stair= +Slate Tile Stair= + +Smokey Quartz Stair= +Smokey Quartz Brick Stair= +Smokey Quartz Block Stair= +Cracked Smokey Quartz Brick Stair= + +Soapstone Stair= +Soapstone Brick Stair= +Soapstone Block Stair= +Cracked Soapstone Brick Stair= + +Sodalite Stair= +Cobbled Sodalite Stair= +Sodalite Brick Stair= +Sodalite Block Stair= +Cracked Sodalite Brick Stair= + +Sugilite Stair= +Sugilite Brick Stair= +Sugilite Block Stair= +Cracked Sugilite Brick Stair= +Cobbled Sugilite Stair= + +Green Tourmaline Stair= +Green Tourmaline Brick Stair= +Green Tourmaline Block Stair= +Cracked Green Tourmaline Brick Stair= + +Paraiba Tourmaline Stair= +Paraiba Tourmaline Brick Stair= +Paraiba Tourmaline Block Stair= +Cracked Paraiba Tourmaline Brick Stair= + +Pink Tourmaline Stair= +Pink Tourmaline Brick Stair= +Pink Tourmaline Block Stair= +Cracked Pink Tourmaline Brick Stair= + +Travertine Stair= +Cobbled Travertine Stair= +Travertine Brick Stair= +Travertine Block Stair= +Cracked Travertine Brick Stair= + +Yellow Travertine Stair= +Cobbled Yellow Travertine Stair= +Yellow Travertine Brick Stair= +Yellow Travertine Block Stair= +Cracked Yellow Travertine Brick Stair= + +Beige Tuff Stair= +Beige Tuff Brick Stair= +Beige Tuff Block Stair= +Cracked Beige Tuff Brick Stair= +Cobbled Beige Tuff Stair= + +Grey Tuff Stair= +Grey Tuff Brick Stair= +Grey Tuff Block Stair= +Cracked Grey Tuff Brick Stair= +Cobbled Grey Tuff Stair= + +Red Tuff Stair= +Red Tuff Brick Stair= +Red Tuff Block Stair= +Cracked Red Tuff Brick Stair= +Cobbled Red Tuff Stair= + +Turquoise Stair= +Turquoise Brick Stair= +Turquoise Block Stair= +Cracked Turquoise Brick Stair= +Cobbled Turquoise Stair= + +Vivianite Stair= +Vivianite Brick Stair= +Vivianite Block Stair= +Cracked Vivianite Brick Stair= + + + +Inner Blue Agate Stair= +Inner Gray Agate Stair= +Inner Green Agate Stair= +Inner Moss Agate Stair= +Inner Orange Agate Stair= +Inner Purple Agate Stair= +Inner Red Agate Stair= + +Inner Amazonite Stair= +Inner Cobbled Amazonite Stair= +Inner Amazonite Brick Stair= +Inner Amazonite Block Stair= +Inner Cracked Amazonite Brick Stair= + +Inner Amber Stair= +Inner Amber Brick Stair= +Inner Amber Block Stair= +Inner Cracked Amber Brick Stair= + +Inner Amethyst Stair= +Inner Amethyst Brick Stair= +Inner Amethyst Block Stair= +Inner Cracked Amethyst Brick Stair= + +Inner Andesite Stair= +Inner Andesite Block Stair= +Inner Andesite Brick Stair= +Inner Cracked Andesite Brick Stair= +Inner Cobbled Andesite Stair= + +Inner Basalt Stair= +Inner Basalt Block Stair= +Inner Basalt Brick Stair= +Inner Cracked Basalt Brick Stair= +Inner Cobbled Basalt Stair= +Inner Basalt Tile Stair= + +Inner Black Moonstone Stair= +Inner Black Moonstone Brick Stair= +Inner Black Moonstone Block Stair= +Inner Cracked Black Moonstone Brick Stair= + +Inner Calcite Stair= +Inner Calcite Brick Stair= +Inner Calcite Block Stair= +Inner Cracked Calcite Brick Stair= + +Inner Grey Calcite Stair= +Inner Grey Calcite Brick Stair= +Inner Grey Calcite Block Stair= +Inner Cracked Grey Calcite Brick Stair= + +Inner Orange Calcite Stair= +Inner Orange Calcite Brick Stair= +Inner Orange Calcite Block Stair= +Inner Cracked Orange Calcite Brick Stair= + +Inner Carnotite Stair= +Inner Carnotite Brick Stair= +Inner Carnotite Block Stair= +Inner Cracked Carnotite Brick Stair= +Inner Cobbled Carnotite Stair= + +Inner Celestine Stair= +Inner Celestine Brick Stair= +Inner Celestine Block Stair= +Inner Cracked Celestine Brick Stair= + +Inner Chalcanthite Stair= +Inner Chalcanthite Brick Stair= +Inner Chalcanthite Block Stair= +Inner Cracked Chalcanthite Brick Stair= +Inner Cobbled Chalcanthite Stair= + +Inner Chrysoprase Stair= +Inner Chrysoprase Brick Stair= +Inner Chrysoprase Block Stair= +Inner Cracked Chrysoprase Brick Stair= + +Inner Citrine Stair= +Inner Citrine Brick Stair= +Inner Citrine Block Stair= +Inner Cracked Citrine Brick Stair= + +Inner Covellite Stair= +Inner Covellite Brick Stair= +Inner Covellite Block Stair= +Inner Cracked Covellite Brick Stair= +Inner Cobbled Covellite Stair= + +Inner Crocoite Stair= +Inner Crocoite Brick Stair= +Inner Crocoite Block Stair= +Inner Cracked Crocoite Brick Stair= + +Inner Diorite Stair= +Inner Diorite Brick Stair= +Inner Diorite Block Stair= +Inner Cracked Diorite Brick Stair= +Inner Cobbled Diorite Stair= + +Inner Erythrite Stair= +Inner Erythrite Brick Stair= +Inner Erythrite Block Stair= +Inner Cracked Erythrite Brick Stair= + +Inner Eudialite Stair= +Inner Eudialite Brick Stair= +Inner Eudialite Block Stair= +Inner Cracked Eudialite Brick Stair= + +Inner Fluorite Stair= +Inner Fluorite Brick Stair= +Inner Fluorite Block Stair= +Inner Cracked Fluorite Brick Stair= + +Inner Gabbro Stair= +Inner Cobbled Gabbro Stair= +Inner Gabbro Brick Stair= +Inner Gabbro Block Stair= +Inner Cracked Gabbro Brick Stair= + +Inner Galena Stair= +Inner Galena Brick Stair= +Inner Galena Block Stair= +Inner Cracked Galena Brick Stair= + +Inner Black Granite Stair= +Inner Black Granite Brick Stair= +Inner Black Granite Block Stair= +Inner Cracked Black Granite Brick Stair= +Inner Cobbled Black Granite Stair= + +Inner Blue Granite Stair= +Inner Blue Granite Brick Stair= +Inner Blue Granite Block Stair= +Inner Cracked Blue Granite Brick Stair= +Inner Cobbled Blue Granite Stair= + +Inner Gray Granite Stair= +Inner Gray Granite Brick Stair= +Inner Gray Granite Block Stair= +Inner Cracked Gray Granite Brick Stair= +Inner Cobbled Gray Granite Stair= + +Inner Green Granite Stair= +Inner Green Granite Brick Stair= +Inner Green Granite Block Stair= +Inner Cracked Green Granite Brick Stair= +Inner Cobbled Green Granite Stair= + +Inner Pink Granite Stair= +Inner Pink Granite Brick Stair= +Inner Pink Granite Block Stair= +Inner Cracked Pink Granite Brick Stair= +Inner Cobbled Pink Granite Stair= + +Inner Red Granite Stair= +Inner Red Granite Brick Stair= +Inner Red Granite Block Stair= +Inner Cracked Red Granite Brick Stair= +Inner Cobbled Red Granite Stair= + +Inner White Granite Stair= +Inner White Granite Brick Stair= +Inner White Granite Block Stair= +Inner Cracked White Granite Brick Stair= +Inner Cobbled White Granite Stair= + +Inner Yellow Granite Stair= +Inner Yellow Granite Brick Stair= +Inner Yellow Granite Block Stair= +Inner Cracked Yellow Granite Brick Stair= +Inner Cobbled Yellow Granite Stair= + +Inner Heliodor Stair= +Inner Heliodor Brick Stair= +Inner Heliodor Block Stair= +Inner Cracked Heliodor Brick Stair= + +Inner Howlite Stair= +Inner Howlite Brick Stair= +Inner Howlite Block Stair= +Inner Cracked Howlite Brick Stair= +Inner Cobbled Howlite Stair= + +Inner Ilvaite Stair= +Inner Ilvaite Brick Stair= +Inner Ilvaite Block Stair= +Inner Cracked Ilvaite Brick Stair= +Inner Cobbled Ilvaite Stair= + +Inner Jade Stair= +Inner Jade Brick Stair= +Inner Jade Block Stair= +Inner Cracked Jade Brick Stair= +Inner Cobbled Jade Stair= + +Inner Red Jasper Stair= +Inner Red Jasper Brick Stair= +Inner Red Jasper Block Stair= +Inner Cracked Red Jasper Brick Stair= +Inner Cobbled Red Jasper Stair= + +Inner Kyanite Stair= +Inner Kyanite Brick Stair= +Inner Kyanite Block Stair= +Inner Cracked Kyanite Brick Stair= +Inner Cobbled Kyanite Stair= + +Inner Lapis Lazuli Stair= +Inner Lapis Lazuli Brick Stair= +Inner Lapis Lazuli Block Stair= +Inner Cracked Lapis Lazuli Brick Stair= + +Inner Lepidolite Stair= +Inner Lepidolite Brick Stair= +Inner Lepidolite Block Stair= +Inner Cracked Lepidolite Brick Stair= +Inner Cobbled Lepidolite Stair= + +Inner Blue Limestone Stair= +Inner Blue Limestone Brick Stair= +Inner Blue Limestone Block Stair= +Inner Cracked Blue Limestone Brick Stair= +Inner Cobbled Blue Limestone Stair= + +Inner White Limestone Stair= +Inner White Limestone Brick Stair= +Inner White Limestone Block Stair= +Inner Cracked White Limestone Brick Stair= +Inner Cobbled White Limestone Stair= + +Inner Marble Stair= +Inner Marble Brick Stair= +Inner Marble Block Stair= +Inner Cracked Marble Brick Stair= +Inner Cobbled Marble Stair= + +Inner Moonstone Stair= +Inner Moonstone Brick Stair= +Inner Moonstone Block Stair= +Inner Cracked Moonstone Brick Stair= + +Inner Morion Quartz Stair= +Inner Morion Quartz Brick Stair= +Inner Morion Quartz Block Stair= +Inner Cracked Morion Quartz Brick Stair= + +Inner Mudstone Stair= +Inner Cobbled Mudstone Stair= +Inner Mudstone Brick Stair= +Inner Mudstone Block Stair= +Inner Cracked Mudstone Brick Stair= + +Inner Prasiolite Stair= +Inner Prasiolite Brick Stair= +Inner Prasiolite Block Stair= +Inner Cracked Prasiolite Brick Stair= + +Inner Pumice Stair= +Inner Pumice Brick Stair= +Inner Pumice Block Stair= +Inner Cracked Pumice Brick Stair= + +Inner Pyrite Stair= +Inner Pyrite Brick Stair= +Inner Pyrite Block Stair= +Inner Cracked Pyrite Brick Stair= + +Inner Quartz Stair= +Inner Quartz Brick Stair= +Inner Quartz Block Stair= +Inner Cracked Quartz Brick Stair= + +Inner Rhodonite Stair= +Inner Rhodonite Brick Stair= +Inner Rhodonite Block Stair= +Inner Cracked Rhodonite Brick Stair= +Inner Cobbled Rhodonite Stair= + +Inner Rose Quartz Stair= +Inner Rose Quartz Brick Stair= +Inner Rose Quartz Block Stair= +Inner Cracked Rose Quartz Brick Stair= + +Inner Scoria Stair= +Inner Scoria Brick Stair= +Inner Scoria Block Stair= +Inner Cracked Scoria Brick Stair= +Inner Cobbled Scoria Stair= + +Inner Serpentine Stair= +Inner Cobbled Serpentine Stair= +Inner Serpentine Brick Stair= +Inner Serpentine Block Stair= +Inner Cracked Serpentine Brick Stair= + +Inner Shale Stair= +Inner Shale Brick Stair= +Inner Shale Block Stair= +Inner Cracked Shale Brick Stair= +Inner Cobbled Shale Stair= + +Inner Slate Stair= +Inner Slate Brick Stair= +Inner Slate Block Stair= +Inner Cracked Slate Brick Stair= +Inner Cobbled Slate Stair= +Inner Slate Tile Stair= + +Inner Smokey Quartz Stair= +Inner Smokey Quartz Brick Stair= +Inner Smokey Quartz Block Stair= +Inner Cracked Smokey Quartz Brick Stair= + +Inner Soapstone Stair= +Inner Soapstone Brick Stair= +Inner Soapstone Block Stair= +Inner Cracked Soapstone Brick Stair= + +Inner Sodalite Stair= +Inner Cobbled Sodalite Stair= +Inner Sodalite Brick Stair= +Inner Sodalite Block Stair= +Inner Cracked Sodalite Brick Stair= + +Inner Sugilite Stair= +Inner Sugilite Brick Stair= +Inner Sugilite Block Stair= +Inner Cracked Sugilite Brick Stair= +Inner Cobbled Sugilite Stair= + +Inner Green Tourmaline Stair= +Inner Green Tourmaline Brick Stair= +Inner Green Tourmaline Block Stair= +Inner Cracked Green Tourmaline Brick Stair= + +Inner Paraiba Tourmaline Stair= +Inner Paraiba Tourmaline Brick Stair= +Inner Paraiba Tourmaline Block Stair= +Inner Cracked Paraiba Tourmaline Brick Stair= + +Inner Pink Tourmaline Stair= +Inner Pink Tourmaline Brick Stair= +Inner Pink Tourmaline Block Stair= +Inner Cracked Pink Tourmaline Brick Stair= + +Inner Travertine Stair= +Inner Cobbled Travertine Stair= +Inner Travertine Brick Stair= +Inner Travertine Block Stair= +Inner Cracked Travertine Brick Stair= + +Inner Yellow Travertine Stair= +Inner Cobbled Yellow Travertine Stair= +Inner Yellow Travertine Brick Stair= +Inner Yellow Travertine Block Stair= +Inner Cracked Yellow Travertine Brick Stair= + +Inner Beige Tuff Stair= +Inner Cobbled Beige Tuff Stair= +Inner Beige Tuff Brick Stair= +Inner Beige Tuff Block Stair= +Inner Cracked Beige Tuff Brick Stair= + +Inner Grey Tuff Stair= +Inner Cobbled Grey Tuff Stair= +Inner Grey Tuff Brick Stair= +Inner Grey Tuff Block Stair= +Inner Cracked Grey Tuff Brick Stair= + +Inner Red Tuff Stair= +Inner Cobbled Red Tuff Stair= +Inner Red Tuff Brick Stair= +Inner Red Tuff Block Stair= +Inner Cracked Red Tuff Brick Stair= + +Inner Turquoise Stair= +Inner Turquoise Brick Stair= +Inner Turquoise Block Stair= +Inner Cracked Turquoise Brick Stair= +Inner Cobbled Turquoise Stair= + +Inner Vivianite Stair= +Inner Vivianite Brick Stair= +Inner Vivianite Block Stair= +Inner Cracked Vivianite Brick Stair= + + + +Outer Blue Agate Stair= +Outer Gray Agate Stair= +Outer Green Agate Stair= +Outer Moss Agate Stair= +Outer Orange Agate Stair= +Outer Purple Agate Stair= +Outer Red Agate Stair= + +Outer Amazonite Stair= +Outer Cobbled Amazonite Stair= +Outer Amazonite Brick Stair= +Outer Amazonite Block Stair= +Outer Cracked Amazonite Brick Stair= + +Outer Amber Stair= +Outer Amber Brick Stair= +Outer Amber Block Stair= +Outer Cracked Amber Brick Stair= + +Outer Amethyst Stair= +Outer Amethyst Brick Stair= +Outer Amethyst Block Stair= +Outer Cracked Amethyst Brick Stair= + +Outer Andesite Stair= +Outer Andesite Block Stair= +Outer Andesite Brick Stair= +Outer Cracked Andesite Brick Stair= +Outer Cobbled Andesite Stair= + +Outer Basalt Stair= +Outer Basalt Block Stair= +Outer Basalt Brick Stair= +Outer Cracked Basalt Brick Stair= +Outer Cobbled Basalt Stair= +Outer Basalt Tile Stair= + +Outer Black Moonstone Stair= +Outer Black Moonstone Brick Stair= +Outer Black Moonstone Block Stair= +Outer Cracked Black Moonstone Brick Stair= + +Outer Calcite Stair= +Outer Calcite Brick Stair= +Outer Calcite Block Stair= +Outer Cracked Calcite Brick Stair= + +Outer Grey Calcite Stair= +Outer Grey Calcite Brick Stair= +Outer Grey Calcite Block Stair= +Outer Cracked Grey Calcite Brick Stair= + +Outer Orange Calcite Stair= +Outer Orange Calcite Brick Stair= +Outer Orange Calcite Block Stair= +Outer Cracked Orange Calcite Brick Stair= + +Outer Carnotite Stair= +Outer Carnotite Brick Stair= +Outer Carnotite Block Stair= +Outer Cracked Carnotite Brick Stair= +Outer Cobbled Carnotite Stair= + +Outer Celestine Stair= +Outer Celestine Brick Stair= +Outer Celestine Block Stair= +Outer Cracked Celestine Brick Stair= + +Outer Chalcanthite Stair= +Outer Chalcanthite Brick Stair= +Outer Chalcanthite Block Stair= +Outer Cracked Chalcanthite Brick Stair= +Outer Cobbled Chalcanthite Stair= + +Outer Chrysoprase Stair= +Outer Chrysoprase Brick Stair= +Outer Chrysoprase Block Stair= +Outer Cracked Chrysoprase Brick Stair= + +Outer Citrine Stair= +Outer Citrine Brick Stair= +Outer Citrine Block Stair= +Outer Cracked Citrine Brick Stair= + +Outer Covellite Stair= +Outer Covellite Brick Stair= +Outer Covellite Block Stair= +Outer Cracked Covellite Brick Stair= +Outer Cobbled Covellite Stair= + +Outer Crocoite Stair= +Outer Crocoite Brick Stair= +Outer Crocoite Block Stair= +Outer Cracked Crocoite Brick Stair= + +Outer Diorite Stair= +Outer Diorite Brick Stair= +Outer Diorite Block Stair= +Outer Cracked Diorite Brick Stair= +Outer Cobbled Diorite Stair= + +Outer Erythrite Stair= +Outer Erythrite Brick Stair= +Outer Erythrite Block Stair= +Outer Cracked Erythrite Brick Stair= + +Outer Eudialite Stair= +Outer Eudialite Brick Stair= +Outer Eudialite Block Stair= +Outer Cracked Eudialite Brick Stair= + +Outer Fluorite Stair= +Outer Fluorite Brick Stair= +Outer Fluorite Block Stair= +Outer Cracked Fluorite Brick Stair= + +Outer Gabbro Stair= +Outer Cobbled Gabbro Stair= +Outer Gabbro Brick Stair= +Outer Gabbro Block Stair= +Outer Cracked Gabbro Brick Stair= + +Outer Galena Stair= +Outer Galena Brick Stair= +Outer Galena Block Stair= +Outer Cracked Galena Brick Stair= + +Outer Black Granite Stair= +Outer Black Granite Brick Stair= +Outer Black Granite Block Stair= +Outer Cracked Black Granite Brick Stair= +Outer Cobbled Black Granite Stair= + +Outer Blue Granite Stair= +Outer Blue Granite Brick Stair= +Outer Blue Granite Block Stair= +Outer Cracked Blue Granite Brick Stair= +Outer Cobbled Blue Granite Stair= + +Outer Gray Granite Stair= +Outer Gray Granite Brick Stair= +Outer Gray Granite Block Stair= +Outer Cracked Gray Granite Brick Stair= +Outer Cobbled Gray Granite Stair= + +Outer Green Granite Stair= +Outer Green Granite Brick Stair= +Outer Green Granite Block Stair= +Outer Cracked Green Granite Brick Stair= +Outer Cobbled Green Granite Stair= + +Outer Pink Granite Stair= +Outer Pink Granite Brick Stair= +Outer Pink Granite Block Stair= +Outer Cracked Pink Granite Brick Stair= +Outer Cobbled Pink Granite Stair= + +Outer Red Granite Stair= +Outer Red Granite Brick Stair= +Outer Red Granite Block Stair= +Outer Cracked Red Granite Brick Stair= +Outer Cobbled Red Granite Stair= + +Outer White Granite Stair= +Outer White Granite Brick Stair= +Outer White Granite Block Stair= +Outer Cracked White Granite Brick Stair= +Outer Cobbled White Granite Stair= + +Outer Yellow Granite Stair= +Outer Yellow Granite Brick Stair= +Outer Yellow Granite Block Stair= +Outer Cracked Yellow Granite Brick Stair= +Outer Cobbled Yellow Granite Stair= + +Outer Heliodor Stair= +Outer Heliodor Brick Stair= +Outer Heliodor Block Stair= +Outer Cracked Heliodor Brick Stair= + +Outer Howlite Stair= +Outer Howlite Brick Stair= +Outer Howlite Block Stair= +Outer Cracked Howlite Brick Stair= +Outer Cobbled Howlite Stair= + +Outer Ilvaite Stair= +Outer Ilvaite Brick Stair= +Outer Ilvaite Block Stair= +Outer Cracked Ilvaite Brick Stair= +Outer Cobbled Ilvaite Stair= + +Outer Jade Stair= +Outer Jade Brick Stair= +Outer Jade Block Stair= +Outer Cracked Jade Brick Stair= +Outer Cobbled Jade Stair= + +Outer Red Jasper Stair= +Outer Red Jasper Brick Stair= +Outer Red Jasper Block Stair= +Outer Cracked Red Jasper Brick Stair= +Outer Cobbled Red Jasper Stair= + +Outer Kyanite Stair= +Outer Kyanite Brick Stair= +Outer Kyanite Block Stair= +Outer Cracked Kyanite Brick Stair= +Outer Cobbled Kyanite Stair= + +Outer Lapis Lazuli Stair= +Outer Lapis Lazuli Brick Stair= +Outer Lapis Lazuli Block Stair= +Outer Cracked Lapis Lazuli Brick Stair= + +Outer Lepidolite Stair= +Outer Lepidolite Brick Stair= +Outer Lepidolite Block Stair= +Outer Cracked Lepidolite Brick Stair= +Outer Cobbled Lepidolite Stair= + +Outer Blue Limestone Stair= +Outer Blue Limestone Brick Stair= +Outer Blue Limestone Block Stair= +Outer Cracked Blue Limestone Brick Stair= +Outer Cobbled Blue Limestone Stair= + +Outer White Limestone Stair= +Outer White Limestone Brick Stair= +Outer White Limestone Block Stair= +Outer Cracked White Limestone Brick Stair= +Outer Cobbled White Limestone Stair= + +Outer Marble Stair= +Outer Marble Brick Stair= +Outer Marble Block Stair= +Outer Cracked Marble Brick Stair= +Outer Cobbled Marble Stair= + +Outer Moonstone Stair= +Outer Moonstone Brick Stair= +Outer Moonstone Block Stair= +Outer Cracked Moonstone Brick Stair= + +Outer Morion Quartz Stair= +Outer Morion Quartz Brick Stair= +Outer Morion Quartz Block Stair= +Outer Cracked Morion Quartz Brick Stair= + +Outer Mudstone Stair= +Outer Cobbled Mudstone Stair= +Outer Mudstone Brick Stair= +Outer Mudstone Block Stair= +Outer Cracked Mudstone Brick Stair= + +Outer Prasiolite Stair= +Outer Prasiolite Brick Stair= +Outer Prasiolite Block Stair= +Outer Cracked Prasiolite Brick Stair= + +Outer Pumice Stair= +Outer Pumice Brick Stair= +Outer Pumice Block Stair= +Outer Cracked Pumice Brick Stair= + +Outer Pyrite Stair= +Outer Pyrite Brick Stair= +Outer Pyrite Block Stair= +Outer Cracked Pyrite Brick Stair= + +Outer Quartz Stair= +Outer Quartz Brick Stair= +Outer Quartz Block Stair= +Outer Cracked Quartz Brick Stair= + +Outer Rhodonite Stair= +Outer Rhodonite Brick Stair= +Outer Rhodonite Block Stair= +Outer Cracked Rhodonite Brick Stair= +Outer Cobbled Rhodonite Stair= + +Outer Rose Quartz Stair= +Outer Rose Quartz Brick Stair= +Outer Rose Quartz Block Stair= +Outer Cracked Rose Quartz Brick Stair= + +Outer Scoria Stair= +Outer Scoria Brick Stair= +Outer Scoria Block Stair= +Outer Cracked Scoria Brick Stair= +Outer Cobbled Scoria Stair= + +Outer Serpentine Stair= +Outer Cobbled Serpentine Stair= +Outer Serpentine Brick Stair= +Outer Serpentine Block Stair= +Outer Cracked Serpentine Brick Stair= + +Outer Shale Stair= +Outer Shale Brick Stair= +Outer Shale Block Stair= +Outer Cracked Shale Brick Stair= +Outer Cobbled Shale Stair= + +Outer Slate Stair= +Outer Slate Brick Stair= +Outer Slate Block Stair= +Outer Cracked Slate Brick Stair= +Outer Cobbled Slate Stair= +Outer Slate Tile Stair= + +Outer Smokey Quartz Stair= +Outer Smokey Quartz Brick Stair= +Outer Smokey Quartz Block Stair= +Outer Cracked Smokey Quartz Brick Stair= + +Outer Soapstone Stair= +Outer Soapstone Brick Stair= +Outer Soapstone Block Stair= +Outer Cracked Soapstone Brick Stair= + +Outer Sodalite Stair= +Outer Cobbled Sodalite Stair= +Outer Sodalite Brick Stair= +Outer Sodalite Block Stair= +Outer Cracked Sodalite Brick Stair= + +Outer Sugilite Stair= +Outer Sugilite Brick Stair= +Outer Sugilite Block Stair= +Outer Cracked Sugilite Brick Stair= +Outer Cobbled Sugilite Stair= + +Outer Green Tourmaline Stair= +Outer Green Tourmaline Brick Stair= +Outer Green Tourmaline Block Stair= +Outer Cracked Green Tourmaline Brick Stair= + +Outer Paraiba Tourmaline Stair= +Outer Paraiba Tourmaline Brick Stair= +Outer Paraiba Tourmaline Block Stair= +Outer Cracked Paraiba Tourmaline Brick Stair= + +Outer Pink Tourmaline Stair= +Outer Pink Tourmaline Brick Stair= +Outer Pink Tourmaline Block Stair= +Outer Cracked Pink Tourmaline Brick Stair= + +Outer Travertine Stair= +Outer Cobbled Travertine Stair= +Outer Travertine Brick Stair= +Outer Travertine Block Stair= +Outer Cracked Travertine Brick Stair= + +Outer Yellow Travertine Stair= +Outer Cobbled Yellow Travertine Stair= +Outer Yellow Travertine Brick Stair= +Outer Yellow Travertine Block Stair= +Outer Cracked Yellow Travertine Brick Stair= + +Outer Beige Tuff Stair= +Outer Cobbled Beige Tuff Stair= +Outer Beige Tuff Brick Stair= +Outer Beige Tuff Block Stair= +Outer Cracked Beige Tuff Brick Stair= + +Outer Grey Tuff Stair= +Outer Cobbled Grey Tuff Stair= +Outer Grey Tuff Brick Stair= +Outer Grey Tuff Block Stair= +Outer Cracked Grey Tuff Brick Stair= + +Outer Red Tuff Stair= +Outer Cobbled Red Tuff Stair= +Outer Red Tuff Brick Stair= +Outer Red Tuff Block Stair= +Outer Cracked Red Tuff Brick Stair= + +Outer Turquoise Stair= +Outer Turquoise Brick Stair= +Outer Turquoise Block Stair= +Outer Cracked Turquoise Brick Stair= +Outer Cobbled Turquoise Stair= + +Outer Vivianite Stair= +Outer Vivianite Brick Stair= +Outer Vivianite Block Stair= +Outer Cracked Vivianite Brick Stair= + +### nodes_glowing.lua ### + +Glowing Apatite= +Glowing Apatite Block= +Cobbled Glowing Apatite= +Glowing Apatite Brick= +Cracked Glowing Apatite Brick= + +Glowing Calcite= +Glowing Calcite Block= +Cobbled Glowing Calcite= +Glowing Calcite Brick= +Cracked Glowing Calcite Brick= + +Glowing Esperite= +Glowing Esperite Block= +Cobbled Glowing Esperite= +Glowing Esperite Brick= +Cracked Glowing Esperite Brick= + +Glowing Fluorite= +Glowing Fluorite Block= +Cobbled Glowing Fluorite= +Glowing Fluorite Brick= +Cracked Glowing Fluorite Brick= + +Glowing Selenite= +Glowing Selenite Block= +Cobbled Glowing Selenite= +Glowing Selenite Brick= +Cracked Glowing Selenite Brick= + +Glowing Sodalite= +Glowing Sodalite Block= +Cobbled Glowing Sodalite= +Glowing Sodalite Brick= +Cracked Glowing Sodalite Brick= + +Glowing Willemite= +Glowing Willemite Block= +Cobbled Glowing Willemite= +Glowing Willemite Brick= +Cracked Glowing Willemite Brick= + +### nodes_crystal.lua ### + +Budding Amazonite= +Amazonite Crystal= + +Budding Amber= +Amber Crystal= + +Budding Amethyst= +Amethyst Crystal= + +Budding Celestine= +Celestine Crystal= + +Budding Chalcanthite= +Chalcanthite Crystal= + +Budding Citrine= +Citrine Crystal= + +Budding Crocoite= +Crocoite Crystal= + +Budding Eudialite= +Eudialite Crystal= + +Budding Heliodor= +Heliodor Crystal= + +Budding Kyanite= +Kyanite Crystal= + +Budding Moonstone= +Moonstone Crystal= + +Budding Morion Quartz= +Morion Quartz Crystal= + +Budding Prasiolite= +Prasiolite Crystal= + +Budding Quartz= +Quartz Crystal= + +Budding Rose Quartz= +Rose Quartz Crystal= + +Budding Smokey Quartz= +Smokey Quartz Crystal= + +Budding Green Tourmaline= +Green Tourmaline Crystal= + +Budding Paraiba Tourmaline= +Paraiba Tourmaline Crystal= + +Budding Pink Tourmaline= +Pink Tourmaline Crystal= + +Budding Vivianite= +Vivianite Crystal= diff --git a/mods/too_many_stones/locale/too_many_stones.de.tr b/mods/too_many_stones/locale/too_many_stones.de.tr new file mode 100644 index 00000000..d06c2be9 --- /dev/null +++ b/mods/too_many_stones/locale/too_many_stones.de.tr @@ -0,0 +1,2471 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate=Blauer Achat +Gray Agate=Grauer Achat +Green Agate=Grüner Achat +Moss Agate=Moosachat +Orange Agate=Oranger Achat +Purple Agate=Lila Achat +Red Agate=Roter Achat + +Amazonite=Amazonit +Amazonite Block=Amazonitblock +Cobbled Amazonite=Gebrochener Amazonit +Amazonite Brick=Amazonitziegel +Cracked Amazonite Brick=Gebrochener Amazonitziegel + +Amber=Bernstein +Amber Block=Bernsteinblock +Amber Brick=Bernsteinziegel +Cracked Amber Brick=Gebrochener Bernsteinziegel + +Amethyst=Amethyst +Amethyst Block=Amethystblock +Amethyst Brick=Amethystziegel +Cracked Amethyst Brick=Gebrochener Amethystziegel + +Andesite=Andesit +Andesite Block=Andesitblock +Andesite Brick=Andesitziegel +Cracked Andesite Brick=Gebrochener Andesitziegel +Cobbled Andesite=Gebrochener Andesit + +Basalt=Basalt +Basalt Block=Basaltblock +Basalt Brick=Basaltziegel +Cracked Basalt Brick=Gebrochener Basaltziegel +Cobbled Basalt=Gebrochener Basalt +Basalt Tile=Basaltfliese + +Columnar Basalt=Säulenbasalt + +Batch=Glasschmelze + +Black Moonstone=Schwarzer Mondstein +Black Moonstone Block=Block aus schwarzem Mondstein +Black Moonstone Brick=Ziegel aus schwarzem Mondstein +Cracked Black Moonstone Brick=Gebrochener Ziegel aus schwarzem Mondstein + +Black Opal=Schwarzer Opal + +Calcite=Calcit +Calcite Block=Calcitblock +Calcite Brick=Calcitziegel +Cracked Calcite Brick=Gebrochener Calcitziegel + +Grey Calcite=Graue Calcit +Grey Calcite Block=Grauer Calcitblock +Grey Calcite Brick=Grauer Calcitziegel +Cracked Grey Calcite Brick=Gerissener grauer Calcitziegel + +Orange Calcite=Oranger Calcit +Orange Calcite Block=Oranger Calcitblock +Orange Calcite Brick=Oranger Calcitziegel +Cracked Orange Calcite Brick=Gerissener oranger Calcitziegel + +Carnotite=Carnotit +Carnotite Block=Carnotitblock +Carnotite Brick=Carnotitziegel +Cracked Carnotite Brick=Gebrochener Carnotitziegel +Cobbled Carnotite=Gebrochener Carnotit + +Celestine=Cölestin +Celestine Block=Cölestinblock +Celestine Brick=Cölestinziegel +Cracked Celestine Brick=Gebrochener Cölestinziegel + +Chalcanthite=Chalkanthit +Chalcanthite Block=Chalkanthitblock +Chalcanthite Brick=Chalkanthitziegel +Cracked Chalcanthite Brick=Gerissener Chalkanthitziegel +Cobbled Chalcanthite=Gerumpelter Chalkanthit + +Chrysoprase=Chrysopras +Chrysoprase Block=Chrysoprasblock +Chrysoprase Brick=Chrysoprasziegel +Cracked Chrysoprase Brick=Gebrochener Chrysoprasziegel + +Citrine=Citrin +Citrine Block=Citrinblock +Citrine Brick=Citrinziegel +Cracked Citrine Brick=Gebrochener Citrinziegel + +Covellite=Covellit +Covellite Block=Covellitblock +Covellite Brick=Covellitziegel +Cracked Covellite Brick=Gebrochener Covellitziegel +Cobbled Covellite=Gebrochener Covellit + +Crocoite=Crocoit +Crocoite Block=Crocoitblock +Crocoite Brick=Crocoitziegel +Cracked Crocoite Brick=Gebrochener Crocoitziegel + +Diorite=Diorit +Diorite Block=Dioritblock +Diorite Brick=Dioritziegel +Cracked Diorite Brick=Gebrochener Dioritziegel +Cobbled Diorite=Gebrochener Diorit + +Erythrite=Erythrit +Erythrite Block=Erythritblock +Erythrite Brick=Erythritziegel +Cracked Erythrite Brick=Gebrochener Erythritziegel + +Eudialite=Eudialit +Eudialite Block=Eudialitblock +Eudialite Brick=Eudialitziegel +Cracked Eudialite Brick=Gebrochener Eudialitziegel + +Fluorite=Fluorit +Fluorite Block=Fluoritblock +Fluorite Brick=Fluoritziegel +Cracked Fluorite Brick=Gebrochener Fluoritziegel + +Fire Opal=Feueropal + +Gabbro=Gabbro +Gabbro Block=Gabbroblock +Cobbled Gabbro=Gebrochener Gabbro +Gabbro Brick=Gabbroziegel +Cracked Gabbro Brick=Gebrochener Gabbroziegel + +Galena=Galenit +Galena Block=Galenitblock +Galena Brick=Galenitziegel +Cracked Galena Brick=Gebrochener Galenitziegel + +Black Granite=Schwarzer Granit +Black Granite Block=Schwarzer Granitblock +Black Granite Brick=Schwarzer Granitziegel +Cracked Black Granite Brick=Gebrochener Schwarzer Granitziegel +Cobbled Black Granite=Gebrochener Schwarzer Granit + +Blue Granite=Blauer Granit +Blue Granite Block=Blauer Granitblock +Blue Granite Brick=Blauer Granitziegel +Cracked Blue Granite Brick=Gebrochener Blauer Granitziegel +Cobbled Blue Granite=Gebrochener Blauer Granit + +Gray Granite=Grauer Granit +Gray Granite Block=Grauer Granitblock +Gray Granite Brick=Grauer Granitziegel +Cracked Gray Granite Brick=Gebrochener Grauer Granitziegel +Cobbled Gray Granite=Gebrochener Grauer Granit + +Green Granite=Grüner Granit +Green Granite Block=Grüner Granitblock +Green Granite Brick=Grüner Granitziegel +Cracked Green Granite Brick=Gebrochener Grüner Granitziegel +Cobbled Green Granite=Gebrochener Grüner Granit + +Pink Granite=Rosa Granit +Pink Granite Block=Rosa Granitblock +Pink Granite Brick=Rosa Granitziegel +Cracked Pink Granite Brick=Gebrochener Rosa Granitziegel +Cobbled Pink Granite=Gebrochener Rosa Granit + +Red Granite=Roter Granit +Red Granite Block=Roter Granitblock +Red Granite Brick=Roter Granitziegel +Cracked Red Granite Brick=Gebrochener Roter Granitziegel +Cobbled Red Granite=Gebrochener Roter Granit + +White Granite=Weißer Granit +White Granite Block=Weißer Granitblock +White Granite Brick=Weißer Granitziegel +Cracked White Granite Brick=Gebrochener Weißer Granitziegel +Cobbled White Granite=Gebrochener Weißer Granit + +Yellow Granite=Gelber Granit +Yellow Granite Block=Gelber Granitblock +Yellow Granite Brick=Gelber Granitziegel +Cracked Yellow Granite Brick=Gebrochener Gelber Granitziegel +Cobbled Yellow Granite=Gebrochener Gelber Granit + +Heliodor=Heliodor +Heliodor Block=Heliodor-Block +Heliodor Brick=Heliodor-Ziegel +Cracked Heliodor Brick=Rissiger Heliodor-Ziegel + +Howlite=Howlith +Howlite Block=Howlith-Block +Howlite Brick=Howlith-Ziegel +Cracked Howlite Brick=Rissiger Howlith-Ziegel +Cobbled Howlite=Howlith-Pflaster + +Ilvaite=Ilvait +Ilvaite Block=Ilvait-Block +Ilvaite Brick=Ilvait-Ziegel +Cracked Ilvaite Brick=Rissiger Ilvait-Ziegel +Cobbled Ilvaite=Ilvait-Pflaster + +Jade=Jade +Jade Block=Jade-Block +Jade Brick=Jade-Ziegel +Cracked Jade Brick=Rissiger Jade-Ziegel +Cobbled Jade=Jade-Pflaster + +Red Jasper=Roter Jaspis +Red Jasper Block=Roter Jaspisblock +Red Jasper Brick=Roter Jaspisziegel +Cracked Red Jasper Brick=Gerissener roter Jaspisziegel +Cobbled Red Jasper=Gerumpelter roter Jaspis + +Kyanite=Kyanit +Kyanite Block=Kyanit-Block +Kyanite Brick=Kyanit-Ziegel +Cracked Kyanite Brick=Rissiger Kyanit-Ziegel +Cobbled Kyanite=Kyanit-Pflaster + +Lapis Lazuli=Lapislazuli +Lapis Lazuli Block=Lapislazuli-Block +Lapis Lazuli Brick=Lapislazuli-Ziegel +Cracked Lapis Lazuli Brick=Rissiger Lapislazuli-Ziegel + +Lepidolite=Lepidolith +Lepidolite Block=Lepidolithblock +Lepidolite Brick=Lepidolithziegel +Cracked Lepidolite Brick=Gerissener Lepidolithziegel +Cobbled Lepidolite=Gerumpelter Lepidolith + +Blue Limestone=Blauer Kalkstein +Blue Limestone Block=Blauer Kalkstein-Block +Blue Limestone Brick=Blauer Kalkstein-Ziegel +Cracked Blue Limestone Brick=Rissiger Blauer Kalkstein-Ziegel +Cobbled Blue Limestone=Blauer Kalkstein-Pflaster + +White Limestone=Weißer Kalkstein +White Limestone Block=Weißer Kalkstein-Block +White Limestone Brick=Weißer Kalkstein-Ziegel +Cracked White Limestone Brick=Rissiger Weißer Kalkstein-Ziegel +Cobbled White Limestone=Weißer Kalkstein-Pflaster + +Marble=Marmor +Marble Block=Marmor-Block +Marble Brick=Marmor-Ziegel +Cracked Marble Brick=Rissiger Marmor-Ziegel +Cobbled Marble=Marmor-Pflaster + +Moonstone=Mondstein +Moonstone Block=Mondsteinblock +Moonstone Brick=Mondsteinziegel +Cracked Moonstone Brick=Gerissener Mondsteinziegel + +Morion Quartz=Morionquarz +Morion Quartz Block=Morionquarz-Block +Morion Quartz Brick=Morionquarz-Ziegel +Cracked Morion Quartz Brick=Rissiger Morionquarz-Ziegel + +Mudstone=Schlammstein +Mudstone Block=Schlammstein-Block +Cobbled Mudstone=Schlammstein-Pflaster +Mudstone Brick=Schlammstein-Ziegel +Cracked Mudstone Brick=Rissiger Schlammstein-Ziegel + +Opal=Opal + +Prasiolite=Prasiolith +Prasiolite Block=Prasiolith-Block +Prasiolite Brick=Prasiolith-Ziegel +Cracked Prasiolite Brick=Rissiger Prasiolith-Ziegel + +Pumice=Bimsstein +Pumice Block=Bimsstein-Block +Pumice Brick=Bimsstein-Ziegel +Cracked Pumice Brick=Rissiger Bimsstein-Ziegel + +Pyrite=Pyrit +Pyrite Block=Pyrit-Block +Cobbled Pyrite=Pyrit-Pflaster +Pyrite Brick=Pyrit-Ziegel +Cracked Pyrite Brick=Rissiger Pyrit-Ziegel + +Quartz=Quarz +Quartz Block=Quarz-Block +Quartz Brick=Quarz-Ziegel +Cracked Quartz Brick=Rissiger Quarz-Ziegel + +Rhodonite=Rhodonit +Rhodonite Block=Rhodonitblock +Rhodonite Brick=Rhodonitziegel +Cracked Rhodonite Brick=Gerissener Rhodonitziegel +Cobbled Rhodonite=Gefaster Rhodonit + +Rose Quartz=Rosenquarz +Rose Quartz Block=Rosenquarz-Block +Rose Quartz Brick=Rosenquarz-Ziegel +Cracked Rose Quartz Brick=Rissiger Rosenquarz-Ziegel + +Scoria=Schlacke +Scoria Block=Schlacke-Block +Scoria Brick=Schlacke-Ziegel +Cracked Scoria Brick=Rissiger Schlacke-Ziegel +Cobbled Scoria=Schlacke-Pflaster + +Serpentine=Serpentin +Serpentine Block=Serpentin-Block +Cobbled Serpentine=Serpentin-Pflaster +Serpentine Brick=Serpentin-Ziegel +Cracked Serpentine Brick=Rissiger Serpentin-Ziegel + +Shale=Schiefer +Shale Block=Schiefer-Block +Shale Brick=Schiefer-Ziegel +Cracked Shale Brick=Rissiger Schiefer-Ziegel +Cobbled Shale=Schiefer-Pflaster + +Slate=Schiefer +Slate Block=Schiefer-Block +Slate Brick=Schiefer-Ziegel +Cracked Slate Brick=Rissiger Schiefer-Ziegel +Cobbled Slate=Schiefer-Pflaster +Slate Tile=Schieferfliese + +Smokey Quartz=Rauchquarz +Smokey Quartz Block=Rauchquarz-Block +Smokey Quartz Brick=Rauchquarz-Ziegel +Cracked Smokey Quartz Brick=Rissiger Rauchquarz-Ziegel + +Soapstone=Speckstein +Soapstone Block=Speckstein-Block +Soapstone Brick=Speckstein-Ziegel +Cracked Soapstone Brick=Rissiger Speckstein-Ziegel + +Sodalite=Sodalith +Sodalite Block=Sodalith-Block +Cobbled Sodalite=Sodalith-Pflaster +Sodalite Brick=Sodalith-Ziegel +Cracked Sodalite Brick=Rissiger Sodalith-Ziegel + +Sugilite=Sugilith +Sugilite Block=Sugilith-Block +Sugilite Brick=Sugilith-Ziegel +Cracked Sugilite Brick=Rissiger Sugilith-Ziegel +Cobbled Sugilite=Sugilith-Pflaster + +Green Tourmaline=Grüner Turmalin +Green Tourmaline Block=Grüner Turmalinblock +Green Tourmaline Brick=Grüner Turmalinziegel +Cracked Green Tourmaline Brick=Gerissener grüner Turmalinziegel + +Paraiba Tourmaline=Paraíba-Turmalin +Paraiba Tourmaline Block=Paraíba-Turmalin-Block +Paraiba Tourmaline Brick=Paraíba-Turmalinziegel +Cracked Paraiba Tourmaline Brick=Gerissener Paraíba-Turmalinziegel + +Pink Tourmaline=Rosa Turmalin +Pink Tourmaline Block=Rosa Turmalin-Block +Pink Tourmaline Brick=Rosa Turmalinziegel +Cracked Pink Tourmaline Brick=Gerissener rosa Turmalinziegel + +Travertine=Travertin +Travertine Block=Travertin-Block +Cobbled Travertine=Travertin-Pflaster +Travertine Brick=Travertin-Ziegel +Cracked Travertine Brick=Rissiger Travertin-Ziegel + +Yellow Travertine=Gelber Travertin +Yellow Travertine Block=Gelber Travertin-Block +Cobbled Yellow Travertine=Gelber Travertin-Pflaster +Yellow Travertine Brick=Gelber Travertin-Ziegel +Cracked Yellow Travertine Brick=Rissiger Gelber Travertin-Ziegel + +Beige Tuff=Beiger Tuff +Beige Tuff Block=Beiger Tuff-Block +Cobbled Beige Tuff=Beiger Tuff-Pflaster +Beige Tuff Brick=Beiger Tuff-Ziegel +Cracked Beige Tuff=Rissiger Beiger Tuff + +Grey Tuff=Grauer Tuff +Grey Tuff Block=Grauer Tuff-Block +Cobbled Grey Tuff=Grauer Tuff-Pflaster +Grey Tuff Brick=Grauer Tuff-Ziegel +Cracked Grey Tuff=Rissiger Grauer Tuff + +Red Tuff=Roter Tuff +Red Tuff Block=Roter Tuff-Block +Cobbled Red Tuff=Roter Tuff-Pflaster +Red Tuff Brick=Roter Tuff-Ziegel +Cracked Red Tuff=Rissiger Roter Tuff + +Turquoise=Türkis +Turquoise Block=Türkis-Block +Turquoise Brick=Türkis-Ziegel +Cracked Turquoise Brick=Rissiger Türkis-Ziegel +Cobbled Turquoise=Türkis-Pflaster +Turquoise Pebble=Türkis-Kiesel + +Vivianite=Vivianit +Vivianite Block=Vivianit-Block +Vivianite Brick=Vivianit-Ziegel +Cracked Vivianite Brick=Rissiger Vivianit-Ziegel + +### wall.lua ### + +Blue Agate Wall=Blaue Achatwand +Gray Agate Wall=Graue Achatwand +Green Agate Wall=Grüne Achatwand +Moss Agate Wall=Moosachatwand +Orange Agate Wall=Orangefarbene Achatwand +Purple Agate Wall=Violette Achatwand +Red Agate Wall=Rote Achatwand + +Amazonite Wall=Amazonitwand +Cobbled Amazonite Wall=Gepflasterte Amazonitwand +Amazonite Brick Wall=Amazonitziegelwand +Amazonite Block Wall=Amazonitblockwand +Cracked Amazonite Brick Wall=Rissige Amazonitziegelwand + +Amber Wall=Bernsteinwand +Amber Brick Wall=Bernsteinziegelwand +Amber Block Wall=Bernsteinblockwand +Cracked Amber Brick Wall=Rissige Bernsteinziegelwand + +Amethyst Wall=Amethystwand +Amethyst Brick Wall=Amethystziegelwand +Amethyst Block Wall=Amethystblockwand +Cracked Amethyst Brick Wall=Rissige Amethystziegelwand + +Ammolite=Ammolit + +Andesite Wall=Andesitwand +Andesite Block Wall=Andesitblockwand +Andesite Brick Wall=Andesitziegelwand +Cracked Andesite Brick Wall=Rissige Andesitziegelwand +Cobbled Andesite Wall=Gepflasterte Andesitwand + +Basalt Wall=Basaltwand +Basalt Block Wall=Basaltblockwand +Basalt Brick Wall=Basaltziegelwand +Cracked Basalt Brick Wall=Rissige Basaltziegelwand +Cobbled Basalt Wall=Gepflasterte Basaltwand +Basalt Tile Wall=Basaltfliesenwand + +Black Moonstone Wall=Schwarze Mondsteinwand +Black Moonstone Brick Wall=Schwarze Mondsteinziegelwand +Black Moonstone Block Wall=Schwarze Mondsteinblockwand +Cracked Black Moonstone Brick Wall=Rissige schwarze Mondsteinziegelwand + +Calcite Wall=Calcitwand +Calcite Brick Wall=Calcitziegelwand +Calcite Block Wall=Calcitblockwand +Cracked Calcite Brick Wall=Rissige Calcitziegelwand + +Grey Calcite Wall=Graue Calcitwand +Grey Calcite Brick Wall=Graue Calcitziegelwand +Grey Calcite Block Wall=Graue Calcitblockwand +Cracked Grey Calcite Brick Wall=Gerissene Wand aus grauem Calcitziegel + +Orange Calcite Wall=Orangefarbene Calcitwand +Orange Calcite Brick Wall=Orangefarbene Calcitziegelwand +Orange Calcite Block Wall=Orangefarbene Calcitblockwand +Cracked Orange Calcite Brick Wall=Gerissene Wand aus orangefarbenem Calcitziegel + +Carnotite Wall=Carnotitwand +Carnotite Brick Wall=Carnotitziegelwand +Carnotite Block Wall=Carnotitblockwand +Cracked Carnotite Brick Wall=Rissige Carnotitziegelwand +Cobbled Carnotite Wall=Gepflasterte Carnotitwand + +Celestine Wall=Celestinwand +Celestine Brick Wall=Celestinziegelwand +Celestine Block Wall=Celestinblockwand +Cracked Celestine Brick Wall=Rissige Celestinziegelwand + +Chalcanthite Wall=Chalkanthitwand +Chalcanthite Brick Wall=Chalkanthitziegelwand +Chalcanthite Block Wall=Chalkanthitblockwand +Cracked Chalcanthite Brick Wall=Gerissene Chalkanthitziegelwand +Cobbled Chalcanthite Wall=Gerumpelte Chalkanthitwand + +Chrysoprase Wall=Chrysopraswand +Chrysoprase Brick Wall=Chrysoprasziegelwand +Chrysoprase Block Wall=Chrysoprasblockwand +Cracked Chrysoprase Brick Wall=Rissige Chrysoprasziegelwand + +Citrine Wall=Citrinwand +Citrine Brick Wall=Citrinziegelwand +Citrine Block Wall=Citrinblockwand +Cracked Citrine Brick Wall=Rissige Citrinziegelwand + +Covellite Wall=Covellitwand +Covellite Brick Wall=Covellitziegelwand +Covellite Block Wall=Covellitblockwand +Cracked Covellite Brick Wall=Rissige Covellitziegelwand +Cobbled Covellite Wall=Gepflasterte Covellitwand + +Crocoite Wall=Crocoitwand +Crocoite Brick Wall=Crocoitziegelwand +Crocoite Block Wall=Crocoitblockwand +Cracked Crocoite Brick Wall=Rissige Crocoitziegelwand + +Diorite Wall=Dioritwand +Diorite Brick Wall=Dioritziegelwand +Diorite Block Wall=Dioritblockwand +Cracked Diorite Brick Wall=Rissige Dioritziegelwand +Cobbled Diorite Wall=Gepflasterte Dioritwand + +Erythrite Wall=Erythritwand +Erythrite Brick Wall=Erythritziegelwand +Erythrite Block Wall=Erythritblockwand +Cracked Erythrite Brick Wall=Rissige Erythritziegelwand + +Eudialite Wall=Eudialitwand +Eudialite Brick Wall=Eudialitziegelwand +Eudialite Block Wall=Eudialitblockwand +Cracked Eudialite Brick Wall=Rissige Eudialitziegelwand + +Fluorite Wall=Fluoritwand +Fluorite Brick Wall=Fluoritziegelwand +Fluorite Block Wall=Fluoritblockwand +Cracked Fluorite Brick Wall=Rissige Fluoritziegelwand + +Gabbro Wall=Gabbrowand +Cobbled Gabbro Wall=Gepflasterte Gabbrowand +Gabbro Brick Wall=Gabbroziegelwand +Gabbro Block Wall=Gabbroblockwand +Cracked Gabbro Brick Wall=Rissige Gabbroziegelwand + +Galena Wall=Galenawand +Galena Brick Wall=Galenaziegelwand +Galena Block Wall=Galenablockwand +Cracked Galena Brick Wall=Rissige Galenaziegelwand + +Black Granite Wall=Schwarze Granitwand +Black Granite Brick Wall=Schwarze Granitziegelwand +Black Granite Block Wall=Schwarze Granitblockwand +Cracked Black Granite Brick Wall=Rissige schwarze Granitziegelwand +Cobbled Black Granite Wall=Gepflasterte schwarze Granitwand + +Blue Granite Wall=Blaue Granitwand +Blue Granite Brick Wall=Blaue Granitziegelwand +Blue Granite Block Wall=Blaue Granitblockwand +Cracked Blue Granite Brick Wall=Rissige blaue Granitziegelwand +Cobbled Blue Granite Wall=Gepflasterte blaue Granitwand + +Gray Granite Wall=Graue Granitwand +Gray Granite Brick Wall=Graue Granitziegelwand +Gray Granite Block Wall=Graue Granitblockwand +Cracked Gray Granite Brick Wall=Rissige graue Granitziegelwand +Cobble Gray Granite Wall=Gepflasterte graue Granitwand + +Green Granite Wall=Grüne Granitwand +Green Granite Brick Wall=Grüne Granitziegelwand +Green Granite Block Wall=Grüne Granitblockwand +Cracked Green Granite Brick Wall=Rissige grüne Granitziegelwand +Cobbled Green Granite Wall=Gepflasterte grüne Granitwand + +Pink Granite Wall=Rosa Granitwand +Pink Granite Brick Wall=Rosa Granitziegelwand +Pink Granite Block Wall=Rosa Granitblockwand +Cracked Pink Granite Brick Wall=Rissige rosa Granitziegelwand +Cobbled Pink Granite Wall=Gepflasterte rosa Granitwand + +Red Granite Wall=Rote Granitwand +Red Granite Brick Wall=Rote Granitziegelwand +Red Granite Block Wall=Rote Granitblockwand +Cracked Red Granite Brick Wall=Rissige rote Granitziegelwand +Cobbled Red Granite Wall=Gepflasterte rote Granitwand + +White Granite Wall=Weiße Granitwand +White Granite Brick Wall=Weiße Granitziegelwand +White Granite Block Wall=Weiße Granitblockwand +Cracked White Granite Brick Wall=Rissige weiße Granitziegelwand +Cobbled White Granite Wall=Gepflasterte weiße Granitwand + +Yellow Granite Wall=Gelbe Granitwand +Yellow Granite Brick Wall=Gelbe Granitziegelwand +Yellow Granite Block Wall=Gelbe Granitblockwand +Cracked Yellow Granite Brick Wall=Rissige gelbe Granitziegelwand +Cobbled Yellow Granite Wall=Gepflasterte gelbe Granitwand + +Heliodor Wall=Heliodorwand +Heliodor Brick Wall=Heliodorziegelwand +Heliodor Block Wall=Heliodorblockwand +Cracked Heliodor Brick Wall=Rissige Heliodorziegelwand + +Howlite Wall=Howlitwand +Howlite Brick Wall=Howlitziegelwand +Howlite Block Wall=Howlitblockwand +Cracked Howlite Brick Wall=Rissige Howlitziegelwand +Cobbled Howlite Wall=Gepflasterte Howlitwand + +Ilvaite Wall=Ilvaitwand +Ilvaite Brick Wall=Ilvaitziegelwand +Ilvaite Block Wall=Ilvaitblockwand +Cracked Ilvaite Brick Wall=Rissige Ilvaitziegelwand +Cobbled Ilvaite Wall=Gepflasterte Ilvaitwand + +Jade Wall=Jadewand +Jade Brick Wall=Jadeziegelwand +Jade Block Wall=Jadeblockwand +Cracked Jade Brick Wall=Rissige Jadeziegelwand +Cobbled Jade Wall=Gepflasterte Jadewand + +Red Jasper Wall=Rote Jaspiswand +Red Jasper Brick Wall=Rote Jaspisziegelwand +Red Jasper Block Wall=Rote Jaspisblockwand +Cracked Red Jasper Brick Wall=Gerissene rote Jaspisziegelwand +Cobbled Red Jasper Wall=Gerumpelte rote Jaspiswand + +Kyanite Wall=Kyanitwand +Kyanite Brick Wall=Kyanitziegelwand +Kyanite Block Wall=Kyanitblockwand +Cracked Kyanite Brick Wall=Rissige Kyanitziegelwand +Cobbled Kyanite Wall=Gepflasterte Kyanitwand + +Lapis Lazuli Wall=Lapislazuliwand +Lapis Lazuli Brick Wall=Lapislazuliziegelwand +Lapis Lazuli Block Wall=Lapislazuliblockwand +Cracked Lapis Lazuli Brick Wall=Rissige Lapislazuliziegelwand + +Lepidolite=Lepidolith +Lepidolite Block=Lepidolithblock +Lepidolite Brick=Lepidolithziegel +Cracked Lepidolite Brick=Gerissener Lepidolithziegel +Cobbled Lepidolite=Gerumpelter Lepidolith + +Blue Limestone Wall=Blaue Kalksteinwand +Blue Limestone Brick Wall=Blaue Kalksteinziegelwand +Blue Limestone Block Wall=Blaue Kalksteinblockwand +Cracked Blue Limestone Brick Wall=Rissige blaue Kalksteinziegelwand +Cobbled Blue Limestone Wall=Gepflasterte blaue Kalksteinwand + +White Limestone Wall=Weiße Kalksteinwand +White Limestone Brick Wall=Weiße Kalksteinziegelwand +White Limestone Block Wall=Weiße Kalksteinblockwand +Cracked White Limestone Brick Wall=Rissige weiße Kalksteinziegelwand +Cobbled White Limestone Wall=Gepflasterte weiße Kalksteinwand + +Marble Wall=Marmorwand +Marble Brick Wall=Marmorziegelwand +Marble Block Wall=Marmorblockwand +Cracked Marble Brick Wall=Rissige Marmorziegelwand +Cobbled Marble Wall=Gepflasterte Marmorwand + +Moonstone Wall=Mondsteinwand +Moonstone Brick Wall=Mondsteinziegelwand +Moonstone Block Wall=Mondsteinblockwand +Cracked Moonstone Brick Wall=Gerissene Mondsteinziegelwand + +Morion Quartz Wall=Morionquarzwand +Morion Quartz Brick Wall=Morionquarzziegelwand +Morion Quartz Block Wall=Morionquartzblockwand +Cracked Morion Quartz Brick Wall=Rissige Morionquarzziegelwand + +Mudstone Wall=Schlammsteinwand +Cobbled Mudstone Wall=Gepflasterte Schlammsteinwand +Mudstone Brick Wall=Schlammsteinziegelwand +Mudstone Block Wall=Schlammsteinblockwand +Cracked Mudstone Brick Wall=Rissige Schlammsteinziegelwand + +Prasiolite Wall=Prasiolithwand +Prasiolite Brick Wall=Prasiolithziegelwand +Prasiolite Block Wall=Prasiolithblockwand +Cracked Prasiolite Brick Wall=Rissige Prasiolithziegelwand + +Pumice Wall=Bimssteinwand +Pumice Brick Wall=Bimssteinziegelwand +Pumice Block Wall=Bimssteinblockwand +Cracked Pumice Brick Wall=Rissige Bimssteinziegelwand + +Pyrite Wall=Pyritwand +Pyrite Brick Wall=Pyritziegelwand +Pyrite Block Wall=Pyritblockwand +Cracked Pyrite Brick Wall=Rissige Pyritziegelwand + +Quartz Wall=Quarzwand +Quartz Brick Wall=Quarzziegelwand +Quartz Block Wall=Quarzblockwand +Cracked Quartz Brick Wall=Rissige Quarzziegelwand + +Rhodonite Wall=Rhodonitwand +Rhodonite Brick Wall=Rhodonitziegelwand +Rhodonite Block Wall=Rhodonitblockwand +Cracked Rhodonite Brick Wall=Gerissene Rhodonitziegelwand +Cobbled Rhodonite Wall=Gefaste Rhodonitwand + +Rose Quartz Wall=Rosenquarzwand +Rose Quartz Brick Wall=Rosenquarzziegelwand +Rose Quartz Block Wall=Rosenquartzblockwand +Cracked Rose Quartz Brick Wall=Rissige Rosenquarzziegelwand + +Scoria Wall=Skoriawand +Scoria Brick Wall=Skoriaziegelwand +Scoria Block Wall=Skoriablockwand +Cracked Scoria Brick Wall=Rissige Skoriaziegelwand +Cobbled Scoria Wall=Gepflasterte Skoriawand + +Serpentine Wall=Serpentinwand +Cobbled Serpentine Wall=Gepflasterte Serpentinwand +Serpentine Brick Wall=Serpentinziegelwand +Serpentine Block Wall=Serpentinblockwand +Cracked Serpentine Brick Wall=Rissige Serpentinziegelwand + +Shale Wall=Schieferwand +Shale Brick Wall=Schieferziegelwand +Shale Block Wall=Schieferblockwand +Cracked Shale Brick Wall=Rissige Schieferziegelwand +Cobbled Shale Wall=Gepflasterte Schieferwand + +Slate Wall=Schiefertafelwand +Slate Brick Wall=Schiefertafelziegelwand +Slate Block Wall=Schiefertafelblockwand +Cracked Slate Brick Wall=Rissige Schiefertafelziegelwand +Cobbled Slate Wall=Gepflasterte Schiefertafelwand +Slate Tile Wall=Schiefertafelfliesenwand + +Smokey Quartz Wall=Rauchquarzwand +Smokey Quartz Brick Wall=Rauchquarzziegelwand +Smokey Quartz Block Wall=Rauchquarzblockwand +Cracked Smokey Quartz Brick Wall=Rissige Rauchquarzziegelwand + +Soapstone Wall=Specksteinwand +Soapstone Brick Wall=Specksteinziegelwand +Soapstone Block Wall=Specksteinblockwand +Cracked Soapstone Brick Wall=Rissige Specksteinziegelwand + +Sodalite Wall=Sodalitwand +Cobbled Sodalite Wall=Gepflasterte Sodalitwand +Sodalite Brick Wall=Sodalitziegelwand +Sodalite Block Wall=Sodalitblockwand +Cracked Sodalite Brick Wall=Rissige Sodalitziegelwand + +Sugilite Wall=Sugilitwand +Sugilite Brick Wall=Sugilitziegelwand +Sugilite Block Wall=Sugilitblockwand +Cracked Sugilite Brick Wall=Rissige Sugilitziegelwand +Cobbled Sugilite Wall=Gepflasterte Sugilitwand + +Green Tourmaline Wall=Grüne Turmalinwand +Green Tourmaline Brick Wall=Grüner Turmalinziegelwand +Green Tourmaline Block Wall=Grüner Turmalinblockwand +Cracked Green Tourmaline Brick Wall=Gerissene grüne Turmalinziegelwand + +Paraiba Tourmaline Wall=Paraíba-Turmalinwand +Paraiba Tourmaline Brick Wall=Paraíba-Turmalinziegelwand +Paraiba Tourmaline Block Wall=Paraíba-Turmalinblockwand +Cracked Paraiba Tourmaline Brick Wall=Gerissene Paraíba-Turmalinziegelwand + +Pink Tourmaline Wall=Rosa Turmalinwand +Pink Tourmaline Brick Wall=Rosa Turmalinziegelwand +Pink Tourmaline Block Wall=Rosa Turmalinblockwand +Cracked Pink Tourmaline Brick Wall=Gerissene rosa Turmalinziegelwand + +Travertine Wall=Travertinwand +Cobbled Travertine Wall=Gepflasterte Travertinwand +Travertine Brick Wall=Travertinziegelwand +Travertine Block Wall=Travertinblockwand +Cracked Travertine Brick Wall=Rissige Travertinziegelwand + +Yellow Travertine Wall=Gelber Travertinwand +Cobbled Yellow Travertine Wall=Gepflasterte gelbe Travertinwand +Yellow Travertine Brick Wall=Gelbe Travertinziegelwand +Yellow Travertine Block Wall=Gelber Travertinblockwand +Cracked Yellow Travertine Brick Wall=Rissige gelbe Travertinziegelwand + +Beige Tuff Wall=Beige Tuffwand +Cobbled Beige Tuff Wall=Gepflasterte beige Tuffwand +Beige Tuff Block Wall=Beige Tuffblockwand +Beige Tuff Brick Wall=Beige Tuffziegelwand +Cracked Beige Tuff Brick Wall=Rissige Beige Tuffziegelwand + +Grey Tuff Wall=Graue Tuffwand +Cobbled Grey Tuff Wall=Gepflasterte graue Tuffwand +Grey Tuff Block Wall=Graue Tuffblockwand +Grey Tuff Brick Wall=Graue Tuffziegelwand +Cracked Grey Tuff Brick Wall=Rissige graue Tuffziegelwand + +Red Tuff Wall=Rote Tuffwand +Cobbled Red Tuff Wall=Gepflasterte rote Tuffwand +Red Tuff Block Wall=Rote Tuffblockwand +Red Tuff Brick Wall=Rote Tuffziegelwand +Cracked Red Tuff Brick Wall=Rissige rote Tuffziegelwand + +Turquoise Wall=Türkiswand +Turquoise Brick Wall=Türkisziegelwand +Turquoise Block Wall=Türkisblockwand +Cracked Turquoise Brick Wall=Rissige Türkisziegelwand +Cobbled Turquoise Wall=Gepflasterte Türkiswand + +Vivianite Wall=Vivianitwand +Vivianite Brick Wall=Vivianitziegelwand +Vivianite Block Wall=Vivianitblockwand +Cracked Vivianite Brick Wall=Rissige Vivianitziegelwand + +### stairs.lua ### + +Blue Agate Slab=Blaue Achatplatte +Gray Agate Slab=Graue Achatplatte +Green Agate Slab=Grüne Achatplatte +Moss Agate Slab=Moosachatplatte +Orange Agate Slab=Orangefarbene Achatplatte +Purple Agate Slab=Violette Achatplatte +Red Agate Slab=Rote Achatplatte + +Amazonite Slab=Amazonitplatte +Cobbled Amazonite Slab=Gepflasterte Amazonitplatte +Amazonite Brick Slab=Amazonitziegelplatte +Amazonite Block Slab=Amazonitblockplatte +Cracked Amazonite Brick Slab=Rissige Amazonitziegelplatte + +Amber Slab=Bernsteinplatte +Amber Brick Slab=Bernsteinziegelplatte +Amber Block Slab=Bernsteinblockplatte +Cracked Amber Brick Slab=Rissige Bernsteinziegelplatte + +Amethyst Slab=Amethystplatte +Amethyst Brick Slab=Amethystziegelplatte +Amethyst Block Slab=Amethystblockplatte +Cracked Amethyst Brick Slab=Rissige Amethystziegelplatte + +Andesite Slab=Andesitplatte +Andesite Block Slab=Andesitblockplatte +Cobbled Andesite Slab=Gepflasterte Andesitplatte +Andesite Brick Slab=Andesitziegelplatte +Cobbled Andesite Brick Slab=Gepflasterte Andesitziegelplatte + +Basalt Slab=Basaltsplatte +Basalt Block Slab=Basaltblockplatte +Basalt Brick Slab=Basaltziegelplatte +Cracked Basalt Brick Slab=Rissige Basaltziegelplatte +Cobbled Basalt Slab=Gepflasterte Basaltsplatte +Basalt Tile Slab=Basaltfliesenplatte + +Black Moonstone Slab=Schwarze Mondsteinplatte +Black Moonstone Brick Slab=Schwarze Mondsteinziegelplatte +Black Moonstone Block Slab=Schwarze Mondsteinblockplatte +Cracked Black Moonstone Brick Slab=Rissige Schwarze Mondsteinziegelplatte + +Calcite Slab=Calcitplatte +Calcite Brick Slab=Calcitziegelplatte +Calcite Block Slab=Calcitblockplatte +Cracked Calcite Brick Slab=Rissige Calcitziegelplatte + +Grey Calcite Slab=Graue Calcitplatte +Grey Calcite Brick Slab=Graue Calcitziegelplatte +Grey Calcite Block Slab=Graue Calcitblockplatte +Cracked Grey Calcite Brick Slab=Gerissene Platte aus grauem Calcitziegel + +Orange Calcite Slab=Orangefarbene Calcitplatte +Orange Calcite Brick Slab=Orangefarbene Calcitziegelplatte +Orange Calcite Block Slab=Orangefarbene Calcitblockplatte +Cracked Orange Calcite Brick Slab=Gerissene Platte aus orangefarbenem Calcitziegel + +Carnotite Slab=Carnotitplatte +Carnotite Brick Slab=Carnotitziegelplatte +Carnotite Block Slab=Carnotitblockplatte +Cracked Carnotite Brick Slab=Rissige Carnotitziegelplatte +Cobbled Carnotite Slab=Gepflasterte Carnotitplatte + +Celestine Slab=Celestinplatte +Celestine Brick Slab=Celestinziegelplatte +Celestine Block Slab=Celestinblockplatte +Cracked Celestine Brick Slab=Rissige Celestinziegelplatte + +Chalcanthite Slab=Chalkanthitplatte +Chalcanthite Brick Slab=Chalkanthitziegelplatte +Chalcanthite Block Slab=Chalkanthitblockplatte +Cracked Chalcanthite Brick Slab=Gerissene Chalkanthitziegelplatte +Cobbled Chalcanthite Slab=Gerumpelte Chalkanthitplatte + +Chrysoprase Slab=Chrysoprasplatte +Chrysoprase Brick Slab=Chrysoprasziegelplatte +Chrysoprase Block Slab=Chrysoprasblockplatte +Cracked Chrysoprase Brick Slab=Rissige Chrysoprasziegelplatte + +Citrine Slab=Citrinplatte +Citrine Brick Slab=Citrinziegelplatte +Citrine Block Slab=Citrinblockplatte +Cracked Citrine Brick Slab=Rissige Citrinziegelplatte + +Covellite Slab=Covellitplatte +Covellite Brick Slab=Covellitziegelplatte +Covellite Block Slab=Covellitblockplatte +Cracked Covellite Brick Slab=Rissige Covellitziegelplatte +Cobbled Covellite Slab=Gepflasterte Covellitplatte + +Crocoite Slab=Crocoitplatte +Crocoite Brick Slab=Crocoitziegelplatte +Crocoite Block Slab=Crocoitblockplatte +Cracked Crocoite Brick Slab=Rissige Crocoitziegelplatte + +Diorite Slab=Dioritplatte +Diorite Brick Slab=Dioritziegelplatte +Diorite Block Slab=Dioritblockplatte +Cracked Diorite Brick Slab=Rissige Dioritziegelplatte +Cobbled Diorite Slab=Gepflasterte Dioritplatte + +Erythrite Slab=Erythritplatte +Erythrite Brick Slab=Erythritziegelplatte +Erythrite Block Slab=Erythritblockplatte +Cracked Erythrite Brick Slab=Rissige Erythritziegelplatte + +Eudialite Slab=Eudialitplatte +Eudialite Brick Slab=Eudialitziegelplatte +Eudialite Block Slab=Eudialitblockplatte +Cracked Eudialite Brick Slab=Rissige Eudialitziegelplatte + +Fluorite Slab=Fluoritplatte +Fluorite Brick Slab=Fluoritziegelplatte +Fluorite Block Slab=Fluoritblockplatte +Cracked Fluorite Brick Slab=Rissige Fluoritziegelplatte + +Gabbro Slab=Gabbroplatte +Cobbled Gabbro Slab=Gepflasterte Gabbroplatte +Gabbro Brick Slab=Gabbroziegelplatte +Gabbro Block Slab=Gabbroblockplatte +Cracked Gabbro Brick Slab=Rissige Gabbroziegelplatte + +Galena Slab=Galenaplatte +Galena Brick Slab=Galenaziegelplatte +Galena Block Slab=Galenablockplatte +Cracked Galena Brick Slab=Rissige Galenaziegelplatte + +Black Granite Slab=Schwarze Granitplatte +Black Granite Brick Slab=Schwarze Granitziegelplatte +Black Granite Block Slab=Schwarze Granitblockplatte +Cracked Black Granite Brick Slab=Rissige Schwarze Granitziegelplatte +Cobbled Black Granite Slab=Gepflasterte Schwarze Granitplatte + +Blue Granite Slab=Blaue Granitplatte +Blue Granite Brick Slab=Blaue Granitziegelplatte +Blue Granite Block Slab=Blaue Granitblockplatte +Cracked Blue Granite Brick Slab=Rissige Blaue Granitziegelplatte +Cobbled Blue Granite Slab=Gepflasterte Blaue Granitplatte + +Gray Granite Slab=Graue Granitplatte +Gray Granite Brick Slab=Graue Granitziegelplatte +Gray Granite Block Slab=Graue Granitblockplatte +Cracked Gray Granite Brick Slab=Rissige Graue Granitziegelplatte +Cobbled Gray Granite Slab=Gepflasterte Graue Granitplatte + +Green Granite Slab=Grüne Granitplatte +Green Granite Brick Slab=Grüne Granitziegelplatte +Green Granite Block Slab=Grüne Granitblockplatte +Cracked Green Granite Brick Slab=Rissige Grüne Granitziegelplatte +Cobbled Green Granite Slab=Gepflasterte Grüne Granitplatte + +Pink Granite Slab=Rosa Granitplatte +Pink Granite Brick Slab=Rosa Granitziegelplatte +Pink Granite Block Slab=Rosa Granitblockplatte +Cracked Pink Granite Brick Slab=Rissige Rosa Granitziegelplatte +Cobbled Pink Granite Slab=Gepflasterte Rosa Granitplatte + +Red Granite Slab=Rote Granitplatte +Red Granite Brick Slab=Rote Granitziegelplatte +Red Granite Block Slab=Rote Granitblockplatte +Cracked Red Granite Brick Slab=Rissige Rote Granitziegelplatte +Cobbled Red Granite Slab=Gepflasterte Rote Granitplatte + +White Granite Slab=Weiße Granitplatte +White Granite Brick Slab=Weiße Granitziegelplatte +White Granite Block Slab=Weiße Granitblockplatte +Cracked White Granite Brick Slab=Rissige Weiße Granitziegelplatte +Cobbled White Granite Slab=Gepflasterte Weiße Granitplatte + +Yellow Granite Slab=Gelbe Granitplatte +Yellow Granite Brick Slab=Gelbe Granitziegelplatte +Yellow Granite Block Slab=Gelbe Granitblockplatte +Cracked Yellow Granite Brick Slab=Rissige Gelbe Granitziegelplatte +Cobbled Yellow Granite Slab=Gepflasterte Gelbe Granitplatte + +Heliodor Slab=Heliodorplatte +Heliodor Brick Slab=Heliodorziegelplatte +Heliodor Block Slab=Heliodorblockplatte +Cracked Heliodor Brick Slab=Rissige Heliodorziegelplatte + +Howlite Slab=Howlitplatte +Howlite Brick Slab=Howlitziegelplatte +Howlite Block Slab=Howlitblockplatte +Cracked Howlite Brick Slab=Rissige Howlitziegelplatte +Cobbled Howlite Slab=Gepflasterte Howlitplatte + +Ilvaite Slab=Ilvaitplatte +Ilvaite Brick Slab=Ilvaitziegelplatte +Ilvaite Block Slab=Ilvaitblockplatte +Cracked Ilvaite Brick Slab=Rissige Ilvaitziegelplatte +Cobbled Ilvaite Slab=Gepflasterte Ilvaitplatte + +Jade Slab=Jadeplatte +Jade Brick Slab=Jadeziegelplatte +Jade Block Slab=Jadeblockplatte +Cracked Jade Brick Slab=Rissige Jadeziegelplatte +Cobbled Jade Slab=Gepflasterte Jadeplatte + +Red Jasper Slab=Rote Jaspisplatte +Red Jasper Brick Slab=Rote Jaspisziegelplatte +Red Jasper Block Slab=Rote Jaspisblockplatte +Cracked Red Jasper Brick Slab=Gerissene rote Jaspisziegelplatte +Cobbled Red Jasper Slab=Gerumpelte rote Jaspisplatte + +Kyanite Slab=Kyanitplatte +Kyanite Brick Slab=Kyanitziegelplatte +Kyanite Block Slab=Kyanitblockplatte +Cracked Kyanite Brick Slab=Rissige Kyanitziegelplatte +Cobbled Kyanite Slab=Gepflasterte Kyanitplatte + +Lapis Lazuli Slab=Lapislazuliplatte +Lapis Lazuli Brick Slab=Lapislazuliziegelplatte +Lapis Lazuli Block Slab=Lapislazuliblockplatte +Cracked Lapis Lazuli Brick Slab=Rissige Lapislazuliziegelplatte + +Lepidolite Slab=Lepidolithplatte +Lepidolite Brick Slab=Lepidolithziegelplatte +Lepidolite Block Slab=Lepidolithblockplatte +Cracked Lepidolite Brick Slab=Gerissene Lepidolithziegelplatte +Cobbled Lepidolite Slab=Gerumpelte Lepidolithplatte + +Blue Limestone Slab=Blaue Kalksteinplatte +Blue Limestone Brick Slab=Blaue Kalksteinziegelplatte +Blue Limestone Block Slab=Blaue Kalksteinblockplatte +Cracked Blue Limestone Brick Slab=Rissige Blaue Kalksteinziegelplatte +Cobbled Blue Limestone Slab=Gepflasterte Blaue Kalksteinplatte + +White Limestone Slab=Weiße Kalksteinplatte +White Limestone Brick Slab=Weiße Kalksteinziegelplatte +White Limestone Block Slab=Weiße Kalksteinblockplatte +Cracked White Limestone Brick Slab=Rissige Weiße Kalksteinziegelplatte +Cobbled White Limestone Slab=Gepflasterte Weiße Kalksteinplatte + +Marble Slab=Marmorplatte +Marble Brick Slab=Marmorziegelplatte +Marble Block Slab=Marmorblockplatte +Cracked Marble Brick Slab=Rissige Marmorziegelplatte +Cobbled Marble Slab=Gepflasterte Marmorplatte + +Moonstone Slab=Mondsteinplatte +Moonstone Brick Slab=Mondsteinziegelplatte +Moonstone Block Slab=Mondsteinblockplatte +Cracked Moonstone Brick Slab=Gerissene Mondsteinziegelplatte + +Morion Quartz Slab=Morionquarzplatte +Morion Quartz Brick Slab=Morionquarzziegelplatte +Morion Quartz Block Slab=Morionquarzblockplatte +Cracked Morion Quartz Brick Slab=Rissige Morionquarzziegelplatte + +Mudstone Slab=Schlammsteinplatte +Cobbled Mudstone Slab=Gepflasterte Schlammsteinplatte +Mudstone Brick Slab=Schlammsteinziegelplatte +Mudstone Block Slab=Schlammsteinblockplatte +Cracked Mudstone Brick Slab=Rissige Schlammsteinziegelplatte + +Prasiolite Slab=Prasiolithplatte +Cobbled Prasiolite Slab=Gepflasterte Prasiolithplatte +Prasiolite Brick Slab=Prasiolithziegelplatte +Prasiolite Block Slab=Prasiolithblockplatte +Cracked Prasiolite Brick Slab=Rissige Prasiolithziegelplatte + +Pumice Slab=Bimssteinplatte +Pumice Brick Slab=Bimssteinziegelplatte +Pumice Block Slab=Bimssteinblockplatte +Cracked Pumice Brick Slab=Rissige Bimssteinziegelplatte + +Pyrite Slab=Pyritplatte +Pyrite Brick Slab=Pyritziegelplatte +Pyrite Block Slab=Pyritblockplatte +Cracked Pyrite Brick Slab=Rissige Pyritziegelplatte + +Quartz Slab=Quarzplatte +Cobbled Quartz Slab=Gepflasterte Quarzplatte +Quartz Brick Slab=Quarzziegelplatte +Quartz Block Slab=Quarzblockplatte +Cracked Quartz Brick Slab=Rissige Quarzziegelplatte + +Rhodonite Slab=Rhodonitplatte +Rhodonite Brick Slab=Rhodonitziegelplatte +Rhodonite Block Slab=Rhodonitblockplatte +Cracked Rhodonite Brick Slab=Gerissene Rhodonitziegelplatte +Cobbled Rhodonite Slab=Gefaste Rhodonitplatte + +Rose Quartz Slab=Rosenquarzplatte +Rose Quartz Brick Slab=Rosenquarzziegelplatte +Rose Quartz Block Slab=Rosenquarzblockplatte +Cracked Rose Quartz Brick Slab=Rissige Rosenquarzziegelplatte + +Scoria Slab=Skoriaplatte +Scoria Brick Slab=Skoriaziegelplatte +Scoria Block Slab=Skoriablockplatte +Cracked Scoria Brick Slab=Rissige Skoriaziegelplatte +Cobbled Scoria Slab=Gepflasterte Skoriaplatte + +Serpentine Slab=Serpentinsteinplatte +Cobbled Serpentine Slab=Gepflasterte Serpentinsteinplatte +Serpentine Brick Slab=Serpentinsteinziegelplatte +Serpentine Block Slab=Serpentinsteinblockplatte +Cracked Serpentine Brick Slab=Rissige Serpentinsteinziegelplatte + +Shale Slab=Schiefersplatte +Shale Brick Slab=Schieferziegelplatte +Shale Block Slab=Schieferblockplatte +Cracked Shale Brick Slab=Rissige Schieferziegelplatte +Cobbled Shale Slab=Gepflasterte Schiefersplatte + +Slate Slab=Schieferplatte +Slate Brick Slab=Schieferziegelplatte +Slate Block Slab=Schieferblockplatte +Cracked Slate Brick Slab=Rissige Schieferziegelplatte +Cobbled Slate Slab=Gepflasterte Schieferplatte +Slate Tile Slab=Schieferfliesenplatte + +Smokey Quartz Slab=Rauchquarzplatte +Smokey Quartz Brick Slab=Rauchquarzziegelplatte +Smokey Quartz Block Slab=Rauchquarzblockplatte +Cracked Smokey Quartz Brick Slab=Rissige Rauchquarzziegelplatte + +Soapstone Slab=Specksteinplatte +Soapstone Brick Slab=Specksteinziegelplatte +Soapstone Block Slab=Specksteinblockplatte +Cracked Soapstone Brick Slab=Rissige Specksteinziegelplatte + +Sodalite Slab=Sodalithplatte +Cobbled Sodalite Slab=Gepflasterte Sodalithplatte +Sodalite Brick Slab=Sodalithziegelplatte +Sodalite Block Slab=Sodalithblockplatte +Cracked Sodalite Brick Slab=Rissige Sodalithziegelplatte + +Sugilite Slab=Sugilithplatte +Sugilite Brick Slab=Sugilithziegelplatte +Sugilite Block Slab=Sugilithblockplatte +Cracked Sugilite Brick Slab=Rissige Sugilithziegelplatte +Cobbled Sugilite Slab=Gepflasterte Sugilithplatte + +Green Tourmaline Slab=Grüner Turmalinplatte +Green Tourmaline Brick Slab=Grüner Turmalinziegelplatte +Green Tourmaline Block Slab=Grüner Turmalinblockplatte +Cracked Green Tourmaline Brick Slab=Gerissene grüne Turmalinziegelplatte + +Paraiba Tourmaline Slab=Paraíba-Turmalinplatte +Paraiba Tourmaline Brick Slab=Paraíba-Turmalinziegelplatte +Paraiba Tourmaline Block Slab=Paraíba-Turmalinblockplatte +Cracked Paraiba Tourmaline Brick Slab=Gerissene Paraíba-Turmalinziegelplatte + +Pink Tourmaline Slab=Rosa Turmalinplatte +Pink Tourmaline Brick Slab=Rosa Turmalinziegelplatte +Pink Tourmaline Block Slab=Rosa Turmalinblockplatte +Cracked Pink Tourmaline Brick Slab=Gerissene rosa Turmalinziegelplatte + +Travertine Slab=Travertinplatte +Cobbled Travertine Slab=Gepflasterte Travertinplatte +Travertine Brick Slab=Travertinziegelplatte +Travertine Block Slab=Travertinblockplatte +Cracked Travertine Brick Slab=Rissige Travertinziegelplatte + +Yellow Travertine Slab=Gelbe Travertinplatte +Cobbled Yellow Travertine Slab=Gepflasterte Gelbe Travertinplatte +Yellow Travertine Brick Slab=Gelbe Travertinziegelplatte +Yellow Travertine Block Slab=Gelbe Travertinblockplatte +Cracked Yellow Travertine Brick Slab=Rissige Gelbe Travertinziegelplatte + +Beige Tuff Slab=Beige Tuffplatte +Cobbled Beige Tuff Slab=Gepflasterte Beige Tuffplatte +Beige Tuff Block Slab=Beige Tuffblockplatte +Beige Tuff Brick Slab=Beige Tuffziegelplatte +Cracked Beige Tuff Brick Slab=Rissige Beige Tuffziegelplatte + +Grey Tuff Slab=Graue Tuffplatte +Cobbled Grey Tuff Slab=Gepflasterte Graue Tuffplatte +Grey Tuff Block Slab=Graue Tuffblockplatte +Grey Tuff Brick Slab=Graue Tuffziegelplatte +Cracked Grey Tuff Brick Slab=Rissige Graue Tuffziegelplatte + +Red Tuff Slab=Rote Tuffplatte +Cobbled Red Tuff Slab=Gepflasterte Rote Tuffplatte +Red Tuff Block Slab=Rote Tuffblockplatte +Red Tuff Brick Slab=Rote Tuffziegelplatte +Cracked Red Tuff Brick Slab=Rissige Rote Tuffziegelplatte + +Turquoise Slab=Türkisplatte +Turquoise Brick Slab=Türkisziegelplatte +Turquoise Block Slab=Türkisblockplatte +Cracked Turquoise Brick Slab=Rissige Türkisziegelplatte +Cobbled Turquoise Slab=Gepflasterte Türkisplatte + +Vivianite Slab=Vivianitplatte +Cobbled Vivianite Slab=Gepflasterte Vivianitplatte +Vivianite Brick Slab=Vivianitziegelplatte +Vivianite Block Slab=Vivianitblockplatte +Cracked Vivianite Brick Slab=Rissige Vivianitziegelplatte + + + +Blue Agate Stair=Blaue Achat-Treppe +Gray Agate Stair=Graue Achat-Treppe +Green Agate Stair=Grüne Achat-Treppe +Moss Agate Stair=Moosachat-Treppe +Orange Agate Stair=Orange Achat-Treppe +Purple Agate Stair=Lila Achat-Treppe +Red Agate Stair=Rote Achat-Treppe + +Amazonite Stair=Amazonit-Treppe +Cobbled Amazonite Stair=Gepflasterte Amazonit-Treppe +Amazonite Brick Stair=Amazonit-Ziegel-Treppe +Amazonite Block Stair=Amazonit-Block-Treppe +Cracked Amazonite Brick Stair=Rissige Amazonit-Ziegel-Treppe + +Amber Stair=Bernstein-Treppe +Amber Brick Stair=Bernstein-Ziegel-Treppe +Amber Block Stair=Bernstein-Block-Treppe +Cracked Amber Brick Stair=Rissige Bernstein-Ziegel-Treppe + +Amethyst Stair=Amethyst-Treppe +Amethyst Brick Stair=Amethyst-Ziegel-Treppe +Amethyst Block Stair=Amethyst-Block-Treppe +Cracked Amethyst Brick Stair=Rissige Amethyst-Ziegel-Treppe + +Andesite Stair=Andesit-Treppe +Andesite Block Stair=Andesit-Block-Treppe +Cobbled Andesite Stair=Gepflasterte Andesit-Treppe +Andesite Brick Stair=Andesit-Ziegel-Treppe +Cobbled Andesite Brick Stair=Gepflasterte Andesit-Ziegel-Treppe + +Basalt Stair=Basalt-Treppe +Basalt Block Stair=Basalt-Block-Treppe +Basalt Brick Stair=Basalt-Ziegel-Treppe +Cracked Basalt Brick Stair=Rissige Basalt-Ziegel-Treppe +Cobbled Basalt Stair=Gepflasterte Basalt-Treppe +Basalt Tile Stairs=Basaltfliesentreppen + +Black Moonstone Stair=Schwarze Mondstein-Treppe +Black Moonstone Brick Stair=Schwarze Mondstein-Ziegel-Treppe +Black Moonstone Block Stair=Schwarze Mondstein-Block-Treppe +Cracked Black Moonstone Brick Stair=Rissige Schwarze Mondstein-Ziegel-Treppe + +Calcite Stair=Calcit-Treppe +Calcite Brick Stair=Calcit-Ziegel-Treppe +Calcite Block Stair=Calcit-Block-Treppe +Cracked Calcite Brick Stair=Rissige Calcit-Ziegel-Treppe + +Grey Calcite Stair=Graue Calcittreppe +Grey Calcite Brick Stair=Graue Calcitziegeltreppe +Grey Calcite Block Stair=Graue Calcitblocktreppe +Cracked Grey Calcite Brick Stair=Gerissene Treppe aus grauem Calcitziegel + +Orange Calcite Stair=Orangefarbene Calcittreppe +Orange Calcite Brick Stair=Orangefarbene Calcitziegeltreppe +Orange Calcite Block Stair=Orangefarbene Calcitblocktreppe +Cracked Orange Calcite Brick Stair=Gerissene Treppe aus orangefarbenem Calcitziegel + +Carnotite Stair=Carnotit-Treppe +Carnotite Brick Stair=Carnotit-Ziegel-Treppe +Carnotite Block Stair=Carnotit-Block-Treppe +Cracked Carnotite Brick Stair=Rissige Carnotit-Ziegel-Treppe +Cobbled Carnotite Stair=Gepflasterte Carnotit-Treppe + +Celestine Stair=Cölestin-Treppe +Celestine Brick Stair=Cölestin-Ziegel-Treppe +Celestine Block Stair=Cölestin-Block-Treppe +Cracked Celestine Brick Stair=Rissige Cölestin-Ziegel-Treppe + +Chalcanthite Stair=Chalkanthittreppe +Chalcanthite Brick Stair=Chalkanthitziegeltreppe +Chalcanthite Block Stair=Chalkanthitblocktreppe +Cracked Chalcanthite Brick Stair=Gerissene Chalkanthitziegeltreppe +Cobbled Chalcanthite Stair=Gerumpelte Chalkanthittreppe + +Chrysoprase Stair=Chrysopras-Treppe +Chrysoprase Brick Stair=Chrysopras-Ziegel-Treppe +Chrysoprase Block Stair=Chrysopras-Block-Treppe +Cracked Chrysoprase Brick Stair=Rissige Chrysopras-Ziegel-Treppe + +Citrine Stair=Citrin-Treppe +Citrine Brick Stair=Citrin-Ziegel-Treppe +Citrine Block Stair=Citrin-Block-Treppe +Cracked Citrine Brick Stair=Rissige Citrin-Ziegel-Treppe + +Covellite Stair=Covellit-Treppe +Covellite Brick Stair=Covellit-Ziegel-Treppe +Covellite Block Stair=Covellit-Block-Treppe +Cracked Covellite Brick Stair=Rissige Covellit-Ziegel-Treppe +Cobbled Covellite Stair=Gepflasterte Covellit-Treppe + +Crocoite Stair=Crocoit-Treppe +Crocoite Brick Stair=Crocoit-Ziegel-Treppe +Crocoite Block Stair=Crocoit-Block-Treppe +Cracked Crocoite Brick Stair=Rissige Crocoit-Ziegel-Treppe + +Diorite Stair=Diorit-Treppe +Diorite Brick Stair=Diorit-Ziegel-Treppe +Diorite Block Stair=Diorit-Block-Treppe +Cracked Diorite Brick Stair=Rissige Diorit-Ziegel-Treppe +Cobbled Diorite Stair=Gepflasterte Diorit-Treppe + +Erythrite Stair=Erythrit-Treppe +Erythrite Brick Stair=Erythrit-Ziegel-Treppe +Erythrite Block Stair=Erythrit-Block-Treppe +Cracked Erythrite Brick Stair=Rissige Erythrit-Ziegel-Treppe + +Eudialite Stair=Eudialith-Treppe +Eudialite Brick Stair=Eudialith-Ziegel-Treppe +Eudialite Block Stair=Eudialith-Block-Treppe +Cracked Eudialite Brick Stair=Rissige Eudialith-Ziegel-Treppe + +Fluorite Stair=Fluorit-Treppe +Fluorite Brick Stair=Fluorit-Ziegel-Treppe +Fluorite Block Stair=Fluorit-Block-Treppe +Cracked Fluorite Brick Stair=Rissige Fluorit-Ziegel-Treppe + +Gabbro Stair=Gabbro-Treppe +Cobbled Gabbro Stair=Gepflasterte Gabbro-Treppe +Gabbro Brick Stair=Gabbro-Ziegel-Treppe +Gabbro Block Stair=Gabbro-Block-Treppe +Cracked Gabbro Brick Stair=Rissige Gabbro-Ziegel-Treppe + +Galena Stair=Galenit-Treppe +Galena Brick Stair=Galenit-Ziegel-Treppe +Galena Block Stair=Galenit-Block-Treppe +Cracked Galena Brick Stair=Rissige Galenit-Ziegel-Treppe + +Black Granite Stair=Schwarze Granit-Treppe +Black Granite Brick Stair=Schwarze Granit-Ziegel-Treppe +Black Granite Block Stair=Schwarze Granit-Block-Treppe +Cracked Black Granite Brick Stair=Rissige schwarze Granit-Ziegel-Treppe +Cobbled Black Granite Stair=Gepflasterte schwarze Granit-Treppe + +Blue Granite Stair=Blaue Granit-Treppe +Blue Granite Brick Stair=Blaue Granit-Ziegel-Treppe +Blue Granite Block Stair=Blaue Granit-Block-Treppe +Cracked Blue Granite Brick Stair=Rissige blaue Granit-Ziegel-Treppe +Cobbled Blue Granite Stair=Gepflasterte blaue Granit-Treppe + +Gray Granite Stair=Graue Granit-Treppe +Gray Granite Brick Stair=Graue Granit-Ziegel-Treppe +Gray Granite Block Stair=Graue Granit-Block-Treppe +Cracked Gray Granite Brick Stair=Rissige graue Granit-Ziegel-Treppe +Cobbled Gray Granite Stair=Gepflasterte graue Granit-Treppe + +Green Granite Stair=Grüne Granit-Treppe +Green Granite Brick Stair=Grüne Granit-Ziegel-Treppe +Green Granite Block Stair=Grüne Granit-Block-Treppe +Cracked Green Granite Brick Stair=Rissige grüne Granit-Ziegel-Treppe +Cobbled Green Granite Stair=Gepflasterte grüne Granit-Treppe + +Pink Granite Stair=Rosa Granit-Treppe +Pink Granite Brick Stair=Rosa Granit-Ziegel-Treppe +Pink Granite Block Stair=Rosa Granit-Block-Treppe +Cracked Pink Granite Brick Stair=Rissige rosa Granit-Ziegel-Treppe +Cobbled Pink Granite Stair=Gepflasterte rosa Granit-Treppe + +Red Granite Stair=Rote Granit-Treppe +Red Granite Brick Stair=Rote Granit-Ziegel-Treppe +Red Granite Block Stair=Rote Granit-Block-Treppe +Cracked Red Granite Brick Stair=Rissige rote Granit-Ziegel-Treppe +Cobbled Red Granite Stair=Gepflasterte rote Granit-Treppe + +White Granite Stair=Weiße Granit-Treppe +White Granite Brick Stair=Weiße Granit-Ziegel-Treppe +White Granite Block Stair=Weiße Granit-Block-Treppe +Cracked White Granite Brick Stair=Rissige weiße Granit-Ziegel-Treppe +Cobbled White Granite Stair=Gepflasterte weiße Granit-Treppe + +Yellow Granite Stair=Gelbe Granit-Treppe +Yellow Granite Brick Stair=Gelbe Granit-Ziegel-Treppe +Yellow Granite Block Stair=Gelbe Granit-Block-Treppe +Cracked Yellow Granite Brick Stair=Rissige gelbe Granit-Ziegel-Treppe +Cobbled Yellow Granite Stair=Gepflasterte gelbe Granit-Treppe + +Heliodor Stair=Heliodor-Treppe +Heliodor Brick Stair=Heliodor-Ziegel-Treppe +Heliodor Block Stair=Heliodor-Block-Treppe +Cracked Heliodor Brick Stair=Rissige Heliodor-Ziegel-Treppe + +Howlite Stair=Howlit-Treppe +Howlite Brick Stair=Howlit-Ziegel-Treppe +Howlite Block Stair=Howlit-Block-Treppe +Cracked Howlite Brick Stair=Rissige Howlit-Ziegel-Treppe +Cobbled Howlite Stair=Gepflasterte Howlit-Treppe + +Ilvaite Stair=Ilvait-Treppe +Ilvaite Brick Stair=Ilvait-Ziegel-Treppe +Ilvaite Block Stair=Ilvait-Block-Treppe +Cracked Ilvaite Brick Stair=Rissige Ilvait-Ziegel-Treppe +Cobbled Ilvaite Stair=Gepflasterte Ilvait-Treppe + +Jade Stair=Jade-Treppe +Jade Brick Stair=Jade-Ziegel-Treppe +Jade Block Stair=Jade-Block-Treppe +Cracked Jade Brick Stair=Rissige Jade-Ziegel-Treppe +Cobbled Jade Stair=Gepflasterte Jade-Treppe + +Red Jasper Stair=Rote Jaspistreppe +Red Jasper Brick Stair=Rote Jaspisziegeltreppe +Red Jasper Block Stair=Rote Jaspisblocktreppe +Cracked Red Jasper Brick Stair=Gerissene rote Jaspisziegeltreppe +Cobbled Red Jasper Stair=Gerumpelte rote Jaspistreppe + +Kyanite Stair=Kyanit-Treppe +Kyanite Brick Stair=Kyanit-Ziegel-Treppe +Kyanite Block Stair=Kyanit-Block-Treppe +Cracked Kyanite Brick Stair=Rissige Kyanit-Ziegel-Treppe +Cobbled Kyanite Stair=Gepflasterte Kyanit-Treppe + +Lapis Lazuli Stair=Lapislazuli-Treppe +Lapis Lazuli Brick Stair=Lapislazuli-Ziegel-Treppe +Lapis Lazuli Block Stair=Lapislazuli-Block-Treppe +Cracked Lapis Lazuli Brick Stair=Rissige Lapislazuli-Ziegel-Treppe + +Lepidolite Stair=Lepidolithtreppe +Lepidolite Brick Stair=Lepidolithziegeltreppe +Lepidolite Block Stair=Lepidolithblocktreppe +Cracked Lepidolite Brick Stair=Gerissene Lepidolithziegeltreppe +Cobbled Lepidolite Stair=Gerumpelte Lepidolithtreppe + +Blue Limestone Stair=Blaue Kalkstein-Treppe +Blue Limestone Brick Stair=Blaue Kalkstein-Ziegel-Treppe +Blue Limestone Block Stair=Blaue Kalkstein-Block-Treppe +Cracked Blue Limestone Brick Stair=Rissige blaue Kalkstein-Ziegel-Treppe +Cobbled Blue Limestone Stair=Gepflasterte blaue Kalkstein-Treppe + +White Limestone Stair=Weiße Kalkstein-Treppe +White Limestone Brick Stair=Weiße Kalkstein-Ziegel-Treppe +White Limestone Block Stair=Weiße Kalkstein-Block-Treppe +Cracked White Limestone Brick Stair=Rissige weiße Kalkstein-Ziegel-Treppe +Cobbled White Limestone Stair=Gepflasterte weiße Kalkstein-Treppe + +Marble Stair=Marmor-Treppe +Marble Brick Stair=Marmor-Ziegel-Treppe +Marble Block Stair=Marmor-Block-Treppe +Cracked Marble Brick Stair=Rissige Marmor-Ziegel-Treppe +Cobbled Marble Stair=Gepflasterte Marmor-Treppe + +Moonstone Stair=Mondsteintreppe +Moonstone Brick Stair=Mondsteinziegeltreppe +Moonstone Block Stair=Mondsteinblocktreppe +Cracked Moonstone Brick Stair=Gerissene Mondsteinziegeltreppe + +Morion Quartz Stair=Morionquarz-Treppe +Morion Quartz Brick Stair=Morionquarz-Ziegel-Treppe +Morion Quartz Block Stair=Morionquarz-Block-Treppe +Cracked Morion Quartz Brick Stair=Rissige Morionquarz-Ziegel-Treppe + +Mudstone Stair=Schlammstein-Treppe +Cobbled Mudstone Stair=Gepflasterte Schlammstein-Treppe +Mudstone Brick Stair=Schlammstein-Ziegel-Treppe +Mudstone Block Stair=Schlammstein-Block-Treppe +Cracked Mudstone Brick Stair=Rissige Schlammstein-Ziegel-Treppe + +Prasiolite Stair=Prasiolith-Treppe +Prasiolite Brick Stair=Prasiolith-Ziegel-Treppe +Prasiolite Block Stair=Prasiolith-Block-Treppe +Cracked Prasiolite Brick Stair=Rissige Prasiolith-Ziegel-Treppe + +Pumice Stair=Bimsstein-Treppe +Pumice Brick Stair=Bimsstein-Ziegel-Treppe +Pumice Block Stair=Bimsstein-Block-Treppe +Cracked Pumice Brick Stair=Rissige Bimsstein-Ziegel-Treppe + +Pyrite Stair=Pyrit-Treppe +Pyrite Brick Stair=Pyrit-Ziegel-Treppe +Pyrite Block Stair=Pyrit-Block-Treppe +Cracked Pyrite Brick Stair=Rissige Pyrit-Ziegel-Treppe + +Quartz Stair=Quarz-Treppe +Quartz Brick Stair=Quarz-Ziegel-Treppe +Quartz Block Stair=Quarz-Block-Treppe +Cracked Quartz Brick Stair=Rissige Quarz-Ziegel-Treppe + +Rhodonite Stair=Rhodonittreppe +Rhodonite Brick Stair=Rhodonitziegeltreppe +Rhodonite Block Stair=Rhodonitblocktreppe +Cracked Rhodonite Brick Stair=Gerissene Rhodonitziegeltreppe +Cobbled Rhodonite Stair=Gefaste Rhodonittreppe + +Rose Quartz Stair=Rosenquarz-Treppe +Rose Quartz Brick Stair=Rosenquarz-Ziegel-Treppe +Rose Quartz Block Stair=Rosenquarz-Block-Treppe +Cracked Rose Quartz Brick Stair=Rissige Rosenquarz-Ziegel-Treppe + +Scoria Stair=Skorie-Treppe +Scoria Brick Stair=Skorie-Ziegel-Treppe +Scoria Block Stair=Skorie-Block-Treppe +Cracked Scoria Brick Stair=Rissige Skorie-Ziegel-Treppe +Cobbled Scoria Stair=Gepflasterte Skorie-Treppe + +Serpentine Stair=Serpentin-Treppe +Cobbled Serpentine Stair=Gepflasterte Serpentin-Treppe +Serpentine Brick Stair=Serpentin-Ziegel-Treppe +Serpentine Block Stair=Serpentin-Block-Treppe +Cracked Serpentine Brick Stair=Rissige Serpentin-Ziegel-Treppe + +Shale Stair=Schiefer-Treppe +Shale Brick Stair=Schiefer-Ziegel-Treppe +Shale Block Stair=Schiefer-Block-Treppe +Cracked Shale Brick Stair=Rissige Schiefer-Ziegel-Treppe +Cobbled Shale Stair=Gepflasterte Schiefer-Treppe + +Slate Stair=Schiefer-Treppe +Slate Brick Stair=Schiefer-Ziegel-Treppe +Slate Block Stair=Schiefer-Block-Treppe +Cracked Slate Brick Stair=Rissige Schiefer-Ziegel-Treppe +Cobbled Slate Stair=Gepflasterte Schiefer-Treppe +Slate Tile Stair=Schieferfliesen-Treppe + +Smokey Quartz Stair=Rauchquarz-Treppe +Smokey Quartz Brick Stair=Rauchquarz-Ziegel-Treppe +Smokey Quartz Block Stair=Rauchquarz-Block-Treppe +Cracked Smokey Quartz Brick Stair=Rissige Rauchquarz-Ziegel-Treppe + +Soapstone Stair=Speckstein-Treppe +Soapstone Brick Stair=Speckstein-Ziegel-Treppe +Soapstone Block Stair=Speckstein-Block-Treppe +Cracked Soapstone Brick Stair=Rissige Speckstein-Ziegel-Treppe + +Sodalite Stair=Sodalith-Treppe +Cobbled Sodalite Stair=Gepflasterte Sodalith-Treppe +Sodalite Brick Stair=Sodalith-Ziegel-Treppe +Sodalite Block Stair=Sodalith-Block-Treppe +Cracked Sodalite Brick Stair=Rissige Sodalith-Ziegel-Treppe + +Sugilite Stair=Sugilit-Treppe +Sugilite Brick Stair=Sugilit-Ziegel-Treppe +Sugilite Block Stair=Sugilit-Block-Treppe +Cracked Sugilite Brick Stair=Rissige Sugilit-Ziegel-Treppe +Cobbled Sugilite Stair=Gepflasterte Sugilit-Treppe + +Green Tourmaline Stair=Grüner Turmalintreppe +Green Tourmaline Brick Stair=Grüner Turmalinziegeltreppe +Green Tourmaline Block Stair=Grüner Turmalinblocktreppe +Cracked Green Tourmaline Brick Stair=Gerissene grüne Turmalinziegeltreppe + +Paraiba Tourmaline Stair=Paraíba-Turmalinstufe +Paraiba Tourmaline Brick Stair=Paraíba-Turmalinziegelstufe +Paraiba Tourmaline Block Stair=Paraíba-Turmalinblockstufe +Cracked Paraiba Tourmaline Brick Stair=Gerissene Paraíba-Turmalinziegelstufe + +Pink Tourmaline Stair=Rosa Turmalinstufe +Pink Tourmaline Brick Stair=Rosa Turmalinziegelstufe +Pink Tourmaline Block Stair=Rosa Turmalinblockstufe +Cracked Pink Tourmaline Brick Stair=Gerissene rosa Turmalinziegelstufe + +Travertine Stair=Travertin-Treppe +Cobbled Travertine Stair=Gepflasterte Travertin-Treppe +Travertine Brick Stair=Travertin-Ziegel-Treppe +Travertine Block Stair=Travertin-Block-Treppe +Cracked Travertine Brick Stair=Rissige Travertin-Ziegel-Treppe + +Yellow Travertine Stair=Gelber Travertin-Treppe +Cobbled Yellow Travertine Stair=Gepflasterte gelber Travertin-Treppe +Yellow Travertine Brick Stair=Gelber Travertin-Ziegel-Treppe +Yellow Travertine Block Stair=Gelber Travertin-Block-Treppe +Cracked Yellow Travertine Brick Stair=Rissige gelber Travertin-Ziegel-Treppe + +Beige Tuff Stair=Beige Tuff-Treppe +Beige Tuff Brick Stair=Beige Tuff-Ziegel-Treppe +Beige Tuff Block Stair=Beige Tuff-Block-Treppe +Cracked Beige Tuff Brick Stair=Rissige Beige Tuff-Ziegel-Treppe +Cobbled Beige Tuff Stair=Gepflasterte Beige Tuff-Treppe + +Grey Tuff Stair=Grauer Tuff-Treppe +Grey Tuff Brick Stair=Grauer Tuff-Ziegel-Treppe +Grey Tuff Block Stair=Grauer Tuff-Block-Treppe +Cracked Grey Tuff Brick Stair=Rissige Grauer Tuff-Ziegel-Treppe +Cobbled Grey Tuff Stair=Gepflasterte Grauer Tuff-Treppe + +Red Tuff Stair=Roter Tuff-Treppe +Red Tuff Brick Stair=Roter Tuff-Ziegel-Treppe +Red Tuff Block Stair=Roter Tuff-Block-Treppe +Cracked Red Tuff Brick Stair=Rissige Roter Tuff-Ziegel-Treppe +Cobbled Red Tuff Stair=Gepflasterte Roter Tuff-Treppe + +Turquoise Stair=Türkis-Treppe +Turquoise Brick Stair=Türkis-Ziegel-Treppe +Turquoise Block Stair=Türkis-Block-Treppe +Cracked Turquoise Brick Stair=Rissige Türkis-Ziegel-Treppe +Cobbled Turquoise Stair=Gepflasterte Türkis-Treppe + +Vivianite Stair=Vivianit-Treppe +Vivianite Brick Stair=Vivianit-Ziegel-Treppe +Vivianite Block Stair=Vivianit-Block-Treppe +Cracked Vivianite Brick Stair=Rissige Vivianit-Ziegel-Treppe + + + +Inner Blue Agate Stair=Innere blaue Achat-Treppe +Inner Gray Agate Stair=Innere graue Achat-Treppe +Inner Green Agate Stair=Innere grüne Achat-Treppe +Inner Moss Agate Stair=Innere Moosachat-Treppe +Inner Orange Agate Stair=Innere orange Achat-Treppe +Inner Purple Agate Stair=Innere violette Achat-Treppe +Inner Red Agate Stair=Innere rote Achat-Treppe + +Inner Amazonite Stair=Innere Amazonit-Treppe +Inner Cobbled Amazonite Stair=Innere gepflasterte Amazonit-Treppe +Inner Amazonite Brick Stair=Innere Amazonit-Ziegel-Treppe +Inner Amazonite Block Stair=Innere Amazonit-Block-Treppe +Inner Cracked Amazonite Brick Stair=Innere rissige Amazonit-Ziegel-Treppe + +Inner Amber Stair=Innere Bernstein-Treppe +Inner Amber Brick Stair=Innere Bernstein-Ziegel-Treppe +Inner Amber Block Stair=Innere Bernstein-Block-Treppe +Inner Cracked Amber Brick Stair=Innere rissige Bernstein-Ziegel-Treppe + +Inner Amethyst Stair=Innere Amethyst-Treppe +Inner Amethyst Brick Stair=Innere Amethyst-Ziegel-Treppe +Inner Amethyst Block Stair=Innere Amethyst-Block-Treppe +Inner Cracked Amethyst Brick Stair=Innere rissige Amethyst-Ziegel-Treppe + +Inner Andesite Stair=Innere Andesit-Treppe +Inner Andesite Block Stair=Innere Andesit-Block-Treppe +Inner Andesite Brick Stair=Innere Andesit-Ziegel-Treppe +Inner Cracked Andesite Brick Stair=Innere rissige Andesit-Ziegel-Treppe +Inner Cobbled Andesite Stair=Innere gepflasterte Andesit-Treppe + +Inner Basalt Stair=Innere Basalt-Treppe +Inner Basalt Block Stair=Innere Basalt-Block-Treppe +Inner Basalt Brick Stair=Innere Basalt-Ziegel-Treppe +Inner Cracked Basalt Brick Stair=Innere rissige Basalt-Ziegel-Treppe +Inner Cobbled Basalt Stair=Innere gepflasterte Basalt-Treppe +Inner Basalt Tile Stair=Innere Basaltfliesen-Treppe + +Inner Black Moonstone Stair=Innere schwarze Mondstein-Treppe +Inner Black Moonstone Brick Stair=Innere schwarze Mondstein-Ziegel-Treppe +Inner Black Moonstone Block Stair=Innere schwarze Mondstein-Block-Treppe +Inner Cracked Black Moonstone Brick Stair=Innere rissige schwarze Mondstein-Ziegel-Treppe + +Inner Calcite Stair=Innere Calcit-Treppe +Inner Calcite Brick Stair=Innere Calcit-Ziegel-Treppe +Inner Calcite Block Stair=Innere Calcit-Block-Treppe +Inner Cracked Calcite Brick Stair=Innere rissige Calcit-Ziegel-Treppe + +Inner Grey Calcite Stair=Innere graue Calcittreppe +Inner Grey Calcite Brick Stair=Innere graue Calcitziegeltreppe +Inner Grey Calcite Block Stair=Innere graue Calcitblocktreppe +Inner Cracked Grey Calcite Brick Stair=Innere gerissene Treppe aus grauem Calcitziegel + +Inner Orange Calcite Stair=Innere orangefarbene Calcittreppe +Inner Orange Calcite Brick Stair=Innere orangefarbene Calcitziegeltreppe +Inner Orange Calcite Block Stair=Innere orangefarbene Calcitblocktreppe +Inner Cracked Orange Calcite Brick Stair=Innere gerissene Treppe aus orangefarbenem Calcitziegel + +Inner Carnotite Stair=Innere Carnotit-Treppe +Inner Carnotite Brick Stair=Innere Carnotit-Ziegel-Treppe +Inner Carnotite Block Stair=Innere Carnotit-Block-Treppe +Inner Cracked Carnotite Brick Stair=Innere rissige Carnotit-Ziegel-Treppe +Inner Cobbled Carnotite Stair=Innere gepflasterte Carnotit-Treppe + +Inner Celestine Stair=Innere Celestin-Treppe +Inner Celestine Brick Stair=Innere Celestin-Ziegel-Treppe +Inner Celestine Block Stair=Innere Celestin-Block-Treppe +Inner Cracked Celestine Brick Stair=Innere rissige Celestin-Ziegel-Treppe + +Inner Chalcanthite Stair=Innere Chalkanthittreppe +Inner Chalcanthite Brick Stair=Innere Chalkanthitziegeltreppe +Inner Chalcanthite Block Stair=Innere Chalkanthitblocktreppe +Inner Cracked Chalcanthite Brick Stair=Innere gerissene Chalkanthitziegeltreppe +Inner Cobbled Chalcanthite Stair=Innere gerumpelte Chalkanthittreppe + +Inner Chrysoprase Stair=Innere Chrysopras-Treppe +Inner Chrysoprase Brick Stair=Innere Chrysopras-Ziegel-Treppe +Inner Chrysoprase Block Stair=Innere Chrysopras-Block-Treppe +Inner Cracked Chrysoprase Brick Stair=Innere rissige Chrysopras-Ziegel-Treppe + +Inner Citrine Stair=Innere Citrin-Treppe +Inner Citrine Brick Stair=Innere Citrin-Ziegel-Treppe +Inner Citrine Block Stair=Innere Citrin-Block-Treppe +Inner Cracked Citrine Brick Stair=Innere rissige Citrin-Ziegel-Treppe + +Inner Covellite Stair=Innere Covellit-Treppe +Inner Covellite Brick Stair=Innere Covellit-Ziegel-Treppe +Inner Covellite Block Stair=Innere Covellit-Block-Treppe +Inner Cracked Covellite Brick Stair=Innere rissige Covellit-Ziegel-Treppe +Inner Cobbled Covellite Stair=Innere gepflasterte Covellit-Treppe + +Inner Crocoite Stair=Innere Crocoit-Treppe +Inner Crocoite Brick Stair=Innere Crocoit-Ziegel-Treppe +Inner Crocoite Block Stair=Innere Crocoit-Block-Treppe +Inner Cracked Crocoite Brick Stair=Innere rissige Crocoit-Ziegel-Treppe + +Inner Diorite Stair=Innere Diorit-Treppe +Inner Diorite Brick Stair=Innere Diorit-Ziegel-Treppe +Inner Diorite Block Stair=Innere Diorit-Block-Treppe +Inner Cracked Diorite Brick Stair=Innere rissige Diorit-Ziegel-Treppe +Inner Cobbled Diorite Stair=Innere gepflasterte Diorit-Treppe + +Inner Erythrite Stair=Innere Erythrit-Treppe +Inner Erythrite Brick Stair=Innere Erythrit-Ziegel-Treppe +Inner Erythrite Block Stair=Innere Erythrit-Block-Treppe +Inner Cracked Erythrite Brick Stair=Innere rissige Erythrit-Ziegel-Treppe + +Inner Eudialite Stair=Innere Eudialit-Treppe +Inner Eudialite Brick Stair=Innere Eudialit-Ziegel-Treppe +Inner Eudialite Block Stair=Innere Eudialit-Block-Treppe +Inner Cracked Eudialite Brick Stair=Innere rissige Eudialit-Ziegel-Treppe + +Inner Fluorite Stair=Innere Fluorit-Treppe +Inner Fluorite Brick Stair=Innere Fluorit-Ziegel-Treppe +Inner Fluorite Block Stair=Innere Fluorit-Block-Treppe +Inner Cracked Fluorite Brick Stair=Innere rissige Fluorit-Ziegel-Treppe + +Inner Gabbro Stair=Innere Gabbro-Treppe +Inner Cobbled Gabbro Stair=Innere gepflasterte Gabbro-Treppe +Inner Gabbro Brick Stair=Innere Gabbro-Ziegel-Treppe +Inner Gabbro Block Stair=Innere Gabbro-Block-Treppe +Inner Cracked Gabbro Brick Stair=Innere rissige Gabbro-Ziegel-Treppe + +Inner Galena Stair=Innere Galenit-Treppe +Inner Galena Brick Stair=Innere Galenit-Ziegel-Treppe +Inner Galena Block Stair=Innere Galenit-Block-Treppe +Inner Cracked Galena Brick Stair=Innere rissige Galenit-Ziegel-Treppe + +Inner Black Granite Stair=Innere schwarze Granit-Treppe +Inner Black Granite Brick Stair=Innere schwarze Granit-Ziegel-Treppe +Inner Black Granite Block Stair=Innere schwarze Granit-Block-Treppe +Inner Cracked Black Granite Brick Stair=Innere rissige schwarze Granit-Ziegel-Treppe +Inner Cobbled Black Granite Stair=Innere gepflasterte schwarze Granit-Treppe + +Inner Blue Granite Stair=Innere blaue Granit-Treppe +Inner Blue Granite Brick Stair=Innere blaue Granit-Ziegel-Treppe +Inner Blue Granite Block Stair=Innere blaue Granit-Block-Treppe +Inner Cracked Blue Granite Brick Stair=Innere rissige blaue Granit-Ziegel-Treppe +Inner Cobbled Blue Granite Stair=Innere gepflasterte blaue Granit-Treppe + +Inner Gray Granite Stair=Innere graue Granit-Treppe +Inner Gray Granite Brick Stair=Innere graue Granit-Ziegel-Treppe +Inner Gray Granite Block Stair=Innere graue Granit-Block-Treppe +Inner Cracked Gray Granite Brick Stair=Innere rissige graue Granit-Ziegel-Treppe +Inner Cobbled Gray Granite Stair=Innere gepflasterte graue Granit-Treppe + +Inner Green Granite Stair=Innere grüne Granit-Treppe +Inner Green Granite Brick Stair=Innere grüne Granit-Ziegel-Treppe +Inner Green Granite Block Stair=Innere grüne Granit-Block-Treppe +Inner Cracked Green Granite Brick Stair=Innere rissige grüne Granit-Ziegel-Treppe +Inner Cobbled Green Granite Stair=Innere gepflasterte grüne Granit-Treppe + +Inner Pink Granite Stair=Innere rosa Granit-Treppe +Inner Pink Granite Brick Stair=Innere rosa Granit-Ziegel-Treppe +Inner Pink Granite Block Stair=Innere rosa Granit-Block-Treppe +Inner Cracked Pink Granite Brick Stair=Innere rissige rosa Granit-Ziegel-Treppe +Inner Cobbled Pink Granite Stair=Innere gepflasterte rosa Granit-Treppe + +Inner Red Granite Stair=Innere rote Granit-Treppe +Inner Red Granite Brick Stair=Innere rote Granit-Ziegel-Treppe +Inner Red Granite Block Stair=Innere rote Granit-Block-Treppe +Inner Cracked Red Granite Brick Stair=Innere rissige rote Granit-Ziegel-Treppe +Inner Cobbled Red Granite Stair=Innere gepflasterte rote Granit-Treppe + +Inner White Granite Stair=Innere weiße Granit-Treppe +Inner White Granite Brick Stair=Innere weiße Granit-Ziegel-Treppe +Inner White Granite Block Stair=Innere weiße Granit-Block-Treppe +Inner Cracked White Granite Brick Stair=Innere rissige weiße Granit-Ziegel-Treppe +Inner Cobbled White Granite Stair=Innere gepflasterte weiße Granit-Treppe + +Inner Yellow Granite Stair=Innere gelbe Granit-Treppe +Inner Yellow Granite Brick Stair=Innere gelbe Granit-Ziegel-Treppe +Inner Yellow Granite Block Stair=Innere gelbe Granit-Block-Treppe +Inner Cracked Yellow Granite Brick Stair=Innere rissige gelbe Granit-Ziegel-Treppe +Inner Cobbled Yellow Granite Stair=Innere gepflasterte gelbe Granit-Treppe + +Inner Heliodor Stair=Innere Heliodor-Treppe +Inner Heliodor Brick Stair=Innere Heliodor-Ziegel-Treppe +Inner Heliodor Block Stair=Innere Heliodor-Block-Treppe +Inner Cracked Heliodor Brick Stair=Innere rissige Heliodor-Ziegel-Treppe + +Inner Howlite Stair=Innere Howlite-Treppe +Inner Howlite Brick Stair=Innere Howlite-Ziegel-Treppe +Inner Howlite Block Stair=Innere Howlite-Block-Treppe +Inner Cracked Howlite Brick Stair=Innere rissige Howlite-Ziegel-Treppe +Inner Cobbled Howlite Stair=Innere gepflasterte Howlite-Treppe + +Inner Ilvaite Stair=Innere Ilvaite-Treppe +Inner Ilvaite Brick Stair=Innere Ilvaite-Ziegel-Treppe +Inner Ilvaite Block Stair=Innere Ilvaite-Block-Treppe +Inner Cracked Ilvaite Brick Stair=Innere rissige Ilvaite-Ziegel-Treppe +Inner Cobbled Ilvaite Stair=Innere gepflasterte Ilvaite-Treppe + +Inner Jade Stair=Innere Jade-Treppe +Inner Jade Brick Stair=Innere Jade-Ziegel-Treppe +Inner Jade Block Stair=Innere Jade-Block-Treppe +Inner Cracked Jade Brick Stair=Innere rissige Jade-Ziegel-Treppe +Inner Cobbled Jade Stair=Innere gepflasterte Jade-Treppe + +Inner Red Jasper Stair=Innere rote Jaspistreppe +Inner Red Jasper Brick Stair=Innere rote Jaspisziegeltreppe +Inner Red Jasper Block Stair=Innere rote Jaspisblocktreppe +Inner Cracked Red Jasper Brick Stair=Innere gerissene rote Jaspisziegeltreppe +Inner Cobbled Red Jasper Stair=Innere gerumpelte rote Jaspistreppe + +Inner Kyanite Stair=Innere Kyanit-Treppe +Inner Kyanite Brick Stair=Innere Kyanit-Ziegel-Treppe +Inner Kyanite Block Stair=Innere Kyanit-Block-Treppe +Inner Cracked Kyanite Brick Stair=Innere rissige Kyanit-Ziegel-Treppe +Inner Cobbled Kyanite Stair=Innere gepflasterte Kyanit-Treppe + +Inner Lapis Lazuli Stair=Innere Lapislazuli-Treppe +Inner Lapis Lazuli Brick Stair=Innere Lapislazuli-Ziegel-Treppe +Inner Lapis Lazuli Block Stair=Innere Lapislazuli-Block-Treppe +Inner Cracked Lapis Lazuli Brick Stair=Innere rissige Lapislazuli-Ziegel-Treppe + +Inner Lepidolite Stair=Innere Lepidolithtreppe +Inner Lepidolite Brick Stair=Innere Lepidolithziegeltreppe +Inner Lepidolite Block Stair=Innere Lepidolithblocktreppe +Inner Cracked Lepidolite Brick Stair=Innere gerissene Lepidolithziegeltreppe +Inner Cobbled Lepidolite Stair=Innere gerumpelte Lepidolithtreppe + +Inner Blue Limestone Stair=Innere blaue Kalkstein-Treppe +Inner Blue Limestone Brick Stair=Innere blaue Kalkstein-Ziegel-Treppe +Inner Blue Limestone Block Stair=Innere blaue Kalkstein-Block-Treppe +Inner Cracked Blue Limestone Brick Stair=Innere rissige blaue Kalkstein-Ziegel-Treppe +Inner Cobbled Blue Limestone Stair=Innere gepflasterte blaue Kalkstein-Treppe + +Inner White Limestone Stair=Innere weiße Kalkstein-Treppe +Inner White Limestone Brick Stair=Innere weiße Kalkstein-Ziegel-Treppe +Inner White Limestone Block Stair=Innere weiße Kalkstein-Block-Treppe +Inner Cracked White Limestone Brick Stair=Innere rissige weiße Kalkstein-Ziegel-Treppe +Inner Cobbled White Limestone Stair=Innere gepflasterte weiße Kalkstein-Treppe + +Inner Marble Stair=Innere Marmor-Treppe +Inner Marble Brick Stair=Innere Marmor-Ziegel-Treppe +Inner Marble Block Stair=Innere Marmor-Block-Treppe +Inner Cracked Marble Brick Stair=Innere rissige Marmor-Ziegel-Treppe +Inner Cobbled Marble Stair=Innere gepflasterte Marmor-Treppe + +Inner Moonstone Stair=Innere Mondsteintreppe +Inner Moonstone Brick Stair=Innere Mondsteinziegeltreppe +Inner Moonstone Block Stair=Innere Mondsteinblocktreppe +Inner Cracked Moonstone Brick Stair=Innere gerissene Mondsteinziegeltreppe + +Inner Morion Quartz Stair=Innere Morion-Quarz-Treppe +Inner Morion Quartz Brick Stair=Innere Morion-Quarz-Ziegel-Treppe +Inner Morion Quartz Block Stair=Innere Morion-Quarz-Block-Treppe +Inner Cracked Morion Quartz Brick Stair=Innere rissige Morion-Quarz-Ziegel-Treppe + +Inner Mudstone Stair=Innere Schiefer-Treppe +Inner Cobbled Mudstone Stair=Innere gepflasterte Schiefer-Treppe +Inner Mudstone Brick Stair=Innere Schiefer-Ziegel-Treppe +Inner Mudstone Block Stair=Innere Schiefer-Block-Treppe +Inner Cracked Mudstone Brick Stair=Innere rissige Schiefer-Ziegel-Treppe + +Inner Prasiolite Stair=Innere Prasiolith-Treppe +Inner Prasiolite Brick Stair=Innere Prasiolith-Ziegel-Treppe +Inner Prasiolite Block Stair=Innere Prasiolith-Block-Treppe +Inner Cracked Prasiolite Brick Stair=Innere rissige Prasiolith-Ziegel-Treppe + +Inner Pumice Stair=Innere Bimsstein-Treppe +Inner Pumice Brick Stair=Innere Bimsstein-Ziegel-Treppe +Inner Pumice Block Stair=Innere Bimsstein-Block-Treppe +Inner Cracked Pumice Brick Stair=Innere rissige Bimsstein-Ziegel-Treppe + +Inner Pyrite Stair=Innere Pyrit-Treppe +Inner Pyrite Brick Stair=Innere Pyrit-Ziegel-Treppe +Inner Pyrite Block Stair=Innere Pyrit-Block-Treppe +Inner Cracked Pyrite Brick Stair=Innere rissige Pyrit-Ziegel-Treppe + +Inner Quartz Stair=Innere Quarz-Treppe +Inner Quartz Brick Stair=Innere Quarz-Ziegel-Treppe +Inner Quartz Block Stair=Innere Quarz-Block-Treppe +Inner Cracked Quartz Brick Stair=Innere rissige Quarz-Ziegel-Treppe + +Inner Rhodonite Stair=Innere Rhodonittreppe +Inner Rhodonite Brick Stair=Innere Rhodonitziegeltreppe +Inner Rhodonite Block Stair=Innere Rhodonitblocktreppe +Inner Cracked Rhodonite Brick Stair=Innere gerissene Rhodonitziegeltreppe +Inner Cobbled Rhodonite Stair=Innere gefaste Rhodonittreppe + +Inner Rose Quartz Stair=Innere Rosenquarz-Treppe +Inner Rose Quartz Brick Stair=Innere Rosenquarz-Ziegel-Treppe +Inner Rose Quartz Block Stair=Innere Rosenquarz-Block-Treppe +Inner Cracked Rose Quartz Brick Stair=Innere rissige Rosenquarz-Ziegel-Treppe + +Inner Scoria Stair=Innere Scoria-Treppe +Inner Scoria Brick Stair=Innere Scoria-Ziegel-Treppe +Inner Scoria Block Stair=Innere Scoria-Block-Treppe +Inner Cracked Scoria Brick Stair=Innere rissige Scoria-Ziegel-Treppe +Inner Cobbled Scoria Stair=Innere gepflasterte Scoria-Treppe + +Inner Serpentine Stair=Innere Serpentin-Treppe +Inner Cobbled Serpentine Stair=Innere gepflasterte Serpentin-Treppe +Inner Serpentine Brick Stair=Innere Serpentin-Ziegel-Treppe +Inner Serpentine Block Stair=Innere Serpentin-Block-Treppe +Inner Cracked Serpentine Brick Stair=Innere rissige Serpentin-Ziegel-Treppe + +Inner Shale Stair=Innere Schiefer-Treppe +Inner Shale Brick Stair=Innere Schiefer-Ziegel-Treppe +Inner Shale Block Stair=Innere Schiefer-Block-Treppe +Inner Cracked Shale Brick Stair=Innere rissige Schiefer-Ziegel-Treppe +Inner Cobbled Shale Stair=Innere gepflasterte Schiefer-Treppe + +Inner Slate Stair=Innere Schiefer-Treppe +Inner Slate Brick Stair=Innere Schiefer-Ziegel-Treppe +Inner Slate Block Stair=Innere Schiefer-Block-Treppe +Inner Cracked Slate Brick Stair=Innere rissige Schiefer-Ziegel-Treppe +Inner Cobbled Slate Stair=Innere gepflasterte Schiefer-Treppe +Inner Slate Tile Stair=Innere Schieferfliesen-Treppe + +Inner Smokey Quartz Stair=Innere Rauchquarz-Treppe +Inner Smokey Quartz Brick Stair=Innere Rauchquarz-Ziegel-Treppe +Inner Smokey Quartz Block Stair=Innere Rauchquarz-Block-Treppe +Inner Cracked Smokey Quartz Brick Stair=Innere rissige Rauchquarz-Ziegel-Treppe + +Inner Soapstone Stair=Innere Speckstein-Treppe +Inner Soapstone Brick Stair=Innere Speckstein-Ziegel-Treppe +Inner Soapstone Block Stair=Innere Speckstein-Block-Treppe +Inner Cracked Soapstone Brick Stair=Innere rissige Speckstein-Ziegel-Treppe + +Inner Sodalite Stair=Innere Sodalith-Treppe +Inner Cobbled Sodalite Stair=Innere gepflasterte Sodalith-Treppe +Inner Sodalite Brick Stair=Innere Sodalith-Ziegel-Treppe +Inner Sodalite Block Stair=Innere Sodalith-Block-Treppe +Inner Cracked Sodalite Brick Stair=Innere rissige Sodalith-Ziegel-Treppe + +Inner Sugilite Stair=Innere Sugilith-Treppe +Inner Sugilite Brick Stair=Innere Sugilith-Ziegel-Treppe +Inner Sugilite Block Stair=Innere Sugilith-Block-Treppe +Inner Cracked Sugilite Brick Stair=Innere rissige Sugilith-Ziegel-Treppe +Inner Cobbled Sugilite Stair=Innere gepflasterte Sugilith-Treppe + +Inner Green Tourmaline Stair=Innere grüne Turmalintreppe +Inner Green Tourmaline Brick Stair=Innere grüner Turmalinziegeltreppe +Inner Green Tourmaline Block Stair=Innere grüner Turmalinblocktreppe +Inner Cracked Green Tourmaline Brick Stair=Innere gerissene grüne Turmalinziegeltreppe + +Inner Paraiba Tourmaline Stair=Innere Paraíba-Turmalinstufe +Inner Paraiba Tourmaline Brick Stair=Innere Paraíba-Turmalinziegelstufe +Inner Paraiba Tourmaline Block Stair=Innere Paraíba-Turmalinblockstufe +Inner Cracked Paraiba Tourmaline Brick Stair=Innere gerissene Paraíba-Turmalinziegelstufe + +Inner Pink Tourmaline Stair=Innere rosa Turmalinstufe +Inner Pink Tourmaline Brick Stair=Innere rosa Turmalinziegelstufe +Inner Pink Tourmaline Block Stair=Innere rosa Turmalinblockstufe +Inner Cracked Pink Tourmaline Brick Stair=Innere gerissene rosa Turmalinziegelstufe + +Inner Travertine Stair=Innere Travertin-Treppe +Inner Cobbled Travertine Stair=Innere gepflasterte Travertin-Treppe +Inner Travertine Brick Stair=Innere Travertin-Ziegel-Treppe +Inner Travertine Block Stair=Innere Travertin-Block-Treppe +Inner Cracked Travertine Brick Stair=Innere rissige Travertin-Ziegel-Treppe + +Inner Yellow Travertine Stair=Innere gelbe Travertin-Treppe +Inner Cobbled Yellow Travertine Stair=Innere gepflasterte gelbe Travertin-Treppe +Inner Yellow Travertine Brick Stair=Innere gelbe Travertin-Ziegel-Treppe +Inner Yellow Travertine Block Stair=Innere gelbe Travertin-Block-Treppe +Inner Cracked Yellow Travertine Brick Stair=Innere rissige gelbe Travertin-Ziegel-Treppe + +Inner Beige Tuff Stair=Innere beige Tuff-Treppe +Inner Cobbled Beige Tuff Stair=Innere gepflasterte beige Tuff-Treppe +Inner Beige Tuff Brick Stair=Innere beige Tuff-Ziegel-Treppe +Inner Beige Tuff Block Stair=Innere beige Tuff-Block-Treppe +Inner Cracked Beige Tuff Brick Stair=Innere rissige beige Tuff-Ziegel-Treppe + +Inner Grey Tuff Stair=Innere graue Tuff-Treppe +Inner Cobbled Grey Tuff Stair=Innere gepflasterte graue Tuff-Treppe +Inner Grey Tuff Brick Stair=Innere graue Tuff-Ziegel-Treppe +Inner Grey Tuff Block Stair=Innere graue Tuff-Block-Treppe +Inner Cracked Grey Tuff Brick Stair=Innere rissige graue Tuff-Ziegel-Treppe + +Inner Red Tuff Stair=Innere rote Tuff-Treppe +Inner Cobbled Red Tuff Stair=Innere gepflasterte rote Tuff-Treppe +Inner Red Tuff Brick Stair=Innere rote Tuff-Ziegel-Treppe +Inner Red Tuff Block Stair=Innere rote Tuff-Block-Treppe +Inner Cracked Red Tuff Brick Stair=Innere rissige rote Tuff-Ziegel-Treppe + +Inner Turquoise Stair=Innere Türkis-Treppe +Inner Turquoise Brick Stair=Innere Türkis-Ziegel-Treppe +Inner Turquoise Block Stair=Innere Türkis-Block-Treppe +Inner Cracked Turquoise Brick Stair=Innere rissige Türkis-Ziegel-Treppe +Inner Cobbled Turquoise Stair=Innere gepflasterte Türkis-Treppe + +Inner Vivianite Stair=Innere Vivianit-Treppe +Inner Vivianite Brick Stair=Innere Vivianit-Ziegel-Treppe +Inner Vivianite Block Stair=Innere Vivianit-Block-Treppe +Inner Cracked Vivianite Brick Stair=Innere rissige Vivianit-Ziegel-Treppe + + + +Outer Blue Agate Stair=Äußere blaue Achat-Treppe +Outer Gray Agate Stair=Äußere graue Achat-Treppe +Outer Green Agate Stair=Äußere grüne Achat-Treppe +Outer Moss Agate Stair=Äußere Moosachat-Treppe +Outer Orange Agate Stair=Äußere orange Achat-Treppe +Outer Purple Agate Stair=Äußere violette Achat-Treppe +Outer Red Agate Stair=Äußere rote Achat-Treppe + +Outer Amazonite Stair=Äußere Amazonit-Treppe +Outer Cobbled Amazonite Stair=Äußere gepflasterte Amazonit-Treppe +Outer Amazonite Brick Stair=Äußere Amazonit-Ziegel-Treppe +Outer Amazonite Block Stair=Äußere Amazonit-Block-Treppe +Outer Cracked Amazonite Brick Stair=Äußere rissige Amazonit-Ziegel-Treppe + +Outer Amber Stair=Äußere Bernstein-Treppe +Outer Amber Brick Stair=Äußere Bernstein-Ziegel-Treppe +Outer Amber Block Stair=Äußere Bernstein-Block-Treppe +Outer Cracked Amber Brick Stair=Äußere rissige Bernstein-Ziegel-Treppe + +Outer Amethyst Stair=Äußere Amethyst-Treppe +Outer Amethyst Brick Stair=Äußere Amethyst-Ziegel-Treppe +Outer Amethyst Block Stair=Äußere Amethyst-Block-Treppe +Outer Cracked Amethyst Brick Stair=Äußere rissige Amethyst-Ziegel-Treppe + +Outer Andesite Stair=Äußere Andesit-Treppe +Outer Andesite Block Stair=Äußere Andesit-Block-Treppe +Outer Andesite Brick Stair=Äußere Andesit-Ziegel-Treppe +Outer Cracked Andesite Brick Stair=Äußere rissige Andesit-Ziegel-Treppe +Outer Cobbled Andesite Stair=Äußere gepflasterte Andesit-Treppe + +Outer Basalt Stair=Äußere Basalt-Treppe +Outer Basalt Block Stair=Äußere Basalt-Block-Treppe +Outer Basalt Brick Stair=Äußere Basalt-Ziegel-Treppe +Outer Cracked Basalt Brick Stair=Äußere rissige Basalt-Ziegel-Treppe +Outer Cobbled Basalt Stair=Äußere gepflasterte Basalt-Treppe +Outer Basalt Tile Stair=Äußere Basaltfliesen-Treppe + +Outer Black Moonstone Stair=Äußere schwarze Mondstein-Treppe +Outer Black Moonstone Brick Stair=Äußere schwarze Mondstein-Ziegel-Treppe +Outer Black Moonstone Block Stair=Äußere schwarze Mondstein-Block-Treppe +Outer Cracked Black Moonstone Brick Stair=Äußere rissige schwarze Mondstein-Ziegel-Treppe + +Outer Calcite Stair=Äußere Calcit-Treppe +Outer Calcite Brick Stair=Äußere Calcit-Ziegel-Treppe +Outer Calcite Block Stair=Äußere Calcit-Block-Treppe +Outer Cracked Calcite Brick Stair=Äußere rissige Calcit-Ziegel-Treppe + +Outer Grey Calcite Stair=Äußere graue Calcittreppe +Outer Grey Calcite Brick Stair=Äußere graue Calcitziegeltreppe +Outer Grey Calcite Block Stair=Äußere graue Calcitblocktreppe +Outer Cracked Grey Calcite Brick Stair=Äußere gerissene Treppe aus grauem Calcitziegel + +Outer Orange Calcite Stair=Äußere orangefarbene Calcittreppe +Outer Orange Calcite Brick Stair=Äußere orangefarbene Calcitziegeltreppe +Outer Orange Calcite Block Stair=Äußere orangefarbene Calcitblocktreppe +Outer Cracked Orange Calcite Brick Stair=Äußere gerissene Treppe aus orangefarbenem Calcitziegel + +Outer Carnotite Stair=Äußere Carnotit-Treppe +Outer Carnotite Brick Stair=Äußere Carnotit-Ziegel-Treppe +Outer Carnotite Block Stair=Äußere Carnotit-Block-Treppe +Outer Cracked Carnotite Brick Stair=Äußere rissige Carnotit-Ziegel-Treppe +Outer Cobbled Carnotite Stair=Äußere gepflasterte Carnotit-Treppe + +Outer Celestine Stair=Äußere Celestin-Treppe +Outer Celestine Brick Stair=Äußere Celestin-Ziegel-Treppe +Outer Celestine Block Stair=Äußere Celestin-Block-Treppe +Outer Cracked Celestine Brick Stair=Äußere rissige Celestin-Ziegel-Treppe + +Outer Chalcanthite Stair=Äußere Chalkanthittreppe +Outer Chalcanthite Brick Stair=Äußere Chalkanthitziegeltreppe +Outer Chalcanthite Block Stair=Äußere Chalkanthitblocktreppe +Outer Cracked Chalcanthite Brick Stair=Äußere gerissene Chalkanthitziegeltreppe +Outer Cobbled Chalcanthite Stair=Äußere gerumpelte Chalkanthittreppe + +Outer Chrysoprase Stair=Äußere Chrysopras-Treppe +Outer Chrysoprase Brick Stair=Äußere Chrysopras-Ziegel-Treppe +Outer Chrysoprase Block Stair=Äußere Chrysopras-Block-Treppe +Outer Cracked Chrysoprase Brick Stair=Äußere rissige Chrysopras-Ziegel-Treppe + +Outer Citrine Stair=Äußere Citrin-Treppe +Outer Citrine Brick Stair=Äußere Citrin-Ziegel-Treppe +Outer Citrine Block Stair=Äußere Citrin-Block-Treppe +Outer Cracked Citrine Brick Stair=Äußere rissige Citrin-Ziegel-Treppe + +Outer Covellite Stair=Äußere Covellit-Treppe +Outer Covellite Brick Stair=Äußere Covellit-Ziegel-Treppe +Outer Covellite Block Stair=Äußere Covellit-Block-Treppe +Outer Cracked Covellite Brick Stair=Äußere rissige Covellit-Ziegel-Treppe +Outer Cobbled Covellite Stair=Äußere gepflasterte Covellit-Treppe + +Outer Crocoite Stair=Äußere Crocoit-Treppe +Outer Crocoite Brick Stair=Äußere Crocoit-Ziegel-Treppe +Outer Crocoite Block Stair=Äußere Crocoit-Block-Treppe +Outer Cracked Crocoite Brick Stair=Äußere rissige Crocoit-Ziegel-Treppe + +Outer Diorite Stair=Äußere Diorit-Treppe +Outer Diorite Brick Stair=Äußere Diorit-Ziegel-Treppe +Outer Diorite Block Stair=Äußere Diorit-Block-Treppe +Outer Cracked Diorite Brick Stair=Äußere rissige Diorit-Ziegel-Treppe +Outer Cobbled Diorite Stair=Äußere gepflasterte Diorit-Treppe + +Outer Erythrite Stair=Äußere Erythrit-Treppe +Outer Erythrite Brick Stair=Äußere Erythrit-Ziegel-Treppe +Outer Erythrite Block Stair=Äußere Erythrit-Block-Treppe +Outer Cracked Erythrite Brick Stair=Äußere rissige Erythrit-Ziegel-Treppe + +Outer Eudialite Stair=Äußere Eudialit-Treppe +Outer Eudialite Brick Stair=Äußere Eudialit-Ziegel-Treppe +Outer Eudialite Block Stair=Äußere Eudialit-Block-Treppe +Outer Cracked Eudialite Brick Stair=Äußere rissige Eudialit-Ziegel-Treppe + +Outer Fluorite Stair=Äußere Fluorit-Treppe +Outer Fluorite Brick Stair=Äußere Fluorit-Ziegel-Treppe +Outer Fluorite Block Stair=Äußere Fluorit-Block-Treppe +Outer Cracked Fluorite Brick Stair=Äußere rissige Fluorit-Ziegel-Treppe + +Outer Gabbro Stair=Äußere Gabbro-Treppe +Outer Cobbled Gabbro Stair=Äußere gepflasterte Gabbro-Treppe +Outer Gabbro Brick Stair=Äußere Gabbro-Ziegel-Treppe +Outer Gabbro Block Stair=Äußere Gabbro-Block-Treppe +Outer Cracked Gabbro Brick Stair=Äußere rissige Gabbro-Ziegel-Treppe + +Outer Galena Stair=Äußere Galenit-Treppe +Outer Galena Brick Stair=Äußere Galenit-Ziegel-Treppe +Outer Galena Block Stair=Äußere Galenit-Block-Treppe +Outer Cracked Galena Brick Stair=Äußere rissige Galenit-Ziegel-Treppe + +Outer Black Granite Stair=Äußere schwarze Granit-Treppe +Outer Black Granite Brick Stair=Äußere schwarze Granit-Ziegel-Treppe +Outer Black Granite Block Stair=Äußere schwarze Granit-Block-Treppe +Outer Cracked Black Granite Brick Stair=Äußere rissige schwarze Granit-Ziegel-Treppe +Outer Cobbled Black Granite Stair=Äußere gepflasterte schwarze Granit-Treppe + +Outer Blue Granite Stair=Äußere blaue Granit-Treppe +Outer Blue Granite Brick Stair=Äußere blaue Granit-Ziegel-Treppe +Outer Blue Granite Block Stair=Äußere blaue Granit-Block-Treppe +Outer Cracked Blue Granite Brick Stair=Äußere rissige blaue Granit-Ziegel-Treppe +Outer Cobbled Blue Granite Stair=Äußere gepflasterte blaue Granit-Treppe + +Outer Gray Granite Stair=Äußere graue Granit-Treppe +Outer Gray Granite Brick Stair=Äußere graue Granit-Ziegel-Treppe +Outer Gray Granite Block Stair=Äußere graue Granit-Block-Treppe +Outer Cracked Gray Granite Brick Stair=Äußere rissige graue Granit-Ziegel-Treppe +Outer Cobbled Gray Granite Stair=Äußere gepflasterte graue Granit-Treppe + +Outer Green Granite Stair=Äußere grüne Granit-Treppe +Outer Green Granite Brick Stair=Äußere grüne Granit-Ziegel-Treppe +Outer Green Granite Block Stair=Äußere grüne Granit-Block-Treppe +Outer Cracked Green Granite Brick Stair=Äußere rissige grüne Granit-Ziegel-Treppe +Outer Cobbled Green Granite Stair=Äußere gepflasterte grüne Granit-Treppe + +Outer Pink Granite Stair=Äußere rosa Granit-Treppe +Outer Pink Granite Brick Stair=Äußere rosa Granit-Ziegel-Treppe +Outer Pink Granite Block Stair=Äußere rosa Granit-Block-Treppe +Outer Cracked Pink Granite Brick Stair=Äußere rissige rosa Granit-Ziegel-Treppe +Outer Cobbled Pink Granite Stair=Äußere gepflasterte rosa Granit-Treppe + +Outer Red Granite Stair=Äußere rote Granit-Treppe +Outer Red Granite Brick Stair=Äußere rote Granit-Ziegel-Treppe +Outer Red Granite Block Stair=Äußere rote Granit-Block-Treppe +Outer Cracked Red Granite Brick Stair=Äußere rissige rote Granit-Ziegel-Treppe +Outer Cobbled Red Granite Stair=Äußere gepflasterte rote Granit-Treppe + +Outer White Granite Stair=Äußere weiße Granit-Treppe +Outer White Granite Brick Stair=Äußere weiße Granit-Ziegel-Treppe +Outer White Granite Block Stair=Äußere weiße Granit-Block-Treppe +Outer Cracked White Granite Brick Stair=Äußere rissige weiße Granit-Ziegel-Treppe +Outer Cobbled White Granite Stair=Äußere gepflasterte weiße Granit-Treppe + +Outer Yellow Granite Stair=Äußere gelbe Granit-Treppe +Outer Yellow Granite Brick Stair=Äußere gelbe Granit-Ziegel-Treppe +Outer Yellow Granite Block Stair=Äußere gelbe Granit-Block-Treppe +Outer Cracked Yellow Granite Brick Stair=Äußere rissige gelbe Granit-Ziegel-Treppe +Outer Cobbled Yellow Granite Stair=Äußere gepflasterte gelbe Granit-Treppe + +Outer Heliodor Stair=Äußere Heliodor-Treppe +Outer Heliodor Brick Stair=Äußere Heliodor-Ziegel-Treppe +Outer Heliodor Block Stair=Äußere Heliodor-Block-Treppe +Outer Cracked Heliodor Brick Stair=Äußere rissige Heliodor-Ziegel-Treppe + +Outer Howlite Stair=Äußere Howlite-Treppe +Outer Howlite Brick Stair=Äußere Howlite-Ziegel-Treppe +Outer Howlite Block Stair=Äußere Howlite-Block-Treppe +Outer Cracked Howlite Brick Stair=Äußere rissige Howlite-Ziegel-Treppe +Outer Cobbled Howlite Stair=Äußere gepflasterte Howlite-Treppe + +Outer Ilvaite Stair=Äußere Ilvaite-Treppe +Outer Ilvaite Brick Stair=Äußere Ilvaite-Ziegel-Treppe +Outer Ilvaite Block Stair=Äußere Ilvaite-Block-Treppe +Outer Cracked Ilvaite Brick Stair=Äußere rissige Ilvaite-Ziegel-Treppe +Outer Cobbled Ilvaite Stair=Äußere gepflasterte Ilvaite-Treppe + +Outer Jade Stair=Äußere Jade-Treppe +Outer Jade Brick Stair=Äußere Jade-Ziegel-Treppe +Outer Jade Block Stair=Äußere Jade-Block-Treppe +Outer Cracked Jade Brick Stair=Äußere rissige Jade-Ziegel-Treppe +Outer Cobbled Jade Stair=Äußere gepflasterte Jade-Treppe + +Outer Red Jasper Stair=Äußere rote Jaspistreppe +Outer Red Jasper Brick Stair=Äußere rote Jaspisziegeltreppe +Outer Red Jasper Block Stair=Äußere rote Jaspisblocktreppe +Outer Cracked Red Jasper Brick Stair=Äußere gerissene rote Jaspisziegeltreppe +Outer Cobbled Red Jasper Stair=Äußere gerumpelte rote Jaspistreppe + +Outer Kyanite Stair=Äußere Kyanit-Treppe +Outer Kyanite Brick Stair=Äußere Kyanit-Ziegel-Treppe +Outer Kyanite Block Stair=Äußere Kyanit-Block-Treppe +Outer Cracked Kyanite Brick Stair=Äußere rissige Kyanit-Ziegel-Treppe +Outer Cobbled Kyanite Stair=Äußere gepflasterte Kyanit-Treppe + +Outer Lapis Lazuli Stair=Äußere Lapislazuli-Treppe +Outer Lapis Lazuli Brick Stair=Äußere Lapislazuli-Ziegel-Treppe +Outer Lapis Lazuli Block Stair=Äußere Lapislazuli-Block-Treppe +Outer Cracked Lapis Lazuli Brick Stair=Äußere rissige Lapislazuli-Ziegel-Treppe + +Outer Lepidolite Stair=Äußere Lepidolithtreppe +Outer Lepidolite Brick Stair=Äußere Lepidolithziegeltreppe +Outer Lepidolite Block Stair=Äußere Lepidolithblocktreppe +Outer Cracked Lepidolite Brick Stair=Äußere gerissene Lepidolithziegeltreppe +Outer Cobbled Lepidolite Stair=Äußere gerumpelte Lepidolithtreppe + +Outer Blue Limestone Stair=Äußere blaue Kalkstein-Treppe +Outer Blue Limestone Brick Stair=Äußere blaue Kalkstein-Ziegel-Treppe +Outer Blue Limestone Block Stair=Äußere blaue Kalkstein-Block-Treppe +Outer Cracked Blue Limestone Brick Stair=Äußere rissige blaue Kalkstein-Ziegel-Treppe +Outer Cobbled Blue Limestone Stair=Äußere gepflasterte blaue Kalkstein-Treppe + +Outer White Limestone Stair=Äußere weiße Kalkstein-Treppe +Outer White Limestone Brick Stair=Äußere weiße Kalkstein-Ziegel-Treppe +Outer White Limestone Block Stair=Äußere weiße Kalkstein-Block-Treppe +Outer Cracked White Limestone Brick Stair=Äußere rissige weiße Kalkstein-Ziegel-Treppe +Outer Cobbled White Limestone Stair=Äußere gepflasterte weiße Kalkstein-Treppe + +Outer Marble Stair=Äußere Marmor-Treppe +Outer Marble Brick Stair=Äußere Marmor-Ziegel-Treppe +Outer Marble Block Stair=Äußere Marmor-Block-Treppe +Outer Cracked Marble Brick Stair=Äußere rissige Marmor-Ziegel-Treppe +Outer Cobbled Marble Stair=Äußere gepflasterte Marmor-Treppe + +Outer Moonstone Stair=Äußere Mondsteintreppe +Outer Moonstone Brick Stair=Äußere Mondsteinziegeltreppe +Outer Moonstone Block Stair=Äußere Mondsteinblocktreppe +Outer Cracked Moonstone Brick Stair=Äußere gerissene Mondsteinziegeltreppe + +Outer Morion Quartz Stair=Äußere Morion-Quarz-Treppe +Outer Morion Quartz Brick Stair=Äußere Morion-Quarz-Ziegel-Treppe +Outer Morion Quartz Block Stair=Äußere Morion-Quarz-Block-Treppe +Outer Cracked Morion Quartz Brick Stair=Äußere rissige Morion-Quarz-Ziegel-Treppe + +Outer Mudstone Stair=Äußere Schiefer-Treppe +Outer Cobbled Mudstone Stair=Äußere gepflasterte Schiefer-Treppe +Outer Mudstone Brick Stair=Äußere Schiefer-Ziegel-Treppe +Outer Mudstone Block Stair=Äußere Schiefer-Block-Treppe +Outer Cracked Mudstone Brick Stair=Äußere rissige Schiefer-Ziegel-Treppe + +Outer Prasiolite Stair=Äußere Prasiolith-Treppe +Outer Prasiolite Brick Stair=Äußere Prasiolith-Ziegel-Treppe +Outer Prasiolite Block Stair=Äußere Prasiolith-Block-Treppe +Outer Cracked Prasiolite Brick Stair=Äußere rissige Prasiolith-Ziegel-Treppe + +Outer Pumice Stair=Äußere Bimsstein-Treppe +Outer Pumice Brick Stair=Äußere Bimsstein-Ziegel-Treppe +Outer Pumice Block Stair=Äußere Bimsstein-Block-Treppe +Outer Cracked Pumice Brick Stair=Äußere rissige Bimsstein-Ziegel-Treppe + +Outer Pyrite Stair=Äußere Pyrit-Treppe +Outer Pyrite Brick Stair=Äußere Pyrit-Ziegel-Treppe +Outer Pyrite Block Stair=Äußere Pyrit-Block-Treppe +Outer Cracked Pyrite Brick Stair=Äußere rissige Pyrit-Ziegel-Treppe + +Outer Quartz Stair=Äußere Quarz-Treppe +Outer Quartz Brick Stair=Äußere Quarz-Ziegel-Treppe +Outer Quartz Block Stair=Äußere Quarz-Block-Treppe +Outer Cracked Quartz Brick Stair=Äußere rissige Quarz-Ziegel-Treppe + +Outer Rhodonite Stair=Äußere Rhodonittreppe +Outer Rhodonite Brick Stair=Äußere Rhodonitziegeltreppe +Outer Rhodonite Block Stair=Äußere Rhodonitblocktreppe +Outer Cracked Rhodonite Brick Stair=Äußere gerissene Rhodonitziegeltreppe +Outer Cobbled Rhodonite Stair=Äußere gefaste Rhodonittreppe + +Outer Rose Quartz Stair=Äußere Rosenquarz-Treppe +Outer Rose Quartz Brick Stair=Äußere Rosenquarz-Ziegel-Treppe +Outer Rose Quartz Block Stair=Äußere Rosenquarz-Block-Treppe +Outer Cracked Rose Quartz Brick Stair=Äußere rissige Rosenquarz-Ziegel-Treppe + +Outer Scoria Stair=Äußere Scoria-Treppe +Outer Scoria Brick Stair=Äußere Scoria-Ziegel-Treppe +Outer Scoria Block Stair=Äußere Scoria-Block-Treppe +Outer Cracked Scoria Brick Stair=Äußere rissige Scoria-Ziegel-Treppe +Outer Cobbled Scoria Stair=Äußere gepflasterte Scoria-Treppe + +Outer Serpentine Stair=Äußere Serpentin-Treppe +Outer Cobbled Serpentine Stair=Äußere gepflasterte Serpentin-Treppe +Outer Serpentine Brick Stair=Äußere Serpentin-Ziegel-Treppe +Outer Serpentine Block Stair=Äußere Serpentin-Block-Treppe +Outer Cracked Serpentine Brick Stair=Äußere rissige Serpentin-Ziegel-Treppe + +Outer Shale Stair=Äußere Schiefer-Treppe +Outer Shale Brick Stair=Äußere Schiefer-Ziegel-Treppe +Outer Shale Block Stair=Äußere Schiefer-Block-Treppe +Outer Cracked Shale Brick Stair=Äußere rissige Schiefer-Ziegel-Treppe +Outer Cobbled Shale Stair=Äußere gepflasterte Schiefer-Treppe + +Outer Slate Stair=Äußere Schiefer-Treppe +Outer Slate Brick Stair=Äußere Schiefer-Ziegel-Treppe +Outer Slate Block Stair=Äußere Schiefer-Block-Treppe +Outer Cracked Slate Brick Stair=Äußere rissige Schiefer-Ziegel-Treppe +Outer Cobbled Slate Stair=Äußere gepflasterte Schiefer-Treppe +Outer Slate Tile Stair=Äußere Schieferfliesen-Treppe + +Outer Smokey Quartz Stair=Äußere Rauchquarz-Treppe +Outer Smokey Quartz Brick Stair=Äußere Rauchquarz-Ziegel-Treppe +Outer Smokey Quartz Block Stair=Äußere Rauchquarz-Block-Treppe +Outer Cracked Smokey Quartz Brick Stair=Äußere rissige Rauchquarz-Ziegel-Treppe + +Outer Soapstone Stair=Äußere Speckstein-Treppe +Outer Soapstone Brick Stair=Äußere Speckstein-Ziegel-Treppe +Outer Soapstone Block Stair=Äußere Speckstein-Block-Treppe +Outer Cracked Soapstone Brick Stair=Äußere rissige Speckstein-Ziegel-Treppe + +Outer Sodalite Stair=Äußere Sodalith-Treppe +Outer Cobbled Sodalite Stair=Äußere gepflasterte Sodalith-Treppe +Outer Sodalite Brick Stair=Äußere Sodalith-Ziegel-Treppe +Outer Sodalite Block Stair=Äußere Sodalith-Block-Treppe +Outer Cracked Sodalite Brick Stair=Äußere rissige Sodalith-Ziegel-Treppe + +Outer Sugilite Stair=Äußere Sugilith-Treppe +Outer Sugilite Brick Stair=Äußere Sugilith-Ziegel-Treppe +Outer Sugilite Block Stair=Äußere Sugilith-Block-Treppe +Outer Cracked Sugilite Brick Stair=Äußere rissige Sugilith-Ziegel-Treppe +Outer Cobbled Sugilite Stair=Äußere gepflasterte Sugilith-Treppe + +Outer Green Tourmaline Stair=Äußere grüne Turmalintreppe +Outer Green Tourmaline Brick Stair=Äußere grüner Turmalinziegeltreppe +Outer Green Tourmaline Block Stair=Äußere grüner Turmalinblocktreppe +Outer Cracked Green Tourmaline Brick Stair=Äußere gerissene grüne Turmalinziegeltreppe + +Outer Paraiba Tourmaline Stair=Äußere Paraíba-Turmalinstufe +Outer Paraiba Tourmaline Brick Stair=Äußere Paraíba-Turmalinziegelstufe +Outer Paraiba Tourmaline Block Stair=Äußere Paraíba-Turmalinblockstufe +Outer Cracked Paraiba Tourmaline Brick Stair=Äußere gerissene Paraíba-Turmalinziegelstufe + +Outer Pink Tourmaline Stair=Äußere rosa Turmalinstufe +Outer Pink Tourmaline Brick Stair=Äußere rosa Turmalinziegelstufe +Outer Pink Tourmaline Block Stair=Äußere rosa Turmalinblockstufe +Outer Cracked Pink Tourmaline Brick Stair=Äußere gerissene rosa Turmalinziegelstufe + +Outer Travertine Stair=Äußere Travertin-Treppe +Outer Cobbled Travertine Stair=Äußere gepflasterte Travertin-Treppe +Outer Travertine Brick Stair=Äußere Travertin-Ziegel-Treppe +Outer Travertine Block Stair=Äußere Travertin-Block-Treppe +Outer Cracked Travertine Brick Stair=Äußere rissige Travertin-Ziegel-Treppe + +Outer Yellow Travertine Stair=Äußere gelbe Travertin-Treppe +Outer Cobbled Yellow Travertine Stair=Äußere gepflasterte gelbe Travertin-Treppe +Outer Yellow Travertine Brick Stair=Äußere gelbe Travertin-Ziegel-Treppe +Outer Yellow Travertine Block Stair=Äußere gelbe Travertin-Block-Treppe +Outer Cracked Yellow Travertine Brick Stair=Äußere rissige gelbe Travertin-Ziegel-Treppe + +Outer Beige Tuff Stair=Äußere beige Tuff-Treppe +Outer Cobbled Beige Tuff Stair=Äußere gepflasterte beige Tuff-Treppe +Outer Beige Tuff Brick Stair=Äußere beige Tuff-Ziegel-Treppe +Outer Beige Tuff Block Stair=Äußere beige Tuff-Block-Treppe +Outer Cracked Beige Tuff Brick Stair=Äußere rissige beige Tuff-Ziegel-Treppe + +Outer Grey Tuff Stair=Äußere graue Tuff-Treppe +Outer Cobbled Grey Tuff Stair=Äußere gepflasterte graue Tuff-Treppe +Outer Grey Tuff Brick Stair=Äußere graue Tuff-Ziegel-Treppe +Outer Grey Tuff Block Stair=Äußere graue Tuff-Block-Treppe +Outer Cracked Grey Tuff Brick Stair=Äußere rissige graue Tuff-Ziegel-Treppe + +Outer Red Tuff Stair=Äußere rote Tuff-Treppe +Outer Cobbled Red Tuff Stair=Äußere gepflasterte rote Tuff-Treppe +Outer Red Tuff Brick Stair=Äußere rote Tuff-Ziegel-Treppe +Outer Red Tuff Block Stair=Äußere rote Tuff-Block-Treppe +Outer Cracked Red Tuff Brick Stair=Äußere rissige rote Tuff-Ziegel-Treppe + +Outer Turquoise Stair=Äußere Türkis-Treppe +Outer Turquoise Brick Stair=Äußere Türkis-Ziegel-Treppe +Outer Turquoise Block Stair=Äußere Türkis-Block-Treppe +Outer Cracked Turquoise Brick Stair=Äußere rissige Türkis-Ziegel-Treppe +Outer Cobbled Turquoise Stair=Äußere gepflasterte Türkis-Treppe + +Outer Vivianite Stair=Äußere Vivianit-Treppe +Outer Vivianite Brick Stair=Äußere Vivianit-Ziegel-Treppe +Outer Vivianite Block Stair=Äußere Vivianit-Block-Treppe +Outer Cracked Vivianite Brick Stair=Äußere rissige Vivianit-Ziegel-Treppe + +### nodes_glowing.lua ### + +Glowing Apatite=Leuchtender Apatit +Glowing Apatite Block=Leuchtender Apatitblock +Cobbled Glowing Apatite=Gepflasterter leuchtender Apatit +Glowing Apatite Brick=Leuchtender Apatitziegel +Cracked Glowing Apatite Brick=Rissiger leuchtender Apatitziegel + +Glowing Calcite=Leuchtender Calcit +Glowing Calcite Block=Leuchtender Calcitblock +Cobbled Glowing Calcite=Gepflasterter leuchtender Calcit +Glowing Calcite Brick=Leuchtender Calcitziegel +Cracked Glowing Calcite Brick=Rissiger leuchtender Calcitziegel + +Glowing Esperite=Leuchtender Esperit +Glowing Esperite Block=Leuchtender Esperitblock +Cobbled Glowing Esperite=Gepflasterter leuchtender Esperit +Glowing Esperite Brick=Leuchtender Esperitziegel +Cracked Glowing Esperite Brick=Rissiger leuchtender Esperitziegel + +Glowing Fluorite=Leuchtender Fluorit +Glowing Fluorite Block=Leuchtender Fluoritblock +Cobbled Glowing Fluorite=Gepflasterter leuchtender Fluorit +Glowing Fluorite Brick=Leuchtender Fluoritziegel +Cracked Glowing Fluorite Brick=Rissiger leuchtender Fluoritziegel + +Glowing Selenite=Leuchtender Selenit +Glowing Selenite Block=Leuchtender Selenitblock +Cobbled Glowing Selenite=Gepflasterter leuchtender Selenit +Glowing Selenite Brick=Leuchtender Selenitziegel +Cracked Glowing Selenite Brick=Rissiger leuchtender Selenitziegel + +Glowing Sodalite=Leuchtender Sodalith +Glowing Sodalite Block=Leuchtender Sodalithblock +Cobbled Glowing Sodalite=Gepflasterter leuchtender Sodalith +Glowing Sodalite Brick=Leuchtender Sodalithziegel +Cracked Glowing Sodalite Brick=Rissiger leuchtender Sodalithziegel + +Glowing Willemite=Leuchtender Willemite +Glowing Willemite Block=Leuchtender Willemiteblock +Cobbled Glowing Willemite=Gepflasterter leuchtender Willemite +Glowing Willemite Brick=Leuchtender Willemiteziegel +Cracked Glowing Willemite Brick=Rissiger leuchtender Willemiteziegel + +### nodes_crystal.lua ### + +Budding Amazonite=Sprießender Amazonit +Amazonite Crystal=Amazonit Kristall + +Budding Amber=Sprießendes Bernstein +Amber Crystal=Bernstein Kristall + +Budding Amethyst=Sprießender Amethyst +Amethyst Crystal=Amethyst Kristall + +Budding Celestine=Sprießende Cölestin +Celestine Crystal=Cölestin Kristall + +Budding Chalcanthite=Sprießende Chalkanthit +Chalcanthite Crystal=Chalkanthit Kristall + +Budding Citrine=Sprießender Citrin +Citrine Crystal=Citrin Kristall + +Budding Crocoite=Sprießender Crocoit +Crocoite Crystal=Crocoit Kristall + +Budding Eudialite=Sprießender Eudialit +Eudialite Crystal=Eudialit Kristall + +Budding Heliodor=Sprießender Heliodor +Heliodor Crystal=Heliodor Kristall + +Budding Kyanite=Sprießender Kyanit +Kyanite Crystal=Kyanit Kristall + +Budding Moonstone=Sprießender Mondstein +Moonstone Crystal=Mondstein Kristall + +Budding Morion Quartz=Sprießender Morion Quarz +Morion Quartz Crystal=Morion Quarz Kristall + +Budding Prasiolite=Sprießender Prasiolith +Prasiolite Crystal=Prasiolith Kristall + +Budding Quartz=Sprießender Quarz +Quartz Crystal=Quarz Kristall + +Budding Rose Quartz=Sprießender Rosenquarz +Rose Quartz Crystal=Rosenquarz Kristall + +Budding Smokey Quartz=Sprießender Rauchquarz +Smokey Quartz Crystal=Rauchquarz Kristall + +Budding Green Tourmaline=Sprießender Grüner Turmalin +Green Tourmaline Crystal=Grüner Turmalin Kristall + +Budding Paraiba Tourmaline=Sprießender Paraiba Turmalin +Paraiba Tourmaline Crystal=Paraiba Turmalin Kristall + +Budding Pink Tourmaline=Sprießender Rosa Turmalin +Pink Tourmaline Crystal=Rosa Turmalin Kristall + +Budding Vivianite=Sprießende Vivianit +Vivianite Crystal=Vivianit Kristall diff --git a/mods/too_many_stones/locale/too_many_stones.es.tr b/mods/too_many_stones/locale/too_many_stones.es.tr new file mode 100644 index 00000000..0cf5a025 --- /dev/null +++ b/mods/too_many_stones/locale/too_many_stones.es.tr @@ -0,0 +1,2471 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate=Ãgata azul +Gray Agate=Ãgata gris +Green Agate=Ãgata verde +Moss Agate=Ãgata musgosa +Orange Agate=Ãgata naranja +Purple Agate=Ãgata morada +Red Agate=Ãgata roja + +Amazonite=Amazonita +Amazonite Block=Bloque de amazonita +Cobbled Amazonite=Amazonita empedrada +Amazonite Brick=Ladrillo de amazonita +Cracked Amazonite Brick=Ladrillo de amazonita agrietado + +Amber=Ãmbar +Amber Block=Bloque de ámbar +Amber Brick=Ladrillo de ámbar +Cracked Amber Brick=Ladrillo de ámbar agrietado + +Amethyst=Amatista +Amethyst Block=Bloque de amatista +Amethyst Brick=Ladrillo de amatista +Cracked Amethyst Brick=Ladrillo de amatista agrietado + +Ammolite=Ammolita + +Andesite=Andesita +Andesite Block=Bloque de andesita +Andesite Brick=Ladrillo de andesita +Cracked Andesite Brick=Ladrillo de andesita agrietado +Cobbled Andesite=Andesita empedrada + +Basalt=Basalto +Basalt Block=Bloque de basalto +Basalt Brick=Ladrillo de basalto +Cracked Basalt Brick=Ladrillo de basalto agrietado +Cobbled Basalt=Basalto empedrado +Basalt Tile=Azulejo de basalto + +Columnar Basalt=Basalto columnar + +Batch=Polvo de mezcla para vidrio + +Black Moonstone=Piedra lunar negra +Black Moonstone Block=Bloque de piedra lunar negra +Black Moonstone Brick=Ladrillo de piedra lunar negra +Cracked Black Moonstone Brick=Ladrillo de piedra lunar negra agrietado + +Black Opal=Ópalo negro + +Calcite=Calcita +Calcite Block=Bloque de calcita +Calcite Brick=Ladrillo de calcita +Cracked Calcite Brick=Ladrillo de calcita agrietado + +Grey Calcite=Calcita Gris +Grey Calcite Block=Bloque de Calcita Gris +Grey Calcite Brick=Ladrillo de Calcita Gris +Cracked Grey Calcite Brick=Ladrillo de Calcita Gris Agrietado + +Orange Calcite=Calcita Naranja +Orange Calcite Block=Bloque de Calcita Naranja +Orange Calcite Brick=Ladrillo de Calcita Naranja +Cracked Orange Calcite Brick=Ladrillo de Calcita Naranja Agrietado + +Carnotite=Carnotita +Carnotite Block=Bloque de carnotita +Carnotite Brick=Ladrillo de carnotita +Cracked Carnotite Brick=Ladrillo de carnotita agrietado +Cobbled Carnotite=Carnotita empedrada + +Celestine=Celestita +Celestine Block=Bloque de celestita +Celestine Brick=Ladrillo de celestita +Cracked Celestine Brick=Ladrillo de celestita agrietado + +Chalcanthite=Calcanthita +Chalcanthite Block=Bloque de Calcanthita +Chalcanthite Brick=Ladrillo de Calcanthita +Cracked Chalcanthite Brick=Ladrillo de Calcanthita Agrietado +Cobbled Chalcanthite=Calcanthita Guijarreada + +Chrysoprase=Crisoprasa +Chrysoprase Block=Bloque de crisoprasa +Chrysoprase Brick=Ladrillo de crisoprasa +Cracked Chrysoprase Brick=Ladrillo de crisoprasa agrietado + +Citrine=Cuarzo citrino +Citrine Block=Bloque de cuarzo citrino +Citrine Brick=Ladrillo de cuarzo citrino +Cracked Citrine Brick=Ladrillo de cuarzo citrino agrietado + +Covellite=Covellita +Covellite Block=Bloque de covellita +Covellite Brick=Ladrillo de covellita +Cracked Covellite Brick=Ladrillo de covellita agrietado +Cobbled Covellite=Covellita empedrada + +Crocoite=Crocoita +Crocoite Block=Bloque de crocoita +Crocoite Brick=Ladrillo de crocoita +Cracked Crocoite Brick=Ladrillo de crocoita agrietado + +Diorite=Diorita +Diorite Block=Bloque de diorita +Diorite Brick=Ladrillo de diorita +Cracked Diorite Brick=Ladrillo de diorita agrietado +Cobbled Diorite=Diorita empedrada + +Erythrite=Eritrita +Erythrite Block=Bloque de eritrita +Erythrite Brick=Ladrillo de eritrita +Cracked Erythrite Brick=Ladrillo de eritrita agrietado + +Eudialite=Eudialita +Eudialite Block=Bloque de eudialita +Eudialite Brick=Ladrillo de eudialita +Cracked Eudialite Brick=Ladrillo de eudialita agrietado + +Fluorite=Fluorita +Fluorite Block=Bloque de fluorita +Fluorite Brick=Ladrillo de fluorita +Cracked Fluorite Brick=Ladrillo de fluorita agrietado + +Fire Opal=Ópalo de fuego + +Gabbro=Gabro +Gabbro Block=Bloque de gabro +Cobbled Gabbro=Gabro empedrado +Gabbro Brick=Ladrillo de gabro +Cracked Gabbro Brick=Ladrillo de gabro agrietado + +Galena=Galena +Galena Block=Bloque de galena +Galena Brick=Ladrillo de galena +Cracked Galena Brick=Ladrillo de galena agrietado + +Black Granite=Granito negro +Black Granite Block=Bloque de granito negro +Black Granite Brick=Ladrillo de granito negro +Cracked Black Granite Brick=Ladrillo de granito negro agrietado +Cobbled Black Granite=Granito negro empedrado + +Blue Granite=Granito azul +Blue Granite Block=Bloque de granito azul +Blue Granite Brick=Ladrillo de granito azul +Cracked Blue Granite Brick=Ladrillo de granito azul agrietado +Cobbled Blue Granite=Granito azul empedrado + +Gray Granite=Granito gris +Gray Granite Block=Bloque de granito gris +Gray Granite Brick=Ladrillo de granito gris +Cracked Gray Granite Brick=Ladrillo de granito gris agrietado +Cobbled Gray Granite=Granito gris empedrado + +Green Granite=Granito verde +Green Granite Block=Bloque de granito verde +Green Granite Brick=Ladrillo de granito verde +Cracked Green Granite Brick=Ladrillo de granito verde agrietado +Cobbled Green Granite=Granito verde empedrado + +Pink Granite=Granito rosa +Pink Granite Block=Bloque de granito rosa +Pink Granite Brick=Ladrillo de granito rosa +Cracked Pink Granite Brick=Ladrillo de granito rosa agrietado +Cobbled Pink Granite=Granito rosa empedrado + +Red Granite=Granito rojo +Red Granite Block=Bloque de granito rojo +Red Granite Brick=Ladrillo de granito rojo +Cracked Red Granite Brick=Ladrillo de granito rojo agrietado +Cobbled Red Granite=Granito rojo empedrado + +White Granite=Granito blanco +White Granite Block=Bloque de granito blanco +White Granite Brick=Ladrillo de granito blanco +Cracked White Granite Brick=Ladrillo de granito blanco agrietado +Cobbled White Granite=Granito blanco empedrado + +Yellow Granite=Granito amarillo +Yellow Granite Block=Bloque de granito amarillo +Yellow Granite Brick=Ladrillo de granito amarillo +Cracked Yellow Granite Brick=Ladrillo de granito amarillo agrietado +Cobbled Yellow Granite=Granito amarillo empedrado + +Heliodor=Heliodoro +Heliodor Block=Bloque de heliodoro +Heliodor Brick=Ladrillo de heliodoro +Cracked Heliodor Brick=Ladrillo de heliodoro agrietado + +Howlite=Howlita +Howlite Block=Bloque de howlita +Howlite Brick=Ladrillo de howlita +Cracked Howlite Brick=Ladrillo de howlita agrietado +Cobbled Howlite=Howlita empedrada + +Ilvaite=Ilvaita +Ilvaite Block=Bloque de ilvaita +Ilvaite Brick=Ladrillo de ilvaita +Cracked Ilvaite Brick=Ladrillo de ilvaita agrietado +Cobbled Ilvaite=Ilvaita empedrada + +Jade=Jade +Jade Block=Bloque de jade +Jade Brick=Ladrillo de jade +Cracked Jade Brick=Ladrillo de jade agrietado +Cobbled Jade=Jade empedrado + +Red Jasper=Jaspe Rojo +Red Jasper Block=Bloque de Jaspe Rojo +Red Jasper Brick=Ladrillo de Jaspe Rojo +Cracked Red Jasper Brick=Ladrillo de Jaspe Rojo Agrietado +Cobbled Red Jasper=Jaspe Rojo Guijarreado + +Kyanite=Cianita +Kyanite Block=Bloque de cianita +Kyanite Brick=Ladrillo de cianita +Cracked Kyanite Brick=Ladrillo de cianita agrietado +Cobbled Kyanite=Cianita empedrada + +Lapis Lazuli=Lapislázuli +Lapis Lazuli Block=Bloque de lapislázuli +Lapis Lazuli Brick=Ladrillo de lapislázuli +Cracked Lapis Lazuli Brick=Ladrillo de lapislázuli agrietado + +Lepidolite=Lepidolita +Lepidolite Block=Bloque de Lepidolita +Lepidolite Brick=Ladrillo de Lepidolita +Cracked Lepidolite Brick=Ladrillo de Lepidolita Agrietado +Cobbled Lepidolite=Lepidolita Guijarreada + +Blue Limestone=Piedra caliza azul +Blue Limestone Block=Bloque de piedra caliza azul +Blue Limestone Brick=Ladrillo de piedra caliza azul +Cracked Blue Limestone Brick=Ladrillo de piedra caliza azul agrietado +Cobbled Blue Limestone=Piedra caliza azul empedrada + +White Limestone=Piedra caliza blanca +White Limestone Block=Bloque de piedra caliza blanca +White Limestone Brick=Ladrillo de piedra caliza blanca +Cracked White Limestone Brick=Ladrillo de piedra caliza blanca agrietado +Cobbled White Limestone=Piedra caliza blanca empedrada + +Marble=Mármol +Marble Block=Bloque de mármol +Marble Brick=Ladrillo de mármol +Cracked Marble Brick=Ladrillo de mármol agrietado +Cobbled Marble=Mármol empedrado + +Moonstone=Piedra Lunar +Moonstone Block=Bloque de Piedra Lunar +Moonstone Brick=Ladrillo de Piedra Lunar +Cracked Moonstone Brick=Ladrillo de Piedra Lunar Agrietado + +Morion Quartz=Cuarzo morión +Morion Quartz Block=Bloque de cuarzo morión +Morion Quartz Brick=Ladrillo de cuarzo morión +Cracked Morion Quartz Brick=Ladrillo de cuarzo morión agrietado + +Mudstone=Lutita +Mudstone Block=Bloque de lutita +Cobbled Mudstone=Lutita empedrada +Mudstone Brick=Ladrillo de lutita +Cracked Mudstone Brick=Ladrillo de lutita agrietado + +Opal=Ópalo + +Prasiolite=Prasiolita +Prasiolite Block=Bloque de prasiolita +Prasiolite Brick=Ladrillo de prasiolita +Cracked Prasiolite Brick=Ladrillo de prasiolita agrietado + +Pumice=Pómez +Pumice Block=Bloque de pómez +Pumice Brick=Ladrillo de pómez +Cracked Pumice Brick=Ladrillo de pómez agrietado + +Pyrite=Pirita +Pyrite Block=Bloque de pirita +Cobbled Pyrite=Pirita empedrada +Pyrite Brick=Ladrillo de pirita +Cracked Pyrite Brick=Ladrillo de pirita agrietado + +Quartz=Cuarzo +Quartz Block=Bloque de cuarzo +Quartz Brick=Ladrillo de cuarzo +Cracked Quartz Brick=Ladrillo de cuarzo agrietado + +Rhodonite=Rodonita +Rhodonite Block=Bloque de Rodonita +Rhodonite Brick=Ladrillo de Rodonita +Cracked Rhodonite Brick=Ladrillo de Rodonita Agrietado +Cobbled Rhodonite=Rodonita Guijarreada + +Rose Quartz=Cuarzo rosa +Rose Quartz Block=Bloque de cuarzo rosa +Rose Quartz Brick=Ladrillo de cuarzo rosa +Cracked Rose Quartz Brick=Ladrillo de cuarzo rosa agrietado + +Scoria=Escoria +Scoria Block=Bloque de escoria +Scoria Brick=Ladrillo de escoria +Cracked Scoria Brick=Ladrillo de escoria agrietado +Cobbled Scoria=Escoria empedrada + +Serpentine=Serpentina +Serpentine Block=Bloque de serpentina +Cobbled Serpentine=Serpentina empedrada +Serpentine Brick=Ladrillo de serpentina +Cracked Serpentine Brick=Ladrillo de serpentina agrietado + +Shale=Esquisto +Shale Block=Bloque de esquisto +Shale Brick=Ladrillo de esquisto +Cracked Shale Brick=Ladrillo de esquisto agrietado +Cobbled Shale=Esquisto empedrado + +Slate=Pizarra +Slate Block=Bloque de pizarra +Slate Brick=Ladrillo de pizarra +Cracked Slate Brick=Ladrillo de pizarra agrietado +Cobbled Slate=Pizarra empedrada +Slate Tile=Azulejo de pizarra + +Smokey Quartz=Cuarzo ahumado +Smokey Quartz Block=Bloque de cuarzo ahumado +Smokey Quartz Brick=Ladrillo de cuarzo ahumado +Cracked Smokey Quartz Brick=Ladrillo de cuarzo ahumado agrietado + +Soapstone=Esteatita +Soapstone Block=Bloque de esteatita +Soapstone Brick=Ladrillo de esteatita +Cracked Soapstone Brick=Ladrillo de esteatita agrietado + +Sodalite=Sodalita +Sodalite Block=Bloque de sodalita +Cobbled Sodalite=Sodalita empedrada +Sodalite Brick=Ladrillo de sodalita +Cracked Sodalite Brick=Ladrillo de sodalita agrietado + +Sugilite=Sugilita +Sugilite Block=Bloque de sugilita +Sugilite Brick=Ladrillo de sugilita +Cracked Sugilite Brick=Ladrillo de sugilita agrietado +Cobbled Sugilite=Sugilita empedrada + +Green Tourmaline=Turmalina Verde +Green Tourmaline Block=Bloque de Turmalina Verde +Green Tourmaline Brick=Ladrillo de Turmalina Verde +Cracked Green Tourmaline Brick=Ladrillo de Turmalina Verde Agrietado + +Paraiba Tourmaline=Turmalina Paraíba +Paraiba Tourmaline Block=Bloque de Turmalina Paraíba +Paraiba Tourmaline Brick=Ladrillo de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick=Ladrillo de Turmalina Paraíba Agrietado + +Pink Tourmaline=Turmalina Rosa +Pink Tourmaline Block=Bloque de Turmalina Rosa +Pink Tourmaline Brick=Ladrillo de Turmalina Rosa +Cracked Pink Tourmaline Brick=Ladrillo de Turmalina Rosa Agrietado + +Travertine=Travertino +Travertine Block=Bloque de travertino +Cobbled Travertine=Travertino empedrado +Travertine Brick=Ladrillo de travertino +Cracked Travertine Brick=Ladrillo de travertino agrietado + +Yellow Travertine=Travertino amarillo +Yellow Travertine Block=Bloque de travertino amarillo +Cobbled Yellow Travertine=Travertino amarillo empedrado +Yellow Travertine Brick=Ladrillo de travertino amarillo +Cracked Yellow Travertine Brick=Ladrillo de travertino amarillo agrietado + +Beige Tuff=Toba beige +Beige Tuff Block=Bloque de toba beige +Cobbled Beige Tuff=Toba beige empedrada +Beige Tuff Brick=Ladrillo de toba beige +Cracked Beige Tuff=Toba beige agrietada + +Grey Tuff=Toba gris +Grey Tuff Block=Bloque de toba gris +Cobbled Grey Tuff=Toba gris empedrada +Grey Tuff Brick=Ladrillo de toba gris +Cracked Grey Tuff=Toba gris agrietada + +Red Tuff=Toba roja +Red Tuff Block=Bloque de toba roja +Cobbled Red Tuff=Toba roja empedrada +Red Tuff Brick=Ladrillo de toba roja +Cracked Red Tuff=Toba roja agrietada + +Turquoise=Turquesa +Turquoise Block=Bloque de turquesa +Turquoise Brick=Ladrillo de turquesa +Cracked Turquoise Brick=Ladrillo de turquesa agrietado +Cobbled Turquoise=Turquesa empedrada +Turquoise Pebble=Guijarro de turquesa + +Vivianite=Vivianita +Vivianite Block=Bloque de vivianita +Vivianite Brick=Ladrillo de vivianita +Cracked Vivianite Brick=Ladrillo de vivianita agrietado + +### wall.lua ### + +Blue Agate Wall=Muro de Ãgata Azul +Gray Agate Wall=Muro de Ãgata Gris +Green Agate Wall=Muro de Ãgata Verde +Moss Agate Wall=Muro de Ãgata Musgosa +Orange Agate Wall=Muro de Ãgata Naranja +Purple Agate Wall=Muro de Ãgata Morada +Red Agate Wall=Muro de Ãgata Roja + +Amazonite Wall=Muro de Amazonita +Cobbled Amazonite Wall=Muro de Amazonita Adoquinada +Amazonite Brick Wall=Muro de Ladrillos de Amazonita +Amazonite Block Wall=Muro de Bloques de Amazonita +Cracked Amazonite Brick Wall=Muro de Ladrillos de Amazonita Agrietados + +Amber Wall=Muro de Ãmbar +Amber Brick Wall=Muro de Ladrillos de Ãmbar +Amber Block Wall=Muro de Bloques de Ãmbar +Cracked Amber Brick Wall=Muro de Ladrillos de Ãmbar Agrietados + +Amethyst Wall=Muro de Amatista +Amethyst Brick Wall=Muro de Ladrillos de Amatista +Amethyst Block Wall=Muro de Bloques de Amatista +Cracked Amethyst Brick Wall=Muro de Ladrillos de Amatista Agrietados + +Andesite Wall=Muro de Andesita +Andesite Block Wall=Muro de Bloques de Andesita +Andesite Brick Wall=Muro de Ladrillos de Andesita +Cracked Andesite Brick Wall=Muro de Ladrillos de Andesita Agrietados +Cobbled Andesite Wall=Muro de Andesita Adoquinada + +Basalt Wall=Muro de Basalto +Basalt Block Wall=Muro de Bloques de Basalto +Basalt Brick Wall=Muro de Ladrillos de Basalto +Cracked Basalt Brick Wall=Muro de Ladrillos de Basalto Agrietados +Cobbled Basalt Wall=Muro de Basalto Adoquinado +Basalt Tile Wall=Muro de Baldosas de Basalto + +Black Moonstone Wall=Muro de Piedra Lunar Negra +Black Moonstone Brick Wall=Muro de Ladrillos de Piedra Lunar Negra +Black Moonstone Block Wall=Muro de Bloques de Piedra Lunar Negra +Cracked Black Moonstone Brick Wall=Muro de Ladrillos de Piedra Lunar Negra Agrietados + +Grey Calcite Wall=Pared de Calcita Gris +Grey Calcite Brick Wall=Pared de Ladrillo de Calcita Gris +Grey Calcite Block Wall=Pared de Bloque de Calcita Gris +Cracked Grey Calcite Brick Wall=Pared de Ladrillo de Calcita Gris Agrietado + +Calcite Wall=Muro de Calcita +Calcite Brick Wall=Muro de Ladrillos de Calcita +Calcite Block Wall=Muro de Bloques de Calcita +Cracked Calcite Brick Wall=Muro de Ladrillos de Calcita Agrietados + +Orange Calcite Wall=Pared de Calcita Naranja +Orange Calcite Brick Wall=Pared de Ladrillo de Calcita Naranja +Orange Calcite Block Wall=Pared de Bloque de Calcita Naranja +Cracked Orange Calcite Brick Wall=Pared de Ladrillo de Calcita Naranja Agrietado + +Carnotite Wall=Muro de Carnotita +Carnotite Brick Wall=Muro de Ladrillos de Carnotita +Carnotite Block Wall=Muro de Bloques de Carnotita +Cracked Carnotite Brick Wall=Muro de Ladrillos de Carnotita Agrietados +Cobbled Carnotite Wall=Muro de Carnotita Adoquinada + +Celestine Wall=Muro de Celestita +Celestine Brick Wall=Muro de Ladrillos de Celestita +Celestine Block Wall=Muro de Bloques de Celestita +Cracked Celestine Brick Wall=Muro de Ladrillos de Celestita Agrietados + +Chalcanthite Wall=Pared de Calcanthita +Chalcanthite Brick Wall=Pared de Ladrillo de Calcanthita +Chalcanthite Block Wall=Pared de Bloque de Calcanthita +Cracked Chalcanthite Brick Wall=Pared de Ladrillo de Calcanthita Agrietado +Cobbled Chalcanthite Wall=Pared de Calcanthita Guijarreada + +Chrysoprase Wall=Muro de Crisoprasa +Chrysoprase Brick Wall=Muro de Ladrillos de Crisoprasa +Chrysoprase Block Wall=Muro de Bloques de Crisoprasa +Cracked Chrysoprase Brick Wall=Muro de Ladrillos de Crisoprasa Agrietados + +Citrine Wall=Muro de Citrino +Citrine Brick Wall=Muro de Ladrillos de Citrino +Citrine Block Wall=Muro de Bloques de Citrino +Cracked Citrine Brick Wall=Muro de Ladrillos de Citrino Agrietados + +Covellite Wall=Muro de Covellita +Covellite Brick Wall=Muro de Ladrillos de Covellita +Covellite Block Wall=Muro de Bloques de Covellita +Cracked Covellite Brick Wall=Muro de Ladrillos de Covellita Agrietados +Cobbled Covellite Wall=Muro de Covellita Adoquinada + +Crocoite Wall=Muro de Crocoita +Crocoite Brick Wall=Muro de Ladrillos de Crocoita +Crocoite Block Wall=Muro de Bloques de Crocoita +Cracked Crocoite Brick Wall=Muro de Ladrillos de Crocoita Agrietados + +Diorite Wall=Muro de Diorita +Diorite Brick Wall=Muro de Ladrillos de Diorita +Diorite Block Wall=Muro de Bloques de Diorita +Cracked Diorite Brick Wall=Muro de Ladrillos de Diorita Agrietados +Cobbled Diorite Wall=Muro de Diorita Adoquinada + +Erythrite Wall=Muro de Eritrita +Erythrite Brick Wall=Muro de Ladrillos de Eritrita +Erythrite Block Wall=Muro de Bloques de Eritrita +Cracked Erythrite Brick Wall=Muro de Ladrillos de Eritrita Agrietados + +Eudialite Wall=Muro de Eudialita +Eudialite Brick Wall=Muro de Ladrillos de Eudialita +Eudialite Block Wall=Muro de Bloques de Eudialita +Cracked Eudialite Brick Wall=Muro de Ladrillos de Eudialita Agrietados + +Fluorite Wall=Muro de Fluorita +Fluorite Brick Wall=Muro de Ladrillos de Fluorita +Fluorite Block Wall=Muro de Bloques de Fluorita +Cracked Fluorite Brick Wall=Muro de Ladrillos de Fluorita Agrietados + +Gabbro Wall=Muro de Gabro +Cobbled Gabbro Wall=Muro de Gabro Adoquinado +Gabbro Brick Wall=Muro de Ladrillos de Gabro +Gabbro Block Wall=Muro de Bloques de Gabro +Cracked Gabbro Brick Wall=Muro de Ladrillos de Gabro Agrietados + +Galena Wall=Muro de Galena +Galena Brick Wall=Muro de Ladrillos de Galena +Galena Block Wall=Muro de Bloques de Galena +Cracked Galena Brick Wall=Muro de Ladrillos de Galena Agrietados + +Black Granite Wall=Muro de Granito Negro +Black Granite Brick Wall=Muro de Ladrillos de Granito Negro +Black Granite Block Wall=Muro de Bloques de Granito Negro +Cracked Black Granite Brick Wall=Muro de Ladrillos de Granito Negro Agrietados +Cobbled Black Granite Wall=Muro de Granito Negro Adoquinado + +Blue Granite Wall=Muro de Granito Azul +Blue Granite Brick Wall=Muro de Ladrillos de Granito Azul +Blue Granite Block Wall=Muro de Bloques de Granito Azul +Cracked Blue Granite Brick Wall=Muro de Ladrillos de Granito Azul Agrietados +Cobbled Blue Granite Wall=Muro de Granito Azul Adoquinado + +Gray Granite Wall=Muro de Granito Gris +Gray Granite Brick Wall=Muro de Ladrillos de Granito Gris +Gray Granite Block Wall=Muro de Bloques de Granito Gris +Cracked Gray Granite Brick Wall=Muro de Ladrillos de Granito Gris Agrietados +Cobbled Gray Granite Wall=Muro de Granito Gris Adoquinado + +Green Granite Wall=Muro de Granito Verde +Green Granite Brick Wall=Muro de Ladrillos de Granito Verde +Green Granite Block Wall=Muro de Bloques de Granito Verde +Cracked Green Granite Brick Wall=Muro de Ladrillos de Granito Verde Agrietados +Cobbled Green Granite Wall=Muro de Granito Verde Adoquinado + +Pink Granite Wall=Muro de Granito Rosa +Pink Granite Brick Wall=Muro de Ladrillos de Granito Rosa +Pink Granite Block Wall=Muro de Bloques de Granito Rosa +Cracked Pink Granite Brick Wall=Muro de Ladrillos de Granito Rosa Agrietados +Cobbled Pink Granite Wall=Muro de Granito Rosa Adoquinado + +Red Granite Wall=Muro de Granito Rojo +Red Granite Brick Wall=Muro de Ladrillos de Granito Rojo +Red Granite Block Wall=Muro de Bloques de Granito Rojo +Cracked Red Granite Brick Wall=Muro de Ladrillos de Granito Rojo Agrietados +Cobbled Red Granite Wall=Muro de Granito Rojo Adoquinado + +White Granite Wall=Muro de Granito Blanco +White Granite Brick Wall=Muro de Ladrillos de Granito Blanco +White Granite Block Wall=Muro de Bloques de Granito Blanco +Cracked White Granite Brick Wall=Muro de Ladrillos de Granito Blanco Agrietados +Cobbled White Granite Wall=Muro de Granito Blanco Adoquinado + +Yellow Granite Wall=Muro de Granito Amarillo +Yellow Granite Brick Wall=Muro de Ladrillos de Granito Amarillo +Yellow Granite Block Wall=Muro de Bloques de Granito Amarillo +Cracked Yellow Granite Brick Wall=Muro de Ladrillos de Granito Amarillo Agrietados +Cobbled Yellow Granite Wall=Muro de Granito Amarillo Adoquinado + +Heliodor Wall=Muro de Heliodoro +Heliodor Brick Wall=Muro de Ladrillos de Heliodoro +Heliodor Block Wall=Muro de Bloques de Heliodoro +Cracked Heliodor Brick Wall=Muro de Ladrillos de Heliodoro Agrietados + +Howlite Wall=Muro de Howlita +Howlite Brick Wall=Muro de Ladrillos de Howlita +Howlite Block Wall=Muro de Bloques de Howlita +Cracked Howlite Brick Wall=Muro de Ladrillos de Howlita Agrietados +Cobbled Howlite Wall=Muro de Howlita Adoquinada + +Ilvaite Wall=Muro de Ilvaita +Ilvaite Brick Wall=Muro de Ladrillos de Ilvaita +Ilvaite Block Wall=Muro de Bloques de Ilvaita +Cracked Ilvaite Brick Wall=Muro de Ladrillos de Ilvaita Agrietados +Cobbled Ilvaite Wall=Muro de Ilvaita Adoquinada + +Jade Wall=Muro de Jade +Jade Brick Wall=Muro de Ladrillos de Jade +Jade Block Wall=Muro de Bloques de Jade +Cracked Jade Brick Wall=Muro de Ladrillos de Jade Agrietados +Cobbled Jade Wall=Muro de Jade Adoquinado + +Red Jasper Wall=Pared de Jaspe Rojo +Red Jasper Brick Wall=Pared de Ladrillo de Jaspe Rojo +Red Jasper Block Wall=Pared de Bloque de Jaspe Rojo +Cracked Red Jasper Brick Wall=Pared de Ladrillo de Jaspe Rojo Agrietado +Cobbled Red Jasper Wall=Pared de Jaspe Rojo Guijarreado + +Kyanite Wall=Muro de Cianita +Kyanite Brick Wall=Muro de Ladrillos de Cianita +Kyanite Block Wall=Muro de Bloques de Cianita +Cracked Kyanite Brick Wall=Muro de Ladrillos de Cianita Agrietados +Cobbled Kyanite Wall=Muro de Cianita Adoquinado + +Lapis Lazuli Wall=Muro de Lapislázuli +Lapis Lazuli Brick Wall=Muro de Ladrillos de Lapislázuli +Lapis Lazuli Block Wall=Muro de Bloques de Lapislázuli +Cracked Lapis Lazuli Brick Wall=Muro de Ladrillos de Lapislázuli Agrietados + +Lepidolite Wall=Pared de Lepidolita +Lepidolite Brick Wall=Pared de Ladrillo de Lepidolita +Lepidolite Block Wall=Pared de Bloque de Lepidolita +Cracked Lepidolite Brick Wall=Pared de Ladrillo de Lepidolita Agrietado +Cobbled Lepidolite Wall=Pared de Lepidolita Guijarreada + +Blue Limestone Wall=Muro de Piedra Caliza Azul +Blue Limestone Brick Wall=Muro de Ladrillos de Piedra Caliza Azul +Blue Limestone Block Wall=Muro de Bloques de Piedra Caliza Azul +Cracked Blue Limestone Brick Wall=Muro de Ladrillos de Piedra Caliza Azul Agrietados +Cobbled Blue Limestone Wall=Muro de Piedra Caliza Azul Adoquinado + +White Limestone Wall=Muro de Piedra Caliza Blanca +White Limestone Brick Wall=Muro de Ladrillos de Piedra Caliza Blanca +White Limestone Block Wall=Muro de Bloques de Piedra Caliza Blanca +Cracked White Limestone Brick Wall=Muro de Ladrillos de Piedra Caliza Blanca Agrietados +Cobbled White Limestone Wall=Muro de Piedra Caliza Blanca Adoquinado + +Marble Wall=Muro de Mármol +Marble Brick Wall=Muro de Ladrillos de Mármol +Marble Block Wall=Muro de Bloques de Mármol +Cracked Marble Brick Wall=Muro de Ladrillos de Mármol Agrietados +Cobbled Marble Wall=Muro de Mármol Adoquinado + +Moonstone Wall=Pared de Piedra Lunar +Moonstone Brick Wall=Pared de Ladrillo de Piedra Lunar +Moonstone Block Wall=Pared de Bloque de Piedra Lunar +Cracked Moonstone Brick Wall=Pared de Ladrillo de Piedra Lunar Agrietado + +Morion Quartz Wall=Muro de Cuarzo Morión +Morion Quartz Brick Wall=Muro de Ladrillos de Cuarzo Morión +Morion Quartz Block Wall=Muro de Bloques de Cuarzo Morión +Cracked Morion Quartz Brick Wall=Muro de Ladrillos de Cuarzo Morión Agrietados + +Mudstone Wall=Muro de Rocas Lutitas +Cobbled Mudstone Wall=Muro de Rocas Lutitas Adoquinado +Mudstone Brick Wall=Muro de Ladrillos de Rocas Lutitas +Mudstone Block Wall=Muro de Bloques de Rocas Lutitas +Cracked Mudstone Brick Wall=Muro de Ladrillos de Rocas Lutitas Agrietados + +Prasiolite Wall=Muro de Prasiolita +Prasiolite Brick Wall=Muro de Ladrillos de Prasiolita +Prasiolite Block Wall=Muro de Bloques de Prasiolita +Cracked Prasiolite Brick Wall=Muro de Ladrillos de Prasiolita Agrietados + +Pumice Wall=Muro de Piedra Pómez +Pumice Brick Wall=Muro de Ladrillos de Piedra Pómez +Pumice Block Wall=Muro de Bloques de Piedra Pómez +Cracked Pumice Brick Wall=Muro de Ladrillos de Piedra Pómez Agrietados + +Pyrite Wall=Muro de Pirita +Pyrite Brick Wall=Muro de Ladrillos de Pirita +Pyrite Block Wall=Muro de Bloques de Pirita +Cracked Pyrite Brick Wall=Muro de Ladrillos de Pirita Agrietados + +Quartz Wall=Muro de Cuarzo +Quartz Brick Wall=Muro de Ladrillos de Cuarzo +Quartz Block Wall=Muro de Bloques de Cuarzo +Cracked Quartz Brick Wall=Muro de Ladrillos de Cuarzo Agrietados + +Rhodonite Wall=Pared de Rodonita +Rhodonite Brick Wall=Pared de Ladrillo de Rodonita +Rhodonite Block Wall=Pared de Bloque de Rodonita +Cracked Rhodonite Brick Wall=Pared de Ladrillo de Rodonita Agrietado +Cobbled Rhodonite Wall=Pared de Rodonita Guijarreada + +Rose Quartz Wall=Muro de Cuarzo Rosa +Rose Quartz Brick Wall=Muro de Ladrillos de Cuarzo Rosa +Rose Quartz Block Wall=Muro de Bloques de Cuarzo Rosa +Cracked Rose Quartz Brick Wall=Muro de Ladrillos de Cuarzo Rosa Agrietados + +Scoria Wall=Muro de Escoria +Scoria Brick Wall=Muro de Ladrillos de Escoria +Scoria Block Wall=Muro de Bloques de Escoria +Cracked Scoria Brick Wall=Muro de Ladrillos de Escoria Agrietados +Cobbled Scoria Wall=Muro de Escoria Adoquinado + +Serpentine Wall=Muro de Serpentina +Cobbled Serpentine Wall=Muro de Serpentina Adoquinado +Serpentine Brick Wall=Muro de Ladrillos de Serpentina +Serpentine Block Wall=Muro de Bloques de Serpentina +Cracked Serpentine Brick Wall=Muro de Ladrillos de Serpentina Agrietados + +Shale Wall=Muro de Pizarra +Shale Brick Wall=Muro de Ladrillos de Pizarra +Shale Block Wall=Muro de Bloques de Pizarra +Cracked Shale Brick Wall=Muro de Ladrillos de Pizarra Agrietados +Cobbled Shale Wall=Muro de Pizarra Adoquinado + +Slate Wall=Muro de Pizarra +Slate Brick Wall=Muro de Ladrillos de Pizarra +Slate Block Wall=Muro de Bloques de Pizarra +Cracked Slate Brick Wall=Muro de Ladrillos de Pizarra Agrietados +Cobbled Slate Wall=Muro de Pizarra Adoquinado +Slate Tile Wall=Muro de Baldosas de Pizarra + +Smokey Quartz Wall=Muro de Cuarzo Ahumado +Smokey Quartz Brick Wall=Muro de Ladrillos de Cuarzo Ahumado +Smokey Quartz Block Wall=Muro de Bloques de Cuarzo Ahumado +Cracked Smokey Quartz Brick Wall=Muro de Ladrillos de Cuarzo Ahumado Agrietados + +Soapstone Wall=Muro de Esteatita +Soapstone Brick Wall=Muro de Ladrillos de Esteatita +Soapstone Block Wall=Muro de Bloques de Esteatita +Cracked Soapstone Brick Wall=Muro de Ladrillos de Esteatita Agrietados + +Sodalite Wall=Muro de Sodalita +Cobbled Sodalite Wall=Muro de Sodalita Adoquinado +Sodalite Brick Wall=Muro de Ladrillos de Sodalita +Sodalite Block Wall=Muro de Bloques de Sodalita +Cracked Sodalite Brick Wall=Muro de Ladrillos de Sodalita Agrietados + +Sugilite Wall=Muro de Sugilita +Sugilite Brick Wall=Muro de Ladrillos de Sugilita +Sugilite Block Wall=Muro de Bloques de Sugilita +Cracked Sugilite Brick Wall=Muro de Ladrillos de Sugilita Agrietados +Cobbled Sugilite Wall=Muro de Sugilita Adoquinado + +Green Tourmaline Wall=Pared de Turmalina Verde +Green Tourmaline Brick Wall=Pared de Ladrillo de Turmalina Verde +Green Tourmaline Block Wall=Pared de Bloque de Turmalina Verde +Cracked Green Tourmaline Brick Wall=Pared de Ladrillo de Turmalina Verde Agrietado + +Paraiba Tourmaline Wall=Pared de Turmalina Paraíba +Paraiba Tourmaline Brick Wall=Pared de Ladrillo de Turmalina Paraíba +Paraiba Tourmaline Block Wall=Pared de Bloque de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick Wall=Pared de Ladrillo de Turmalina Paraíba Agrietado + +Pink Tourmaline Wall=Pared de Turmalina Rosa +Pink Tourmaline Brick Wall=Pared de Ladrillo de Turmalina Rosa +Pink Tourmaline Block Wall=Pared de Bloque de Turmalina Rosa +Cracked Pink Tourmaline Brick Wall=Pared de Ladrillo de Turmalina Rosa Agrietado + +Travertine Wall=Muro de Travertino +Cobbled Travertine Wall=Muro de Travertino Adoquinado +Travertine Brick Wall=Muro de Ladrillos de Travertino +Travertine Block Wall=Muro de Bloques de Travertino +Cracked Travertine Brick Wall=Muro de Ladrillos de Travertino Agrietados + +Yellow Travertine Wall=Muro de Travertino Amarillo +Cobbled Yellow Travertine Wall=Muro de Travertino Amarillo Adoquinado +Yellow Travertine Brick Wall=Muro de Ladrillos de Travertino Amarillo +Yellow Travertine Block Wall=Muro de Bloques de Travertino Amarillo +Cracked Yellow Travertine Brick Wall=Muro de Ladrillos de Travertino Amarillo Agrietados + +Beige Tuff Wall=Muro de Toba Beige +Cobbled Beige Tuff Wall=Muro de Toba Beige Adoquinado +Beige Tuff Block Wall=Muro de Bloques de Toba Beige +Beige Tuff Brick Wall=Muro de Ladrillos de Toba Beige +Cracked Beige Tuff Brick Wall=Muro de Ladrillos de Toba Beige Agrietados + +Grey Tuff Wall=Muro de Toba Gris +Cobbled Grey Tuff Wall=Muro de Toba Gris Adoquinado +Grey Tuff Block Wall=Muro de Bloques de Toba Gris +Grey Tuff Brick Wall=Muro de Ladrillos de Toba Gris +Cracked Grey Tuff Brick Wall=Muro de Ladrillos de Toba Gris Agrietados + +Red Tuff Wall=Muro de Toba Roja +Cobbled Red Tuff Wall=Muro de Toba Roja Adoquinado +Red Tuff Block Wall=Muro de Bloques de Toba Roja +Red Tuff Brick Wall=Muro de Ladrillos de Toba Roja +Cracked Red Tuff Brick Wall=Muro de Ladrillos de Toba Roja Agrietados + +Turquoise Wall=Muro de Turquesa +Turquoise Brick Wall=Muro de Ladrillos de Turquesa +Turquoise Block Wall=Muro de Bloques de Turquesa +Cracked Turquoise Brick Wall=Muro de Ladrillos de Turquesa Agrietados +Cobbled Turquoise Wall=Muro de Turquesa Adoquinado + +Vivianite Wall=Muro de Vivianita +Vivianite Brick Wall=Muro de Ladrillos de Vivianita +Vivianite Block Wall=Muro de Bloques de Vivianita +Cracked Vivianite Brick Wall=Muro de Ladrillos de Vivianita Agrietados + +### stairs.lua ### + +Blue Agate Slab=Losa de Ãgata Azul +Gray Agate Slab=Losa de Ãgata Gris +Green Agate Slab=Losa de Ãgata Verde +Moss Agate Slab=Losa de Ãgata Musgo +Orange Agate Slab=Losa de Ãgata Naranja +Purple Agate Slab=Losa de Ãgata Morada +Red Agate Slab=Losa de Ãgata Roja + +Amazonite Slab=Losa de Amazonita +Cobbled Amazonite Slab=Losa de Amazonita Adoquinada +Amazonite Brick Slab=Losa de Ladrillos de Amazonita +Amazonite Block Slab=Losa de Bloques de Amazonita +Cracked Amazonite Brick Slab=Losa de Ladrillos de Amazonita Agrietados + +Amber Slab=Losa de Ãmbar +Amber Brick Slab=Losa de Ladrillos de Ãmbar +Amber Block Slab=Losa de Bloques de Ãmbar +Cracked Amber Brick Slab=Losa de Ladrillos de Ãmbar Agrietados + +Amethyst Slab=Losa de Amatista +Amethyst Brick Slab=Losa de Ladrillos de Amatista +Amethyst Block Slab=Losa de Bloques de Amatista +Cracked Amethyst Brick Slab=Losa de Ladrillos de Amatista Agrietados + +Andesite Slab=Losa de Andesita +Andesite Block Slab=Losa de Bloques de Andesita +Cobbled Andesite Slab=Losa de Andesita Adoquinada +Andesite Brick Slab=Losa de Ladrillos de Andesita +Cobbled Andesite Brick Slab=Losa de Ladrillos de Andesita Adoquinada + +Basalt Slab=Losa de Basalto +Basalt Block Slab=Losa de Bloques de Basalto +Basalt Brick Slab=Losa de Ladrillos de Basalto +Cracked Basalt Brick Slab=Losa de Ladrillos de Basalto Agrietados +Cobbled Basalt Slab=Losa de Basalto Adoquinado +Basalt Tile Slab=Losa de Azulejos de Basalto + +Black Moonstone Slab=Losa de Piedra Lunar Negra +Black Moonstone Brick Slab=Losa de Ladrillos de Piedra Lunar Negra +Black Moonstone Block Slab=Losa de Bloques de Piedra Lunar Negra +Cracked Black Moonstone Brick Slab=Losa de Ladrillos de Piedra Lunar Negra Agrietados + +Grey Calcite Slab=Loseta de Calcita Gris +Grey Calcite Brick Slab=Loseta de Ladrillo de Calcita Gris +Grey Calcite Block Slab=Loseta de Bloque de Calcita Gris +Cracked Grey Calcite Brick Slab=Loseta de Ladrillo de Calcita Gris Agrietado + +Calcite Slab=Losa de Calcita +Calcite Brick Slab=Losa de Ladrillos de Calcita +Calcite Block Slab=Losa de Bloques de Calcita +Cracked Calcite Brick Slab=Losa de Ladrillos de Calcita Agrietados + +Orange Calcite Slab=Loseta de Calcita Naranja +Orange Calcite Brick Slab=Loseta de Ladrillo de Calcita Naranja +Orange Calcite Block Slab=Loseta de Bloque de Calcita Naranja +Cracked Orange Calcite Brick Slab=Loseta de Ladrillo de Calcita Naranja Agrietado + +Carnotite Slab=Losa de Carnotita +Carnotite Brick Slab=Losa de Ladrillos de Carnotita +Carnotite Block Slab=Losa de Bloques de Carnotita +Cracked Carnotite Brick Slab=Losa de Ladrillos de Carnotita Agrietados +Cobbled Carnotite Slab=Losa de Carnotita Adoquinada + +Celestine Slab=Losa de Celestita +Celestine Brick Slab=Losa de Ladrillos de Celestita +Celestine Block Slab=Losa de Bloques de Celestita +Cracked Celestine Brick Slab=Losa de Ladrillos de Celestita Agrietados + +Chalcanthite Slab=Loseta de Calcanthita +Chalcanthite Brick Slab=Loseta de Ladrillo de Calcanthita +Chalcanthite Block Slab=Loseta de Bloque de Calcanthita +Cracked Chalcanthite Brick Slab=Loseta de Ladrillo de Calcanthita Agrietado +Cobbled Chalcanthite Slab=Loseta de Calcanthita Guijarreada + +Chrysoprase Slab=Losa de Crisoprasa +Chrysoprase Brick Slab=Losa de Ladrillos de Crisoprasa +Chrysoprase Block Slab=Losa de Bloques de Crisoprasa +Cracked Chrysoprase Brick Slab=Losa de Ladrillos de Crisoprasa Agrietados + +Citrine Slab=Losa de Citrino +Citrine Brick Slab=Losa de Ladrillos de Citrino +Citrine Block Slab=Losa de Bloques de Citrino +Cracked Citrine Brick Slab=Losa de Ladrillos de Citrino Agrietados + +Covellite Slab=Losa de Covellita +Covellite Brick Slab=Losa de Ladrillos de Covellita +Covellite Block Slab=Losa de Bloques de Covellita +Cracked Covellite Brick Slab=Losa de Ladrillos de Covellita Agrietados +Cobbled Covellite Slab=Losa de Covellita Adoquinada + +Crocoite Slab=Losa de Crocoita +Crocoite Brick Slab=Losa de Ladrillos de Crocoita +Crocoite Block Slab=Losa de Bloques de Crocoita +Cracked Crocoite Brick Slab=Losa de Ladrillos de Crocoita Agrietados + +Diorite Slab=Losa de Diorita +Diorite Brick Slab=Losa de Ladrillos de Diorita +Diorite Block Slab=Losa de Bloques de Diorita +Cracked Diorite Brick Slab=Losa de Ladrillos de Diorita Agrietados +Cobbled Diorite Slab=Losa de Diorita Adoquinada + +Erythrite Slab=Losa de Eritrita +Erythrite Brick Slab=Losa de Ladrillos de Eritrita +Erythrite Block Slab=Losa de Bloques de Eritrita +Cracked Erythrite Brick Slab=Losa de Ladrillos de Eritrita Agrietados + +Eudialite Slab=Losa de Eudialita +Eudialite Brick Slab=Losa de Ladrillos de Eudialita +Eudialite Block Slab=Losa de Bloques de Eudialita +Cracked Eudialite Brick Slab=Losa de Ladrillos de Eudialita Agrietados + +Fluorite Slab=Losa de Fluorita +Fluorite Brick Slab=Losa de Ladrillos de Fluorita +Fluorite Block Slab=Losa de Bloques de Fluorita +Cracked Fluorite Brick Slab=Losa de Ladrillos de Fluorita Agrietados + +Gabbro Slab=Losa de Gabro +Cobbled Gabbro Slab=Losa de Gabro Adoquinada +Gabbro Brick Slab=Losa de Ladrillos de Gabro +Gabbro Block Slab=Losa de Bloques de Gabro +Cracked Gabbro Brick Slab=Losa de Ladrillos de Gabro Agrietados + +Galena Slab=Losa de Galena +Galena Brick Slab=Losa de Ladrillos de Galena +Galena Block Slab=Losa de Bloques de Galena +Cracked Galena Brick Slab=Losa de Ladrillos de Galena Agrietados + +Black Granite Slab=Losa de Granito Negro +Black Granite Brick Slab=Losa de Ladrillos de Granito Negro +Black Granite Block Slab=Losa de Bloques de Granito Negro +Cracked Black Granite Brick Slab=Losa de Ladrillos de Granito Negro Agrietados +Cobbled Black Granite Slab=Losa de Granito Negro Adoquinada + +Blue Granite Slab=Losa de Granito Azul +Blue Granite Brick Slab=Losa de Ladrillos de Granito Azul +Blue Granite Block Slab=Losa de Bloques de Granito Azul +Cracked Blue Granite Brick Slab=Losa de Ladrillos de Granito Azul Agrietados +Cobbled Blue Granite Slab=Losa de Granito Azul Adoquinada + +Gray Granite Slab=Losa de Granito Gris +Gray Granite Brick Slab=Losa de Ladrillos de Granito Gris +Gray Granite Block Slab=Losa de Bloques de Granito Gris +Cracked Gray Granite Brick Slab=Losa de Ladrillos de Granito Gris Agrietados +Cobbled Gray Granite Slab=Losa de Granito Gris Adoquinada + +Green Granite Slab=Losa de Granito Verde +Green Granite Brick Slab=Losa de Ladrillos de Granito Verde +Green Granite Block Slab=Losa de Bloques de Granito Verde +Cracked Green Granite Brick Slab=Losa de Ladrillos de Granito Verde Agrietados +Cobbled Green Granite Slab=Losa de Granito Verde Adoquinada + +Pink Granite Slab=Losa de Granito Rosa +Pink Granite Brick Slab=Losa de Ladrillos de Granito Rosa +Pink Granite Block Slab=Losa de Bloques de Granito Rosa +Cracked Pink Granite Brick Slab=Losa de Ladrillos de Granito Rosa Agrietados +Cobbled Pink Granite Slab=Losa de Granito Rosa Adoquinada + +Red Granite Slab=Losa de Granito Rojo +Red Granite Brick Slab=Losa de Ladrillos de Granito Rojo +Red Granite Block Slab=Losa de Bloques de Granito Rojo +Cracked Red Granite Brick Slab=Losa de Ladrillos de Granito Rojo Agrietados +Cobbled Red Granite Slab=Losa de Granito Rojo Adoquinada + +White Granite Slab=Losa de Granito Blanco +White Granite Brick Slab=Losa de Ladrillos de Granito Blanco +White Granite Block Slab=Losa de Bloques de Granito Blanco +Cracked White Granite Brick Slab=Losa de Ladrillos de Granito Blanco Agrietados +Cobbled White Granite Slab=Losa de Granito Blanco Adoquinada + +Yellow Granite Slab=Losa de Granito Amarillo +Yellow Granite Brick Slab=Losa de Ladrillos de Granito Amarillo +Yellow Granite Block Slab=Losa de Bloques de Granito Amarillo +Cracked Yellow Granite Brick Slab=Losa de Ladrillos de Granito Amarillo Agrietados +Cobbled Yellow Granite Slab=Losa de Granito Amarillo Adoquinada + +Heliodor Slab=Losa de Heliodoro +Heliodor Brick Slab=Losa de Ladrillos de Heliodoro +Heliodor Block Slab=Losa de Bloques de Heliodoro +Cracked Heliodor Brick Slab=Losa de Ladrillos de Heliodoro Agrietados + +Howlite Slab=Losa de Howlite +Howlite Brick Slab=Losa de Ladrillos de Howlite +Howlite Block Slab=Losa de Bloques de Howlite +Cracked Howlite Brick Slab=Losa de Ladrillos de Howlite Agrietados +Cobbled Howlite Slab=Losa de Howlite Guiada + +Ilvaite Slab=Losa de Ilvaite +Ilvaite Brick Slab=Losa de Ladrillos de Ilvaite +Ilvaite Block Slab=Losa de Bloques de Ilvaite +Cracked Ilvaite Brick Slab=Losa de Ladrillos de Ilvaite Agrietados +Cobbled Ilvaite Slab=Losa de Ilvaite Guiada + +Jade Slab=Losa de Jade +Jade Brick Slab=Losa de Ladrillos de Jade +Jade Block Slab=Losa de Bloques de Jade +Cracked Jade Brick Slab=Losa de Ladrillos de Jade Agrietados +Cobbled Jade Slab=Losa de Jade Guiada + +Red Jasper Slab=Loseta de Jaspe Rojo +Red Jasper Brick Slab=Loseta de Ladrillo de Jaspe Rojo +Red Jasper Block Slab=Loseta de Bloque de Jaspe Rojo +Cracked Red Jasper Brick Slab=Loseta de Ladrillo de Jaspe Rojo Agrietado +Cobbled Red Jasper Slab=Loseta de Jaspe Rojo Guijarreado + +Kyanite Slab=Losa de Kyanite +Kyanite Brick Slab=Losa de Ladrillos de Kyanite +Kyanite Block Slab=Losa de Bloques de Kyanite +Cracked Kyanite Brick Slab=Losa de Ladrillos de Kyanite Agrietados +Cobbled Kyanite Slab=Losa de Kyanite Guiada + +Lapis Lazuli Slab=Losa de Lapislázuli +Lapis Lazuli Brick Slab=Losa de Ladrillos de Lapislázuli +Lapis Lazuli Block Slab=Losa de Bloques de Lapislázuli +Cracked Lapis Lazuli Brick Slab=Losa de Ladrillos de Lapislázuli Agrietados + +Lepidolite Slab=Loseta de Lepidolita +Lepidolite Brick Slab=Loseta de Ladrillo de Lepidolita +Lepidolite Block Slab=Loseta de Bloque de Lepidolita +Cracked Lepidolite Brick Slab=Loseta de Ladrillo de Lepidolita Agrietado +Cobbled Lepidolite Slab=Loseta de Lepidolita Guijarreada + +Blue Limestone Slab=Losa de Piedra Caliza Azul +Blue Limestone Brick Slab=Losa de Ladrillos de Piedra Caliza Azul +Blue Limestone Block Slab=Losa de Bloques de Piedra Caliza Azul +Cracked Blue Limestone Brick Slab=Losa de Ladrillos de Piedra Caliza Azul Agrietados +Cobbled Blue Limestone Slab=Losa de Piedra Caliza Azul Guiada + +White Limestone Slab=Losa de Piedra Caliza Blanca +White Limestone Brick Slab=Losa de Ladrillos de Piedra Caliza Blanca +White Limestone Block Slab=Losa de Bloques de Piedra Caliza Blanca +Cracked White Limestone Brick Slab=Losa de Ladrillos de Piedra Caliza Blanca Agrietados +Cobbled White Limestone Slab=Losa de Piedra Caliza Blanca Guiada + +Marble Slab=Losa de Mármol +Marble Brick Slab=Losa de Ladrillos de Mármol +Marble Block Slab=Losa de Bloques de Mármol +Cracked Marble Brick Slab=Losa de Ladrillos de Mármol Agrietados +Cobbled Marble Slab=Losa de Mármol Guiada + +Moonstone Slab=Loseta de Piedra Lunar +Moonstone Brick Slab=Loseta de Ladrillo de Piedra Lunar +Moonstone Block Slab=Loseta de Bloque de Piedra Lunar +Cracked Moonstone Brick Slab=Loseta de Ladrillo de Piedra Lunar Agrietado + +Morion Quartz Slab=Losa de Cuarzo Morión +Morion Quartz Brick Slab=Losa de Ladrillos de Cuarzo Morión +Morion Quartz Block Slab=Losa de Bloques de Cuarzo Morión +Cracked Morion Quartz Brick Slab=Losa de Ladrillos de Cuarzo Morión Agrietados + +Mudstone Slab=Losa de Piedra Fango +Cobbled Mudstone Slab=Losa de Piedra Fango Guiada +Mudstone Brick Slab=Losa de Ladrillos de Piedra Fango +Mudstone Block Slab=Losa de Bloques de Piedra Fango +Cracked Mudstone Brick Slab=Losa de Ladrillos de Piedra Fango Agrietados + +Prasiolite Slab=Losa de Prasiolita +Cobbled Prasiolite Slab=Losa de Prasiolita Guiada +Prasiolite Brick Slab=Losa de Ladrillos de Prasiolita +Prasiolite Block Slab=Losa de Bloques de Prasiolita +Cracked Prasiolite Brick Slab=Losa de Ladrillos de Prasiolita Agrietados + +Pumice Slab=Losa de Piedra Pómez +Pumice Brick Slab=Losa de Ladrillos de Piedra Pómez +Pumice Block Slab=Losa de Bloques de Piedra Pómez +Cracked Pumice Brick Slab=Losa de Ladrillos de Piedra Pómez Agrietados + +Pyrite Slab=Losa de Pirita +Pyrite Brick Slab=Losa de Ladrillos de Pirita +Pyrite Block Slab=Losa de Bloques de Pirita +Cracked Pyrite Brick Slab=Losa de Ladrillos de Pirita Agrietados + +Quartz Slab=Losa de Cuarzo +Cobbled Quartz Slab=Losa de Cuarzo Guiada +Quartz Brick Slab=Losa de Ladrillos de Cuarzo +Quartz Block Slab=Losa de Bloques de Cuarzo +Cracked Quartz Brick Slab=Losa de Ladrillos de Cuarzo Agrietados + +Rhodonite Slab=Loseta de Rodonita +Rhodonite Brick Slab=Loseta de Ladrillo de Rodonita +Rhodonite Block Slab=Loseta de Bloque de Rodonita +Cracked Rhodonite Brick Slab=Loseta de Ladrillo de Rodonita Agrietado +Cobbled Rhodonite Slab=Loseta de Rodonita Guijarreada + +Rose Quartz Slab=Losa de Cuarzo Rosa +Rose Quartz Brick Slab=Losa de Ladrillos de Cuarzo Rosa +Rose Quartz Block Slab=Losa de Bloques de Cuarzo Rosa +Cracked Rose Quartz Brick Slab=Losa de Ladrillos de Cuarzo Rosa Agrietados + +Scoria Slab=Losa de Escoria +Scoria Brick Slab=Losa de Ladrillos de Escoria +Scoria Block Slab=Losa de Bloques de Escoria +Cracked Scoria Brick Slab=Losa de Ladrillos de Escoria Agrietados +Cobbled Scoria Slab=Losa de Escoria Guiada + +Serpentine Slab=Losa de Serpentinita +Cobbled Serpentine Slab=Losa de Serpentinita Guiada +Serpentine Brick Slab=Losa de Ladrillos de Serpentinita +Serpentine Block Slab=Losa de Bloques de Serpentinita +Cracked Serpentine Brick Slab=Losa de Ladrillos de Serpentinita Agrietados + +Shale Slab=Losa de Esquisto +Shale Brick Slab=Losa de Ladrillos de Esquisto +Shale Block Slab=Losa de Bloques de Esquisto +Cracked Shale Brick Slab=Losa de Ladrillos de Esquisto Agrietados +Cobbled Shale Slab=Losa de Esquisto Guiada + +Slate Slab=Losa de Pizarra +Slate Brick Slab=Losa de Ladrillos de Pizarra +Slate Block Slab=Losa de Bloques de Pizarra +Cracked Slate Brick Slab=Losa de Ladrillos de Pizarra Agrietados +Cobbled Slate Slab=Losa de Pizarra Guiada +Slate Tile Slab=Losa de Azulejo de Pizarra + +Smokey Quartz Slab=Losa de Cuarzo Ahumado +Smokey Quartz Brick Slab=Losa de Ladrillos de Cuarzo Ahumado +Smokey Quartz Block Slab=Losa de Bloques de Cuarzo Ahumado +Cracked Smokey Quartz Brick Slab=Losa de Ladrillos de Cuarzo Ahumado Agrietados + +Soapstone Slab=Losa de Esteatita +Soapstone Brick Slab=Losa de Ladrillos de Esteatita +Soapstone Block Slab=Losa de Bloques de Esteatita +Cracked Soapstone Brick Slab=Losa de Ladrillos de Esteatita Agrietados + +Sodalite Slab=Losa de Sodalita +Cobbled Sodalite Slab=Losa de Sodalita Guiada +Sodalite Brick Slab=Losa de Ladrillos de Sodalita +Sodalite Block Slab=Losa de Bloques de Sodalita +Cracked Sodalite Brick Slab=Losa de Ladrillos de Sodalita Agrietados + +Sugilite Slab=Losa de Sugilita +Sugilite Brick Slab=Losa de Ladrillos de Sugilita +Sugilite Block Slab=Losa de Bloques de Sugilita +Cracked Sugilite Brick Slab=Losa de Ladrillos de Sugilita Agrietados +Cobbled Sugilite Slab=Losa de Sugilita Guiada + +Green Tourmaline Slab=Loseta de Turmalina Verde +Green Tourmaline Brick Slab=Loseta de Ladrillo de Turmalina Verde +Green Tourmaline Block Slab=Loseta de Bloque de Turmalina Verde +Cracked Green Tourmaline Brick Slab=Loseta de Ladrillo de Turmalina Verde Agrietado + +Paraiba Tourmaline Slab=Loseta de Turmalina Paraíba +Paraiba Tourmaline Brick Slab=Loseta de Ladrillo de Turmalina Paraíba +Paraiba Tourmaline Block Slab=Loseta de Bloque de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick Slab=Loseta de Ladrillo de Turmalina Paraíba Agrietado + +Pink Tourmaline Slab=Loseta de Turmalina Rosa +Pink Tourmaline Brick Slab=Loseta de Ladrillo de Turmalina Rosa +Pink Tourmaline Block Slab=Loseta de Bloque de Turmalina Rosa +Cracked Pink Tourmaline Brick Slab=Loseta de Ladrillo de Turmalina Rosa Agrietado + +Travertine Slab=Losa de Travertino +Cobbled Travertine Slab=Losa de Travertino Guiada +Travertine Brick Slab=Losa de Ladrillos de Travertino +Travertine Block Slab=Losa de Bloques de Travertino +Cracked Travertine Brick Slab=Losa de Ladrillos de Travertino Agrietados + +Yellow Travertine Slab=Losa de Travertino Amarillo +Cobbled Yellow Travertine Slab=Losa de Travertino Amarillo Guiada +Yellow Travertine Brick Slab=Losa de Ladrillos de Travertino Amarillo +Yellow Travertine Block Slab=Losa de Bloques de Travertino Amarillo +Cracked Yellow Travertine Brick Slab=Losa de Ladrillos de Travertino Amarillo Agrietados + +Beige Tuff Slab=Losa de Toba Beige +Cobbled Beige Tuff Slab=Losa de Toba Beige Guiada +Beige Tuff Block Slab=Losa de Bloques de Toba Beige +Beige Tuff Brick Slab=Losa de Ladrillos de Toba Beige +Cracked Beige Tuff Brick Slab=Losa de Ladrillos de Toba Beige Agrietados + +Grey Tuff Slab=Losa de Toba Gris +Cobbled Grey Tuff Slab=Losa de Toba Gris Guiada +Grey Tuff Block Slab=Losa de Bloques de Toba Gris +Grey Tuff Brick Slab=Losa de Ladrillos de Toba Gris +Cracked Grey Tuff Brick Slab=Losa de Ladrillos de Toba Gris Agrietados + +Red Tuff Slab=Losa de Toba Roja +Cobbled Red Tuff Slab=Losa de Toba Roja Guiada +Red Tuff Block Slab=Losa de Bloques de Toba Roja +Red Tuff Brick Slab=Losa de Ladrillos de Toba Roja +Cracked Red Tuff Brick Slab=Losa de Ladrillos de Toba Roja Agrietados + +Turquoise Slab=Losa de Turquesa +Turquoise Brick Slab=Losa de Ladrillos de Turquesa +Turquoise Block Slab=Losa de Bloques de Turquesa +Cracked Turquoise Brick Slab=Losa de Ladrillos de Turquesa Agrietados +Cobbled Turquoise Slab=Losa de Turquesa Guiada + +Vivianite Slab=Losa de Vivianita +Cobbled Vivianite Slab=Losa de Vivianita Guiada +Vivianite Brick Slab=Losa de Ladrillos de Vivianita +Vivianite Block Slab=Losa de Bloques de Vivianita +Cracked Vivianite Brick Slab=Losa de Ladrillos de Vivianita Agrietados + + + +Blue Agate Stair=Escalera de Ãgata Azul +Gray Agate Stair=Escalera de Ãgata Gris +Green Agate Stair=Escalera de Ãgata Verde +Moss Agate Stair=Escalera de Ãgata Musgosa +Orange Agate Stair=Escalera de Ãgata Naranja +Purple Agate Stair=Escalera de Ãgata Morada +Red Agate Stair=Escalera de Ãgata Roja + +Amazonite Stair=Escalera de Amazonita +Cobbled Amazonite Stair=Escalera de Amazonita Guiada +Amazonite Brick Stair=Escalera de Ladrillos de Amazonita +Amazonite Block Stair=Escalera de Bloques de Amazonita +Cracked Amazonite Brick Stair=Escalera de Ladrillos de Amazonita Agrietados + +Amber Stair=Escalera de Ãmbar +Amber Brick Stair=Escalera de Ladrillos de Ãmbar +Amber Block Stair=Escalera de Bloques de Ãmbar +Cracked Amber Brick Stair=Escalera de Ladrillos de Ãmbar Agrietados + +Amethyst Stair=Escalera de Amatista +Amethyst Brick Stair=Escalera de Ladrillos de Amatista +Amethyst Block Stair=Escalera de Bloques de Amatista +Cracked Amethyst Brick Stair=Escalera de Ladrillos de Amatista Agrietados + +Andesite Stair=Escalera de Andesita +Andesite Block Stair=Escalera de Bloques de Andesita +Cobbled Andesite Stair=Escalera de Andesita Guiada +Andesite Brick Stair=Escalera de Ladrillos de Andesita +Cobbled Andesite Brick Stair=Escalera de Ladrillos de Andesita Guiada + +Basalt Stair=Escalera de Basalto +Basalt Block Stair=Escalera de Bloques de Basalto +Basalt Brick Stair=Escalera de Ladrillos de Basalto +Cracked Basalt Brick Stair=Escalera de Ladrillos de Basalto Agrietados +Cobbled Basalt Stair=Escalera de Basalto Guiada +Basalt Tile Stairs =Escalera de Tejas de Basalto + +Black Moonstone Stair=Escalera de Piedra Lunar Negra +Black Moonstone Brick Stair=Escalera de Ladrillos de Piedra Lunar Negra +Black Moonstone Block Stair=Escalera de Bloques de Piedra Lunar Negra +Cracked Black Moonstone Brick Stair=Escalera de Ladrillos de Piedra Lunar Negra Agrietados + +Grey Calcite Stair=Escalera de Calcita Gris +Grey Calcite Brick Stair=Escalera de Ladrillo de Calcita Gris +Grey Calcite Block Stair=Escalera de Bloque de Calcita Gris +Cracked Grey Calcite Brick Stair=Escalera de Ladrillo de Calcita Gris Agrietado + +Calcite Stair=Escalera de Calcita +Calcite Brick Stair=Escalera de Ladrillos de Calcita +Calcite Block Stair=Escalera de Bloques de Calcita +Cracked Calcite Brick Stair=Escalera de Ladrillos de Calcita Agrietados + +Orange Calcite Stair=Escalera de Calcita Naranja +Orange Calcite Brick Stair=Escalera de Ladrillo de Calcita Naranja +Orange Calcite Block Stair=Escalera de Bloque de Calcita Naranja +Cracked Orange Calcite Brick Stair=Escalera de Ladrillo de Calcita Naranja Agrietado + +Carnotite Stair=Escalera de Carnotita +Carnotite Brick Stair=Escalera de Ladrillos de Carnotita +Carnotite Block Stair=Escalera de Bloques de Carnotita +Cracked Carnotite Brick Stair=Escalera de Ladrillos de Carnotita Agrietados +Cobbled Carnotite Stair=Escalera de Carnotita Guiada + +Celestine Stair=Escalera de Celestina +Celestine Brick Stair=Escalera de Ladrillos de Celestina +Celestine Block Stair=Escalera de Bloques de Celestina +Cracked Celestine Brick Stair=Escalera de Ladrillos de Celestina Agrietados + +Chalcanthite Stair=Escalera de Calcanthita +Chalcanthite Brick Stair=Escalera de Ladrillo de Calcanthita +Chalcanthite Block Stair=Escalera de Bloque de Calcanthita +Cracked Chalcanthite Brick Stair=Escalera de Ladrillo de Calcanthita Agrietado +Cobbled Chalcanthite Stair=Escalera de Calcanthita Guijarreada + +Chrysoprase Stair=Escalera de Crisoprasa +Chrysoprase Brick Stair=Escalera de Ladrillos de Crisoprasa +Chrysoprase Block Stair=Escalera de Bloques de Crisoprasa +Cracked Chrysoprase Brick Stair=Escalera de Ladrillos de Crisoprasa Agrietados + +Citrine Stair=Escalera de Citrino +Citrine Brick Stair=Escalera de Ladrillos de Citrino +Citrine Block Stair=Escalera de Bloques de Citrino +Cracked Citrine Brick Stair=Escalera de Ladrillos de Citrino Agrietados + +Covellite Stair=Escalera de Covellita +Covellite Brick Stair=Escalera de Ladrillos de Covellita +Covellite Block Stair=Escalera de Bloques de Covellita +Cracked Covellite Brick Stair=Escalera de Ladrillos de Covellita Agrietados +Cobbled Covellite Stair=Escalera de Covellita Guiada + +Crocoite Stair=Escalera de Crocoita +Crocoite Brick Stair=Escalera de Ladrillos de Crocoita +Crocoite Block Stair=Escalera de Bloques de Crocoita +Cracked Crocoite Brick Stair=Escalera de Ladrillos de Crocoita Agrietados + +Diorite Stair=Escalera de Diorita +Diorite Brick Stair=Escalera de Ladrillos de Diorita +Diorite Block Stair=Escalera de Bloques de Diorita +Cracked Diorite Brick Stair=Escalera de Ladrillos de Diorita Agrietados +Cobbled Diorite Stair=Escalera de Diorita Guiada + +Erythrite Stair=Escalera de Eritrita +Erythrite Brick Stair=Escalera de Ladrillos de Eritrita +Erythrite Block Stair=Escalera de Bloques de Eritrita +Cracked Erythrite Brick Stair=Escalera de Ladrillos de Eritrita Agrietados + +Eudialite Stair=Escalera de Eudialita +Eudialite Brick Stair=Escalera de Ladrillos de Eudialita +Eudialite Block Stair=Escalera de Bloques de Eudialita +Cracked Eudialite Brick Stair=Escalera de Ladrillos de Eudialita Agrietados + +Fluorite Stair=Escalera de Fluorita +Fluorite Brick Stair=Escalera de Ladrillos de Fluorita +Fluorite Block Stair=Escalera de Bloques de Fluorita +Cracked Fluorite Brick Stair=Escalera de Ladrillos de Fluorita Agrietados + +Gabbro Stair=Escalera de Gabro +Cobbled Gabbro Stair=Escalera de Gabro Guiada +Gabbro Brick Stair=Escalera de Ladrillos de Gabro +Gabbro Block Stair=Escalera de Bloques de Gabro +Cracked Gabbro Brick Stair=Escalera de Ladrillos de Gabro Agrietados + +Galena Stair=Escalera de Galena +Galena Brick Stair=Escalera de Ladrillos de Galena +Galena Block Stair=Escalera de Bloques de Galena +Cracked Galena Brick Stair=Escalera de Ladrillos de Galena Agrietados + +Black Granite Stair=Escalera de Granito Negro +Black Granite Brick Stair=Escalera de Ladrillos de Granito Negro +Black Granite Block Stair=Escalera de Bloques de Granito Negro +Cracked Black Granite Brick Stair=Escalera de Ladrillos de Granito Negro Agrietados +Cobbled Black Granite Stair=Escalera de Granito Negro Guiada + +Blue Granite Stair=Escalera de Granito Azul +Blue Granite Brick Stair=Escalera de Ladrillos de Granito Azul +Blue Granite Block Stair=Escalera de Bloques de Granito Azul +Cracked Blue Granite Brick Stair=Escalera de Ladrillos de Granito Azul Agrietados +Cobbled Blue Granite Stair=Escalera de Granito Azul Guiada + +Gray Granite Stair=Escalera de Granito Gris +Gray Granite Brick Stair=Escalera de Ladrillos de Granito Gris +Gray Granite Block Stair=Escalera de Bloques de Granito Gris +Cracked Gray Granite Brick Stair=Escalera de Ladrillos de Granito Gris Agrietados +Cobbled Gray Granite Stair=Escalera de Granito Gris Guiada + +Green Granite Stair=Escalera de Granito Verde +Green Granite Brick Stair=Escalera de Ladrillos de Granito Verde +Green Granite Block Stair=Escalera de Bloques de Granito Verde +Cracked Green Granite Brick Stair=Escalera de Ladrillos de Granito Verde Agrietados +Cobbled Green Granite Stair=Escalera de Granito Verde Guiada + +Pink Granite Stair=Escalera de Granito Rosa +Pink Granite Brick Stair=Escalera de Ladrillos de Granito Rosa +Pink Granite Block Stair=Escalera de Bloques de Granito Rosa +Cracked Pink Granite Brick Stair=Escalera de Ladrillos de Granito Rosa Agrietados +Cobbled Pink Granite Stair=Escalera de Granito Rosa Guiada + +Red Granite Stair=Escalera de Granito Rojo +Red Granite Brick Stair=Escalera de Ladrillos de Granito Rojo +Red Granite Block Stair=Escalera de Bloques de Granito Rojo +Cracked Red Granite Brick Stair=Escalera de Ladrillos de Granito Rojo Agrietados +Cobbled Red Granite Stair=Escalera de Granito Rojo Guiada + +White Granite Stair=Escalera de Granito Blanco +White Granite Brick Stair=Escalera de Ladrillos de Granito Blanco +White Granite Block Stair=Escalera de Bloques de Granito Blanco +Cracked White Granite Brick Stair=Escalera de Ladrillos de Granito Blanco Agrietados +Cobbled White Granite Stair=Escalera de Granito Blanco Guiada + +Yellow Granite Stair=Escalera de Granito Amarillo +Yellow Granite Brick Stair=Escalera de Ladrillos de Granito Amarillo +Yellow Granite Block Stair=Escalera de Bloques de Granito Amarillo +Cracked Yellow Granite Brick Stair=Escalera de Ladrillos de Granito Amarillo Agrietados +Cobbled Yellow Granite Stair=Escalera de Granito Amarillo Guiada + +Heliodor Stair=Escalera de Heliodor +Heliodor Brick Stair=Escalera de Ladrillos de Heliodor +Heliodor Block Stair=Escalera de Bloques de Heliodor +Cracked Heliodor Brick Stair=Escalera de Ladrillos de Heliodor Agrietados + +Howlite Stair=Escalera de Howlite +Howlite Brick Stair=Escalera de Ladrillos de Howlite +Howlite Block Stair=Escalera de Bloques de Howlite +Cracked Howlite Brick Stair=Escalera de Ladrillos de Howlite Agrietados +Cobbled Howlite Stair=Escalera de Howlite Guiada + +Ilvaite Stair=Escalera de Ilvaite +Ilvaite Brick Stair=Escalera de Ladrillos de Ilvaite +Ilvaite Block Stair=Escalera de Bloques de Ilvaite +Cracked Ilvaite Brick Stair=Escalera de Ladrillos de Ilvaite Agrietados +Cobbled Ilvaite Stair=Escalera de Ilvaite Guiada + +Jade Stair=Escalera de Jade +Jade Brick Stair=Escalera de Ladrillos de Jade +Jade Block Stair=Escalera de Bloques de Jade +Cracked Jade Brick Stair=Escalera de Ladrillos de Jade Agrietados +Cobbled Jade Stair=Escalera de Jade Guiada + +Red Jasper Stair=Escalera de Jaspe Rojo +Red Jasper Brick Stair=Escalera de Ladrillo de Jaspe Rojo +Red Jasper Block Stair=Escalera de Bloque de Jaspe Rojo +Cracked Red Jasper Brick Stair=Escalera de Ladrillo de Jaspe Rojo Agrietado +Cobbled Red Jasper Stair=Escalera de Jaspe Rojo Guijarreado + +Kyanite Stair=Escalera de Kyanite +Kyanite Brick Stair=Escalera de Ladrillos de Kyanite +Kyanite Block Stair=Escalera de Bloques de Kyanite +Cracked Kyanite Brick Stair=Escalera de Ladrillos de Kyanite Agrietados +Cobbled Kyanite Stair=Escalera de Kyanite Guiada + +Lapis Lazuli Stair=Escalera de Lapislázuli +Lapis Lazuli Brick Stair=Escalera de Ladrillos de Lapislázuli +Lapis Lazuli Block Stair=Escalera de Bloques de Lapislázuli +Cracked Lapis Lazuli Brick Stair=Escalera de Ladrillos de Lapislázuli Agrietados + +Lepidolite Stair=Escalera de Lepidolita +Lepidolite Brick Stair=Escalera de Ladrillo de Lepidolita +Lepidolite Block Stair=Escalera de Bloque de Lepidolita +Cracked Lepidolite Brick Stair=Escalera de Ladrillo de Lepidolita Agrietado +Cobbled Lepidolite Stair=Escalera de Lepidolita Guijarreada + +Blue Limestone Stair=Escalera de Piedra Caliza Azul +Blue Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Azul +Blue Limestone Block Stair=Escalera de Bloques de Piedra Caliza Azul +Cracked Blue Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Azul Agrietados +Cobbled Blue Limestone Stair=Escalera de Piedra Caliza Azul Guiada + +White Limestone Stair=Escalera de Piedra Caliza Blanca +White Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Blanca +White Limestone Block Stair=Escalera de Bloques de Piedra Caliza Blanca +Cracked White Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Blanca Agrietados +Cobbled White Limestone Stair=Escalera de Piedra Caliza Blanca Guiada + +Marble Stair=Escalera de Mármol +Marble Brick Stair=Escalera de Ladrillos de Mármol +Marble Block Stair=Escalera de Bloques de Mármol +Cracked Marble Brick Stair=Escalera de Ladrillos de Mármol Agrietados +Cobbled Marble Stair=Escalera de Mármol Guiada + +Moonstone Stair=Escalera de Piedra Lunar +Moonstone Brick Stair=Escalera de Ladrillo de Piedra Lunar +Moonstone Block Stair=Escalera de Bloque de Piedra Lunar +Cracked Moonstone Brick Stair=Escalera de Ladrillo de Piedra Lunar Agrietado + +Morion Quartz Stair=Escalera de Cuarzo Morion +Morion Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Morion +Morion Quartz Block Stair=Escalera de Bloques de Cuarzo Morion +Cracked Morion Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Morion Agrietados + +Mudstone Stair=Escalera de Piedra Lutita +Cobbled Mudstone Stair=Escalera de Piedra Lutita Guiada +Mudstone Brick Stair=Escalera de Ladrillos de Piedra Lutita +Mudstone Block Stair=Escalera de Bloques de Piedra Lutita +Cracked Mudstone Brick Stair=Escalera de Ladrillos de Piedra Lutita Agrietados + +Prasiolite Stair=Escalera de Prasiolita +Prasiolite Brick Stair=Escalera de Ladrillos de Prasiolita +Prasiolite Block Stair=Escalera de Bloques de Prasiolita +Cracked Prasiolite Brick Stair=Escalera de Ladrillos de Prasiolita Agrietados + +Pumice Stair=Escalera de Pumita +Pumice Brick Stair=Escalera de Ladrillos de Pumita +Pumice Block Stair=Escalera de Bloques de Pumita +Cracked Pumice Brick Stair=Escalera de Ladrillos de Pumita Agrietados + +Pyrite Stair=Escalera de Pirita +Pyrite Brick Stair=Escalera de Ladrillos de Pirita +Pyrite Block Stair=Escalera de Bloques de Pirita +Cracked Pyrite Brick Stair=Escalera de Ladrillos de Pirita Agrietados + +Quartz Stair=Escalera de Cuarzo +Quartz Brick Stair=Escalera de Ladrillos de Cuarzo +Quartz Block Stair=Escalera de Bloques de Cuarzo +Cracked Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Agrietados + +Rhodonite Stair=Escalera de Rodonita +Rhodonite Brick Stair=Escalera de Ladrillo de Rodonita +Rhodonite Block Stair=Escalera de Bloque de Rodonita +Cracked Rhodonite Brick Stair=Escalera de Ladrillo de Rodonita Agrietado +Cobbled Rhodonite Stair=Escalera de Rodonita Guijarreada + +Rose Quartz Stair=Escalera de Cuarzo Rosa +Rose Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Rosa +Rose Quartz Block Stair=Escalera de Bloques de Cuarzo Rosa +Cracked Rose Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Rosa Agrietados + +Scoria Stair=Escalera de Escoria +Scoria Brick Stair=Escalera de Ladrillos de Escoria +Scoria Block Stair=Escalera de Bloques de Escoria +Cracked Scoria Brick Stair=Escalera de Ladrillos de Escoria Agrietados +Cobbled Scoria Stair=Escalera de Escoria Guiada + +Serpentine Stair=Escalera de Serpentina +Cobbled Serpentine Stair=Escalera de Serpentina Guiada +Serpentine Brick Stair=Escalera de Ladrillos de Serpentina +Serpentine Block Stair=Escalera de Bloques de Serpentina +Cracked Serpentine Brick Stair=Escalera de Ladrillos de Serpentina Agrietados + +Shale Stair=Escalera de Pizarra +Shale Brick Stair=Escalera de Ladrillos de Pizarra +Shale Block Stair=Escalera de Bloques de Pizarra +Cracked Shale Brick Stair=Escalera de Ladrillos de Pizarra Agrietados +Cobbled Shale Stair=Escalera de Pizarra Guiada + +Slate Stair=Escalera de Esquisto +Slate Brick Stair=Escalera de Ladrillos de Esquisto +Slate Block Stair=Escalera de Bloques de Esquisto +Cracked Slate Brick Stair=Escalera de Ladrillos de Esquisto Agrietados +Cobbled Slate Stair=Escalera de Esquisto Guiada +Slate Tile Stair=Escalera de Baldosas de Esquisto + +Smokey Quartz Stair=Escalera de Cuarzo Ahumado +Smokey Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Ahumado +Smokey Quartz Block Stair=Escalera de Bloques de Cuarzo Ahumado +Cracked Smokey Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Ahumado Agrietados + +Soapstone Stair=Escalera de Esteatita +Soapstone Brick Stair=Escalera de Ladrillos de Esteatita +Soapstone Block Stair=Escalera de Bloques de Esteatita +Cracked Soapstone Brick Stair=Escalera de Ladrillos de Esteatita Agrietados + +Sodalite Stair=Escalera de Sodalita +Cobbled Sodalite Stair=Escalera de Sodalita Guiada +Sodalite Brick Stair=Escalera de Ladrillos de Sodalita +Sodalite Block Stair=Escalera de Bloques de Sodalita +Cracked Sodalite Brick Stair=Escalera de Ladrillos de Sodalita Agrietados + +Sugilite Stair=Escalera de Sugilita +Sugilite Brick Stair=Escalera de Ladrillos de Sugilita +Sugilite Block Stair=Escalera de Bloques de Sugilita +Cracked Sugilite Brick Stair=Escalera de Ladrillos de Sugilita Agrietados +Cobbled Sugilite Stair=Escalera de Sugilita Guiada + +Green Tourmaline Stair=Escalera de Turmalina Verde +Green Tourmaline Brick Stair=Escalera de Ladrillo de Turmalina Verde +Green Tourmaline Block Stair=Escalera de Bloque de Turmalina Verde +Cracked Green Tourmaline Brick Stair=Escalera de Ladrillo de Turmalina Verde Agrietado + +Paraiba Tourmaline Stair=Escalera de Turmalina Paraíba +Paraiba Tourmaline Brick Stair=Escalera de Ladrillo de Turmalina Paraíba +Paraiba Tourmaline Block Stair=Escalera de Bloque de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick Stair=Escalera de Ladrillo de Turmalina Paraíba Agrietado + +Pink Tourmaline Stair=Escalera de Turmalina Rosa +Pink Tourmaline Brick Stair=Escalera de Ladrillo de Turmalina Rosa +Pink Tourmaline Block Stair=Escalera de Bloque de Turmalina Rosa +Cracked Pink Tourmaline Brick Stair=Escalera de Ladrillo de Turmalina Rosa Agrietado + +Travertine Stair=Escalera de Travertino +Cobbled Travertine Stair=Escalera de Travertino Guiada +Travertine Brick Stair=Escalera de Ladrillos de Travertino +Travertine Block Stair=Escalera de Bloques de Travertino +Cracked Travertine Brick Stair=Escalera de Ladrillos de Travertino Agrietados + +Yellow Travertine Stair=Escalera de Travertino Amarillo +Cobbled Yellow Travertine Stair=Escalera de Travertino Amarillo Guiada +Yellow Travertine Brick Stair=Escalera de Ladrillos de Travertino Amarillo +Yellow Travertine Block Stair=Escalera de Bloques de Travertino Amarillo +Cracked Yellow Travertine Brick Stair=Escalera de Ladrillos de Travertino Amarillo Agrietados + +Beige Tuff Stair=Escalera de Toba Beige +Beige Tuff Brick Stair=Escalera de Ladrillos de Toba Beige +Beige Tuff Block Stair=Escalera de Bloques de Toba Beige +Cracked Beige Tuff Brick Stair=Escalera de Ladrillos de Toba Beige Agrietados +Cobbled Beige Tuff Stair=Escalera de Toba Beige Guiada + +Grey Tuff Stair=Escalera de Toba Gris +Grey Tuff Brick Stair=Escalera de Ladrillos de Toba Gris +Grey Tuff Block Stair=Escalera de Bloques de Toba Gris +Cracked Grey Tuff Brick Stair=Escalera de Ladrillos de Toba Gris Agrietados +Cobbled Grey Tuff Stair=Escalera de Toba Gris Guiada + +Red Tuff Stair=Escalera de Toba Roja +Red Tuff Brick Stair=Escalera de Ladrillos de Toba Roja +Red Tuff Block Stair=Escalera de Bloques de Toba Roja +Cracked Red Tuff Brick Stair=Escalera de Ladrillos de Toba Roja Agrietados +Cobbled Red Tuff Stair=Escalera de Toba Roja Guiada + +Turquoise Stair=Escalera de Turquesa +Turquoise Brick Stair=Escalera de Ladrillos de Turquesa +Turquoise Block Stair=Escalera de Bloques de Turquesa +Cracked Turquoise Brick Stair=Escalera de Ladrillos de Turquesa Agrietados +Cobbled Turquoise Stair=Escalera de Turquesa Guiada + +Vivianite Stair=Escalera de Vivianita +Vivianite Brick Stair=Escalera de Ladrillos de Vivianita +Vivianite Block Stair=Escalera de Bloques de Vivianita +Cracked Vivianite Brick Stair=Escalera de Ladrillos de Vivianita Agrietados + + + +Inner Blue Agate Stair=Escalera de Ãgata Azul Interior +Inner Gray Agate Stair=Escalera de Ãgata Gris Interior +Inner Green Agate Stair=Escalera de Ãgata Verde Interior +Inner Moss Agate Stair=Escalera de Ãgata Musgo Interior +Inner Orange Agate Stair=Escalera de Ãgata Naranja Interior +Inner Purple Agate Stair=Escalera de Ãgata Morada Interior +Inner Red Agate Stair=Escalera de Ãgata Roja Interior + +Inner Amazonite Stair=Escalera de Amazonita Interior +Inner Cobbled Amazonite Stair=Escalera de Amazonita Interior Guiada +Inner Amazonite Brick Stair=Escalera de Ladrillos de Amazonita Interior +Inner Amazonite Block Stair=Escalera de Bloques de Amazonita Interior +Inner Cracked Amazonite Brick Stair=Escalera de Ladrillos de Amazonita Interior Agrietados + +Inner Amber Stair=Escalera de Ãmbar Interior +Inner Amber Brick Stair=Escalera de Ladrillos de Ãmbar Interior +Inner Amber Block Stair=Escalera de Bloques de Ãmbar Interior +Inner Cracked Amber Brick Stair=Escalera de Ladrillos de Ãmbar Interior Agrietados + +Inner Amethyst Stair=Escalera de Amatista Interior +Inner Amethyst Brick Stair=Escalera de Ladrillos de Amatista Interior +Inner Amethyst Block Stair=Escalera de Bloques de Amatista Interior +Inner Cracked Amethyst Brick Stair=Escalera de Ladrillos de Amatista Interior Agrietados + +Inner Andesite Stair=Escalera de Andesita Interior +Inner Andesite Block Stair=Escalera de Bloques de Andesita Interior +Inner Andesite Brick Stair=Escalera de Ladrillos de Andesita Interior +Inner Cracked Andesite Brick Stair=Escalera de Ladrillos de Andesita Interior Agrietados +Inner Cobbled Andesite Stair=Escalera de Andesita Interior Guiada + +Inner Basalt Stair=Escalera de Basalto Interior +Inner Basalt Block Stair=Escalera de Bloques de Basalto Interior +Inner Basalt Brick Stair=Escalera de Ladrillos de Basalto Interior +Inner Cracked Basalt Brick Stair=Escalera de Ladrillos de Basalto Interior Agrietados +Inner Cobbled Basalt Stair=Escalera de Basalto Interior Guiada +Inner Basalt Tile Stair=Escalera de Azulejos de Basalto Interior + +Inner Black Moonstone Stair=Escalera de Piedra Lunar Negra Interior +Inner Black Moonstone Brick Stair=Escalera de Ladrillos de Piedra Lunar Negra Interior +Inner Black Moonstone Block Stair=Escalera de Bloques de Piedra Lunar Negra Interior +Inner Cracked Black Moonstone Brick Stair=Escalera de Ladrillos de Piedra Lunar Negra Interior Agrietados + +Inner Grey Calcite Stair=Escalera Interna de Calcita Gris +Inner Grey Calcite Brick Stair=Escalera Interna de Ladrillo de Calcita Gris +Inner Grey Calcite Block Stair=Escalera Interna de Bloque de Calcita Gris +Inner Cracked Grey Calcite Brick Stair=Escalera Interna de Ladrillo de Calcita Gris Agrietado + +Inner Calcite Stair=Escalera de Calcita Interior +Inner Calcite Brick Stair=Escalera de Ladrillos de Calcita Interior +Inner Calcite Block Stair=Escalera de Bloques de Calcita Interior +Inner Cracked Calcite Brick Stair=Escalera de Ladrillos de Calcita Interior Agrietados + +Inner Orange Calcite Stair=Escalera Interna de Calcita Naranja +Inner Orange Calcite Brick Stair=Escalera Interna de Ladrillo de Calcita Naranja +Inner Orange Calcite Block Stair=Escalera Interna de Bloque de Calcita Naranja +Inner Cracked Orange Calcite Brick Stair=Escalera Interna de Ladrillo de Calcita Naranja Agrietado + +Inner Carnotite Stair=Escalera de Carnotita Interior +Inner Carnotite Brick Stair=Escalera de Ladrillos de Carnotita Interior +Inner Carnotite Block Stair=Escalera de Bloques de Carnotita Interior +Inner Cracked Carnotite Brick Stair=Escalera de Ladrillos de Carnotita Interior Agrietados +Inner Cobbled Carnotite Stair=Escalera de Carnotita Interior Guiada + +Inner Celestine Stair=Escalera de Celestina Interior +Inner Celestine Brick Stair=Escalera de Ladrillos de Celestina Interior +Inner Celestine Block Stair=Escalera de Bloques de Celestina Interior +Inner Cracked Celestine Brick Stair=Escalera de Ladrillos de Celestina Interior Agrietados + +Inner Chalcanthite Stair=Escalera Interna de Calcanthita +Inner Chalcanthite Brick Stair=Escalera Interna de Ladrillo de Calcanthita +Inner Chalcanthite Block Stair=Escalera Interna de Bloque de Calcanthita +Inner Cracked Chalcanthite Brick Stair=Escalera Interna de Ladrillo de Calcanthita Agrietado +Inner Cobbled Chalcanthite Stair=Escalera Interna de Calcanthita Guijarreada + +Inner Chrysoprase Stair=Escalera de Crisoprasa Interior +Inner Chrysoprase Brick Stair=Escalera de Ladrillos de Crisoprasa Interior +Inner Chrysoprase Block Stair=Escalera de Bloques de Crisoprasa Interior +Inner Cracked Chrysoprase Brick Stair=Escalera de Ladrillos de Crisoprasa Interior Agrietados + +Inner Citrine Stair=Escalera de Citrino Interior +Inner Citrine Brick Stair=Escalera de Ladrillos de Citrino Interior +Inner Citrine Block Stair=Escalera de Bloques de Citrino Interior +Inner Cracked Citrine Brick Stair=Escalera de Ladrillos de Citrino Interior Agrietados + +Inner Covellite Stair=Escalera de Covellita Interior +Inner Covellite Brick Stair=Escalera de Ladrillos de Covellita Interior +Inner Covellite Block Stair=Escalera de Bloques de Covellita Interior +Inner Cracked Covellite Brick Stair=Escalera de Ladrillos de Covellita Interior Agrietados +Inner Cobbled Covellite Stair=Escalera de Covellita Interior Guiada + +Inner Crocoite Stair=Escalera de Crocoíta Interior +Inner Crocoite Brick Stair=Escalera de Ladrillos de Crocoíta Interior +Inner Crocoite Block Stair=Escalera de Bloques de Crocoíta Interior +Inner Cracked Crocoite Brick Stair=Escalera de Ladrillos de Crocoíta Interior Agrietados + +Inner Diorite Stair=Escalera de Diorita Interior +Inner Diorite Brick Stair=Escalera de Ladrillos de Diorita Interior +Inner Diorite Block Stair=Escalera de Bloques de Diorita Interior +Inner Cracked Diorite Brick Stair=Escalera de Ladrillos de Diorita Interior Agrietados +Inner Cobbled Diorite Stair=Escalera de Diorita Interior Guiada + +Inner Erythrite Stair=Escalera de Eritrita Interior +Inner Erythrite Brick Stair=Escalera de Ladrillos de Eritrita Interior +Inner Erythrite Block Stair=Escalera de Bloques de Eritrita Interior +Inner Cracked Erythrite Brick Stair=Escalera de Ladrillos de Eritrita Interior Agrietados + +Inner Eudialite Stair=Escalera de Eudialita Interior +Inner Eudialite Brick Stair=Escalera de Ladrillos de Eudialita Interior +Inner Eudialite Block Stair=Escalera de Bloques de Eudialita Interior +Inner Cracked Eudialite Brick Stair=Escalera de Ladrillos de Eudialita Interior Agrietados + +Inner Fluorite Stair=Escalera de Fluorita Interior +Inner Fluorite Brick Stair=Escalera de Ladrillos de Fluorita Interior +Inner Fluorite Block Stair=Escalera de Bloques de Fluorita Interior +Inner Cracked Fluorite Brick Stair=Escalera de Ladrillos de Fluorita Interior Agrietados + +Inner Gabbro Stair=Escalera de Gabbro Interior +Inner Cobbled Gabbro Stair=Escalera de Gabbro Interior Guiada +Inner Gabbro Brick Stair=Escalera de Ladrillos de Gabbro Interior +Inner Gabbro Block Stair=Escalera de Bloques de Gabbro Interior +Inner Cracked Gabbro Brick Stair=Escalera de Ladrillos de Gabbro Interior Agrietados + +Inner Galena Stair=Escalera de Galena Interior +Inner Galena Brick Stair=Escalera de Ladrillos de Galena Interior +Inner Galena Block Stair=Escalera de Bloques de Galena Interior +Inner Cracked Galena Brick Stair=Escalera de Ladrillos de Galena Interior Agrietados + +Inner Black Granite Stair=Escalera de Granito Negro Interior +Inner Black Granite Brick Stair=Escalera de Ladrillos de Granito Negro Interior +Inner Black Granite Block Stair=Escalera de Bloques de Granito Negro Interior +Inner Cracked Black Granite Brick Stair=Escalera de Ladrillos de Granito Negro Interior Agrietados +Inner Cobbled Black Granite Stair=Escalera de Granito Negro Interior Guiada + +Inner Blue Granite Stair=Escalera de Granito Azul Interior +Inner Blue Granite Brick Stair=Escalera de Ladrillos de Granito Azul Interior +Inner Blue Granite Block Stair=Escalera de Bloques de Granito Azul Interior +Inner Cracked Blue Granite Brick Stair=Escalera de Ladrillos de Granito Azul Interior Agrietados +Inner Cobbled Blue Granite Stair=Escalera de Granito Azul Interior Guiada + +Inner Gray Granite Stair=Escalera de Granito Gris Interior +Inner Gray Granite Brick Stair=Escalera de Ladrillos de Granito Gris Interior +Inner Gray Granite Block Stair=Escalera de Bloques de Granito Gris Interior +Inner Cracked Gray Granite Brick Stair=Escalera de Ladrillos de Granito Gris Interior Agrietados +Inner Cobbled Gray Granite Stair=Escalera de Granito Gris Interior Guiada + +Inner Green Granite Stair=Escalera de Granito Verde Interior +Inner Green Granite Brick Stair=Escalera de Ladrillos de Granito Verde Interior +Inner Green Granite Block Stair=Escalera de Bloques de Granito Verde Interior +Inner Cracked Green Granite Brick Stair=Escalera de Ladrillos de Granito Verde Interior Agrietados +Inner Cobbled Green Granite Stair=Escalera de Granito Verde Interior Guiada + +Inner Pink Granite Stair=Escalera de Granito Rosa Interior +Inner Pink Granite Brick Stair=Escalera de Ladrillos de Granito Rosa Interior +Inner Pink Granite Block Stair=Escalera de Bloques de Granito Rosa Interior +Inner Cracked Pink Granite Brick Stair=Escalera de Ladrillos de Granito Rosa Interior Agrietados +Inner Cobbled Pink Granite Stair=Escalera de Granito Rosa Interior Guiada + +Inner Red Granite Stair=Escalera de Granito Rojo Interior +Inner Red Granite Brick Stair=Escalera de Ladrillos de Granito Rojo Interior +Inner Red Granite Block Stair=Escalera de Bloques de Granito Rojo Interior +Inner Cracked Red Granite Brick Stair=Escalera de Ladrillos de Granito Rojo Interior Agrietados +Inner Cobbled Red Granite Stair=Escalera de Granito Rojo Interior Guiada + +Inner White Granite Stair=Escalera de Granito Blanco Interior +Inner White Granite Brick Stair=Escalera de Ladrillos de Granito Blanco Interior +Inner White Granite Block Stair=Escalera de Bloques de Granito Blanco Interior +Inner Cracked White Granite Brick Stair=Escalera de Ladrillos de Granito Blanco Interior Agrietados +Inner Cobbled White Granite Stair=Escalera de Granito Blanco Interior Guiada + +Inner Yellow Granite Stair=Escalera de Granito Amarillo Interior +Inner Yellow Granite Brick Stair=Escalera de Ladrillos de Granito Amarillo Interior +Inner Yellow Granite Block Stair=Escalera de Bloques de Granito Amarillo Interior +Inner Cracked Yellow Granite Brick Stair=Escalera de Ladrillos de Granito Amarillo Interior Agrietados +Inner Cobbled Yellow Granite Stair=Escalera de Granito Amarillo Interior Guiada + +Inner Heliodor Stair=Escalera de Heliodoro Interior +Inner Heliodor Brick Stair=Escalera de Ladrillos de Heliodoro Interior +Inner Heliodor Block Stair=Escalera de Bloques de Heliodoro Interior +Inner Cracked Heliodor Brick Stair=Escalera de Ladrillos de Heliodoro Interior Agrietados + +Inner Howlite Stair=Escalera de Howlita Interior +Inner Howlite Brick Stair=Escalera de Ladrillos de Howlita Interior +Inner Howlite Block Stair=Escalera de Bloques de Howlita Interior +Inner Cracked Howlite Brick Stair=Escalera de Ladrillos de Howlita Interior Agrietados +Inner Cobbled Howlite Stair=Escalera de Howlita Interior Guiada + +Inner Ilvaite Stair=Escalera de Ilvaita Interior +Inner Ilvaite Brick Stair=Escalera de Ladrillos de Ilvaita Interior +Inner Ilvaite Block Stair=Escalera de Bloques de Ilvaita Interior +Inner Cracked Ilvaite Brick Stair=Escalera de Ladrillos de Ilvaita Interior Agrietados +Inner Cobbled Ilvaite Stair=Escalera de Ilvaita Interior Guiada + +Inner Jade Stair=Escalera de Jade Interior +Inner Jade Brick Stair=Escalera de Ladrillos de Jade Interior +Inner Jade Block Stair=Escalera de Bloques de Jade Interior +Inner Cracked Jade Brick Stair=Escalera de Ladrillos de Jade Interior Agrietados +Inner Cobbled Jade Stair=Escalera de Jade Interior Guiada + +Inner Red Jasper Stair=Escalera Interna de Jaspe Rojo +Inner Red Jasper Brick Stair=Escalera Interna de Ladrillo de Jaspe Rojo +Inner Red Jasper Block Stair=Escalera Interna de Bloque de Jaspe Rojo +Inner Cracked Red Jasper Brick Stair=Escalera Interna de Ladrillo de Jaspe Rojo Agrietado +Inner Cobbled Red Jasper Stair=Escalera Interna de Jaspe Rojo Guijarreado + +Inner Kyanite Stair=Escalera de Cianita Interior +Inner Kyanite Brick Stair=Escalera de Ladrillos de Cianita Interior +Inner Kyanite Block Stair=Escalera de Bloques de Cianita Interior +Inner Cracked Kyanite Brick Stair=Escalera de Ladrillos de Cianita Interior Agrietados +Inner Cobbled Kyanite Stair=Escalera de Cianita Interior Guiada + +Inner Lapis Lazuli Stair=Escalera de Lapislázuli Interior +Inner Lapis Lazuli Brick Stair=Escalera de Ladrillos de Lapislázuli Interior +Inner Lapis Lazuli Block Stair=Escalera de Bloques de Lapislázuli Interior +Inner Cracked Lapis Lazuli Brick Stair=Escalera de Ladrillos de Lapislázuli Interior Agrietados + +Inner Lepidolite Stair=Escalera Interna de Lepidolita +Inner Lepidolite Brick Stair=Escalera Interna de Ladrillo de Lepidolita +Inner Lepidolite Block Stair=Escalera Interna de Bloque de Lepidolita +Inner Cracked Lepidolite Brick Stair=Escalera Interna de Ladrillo de Lepidolita Agrietado +Inner Cobbled Lepidolite Stair=Escalera Interna de Lepidolita Guijarreada + +Inner Blue Limestone Stair=Escalera de Piedra Caliza Azul Interior +Inner Blue Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Azul Interior +Inner Blue Limestone Block Stair=Escalera de Bloques de Piedra Caliza Azul Interior +Inner Cracked Blue Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Azul Interior Agrietados +Inner Cobbled Blue Limestone Stair=Escalera de Piedra Caliza Azul Interior Guiada + +Inner White Limestone Stair=Escalera de Piedra Caliza Blanca Interior +Inner White Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Blanca Interior +Inner White Limestone Block Stair=Escalera de Bloques de Piedra Caliza Blanca Interior +Inner Cracked White Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Blanca Interior Agrietados +Inner Cobbled White Limestone Stair=Escalera de Piedra Caliza Blanca Interior Guiada + +Inner Marble Stair=Escalera de Mármol Interior +Inner Marble Brick Stair=Escalera de Ladrillos de Mármol Interior +Inner Marble Block Stair=Escalera de Bloques de Mármol Interior +Inner Cracked Marble Brick Stair=Escalera de Ladrillos de Mármol Interior Agrietados +Inner Cobbled Marble Stair=Escalera de Mármol Interior Guiada + +Inner Moonstone Stair=Escalera Interna de Piedra Lunar +Inner Moonstone Brick Stair=Escalera Interna de Ladrillo de Piedra Lunar +Inner Moonstone Block Stair=Escalera Interna de Bloque de Piedra Lunar +Inner Cracked Moonstone Brick Stair=Escalera Interna de Ladrillo de Piedra Lunar Agrietado + +Inner Morion Quartz Stair=Escalera de Cuarzo Morión Interior +Inner Morion Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Morión Interior +Inner Morion Quartz Block Stair=Escalera de Bloques de Cuarzo Morión Interior +Inner Cracked Morion Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Morión Interior Agrietados + +Inner Mudstone Stair=Escalera de Mudstone Interior +Inner Cobbled Mudstone Stair=Escalera de Mudstone Interior Guiada +Inner Mudstone Brick Stair=Escalera de Ladrillos de Mudstone Interior +Inner Mudstone Block Stair=Escalera de Bloques de Mudstone Interior +Inner Cracked Mudstone Brick Stair=Escalera de Ladrillos de Mudstone Interior Agrietados + +Inner Prasiolite Stair=Escalera de Prasiolita Interior +Inner Prasiolite Brick Stair=Escalera de Ladrillos de Prasiolita Interior +Inner Prasiolite Block Stair=Escalera de Bloques de Prasiolita Interior +Inner Cracked Prasiolite Brick Stair=Escalera de Ladrillos de Prasiolita Interior Agrietados + +Inner Pumice Stair=Escalera de Pómez Interior +Inner Pumice Brick Stair=Escalera de Ladrillos de Pómez Interior +Inner Pumice Block Stair=Escalera de Bloques de Pómez Interior +Inner Cracked Pumice Brick Stair=Escalera de Ladrillos de Pómez Interior Agrietados + +Inner Pyrite Stair=Escalera de Pirita Interior +Inner Pyrite Brick Stair=Escalera de Ladrillos de Pirita Interior +Inner Pyrite Block Stair=Escalera de Bloques de Pirita Interior +Inner Cracked Pyrite Brick Stair=Escalera de Ladrillos de Pirita Interior Agrietados + +Inner Quartz Stair=Escalera de Cuarzo Interior +Inner Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Interior +Inner Quartz Block Stair=Escalera de Bloques de Cuarzo Interior +Inner Cracked Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Interior Agrietados + +Inner Rhodonite Stair=Escalera Interna de Rodonita +Inner Rhodonite Brick Stair=Escalera Interna de Ladrillo de Rodonita +Inner Rhodonite Block Stair=Escalera Interna de Bloque de Rodonita +Inner Cracked Rhodonite Brick Stair=Escalera Interna de Ladrillo de Rodonita Agrietado +Inner Cobbled Rhodonite Stair=Escalera Interna de Rodonita Guijarreada + +Inner Rose Quartz Stair=Escalera de Cuarzo Rosa Interior +Inner Rose Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Rosa Interior +Inner Rose Quartz Block Stair=Escalera de Bloques de Cuarzo Rosa Interior +Inner Cracked Rose Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Rosa Interior Agrietados + +Inner Scoria Stair=Escalera de Escoria Interior +Inner Scoria Brick Stair=Escalera de Ladrillos de Escoria Interior +Inner Scoria Block Stair=Escalera de Bloques de Escoria Interior +Inner Cracked Scoria Brick Stair=Escalera de Ladrillos de Escoria Interior Agrietados +Inner Cobbled Scoria Stair=Escalera de Escoria Interior Guiada + +Inner Serpentine Stair=Escalera de Serpentina Interior +Inner Cobbled Serpentine Stair=Escalera de Serpentina Interior Guiada +Inner Serpentine Brick Stair=Escalera de Ladrillos de Serpentina Interior +Inner Serpentine Block Stair=Escalera de Bloques de Serpentina Interior +Inner Cracked Serpentine Brick Stair=Escalera de Ladrillos de Serpentina Interior Agrietados + +Inner Shale Stair=Escalera de Pizarra Interior +Inner Shale Brick Stair=Escalera de Ladrillos de Pizarra Interior +Inner Shale Block Stair=Escalera de Bloques de Pizarra Interior +Inner Cracked Shale Brick Stair=Escalera de Ladrillos de Pizarra Interior Agrietados +Inner Cobbled Shale Stair=Escalera de Pizarra Interior Guiada + +Inner Slate Stair=Escalera de Pizarra Interior +Inner Slate Brick Stair=Escalera de Ladrillos de Pizarra Interior +Inner Slate Block Stair=Escalera de Bloques de Pizarra Interior +Inner Cracked Slate Brick Stair=Escalera de Ladrillos de Pizarra Interior Agrietados +Inner Cobbled Slate Stair=Escalera de Pizarra Interior Guiada +Inner Slate Tile Stair=Escalera de Azulejos de Pizarra Interior + +Inner Smokey Quartz Stair=Escalera de Cuarzo Ahumado Interior +Inner Smokey Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Ahumado Interior +Inner Smokey Quartz Block Stair=Escalera de Bloques de Cuarzo Ahumado Interior +Inner Cracked Smokey Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Ahumado Interior Agrietados + +Inner Soapstone Stair=Escalera de Esteatita Interior +Inner Soapstone Brick Stair=Escalera de Ladrillos de Esteatita Interior +Inner Soapstone Block Stair=Escalera de Bloques de Esteatita Interior +Inner Cracked Soapstone Brick Stair=Escalera de Ladrillos de Esteatita Interior Agrietados + +Inner Sodalite Stair=Escalera de Sodalita Interior +Inner Cobbled Sodalite Stair=Escalera de Sodalita Interior Guiada +Inner Sodalite Brick Stair=Escalera de Ladrillos de Sodalita Interior +Inner Sodalite Block Stair=Escalera de Bloques de Sodalita Interior +Inner Cracked Sodalite Brick Stair=Escalera de Ladrillos de Sodalita Interior Agrietados + +Inner Sugilite Stair=Escalera de Sugilita Interior +Inner Sugilite Brick Stair=Escalera de Ladrillos de Sugilita Interior +Inner Sugilite Block Stair=Escalera de Bloques de Sugilita Interior +Inner Cracked Sugilite Brick Stair=Escalera de Ladrillos de Sugilita Interior Agrietados +Inner Cobbled Sugilite Stair=Escalera de Sugilita Interior Guiada + +Inner Green Tourmaline Stair=Escalera Interna de Turmalina Verde +Inner Green Tourmaline Brick Stair=Escalera Interna de Ladrillo de Turmalina Verde +Inner Green Tourmaline Block Stair=Escalera Interna de Bloque de Turmalina Verde +Inner Cracked Green Tourmaline Brick Stair=Escalera Interna de Ladrillo de Turmalina Verde Agrietado + +Inner Paraiba Tourmaline Stair=Escalera Interna de Turmalina Paraíba +Inner Paraiba Tourmaline Brick Stair=Escalera Interna de Ladrillo de Turmalina Paraíba +Inner Paraiba Tourmaline Block Stair=Escalera Interna de Bloque de Turmalina Paraíba +Inner Cracked Paraiba Tourmaline Brick Stair=Escalera Interna de Ladrillo de Turmalina Paraíba Agrietado + +Inner Pink Tourmaline Stair=Escalera Interna de Turmalina Rosa +Inner Pink Tourmaline Brick Stair=Escalera Interna de Ladrillo de Turmalina Rosa +Inner Pink Tourmaline Block Stair=Escalera Interna de Bloque de Turmalina Rosa +Inner Cracked Pink Tourmaline Brick Stair=Escalera Interna de Ladrillo de Turmalina Rosa Agrietado + +Inner Travertine Stair=Escalera de Travertino Interior +Inner Cobbled Travertine Stair=Escalera de Travertino Interior Guiada +Inner Travertine Brick Stair=Escalera de Ladrillos de Travertino Interior +Inner Travertine Block Stair=Escalera de Bloques de Travertino Interior +Inner Cracked Travertine Brick Stair=Escalera de Ladrillos de Travertino Interior Agrietados + +Inner Yellow Travertine Stair=Escalera de Travertino Amarillo Interior +Inner Cobbled Yellow Travertine Stair=Escalera de Travertino Amarillo Interior Guiada +Inner Yellow Travertine Brick Stair=Escalera de Ladrillos de Travertino Amarillo Interior +Inner Yellow Travertine Block Stair=Escalera de Bloques de Travertino Amarillo Interior +Inner Cracked Yellow Travertine Brick Stair=Escalera de Ladrillos de Travertino Amarillo Interior Agrietados + +Inner Beige Tuff Stair=Escalera de Toba Beige Interior +Inner Cobbled Beige Tuff Stair=Escalera de Toba Beige Interior Guiada +Inner Beige Tuff Brick Stair=Escalera de Ladrillos de Toba Beige Interior +Inner Beige Tuff Block Stair=Escalera de Bloques de Toba Beige Interior +Inner Cracked Beige Tuff Brick Stair=Escalera de Ladrillos de Toba Beige Interior Agrietados + +Inner Grey Tuff Stair=Escalera de Toba Gris Interior +Inner Cobbled Grey Tuff Stair=Escalera de Toba Gris Interior Guiada +Inner Grey Tuff Brick Stair=Escalera de Ladrillos de Toba Gris Interior +Inner Grey Tuff Block Stair=Escalera de Bloques de Toba Gris Interior +Inner Cracked Grey Tuff Brick Stair=Escalera de Ladrillos de Toba Gris Interior Agrietados + +Inner Red Tuff Stair=Escalera de Toba Roja Interior +Inner Cobbled Red Tuff Stair=Escalera de Toba Roja Interior Guiada +Inner Red Tuff Brick Stair=Escalera de Ladrillos de Toba Roja Interior +Inner Red Tuff Block Stair=Escalera de Bloques de Toba Roja Interior +Inner Cracked Red Tuff Brick Stair=Escalera de Ladrillos de Toba Roja Interior Agrietados + +Inner Turquoise Stair=Escalera de Turquesa Interior +Inner Turquoise Brick Stair=Escalera de Ladrillos de Turquesa Interior +Inner Turquoise Block Stair=Escalera de Bloques de Turquesa Interior +Inner Cracked Turquoise Brick Stair=Escalera de Ladrillos de Turquesa Interior Agrietados +Inner Cobbled Turquoise Stair=Escalera de Turquesa Interior Guiada + +Inner Vivianite Stair=Escalera de Vivianita Interior +Inner Vivianite Brick Stair=Escalera de Ladrillos de Vivianita Interior +Inner Vivianite Block Stair=Escalera de Bloques de Vivianita Interior +Inner Cracked Vivianite Brick Stair=Escalera de Ladrillos de Vivianita Interior Agrietados + + + +Outer Blue Agate Stair=Escalera de Ãgata Azul Exterior +Outer Gray Agate Stair=Escalera de Ãgata Gris Exterior +Outer Green Agate Stair=Escalera de Ãgata Verde Exterior +Outer Moss Agate Stair=Escalera de Ãgata Musgo Exterior +Outer Orange Agate Stair=Escalera de Ãgata Naranja Exterior +Outer Purple Agate Stair=Escalera de Ãgata Morada Exterior +Outer Red Agate Stair=Escalera de Ãgata Roja Exterior + +Outer Amazonite Stair=Escalera de Amazonita Exterior +Outer Cobbled Amazonite Stair=Escalera de Amazonita Exterior Guiada +Outer Amazonite Brick Stair=Escalera de Ladrillos de Amazonita Exterior +Outer Amazonite Block Stair=Escalera de Bloques de Amazonita Exterior +Outer Cracked Amazonite Brick Stair=Escalera de Ladrillos de Amazonita Exterior Agrietados + +Outer Amber Stair=Escalera de Ãmbar Exterior +Outer Amber Brick Stair=Escalera de Ladrillos de Ãmbar Exterior +Outer Amber Block Stair=Escalera de Bloques de Ãmbar Exterior +Outer Cracked Amber Brick Stair=Escalera de Ladrillos de Ãmbar Exterior Agrietados + +Outer Amethyst Stair=Escalera de Amatista Exterior +Outer Amethyst Brick Stair=Escalera de Ladrillos de Amatista Exterior +Outer Amethyst Block Stair=Escalera de Bloques de Amatista Exterior +Outer Cracked Amethyst Brick Stair=Escalera de Ladrillos de Amatista Exterior Agrietados + +Outer Andesite Stair=Escalera de Andesita Exterior +Outer Andesite Block Stair=Escalera de Bloques de Andesita Exterior +Outer Andesite Brick Stair=Escalera de Ladrillos de Andesita Exterior +Outer Cracked Andesite Brick Stair=Escalera de Ladrillos de Andesita Exterior Agrietados +Outer Cobbled Andesite Stair=Escalera de Andesita Exterior Guiada + +Outer Basalt Stair=Escalera de Basalto Exterior +Outer Basalt Block Stair=Escalera de Bloques de Basalto Exterior +Outer Basalt Brick Stair=Escalera de Ladrillos de Basalto Exterior +Outer Cracked Basalt Brick Stair=Escalera de Ladrillos de Basalto Exterior Agrietados +Outer Cobbled Basalt Stair=Escalera de Basalto Exterior Guiada +Outer Basalt Tile Stair=Escalera de Azulejos de Basalto Exterior + +Outer Black Moonstone Stair=Escalera de Piedra Lunar Negra Exterior +Outer Black Moonstone Brick Stair=Escalera de Ladrillos de Piedra Lunar Negra Exterior +Outer Black Moonstone Block Stair=Escalera de Bloques de Piedra Lunar Negra Exterior +Outer Cracked Black Moonstone Brick Stair=Escalera de Ladrillos de Piedra Lunar Negra Exterior Agrietados + +Outer Grey Calcite Stair=Escalera Externa de Calcita Gris +Outer Grey Calcite Brick Stair=Escalera Externa de Ladrillo de Calcita Gris +Outer Grey Calcite Block Stair=Escalera Externa de Bloque de Calcita Gris +Outer Cracked Grey Calcite Brick Stair=Escalera Externa de Ladrillo de Calcita Gris Agrietado + +Outer Calcite Stair=Escalera de Calcita Exterior +Outer Calcite Brick Stair=Escalera de Ladrillos de Calcita Exterior +Outer Calcite Block Stair=Escalera de Bloques de Calcita Exterior +Outer Cracked Calcite Brick Stair=Escalera de Ladrillos de Calcita Exterior Agrietados + +Outer Orange Calcite Stair=Escalera Externa de Calcita Naranja +Outer Orange Calcite Brick Stair=Escalera Externa de Ladrillo de Calcita Naranja +Outer Orange Calcite Block Stair=Escalera Externa de Bloque de Calcita Naranja +Outer Cracked Orange Calcite Brick Stair=Escalera Externa de Ladrillo de Calcita Naranja Agrietado + +Outer Carnotite Stair=Escalera de Carnotita Exterior +Outer Carnotite Brick Stair=Escalera de Ladrillos de Carnotita Exterior +Outer Carnotite Block Stair=Escalera de Bloques de Carnotita Exterior +Outer Cracked Carnotite Brick Stair=Escalera de Ladrillos de Carnotita Exterior Agrietados +Outer Cobbled Carnotite Stair=Escalera de Carnotita Exterior Guiada + +Outer Celestine Stair=Escalera de Celestina Exterior +Outer Celestine Brick Stair=Escalera de Ladrillos de Celestina Exterior +Outer Celestine Block Stair=Escalera de Bloques de Celestina Exterior +Outer Cracked Celestine Brick Stair=Escalera de Ladrillos de Celestina Exterior Agrietados + +Outer Chalcanthite Stair=Escalera Externa de Calcanthita +Outer Chalcanthite Brick Stair=Escalera Externa de Ladrillo de Calcanthita +Outer Chalcanthite Block Stair=Escalera Externa de Bloque de Calcanthita +Outer Cracked Chalcanthite Brick Stair=Escalera Externa de Ladrillo de Calcanthita Agrietado +Outer Cobbled Chalcanthite Stair=Escalera Externa de Calcanthita Guijarreada + +Outer Chrysoprase Stair=Escalera de Crisoprasa Exterior +Outer Chrysoprase Brick Stair=Escalera de Ladrillos de Crisoprasa Exterior +Outer Chrysoprase Block Stair=Escalera de Bloques de Crisoprasa Exterior +Outer Cracked Chrysoprase Brick Stair=Escalera de Ladrillos de Crisoprasa Exterior Agrietados + +Outer Citrine Stair=Escalera de Citrino Exterior +Outer Citrine Brick Stair=Escalera de Ladrillos de Citrino Exterior +Outer Citrine Block Stair=Escalera de Bloques de Citrino Exterior +Outer Cracked Citrine Brick Stair=Escalera de Ladrillos de Citrino Exterior Agrietados + +Outer Covellite Stair=Escalera de Covellita Exterior +Outer Covellite Brick Stair=Escalera de Ladrillos de Covellita Exterior +Outer Covellite Block Stair=Escalera de Bloques de Covellita Exterior +Outer Cracked Covellite Brick Stair=Escalera de Ladrillos de Covellita Exterior Agrietados +Outer Cobbled Covellite Stair=Escalera de Covellita Exterior Guiada + +Outer Crocoite Stair=Escalera de Crocoíta Exterior +Outer Crocoite Brick Stair=Escalera de Ladrillos de Crocoíta Exterior +Outer Crocoite Block Stair=Escalera de Bloques de Crocoíta Exterior +Outer Cracked Crocoite Brick Stair=Escalera de Ladrillos de Crocoíta Exterior Agrietados + +Outer Diorite Stair=Escalera de Diorita Exterior +Outer Diorite Brick Stair=Escalera de Ladrillos de Diorita Exterior +Outer Diorite Block Stair=Escalera de Bloques de Diorita Exterior +Outer Cracked Diorite Brick Stair=Escalera de Ladrillos de Diorita Exterior Agrietados +Outer Cobbled Diorite Stair=Escalera de Diorita Exterior Guiada + +Outer Erythrite Stair=Escalera de Eritrita Exterior +Outer Erythrite Brick Stair=Escalera de Ladrillos de Eritrita Exterior +Outer Erythrite Block Stair=Escalera de Bloques de Eritrita Exterior +Outer Cracked Erythrite Brick Stair=Escalera de Ladrillos de Eritrita Exterior Agrietados + +Outer Eudialite Stair=Escalera de Eudialita Exterior +Outer Eudialite Brick Stair=Escalera de Ladrillos de Eudialita Exterior +Outer Eudialite Block Stair=Escalera de Bloques de Eudialita Exterior +Outer Cracked Eudialite Brick Stair=Escalera de Ladrillos de Eudialita Exterior Agrietados + +Outer Fluorite Stair=Escalera de Fluorita Exterior +Outer Fluorite Brick Stair=Escalera de Ladrillos de Fluorita Exterior +Outer Fluorite Block Stair=Escalera de Bloques de Fluorita Exterior +Outer Cracked Fluorite Brick Stair=Escalera de Ladrillos de Fluorita Exterior Agrietados + +Outer Gabbro Stair=Escalera de Gabbro Exterior +Outer Cobbled Gabbro Stair=Escalera de Gabbro Exterior Guiada +Outer Gabbro Brick Stair=Escalera de Ladrillos de Gabbro Exterior +Outer Gabbro Block Stair=Escalera de Bloques de Gabbro Exterior +Outer Cracked Gabbro Brick Stair=Escalera de Ladrillos de Gabbro Exterior Agrietados + +Outer Galena Stair=Escalera de Galena Exterior +Outer Galena Brick Stair=Escalera de Ladrillos de Galena Exterior +Outer Galena Block Stair=Escalera de Bloques de Galena Exterior +Outer Cracked Galena Brick Stair=Escalera de Ladrillos de Galena Exterior Agrietados + +Outer Black Granite Stair=Escalera de Granito Negro Exterior +Outer Black Granite Brick Stair=Escalera de Ladrillos de Granito Negro Exterior +Outer Black Granite Block Stair=Escalera de Bloques de Granito Negro Exterior +Outer Cracked Black Granite Brick Stair=Escalera de Ladrillos de Granito Negro Exterior Agrietados +Outer Cobbled Black Granite Stair=Escalera de Granito Negro Exterior Guiada + +Outer Blue Granite Stair=Escalera de Granito Azul Exterior +Outer Blue Granite Brick Stair=Escalera de Ladrillos de Granito Azul Exterior +Outer Blue Granite Block Stair=Escalera de Bloques de Granito Azul Exterior +Outer Cracked Blue Granite Brick Stair=Escalera de Ladrillos de Granito Azul Exterior Agrietados +Outer Cobbled Blue Granite Stair=Escalera de Granito Azul Exterior Guiada + +Outer Gray Granite Stair=Escalera de Granito Gris Exterior +Outer Gray Granite Brick Stair=Escalera de Ladrillos de Granito Gris Exterior +Outer Gray Granite Block Stair=Escalera de Bloques de Granito Gris Exterior +Outer Cracked Gray Granite Brick Stair=Escalera de Ladrillos de Granito Gris Exterior Agrietados +Outer Cobbled Gray Granite Stair=Escalera de Granito Gris Exterior Guiada + +Outer Green Granite Stair=Escalera de Granito Verde Exterior +Outer Green Granite Brick Stair=Escalera de Ladrillos de Granito Verde Exterior +Outer Green Granite Block Stair=Escalera de Bloques de Granito Verde Exterior +Outer Cracked Green Granite Brick Stair=Escalera de Ladrillos de Granito Verde Exterior Agrietados +Outer Cobbled Green Granite Stair=Escalera de Granito Verde Exterior Guiada + +Outer Pink Granite Stair=Escalera de Granito Rosa Exterior +Outer Pink Granite Brick Stair=Escalera de Ladrillos de Granito Rosa Exterior +Outer Pink Granite Block Stair=Escalera de Bloques de Granito Rosa Exterior +Outer Cracked Pink Granite Brick Stair=Escalera de Ladrillos de Granito Rosa Exterior Agrietados +Outer Cobbled Pink Granite Stair=Escalera de Granito Rosa Exterior Guiada + +Outer Red Granite Stair=Escalera de Granito Rojo Exterior +Outer Red Granite Brick Stair=Escalera de Ladrillos de Granito Rojo Exterior +Outer Red Granite Block Stair=Escalera de Bloques de Granito Rojo Exterior +Outer Cracked Red Granite Brick Stair=Escalera de Ladrillos de Granito Rojo Exterior Agrietados +Outer Cobbled Red Granite Stair=Escalera de Granito Rojo Exterior Guiada + +Outer White Granite Stair=Escalera de Granito Blanco Exterior +Outer White Granite Brick Stair=Escalera de Ladrillos de Granito Blanco Exterior +Outer White Granite Block Stair=Escalera de Bloques de Granito Blanco Exterior +Outer Cracked White Granite Brick Stair=Escalera de Ladrillos de Granito Blanco Exterior Agrietados +Outer Cobbled White Granite Stair=Escalera de Granito Blanco Exterior Guiada + +Outer Yellow Granite Stair=Escalera de Granito Amarillo Exterior +Outer Yellow Granite Brick Stair=Escalera de Ladrillos de Granito Amarillo Exterior +Outer Yellow Granite Block Stair=Escalera de Bloques de Granito Amarillo Exterior +Outer Cracked Yellow Granite Brick Stair=Escalera de Ladrillos de Granito Amarillo Exterior Agrietados +Outer Cobbled Yellow Granite Stair=Escalera de Granito Amarillo Exterior Guiada + +Outer Heliodor Stair=Escalera de Heliodoro Exterior +Outer Heliodor Brick Stair=Escalera de Ladrillos de Heliodoro Exterior +Outer Heliodor Block Stair=Escalera de Bloques de Heliodoro Exterior +Outer Cracked Heliodor Brick Stair=Escalera de Ladrillos de Heliodoro Exterior Agrietados + +Outer Howlite Stair=Escalera de Howlita Exterior +Outer Howlite Brick Stair=Escalera de Ladrillos de Howlita Exterior +Outer Howlite Block Stair=Escalera de Bloques de Howlita Exterior +Outer Cracked Howlite Brick Stair=Escalera de Ladrillos de Howlita Exterior Agrietados +Outer Cobbled Howlite Stair=Escalera de Howlita Exterior Guiada + +Outer Ilvaite Stair=Escalera de Ilvaita Exterior +Outer Ilvaite Brick Stair=Escalera de Ladrillos de Ilvaita Exterior +Outer Ilvaite Block Stair=Escalera de Bloques de Ilvaita Exterior +Outer Cracked Ilvaite Brick Stair=Escalera de Ladrillos de Ilvaita Exterior Agrietados +Outer Cobbled Ilvaite Stair=Escalera de Ilvaita Exterior Guiada + +Outer Jade Stair=Escalera de Jade Exterior +Outer Jade Brick Stair=Escalera de Ladrillos de Jade Exterior +Outer Jade Block Stair=Escalera de Bloques de Jade Exterior +Outer Cracked Jade Brick Stair=Escalera de Ladrillos de Jade Exterior Agrietados +Outer Cobbled Jade Stair=Escalera de Jade Exterior Guiada + +Outer Red Jasper Stair=Escalera Externa de Jaspe Rojo +Outer Red Jasper Brick Stair=Escalera Externa de Ladrillo de Jaspe Rojo +Outer Red Jasper Block Stair=Escalera Externa de Bloque de Jaspe Rojo +Outer Cracked Red Jasper Brick Stair=Escalera Externa de Ladrillo de Jaspe Rojo Agrietado +Outer Cobbled Red Jasper Stair=Escalera Externa de Jaspe Rojo Guijarreado + +Outer Kyanite Stair=Escalera de Cianita Exterior +Outer Kyanite Brick Stair=Escalera de Ladrillos de Cianita Exterior +Outer Kyanite Block Stair=Escalera de Bloques de Cianita Exterior +Outer Cracked Kyanite Brick Stair=Escalera de Ladrillos de Cianita Exterior Agrietados +Outer Cobbled Kyanite Stair=Escalera de Cianita Exterior Guiada + +Outer Lapis Lazuli Stair=Escalera de Lapislázuli Exterior +Outer Lapis Lazuli Brick Stair=Escalera de Ladrillos de Lapislázuli Exterior +Outer Lapis Lazuli Block Stair=Escalera de Bloques de Lapislázuli Exterior +Outer Cracked Lapis Lazuli Brick Stair=Escalera de Ladrillos de Lapislázuli Exterior Agrietados + +Outer Lepidolite Stair=Escalera Externa de Lepidolita +Outer Lepidolite Brick Stair=Escalera Externa de Ladrillo de Lepidolita +Outer Lepidolite Block Stair=Escalera Externa de Bloque de Lepidolita +Outer Cracked Lepidolite Brick Stair=Escalera Externa de Ladrillo de Lepidolita Agrietado +Outer Cobbled Lepidolite Stair=Escalera Externa de Lepidolita Guijarreada + +Outer Blue Limestone Stair=Escalera de Piedra Caliza Azul Exterior +Outer Blue Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Azul Exterior +Outer Blue Limestone Block Stair=Escalera de Bloques de Piedra Caliza Azul Exterior +Outer Cracked Blue Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Azul Exterior Agrietados +Outer Cobbled Blue Limestone Stair=Escalera de Piedra Caliza Azul Exterior Guiada + +Outer White Limestone Stair=Escalera de Piedra Caliza Blanca Exterior +Outer White Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Blanca Exterior +Outer White Limestone Block Stair=Escalera de Bloques de Piedra Caliza Blanca Exterior +Outer Cracked White Limestone Brick Stair=Escalera de Ladrillos de Piedra Caliza Blanca Exterior Agrietados +Outer Cobbled White Limestone Stair=Escalera de Piedra Caliza Blanca Exterior Guiada + +Outer Marble Stair=Escalera de Mármol Exterior +Outer Marble Brick Stair=Escalera de Ladrillos de Mármol Exterior +Outer Marble Block Stair=Escalera de Bloques de Mármol Exterior +Outer Cracked Marble Brick Stair=Escalera de Ladrillos de Mármol Exterior Agrietados +Outer Cobbled Marble Stair=Escalera de Mármol Exterior Guiada + +Outer Moonstone Stair=Escalera Externa de Piedra Lunar +Outer Moonstone Brick Stair=Escalera Externa de Ladrillo de Piedra Lunar +Outer Moonstone Block Stair=Escalera Externa de Bloque de Piedra Lunar +Outer Cracked Moonstone Brick Stair=Escalera Externa de Ladrillo de Piedra Lunar Agrietado + +Outer Morion Quartz Stair=Escalera de Cuarzo Morión Exterior +Outer Morion Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Morión Exterior +Outer Morion Quartz Block Stair=Escalera de Bloques de Cuarzo Morión Exterior +Outer Cracked Morion Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Morión Exterior Agrietados + +Outer Mudstone Stair=Escalera de Mudstone Exterior +Outer Cobbled Mudstone Stair=Escalera de Mudstone Exterior Guiada +Outer Mudstone Brick Stair=Escalera de Ladrillos de Mudstone Exterior +Outer Mudstone Block Stair=Escalera de Bloques de Mudstone Exterior +Outer Cracked Mudstone Brick Stair=Escalera de Ladrillos de Mudstone Exterior Agrietados + +Outer Prasiolite Stair=Escalera de Prasiolita Exterior +Outer Prasiolite Brick Stair=Escalera de Ladrillos de Prasiolita Exterior +Outer Prasiolite Block Stair=Escalera de Bloques de Prasiolita Exterior +Outer Cracked Prasiolite Brick Stair=Escalera de Ladrillos de Prasiolita Exterior Agrietados + +Outer Pumice Stair=Escalera de Pómez Exterior +Outer Pumice Brick Stair=Escalera de Ladrillos de Pómez Exterior +Outer Pumice Block Stair=Escalera de Bloques de Pómez Exterior +Outer Cracked Pumice Brick Stair=Escalera de Ladrillos de Pómez Exterior Agrietados + +Outer Pyrite Stair=Escalera de Pirita Exterior +Outer Pyrite Brick Stair=Escalera de Ladrillos de Pirita Exterior +Outer Pyrite Block Stair=Escalera de Bloques de Pirita Exterior +Outer Cracked Pyrite Brick Stair=Escalera de Ladrillos de Pirita Exterior Agrietados + +Outer Quartz Stair=Escalera de Cuarzo Exterior +Outer Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Exterior +Outer Quartz Block Stair=Escalera de Bloques de Cuarzo Exterior +Outer Cracked Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Exterior Agrietados + +Outer Rhodonite Stair=Escalera Externa de Rodonita +Outer Rhodonite Brick Stair=Escalera Externa de Ladrillo de Rodonita +Outer Rhodonite Block Stair=Escalera Externa de Bloque de Rodonita +Outer Cracked Rhodonite Brick Stair=Escalera Externa de Ladrillo de Rodonita Agrietado +Outer Cobbled Rhodonite Stair=Escalera Externa de Rodonita Guijarreada + +Outer Rose Quartz Stair=Escalera de Cuarzo Rosa Exterior +Outer Rose Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Rosa Exterior +Outer Rose Quartz Block Stair=Escalera de Bloques de Cuarzo Rosa Exterior +Outer Cracked Rose Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Rosa Exterior Agrietados + +Outer Scoria Stair=Escalera de Escoria Exterior +Outer Scoria Brick Stair=Escalera de Ladrillos de Escoria Exterior +Outer Scoria Block Stair=Escalera de Bloques de Escoria Exterior +Outer Cracked Scoria Brick Stair=Escalera de Ladrillos de Escoria Exterior Agrietados +Outer Cobbled Scoria Stair=Escalera de Escoria Exterior Guiada + +Outer Serpentine Stair=Escalera de Serpentina Exterior +Outer Cobbled Serpentine Stair=Escalera de Serpentina Exterior Guiada +Outer Serpentine Brick Stair=Escalera de Ladrillos de Serpentina Exterior +Outer Serpentine Block Stair=Escalera de Bloques de Serpentina Exterior +Outer Cracked Serpentine Brick Stair=Escalera de Ladrillos de Serpentina Exterior Agrietados + +Outer Shale Stair=Escalera de Pizarra Exterior +Outer Shale Brick Stair=Escalera de Ladrillos de Pizarra Exterior +Outer Shale Block Stair=Escalera de Bloques de Pizarra Exterior +Outer Cracked Shale Brick Stair=Escalera de Ladrillos de Pizarra Exterior Agrietados +Outer Cobbled Shale Stair=Escalera de Pizarra Exterior Guiada + +Outer Slate Stair=Escalera de Pizarra Exterior +Outer Slate Brick Stair=Escalera de Ladrillos de Pizarra Exterior +Outer Slate Block Stair=Escalera de Bloques de Pizarra Exterior +Outer Cracked Slate Brick Stair=Escalera de Ladrillos de Pizarra Exterior Agrietados +Outer Cobbled Slate Stair=Escalera de Pizarra Exterior Guiada +Outer Slate Tile Stair=Escalera de Azulejos de Pizarra Exterior + +Outer Smokey Quartz Stair=Escalera de Cuarzo Ahumado Exterior +Outer Smokey Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Ahumado Exterior +Outer Smokey Quartz Block Stair=Escalera de Bloques de Cuarzo Ahumado Exterior +Outer Cracked Smokey Quartz Brick Stair=Escalera de Ladrillos de Cuarzo Ahumado Exterior Agrietados + +Outer Soapstone Stair=Escalera de Esteatita Exterior +Outer Soapstone Brick Stair=Escalera de Ladrillos de Esteatita Exterior +Outer Soapstone Block Stair=Escalera de Bloques de Esteatita Exterior +Outer Cracked Soapstone Brick Stair=Escalera de Ladrillos de Esteatita Exterior Agrietados + +Outer Sodalite Stair=Escalera de Sodalita Exterior +Outer Cobbled Sodalite Stair=Escalera de Sodalita Exterior Guiada +Outer Sodalite Brick Stair=Escalera de Ladrillos de Sodalita Exterior +Outer Sodalite Block Stair=Escalera de Bloques de Sodalita Exterior +Outer Cracked Sodalite Brick Stair=Escalera de Ladrillos de Sodalita Exterior Agrietados + +Outer Sugilite Stair=Escalera de Sugilita Exterior +Outer Sugilite Brick Stair=Escalera de Ladrillos de Sugilita Exterior +Outer Sugilite Block Stair=Escalera de Bloques de Sugilita Exterior +Outer Cracked Sugilite Brick Stair=Escalera de Ladrillos de Sugilita Exterior Agrietados +Outer Cobbled Sugilite Stair=Escalera de Sugilita Exterior Guiada + +Outer Green Tourmaline Stair=Escalera Externa de Turmalina Verde +Outer Green Tourmaline Brick Stair=Escalera Externa de Ladrillo de Turmalina Verde +Outer Green Tourmaline Block Stair=Escalera Externa de Bloque de Turmalina Verde +Outer Cracked Green Tourmaline Brick Stair=Escalera Externa de Ladrillo de Turmalina Verde Agrietado + +Outer Paraiba Tourmaline Stair=Escalera Externa de Turmalina Paraíba +Outer Paraiba Tourmaline Brick Stair=Escalera Externa de Ladrillo de Turmalina Paraíba +Outer Paraiba Tourmaline Block Stair=Escalera Externa de Bloque de Turmalina Paraíba +Outer Cracked Paraiba Tourmaline Brick Stair=Escalera Externa de Ladrillo de Turmalina Paraíba Agrietado + +Outer Pink Tourmaline Stair=Escalera Externa de Turmalina Rosa +Outer Pink Tourmaline Brick Stair=Escalera Externa de Ladrillo de Turmalina Rosa +Outer Pink Tourmaline Block Stair=Escalera Externa de Bloque de Turmalina Rosa +Outer Cracked Pink Tourmaline Brick Stair=Escalera Externa de Ladrillo de Turmalina Rosa Agrietado + +Outer Travertine Stair=Escalera de Travertino Exterior +Outer Cobbled Travertine Stair=Escalera de Travertino Exterior Guiada +Outer Travertine Brick Stair=Escalera de Ladrillos de Travertino Exterior +Outer Travertine Block Stair=Escalera de Bloques de Travertino Exterior +Outer Cracked Travertine Brick Stair=Escalera de Ladrillos de Travertino Exterior Agrietados + +Outer Yellow Travertine Stair=Escalera de Travertino Amarillo Exterior +Outer Cobbled Yellow Travertine Stair=Escalera de Travertino Amarillo Exterior Guiada +Outer Yellow Travertine Brick Stair=Escalera de Ladrillos de Travertino Amarillo Exterior +Outer Yellow Travertine Block Stair=Escalera de Bloques de Travertino Amarillo Exterior +Outer Cracked Yellow Travertine Brick Stair=Escalera de Ladrillos de Travertino Amarillo Exterior Agrietados + +Outer Beige Tuff Stair=Escalera de Toba Beige Exterior +Outer Cobbled Beige Tuff Stair=Escalera de Toba Beige Exterior Guiada +Outer Beige Tuff Brick Stair=Escalera de Ladrillos de Toba Beige Exterior +Outer Beige Tuff Block Stair=Escalera de Bloques de Toba Beige Exterior +Outer Cracked Beige Tuff Brick Stair=Escalera de Ladrillos de Toba Beige Exterior Agrietados + +Outer Grey Tuff Stair=Escalera de Toba Gris Exterior +Outer Cobbled Grey Tuff Stair=Escalera de Toba Gris Exterior Guiada +Outer Grey Tuff Brick Stair=Escalera de Ladrillos de Toba Gris Exterior +Outer Grey Tuff Block Stair=Escalera de Bloques de Toba Gris Exterior +Outer Cracked Grey Tuff Brick Stair=Escalera de Ladrillos de Toba Gris Exterior Agrietados + +Outer Red Tuff Stair=Escalera de Toba Roja Exterior +Outer Cobbled Red Tuff Stair=Escalera de Toba Roja Exterior Guiada +Outer Red Tuff Brick Stair=Escalera de Ladrillos de Toba Roja Exterior +Outer Red Tuff Block Stair=Escalera de Bloques de Toba Roja Exterior +Outer Cracked Red Tuff Brick Stair=Escalera de Ladrillos de Toba Roja Exterior Agrietados + +Outer Turquoise Stair=Escalera de Turquesa Exterior +Outer Turquoise Brick Stair=Escalera de Ladrillos de Turquesa Exterior +Outer Turquoise Block Stair=Escalera de Bloques de Turquesa Exterior +Outer Cracked Turquoise Brick Stair=Escalera de Ladrillos de Turquesa Exterior Agrietados +Outer Cobbled Turquoise Stair=Escalera de Turquesa Exterior Guiada + +Outer Vivianite Stair=Escalera de Vivianita Exterior +Outer Vivianite Brick Stair=Escalera de Ladrillos de Vivianita Exterior +Outer Vivianite Block Stair=Escalera de Bloques de Vivianita Exterior +Outer Cracked Vivianite Brick Stair=Escalera de Ladrillos de Vivianita Exterior Agrietados + +### nodes_glowing.lua ### + +Glowing Apatite=Apatito Brillante +Glowing Apatite Block=Bloque de Apatito Brillante +Cobbled Glowing Apatite=Apatito Brillante Enlosado +Glowing Apatite Brick=Ladrillo de Apatito Brillante +Cracked Glowing Apatite Brick=Ladrillo Agrietado de Apatito Brillante + +Glowing Calcite=Calcita Brillante +Glowing Calcite Block=Bloque de Calcita Brillante +Cobbled Glowing Calcite=Calcita Brillante Enlosada +Glowing Calcite Brick=Ladrillo de Calcita Brillante +Cracked Glowing Calcite Brick=Ladrillo Agrietado de Calcita Brillante + +Glowing Esperite=Esperita Brillante +Glowing Esperite Block=Bloque de Esperita Brillante +Cobbled Glowing Esperite=Esperita Brillante Enlosada +Glowing Esperite Brick=Ladrillo de Esperita Brillante +Cracked Glowing Esperite Brick=Ladrillo Agrietado de Esperita Brillante + +Glowing Fluorite=Fluorita Brillante +Glowing Fluorite Block=Bloque de Fluorita Brillante +Cobbled Glowing Fluorite=Fluorita Brillante Enlosada +Glowing Fluorite Brick=Ladrillo de Fluorita Brillante +Cracked Glowing Fluorite Brick=Ladrillo Agrietado de Fluorita Brillante + +Glowing Selenite=Selenita Brillante +Glowing Selenite Block=Bloque de Selenita Brillante +Cobbled Glowing Selenite=Selenita Brillante Enlosada +Glowing Selenite Brick=Ladrillo de Selenita Brillante +Cracked Glowing Selenite Brick=Ladrillo Agrietado de Selenita Brillante + +Glowing Sodalite=Sodalita Brillante +Glowing Sodalite Block=Bloque de Sodalita Brillante +Cobbled Glowing Sodalite=Sodalita Brillante Enlosada +Glowing Sodalite Brick=Ladrillo de Sodalita Brillante +Cracked Glowing Sodalite Brick=Ladrillo Agrietado de Sodalita Brillante + +Glowing Willemite=Willemite Brillante +Glowing Willemite Block=Bloque de Willemite Brillante +Cobbled Glowing Willemite=Willemite Brillante Enlosada +Glowing Willemite Brick=Ladrillo de Willemite Brillante +Cracked Glowing Willemite Brick=Ladrillo Agrietado de Willemite Brillante + +### nodes_crystal.lua ### + +Budding Amazonite=Amazonita Brotante +Amazonite Crystal=Cristal de Amazonita + +Budding Amber=Ãmbar Brotante +Amber Crystal=Cristal de Ãmbar + +Budding Amethyst=Amatista Brotante +Amethyst Crystal=Cristal de Amatista + +Budding Celestine=Celestina Brotante +Celestine Crystal=Cristal de Celestina + +Budding Chalcanthite=Chalkantita Brotante +Chalcanthite Crystal=Cristal de Chalkantita + +Budding Citrine=Citrino Brotante +Citrine Crystal=Cristal de Citrino + +Budding Crocoite=Crocoita Brotante +Crocoite Crystal=Cristal de Crocoita + +Budding Eudialite=Eudialita Brotante +Eudialite Crystal=Cristal de Eudialita + +Budding Heliodor=Heliodoro Brotante +Heliodor Crystal=Cristal de Heliodoro + +Budding Kyanite=Cianita Brotante +Kyanite Crystal=Cristal de Cianita + +Budding Moonstone=Piedra Lunar Brotante +Moonstone Crystal=Cristal de Piedra Lunar + +Budding Morion Quartz=Cuarzo Morión Brotante +Morion Quartz Crystal=Cristal de Cuarzo Morión + +Budding Prasiolite=Prasiolita Brotante +Prasiolite Crystal=Cristal de Prasiolita + +Budding Quartz=Cuarzo Brotante +Quartz Crystal=Cristal de Cuarzo + +Budding Rose Quartz=Cuarzo Rosa Brotante +Rose Quartz Crystal=Cristal de Cuarzo Rosa + +Budding Smokey Quartz=Cuarzo Ahumado Brotante +Smokey Quartz Crystal=Cristal de Cuarzo Ahumado + +Budding Green Tourmaline=Turmalina Verde Brotante +Green Tourmaline Crystal=Cristal de Turmalina Verde + +Budding Paraiba Tourmaline=Turmalina Paraíba Brotante +Paraiba Tourmaline Crystal=Cristal de Turmalina Paraíba + +Budding Pink Tourmaline=Turmalina Rosa Brotante +Pink Tourmaline Crystal=Cristal de Turmalina Rosa + +Budding Vivianite=Vivianita Brotante +Vivianite Crystal=Cristal de Vivianita diff --git a/mods/too_many_stones/locale/too_many_stones.fr.tr b/mods/too_many_stones/locale/too_many_stones.fr.tr new file mode 100644 index 00000000..62a4c999 --- /dev/null +++ b/mods/too_many_stones/locale/too_many_stones.fr.tr @@ -0,0 +1,2466 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate=Agate bleue +Gray Agate=Agate grise +Green Agate=Agate verte +Moss Agate=Agate mousse +Orange Agate=Agate orange +Purple Agate=Agate violette +Red Agate=Agate rouge + +Amazonite=Amazonite +Amazonite Block=Bloc d'Amazonite +Cobbled Amazonite=Pierre d'Amazonite +Amazonite Brick=Brique d'Amazonite +Cracked Amazonite Brick=Brique d'Amazonite Fissurée + +Amber=Ambre +Amber Block=Bloc d'Ambre +Amber Brick=Brique d'Ambre +Cracked Amber Brick=Brique d'Ambre Fissurée + +Amethyst=Améthyste +Amethyst Block=Bloc d'Améthyste +Amethyst Brick=Brique d'Améthyste +Cracked Amethyst Brick=Brique d'Améthyste Fissurée + +Ammolite=Ammolite + +Andesite=Andésite +Andesite Block=Bloc d'andésite +Andesite Brick=Brique d'andésite +Cracked Andesite Brick=Brique d'andésite fissurée +Cobbled Andesite=Pierre d'Andésite + +Basalt=Basalte +Basalt Block=Bloc de basalte +Basalt Brick=Brique de basalte +Cracked Basalt Brick=Brique de basalte fissurée +Cobbled Basalt=Pavé en basalte +Basalt Tile=Tuile en basalte + +Batch=Mélange pour verre + +Columnar Basalt=Basalte en colonne + +Black Opal=Opale Noire + +Grey Calcite=Calcite Grise +Grey Calcite Block=Bloc de Calcite Grise +Grey Calcite Brick=Brique de Calcite Grise +Cracked Grey Calcite Brick=Brique de Calcite Grise Fissurée + +Calcite=Calcite +Calcite Block=Bloc de Calcite +Calcite Brick=Brique de Calcite +Cracked Calcite Brick=Brique de Calcite Fissurée + +Orange Calcite=Calcite Orange +Orange Calcite Block=Bloc de Calcite Orange +Orange Calcite Brick=Brique de Calcite Orange +Cracked Orange Calcite Brick=Brique de Calcite Orange Fissurée + +Carnotite=Carnotite +Carnotite Block=Bloc de Carnotite +Carnotite Brick=Brique de Carnotite +Cracked Carnotite Brick=Brique de Carnotite Fissurée +Cobbled Carnotite=Pierre de Carnotite + +Celestine=Célestine +Celestine Block=Bloc de Célestine +Celestine Brick=Brique de Célestine +Cracked Celestine Brick=Brique de Célestine Fissurée + +Chalcanthite=Chalcanthite +Chalcanthite Block=Bloc de Chalcanthite +Chalcanthite Brick=Brique de Chalcanthite +Cracked Chalcanthite Brick=Brique de Chalcanthite Fissurée +Cobbled Chalcanthite=Chalcanthite Pavée + +Chrysoprase=Chrysoprase +Chrysoprase Block=Bloc de Chrysoprase +Chrysoprase Brick=Brique de Chrysoprase +Cracked Chrysoprase Brick=Brique de Chrysoprase Fissurée + +Citrine=Citrine +Citrine Block=Bloc de citrine +Citrine Brick=Brique de citrine +Cracked Citrine Brick=Brique de citrine fissurée + +Covellite=Covellite +Covellite Block=Bloc de covellite +Covellite Brick=Brique de covellite +Cracked Covellite Brick=Brique de covellite fissurée +Cobbled Covellite=Covellite pavé + +Crocoite=Crocoïte +Crocoite Block=Bloc de crocoïte +Crocoite Brick=Brique de crocoïte +Cracked Crocoite Brick=Brique de crocoïte fissurée + +Diorite=Diorite +Diorite Block=Bloc de diorite +Diorite Brick=Brique de diorite +Cracked Diorite Brick=Brique de diorite fissurée +Cobbled Diorite=Diorite pavé + +Erythrite=Érythrite +Erythrite Block=Bloc d'érythrite +Erythrite Brick=Brique d'érythrite +Cracked Erythrite Brick=Brique d'érythrite fissurée + +Eudialite=Eudialite +Eudialite Block=Bloc d'eudialite +Eudialite Brick=Brique d'eudialite +Cracked Eudialite Brick=Brique d'eudialite fissurée + +Fluorite=Fluorite +Fluorite Block=Bloc de fluorite +Fluorite Brick=Brique de fluorite +Cracked Fluorite Brick=Brique de fluorite fissurée + +Fire Opal=Opale de feu + +Gabbro=Gabbro +Gabbro Block=Bloc de gabbro +Cobbled Gabbro=Gabbro pavé +Gabbro Brick=Brique de gabbro +Cracked Gabbro Brick=Brique de gabbro fissurée + +Galena=Galène +Galena Block=Bloc de galène +Galena Brick=Brique de galène +Cracked Galena Brick=Brique de galène fissurée + +Black Granite=Granite noir +Black Granite Block=Bloc de granite noir +Black Granite Brick=Brique de granite noir +Cracked Black Granite Brick=Brique de granite noir fissurée +Cobbled Black Granite=Granite noir pavé + +Blue Granite=Granit bleu +Blue Granite Block=Bloc de granit bleu +Blue Granite Brick=Brique de granit bleu +Cracked Blue Granite Brick=Brique de granit bleu fissurée +Cobbled Blue Granite=Granite bleu pavé + +Gray Granite=Granit gris +Gray Granite Block=Bloc de granit gris +Gray Granite Brick=Brique de granit gris +Cracked Gray Granite Brick=Brique de granit gris fissurée +Cobbled Gray Granite=Granite gris pavé + +Green Granite=Granit vert +Green Granite Block=Bloc de granit vert +Green Granite Brick=Brique de granit vert +Cracked Green Granite Brick=Brique de granit vert fissurée +Cobbled Green Granite=Granite vert pavé + +Pink Granite=Granit rose +Pink Granite Block=Bloc de granit rose +Pink Granite Brick=Brique de granit rose +Cracked Pink Granite Brick=Brique de granit rose fissurée +Cobbled Pink Granite=Granite rose pavé + +Red Granite=Granit rouge +Red Granite Block=Bloc de granit rouge +Red Granite Brick=Brique de granit rouge +Cracked Red Granite Brick=Brique de granit rouge fissurée +Cobbled Red Granite=Granite rouge pavé + +White Granite=Granit blanc +White Granite Block=Bloc de granit blanc +White Granite Brick=Brique de granit blanc +Cracked White Granite Brick=Brique de granit blanc fissurée +Cobbled White Granite=Granite blanc pavé + +Yellow Granite=Granit jaune +Yellow Granite Block=Bloc de granit jaune +Yellow Granite Brick=Brique de granit jaune +Cracked Yellow Granite Brick=Brique de granit jaune fissurée +Cobbled Yellow Granite=Granite jaune pavé + +Heliodor=Héliodore +Heliodor Block=Bloc d'héliodore +Heliodor Brick=Brique d'héliodore +Cracked Heliodor Brick=Brique d'héliodore fissurée + +Howlite=Howlite +Howlite Block=Bloc de howlite +Howlite Brick=Brique de howlite +Cracked Howlite Brick=Brique de howlite fissurée +Cobbled Howlite=Pavé de howlite + +Ilvaite=Ilvaïte +Ilvaite Block=Bloc d'ilvaïte +Ilvaite Brick=Brique d'ilvaïte +Cracked Ilvaite Brick=Brique d'ilvaïte fissurée +Cobbled Ilvaite=Pavé d'ilvaïte + +Jade=Jade +Jade Block=Bloc de jade +Jade Brick=Brique de jade +Cracked Jade Brick=Brique de jade fissurée +Cobbled Jade=Pavé de jade + +Red Jasper=Jaspe Rouge +Red Jasper Block=Bloc de Jaspe Rouge +Red Jasper Brick=Brique de Jaspe Rouge +Cracked Red Jasper Brick=Brique de Jaspe Rouge Fissurée +Cobbled Red Jasper=Jaspe Rouge Pavé + +Kyanite=Kyanite +Kyanite Block=Bloc de kyanite +Kyanite Brick=Brique de kyanite +Cracked Kyanite Brick=Brique de kyanite fissurée +Cobbled Kyanite=Pavé de kyanite + +Lapis Lazuli=Lapis-lazuli +Lapis Lazuli Block=Bloc de lapis-lazuli +Lapis Lazuli Brick=Brique de lapis-lazuli +Cracked Lapis Lazuli Brick=Brique de lapis-lazuli fissurée + +Lepidolite=Lépidolite +Lepidolite Block=Bloc de Lépidolite +Lepidolite Brick=Brique de Lépidolite +Cracked Lepidolite Brick=Brique de Lépidolite Fissurée +Cobbled Lepidolite=Lépidolite Pavée + +Blue Limestone=Limestone bleue +Blue Limestone Block=Bloc de limestone bleue +Blue Limestone Brick=Brique de limestone bleue +Cracked Blue Limestone Brick=Brique de limestone bleue fissurée +Cobbled Blue Limestone=Pavé de limestone bleue + +White Limestone=Limestone blanc +White Limestone Block=Bloc de limestone blanc +White Limestone Brick=Brique de limestone blanc +Cracked White Limestone Brick=Brique de limestone blanc fissurée +Cobbled White Limestone=Pavé de limestone blanc + +Marble=Marbre +Marble Block=Bloc de marbre +Marble Brick=Brique de marbre +Cracked Marble Brick=Brique de marbre fissurée +Cobbled Marble=Pavé de marbre + +Moonstone=Pierre de Lune +Moonstone Block=Bloc de Pierre de Lune +Moonstone Brick=Brique de Pierre de Lune +Cracked Moonstone Brick=Brique de Pierre de Lune Fissurée + +Morion Quartz=Quartz morion +Morion Quartz Block=Bloc de quartz morion +Morion Quartz Brick=Brique de quartz morion +Cracked Morion Quartz Brick=Brique de quartz morion fissurée + +Mudstone=Mudstone +Mudstone Block=Bloc de mudstone +Cobbled Mudstone=Pavé de mudstone +Mudstone Brick=Brique de mudstone +Cracked Mudstone Brick=Brique de mudstone fissurée + +Opal=Opale + +Picture Jasper=Jaspe Paysage + +Prasiolite=Prasiolite +Prasiolite Block=Bloc de prasiolite +Prasiolite Brick=Brique de prasiolite +Cracked Prasiolite Brick=Brique de prasiolite fissurée + +Pumice=Ponce +Pumice Block=Bloc de ponce +Pumice Brick=Brique de ponce +Cracked Pumice Brick=Brique de ponce fissurée + +Pyrite=Pyrite +Pyrite Block=Bloc de pyrite +Cobbled Pyrite=Pyrite pavée +Pyrite Brick=Brique de pyrite +Cracked Pyrite Brick=Brique de pyrite fissurée + +Quartz=Quartz +Quartz Block=Bloc de quartz +Quartz Brick=Brique de quartz +Cracked Quartz Brick=Brique de quartz fissurée + +Rose Quartz=Quartz rose +Rose Quartz Block=Bloc de quartz rose +Rose Quartz Brick=Brique de quartz rose +Cracked Rose Quartz Brick=Brique de quartz rose fissurée + +Rhodonite=Rhodonite +Rhodonite Block=Bloc de Rhodonite +Rhodonite Brick=Brique de Rhodonite +Cracked Rhodonite Brick=Brique de Rhodonite Fissurée +Cobbled Rhodonite=Rhodonite Pavée + +Scoria=Scorie +Scoria Block=Bloc de scorie +Scoria Brick=Brique de scorie +Cracked Scoria Brick=Brique de scorie fissurée +Cobbled Scoria=Scorie pavée + +Serpentine=Serpentine +Serpentine Block=Bloc de serpentine +Cobbled Serpentine=Serpentine pavée +Serpentine Brick=Brique de serpentine +Cracked Serpentine Brick=Brique de serpentine fissurée + +Shale=Schiste +Shale Block=Bloc de schiste +Shale Brick=Brique de schiste +Cracked Shale Brick=Brique de schiste fissurée +Cobbled Shale=Schiste pavé + +Slate=Ardoise +Slate Block=Bloc d'ardoise +Slate Brick=Brique d'ardoise +Cracked Slate Brick=Brique d'ardoise fissurée +Cobbled Slate=Ardoise pavée +Slate Tile=Tuile en ardoise + +Smokey Quartz=Quartz fumé +Smokey Quartz Block=Bloc de quartz fumé +Smokey Quartz Brick=Brique de quartz fumé +Cracked Smokey Quartz Brick=Brique de quartz fumé fissurée + +Soapstone=Stéatite +Soapstone Block=Bloc de stéatite +Soapstone Brick=Brique de stéatite +Cracked Soapstone Brick=Brique de stéatite fissurée + +Sodalite=Sodalite +Sodalite Block=Bloc de sodalite +Cobbled Sodalite=Sodalite pavée +Sodalite Brick=Brique de sodalite +Cracked Sodalite Brick=Brique de sodalite fissurée + +Sugilite=Sugilite +Sugilite Block=Bloc de sugilite +Sugilite Brick=Brique de sugilite +Cracked Sugilite Brick=Brique de sugilite fissurée +Cobbled Sugilite=Sugilite pavée + +Green Tourmaline=Tourmaline Verte +Green Tourmaline Block=Bloc de Tourmaline Verte +Green Tourmaline Brick=Brique de Tourmaline Verte +Cracked Green Tourmaline Brick=Brique de Tourmaline Verte Fissurée + +Paraiba Tourmaline=Tourmaline Paraíba +Paraiba Tourmaline Block=Bloc de Tourmaline Paraíba +Paraiba Tourmaline Brick=Brique de Tourmaline Paraíba +Cracked Paraiba Tourmaline Brick=Brique de Tourmaline Paraíba Fissurée + +Pink Tourmaline=Tourmaline Rose +Pink Tourmaline Block=Bloc de Tourmaline Rose +Pink Tourmaline Brick=Brique de Tourmaline Rose +Cracked Pink Tourmaline Brick=Brique de Tourmaline Rose Fissurée + +Travertine=Travertin +Travertine Block=Bloc de travertin +Cobbled Travertine=Travertin pavé +Travertine Brick=Brique de travertin +Cracked Travertine Brick=Brique de travertin fissurée + +Yellow Travertine=Travertin jaune +Yellow Travertine Block=Bloc de travertin jaune +Cobbled Yellow Travertine=Travertin pavé +Yellow Travertine Brick=Brique de travertin jaune +Cracked Yellow Travertine Brick=Brique de travertin jaune fissurée + +Beige Tuff=Tuf beige +Beige Tuff Block=Bloc de tuf beige +Cobbled Beige Tuff=Tuf beige pavé +Beige Tuff Brick=Brique de tuf beige +Cracked Beige Tuff=Tuf beige craquelé + +Grey Tuff=Tuf gris +Grey Tuff Block=Bloc de tuf gris +Cobbled Grey Tuff=Tuf gris pavé +Grey Tuff Brick=Brique de tuf gris +Cracked Grey Tuff=Tuf gris craquelé + +Red Tuff=Tuf rouge +Red Tuff Block=Bloc de tuf rouge +Cobbled Red Tuff=Tuf rouge pavé +Red Tuff Brick=Brique de tuf rouge +Cracked Red Tuff=Tuf rouge craquelé + +Turquoise=Turquoise +Turquoise Block=Bloc de turquoise +Turquoise Brick=Brique de turquoise +Cracked Turquoise Brick=Brique de turquoise fissurée +Cobbled Turquoise=Turquoise pavée +Turquoise Pebble=Galet de turquoise + +Vivianite=Vivianite +Vivianite Block=Bloc de vivianite +Vivianite Brick=Brique de vivianite +Cracked Vivianite Brick=Brique de vivianite fissurée + +### wall.lua ### + +Blue Agate Wall=Mur en Agate bleue +Gray Agate Wall=Mur en Agate grise +Green Agate Wall=Mur en Agate verte +Moss Agate Wall=Mur en Agate mousse +Orange Agate Wall=Mur en Agate orange +Purple Agate Wall=Mur en Agate violette +Red Agate Wall=Mur en Agate rouge + +Amazonite Wall=Mur en Amazonite +Cobbled Amazonite Wall=Mur en pavé d'Amazonite +Amazonite Brick Wall=Mur en brique d'Amazonite +Amazonite Block Wall=Mur en bloc d'Amazonite +Cracked Amazonite Brick Wall=Mur en brique d'Amazonite fissurée + +Amber Wall=Mur en ambre +Amber Brick Wall=Mur en brique d'ambre +Amber Block Wall=Mur en bloc d'ambre +Cracked Amber Brick Wall=Mur en brique d'ambre fissurée + +Amethyst Wall=Mur en améthyste +Amethyst Brick Wall=Mur en brique d'améthyste +Amethyst Block Wall=Mur en bloc d'améthyste +Cracked Amethyst Brick Wall=Mur en brique d'améthyste fissurée + +Andesite Wall=Mur en andésite +Andesite Block Wall=Mur en bloc d'andésite +Andesite Brick Wall=Mur en brique d'andésite +Cracked Andesite Brick Wall=Mur en brique d'andésite fissurée +Cobbled Andesite Wall=Mur en pavé d'andésite + +Basalt Wall=Mur en basalte +Basalt Brick Wall=Mur en brique de basalte +Basalt Block Wall=Mur en bloc de basalte +Cracked Basalt Brick Wall=Mur en brique de basalte fissurée +Cobbled Basalt Wall=Mur en pavé de basalte +Basalt Tile Wall=Mur en tuile de basalte + +Black Moonstone Wall=Mur en pierre de lune noire +Black Moonstone Brick Wall=Mur en brique de pierre de lune noire +Black Moonstone Block Wall=Mur en bloc de pierre de lune noire +Cracked Black Moonstone Brick Wall=Mur en brique de pierre de lune noire fissurée + +Grey Calcite Wall=Mur de Calcite Grise +Grey Calcite Brick Wall=Mur de Brique de Calcite Grise +Grey Calcite Block Wall=Mur de Bloc de Calcite Grise +Cracked Grey Calcite Brick Wall=Mur de Brique de Calcite Grise Fissurée + +Calcite Wall=Mur en calcite +Calcite Brick Wall=Mur en brique de calcite +Calcite Block Wall=Mur en bloc de calcite +Cracked Calcite Brick Wall=Mur en brique de calcite fissurée + +Orange Calcite Wall=Mur de Calcite Orange +Orange Calcite Brick Wall=Mur de Brique de Calcite Orange +Orange Calcite Block Wall=Mur de Bloc de Calcite Orange +Cracked Orange Calcite Brick Wall=Mur de Brique de Calcite Orange Fissurée + +Carnotite Wall=Mur en carnotite +Carnotite Brick Wall=Mur en brique de carnotite +Carnotite Block Wall=Mur en bloc de carnotite +Cracked Carnotite Brick Wall=Mur en brique de carnotite fissurée +Cobbled Carnotite Wall=Mur en pavé de carnotite + +Celestine Wall=Mur en célestine +Celestine Brick Wall=Mur en brique de célestine +Celestine Block Wall=Mur en bloc de célestine +Cracked Celestine Brick Wall=Mur en brique de célestine fissurée + +Chalcanthite Wall=Mur de Chalcanthite +Chalcanthite Brick Wall=Mur de Brique de Chalcanthite +Chalcanthite Block Wall=Mur de Bloc de Chalcanthite +Cracked Chalcanthite Brick Wall=Mur de Brique de Chalcanthite Fissurée +Cobbled Chalcanthite Wall=Mur de Chalcanthite Pavée + +Chrysoprase Wall=Mur en chrysoprase +Chrysoprase Brick Wall=Mur en brique de chrysoprase +Chrysoprase Block Wall=Mur en bloc de chrysoprase +Cracked Chrysoprase Brick Wall=Mur en brique de chrysoprase fissurée + +Citrine Wall=Mur en Citrine +Citrine Brick Wall=Mur en brique de Citrine +Citrine Block Wall=Mur en bloc de Citrine +Cracked Citrine Brick Wall=Mur en brique de Citrine fissurée + +Covellite Wall=Mur en Covellite +Covellite Brick Wall=Mur en brique de Covellite +Covellite Block Wall=Mur en bloc de Covellite +Cracked Covellite Brick Wall=Mur en brique de Covellite fissurée +Cobbled Covellite Wall=Mur en Covellite pavé + +Crocoite Wall=Mur en Crocoite +Crocoite Brick Wall=Mur en brique de Crocoite +Crocoite Block Wall=Mur en bloc de Crocoite +Cracked Crocoite Brick Wall=Mur en brique de Crocoite fissurée + +Diorite Wall=Mur en Diorite +Diorite Brick Wall=Mur en brique de Diorite +Diorite Block Wall=Mur en bloc de Diorite +Cracked Diorite Brick Wall=Mur en brique de Diorite fissurée +Cobbled Diorite Wall=Mur en Diorite pavé + +Erythrite Wall=Mur en Érythrite +Erythrite Brick Wall=Mur en brique d'Érythrite +Erythrite Block Wall=Mur en bloc d'Érythrite +Cracked Erythrite Brick Wall=Mur en brique d'Érythrite fissurée + +Eudialite Wall=Mur en Eudialite +Eudialite Brick Wall=Mur en brique d'Eudialite +Eudialite Block Wall=Mur en bloc d'Eudialite +Cracked Eudialite Brick Wall=Mur en brique d'Eudialite fissurée + +Fluorite Wall=Mur en fluorite +Fluorite Brick Wall=Mur en brique de fluorite +Fluorite Block Wall=Mur en bloc de fluorite +Cracked Fluorite Brick Wall=Mur en brique de fluorite fissurée + +Gabbro Wall=Mur en Gabbro +Cobbled Gabbro Wall=Mur en Gabbro pavée +Gabbro Brick Wall=Mur en brique de Gabbro +Gabbro Block Wall=Mur en bloc de Gabbro +Cracked Gabbro Brick Wall=Mur en brique de Gabbro fissurée + +Galena Wall=Mur en Galène +Galena Brick Wall=Mur en brique de Galène +Galena Block Wall=Mur en bloc de Galène +Cracked Galena Brick Wall=Mur en brique de Galène fissurée + +Black Granite Wall=Mur en granit noir +Black Granite Brick Wall=Mur en briques de granit noir +Black Granite Block Wall=Mur en blocs de granit noir +Cracked Black Granite Brick Wall=Mur en briques de granit noir fissuré +Cobbled Black Granite Wall=Mur en granite noir pavé + +Blue Granite Wall=Mur en granit bleu +Blue Granite Brick Wall=Mur en briques de granit bleu +Blue Granite Block Wall=Mur en blocs de granit bleu +Cracked Blue Granite Brick Wall=Mur en briques de granit bleu fissuré +Cobbled Blue Granite Wall=Mur en granite bleu pavé + +Gray Granite Wall=Mur en granit gris +Gray Granite Brick Wall=Mur en briques de granit gris +Gray Granite Block Wall=Mur en blocs de granit gris +Cracked Gray Granite Brick Wall=Mur en briques de granit gris fissuré +Cobbled Gray Granite Wall=Mur en granite gris pavé + +Green Granite Wall=Mur en granit vert +Green Granite Brick Wall=Mur en briques de granit vert +Green Granite Block Wall=Mur en blocs de granit vert +Cracked Green Granite Brick Wall=Mur en briques de granit vert fissuré +Cobbled Green Granite Wall=Mur en granite vert pavé + +Pink Granite Wall=Mur en granit rose +Pink Granite Brick Wall=Mur en briques de granit rose +Pink Granite Block Wall=Mur en blocs de granit rose +Cracked Pink Granite Brick Wall=Mur en briques de granit rose fissuré +Cobbled Pink Granite Wall=Mur en granite rose pavé + +Red Granite Wall=Mur en granit rouge +Red Granite Brick Wall=Mur en briques de granit rouge +Red Granite Block Wall=Mur en blocs de granit rouge +Cracked Red Granite Brick Wall=Mur en briques de granit rouge fissuré +Cobbled Red Granite Wall=Mur en granite rouge pavé + +White Granite Wall=Mur en granit blanc +White Granite Brick Wall=Mur en briques de granit blanc +White Granite Block Wall=Mur en blocs de granit blanc +Cracked White Granite Brick Wall=Mur en briques de granit blanc fissuré +Cobbled White Granite Wall=Mur en granite blanc pavé + +Yellow Granite Wall=Mur en granit jaune +Yellow Granite Brick Wall=Mur en briques de granit jaune +Yellow Granite Block Wall=Mur en blocs de granit jaune +Cracked Yellow Granite Brick Wall=Mur en briques de granit jaune fissuré +Cobbled Yellow Granite Wall=Mur en granite jaune pavé + +Heliodor Wall=Mur en Héliodore +Heliodor Brick Wall=Mur en brique d'Héliodore +Heliodor Block Wall=Mur en blocs d'Héliodore +Cracked Heliodor Brick Wall=Mur en briques d'Héliodore fissurées + +Howlite Wall=Mur en Howlite +Howlite Brick Wall=Mur en brique de Howlite +Howlite Block Wall=Mur en blocs de Howlite +Cracked Howlite Brick Wall=Mur en briques de Howlite fissurées +Cobbled Howlite Wall=Mur en pavé de howlite + +Ilvaite Wall=Mur en Ilvaite +Ilvaite Brick Wall=Mur en brique d'Ilvaite +Ilvaite Block Wall=Mur en blocs d'Ilvaite +Cracked Ilvaite Brick Wall=Mur en briques d'Ilvaite fissurées +Cobbled Ilvaite Wall=Mur pavé d'Ilvaite + +Jade Wall=Mur en Jade +Jade Brick Wall=Mur en brique de Jade +Jade Block Wall=Mur en blocs de Jade +Cracked Jade Brick Wall=Mur en briques de Jade fissurées +Cobbled Jade Wall=Mur pavé en Jade + +Red Jasper Wall=Mur de Jaspe Rouge +Red Jasper Brick Wall=Mur de Brique de Jaspe Rouge +Red Jasper Block Wall=Mur de Bloc de Jaspe Rouge +Cracked Red Jasper Brick Wall=Mur de Brique de Jaspe Rouge Fissurée +Cobbled Red Jasper Wall=Mur de Jaspe Rouge Pavé + +Kyanite Wall=Mur en Kyanite +Kyanite Brick Wall=Mur en brique de Kyanite +Kyanite Block Wall=Mur en blocs de Kyanite +Cracked Kyanite Brick Wall=Mur en briques de Kyanite fissurées +Cobbled Kyanite Wall=Mur pavé en Kyanite + +Lapis Lazuli Wall=Mur en Lapis-lazuli +Lapis Lazuli Brick Wall=Mur en brique de Lapis-lazuli +Lapis Lazuli Block Wall=Mur en blocs de Lapis-lazuli +Cracked Lapis Lazuli Brick Wall=Mur en briques de Lapis-lazuli fissurées + +Lepidolite Wall=Mur de Lépidolite +Lepidolite Brick Wall=Mur de Brique de Lépidolite +Lepidolite Block Wall=Mur de Bloc de Lépidolite +Cracked Lepidolite Brick Wall=Mur de Brique de Lépidolite Fissurée +Cobbled Lepidolite Wall=Mur de Lépidolite Pavée + +Blue Limestone Wall=Mur en calcaire bleu +Blue Limestone Brick Wall=Mur en brique de calcaire bleu +Blue Limestone Block Wall=Mur en blocs de calcaire bleu +Cracked Blue Limestone Brick Wall=Mur en briques de calcaire bleu fissurées +Cobbled Blue Limestone Wall=Mur pavé en calcaire bleu + +White Limestone Wall=Mur en calcaire blanc +White Limestone Brick Wall=Mur en brique de calcaire blanc +White Limestone Block Wall=Mur en blocs de calcaire blanc +Cracked White Limestone Brick Wall=Mur en briques de calcaire blanc fissurées +Cobbled White Limestone Wall=Mur pavé en calcaire blanc + +Marble Wall=Mur en marbre +Marble Brick Wall=Mur en brique de marbre +Marble Block Wall=Mur en bloc de marbre +Cracked Marble Brick Wall=Mur en brique de marbre fissuré +Cobbled Marble Wall=Mur en marbre pavé + +Moonstone Wall=Mur de Pierre de Lune +Moonstone Brick Wall=Mur de Brique de Pierre de Lune +Moonstone Block Wall=Mur de Bloc de Pierre de Lune +Cracked Moonstone Brick Wall=Mur de Brique de Pierre de Lune Fissurée + +Morion Quartz Wall=Mur en quartz morion +Morion Quartz Brick Wall=Mur en brique de quartz morion +Morion Quartz Block Wall=Mur en bloc de quartz morion +Cracked Morion Quartz Brick Wall=Mur en brique de quartz morion fissurées + +Mudstone Wall=Mur en grès boueux +Cobbled Mudstone Wall=Mur en grès boueux pavé +Mudstone Brick Wall=Mur en brique de grès boueux +Mudstone Block Wall=Mur en bloc de grès boueux +Cracked Mudstone Brick Wall=Mur en brique de grès boueux fissuré + +Prasiolite Wall=Mur en prasiolite +Prasiolite Brick Wall=Mur en brique de prasiolite +Prasiolite Block Wall=Mur en bloc de prasiolite +Cracked Prasiolite Brick Wall=Mur en brique de prasiolite fissuré + +Pumice Wall=Mur en ponce +Pumice Brick Wall=Mur en brique de ponce +Pumice Block Wall=Mur en bloc de ponce +Cracked Pumice Brick Wall=Mur en brique de ponce fissuré + +Pyrite Wall=Mur en pyrite +Pyrite Brick Wall=Mur en brique de pyrite +Pyrite Block Wall=Mur en bloc de pyrite +Cracked Pyrite Brick Wall=Mur en brique de pyrite fissuré + +Quartz Wall=Mur en quartz +Quartz Brick Wall=Mur en brique de quartz +Quartz Block Wall=Mur en bloc de quartz +Cracked Quartz Brick Wall=Mur en brique de quartz fissuré + +Rose Quartz Wall=Mur en quartz rose +Rose Quartz Brick Wall=Mur en brique de quartz rose +Rose Quartz Block Wall=Mur en bloc de quartz rose +Cracked Rose Quartz Brick Wall=Mur en brique de quartz rose fissuré + +Rhodonite Wall=Mur de Rhodonite +Rhodonite Brick Wall=Mur de Brique de Rhodonite +Rhodonite Block Wall=Mur de Bloc de Rhodonite +Cracked Rhodonite Brick Wall=Mur de Brique de Rhodonite Fissurée +Cobbled Rhodonite Wall=Mur de Rhodonite Pavée + +Scoria Wall=Mur en scorie +Scoria Brick Wall=Mur en brique de scorie +Scoria Block Wall=Mur en bloc de scorie +Cracked Scoria Brick Wall=Mur en brique de scorie fissuré +Cobbled Scoria Wall=Mur en scorie pavé + +Serpentine Wall=Mur en serpentine +Cobbled Serpentine Wall=Mur en serpentine pavé +Serpentine Brick Wall=Mur en brique de serpentine +Serpentine Block Wall=Mur en bloc de serpentine +Cracked Serpentine Brick Wall=Mur en brique de serpentine fissuré + +Shale Wall=Mur de schiste +Shale Brick Wall=Mur de briques de schiste +Shale Block Wall=Mur de blocs de schiste +Cracked Shale Brick Wall=Mur de briques de schiste fissurées +Cobbled Shale Wall=Mur de schiste pavé + +Slate Wall=Mur en ardoise +Slate Brick Wall=Mur en brique d'ardoise +Slate Block Wall=Mur en bloc d'ardoise +Cracked Slate Brick Wall=Mur en brique d'ardoise fissurée +Cobbled Slate Wall=Mur pavé en ardoise +Slate Tile Wall=Mur tuile en ardoise + +Smokey Quartz Wall=Mur en quartz fumé +Smokey Quartz Brick Wall=Mur en brique de quartz fumé +Smokey Quartz Block Wall=Mur en bloc de quartz fumé +Cracked Smokey Quartz Brick Wall=Mur en brique de quartz fumé fissurée + +Soapstone Wall=Mur en pierre à savon +Soapstone Brick Wall=Mur en brique de pierre à savon +Soapstone Block Wall=Mur en bloc de pierre à savon +Cracked Soapstone Brick Wall=Mur en brique de pierre à savon fissurée + +Sodalite Wall=Mur en sodalite +Cobbled Sodalite Wall=Mur pavé en sodalite +Sodalite Brick Wall=Mur en brique de sodalite +Sodalite Block Wall=Mur en bloc de sodalite +Cracked Sodalite Brick Wall=Mur en brique de sodalite fissurée + +Sugilite Wall=Mur en sugilite +Sugilite Brick Wall=Mur en brique de sugilite +Sugilite Block Wall=Mur en bloc de sugilite +Cracked Sugilite Brick Wall=Mur en brique de sugilite fissurée +Cobbled Sugilite Wall=Mur pavé en sugilite + +Green Tourmaline Wall=Mur de Tourmaline Verte +Green Tourmaline Brick Wall=Mur de Brique de Tourmaline Verte +Green Tourmaline Block Wall=Mur de Bloc de Tourmaline Verte +Cracked Green Tourmaline Brick Wall=Mur de Brique de Tourmaline Verte Fissurée + +Paraiba Tourmaline Wall=Mur de Tourmaline Paraíba +Paraiba Tourmaline Brick Wall=Mur de Brique de Tourmaline Paraíba +Paraiba Tourmaline Block Wall=Mur de Bloc de Tourmaline Paraíba +Cracked Paraiba Tourmaline Brick Wall=Mur de Brique de Tourmaline Paraíba Fissurée + +Pink Tourmaline Wall=Mur de Tourmaline Rose +Pink Tourmaline Brick Wall=Mur de Brique de Tourmaline Rose +Pink Tourmaline Block Wall=Mur de Bloc de Tourmaline Rose +Cracked Pink Tourmaline Brick Wall=Mur de Brique de Tourmaline Rose Fissurée + +Travertine Wall=Mur en travertin +Cobbled Travertine Wall=Mur pavé en travertin +Travertine Brick Wall=Mur en brique de travertin +Travertine Block Wall=Mur en bloc de travertin +Cracked Travertine Brick Wall=Mur en brique de travertin fissurée + +Yellow Travertine Wall=Mur en travertin jaune +Cobbled Yellow Travertine Wall=Mur pavé en travertin jaune +Yellow Travertine Brick Wall=Mur en brique de travertin jaune +Yellow Travertine Block Wall=Mur en bloc de travertin jaune +Cracked Yellow Travertine Brick Wall=Mur en brique de travertin jaune fissurée + +Beige Tuff Wall=Mur en tuf beige +Beige Tuff Block Wall=Mur en bloc de tuf beige +Cobbled Beige Tuff Wall=Mur en tuf beige pavé +Beige Tuff Brick Wall=Mur en brique de tuf beige +Cracked Beige Tuff Wall=Mur en tuf beige craquelé + +Grey Tuff Wall=Mur en tuf gris +Grey Tuff Block Wall=Mur en bloc de tuf gris +Cobbled Grey Tuff Wall=Mur en tuf gris pavé +Grey Tuff Brick Wall=Mur en brique de tuf gris +Cracked Grey Tuff Wall=Mur en tuf gris craquelé + +Red Tuff Wall=Mur en tuf rouge +Red Tuff Block Wall=Mur en bloc de tuf rouge +Cobbled Red Tuff Wall=Mur en tuf rouge pavé +Red Tuff Brick Wall=Mur en brique de tuf rouge +Cracked Red Tuff Wall=Mur en tuf rouge craquelé + +Turquoise Wall=Mur en turquoise +Turquoise Brick Wall=Mur en brique de turquoise +Turquoise Block Wall=Mur en bloc de turquoise +Cracked Turquoise Brick Wall=Mur en brique de turquoise fissurée +Cobbled Turquoise Wall=Mur pavé en turquoise + +Vivianite Wall=Mur en vivianite +Vivianite Brick Wall=Mur en brique de vivianite +Vivianite Block Wall=Mur en bloc de vivianite +Cracked Vivianite Brick Wall=Mur en brique de vivianite fissurée + +### stairs.lua ### + +Blue Agate Slab=Dalle en Agate bleue +Gray Agate Slab=Dalle en Agate grise +Green Agate Slab=Dalle en Agate verte +Moss Agate Slab=Dalle en Agate mousse +Orange Agate Slab=Dalle en Agate orange +Purple Agate Slab=Dalle en Agate violette +Red Agate Slab=Dalle en Agate rouge + +Amazonite Slab=Dalle en Amazonite +Cobbled Amazonite Slab=Dalle en pavé d'Amazonite +Amazonite Brick Slab=Dalle en brique d'Amazonite +Amazonite Block Slab=Dalle en bloc d'Amazonite +Cracked Amazonite Brick Slab=Dalle en brique d'Amazonite fissurée + +Amber Slab=Dalle en ambre +Amber Brick Slab=Dalle en brique d'ambre +Amber Block Slab=Dalle en bloc d'ambre +Cracked Amber Brick Slab=Dalle en brique d'ambre fissurée + +Amethyst Slab=Dalle en améthyste +Amethyst Brick Slab=Dalle en brique d'améthyste +Amethyst Block Slab=Dalle en bloc d'améthyste +Cracked Amethyst Brick Slab=Dalle en brique d'améthyste fissurée + +Andesite Slab=Dalle en andésite +Andesite Block Slab=Dalle en bloc d'andésite +Andesite Brick Slab=Dalle en brique d'andésite +Cracked Andesite Brick Slab=Dalle en brique d'andésite fissurée +Cobbled Andesite Slab=Dalle en pavé d'andésite + +Basalt Slab=Dalle en basalte +Basalt Brick Slab=Dalle en brique de basalte +Basalt Block Slab=Dalle en bloc de basalte +Cracked Basalt Brick Slab=Dalle en brique de basalte fissurée +Cobbled Basalt Slab=Dalle en pavé de basalte +Basalt Tile Slab=Dalle en tuile de basalte + +Black Moonstone Slab=Dalle en pierre de lune noire +Black Moonstone Brick Slab=Dalle en brique de pierre de lune noire +Black Moonstone Block Slab=Dalle en bloc de pierre de lune noire +Cracked Black Moonstone Brick Slab=Dalle en brique de pierre de lune noire fissurée + +Grey Calcite Slab=Dalle de Calcite Grise +Grey Calcite Brick Slab=Dalle de Brique de Calcite Grise +Grey Calcite Block Slab=Dalle de Bloc de Calcite Grise +Cracked Grey Calcite Brick Slab=Dalle de Brique de Calcite Grise Fissurée + +Calcite Slab=Dalle en calcite +Calcite Brick Slab=Dalle en brique de calcite +Calcite Block Slab=Dalle en bloc de calcite +Cracked Calcite Brick Slab=Dalle en brique de calcite fissurée + +Orange Calcite Slab=Dalle de Calcite Orange +Orange Calcite Brick Slab=Dalle de Brique de Calcite Orange +Orange Calcite Block Slab=Dalle de Bloc de Calcite Orange +Cracked Orange Calcite Brick Slab=Dalle de Brique de Calcite Orange Fissurée + +Carnotite Slab=Dalle en carnotite +Carnotite Brick Slab=Dalle en brique de carnotite +Carnotite Block Slab=Dalle en bloc de carnotite +Cracked Carnotite Brick Slab=Dalle en brique de carnotite fissurée +Cobbled Carnotite Slab=Dalle en pavé de carnotite + +Celestine Slab=Dalle en célestine +Celestine Brick Slab=Dalle en brique de célestine +Celestine Block Slab=Dalle en bloc de célestine +Cracked Celestine Brick Slab=Dalle en brique de célestine fissurée + +Chalcanthite Slab=Dalle de Chalcanthite +Chalcanthite Brick Slab=Dalle de Brique de Chalcanthite +Chalcanthite Block Slab=Dalle de Bloc de Chalcanthite +Cracked Chalcanthite Brick Slab=Dalle de Brique de Chalcanthite Fissurée +Cobbled Chalcanthite Slab=Dalle de Chalcanthite Pavée + +Chrysoprase Slab=Dalle en chrysoprase +Chrysoprase Brick Slab=Dalle en brique de chrysoprase +Chrysoprase Block Slab=Dalle en bloc de chrysoprase +Cracked Chrysoprase Brick Slab=Dalle en brique de chrysoprase fissurée + +Citrine Slab=Dalle en Citrine +Citrine Brick Slab=Dalle en brique de Citrine +Citrine Block Slab=Dalle en bloc de Citrine +Cracked Citrine Brick Slab=Dalle en brique de Citrine fissurée + +Covellite Slab=Dalle en Covellite +Covellite Brick Slab=Dalle en brique de Covellite +Covellite Block Slab=Dalle en bloc de Covellite +Cracked Covellite Brick Slab=Dalle en brique de Covellite fissurée +Cobbled Covellite Slab=Dalle en Covellite pavé + +Crocoite Slab=Dalle en Crocoite +Crocoite Brick Slab=Dalle en brique de Crocoite +Crocoite Block Slab=Dalle en bloc de Crocoite +Cracked Crocoite Brick Slab=Dalle en brique de Crocoite fissurée + +Diorite Slab=Dalle en Diorite +Diorite Brick Slab=Dalle en brique de Diorite +Diorite Block Slab=Dalle en bloc de Diorite +Cracked Diorite Brick Slab=Dalle en brique de Diorite fissurée +Cobbled Diorite Slab=Dalle en Diorite pavé + +Erythrite Slab=Dalle en Érythrite +Erythrite Brick Slab=Dalle en brique d'Érythrite +Erythrite Block Slab=Dalle en bloc d'Érythrite +Cracked Erythrite Brick Slab=Dalle en brique d'Érythrite fissurée + +Eudialite Slab=Dalle en Eudialite +Eudialite Brick Slab=Dalle en brique d'Eudialite +Eudialite Block Slab=Dalle en bloc d'Eudialite +Cracked Eudialite Brick Slab=Dalle en brique d'Eudialite fissurée + +Fluorite Slab=Dalle en fluorite +Fluorite Brick Slab=Dalle en brique de fluorite +Fluorite Block Slab=Dalle en bloc de fluorite +Cracked Fluorite Brick Slab=Dalle en brique de fluorite fissurée + +Gabbro Slab=Dalle en Gabbro +Cobbled Gabbro Slab=Dalle en Gabbro pavée +Gabbro Brick Slab=Dalle en brique de Gabbro +Gabbro Block Slab=Dalle en bloc de Gabbro +Cracked Gabbro Brick Slab=Dalle en brique de Gabbro fissurée + +Galena Slab=Dalle en Galène +Galena Brick Slab=Dalle en brique de Galène +Galena Block Slab=Dalle en bloc de Galène +Cracked Galena Brick Slab=Dalle en brique de Galène fissurée + +Black Granite Slab=Dalle en granit noir +Black Granite Brick Slab=Dalle en briques de granit noir +Black Granite Block Slab=Dalle en blocs de granit noir +Cracked Black Granite Brick Slab=Dalle en briques de granit noir fissuré +Cobbled Black Granite Slab=Dalle en granite noir pavé + +Blue Granite Slab=Dalle en granit bleu +Blue Granite Brick Slab=Dalle en briques de granit bleu +Blue Granite Block Slab=Dalle en blocs de granit bleu +Cracked Blue Granite Brick Slab=Dalle en briques de granit bleu fissuré +Cobbled Blue Granite Slab=Dalle en granite bleu pavé + +Gray Granite Slab=Dalle en granit gris +Gray Granite Brick Slab=Dalle en briques de granit gris +Gray Granite Block Slab=Dalle en blocs de granit gris +Cracked Gray Granite Brick Slab=Dalle en briques de granit gris fissuré +Cobbled Gray Granite Slab=Dalle en granite gris pavé + +Green Granite Slab=Dalle en granit vert +Green Granite Brick Slab=Dalle en briques de granit vert +Green Granite Block Slab=Dalle en blocs de granit vert +Cracked Green Granite Brick Slab=Dalle en briques de granit vert fissuré +Cobbled Green Granite Slab=Dalle en granite vert pavé + +Pink Granite Slab=Dalle en granit rose +Pink Granite Brick Slab=Dalle en briques de granit rose +Pink Granite Block Slab=Dalle en blocs de granit rose +Cracked Pink Granite Brick Slab=Dalle en briques de granit rose fissuré +Cobbled Pink Granite Slab=Dalle en granite rose pavé + +Red Granite Slab=Dalle en granit rouge +Red Granite Brick Slab=Dalle en briques de granit rouge +Red Granite Block Slab=Dalle en blocs de granit rouge +Cracked Red Granite Brick Slab=Dalle en briques de granit rouge fissuré +Cobbled Red Granite Slab=Dalle en granite rouge pavé + +White Granite Slab=Dalle en granit blanc +White Granite Brick Slab=Dalle en briques de granit blanc +White Granite Block Slab=Dalle en blocs de granit blanc +Cracked White Granite Brick Slab=Dalle en briques de granit blanc fissuré +Cobbled White Granite Slab=Dalle en granite blanc pavé + +Yellow Granite Slab=Dalle en granit jaune +Yellow Granite Brick Slab=Dalle en briques de granit jaune +Yellow Granite Block Slab=Dalle en blocs de granit jaune +Cracked Yellow Granite Brick Slab=Dalle en briques de granit jaune fissuré +Cobbled Yellow Granite Slab=Dalle en granite jaune pavé + +Heliodor Slab=Dalle en Héliodore +Heliodor Brick Slab=Dalle en brique d'Héliodore +Heliodor Block Slab=Dalle en blocs d'Héliodore +Cracked Heliodor Brick Slab=Dalle en briques d'Héliodore fissurées + +Howlite Slab=Dalle en Howlite +Howlite Brick Slab=Dalle en brique de Howlite +Howlite Block Slab=Dalle en blocs de Howlite +Cracked Howlite Brick Slab=Dalle en briques de Howlite fissurées +Cobbled Howlite Slab=Dalle en pavé de howlite + +Ilvaite Slab=Dalle en Ilvaite +Ilvaite Brick Slab=Dalle en brique d'Ilvaite +Ilvaite Block Slab=Dalle en blocs d'Ilvaite +Cracked Ilvaite Brick Slab=Dalle en briques d'Ilvaite fissurées +Cobbled Ilvaite Slab=Dalle pavé d'Ilvaite + +Jade Slab=Dalle en Jade +Jade Brick Slab=Dalle en brique de Jade +Jade Block Slab=Dalle en blocs de Jade +Cracked Jade Brick Slab=Dalle en briques de Jade fissurées +Cobbled Jade Slab=Dalle pavé en Jade + +Red Jasper Slab=Dalle de Jaspe Rouge +Red Jasper Brick Slab=Dalle de Brique de Jaspe Rouge +Red Jasper Block Slab=Dalle de Bloc de Jaspe Rouge +Cracked Red Jasper Brick Slab=Dalle de Brique de Jaspe Rouge Fissurée +Cobbled Red Jasper Slab=Dalle de Jaspe Rouge Pavé + +Kyanite Slab=Dalle en Kyanite +Kyanite Brick Slab=Dalle en brique de Kyanite +Kyanite Block Slab=Dalle en blocs de Kyanite +Cracked Kyanite Brick Slab=Dalle en briques de Kyanite fissurées +Cobbled Kyanite Slab=Dalle pavé en Kyanite + +Lapis Lazuli Slab=Dalle en Lapis-lazuli +Lapis Lazuli Brick Slab=Dalle en brique de Lapis-lazuli +Lapis Lazuli Block Slab=Dalle en blocs de Lapis-lazuli +Cracked Lapis Lazuli Brick Slab=Dalle en briques de Lapis-lazuli fissurées + +Lepidolite Slab=Dalle de Lépidolite +Lepidolite Brick Slab=Dalle de Brique de Lépidolite +Lepidolite Block Slab=Dalle de Bloc de Lépidolite +Cracked Lepidolite Brick Slab=Dalle de Brique de Lépidolite Fissurée +Cobbled Lepidolite Slab=Dalle de Lépidolite Pavée + +Blue Limestone Slab=Dalle en calcaire bleu +Blue Limestone Brick Slab=Dalle en brique de calcaire bleu +Blue Limestone Block Slab=Dalle en blocs de calcaire bleu +Cracked Blue Limestone Brick Slab=Dalle en briques de calcaire bleu fissurées +Cobbled Blue Limestone Slab=Dalle pavé en calcaire bleu + +White Limestone Slab=Dalle en calcaire blanc +White Limestone Brick Slab=Dalle en brique de calcaire blanc +White Limestone Block Slab=Dalle en blocs de calcaire blanc +Cracked White Limestone Brick Slab=Dalle en briques de calcaire blanc fissurées +Cobbled White Limestone Slab=Dalle pavé en calcaire blanc + +Marble Slab=Dalle en marbre +Marble Brick Slab=Dalle en brique de marbre +Marble Block Slab=Dalle en bloc de marbre +Cracked Marble Brick Slab=Dalle en brique de marbre fissuré +Cobbled Marble Slab=Dalle en marbre pavé + +Moonstone Slab=Dalle de Pierre de Lune +Moonstone Brick Slab=Dalle de Brique de Pierre de Lune +Moonstone Block Slab=Dalle de Bloc de Pierre de Lune +Cracked Moonstone Brick Slab=Dalle de Brique de Pierre de Lune Fissurée + +Morion Quartz Slab=Dalle en quartz morion +Morion Quartz Brick Slab=Dalle en brique de quartz morion +Morion Quartz Block Slab=Dalle en bloc de quartz morion +Cracked Morion Quartz Brick Slab=Dalle en brique de quartz morion fissurées + +Mudstone Slab=Dalle en grès boueux +Cobbled Mudstone Slab=Dalle en grès boueux pavé +Mudstone Brick Slab=Dalle en brique de grès boueux +Mudstone Block Slab=Dalle en bloc de grès boueux +Cracked Mudstone Brick Slab=Dalle en brique de grès boueux fissuré + +Prasiolite Slab=Dalle en prasiolite +Prasiolite Brick Slab=Dalle en brique de prasiolite +Prasiolite Block Slab=Dalle en bloc de prasiolite +Cracked Prasiolite Brick Slab=Dalle en brique de prasiolite fissuré + +Pumice Slab=Dalle en ponce +Pumice Brick Slab=Dalle en brique de ponce +Pumice Block Slab=Dalle en bloc de ponce +Cracked Pumice Brick Slab=Dalle en brique de ponce fissuré + +Pyrite Slab=Dalle en pyrite +Pyrite Brick Slab=Dalle en brique de pyrite +Pyrite Block Slab=Dalle en bloc de pyrite +Cracked Pyrite Brick Slab=Dalle en brique de pyrite fissuré + +Quartz Slab=Dalle en quartz +Quartz Brick Slab=Dalle en brique de quartz +Quartz Block Slab=Dalle en bloc de quartz +Cracked Quartz Brick Slab=Dalle en brique de quartz fissuré + +Rose Quartz Slab=Dalle en quartz rose +Rose Quartz Brick Slab=Dalle en brique de quartz rose +Rose Quartz Block Slab=Dalle en bloc de quartz rose +Cracked Rose Quartz Brick Slab=Dalle en brique de quartz rose fissuré + +Rhodonite Slab=Dalle de Rhodonite +Rhodonite Brick Slab=Dalle de Brique de Rhodonite +Rhodonite Block Slab=Dalle de Bloc de Rhodonite +Cracked Rhodonite Brick Slab=Dalle de Brique de Rhodonite Fissurée +Cobbled Rhodonite Slab=Dalle de Rhodonite Pavée + +Scoria Slab=Dalle en scorie +Scoria Brick Slab=Dalle en brique de scorie +Scoria Block Slab=Dalle en bloc de scorie +Cracked Scoria Brick Slab=Dalle en brique de scorie fissuré +Cobbled Scoria Slab=Dalle en scorie pavé + +Serpentine Slab=Dalle en serpentine +Cobbled Serpentine Slab=Dalle en serpentine pavé +Serpentine Brick Slab=Dalle en brique de serpentine +Serpentine Block Slab=Dalle en bloc de serpentine +Cracked Serpentine Brick Slab=Dalle en brique de serpentine fissuré + +Shale Slab=Dalle de schiste +Shale Brick Slab=Dalle de briques de schiste +Shale Block Slab=Dalle de blocs de schiste +Cracked Shale Brick Slab=Dalle de briques de schiste fissurées +Cobbled Shale Slab=Dalle de schiste pavé + +Slate Slab=Dalle en ardoise +Slate Brick Slab=Dalle en brique d'ardoise +Slate Block Slab=Dalle en bloc d'ardoise +Cracked Slate Brick Slab=Dalle en brique d'ardoise fissurée +Cobbled Slate Slab=Dalle pavé en ardoise +Slate Tile Slab=Dalle tuile en ardoise + +Smokey Quartz Slab=Dalle en quartz fumé +Smokey Quartz Brick Slab=Dalle en brique de quartz fumé +Smokey Quartz Block Slab=Dalle en bloc de quartz fumé +Cracked Smokey Quartz Brick Slab=Dalle en brique de quartz fumé fissurée + +Soapstone Slab=Dalle en pierre à savon +Soapstone Brick Slab=Dalle en brique de pierre à savon +Soapstone Block Slab=Dalle en bloc de pierre à savon +Cracked Soapstone Brick Slab=Dalle en brique de pierre à savon fissurée + +Sodalite Slab=Dalle en sodalite +Cobbled Sodalite Slab=Dalle pavé en sodalite +Sodalite Brick Slab=Dalle en brique de sodalite +Sodalite Block Slab=Dalle en bloc de sodalite +Cracked Sodalite Brick Slab=Dalle en brique de sodalite fissurée + +Sugilite Slab=Dalle en sugilite +Sugilite Brick Slab=Dalle en brique de sugilite +Sugilite Block Slab=Dalle en bloc de sugilite +Cracked Sugilite Brick Slab=Dalle en brique de sugilite fissurée +Cobbled Sugilite Slab=Dalle pavé en sugilite + +Green Tourmaline Slab=Dalle de Tourmaline Verte +Green Tourmaline Brick Slab=Dalle de Brique de Tourmaline Verte +Green Tourmaline Block Slab=Dalle de Bloc de Tourmaline Verte +Cracked Green Tourmaline Brick Slab=Dalle de Brique de Tourmaline Verte Fissurée + +Paraiba Tourmaline Slab=Dalle de Tourmaline Paraíba +Paraiba Tourmaline Brick Slab=Dalle de Brique de Tourmaline Paraíba +Paraiba Tourmaline Block Slab=Dalle de Bloc de Tourmaline Paraíba +Cracked Paraiba Tourmaline Brick Slab=Dalle de Brique de Tourmaline Paraíba Fissurée + +Pink Tourmaline Slab=Dalle de Tourmaline Rose +Pink Tourmaline Brick Slab=Dalle de Brique de Tourmaline Rose +Pink Tourmaline Block Slab=Dalle de Bloc de Tourmaline Rose +Cracked Pink Tourmaline Brick Slab=Dalle de Brique de Tourmaline Rose Fissurée + +Travertine Slab=Dalle en travertin +Cobbled Travertine Slab=Dalle pavé en travertin +Travertine Brick Slab=Dalle en brique de travertin +Travertine Block Slab=Dalle en bloc de travertin +Cracked Travertine Brick Slab=Dalle en brique de travertin fissurée + +Yellow Travertine Slab=Dalle en travertin jaune +Cobbled Yellow Travertine Slab=Dalle pavé en travertin jaune +Yellow Travertine Brick Slab=Dalle en brique de travertin jaune +Yellow Travertine Block Slab=Dalle en bloc de travertin jaune +Cracked Yellow Travertine Brick Slab=Dalle en brique de travertin jaune fissurée + +Beige Tuff Slab=Dalle en tuf beige +Beige Tuff Block Slab=Dalle en bloc de tuf beige +Cobbled Beige Tuff Slab=Dalle en tuf beige pavé +Beige Tuff Brick Slab=Dalle en brique de tuf beige +Cracked Beige Tuff Slab=Dalle en tuf beige craquelé + +Grey Tuff Slab=Dalle en tuf gris +Grey Tuff Block Slab=Dalle en bloc de tuf gris +Cobbled Grey Tuff Slab=Dalle en tuf gris pavé +Grey Tuff Brick Slab=Dalle en brique de tuf gris +Cracked Grey Tuff Slab=Dalle en tuf gris craquelé + +Red Tuff Slab=Dalle en tuf rouge +Red Tuff Block Slab=Dalle en bloc de tuf rouge +Cobbled Red Tuff Slab=Dalle en tuf rouge pavé +Red Tuff Brick Slab=Dalle en brique de tuf rouge +Cracked Red Tuff Slab=Dalle en tuf rouge craquelé + +Turquoise Slab=Dalle en turquoise +Turquoise Brick Slab=Dalle en brique de turquoise +Turquoise Block Slab=Dalle en bloc de turquoise +Cracked Turquoise Brick Slab=Dalle en brique de turquoise fissurée +Cobbled Turquoise Slab=Dalle pavé en turquoise + +Vivianite Slab=Dalle en vivianite +Vivianite Brick Slab=Dalle en brique de vivianite +Vivianite Block Slab=Dalle en bloc de vivianite +Cracked Vivianite Brick Slab=Dalle en brique de vivianite fissurée + + + +Blue Agate Stair=Escalier en Agate bleue +Gray Agate Stair=Escalier en Agate grise +Green Agate Stair=Escalier en Agate verte +Moss Agate Stair=Escalier en Agate mousse +Orange Agate Stair=Escalier en Agate orange +Purple Agate Stair=Escalier en Agate violette +Red Agate Stair=Escalier en Agate rouge + +Amazonite Stair=Escalier en Amazonite +Cobbled Amazonite Stair=Escalier en pavé d'Amazonite +Amazonite Brick Stair=Escalier en brique d'Amazonite +Amazonite Block Stair=Escalier en bloc d'Amazonite +Cracked Amazonite Brick Stair=Escalier en brique d'Amazonite fissurée + +Amber Stair=Escalier en ambre +Amber Brick Stair=Escalier en brique d'ambre +Amber Block Stair=Escalier en bloc d'ambre +Cracked Amber Brick Stair=Escalier en brique d'ambre fissurée + +Amethyst Stair=Escalier en améthyste +Amethyst Brick Stair=Escalier en brique d'améthyste +Amethyst Block Stair=Escalier en bloc d'améthyste +Cracked Amethyst Brick Stair=Escalier en brique d'améthyste fissurée + +Andesite Stair=Escalier en andésite +Andesite Block Stair=Escalier en bloc d'andésite +Andesite Brick Stair=Escalier en brique d'andésite +Cracked Andesite Brick Stair=Escalier en brique d'andésite fissurée +Cobbled Andesite Stair=Escalier en pavé d'andésite + +Basalt Stair=Escalier en basalte +Basalt Brick Stair=Escalier en brique de basalte +Basalt Block Stair=Escalier en bloc de basalte +Cracked Basalt Brick Stair=Escalier en brique de basalte fissurée +Cobbled Basalt Stair=Escalier en pavé de basalte +Basalt Tile Stair=Escalier en tuile de basalte + +Black Moonstone Stair=Escalier en pierre de lune noire +Black Moonstone Brick Stair=Escalier en brique de pierre de lune noire +Black Moonstone Block Stair=Escalier en bloc de pierre de lune noire +Cracked Black Moonstone Brick Stair=Escalier en brique de pierre de lune noire fissurée + +Grey Calcite Stair=Escalier de Calcite Grise +Grey Calcite Brick Stair=Escalier de Brique de Calcite Grise +Grey Calcite Block Stair=Escalier de Bloc de Calcite Grise +Cracked Grey Calcite Brick Stair=Escalier de Brique de Calcite Grise Fissurée + +Calcite Stair=Escalier en calcite +Calcite Brick Stair=Escalier en brique de calcite +Calcite Block Stair=Escalier en bloc de calcite +Cracked Calcite Brick Stair=Escalier en brique de calcite fissurée + +Orange Calcite Stair=Escalier de Calcite Orange +Orange Calcite Brick Stair=Escalier de Brique de Calcite Orange +Orange Calcite Block Stair=Escalier de Bloc de Calcite Orange +Cracked Orange Calcite Brick Stair=Escalier de Brique de Calcite Orange Fissurée + +Carnotite Stair=Escalier en carnotite +Carnotite Brick Stair=Escalier en brique de carnotite +Carnotite Block Stair=Escalier en bloc de carnotite +Cracked Carnotite Brick Stair=Escalier en brique de carnotite fissurée +Cobbled Carnotite Stair=Escalier en pavé de carnotite + +Celestine Stair=Escalier en célestine +Celestine Brick Stair=Escalier en brique de célestine +Celestine Block Stair=Escalier en bloc de célestine +Cracked Celestine Brick Stair=Escalier en brique de célestine fissurée + +Chalcanthite Stair=Escalier de Chalcanthite +Chalcanthite Brick Stair=Escalier de Brique de Chalcanthite +Chalcanthite Block Stair=Escalier de Bloc de Chalcanthite +Cracked Chalcanthite Brick Stair=Escalier de Brique de Chalcanthite Fissurée +Cobbled Chalcanthite Stair=Escalier de Chalcanthite Pavée + +Chrysoprase Stair=Escalier en chrysoprase +Chrysoprase Brick Stair=Escalier en brique de chrysoprase +Chrysoprase Block Stair=Escalier en bloc de chrysoprase +Cracked Chrysoprase Brick Stair=Escalier en brique de chrysoprase fissurée + +Citrine Stair=Escalier en Citrine +Citrine Brick Stair=Escalier en brique de Citrine +Citrine Block Stair=Escalier en bloc de Citrine +Cracked Citrine Brick Stair=Escalier en brique de Citrine fissurée + +Covellite Stair=Escalier en Covellite +Covellite Brick Stair=Escalier en brique de Covellite +Covellite Block Stair=Escalier en bloc de Covellite +Cracked Covellite Brick Stair=Escalier en brique de Covellite fissurée +Cobbled Covellite Stair=Escalier en Covellite pavé + +Crocoite Stair=Escalier en Crocoite +Crocoite Brick Stair=Escalier en brique de Crocoite +Crocoite Block Stair=Escalier en bloc de Crocoite +Cracked Crocoite Brick Stair=Escalier en brique de Crocoite fissurée + +Diorite Stair=Escalier en Diorite +Diorite Brick Stair=Escalier en brique de Diorite +Diorite Block Stair=Escalier en bloc de Diorite +Cracked Diorite Brick Stair=Escalier en brique de Diorite fissurée +Cobbled Diorite Stair=Escalier en Diorite pavé + +Erythrite Stair=Escalier en Érythrite +Erythrite Brick Stair=Escalier en brique d'Érythrite +Erythrite Block Stair=Escalier en bloc d'Érythrite +Cracked Erythrite Brick Stair=Escalier en brique d'Érythrite fissurée + +Eudialite Stair=Escalier en Eudialite +Eudialite Brick Stair=Escalier en brique d'Eudialite +Eudialite Block Stair=Escalier en bloc d'Eudialite +Cracked Eudialite Brick Stair=Escalier en brique d'Eudialite fissurée + +Fluorite Stair=Escalier en fluorite +Fluorite Brick Stair=Escalier en brique de fluorite +Fluorite Block Stair=Escalier en bloc de fluorite +Cracked Fluorite Brick Stair=Escalier en brique de fluorite fissurée + +Gabbro Stair=Escalier en Gabbro +Cobbled Gabbro Stair=Escalier en Gabbro pavée +Gabbro Brick Stair=Escalier en brique de Gabbro +Gabbro Block Stair=Escalier en bloc de Gabbro +Cracked Gabbro Brick Stair=Escalier en brique de Gabbro fissurée + +Galena Stair=Escalier en Galène +Galena Brick Stair=Escalier en brique de Galène +Galena Block Stair=Escalier en bloc de Galène +Cracked Galena Brick Stair=Escalier en brique de Galène fissurée + +Black Granite Stair=Escalier en granit noir +Black Granite Brick Stair=Escalier en briques de granit noir +Black Granite Block Stair=Escalier en blocs de granit noir +Cracked Black Granite Brick Stair=Escalier en briques de granit noir fissuré +Cobbled Black Granite Stair=Escalier en granite noir pavé + +Blue Granite Stair=Escalier en granit bleu +Blue Granite Brick Stair=Escalier en briques de granit bleu +Blue Granite Block Stair=Escalier en blocs de granit bleu +Cracked Blue Granite Brick Stair=Escalier en briques de granit bleu fissuré +Cobbled Blue Granite Stair=Escalier en granite bleu pavé + +Gray Granite Stair=Escalier en granit gris +Gray Granite Brick Stair=Escalier en briques de granit gris +Gray Granite Block Stair=Escalier en blocs de granit gris +Cracked Gray Granite Brick Stair=Escalier en briques de granit gris fissuré +Cobbled Gray Granite Stair=Escalier en granite gris pavé + +Green Granite Stair=Escalier en granit vert +Green Granite Brick Stair=Escalier en briques de granit vert +Green Granite Block Stair=Escalier en blocs de granit vert +Cracked Green Granite Brick Stair=Escalier en briques de granit vert fissuré +Cobbled Green Granite Stair=Escalier en granite vert pavé + +Pink Granite Stair=Escalier en granit rose +Pink Granite Brick Stair=Escalier en briques de granit rose +Pink Granite Block Stair=Escalier en blocs de granit rose +Cracked Pink Granite Brick Stair=Escalier en briques de granit rose fissuré +Cobbled Pink Granite Stair=Escalier en granite rose pavé + +Red Granite Stair=Escalier en granit rouge +Red Granite Brick Stair=Escalier en briques de granit rouge +Red Granite Block Stair=Escalier en blocs de granit rouge +Cracked Red Granite Brick Stair=Escalier en briques de granit rouge fissuré +Cobbled Red Granite Stair=Escalier en granite rouge pavé + +White Granite Stair=Escalier en granit blanc +White Granite Brick Stair=Escalier en briques de granit blanc +White Granite Block Stair=Escalier en blocs de granit blanc +Cracked White Granite Brick Stair=Escalier en briques de granit blanc fissuré +Cobbled White Granite Stair=Escalier en granite blanc pavé + +Yellow Granite Stair=Escalier en granit jaune +Yellow Granite Brick Stair=Escalier en briques de granit jaune +Yellow Granite Block Stair=Escalier en blocs de granit jaune +Cracked Yellow Granite Brick Stair=Escalier en briques de granit jaune fissuré +Cobbled Yellow Granite Stair=Escalier en granite jaune pavé + +Heliodor Stair=Escalier en Héliodore +Heliodor Brick Stair=Escalier en brique d'Héliodore +Heliodor Block Stair=Escalier en blocs d'Héliodore +Cracked Heliodor Brick Stair=Escalier en briques d'Héliodore fissurées + +Howlite Stair=Escalier en Howlite +Howlite Brick Stair=Escalier en brique de Howlite +Howlite Block Stair=Escalier en blocs de Howlite +Cracked Howlite Brick Stair=Escalier en briques de Howlite fissurées +Cobbled Howlite Stair=Escalier en pavé de howlite + +Ilvaite Stair=Escalier en Ilvaite +Ilvaite Brick Stair=Escalier en brique d'Ilvaite +Ilvaite Block Stair=Escalier en blocs d'Ilvaite +Cracked Ilvaite Brick Stair=Escalier en briques d'Ilvaite fissurées +Cobbled Ilvaite Stair=Escalier pavé d'Ilvaite + +Jade Stair=Escalier en Jade +Jade Brick Stair=Escalier en brique de Jade +Jade Block Stair=Escalier en blocs de Jade +Cracked Jade Brick Stair=Escalier en briques de Jade fissurées +Cobbled Jade Stair=Escalier pavé en Jade + +Red Jasper Stair=Escalier de Jaspe Rouge +Red Jasper Brick Stair=Escalier de Brique de Jaspe Rouge +Red Jasper Block Stair=Escalier de Bloc de Jaspe Rouge +Cracked Red Jasper Brick Stair=Escalier de Brique de Jaspe Rouge Fissurée +Cobbled Red Jasper Stair=Escalier de Jaspe Rouge Pavé + +Kyanite Stair=Escalier en Kyanite +Kyanite Brick Stair=Escalier en brique de Kyanite +Kyanite Block Stair=Escalier en blocs de Kyanite +Cracked Kyanite Brick Stair=Escalier en briques de Kyanite fissurées +Cobbled Kyanite Stair=Escalier pavé en Kyanite + +Lapis Lazuli Stair=Escalier en Lapis-lazuli +Lapis Lazuli Brick Stair=Escalier en brique de Lapis-lazuli +Lapis Lazuli Block Stair=Escalier en blocs de Lapis-lazuli +Cracked Lapis Lazuli Brick Stair=Escalier en briques de Lapis-lazuli fissurées + +Lepidolite Stair=Escalier de Lépidolite +Lepidolite Brick Stair=Escalier de Brique de Lépidolite +Lepidolite Block Stair=Escalier de Bloc de Lépidolite +Cracked Lepidolite Brick Stair=Escalier de Brique de Lépidolite Fissurée +Cobbled Lepidolite Stair=Escalier de Lépidolite Pavée + +Blue Limestone Stair=Escalier en calcaire bleu +Blue Limestone Brick Stair=Escalier en brique de calcaire bleu +Blue Limestone Block Stair=Escalier en blocs de calcaire bleu +Cracked Blue Limestone Brick Stair=Escalier en briques de calcaire bleu fissurées +Cobbled Blue Limestone Stair=Escalier pavé en calcaire bleu + +White Limestone Stair=Escalier en calcaire blanc +White Limestone Brick Stair=Escalier en brique de calcaire blanc +White Limestone Block Stair=Escalier en blocs de calcaire blanc +Cracked White Limestone Brick Stair=Escalier en briques de calcaire blanc fissurées +Cobbled White Limestone Stair=Escalier pavé en calcaire blanc + +Marble Stair=Escalier en marbre +Marble Brick Stair=Escalier en brique de marbre +Marble Block Stair=Escalier en bloc de marbre +Cracked Marble Brick Stair=Escalier en brique de marbre fissuré +Cobbled Marble Stair=Escalier en marbre pavé + +Moonstone Stair=Escalier de Pierre de Lune +Moonstone Brick Stair=Escalier de Brique de Pierre de Lune +Moonstone Block Stair=Escalier de Bloc de Pierre de Lune +Cracked Moonstone Brick Stair=Escalier de Brique de Pierre de Lune Fissurée + +Morion Quartz Stair=Escalier en quartz morion +Morion Quartz Brick Stair=Escalier en brique de quartz morion +Morion Quartz Block Stair=Escalier en bloc de quartz morion +Cracked Morion Quartz Brick Stair=Escalier en brique de quartz morion fissurées + +Mudstone Stair=Escalier en grès boueux +Cobbled Mudstone Stair=Escalier en grès boueux pavé +Mudstone Brick Stair=Escalier en brique de grès boueux +Mudstone Block Stair=Escalier en bloc de grès boueux +Cracked Mudstone Brick Stair=Escalier en brique de grès boueux fissuré + +Prasiolite Stair=Escalier en prasiolite +Prasiolite Brick Stair=Escalier en brique de prasiolite +Prasiolite Block Stair=Escalier en bloc de prasiolite +Cracked Prasiolite Brick Stair=Escalier en brique de prasiolite fissuré + +Pumice Stair=Escalier en ponce +Pumice Brick Stair=Escalier en brique de ponce +Pumice Block Stair=Escalier en bloc de ponce +Cracked Pumice Brick Stair=Escalier en brique de ponce fissuré + +Pyrite Stair=Escalier en pyrite +Pyrite Brick Stair=Escalier en brique de pyrite +Pyrite Block Stair=Escalier en bloc de pyrite +Cracked Pyrite Brick Stair=Escalier en brique de pyrite fissuré + +Quartz Stair=Escalier en quartz +Quartz Brick Stair=Escalier en brique de quartz +Quartz Block Stair=Escalier en bloc de quartz +Cracked Quartz Brick Stair=Escalier en brique de quartz fissuré + +Rose Quartz Stair=Escalier en quartz rose +Rose Quartz Brick Stair=Escalier en brique de quartz rose +Rose Quartz Block Stair=Escalier en bloc de quartz rose +Cracked Rose Quartz Brick Stair=Escalier en brique de quartz rose fissuré + +Rhodonite Stair=Escalier de Rhodonite +Rhodonite Brick Stair=Escalier de Brique de Rhodonite +Rhodonite Block Stair=Escalier de Bloc de Rhodonite +Cracked Rhodonite Brick Stair=Escalier de Brique de Rhodonite Fissurée +Cobbled Rhodonite Stair=Escalier de Rhodonite Pavée + +Scoria Stair=Escalier en scorie +Scoria Brick Stair=Escalier en brique de scorie +Scoria Block Stair=Escalier en bloc de scorie +Cracked Scoria Brick Stair=Escalier en brique de scorie fissuré +Cobbled Scoria Stair=Escalier en scorie pavé + +Serpentine Stair=Escalier en serpentine +Cobbled Serpentine Stair=Escalier en serpentine pavé +Serpentine Brick Stair=Escalier en brique de serpentine +Serpentine Block Stair=Escalier en bloc de serpentine +Cracked Serpentine Brick Stair=Escalier en brique de serpentine fissuré + +Shale Stair=Escalier en schiste +Shale Brick Stair=Escalier en briques de schiste +Shale Block Stair=Escalier en blocs de schiste +Cracked Shale Brick Stair=Escalier en briques de schiste fissurées +Cobbled Shale Stair=Escalier en schiste pavé + +Slate Stair=Escalier en ardoise +Slate Brick Stair=Escalier en brique d'ardoise +Slate Block Stair=Escalier en bloc d'ardoise +Cracked Slate Brick Stair=Escalier en brique d'ardoise fissurée +Cobbled Slate Stair=Escalier pavé en ardoise +Slate Tile Stair=Escalier tuile en ardoise + +Smokey Quartz Stair=Escalier en quartz fumé +Smokey Quartz Brick Stair=Escalier en brique de quartz fumé +Smokey Quartz Block Stair=Escalier en bloc de quartz fumé +Cracked Smokey Quartz Brick Stair=Escalier en brique de quartz fumé fissurée + +Soapstone Stair=Escalier en pierre à savon +Soapstone Brick Stair=Escalier en brique de pierre à savon +Soapstone Block Stair=Escalier en bloc de pierre à savon +Cracked Soapstone Brick Stair=Escalier en brique de pierre à savon fissurée + +Sodalite Stair=Escalier en sodalite +Cobbled Sodalite Stair=Escalier pavé en sodalite +Sodalite Brick Stair=Escalier en brique de sodalite +Sodalite Block Stair=Escalier en bloc de sodalite +Cracked Sodalite Brick Stair=Escalier en brique de sodalite fissurée + +Sugilite Stair=Escalier en sugilite +Sugilite Brick Stair=Escalier en brique de sugilite +Sugilite Block Stair=Escalier en bloc de sugilite +Cracked Sugilite Brick Stair=Escalier en brique de sugilite fissurée +Cobbled Sugilite Stair=Escalier pavé en sugilite + +Green Tourmaline Stair=Escalier de Tourmaline Verte +Green Tourmaline Brick Stair=Escalier de Brique de Tourmaline Verte +Green Tourmaline Block Stair=Escalier de Bloc de Tourmaline Verte +Cracked Green Tourmaline Brick Stair=Escalier de Brique de Tourmaline Verte Fissurée + +Paraiba Tourmaline Stair=Escalier de Tourmaline Paraíba +Paraiba Tourmaline Brick Stair=Escalier de Brique de Tourmaline Paraíba +Paraiba Tourmaline Block Stair=Escalier de Bloc de Tourmaline Paraíba +Cracked Paraiba Tourmaline Brick Stair=Escalier de Brique de Tourmaline Paraíba Fissurée + +Pink Tourmaline Stair=Escalier de Tourmaline Rose +Pink Tourmaline Brick Stair=Escalier de Brique de Tourmaline Rose +Pink Tourmaline Block Stair=Escalier de Bloc de Tourmaline Rose +Cracked Pink Tourmaline Brick Stair=Escalier de Brique de Tourmaline Rose Fissurée + +Travertine Stair=Escalier en travertin +Cobbled Travertine Stair=Escalier pavé en travertin +Travertine Brick Stair=Escalier en brique de travertin +Travertine Block Stair=Escalier en bloc de travertin +Cracked Travertine Brick Stair=Escalier en brique de travertin fissurée + +Yellow Travertine Stair=Escalier en travertin jaune +Cobbled Yellow Travertine Stair=Escalier pavé en travertin jaune +Yellow Travertine Brick Stair=Escalier en brique de travertin jaune +Yellow Travertine Block Stair=Escalier en bloc de travertin jaune +Cracked Yellow Travertine Brick Stair=Escalier en brique de travertin jaune fissurée + +Beige Tuff Stair=Escalier en tuf beige +Beige Tuff Block Stair=Escalier en bloc de tuf beige +Cobbled Beige Tuff Stair=Escalier en tuf beige pavé +Beige Tuff Brick Stair=Escalier en brique de tuf beige +Cracked Beige Tuff Stair=Escalier en tuf beige craquelé + +Grey Tuff Stair=Escalier en tuf gris +Grey Tuff Block Stair=Escalier en bloc de tuf gris +Cobbled Grey Tuff Stair=Escalier en tuf gris pavé +Grey Tuff Brick Stair=Escalier en brique de tuf gris +Cracked Grey Tuff Stair=Escalier en tuf gris craquelé + +Red Tuff Stair=Escalier en tuf rouge +Red Tuff Block Stair=Escalier en bloc de tuf rouge +Cobbled Red Tuff Stair=Escalier en tuf rouge pavé +Red Tuff Brick Stair=Escalier en brique de tuf rouge +Cracked Red Tuff Stair=Escalier en tuf rouge craquelé + +Turquoise Stair=Escalier en turquoise +Turquoise Brick Stair=Escalier en brique de turquoise +Turquoise Block Stair=Escalier en bloc de turquoise +Cracked Turquoise Brick Stair=Escalier en brique de turquoise fissurée +Cobbled Turquoise Stair=Escalier pavé en turquoise + +Vivianite Stair=Escalier en vivianite +Vivianite Brick Stair=Escalier en brique de vivianite +Vivianite Block Stair=Escalier en bloc de vivianite +Cracked Vivianite Brick Stair=Escalier en brique de vivianite fissurée + + + +Inner Blue Agate Stair=Escalier en Agate bleue intérieur +Inner Gray Agate Stair=Escalier en Agate grise intérieur +Inner Green Agate Stair=Escalier en Agate verte intérieur +Inner Moss Agate Stair=Escalier en Agate mousse intérieur +Inner Orange Agate Stair=Escalier en Agate orange intérieur +Inner Purple Agate Stair=Escalier en Agate violette intérieur +Inner Red Agate Stair=Escalier en Agate rouge intérieur + +Inner Amazonite Stair=Escalier en Amazonite intérieur +Inner Cobbled Amazonite Stair=Escalier en pavé d'Amazonite intérieur +Inner Amazonite Brick Stair=Escalier en brique d'Amazonite intérieur +Inner Amazonite Block Stair=Escalier en bloc d'Amazonite intérieur +Inner Cracked Amazonite Brick Stair=Escalier en brique d'Amazonite fissurée intérieur + +Inner Amber Stair=Escalier en ambre intérieur +Inner Amber Brick Stair=Escalier en brique d'ambre intérieur +Inner Amber Block Stair=Escalier en bloc d'ambre intérieur +Inner Cracked Amber Brick Stair=Escalier en brique d'ambre fissurée intérieur + +Inner Amethyst Stair=Escalier en améthyste intérieur +Inner Amethyst Brick Stair=Escalier en brique d'améthyste intérieur +Inner Amethyst Block Stair=Escalier en bloc d'améthyste intérieur +Inner Cracked Amethyst Brick Stair=Escalier en brique d'améthyste fissurée intérieur + +Inner Andesite Stair=Escalier en andésite intérieur +Inner Andesite Block Stair=Escalier en bloc d'andésite intérieur +Inner Andesite Brick Stair=Escalier en brique d'andésite intérieur +Inner Cracked Andesite Brick Stair=Escalier en brique d'andésite fissurée intérieur +Inner Cobbled Andesite Stair=Escalier en pavé d'andésite intérieur + +Inner Basalt Stair=Escalier en basalte intérieur +Inner Basalt Brick Stair=Escalier en brique de basalte intérieur +Inner Basalt Block Stair=Escalier en bloc de basalte intérieur +Inner Cracked Basalt Brick Stair=Escalier en brique de basalte fissurée intérieur +Inner Cobbled Basalt Stair=Escalier en pavé de basalte intérieur +Inner Basalt Tile Stair=Escalier en tuile de basalte intérieur + +Inner Black Moonstone Stair=Escalier en pierre de lune noire intérieur +Inner Black Moonstone Brick Stair=Escalier en brique de pierre de lune noire intérieur +Inner Black Moonstone Block Stair=Escalier en bloc de pierre de lune noire intérieur +Inner Cracked Black Moonstone Brick Stair=Escalier en brique de pierre de lune noire fissurée intérieur + +Inner Grey Calcite Stair=Escalier Intérieur de Calcite Grise +Inner Grey Calcite Brick Stair=Escalier Intérieur de Brique de Calcite Grise +Inner Grey Calcite Block Stair=Escalier Intérieur de Bloc de Calcite Grise +Inner Cracked Grey Calcite Brick Stair=Escalier Intérieur de Brique de Calcite Grise Fissurée + +Inner Calcite Stair=Escalier en calcite intérieur +Inner Calcite Brick Stair=Escalier en brique de calcite intérieur +Inner Calcite Block Stair=Escalier en bloc de calcite intérieur +Inner Cracked Calcite Brick Stair=Escalier en brique de calcite fissurée intérieur + +Inner Orange Calcite Stair=Escalier Intérieur de Calcite Orange +Inner Orange Calcite Brick Stair=Escalier Intérieur de Brique de Calcite Orange +Inner Orange Calcite Block Stair=Escalier Intérieur de Bloc de Calcite Orange +Inner Cracked Orange Calcite Brick Stair=Escalier Intérieur de Brique de Calcite Orange Fissurée + +Inner Carnotite Stair=Escalier en carnotite intérieur +Inner Carnotite Brick Stair=Escalier en brique de carnotite intérieur +Inner Carnotite Block Stair=Escalier en bloc de carnotite intérieur +Inner Cracked Carnotite Brick Stair=Escalier en brique de carnotite fissurée intérieur +Inner Cobbled Carnotite Stair=Escalier en pavé de carnotite intérieur + +Inner Celestine Stair=Escalier en célestine intérieur +Inner Celestine Brick Stair=Escalier en brique de célestine intérieur +Inner Celestine Block Stair=Escalier en bloc de célestine intérieur +Inner Cracked Celestine Brick Stair=Escalier en brique de célestine fissurée intérieur + +Inner Chalcanthite Stair=Escalier Intérieur de Chalcanthite +Inner Chalcanthite Brick Stair=Escalier Intérieur de Brique de Chalcanthite +Inner Chalcanthite Block Stair=Escalier Intérieur de Bloc de Chalcanthite +Inner Cracked Chalcanthite Brick Stair=Escalier Intérieur de Brique de Chalcanthite Fissurée +Inner Cobbled Chalcanthite Stair=Escalier Intérieur de Chalcanthite Pavée + +Inner Chrysoprase Stair=Escalier en chrysoprase intérieur +Inner Chrysoprase Brick Stair=Escalier en brique de chrysoprase intérieur +Inner Chrysoprase Block Stair=Escalier en bloc de chrysoprase intérieur +Inner Cracked Chrysoprase Brick Stair=Escalier en brique de chrysoprase fissurée intérieur + +Inner Citrine Stair=Escalier en Citrine intérieur +Inner Citrine Brick Stair=Escalier en brique de Citrine intérieur +Inner Citrine Block Stair=Escalier en bloc de Citrine intérieur +Inner Cracked Citrine Brick Stair=Escalier en brique de Citrine intérieur fissurée + +Inner Covellite Stair=Escalier en Covellite intérieur +Inner Covellite Brick Stair=Escalier en brique de Covellite intérieur +Inner Covellite Block Stair=Escalier en bloc de Covellite intérieur +Inner Cracked Covellite Brick Stair=Escalier en brique de Covellite intérieur fissurée +Inner Cobbled Covellite Stair=Escalier en Covellite pavé intérieur + +Inner Crocoite Stair=Escalier en Crocoite intérieur +Inner Crocoite Brick Stair=Escalier en brique de Crocoite intérieur +Inner Crocoite Block Stair=Escalier en bloc de Crocoite intérieur +Inner Cracked Crocoite Brick Stair=Escalier en brique de Crocoite intérieur fissurée + +Inner Diorite Stair=Escalier en Diorite intérieur +Inner Diorite Brick Stair=Escalier en brique de Diorite intérieur +Inner Diorite Block Stair=Escalier en bloc de Diorite intérieur +Inner Cracked Diorite Brick Stair=Escalier en brique de Diorite intérieur fissurée +Inner Cobbled Diorite Stair=Escalier en Diorite pavé intérieur + +Inner Erythrite Stair=Escalier en Érythrite intérieur +Inner Erythrite Brick Stair=Escalier en brique d'Érythrite intérieur +Inner Erythrite Block Stair=Escalier en bloc d'Érythrite intérieur +Inner Cracked Erythrite Brick Stair=Escalier en brique d'Érythrite intérieur fissurée + +Inner Eudialite Stair=Escalier en Eudialite intérieur +Inner Eudialite Brick Stair=Escalier en brique d'Eudialite intérieur +Inner Eudialite Block Stair=Escalier en bloc d'Eudialite intérieur +Inner Cracked Eudialite Brick Stair=Escalier en brique d'Eudialite intérieur fissurée + +Inner Fluorite Stair=Escalier en fluorite intérieur +Inner Fluorite Brick Stair=Escalier en brique de fluorite intérieur +Inner Fluorite Block Stair=Escalier en bloc de fluorite intérieur +Inner Cracked Fluorite Brick Stair=Escalier en brique de fluorite intérieur fissurée + +Inner Gabbro Stair=Escalier en Gabbro intérieur +Inner Cobbled Gabbro Stair=Escalier en Gabbro intérieur pavée +Inner Gabbro Brick Stair=Escalier en brique de Gabbro intérieur +Inner Gabbro Block Stair=Escalier en bloc de Gabbro intérieur +Inner Cracked Gabbro Brick Stair=Escalier en brique de Gabbro intérieur fissurée + +Inner Galena Stair=Escalier en Galène intérieur +Inner Galena Brick Stair=Escalier en brique de Galène intérieur +Inner Galena Block Stair=Escalier en bloc de Galène intérieur +Inner Cracked Galena Brick Stair=Escalier en brique de Galène intérieur fissurée + +Inner Black Granite Stair=Escalier intérieur en granit noir +Inner Black Granite Brick Stair=Escalier intérieur en briques de granit noir +Inner Black Granite Block Stair=Escalier intérieur en blocs de granit noir +Inner Cracked Black Granite Brick Stair=Escalier intérieur en briques de granit noir fissuré +Inner Cobbled Black Granite Stair=Escalier intérieur en granite noir pavé + +Inner Blue Granite Stair=Escalier intérieur en granit bleu +Inner Blue Granite Brick Stair=Escalier intérieur en briques de granit bleu +Inner Blue Granite Block Stair=Escalier intérieur en blocs de granit bleu +Inner Cracked Blue Granite Brick Stair=Escalier intérieur en briques de granit bleu fissuré +Inner Cobbled Blue Granite Stair=Escalier intérieur en granite bleu pavé + +Inner Gray Granite Stair=Escalier intérieur en granit gris +Inner Gray Granite Brick Stair=Escalier intérieur en briques de granit gris +Inner Gray Granite Block Stair=Escalier intérieur en blocs de granit gris +Inner Cracked Gray Granite Brick Stair=Escalier intérieur en briques de granit gris fissuré +Inner Cobbled Gray Granite Stair=Escalier intérieur en granite gris pavé + +Inner Green Granite Stair=Escalier intérieur en granit vert +Inner Green Granite Brick Stair=Escalier intérieur en briques de granit vert +Inner Green Granite Block Stair=Escalier intérieur en blocs de granit vert +Inner Cracked Green Granite Brick Stair=Escalier intérieur en briques de granit vert fissuré +Inner Cobbled Green Granite Stair=Escalier intérieur en granite vert pavé + +Inner Pink Granite Stair=Escalier intérieur en granit rose +Inner Pink Granite Brick Stair=Escalier intérieur en briques de granit rose +Inner Pink Granite Block Stair=Escalier intérieur en blocs de granit rose +Inner Cracked Pink Granite Brick Stair=Escalier intérieur en briques de granit rose fissuré +Inner Cobbled Pink Granite Stair=Escalier intérieur en granite rose pavé + +Inner Red Granite Stair=Escalier intérieur en granit rouge +Inner Red Granite Brick Stair=Escalier intérieur en briques de granit rouge +Inner Red Granite Block Stair=Escalier intérieur en blocs de granit rouge +Inner Cracked Red Granite Brick Stair=Escalier intérieur en briques de granit rouge fissuré +Inner Cobbled Red Granite Stair=Escalier intérieur en granite rouge pavé + +Inner White Granite Stair=Escalier intérieur en granit blanc +Inner White Granite Brick Stair=Escalier intérieur en briques de granit blanc +Inner White Granite Block Stair=Escalier intérieur en blocs de granit blanc +Inner Cracked White Granite Brick Stair=Escalier intérieur en briques de granit blanc fissuré +Inner Cobbled White Granite Stair=Escalier intérieur en granite blanc pavé + +Inner Yellow Granite Stair=Escalier intérieur en granit jaune +Inner Yellow Granite Brick Stair=Escalier intérieur en briques de granit jaune +Inner Yellow Granite Block Stair=Escalier intérieur en blocs de granit jaune +Inner Cracked Yellow Granite Brick Stair=Escalier intérieur en briques de granit jaune fissuré +Inner Cobbled Yellow Granite Stair=Escalier intérieur en granite jaune pavé + +Inner Heliodor Stair=Escalier en Héliodore intérieur +Inner Heliodor Brick Stair=Escalier en brique d'Héliodore intérieur +Inner Heliodor Block Stair=Escalier en blocs d'Héliodore intérieur +Inner Cracked Heliodor Brick Stair=Escalier en briques d'Héliodore fissurées intérieur + +Inner Howlite Stair=Escalier en Howlite intérieur +Inner Howlite Brick Stair=Escalier en brique de Howlite intérieur +Inner Howlite Block Stair=Escalier en blocs de Howlite intérieur +Inner Cracked Howlite Brick Stair=Escalier en briques de Howlite fissurées intérieur +Inner Cobbled Howlite Stair=Escalier en pavé de howlite intérieur + +Inner Ilvaite Stair=Escalier en Ilvaite intérieur +Inner Ilvaite Brick Stair=Escalier en brique d'Ilvaite intérieur +Inner Ilvaite Block Stair=Escalier en blocs d'Ilvaite intérieur +Inner Cracked Ilvaite Brick Stair=Escalier en briques d'Ilvaite fissurées intérieur +Inner Cobbled Ilvaite Stair=Escalier pavé d'Ilvaite intérieur + +Inner Jade Stair=Escalier en Jade intérieur +Inner Jade Brick Stair=Escalier en brique de Jade intérieur +Inner Jade Block Stair=Escalier en blocs de Jade intérieur +Inner Cracked Jade Brick Stair=Escalier en briques de Jade fissurées intérieur +Inner Cobbled Jade Stair=Escalier pavé en Jade intérieur + +Inner Red Jasper Stair=Escalier Intérieur de Jaspe Rouge +Inner Red Jasper Brick Stair=Escalier Intérieur de Brique de Jaspe Rouge +Inner Red Jasper Block Stair=Escalier Intérieur de Bloc de Jaspe Rouge +Inner Cracked Red Jasper Brick Stair=Escalier Intérieur de Brique de Jaspe Rouge Fissurée +Inner Cobbled Red Jasper Stair=Escalier Intérieur de Jaspe Rouge Pavé + +Inner Kyanite Stair=Escalier en Kyanite intérieur +Inner Kyanite Brick Stair=Escalier en brique de Kyanite intérieur +Inner Kyanite Block Stair=Escalier en blocs de Kyanite intérieur +Inner Cracked Kyanite Brick Stair=Escalier en briques de Kyanite fissurées intérieur +Inner Cobbled Kyanite Stair=Escalier pavé en Kyanite intérieur + +Inner Lapis Lazuli Stair=Escalier en Lapis-lazuli intérieur +Inner Lapis Lazuli Brick Stair=Escalier en brique de Lapis-lazuli intérieur +Inner Lapis Lazuli Block Stair=Escalier en blocs de Lapis-lazuli intérieur +Inner Cracked Lapis Lazuli Brick Stair=Escalier en briques de Lapis-lazuli fissurées intérieur + +Inner Lepidolite Stair=Escalier Intérieur de Lépidolite +Inner Lepidolite Brick Stair=Escalier Intérieur de Brique de Lépidolite +Inner Lepidolite Block Stair=Escalier Intérieur de Bloc de Lépidolite +Inner Cracked Lepidolite Brick Stair=Escalier Intérieur de Brique de Lépidolite Fissurée +Inner Cobbled Lepidolite Stair=Escalier Intérieur de Lépidolite Pavée + +Inner Blue Limestone Stair=Escalier en calcaire bleu intérieur +Inner Blue Limestone Brick Stair=Escalier en brique de calcaire bleu intérieur +Inner Blue Limestone Block Stair=Escalier en blocs de calcaire bleu intérieur +Inner Cracked Blue Limestone Brick Stair=Escalier en briques de calcaire bleu fissurées intérieur +Inner Cobbled Blue Limestone Stair=Escalier pavé en calcaire bleu intérieur + +Inner White Limestone Stair=Escalier en calcaire blanc intérieur +Inner White Limestone Brick Stair=Escalier en brique de calcaire blanc intérieur +Inner White Limestone Block Stair=Escalier en blocs de calcaire blanc intérieur +Inner Cracked White Limestone Brick Stair=Escalier en briques de calcaire blanc fissurées intérieur +Inner Cobbled White Limestone Stair=Escalier pavé en calcaire blanc intérieur + +Inner Marble Stair=Escalier en marbre intérieur +Inner Marble Brick Stair=Escalier en brique de marbre intérieur +Inner Marble Block Stair=Escalier en bloc de marbre intérieur +Inner Cracked Marble Brick Stair=Escalier en brique de marbre fissuré intérieur +Inner Cobbled Marble Stair=Escalier en marbre pavé intérieur + +Inner Moonstone Stair=Escalier Intérieur de Pierre de Lune +Inner Moonstone Brick Stair=Escalier Intérieur de Brique de Pierre de Lune +Inner Moonstone Block Stair=Escalier Intérieur de Bloc de Pierre de Lune +Inner Cracked Moonstone Brick Stair=Escalier Intérieur de Brique de Pierre de Lune Fissurée + +Inner Morion Quartz Stair=Escalier en quartz morion intérieur +Inner Morion Quartz Brick Stair=Escalier en brique de quartz morion intérieur +Inner Morion Quartz Block Stair=Escalier en bloc de quartz morion intérieur +Inner Cracked Morion Quartz Brick Stair=Escalier en brique de quartz morion fissuré intérieur + +Inner Mudstone Stair=Escalier en grès boueux intérieur +Inner Cobbled Mudstone Stair=Escalier en grès boueux pavé intérieur +Inner Mudstone Brick Stair=Escalier en brique de grès boueux intérieur +Inner Mudstone Block Stair=Escalier en bloc de grès boueux intérieur +Inner Cracked Mudstone Brick Stair=Escalier en brique de grès boueux fissuré intérieur + +Inner Prasiolite Stair=Escalier en prasiolite intérieur +Inner Prasiolite Brick Stair=Escalier en brique de prasiolite intérieur +Inner Prasiolite Block Stair=Escalier en bloc de prasiolite intérieur +Inner Cracked Prasiolite Brick Stair=Escalier en brique de prasiolite fissuré intérieur + +Inner Pumice Stair=Escalier en ponce intérieur +Inner Pumice Brick Stair=Escalier en brique de ponce intérieur +Inner Pumice Block Stair=Escalier en bloc de ponce intérieur +Inner Cracked Pumice Brick Stair=Escalier en brique de ponce fissuré intérieur + +Inner Pyrite Stair=Escalier en pyrite intérieur +Inner Pyrite Brick Stair=Escalier en brique de pyrite intérieur +Inner Pyrite Block Stair=Escalier en bloc de pyrite intérieur +Inner Cracked Pyrite Brick Stair=Escalier en brique de pyrite fissuré intérieur + +Inner Quartz Stair=Escalier en quartz intérieur +Inner Quartz Brick Stair=Escalier en brique de quartz intérieur +Inner Quartz Block Stair=Escalier en bloc de quartz intérieur +Inner Cracked Quartz Brick Stair=Escalier en brique de quartz fissuré intérieur + +Inner Rose Quartz Stair=Escalier en quartz rose intérieur +Inner Rose Quartz Brick Stair=Escalier en brique de quartz rose intérieur +Inner Rose Quartz Block Stair=Escalier en bloc de quartz rose intérieur +Inner Cracked Rose Quartz Brick Stair=Escalier en brique de quartz rose fissuré intérieur + +Inner Rhodonite Stair=Escalier Intérieur de Rhodonite +Inner Rhodonite Brick Stair=Escalier Intérieur de Brique de Rhodonite +Inner Rhodonite Block Stair=Escalier Intérieur de Bloc de Rhodonite +Inner Cracked Rhodonite Brick Stair=Escalier Intérieur de Brique de Rhodonite Fissurée +Inner Cobbled Rhodonite Stair=Escalier Intérieur de Rhodonite Pavée + +Inner Scoria Stair=Escalier en scorie intérieur +Inner Scoria Brick Stair=Escalier en brique de scorie intérieur +Inner Scoria Block Stair=Escalier en bloc de scorie intérieur +Inner Cracked Scoria Brick Stair=Escalier en brique de scorie fissuré intérieur +Inner Cobbled Scoria Stair=Escalier en scorie pavé intérieur + +Inner Serpentine Stair=Escalier en serpentine intérieur +Inner Cobbled Serpentine Stair=Escalier en serpentine pavé intérieur +Inner Serpentine Brick Stair=Escalier en brique de serpentine intérieur +Inner Serpentine Block Stair=Escalier en bloc de serpentine intérieur +Inner Cracked Serpentine Brick Stair=Escalier en brique de serpentine fissuré intérieur + +Inner Shale Stair=Escalier intérieur en schiste +Inner Shale Brick Stair=Escalier intérieur en briques de schiste +Inner Shale Block Stair=Escalier intérieur en blocs de schiste +Inner Cracked Shale Brick Stair=Escalier intérieur en briques de schiste fissurées +Inner Cobbled Shale Stair=Escalier intérieur en schiste pavé + +Inner Slate Stair=Escalier intérieur en ardoise +Inner Slate Brick Stair=Escalier intérieur en brique d'ardoise +Inner Slate Block Stair=Escalier intérieur en bloc d'ardoise +Inner Cracked Slate Brick Stair=Escalier intérieur en brique d'ardoise fissurée +Inner Cobbled Slate Stair=Escalier intérieur pavé en ardoise +Inner Slate Tile Wall=Escalier intérieur tuile en ardoise + +Inner Smokey Quartz Stair=Escalier intérieur en quartz fumé +Inner Smokey Quartz Brick Stair=Escalier intérieur en brique de quartz fumé +Inner Smokey Quartz Block Stair=Escalier intérieur en bloc de quartz fumé +Inner Cracked Smokey Quartz Brick Stair=Escalier intérieur en brique de quartz fumé fissurée + +Inner Soapstone Stair=Escalier intérieur en pierre à savon +Inner Soapstone Brick Stair=Escalier intérieur en brique de pierre à savon +Inner Soapstone Block Stair=Escalier intérieur en bloc de pierre à savon +Inner Cracked Soapstone Brick Stair=Escalier intérieur en brique de pierre à savon fissurée + +Inner Sodalite Stair=Escalier intérieur en sodalite +Inner Cobbled Sodalite Stair=Escalier intérieur pavé en sodalite +Inner Sodalite Brick Stair=Escalier intérieur en brique de sodalite +Inner Sodalite Block Stair=Escalier intérieur en bloc de sodalite +Inner Cracked Sodalite Brick Stair=Escalier intérieur en brique de sodalite fissurée + +Inner Sugilite Stair=Escalier intérieur en sugilite +Inner Sugilite Brick Stair=Escalier intérieur en brique de sugilite +Inner Sugilite Block Stair=Escalier intérieur en bloc de sugilite +Inner Cracked Sugilite Brick Stair=Escalier intérieur en brique de sugilite fissurée +Inner Cobbled Sugilite Stair=Escalier intérieur pavé en sugilite + +Inner Green Tourmaline Stair=Escalier Intérieur de Tourmaline Verte +Inner Green Tourmaline Brick Stair=Escalier Intérieur de Brique de Tourmaline Verte +Inner Green Tourmaline Block Stair=Escalier Intérieur de Bloc de Tourmaline Verte +Inner Cracked Green Tourmaline Brick Stair=Escalier Intérieur de Brique de Tourmaline Verte Fissurée + +Inner Paraiba Tourmaline Stair=Escalier Intérieur de Tourmaline Paraíba +Inner Paraiba Tourmaline Brick Stair=Escalier Intérieur de Brique de Tourmaline Paraíba +Inner Paraiba Tourmaline Block Stair=Escalier Intérieur de Bloc de Tourmaline Paraíba +Inner Cracked Paraiba Tourmaline Brick Stair=Escalier Intérieur de Brique de Tourmaline Paraíba Fissurée + +Inner Pink Tourmaline Stair=Escalier Intérieur de Tourmaline Rose +Inner Pink Tourmaline Brick Stair=Escalier Intérieur de Brique de Tourmaline Rose +Inner Pink Tourmaline Block Stair=Escalier Intérieur de Bloc de Tourmaline Rose +Inner Cracked Pink Tourmaline Brick Stair=Escalier Intérieur de Brique de Tourmaline Rose Fissurée + +Inner Travertine Stair=Escalier intérieur en travertin +Inner Cobbled Travertine Stair=Escalier intérieur pavé en travertin +Inner Travertine Brick Stair=Escalier intérieur en brique de travertin +Inner Travertine Block Stair=Escalier intérieur en bloc de travertin +Inner Cracked Travertine Brick Stair=Escalier intérieur en brique de travertin fissurée + +Inner Yellow Travertine Stair=Escalier intérieur en travertin jaune +Inner Cobbled Yellow Travertine Stair=Escalier intérieur pavé en travertin jaune +Inner Yellow Travertine Brick Stair=Escalier intérieur en brique de travertin jaune +Inner Yellow Travertine Block Stair=Escalier intérieur en bloc de travertin jaune +Inner Cracked Yellow Travertine Brick Stair=Escalier intérieur en brique de travertin jaune fissurée + +Inner Beige Tuff Stair=Escalier intérieur en tuf beige +Inner Beige Tuff Block Stair=Escalier intérieur en bloc de tuf beige +Inner Cobbled Beige Tuff Stair=Escalier intérieur en tuf beige pavé +InnerBeige Tuff Brick Stair=Escalier intérieur en brique de tuf beige +Inner Cracked Beige Tuff Stair=Escalier intérieur en tuf beige craquelé + +Inner Grey Tuff Stair=Escalier intérieur en tuf gris +Inner Grey Tuff Block Stair=Escalier intérieur en bloc de tuf gris +Inner Cobbled Grey Tuff Stair=Escalier intérieur en tuf gris pavé +Inner Grey Tuff Brick Stair=Escalier intérieur en brique de tuf gris +Inner Cracked Grey Tuff Stair=Escalier intérieur en tuf gris craquelé + +Inner Red Tuff Stair=Escalier intérieur en tuf rouge +Inner Red Tuff Block Stair=Escalier intérieur en bloc de tuf rouge +Inner Cobbled Red Tuff Stair=Escalier intérieur en tuf rouge pavé +Inner Red Tuff Brick Stair=Escalier en intérieur brique de tuf rouge +Inner Cracked Red Tuff Stair=Escalier intérieur en tuf rouge craquelé + +Inner Turquoise Stair=Escalier intérieur en turquoise +Inner Turquoise Brick Stair=Escalier intérieur en brique de turquoise +Inner Turquoise Block Stair=Escalier intérieur en bloc de turquoise +Inner Cracked Turquoise Brick Stair=Escalier intérieur en brique de turquoise fissurée +Inner Cobbled Turquoise Stair=Escalier intérieur pavé en turquoise + +Inner Vivianite Stair=Escalier intérieur en vivianite +Inner Vivianite Brick Stair=Escalier intérieur en brique de vivianite +Inner Vivianite Block Stair=Escalier intérieur en bloc de vivianite +Inner Cracked Vivianite Brick Stair=Escalier intérieur en brique de vivianite fissurée + + + +Outer Blue Agate Stair=Escalier en Agate bleue extérieure +Outer Gray Agate Stair=Escalier en Agate grise extérieure +Outer Green Agate Stair=Escalier en Agate verte extérieure +Outer Moss Agate Stair=Escalier en Agate mousse extérieure +Outer Orange Agate Stair=Escalier en Agate orange extérieure +Outer Purple Agate Stair=Escalier en Agate violette extérieure +Outer Red Agate Stair=Escalier en Agate rouge extérieure + +Outer Amazonite Stair=Escalier en Amazonite extérieure +Outer Cobbled Amazonite Stair=Escalier en pavé d'Amazonite extérieure +Outer Amazonite Brick Stair=Escalier en brique d'Amazonite extérieure +Outer Amazonite Block Stair=Escalier en bloc d'Amazonite extérieure +Outer Cracked Amazonite Brick Stair=Escalier en brique d'Amazonite fissurée extérieure + +Outer Amber Stair=Escalier en ambre extérieure +Outer Amber Brick Stair=Escalier en brique d'ambre extérieure +Outer Amber Block Stair=Escalier en bloc d'ambre extérieure +Outer Cracked Amber Brick Stair=Escalier en brique d'ambre fissurée extérieure + +Outer Amethyst Stair=Escalier en améthyste extérieure +Outer Amethyst Brick Stair=Escalier en brique d'améthyste extérieure +Outer Amethyst Block Stair=Escalier en bloc d'améthyste extérieure +Outer Cracked Amethyst Brick Stair=Escalier en brique d'améthyste fissurée extérieure + +Outer Andesite Stair=Escalier en andésite extérieure +Outer Andesite Block Stair=Escalier en bloc d'andésite extérieure +Outer Andesite Brick Stair=Escalier en brique d'andésite extérieure +Outer Cracked Andesite Brick Stair=Escalier en brique d'andésite fissurée extérieure +Outer Cobbled Andesite Stair=Escalier en pavé d'andésite extérieure + +Outer Basalt Stair=Escalier en basalte extérieure +Outer Basalt Brick Stair=Escalier en brique de basalte extérieure +Outer Basalt Block Stair=Escalier en bloc de basalte extérieure +Outer Cracked Basalt Brick Stair=Escalier en brique de basalte fissurée extérieure +Outer Cobbled Basalt Stair=Escalier en pavé de basalte extérieure +Outer Basalt Tile Stair=Escalier en tuile de basalte extérieure + +Outer Black Moonstone Stair=Escalier en pierre de lune noire extérieure +Outer Black Moonstone Brick Stair=Escalier en brique de pierre de lune noire extérieure +Outer Black Moonstone Block Stair=Escalier en bloc de pierre de lune noire extérieure +Outer Cracked Black Moonstone Brick Stair=Escalier en brique de pierre de lune noire fissurée extérieure + +Outer Grey Calcite Stair=Escalier Extérieur de Calcite Grise +Outer Grey Calcite Brick Stair=Escalier Extérieur de Brique de Calcite Grise +Outer Grey Calcite Block Stair=Escalier Extérieur de Bloc de Calcite Grise +Outer Cracked Grey Calcite Brick Stair=Escalier Extérieur de Brique de Calcite Grise Fissurée + +Outer Calcite Stair=Escalier en calcite extérieure +Outer Calcite Brick Stair=Escalier en brique de calcite extérieure +Outer Calcite Block Stair=Escalier en bloc de calcite extérieure +Outer Cracked Calcite Brick Stair=Escalier en brique de calcite fissurée extérieure + +Outer Orange Calcite Stair=Escalier Extérieur de Calcite Orange +Outer Orange Calcite Brick Stair=Escalier Extérieur de Brique de Calcite Orange +Outer Orange Calcite Block Stair=Escalier Extérieur de Bloc de Calcite Orange +Outer Cracked Orange Calcite Brick Stair=Escalier Extérieur de Brique de Calcite Orange Fissurée + +Outer Carnotite Stair=Escalier en carnotite extérieure +Outer Carnotite Brick Stair=Escalier en brique de carnotite extérieure +Outer Carnotite Block Stair=Escalier en bloc de carnotite extérieure +Outer Cracked Carnotite Brick Stair=Escalier en brique de carnotite fissurée extérieure +Outer Cobbled Carnotite Stair=Escalier en pavé de carnotite extérieure + +Outer Celestine Stair=Escalier en célestine extérieure +Outer Celestine Brick Stair=Escalier en brique de célestine extérieure +Outer Celestine Block Stair=Escalier en bloc de célestine extérieure +Outer Cracked Celestine Brick Stair=Escalier en brique de célestine fissurée extérieure + +Outer Chalcanthite Stair=Escalier Extérieur de Chalcanthite +Outer Chalcanthite Brick Stair=Escalier Extérieur de Brique de Chalcanthite +Outer Chalcanthite Block Stair=Escalier Extérieur de Bloc de Chalcanthite +Outer Cracked Chalcanthite Brick Stair=Escalier Extérieur de Brique de Chalcanthite Fissurée +Outer Cobbled Chalcanthite Stair=Escalier Extérieur de Chalcanthite Pavée + +Outer Chrysoprase Stair=Escalier en chrysoprase extérieure +Outer Chrysoprase Brick Stair=Escalier en brique de chrysoprase extérieure +Outer Chrysoprase Block Stair=Escalier en bloc de chrysoprase extérieure +Outer Cracked Chrysoprase Brick Stair=Escalier en brique de chrysoprase fissurée extérieure + +Outer Citrine Stair=Escalier en Citrine extérieure +Outer Citrine Brick Stair=Escalier en brique de Citrine extérieure +Outer Citrine Block Stair=Escalier en bloc de Citrine extérieure +Outer Cracked Citrine Brick Stair=Escalier en brique de Citrine extérieure fissurée + +Outer Covellite Stair=Escalier en Covellite extérieure +Outer Covellite Brick Stair=Escalier en brique de Covellite extérieure +Outer Covellite Block Stair=Escalier en bloc de Covellite extérieure +Outer Cracked Covellite Brick Stair=Escalier en brique de Covellite extérieure fissurée +Outer Cobbled Covellite Stair=Escalier en Covellite pavé extérieure + +Outer Crocoite Stair=Escalier en Crocoite extérieure +Outer Crocoite Brick Stair=Escalier en brique de Crocoite extérieure +Outer Crocoite Block Stair=Escalier en bloc de Crocoite extérieure +Outer Cracked Crocoite Brick Stair=Escalier en brique de Crocoite extérieure fissurée + +Outer Diorite Stair=Escalier en Diorite extérieure +Outer Diorite Brick Stair=Escalier en brique de Diorite extérieure +Outer Diorite Block Stair=Escalier en bloc de Diorite extérieure +Outer Cracked Diorite Brick Stair=Escalier en brique de Diorite extérieure fissurée +Outer Cobbled Diorite Stair=Escalier en Diorite pavé extérieure + + +Outer Erythrite Stair=Escalier en Érythrite extérieure +Outer Erythrite Brick Stair=Escalier en brique d'Érythrite extérieure +Outer Erythrite Block Stair=Escalier en bloc d'Érythrite extérieure +Outer Cracked Erythrite Brick Stair=Escalier en brique d'Érythrite extérieure fissurée + +Outer Eudialite Stair=Escalier en Eudialite extérieure +Outer Eudialite Brick Stair=Escalier en brique d'Eudialite extérieure +Outer Eudialite Block Stair=Escalier en bloc d'Eudialite extérieure +Outer Cracked Eudialite Brick Stair=Escalier en brique d'Eudialite extérieure fissurée + +Outer Fluorite Stair=Escalier en fluorite extérieure +Outer Fluorite Brick Stair=Escalier en brique de fluorite extérieure +Outer Fluorite Block Stair=Escalier en bloc de fluorite extérieure +Outer Cracked Fluorite Brick Stair=Escalier en brique de fluorite extérieure fissurée + +Outer Gabbro Stair=Escalier en Gabbro extérieure +Outer Cobbled Gabbro Stair=Escalier en Gabbro extérieure pavée +Outer Gabbro Brick Stair=Escalier en brique de Gabbro extérieure +Outer Gabbro Block Stair=Escalier en bloc de Gabbro extérieure +Outer Cracked Gabbro Brick Stair=Escalier en brique de Gabbro extérieure fissurée + +Outer Galena Stair=Escalier en Galène extérieure +Outer Galena Brick Stair=Escalier en brique de Galène extérieure +Outer Galena Block Stair=Escalier en bloc de Galène extérieure +Outer Cracked Galena Brick Stair=Escalier en brique de Galène extérieure fissurée + +Outer Black Granite Stair=Escalier extérieur en granit noir +Outer Black Granite Brick Stair=Escalier extérieur en briques de granit noir +Outer Black Granite Block Stair=Escalier extérieur en blocs de granit noir +Outer Cracked Black Granite Brick Stair=Escalier extérieur en briques de granit noir fissuré +Outer Cobbled Black Granite Stair=Escalier extérieur en granite noir pavé + +Outer Blue Granite Stair=Escalier extérieur en granit bleu +Outer Blue Granite Brick Stair=Escalier extérieur en briques de granit bleu +Outer Blue Granite Block Stair=Escalier extérieur en blocs de granit bleu +Outer Cracked Blue Granite Brick Stair=Escalier extérieur en briques de granit bleu fissuré +Outer Cobbled Blue Granite Stair=Escalier extérieur en granite bleu pavé + +Outer Gray Granite Stair=Escalier extérieur en granit gris +Outer Gray Granite Brick Stair=Escalier extérieur en briques de granit gris +Outer Gray Granite Block Stair=Escalier extérieur en blocs de granit gris +Outer Cracked Gray Granite Brick Stair=Escalier extérieur en briques de granit gris fissuré +Outer Cobbled Gray Granite Stair=Escalier extérieur en granite gris pavé + +Outer Green Granite Stair=Escalier extérieur en granit vert +Outer Green Granite Brick Stair=Escalier extérieur en briques de granit vert +Outer Green Granite Block Stair=Escalier extérieur en blocs de granit vert +Outer Cracked Green Granite Brick Stair=Escalier extérieur en briques de granit vert fissuré +Outer Cobbled Green Granite Stair=Escalier extérieur en granite vert pavé + +Outer Pink Granite Stair=Escalier extérieur en granit rose +Outer Pink Granite Brick Stair=Escalier extérieur en briques de granit rose +Outer Pink Granite Block Stair=Escalier extérieur en blocs de granit rose +Outer Cracked Pink Granite Brick Stair=Escalier extérieur en briques de granit rose fissuré +Outer Cobbled Pink Granite Stair=Escalier extérieur en granite rose pavé + +Outer Red Granite Stair=Escalier extérieur en granit rouge +Outer Red Granite Brick Stair=Escalier extérieur en briques de granit rouge +Outer Red Granite Block Stair=Escalier extérieur en blocs de granit rouge +Outer Cracked Red Granite Brick Stair=Escalier extérieur en briques de granit rouge fissuré +Outer Cobbled Red Granite Stair=Escalier extérieur en granite rouge pavé + +Outer White Granite Stair=Escalier extérieur en granit blanc +Outer White Granite Brick Stair=Escalier extérieur en briques de granit blanc +Outer White Granite Block Stair=Escalier extérieur en blocs de granit blanc +Outer Cracked White Granite Brick Stair=Escalier extérieur en briques de granit blanc fissuré +Outer Cobbled White Granite Stair=Escalier extérieur en granite blanc pavé + +Outer Yellow Granite Stair=Escalier extérieur en granit jaune +Outer Yellow Granite Brick Stair=Escalier extérieur en briques de granit jaune +Outer Yellow Granite Block Stair=Escalier extérieur en blocs de granit jaune +Outer Cracked Yellow Granite Brick Stair=Escalier extérieur en briques de granit jaune fissuré +Outer Cobbled Yellow Granite Stair=Escalier extérieur en granite jaune pavé + +Outer Heliodor Stair=Escalier en Héliodore extérieur +Outer Heliodor Brick Stair=Escalier en brique d'Héliodore extérieur +Outer Heliodor Block Stair=Escalier en blocs d'Héliodore extérieur +Outer Cracked Heliodor Brick Stair=Escalier en briques d'Héliodore fissurées extérieur + +Outer Howlite Stair=Escalier en Howlite extérieur +Outer Howlite Brick Stair=Escalier en brique de Howlite extérieur +Outer Howlite Block Stair=Escalier en blocs de Howlite extérieur +Outer Cracked Howlite Brick Stair=Escalier en briques de Howlite fissurées extérieur +Outer Cobbled Howlite Stair=Escalier en pavé de howlite extérieur + +Outer Ilvaite Stair=Escalier en Ilvaite extérieur +Outer Ilvaite Brick Stair=Escalier en brique d'Ilvaite extérieur +Outer Ilvaite Block Stair=Escalier en blocs d'Ilvaite extérieur +Outer Cracked Ilvaite Brick Stair=Escalier en briques d'Ilvaite fissurées extérieur +Outer Cobbled Ilvaite Stair=Escalier pavé d'Ilvaite extérieur + +Outer Jade Stair=Escalier en Jade extérieur +Outer Jade Brick Stair=Escalier en brique de Jade extérieur +Outer Jade Block Stair=Escalier en blocs de Jade extérieur +Outer Cracked Jade Brick Stair=Escalier en briques de Jade fissurées extérieur +Outer Cobbled Jade Stair=Escalier pavé en Jade extérieur + +Outer Red Jasper Stair=Escalier Extérieur de Jaspe Rouge +Outer Red Jasper Brick Stair=Escalier Extérieur de Brique de Jaspe Rouge +Outer Red Jasper Block Stair=Escalier Extérieur de Bloc de Jaspe Rouge +Outer Cracked Red Jasper Brick Stair=Escalier Extérieur de Brique de Jaspe Rouge Fissurée +Outer Cobbled Red Jasper Stair=Escalier Extérieur de Jaspe Rouge Pavé + +Outer Kyanite Stair=Escalier en Kyanite extérieur +Outer Kyanite Brick Stair=Escalier en brique de Kyanite extérieur +Outer Kyanite Block Stair=Escalier en blocs de Kyanite extérieur +Outer Cracked Kyanite Brick Stair=Escalier en briques de Kyanite fissurées extérieur +Outer Cobbled Kyanite Stair=Escalier pavé en Kyanite extérieur + +Outer Lapis Lazuli Stair=Escalier en Lapis-lazuli extérieur +Outer Lapis Lazuli Brick Stair=Escalier en brique de Lapis-lazuli extérieur +Outer Lapis Lazuli Block Stair=Escalier en blocs de Lapis-lazuli extérieur +Outer Cracked Lapis Lazuli Brick Stair=Escalier en briques de Lapis-lazuli fissurées extérieur + +Outer Lepidolite Stair=Escalier Extérieur de Lépidolite +Outer Lepidolite Brick Stair=Escalier Extérieur de Brique de Lépidolite +Outer Lepidolite Block Stair=Escalier Extérieur de Bloc de Lépidolite +Outer Cracked Lepidolite Brick Stair=Escalier Extérieur de Brique de Lépidolite Fissurée +Outer Cobbled Lepidolite Stair=Escalier Extérieur de Lépidolite Pavée + +Outer Blue Limestone Stair=Escalier en calcaire bleu extérieur +Outer Blue Limestone Brick Stair=Escalier en brique de calcaire bleu extérieur +Outer Blue Limestone Block Stair=Escalier en blocs de calcaire bleu extérieur +Outer Cracked Blue Limestone Brick Stair=Escalier en briques de calcaire bleu fissurées extérieur +Outer Cobbled Blue Limestone Stair=Escalier pavé en calcaire bleu extérieur + +Outer White Limestone Stair=Escalier en calcaire blanc extérieur +Outer White Limestone Brick Stair=Escalier en brique de calcaire blanc extérieur +Outer White Limestone Block Stair=Escalier en blocs de calcaire blanc extérieur +Outer Cracked White Limestone Brick Stair=Escalier en briques de calcaire blanc fissurées extérieur +Outer Cobbled White Limestone Stair=Escalier pavé en calcaire blanc extérieur + +Outer Marble Stair=Escalier en marbre extérieur +Outer Marble Brick Stair=Escalier en brique de marbre extérieur +Outer Marble Block Stair=Escalier en bloc de marbre extérieur +Outer Cracked Marble Brick Stair=Escalier en brique de marbre fissuré extérieur +Outer Cobbled Marble Stair=Escalier en marbre pavé extérieur + +Outer Moonstone Stair=Escalier Extérieur de Pierre de Lune +Outer Moonstone Brick Stair=Escalier Extérieur de Brique de Pierre de Lune +Outer Moonstone Block Stair=Escalier Extérieur de Bloc de Pierre de Lune +Outer Cracked Moonstone Brick Stair=Escalier Extérieur de Brique de Pierre de Lune Fissurée + +Outer Morion Quartz Stair=Escalier en quartz morion extérieur +Outer Morion Quartz Brick Stair=Escalier en brique de quartz morion extérieur +Outer Morion Quartz Block Stair=Escalier en bloc de quartz morion extérieur +Outer Cracked Morion Quartz Brick Stair=Escalier en brique de quartz morion fissuré extérieur + +Outer Mudstone Stair=Escalier en grès boueux extérieur +Outer Cobbled Mudstone Stair=Escalier en grès boueux pavé extérieur +Outer Mudstone Brick Stair=Escalier en brique de grès boueux extérieur +Outer Mudstone Block Stair=Escalier en bloc de grès boueux extérieur +Outer Cracked Mudstone Brick Stair=Escalier en brique de grès boueux fissuré extérieur + +Outer Prasiolite Stair=Escalier en prasiolite extérieur +Outer Prasiolite Brick Stair=Escalier en brique de prasiolite extérieur +Outer Prasiolite Block Stair=Escalier en bloc de prasiolite extérieur +Outer Cracked Prasiolite Brick Stair=Escalier en brique de prasiolite fissuré extérieur + +Outer Pumice Stair=Escalier en ponce extérieur +Outer Pumice Brick Stair=Escalier en brique de ponce extérieur +Outer Pumice Block Stair=Escalier en bloc de ponce extérieur +Outer Cracked Pumice Brick Stair=Escalier en brique de ponce fissuré extérieur + +Outer Pyrite Stair=Escalier en pyrite extérieur +Outer Pyrite Brick Stair=Escalier en brique de pyrite extérieur +Outer Pyrite Block Stair=Escalier en bloc de pyrite extérieur +Outer Cracked Pyrite Brick Stair=Escalier en brique de pyrite fissuré extérieur + +Outer Quartz Stair=Escalier en quartz extérieur +Outer Quartz Brick Stair=Escalier en brique de quartz extérieur +Outer Quartz Block Stair=Escalier en bloc de quartz extérieur +Outer Cracked Quartz Brick Stair=Escalier en brique de quartz fissuré extérieur + +Outer Rose Quartz Stair=Escalier en quartz rose extérieur +Outer Rose Quartz Brick Stair=Escalier en brique de quartz rose extérieur +Outer Rose Quartz Block Stair=Escalier en bloc de quartz rose extérieur +Outer Cracked Rose Quartz Brick Stair=Escalier en brique de quartz rose fissuré extérieur + +Outer Rhodonite Stair=Escalier Extérieur de Rhodonite +Outer Rhodonite Brick Stair=Escalier Extérieur de Brique de Rhodonite +Outer Rhodonite Block Stair=Escalier Extérieur de Bloc de Rhodonite +Outer Cracked Rhodonite Brick Stair=Escalier Extérieur de Brique de Rhodonite Fissurée +Outer Cobbled Rhodonite Stair=Escalier Extérieur de Rhodonite Pavée + +Outer Scoria Stair=Escalier en scorie extérieur +Outer Scoria Brick Stair=Escalier en brique de scorie extérieur +Outer Scoria Block Stair=Escalier en bloc de scorie extérieur +Outer Cracked Scoria Brick Stair=Escalier en brique de scorie fissuré extérieur +Outer Cobbled Scoria Stair=Escalier en scorie pavé extérieur + +Outer Serpentine Stair=Escalier en serpentine extérieur +Outer Cobbled Serpentine Stair=Escalier en serpentine pavé extérieur +Outer Serpentine Brick Stair=Escalier en brique de serpentine extérieur +Outer Serpentine Block Stair=Escalier en bloc de serpentine extérieur +Outer Cracked Serpentine Brick Stair=Escalier en brique de serpentine fissuré extérieur + +Outer Shale Stair=Escalier extérieur en schiste +Outer Shale Brick Stair=Escalier extérieur en briques de schiste +Outer Shale Block Stair=Escalier extérieur en blocs de schiste +Outer Cracked Shale Brick Stair=Escalier extérieur en briques de schiste fissurées +Outer Cobbled Shale Stair=Escalier extérieur en schiste pavé + +Outer Slate Stair=Escalier extérieur en ardoise +Outer Slate Brick Stair=Escalier extérieur en brique d'ardoise +Outer Slate Block Stair=Escalier extérieur en bloc d'ardoise +Outer Cracked Slate Brick Stair=Escalier extérieur en brique d'ardoise fissurée +Outer Cobbled Slate Stair=Escalier extérieur pavé en ardoise +Outer Slate Tile Wall=Escalier extérieur tuile en ardoise + +Outer Smokey Quartz Stair=Escalier extérieur en quartz fumé +Outer Smokey Quartz Brick Stair=Escalier extérieur en brique de quartz fumé +Outer Smokey Quartz Block Stair=Escalier extérieur en bloc de quartz fumé +Outer Cracked Smokey Quartz Brick Stair=Escalier extérieur en brique de quartz fumé fissurée + +Outer Soapstone Stair=Escalier extérieur en pierre à savon +Outer Soapstone Brick Stair=Escalier extérieur en brique de pierre à savon +Outer Soapstone Block Stair=Escalier extérieur en bloc de pierre à savon +Outer Cracked Soapstone Brick Stair=Escalier extérieur en brique de pierre à savon fissurée + +Outer Sodalite Stair=Escalier extérieur en sodalite +Outer Cobbled Sodalite Stair=Escalier extérieur pavé en sodalite +Outer Sodalite Brick Stair=Escalier extérieur en brique de sodalite +Outer Sodalite Block Stair=Escalier extérieur en bloc de sodalite +Outer Cracked Sodalite Brick Stair=Escalier extérieur en brique de sodalite fissurée + +Outer Sugilite Stair=Escalier extérieur en sugilite +Outer Sugilite Brick Stair=Escalier extérieur en brique de sugilite +Outer Sugilite Block Stair=Escalier extérieur en bloc de sugilite +Outer Cracked Sugilite Brick Stair=Escalier extérieur en brique de sugilite fissurée +Outer Cobbled Sugilite Stair=Escalier extérieur pavé en sugilite + +Outer Green Tourmaline Stair=Escalier Extérieur de Tourmaline Verte +Outer Green Tourmaline Brick Stair=Escalier Extérieur de Brique de Tourmaline Verte +Outer Green Tourmaline Block Stair=Escalier Extérieur de Bloc de Tourmaline Verte +Outer Cracked Green Tourmaline Brick Stair=Escalier Extérieur de Brique de Tourmaline Verte Fissurée + +Outer Paraiba Tourmaline Stair=Escalier Extérieur de Tourmaline Paraíba +Outer Paraiba Tourmaline Brick Stair=Escalier Extérieur de Brique de Tourmaline Paraíba +Outer Paraiba Tourmaline Block Stair=Escalier Extérieur de Bloc de Tourmaline Paraíba +Outer Cracked Paraiba Tourmaline Brick Stair=Escalier Extérieur de Brique de Tourmaline Paraíba Fissurée + +Outer Pink Tourmaline Stair=Escalier Extérieur de Tourmaline Rose +Outer Pink Tourmaline Brick Stair=Escalier Extérieur de Brique de Tourmaline Rose +Outer Pink Tourmaline Block Stair=Escalier Extérieur de Bloc de Tourmaline Rose +Outer Cracked Pink Tourmaline Brick Stair=Escalier Extérieur de Brique de Tourmaline Rose Fissurée + +Outer Travertine Stair=Escalier extérieur en travertin +Outer Cobbled Travertine Stair=Escalier extérieur pavé en travertin +Outer Travertine Brick Stair=Escalier extérieur en brique de travertin +Outer Travertine Block Stair=Escalier extérieur en bloc de travertin +Outer Cracked Travertine Brick Stair=Escalier extérieur en brique de travertin fissurée + +Outer Yellow Travertine Stair=Escalier extérieur en travertin jaune +Outer Cobbled Yellow Travertine Stair=Escalier extérieur pavé en travertin jaune +Outer Yellow Travertine Brick Stair=Escalier extérieur en brique de travertin jaune +Outer Yellow Travertine Block Stair=Escalier extérieur en bloc de travertin jaune +Outer Cracked Yellow Travertine Brick Stair=Escalier extérieur en brique de travertin jaune fissurée + +Outer Beige Tuff Stair=Escalier extérieur en tuf beige +Outer Beige Tuff Block Stair=Escalier extérieur en bloc de tuf beige +Outer Cobbled Beige Tuff Stair=Escalier extérieur en tuf beige pavé +Outer Beige Tuff Brick Stair=Escalier extérieur en brique de tuf beige +Outer Cracked Beige Tuff Stair=Escalier extérieur en tuf beige craquelé + +Outer Grey Tuff Stair=Escalier extérieur en tuf gris +Outer Grey Tuff Block Stair=Escalier extérieur en bloc de tuf gris +Outer Cobbled Grey Tuff Stair=Escalier extérieur en tuf gris pavé +Outer Grey Tuff Brick Stair=Escalier extérieur en brique de tuf gris +Outer Cracked Grey Tuff Stair=Escalier extérieur en tuf gris craquelé + +Outer Red Tuff Stair=Escalier extérieur en tuf rouge +Outer Red Tuff Block Stair=Escalier extérieur en bloc de tuf rouge +Outer Cobbled Red Tuff Stair=Escalier extérieur en tuf rouge pavé +Outer Red Tuff Brick Stair=Escalier en extérieur brique de tuf rouge +Outer Cracked Red Tuff Stair=Escalier extérieur en tuf rouge craquelé + +Outer Turquoise Stair=Escalier extérieur en turquoise +Outer Turquoise Brick Stair=Escalier extérieur en brique de turquoise +Outer Turquoise Block Stair=Escalier extérieur en bloc de turquoise +Outer Cracked Turquoise Brick Stair=Escalier extérieur en brique de turquoise fissurée +Outer Cobbled Turquoise Stair=Escalier extérieur pavé en turquoise + +Outer Vivianite Stair=Escalier extérieur en vivianite +Outer Vivianite Brick Stair=Escalier extérieur en brique de vivianite +Outer Vivianite Block Stair=Escalier extérieur en bloc de vivianite +Outer Cracked Vivianite Brick Stair=Escalier extérieur en brique de vivianite fissurée + +### nodes_glowing.lua ### + +Glowing Apatite=Apatite luminescente +Glowing Apatite Block=Bloc d'apatite luminescente +Cobbled Glowing Apatite=Apatite luminescente pavée +Glowing Apatite Brick=Brique d'apatite luminescente +Cracked Glowing Apatite Brick=Brique d'apatite luminescente fissurée + +Glowing Calcite=Calcite luminescente +Glowing Calcite Block=Bloc de calcite luminescente +Cobbled Glowing Calcite=Calcite luminescente pavée +Glowing Calcite Brick=Brique de calcite luminescente +Cracked Glowing Calcite Brick=Brique de calcite luminescente fissurée + +Glowing Esperite=Esperite luminescente +Glowing Esperite Block=Bloc d'esperite luminescente +Cobbled Glowing Esperite=Esperite luminescente pavée +Glowing Esperite Brick=Brique d'esperite luminescente +Cracked Glowing Esperite Brick=Brique d'esperite luminescente fissurée + +Glowing Fluorite=Fluorite luminescente +Glowing Fluorite Block=Bloc de fluorite luminescente +Cobbled Glowing Fluorite=Fluorite luminescente pavée +Glowing Fluorite Brick=Brique de fluorite luminescente +Cracked Glowing Fluorite Brick=Brique de fluorite luminescente fissurée + +Glowing Selenite=Sélénite luminescente +Glowing Selenite Block=Bloc de sélénite luminescente +Cobbled Glowing Selenite=Sélénite luminescente pavée +Glowing Selenite Brick=Brique de sélénite luminescente +Cracked Glowing Selenite Brick=Brique de sélénite luminescente fissurée + +Glowing Sodalite=Sodalite luminescente +Glowing Sodalite Block=Bloc de sodalite luminescente +Cobbled Glowing Sodalite=Sodalite luminescente pavée +Glowing Sodalite Brick=Brique de sodalite luminescente +Cracked Glowing Sodalite Brick=Brique de sodalite luminescente fissurée + +Glowing Willemite=Willemite luminescente +Glowing Willemite Block=Bloc de willemite luminescente +Cobbled Glowing Willemite=Willemite luminescente pavée +Glowing Willemite Brick=Brique de willemite luminescente +Cracked Glowing Willemite Brick=Brique de willemite luminescente fissurée + +### nodes_crystal.lua ### + +Budding Amazonite=Amazonite Bourgeonnante +Amazonite Crystal=Cristal d'Amazonite + +Budding Amber=Ambre Bourgeonnant +Amber Crystal=Cristal d'Ambre + +Budding Amethyst=Améthyste Bourgeonnante +Amethyst Crystal=Cristal d'Améthyste + +Budding Celestine=Célestine Bourgeonnante +Celestine Crystal=Cristal de Célestine + +Budding Chalcanthite=Chalcanthite Bourgeonnante +Chalcanthite Crystal=Cristal de Chalcanthite + +Budding Citrine=Citrine Bourgeonnante +Citrine Crystal=Cristal de Citrine + +Budding Crocoite=Crocoïte Bourgeonnante +Crocoite Crystal=Cristal de Crocoïte + +Budding Eudialite=Eudialite Bourgeonnante +Eudialite Crystal=Cristal d'Eudialite + +Budding Heliodor=Héliodore Bourgeonnant +Heliodor Crystal=Cristal d'Héliodore + +Budding Kyanite=Cyanite Bourgeonnante +Kyanite Crystal=Cristal de Cyanite + +Budding Moonstone=Pierre de Lune Bourgeonnante +Moonstone Crystal=Cristal de Pierre de Lune + +Budding Morion Quartz=Quartz Morion Bourgeonnant +Morion Quartz Crystal=Cristal de Quartz Morion + +Budding Prasiolite=Prasiolite Bourgeonnante +Prasiolite Crystal=Cristal de Prasiolite + +Budding Quartz=Quartz Bourgeonnant +Quartz Crystal=Cristal de Quartz + +Budding Rose Quartz=Quartz Rose Bourgeonnant +Rose Quartz Crystal=Cristal de Quartz Rose + +Budding Smokey Quartz=Quartz Fumé Bourgeonnant +Smokey Quartz Crystal=Cristal de Quartz Fumé + +Budding Green Tourmaline=Tourmaline Verte Bourgeonnante +Green Tourmaline Crystal=Cristal de Tourmaline Verte + +Budding Paraiba Tourmaline=Tourmaline Paraïba Bourgeonnante +Paraiba Tourmaline Crystal=Cristal de Tourmaline Paraïba + +Budding Pink Tourmaline=Tourmaline Rose Bourgeonnante +Pink Tourmaline Crystal=Cristal de Tourmaline Rose + +Budding Vivianite=Vivianite Bourgeonnante +Vivianite Crystal=Cristal de Vivianite diff --git a/mods/too_many_stones/locale/too_many_stones.ja.tr b/mods/too_many_stones/locale/too_many_stones.ja.tr new file mode 100644 index 00000000..1a07668d --- /dev/null +++ b/mods/too_many_stones/locale/too_many_stones.ja.tr @@ -0,0 +1,2471 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate=é’色ã®ç‘ªç‘™ +Gray Agate=ç°è‰²ã®ç‘ªç‘™ +Green Agate=緑色ã®ç‘ªç‘™ +Moss Agate=苔むã—ãŸç‘ªç‘™ +Orange Agate=橙色ã®ç‘ªç‘™ +Purple Agate=紫色ã®ç‘ªç‘™ +Red Agate=赤色ã®ç‘ªç‘™ + +Amazonite=アマゾナイト +Amazonite Block=アマゾナイトブロック +Cobbled Amazonite=石畳ã«ã—ãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆ +Amazonite Brick=アマゾナイトレンガ +Cracked Amazonite Brick=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Amber=ç¥ç€ +Amber Block=ç¥ç€ãƒ–ロック +Amber Brick=ç¥ç€ãƒ¬ãƒ³ã‚¬ +Cracked Amber Brick=ã²ã³å‰²ã‚ŒãŸç¥ç€ãƒ¬ãƒ³ã‚¬ + +Amethyst=アメジスト +Amethyst Block=アメジストブロック +Amethyst Brick=アメジストレンガ +Cracked Amethyst Brick=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆãƒ¬ãƒ³ã‚¬ + +Andesite=安山岩 +Andesite Block=安山岩ブロック +Andesite Brick=安山岩レンガ +Cracked Andesite Brick=ã²ã³å‰²ã‚ŒãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Andesite=石畳ã«ã—ãŸå®‰å±±å²© + +Basalt=玄武岩 +Basalt Block=玄武岩ブロック +Basalt Brick=玄武岩レンガ +Cracked Basalt Brick=ã²ã³å‰²ã‚ŒãŸçŽ„æ­¦å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Basalt=石畳ã«ã—ãŸçŽ„æ­¦å²© +Basalt Tile=玄武岩タイル + +Columnar Basalt=柱状ã®çŽ„æ­¦å²© + +Batch=ガラスãƒãƒƒãƒ + +Black Moonstone=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ +Black Moonstone Block=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ–ロック +Black Moonstone Brick=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ +Cracked Black Moonstone Brick=ã²ã³å‰²ã‚ŒãŸé»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ + +Black Opal=ブラックオパール + +Calcite=方解石 +Calcite Block=方解石ブロック +Calcite Brick=方解石レンガ +Cracked Calcite Brick=ã²ã³å‰²ã‚ŒãŸæ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ + +Grey Calcite=ç°è‰²ã®æ–¹è§£çŸ³ +Grey Calcite Block=ç°è‰²ã®æ–¹è§£çŸ³ãƒ–ロック +Grey Calcite Brick=ç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Grey Calcite Brick=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ + +Orange Calcite=æ©™è‰²ã®æ–¹è§£çŸ³ +Orange Calcite Block=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ–ロック +Orange Calcite Brick=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Orange Calcite Brick=ã²ã³å‰²ã‚ŒãŸæ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ + +Carnotite=カルノタイト +Carnotite Block=カルノタイトブロック +Carnotite Brick=カルノタイトレンガ +Cracked Carnotite Brick=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Carnotite=石畳ã«ã—ãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆ + +Celestine=天é’石 +Celestine Block=天é’石ブロック +Celestine Brick=天é’石レンガ +Cracked Celestine Brick=ã²ã³å‰²ã‚ŒãŸå¤©é’石レンガ + +Chalcanthite=カルカンサイト +Chalcanthite Block=カルカンサイトブロック +Chalcanthite Brick=カルカンサイトレンガ +Cracked Chalcanthite Brick=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Chalcanthite=石畳ã«ã—ãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆ + +Chrysoprase=クリソプレーズ +Chrysoprase Block=クリソプレーズブロック +Chrysoprase Brick=クリソプレーズレンガ +Cracked Chrysoprase Brick=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒªã‚½ãƒ—レーズレンガ + +Citrine=シトリン +Citrine Block=シトリンブロック +Citrine Brick=シトリンレンガ +Cracked Citrine Brick=ã²ã³å‰²ã‚ŒãŸã‚·ãƒˆãƒªãƒ³ãƒ¬ãƒ³ã‚¬ + +Covellite=コベライト +Covellite Block=コベライトブロック +Covellite Brick=コベライトレンガ +Cracked Covellite Brick=ã²ã³å‰²ã‚ŒãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Covellite=石畳ã«ã—ãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆ + +Crocoite=クロコアイト +Crocoite Block=クロコアイトブロック +Crocoite Brick=クロコアイトレンガ +Cracked Crocoite Brick=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Diorite=閃緑岩 +Diorite Block=閃緑岩ブロック +Diorite Brick=閃緑岩レンガ +Cracked Diorite Brick=ã²ã³å‰²ã‚ŒãŸé–ƒç·‘岩レンガ +Cobbled Diorite=石畳ã«ã—ãŸé–ƒç·‘岩 + +Erythrite=エリスライト +Erythrite Block=エリスライトブロック +Erythrite Brick=エリスライトレンガ +Cracked Erythrite Brick=ã²ã³å‰²ã‚ŒãŸã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Eudialite=ユーディアライト +Eudialite Block=ユーディアライトブロック +Eudialite Brick=ユーディアライトレンガ +Cracked Eudialite Brick=ã²ã³å‰²ã‚ŒãŸãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Fluorite=è›çŸ³ +Fluorite Block=è›çŸ³ãƒ–ロック +Fluorite Brick=è›çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Fluorite Brick=ã²ã³å‰²ã‚ŒãŸè›çŸ³ãƒ¬ãƒ³ã‚¬ + +Fire Opal=ファイアオパール + +Gabbro=斑れã„岩 +Gabbro Block=斑れã„岩ブロック +Cobbled Gabbro=石畳ã«ã—ãŸæ–‘れã„岩 +Gabbro Brick=斑れã„岩レンガ +Cracked Gabbro Brick=ã²ã³å‰²ã‚ŒãŸæ–‘れã„岩レンガ + +Galena=方鉛鉱 +Galena Block=方鉛鉱ブロック +Galena Brick=方鉛鉱レンガ +Cracked Galena Brick=ã²ã³å‰²ã‚ŒãŸæ–¹é‰›é‰±ãƒ¬ãƒ³ã‚¬ + +Black Granite=黒色ã®èб崗岩 +Black Granite Block=黒色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Black Granite Brick=黒色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Black Granite Brick=ã²ã³å‰²ã‚ŒãŸé»’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Black Granite=石畳ã«ã—ãŸé»’色ã®èб崗岩 + +Blue Granite=é’色ã®èб崗岩 +Blue Granite Block=é’色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Blue Granite Brick=é’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Blue Granite Brick=ã²ã³å‰²ã‚ŒãŸé’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Blue Granite=石畳ã«ã—ãŸé’色ã®èб崗岩 + +Gray Granite=ç°è‰²ã®èб崗岩 +Gray Granite Block=ç°è‰²ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Gray Granite Brick=ç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Gray Granite Brick=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Gray Granite=石畳ã«ã—ãŸç°è‰²ã®èб崗岩 + +Green Granite=緑色ã®èб崗岩 +Green Granite Block=緑色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Green Granite Brick=緑色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Green Granite Brick=ã²ã³å‰²ã‚ŒãŸç·‘色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Green Granite=石畳ã«ã—ãŸç·‘色ã®èб崗岩 + +Pink Granite=桃色ã®èб崗岩 +Pink Granite Block=桃色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Pink Granite Brick=桃色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Pink Granite Brick=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Pink Granite=石畳ã«ã—ãŸæ¡ƒè‰²ã®èб崗岩 + +Red Granite=赤色ã®èб崗岩 +Red Granite Block=赤色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Red Granite Brick=赤色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Red Granite Brick=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Red Granite=石畳ã«ã—ãŸèµ¤è‰²ã®èб崗岩 + +White Granite=白色ã®èб崗岩 +White Granite Block=白色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +White Granite Brick=白色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked White Granite Brick=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled White Granite=石畳ã«ã—ãŸç™½è‰²ã®èб崗岩 + +Yellow Granite=黄色ã®èб崗岩 +Yellow Granite Block=黄色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ +Yellow Granite Brick=黄色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cracked Yellow Granite Brick=ã²ã³å‰²ã‚ŒãŸé»„色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Yellow Granite=石畳ã«ã—ãŸé»„色ã®èб崗岩 + +Heliodor=ヘリオドール +Heliodor Block=ヘリオドールブロック +Heliodor Brick=ヘリオドールレンガ +Cracked Heliodor Brick=ã²ã³å‰²ã‚ŒãŸãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ãƒ¬ãƒ³ã‚¬ + +Howlite=ãƒã‚¦ãƒ©ã‚¤ãƒˆ +Howlite Block=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ–ロック +Howlite Brick=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cracked Howlite Brick=ã²ã³å‰²ã‚ŒãŸãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Howlite=石畳ã«ã—ãŸãƒã‚¦ãƒ©ã‚¤ãƒˆ + +Ilvaite=イルヴァイト +Ilvaite Block=イルヴァイトブロック +Ilvaite Brick=イルヴァイトレンガ +Cracked Ilvaite Brick=ã²ã³å‰²ã‚ŒãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Ilvaite=石畳ã«ã—ãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆ + +Jade=ç¿¡ç¿  +Jade Block=翡翠ブロック +Jade Brick=翡翠レンガ +Cracked Jade Brick=ã²ã³å‰²ã‚ŒãŸç¿¡ç¿ ãƒ¬ãƒ³ã‚¬ +Cobbled Jade=石畳ã«ã—ãŸç¿¡ç¿  + +Red Jasper=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ー +Red Jasper Block=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーブロック +Red Jasper Brick=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガ +Cracked Red Jasper Brick=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガ +Cobbled Red Jasper=石畳ã«ã—ãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ー + +Kyanite=カイヤナイト +Kyanite Block=カイヤナイトブロック +Kyanite Brick=カイヤナイトレンガ +Cracked Kyanite Brick=ã²ã³å‰²ã‚ŒãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Kyanite=石畳ã«ã—ãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆ + +Lapis Lazuli=ラピスラズリ +Lapis Lazuli Block=ラピスラズリブロック +Lapis Lazuli Brick=ラピスラズリレンガ +Cracked Lapis Lazuli Brick=ã²ã³å‰²ã‚ŒãŸãƒ©ãƒ”スラズリレンガ + +Lepidolite=レピドライト +Lepidolite Block=レピドライトブロック +Lepidolite Brick=レピドライトレンガ +Cracked Lepidolite Brick=ã²ã³å‰²ã‚ŒãŸãƒ¬ãƒ”ドライトレンガ +Cobbled Lepidolite=石畳ã«ã—ãŸãƒ¬ãƒ”ドライト + +Blue Limestone=é’色ã®çŸ³ç°å²© +Blue Limestone Block=é’色ã®çŸ³ç°å²©ãƒ–ロック +Blue Limestone Brick=é’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ +Cracked Blue Limestone Brick=ã²ã³å‰²ã‚ŒãŸé’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Blue Limestone=石畳ã«ã—ãŸé’色ã®çŸ³ç°å²© + +White Limestone=白色ã®çŸ³ç°å²© +White Limestone Block=白色ã®çŸ³ç°å²©ãƒ–ロック +White Limestone Brick=白色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ +Cracked White Limestone Brick=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ +Cobbled White Limestone=石畳ã«ã—ãŸç™½è‰²ã®çŸ³ç°å²© + +Marble=大ç†çŸ³ +Marble Block=大ç†çŸ³ãƒ–ロック +Marble Brick=大ç†çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Marble Brick=ã²ã³å‰²ã‚ŒãŸå¤§ç†çŸ³ãƒ¬ãƒ³ã‚¬ +Cobbled Marble=石畳ã«ã—ãŸå¤§ç†çŸ³ + +Moonstone=ムーンストーン +Moonstone Block=ムーンストーンブロック +Moonstone Brick=ムーンストーンレンガ +Cracked Moonstone Brick=ã²ã³å‰²ã‚ŒãŸãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ + +Morion Quartz=é»’æ°´æ™¶ +Morion Quartz Block=黒水晶ブロック +Morion Quartz Brick=黒水晶レンガ +Cracked Morion Quartz Brick=ã²ã³å‰²ã‚ŒãŸé»’水晶レンガ + +Mudstone=泥岩 +Mudstone Block=泥岩ブロック +Cobbled Mudstone=石畳ã«ã—ãŸæ³¥å²© +Mudstone Brick=泥岩レンガ +Cracked Mudstone Brick=ã²ã³å‰²ã‚ŒãŸæ³¥å²©ãƒ¬ãƒ³ã‚¬ + +Opal=オパール + +Prasiolite=プラジオライト +Prasiolite Block=プラジオライトブロック +Prasiolite Brick=プラジオライトレンガ +Cracked Prasiolite Brick=ã²ã³å‰²ã‚ŒãŸãƒ—ラジオライトレンガ + +Pumice=軽石 +Pumice Block=軽石ブロック +Pumice Brick=軽石レンガ +Cracked Pumice Brick=ã²ã³å‰²ã‚ŒãŸè»½çŸ³ãƒ¬ãƒ³ã‚¬ + +Pyrite=パイライト +Pyrite Block=パイライトブロック +Cobbled Pyrite=石畳ã«ã—ãŸãƒ‘イライト +Pyrite Brick=パイライトレンガ +Cracked Pyrite Brick=ã²ã³å‰²ã‚ŒãŸãƒ‘イライトレンガ + +Quartz=クォーツ +Quartz Block=クォーツブロック +Quartz Brick=クォーツレンガ +Cracked Quartz Brick=ã²ã³å‰²ã‚ŒãŸã‚¯ã‚©ãƒ¼ãƒ„レンガ + +Rhodonite=ロードナイト +Rhodonite Block=ロードナイトブロック +Rhodonite Brick=ロードナイトレンガ +Cracked Rhodonite Brick=ã²ã³å‰²ã‚ŒãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Rhodonite=石畳ã«ã—ãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆ + +Rose Quartz=ç´…æ°´æ™¶ +Rose Quartz Block=紅水晶ブロック +Rose Quartz Brick=紅水晶レンガ +Cracked Rose Quartz Brick=ã²ã³å‰²ã‚ŒãŸç´…水晶レンガ + +Scoria=スコリア +Scoria Block=スコリアブロック +Scoria Brick=スコリアレンガ +Cracked Scoria Brick=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚³ãƒªã‚¢ãƒ¬ãƒ³ã‚¬ +Cobbled Scoria=石畳ã«ã—ãŸã‚¹ã‚³ãƒªã‚¢ + +Serpentine=蛇紋石 +Serpentine Block=蛇紋石ブロック +Cobbled Serpentine=石畳ã«ã—ãŸè›‡ç´‹çŸ³ +Serpentine Brick=蛇紋石レンガ +Cracked Serpentine Brick=ã²ã³å‰²ã‚ŒãŸè›‡ç´‹çŸ³ãƒ¬ãƒ³ã‚¬ + +Shale=æ³¥æ¿å²© +Shale Block=æ³¥æ¿å²©ãƒ–ロック +Shale Brick=æ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ +Cracked Shale Brick=ã²ã³å‰²ã‚ŒãŸæ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Shale=石畳ã«ã—ãŸæ³¥æ¿å²© + +Slate=粘æ¿å²© +Slate Block=粘æ¿å²©ãƒ–ロック +Slate Brick=粘æ¿å²©ãƒ¬ãƒ³ã‚¬ +Cracked Slate Brick=ã²ã³å‰²ã‚ŒãŸç²˜æ¿å²©ãƒ¬ãƒ³ã‚¬ +Cobbled Slate=石畳ã«ã—ãŸç²˜æ¿å²© +Slate Tile=粘æ¿å²©ã‚¿ã‚¤ãƒ« + +Smokey Quartz=煙水晶 +Smokey Quartz Block=煙水晶ブロック +Smokey Quartz Brick=煙水晶レンガ +Cracked Smokey Quartz Brick=ã²ã³å‰²ã‚ŒãŸç…™æ°´æ™¶ãƒ¬ãƒ³ã‚¬ + +Soapstone=石鹸石 +Soapstone Block=石鹸石ブロック +Soapstone Brick=石鹸石レンガ +Cracked Soapstone Brick=ã²ã³å‰²ã‚ŒãŸçŸ³é¹¸çŸ³ãƒ¬ãƒ³ã‚¬ + +Sodalite=ソーダライト +Sodalite Block=ソーダライトブロック +Cobbled Sodalite=石畳ã«ã—ãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆ +Sodalite Brick=ソーダライトレンガ +Cracked Sodalite Brick=ã²ã³å‰²ã‚ŒãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Sugilite=スギライト +Sugilite Block=スギライトブロック +Sugilite Brick=スギライトレンガ +Cracked Sugilite Brick=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cobbled Sugilite=石畳ã«ã—ãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆ + +Green Tourmaline=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ +Green Tourmaline Block=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロック +Green Tourmaline Brick=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ +Cracked Green Tourmaline Brick=ã²ã³å‰²ã‚ŒãŸç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ + +Paraiba Tourmaline=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ +Paraiba Tourmaline Block=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロック +Paraiba Tourmaline Brick=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ +Cracked Paraiba Tourmaline Brick=ã²ã³å‰²ã‚ŒãŸãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ + +Pink Tourmaline=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ +Pink Tourmaline Block=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロック +Pink Tourmaline Brick=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ +Cracked Pink Tourmaline Brick=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ + +Travertine=トラãƒãƒ†ã‚£ãƒ³ +Travertine Block=トラãƒãƒ†ã‚£ãƒ³ãƒ–ロック +Cobbled Travertine=石畳ã«ã—ãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ +Travertine Brick=トラãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ +Cracked Travertine Brick=ã²ã³å‰²ã‚ŒãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ + +Yellow Travertine=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ +Yellow Travertine Block=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ–ロック +Cobbled Yellow Travertine=石畳ã«ã—ãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ +Yellow Travertine Brick=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ +Cracked Yellow Travertine Brick=ã²ã³å‰²ã‚ŒãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ + +Beige Tuff=ベージュ色ã®å‡ç°å²© +Beige Tuff Block=ベージュ色ã®å‡ç°å²©ãƒ–ロック +Cobbled Beige Tuff=石畳ã«ã—ãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²© +Beige Tuff Brick=ベージュ色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ +Cracked Beige Tuff=ã²ã³å‰²ã‚ŒãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²© + +Grey Tuff=ç°è‰²ã®å‡ç°å²© +Grey Tuff Block=ç°è‰²ã®å‡ç°å²©ãƒ–ロック +Cobbled Grey Tuff=石畳ã«ã—ãŸç°è‰²ã®å‡ç°å²© +Grey Tuff Brick=ç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ +Cracked Grey Tuff=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®å‡ç°å²© + +Red Tuff=赤色ã®å‡ç°å²© +Red Tuff Block=赤色ã®å‡ç°å²©ãƒ–ロック +Cobbled Red Tuff=石畳ã«ã—ãŸèµ¤è‰²ã®å‡ç°å²© +Red Tuff Brick=赤色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ +Cracked Red Tuff=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®å‡ç°å²© + +Turquoise=ターコイズ +Turquoise Block=ターコイズブロック +Turquoise Brick=ターコイズレンガ +Cracked Turquoise Brick=ã²ã³å‰²ã‚ŒãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºãƒ¬ãƒ³ã‚¬ +Cobbled Turquoise=石畳ã«ã—ãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚º +Turquoise Pebble=ターコイズã®å°çŸ³ + +Vivianite=ビビアナイト +Vivianite Block=ビビアナイトブロック +Vivianite Brick=ビビアナイトレンガ +Cracked Vivianite Brick=ã²ã³å‰²ã‚ŒãŸãƒ“ビアナイトレンガ + +### wall.lua ### + +Blue Agate Wall=é’色ã®ç‘ªç‘™ã®å¡€ +Gray Agate Wall=ç°è‰²ã®ç‘ªç‘™ã®å¡€ +Green Agate Wall=緑色ã®ç‘ªç‘™ã®å¡€ +Moss Agate Wall=苔むã—ãŸç‘ªç‘™ã®å¡€ +Orange Agate Wall=橙色ã®è‰²ã®ç‘ªç‘™ã®å¡€ +Purple Agate Wall=紫色ã®ç‘ªç‘™ã®å¡€ +Red Agate Wall=赤色ã®ç‘ªç‘™ã®å¡€ + +Amazonite Wall=アマゾナイトã®å¡€ +Cobbled Amazonite Wall=石畳ã«ã—ãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆã®å¡€ +Amazonite Brick Wall=アマゾナイトレンガã®å¡€ +Amazonite Block Wall=アマゾナイトブロックã®å¡€ +Cracked Amazonite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ + +Amber Wall=ç¥ç€ã®å¡€ +Amber Brick Wall=ç¥ç€ãƒ¬ãƒ³ã‚¬ã®å¡€ +Amber Block Wall=ç¥ç€ãƒ–ロックã®å¡€ +Cracked Amber Brick Wall=ã²ã³å‰²ã‚ŒãŸç¥ç€ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Amethyst Wall=アメジストã®å¡€ +Amethyst Brick Wall=アメジストレンガã®å¡€ +Amethyst Block Wall=アメジストブロックã®å¡€ +Cracked Amethyst Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ + +Ammolite=アンモライト + +Andesite Wall=安山岩ã®å¡€ +Andesite Block Wall=安山岩ブロックã®å¡€ +Andesite Brick Wall=安山岩レンガã®å¡€ +Cracked Andesite Brick Wall=ã²ã³å‰²ã‚ŒãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Andesite Wall=石畳ã«ã—ãŸå®‰å±±å²©ã®å¡€ + +Basalt Wall=玄武岩ã®å¡€ +Basalt Block Wall=玄武岩ブロックã®å¡€ +Basalt Brick Wall=玄武岩レンガã®å¡€ +Cracked Basalt Brick Wall=ã²ã³å‰²ã‚ŒãŸçŽ„æ­¦å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Basalt Wall=石畳ã«ã—ãŸçŽ„æ­¦å²©ã®å¡€ +Basalt Tile Wall=玄武岩タイルã®å¡€ + +Black Moonstone Wall=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ã®å¡€ +Black Moonstone Brick Wall=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Black Moonstone Block Wall=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ–ロックã®å¡€ +Cracked Black Moonstone Brick Wall=ã²ã³å‰²ã‚ŒãŸé»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Calcite Wall=方解石ã®å¡€ +Calcite Brick Wall=方解石レンガã®å¡€ +Calcite Block Wall=方解石ブロックã®å¡€ +Cracked Calcite Brick Wall=ã²ã³å‰²ã‚ŒãŸæ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Grey Calcite Wall=ç°è‰²ã®æ–¹è§£çŸ³ã®å¡€ +Grey Calcite Brick Wall=ç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Grey Calcite Block Wall=ç°è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®å¡€ +Cracked Grey Calcite Brick Wall=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Orange Calcite Wall=橙色ã®è‰²ã®æ–¹è§£çŸ³ã®å¡€ +Orange Calcite Brick Wall=橙色ã®è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Orange Calcite Block Wall=橙色ã®è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®å¡€ +Cracked Orange Calcite Brick Wall=ã²ã³å‰²ã‚ŒãŸæ©™è‰²ã®è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Carnotite Wall=カルノタイトã®å¡€ +Carnotite Brick Wall=カルノタイトレンガã®å¡€ +Carnotite Block Wall=カルノタイトブロックã®å¡€ +Cracked Carnotite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Carnotite Wall=石畳ã«ã—ãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆã®å¡€ + +Celestine Wall=天é’石ã®å¡€ +Celestine Brick Wall=天é’石レンガã®å¡€ +Celestine Block Wall=天é’石ブロックã®å¡€ +Cracked Celestine Brick Wall=ã²ã³å‰²ã‚ŒãŸå¤©é’石レンガã®å¡€ + +Chalcanthite Wall=カルカンサイトã®å¡€ +Chalcanthite Brick Wall=カルカンサイトレンガã®å¡€ +Chalcanthite Block Wall=カルカンサイトブロックã®å¡€ +Cracked Chalcanthite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Chalcanthite Wall=石畳ã«ã—ãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆã®å¡€ + +Chrysoprase Wall=クリソプレーズã®å¡€ +Chrysoprase Brick Wall=クリソプレーズレンガã®å¡€ +Chrysoprase Block Wall=クリソプレーズブロックã®å¡€ +Cracked Chrysoprase Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒªã‚½ãƒ—レーズレンガã®å¡€ + +Citrine Wall=シトリンã®å¡€ +Citrine Brick Wall=シトリンレンガã®å¡€ +Citrine Block Wall=シトリンブロックã®å¡€ +Cracked Citrine Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚·ãƒˆãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Covellite Wall=コベライトã®å¡€ +Covellite Brick Wall=コベライトレンガã®å¡€ +Covellite Block Wall=コベライトブロックã®å¡€ +Cracked Covellite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Covellite Wall=石畳ã«ã—ãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆã®å¡€ + +Crocoite Wall=クロコアイトã®å¡€ +Crocoite Brick Wall=クロコアイトレンガã®å¡€ +Crocoite Block Wall=クロコアイトブロックã®å¡€ +Cracked Crocoite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ + +Diorite Wall=閃緑岩ã®å¡€ +Diorite Brick Wall=閃緑岩レンガã®å¡€ +Diorite Block Wall=閃緑岩ブロックã®å¡€ +Cracked Diorite Brick Wall=ã²ã³å‰²ã‚ŒãŸé–ƒç·‘岩レンガã®å¡€ +Cobbled Diorite Wall=石畳ã«ã—ãŸé–ƒç·‘岩ã®å¡€ + +Erythrite Wall=エリスライトã®å¡€ +Erythrite Brick Wall=エリスライトレンガã®å¡€ +Erythrite Block Wall=エリスライトブロックã®å¡€ +Cracked Erythrite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ + +Eudialite Wall=ユーディアライトã®å¡€ +Eudialite Brick Wall=ユーディアライトレンガã®å¡€ +Eudialite Block Wall=ユーディアライトブロックã®å¡€ +Cracked Eudialite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ + +Fluorite Wall=è›çŸ³ã®å¡€ +Fluorite Brick Wall=è›çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Fluorite Block Wall=è›çŸ³ãƒ–ロックã®å¡€ +Cracked Fluorite Brick Wall=ã²ã³å‰²ã‚ŒãŸè›çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Gabbro Wall=斑れã„岩ã®å¡€ +Cobbled Gabbro Wall=石畳ã«ã—ãŸæ–‘れã„岩ã®å¡€ +Gabbro Brick Wall=斑れã„岩レンガã®å¡€ +Gabbro Block Wall=斑れã„岩ブロックã®å¡€ +Cracked Gabbro Brick Wall=ã²ã³å‰²ã‚ŒãŸæ–‘れã„岩レンガã®å¡€ + +Galena Wall=方鉛鉱ã®å¡€ +Galena Brick Wall=方鉛鉱レンガã®å¡€ +Galena Block Wall=方鉛鉱ブロックã®å¡€ +Cracked Galena Brick Wall=ã²ã³å‰²ã‚ŒãŸæ–¹é‰›é‰±ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Black Granite Wall=黒色ã®èб崗岩ã®å¡€ +Black Granite Brick Wall=黒色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Black Granite Block Wall=黒色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Black Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸé»’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Black Granite Wall=石畳ã«ã—ãŸé»’色ã®èб崗岩ã®å¡€ + +Blue Granite Wall=é’色ã®èб崗岩ã®å¡€ +Blue Granite Brick Wall=é’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Blue Granite Block Wall=é’色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Blue Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸé’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Blue Granite Wall=石畳ã«ã—ãŸé’色ã®èб崗岩ã®å¡€ + +Gray Granite Wall=ç°è‰²ã®èб崗岩ã®å¡€ +Gray Granite Brick Wall=ç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Gray Granite Block Wall=ç°è‰²ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Gray Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobble Gray Granite Wall=石畳ã«ã—ãŸç°è‰²ã®èб崗岩ã®å¡€ + +Green Granite Wall=緑色ã®èб崗岩ã®å¡€ +Green Granite Brick Wall=緑色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Green Granite Block Wall=緑色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Green Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸç·‘色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Green Granite Wall=石畳ã«ã—ãŸç·‘色ã®èб崗岩ã®å¡€ + +Pink Granite Wall=桃色ã®èб崗岩ã®å¡€ +Pink Granite Brick Wall=桃色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Pink Granite Block Wall=桃色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Pink Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Pink Granite Wall=石畳ã«ã—ãŸæ¡ƒè‰²ã®èб崗岩ã®å¡€ + +Red Granite Wall=赤色ã®èб崗岩ã®å¡€ +Red Granite Brick Wall=赤色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Red Granite Block Wall=赤色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Red Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Red Granite Wall=石畳ã«ã—ãŸèµ¤è‰²ã®èб崗岩ã®å¡€ + +White Granite Wall=白色ã®èб崗岩ã®å¡€ +White Granite Brick Wall=白色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +White Granite Block Wall=白色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked White Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled White Granite Wall=石畳ã«ã—ãŸç™½è‰²ã®èб崗岩ã®å¡€ + +Yellow Granite Wall=黄色ã®èб崗岩ã®å¡€ +Yellow Granite Brick Wall=黄色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Yellow Granite Block Wall=黄色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å¡€ +Cracked Yellow Granite Brick Wall=ã²ã³å‰²ã‚ŒãŸé»„色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Yellow Granite Wall=石畳ã«ã—ãŸé»„色ã®èб崗岩ã®å¡€ + +Heliodor Wall=ヘリオドールã®å¡€ +Heliodor Brick Wall=ヘリオドールレンガã®å¡€ +Heliodor Block Wall=ヘリオドールブロックã®å¡€ +Cracked Heliodor Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Howlite Wall=ãƒã‚¦ãƒ©ã‚¤ãƒˆã®å¡€ +Howlite Brick Wall=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Howlite Block Wall=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ–ロックã®å¡€ +Cracked Howlite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Howlite Wall=石畳ã«ã—ãŸãƒã‚¦ãƒ©ã‚¤ãƒˆã®å¡€ + +Ilvaite Wall=イルヴァイトã®å¡€ +Ilvaite Brick Wall=イルヴァイトレンガã®å¡€ +Ilvaite Block Wall=イルヴァイトブロックã®å¡€ +Cracked Ilvaite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Ilvaite Wall=石畳ã«ã—ãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆã®å¡€ + +Jade Wall=ç¿¡ç¿ ã®å¡€ +Jade Brick Wall=翡翠レンガã®å¡€ +Jade Block Wall=翡翠ブロックã®å¡€ +Cracked Jade Brick Wall=ã²ã³å‰²ã‚ŒãŸç¿¡ç¿ ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Jade Wall=石畳ã«ã—ãŸç¿¡ç¿ ã®å¡€ + +Red Jasper Wall=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®å¡€ +Red Jasper Brick Wall=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®å¡€ +Red Jasper Block Wall=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーブロックã®å¡€ +Cracked Red Jasper Brick Wall=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®å¡€ +Cobbled Red Jasper Wall=石畳ã«ã—ãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®å¡€ + +Kyanite Wall=カイヤナイトã®å¡€ +Kyanite Brick Wall=カイヤナイトレンガã®å¡€ +Kyanite Block Wall=カイヤナイトブロックã®å¡€ +Cracked Kyanite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Kyanite Wall=石畳ã«ã—ãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆã®å¡€ + +Lapis Lazuli Wall=ラピスラズリã®å¡€ +Lapis Lazuli Brick Wall=ラピスラズリレンガã®å¡€ +Lapis Lazuli Block Wall=ラピスラズリブロックã®å¡€ +Cracked Lapis Lazuli Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ©ãƒ”スラズリレンガã®å¡€ + +Lepidolite Wall=レピドライトã®å¡€ +Lepidolite Brick Wall=レピドライトレンガã®å¡€ +Lepidolite Block Wall=レピドライトブロックã®å¡€ +Cracked Lepidolite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ¬ãƒ”ドライトレンガã®å¡€ +Cobbled Lepidolite Wall=石畳ã«ã—ãŸãƒ¬ãƒ”ドライトã®å¡€ + +Blue Limestone Wall=é’色ã®çŸ³ç°å²©ã®å¡€ +Blue Limestone Brick Wall=é’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Blue Limestone Block Wall=é’色ã®çŸ³ç°å²©ãƒ–ロックã®å¡€ +Cracked Blue Limestone Brick Wall=ã²ã³å‰²ã‚ŒãŸé’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Blue Limestone Wall=石畳ã«ã—ãŸé’色ã®çŸ³ç°å²©ã®å¡€ + +White Limestone Wall=白色ã®çŸ³ç°å²©ã®å¡€ +White Limestone Brick Wall=白色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +White Limestone Block Wall=白色ã®çŸ³ç°å²©ãƒ–ロックã®å¡€ +Cracked White Limestone Brick Wall=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled White Limestone Wall=石畳ã«ã—ãŸç™½è‰²ã®çŸ³ç°å²©ã®å¡€ + +Marble Wall=大ç†çŸ³ã®å¡€ +Marble Brick Wall=大ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Marble Block Wall=大ç†çŸ³ãƒ–ロックã®å¡€ +Cracked Marble Brick Wall=ã²ã³å‰²ã‚ŒãŸå¤§ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Marble Wall=石畳ã«ã—ãŸå¤§ç†çŸ³ã®å¡€ + +Moonstone Wall=ムーンストーンã®å¡€ +Moonstone Brick Wall=ムーンストーンレンガã®å¡€ +Moonstone Block Wall=ムーンストーンブロックã®å¡€ +Cracked Moonstone Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Morion Quartz Wall=é»’æ°´æ™¶ã®å¡€ +Morion Quartz Brick Wall=黒水晶レンガã®å¡€ +Morion Quartz Block Wall=黒水晶ブロックã®å¡€ +Cracked Morion Quartz Brick Wall=ã²ã³å‰²ã‚ŒãŸé»’水晶レンガã®å¡€ + +Mudstone Wall=泥岩ã®å¡€ +Cobbled Mudstone Wall=石畳ã«ã—ãŸæ³¥å²©ã®å¡€ +Mudstone Brick Wall=泥岩レンガã®å¡€ +Mudstone Block Wall=泥岩ブロックã®å¡€ +Cracked Mudstone Brick Wall=ã²ã³å‰²ã‚ŒãŸæ³¥å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Prasiolite Wall=プラジオライトã®å¡€ +Prasiolite Brick Wall=プラジオライトレンガã®å¡€ +Prasiolite Block Wall=プラジオライトブロックã®å¡€ +Cracked Prasiolite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ—ラジオライトレンガã®å¡€ + +Pumice Wall=軽石ã®å¡€ +Pumice Brick Wall=軽石レンガã®å¡€ +Pumice Block Wall=軽石ブロックã®å¡€ +Cracked Pumice Brick Wall=ã²ã³å‰²ã‚ŒãŸè»½çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Pyrite Wall=パイライトã®å¡€ +Pyrite Brick Wall=パイライトレンガã®å¡€ +Pyrite Block Wall=パイライトブロックã®å¡€ +Cracked Pyrite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ‘イライトレンガã®å¡€ + +Quartz Wall=æ°´æ™¶ã®å¡€ +Quartz Brick Wall=水晶レンガã®å¡€ +Quartz Block Wall=水晶ブロックã®å¡€ +Cracked Quartz Brick Wall=ã²ã³å‰²ã‚ŒãŸæ°´æ™¶ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Rhodonite Wall=ロードナイトã®å¡€ +Rhodonite Brick Wall=ロードナイトレンガã®å¡€ +Rhodonite Block Wall=ロードナイトブロックã®å¡€ +Cracked Rhodonite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Rhodonite Wall=石畳ã«ã—ãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆã®å¡€ + +Rose Quartz Wall=ç´…æ°´æ™¶ã®å¡€ +Rose Quartz Brick Wall=紅水晶レンガã®å¡€ +Rose Quartz Block Wall=紅水晶ブロックã®å¡€ +Cracked Rose Quartz Brick Wall=ã²ã³å‰²ã‚ŒãŸç´…水晶レンガã®å¡€ + +Scoria Wall=スコリアã®å¡€ +Scoria Brick Wall=スコリアレンガã®å¡€ +Scoria Block Wall=スコリアブロックã®å¡€ +Cracked Scoria Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚³ãƒªã‚¢ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Scoria Wall=石畳ã«ã—ãŸã‚¹ã‚³ãƒªã‚¢ã®å¡€ + +Serpentine Wall=蛇紋石ã®å¡€ +Cobbled Serpentine Wall=石畳ã«ã—ãŸè›‡ç´‹çŸ³ã®å¡€ +Serpentine Brick Wall=蛇紋石レンガã®å¡€ +Serpentine Block Wall=蛇紋石ブロックã®å¡€ +Cracked Serpentine Brick Wall=ã²ã³å‰²ã‚ŒãŸè›‡ç´‹çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Shale Wall=æ³¥æ¿å²©ã®å¡€ +Shale Brick Wall=æ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Shale Block Wall=æ³¥æ¿å²©ãƒ–ロックã®å¡€ +Cracked Shale Brick Wall=ã²ã³å‰²ã‚ŒãŸæ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Shale Wall=石畳ã«ã—ãŸæ³¥æ¿å²©ã®å¡€ + +Slate Wall=粘æ¿å²©ã®å¡€ +Slate Brick Wall=粘æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Slate Block Wall=粘æ¿å²©ãƒ–ロックã®å¡€ +Cracked Slate Brick Wall=ã²ã³å‰²ã‚ŒãŸç²˜æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Slate Wall=石畳ã«ã—ãŸç²˜æ¿å²©ã®å¡€ +Slate Tile Wall=粘æ¿å²©ã‚¿ã‚¤ãƒ«ã®å¡€ + +Smokey Quartz Wall=煙水晶ã®å¡€ +Smokey Quartz Brick Wall=煙水晶レンガã®å¡€ +Smokey Quartz Block Wall=煙水晶ブロックã®å¡€ +Cracked Smokey Quartz Brick Wall=ã²ã³å‰²ã‚ŒãŸç…™æ°´æ™¶ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Soapstone Wall=石鹸石ã®å¡€ +Soapstone Brick Wall=石鹸石レンガã®å¡€ +Soapstone Block Wall=石鹸石ブロックã®å¡€ +Cracked Soapstone Brick Wall=ã²ã³å‰²ã‚ŒãŸçŸ³é¹¸çŸ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Sodalite Wall=ソーダライトã®å¡€ +Cobbled Sodalite Wall=石畳ã«ã—ãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆã®å¡€ +Sodalite Brick Wall=ソーダライトレンガã®å¡€ +Sodalite Block Wall=ソーダライトブロックã®å¡€ +Cracked Sodalite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ + +Sugilite Wall=スギライトã®å¡€ +Sugilite Brick Wall=スギライトレンガã®å¡€ +Sugilite Block Wall=スギライトブロックã®å¡€ +Cracked Sugilite Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Sugilite Wall=石畳ã«ã—ãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆã®å¡€ + +Green Tourmaline Wall=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å¡€ +Green Tourmaline Brick Wall=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Green Tourmaline Block Wall=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®å¡€ +Cracked Green Tourmaline Brick Wall=ã²ã³å‰²ã‚ŒãŸç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Paraiba Tourmaline Wall=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®å¡€ +Paraiba Tourmaline Brick Wall=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Paraiba Tourmaline Block Wall=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®å¡€ +Cracked Paraiba Tourmaline Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Pink Tourmaline Wall=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å¡€ +Pink Tourmaline Brick Wall=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Pink Tourmaline Block Wall=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®å¡€ +Cracked Pink Tourmaline Brick Wall=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Travertine Wall=トラãƒãƒ†ã‚£ãƒ³ã®å¡€ +Cobbled Travertine Wall=石畳ã«ã—ãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å¡€ +Travertine Brick Wall=トラãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Travertine Block Wall=トラãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®å¡€ +Cracked Travertine Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Yellow Travertine Wall=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å¡€ +Cobbled Yellow Travertine Wall=石畳ã«ã—ãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å¡€ +Yellow Travertine Brick Wall=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ +Yellow Travertine Block Wall=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®å¡€ +Cracked Yellow Travertine Brick Wall=ã²ã³å‰²ã‚ŒãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Beige Tuff Wall=ベージュ色ã®è‰²ã®å‡ç°å²©ã®å¡€ +Cobbled Beige Tuff Wall=石畳ã«ã—ãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®è‰²ã®å‡ç°å²©ã®å¡€ +Beige Tuff Block Wall=ベージュ色ã®è‰²ã®å‡ç°å²©ãƒ–ロックã®å¡€ +Beige Tuff Brick Wall=ベージュ色ã®è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cracked Beige Tuff Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Grey Tuff Wall=ç°è‰²ã®å‡ç°å²©ã®å¡€ +Cobbled Grey Tuff Wall=石畳ã«ã—ãŸç°è‰²ã®å‡ç°å²©ã®å¡€ +Grey Tuff Block Wall=ç°è‰²ã®å‡ç°å²©ãƒ–ロックã®å¡€ +Grey Tuff Brick Wall=ç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cracked Grey Tuff Brick Wall=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Red Tuff Wall=赤色ã®å‡ç°å²©ã®å¡€ +Cobbled Red Tuff Wall=石畳ã«ã—ãŸèµ¤è‰²ã®å‡ç°å²©ã®å¡€ +Red Tuff Block Wall=赤色ã®å‡ç°å²©ãƒ–ロックã®å¡€ +Red Tuff Brick Wall=赤色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ +Cracked Red Tuff Brick Wall=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å¡€ + +Turquoise Wall=ターコイズã®å¡€ +Turquoise Brick Wall=ターコイズレンガã®å¡€ +Turquoise Block Wall=ターコイズブロックã®å¡€ +Cracked Turquoise Brick Wall=ã²ã³å‰²ã‚ŒãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºãƒ¬ãƒ³ã‚¬ã®å¡€ +Cobbled Turquoise Wall=石畳ã«ã—ãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºã®å¡€ + +Vivianite Wall=ビビアナイトã®å¡€ +Vivianite Brick Wall=ビビアナイトレンガã®å¡€ +Vivianite Block Wall=ビビアナイトブロックã®å¡€ +Cracked Vivianite Brick Wall=ã²ã³å‰²ã‚ŒãŸãƒ“ビアナイトレンガã®å¡€ + +### stairs.lua ### + +Blue Agate Slab=é’瑪瑙スラブ +Gray Agate Slab=ç°è‰²ã®ç‘ªç‘™ã‚¹ãƒ©ãƒ– +Green Agate Slab=緑色ã®ç‘ªç‘™ã‚¹ãƒ©ãƒ– +Moss Agate Slab=苔むã—ãŸç‘ªç‘™ã‚¹ãƒ©ãƒ– +Orange Agate Slab=橙色ã®è‰²ã®ç‘ªç‘™ã‚¹ãƒ©ãƒ– +Purple Agate Slab=紫色ã®ç‘ªç‘™ã‚¹ãƒ©ãƒ– +Red Agate Slab=赤色ã®ç‘ªç‘™ã‚¹ãƒ©ãƒ– + +Amazonite Slab=アマゾナイトスラブ +Cobbled Amazonite Slab=石畳ã«ã—ãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆã‚¹ãƒ©ãƒ– +Amazonite Brick Slab=アマゾナイトレンガã®ã‚¹ãƒ©ãƒ– +Amazonite Block Slab=アマゾナイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Amazonite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Amber Slab=ç¥ç€ã‚¹ãƒ©ãƒ– +Amber Brick Slab=ç¥ç€ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Amber Block Slab=ç¥ç€ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Amber Brick Slab=ã²ã³å‰²ã‚ŒãŸç¥ç€ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Amethyst Slab=アメジストスラブ +Amethyst Brick Slab=アメジストレンガã®ã‚¹ãƒ©ãƒ– +Amethyst Block Slab=アメジストブロックã®ã‚¹ãƒ©ãƒ– +Cracked Amethyst Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Andesite Slab=安山岩スラブ +Andesite Block Slab=安山岩ブロックã®ã‚¹ãƒ©ãƒ– +Cobbled Andesite Slab=石畳ã«ã—ãŸå®‰å±±å²©ã‚¹ãƒ©ãƒ– +Andesite Brick Slab=安山岩レンガã®ã‚¹ãƒ©ãƒ– +Cobbled Andesite Brick Slab=石畳ã«ã—ãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Basalt Slab=玄武岩スラブ +Basalt Block Slab=玄武岩ブロックã®ã‚¹ãƒ©ãƒ– +Basalt Brick Slab=玄武岩レンガã®ã‚¹ãƒ©ãƒ– +Cracked Basalt Brick Slab=ã²ã³å‰²ã‚ŒãŸçŽ„æ­¦å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Basalt Slab=石畳ã«ã—ãŸçŽ„æ­¦å²©ã‚¹ãƒ©ãƒ– +Basalt Tile Slab=タイルã®çŽ„æ­¦å²©ã‚¹ãƒ©ãƒ– + +Black Moonstone Slab=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ã‚¹ãƒ©ãƒ– +Black Moonstone Brick Slab=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Black Moonstone Block Slab=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Black Moonstone Brick Slab=ã²ã³å‰²ã‚ŒãŸé»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Calcite Slab=方解石スラブ +Calcite Brick Slab=方解石レンガã®ã‚¹ãƒ©ãƒ– +Calcite Block Slab=方解石ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Calcite Brick Slab=ã²ã³å‰²ã‚ŒãŸæ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Grey Calcite Slab=ç°è‰²ã®æ–¹è§£çŸ³ã‚¹ãƒ©ãƒ– +Grey Calcite Brick Slab=ç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Grey Calcite Block Slab=ç°è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Grey Calcite Brick Slab=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Orange Calcite Slab=橙色ã®è‰²ã®æ–¹è§£çŸ³ã‚¹ãƒ©ãƒ– +Orange Calcite Brick Slab=橙色ã®è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Orange Calcite Block Slab=橙色ã®è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Orange Calcite Brick Slab=ã²ã³å‰²ã‚ŒãŸæ©™è‰²ã®è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Carnotite Slab=カルノタイトスラブ +Carnotite Brick Slab=カルノタイトレンガã®ã‚¹ãƒ©ãƒ– +Carnotite Block Slab=カルノタイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Carnotite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Carnotite Slab=石畳ã«ã—ãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆã‚¹ãƒ©ãƒ– + +Celestine Slab=天é’石スラブ +Celestine Brick Slab=天é’石レンガã®ã‚¹ãƒ©ãƒ– +Celestine Block Slab=天é’石ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Celestine Brick Slab=ã²ã³å‰²ã‚ŒãŸå¤©é’石レンガã®ã‚¹ãƒ©ãƒ– + +Chalcanthite Slab=カルカンサイトスラブ +Chalcanthite Brick Slab=カルカンサイトレンガã®ã‚¹ãƒ©ãƒ– +Chalcanthite Block Slab=カルカンサイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Chalcanthite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Chalcanthite Slab=石畳ã«ã—ãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆã‚¹ãƒ©ãƒ– + +Chrysoprase Slab=クリソプレーズスラブ +Chrysoprase Brick Slab=クリソプレーズレンガã®ã‚¹ãƒ©ãƒ– +Chrysoprase Block Slab=クリソプレーズブロックã®ã‚¹ãƒ©ãƒ– +Cracked Chrysoprase Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒªã‚½ãƒ—レーズレンガã®ã‚¹ãƒ©ãƒ– + +Citrine Slab=シトリンスラブ +Citrine Brick Slab=シトリンレンガã®ã‚¹ãƒ©ãƒ– +Citrine Block Slab=シトリンブロックã®ã‚¹ãƒ©ãƒ– +Cracked Citrine Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚·ãƒˆãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Covellite Slab=コベライトスラブ +Covellite Brick Slab=コベライトレンガã®ã‚¹ãƒ©ãƒ– +Covellite Block Slab=コベライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Covellite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Covellite Slab=石畳ã«ã—ãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆã‚¹ãƒ©ãƒ– + +Crocoite Slab=クロコアイトスラブ +Crocoite Brick Slab=クロコアイトレンガã®ã‚¹ãƒ©ãƒ– +Crocoite Block Slab=クロコアイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Crocoite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Diorite Slab=閃緑岩スラブ +Diorite Brick Slab=閃緑岩レンガã®ã‚¹ãƒ©ãƒ– +Diorite Block Slab=閃緑岩ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Diorite Brick Slab=ã²ã³å‰²ã‚ŒãŸé–ƒç·‘岩レンガã®ã‚¹ãƒ©ãƒ– +Cobbled Diorite Slab=石畳ã«ã—ãŸé–ƒç·‘岩スラブ + +Erythrite Slab=エリスライトスラブ +Erythrite Brick Slab=エリスライトレンガã®ã‚¹ãƒ©ãƒ– +Erythrite Block Slab=エリスライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Erythrite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Eudialite Slab=ユーディアライトスラブ +Eudialite Brick Slab=ユーディアライトレンガã®ã‚¹ãƒ©ãƒ– +Eudialite Block Slab=ユーディアライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Eudialite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Fluorite Slab=è›çŸ³ã‚¹ãƒ©ãƒ– +Fluorite Brick Slab=è›çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Fluorite Block Slab=è›çŸ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Fluorite Brick Slab=ã²ã³å‰²ã‚ŒãŸè›çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Gabbro Slab=斑れã„岩スラブ +Cobbled Gabbro Slab=石畳ã«ã—ãŸæ–‘れã„岩スラブ +Gabbro Brick Slab=斑れã„岩レンガã®ã‚¹ãƒ©ãƒ– +Gabbro Block Slab=斑れã„岩ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Gabbro Brick Slab=ã²ã³å‰²ã‚ŒãŸæ–‘れã„岩レンガã®ã‚¹ãƒ©ãƒ– + +Galena Slab=方鉛鉱スラブ +Galena Brick Slab=方鉛鉱レンガã®ã‚¹ãƒ©ãƒ– +Galena Block Slab=方鉛鉱ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Galena Brick Slab=ã²ã³å‰²ã‚ŒãŸæ–¹é‰›é‰±ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Black Granite Slab=黒色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Black Granite Brick Slab=黒色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Black Granite Block Slab=黒色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Black Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸé»’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Black Granite Slab=石畳ã«ã—ãŸé»’色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Blue Granite Slab=é’色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Blue Granite Brick Slab=é’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Blue Granite Block Slab=é’色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Blue Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸé’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Blue Granite Slab=石畳ã«ã—ãŸé’色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Gray Granite Slab=ç°è‰²ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Gray Granite Brick Slab=ç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Gray Granite Block Slab=ç°è‰²ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Gray Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Gray Granite Slab=石畳ã«ã—ãŸç°è‰²ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Green Granite Slab=緑色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Green Granite Brick Slab=緑色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Green Granite Block Slab=緑色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Green Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸç·‘色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Green Granite Slab=石畳ã«ã—ãŸç·‘色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Pink Granite Slab=桃色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Pink Granite Brick Slab=桃色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Pink Granite Block Slab=桃色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Pink Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Pink Granite Slab=石畳ã«ã—ãŸæ¡ƒè‰²ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Red Granite Slab=赤色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Red Granite Brick Slab=赤色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Red Granite Block Slab=赤色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Red Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Red Granite Slab=石畳ã«ã—ãŸèµ¤è‰²ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +White Granite Slab=白色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +White Granite Brick Slab=白色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +White Granite Block Slab=白色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked White Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled White Granite Slab=石畳ã«ã—ãŸç™½è‰²ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Yellow Granite Slab=黄色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– +Yellow Granite Brick Slab=黄色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Yellow Granite Block Slab=黄色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚¹ãƒ©ãƒ– +Cracked Yellow Granite Brick Slab=ã²ã³å‰²ã‚ŒãŸé»„色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Yellow Granite Slab=石畳ã«ã—ãŸé»„色ã®èŠ±å´—å²©ã‚¹ãƒ©ãƒ– + +Heliodor Slab=ヘリオドールスラブ +Heliodor Brick Slab=ヘリオドールレンガã®ã‚¹ãƒ©ãƒ– +Heliodor Block Slab=ヘリオドールブロックã®ã‚¹ãƒ©ãƒ– +Cracked Heliodor Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Howlite Slab=ãƒã‚¦ãƒ©ã‚¤ãƒˆã‚¹ãƒ©ãƒ– +Howlite Brick Slab=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Howlite Block Slab=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Howlite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Howlite Slab=石畳ã«ã—ãŸãƒã‚¦ãƒ©ã‚¤ãƒˆã‚¹ãƒ©ãƒ– + +Ilvaite Slab=イルヴァイトã®ã‚¹ãƒ©ãƒ– +Ilvaite Brick Slab=イルヴァイトレンガã®ã‚¹ãƒ©ãƒ– +Ilvaite Block Slab=イルヴァイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Ilvaite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Ilvaite Slab=石畳ã«ã—ãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆã®ã‚¹ãƒ©ãƒ– + +Jade Slab=ç¿¡ç¿ ã®ã‚¹ãƒ©ãƒ– +Jade Brick Slab=翡翠レンガã®ã‚¹ãƒ©ãƒ– +Jade Block Slab=翡翠ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Jade Brick Slab=ã²ã³å‰²ã‚ŒãŸç¿¡ç¿ ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Jade Slab=石畳ã«ã—ãŸç¿¡ç¿ ã®ã‚¹ãƒ©ãƒ– + +Red Jasper Slab=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®ã‚¹ãƒ©ãƒ– +Red Jasper Brick Slab=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®ã‚¹ãƒ©ãƒ– +Red Jasper Block Slab=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーブロックã®ã‚¹ãƒ©ãƒ– +Cracked Red Jasper Brick Slab=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®ã‚¹ãƒ©ãƒ– +Cobbled Red Jasper Slab=石畳ã«ã—ãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®ã‚¹ãƒ©ãƒ– + +Kyanite Slab=カイヤナイトã®ã‚¹ãƒ©ãƒ– +Kyanite Brick Slab=カイヤナイトレンガã®ã‚¹ãƒ©ãƒ– +Kyanite Block Slab=カイヤナイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Kyanite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Kyanite Slab=石畳ã«ã—ãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆã®ã‚¹ãƒ©ãƒ– + +Lapis Lazuli Slab=ラピスラズリã®ã‚¹ãƒ©ãƒ– +Lapis Lazuli Brick Slab=ラピスラズリレンガã®ã‚¹ãƒ©ãƒ– +Lapis Lazuli Block Slab=ラピスラズリブロックã®ã‚¹ãƒ©ãƒ– +Cracked Lapis Lazuli Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ©ãƒ”スラズリレンガã®ã‚¹ãƒ©ãƒ– + +Lepidolite Slab=レピドライトã®ã‚¹ãƒ©ãƒ– +Lepidolite Brick Slab=レピドライトレンガã®ã‚¹ãƒ©ãƒ– +Lepidolite Block Slab=レピドライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Lepidolite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ¬ãƒ”ドライトレンガã®ã‚¹ãƒ©ãƒ– +Cobbled Lepidolite Slab=石畳ã«ã—ãŸãƒ¬ãƒ”ドライトã®ã‚¹ãƒ©ãƒ– + +Blue Limestone Slab=é’色ã®çŸ³ç°å²©ã®ã‚¹ãƒ©ãƒ– +Blue Limestone Brick Slab=é’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Blue Limestone Block Slab=é’色ã®çŸ³ç°å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Blue Limestone Brick Slab=ã²ã³å‰²ã‚ŒãŸé’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Blue Limestone Slab=石畳ã«ã—ãŸé’色ã®çŸ³ç°å²©ã®ã‚¹ãƒ©ãƒ– + +White Limestone Slab=白色ã®çŸ³ç°å²©ã®ã‚¹ãƒ©ãƒ– +White Limestone Brick Slab=白色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +White Limestone Block Slab=白色ã®çŸ³ç°å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked White Limestone Brick Slab=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled White Limestone Slab=石畳ã«ã—ãŸç™½è‰²ã®çŸ³ç°å²©ã®ã‚¹ãƒ©ãƒ– + +Marble Slab=大ç†çŸ³ã®ã‚¹ãƒ©ãƒ– +Marble Brick Slab=大ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Marble Block Slab=大ç†çŸ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Marble Brick Slab=ã²ã³å‰²ã‚ŒãŸå¤§ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Marble Slab=石畳ã«ã—ãŸå¤§ç†çŸ³ã®ã‚¹ãƒ©ãƒ– + +Moonstone Slab=ムーンストーンã®ã‚¹ãƒ©ãƒ– +Moonstone Brick Slab=ムーンストーンレンガã®ã‚¹ãƒ©ãƒ– +Moonstone Block Slab=ムーンストーンブロックã®ã‚¹ãƒ©ãƒ– +Cracked Moonstone Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Morion Quartz Slab=é»’æ°´æ™¶ã®ã‚¹ãƒ©ãƒ– +Morion Quartz Brick Slab=黒水晶レンガã®ã‚¹ãƒ©ãƒ– +Morion Quartz Block Slab=黒水晶ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Morion Quartz Brick Slab=ã²ã³å‰²ã‚ŒãŸé»’水晶レンガã®ã‚¹ãƒ©ãƒ– + +Mudstone Slab=泥岩ã®ã‚¹ãƒ©ãƒ– +Cobbled Mudstone Slab=石畳ã«ã—ãŸæ³¥å²©ã®ã‚¹ãƒ©ãƒ– +Mudstone Brick Slab=泥岩レンガã®ã‚¹ãƒ©ãƒ– +Mudstone Block Slab=泥岩ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Mudstone Brick Slab=ã²ã³å‰²ã‚ŒãŸæ³¥å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Prasiolite Slab=プラジオライトã®ã‚¹ãƒ©ãƒ– +Cobbled Prasiolite Slab=石畳ã«ã—ãŸãƒ—ラジオライトã®ã‚¹ãƒ©ãƒ– +Prasiolite Brick Slab=プラジオライトレンガã®ã‚¹ãƒ©ãƒ– +Prasiolite Block Slab=プラジオライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Prasiolite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ—ラジオライトレンガã®ã‚¹ãƒ©ãƒ– + +Pumice Slab=軽石ã®ã‚¹ãƒ©ãƒ– +Pumice Brick Slab=軽石レンガã®ã‚¹ãƒ©ãƒ– +Pumice Block Slab=軽石ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Pumice Brick Slab=ã²ã³å‰²ã‚ŒãŸè»½çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Pyrite Slab=パイライトã®ã‚¹ãƒ©ãƒ– +Pyrite Brick Slab=パイライトレンガã®ã‚¹ãƒ©ãƒ– +Pyrite Block Slab=パイライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Pyrite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ‘イライトレンガã®ã‚¹ãƒ©ãƒ– + +Quartz Slab=クォーツã®ã‚¹ãƒ©ãƒ– +Cobbled Quartz Slab=石畳ã«ã—ãŸã‚¯ã‚©ãƒ¼ãƒ„ã®ã‚¹ãƒ©ãƒ– +Quartz Brick Slab=クォーツレンガã®ã‚¹ãƒ©ãƒ– +Quartz Block Slab=クォーツブロックã®ã‚¹ãƒ©ãƒ– +Cracked Quartz Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¯ã‚©ãƒ¼ãƒ„レンガã®ã‚¹ãƒ©ãƒ– + +Rhodonite Slab=ロードナイトã®ã‚¹ãƒ©ãƒ– +Rhodonite Brick Slab=ロードナイトレンガã®ã‚¹ãƒ©ãƒ– +Rhodonite Block Slab=ロードナイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Rhodonite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Rhodonite Slab=石畳ã«ã—ãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆã®ã‚¹ãƒ©ãƒ– + +Rose Quartz Slab=ç´…æ°´æ™¶ã®ã‚¹ãƒ©ãƒ– +Rose Quartz Brick Slab=紅水晶レンガã®ã‚¹ãƒ©ãƒ– +Rose Quartz Block Slab=紅水晶ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Rose Quartz Brick Slab=ã²ã³å‰²ã‚ŒãŸç´…水晶レンガã®ã‚¹ãƒ©ãƒ– + +Scoria Slab=スコリアã®ã‚¹ãƒ©ãƒ– +Scoria Brick Slab=スコリアレンガã®ã‚¹ãƒ©ãƒ– +Scoria Block Slab=スコリアブロックã®ã‚¹ãƒ©ãƒ– +Cracked Scoria Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚³ãƒªã‚¢ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Scoria Slab=石畳ã«ã—ãŸã‚¹ã‚³ãƒªã‚¢ã®ã‚¹ãƒ©ãƒ– + +Serpentine Slab=蛇紋石ã®ã‚¹ãƒ©ãƒ– +Cobbled Serpentine Slab=石畳ã«ã—ãŸè›‡ç´‹çŸ³ã®ã‚¹ãƒ©ãƒ– +Serpentine Brick Slab=蛇紋石レンガã®ã‚¹ãƒ©ãƒ– +Serpentine Block Slab=蛇紋石ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Serpentine Brick Slab=ã²ã³å‰²ã‚ŒãŸè›‡ç´‹çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Shale Slab=æ³¥æ¿å²©ã®ã‚¹ãƒ©ãƒ– +Shale Brick Slab=æ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Shale Block Slab=æ³¥æ¿å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Shale Brick Slab=ã²ã³å‰²ã‚ŒãŸæ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Shale Slab=石畳ã«ã—ãŸæ³¥æ¿å²©ã®ã‚¹ãƒ©ãƒ– + +Slate Slab=粘æ¿å²©ã®ã‚¹ãƒ©ãƒ– +Slate Brick Slab=粘æ¿å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Slate Block Slab=粘æ¿å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Slate Brick Slab=ã²ã³å‰²ã‚ŒãŸç²˜æ¿å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Slate Slab=石畳ã«ã—ãŸç²˜æ¿å²©ã®ã‚¹ãƒ©ãƒ– +Slate Tile Slab=粘æ¿å²©ã‚¿ã‚¤ãƒ«ã®ã‚¹ãƒ©ãƒ– + +Smokey Quartz Slab=煙水晶ã®ã‚¹ãƒ©ãƒ– +Smokey Quartz Brick Slab=煙水晶レンガã®ã‚¹ãƒ©ãƒ– +Smokey Quartz Block Slab=煙水晶ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Smokey Quartz Brick Slab=ã²ã³å‰²ã‚ŒãŸç…™æ°´æ™¶ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Soapstone Slab=石鹸石ã®ã‚¹ãƒ©ãƒ– +Soapstone Brick Slab=石鹸石レンガã®ã‚¹ãƒ©ãƒ– +Soapstone Block Slab=石鹸石ブロックã®ã‚¹ãƒ©ãƒ– +Cracked Soapstone Brick Slab=ã²ã³å‰²ã‚ŒãŸçŸ³é¹¸çŸ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Sodalite Slab=ソーダライトã®ã‚¹ãƒ©ãƒ– +Cobbled Sodalite Slab=石畳ã«ã—ãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆã®ã‚¹ãƒ©ãƒ– +Sodalite Brick Slab=ソーダライトレンガã®ã‚¹ãƒ©ãƒ– +Sodalite Block Slab=ソーダライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Sodalite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Sugilite Slab=スギライトã®ã‚¹ãƒ©ãƒ– +Sugilite Brick Slab=スギライトレンガã®ã‚¹ãƒ©ãƒ– +Sugilite Block Slab=スギライトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Sugilite Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Sugilite Slab=石畳ã«ã—ãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆã®ã‚¹ãƒ©ãƒ– + +Green Tourmaline Slab=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®ã‚¹ãƒ©ãƒ– +Green Tourmaline Brick Slab=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Green Tourmaline Block Slab=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Green Tourmaline Brick Slab=ã²ã³å‰²ã‚ŒãŸç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Paraiba Tourmaline Slab=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®ã‚¹ãƒ©ãƒ– +Paraiba Tourmaline Brick Slab=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Paraiba Tourmaline Block Slab=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Paraiba Tourmaline Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Pink Tourmaline Slab=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®ã‚¹ãƒ©ãƒ– +Pink Tourmaline Brick Slab=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Pink Tourmaline Block Slab=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Pink Tourmaline Brick Slab=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Travertine Slab=トラãƒãƒ†ã‚£ãƒ³ã®ã‚¹ãƒ©ãƒ– +Cobbled Travertine Slab=石畳ã«ã—ãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®ã‚¹ãƒ©ãƒ– +Travertine Brick Slab=トラãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Travertine Block Slab=トラãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Travertine Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Yellow Travertine Slab=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®ã‚¹ãƒ©ãƒ– +Cobbled Yellow Travertine Slab=石畳ã«ã—ãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®ã‚¹ãƒ©ãƒ– +Yellow Travertine Brick Slab=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Yellow Travertine Block Slab=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Cracked Yellow Travertine Brick Slab=ã²ã³å‰²ã‚ŒãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Beige Tuff Slab=ベージュ色ã®å‡ç°å²©ã®ã‚¹ãƒ©ãƒ– +Cobbled Beige Tuff Slab=石畳ã«ã—ãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ã®ã‚¹ãƒ©ãƒ– +Beige Tuff Block Slab=ベージュ色ã®å‡ç°å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Beige Tuff Brick Slab=ベージュ色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cracked Beige Tuff Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Grey Tuff Slab=ç°è‰²ã®å‡ç°å²©ã®ã‚¹ãƒ©ãƒ– +Cobbled Grey Tuff Slab=石畳ã«ã—ãŸç°è‰²ã®å‡ç°å²©ã®ã‚¹ãƒ©ãƒ– +Grey Tuff Block Slab=ç°è‰²ã®å‡ç°å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Grey Tuff Brick Slab=ç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cracked Grey Tuff Brick Slab=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Red Tuff Slab=赤色ã®å‡ç°å²©ã®ã‚¹ãƒ©ãƒ– +Cobbled Red Tuff Slab=石畳ã«ã—ãŸèµ¤è‰²ã®å‡ç°å²©ã®ã‚¹ãƒ©ãƒ– +Red Tuff Block Slab=赤色ã®å‡ç°å²©ãƒ–ロックã®ã‚¹ãƒ©ãƒ– +Red Tuff Brick Slab=赤色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cracked Red Tuff Brick Slab=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– + +Turquoise Slab=ターコイズã®ã‚¹ãƒ©ãƒ– +Turquoise Brick Slab=ターコイズレンガã®ã‚¹ãƒ©ãƒ– +Turquoise Block Slab=ターコイズブロックã®ã‚¹ãƒ©ãƒ– +Cracked Turquoise Brick Slab=ã²ã³å‰²ã‚ŒãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºãƒ¬ãƒ³ã‚¬ã®ã‚¹ãƒ©ãƒ– +Cobbled Turquoise Slab=石畳ã«ã—ãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºã®ã‚¹ãƒ©ãƒ– + +Vivianite Slab=ビビアナイトã®ã‚¹ãƒ©ãƒ– +Cobbled Vivianite Slab=石畳ã«ã—ãŸãƒ“ビアナイトã®ã‚¹ãƒ©ãƒ– +Vivianite Brick Slab=ビビアナイトレンガã®ã‚¹ãƒ©ãƒ– +Vivianite Block Slab=ビビアナイトブロックã®ã‚¹ãƒ©ãƒ– +Cracked Vivianite Brick Slab=ã²ã³å‰²ã‚ŒãŸãƒ“ビアナイトレンガã®ã‚¹ãƒ©ãƒ– + + + +Blue Agate Stair=é’色ã®ç‘ªç‘™ã®éšŽæ®µ +Gray Agate Stair=ç°è‰²ã®ç‘ªç‘™ã®éšŽæ®µ +Green Agate Stair=緑色ã®ç‘ªç‘™ã®éšŽæ®µ +Moss Agate Stair=苔むã—ãŸç‘ªç‘™ã®éšŽæ®µ +Orange Agate Stair=橙色ã®ç‘ªç‘™ã®éšŽæ®µ +Purple Agate Stair=紫色ã®ç‘ªç‘™ã®éšŽæ®µ +Red Agate Stair=赤色ã®ç‘ªç‘™ã®éšŽæ®µ + +Amazonite Stair=アマゾナイトã®éšŽæ®µ +Cobbled Amazonite Stair=石畳ã«ã—ãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆã®éšŽæ®µ +Amazonite Brick Stair=アマゾナイトレンガã®éšŽæ®µ +Amazonite Block Stair=アマゾナイトブロックã®éšŽæ®µ +Cracked Amazonite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Amber Stair=ç¥ç€ã®éšŽæ®µ +Amber Brick Stair=ç¥ç€ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Amber Block Stair=ç¥ç€ãƒ–ロックã®éšŽæ®µ +Cracked Amber Brick Stair=ã²ã³å‰²ã‚ŒãŸç¥ç€ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Amethyst Stair=アメジストã®éšŽæ®µ +Amethyst Brick Stair=アメジストレンガã®éšŽæ®µ +Amethyst Block Stair=アメジストブロックã®éšŽæ®µ +Cracked Amethyst Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Andesite Stair=安山岩ã®éšŽæ®µ +Andesite Block Stair=安山岩ブロックã®éšŽæ®µ +Cobbled Andesite Stair=石畳ã«ã—ãŸå®‰å±±å²©ã®éšŽæ®µ +Andesite Brick Stair=安山岩レンガã®éšŽæ®µ +Cobbled Andesite Brick Stair=石畳ã«ã—ãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Basalt Stair=玄武岩ã®éšŽæ®µ +Basalt Block Stair=玄武岩ブロックã®éšŽæ®µ +Basalt Brick Stair=玄武岩レンガã®éšŽæ®µ +Cracked Basalt Brick Stair=ã²ã³å‰²ã‚ŒãŸçŽ„æ­¦å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Basalt Stair=石畳ã«ã—ãŸçŽ„æ­¦å²©ã®éšŽæ®µ +Basalt Tile Stair=玄武岩ã®ã‚¿ã‚¤ãƒ«éšŽæ®µ + +Black Moonstone Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ã®éšŽæ®µ +Black Moonstone Brick Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Black Moonstone Block Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ–ロックã®éšŽæ®µ +Cracked Black Moonstone Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Calcite Stair=方解石ã®éšŽæ®µ +Calcite Brick Stair=方解石レンガã®éšŽæ®µ +Calcite Block Stair=方解石ブロックã®éšŽæ®µ +Cracked Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Grey Calcite Stair=ç°è‰²ã®æ–¹è§£çŸ³ã®éšŽæ®µ +Grey Calcite Brick Stair=ç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Grey Calcite Block Stair=ç°è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®éšŽæ®µ +Cracked Grey Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Orange Calcite Stair=æ©™è‰²ã®æ–¹è§£çŸ³ã®éšŽæ®µ +Orange Calcite Brick Stair=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Orange Calcite Block Stair=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®éšŽæ®µ +Cracked Orange Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Carnotite Stair=カルノタイトã®éšŽæ®µ +Carnotite Brick Stair=カルノタイトレンガã®éšŽæ®µ +Carnotite Block Stair=カルノタイトブロックã®éšŽæ®µ +Cracked Carnotite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Carnotite Stair=石畳ã«ã—ãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆã®éšŽæ®µ + +Celestine Stair=天é’石ã®éšŽæ®µ +Celestine Brick Stair=天é’石レンガã®éšŽæ®µ +Celestine Block Stair=天é’石ブロックã®éšŽæ®µ +Cracked Celestine Brick Stair=ã²ã³å‰²ã‚ŒãŸå¤©é’石レンガã®éšŽæ®µ + +Chalcanthite Stair=カルカンサイトã®éšŽæ®µ +Chalcanthite Brick Stair=カルカンサイトレンガã®éšŽæ®µ +Chalcanthite Block Stair=カルカンサイトブロックã®éšŽæ®µ +Cracked Chalcanthite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Chalcanthite Stair=石畳ã«ã—ãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆã®éšŽæ®µ + +Chrysoprase Stair=クリソプレーズã®éšŽæ®µ +Chrysoprase Brick Stair=クリソプレーズレンガã®éšŽæ®µ +Chrysoprase Block Stair=クリソプレーズブロックã®éšŽæ®µ +Cracked Chrysoprase Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒªã‚½ãƒ—レーズレンガã®éšŽæ®µ + +Citrine Stair=シトリンã®éšŽæ®µ +Citrine Brick Stair=シトリンレンガã®éšŽæ®µ +Citrine Block Stair=シトリンブロックã®éšŽæ®µ +Cracked Citrine Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚·ãƒˆãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Covellite Stair=コベライトã®éšŽæ®µ +Covellite Brick Stair=コベライトレンガã®éšŽæ®µ +Covellite Block Stair=コベライトブロックã®éšŽæ®µ +Cracked Covellite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Covellite Stair=石畳ã«ã—ãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆã®éšŽæ®µ + +Crocoite Stair=クロコアイトã®éšŽæ®µ +Crocoite Brick Stair=クロコアイトレンガã®éšŽæ®µ +Crocoite Block Stair=クロコアイトブロックã®éšŽæ®µ +Cracked Crocoite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Diorite Stair=閃緑岩ã®éšŽæ®µ +Diorite Brick Stair=閃緑岩レンガã®éšŽæ®µ +Diorite Block Stair=閃緑岩ブロックã®éšŽæ®µ +Cracked Diorite Brick Stair=ã²ã³å‰²ã‚ŒãŸé–ƒç·‘岩レンガã®éšŽæ®µ +Cobbled Diorite Stair=石畳ã«ã—ãŸé–ƒç·‘岩ã®éšŽæ®µ + +Erythrite Stair=エリスライトã®éšŽæ®µ +Erythrite Brick Stair=エリスライトレンガã®éšŽæ®µ +Erythrite Block Stair=エリスライトブロックã®éšŽæ®µ +Cracked Erythrite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Eudialite Stair=ユーディアライトã®éšŽæ®µ +Eudialite Brick Stair=ユーディアライトレンガã®éšŽæ®µ +Eudialite Block Stair=ユーディアライトブロックã®éšŽæ®µ +Cracked Eudialite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Fluorite Stair=è›çŸ³ã®éšŽæ®µ +Fluorite Brick Stair=è›çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Fluorite Block Stair=è›çŸ³ãƒ–ロックã®éšŽæ®µ +Cracked Fluorite Brick Stair=ã²ã³å‰²ã‚ŒãŸè›çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Gabbro Stair=斑れã„岩ã®éšŽæ®µ +Cobbled Gabbro Stair=石畳ã«ã—ãŸæ–‘れã„岩ã®éšŽæ®µ +Gabbro Brick Stair=斑れã„岩レンガã®éšŽæ®µ +Gabbro Block Stair=斑れã„岩ブロックã®éšŽæ®µ +Cracked Gabbro Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–‘れã„岩レンガã®éšŽæ®µ + +Galena Stair=方鉛鉱ã®éšŽæ®µ +Galena Brick Stair=方鉛鉱レンガã®éšŽæ®µ +Galena Block Stair=方鉛鉱ブロックã®éšŽæ®µ +Cracked Galena Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–¹é‰›é‰±ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Black Granite Stair=黒色ã®èб崗岩ã®éšŽæ®µ +Black Granite Brick Stair=黒色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Black Granite Block Stair=黒色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Black Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Black Granite Stair=石畳ã«ã—ãŸé»’色ã®èб崗岩ã®éšŽæ®µ + +Blue Granite Stair=é’色ã®èб崗岩ã®éšŽæ®µ +Blue Granite Brick Stair=é’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Blue Granite Block Stair=é’色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Blue Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Blue Granite Stair=石畳ã«ã—ãŸé’色ã®èб崗岩ã®éšŽæ®µ + +Gray Granite Stair=ç°è‰²ã®èб崗岩ã®éšŽæ®µ +Gray Granite Brick Stair=ç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Gray Granite Block Stair=ç°è‰²ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Gray Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Gray Granite Stair=石畳ã«ã—ãŸç°è‰²ã®èб崗岩ã®éšŽæ®µ + +Green Granite Stair=緑色ã®èб崗岩ã®éšŽæ®µ +Green Granite Brick Stair=緑色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Green Granite Block Stair=緑色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Green Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç·‘色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Green Granite Stair=石畳ã«ã—ãŸç·‘色ã®èб崗岩ã®éšŽæ®µ + +Pink Granite Stair=桃色ã®èб崗岩ã®éšŽæ®µ +Pink Granite Brick Stair=桃色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Pink Granite Block Stair=桃色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Pink Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Pink Granite Stair=石畳ã«ã—ãŸæ¡ƒè‰²ã®èб崗岩ã®éšŽæ®µ + +Red Granite Stair=赤色ã®èб崗岩ã®éšŽæ®µ +Red Granite Brick Stair=赤色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Red Granite Block Stair=赤色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Red Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Red Granite Stair=石畳ã«ã—ãŸèµ¤è‰²ã®èб崗岩ã®éšŽæ®µ + +White Granite Stair=白色ã®èб崗岩ã®éšŽæ®µ +White Granite Brick Stair=白色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +White Granite Block Stair=白色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked White Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled White Granite Stair=石畳ã«ã—ãŸç™½è‰²ã®èб崗岩ã®éšŽæ®µ + +Yellow Granite Stair=黄色ã®èб崗岩ã®éšŽæ®µ +Yellow Granite Brick Stair=黄色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Yellow Granite Block Stair=黄色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®éšŽæ®µ +Cracked Yellow Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé»„色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Yellow Granite Stair=石畳ã«ã—ãŸé»„色ã®èб崗岩ã®éšŽæ®µ + +Heliodor Stair=ヘリオドールã®éšŽæ®µ +Heliodor Brick Stair=ヘリオドールレンガã®éšŽæ®µ +Heliodor Block Stair=ヘリオドールブロックã®éšŽæ®µ +Cracked Heliodor Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Howlite Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆã®éšŽæ®µ +Howlite Brick Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Howlite Block Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ–ロックã®éšŽæ®µ +Cracked Howlite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Howlite Stair=石畳ã«ã—ãŸãƒã‚¦ãƒ©ã‚¤ãƒˆã®éšŽæ®µ + +Ilvaite Stair=イルヴァイトã®éšŽæ®µ +Ilvaite Brick Stair=イルヴァイトレンガã®éšŽæ®µ +Ilvaite Block Stair=イルヴァイトブロックã®éšŽæ®µ +Cracked Ilvaite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Ilvaite Stair=石畳ã«ã—ãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆã®éšŽæ®µ + +Jade Stair=ç¿¡ç¿ ã®éšŽæ®µ +Jade Brick Stair=翡翠レンガã®éšŽæ®µ +Jade Block Stair=翡翠ブロックã®éšŽæ®µ +Cracked Jade Brick Stair=ã²ã³å‰²ã‚ŒãŸç¿¡ç¿ ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Jade Stair=石畳ã«ã—ãŸç¿¡ç¿ ã®éšŽæ®µ + +Red Jasper Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®éšŽæ®µ +Red Jasper Brick Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®éšŽæ®µ +Red Jasper Block Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーブロックã®éšŽæ®µ +Cracked Red Jasper Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®éšŽæ®µ +Cobbled Red Jasper Stair=石畳ã«ã—ãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®éšŽæ®µ + +Kyanite Stair=カイヤナイトã®éšŽæ®µ +Kyanite Brick Stair=カイヤナイトレンガã®éšŽæ®µ +Kyanite Block Stair=カイヤナイトブロックã®éšŽæ®µ +Cracked Kyanite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Kyanite Stair=石畳ã«ã—ãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆã®éšŽæ®µ + +Lapis Lazuli Stair=ラピスラズリã®éšŽæ®µ +Lapis Lazuli Brick Stair=ラピスラズリレンガã®éšŽæ®µ +Lapis Lazuli Block Stair=ラピスラズリブロックã®éšŽæ®µ +Cracked Lapis Lazuli Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ©ãƒ”スラズリレンガã®éšŽæ®µ + +Lepidolite Stair=レピドライトã®éšŽæ®µ +Lepidolite Brick Stair=レピドライトレンガã®éšŽæ®µ +Lepidolite Block Stair=レピドライトブロックã®éšŽæ®µ +Cracked Lepidolite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ¬ãƒ”ドライトレンガã®éšŽæ®µ +Cobbled Lepidolite Stair=石畳ã«ã—ãŸãƒ¬ãƒ”ドライトã®éšŽæ®µ + +Blue Limestone Stair=é’色ã®çŸ³ç°å²©ã®éšŽæ®µ +Blue Limestone Brick Stair=é’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Blue Limestone Block Stair=é’色ã®çŸ³ç°å²©ãƒ–ロックã®éšŽæ®µ +Cracked Blue Limestone Brick Stair=ã²ã³å‰²ã‚ŒãŸé’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Blue Limestone Stair=石畳ã«ã—ãŸé’色ã®çŸ³ç°å²©ã®éšŽæ®µ + +White Limestone Stair=白色ã®çŸ³ç°å²©ã®éšŽæ®µ +White Limestone Brick Stair=白色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +White Limestone Block Stair=白色ã®çŸ³ç°å²©ãƒ–ロックã®éšŽæ®µ +Cracked White Limestone Brick Stair=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled White Limestone Stair=石畳ã«ã—ãŸç™½è‰²ã®çŸ³ç°å²©ã®éšŽæ®µ + +Marble Stair=大ç†çŸ³ã®éšŽæ®µ +Marble Brick Stair=大ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Marble Block Stair=大ç†çŸ³ãƒ–ロックã®éšŽæ®µ +Cracked Marble Brick Stair=ã²ã³å‰²ã‚ŒãŸå¤§ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Marble Stair=石畳ã«ã—ãŸå¤§ç†çŸ³ã®éšŽæ®µ + +Moonstone Stair=ムーンストーンã®éšŽæ®µ +Moonstone Brick Stair=ムーンストーンレンガã®éšŽæ®µ +Moonstone Block Stair=ムーンストーンブロックã®éšŽæ®µ +Cracked Moonstone Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Morion Quartz Stair=é»’æ°´æ™¶ã®éšŽæ®µ +Morion Quartz Brick Stair=黒水晶レンガã®éšŽæ®µ +Morion Quartz Block Stair=黒水晶ブロックã®éšŽæ®µ +Cracked Morion Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’水晶レンガã®éšŽæ®µ + +Mudstone Stair=泥岩ã®éšŽæ®µ +Cobbled Mudstone Stair=石畳ã«ã—ãŸæ³¥å²©ã®éšŽæ®µ +Mudstone Brick Stair=泥岩レンガã®éšŽæ®µ +Mudstone Block Stair=泥岩ブロックã®éšŽæ®µ +Cracked Mudstone Brick Stair=ã²ã³å‰²ã‚ŒãŸæ³¥å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Prasiolite Stair=プラジオライトã®éšŽæ®µ +Prasiolite Brick Stair=プラジオライトレンガã®éšŽæ®µ +Prasiolite Block Stair=プラジオライトブロックã®éšŽæ®µ +Cracked Prasiolite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ—ラジオライトレンガã®éšŽæ®µ + +Pumice Stair=軽石ã®éšŽæ®µ +Pumice Brick Stair=軽石レンガã®éšŽæ®µ +Pumice Block Stair=軽石ブロックã®éšŽæ®µ +Cracked Pumice Brick Stair=ã²ã³å‰²ã‚ŒãŸè»½çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Pyrite Stair=パイライトã®éšŽæ®µ +Pyrite Brick Stair=パイライトレンガã®éšŽæ®µ +Pyrite Block Stair=パイライトブロックã®éšŽæ®µ +Cracked Pyrite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ‘イライトレンガã®éšŽæ®µ + +Quartz Stair=クォーツã®éšŽæ®µ +Cobbled Quartz Stair=石畳ã«ã—ãŸã‚¯ã‚©ãƒ¼ãƒ„ã®éšŽæ®µ +Quartz Brick Stair=クォーツレンガã®éšŽæ®µ +Quartz Block Stair=クォーツブロックã®éšŽæ®µ +Cracked Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ã‚©ãƒ¼ãƒ„レンガã®éšŽæ®µ + +Rhodonite Stair=ロードナイトã®éšŽæ®µ +Rhodonite Brick Stair=ロードナイトレンガã®éšŽæ®µ +Rhodonite Block Stair=ロードナイトブロックã®éšŽæ®µ +Cracked Rhodonite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Rhodonite Stair=石畳ã«ã—ãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆã®éšŽæ®µ + +Rose Quartz Stair=ç´…æ°´æ™¶ã®éšŽæ®µ +Rose Quartz Brick Stair=紅水晶レンガã®éšŽæ®µ +Rose Quartz Block Stair=紅水晶ブロックã®éšŽæ®µ +Cracked Rose Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸç´…水晶レンガã®éšŽæ®µ + +Scoria Stair=スコリアã®éšŽæ®µ +Scoria Brick Stair=スコリアレンガã®éšŽæ®µ +Scoria Block Stair=スコリアブロックã®éšŽæ®µ +Cracked Scoria Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚³ãƒªã‚¢ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Scoria Stair=石畳ã«ã—ãŸã‚¹ã‚³ãƒªã‚¢ã®éšŽæ®µ + +Serpentine Stair=蛇紋石ã®éšŽæ®µ +Cobbled Serpentine Stair=石畳ã«ã—ãŸè›‡ç´‹çŸ³ã®éšŽæ®µ +Serpentine Brick Stair=蛇紋石レンガã®éšŽæ®µ +Serpentine Block Stair=蛇紋石ブロックã®éšŽæ®µ +Cracked Serpentine Brick Stair=ã²ã³å‰²ã‚ŒãŸè›‡ç´‹çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Shale Stair=æ³¥æ¿å²©ã®éšŽæ®µ +Shale Brick Stair=æ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Shale Block Stair=æ³¥æ¿å²©ãƒ–ロックã®éšŽæ®µ +Cracked Shale Brick Stair=ã²ã³å‰²ã‚ŒãŸæ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Shale Stair=石畳ã«ã—ãŸæ³¥æ¿å²©ã®éšŽæ®µ + +Slate Stair=粘æ¿å²©ã®éšŽæ®µ +Slate Brick Stair=粘æ¿å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Slate Block Stair=粘æ¿å²©ãƒ–ロックã®éšŽæ®µ +Cracked Slate Brick Stair=ã²ã³å‰²ã‚ŒãŸç²˜æ¿å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Slate Stair=石畳ã«ã—ãŸç²˜æ¿å²©ã®éšŽæ®µ +Slate Tile Stair=粘æ¿å²©ã‚¿ã‚¤ãƒ«ã®éšŽæ®µ + +Smokey Quartz Stair=煙水晶ã®éšŽæ®µ +Smokey Quartz Brick Stair=煙水晶レンガã®éšŽæ®µ +Smokey Quartz Block Stair=煙水晶ブロックã®éšŽæ®µ +Cracked Smokey Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸç…™æ°´æ™¶ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Soapstone Stair=石鹸石ã®éšŽæ®µ +Soapstone Brick Stair=石鹸石レンガã®éšŽæ®µ +Soapstone Block Stair=石鹸石ブロックã®éšŽæ®µ +Cracked Soapstone Brick Stair=ã²ã³å‰²ã‚ŒãŸçŸ³é¹¸çŸ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Sodalite Stair=ソーダライトã®éšŽæ®µ +Cobbled Sodalite Stair=石畳ã«ã—ãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆã®éšŽæ®µ +Sodalite Brick Stair=ソーダライトレンガã®éšŽæ®µ +Sodalite Block Stair=ソーダライトブロックã®éšŽæ®µ +Cracked Sodalite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Sugilite Stair=スギライトã®éšŽæ®µ +Sugilite Brick Stair=スギライトレンガã®éšŽæ®µ +Sugilite Block Stair=スギライトブロックã®éšŽæ®µ +Cracked Sugilite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Sugilite Stair=石畳ã«ã—ãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆã®éšŽæ®µ + +Green Tourmaline Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®éšŽæ®µ +Green Tourmaline Brick Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Green Tourmaline Block Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®éšŽæ®µ +Cracked Green Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Paraiba Tourmaline Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®éšŽæ®µ +Paraiba Tourmaline Brick Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Paraiba Tourmaline Block Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®éšŽæ®µ +Cracked Paraiba Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Pink Tourmaline Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®éšŽæ®µ +Pink Tourmaline Brick Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Pink Tourmaline Block Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®éšŽæ®µ +Cracked Pink Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Travertine Stair=トラãƒãƒ†ã‚£ãƒ³ã®éšŽæ®µ +Cobbled Travertine Stair=石畳ã«ã—ãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®éšŽæ®µ +Travertine Brick Stair=トラãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Travertine Block Stair=トラãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®éšŽæ®µ +Cracked Travertine Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Yellow Travertine Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®éšŽæ®µ +Cobbled Yellow Travertine Stair=石畳ã«ã—ãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®éšŽæ®µ +Yellow Travertine Brick Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Yellow Travertine Block Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®éšŽæ®µ +Cracked Yellow Travertine Brick Stair=ã²ã³å‰²ã‚ŒãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Beige Tuff Stair=ベージュ色ã®å‡ç°å²©ã®éšŽæ®µ +Cobbled Beige Tuff Stair=石畳ã«ã—ãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ã®éšŽæ®µ +Beige Tuff Brick Stair=ベージュ色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Beige Tuff Block Stair=ベージュ色ã®å‡ç°å²©ãƒ–ロックã®éšŽæ®µ +Cracked Beige Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Grey Tuff Stair=ç°è‰²ã®å‡ç°å²©ã®éšŽæ®µ +Grey Tuff Brick Stair=ç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Grey Tuff Block Stair=ç°è‰²ã®å‡ç°å²©ãƒ–ロックã®éšŽæ®µ +Cracked Grey Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Grey Tuff Stair=石畳ã«ã—ãŸç°è‰²ã®å‡ç°å²©ã®éšŽæ®µ + +Red Tuff Stair=赤色ã®å‡ç°å²©ã®éšŽæ®µ +Red Tuff Brick Stair=赤色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Red Tuff Block Stair=赤色ã®å‡ç°å²©ãƒ–ロックã®éšŽæ®µ +Cracked Red Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ + +Turquoise Stair=ターコイズã®éšŽæ®µ +Turquoise Brick Stair=ターコイズレンガã®éšŽæ®µ +Turquoise Block Stair=ターコイズブロックã®éšŽæ®µ +Cracked Turquoise Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºãƒ¬ãƒ³ã‚¬ã®éšŽæ®µ +Cobbled Turquoise Stair=石畳ã«ã—ãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºã®éšŽæ®µ + +Vivianite Stair=ビビアナイトã®éšŽæ®µ +Vivianite Brick Stair=ビビアナイトレンガã®éšŽæ®µ +Vivianite Block Stair=ビビアナイトブロックã®éšŽæ®µ +Cracked Vivianite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ“ビアナイトレンガã®éšŽæ®µ + + + +Inner Blue Agate Stair=é’色ã®ç‘ªç‘™ã®å‡¹éšŽæ®µ +Inner Gray Agate Stair=ç°è‰²ã®ç‘ªç‘™ã®å‡¹éšŽæ®µ +Inner Green Agate Stair=緑色ã®ç‘ªç‘™ã®å‡¹éšŽæ®µ +Inner Moss Agate Stair=苔むã—ãŸç‘ªç‘™ã®å‡¹éšŽæ®µ +Inner Orange Agate Stair=橙色ã®ç‘ªç‘™ã®å‡¹éšŽæ®µ +Inner Purple Agate Stair=紫色ã®ç‘ªç‘™ã®å‡¹éšŽæ®µ +Inner Red Agate Stair=赤瑪瑙ã®å‡¹éšŽæ®µ + +Inner Amazonite Stair=アマゾナイトã®å‡¹éšŽæ®µ +Inner Cobbled Amazonite Stair=石畳ã«ã—ãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆã®å‡¹éšŽæ®µ +Inner Amazonite Brick Stair=アマゾナイトレンガã®å‡¹éšŽæ®µ +Inner Amazonite Block Stair=アマゾナイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Amazonite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Amber Stair=ç¥ç€ã®å‡¹éšŽæ®µ +Inner Amber Brick Stair=ç¥ç€ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Amber Block Stair=ç¥ç€ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Amber Brick Stair=ã²ã³å‰²ã‚ŒãŸç¥ç€ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Amethyst Stair=アメジストã®å‡¹éšŽæ®µ +Inner Amethyst Brick Stair=アメジストレンガã®å‡¹éšŽæ®µ +Inner Amethyst Block Stair=アメジストブロックã®å‡¹éšŽæ®µ +Inner Cracked Amethyst Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Andesite Stair=安山岩ã®å‡¹éšŽæ®µ +Inner Andesite Block Stair=安山岩ブロックã®å‡¹éšŽæ®µ +Inner Andesite Brick Stair=安山岩レンガã®å‡¹éšŽæ®µ +Inner Cracked Andesite Brick Stair=ã²ã³å‰²ã‚ŒãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Andesite Stair=石畳ã«ã—ãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Basalt Stair=玄武岩ã®å‡¹éšŽæ®µ +Inner Basalt Block Stair=玄武岩ブロックã®å‡¹éšŽæ®µ +Inner Basalt Brick Stair=玄武岩レンガã®å‡¹éšŽæ®µ +Inner Cracked Basalt Brick Stair=ã²ã³å‰²ã‚ŒãŸçŽ„æ­¦å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Basalt Stair=石畳ã«ã—ãŸçŽ„æ­¦å²©ã®å‡¹éšŽæ®µ +Inner Basalt Tile Stair=玄武岩タイルã®å‡¹éšŽæ®µ + +Inner Black Moonstone Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ã®å‡¹éšŽæ®µ +Inner Black Moonstone Brick Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Black Moonstone Block Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Black Moonstone Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Calcite Stair=方解石ã®å‡¹éšŽæ®µ +Inner Calcite Brick Stair=方解石レンガã®å‡¹éšŽæ®µ +Inner Calcite Block Stair=方解石ブロックã®å‡¹éšŽæ®µ +Inner Cracked Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Grey Calcite Stair=ç°è‰²ã®æ–¹è§£çŸ³ã®å‡¹éšŽæ®µ +Inner Grey Calcite Brick Stair=ç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Grey Calcite Block Stair=ç°è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Grey Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Orange Calcite Stair=æ©™è‰²ã®æ–¹è§£çŸ³ã®å‡¹éšŽæ®µ +Inner Orange Calcite Brick Stair=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Orange Calcite Block Stair=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Orange Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Carnotite Stair=カルノタイトã®å‡¹éšŽæ®µ +Inner Carnotite Brick Stair=カルノタイトレンガã®å‡¹éšŽæ®µ +Inner Carnotite Block Stair=カルノタイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Carnotite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Carnotite Stair=石畳ã«ã—ãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Celestine Stair=天é’石ã®å‡¹éšŽæ®µ +Inner Celestine Brick Stair=天é’石レンガã®å‡¹éšŽæ®µ +Inner Celestine Block Stair=天é’石ブロックã®å‡¹éšŽæ®µ +Inner Cracked Celestine Brick Stair=ã²ã³å‰²ã‚ŒãŸå¤©é’石レンガã®å‡¹éšŽæ®µ + +Inner Chalcanthite Stair=カルカンサイトã®å‡¹éšŽæ®µ +Inner Chalcanthite Brick Stair=カルカンサイトレンガã®å‡¹éšŽæ®µ +Inner Chalcanthite Block Stair=カルカンサイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Chalcanthite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Chalcanthite Stair=石畳ã«ã—ãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Chrysoprase Stair=クリソプレーズã®å‡¹éšŽæ®µ +Inner Chrysoprase Brick Stair=クリソプレーズレンガã®å‡¹éšŽæ®µ +Inner Chrysoprase Block Stair=クリソプレーズブロックã®å‡¹éšŽæ®µ +Inner Cracked Chrysoprase Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒªã‚½ãƒ—レーズレンガã®å‡¹éšŽæ®µ + +Inner Citrine Stair=シトリンã®å‡¹éšŽæ®µ +Inner Citrine Brick Stair=シトリンレンガã®å‡¹éšŽæ®µ +Inner Citrine Block Stair=シトリンブロックã®å‡¹éšŽæ®µ +Inner Cracked Citrine Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚·ãƒˆãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Covellite Stair=コベライトã®å‡¹éšŽæ®µ +Inner Covellite Brick Stair=コベライトレンガã®å‡¹éšŽæ®µ +Inner Covellite Block Stair=コベライトブロックã®å‡¹éšŽæ®µ +Inner Cracked Covellite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Covellite Stair=石畳ã«ã—ãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Crocoite Stair=クロコアイトã®å‡¹éšŽæ®µ +Inner Crocoite Brick Stair=クロコアイトレンガã®å‡¹éšŽæ®µ +Inner Crocoite Block Stair=クロコアイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Crocoite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Diorite Stair=閃緑岩ã®å‡¹éšŽæ®µ +Inner Diorite Brick Stair=閃緑岩レンガã®å‡¹éšŽæ®µ +Inner Diorite Block Stair=閃緑岩ブロックã®å‡¹éšŽæ®µ +Inner Cracked Diorite Brick Stair=ã²ã³å‰²ã‚ŒãŸé–ƒç·‘岩レンガã®å‡¹éšŽæ®µ +Inner Cobbled Diorite Stair=石畳ã«ã—ãŸé–ƒç·‘岩ã®å‡¹éšŽæ®µ + +Inner Erythrite Stair=エリスライトã®å‡¹éšŽæ®µ +Inner Erythrite Brick Stair=エリスライトレンガã®å‡¹éšŽæ®µ +Inner Erythrite Block Stair=エリスライトブロックã®å‡¹éšŽæ®µ +Inner Cracked Erythrite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Eudialite Stair=ユーディアライトã®å‡¹éšŽæ®µ +Inner Eudialite Brick Stair=ユーディアライトレンガã®å‡¹éšŽæ®µ +Inner Eudialite Block Stair=ユーディアライトブロックã®å‡¹éšŽæ®µ +Inner Cracked Eudialite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Fluorite Stair=è›çŸ³ã®å‡¹éšŽæ®µ +Inner Fluorite Brick Stair=è›çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Fluorite Block Stair=è›çŸ³ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Fluorite Brick Stair=ã²ã³å‰²ã‚ŒãŸè›çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Gabbro Stair=斑れã„岩ã®å‡¹éšŽæ®µ +Inner Cobbled Gabbro Stair=石畳ã«ã—ãŸæ–‘れã„岩ã®å‡¹éšŽæ®µ +Inner Gabbro Brick Stair=斑れã„岩レンガã®å‡¹éšŽæ®µ +Inner Gabbro Block Stair=斑れã„岩ブロックã®å‡¹éšŽæ®µ +Inner Cracked Gabbro Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–‘れã„岩レンガã®å‡¹éšŽæ®µ + +Inner Galena Stair=方鉛鉱ã®å‡¹éšŽæ®µ +Inner Galena Brick Stair=方鉛鉱レンガã®å‡¹éšŽæ®µ +Inner Galena Block Stair=方鉛鉱ブロックã®å‡¹éšŽæ®µ +Inner Cracked Galena Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–¹é‰›é‰±ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Black Granite Stair=黒色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Black Granite Brick Stair=黒色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Black Granite Block Stair=黒色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Black Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Black Granite Stair=石畳ã«ã—ãŸé»’色ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Blue Granite Stair=é’色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Blue Granite Brick Stair=é’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Blue Granite Block Stair=é’色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Blue Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Blue Granite Stair=石畳ã«ã—ãŸé’色ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Gray Granite Stair=ç°è‰²ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Gray Granite Brick Stair=ç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Gray Granite Block Stair=ç°è‰²ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Gray Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Gray Granite Stair=石畳ã«ã—ãŸç°è‰²ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Green Granite Stair=緑色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Green Granite Brick Stair=緑色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Green Granite Block Stair=緑色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Green Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç·‘色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Green Granite Stair=石畳ã«ã—ãŸç·‘色ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Pink Granite Stair=桃色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Pink Granite Brick Stair=桃色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Pink Granite Block Stair=桃色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Pink Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Pink Granite Stair=石畳ã«ã—ãŸæ¡ƒè‰²ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Red Granite Stair=赤色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Red Granite Brick Stair=赤色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Red Granite Block Stair=赤色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Red Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Red Granite Stair=石畳ã«ã—ãŸèµ¤è‰²ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner White Granite Stair=白色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner White Granite Brick Stair=白色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner White Granite Block Stair=白色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked White Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled White Granite Stair=石畳ã«ã—ãŸç™½è‰²ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Yellow Granite Stair=黄色ã®èб崗岩ã®å‡¹éšŽæ®µ +Inner Yellow Granite Brick Stair=黄色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Yellow Granite Block Stair=黄色ã®èŠ±å´—å²©ãƒ–ãƒ­ãƒƒã‚¯ã®å‡¹éšŽæ®µ +Inner Cracked Yellow Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé»„色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Yellow Granite Stair=石畳ã«ã—ãŸé»„色ã®èб崗岩ã®å‡¹éšŽæ®µ + +Inner Heliodor Stair=ヘリオドールã®å‡¹éšŽæ®µ +Inner Heliodor Brick Stair=ヘリオドールレンガã®å‡¹éšŽæ®µ +Inner Heliodor Block Stair=ヘリオドールブロックã®å‡¹éšŽæ®µ +Inner Cracked Heliodor Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Howlite Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ +Inner Howlite Brick Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Howlite Block Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Howlite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Howlite Stair=石畳ã«ã—ãŸãƒã‚¦ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Ilvaite Stair=イルヴァイトã®å‡¹éšŽæ®µ +Inner Ilvaite Brick Stair=イルヴァイトレンガã®å‡¹éšŽæ®µ +Inner Ilvaite Block Stair=イルヴァイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Ilvaite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Ilvaite Stair=石畳ã«ã—ãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Jade Stair=ç¿¡ç¿ ã®å‡¹éšŽæ®µ +Inner Jade Brick Stair=翡翠レンガã®å‡¹éšŽæ®µ +Inner Jade Block Stair=翡翠ブロックã®å‡¹éšŽæ®µ +Inner Cracked Jade Brick Stair=ã²ã³å‰²ã‚ŒãŸç¿¡ç¿ ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Jade Stair=石畳ã«ã—ãŸç¿¡ç¿ ã®å‡¹éšŽæ®µ + +Inner Red Jasper Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®å‡¹éšŽæ®µ +Inner Red Jasper Brick Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®å‡¹éšŽæ®µ +Inner Red Jasper Block Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーブロックã®å‡¹éšŽæ®µ +Inner Cracked Red Jasper Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®å‡¹éšŽæ®µ +Inner Cobbled Red Jasper Stair=石畳ã«ã—ãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®å‡¹éšŽæ®µ + +Inner Kyanite Stair=カイヤナイトã®å‡¹éšŽæ®µ +Inner Kyanite Brick Stair=カイヤナイトレンガã®å‡¹éšŽæ®µ +Inner Kyanite Block Stair=カイヤナイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Kyanite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Kyanite Stair=石畳ã«ã—ãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Lapis Lazuli Stair=ラピスラズリã®å‡¹éšŽæ®µ +Inner Lapis Lazuli Brick Stair=ラピスラズリレンガã®å‡¹éšŽæ®µ +Inner Lapis Lazuli Block Stair=ラピスラズリブロックã®å‡¹éšŽæ®µ +Inner Cracked Lapis Lazuli Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ©ãƒ”スラズリレンガã®å‡¹éšŽæ®µ + +Inner Lepidolite Stair=レピドライトã®å‡¹éšŽæ®µ +Inner Lepidolite Brick Stair=レピドライトレンガã®å‡¹éšŽæ®µ +Inner Lepidolite Block Stair=レピドライトブロックã®å‡¹éšŽæ®µ +Inner Cracked Lepidolite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ¬ãƒ”ドライトレンガã®å‡¹éšŽæ®µ +Inner Cobbled Lepidolite Stair=石畳ã«ã—ãŸãƒ¬ãƒ”ドライトã®å‡¹éšŽæ®µ + +Inner Blue Limestone Stair=é’色ã®çŸ³ç°å²©ã®å‡¹éšŽæ®µ +Inner Blue Limestone Brick Stair=é’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Blue Limestone Block Stair=é’色ã®çŸ³ç°å²©ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Blue Limestone Brick Stair=ã²ã³å‰²ã‚ŒãŸé’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Blue Limestone Stair=石畳ã«ã—ãŸé’色ã®çŸ³ç°å²©ã®å‡¹éšŽæ®µ + +Inner White Limestone Stair=白色ã®çŸ³ç°å²©ã®å‡¹éšŽæ®µ +Inner White Limestone Brick Stair=白色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner White Limestone Block Stair=白色ã®çŸ³ç°å²©ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked White Limestone Brick Stair=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled White Limestone Stair=石畳ã«ã—ãŸç™½è‰²ã®çŸ³ç°å²©ã®å‡¹éšŽæ®µ + +Inner Marble Stair=大ç†çŸ³ã®å‡¹éšŽæ®µ +Inner Marble Brick Stair=大ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Marble Block Stair=大ç†çŸ³ãƒ–ロックã®å‡¹éšŽæ®µ +Inner Cracked Marble Brick Stair=ã²ã³å‰²ã‚ŒãŸå¤§ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Marble Stair=石畳ã«ã—ãŸå¤§ç†çŸ³ã®å‡¹éšŽæ®µ + +Inner Moonstone Stair=ムーンストーンã®å‡¹éšŽæ®µ +Inner Moonstone Brick Stair=ムーンストーンレンガã®å‡¹éšŽæ®µ +Inner Moonstone Block Stair=ムーンストーンブロックã®å‡¹éšŽæ®µ +Inner Cracked Moonstone Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Morion Quartz Stair=é»’æ°´æ™¶ã®å‡¹éšŽæ®µ +Inner Morion Quartz Brick Stair=黒水晶レンガã®å‡¹éšŽæ®µ +Inner Morion Quartz Block Stair=黒水晶ブロックã®å‡¹éšŽæ®µ +Inner Cracked Morion Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’水晶レンガã®å‡¹éšŽæ®µ + +Inner Mudstone Stair=泥岩ã®å‡¹éšŽæ®µ +Inner Cobbled Mudstone Stair=石畳ã«ã—ãŸæ³¥å²©ã®å‡¹éšŽæ®µ +Inner Mudstone Brick Stair=泥岩レンガã®å‡¹éšŽæ®µ +Inner Mudstone Block Stair=泥岩ブロックã®å‡¹éšŽæ®µ +Inner Cracked Mudstone Brick Stair=ã²ã³å‰²ã‚ŒãŸæ³¥å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Prasiolite Stair=プラジオライトã®å‡¹éšŽæ®µ +Inner Prasiolite Brick Stair=プラジオライトレンガã®å‡¹éšŽæ®µ +Inner Prasiolite Block Stair=プラジオライトブロックã®å‡¹éšŽæ®µ +Inner Cracked Prasiolite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ—ラジオライトレンガã®å‡¹éšŽæ®µ + +Inner Pumice Stair=軽石ã®å‡¹éšŽæ®µ +Inner Pumice Brick Stair=軽石レンガã®å‡¹éšŽæ®µ +Inner Pumice Block Stair=軽石ブロックã®å‡¹éšŽæ®µ +Inner Cracked Pumice Brick Stair=ã²ã³å‰²ã‚ŒãŸè»½çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Pyrite Stair=パイライトã®å‡¹éšŽæ®µ +Inner Pyrite Brick Stair=パイライトレンガã®å‡¹éšŽæ®µ +Inner Pyrite Block Stair=パイライトブロックã®å‡¹éšŽæ®µ +Inner Cracked Pyrite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ‘イライトレンガã®å‡¹éšŽæ®µ + +Inner Quartz Stair=石英ã®å‡¹éšŽæ®µ +Inner Quartz Brick Stair=石英レンガã®å‡¹éšŽæ®µ +Inner Quartz Block Stair=石英ブロックã®å‡¹éšŽæ®µ +Inner Cracked Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸçŸ³è‹±ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Rhodonite Stair=ロードナイトã®å‡¹éšŽæ®µ +Inner Rhodonite Brick Stair=ロードナイトレンガã®å‡¹éšŽæ®µ +Inner Rhodonite Block Stair=ロードナイトブロックã®å‡¹éšŽæ®µ +Inner Cracked Rhodonite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Rhodonite Stair=石畳ã«ã—ãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Rose Quartz Stair=ç´…æ°´æ™¶ã®å‡¹éšŽæ®µ +Inner Rose Quartz Brick Stair=紅水晶レンガã®å‡¹éšŽæ®µ +Inner Rose Quartz Block Stair=紅水晶ブロックã®å‡¹éšŽæ®µ +Inner Cracked Rose Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸç´…水晶レンガã®å‡¹éšŽæ®µ + +Inner Scoria Stair=スコリアã®å‡¹éšŽæ®µ +Inner Scoria Brick Stair=スコリアレンガã®å‡¹éšŽæ®µ +Inner Scoria Block Stair=スコリアブロックã®å‡¹éšŽæ®µ +Inner Cracked Scoria Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚³ãƒªã‚¢ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Scoria Stair=石畳ã«ã—ãŸã‚¹ã‚³ãƒªã‚¢ã®å‡¹éšŽæ®µ + +Inner Serpentine Stair=蛇紋石ã®å‡¹éšŽæ®µ +Inner Cobbled Serpentine Stair=石畳ã«ã—ãŸè›‡ç´‹çŸ³ã®å‡¹éšŽæ®µ +Inner Serpentine Brick Stair=蛇紋石レンガã®å‡¹éšŽæ®µ +Inner Serpentine Block Stair=ブロックã®è›‡ç´‹çŸ³ã®å‡¹éšŽæ®µ +Inner Cracked Serpentine Brick Stair=ã²ã³å‰²ã‚ŒãŸè›‡ç´‹çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Shale Stair=æ³¥æ¿å²©ã®å‡¹éšŽæ®µ +Inner Shale Brick Stair=æ³¥æ¿å²©ã®å‡¹éšŽæ®µ +Inner Shale Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ³¥æ¿å²©ã®å‡¹éšŽæ®µ +Inner Cracked Shale Brick Stair=ã²ã³å‰²ã‚ŒãŸæ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Shale Stair=石畳ã«ã—ãŸæ³¥æ¿å²©ã®å‡¹éšŽæ®µ + +Inner Slate Stair=粘æ¿å²©ã®å‡¹éšŽæ®µ +Inner Slate Brick Stair=粘æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Slate Block Stair=ブロックã®ç²˜æ¿å²©ã®å‡¹éšŽæ®µ +Inner Cracked Slate Brick Stair=ã²ã³å‰²ã‚ŒãŸç²˜æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Slate Stair=石畳ã«ã—ãŸç²˜æ¿å²©ã®å‡¹éšŽæ®µ +Inner Slate Tile Stair=粘æ¿å²©ã‚¿ã‚¤ãƒ«ã®å‡¹éšŽæ®µ + +Inner Smokey Quartz Stair=煙水晶ã®å‡¹éšŽæ®µ +Inner Smokey Quartz Brick Stair=煙水晶レンガã®å‡¹éšŽæ®µ +Inner Smokey Quartz Block Stair=ブロックã®ç…™æ°´æ™¶ã®å‡¹éšŽæ®µ +Inner Cracked Smokey Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸç…™æ°´æ™¶ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Soapstone Stair=石鹸石ã®å‡¹éšŽæ®µ +Inner Soapstone Brick Stair=石鹸石レンガã®å‡¹éšŽæ®µ +Inner Soapstone Block Stair=ブロックã®çŸ³é¹¸çŸ³ã®å‡¹éšŽæ®µ +Inner Cracked Soapstone Brick Stair=ã²ã³å‰²ã‚ŒãŸçŸ³é¹¸çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Sodalite Stair=ソーダライトã®å‡¹éšŽæ®µ +Inner Cobbled Sodalite Stair=石畳ã«ã—ãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ +Inner Sodalite Brick Stair=ソーダライトレンガã®å‡¹éšŽæ®µ +Inner Sodalite Block Stair=ブロックã®ã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ +Inner Cracked Sodalite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Sugilite Stair=スギライトã®å‡¹éšŽæ®µ +Inner Sugilite Brick Stair=スギライトレンガã®å‡¹éšŽæ®µ +Inner Sugilite Block Stair=ブロックã®ã‚¹ã‚®ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ +Inner Cracked Sugilite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Sugilite Stair=石畳ã«ã—ãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆã®å‡¹éšŽæ®µ + +Inner Green Tourmaline Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¹éšŽæ®µ +Inner Green Tourmaline Brick Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Green Tourmaline Block Stair=ブロックã®ç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¹éšŽæ®µ +Inner Cracked Green Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Paraiba Tourmaline Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¹éšŽæ®µ +Inner Paraiba Tourmaline Brick Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Paraiba Tourmaline Block Stair=ブロックã®ãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¹éšŽæ®µ +Inner Cracked Paraiba Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Pink Tourmaline Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¹éšŽæ®µ +Inner Pink Tourmaline Brick Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Pink Tourmaline Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¹éšŽæ®µ +Inner Cracked Pink Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Travertine Stair=トラãƒãƒ†ã‚£ãƒ³ã®å‡¹éšŽæ®µ +Inner Cobbled Travertine Stair=石畳ã«ã—ãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¹éšŽæ®µ +Inner Travertine Brick Stair=トラãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Travertine Block Stair=ブロックã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¹éšŽæ®µ +Inner Cracked Travertine Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Yellow Travertine Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¹éšŽæ®µ +Inner Cobbled Yellow Travertine Stair=石畳ã«ã—ãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¹éšŽæ®µ +Inner Yellow Travertine Brick Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Yellow Travertine Block Stair=ブロックã®é»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¹éšŽæ®µ +Inner Cracked Yellow Travertine Brick Stair=ã²ã³å‰²ã‚ŒãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Beige Tuff Stair=ベージュ色ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Cobbled Beige Tuff Stair=石畳ã«ã—ãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Beige Tuff Brick Stair=ベージュ色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Beige Tuff Block Stair=ブロックã®ãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Cracked Beige Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Grey Tuff Stair=ç°è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Cobbled Grey Tuff Stair=石畳ã«ã—ãŸç°è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Grey Tuff Brick Stair=ç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Grey Tuff Block Stair=ブロックã®ç°è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Cracked Grey Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Red Tuff Stair=赤色ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Cobbled Red Tuff Stair=石畳ã«ã—ãŸèµ¤è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Red Tuff Brick Stair=赤色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Red Tuff Block Stair=ブロックã®èµ¤è‰²ã®å‡ç°å²©ã®å‡¹éšŽæ®µ +Inner Cracked Red Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ + +Inner Turquoise Stair=ターコイズã®å‡¹éšŽæ®µ +Inner Turquoise Brick Stair=ターコイズレンガã®å‡¹éšŽæ®µ +Inner Turquoise Block Stair=ブロックã®ã‚¿ãƒ¼ã‚³ã‚¤ã‚ºã®å‡¹éšŽæ®µ +Inner Cracked Turquoise Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºãƒ¬ãƒ³ã‚¬ã®å‡¹éšŽæ®µ +Inner Cobbled Turquoise Stair=石畳ã«ã—ãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºã®å‡¹éšŽæ®µ + +Inner Vivianite Stair=ビビアナイトã®å‡¹éšŽæ®µ +Inner Vivianite Brick Stair=ビビアナイトレンガã®å‡¹éšŽæ®µ +Inner Vivianite Block Stair=ブロックã®ãƒ“ビアナイトã®å‡¹éšŽæ®µ +Inner Cracked Vivianite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ“ビアナイトレンガã®å‡¹éšŽæ®µ + + + +Outer Blue Agate Stair=é’色ã®ç‘ªç‘™ã®å‡¸éšŽæ®µ +Outer Gray Agate Stair=ç°è‰²ã®ç‘ªç‘™ã®å‡¸éšŽæ®µ +Outer Green Agate Stair=緑色ã®ç‘ªç‘™ã®å‡¸éšŽæ®µ +Outer Moss Agate Stair=苔むã—ãŸç‘ªç‘™ã®å‡¸éšŽæ®µ +Outer Orange Agate Stair=橙色ã®ç‘ªç‘™ã®å‡¸éšŽæ®µ +Outer Purple Agate Stair=紫色ã®ç‘ªç‘™ã®å‡¸éšŽæ®µ +Outer Red Agate Stair=赤色ã®ç‘ªç‘™ã®å‡¸éšŽæ®µ + +Outer Amazonite Stair=アマゾナイトã®å‡¸éšŽæ®µ +Outer Cobbled Amazonite Stair=石畳ã«ã—ãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Amazonite Brick Stair=アマゾナイトレンガã®å‡¸éšŽæ®µ +Outer Amazonite Block Stair=ブロックã®ã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Amazonite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒžã‚¾ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Amber Stair=ç¥ç€ã®å‡¸éšŽæ®µ +Outer Amber Brick Stair=ç¥ç€ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Amber Block Stair=ブロックã®ç¥ç€ã®å‡¸éšŽæ®µ +Outer Cracked Amber Brick Stair=ã²ã³å‰²ã‚ŒãŸç¥ç€ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Amethyst Stair=アメジストã®å‡¸éšŽæ®µ +Outer Amethyst Brick Stair=アメジストレンガã®å‡¸éšŽæ®µ +Outer Amethyst Block Stair=ブロックã®ã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Amethyst Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¢ãƒ¡ã‚¸ã‚¹ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Andesite Stair=安山岩ã®å‡¸éšŽæ®µ +Outer Andesite Block Stair=ブロックã®å®‰å±±å²©ã®å‡¸éšŽæ®µ +Outer Andesite Brick Stair=安山岩レンガã®å‡¸éšŽæ®µ +Outer Cracked Andesite Brick Stair=ã²ã³å‰²ã‚ŒãŸå®‰å±±å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Andesite Stair=石畳ã«ã—ãŸå®‰å±±å²©ã®å‡¸éšŽæ®µ + +Outer Basalt Stair=玄武岩ã®å‡¸éšŽæ®µ +Outer Basalt Block Stair=ブロックã®çŽ„æ­¦å²©ã®å‡¸éšŽæ®µ +Outer Basalt Brick Stair=玄武岩レンガã®å‡¸éšŽæ®µ +Outer Cracked Basalt Brick Stair=ã²ã³å‰²ã‚ŒãŸçŽ„æ­¦å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Basalt Stair=石畳ã«ã—ãŸçŽ„æ­¦å²©ã®å‡¸éšŽæ®µ +Outer Basalt Tile Stair=玄武岩タイルã®å‡¸éšŽæ®µ + +Outer Black Moonstone Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ã®å‡¸éšŽæ®µ +Outer Black Moonstone Brick Stair=黒色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Black Moonstone Block Stair=ブロックã®é»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ã®å‡¸éšŽæ®µ +Outer Cracked Black Moonstone Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’色ã®ãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Calcite Stair=方解石ã®å‡¸éšŽæ®µ +Outer Calcite Brick Stair=方解石レンガã®å‡¸éšŽæ®µ +Outer Calcite Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ–¹è§£çŸ³ã®å‡¸éšŽæ®µ +Outer Cracked Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Grey Calcite Stair=ç°è‰²ã®æ–¹è§£çŸ³ã®å‡¸éšŽæ®µ +Outer Grey Calcite Brick Stair=ç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Grey Calcite Block Stair=ブロックã®ç°è‰²ã®æ–¹è§£çŸ³ã®å‡¸éšŽæ®µ +Outer Cracked Grey Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Orange Calcite Stair=æ©™è‰²ã®æ–¹è§£çŸ³ã®å‡¸éšŽæ®µ +Outer Orange Calcite Brick Stair=æ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Orange Calcite Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ©™è‰²ã®æ–¹è§£çŸ³ã®å‡¸éšŽæ®µ +Outer Cracked Orange Calcite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ©™è‰²ã®æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Carnotite Stair=カルノタイトã®å‡¸éšŽæ®µ +Outer Carnotite Brick Stair=カルノタイトレンガã®å‡¸éšŽæ®µ +Outer Carnotite Block Stair=ブロックã®ã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Carnotite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Carnotite Stair=石畳ã«ã—ãŸã‚«ãƒ«ãƒŽã‚¿ã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Celestine Stair=天é’石ã®å‡¸éšŽæ®µ +Outer Celestine Brick Stair=天é’石レンガã®å‡¸éšŽæ®µ +Outer Celestine Block Stair=ブロックã®å¤©é’石ã®å‡¸éšŽæ®µ +Outer Cracked Celestine Brick Stair=ã²ã³å‰²ã‚ŒãŸå¤©é’石レンガã®å‡¸éšŽæ®µ + +Outer Chalcanthite Stair=カルカンサイトã®å‡¸éšŽæ®µ +Outer Chalcanthite Brick Stair=カルカンサイトレンガã®å‡¸éšŽæ®µ +Outer Chalcanthite Block Stair=ブロックã®ã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Chalcanthite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Chalcanthite Stair=石畳ã«ã—ãŸã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Chrysoprase Stair=クリソプレーズã®å‡¸éšŽæ®µ +Outer Chrysoprase Brick Stair=クリソプレーズレンガã®å‡¸éšŽæ®µ +Outer Chrysoprase Block Stair=ブロックã®ã‚¯ãƒªã‚½ãƒ—レーズã®å‡¸éšŽæ®µ +Outer Cracked Chrysoprase Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒªã‚½ãƒ—レーズレンガã®å‡¸éšŽæ®µ + +Outer Citrine Stair=シトリンã®å‡¸éšŽæ®µ +Outer Citrine Brick Stair=シトリンレンガã®å‡¸éšŽæ®µ +Outer Citrine Block Stair=ブロックã®ã‚·ãƒˆãƒªãƒ³ã®å‡¸éšŽæ®µ +Outer Cracked Citrine Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚·ãƒˆãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Covellite Stair=コベライトã®å‡¸éšŽæ®µ +Outer Covellite Brick Stair=コベライトレンガã®å‡¸éšŽæ®µ +Outer Covellite Block Stair=ブロックã®ã‚³ãƒ™ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Covellite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Covellite Stair=石畳ã«ã—ãŸã‚³ãƒ™ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Crocoite Stair=クロコアイトã®å‡¸éšŽæ®µ +Outer Crocoite Brick Stair=クロコアイトレンガã®å‡¸éšŽæ®µ +Outer Crocoite Block Stair=ブロックã®ã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Crocoite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Diorite Stair=閃緑岩ã®å‡¸éšŽæ®µ +Outer Diorite Brick Stair=閃緑岩レンガã®å‡¸éšŽæ®µ +Outer Diorite Block Stair=ブロックã®é–ƒç·‘岩ã®å‡¸éšŽæ®µ +Outer Cracked Diorite Brick Stair=ã²ã³å‰²ã‚ŒãŸé–ƒç·‘岩レンガã®å‡¸éšŽæ®µ +Outer Cobbled Diorite Stair=石畳ã«ã—ãŸé–ƒç·‘岩ã®å‡¸éšŽæ®µ + +Outer Erythrite Stair=エリスライトã®å‡¸éšŽæ®µ +Outer Erythrite Brick Stair=エリスライトレンガã®å‡¸éšŽæ®µ +Outer Erythrite Block Stair=ブロックã®ã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Erythrite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¨ãƒªã‚¹ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Eudialite Stair=ユーディアライトã®å‡¸éšŽæ®µ +Outer Eudialite Brick Stair=ユーディアライトレンガã®å‡¸éšŽæ®µ +Outer Eudialite Block Stair=ブロックã®ãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Eudialite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Fluorite Stair=è›çŸ³ã®å‡¸éšŽæ®µ +Outer Fluorite Brick Stair=è›çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Fluorite Block Stair=ブロックã®è›çŸ³ã®å‡¸éšŽæ®µ +Outer Cracked Fluorite Brick Stair=ã²ã³å‰²ã‚ŒãŸè›çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Gabbro Stair=斑れã„岩ã®å‡¸éšŽæ®µ +Outer Cobbled Gabbro Stair=石畳ã«ã—ãŸæ–‘れã„岩ã®å‡¸éšŽæ®µ +Outer Gabbro Brick Stair=斑れã„岩レンガã®å‡¸éšŽæ®µ +Outer Gabbro Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ–‘れã„岩ã®å‡¸éšŽæ®µ +Outer Cracked Gabbro Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–‘れã„岩レンガã®å‡¸éšŽæ®µ + +Outer Galena Stair=方鉛鉱ã®å‡¸éšŽæ®µ +Outer Galena Brick Stair=方鉛鉱レンガã®å‡¸éšŽæ®µ +Outer Galena Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ–¹é‰›é‰±ã®å‡¸éšŽæ®µ +Outer Cracked Galena Brick Stair=ã²ã³å‰²ã‚ŒãŸæ–¹é‰›é‰±ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Black Granite Stair=黒色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Black Granite Brick Stair=黒色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Black Granite Block Stair=ブロックã®é»’色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Black Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Black Granite Stair=石畳ã«ã—ãŸé»’色ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Blue Granite Stair=é’色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Blue Granite Brick Stair=é’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Blue Granite Block Stair=ブロックã®é’色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Blue Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé’色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Blue Granite Stair=石畳ã«ã—ãŸé’色ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Gray Granite Stair=ç°è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Gray Granite Brick Stair=ç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Gray Granite Block Stair=ブロックã®ç°è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Gray Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Gray Granite Stair=石畳ã«ã—ãŸç°è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Green Granite Stair=緑色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Green Granite Brick Stair=緑色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Green Granite Block Stair=ブロックã®ç·‘色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Green Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç·‘色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Green Granite Stair=石畳ã«ã—ãŸç·‘色ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Pink Granite Stair=桃色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Pink Granite Brick Stair=桃色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Pink Granite Block Stair=ãƒ–ãƒ­ãƒƒã‚¯ã®æ¡ƒè‰²ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Pink Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Pink Granite Stair=石畳ã«ã—ãŸæ¡ƒè‰²ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Red Granite Stair=赤色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Red Granite Brick Stair=赤色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Red Granite Block Stair=ブロックã®èµ¤è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Red Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Red Granite Stair=石畳ã«ã—ãŸèµ¤è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer White Granite Stair=白色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer White Granite Brick Stair=白色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer White Granite Block Stair=ブロックã®ç™½è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked White Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled White Granite Stair=石畳ã«ã—ãŸç™½è‰²ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Yellow Granite Stair=黄色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Yellow Granite Brick Stair=黄色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Yellow Granite Block Stair=ブロックã®é»„色ã®èб崗岩ã®å‡¸éšŽæ®µ +Outer Cracked Yellow Granite Brick Stair=ã²ã³å‰²ã‚ŒãŸé»„色ã®èŠ±å´—å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Yellow Granite Stair=石畳ã«ã—ãŸé»„色ã®èб崗岩ã®å‡¸éšŽæ®µ + +Outer Heliodor Stair=ヘリオドールã®å‡¸éšŽæ®µ +Outer Heliodor Brick Stair=ヘリオドールレンガã®å‡¸éšŽæ®µ +Outer Heliodor Block Stair=ブロックã®ãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ã®å‡¸éšŽæ®µ +Outer Cracked Heliodor Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ˜ãƒªã‚ªãƒ‰ãƒ¼ãƒ«ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Howlite Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Howlite Brick Stair=ãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Howlite Block Stair=ブロックã®ãƒã‚¦ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Cracked Howlite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒã‚¦ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Howlite Stair=石畳ã«ã—ãŸãƒã‚¦ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Ilvaite Stair=イルヴァイトã®å‡¸éšŽæ®µ +Outer Ilvaite Brick Stair=イルヴァイトレンガã®å‡¸éšŽæ®µ +Outer Ilvaite Block Stair=イルヴァイトブロックã®å‡¸éšŽæ®µ +Outer Cracked Ilvaite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Ilvaite Stair=石畳ã«ã—ãŸã‚¤ãƒ«ãƒ´ã‚¡ã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Jade Stair=ç¿¡ç¿ ã®å‡¸éšŽæ®µ +Outer Jade Brick Stair=翡翠レンガã®å‡¸éšŽæ®µ +Outer Jade Block Stair=翡翠ブロックã®å‡¸éšŽæ®µ +Outer Cracked Jade Brick Stair=ã²ã³å‰²ã‚ŒãŸç¿¡ç¿ ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Jade Stair=石畳ã«ã—ãŸç¿¡ç¿ ã®å‡¸éšŽæ®µ + +Outer Red Jasper Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®å‡¸éšŽæ®µ +Outer Red Jasper Brick Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®å‡¸éšŽæ®µ +Outer Red Jasper Block Stair=赤色ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーブロックã®å‡¸éšŽæ®µ +Outer Cracked Red Jasper Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーレンガã®å‡¸éšŽæ®µ +Outer Cobbled Red Jasper Stair=石畳ã«ã—ãŸèµ¤è‰²ã®ã‚¸ãƒ£ã‚¹ãƒ‘ーã®å‡¸éšŽæ®µ + +Outer Kyanite Stair=カイヤナイトã®å‡¸éšŽæ®µ +Outer Kyanite Brick Stair=カイヤナイトレンガã®å‡¸éšŽæ®µ +Outer Kyanite Block Stair=カイヤナイトブロックã®å‡¸éšŽæ®µ +Outer Cracked Kyanite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Kyanite Stair=石畳ã«ã—ãŸã‚«ã‚¤ãƒ¤ãƒŠã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Lapis Lazuli Stair=ラピスラズリã®å‡¸éšŽæ®µ +Outer Lapis Lazuli Brick Stair=ラピスラズリレンガã®å‡¸éšŽæ®µ +Outer Lapis Lazuli Block Stair=ラピスラズリブロックã®å‡¸éšŽæ®µ +Outer Cracked Lapis Lazuli Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ©ãƒ”スラズリレンガã®å‡¸éšŽæ®µ + +Outer Lepidolite Stair=レピドライトã®å‡¸éšŽæ®µ +Outer Lepidolite Brick Stair=レピドライトレンガã®å‡¸éšŽæ®µ +Outer Lepidolite Block Stair=レピドライトブロックã®å‡¸éšŽæ®µ +Outer Cracked Lepidolite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ¬ãƒ”ドライトレンガã®å‡¸éšŽæ®µ +Outer Cobbled Lepidolite Stair=石畳ã«ã—ãŸãƒ¬ãƒ”ドライトã®å‡¸éšŽæ®µ + +Outer Blue Limestone Stair=é’色ã®çŸ³ç°å²©ã®å‡¸éšŽæ®µ +Outer Blue Limestone Brick Stair=é’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Blue Limestone Block Stair=é’色ã®çŸ³ç°å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Blue Limestone Brick Stair=ã²ã³å‰²ã‚ŒãŸé’色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Blue Limestone Stair=石畳ã«ã—ãŸé’色ã®çŸ³ç°å²©ã®å‡¸éšŽæ®µ + +Outer White Limestone Stair=白色ã®çŸ³ç°å²©ã®å‡¸éšŽæ®µ +Outer White Limestone Brick Stair=白色ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer White Limestone Block Stair=白色ã®çŸ³ç°å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked White Limestone Brick Stair=ã²ã³å‰²ã‚ŒãŸç™½è‰²ã®çŸ³ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled White Limestone Stair=石畳ã«ã—ãŸç™½è‰²ã®çŸ³ç°å²©ã®å‡¸éšŽæ®µ + +Outer Marble Stair=大ç†çŸ³ã®å‡¸éšŽæ®µ +Outer Marble Brick Stair=大ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Marble Block Stair=大ç†çŸ³ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Marble Brick Stair=ã²ã³å‰²ã‚ŒãŸå¤§ç†çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Marble Stair=石畳ã«ã—ãŸå¤§ç†çŸ³ã®å‡¸éšŽæ®µ + +Outer Moonstone Stair=ムーンストーンã®å‡¸éšŽæ®µ +Outer Moonstone Brick Stair=ムーンストーンレンガã®å‡¸éšŽæ®µ +Outer Moonstone Block Stair=ムーンストーンブロックã®å‡¸éšŽæ®µ +Outer Cracked Moonstone Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ ãƒ¼ãƒ³ã‚¹ãƒˆãƒ¼ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Morion Quartz Stair=é»’æ°´æ™¶ã®å‡¸éšŽæ®µ +Outer Morion Quartz Brick Stair=黒水晶レンガã®å‡¸éšŽæ®µ +Outer Morion Quartz Block Stair=黒水晶ブロックã®å‡¸éšŽæ®µ +Outer Cracked Morion Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸé»’水晶レンガã®å‡¸éšŽæ®µ + +Outer Mudstone Stair=泥岩ã®å‡¸éšŽæ®µ +Outer Cobbled Mudstone Stair=石畳ã«ã—ãŸæ³¥å²©ã®å‡¸éšŽæ®µ +Outer Mudstone Brick Stair=泥岩レンガã®å‡¸éšŽæ®µ +Outer Mudstone Block Stair=泥岩ブロックã®å‡¸éšŽæ®µ +Outer Cracked Mudstone Brick Stair=ã²ã³å‰²ã‚ŒãŸæ³¥å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Prasiolite Stair=プラジオライトã®å‡¸éšŽæ®µ +Outer Prasiolite Brick Stair=プラジオライトレンガã®å‡¸éšŽæ®µ +Outer Prasiolite Block Stair=プラジオライトブロックã®å‡¸éšŽæ®µ +Outer Cracked Prasiolite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ—ラジオライトレンガã®å‡¸éšŽæ®µ + +Outer Pumice Stair=軽石ã®å‡¸éšŽæ®µ +Outer Pumice Brick Stair=軽石レンガã®å‡¸éšŽæ®µ +Outer Pumice Block Stair=軽石ブロックã®å‡¸éšŽæ®µ +Outer Cracked Pumice Brick Stair=ã²ã³å‰²ã‚ŒãŸè»½çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Pyrite Stair=パイライトã®å‡¸éšŽæ®µ +Outer Pyrite Brick Stair=パイライトレンガã®å‡¸éšŽæ®µ +Outer Pyrite Block Stair=パイライトブロックã®å‡¸éšŽæ®µ +Outer Cracked Pyrite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ‘イライトレンガã®å‡¸éšŽæ®µ + +Outer Quartz Stair=クォーツã®å‡¸éšŽæ®µ +Outer Quartz Brick Stair=クォーツレンガã®å‡¸éšŽæ®µ +Outer Quartz Block Stair=クォーツブロックã®å‡¸éšŽæ®µ +Outer Cracked Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¯ã‚©ãƒ¼ãƒ„レンガã®å‡¸éšŽæ®µ + +Outer Rhodonite Stair=ロードナイトã®å‡¸éšŽæ®µ +Outer Rhodonite Brick Stair=ロードナイトレンガã®å‡¸éšŽæ®µ +Outer Rhodonite Block Stair=ロードナイトブロックã®å‡¸éšŽæ®µ +Outer Cracked Rhodonite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Rhodonite Stair=石畳ã«ã—ãŸãƒ­ãƒ¼ãƒ‰ãƒŠã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Rose Quartz Stair=ç´…æ°´æ™¶ã®å‡¸éšŽæ®µ +Outer Rose Quartz Brick Stair=紅水晶レンガã®å‡¸éšŽæ®µ +Outer Rose Quartz Block Stair=紅水晶ブロックã®å‡¸éšŽæ®µ +Outer Cracked Rose Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸç´…水晶レンガã®å‡¸éšŽæ®µ + +Outer Scoria Stair=スコリアã®å‡¸éšŽæ®µ +Outer Scoria Brick Stair=スコリアレンガã®å‡¸éšŽæ®µ +Outer Scoria Block Stair=スコリアブロックã®å‡¸éšŽæ®µ +Outer Cracked Scoria Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚³ãƒªã‚¢ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Scoria Stair=石畳ã«ã—ãŸã‚¹ã‚³ãƒªã‚¢ã®å‡¸éšŽæ®µ + +Outer Serpentine Stair=蛇紋石ã®å‡¸éšŽæ®µ +Outer Cobbled Serpentine Stair=石畳ã«ã—ãŸè›‡ç´‹çŸ³ã®å‡¸éšŽæ®µ +Outer Serpentine Brick Stair=蛇紋石レンガã®å‡¸éšŽæ®µ +Outer Serpentine Block Stair=蛇紋石ブロックã®å‡¸éšŽæ®µ +Outer Cracked Serpentine Brick Stair=ã²ã³å‰²ã‚ŒãŸè›‡ç´‹çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Shale Stair=æ³¥æ¿å²©ã®å‡¸éšŽæ®µ +Outer Shale Brick Stair=æ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Shale Block Stair=æ³¥æ¿å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Shale Brick Stair=ã²ã³å‰²ã‚ŒãŸæ³¥æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Shale Stair=石畳ã«ã—ãŸæ³¥æ¿å²©ã®å‡¸éšŽæ®µ + +Outer Slate Stair=粘æ¿å²©ã®å‡¸éšŽæ®µ +Outer Slate Brick Stair=粘æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Slate Block Stair=粘æ¿å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Slate Brick Stair=ã²ã³å‰²ã‚ŒãŸç²˜æ¿å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Slate Stair=石畳ã«ã—ãŸç²˜æ¿å²©ã®å‡¸éšŽæ®µ +Outer Slate Tile Stair=粘æ¿å²©ã‚¿ã‚¤ãƒ«ã®å‡¸éšŽæ®µ + +Outer Smokey Quartz Stair=煙水晶ã®å‡¸éšŽæ®µ +Outer Smokey Quartz Brick Stair=煙水晶レンガã®å‡¸éšŽæ®µ +Outer Smokey Quartz Block Stair=煙水晶ブロックã®å‡¸éšŽæ®µ +Outer Cracked Smokey Quartz Brick Stair=ã²ã³å‰²ã‚ŒãŸç…™æ°´æ™¶ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Soapstone Stair=石鹸石ã®å‡¸éšŽæ®µ +Outer Soapstone Brick Stair=石鹸石レンガã®å‡¸éšŽæ®µ +Outer Soapstone Block Stair=石鹸石ブロックã®å‡¸éšŽæ®µ +Outer Cracked Soapstone Brick Stair=ã²ã³å‰²ã‚ŒãŸçŸ³é¹¸çŸ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Sodalite Stair=ソーダライトã®å‡¸éšŽæ®µ +Outer Cobbled Sodalite Stair=石畳ã«ã—ãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ +Outer Sodalite Brick Stair=ソーダライトレンガã®å‡¸éšŽæ®µ +Outer Sodalite Block Stair=ソーダライトブロックã®å‡¸éšŽæ®µ +Outer Cracked Sodalite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Sugilite Stair=スギライトã®å‡¸éšŽæ®µ +Outer Sugilite Brick Stair=スギライトレンガã®å‡¸éšŽæ®µ +Outer Sugilite Block Stair=スギライトブロックã®å‡¸éšŽæ®µ +Outer Cracked Sugilite Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Sugilite Stair=石畳ã«ã—ãŸã‚¹ã‚®ãƒ©ã‚¤ãƒˆã®å‡¸éšŽæ®µ + +Outer Green Tourmaline Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¸éšŽæ®µ +Outer Green Tourmaline Brick Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Green Tourmaline Block Stair=緑色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Green Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸç·‘色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Paraiba Tourmaline Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¸éšŽæ®µ +Outer Paraiba Tourmaline Brick Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Paraiba Tourmaline Block Stair=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Paraiba Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Pink Tourmaline Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ã®å‡¸éšŽæ®µ +Outer Pink Tourmaline Brick Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Pink Tourmaline Block Stair=桃色ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Pink Tourmaline Brick Stair=ã²ã³å‰²ã‚ŒãŸæ¡ƒè‰²ã®ãƒˆãƒ«ãƒžãƒªãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Travertine Stair=トラãƒãƒ†ã‚£ãƒ³ã®å‡¸éšŽæ®µ +Outer Cobbled Travertine Stair=石畳ã«ã—ãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¸éšŽæ®µ +Outer Travertine Brick Stair=トラãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Travertine Block Stair=トラãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Travertine Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Yellow Travertine Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¸éšŽæ®µ +Outer Cobbled Yellow Travertine Stair=石畳ã«ã—ãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ã®å‡¸éšŽæ®µ +Outer Yellow Travertine Brick Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Yellow Travertine Block Stair=黄色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Yellow Travertine Brick Stair=ã²ã³å‰²ã‚ŒãŸé»„色ã®ãƒˆãƒ©ãƒãƒ†ã‚£ãƒ³ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Beige Tuff Stair=ベージュ色ã®å‡ç°å²©ã®å‡¸éšŽæ®µ +Outer Cobbled Beige Tuff Stair=石畳ã«ã—ãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ã®å‡¸éšŽæ®µ +Outer Beige Tuff Brick Stair=ベージュ色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Beige Tuff Block Stair=ベージュ色ã®å‡ç°å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Beige Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ™ãƒ¼ã‚¸ãƒ¥è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Grey Tuff Stair=ç°è‰²ã®å‡ç°å²©ã®å‡¸éšŽæ®µ +Outer Cobbled Grey Tuff Stair=石畳ã«ã—ãŸç°è‰²ã®å‡ç°å²©ã®å‡¸éšŽæ®µ +Outer Grey Tuff Brick Stair=ç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Grey Tuff Block Stair=ç°è‰²ã®å‡ç°å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Grey Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸç°è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Red Tuff Stair=赤色ã®å‡ç°å²©ã®å‡¸éšŽæ®µ +Outer Cobbled Red Tuff Stair=石畳ã«ã—ãŸèµ¤è‰²ã®å‡ç°å²©ã®å‡¸éšŽæ®µ +Outer Red Tuff Brick Stair=赤色ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Red Tuff Block Stair=赤色ã®å‡ç°å²©ãƒ–ロックã®å‡¸éšŽæ®µ +Outer Cracked Red Tuff Brick Stair=ã²ã³å‰²ã‚ŒãŸèµ¤è‰²ã®å‡ç°å²©ãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ + +Outer Turquoise Stair=ターコイズã®å‡¸éšŽæ®µ +Outer Turquoise Brick Stair=ターコイズレンガã®å‡¸éšŽæ®µ +Outer Turquoise Block Stair=ターコイズブロックã®å‡¸éšŽæ®µ +Outer Cracked Turquoise Brick Stair=ã²ã³å‰²ã‚ŒãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºãƒ¬ãƒ³ã‚¬ã®å‡¸éšŽæ®µ +Outer Cobbled Turquoise Stair=石畳ã«ã—ãŸã‚¿ãƒ¼ã‚³ã‚¤ã‚ºã®å‡¸éšŽæ®µ + +Outer Vivianite Stair=ビビアナイトã®å‡¸éšŽæ®µ +Outer Vivianite Brick Stair=ビビアナイトレンガã®å‡¸éšŽæ®µ +Outer Vivianite Block Stair=ビビアナイトブロックã®å‡¸éšŽæ®µ +Outer Cracked Vivianite Brick Stair=ã²ã³å‰²ã‚ŒãŸãƒ“ビアナイトレンガã®å‡¸éšŽæ®µ + +### nodes_glowing.lua ### + +Glowing Apatite=発光ã™ã‚‹ç‡ç°çŸ³ +Glowing Apatite Block=発光ã™ã‚‹ç‡ç°çŸ³ãƒ–ロック +Cobbled Glowing Apatite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹ç‡ç°çŸ³ +Glowing Apatite Brick=発光ã™ã‚‹ç‡ç°çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Glowing Apatite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹ç‡ç°çŸ³ãƒ¬ãƒ³ã‚¬ + +Glowing Calcite=発光ã™ã‚‹æ–¹è§£çŸ³ +Glowing Calcite Block=発光ã™ã‚‹æ–¹è§£çŸ³ãƒ–ロック +Cobbled Glowing Calcite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹æ–¹è§£çŸ³ +Glowing Calcite Brick=発光ã™ã‚‹æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Glowing Calcite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹æ–¹è§£çŸ³ãƒ¬ãƒ³ã‚¬ + +Glowing Esperite=発光ã™ã‚‹ã‚¨ã‚¹ãƒšãƒ©ã‚¤ãƒˆ +Glowing Esperite Block=発光ã™ã‚‹ã‚¨ã‚¹ãƒšãƒ©ã‚¤ãƒˆãƒ–ロック +Cobbled Glowing Esperite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹ã‚¨ã‚¹ãƒšãƒ©ã‚¤ãƒˆ +Glowing Esperite Brick=発光ã™ã‚‹ã‚¨ã‚¹ãƒšãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cracked Glowing Esperite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹ã‚¨ã‚¹ãƒšãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Glowing Fluorite=発光ã™ã‚‹è›çŸ³ +Glowing Fluorite Block=発光ã™ã‚‹è›çŸ³ãƒ–ロック +Cobbled Glowing Fluorite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹è›çŸ³ +Glowing Fluorite Brick=発光ã™ã‚‹è›çŸ³ãƒ¬ãƒ³ã‚¬ +Cracked Glowing Fluorite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹è›çŸ³ãƒ¬ãƒ³ã‚¬ + +Glowing Selenite=発光ã™ã‚‹ã‚»ãƒ¬ãƒŠã‚¤ãƒˆ +Glowing Selenite Block=発光ã™ã‚‹ã‚»ãƒ¬ãƒŠã‚¤ãƒˆãƒ–ロック +Cobbled Glowing Selenite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹ã‚»ãƒ¬ãƒŠã‚¤ãƒˆ +Glowing Selenite Brick=発光ã™ã‚‹ã‚»ãƒ¬ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cracked Glowing Selenite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹ã‚»ãƒ¬ãƒŠã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Glowing Sodalite=発光ã™ã‚‹ã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆ +Glowing Sodalite Block=発光ã™ã‚‹ã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ–ロック +Cobbled Glowing Sodalite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹ã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆ +Glowing Sodalite Brick=発光ã™ã‚‹ã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cracked Glowing Sodalite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹ã‚½ãƒ¼ãƒ€ãƒ©ã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +Glowing Willemite=発光ã™ã‚‹ã‚¦ã‚£ãƒ¬ãƒžã‚¤ãƒˆ +Glowing Willemite Block=発光ã™ã‚‹ã‚¦ã‚£ãƒ¬ãƒžã‚¤ãƒˆãƒ–ロック +Cobbled Glowing Willemite=石畳ã«ã—ãŸç™ºå…‰ã™ã‚‹ã‚¦ã‚£ãƒ¬ãƒžã‚¤ãƒˆ +Glowing Willemite Brick=発光ã™ã‚‹ã‚¦ã‚£ãƒ¬ãƒžã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ +Cracked Glowing Willemite Brick=ã²ã³å‰²ã‚ŒãŸç™ºå…‰ã™ã‚‹ã‚¦ã‚£ãƒ¬ãƒžã‚¤ãƒˆãƒ¬ãƒ³ã‚¬ + +### nodes_crystal.lua ### + +Budding Amazonite=新芽アマゾナイト +Amazonite Crystal=アマゾナイトã®çµæ™¶ + +Budding Amber=新芽ã®ç¥ç€ +Amber Crystal=ç¥ç€ã®çµæ™¶ + +Budding Amethyst=新芽アメジスト +Amethyst Crystal=アメジストã®çµæ™¶ + +Budding Celestine=新芽ã®ã‚»ãƒ¬ã‚¹ã‚¿ã‚¤ãƒ³ +Celestine Crystal=セレスタインã®çµæ™¶ + +Budding Chalcanthite=新芽ã®ã‚«ãƒ«ã‚«ãƒ³ã‚µã‚¤ãƒˆ +Chalcanthite Crystal=カルカンサイトã®çµæ™¶ + +Budding Citrine=新芽ã®ã‚·ãƒˆãƒªãƒ³ +Citrine Crystal=シトリンã®çµæ™¶ + +Budding Crocoite=新芽ã®ã‚¯ãƒ­ã‚³ã‚¢ã‚¤ãƒˆ +Crocoite Crystal=クロコアイトã®çµæ™¶ + +Budding Eudialite=新芽ã®ãƒ¦ãƒ¼ãƒ‡ã‚£ã‚¢ãƒ©ã‚¤ãƒˆ +Eudialite Crystal=ユーディアライトã®çµæ™¶ + +Budding Heliodor=新芽ヘリオドール +Heliodor Crystal=ヘリオドールã®çµæ™¶ + +Budding Kyanite=新芽カイアナイト +Kyanite Crystal=カイアナイトã®çµæ™¶ + +Budding Moonstone=新芽ムーンストーン +Moonstone Crystal=ムーンストーンã®çµæ™¶ + +Budding Morion Quartz=新芽ã®ãƒ¢ãƒªã‚ªãƒ³æ°´æ™¶ +Morion Quartz Crystal=モリオン水晶ã®çµæ™¶ + +Budding Prasiolite=新芽プラシオライト +Prasiolite Crystal=プラシオライトã®çµæ™¶ + +Budding Quartz=新芽クォーツ +Quartz Crystal=クォーツã®çµæ™¶ + +Budding Rose Quartz=新芽ローズクォーツ +Rose Quartz Crystal=ローズクォーツã®çµæ™¶ + +Budding Smokey Quartz=新芽スモーキークォーツ +Smokey Quartz Crystal=スモーキークォーツã®çµæ™¶ + +Budding Green Tourmaline=新芽ã®ã‚°ãƒªãƒ¼ãƒ³ãƒˆãƒ«ãƒžãƒªãƒ³ +Green Tourmaline Crystal=グリーントルマリンã®çµæ™¶ + +Budding Paraiba Tourmaline=新芽ã®ãƒ‘ライãƒãƒˆãƒ«ãƒžãƒªãƒ³ +Paraiba Tourmaline Crystal=パライãƒãƒˆãƒ«ãƒžãƒªãƒ³ã®çµæ™¶ + +Budding Pink Tourmaline=新芽ã®ãƒ”ンクトルマリン +Pink Tourmaline Crystal=ピンクトルマリンã®çµæ™¶ + +Budding Vivianite=新芽ã®ãƒ“ビアナイト +Vivianite Crystal=ビビアナイトã®çµæ™¶ diff --git a/mods/too_many_stones/locale/too_many_stones.pt_br.tr b/mods/too_many_stones/locale/too_many_stones.pt_br.tr new file mode 100644 index 00000000..fa198b45 --- /dev/null +++ b/mods/too_many_stones/locale/too_many_stones.pt_br.tr @@ -0,0 +1,2471 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate=Ãgata Azul +Gray Agate=Ãgata Cinza +Green Agate=Ãgata Verde +Moss Agate=Ãgata Musgo +Orange Agate=Ãgata Laranja +Purple Agate=Ãgata Roxa +Red Agate=Ãgata Vermelha + +Amazonite=Amazonita +Amazonite Block=Bloco de Amazonita +Cobbled Amazonite=Amazonita Calçada +Amazonite Brick=Tijolo de Amazonita +Cracked Amazonite Brick=Tijolo de Amazonita Rachado + +Amber=Âmbar +Amber Block=Bloco de Âmbar +Amber Brick=Tijolo de Âmbar +Cracked Amber Brick=Tijolo de Âmbar Rachado + +Amethyst=Ametista +Amethyst Block=Bloco de Ametista +Amethyst Brick=Tijolo de Ametista +Cracked Amethyst Brick=Tijolo de Ametista Rachado + +Andesite=Andesito +Andesite Block=Bloco de Andesito +Andesite Brick=Tijolo de Andesito +Cracked Andesite Brick=Tijolo de Andesito Rachado +Cobbled Andesite=Andesito Calçado + +Basalt=Basalto +Basalt Block=Bloco de Basalto +Basalt Brick=Tijolo de Basalto +Cracked Basalt Brick=Tijolo de Basalto Rachado +Cobbled Basalt=Basalto Calçado +Basalt Tile=Azulejo de Basalto + +Columnar Basalt=Basalto Colunar + +Batch=Mistura Vitrificável + +Black Moonstone=Pedra da Lua Negra +Black Moonstone Block=Bloco de Pedra da Lua Negra +Black Moonstone Brick=Tijolo de Pedra da Lua Negra +Cracked Black Moonstone Brick=Tijolo de Pedra da Lua Negra Rachado + +Black Opal=Opala Negra + +Calcite=Calcita +Calcite Block=Bloco de Calcita +Calcite Brick=Tijolo de Calcita +Cracked Calcite Brick=Tijolo de Calcita Rachado + +Grey Calcite=Calcita Cinza +Grey Calcite Block=Bloco de Calcita Cinza +Grey Calcite Brick=Tijolo de Calcita Cinza +Cracked Grey Calcite Brick=Tijolo de Calcita Cinza Rachado + +Orange Calcite=Calcita Laranja +Orange Calcite Block=Bloco de Calcita Laranja +Orange Calcite Brick=Tijolo de Calcita Laranja +Cracked Orange Calcite Brick=Tijolo de Calcita Laranja Rachado + +Carnotite=Carnotita +Carnotite Block=Bloco de Carnotita +Carnotite Brick=Tijolo de Carnotita +Cracked Carnotite Brick=Tijolo de Carnotita Rachado +Cobbled Carnotite=Carnotita Calçada + +Celestine=Celestita +Celestine Block=Bloco de Celestita +Celestine Brick=Tijolo de Celestita +Cracked Celestine Brick=Tijolo de Celestita Rachado + +Chalcanthite=Calcanthita +Chalcanthite Block=Bloco de Calcanthita +Chalcanthite Brick=Tijolo de Calcanthita +Cracked Chalcanthite Brick=Tijolo de Calcanthita Rachado +Cobbled Chalcanthite=Calcanthita Calçada + +Chrysoprase=Crísopraso +Chrysoprase Block=Bloco de Crísopraso +Chrysoprase Brick=Tijolo de Crísopraso +Cracked Chrysoprase Brick=Tijolo de Crísopraso Rachado + +Citrine=Citrino +Citrine Block=Bloco de Citrino +Citrine Brick=Tijolo de Citrino +Cracked Citrine Brick=Tijolo de Citrino Rachado + +Covellite=Covelita +Covellite Block=Bloco de Covelita +Covellite Brick=Tijolo de Covelita +Cracked Covellite Brick=Tijolo de Covelita Rachado +Cobbled Covellite=Covelita Calçada + +Crocoite=Crocotita +Crocoite Block=Bloco de Crocotita +Crocoite Brick=Tijolo de Crocotita +Cracked Crocoite Brick=Tijolo de Crocotita Rachado + +Diorite=Diorito +Diorite Block=Bloco de Diorito +Diorite Brick=Tijolo de Diorito +Cracked Diorite Brick=Tijolo de Diorito Rachado +Cobbled Diorite=Diorito Calçado + +Erythrite=Eritrita +Erythrite Block=Bloco de Eritrita +Erythrite Brick=Tijolo de Eritrita +Cracked Erythrite Brick=Tijolo de Eritrita Rachado + +Eudialite=Eudialita +Eudialite Block=Bloco de Eudialita +Eudialite Brick=Tijolo de Eudialita +Cracked Eudialite Brick=Tijolo de Eudialita Rachado + +Fluorite=Fluorita +Fluorite Block=Bloco de Fluorita +Fluorite Brick=Tijolo de Fluorita +Cracked Fluorite Brick=Tijolo de Fluorita Rachado + +Fire Opal=Opala de Fogo + +Gabbro=Gabro +Gabbro Block=Bloco de Gabro +Cobbled Gabbro=Gabro Calçado +Gabbro Brick=Tijolo de Gabro +Cracked Gabbro Brick=Tijolo de Gabro Rachado + +Galena=Galena +Galena Block=Bloco de Galena +Galena Brick=Tijolo de Galena +Cracked Galena Brick=Tijolo de Galena Rachado + +Black Granite=Granito Negro +Black Granite Block=Bloco de Granito Negro +Black Granite Brick=Tijolo de Granito Negro +Cracked Black Granite Brick=Tijolo de Granito Negro Rachado +Cobbled Black Granite=Granito Negro Calçado + +Blue Granite=Granito Azul +Blue Granite Block=Bloco de Granito Azul +Blue Granite Brick=Tijolo de Granito Azul +Cracked Blue Granite Brick=Tijolo de Granito Azul Rachado +Cobbled Blue Granite=Granito Azul Calçado + +Gray Granite=Granito Cinza +Gray Granite Block=Bloco de Granito Cinza +Gray Granite Brick=Tijolo de Granito Cinza +Cracked Gray Granite Brick=Tijolo de Granito Cinza Rachado +Cobbled Gray Granite=Granito Cinza Calçado + +Green Granite=Granito Verde +Green Granite Block=Bloco de Granito Verde +Green Granite Brick=Tijolo de Granito Verde +Cracked Green Granite Brick=Tijolo de Granito Verde Rachado +Cobbled Green Granite=Granito Verde Calçado + +Pink Granite=Granito Rosa +Pink Granite Block=Bloco de Granito Rosa +Pink Granite Brick=Tijolo de Granito Rosa +Cracked Pink Granite Brick=Tijolo de Granito Rosa Rachado +Cobbled Pink Granite=Granito Rosa Calçado + +Red Granite=Granito Vermelho +Red Granite Block=Bloco de Granito Vermelho +Red Granite Brick=Tijolo de Granito Vermelho +Cracked Red Granite Brick=Tijolo de Granito Vermelho Rachado +Cobbled Red Granite=Granito Vermelho Calçado + +White Granite=Granito Branco +White Granite Block=Bloco de Granito Branco +White Granite Brick=Tijolo de Granito Branco +Cracked White Granite Brick=Tijolo de Granito Branco Rachado +Cobbled White Granite=Granito Branco Calçado + +Yellow Granite=Granito Amarelo +Yellow Granite Block=Bloco de Granito Amarelo +Yellow Granite Brick=Tijolo de Granito Amarelo +Cracked Yellow Granite Brick=Tijolo de Granito Amarelo Rachado +Cobbled Yellow Granite=Granito Amarelo Calçado + +Heliodor=Heliodoro +Heliodor Block=Bloco de Heliodoro +Heliodor Brick=Tijolo de Heliodoro +Cracked Heliodor Brick=Tijolo de Heliodoro Rachado + +Howlite=Howlita +Howlite Block=Bloco de Howlita +Howlite Brick=Tijolo de Howlita +Cracked Howlite Brick=Tijolo de Howlita Rachado +Cobbled Howlite=Howlita Calçada + +Ilvaite=Ilvaita +Ilvaite Block=Bloco de Ilvaita +Ilvaite Brick=Tijolo de Ilvaita +Cracked Ilvaite Brick=Tijolo de Ilvaita Rachado +Cobbled Ilvaite=Ilvaita Calçada + +Jade=Jade +Jade Block=Bloco de Jade +Jade Brick=Tijolo de Jade +Cracked Jade Brick=Tijolo de Jade Rachado +Cobbled Jade=Jade Calçada + +Red Jasper=Jaspe Vermelho +Red Jasper Block=Bloco de Jaspe Vermelho +Red Jasper Brick=Tijolo de Jaspe Vermelho +Cracked Red Jasper Brick=Tijolo de Jaspe Vermelho Rachado +Cobbled Red Jasper=Jaspe Vermelho Calçada + +Kyanite=Cianite +Kyanite Block=Bloco de Cianite +Kyanite Brick=Tijolo de Cianite +Cracked Kyanite Brick=Tijolo de Cianite Rachado +Cobbled Kyanite=Cianite Calçada + +Lapis Lazuli=Lápis Lazúli +Lapis Lazuli Block=Bloco de Lápis Lazúli +Lapis Lazuli Brick=Tijolo de Lápis Lazúli +Cracked Lapis Lazuli Brick=Tijolo de Lápis Lazúli Rachado + +Lepidolite=Lepidolita +Lepidolite Block=Bloco de Lepidolita +Lepidolite Brick=Tijolo de Lepidolita +Cracked Lepidolite Brick=Tijolo de Lepidolita Rachado +Cobbled Lepidolite=Lepidolita Calçada + +Blue Limestone=Calcário Azul +Blue Limestone Block=Bloco de Calcário Azul +Blue Limestone Brick=Tijolo de Calcário Azul +Cracked Blue Limestone Brick=Tijolo de Calcário Azul Rachado +Cobbled Blue Limestone=Calcário Azul Calçada + +White Limestone=Calcário Branco +White Limestone Block=Bloco de Calcário Branco +White Limestone Brick=Tijolo de Calcário Branco +Cracked White Limestone Brick=Tijolo de Calcário Branco Rachado +Cobbled White Limestone=Calcário Branco Calçada + +Marble=Mármore +Marble Block=Bloco de Mármore +Marble Brick=Tijolo de Mármore +Cracked Marble Brick=Tijolo de Mármore Rachado +Cobbled Marble=Mármore Calçada + +Moonstone=Pedra da Lua +Moonstone Block=Bloco de Pedra da Lua +Moonstone Brick=Tijolo de Pedra da Lua +Cracked Moonstone Brick=Tijolo de Pedra da Lua Rachado + +Morion Quartz=Quartzo Morion +Morion Quartz Block=Bloco de Quartzo Morion +Morion Quartz Brick=Tijolo de Quartzo Morion +Cracked Morion Quartz Brick=Tijolo de Quartzo Morion Rachado + +Mudstone=Argilito +Mudstone Block=Bloco de Argilito +Cobbled Mudstone=Argilito Calçada +Mudstone Brick=Tijolo de Argilito +Cracked Mudstone Brick=Tijolo de Argilito Rachado + +Opal=Opala + +Prasiolite=Prasiolita +Prasiolite Block=Bloco de Prasiolita +Prasiolite Brick=Tijolo de Prasiolita +Cracked Prasiolite Brick=Tijolo de Prasiolita Rachado + +Pumice=Púmice +Pumice Block=Bloco de Púmice +Pumice Brick=Tijolo de Púmice +Cracked Pumice Brick=Tijolo de Púmice Rachado + +Pyrite=Pirite +Pyrite Block=Bloco de Pirite +Cobbled Pyrite=Pirite Calçada +Pyrite Brick=Tijolo de Pirite +Cracked Pyrite Brick=Tijolo de Pirite Rachado + +Quartz=Quartzo +Quartz Block=Bloco de Quartzo +Quartz Brick=Tijolo de Quartzo +Cracked Quartz Brick=Tijolo de Quartzo Rachado + +Rhodonite=Rodonita +Rhodonite Block=Bloco de Rodonita +Rhodonite Brick=Tijolo de Rodonita +Cracked Rhodonite Brick=Tijolo de Rodonita Rachado +Cobbled Rhodonite=Rodonita Calçada + +Rose Quartz=Quartzo Rosa +Rose Quartz Block=Bloco de Quartzo Rosa +Rose Quartz Brick=Tijolo de Quartzo Rosa +Cracked Rose Quartz Brick=Tijolo de Quartzo Rosa Rachado + +Scoria=Escória +Scoria Block=Bloco de Escória +Scoria Brick=Tijolo de Escória +Cracked Scoria Brick=Tijolo de Escória Rachado +Cobbled Scoria=Escória Calçada + +Serpentine=Serpentina +Serpentine Block=Bloco de Serpentina +Cobbled Serpentine=Serpentina Calçada +Serpentine Brick=Tijolo de Serpentina +Cracked Serpentine Brick=Tijolo de Serpentina Rachado + +Shale=Xisto +Shale Block=Bloco de Xisto +Shale Brick=Tijolo de Xisto +Cracked Shale Brick=Tijolo de Xisto Rachado +Cobbled Shale=Xisto Calçada + +Slate=Ardósia +Slate Block=Bloco de Ardósia +Slate Brick=Tijolo de Ardósia +Cracked Slate Brick=Tijolo de Ardósia Rachado +Cobbled Slate=Calçada de Ardósia +Slate Tile=Azulejo de Ardósia + +Smokey Quartz=Quartzo Fumê +Smokey Quartz Block=Bloco de Quartzo Fumê +Smokey Quartz Brick=Tijolo de Quartzo Fumê +Cracked Smokey Quartz Brick=Tijolo de Quartzo Fumê Rachado + +Soapstone=Esteatita +Soapstone Block=Bloco de Esteatita +Soapstone Brick=Tijolo de Esteatita +Cracked Soapstone Brick=Tijolo de Esteatita Rachado + +Sodalite=Sodalita +Sodalite Block=Bloco de Sodalita +Cobbled Sodalite=Sodalita Calçada +Sodalite Brick=Tijolo de Sodalita +Cracked Sodalite Brick=Tijolo de Sodalita Rachado + +Sugilite=Sugilita +Sugilite Block=Bloco de Sugilita +Sugilite Brick=Tijolo de Sugilita +Cracked Sugilite Brick=Tijolo de Sugilita Rachado +Cobbled Sugilite=Sugilita Calçada + +Green Tourmaline=Turmalina Verde +Green Tourmaline Block=Bloco de Turmalina Verde +Green Tourmaline Brick=Tijolo de Turmalina Verde +Cracked Green Tourmaline Brick=Tijolo de Turmalina Verde Rachado + +Paraiba Tourmaline=Turmalina Paraíba +Paraiba Tourmaline Block=Bloco de Turmalina Paraíba +Paraiba Tourmaline Brick=Tijolo de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick=Tijolo de Turmalina Paraíba Rachado + +Pink Tourmaline=Turmalina Rosa +Pink Tourmaline Block=Bloco de Turmalina Rosa +Pink Tourmaline Brick=Tijolo de Turmalina Rosa +Cracked Pink Tourmaline Brick=Tijolo de Turmalina Rosa Rachado + +Travertine=Travertino +Travertine Block=Bloco de Travertino +Cobbled Travertine=Travertino Calçado +Travertine Brick=Tijolo de Travertino +Cracked Travertine Brick=Tijolo de Travertino Rachado + +Yellow Travertine=Travertino Amarelo +Yellow Travertine Block=Bloco de Travertino Amarelo +Cobbled Yellow Travertine=Travertino Amarelo Calçado +Yellow Travertine Brick=Tijolo de Travertino Amarelo +Cracked Yellow Travertine Brick=Tijolo de Travertino Amarelo Rachado + +Beige Tuff=Tufito Bege +Beige Tuff Block=Bloco de Tufito Bege +Cobbled Beige Tuff=Tufito Bege Calçado +Beige Tuff Brick=Tijolo de Tufito Bege +Cracked Beige Tuff=Tijolo de Tufito Bege Rachado + +Grey Tuff=Tufito Cinza +Grey Tuff Block=Bloco de Tufito Cinza +Cobbled Grey Tuff=Tufito Cinza Calçado +Grey Tuff Brick=Tijolo de Tufito Cinza +Cracked Grey Tuff=Tijolo de Tufito Cinza Rachado + +Red Tuff=Tufito Vermelho +Red Tuff Block=Bloco de Tufito Vermelho +Cobbled Red Tuff=Tufito Vermelho Calçado +Red Tuff Brick=Tijolo de Tufito Vermelho +Cracked Red Tuff=Tijolo de Tufito Vermelho Rachado + +Turquoise=Turquesa +Turquoise Block=Bloco de Turquesa +Turquoise Brick=Tijolo de Turquesa +Cracked Turquoise Brick=Tijolo de Turquesa Rachado +Cobbled Turquoise=Turquesa Calçada +Turquoise Pebble=Seixo de Turquesa + +Vivianite=Vivianita +Vivianite Block=Bloco de Vivianita +Vivianite Brick=Tijolo de Vivianita +Cracked Vivianite Brick=Tijolo de Vivianita Rachado + +### wall.lua ### + +Blue Agate Wall=Parede de Ãgata Azul +Gray Agate Wall=Parede de Ãgata Cinza +Green Agate Wall=Parede de Ãgata Verde +Moss Agate Wall=Parede de Ãgata Musgo +Orange Agate Wall=Parede de Ãgata Laranja +Purple Agate Wall=Parede de Ãgata Roxa +Red Agate Wall=Parede de Ãgata Vermelha + +Amazonite Wall=Parede de Amazonita +Cobbled Amazonite Wall=Parede de Amazonita Calçada +Amazonite Brick Wall=Parede de Tijolo de Amazonita +Amazonite Block Wall=Parede de Bloco de Amazonita +Cracked Amazonite Brick Wall=Parede de Tijolo de Amazonita Rachado + +Amber Wall=Parede de Âmbar +Amber Brick Wall=Parede de Tijolo de Âmbar +Amber Block Wall=Parede de Bloco de Âmbar +Cracked Amber Brick Wall=Parede de Tijolo de Âmbar Rachado + +Amethyst Wall=Parede de Ametista +Amethyst Brick Wall=Parede de Tijolo de Ametista +Amethyst Block Wall=Parede de Bloco de Ametista +Cracked Amethyst Brick Wall=Parede de Tijolo de Ametista Rachado + +Ammolite=Ammolite + +Andesite Wall=Parede de Andesita +Andesite Block Wall=Parede de Bloco de Andesita +Andesite Brick Wall=Parede de Tijolo de Andesita +Cracked Andesite Brick Wall=Parede de Tijolo de Andesita Rachado +Cobbled Andesite Wall=Parede de Andesita Calçada + +Basalt Wall=Parede de Basalto +Basalt Block Wall=Parede de Bloco de Basalto +Basalt Brick Wall=Parede de Tijolo de Basalto +Cracked Basalt Brick Wall=Parede de Tijolo de Basalto Rachado +Cobbled Basalt Wall=Parede de Basalto Calçada +Basalt Tile Wall=Parede de Azulejo de Basalto + +Black Moonstone Wall=Parede de Pedra-da-lua Negra +Black Moonstone Brick Wall=Parede de Tijolo de Pedra-da-lua Negra +Black Moonstone Block Wall=Parede de Bloco de Pedra-da-lua Negra +Cracked Black Moonstone Brick Wall=Parede de Tijolo de Pedra-da-lua Negra Rachado + +Calcite Wall=Parede de Calcita +Calcite Brick Wall=Parede de Tijolo de Calcita +Calcite Block Wall=Parede de Bloco de Calcita +Cracked Calcite Brick Wall=Parede de Tijolo de Calcita Rachado + +Grey Calcite Wall=Parede de Calcita Cinza +Grey Calcite Brick Wall=Parede de Tijolo de Calcita Cinza +Grey Calcite Block Wall=Parede de Bloco de Calcita Cinza +Cracked Grey Calcite Brick Wall=Parede de Tijolo de Calcita Cinza Rachado + +Orange Calcite Wall=Parede de Calcita Laranja +Orange Calcite Brick Wall=Parede de Tijolo de Calcita Laranja +Orange Calcite Block Wall=Parede de Bloco de Calcita Laranja +Cracked Orange Calcite Brick Wall=Parede de Tijolo de Calcita Laranja Rachado + +Carnotite Wall=Parede de Carnotita +Carnotite Brick Wall=Parede de Tijolo de Carnotita +Carnotite Block Wall=Parede de Bloco de Carnotita +Cracked Carnotite Brick Wall=Parede de Tijolo de Carnotita Rachado +Cobbled Carnotite Wall=Parede de Carnotita Calçada + +Celestine Wall=Parede de Celestina +Celestine Brick Wall=Parede de Tijolo de Celestina +Celestine Block Wall=Parede de Bloco de Celestina +Cracked Celestine Brick Wall=Parede de Tijolo de Celestina Rachado + +Chalcanthite Wall=Parede de Chalcanthita +Chalcanthite Brick Wall=Parede de Tijolo de Chalcanthita +Chalcanthite Block Wall=Parede de Bloco de Chalcanthita +Cracked Chalcanthite Brick Wall=Parede de Tijolo de Chalcanthita Rachado +Cobbled Chalcanthite Wall=Parede de Chalcanthita Calçada + +Chrysoprase Wall=Parede de Crisoprase +Chrysoprase Brick Wall=Parede de Tijolo de Crisoprase +Chrysoprase Block Wall=Parede de Bloco de Crisoprase +Cracked Chrysoprase Brick Wall=Parede de Tijolo de Crisoprase Rachado + +Citrine Wall=Parede de Citrino +Citrine Brick Wall=Parede de Tijolo de Citrino +Citrine Block Wall=Parede de Bloco de Citrino +Cracked Citrine Brick Wall=Parede de Tijolo de Citrino Rachado + +Covellite Wall=Parede de Covellita +Covellite Brick Wall=Parede de Tijolo de Covellita +Covellite Block Wall=Parede de Bloco de Covellita +Cracked Covellite Brick Wall=Parede de Tijolo de Covellita Rachado +Cobbled Covellite Wall=Parede de Covellita Calçada + +Crocoite Wall=Parede de Crocoíta +Crocoite Brick Wall=Parede de Tijolo de Crocoíta +Crocoite Block Wall=Parede de Bloco de Crocoíta +Cracked Crocoite Brick Wall=Parede de Tijolo de Crocoíta Rachado + +Diorite Wall=Parede de Diórito +Diorite Brick Wall=Parede de Tijolo de Diórito +Diorite Block Wall=Parede de Bloco de Diórito +Cracked Diorite Brick Wall=Parede de Tijolo de Diórito Rachado +Cobbled Diorite Wall=Parede de Diórito Calçada + +Erythrite Wall=Parede de Eritrita +Erythrite Brick Wall=Parede de Tijolo de Eritrita +Erythrite Block Wall=Parede de Bloco de Eritrita +Cracked Erythrite Brick Wall=Parede de Tijolo de Eritrita Rachado + +Eudialite Wall=Parede de Eudialita +Eudialite Brick Wall=Parede de Tijolo de Eudialita +Eudialite Block Wall=Parede de Bloco de Eudialita +Cracked Eudialite Brick Wall=Parede de Tijolo de Eudialita Rachado + +Fluorite Wall=Parede de Fluorita +Fluorite Brick Wall=Parede de Tijolo de Fluorita +Fluorite Block Wall=Parede de Bloco de Fluorita +Cracked Fluorite Brick Wall=Parede de Tijolo de Fluorita Rachado + +Gabbro Wall=Parede de Gabro +Cobbled Gabbro Wall=Parede de Gabro Calçada +Gabbro Brick Wall=Parede de Tijolo de Gabro +Gabbro Block Wall=Parede de Bloco de Gabro +Cracked Gabbro Brick Wall=Parede de Tijolo de Gabro Rachado + +Galena Wall=Parede de Galena +Galena Brick Wall=Parede de Tijolo de Galena +Galena Block Wall=Parede de Bloco de Galena +Cracked Galena Brick Wall=Parede de Tijolo de Galena Rachado + +Black Granite Wall=Parede de Granito Negro +Black Granite Brick Wall=Parede de Tijolo de Granito Negro +Black Granite Block Wall=Parede de Bloco de Granito Negro +Cracked Black Granite Brick Wall=Parede de Tijolo de Granito Negro Rachado +Cobbled Black Granite Wall=Parede de Granito Negro Calçada + +Blue Granite Wall=Parede de Granito Azul +Blue Granite Brick Wall=Parede de Tijolo de Granito Azul +Blue Granite Block Wall=Parede de Bloco de Granito Azul +Cracked Blue Granite Brick Wall=Parede de Tijolo de Granito Azul Rachado +Cobbled Blue Granite Wall=Parede de Granito Azul Calçada + +Gray Granite Wall=Parede de Granito Cinza +Gray Granite Brick Wall=Parede de Tijolo de Granito Cinza +Gray Granite Block Wall=Parede de Bloco de Granito Cinza +Cracked Gray Granite Brick Wall=Parede de Tijolo de Granito Cinza Rachado +Cobble Gray Granite Wall=Parede de Granito Cinza Calçada + +Green Granite Wall=Parede de Granito Verde +Green Granite Brick Wall=Parede de Tijolo de Granito Verde +Green Granite Block Wall=Parede de Bloco de Granito Verde +Cracked Green Granite Brick Wall=Parede de Tijolo de Granito Verde Rachado +Cobbled Green Granite Wall=Parede de Granito Verde Calçada + +Pink Granite Wall=Parede de Granito Rosa +Pink Granite Brick Wall=Parede de Tijolo de Granito Rosa +Pink Granite Block Wall=Parede de Bloco de Granito Rosa +Cracked Pink Granite Brick Wall=Parede de Tijolo de Granito Rosa Rachado +Cobbled Pink Granite Wall=Parede de Granito Rosa Calçada + +Red Granite Wall=Parede de Granito Vermelho +Red Granite Brick Wall=Parede de Tijolo de Granito Vermelho +Red Granite Block Wall=Parede de Bloco de Granito Vermelho +Cracked Red Granite Brick Wall=Parede de Tijolo de Granito Vermelho Rachado +Cobbled Red Granite Wall=Parede de Granito Vermelho Calçada + +White Granite Wall=Parede de Granito Branco +White Granite Brick Wall=Parede de Tijolo de Granito Branco +White Granite Block Wall=Parede de Bloco de Granito Branco +Cracked White Granite Brick Wall=Parede de Tijolo de Granito Branco Rachado +Cobbled White Granite Wall=Parede de Granito Branco Calçada + +Yellow Granite Wall=Parede de Granito Amarelo +Yellow Granite Brick Wall=Parede de Tijolo de Granito Amarelo +Yellow Granite Block Wall=Parede de Bloco de Granito Amarelo +Cracked Yellow Granite Brick Wall=Parede de Tijolo de Granito Amarelo Rachado +Cobbled Yellow Granite Wall=Parede de Granito Amarelo Calçada + +Heliodor Wall=Parede de Heliodoro +Heliodor Brick Wall=Parede de Tijolo de Heliodoro +Heliodor Block Wall=Parede de Bloco de Heliodoro +Cracked Heliodor Brick Wall=Parede de Tijolo de Heliodoro Rachado + +Howlite Wall=Parede de Howlita +Howlite Brick Wall=Parede de Tijolo de Howlita +Howlite Block Wall=Parede de Bloco de Howlita +Cracked Howlite Brick Wall=Parede de Tijolo de Howlita Rachado +Cobbled Howlite Wall=Parede de Howlita Calçada + +Ilvaite Wall=Parede de Ilvaita +Ilvaite Brick Wall=Parede de Tijolo de Ilvaita +Ilvaite Block Wall=Parede de Bloco de Ilvaita +Cracked Ilvaite Brick Wall=Parede de Tijolo de Ilvaita Rachado +Cobbled Ilvaite Wall=Parede de Ilvaita Calçada + +Jade Wall=Parede de Jade +Jade Brick Wall=Parede de Tijolo de Jade +Jade Block Wall=Parede de Bloco de Jade +Cracked Jade Brick Wall=Parede de Tijolo de Jade Rachado +Cobbled Jade Wall=Parede de Jade Calçada + +Red Jasper Wall=Parede de Jaspe Vermelho +Red Jasper Brick Wall=Parede de Tijolo de Jaspe Vermelho +Red Jasper Block Wall=Parede de Bloco de Jaspe Vermelho +Cracked Red Jasper Brick Wall=Parede de Tijolo de Jaspe Vermelho Rachado +Cobbled Red Jasper Wall=Parede de Jaspe Vermelho Calçada + +Kyanite Wall=Parede de Cianita +Kyanite Brick Wall=Parede de Tijolo de Cianita +Kyanite Block Wall=Parede de Bloco de Cianita +Cracked Kyanite Brick Wall=Parede de Tijolo de Cianita Rachado +Cobbled Kyanite Wall=Parede de Cianita Calçada + +Lapis Lazuli Wall=Parede de Lápis-lazúli +Lapis Lazuli Brick Wall=Parede de Tijolo de Lápis-lazúli +Lapis Lazuli Block Wall=Parede de Bloco de Lápis-lazúli +Cracked Lapis Lazuli Brick Wall=Parede de Tijolo de Lápis-lazúli Rachado + +Lepidolite Wall=Parede de Lepidolita +Lepidolite Brick Wall=Parede de Tijolo de Lepidolita +Lepidolite Block Wall=Parede de Bloco de Lepidolita +Cracked Lepidolite Brick Wall=Parede de Tijolo de Lepidolita Rachado +Cobbled Lepidolite Wall=Parede de Lepidolita Calçada + +Blue Limestone Wall=Parede de Calcário Azul +Blue Limestone Brick Wall=Parede de Tijolo de Calcário Azul +Blue Limestone Block Wall=Parede de Bloco de Calcário Azul +Cracked Blue Limestone Brick Wall=Parede de Tijolo de Calcário Azul Rachado +Cobbled Blue Limestone Wall=Parede de Calcário Azul Calçada + +White Limestone Wall=Parede de Calcário Branco +White Limestone Brick Wall=Parede de Tijolo de Calcário Branco +White Limestone Block Wall=Parede de Bloco de Calcário Branco +Cracked White Limestone Brick Wall=Parede de Tijolo de Calcário Branco Rachado +Cobbled White Limestone Wall=Parede de Calcário Branco Calçada + +Marble Wall=Parede de Mármore +Marble Brick Wall=Parede de Tijolo de Mármore +Marble Block Wall=Parede de Bloco de Mármore +Cracked Marble Brick Wall=Parede de Tijolo de Mármore Rachado +Cobbled Marble Wall=Parede de Mármore Calçada + +Moonstone Wall=Parede de Pedra-da-lua +Moonstone Brick Wall=Parede de Tijolo de Pedra-da-lua +Moonstone Block Wall=Parede de Bloco de Pedra-da-lua +Cracked Moonstone Brick Wall=Parede de Tijolo de Pedra-da-lua Rachado + +Morion Quartz Wall=Parede de Quartzo Morion +Morion Quartz Brick Wall=Parede de Tijolo de Quartzo Morion +Morion Quartz Block Wall=Parede de Bloco de Quartzo Morion +Cracked Morion Quartz Brick Wall=Parede de Tijolo de Quartzo Morion Rachado + +Mudstone Wall=Parede de Argilito +Cobbled Mudstone Wall=Parede de Argilito Calçada +Mudstone Brick Wall=Parede de Tijolo de Argilito +Mudstone Block Wall=Parede de Bloco de Argilito +Cracked Mudstone Brick Wall=Parede de Tijolo de Argilito Rachado + +Prasiolite Wall=Parede de Prasiolita +Prasiolite Brick Wall=Parede de Tijolo de Prasiolita +Prasiolite Block Wall=Parede de Bloco de Prasiolita +Cracked Prasiolite Brick Wall=Parede de Tijolo de Prasiolita Rachado + +Pumice Wall=Parede de Púmice +Pumice Brick Wall=Parede de Tijolo de Púmice +Pumice Block Wall=Parede de Bloco de Púmice +Cracked Pumice Brick Wall=Parede de Tijolo de Púmice Rachado + +Pyrite Wall=Parede de Pirita +Pyrite Brick Wall=Parede de Tijolo de Pirita +Pyrite Block Wall=Parede de Bloco de Pirita +Cracked Pyrite Brick Wall=Parede de Tijolo de Pirita Rachado + +Quartz Wall=Parede de Quartzo +Quartz Brick Wall=Parede de Tijolo de Quartzo +Quartz Block Wall=Parede de Bloco de Quartzo +Cracked Quartz Brick Wall=Parede de Tijolo de Quartzo Rachado + +Rhodonite Wall=Parede de Rodonita +Rhodonite Brick Wall=Parede de Tijolo de Rodonita +Rhodonite Block Wall=Parede de Bloco de Rodonita +Cracked Rhodonite Brick Wall=Parede de Tijolo de Rodonita Rachado +Cobbled Rhodonite Wall=Parede de Rodonita Calçada + +Rose Quartz Wall=Parede de Quartzo Rosa +Rose Quartz Brick Wall=Parede de Tijolo de Quartzo Rosa +Rose Quartz Block Wall=Parede de Bloco de Quartzo Rosa +Cracked Rose Quartz Brick Wall=Parede de Tijolo de Quartzo Rosa Rachado + +Scoria Wall=Parede de Escória +Scoria Brick Wall=Parede de Tijolo de Escória +Scoria Block Wall=Parede de Bloco de Escória +Cracked Scoria Brick Wall=Parede de Tijolo de Escória Rachado +Cobbled Scoria Wall=Parede de Escória Calçada + +Serpentine Wall=Parede de Serpentina +Cobbled Serpentine Wall=Parede de Serpentina Calçada +Serpentine Brick Wall=Parede de Tijolo de Serpentina +Serpentine Block Wall=Parede de Bloco de Serpentina +Cracked Serpentine Brick Wall=Parede de Tijolo de Serpentina Rachado + +Shale Wall=Parede de Xisto +Shale Brick Wall=Parede de Tijolo de Xisto +Shale Block Wall=Parede de Bloco de Xisto +Cracked Shale Brick Wall=Parede de Tijolo de Xisto Rachado +Cobbled Shale Wall=Parede de Xisto Calçada + +Slate Wall=Parede de Ardósia +Slate Brick Wall=Parede de Tijolo de Ardósia +Slate Block Wall=Parede de Bloco de Ardósia +Cracked Slate Brick Wall=Parede de Tijolo de Ardósia Rachado +Cobbled Slate Wall=Parede de Ardósia Calçada +Slate Tile Wall=Parede de Azulejo de Ardósia + +Smokey Quartz Wall=Parede de Quartzo Fumê +Smokey Quartz Brick Wall=Parede de Tijolo de Quartzo Fumê +Smokey Quartz Block Wall=Parede de Bloco de Quartzo Fumê +Cracked Smokey Quartz Brick Wall=Parede de Tijolo de Quartzo Fumê Rachado + +Soapstone Wall=Parede de Esteatita +Soapstone Brick Wall=Parede de Tijolo de Esteatita +Soapstone Block Wall=Parede de Bloco de Esteatita +Cracked Soapstone Brick Wall=Parede de Tijolo de Esteatita Rachado + +Sodalite Wall=Parede de Sodalita +Cobbled Sodalite Wall=Parede de Sodalita Calçada +Sodalite Brick Wall=Parede de Tijolo de Sodalita +Sodalite Block Wall=Parede de Bloco de Sodalita +Cracked Sodalite Brick Wall=Parede de Tijolo de Sodalita Rachado + +Sugilite Wall=Parede de Sugilita +Sugilite Brick Wall=Parede de Tijolo de Sugilita +Sugilite Block Wall=Parede de Bloco de Sugilita +Cracked Sugilite Brick Wall=Parede de Tijolo de Sugilita Rachado +Cobbled Sugilite Wall=Parede de Sugilita Calçada + +Green Tourmaline Wall=Parede de Turmalina Verde +Green Tourmaline Brick Wall=Parede de Tijolo de Turmalina Verde +Green Tourmaline Block Wall=Parede de Bloco de Turmalina Verde +Cracked Green Tourmaline Brick Wall=Parede de Tijolo de Turmalina Verde Rachado + +Paraiba Tourmaline Wall=Parede de Turmalina Paraíba +Paraiba Tourmaline Brick Wall=Parede de Tijolo de Turmalina Paraíba +Paraiba Tourmaline Block Wall=Parede de Bloco de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick Wall=Parede de Tijolo de Turmalina Paraíba Rachado + +Pink Tourmaline Wall=Parede de Turmalina Rosa +Pink Tourmaline Brick Wall=Parede de Tijolo de Turmalina Rosa +Pink Tourmaline Block Wall=Parede de Bloco de Turmalina Rosa +Cracked Pink Tourmaline Brick Wall=Parede de Tijolo de Turmalina Rosa Rachado + +Travertine Wall=Parede de Travertino +Cobbled Travertine Wall=Parede de Travertino Calçada +Travertine Brick Wall=Parede de Tijolo de Travertino +Travertine Block Wall=Parede de Bloco de Travertino +Cracked Travertine Brick Wall=Parede de Tijolo de Travertino Rachado + +Yellow Travertine Wall=Parede de Travertino Amarelo +Cobbled Yellow Travertine Wall=Parede de Travertino Amarelo Calçada +Yellow Travertine Brick Wall=Parede de Tijolo de Travertino Amarelo +Yellow Travertine Block Wall=Parede de Bloco de Travertino Amarelo +Cracked Yellow Travertine Brick Wall=Parede de Tijolo de Travertino Amarelo Rachado + +Beige Tuff Wall=Parede de Tufo Bege +Cobbled Beige Tuff Wall=Parede de Tufo Bege Calçada +Beige Tuff Block Wall=Parede de Bloco de Tufo Bege +Beige Tuff Brick Wall=Parede de Tijolo de Tufo Bege +Cracked Beige Tuff Brick Wall=Parede de Tijolo de Tufo Bege Rachado + +Grey Tuff Wall=Parede de Tufo Cinza +Cobbled Grey Tuff Wall=Parede de Tufo Cinza Calçada +Grey Tuff Block Wall=Parede de Bloco de Tufo Cinza +Grey Tuff Brick Wall=Parede de Tijolo de Tufo Cinza +Cracked Grey Tuff Brick Wall=Parede de Tijolo de Tufo Cinza Rachado + +Red Tuff Wall=Parede de Tufo Vermelho +Cobbled Red Tuff Wall=Parede de Tufo Vermelho Calçada +Red Tuff Block Wall=Parede de Bloco de Tufo Vermelho +Red Tuff Brick Wall=Parede de Tijolo de Tufo Vermelho +Cracked Red Tuff Brick Wall=Parede de Tijolo de Tufo Vermelho Rachado + +Turquoise Wall=Parede de Turquesa +Turquoise Brick Wall=Parede de Tijolo de Turquesa +Turquoise Block Wall=Parede de Bloco de Turquesa +Cracked Turquoise Brick Wall=Parede de Tijolo de Turquesa Rachado +Cobbled Turquoise Wall=Parede de Turquesa Calçada + +Vivianite Wall=Parede de Vivianita +Vivianite Brick Wall=Parede de Tijolo de Vivianita +Vivianite Block Wall=Parede de Bloco de Vivianita +Cracked Vivianite Brick Wall=Parede de Tijolo de Vivianita Rachado + +### stairs.lua ### + +Blue Agate Slab=Laje de Ãgata Azul +Gray Agate Slab=Laje de Ãgata Cinza +Green Agate Slab=Laje de Ãgata Verde +Moss Agate Slab=Laje de Ãgata Musgo +Orange Agate Slab=Laje de Ãgata Laranja +Purple Agate Slab=Laje de Ãgata Roxa +Red Agate Slab=Laje de Ãgata Vermelha + +Amazonite Slab=Laje de Amazonita +Cobbled Amazonite Slab=Laje de Amazonita Calçada +Amazonite Brick Slab=Laje de Tijolo de Amazonita +Amazonite Block Slab=Laje de Bloco de Amazonita +Cracked Amazonite Brick Slab=Laje de Tijolo de Amazonita Rachado + +Amber Slab=Laje de Âmbar +Amber Brick Slab=Laje de Tijolo de Âmbar +Amber Block Slab=Laje de Bloco de Âmbar +Cracked Amber Brick Slab=Laje de Tijolo de Âmbar Rachado + +Amethyst Slab=Laje de Ametista +Amethyst Brick Slab=Laje de Tijolo de Ametista +Amethyst Block Slab=Laje de Bloco de Ametista +Cracked Amethyst Brick Slab=Laje de Tijolo de Ametista Rachado + +Andesite Slab=Laje de Andesito +Andesite Block Slab=Laje de Bloco de Andesito +Cobbled Andesite Slab=Laje de Andesito Calçada +Andesite Brick Slab=Laje de Tijolo de Andesito +Cobbled Andesite Brick Slab=Laje de Tijolo de Andesito Calçado + +Basalt Slab=Laje de Basalto +Basalt Block Slab=Laje de Bloco de Basalto +Basalt Brick Slab=Laje de Tijolo de Basalto +Cracked Basalt Brick Slab=Laje de Tijolo de Basalto Rachado +Cobbled Basalt Slab=Laje de Basalto Calçada +Basalt Tile Slab=Laje de Azulejo de Basalto + +Black Moonstone Slab=Laje de Pedra-da-lua Negra +Black Moonstone Brick Slab=Laje de Tijolo de Pedra-da-lua Negra +Black Moonstone Block Slab=Laje de Bloco de Pedra-da-lua Negra +Cracked Black Moonstone Brick Slab=Laje de Tijolo de Pedra-da-lua Negra Rachado + +Calcite Slab=Laje de Calcita +Calcite Brick Slab=Laje de Tijolo de Calcita +Calcite Block Slab=Laje de Bloco de Calcita +Cracked Calcite Brick Slab=Laje de Tijolo de Calcita Rachado + +Grey Calcite Slab=Laje de Calcita Cinza +Grey Calcite Brick Slab=Laje de Tijolo de Calcita Cinza +Grey Calcite Block Slab=Laje de Bloco de Calcita Cinza +Cracked Grey Calcite Brick Slab=Laje de Tijolo de Calcita Cinza Rachado + +Orange Calcite Slab=Laje de Calcita Laranja +Orange Calcite Brick Slab=Laje de Tijolo de Calcita Laranja +Orange Calcite Block Slab=Laje de Bloco de Calcita Laranja +Cracked Orange Calcite Brick Slab=Laje de Tijolo de Calcita Laranja Rachado + +Carnotite Slab=Laje de Carnotita +Carnotite Brick Slab=Laje de Tijolo de Carnotita +Carnotite Block Slab=Laje de Bloco de Carnotita +Cracked Carnotite Brick Slab=Laje de Tijolo de Carnotita Rachado +Cobbled Carnotite Slab=Laje de Carnotita Calçada + +Celestine Slab=Laje de Celestita +Celestine Brick Slab=Laje de Tijolo de Celestita +Celestine Block Slab=Laje de Bloco de Celestita +Cracked Celestine Brick Slab=Laje de Tijolo de Celestita Rachado + +Chalcanthite Slab=Laje de Calcanthita +Chalcanthite Brick Slab=Laje de Tijolo de Calcanthita +Chalcanthite Block Slab=Laje de Bloco de Calcanthita +Cracked Chalcanthite Brick Slab=Laje de Tijolo de Calcanthita Rachado +Cobbled Chalcanthite Slab=Laje de Calcanthita Calçada + +Chrysoprase Slab=Laje de Crisoprásio +Chrysoprase Brick Slab=Laje de Tijolo de Crisoprásio +Chrysoprase Block Slab=Laje de Bloco de Crisoprásio +Cracked Chrysoprase Brick Slab=Laje de Tijolo de Crisoprásio Rachado + +Citrine Slab=Laje de Citrino +Citrine Brick Slab=Laje de Tijolo de Citrino +Citrine Block Slab=Laje de Bloco de Citrino +Cracked Citrine Brick Slab=Laje de Tijolo de Citrino Rachado + +Covellite Slab=Laje de Covellita +Covellite Brick Slab=Laje de Tijolo de Covellita +Covellite Block Slab=Laje de Bloco de Covellita +Cracked Covellite Brick Slab=Laje de Tijolo de Covellita Rachado +Cobbled Covellite Slab=Laje de Covellita Calçada + +Crocoite Slab=Laje de Crocoíta +Crocoite Brick Slab=Laje de Tijolo de Crocoíta +Crocoite Block Slab=Laje de Bloco de Crocoíta +Cracked Crocoite Brick Slab=Laje de Tijolo de Crocoíta Rachado + +Diorite Slab=Laje de Diorito +Diorite Brick Slab=Laje de Tijolo de Diorito +Diorite Block Slab=Laje de Bloco de Diorito +Cracked Diorite Brick Slab=Laje de Tijolo de Diorito Rachado +Cobbled Diorite Slab=Laje de Diorito Calçada + +Erythrite Slab=Laje de Eritrita +Erythrite Brick Slab=Laje de Tijolo de Eritrita +Erythrite Block Slab=Laje de Bloco de Eritrita +Cracked Erythrite Brick Slab=Laje de Tijolo de Eritrita Rachado + +Eudialite Slab=Laje de Eudialita +Eudialite Brick Slab=Laje de Tijolo de Eudialita +Eudialite Block Slab=Laje de Bloco de Eudialita +Cracked Eudialite Brick Slab=Laje de Tijolo de Eudialita Rachado + +Fluorite Slab=Laje de Fluorita +Fluorite Brick Slab=Laje de Tijolo de Fluorita +Fluorite Block Slab=Laje de Bloco de Fluorita +Cracked Fluorite Brick Slab=Laje de Tijolo de Fluorita Rachado + +Gabbro Slab=Laje de Gabro +Cobbled Gabbro Slab=Laje de Gabro Calçada +Gabbro Brick Slab=Laje de Tijolo de Gabro +Gabbro Block Slab=Laje de Bloco de Gabro +Cracked Gabbro Brick Slab=Laje de Tijolo de Gabro Rachado + +Galena Slab=Laje de Galena +Galena Brick Slab=Laje de Tijolo de Galena +Galena Block Slab=Laje de Bloco de Galena +Cracked Galena Brick Slab=Laje de Tijolo de Galena Rachado + +Black Granite Slab=Laje de Granito Negro +Black Granite Brick Slab=Laje de Tijolo de Granito Negro +Black Granite Block Slab=Laje de Bloco de Granito Negro +Cracked Black Granite Brick Slab=Laje de Tijolo de Granito Negro Rachado +Cobbled Black Granite Slab=Laje de Granito Negro Calçada + +Blue Granite Slab=Laje de Granito Azul +Blue Granite Brick Slab=Laje de Tijolo de Granito Azul +Blue Granite Block Slab=Laje de Bloco de Granito Azul +Cracked Blue Granite Brick Slab=Laje de Tijolo de Granito Azul Rachado +Cobbled Blue Granite Slab=Laje de Granito Azul Calçada + +Gray Granite Slab=Laje de Granito Cinza +Gray Granite Brick Slab=Laje de Tijolo de Granito Cinza +Gray Granite Block Slab=Laje de Bloco de Granito Cinza +Cracked Gray Granite Brick Slab=Laje de Tijolo de Granito Cinza Rachado +Cobbled Gray Granite Slab=Laje de Granito Cinza Calçada + +Green Granite Slab=Laje de Granito Verde +Green Granite Brick Slab=Laje de Tijolo de Granito Verde +Green Granite Block Slab=Laje de Bloco de Granito Verde +Cracked Green Granite Brick Slab=Laje de Tijolo de Granito Verde Rachado +Cobbled Green Granite Slab=Laje de Granito Verde Calçada + +Pink Granite Slab=Laje de Granito Rosa +Pink Granite Brick Slab=Laje de Tijolo de Granito Rosa +Pink Granite Block Slab=Laje de Bloco de Granito Rosa +Cracked Pink Granite Brick Slab=Laje de Tijolo de Granito Rosa Rachado +Cobbled Pink Granite Slab=Laje de Granito Rosa Calçada + +Red Granite Slab=Laje de Granito Vermelho +Red Granite Brick Slab=Laje de Tijolo de Granito Vermelho +Red Granite Block Slab=Laje de Bloco de Granito Vermelho +Cracked Red Granite Brick Slab=Laje de Tijolo de Granito Vermelho Rachado +Cobbled Red Granite Slab=Laje de Granito Vermelho Calçada + +White Granite Slab=Laje de Granito Branco +White Granite Brick Slab=Laje de Tijolo de Granito Branco +White Granite Block Slab=Laje de Bloco de Granito Branco +Cracked White Granite Brick Slab=Laje de Tijolo de Granito Branco Rachado +Cobbled White Granite Slab=Laje de Granito Branco Calçada + +Yellow Granite Slab=Laje de Granito Amarelo +Yellow Granite Brick Slab=Laje de Tijolo de Granito Amarelo +Yellow Granite Block Slab=Laje de Bloco de Granito Amarelo +Cracked Yellow Granite Brick Slab=Laje de Tijolo de Granito Amarelo Rachado +Cobbled Yellow Granite Slab=Laje de Granito Amarelo Calçada + +Heliodor Slab=Laje de Heliodoro +Heliodor Brick Slab=Laje de Tijolo de Heliodoro +Heliodor Block Slab=Laje de Bloco de Heliodoro +Cracked Heliodor Brick Slab=Laje de Tijolo de Heliodoro Rachado + +Howlite Slab=Laje de Howlita +Howlite Brick Slab=Laje de Tijolo de Howlita +Howlite Block Slab=Laje de Bloco de Howlita +Cracked Howlite Brick Slab=Laje de Tijolo de Howlita Rachado +Cobbled Howlite Slab=Laje de Howlita Calçada + +Ilvaite Slab=Laje de Ilvaita +Ilvaite Brick Slab=Laje de Tijolo de Ilvaita +Ilvaite Block Slab=Laje de Bloco de Ilvaita +Cracked Ilvaite Brick Slab=Laje de Tijolo de Ilvaita Rachado +Cobbled Ilvaite Slab=Laje de Ilvaita Calçada + +Jade Slab=Laje de Jade +Jade Brick Slab=Laje de Tijolo de Jade +Jade Block Slab=Laje de Bloco de Jade +Cracked Jade Brick Slab=Laje de Tijolo de Jade Rachado +Cobbled Jade Slab=Laje de Jade Calçada + +Red Jasper Slab=Laje de Jaspe Vermelho +Red Jasper Brick Slab=Laje de Tijolo de Jaspe Vermelho +Red Jasper Block Slab=Laje de Bloco de Jaspe Vermelho +Cracked Red Jasper Brick Slab=Laje de Tijolo de Jaspe Vermelho Rachado +Cobbled Red Jasper Slab=Laje de Jaspe Vermelho Calçada + +Kyanite Slab=Laje de Cianita +Kyanite Brick Slab=Laje de Tijolo de Cianita +Kyanite Block Slab=Laje de Bloco de Cianita +Cracked Kyanite Brick Slab=Laje de Tijolo de Cianita Rachado +Cobbled Kyanite Slab=Laje de Cianita Calçada + +Lapis Lazuli Slab=Laje de Lápis-Lazúli +Lapis Lazuli Brick Slab=Laje de Tijolo de Lápis-Lazúli +Lapis Lazuli Block Slab=Laje de Bloco de Lápis-Lazúli +Cracked Lapis Lazuli Brick Slab=Laje de Tijolo de Lápis-Lazúli Rachado + +Lepidolite Slab=Laje de Lepidolita +Lepidolite Brick Slab=Laje de Tijolo de Lepidolita +Lepidolite Block Slab=Laje de Bloco de Lepidolita +Cracked Lepidolite Brick Slab=Laje de Tijolo de Lepidolita Rachado +Cobbled Lepidolite Slab=Laje de Lepidolita Calçada + +Blue Limestone Slab=Laje de Calcário Azul +Blue Limestone Brick Slab=Laje de Tijolo de Calcário Azul +Blue Limestone Block Slab=Laje de Bloco de Calcário Azul +Cracked Blue Limestone Brick Slab=Laje de Tijolo de Calcário Azul Rachado +Cobbled Blue Limestone Slab=Laje de Calcário Azul Calçada + +White Limestone Slab=Laje de Calcário Branco +White Limestone Brick Slab=Laje de Tijolo de Calcário Branco +White Limestone Block Slab=Laje de Bloco de Calcário Branco +Cracked White Limestone Brick Slab=Laje de Tijolo de Calcário Branco Rachado +Cobbled White Limestone Slab=Laje de Calcário Branco Calçada + +Marble Slab=Laje de Mármore +Marble Brick Slab=Laje de Tijolo de Mármore +Marble Block Slab=Laje de Bloco de Mármore +Cracked Marble Brick Slab=Laje de Tijolo de Mármore Rachado +Cobbled Marble Slab=Laje de Mármore Calçada + +Moonstone Slab=Laje de Pedra-da-lua +Moonstone Brick Slab=Laje de Tijolo de Pedra-da-lua +Moonstone Block Slab=Laje de Bloco de Pedra-da-lua +Cracked Moonstone Brick Slab=Laje de Tijolo de Pedra-da-lua Rachado + +Morion Quartz Slab=Laje de Quartzo Morion +Morion Quartz Brick Slab=Laje de Tijolo de Quartzo Morion +Morion Quartz Block Slab=Laje de Bloco de Quartzo Morion +Cracked Morion Quartz Brick Slab=Laje de Tijolo de Quartzo Morion Rachado + +Mudstone Slab=Laje de Arenito +Cobbled Mudstone Slab=Laje de Arenito Calçada +Mudstone Brick Slab=Laje de Tijolo de Arenito +Mudstone Block Slab=Laje de Bloco de Arenito +Cracked Mudstone Brick Slab=Laje de Tijolo de Arenito Rachado + +Prasiolite Slab=Laje de Prasiolita +Cobbled Prasiolite Slab=Laje de Prasiolita Calçada +Prasiolite Brick Slab=Laje de Tijolo de Prasiolita +Prasiolite Block Slab=Laje de Bloco de Prasiolita +Cracked Prasiolite Brick Slab=Laje de Tijolo de Prasiolita Rachado + +Pumice Slab=Laje de Púmice +Pumice Brick Slab=Laje de Tijolo de Púmice +Pumice Block Slab=Laje de Bloco de Púmice +Cracked Pumice Brick Slab=Laje de Tijolo de Púmice Rachado + +Pyrite Slab=Laje de Pirita +Pyrite Brick Slab=Laje de Tijolo de Pirita +Pyrite Block Slab=Laje de Bloco de Pirita +Cracked Pyrite Brick Slab=Laje de Tijolo de Pirita Rachado + +Quartz Slab=Laje de Quartzo +Cobbled Quartz Slab=Laje de Quartzo Calçada +Quartz Brick Slab=Laje de Tijolo de Quartzo +Quartz Block Slab=Laje de Bloco de Quartzo +Cracked Quartz Brick Slab=Laje de Tijolo de Quartzo Rachado + +Rhodonite Slab=Laje de Rodonita +Rhodonite Brick Slab=Laje de Tijolo de Rodonita +Rhodonite Block Slab=Laje de Bloco de Rodonita +Cracked Rhodonite Brick Slab=Laje de Tijolo de Rodonita Rachado +Cobbled Rhodonite Slab=Laje de Rodonita Calçada + +Rose Quartz Slab=Laje de Quartzo Rosa +Rose Quartz Brick Slab=Laje de Tijolo de Quartzo Rosa +Rose Quartz Block Slab=Laje de Bloco de Quartzo Rosa +Cracked Rose Quartz Brick Slab=Laje de Tijolo de Quartzo Rosa Rachado + +Scoria Slab=Laje de Escória +Scoria Brick Slab=Laje de Tijolo de Escória +Scoria Block Slab=Laje de Bloco de Escória +Cracked Scoria Brick Slab=Laje de Tijolo de Escória Rachado +Cobbled Scoria Slab=Laje de Escória Calçada + +Serpentine Slab=Laje de Serpentinito +Cobbled Serpentine Slab=Laje de Serpentinito Calçada +Serpentine Brick Slab=Laje de Tijolo de Serpentinito +Serpentine Block Slab=Laje de Bloco de Serpentinito +Cracked Serpentine Brick Slab=Laje de Tijolo de Serpentinito Rachado + +Shale Slab=Laje de Folhelho +Shale Brick Slab=Laje de Tijolo de Folhelho +Shale Block Slab=Laje de Bloco de Folhelho +Cracked Shale Brick Slab=Laje de Tijolo de Folhelho Rachado +Cobbled Shale Slab=Laje de Folhelho Calçada + +Slate Slab=Laje de Ardósia +Slate Brick Slab=Laje de Tijolo de Ardósia +Slate Block Slab=Laje de Bloco de Ardósia +Cracked Slate Brick Slab=Laje de Tijolo de Ardósia Rachado +Cobbled Slate Slab=Laje de Ardósia Calçada +Slate Tile Slab=Laje de Telha de Ardósia + +Smokey Quartz Slab=Laje de Quartzo Fumê +Smokey Quartz Brick Slab=Laje de Tijolo de Quartzo Fumê +Smokey Quartz Block Slab=Laje de Bloco de Quartzo Fumê +Cracked Smokey Quartz Brick Slab=Laje de Tijolo de Quartzo Fumê Rachado + +Soapstone Slab=Laje de Esteatita +Soapstone Brick Slab=Laje de Tijolo de Esteatita +Soapstone Block Slab=Laje de Bloco de Esteatita +Cracked Soapstone Brick Slab=Laje de Tijolo de Esteatita Rachado + +Sodalite Slab=Laje de Sodalita +Cobbled Sodalite Slab=Laje de Sodalita Calçada +Sodalite Brick Slab=Laje de Tijolo de Sodalita +Sodalite Block Slab=Laje de Bloco de Sodalita +Cracked Sodalite Brick Slab=Laje de Tijolo de Sodalita Rachado + +Sugilite Slab=Laje de Sugilita +Sugilite Brick Slab=Laje de Tijolo de Sugilita +Sugilite Block Slab=Laje de Bloco de Sugilita +Cracked Sugilite Brick Slab=Laje de Tijolo de Sugilita Rachado +Cobbled Sugilite Slab=Laje de Sugilita Calçada + +Green Tourmaline Slab=Laje de Turmalina Verde +Green Tourmaline Brick Slab=Laje de Tijolo de Turmalina Verde +Green Tourmaline Block Slab=Laje de Bloco de Turmalina Verde +Cracked Green Tourmaline Brick Slab=Laje de Tijolo de Turmalina Verde Rachado + +Paraiba Tourmaline Slab=Laje de Turmalina Paraíba +Paraiba Tourmaline Brick Slab=Laje de Tijolo de Turmalina Paraíba +Paraiba Tourmaline Block Slab=Laje de Bloco de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick Slab=Laje de Tijolo de Turmalina Paraíba Rachado + +Pink Tourmaline Slab=Laje de Turmalina Rosa +Pink Tourmaline Brick Slab=Laje de Tijolo de Turmalina Rosa +Pink Tourmaline Block Slab=Laje de Bloco de Turmalina Rosa +Cracked Pink Tourmaline Brick Slab=Laje de Tijolo de Turmalina Rosa Rachado + +Travertine Slab=Laje de Travertino +Cobbled Travertine Slab=Laje de Travertino Calçada +Travertine Brick Slab=Laje de Tijolo de Travertino +Travertine Block Slab=Laje de Bloco de Travertino +Cracked Travertine Brick Slab=Laje de Tijolo de Travertino Rachado + +Yellow Travertine Slab=Laje de Travertino Amarelo +Cobbled Yellow Travertine Slab=Laje de Travertino Amarelo Calçada +Yellow Travertine Brick Slab=Laje de Tijolo de Travertino Amarelo +Yellow Travertine Block Slab=Laje de Bloco de Travertino Amarelo +Cracked Yellow Travertine Brick Slab=Laje de Tijolo de Travertino Amarelo Rachado + +Beige Tuff Slab=Laje de Tufa Bege +Cobbled Beige Tuff Slab=Laje de Tufa Bege Calçada +Beige Tuff Block Slab=Laje de Bloco de Tufa Bege +Beige Tuff Brick Slab=Laje de Tijolo de Tufa Bege +Cracked Beige Tuff Brick Slab=Laje de Tijolo de Tufa Bege Rachado + +Grey Tuff Slab=Laje de Tufa Cinza +Cobbled Grey Tuff Slab=Laje de Tufa Cinza Calçada +Grey Tuff Block Slab=Laje de Bloco de Tufa Cinza +Grey Tuff Brick Slab=Laje de Tijolo de Tufa Cinza +Cracked Grey Tuff Brick Slab=Laje de Tijolo de Tufa Cinza Rachado + +Red Tuff Slab=Laje de Tufa Vermelha +Cobbled Red Tuff Slab=Laje de Tufa Vermelha Calçada +Red Tuff Block Slab=Laje de Bloco de Tufa Vermelha +Red Tuff Brick Slab=Laje de Tijolo de Tufa Vermelha +Cracked Red Tuff Brick Slab=Laje de Tijolo de Tufa Vermelha Rachado + +Turquoise Slab=Laje de Turquesa +Turquoise Brick Slab=Laje de Tijolo de Turquesa +Turquoise Block Slab=Laje de Bloco de Turquesa +Cracked Turquoise Brick Slab=Laje de Tijolo de Turquesa Rachado +Cobbled Turquoise Slab=Laje de Turquesa Calçada + +Vivianite Slab=Laje de Vivianita +Cobbled Vivianite Slab=Laje de Vivianita Calçada +Vivianite Brick Slab=Laje de Tijolo de Vivianita +Vivianite Block Slab=Laje de Bloco de Vivianita +Cracked Vivianite Brick Slab=Laje de Tijolo de Vivianita Rachado + + + +Blue Agate Stair=Escada de Ãgata Azul +Gray Agate Stair=Escada de Ãgata Cinza +Green Agate Stair=Escada de Ãgata Verde +Moss Agate Stair=Escada de Ãgata Musgo +Orange Agate Stair=Escada de Ãgata Laranja +Purple Agate Stair=Escada de Ãgata Roxa +Red Agate Stair=Escada de Ãgata Vermelha + +Amazonite Stair=Escada de Amazonita +Cobbled Amazonite Stair=Escada de Amazonita Serrada +Amazonite Brick Stair=Escada de Tijolo de Amazonita +Amazonite Block Stair=Escada de Bloco de Amazonita +Cracked Amazonite Brick Stair=Escada de Tijolo de Amazonita Rachado + +Amber Stair=Escada de Âmbar +Amber Brick Stair=Escada de Tijolo de Âmbar +Amber Block Stair=Escada de Bloco de Âmbar +Cracked Amber Brick Stair=Escada de Tijolo de Âmbar Rachado + +Amethyst Stair=Escada de Ametista +Amethyst Brick Stair=Escada de Tijolo de Ametista +Amethyst Block Stair=Escada de Bloco de Ametista +Cracked Amethyst Brick Stair=Escada de Tijolo de Ametista Rachado + +Andesite Stair=Escada de Andesita +Andesite Block Stair=Escada de Bloco de Andesita +Cobbled Andesite Stair=Escada de Andesita Serrada +Andesite Brick Stair=Escada de Tijolo de Andesita +Cobbled Andesite Brick Stair=Escada de Tijolo de Andesita Serrada + +Basalt Stair=Escada de Basalto +Basalt Block Stair=Escada de Bloco de Basalto +Basalt Brick Stair=Escada de Tijolo de Basalto +Cracked Basalt Brick Stair=Escada de Tijolo de Basalto Rachado +Cobbled Basalt Stair=Escada de Basalto Serrada +Basalt Tile Stair=Escada de Telha de Basalto + +Black Moonstone Stair=Escada de Pedra da Lua Negra +Black Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Negra +Black Moonstone Block Stair=Escada de Bloco de Pedra da Lua Negra +Cracked Black Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Negra Rachado + +Calcite Stair=Escada de Calcita +Calcite Brick Stair=Escada de Tijolo de Calcita +Calcite Block Stair=Escada de Bloco de Calcita +Cracked Calcite Brick Stair=Escada de Tijolo de Calcita Rachado + +Grey Calcite Stair=Escada de Calcita Cinza +Grey Calcite Brick Stair=Escada de Tijolo de Calcita Cinza +Grey Calcite Block Stair=Escada de Bloco de Calcita Cinza +Cracked Grey Calcite Brick Stair=Escada de Tijolo de Calcita Cinza Rachado + +Orange Calcite Stair=Escada de Calcita Laranja +Orange Calcite Brick Stair=Escada de Tijolo de Calcita Laranja +Orange Calcite Block Stair=Escada de Bloco de Calcita Laranja +Cracked Orange Calcite Brick Stair=Escada de Tijolo de Calcita Laranja Rachado + +Carnotite Stair=Escada de Carnotita +Carnotite Brick Stair=Escada de Tijolo de Carnotita +Carnotite Block Stair=Escada de Bloco de Carnotita +Cracked Carnotite Brick Stair=Escada de Tijolo de Carnotita Rachado +Cobbled Carnotite Stair=Escada de Carnotita Serrada + +Celestine Stair=Escada de Celestita +Celestine Brick Stair=Escada de Tijolo de Celestita +Celestine Block Stair=Escada de Bloco de Celestita +Cracked Celestine Brick Stair=Escada de Tijolo de Celestita Rachado + +Chalcanthite Stair=Escada de Chalcanthite +Chalcanthite Brick Stair=Escada de Tijolo de Chalcanthite +Chalcanthite Block Stair=Escada de Bloco de Chalcanthite +Cracked Chalcanthite Brick Stair=Escada de Tijolo de Chalcanthite Rachado +Cobbled Chalcanthite Stair=Escada de Chalcanthite Serrada + +Chrysoprase Stair=Escada de Crisoprásio +Chrysoprase Brick Stair=Escada de Tijolo de Crisoprásio +Chrysoprase Block Stair=Escada de Bloco de Crisoprásio +Cracked Chrysoprase Brick Stair=Escada de Tijolo de Crisoprásio Rachado + +Citrine Stair=Escada de Citrino +Citrine Brick Stair=Escada de Tijolo de Citrino +Citrine Block Stair=Escada de Bloco de Citrino +Cracked Citrine Brick Stair=Escada de Tijolo de Citrino Rachado + +Covellite Stair=Escada de Covellita +Covellite Brick Stair=Escada de Tijolo de Covellita +Covellite Block Stair=Escada de Bloco de Covellita +Cracked Covellite Brick Stair=Escada de Tijolo de Covellita Rachado +Cobbled Covellite Stair=Escada de Covellita Serrada + +Crocoite Stair=Escada de Crocoíta +Crocoite Brick Stair=Escada de Tijolo de Crocoíta +Crocoite Block Stair=Escada de Bloco de Crocoíta +Cracked Crocoite Brick Stair=Escada de Tijolo de Crocoíta Rachado + +Diorite Stair=Escada de Diorita +Diorite Brick Stair=Escada de Tijolo de Diorita +Diorite Block Stair=Escada de Bloco de Diorita +Cracked Diorite Brick Stair=Escada de Tijolo de Diorita Rachado +Cobbled Diorite Stair=Escada de Diorita Serrada + +Erythrite Stair=Escada de Eritrita +Erythrite Brick Stair=Escada de Tijolo de Eritrita +Erythrite Block Stair=Escada de Bloco de Eritrita +Cracked Erythrite Brick Stair=Escada de Tijolo de Eritrita Rachado + +Eudialite Stair=Escada de Eudialita +Eudialite Brick Stair=Escada de Tijolo de Eudialita +Eudialite Block Stair=Escada de Bloco de Eudialita +Cracked Eudialite Brick Stair=Escada de Tijolo de Eudialita Rachado + +Fluorite Stair=Escada de Fluorita +Fluorite Brick Stair=Escada de Tijolo de Fluorita +Fluorite Block Stair=Escada de Bloco de Fluorita +Cracked Fluorite Brick Stair=Escada de Tijolo de Fluorita Rachado + +Gabbro Stair=Escada de Gabro +Cobbled Gabbro Stair=Escada de Gabro Serrada +Gabbro Brick Stair=Escada de Tijolo de Gabro +Gabbro Block Stair=Escada de Bloco de Gabro +Cracked Gabbro Brick Stair=Escada de Tijolo de Gabro Rachado + +Galena Stair=Escada de Galena +Galena Brick Stair=Escada de Tijolo de Galena +Galena Block Stair=Escada de Bloco de Galena +Cracked Galena Brick Stair=Escada de Tijolo de Galena Rachado + +Black Granite Stair=Escada de Granito Preto +Black Granite Brick Stair=Escada de Tijolo de Granito Preto +Black Granite Block Stair=Escada de Bloco de Granito Preto +Cracked Black Granite Brick Stair=Escada de Tijolo de Granito Preto Rachado +Cobbled Black Granite Stair=Escada de Granito Preto Serrada + +Blue Granite Stair=Escada de Granito Azul +Blue Granite Brick Stair=Escada de Tijolo de Granito Azul +Blue Granite Block Stair=Escada de Bloco de Granito Azul +Cracked Blue Granite Brick Stair=Escada de Tijolo de Granito Azul Rachado +Cobbled Blue Granite Stair=Escada de Granito Azul Serrada + +Gray Granite Stair=Escada de Granito Cinza +Gray Granite Brick Stair=Escada de Tijolo de Granito Cinza +Gray Granite Block Stair=Escada de Bloco de Granito Cinza +Cracked Gray Granite Brick Stair=Escada de Tijolo de Granito Cinza Rachado +Cobbled Gray Granite Stair=Escada de Granito Cinza Serrada + +Green Granite Stair=Escada de Granito Verde +Green Granite Brick Stair=Escada de Tijolo de Granito Verde +Green Granite Block Stair=Escada de Bloco de Granito Verde +Cracked Green Granite Brick Stair=Escada de Tijolo de Granito Verde Rachado +Cobbled Green Granite Stair=Escada de Granito Verde Serrada + +Pink Granite Stair=Escada de Granito Rosa +Pink Granite Brick Stair=Escada de Tijolo de Granito Rosa +Pink Granite Block Stair=Escada de Bloco de Granito Rosa +Cracked Pink Granite Brick Stair=Escada de Tijolo de Granito Rosa Rachado +Cobbled Pink Granite Stair=Escada de Granito Rosa Serrada + +Red Granite Stair=Escada de Granito Vermelho +Red Granite Brick Stair=Escada de Tijolo de Granito Vermelho +Red Granite Block Stair=Escada de Bloco de Granito Vermelho +Cracked Red Granite Brick Stair=Escada de Tijolo de Granito Vermelho Rachado +Cobbled Red Granite Stair=Escada de Granito Vermelho Serrada + +White Granite Stair=Escada de Granito Branco +White Granite Brick Stair=Escada de Tijolo de Granito Branco +White Granite Block Stair=Escada de Bloco de Granito Branco +Cracked White Granite Brick Stair=Escada de Tijolo de Granito Branco Rachado +Cobbled White Granite Stair=Escada de Granito Branco Serrada + +Yellow Granite Stair=Escada de Granito Amarelo +Yellow Granite Brick Stair=Escada de Tijolo de Granito Amarelo +Yellow Granite Block Stair=Escada de Bloco de Granito Amarelo +Cracked Yellow Granite Brick Stair=Escada de Tijolo de Granito Amarelo Rachado +Cobbled Yellow Granite Stair=Escada de Granito Amarelo Serrada + +Heliodor Stair=Escada de Heliodoro +Heliodor Brick Stair=Escada de Tijolo de Heliodoro +Heliodor Block Stair=Escada de Bloco de Heliodoro +Cracked Heliodor Brick Stair=Escada de Tijolo de Heliodoro Rachado + +Howlite Stair=Escada de Howlita +Howlite Brick Stair=Escada de Tijolo de Howlita +Howlite Block Stair=Escada de Bloco de Howlita +Cracked Howlite Brick Stair=Escada de Tijolo de Howlita Rachado +Cobbled Howlite Stair=Escada de Howlita Serrada + +Ilvaite Stair=Escada de Ilvaíta +Ilvaite Brick Stair=Escada de Tijolo de Ilvaíta +Ilvaite Block Stair=Escada de Bloco de Ilvaíta +Cracked Ilvaite Brick Stair=Escada de Tijolo de Ilvaíta Rachado +Cobbled Ilvaite Stair=Escada de Ilvaíta Serrada + +Jade Stair=Escada de Jade +Jade Brick Stair=Escada de Tijolo de Jade +Jade Block Stair=Escada de Bloco de Jade +Cracked Jade Brick Stair=Escada de Tijolo de Jade Rachado +Cobbled Jade Stair=Escada de Jade Serrada + +Red Jasper Stair=Escada de Jaspe Vermelho +Red Jasper Brick Stair=Escada de Tijolo de Jaspe Vermelho +Red Jasper Block Stair=Escada de Bloco de Jaspe Vermelho +Cracked Red Jasper Brick Stair=Escada de Tijolo de Jaspe Vermelho Rachado +Cobbled Red Jasper Stair=Escada de Jaspe Vermelho Serrada + +Kyanite Stair=Escada de Cianita +Kyanite Brick Stair=Escada de Tijolo de Cianita +Kyanite Block Stair=Escada de Bloco de Cianita +Cracked Kyanite Brick Stair=Escada de Tijolo de Cianita Rachado +Cobbled Kyanite Stair=Escada de Cianita Serrada + +Lapis Lazuli Stair=Escada de Lápis-lazúli +Lapis Lazuli Brick Stair=Escada de Tijolo de Lápis-lazúli +Lapis Lazuli Block Stair=Escada de Bloco de Lápis-lazúli +Cracked Lapis Lazuli Brick Stair=Escada de Tijolo de Lápis-lazúli Rachado + +Lepidolite Stair=Escada de Lepidolita +Lepidolite Brick Stair=Escada de Tijolo de Lepidolita +Lepidolite Block Stair=Escada de Bloco de Lepidolita +Cracked Lepidolite Brick Stair=Escada de Tijolo de Lepidolita Rachado +Cobbled Lepidolite Stair=Escada de Lepidolita Serrada + +Blue Limestone Stair=Escada de Calcário Azul +Blue Limestone Brick Stair=Escada de Tijolo de Calcário Azul +Blue Limestone Block Stair=Escada de Bloco de Calcário Azul +Cracked Blue Limestone Brick Stair=Escada de Tijolo de Calcário Azul Rachado +Cobbled Blue Limestone Stair=Escada de Calcário Azul Serrada + +White Limestone Stair=Escada de Calcário Branco +White Limestone Brick Stair=Escada de Tijolo de Calcário Branco +White Limestone Block Stair=Escada de Bloco de Calcário Branco +Cracked White Limestone Brick Stair=Escada de Tijolo de Calcário Branco Rachado +Cobbled White Limestone Stair=Escada de Calcário Branco Serrada + +Marble Stair=Escada de Mármore +Marble Brick Stair=Escada de Tijolo de Mármore +Marble Block Stair=Escada de Bloco de Mármore +Cracked Marble Brick Stair=Escada de Tijolo de Mármore Rachado +Cobbled Marble Stair=Escada de Mármore Serrada + +Moonstone Stair=Escada de Pedra da Lua +Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua +Moonstone Block Stair=Escada de Bloco de Pedra da Lua +Cracked Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Rachado + +Morion Quartz Stair=Escada de Quartzo Morion +Morion Quartz Brick Stair=Escada de Tijolo de Quartzo Morion +Morion Quartz Block Stair=Escada de Bloco de Quartzo Morion +Cracked Morion Quartz Brick Stair=Escada de Tijolo de Quartzo Morion Rachado + +Mudstone Stair=Escada de Argilito +Cobbled Mudstone Stair=Escada de Argilito Serrada +Mudstone Brick Stair=Escada de Tijolo de Argilito +Mudstone Block Stair=Escada de Bloco de Argilito +Cracked Mudstone Brick Stair=Escada de Tijolo de Argilito Rachado + +Prasiolite Stair=Escada de Prasiolita +Prasiolite Brick Stair=Escada de Tijolo de Prasiolita +Prasiolite Block Stair=Escada de Bloco de Prasiolita +Cracked Prasiolite Brick Stair=Escada de Tijolo de Prasiolita Rachado + +Pumice Stair=Escada de Pumice +Pumice Brick Stair=Escada de Tijolo de Pumice +Pumice Block Stair=Escada de Bloco de Pumice +Cracked Pumice Brick Stair=Escada de Tijolo de Pumice Rachado + +Pyrite Stair=Escada de Pirita +Pyrite Brick Stair=Escada de Tijolo de Pirita +Pyrite Block Stair=Escada de Bloco de Pirita +Cracked Pyrite Brick Stair=Escada de Tijolo de Pirita Rachado + +Quartz Stair=Escada de Quartzo +Quartz Brick Stair=Escada de Tijolo de Quartzo +Quartz Block Stair=Escada de Bloco de Quartzo +Cracked Quartz Brick Stair=Escada de Tijolo de Quartzo Rachado + +Rhodonite Stair=Escada de Rodonita +Rhodonite Brick Stair=Escada de Tijolo de Rodonita +Rhodonite Block Stair=Escada de Bloco de Rodonita +Cracked Rhodonite Brick Stair=Escada de Tijolo de Rodonita Rachado +Cobbled Rhodonite Stair=Escada de Rodonita Serrada + +Rose Quartz Stair=Escada de Quartzo Rosa +Rose Quartz Brick Stair=Escada de Tijolo de Quartzo Rosa +Rose Quartz Block Stair=Escada de Bloco de Quartzo Rosa +Cracked Rose Quartz Brick Stair=Escada de Tijolo de Quartzo Rosa Rachado + +Scoria Stair=Escada de Escória +Scoria Brick Stair=Escada de Tijolo de Escória +Scoria Block Stair=Escada de Bloco de Escória +Cracked Scoria Brick Stair=Escada de Tijolo de Escória Rachado +Cobbled Scoria Stair=Escada de Escória Serrada + +Serpentine Stair=Escada de Serpentinito +Cobbled Serpentine Stair=Escada de Serpentinito Serrada +Serpentine Brick Stair=Escada de Tijolo de Serpentinito +Serpentine Block Stair=Escada de Bloco de Serpentinito +Cracked Serpentine Brick Stair=Escada de Tijolo de Serpentinito Rachado + +Shale Stair=Escada de Folhelho +Shale Brick Stair=Escada de Tijolo de Folhelho +Shale Block Stair=Escada de Bloco de Folhelho +Cracked Shale Brick Stair=Escada de Tijolo de Folhelho Rachado +Cobbled Shale Stair=Escada de Folhelho Serrada + +Slate Stair=Escada de Ardósia +Slate Brick Stair=Escada de Tijolo de Ardósia +Slate Block Stair=Escada de Bloco de Ardósia +Cracked Slate Brick Stair=Escada de Tijolo de Ardósia Rachado +Cobbled Slate Stair=Escada de Ardósia Serrada +Slate Tile Stair=Escada de Telha de Ardósia + +Smokey Quartz Stair=Escada de Quartzo Fumê +Smokey Quartz Brick Stair=Escada de Tijolo de Quartzo Fumê +Smokey Quartz Block Stair=Escada de Bloco de Quartzo Fumê +Cracked Smokey Quartz Brick Stair=Escada de Tijolo de Quartzo Fumê Rachado + +Soapstone Stair=Escada de Esteatito +Soapstone Brick Stair=Escada de Tijolo de Esteatito +Soapstone Block Stair=Escada de Bloco de Esteatito +Cracked Soapstone Brick Stair=Escada de Tijolo de Esteatito Rachado + +Sodalite Stair=Escada de Sodalita +Cobbled Sodalite Stair=Escada de Sodalita Serrada +Sodalite Brick Stair=Escada de Tijolo de Sodalita +Sodalite Block Stair=Escada de Bloco de Sodalita +Cracked Sodalite Brick Stair=Escada de Tijolo de Sodalita Rachado + +Sugilite Stair=Escada de Sugilita +Sugilite Brick Stair=Escada de Tijolo de Sugilita +Sugilite Block Stair=Escada de Bloco de Sugilita +Cracked Sugilite Brick Stair=Escada de Tijolo de Sugilita Rachado +Cobbled Sugilite Stair=Escada de Sugilita Serrada + +Green Tourmaline Stair=Escada de Turmalina Verde +Green Tourmaline Brick Stair=Escada de Tijolo de Turmalina Verde +Green Tourmaline Block Stair=Escada de Bloco de Turmalina Verde +Cracked Green Tourmaline Brick Stair=Escada de Tijolo de Turmalina Verde Rachado + +Paraiba Tourmaline Stair=Escada de Turmalina Paraíba +Paraiba Tourmaline Brick Stair=Escada de Tijolo de Turmalina Paraíba +Paraiba Tourmaline Block Stair=Escada de Bloco de Turmalina Paraíba +Cracked Paraiba Tourmaline Brick Stair=Escada de Tijolo de Turmalina Paraíba Rachado + +Pink Tourmaline Stair=Escada de Turmalina Rosa +Pink Tourmaline Brick Stair=Escada de Tijolo de Turmalina Rosa +Pink Tourmaline Block Stair=Escada de Bloco de Turmalina Rosa +Cracked Pink Tourmaline Brick Stair=Escada de Tijolo de Turmalina Rosa Rachado + +Travertine Stair=Escada de Travertino +Cobbled Travertine Stair=Escada de Travertino Serrada +Travertine Brick Stair=Escada de Tijolo de Travertino +Travertine Block Stair=Escada de Bloco de Travertino +Cracked Travertine Brick Stair=Escada de Tijolo de Travertino Rachado + +Yellow Travertine Stair=Escada de Travertino Amarelo +Cobbled Yellow Travertine Stair=Escada de Travertino Amarelo Serrada +Yellow Travertine Brick Stair=Escada de Tijolo de Travertino Amarelo +Yellow Travertine Block Stair=Escada de Bloco de Travertino Amarelo +Cracked Yellow Travertine Brick Stair=Escada de Tijolo de Travertino Amarelo Rachado + +Beige Tuff Stair=Escada de Tufo Bege +Beige Tuff Brick Stair=Escada de Tijolo de Tufo Bege +Beige Tuff Block Stair=Escada de Bloco de Tufo Bege +Cracked Beige Tuff Brick Stair=Escada de Tijolo de Tufo Bege Rachado +Cobbled Beige Tuff Stair=Escada de Tufo Bege Serrada + +Grey Tuff Stair=Escada de Tufo Cinza +Grey Tuff Brick Stair=Escada de Tijolo de Tufo Cinza +Grey Tuff Block Stair=Escada de Bloco de Tufo Cinza +Cracked Grey Tuff Brick Stair=Escada de Tijolo de Tufo Cinza Rachado +Cobbled Grey Tuff Stair=Escada de Tufo Cinza Serrada + +Red Tuff Stair=Escada de Tufo Vermelho +Red Tuff Brick Stair=Escada de Tijolo de Tufo Vermelho +Red Tuff Block Stair=Escada de Bloco de Tufo Vermelho +Cracked Red Tuff Brick Stair=Escada de Tijolo de Tufo Vermelho Rachado +Cobbled Red Tuff Stair=Escada de Tufo Vermelho Serrada + +Turquoise Stair=Escada de Turquesa +Turquoise Brick Stair=Escada de Tijolo de Turquesa +Turquoise Block Stair=Escada de Bloco de Turquesa +Cracked Turquoise Brick Stair=Escada de Tijolo de Turquesa Rachado +Cobbled Turquoise Stair=Escada de Turquesa Serrada + +Vivianite Stair=Escada de Vivianita +Vivianite Brick Stair=Escada de Tijolo de Vivianita +Vivianite Block Stair=Escada de Bloco de Vivianita +Cracked Vivianite Brick Stair=Escada de Tijolo de Vivianita Rachado + + + +Inner Blue Agate Stair=Escada de Ãgata Azul Interna +Inner Gray Agate Stair=Escada de Ãgata Cinza Interna +Inner Green Agate Stair=Escada de Ãgata Verde Interna +Inner Moss Agate Stair=Escada de Ãgata Musgosa Interna +Inner Orange Agate Stair=Escada de Ãgata Laranja Interna +Inner Purple Agate Stair=Escada de Ãgata Roxa Interna +Inner Red Agate Stair=Escada de Ãgata Vermelha Interna + +Inner Amazonite Stair=Escada de Amazonita Interna +Inner Cobbled Amazonite Stair=Escada de Amazonita Serrada Interna +Inner Amazonite Brick Stair=Escada de Tijolo de Amazonita Interna +Inner Amazonite Block Stair=Escada de Bloco de Amazonita Interna +Inner Cracked Amazonite Brick Stair=Escada de Tijolo de Amazonita Rachado Interna + +Inner Amber Stair=Escada de Âmbar Interna +Inner Amber Brick Stair=Escada de Tijolo de Âmbar Interna +Inner Amber Block Stair=Escada de Bloco de Âmbar Interna +Inner Cracked Amber Brick Stair=Escada de Tijolo de Âmbar Rachado Interna + +Inner Amethyst Stair=Escada de Ametista Interna +Inner Amethyst Brick Stair=Escada de Tijolo de Ametista Interna +Inner Amethyst Block Stair=Escada de Bloco de Ametista Interna +Inner Cracked Amethyst Brick Stair=Escada de Tijolo de Ametista Rachado Interna + +Inner Andesite Stair=Escada de Andesita Interna +Inner Andesite Block Stair=Escada de Bloco de Andesita Interna +Inner Andesite Brick Stair=Escada de Tijolo de Andesita Interna +Inner Cracked Andesite Brick Stair=Escada de Tijolo de Andesita Rachado Interna +Inner Cobbled Andesite Stair=Escada de Andesita Serrada Interna + +Inner Basalt Stair=Escada de Basalto Interna +Inner Basalt Block Stair=Escada de Bloco de Basalto Interna +Inner Basalt Brick Stair=Escada de Tijolo de Basalto Interna +Inner Cracked Basalt Brick Stair=Escada de Tijolo de Basalto Rachado Interna +Inner Cobbled Basalt Stair=Escada de Basalto Serrada Interna +Inner Basalt Tile Stair=Escada de Telha de Basalto Interna + +Inner Black Moonstone Stair=Escada de Pedra da Lua Negra Interna +Inner Black Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Negra Interna +Inner Black Moonstone Block Stair=Escada de Bloco de Pedra da Lua Negra Interna +Inner Cracked Black Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Negra Rachado Interna + +Inner Calcite Stair=Escada de Calcita Interna +Inner Calcite Brick Stair=Escada de Tijolo de Calcita Interna +Inner Calcite Block Stair=Escada de Bloco de Calcita Interna +Inner Cracked Calcite Brick Stair=Escada de Tijolo de Calcita Rachado Interna + +Inner Grey Calcite Stair=Escada de Calcita Cinza Interna +Inner Grey Calcite Brick Stair=Escada de Tijolo de Calcita Cinza Interna +Inner Grey Calcite Block Stair=Escada de Bloco de Calcita Cinza Interna +Inner Cracked Grey Calcite Brick Stair=Escada de Tijolo de Calcita Cinza Rachado Interna + +Inner Orange Calcite Stair=Escada de Calcita Laranja Interna +Inner Orange Calcite Brick Stair=Escada de Tijolo de Calcita Laranja Interna +Inner Orange Calcite Block Stair=Escada de Bloco de Calcita Laranja Interna +Inner Cracked Orange Calcite Brick Stair=Escada de Tijolo de Calcita Laranja Rachado Interna + +Inner Carnotite Stair=Escada de Carnotita Interna +Inner Carnotite Brick Stair=Escada de Tijolo de Carnotita Interna +Inner Carnotite Block Stair=Escada de Bloco de Carnotita Interna +Inner Cracked Carnotite Brick Stair=Escada de Tijolo de Carnotita Rachado Interna +Inner Cobbled Carnotite Stair=Escada de Carnotita Serrada Interna + +Inner Celestine Stair=Escada de Celestita Interna +Inner Celestine Brick Stair=Escada de Tijolo de Celestita Interna +Inner Celestine Block Stair=Escada de Bloco de Celestita Interna +Inner Cracked Celestine Brick Stair=Escada de Tijolo de Celestita Rachado Interna + +Inner Chalcanthite Stair=Escada de Calcanthita Interna +Inner Chalcanthite Brick Stair=Escada de Tijolo de Calcanthita Interna +Inner Chalcanthite Block Stair=Escada de Bloco de Calcanthita Interna +Inner Cracked Chalcanthite Brick Stair=Escada de Tijolo de Calcanthita Rachado Interna +Inner Cobbled Chalcanthite Stair=Escada de Calcanthita Serrada Interna + +Inner Chrysoprase Stair=Escada de Crisoprase Interna +Inner Chrysoprase Brick Stair=Escada de Tijolo de Crisoprase Interna +Inner Chrysoprase Block Stair=Escada de Bloco de Crisoprase Interna +Inner Cracked Chrysoprase Brick Stair=Escada de Tijolo de Crisoprase Rachado Interna + +Inner Citrine Stair=Escada de Citrino Interna +Inner Citrine Brick Stair=Escada de Tijolo de Citrino Interna +Inner Citrine Block Stair=Escada de Bloco de Citrino Interna +Inner Cracked Citrine Brick Stair=Escada de Tijolo de Citrino Rachado Interna + +Inner Covellite Stair=Escada de Covellita Interna +Inner Covellite Brick Stair=Escada de Tijolo de Covellita Interna +Inner Covellite Block Stair=Escada de Bloco de Covellita Interna +Inner Cracked Covellite Brick Stair=Escada de Tijolo de Covellita Rachado Interna +Inner Cobbled Covellite Stair=Escada de Covellita Serrada Interna + +Inner Crocoite Stair=Escada de Crocoíta Interna +Inner Crocoite Brick Stair=Escada de Tijolo de Crocoíta Interna +Inner Crocoite Block Stair=Escada de Bloco de Crocoíta Interna +Inner Cracked Crocoite Brick Stair=Escada de Tijolo de Crocoíta Rachado Interna + +Inner Diorite Stair=Escada de Diorita Interna +Inner Diorite Brick Stair=Escada de Tijolo de Diorita Interna +Inner Diorite Block Stair=Escada de Bloco de Diorita Interna +Inner Cracked Diorite Brick Stair=Escada de Tijolo de Diorita Rachado Interna +Inner Cobbled Diorite Stair=Escada de Diorita Serrada Interna + +Inner Erythrite Stair=Escada de Eritrita Interna +Inner Erythrite Brick Stair=Escada de Tijolo de Eritrita Interna +Inner Erythrite Block Stair=Escada de Bloco de Eritrita Interna +Inner Cracked Erythrite Brick Stair=Escada de Tijolo de Eritrita Rachado Interna + +Inner Eudialite Stair=Escada de Eudialita Interna +Inner Eudialite Brick Stair=Escada de Tijolo de Eudialita Interna +Inner Eudialite Block Stair=Escada de Bloco de Eudialita Interna +Inner Cracked Eudialite Brick Stair=Escada de Tijolo de Eudialita Rachado Interna + +Inner Fluorite Stair=Escada de Fluorita Interna +Inner Fluorite Brick Stair=Escada de Tijolo de Fluorita Interna +Inner Fluorite Block Stair=Escada de Bloco de Fluorita Interna +Inner Cracked Fluorite Brick Stair=Escada de Tijolo de Fluorita Rachado Interna + +Inner Gabbro Stair=Escada de Gabro Interna +Inner Cobbled Gabbro Stair=Escada de Gabro Serrada Interna +Inner Gabbro Brick Stair=Escada de Tijolo de Gabro Interna +Inner Gabbro Block Stair=Escada de Bloco de Gabro Interna +Inner Cracked Gabbro Brick Stair=Escada de Tijolo de Gabro Rachado Interna + +Inner Galena Stair=Escada de Galena Interna +Inner Galena Brick Stair=Escada de Tijolo de Galena Interna +Inner Galena Block Stair=Escada de Bloco de Galena Interna +Inner Cracked Galena Brick Stair=Escada de Tijolo de Galena Rachado Interna + +Inner Black Granite Stair=Escada de Granito Negro Interna +Inner Black Granite Brick Stair=Escada de Tijolo de Granito Negro Interna +Inner Black Granite Block Stair=Escada de Bloco de Granito Negro Interna +Inner Cracked Black Granite Brick Stair=Escada de Tijolo de Granito Negro Rachado Interna +Inner Cobbled Black Granite Stair=Escada de Granito Negro Serrada Interna + +Inner Blue Granite Stair=Escada de Granito Azul Interna +Inner Blue Granite Brick Stair=Escada de Tijolo de Granito Azul Interna +Inner Blue Granite Block Stair=Escada de Bloco de Granito Azul Interna +Inner Cracked Blue Granite Brick Stair=Escada de Tijolo de Granito Azul Rachado Interna +Inner Cobbled Blue Granite Stair=Escada de Granito Azul Serrada Interna + +Inner Gray Granite Stair=Escada de Granito Cinza Interna +Inner Gray Granite Brick Stair=Escada de Tijolo de Granito Cinza Interna +Inner Gray Granite Block Stair=Escada de Bloco de Granito Cinza Interna +Inner Cracked Gray Granite Brick Stair=Escada de Tijolo de Granito Cinza Rachado Interna +Inner Cobbled Gray Granite Stair=Escada de Granito Cinza Serrada Interna + +Inner Green Granite Stair=Escada de Granito Verde Interna +Inner Green Granite Brick Stair=Escada de Tijolo de Granito Verde Interna +Inner Green Granite Block Stair=Escada de Bloco de Granito Verde Interna +Inner Cracked Green Granite Brick Stair=Escada de Tijolo de Granito Verde Rachado Interna +Inner Cobbled Green Granite Stair=Escada de Granito Verde Serrada Interna + +Inner Pink Granite Stair=Escada de Granito Rosa Interna +Inner Pink Granite Brick Stair=Escada de Tijolo de Granito Rosa Interna +Inner Pink Granite Block Stair=Escada de Bloco de Granito Rosa Interna +Inner Cracked Pink Granite Brick Stair=Escada de Tijolo de Granito Rosa Rachado Interna +Inner Cobbled Pink Granite Stair=Escada de Granito Rosa Serrada Interna + +Inner Red Granite Stair=Escada de Granito Vermelho Interna +Inner Red Granite Brick Stair=Escada de Tijolo de Granito Vermelho Interna +Inner Red Granite Block Stair=Escada de Bloco de Granito Vermelho Interna +Inner Cracked Red Granite Brick Stair=Escada de Tijolo de Granito Vermelho Rachado Interna +Inner Cobbled Red Granite Stair=Escada de Granito Vermelho Serrada Interna + +Inner White Granite Stair=Escada de Granito Branco Interna +Inner White Granite Brick Stair=Escada de Tijolo de Granito Branco Interna +Inner White Granite Block Stair=Escada de Bloco de Granito Branco Interna +Inner Cracked White Granite Brick Stair=Escada de Tijolo de Granito Branco Rachado Interna +Inner Cobbled White Granite Stair=Escada de Granito Branco Serrada Interna + +Inner Yellow Granite Stair=Escada de Granito Amarelo Interna +Inner Yellow Granite Brick Stair=Escada de Tijolo de Granito Amarelo Interna +Inner Yellow Granite Block Stair=Escada de Bloco de Granito Amarelo Interna +Inner Cracked Yellow Granite Brick Stair=Escada de Tijolo de Granito Amarelo Rachado Interna +Inner Cobbled Yellow Granite Stair=Escada de Granito Amarelo Serrada Interna + +Inner Heliodor Stair=Escada de Heliodoro Interna +Inner Heliodor Brick Stair=Escada de Tijolo de Heliodoro Interna +Inner Heliodor Block Stair=Escada de Bloco de Heliodoro Interna +Inner Cracked Heliodor Brick Stair=Escada de Tijolo de Heliodoro Rachado Interna + +Inner Howlite Stair=Escada de Howlita Interna +Inner Howlite Brick Stair=Escada de Tijolo de Howlita Interna +Inner Howlite Block Stair=Escada de Bloco de Howlita Interna +Inner Cracked Howlite Brick Stair=Escada de Tijolo de Howlita Rachado Interna +Inner Cobbled Howlite Stair=Escada de Howlita Serrada Interna + +Inner Ilvaite Stair=Escada de Ilvaita Interna +Inner Ilvaite Brick Stair=Escada de Tijolo de Ilvaita Interna +Inner Ilvaite Block Stair=Escada de Bloco de Ilvaita Interna +Inner Cracked Ilvaite Brick Stair=Escada de Tijolo de Ilvaita Rachado Interna +Inner Cobbled Ilvaite Stair=Escada de Ilvaita Serrada Interna + +Inner Jade Stair=Escada de Jade Interna +Inner Jade Brick Stair=Escada de Tijolo de Jade Interna +Inner Jade Block Stair=Escada de Bloco de Jade Interna +Inner Cracked Jade Brick Stair=Escada de Tijolo de Jade Rachado Interna +Inner Cobbled Jade Stair=Escada de Jade Serrada Interna + +Inner Red Jasper Stair=Escada de Jasper Vermelho Interna +Inner Red Jasper Brick Stair=Escada de Tijolo de Jasper Vermelho Interna +Inner Red Jasper Block Stair=Escada de Bloco de Jasper Vermelho Interna +Inner Cracked Red Jasper Brick Stair=Escada de Tijolo de Jasper Vermelho Rachado Interna +Inner Cobbled Red Jasper Stair=Escada de Jasper Vermelho Serrada Interna + +Inner Kyanite Stair=Escada de Cianita Interna +Inner Kyanite Brick Stair=Escada de Tijolo de Cianita Interna +Inner Kyanite Block Stair=Escada de Bloco de Cianita Interna +Inner Cracked Kyanite Brick Stair=Escada de Tijolo de Cianita Rachado Interna +Inner Cobbled Kyanite Stair=Escada de Cianita Serrada Interna + +Inner Lapis Lazuli Stair=Escada de Lápis-lazúli Interna +Inner Lapis Lazuli Brick Stair=Escada de Tijolo de Lápis-lazúli Interna +Inner Lapis Lazuli Block Stair=Escada de Bloco de Lápis-lazúli Interna +Inner Cracked Lapis Lazuli Brick Stair=Escada de Tijolo de Lápis-lazúli Rachado Interna + +Inner Lepidolite Stair=Escada de Lepidolita Interna +Inner Lepidolite Brick Stair=Escada de Tijolo de Lepidolita Interna +Inner Lepidolite Block Stair=Escada de Bloco de Lepidolita Interna +Inner Cracked Lepidolite Brick Stair=Escada de Tijolo de Lepidolita Rachado Interna +Inner Cobbled Lepidolite Stair=Escada de Lepidolita Serrada Interna + +Inner Blue Limestone Stair=Escada de Calcário Azul Interna +Inner Blue Limestone Brick Stair=Escada de Tijolo de Calcário Azul Interna +Inner Blue Limestone Block Stair=Escada de Bloco de Calcário Azul Interna +Inner Cracked Blue Limestone Brick Stair=Escada de Tijolo de Calcário Azul Rachado Interna +Inner Cobbled Blue Limestone Stair=Escada de Calcário Azul Serrada Interna + +Inner White Limestone Stair=Escada de Calcário Branco Interna +Inner White Limestone Brick Stair=Escada de Tijolo de Calcário Branco Interna +Inner White Limestone Block Stair=Escada de Bloco de Calcário Branco Interna +Inner Cracked White Limestone Brick Stair=Escada de Tijolo de Calcário Branco Rachado Interna +Inner Cobbled White Limestone Stair=Escada de Calcário Branco Serrada Interna + +Inner Marble Stair=Escada de Mármore Interna +Inner Marble Brick Stair=Escada de Tijolo de Mármore Interna +Inner Marble Block Stair=Escada de Bloco de Mármore Interna +Inner Cracked Marble Brick Stair=Escada de Tijolo de Mármore Rachado Interna +Inner Cobbled Marble Stair=Escada de Mármore Serrada Interna + +Inner Moonstone Stair=Escada de Pedra-da-lua Interna +Inner Moonstone Brick Stair=Escada de Tijolo de Pedra-da-lua Interna +Inner Moonstone Block Stair=Escada de Bloco de Pedra-da-lua Interna +Inner Cracked Moonstone Brick Stair=Escada de Tijolo de Pedra-da-lua Rachado Interna + +Inner Morion Quartz Stair=Escada de Quartzo Morion Interna +Inner Morion Quartz Brick Stair=Escada de Tijolo de Quartzo Morion Interna +Inner Morion Quartz Block Stair=Escada de Bloco de Quartzo Morion Interna +Inner Cracked Morion Quartz Brick Stair=Escada de Tijolo de Quartzo Morion Rachado Interna + +Inner Mudstone Stair=Escada de Lodo Interna +Inner Cobbled Mudstone Stair=Escada de Lodo Serrada Interna +Inner Mudstone Brick Stair=Escada de Tijolo de Lodo Interna +Inner Mudstone Block Stair=Escada de Bloco de Lodo Interna +Inner Cracked Mudstone Brick Stair=Escada de Tijolo de Lodo Rachado Interna + +Inner Prasiolite Stair=Escada de Prasiolita Interna +Inner Prasiolite Brick Stair=Escada de Tijolo de Prasiolita Interna +Inner Prasiolite Block Stair=Escada de Bloco de Prasiolita Interna +Inner Cracked Prasiolite Brick Stair=Escada de Tijolo de Prasiolita Rachado Interna + +Inner Pumice Stair=Escada de Pedra-pomes Interna +Inner Pumice Brick Stair=Escada de Tijolo de Pedra-pomes Interna +Inner Pumice Block Stair=Escada de Bloco de Pedra-pomes Interna +Inner Cracked Pumice Brick Stair=Escada de Tijolo de Pedra-pomes Rachado Interna + +Inner Pyrite Stair=Escada de Pirita Interna +Inner Pyrite Brick Stair=Escada de Tijolo de Pirita Interna +Inner Pyrite Block Stair=Escada de Bloco de Pirita Interna +Inner Cracked Pyrite Brick Stair=Escada de Tijolo de Pirita Rachado Interna + +Inner Quartz Stair=Escada de Quartzo Interna +Inner Quartz Brick Stair=Escada de Tijolo de Quartzo Interna +Inner Quartz Block Stair=Escada de Bloco de Quartzo Interna +Inner Cracked Quartz Brick Stair=Escada de Tijolo de Quartzo Rachado Interna + +Inner Rhodonite Stair=Escada de Rodonita Interna +Inner Rhodonite Brick Stair=Escada de Tijolo de Rodonita Interna +Inner Rhodonite Block Stair=Escada de Bloco de Rodonita Interna +Inner Cracked Rhodonite Brick Stair=Escada de Tijolo de Rodonita Rachado Interna +Inner Cobbled Rhodonite Stair=Escada de Rodonita Serrada Interna + +Inner Rose Quartz Stair=Escada de Quartzo Rosa Interna +Inner Rose Quartz Brick Stair=Escada de Tijolo de Quartzo Rosa Interna +Inner Rose Quartz Block Stair=Escada de Bloco de Quartzo Rosa Interna +Inner Cracked Rose Quartz Brick Stair=Escada de Tijolo de Quartzo Rosa Rachado Interna + +Inner Scoria Stair=Escada de Escória Interna +Inner Scoria Brick Stair=Escada de Tijolo de Escória Interna +Inner Scoria Block Stair=Escada de Bloco de Escória Interna +Inner Cracked Scoria Brick Stair=Escada de Tijolo de Escória Rachado Interna +Inner Cobbled Scoria Stair=Escada de Escória Serrada Interna + +Inner Serpentine Stair=Escada de Serpentinito Interna +Inner Cobbled Serpentine Stair=Escada de Serpentinito Serrada Interna +Inner Serpentine Brick Stair=Escada de Tijolo de Serpentinito Interna +Inner Serpentine Block Stair=Escada de Bloco de Serpentinito Interna +Inner Cracked Serpentine Brick Stair=Escada de Tijolo de Serpentinito Rachado Interna + +Inner Shale Stair=Escada de Xisto Interna +Inner Shale Brick Stair=Escada de Tijolo de Xisto Interna +Inner Shale Block Stair=Escada de Bloco de Xisto Interna +Inner Cracked Shale Brick Stair=Escada de Tijolo de Xisto Rachado Interna +Inner Cobbled Shale Stair=Escada de Xisto Serrada Interna + +Inner Slate Stair=Escada de Ardósia Interna +Inner Slate Brick Stair=Escada de Tijolo de Ardósia Interna +Inner Slate Block Stair=Escada de Bloco de Ardósia Interna +Inner Cracked Slate Brick Stair=Escada de Tijolo de Ardósia Rachado Interna +Inner Cobbled Slate Stair=Escada de Ardósia Serrada Interna +Inner Slate Tile Stair=Escada de Telha de Ardósia Interna + +Inner Smokey Quartz Stair=Escada de Quartzo Fumê Interna +Inner Smokey Quartz Brick Stair=Escada de Tijolo de Quartzo Fumê Interna +Inner Smokey Quartz Block Stair=Escada de Bloco de Quartzo Fumê Interna +Inner Cracked Smokey Quartz Brick Stair=Escada de Tijolo de Quartzo Fumê Rachado Interna + +Inner Soapstone Stair=Escada de Esteatito Interna +Inner Soapstone Brick Stair=Escada de Tijolo de Esteatito Interna +Inner Soapstone Block Stair=Escada de Bloco de Esteatito Interna +Inner Cracked Soapstone Brick Stair=Escada de Tijolo de Esteatito Rachado Interna + +Inner Sodalite Stair=Escada de Sodalita Interna +Inner Cobbled Sodalite Stair=Escada de Sodalita Serrada Interna +Inner Sodalite Brick Stair=Escada de Tijolo de Sodalita Interna +Inner Sodalite Block Stair=Escada de Bloco de Sodalita Interna +Inner Cracked Sodalite Brick Stair=Escada de Tijolo de Sodalita Rachado Interna + +Inner Sugilite Stair=Escada de Sugilita Interna +Inner Sugilite Brick Stair=Escada de Tijolo de Sugilita Interna +Inner Sugilite Block Stair=Escada de Bloco de Sugilita Interna +Inner Cracked Sugilite Brick Stair=Escada de Tijolo de Sugilita Rachado Interna +Inner Cobbled Sugilite Stair=Escada de Sugilita Serrada Interna + +Inner Green Tourmaline Stair=Escada de Turmalina Verde Interna +Inner Green Tourmaline Brick Stair=Escada de Tijolo de Turmalina Verde Interna +Inner Green Tourmaline Block Stair=Escada de Bloco de Turmalina Verde Interna +Inner Cracked Green Tourmaline Brick Stair=Escada de Tijolo de Turmalina Verde Rachado Interna + +Inner Paraiba Tourmaline Stair=Escada de Turmalina Paraíba Interna +Inner Paraiba Tourmaline Brick Stair=Escada de Tijolo de Turmalina Paraíba Interna +Inner Paraiba Tourmaline Block Stair=Escada de Bloco de Turmalina Paraíba Interna +Inner Cracked Paraiba Tourmaline Brick Stair=Escada de Tijolo de Turmalina Paraíba Rachado Interna + +Inner Pink Tourmaline Stair=Escada de Turmalina Rosa Interna +Inner Pink Tourmaline Brick Stair=Escada de Tijolo de Turmalina Rosa Interna +Inner Pink Tourmaline Block Stair=Escada de Bloco de Turmalina Rosa Interna +Inner Cracked Pink Tourmaline Brick Stair=Escada de Tijolo de Turmalina Rosa Rachado Interna + +Inner Travertine Stair=Escada de Travertino Interna +Inner Cobbled Travertine Stair=Escada de Travertino Serrada Interna +Inner Travertine Brick Stair=Escada de Tijolo de Travertino Interna +Inner Travertine Block Stair=Escada de Bloco de Travertino Interna +Inner Cracked Travertine Brick Stair=Escada de Tijolo de Travertino Rachado Interna + +Inner Yellow Travertine Stair=Escada de Travertino Amarelo Interna +Inner Cobbled Yellow Travertine Stair=Escada de Travertino Amarelo Serrada Interna +Inner Yellow Travertine Brick Stair=Escada de Tijolo de Travertino Amarelo Interna +Inner Yellow Travertine Block Stair=Escada de Bloco de Travertino Amarelo Interna +Inner Cracked Yellow Travertine Brick Stair=Escada de Tijolo de Travertino Amarelo Rachado Interna + +Inner Beige Tuff Stair=Escada de Tufa Bege Interna +Inner Cobbled Beige Tuff Stair=Escada de Tufa Bege Serrada Interna +Inner Beige Tuff Brick Stair=Escada de Tijolo de Tufa Bege Interna +Inner Beige Tuff Block Stair=Escada de Bloco de Tufa Bege Interna +Inner Cracked Beige Tuff Brick Stair=Escada de Tijolo de Tufa Bege Rachado Interna + +Inner Grey Tuff Stair=Escada de Tufa Cinza Interna +Inner Cobbled Grey Tuff Stair=Escada de Tufa Cinza Serrada Interna +Inner Grey Tuff Brick Stair=Escada de Tijolo de Tufa Cinza Interna +Inner Grey Tuff Block Stair=Escada de Bloco de Tufa Cinza Interna +Inner Cracked Grey Tuff Brick Stair=Escada de Tijolo de Tufa Cinza Rachado Interna + +Inner Red Tuff Stair=Escada de Tufa Vermelha Interna +Inner Cobbled Red Tuff Stair=Escada de Tufa Vermelha Serrada Interna +Inner Red Tuff Brick Stair=Escada de Tijolo de Tufa Vermelha Interna +Inner Red Tuff Block Stair=Escada de Bloco de Tufa Vermelha Interna +Inner Cracked Red Tuff Brick Stair=Escada de Tijolo de Tufa Vermelha Rachado Interna + +Inner Turquoise Stair=Escada de Turquesa Interna +Inner Turquoise Brick Stair=Escada de Tijolo de Turquesa Interna +Inner Turquoise Block Stair=Escada de Bloco de Turquesa Interna +Inner Cracked Turquoise Brick Stair=Escada de Tijolo de Turquesa Rachado Interna +Inner Cobbled Turquoise Stair=Escada de Turquesa Serrada Interna + +Inner Vivianite Stair=Escada de Vivianita Interna +Inner Vivianite Brick Stair=Escada de Tijolo de Vivianita Interna +Inner Vivianite Block Stair=Escada de Bloco de Vivianita Interna +Inner Cracked Vivianite Brick Stair=Escada de Tijolo de Vivianita Rachado Interna + + + +Outer Blue Agate Stair=Escada de Ãgata Azul Externa +Outer Gray Agate Stair=Escada de Ãgata Cinza Externa +Outer Green Agate Stair=Escada de Ãgata Verde Externa +Outer Moss Agate Stair=Escada de Ãgata Musgo Externa +Outer Orange Agate Stair=Escada de Ãgata Laranja Externa +Outer Purple Agate Stair=Escada de Ãgata Roxa Externa +Outer Red Agate Stair=Escada de Ãgata Vermelha Externa + +Outer Amazonite Stair=Escada de Amazonita Externa +Outer Cobbled Amazonite Stair=Escada de Amazonita Serrada Externa +Outer Amazonite Brick Stair=Escada de Tijolo de Amazonita Externa +Outer Amazonite Block Stair=Escada de Bloco de Amazonita Externa +Outer Cracked Amazonite Brick Stair=Escada de Tijolo de Amazonita Rachado Externa + +Outer Amber Stair=Escada de Âmbar Externa +Outer Amber Brick Stair=Escada de Tijolo de Âmbar Externa +Outer Amber Block Stair=Escada de Bloco de Âmbar Externa +Outer Cracked Amber Brick Stair=Escada de Tijolo de Âmbar Rachado Externa + +Outer Amethyst Stair=Escada de Ametista Externa +Outer Amethyst Brick Stair=Escada de Tijolo de Ametista Externa +Outer Amethyst Block Stair=Escada de Bloco de Ametista Externa +Outer Cracked Amethyst Brick Stair=Escada de Tijolo de Ametista Rachado Externa + +Outer Andesite Stair=Escada de Andesita Externa +Outer Andesite Block Stair=Escada de Bloco de Andesita Externa +Outer Andesite Brick Stair=Escada de Tijolo de Andesita Externa +Outer Cracked Andesite Brick Stair=Escada de Tijolo de Andesita Rachado Externa +Outer Cobbled Andesite Stair=Escada de Andesita Serrada Externa + +Outer Basalt Stair=Escada de Basalto Externa +Outer Basalt Block Stair=Escada de Bloco de Basalto Externa +Outer Basalt Brick Stair=Escada de Tijolo de Basalto Externa +Outer Cracked Basalt Brick Stair=Escada de Tijolo de Basalto Rachado Externa +Outer Cobbled Basalt Stair=Escada de Basalto Serrada Externa +Outer Basalt Tile Stair=Escada de Azulejo de Basalto Externa + +Outer Black Moonstone Stair=Escada de Pedra da Lua Preta Externa +Outer Black Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Preta Externa +Outer Black Moonstone Block Stair=Escada de Bloco de Pedra da Lua Preta Externa +Outer Cracked Black Moonstone Brick Stair=Escada de Tijolo de Pedra da Lua Preta Rachado Externa + +Outer Calcite Stair=Escada de Calcita Externa +Outer Calcite Brick Stair=Escada de Tijolo de Calcita Externa +Outer Calcite Block Stair=Escada de Bloco de Calcita Externa +Outer Cracked Calcite Brick Stair=Escada de Tijolo de Calcita Rachado Externa + +Outer Grey Calcite Stair=Escada de Calcita Cinza Externa +Outer Grey Calcite Brick Stair=Escada de Tijolo de Calcita Cinza Externa +Outer Grey Calcite Block Stair=Escada de Bloco de Calcita Cinza Externa +Outer Cracked Grey Calcite Brick Stair=Escada de Tijolo de Calcita Cinza Rachado Externa + +Outer Orange Calcite Stair=Escada de Calcita Laranja Externa +Outer Orange Calcite Brick Stair=Escada de Tijolo de Calcita Laranja Externa +Outer Orange Calcite Block Stair=Escada de Bloco de Calcita Laranja Externa +Outer Cracked Orange Calcite Brick Stair=Escada de Tijolo de Calcita Laranja Rachado Externa + +Outer Carnotite Stair=Escada de Carnotita Externa +Outer Carnotite Brick Stair=Escada de Tijolo de Carnotita Externa +Outer Carnotite Block Stair=Escada de Bloco de Carnotita Externa +Outer Cracked Carnotite Brick Stair=Escada de Tijolo de Carnotita Rachado Externa +Outer Cobbled Carnotite Stair=Escada de Carnotita Serrada Externa + +Outer Celestine Stair=Escada de Celestita Externa +Outer Celestine Brick Stair=Escada de Tijolo de Celestita Externa +Outer Celestine Block Stair=Escada de Bloco de Celestita Externa +Outer Cracked Celestine Brick Stair=Escada de Tijolo de Celestita Rachado Externa + +Outer Chalcanthite Stair=Escada de Chalcanthita Externa +Outer Chalcanthite Brick Stair=Escada de Tijolo de Chalcanthita Externa +Outer Chalcanthite Block Stair=Escada de Bloco de Chalcanthita Externa +Outer Cracked Chalcanthite Brick Stair=Escada de Tijolo de Chalcanthita Rachado Externa +Outer Cobbled Chalcanthite Stair=Escada de Chalcanthita Serrada Externa + +Outer Chrysoprase Stair=Escada de Crisoprase Externa +Outer Chrysoprase Brick Stair=Escada de Tijolo de Crisoprase Externa +Outer Chrysoprase Block Stair=Escada de Bloco de Crisoprase Externa +Outer Cracked Chrysoprase Brick Stair=Escada de Tijolo de Crisoprase Rachado Externa + +Outer Citrine Stair=Escada de Citrino Externa +Outer Citrine Brick Stair=Escada de Tijolo de Citrino Externa +Outer Citrine Block Stair=Escada de Bloco de Citrino Externa +Outer Cracked Citrine Brick Stair=Escada de Tijolo de Citrino Rachado Externa + +Outer Covellite Stair=Escada de Covellita Externa +Outer Covellite Brick Stair=Escada de Tijolo de Covellita Externa +Outer Covellite Block Stair=Escada de Bloco de Covellita Externa +Outer Cracked Covellite Brick Stair=Escada de Tijolo de Covellita Rachado Externa +Outer Cobbled Covellite Stair=Escada de Covellita Serrada Externa + +Outer Crocoite Stair=Escada de Crocoíta Externa +Outer Crocoite Brick Stair=Escada de Tijolo de Crocoíta Externa +Outer Crocoite Block Stair=Escada de Bloco de Crocoíta Externa +Outer Cracked Crocoite Brick Stair=Escada de Tijolo de Crocoíta Rachado Externa + +Outer Diorite Stair=Escada de Diórito Externa +Outer Diorite Brick Stair=Escada de Tijolo de Diórito Externa +Outer Diorite Block Stair=Escada de Bloco de Diórito Externa +Outer Cracked Diorite Brick Stair=Escada de Tijolo de Diórito Rachado Externa +Outer Cobbled Diorite Stair=Escada de Diórito Serrada Externa + +Outer Erythrite Stair=Escada de Eritrita Externa +Outer Erythrite Brick Stair=Escada de Tijolo de Eritrita Externa +Outer Erythrite Block Stair=Escada de Bloco de Eritrita Externa +Outer Cracked Erythrite Brick Stair=Escada de Tijolo de Eritrita Rachado Externa + +Outer Eudialite Stair=Escada de Eudialita Externa +Outer Eudialite Brick Stair=Escada de Tijolo de Eudialita Externa +Outer Eudialite Block Stair=Escada de Bloco de Eudialita Externa +Outer Cracked Eudialite Brick Stair=Escada de Tijolo de Eudialita Rachado Externa + +Outer Fluorite Stair=Escada de Fluorita Externa +Outer Fluorite Brick Stair=Escada de Tijolo de Fluorita Externa +Outer Fluorite Block Stair=Escada de Bloco de Fluorita Externa +Outer Cracked Fluorite Brick Stair=Escada de Tijolo de Fluorita Rachado Externa + +Outer Gabbro Stair=Escada de Gabro Externa +Outer Cobbled Gabbro Stair=Escada de Gabro Serrada Externa +Outer Gabbro Brick Stair=Escada de Tijolo de Gabro Externa +Outer Gabbro Block Stair=Escada de Bloco de Gabro Externa +Outer Cracked Gabbro Brick Stair=Escada de Tijolo de Gabro Rachado Externa + +Outer Galena Stair=Escada de Galena Externa +Outer Galena Brick Stair=Escada de Tijolo de Galena Externa +Outer Galena Block Stair=Escada de Bloco de Galena Externa +Outer Cracked Galena Brick Stair=Escada de Tijolo de Galena Rachado Externa + +Outer Black Granite Stair=Escada de Granito Preto Externa +Outer Black Granite Brick Stair=Escada de Tijolo de Granito Preto Externa +Outer Black Granite Block Stair=Escada de Bloco de Granito Preto Externa +Outer Cracked Black Granite Brick Stair=Escada de Tijolo de Granito Preto Rachado Externa +Outer Cobbled Black Granite Stair=Escada de Granito Preto Serrada Externa + +Outer Blue Granite Stair=Escada de Granito Azul Externa +Outer Blue Granite Brick Stair=Escada de Tijolo de Granito Azul Externa +Outer Blue Granite Block Stair=Escada de Bloco de Granito Azul Externa +Outer Cracked Blue Granite Brick Stair=Escada de Tijolo de Granito Azul Rachado Externa +Outer Cobbled Blue Granite Stair=Escada de Granito Azul Serrada Externa + +Outer Gray Granite Stair=Escada de Granito Cinza Externa +Outer Gray Granite Brick Stair=Escada de Tijolo de Granito Cinza Externa +Outer Gray Granite Block Stair=Escada de Bloco de Granito Cinza Externa +Outer Cracked Gray Granite Brick Stair=Escada de Tijolo de Granito Cinza Rachado Externa +Outer Cobbled Gray Granite Stair=Escada de Granito Cinza Serrada Externa + +Outer Green Granite Stair=Escada de Granito Verde Externa +Outer Green Granite Brick Stair=Escada de Tijolo de Granito Verde Externa +Outer Green Granite Block Stair=Escada de Bloco de Granito Verde Externa +Outer Cracked Green Granite Brick Stair=Escada de Tijolo de Granito Verde Rachado Externa +Outer Cobbled Green Granite Stair=Escada de Granito Verde Serrada Externa + +Outer Pink Granite Stair=Escada de Granito Rosa Externa +Outer Pink Granite Brick Stair=Escada de Tijolo de Granito Rosa Externa +Outer Pink Granite Block Stair=Escada de Bloco de Granito Rosa Externa +Outer Cracked Pink Granite Brick Stair=Escada de Tijolo de Granito Rosa Rachado Externa +Outer Cobbled Pink Granite Stair=Escada de Granito Rosa Serrada Externa + +Outer Red Granite Stair=Escada de Granito Vermelho Externa +Outer Red Granite Brick Stair=Escada de Tijolo de Granito Vermelho Externa +Outer Red Granite Block Stair=Escada de Bloco de Granito Vermelho Externa +Outer Cracked Red Granite Brick Stair=Escada de Tijolo de Granito Vermelho Rachado Externa +Outer Cobbled Red Granite Stair=Escada de Granito Vermelho Serrada Externa + +Outer White Granite Stair=Escada de Granito Branco Externa +Outer White Granite Brick Stair=Escada de Tijolo de Granito Branco Externa +Outer White Granite Block Stair=Escada de Bloco de Granito Branco Externa +Outer Cracked White Granite Brick Stair=Escada de Tijolo de Granito Branco Rachado Externa +Outer Cobbled White Granite Stair=Escada de Granito Branco Serrada Externa + +Outer Yellow Granite Stair=Escada de Granito Amarelo Externa +Outer Yellow Granite Brick Stair=Escada de Tijolo de Granito Amarelo Externa +Outer Yellow Granite Block Stair=Escada de Bloco de Granito Amarelo Externa +Outer Cracked Yellow Granite Brick Stair=Escada de Tijolo de Granito Amarelo Rachado Externa +Outer Cobbled Yellow Granite Stair=Escada de Granito Amarelo Serrada Externa + +Outer Heliodor Stair=Escada de Heliodoro Externa +Outer Heliodor Brick Stair=Escada de Tijolo de Heliodoro Externa +Outer Heliodor Block Stair=Escada de Bloco de Heliodoro Externa +Outer Cracked Heliodor Brick Stair=Escada de Tijolo de Heliodoro Rachado Externa + +Outer Howlite Stair=Escada de Howlita Externa +Outer Howlite Brick Stair=Escada de Tijolo de Howlita Externa +Outer Howlite Block Stair=Escada de Bloco de Howlita Externa +Outer Cracked Howlite Brick Stair=Escada de Tijolo de Howlita Rachado Externa +Outer Cobbled Howlite Stair=Escada de Howlita Serrada Externa + +Outer Ilvaite Stair=Escada de Ilvaita Externa +Outer Ilvaite Brick Stair=Escada de Tijolo de Ilvaita Externa +Outer Ilvaite Block Stair=Escada de Bloco de Ilvaita Externa +Outer Cracked Ilvaite Brick Stair=Escada de Tijolo de Ilvaita Rachado Externa +Outer Cobbled Ilvaite Stair=Escada de Ilvaita Serrada Externa + +Outer Jade Stair=Escada de Jade Externa +Outer Jade Brick Stair=Escada de Tijolo de Jade Externa +Outer Jade Block Stair=Escada de Bloco de Jade Externa +Outer Cracked Jade Brick Stair=Escada de Tijolo de Jade Rachado Externa +Outer Cobbled Jade Stair=Escada de Jade Serrada Externa + +Outer Red Jasper Stair=Escada de Jaspe Vermelho Externa +Outer Red Jasper Brick Stair=Escada de Tijolo de Jaspe Vermelho Externa +Outer Red Jasper Block Stair=Escada de Bloco de Jaspe Vermelho Externa +Outer Cracked Red Jasper Brick Stair=Escada de Tijolo de Jaspe Vermelho Rachado Externa +Outer Cobbled Red Jasper Stair=Escada de Jaspe Vermelho Serrada Externa + +Outer Kyanite Stair=Escada de Cianita Externa +Outer Kyanite Brick Stair=Escada de Tijolo de Cianita Externa +Outer Kyanite Block Stair=Escada de Bloco de Cianita Externa +Outer Cracked Kyanite Brick Stair=Escada de Tijolo de Cianita Rachado Externa +Outer Cobbled Kyanite Stair=Escada de Cianita Serrada Externa + +Outer Lapis Lazuli Stair=Escada de Lápis-Lazúli Externa +Outer Lapis Lazuli Brick Stair=Escada de Tijolo de Lápis-Lazúli Externa +Outer Lapis Lazuli Block Stair=Escada de Bloco de Lápis-Lazúli Externa +Outer Cracked Lapis Lazuli Brick Stair=Escada de Tijolo de Lápis-Lazúli Rachado Externa + +Outer Lepidolite Stair=Escada de Lepidolita Externa +Outer Lepidolite Brick Stair=Escada de Tijolo de Lepidolita Externa +Outer Lepidolite Block Stair=Escada de Bloco de Lepidolita Externa +Outer Cracked Lepidolite Brick Stair=Escada de Tijolo de Lepidolita Rachado Externa +Outer Cobbled Lepidolite Stair=Escada de Lepidolita Serrada Externa + +Outer Blue Limestone Stair=Escada de Calcário Azul Externa +Outer Blue Limestone Brick Stair=Escada de Tijolo de Calcário Azul Externa +Outer Blue Limestone Block Stair=Escada de Bloco de Calcário Azul Externa +Outer Cracked Blue Limestone Brick Stair=Escada de Tijolo de Calcário Azul Rachado Externa +Outer Cobbled Blue Limestone Stair=Escada de Calcário Azul Serrada Externa + +Outer White Limestone Stair=Escada de Calcário Branco Externa +Outer White Limestone Brick Stair=Escada de Tijolo de Calcário Branco Externa +Outer White Limestone Block Stair=Escada de Bloco de Calcário Branco Externa +Outer Cracked White Limestone Brick Stair=Escada de Tijolo de Calcário Branco Rachado Externa +Outer Cobbled White Limestone Stair=Escada de Calcário Branco Serrada Externa + +Outer Marble Stair=Escada de Mármore Externa +Outer Marble Brick Stair=Escada de Tijolo de Mármore Externa +Outer Marble Block Stair=Escada de Bloco de Mármore Externa +Outer Cracked Marble Brick Stair=Escada de Tijolo de Mármore Rachado Externa +Outer Cobbled Marble Stair=Escada de Mármore Serrada Externa + +Outer Moonstone Stair=Escada de Pedra-da-Lua Externa +Outer Moonstone Brick Stair=Escada de Tijolo de Pedra-da-Lua Externa +Outer Moonstone Block Stair=Escada de Bloco de Pedra-da-Lua Externa +Outer Cracked Moonstone Brick Stair=Escada de Tijolo de Pedra-da-Lua Rachado Externa + +Outer Morion Quartz Stair=Escada de Quartzo Morion Externa +Outer Morion Quartz Brick Stair=Escada de Tijolo de Quartzo Morion Externa +Outer Morion Quartz Block Stair=Escada de Bloco de Quartzo Morion Externa +Outer Cracked Morion Quartz Brick Stair=Escada de Tijolo de Quartzo Morion Rachado Externa + +Outer Mudstone Stair=Escada de Argilito Externa +Outer Cobbled Mudstone Stair=Escada de Argilito Serrado Externa +Outer Mudstone Brick Stair=Escada de Tijolo de Argilito Externa +Outer Mudstone Block Stair=Escada de Bloco de Argilito Externa +Outer Cracked Mudstone Brick Stair=Escada de Tijolo de Argilito Rachado Externa + +Outer Prasiolite Stair=Escada de Praziolita Externa +Outer Prasiolite Brick Stair=Escada de Tijolo de Praziolita Externa +Outer Prasiolite Block Stair=Escada de Bloco de Praziolita Externa +Outer Cracked Prasiolite Brick Stair=Escada de Tijolo de Praziolita Rachado Externa + +Outer Pumice Stair=Escada de Púmice Externa +Outer Pumice Brick Stair=Escada de Tijolo de Púmice Externa +Outer Pumice Block Stair=Escada de Bloco de Púmice Externa +Outer Cracked Pumice Brick Stair=Escada de Tijolo de Púmice Rachado Externa + +Outer Pyrite Stair=Escada de Pirita Externa +Outer Pyrite Brick Stair=Escada de Tijolo de Pirita Externa +Outer Pyrite Block Stair=Escada de Bloco de Pirita Externa +Outer Cracked Pyrite Brick Stair=Escada de Tijolo de Pirita Rachado Externa + +Outer Quartz Stair=Escada de Quartzo Externa +Outer Quartz Brick Stair=Escada de Tijolo de Quartzo Externa +Outer Quartz Block Stair=Escada de Bloco de Quartzo Externa +Outer Cracked Quartz Brick Stair=Escada de Tijolo de Quartzo Rachado Externa + +Outer Rhodonite Stair=Escada de Rodonita Externa +Outer Rhodonite Brick Stair=Escada de Tijolo de Rodonita Externa +Outer Rhodonite Block Stair=Escada de Bloco de Rodonita Externa +Outer Cracked Rhodonite Brick Stair=Escada de Tijolo de Rodonita Rachado Externa +Outer Cobbled Rhodonite Stair=Escada de Rodonita Serrada Externa + +Outer Rose Quartz Stair=Escada de Quartzo Rosa Externa +Outer Rose Quartz Brick Stair=Escada de Tijolo de Quartzo Rosa Externa +Outer Rose Quartz Block Stair=Escada de Bloco de Quartzo Rosa Externa +Outer Cracked Rose Quartz Brick Stair=Escada de Tijolo de Quartzo Rosa Rachado Externa + +Outer Scoria Stair=Escada de Escória Externa +Outer Scoria Brick Stair=Escada de Tijolo de Escória Externa +Outer Scoria Block Stair=Escada de Bloco de Escória Externa +Outer Cracked Scoria Brick Stair=Escada de Tijolo de Escória Rachado Externa +Outer Cobbled Scoria Stair=Escada de Escória Serrada Externa + +Outer Serpentine Stair=Escada de Serpentinito Externa +Outer Cobbled Serpentine Stair=Escada de Serpentinito Serrado Externa +Outer Serpentine Brick Stair=Escada de Tijolo de Serpentinito Externa +Outer Serpentine Block Stair=Escada de Bloco de Serpentinito Externa +Outer Cracked Serpentine Brick Stair=Escada de Tijolo de Serpentinito Rachado Externa + +Outer Shale Stair=Escada de Xisto Externa +Outer Shale Brick Stair=Escada de Tijolo de Xisto Externa +Outer Shale Block Stair=Escada de Bloco de Xisto Externa +Outer Cracked Shale Brick Stair=Escada de Tijolo de Xisto Rachado Externa +Outer Cobbled Shale Stair=Escada de Xisto Serrado Externa + +Outer Slate Stair=Escada de Ardósia Externa +Outer Slate Brick Stair=Escada de Tijolo de Ardósia Externa +Outer Slate Block Stair=Escada de Bloco de Ardósia Externa +Outer Cracked Slate Brick Stair=Escada de Tijolo de Ardósia Rachado Externa +Outer Cobbled Slate Stair=Escada de Ardósia Serrada Externa +Outer Slate Tile Stair=Escada de Ardósia em Mosaico Externa + +Outer Smokey Quartz Stair=Escada de Quartzo Fumê Externa +Outer Smokey Quartz Brick Stair=Escada de Tijolo de Quartzo Fumê Externa +Outer Smokey Quartz Block Stair=Escada de Bloco de Quartzo Fumê Externa +Outer Cracked Smokey Quartz Brick Stair=Escada de Tijolo de Quartzo Fumê Rachado Externa + +Outer Soapstone Stair=Escada de Esteatito Externa +Outer Soapstone Brick Stair=Escada de Tijolo de Esteatito Externa +Outer Soapstone Block Stair=Escada de Bloco de Esteatito Externa +Outer Cracked Soapstone Brick Stair=Escada de Tijolo de Esteatito Rachado Externa + +Outer Sodalite Stair=Escada de Sodalita Externa +Outer Cobbled Sodalite Stair=Escada de Sodalita Serrada Externa +Outer Sodalite Brick Stair=Escada de Tijolo de Sodalita Externa +Outer Sodalite Block Stair=Escada de Bloco de Sodalita Externa +Outer Cracked Sodalite Brick Stair=Escada de Tijolo de Sodalita Rachado Externa + +Outer Sugilite Stair=Escada de Sugilita Externa +Outer Sugilite Brick Stair=Escada de Tijolo de Sugilita Externa +Outer Sugilite Block Stair=Escada de Bloco de Sugilita Externa +Outer Cracked Sugilite Brick Stair=Escada de Tijolo de Sugilita Rachado Externa +Outer Cobbled Sugilite Stair=Escada de Sugilita Serrada Externa + +Outer Green Tourmaline Stair=Escada de Turmalina Verde Externa +Outer Green Tourmaline Brick Stair=Escada de Tijolo de Turmalina Verde Externa +Outer Green Tourmaline Block Stair=Escada de Bloco de Turmalina Verde Externa +Outer Cracked Green Tourmaline Brick Stair=Escada de Tijolo de Turmalina Verde Rachado Externa + +Outer Paraiba Tourmaline Stair=Escada de Turmalina Paraíba Externa +Outer Paraiba Tourmaline Brick Stair=Escada de Tijolo de Turmalina Paraíba Externa +Outer Paraiba Tourmaline Block Stair=Escada de Bloco de Turmalina Paraíba Externa +Outer Cracked Paraiba Tourmaline Brick Stair=Escada de Tijolo de Turmalina Paraíba Rachado Externa + +Outer Pink Tourmaline Stair=Escada de Turmalina Rosa Externa +Outer Pink Tourmaline Brick Stair=Escada de Tijolo de Turmalina Rosa Externa +Outer Pink Tourmaline Block Stair=Escada de Bloco de Turmalina Rosa Externa +Outer Cracked Pink Tourmaline Brick Stair=Escada de Tijolo de Turmalina Rosa Rachado Externa + +Outer Travertine Stair=Escada de Travertino Externa +Outer Cobbled Travertine Stair=Escada de Travertino Serrado Externa +Outer Travertine Brick Stair=Escada de Tijolo de Travertino Externa +Outer Travertine Block Stair=Escada de Bloco de Travertino Externa +Outer Cracked Travertine Brick Stair=Escada de Tijolo de Travertino Rachado Externa + +Outer Yellow Travertine Stair=Escada de Travertino Amarelo Externa +Outer Cobbled Yellow Travertine Stair=Escada de Travertino Amarelo Serrado Externa +Outer Yellow Travertine Brick Stair=Escada de Tijolo de Travertino Amarelo Externa +Outer Yellow Travertine Block Stair=Escada de Bloco de Travertino Amarelo Externa +Outer Cracked Yellow Travertine Brick Stair=Escada de Tijolo de Travertino Amarelo Rachado Externa + +Outer Beige Tuff Stair=Escada de Tufo Bege Externa +Outer Cobbled Beige Tuff Stair=Escada de Tufo Bege Serrado Externa +Outer Beige Tuff Brick Stair=Escada de Tijolo de Tufo Bege Externa +Outer Beige Tuff Block Stair=Escada de Bloco de Tufo Bege Externa +Outer Cracked Beige Tuff Brick Stair=Escada de Tijolo de Tufo Bege Rachado Externa + +Outer Grey Tuff Stair=Escada de Tufo Cinza Externa +Outer Cobbled Grey Tuff Stair=Escada de Tufo Cinza Serrado Externa +Outer Grey Tuff Brick Stair=Escada de Tijolo de Tufo Cinza Externa +Outer Grey Tuff Block Stair=Escada de Bloco de Tufo Cinza Externa +Outer Cracked Grey Tuff Brick Stair=Escada de Tijolo de Tufo Cinza Rachado Externa + +Outer Red Tuff Stair=Escada de Tufo Vermelho Externa +Outer Cobbled Red Tuff Stair=Escada de Tufo Vermelho Serrado Externa +Outer Red Tuff Brick Stair=Escada de Tijolo de Tufo Vermelho Externa +Outer Red Tuff Block Stair=Escada de Bloco de Tufo Vermelho Externa +Outer Cracked Red Tuff Brick Stair=Escada de Tijolo de Tufo Vermelho Rachado Externa + +Outer Turquoise Stair=Escada de Turquesa Externa +Outer Turquoise Brick Stair=Escada de Tijolo de Turquesa Externa +Outer Turquoise Block Stair=Escada de Bloco de Turquesa Externa +Outer Cracked Turquoise Brick Stair=Escada de Tijolo de Turquesa Rachado Externa +Outer Cobbled Turquoise Stair=Escada de Turquesa Serrada Externa + +Outer Vivianite Stair=Escada de Vivianita Externa +Outer Vivianite Brick Stair=Escada de Tijolo de Vivianita Externa +Outer Vivianite Block Stair=Escada de Bloco de Vivianita Externa +Outer Cracked Vivianite Brick Stair=Escada de Tijolo de Vivianita Rachado Externa + +### nodes_glowing.lua ### + +Glowing Apatite=Apatita Brilhante +Glowing Apatite Block=Bloco de Apatita Brilhante +Cobbled Glowing Apatite=Apatita Brilhante Serrada +Glowing Apatite Brick=Tijolo de Apatita Brilhante +Cracked Glowing Apatite Brick=Tijolo de Apatita Brilhante Rachado + +Glowing Calcite=Calcita Brilhante +Glowing Calcite Block=Bloco de Calcita Brilhante +Cobbled Glowing Calcite=Calcita Brilhante Serrada +Glowing Calcite Brick=Tijolo de Calcita Brilhante +Cracked Glowing Calcite Brick=Tijolo de Calcita Brilhante Rachado + +Glowing Esperite=Esperita Brilhante +Glowing Esperite Block=Bloco de Esperita Brilhante +Cobbled Glowing Esperite=Esperita Brilhante Serrada +Glowing Esperite Brick=Tijolo de Esperita Brilhante +Cracked Glowing Esperite Brick=Tijolo de Esperita Brilhante Rachado + +Glowing Fluorite=Fluorita Brilhante +Glowing Fluorite Block=Bloco de Fluorita Brilhante +Cobbled Glowing Fluorite=Fluorita Brilhante Serrada +Glowing Fluorite Brick=Tijolo de Fluorita Brilhante +Cracked Glowing Fluorite Brick=Tijolo de Fluorita Brilhante Rachado + +Glowing Selenite=Selenita Brilhante +Glowing Selenite Block=Bloco de Selenita Brilhante +Cobbled Glowing Selenite=Selenita Brilhante Serrada +Glowing Selenite Brick=Tijolo de Selenita Brilhante +Cracked Glowing Selenite Brick=Tijolo de Selenita Brilhante Rachado + +Glowing Sodalite=Sodalita Brilhante +Glowing Sodalite Block=Bloco de Sodalita Brilhante +Cobbled Glowing Sodalite=Sodalita Brilhante Serrada +Glowing Sodalite Brick=Tijolo de Sodalita Brilhante +Cracked Glowing Sodalite Brick=Tijolo de Sodalita Brilhante Rachado + +Glowing Willemite=Willemite Brilhante +Glowing Willemite Block=Bloco de Willemite Brilhante +Cobbled Glowing Willemite=Willemite Brilhante Serrada +Glowing Willemite Brick=Tijolo de Willemite Brilhante +Cracked Glowing Willemite Brick=Tijolo de Willemite Brilhante Rachado + +### nodes_crystal.lua ### + +Budding Amazonite=Amazonita Em Botão +Amazonite Crystal=Cristal de Amazonita + +Budding Amber=Âmbar Em Botão +Amber Crystal=Cristal de Âmbar + +Budding Amethyst=Ametista Em Botão +Amethyst Crystal=Cristal de Ametista + +Budding Celestine=Celestina Em Botão +Celestine Crystal=Cristal de Celestina + +Budding Chalcanthite=Calcantita Em Botão +Chalcanthite Crystal=Cristal de Calcantita + +Budding Citrine=Citrino Em Botão +Citrine Crystal=Cristal de Citrino + +Budding Crocoite=Crocoíta Em Botão +Crocoite Crystal=Cristal de Crocoíta + +Budding Eudialite=Eudialita Em Botão +Eudialite Crystal=Cristal de Eudialita + +Budding Heliodor=Heliodoro Em Botão +Heliodor Crystal=Cristal de Heliodoro + +Budding Kyanite=Cianita Em Botão +Kyanite Crystal=Cristal de Cianita + +Budding Moonstone=Pedra da Lua Em Botão +Moonstone Crystal=Cristal de Pedra da Lua + +Budding Morion Quartz=Quartzo Morion Em Botão +Morion Quartz Crystal=Cristal de Quartzo Morion + +Budding Prasiolite=Prasiolita Em Botão +Prasiolite Crystal=Cristal de Prasiolita + +Budding Quartz=Quartzo Em Botão +Quartz Crystal=Cristal de Quartzo + +Budding Rose Quartz=Quartzo Rosa Em Botão +Rose Quartz Crystal=Cristal de Quartzo Rosa + +Budding Smokey Quartz=Quartzo Fumê Em Botão +Smokey Quartz Crystal=Cristal de Quartzo Fumê + +Budding Green Tourmaline=Turmalina Verde Em Botão +Green Tourmaline Crystal=Cristal de Turmalina Verde + +Budding Paraiba Tourmaline=Turmalina Paraíba Em Botão +Paraiba Tourmaline Crystal=Cristal de Turmalina Paraíba + +Budding Pink Tourmaline=Turmalina Rosa Em Botão +Pink Tourmaline Crystal=Cristal de Turmalina Rosa + +Budding Vivianite=Vivianita Em Botão +Vivianite Crystal=Cristal de Vivianita diff --git a/mods/too_many_stones/locale/too_many_stones.ru.tr b/mods/too_many_stones/locale/too_many_stones.ru.tr new file mode 100644 index 00000000..6428c418 --- /dev/null +++ b/mods/too_many_stones/locale/too_many_stones.ru.tr @@ -0,0 +1,2465 @@ +# textdomain: too_many_stones + + +### nodes.lua ### + +Blue Agate=Бирюзовый агат +Gray Agate=Серый агат +Green Agate=Зеленый агат +Moss Agate=Моховой агат +Orange Agate=Оранжевый агат +Purple Agate=Фиолетовый агат +Red Agate=КраÑный агат + +Amazonite=Ðмазонит +Amazonite Block=Блок амазонита +Cobbled Amazonite=Мощеный амазонит +Amazonite Brick=Кирпич из амазонита +Cracked Amazonite Brick=ТреÑнувший кирпич из амазонита + +Amber=Янтарь +Amber Block=Блок ÑÐ½Ñ‚Ð°Ñ€Ñ +Amber Brick=Кирпич из ÑÐ½Ñ‚Ð°Ñ€Ñ +Cracked Amber Brick=ТреÑнувший кирпич из ÑÐ½Ñ‚Ð°Ñ€Ñ + +Amethyst=ÐметиÑÑ‚ +Amethyst Block=Блок аметиÑта +Amethyst Brick=Кирпич из аметиÑта +Cracked Amethyst Brick=ТреÑнувший кирпич из аметиÑта + +Ammolite=Aммолит + +Andesite=Ðндезит +Andesite Block=Блок андезита +Andesite Brick=Кирпич из андезита +Cracked Andesite Brick=ТреÑнувший кирпич из андезита +Cobbled Andesite=Мощеный андезит + +Basalt=Базальт +Basalt Block=Блок базальта +Basalt Brick=Кирпич из базальта +Cracked Basalt Brick=ТреÑнувший кирпич из базальта +Cobbled Basalt=Мощеный базальт +Basalt Tile=Плитка из базальта + +Columnar Basalt=Колонный базальт + +Batch=СмеÑÑŒ Ð´Ð»Ñ Ñтекла + +Black Moonstone=Черный лунный камень +Black Moonstone Block=Блок из черного лунного ÐºÐ°Ð¼Ð½Ñ +Black Moonstone Brick=Кирпич из черного лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Black Moonstone Brick=ТреÑнувший кирпич из черного лунного ÐºÐ°Ð¼Ð½Ñ + +Black Opal=Черный опал + +Grey Calcite=Серый Кальцит +Grey Calcite Block=Блок Серого Кальцита +Grey Calcite Brick=Кирпич Серого Кальцита +Cracked Grey Calcite Brick=ТреÑнутый Кирпич Серого Кальцита + +Calcite=Кальцит +Calcite Block=Блок кальцита +Calcite Brick=Кирпич из кальцита +Cracked Calcite Brick=ТреÑнувший кирпич из кальцита + +Orange Calcite=Оранжевый Кальцит +Orange Calcite Block=Блок Оранжевого Кальцита +Orange Calcite Brick=Кирпич Оранжевого Кальцита +Cracked Orange Calcite Brick=ТреÑнутый Кирпич Оранжевого Кальцита + +Carnotite=Карнотит +Carnotite Block=Блок карнотита +Carnotite Brick=Кирпич из карнотита +Cracked Carnotite Brick=ТреÑнувший кирпич из карнотита +Cobbled Carnotite=Мощеный карнотит + +Celestine=ЦелеÑтин +Celestine Block=Блок целеÑтина +Celestine Brick=Кирпич из целеÑтина +Cracked Celestine Brick=ТреÑнувший кирпич из целеÑтина + +Chalcanthite=Халкантит +Chalcanthite Block=Блок Халкантита +Chalcanthite Brick=Кирпич Халкантита +Cracked Chalcanthite Brick=ТреÑнутый Кирпич Халкантита +Cobbled Chalcanthite=БруÑчатка Халкантита + +Chrysoprase=Хризопраз +Chrysoprase Block=Блок хризопраза +Chrysoprase Brick=Кирпич из хризопраза +Cracked Chrysoprase Brick=ТреÑнувший кирпич из хризопраза + +Citrine=Цитрин +Citrine Block=Блок цитрина +Citrine Brick=Кирпич из цитрина +Cracked Citrine Brick=ТреÑнувший кирпич из цитрина + +Covellite=Ковеллит +Covellite Block=Блок ковеллита +Covellite Brick=Кирпич из ковеллита +Cracked Covellite Brick=ТреÑнувший кирпич из ковеллита +Cobbled Covellite=Мощеный ковеллит + +Crocoite=Крокоит +Crocoite Block=Блок крокоита +Crocoite Brick=Кирпич из крокоита +Cracked Crocoite Brick=ТреÑнувший кирпич из крокоита + +Diorite=Диорит +Diorite Block=Блок Диорита +Diorite Brick=Кирпич из Диорита +Cracked Diorite Brick=ТреÑнувший кирпич из Диорита +Cobbled Diorite=Мощеный диорит + +Erythrite=Эритрит +Erythrite Block=Блок Ñритрита +Erythrite Brick=Кирпич из Ñритрита +Cracked Erythrite Brick=ТреÑнувший кирпич из Ñритрита + +Eudialite=Эвдиалит +Eudialite Block=Блок Ñвдиалита +Eudialite Brick=Кирпич из Ñвдиалита +Cracked Eudialite Brick=ТреÑнувший кирпич из Ñвдиалита + +Fluorite=Флюорит +Fluorite Block=Блок флюорита +Fluorite Brick=Кирпич из флюорита +Cracked Fluorite Brick=ТреÑнувший кирпич из флюорита + +Fire Opal=Огненный опал + +Gabbro=Габбро +Gabbro Block=Блок габбро +Cobbled Gabbro=Мощеный габбро +Gabbro Brick=Кирпич из габбро +Cracked Gabbro Brick=ТреÑнувший кирпич из габбро + +Galena=Галенит +Galena Block=Блок галенита +Galena Brick=Кирпич из галенита +Cracked Galena Brick=ТреÑнувший кирпич из галенита + +Black Granite=Черный гранит +Black Granite Block=Черный блок гранита +Black Granite Brick=Ð§ÐµÑ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ гранита +Cracked Black Granite Brick=ТреÑнутый черный кирпич гранита +Cobbled Black Granite=Мощеный черный гранит + +Blue Granite=Синий гранит +Blue Granite Block=Синий блок гранита +Blue Granite Brick=Синий кирпич гранита +Cracked Blue Granite Brick=ТреÑнутый Ñиний кирпич гранита +Cobbled Blue Granite=Мощеный Ñиний гранит + +Gray Granite=Серый гранит +Gray Granite Block=Серый блок гранита +Gray Granite Brick=Серый кирпич гранита +Cracked Gray Granite Brick=ТреÑнутый Ñерый кирпич гранита +Cobbled Gray Granite=Мощеный Ñерый гранит + +Green Granite=Зеленый гранит +Green Granite Block=Зеленый блок гранит +Green Granite Brick=Зеленый гранитный кирпич +Cracked Green Granite Brick=РаÑтреÑкавшийÑÑ Ð·ÐµÐ»ÐµÐ½Ñ‹Ð¹ гранитный кирпич +Cobbled Green Granite=Выложенный зеленый гранит + +Pink Granite=Розовый гранит +Pink Granite Block=Блок розового гранита +Pink Granite Brick=Розовый гранитный кирпич +Cracked Pink Granite Brick=РаÑтреÑкавшийÑÑ Ñ€Ð¾Ð·Ð¾Ð²Ñ‹Ð¹ гранитный кирпич +Cobbled Pink Granite=Выложенный розовый гранит + +Red Granite=КраÑный гранит +Red Granite Block=Блок краÑного гранита +Red Granite Brick=КраÑный гранитный кирпич +Cracked Red Granite Brick=РаÑтреÑкавшийÑÑ ÐºÑ€Ð°Ñный гранитный кирпич +Cobbled Red Granite=Выложенный краÑный гранит + +White Granite=Белый гранит +White Granite Block=Блок белого гранита +White Granite Brick=Белый гранитный кирпич +Cracked White Granite Brick=РаÑтреÑкавшийÑÑ Ð±ÐµÐ»Ñ‹Ð¹ гранитный кирпич +Cobbled White Granite=Выложенный белый гранит + +Yellow Granite=Желтый гранит +Yellow Granite Block=Блок желтого гранита +Yellow Granite Brick=Желтый гранитный кирпич +Cracked Yellow Granite Brick=РаÑтреÑкавшийÑÑ Ð¶ÐµÐ»Ñ‚Ñ‹Ð¹ гранитный кирпич +Cobbled Yellow Granite=Выложенный желтый гранит + +Heliodor=Гелиодор +Heliodor Block=Блок гелиодора +Heliodor Brick=Гелиодорный кирпич +Cracked Heliodor Brick=РаÑтреÑкавшийÑÑ Ð³ÐµÐ»Ð¸Ð¾Ð´Ð¾Ñ€Ð½Ñ‹Ð¹ кирпич + +Ilvaite=Ильваит +Ilvaite Block=Блок ильваита +Ilvaite Brick=Кирпич из ильваита +Cracked Ilvaite Brick=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ из ильваита +Cobbled Ilvaite=Мощеный ильваитом + +Jade=Ðефрит +Jade Block=Блок нефрита +Jade Brick=Кирпич из нефрита +Cracked Jade Brick=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ из нефрита +Cobbled Jade=Мощеный нефритом + +Red Jasper=КраÑный Яшма +Red Jasper Block=Блок КраÑного Яшмы +Red Jasper Brick=Кирпич КраÑного Яшмы +Cracked Red Jasper Brick=ТреÑнутый Кирпич КраÑного Яшмы +Cobbled Red Jasper=БруÑчатка КраÑного Яшмы + +Kyanite=Кианит +Kyanite Block=Блок кианита +Kyanite Brick=Кирпич из кианита +Cracked Kyanite Brick=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ из кианита +Cobbled Kyanite=Мощеный кианитом + +Lapis Lazuli=Лазурит +Lapis Lazuli Block=Блок лазурита +Lapis Lazuli Brick=Кирпич из лазурита +Cracked Lapis Lazuli Brick=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ из лазурита + +Lepidolite=Лепидолит +Lepidolite Block=Блок лепидолита +Lepidolite Brick=Лепидолитовый кирпич +Cracked Lepidolite Brick=ТреÑнутый лепидолитовый кирпич +Cobbled Lepidolite=БруÑчатка лепидолита + +Blue Limestone=Голубой извеÑтнÑк +Blue Limestone Block=Блок голубого извеÑтнÑка +Blue Limestone Brick=Кирпич из голубого извеÑтнÑка +Cracked Blue Limestone Brick=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ из голубого извеÑтнÑка +Cobbled Blue Limestone=Мощеный голубым извеÑтнÑком + +White Limestone=Белый ИзвеÑтнÑк +White Limestone Block=Блок Белого ИзвеÑтнÑка +White Limestone Brick=Кирпич Белого ИзвеÑтнÑка +Cracked White Limestone Brick=ТреÑнувший Кирпич Белого ИзвеÑтнÑка +Cobbled White Limestone=Мощеный Белый ИзвеÑтнÑк + +Marble=Мрамор +Marble Block=Блок Мрамора +Marble Brick=Кирпич Мрамора +Cracked Marble Brick=ТреÑнувший Кирпич Мрамора +Cobbled Marble=Мощеный Мрамор + +Moonstone=Лунный камень +Moonstone Block=Блок лунного ÐºÐ°Ð¼Ð½Ñ +Moonstone Brick=Лунный камень из кирпича +Cracked Moonstone Brick=ТреÑнутый лунный каменный кирпич + +Morion Quartz=Морионовый Кварц +Morion Quartz Block=Блок Морионового Кварца +Morion Quartz Brick=Кирпич Морионового Кварца +Cracked Morion Quartz Brick=Разбитый кирпич Морионового Кварца + +Mudstone=ИлиÑтый Камень +Mudstone Block=Блок ИлиÑтого ÐšÐ°Ð¼Ð½Ñ +Cobbled Mudstone=Мощеный ИлиÑтый Камень +Mudstone Brick=Кирпич ИлиÑтого ÐšÐ°Ð¼Ð½Ñ +Cracked Mudstone Brick=ТреÑнувший Кирпич ИлиÑтого ÐšÐ°Ð¼Ð½Ñ + +Opal=Опал + +Picture Jasper=Картина Ñшма + +Prasiolite=Празеолит +Prasiolite Block=Блок Празеолита +Prasiolite Brick=Кирпич Празеолита +Cracked Prasiolite Brick=ТреÑнувший Кирпич Празеолита + +Pumice=Пемза +Pumice Block=Блок Пемзы +Pumice Brick=Кирпич Пемзы +Cracked Pumice Brick=ТреÑнувший Кирпич Пемзы + +Pyrite=Пирит +Pyrite Block=Блок Пирита +Cobbled Pyrite=Мощеный Пирит +Pyrite Brick=Кирпич Пирита +Cracked Pyrite Brick=ТреÑнувший Кирпич Пирита + +Quartz=Кварц +Quartz Block=Блок Кварца +Quartz Brick=Кирпич Кварца +Cracked Quartz Brick=ТреÑнувший Кирпич Кварца + +Rhodonite=Родонит +Rhodonite Block=Блок родонита +Rhodonite Brick=Родонитовый кирпич +Cracked Rhodonite Brick=ТреÑнутый родонитовый кирпич +Cobbled Rhodonite=БруÑчатка родонита + +Rose Quartz=Розовый кварц +Rose Quartz Block=Блок розового кварца +Rose Quartz Brick=Кирпич розового кварца +Cracked Rose Quartz Brick=Разбитый кирпич розового кварца + +Scoria=Ð¡ÐºÐ¾Ñ€Ð¸Ñ +Scoria Block=Блок Ñкории +Scoria Brick=Кирпич Ñкории +Cracked Scoria Brick=Разбитый кирпич Ñкории +Cobbled Scoria=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÑÐºÐ¾Ñ€Ð¸Ñ + +Serpentine=Серпентинит +Serpentine Block=Блок Ñерпентинита +Cobbled Serpentine=Мощеный Ñерпентинит +Serpentine Brick=Кирпич Ñерпентинита +Cracked Serpentine Brick=Разбитый кирпич Ñерпентинита + +Shale=Сланец +Shale Block=Сланцевый блок +Shale Brick=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡ +Cracked Shale Brick=ТреÑнувший Ñланцевый кирпич +Cobbled Shale=Вымощенный Ñланец + +Slate=Сланец +Slate Block=Блок Ñланца +Slate Brick=Кирпич Ñланца +Cracked Slate Brick=Разбитый кирпич Ñланца +Cobbled Slate=Мощеный Ñланец +Slate Tile=Плитка из Ñланца + +Smokey Quartz=Дымчатый кварц +Smokey Quartz Block=Блок дымчатого кварца +Smokey Quartz Brick=Кирпич дымчатого кварца +Cracked Smokey Quartz Brick=Разбитый кирпич дымчатого кварца + +Soapstone=Степень +Soapstone Block=Блок ÑÑ‚ÐµÐ¿ÐµÐ½Ñ +Soapstone Brick=Кирпич ÑÑ‚ÐµÐ¿ÐµÐ½Ñ +Cracked Soapstone Brick=Разбитый кирпич ÑÑ‚ÐµÐ¿ÐµÐ½Ñ + +Sodalite=Содалит +Sodalite Block=Блок Ñодалита +Cobbled Sodalite=Мощеный Ñодалит +Sodalite Brick=Кирпич Ñодалита +Cracked Sodalite Brick=Разбитый кирпич Ñодалита + +Sugilite=Сугилит +Sugilite Block=Блок Ñугилита +Sugilite Brick=Кирпич Ñугилита +Cracked Sugilite Brick=Разбитый кирпич Ñугилита +Cobbled Sugilite=Мощеный Ñугилит + +Green Tourmaline=Зеленый турмалин +Green Tourmaline Block=Блок зеленого турмалина +Green Tourmaline Brick=Зеленый турмалиновый кирпич +Cracked Green Tourmaline Brick=ТреÑнутый зеленый турмалиновый кирпич + +Paraiba Tourmaline=Парайба турмалин +Paraiba Tourmaline Block=Блок парайба турмалина +Paraiba Tourmaline Brick=Парайба турмалиновый кирпич +Cracked Paraiba Tourmaline Brick=ТреÑнутый парайба турмалиновый кирпич + +Pink Tourmaline=Розовый турмалин +Pink Tourmaline Block=Блок розового турмалина +Pink Tourmaline Brick=Розовый турмалиновый кирпич +Cracked Pink Tourmaline Brick=ТреÑнутый розовый турмалиновый кирпич + +Travertine=Травертин +Travertine Block=Блок травертина +Cobbled Travertine=Мощеный травертин +Travertine Brick=Кирпич травертина +Cracked Travertine Brick=Разбитый кирпич травертина + +Yellow Travertine=Желтый травертин +Yellow Travertine Block=Блок желтого травертина +Cobbled Yellow Travertine=Мощеный желтый травертин +Yellow Travertine Brick=Желтый кирпич травертина +Cracked Yellow Travertine Brick=Разбитый желтый кирпич травертина + +Beige Tuff=Бежевый туф +Beige Tuff Block=Блок бежевого туфа +Cobbled Beige Tuff=Мощеный бежевый туф +Beige Tuff Brick=Кирпич бежевого туфа +Cracked Beige Tuff=Разбитый кирпич бежевого туфа + +Grey Tuff=Серый туф +Grey Tuff Block=Блок Ñерого туфа +Cobbled Grey Tuff=Мощеный Ñерый туф +Grey Tuff Brick=Кирпич Ñерого туфа +Cracked Grey Tuff=Разбитый кирпич Ñерого туфа + +Red Tuff=КраÑный туф +Red Tuff Block=Блок краÑного туфа +Cobbled Red Tuff=Мощеный краÑный туф +Red Tuff Brick=Кирпич краÑного туфа +Cracked Red Tuff=Разбитый кирпич краÑного туфа + +Turquoise=Бирюза +Turquoise Block=Блок бирюзы +Turquoise Brick=Кирпич бирюзы +Cracked Turquoise Brick=Разбитый кирпич бирюзы +Cobbled Turquoise=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±Ð¸Ñ€ÑŽÐ·Ð° +Turquoise Pebble=Бирюзовый камушек + +Vivianite=Вивианит +Vivianite Block=Блок вивианита +Vivianite Brick=Кирпич вивианита +Cracked Vivianite Brick=Разбитый кирпич вивианита + +### wall.lua ### + +Blue Agate Wall=СинÑÑ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Gray Agate Wall=Ð¡ÐµÑ€Ð°Ñ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Green Agate Wall=Ð—ÐµÐ»ÐµÐ½Ð°Ñ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Moss Agate Wall=ÐœÐ¾Ñ…Ð¾Ð²Ð°Ñ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Orange Agate Wall=ÐžÑ€Ð°Ð½Ð¶ÐµÐ²Ð°Ñ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Purple Agate Wall=Ð¤Ð¸Ð¾Ð»ÐµÑ‚Ð¾Ð²Ð°Ñ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Red Agate Wall=КраÑÐ½Ð°Ñ Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Amazonite Wall=ÐÐ¼Ð°Ð·Ð¾Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Cobbled Amazonite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð°Ð¼Ð°Ð·Ð¾Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Amazonite Brick Wall=Кирпич амазонитовой Ñтены +Amazonite Block Wall=Блок амазонитовой Ñтены +Cracked Amazonite Brick Wall=Разбитый кирпич амазонитовой Ñтены + +Amber Wall=Ð¯Ð½Ñ‚Ð°Ñ€Ð½Ð°Ñ Ñтена +Amber Brick Wall=Кирпич Ñнтарной Ñтены +Amber Block Wall=Блок Ñнтарной Ñтены +Cracked Amber Brick Wall=Разбитый кирпич Ñнтарной Ñтены + +Amethyst Wall=ÐметиÑÑ‚Ð¾Ð²Ð°Ñ Ñтена +Amethyst Brick Wall=Кирпич аметиÑтовой Ñтены +Amethyst Block Wall=Блок аметиÑтовой Ñтены +Cracked Amethyst Brick Wall=Разбитый кирпич аметиÑтовой Ñтены + +Andesite Wall=ÐÐ½Ð´ÐµÐ·Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Andesite Block Wall=Блок андезитовой Ñтены +Andesite Brick Wall=Кирпич андезитовой Ñтены +Cracked Andesite Brick Wall=Разбитый кирпич андезитовой Ñтены +Cobbled Andesite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð°Ð½Ð´ÐµÐ·Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Basalt Wall=Ð‘Ð°Ð·Ð°Ð»ÑŒÑ‚Ð¾Ð²Ð°Ñ Ñтена +Basalt Block Wall=Блок базальтовой Ñтены +Basalt Brick Wall=Кирпич базальтовой Ñтены +Cracked Basalt Brick Wall=Разбитый кирпич базальтовой Ñтены +Cobbled Basalt Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±Ð°Ð·Ð°Ð»ÑŒÑ‚Ð¾Ð²Ð°Ñ Ñтена +Basalt Tile Wall=Стена из плитки из базальта + +Black Moonstone Wall=Ð§ÐµÑ€Ð½Ð°Ñ Ð»ÑƒÐ½Ð½Ñ‹Ð¹ камень Ñтена +Black Moonstone Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из черного лунного ÐºÐ°Ð¼Ð½Ñ +Black Moonstone Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из черного лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Black Moonstone Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из черного лунного ÐºÐ°Ð¼Ð½Ñ + +Grey Calcite Wall=Стена Серого Кальцита +Grey Calcite Brick Wall=Стена Кирпича Серого Кальцита +Grey Calcite Block Wall=Стена Блока Серого Кальцита +Cracked Grey Calcite Brick Wall=Стена ТреÑнутого Кирпича Серого Кальцита + +Calcite Wall=ÐšÐ°Ð»ÑŒÑ†Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Calcite Brick Wall=Кирпич кальцитовой Ñтены +Calcite Block Wall=Блок кальцитовой Ñтены +Cracked Calcite Brick Wall=Разбитый кирпич кальцитовой Ñтены + +Orange Calcite Wall=Стена Оранжевого Кальцита +Orange Calcite Brick Wall=Стена Кирпича Оранжевого Кальцита +Orange Calcite Block Wall=Стена Блока Оранжевого Кальцита +Cracked Orange Calcite Brick Wall=Стена ТреÑнутого Кирпича Оранжевого Кальцита + +Carnotite Wall=ÐšÐ°Ñ€Ð½Ð¾Ñ‚Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Carnotite Brick Wall=Кирпич карнотитовой Ñтены +Carnotite Block Wall=Блок карнотитовой Ñтены +Cracked Carnotite Brick Wall=Разбитый кирпич карнотитовой Ñтены +Cobbled Carnotite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÐ°Ñ€Ð½Ð¾Ñ‚Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Celestine Wall=ЦелеÑÑ‚Ð¸Ð½Ð¾Ð²Ð°Ñ Ñтена +Celestine Brick Wall=Кирпич целеÑтиновой Ñтены +Celestine Block Wall=Блок целеÑтиновой Ñтены +Cracked Celestine Brick Wall=Разбитый кирпич целеÑтиновой Ñтены + +Chalcanthite Wall=Стена Халкантита +Chalcanthite Brick Wall=Стена Кирпича Халкантита +Chalcanthite Block Wall=Стена Блока Халкантита +Cracked Chalcanthite Brick Wall=Стена ТреÑнутого Кирпича Халкантита +Cobbled Chalcanthite Wall=Стена БруÑчатки Халкантита + +Chrysoprase Wall=Ð¥Ñ€Ð¸Ð·Ð¾Ð¿Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ Ñтена +Chrysoprase Brick Wall=Кирпич хризопразовой Ñтены +Chrysoprase Block Wall=Блок хризопразовой Ñтены +Cracked Chrysoprase Brick Wall=Разбитый кирпич хризопразовой Ñтены + +Citrine Wall=Ð¦Ð¸Ñ‚Ñ€Ð¸Ð½Ð¾Ð²Ð°Ñ Ñтена +Citrine Brick Wall=Кирпич цитриновой Ñтены +Citrine Block Wall=Блок цитриновой Ñтены +Cracked Citrine Brick Wall=Разбитый кирпич цитриновой Ñтены + +Covellite Wall=ÐšÐ¾Ð²ÐµÐ»Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Covellite Brick Wall=Кирпич ковеллитовой Ñтены +Covellite Block Wall=Блок ковеллитовой Ñтены +Cracked Covellite Brick Wall=Разбитый кирпич ковеллитовой Ñтены +Cobbled Covellite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÐ¾Ð²ÐµÐ»Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Crocoite Wall=ÐšÑ€Ð¾ÐºÐ¾Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Crocoite Brick Wall=Кирпич крокоитовой Ñтены +Crocoite Block Wall=Блок крокоитовой Ñтены +Cracked Crocoite Brick Wall=Разбитый кирпич крокоитовой Ñтены + +Diorite Wall=Ð”Ð¸Ð¾Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена Ñтена +Diorite Brick Wall=Ð”Ð¸Ð¾Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Diorite Block Wall=Ð”Ð¸Ð¾Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена +Cracked Diorite Brick Wall=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð´Ð¸Ð¾Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Cobbled Diorite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð´Ð¸Ð¾Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Erythrite Wall=Ð­Ñ€Ð¸Ñ‚Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Erythrite Brick Wall=Кирпич Ñритритовой Ñтены +Erythrite Block Wall=Блок Ñритритовой Ñтены +Cracked Erythrite Brick Wall=Разбитый кирпич Ñритритовой Ñтены + +Eudialite Wall=Ð­ÑƒÐ´Ð¸Ð°Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Eudialite Brick Wall=Кирпич Ñудиалитовой Ñтены +Eudialite Block Wall=Блок Ñудиалитовой Ñтены +Cracked Eudialite Brick Wall=Разбитый кирпич Ñудиалитовой Ñтены + +Fluorite Wall=Стена из флюорита +Fluorite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из флюорита +Fluorite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из флюорита +Cracked Fluorite Brick Wall=Разбитый кирпичный забор из флюорита + +Gabbro Wall=Габбро Ñтена +Cobbled Gabbro Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð³Ð°Ð±Ð±Ñ€Ð¾ Ñтена +Gabbro Brick Wall=Кирпич габбро Ñтены +Gabbro Block Wall=Блок габбро Ñтены +Cracked Gabbro Brick Wall=Разбитый кирпич габбро Ñтены + +Galena Wall=Ð“Ð°Ð»ÐµÐ½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Galena Brick Wall=Кирпич галенитовой Ñтены +Galena Block Wall=Блок галенитовой Ñтены +Cracked Galena Brick Wall=Разбитый кирпич галенитовой Ñтены + +Black Granite Wall=Ð§ÐµÑ€Ð½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Black Granite Brick Wall=Кирпич черной гранитной Ñтены +Black Granite Block Wall=Блок черной гранитной Ñтены +Cracked Black Granite Brick Wall=Разбитый кирпич черной гранитной Ñтены +Cobbled Black Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñ‡ÐµÑ€Ð½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Blue Granite Wall=Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Blue Granite Brick Wall=Кирпич голубой гранитной Ñтены +Blue Granite Block Wall=Блок голубой гранитной Ñтены +Cracked Blue Granite Brick Wall=Разбитый кирпич голубой гранитной Ñтены +Cobbled Blue Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð³Ð¾Ð»ÑƒÐ±Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Gray Granite Wall=Ð¡ÐµÑ€Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Gray Granite Brick Wall=Кирпич Ñерой гранитной Ñтены +Gray Granite Block Wall=Блок Ñерой гранитной Ñтены +Cracked Gray Granite Brick Wall=Разбитый кирпич Ñерой гранитной Ñтены +Cobble Gray Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÑÐµÑ€Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Green Granite Wall=Ð—ÐµÐ»ÐµÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Green Granite Brick Wall=Кирпич зеленой гранитной Ñтены +Green Granite Block Wall=Блок зеленой гранитной Ñтены +Cracked Green Granite Brick Wall=Разбитый кирпич зеленой гранитной Ñтены +Cobbled Green Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Pink Granite Wall=Ð Ð¾Ð·Ð¾Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Pink Granite Brick Wall=Кирпич розовой гранитной Ñтены +Pink Granite Block Wall=Блок розовой гранитной Ñтены +Cracked Pink Granite Brick Wall=Разбитый кирпич розовой гранитной Ñтены +Cobbled Pink Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñ€Ð¾Ð·Ð¾Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Red Granite Wall=КраÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Red Granite Brick Wall=КраÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Red Granite Block Wall=КраÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена +Cracked Red Granite Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Cobbled Red Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +White Granite Wall=Ð‘ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +White Granite Brick Wall=Ð‘ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +White Granite Block Wall=Ð‘ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена из блоков +Cracked White Granite Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из белого гранита +Cobbled White Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Yellow Granite Wall=Ð–ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена +Yellow Granite Brick Wall=Ð–ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Yellow Granite Block Wall=Ð–ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена из блоков +Cracked Yellow Granite Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ Ð¶ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Cobbled Yellow Granite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¶ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ñтена + +Heliodor Wall=Стена из гелиодора +Heliodor Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из гелиодора +Heliodor Block Wall=Стена из блоков гелиодора +Cracked Heliodor Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из гелиодора + +Howlite Wall=Стена из хаулита +Howlite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из хаулита +Howlite Block Wall=Стена из блоков хаулита +Cracked Howlite Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из хаулита +Cobbled Howlite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена из хаулита + +Ilvaite Wall=Стена из ильваита +Ilvaite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из ильваита +Ilvaite Block Wall=Стена из блоков ильваита +Cracked Ilvaite Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из ильваита +Cobbled Ilvaite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена из ильваита + +Jade Wall=Стена из нефрита +Jade Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из нефрита +Jade Block Wall=Стена из блоков нефрита +Cracked Jade Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из нефрита +Cobbled Jade Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена из нефрита + +Red Jasper Wall=Стена КраÑного Яшмы +Red Jasper Brick Wall=Стена Кирпича КраÑного Яшмы +Red Jasper Block Wall=Стена Блока КраÑного Яшмы +Cracked Red Jasper Brick Wall=Стена ТреÑнутого Кирпича КраÑного Яшмы +Cobbled Red Jasper Wall=Стена БруÑчатки КраÑного Яшмы + +Kyanite Wall=ÐšÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Kyanite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Kyanite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ ÐºÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Cracked Kyanite Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Cobbled Kyanite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Lapis Lazuli Wall=Ð›Ð°Ð·ÑƒÑ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Lapis Lazuli Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»Ð°Ð·ÑƒÑ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Lapis Lazuli Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð°Ð·ÑƒÑ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена +Cracked Lapis Lazuli Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»Ð°Ð·ÑƒÑ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтена + +Lepidolite Wall=Стена лепидолита +Lepidolite Brick Wall=Стена из лепидолитового кирпича +Lepidolite Block Wall=Стена из блока лепидолита +Cracked Lepidolite Brick Wall=Стена из треÑнутого лепидолитового кирпича +Cobbled Lepidolite Wall=Стена из бруÑчатки лепидолита + +Blue Limestone Wall=СинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +Blue Limestone Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÑинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +Blue Limestone Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ ÑинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +Cracked Blue Limestone Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÑинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +Cobbled Blue Limestone Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÑинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена + +White Limestone Wall=Ð‘ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +White Limestone Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +White Limestone Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +Cracked White Limestone Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена +Cobbled White Limestone Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ñтена + +Marble Wall=ÐœÑ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ñтена +Marble Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ñтена +Marble Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ñтена +Cracked Marble Brick Wall=ТреÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ñтена +Cobbled Marble Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ñтена + +Moonstone Wall=Стена из лунного ÐºÐ°Ð¼Ð½Ñ +Moonstone Brick Wall=Стена из лунного кирпича +Moonstone Block Wall=Стена из блока лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Moonstone Brick Wall=Стена из треÑнутого лунного каменного кирпича + +Morion Quartz Wall=Стена из Морионового Кварца +Morion Quartz Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из Морионового Кварца +Morion Quartz Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из Морионового Кварца +Cracked Morion Quartz Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из Морионового Кварца + +Mudstone Wall=Стена из илацита +Cobbled Mudstone Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена из илацита +Mudstone Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из илацита +Mudstone Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из илацита +Cracked Mudstone Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из илацита + +Prasiolite Wall=Стена из празиолита +Prasiolite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из празиолита +Prasiolite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из празиолита +Cracked Prasiolite Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из празиолита + +Pumice Wall=Стена из пемзы +Pumice Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из пемзы +Pumice Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из пемзы +Cracked Pumice Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из пемзы + +Pyrite Wall=Стена из пирита +Pyrite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из пирита +Pyrite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из пирита +Cracked Pyrite Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из пирита + +Quartz Wall=Стена из кварца +Quartz Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из кварца +Quartz Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из кварца +Cracked Quartz Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из кварца + +Rhodonite Wall=Стена из родонита +Rhodonite Brick Wall=Стена из родонитового кирпича +Rhodonite Block Wall=Стена из блока родонита +Cracked Rhodonite Brick Wall=Стена из треÑнутого родонитового кирпича +Cobbled Rhodonite Wall=Стена из бруÑчатки родонита + +Rose Quartz Wall=Стена из розового кварца +Rose Quartz Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из розового кварца +Rose Quartz Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из розового кварца +Cracked Rose Quartz Brick Wall=Ð Ð°Ð·Ð±Ð¸Ñ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из розового кварца + +Scoria Wall=Стена Ñкории +Scoria Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñкории +Scoria Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена Ñкории +Cracked Scoria Brick Wall=ТреÑнувший кирпич Ñтены Ñкории +Cobbled Scoria Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена Ñкории + +Serpentine Wall=Стена Ñерпентинита +Cobbled Serpentine Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена Ñерпентинита +Serpentine Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñерпентинита +Serpentine Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена Ñерпентинита +Cracked Serpentine Brick Wall=ТреÑнувший кирпич Ñтены Ñерпентинита + +Shale Wall=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ñтена +Shale Brick Wall=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена +Shale Block Wall=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ ÑÑ‚ÐµÐ½Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cracked Shale Brick Wall=Стена из треÑнувшего Ñланцевого кирпича +Cobbled Shale Wall=Ð’Ñ‹Ð¼Ð¾Ñ‰ÐµÐ½Ð½Ð°Ñ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ñтена + +Slate Wall=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ñтена +Slate Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñланца +Slate Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена Ñланца +Cracked Slate Brick Wall=ТреÑнувший кирпич Ñтены Ñланца +Cobbled Slate Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена Ñланца +Slate Tile Wall=Стена из Ñланцевых плит + +Smokey Quartz Wall=Стена дымчатого кварца +Smokey Quartz Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена дымчатого кварца +Smokey Quartz Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена дымчатого кварца +Cracked Smokey Quartz Brick Wall=ТреÑнувший кирпич Ñтены дымчатого кварца + +Soapstone Wall=Стена мыльного ÐºÐ°Ð¼Ð½Ñ +Soapstone Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена мыльного ÐºÐ°Ð¼Ð½Ñ +Soapstone Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена мыльного ÐºÐ°Ð¼Ð½Ñ +Cracked Soapstone Brick Wall=ТреÑнувший кирпич Ñтены мыльного ÐºÐ°Ð¼Ð½Ñ + +Sodalite Wall=Стена Ñодалита +Cobbled Sodalite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена Ñодалита +Sodalite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñодалита +Sodalite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена Ñодалита +Cracked Sodalite Brick Wall=ТреÑнувший кирпич Ñтены Ñодалита + +Sugilite Wall=Стена Ñугилита +Sugilite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñугилита +Sugilite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена Ñугилита +Cracked Sugilite Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñугилита +Cobbled Sugilite Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена Ñугилита + +Green Tourmaline Wall=Стена из зеленого турмалина +Green Tourmaline Brick Wall=Стена из зеленого турмалинового кирпича +Green Tourmaline Block Wall=Стена из блока зеленого турмалина +Cracked Green Tourmaline Brick Wall=Стена из треÑнутого зеленого турмалинового кирпича + +Paraiba Tourmaline Wall=Стена из парайба турмалина +Paraiba Tourmaline Brick Wall=Стена из парайба турмалинового кирпича +Paraiba Tourmaline Block Wall=Стена из блока парайба турмалина +Cracked Paraiba Tourmaline Brick Wall=Стена из треÑнутого парайба турмалинового кирпича + +Pink Tourmaline Wall=Стена из розового турмалина +Pink Tourmaline Brick Wall=Стена из розового турмалинового кирпича +Pink Tourmaline Block Wall=Стена из блока розового турмалина +Cracked Pink Tourmaline Brick Wall=Стена из треÑнутого розового турмалинового кирпича + +Travertine Wall=Стена травертина +Cobbled Travertine Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена травертина +Travertine Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена травертина +Travertine Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена травертина +Cracked Travertine Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена травертина + +Yellow Travertine Wall=Стена из желтого травертина +Cobbled Yellow Travertine Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена из желтого травертина +Yellow Travertine Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из желтого травертина +Yellow Travertine Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена из желтого травертина +Cracked Yellow Travertine Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена из желтого травертина + +Beige Tuff Wall=Стена бежевого туфа +Cobbled Beige Tuff Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена бежевого туфа +Beige Tuff Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена бежевого туфа +Beige Tuff Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена бежевого туфа +Cracked Beige Tuff Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена бежевого туфа + +Grey Tuff Wall=Стена Ñерого туфа +Cobbled Grey Tuff Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена Ñерого туфа +Grey Tuff Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена Ñерого туфа +Grey Tuff Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñерого туфа +Cracked Grey Tuff Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена Ñерого туфа + +Red Tuff Wall=Стена краÑного туфа +Cobbled Red Tuff Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена краÑного туфа +Red Tuff Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена краÑного туфа +Red Tuff Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена краÑного туфа +Cracked Red Tuff Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена краÑного туфа + +Turquoise Wall=Стена бирюзового ÐºÐ°Ð¼Ð½Ñ +Turquoise Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена бирюзового ÐºÐ°Ð¼Ð½Ñ +Turquoise Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена бирюзового ÐºÐ°Ð¼Ð½Ñ +Cracked Turquoise Brick Wall=С трещинами ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена бирюзового ÐºÐ°Ð¼Ð½Ñ +Cobbled Turquoise Wall=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñтена бирюзового ÐºÐ°Ð¼Ð½Ñ + +Vivianite Wall=Стена вивианита +Vivianite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена вивианита +Vivianite Block Wall=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ñтена вивианита +Cracked Vivianite Brick Wall=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ñтена вивианита Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +### stairs.lua ### + +Blue Agate Slab=СлÑб из Ñинего агата +Gray Agate Slab=СлÑб из Ñерого агата +Green Agate Slab=СлÑб из зеленого агата +Moss Agate Slab=СлÑб из мохового агата +Orange Agate Slab=СлÑб из оранжевого агата +Purple Agate Slab=СлÑб из фиолетового агата +Red Agate Slab=СлÑб из краÑного агата + +Amazonite Slab=СлÑб амазонита +Cobbled Amazonite Slab=Мощеный ÑлÑб амазонита +Amazonite Brick Slab=СлÑб кирпича амазонита +Amazonite Block Slab=СлÑб блока амазонита +Cracked Amazonite Brick Slab=СлÑб треÑнувшего кирпича амазонита + +Amber Slab=СлÑб ÑÐ½Ñ‚Ð°Ñ€Ñ +Amber Brick Slab=СлÑб кирпича ÑÐ½Ñ‚Ð°Ñ€Ñ +Amber Block Slab=СлÑб блока ÑÐ½Ñ‚Ð°Ñ€Ñ +Cracked Amber Brick Slab=СлÑб треÑнувшего кирпича ÑÐ½Ñ‚Ð°Ñ€Ñ + +Amethyst Slab=СлÑб аметиÑта +Amethyst Brick Slab=СлÑб кирпича аметиÑта +Amethyst Block Slab=СлÑб блока аметиÑта +Cracked Amethyst Brick Slab=СлÑб треÑнувшего кирпича аметиÑта + +Andesite Slab=СлÑб андезита +Andesite Block Slab=СлÑб блока андезита +Cobbled Andesite Slab=Мощеный ÑлÑб андезита +Andesite Brick Slab=СлÑб кирпича андезита +Cobbled Andesite Brick Slab=Мощеный ÑлÑб кирпича андезита + +Basalt Slab=СлÑб базальта +Basalt Block Slab=СлÑб блока базальта +Basalt Brick Slab=СлÑб кирпича базальта +Cracked Basalt Brick Slab=СлÑб треÑнувшего кирпича базальта +Cobbled Basalt Slab=Мощеный ÑлÑб базальта +Basalt Tile Slab=Плитка из базальта + +Black Moonstone Slab=СлÑб из черного лунного ÐºÐ°Ð¼Ð½Ñ +Black Moonstone Brick Slab=СлÑб кирпича из черного лунного ÐºÐ°Ð¼Ð½Ñ +Black Moonstone Block Slab=СлÑб блока из черного лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Black Moonstone Brick Slab=СлÑб треÑнувшего кирпича из черного лунного ÐºÐ°Ð¼Ð½Ñ + +Grey Calcite Slab=Плита Серого Кальцита +Grey Calcite Brick Slab=Плита Кирпича Серого Кальцита +Grey Calcite Block Slab=Плита Блока Серого Кальцита +Cracked Grey Calcite Brick Slab=Плита ТреÑнутого Кирпича Серого Кальцита + +Calcite Slab=СлÑб кальцита +Calcite Brick Slab=СлÑб кирпича кальцита +Calcite Block Slab=СлÑб блока кальцита +Cracked Calcite Brick Slab=СлÑб треÑнувшего кирпича кальцита + +Orange Calcite Slab=Плита Оранжевого Кальцита +Orange Calcite Brick Slab=Плита Кирпича Оранжевого Кальцита +Orange Calcite Block Slab=Плита Блока Оранжевого Кальцита +Cracked Orange Calcite Brick Slab=Плита ТреÑнутого Кирпича Оранжевого Кальцита + +Carnotite Slab=Плита карнотита +Carnotite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° карнотита +Carnotite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° карнотита +Cracked Carnotite Brick Slab=ПотреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° карнотита +Cobbled Carnotite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° карнотита + +Celestine Slab=Плита целеÑтита +Celestine Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° целеÑтита +Celestine Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° целеÑтита +Cracked Celestine Brick Slab=ПотреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° целеÑтита + +Chalcanthite Slab=Плита Халкантита +Chalcanthite Brick Slab=Плита Кирпича Халкантита +Chalcanthite Block Slab=Плита Блока Халкантита +Cracked Chalcanthite Brick Slab=Плита ТреÑнутого Кирпича Халкантита +Cobbled Chalcanthite Slab=Плита БруÑчатки Халкантита + +Chrysoprase Slab=Плита хризопраза +Chrysoprase Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хризопраза +Chrysoprase Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хризопраза +Cracked Chrysoprase Brick Slab=ПотреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хризопраза + +Citrine Slab=Плита цитрина +Citrine Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° цитрина +Citrine Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° цитрина +Cracked Citrine Brick Slab=ПотреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° цитрина + +Covellite Slab=Плита ковеллита +Covellite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ковеллита +Covellite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ковеллита +Cracked Covellite Brick Slab=ПотреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ковеллита +Cobbled Covellite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ковеллита + +Crocoite Slab=Плита крокоита +Crocoite Brick Slab=Плита кирпича крокоита +Crocoite Block Slab=Плита блока крокоита +Cracked Crocoite Brick Slab=Плита кирпича крокоита Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +Diorite Slab=Плита Диорита +Diorite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° Диорита +Diorite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° Диорита +Cracked Diorite Brick Slab=ПотреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° Диорита +Cobbled Diorite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° Диорита + +Erythrite Slab=Плита Ñритрита +Erythrite Brick Slab=Плита кирпича Ñритрита +Erythrite Block Slab=Плита блока Ñритрита +Cracked Erythrite Brick Slab=Плита кирпича Ñритрита Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +Eudialite Slab=Плита Ñвдиалита +Eudialite Brick Slab=Плита кирпича Ñвдиалита +Eudialite Block Slab=Плита блока Ñвдиалита +Cracked Eudialite Brick Slab=Плита кирпича Ñвдиалита Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +Fluorite Slab=Плита флюорита +Fluorite Brick Slab=Плита кирпича флюорита +Fluorite Block Slab=Плита блока флюорита +Cracked Fluorite Brick Slab=Плита кирпича флюорита Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +Gabbro Slab=Плита габбро +Cobbled Gabbro Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° габбро +Gabbro Brick Slab=Плита кирпича габбро +Gabbro Block Slab=Плита блока габбро +Cracked Gabbro Brick Slab=Плита кирпича габбро Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +Galena Slab=Плита галены +Galena Brick Slab=Плита кирпича галены +Galena Block Slab=Плита блока галены +Cracked Galena Brick Slab=Плита кирпича галены Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ + +Black Granite Slab=Плита черного гранита +Black Granite Brick Slab=Плита кирпича черного гранита +Black Granite Block Slab=Плита блока черного гранита +Cracked Black Granite Brick Slab=Плита кирпича черного гранита Ñ Ñ‚Ñ€ÐµÑ‰Ð¸Ð½Ð°Ð¼Ð¸ +Cobbled Black Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñ‡ÐµÑ€Ð½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Blue Granite Slab=Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Blue Granite Brick Slab=Голубой кирпич гранитной плиты +Blue Granite Block Slab=Голубой блочный гранитный полуÑтиль +Cracked Blue Granite Brick Slab=С трещинами кирпич голубой гранитной плиты +Cobbled Blue Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð³Ð¾Ð»ÑƒÐ±Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Gray Granite Slab=Ð¡ÐµÑ€Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Gray Granite Brick Slab=Серый кирпич гранитной плиты +Gray Granite Block Slab=Серый блочный гранитный полуÑтиль +Cracked Gray Granite Brick Slab=С трещинами Ñерый кирпич гранитной плиты +Cobbled Gray Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÑÐµÑ€Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Green Granite Slab=Ð—ÐµÐ»ÐµÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Green Granite Brick Slab=Зеленый кирпич гранитной плиты +Green Granite Block Slab=Зеленый блочный гранитный полуÑтиль +Cracked Green Granite Brick Slab=С трещинами зеленый кирпич гранитной плиты +Cobbled Green Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Pink Granite Slab=Ð Ð¾Ð·Ð¾Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Pink Granite Brick Slab=Розовый кирпич гранитной плиты +Pink Granite Block Slab=Розовый блочный гранитный полуÑтиль +Cracked Pink Granite Brick Slab=С трещинами розовый кирпич гранитной плиты +Cobbled Pink Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ñ€Ð¾Ð·Ð¾Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Red Granite Slab=КраÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Red Granite Brick Slab=КраÑный кирпич гранитной плиты +Red Granite Block Slab=КраÑный блочный гранитный полуÑтиль +Cracked Red Granite Brick Slab=С трещинами краÑный кирпич гранитной плиты +Cobbled Red Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +White Granite Slab=Ð‘ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +White Granite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +White Granite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cracked White Granite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° Ñо трещинами +Cobbled White Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Yellow Granite Slab=Ð–ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Yellow Granite Brick Slab=Желтый кирпич гранитной плиты +Yellow Granite Block Slab=Желтый блочный гранитный полуÑтиль +Cracked Yellow Granite Brick Slab=С трещинами желтый кирпич гранитной плиты +Cobbled Yellow Granite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¶ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Heliodor Slab=Плита гелиодора +Heliodor Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° гелиодора +Heliodor Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° гелиодора +Cracked Heliodor Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° гелиодора Ñо трещинами + +Howlite Slab=Плита хаулита +Howlite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хаулита +Howlite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хаулита +Cracked Howlite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хаулита Ñо трещинами +Cobbled Howlite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° хаулита + +Ilvaite Slab=Плита ильвайта +Ilvaite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ильвайта +Ilvaite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ильвайта +Cracked Ilvaite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ильвайта Ñо трещинами +Cobbled Ilvaite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° ильвайта + +Jade Slab=Ð¯ÑˆÐ¼Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Jade Brick Slab=Яшмовый кирпич-плита +Jade Block Slab=Яшмовый блок-плита +Cracked Jade Brick Slab=ТреÑнувший Ñшмовый кирпич-плита +Cobbled Jade Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÑÑˆÐ¼Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Red Jasper Slab=Плита КраÑного Яшмы +Red Jasper Brick Slab=Плита Кирпича КраÑного Яшмы +Red Jasper Block Slab=Плита Блока КраÑного Яшмы +Cracked Red Jasper Brick Slab=Плита ТреÑнутого Кирпича КраÑного Яшмы +Cobbled Red Jasper Slab=Плита БруÑчатки КраÑного Яшмы + +Kyanite Slab=ÐšÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Kyanite Brick Slab=Кианитовый кирпич-плита +Kyanite Block Slab=Кианитовый блок-плита +Cracked Kyanite Brick Slab=ТреÑнувший кианитовый кирпич-плита +Cobbled Kyanite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÐ¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Lapis Lazuli Slab=Ð›Ð°Ð·ÑƒÑ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Lapis Lazuli Brick Slab=Лазуритовый кирпич-плита +Lapis Lazuli Block Slab=Лазуритовый блок-плита +Cracked Lapis Lazuli Brick Slab=ТреÑнувший лазуритовый кирпич-плита + +Lepidolite Slab=Плита из лепидолита +Lepidolite Brick Slab=Плита из лепидолитового кирпича +Lepidolite Block Slab=Плита из блока лепидолита +Cracked Lepidolite Brick Slab=Плита из треÑнутого лепидолитового кирпича +Cobbled Lepidolite Slab=Плита из бруÑчатки лепидолита + +Blue Limestone Slab=СинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Blue Limestone Brick Slab=Синий извеÑтнÑковый кирпич-плита +Blue Limestone Block Slab=Синий извеÑтнÑковый блок-плита +Cracked Blue Limestone Brick Slab=ТреÑнувший Ñиний извеÑтнÑковый кирпич-плита +Cobbled Blue Limestone Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÑинÑÑ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +White Limestone Slab=Ð‘ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +White Limestone Brick Slab=Белый извеÑтнÑковый кирпич-плита +White Limestone Block Slab=Белый извеÑтнÑковый блок-плита +Cracked White Limestone Brick Slab=ТреÑнувший белый извеÑтнÑковый кирпич-плита +Cobbled White Limestone Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Marble Slab=ÐœÑ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Marble Brick Slab=ÐœÑ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Marble Block Slab=Мраморный блочный ÑлÑб +Cracked Marble Brick Slab=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cobbled Marble Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Moonstone Slab=Плита из лунного ÐºÐ°Ð¼Ð½Ñ +Moonstone Brick Slab=Плита из лунного кирпича +Moonstone Block Slab=Плита из блока лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Moonstone Brick Slab=Плита из треÑнутого лунного каменного кирпича + +Morion Quartz Slab=СлÑб Морионового Кварца +Morion Quartz Brick Slab=Кирпичный ÑлÑб Морионового Кварца +Morion Quartz Block Slab=Блочный ÑлÑб Морионового Кварца +Cracked Morion Quartz Brick Slab=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ñ‹Ð¹ ÑлÑб Морионового Кварца + +Mudstone Slab=ИзвеÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cobbled Mudstone Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Mudstone Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Mudstone Block Slab=Блочный извеÑтнÑковый ÑлÑб +Cracked Mudstone Brick Slab=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð·Ð²ÐµÑтнÑÐºÐ¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Prasiolite Slab=ÐŸÑ€Ð°Ð·Ð¸Ð¾Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cobbled Prasiolite Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¿Ñ€Ð°Ð·Ð¸Ð¾Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Prasiolite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð·Ð¸Ð¾Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Prasiolite Block Slab=Блочный празиолитовый ÑлÑб +Cracked Prasiolite Brick Slab=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð·Ð¸Ð¾Ð»Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Pumice Slab=ÐŸÐµÐ¼Ð·Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Pumice Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿ÐµÐ¼Ð·Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Pumice Block Slab=Блочный пемзовый ÑлÑб +Cracked Pumice Brick Slab=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿ÐµÐ¼Ð·Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Pyrite Slab=ÐŸÐ¸Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Pyrite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð¸Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Pyrite Block Slab=Блочный пиритовый ÑлÑб +Cracked Pyrite Brick Slab=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð¸Ñ€Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Quartz Slab=ÐšÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Cobbled Quartz Slab=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ ÐºÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Quartz Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Quartz Block Slab=Блочный кварцевый ÑлÑб +Cracked Quartz Brick Slab=ТреÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Rhodonite Slab=Плита из родонита +Rhodonite Brick Slab=Плита из родонитового кирпича +Rhodonite Block Slab=Плита из блока родонита +Cracked Rhodonite Brick Slab=Плита из треÑнутого родонитового кирпича +Cobbled Rhodonite Slab=Плита из бруÑчатки родонита + +Rose Quartz Slab=СлÑб Розового Кварца +Rose Quartz Brick Slab=Кирпичный ÑлÑб Розового Кварца +Rose Quartz Block Slab=Блочный ÑлÑб Розового Кварца +Cracked Rose Quartz Brick Slab=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ñ‹Ð¹ ÑлÑб Розового Кварца + +Scoria Slab=СлÑб Скории +Scoria Brick Slab=Кирпичный ÑлÑб Скории +Scoria Block Slab=Блочный ÑлÑб Скории +Cracked Scoria Brick Slab=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ñ‹Ð¹ ÑлÑб Скории +Cobbled Scoria Slab=Мощеный ÑлÑб Скории + +Serpentine Slab=СлÑб Серпентина +Cobbled Serpentine Slab=Мощеный ÑлÑб Серпентина +Serpentine Brick Slab=Кирпичный ÑлÑб Серпентина +Serpentine Block Slab=Блочный ÑлÑб Серпентина +Cracked Serpentine Brick Slab=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ñ‹Ð¹ ÑлÑб Серпентина + +Shale Slab=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° +Shale Brick Slab=Плита из Ñланцевого кирпича +Shale Block Slab=Плита из Ñланцевого блока +Cracked Shale Brick Slab=Плита из треÑнувшего Ñланцевого кирпича +Cobbled Shale Slab=Ð’Ñ‹Ð¼Ð¾Ñ‰ÐµÐ½Ð½Ð°Ñ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° + +Slate Slab=СлÑб Сланца +Slate Brick Slab=Кирпичный ÑлÑб Сланца +Slate Block Slab=Блочный ÑлÑб Сланца +Cracked Slate Brick Slab=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ñ‹Ð¹ ÑлÑб Сланца +Cobbled Slate Slab=Мощеный ÑлÑб Сланца +Slate Tile Slab=СлÑб из Ñланцевых плит + +Smokey Quartz Slab=СлÑб Дымчатого Кварца +Smokey Quartz Brick Slab=Кирпичный ÑлÑб Дымчатого Кварца +Smokey Quartz Block Slab=Блочный ÑлÑб Дымчатого Кварца +Cracked Smokey Quartz Brick Slab=РаÑтреÑкавшийÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ñ‹Ð¹ ÑлÑб Дымчатого Кварца + +Soapstone Slab=СлÑб Мыльного ÐšÐ°Ð¼Ð½Ñ +Soapstone Brick Slab=Кирпичный ÑлÑб Мыльного ÐšÐ°Ð¼Ð½Ñ +Soapstone Block Slab=Блочный ÑлÑб Мыльного ÐšÐ°Ð¼Ð½Ñ +Cracked Soapstone Brick Slab=ТреÑнувший кирпичный ÑлÑб Мыльного ÐšÐ°Ð¼Ð½Ñ + +Sodalite Slab=Плита из Ñодалита +Cobbled Sodalite Slab=Плита из булыжника Ñодалита +Sodalite Brick Slab=Плита из кирпича Ñодалита +Sodalite Block Slab=Плита из блока Ñодалита +Cracked Sodalite Brick Slab=Плита из треÑнувшего кирпича Ñодалита + +Sugilite Slab=Плита из Ñугилита +Sugilite Brick Slab=Плита из кирпича Ñугилита +Sugilite Block Slab=Плита из блока Ñугилита +Cracked Sugilite Brick Slab=Плита из треÑнувшего кирпича Ñугилита +Cobbled Sugilite Slab=Плита из булыжника Ñугилита + +Green Tourmaline Slab=Плита из зеленого турмалина +Green Tourmaline Brick Slab=Плита из зеленого турмалинового кирпича +Green Tourmaline Block Slab=Плита из блока зеленого турмалина +Cracked Green Tourmaline Brick Slab=Плита из треÑнутого зеленого турмалинового кирпича + +Paraiba Tourmaline Slab=Плита из парайба турмалина +Paraiba Tourmaline Brick Slab=Плита из парайба турмалинового кирпича +Paraiba Tourmaline Block Slab=Плита из блока парайба турмалина +Cracked Paraiba Tourmaline Brick Slab=Плита из треÑнутого парайба турмалинового кирпича + +Pink Tourmaline Slab=Плита из розового турмалина +Pink Tourmaline Brick Slab=Плита из розового турмалинового кирпича +Pink Tourmaline Block Slab=Плита из блока розового турмалина +Cracked Pink Tourmaline Brick Slab=Плита из треÑнутого розового турмалинового кирпича + +Travertine Slab=Плита из травертина +Cobbled Travertine Slab=Плита из булыжника травертина +Travertine Brick Slab=Плита из кирпича травертина +Travertine Block Slab=Плита из блока травертина +Cracked Travertine Brick Slab=Плита из треÑнувшего кирпича травертина + +Yellow Travertine Slab=Плита из желтого травертина +Cobbled Yellow Travertine Slab=Плита из мощеного желтого травертина +Yellow Travertine Brick Slab=Плита из кирпича желтого травертина +Yellow Travertine Block Slab=Плита из блока желтого травертина +Cracked Yellow Travertine Brick Slab=Плита из треÑнувшего кирпича желтого травертина + +Beige Tuff Slab=Плита из бежевого туфа +Cobbled Beige Tuff Slab=Плита из булыжника бежевого туфа +Beige Tuff Block Slab=Плита из блока бежевого туфа +Beige Tuff Brick Slab=Плита из кирпича бежевого туфа +Cracked Beige Tuff Brick Slab=Плита из треÑнувшего кирпича бежевого туфа + +Grey Tuff Slab=Плита из Ñерого туфа +Cobbled Grey Tuff Slab=Плита из булыжника Ñерого туфа +Grey Tuff Block Slab=Плита из блока Ñерого туфа +Grey Tuff Brick Slab=Плита из кирпича Ñерого туфа +Cracked Grey Tuff Brick Slab=Плита из треÑнувшего кирпича Ñерого туфа + +Red Tuff Slab=Плита из краÑного туфа +Cobbled Red Tuff Slab=Плита из булыжника краÑного туфа +Red Tuff Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° из краÑного туфа +Red Tuff Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° из краÑного туфа +Cracked Red Tuff Brick Slab=Плита из треÑнувшего кирпича краÑного туфа + +Turquoise Slab=Плита из бирюзы +Turquoise Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° из бирюзы +Turquoise Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° из бирюзы +Cracked Turquoise Brick Slab=Плита из треÑнувшего кирпича бирюзы +Cobbled Turquoise Slab=Плита из булыжника бирюзы + +Vivianite Slab=Плита из вивианита +Cobbled Vivianite Slab=Плита из булыжника вивианита +Vivianite Brick Slab=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° из вивианита +Vivianite Block Slab=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚Ð° из вивианита +Cracked Vivianite Brick Slab=Плита из треÑнувшего кирпича вивианита + + + +Blue Agate Stair=ЛеÑтница из Ñинего агата +Gray Agate Stair=ЛеÑтница из Ñерого агата +Green Agate Stair=ЛеÑтница из зеленого агата +Moss Agate Stair=ЛеÑтница из мохового агата +Orange Agate Stair=ЛеÑтница из оранжевого агата +Purple Agate Stair=ЛеÑтница из фиолетового агата +Red Agate Stair=ЛеÑтница из краÑного агата + +Amazonite Stair=ЛеÑтница из амазонита +Cobbled Amazonite Stair=ЛеÑтница из булыжника амазонита +Amazonite Brick Stair=ЛеÑтница из кирпича амазонита +Amazonite Block Stair=ЛеÑтница из блока амазонита +Cracked Amazonite Brick Stair=ЛеÑтница из треÑнувшего кирпича амазонита + +Amber Stair=ЛеÑтница из ÑÐ½Ñ‚Ð°Ñ€Ñ +Amber Brick Stair=ЛеÑтница из кирпича ÑÐ½Ñ‚Ð°Ñ€Ñ +Amber Block Stair=ЛеÑтница из блока ÑÐ½Ñ‚Ð°Ñ€Ñ +Cracked Amber Brick Stair=ЛеÑтница из треÑнувшего кирпича ÑÐ½Ñ‚Ð°Ñ€Ñ + +Amethyst Stair=ЛеÑтница из аметиÑта +Amethyst Brick Stair=ЛеÑтница из кирпича аметиÑта +Amethyst Block Stair=ЛеÑтница из блока аметиÑта +Cracked Amethyst Brick Stair=ЛеÑтница из треÑнувшего кирпича аметиÑта + +Andesite Stair=ЛеÑтница из андезита +Andesite Block Stair=ЛеÑтница из блока андезита +Cobbled Andesite Stair=ЛеÑтница из булыжника андезита +Andesite Brick Stair=ЛеÑтница из кирпича андезита +Cobbled Andesite Brick Stair=ЛеÑтница из булыжника андезитного кирпича + +Basalt Stair=ЛеÑтница из базальта +Basalt Block Stair=ЛеÑтница из блока базальта +Basalt Brick Stair=ЛеÑтница из кирпича базальта +Cracked Basalt Brick Stair=ЛеÑтница из треÑнувшего кирпича базальта +Cobbled Basalt Stair=ЛеÑтница из булыжника базальта +Basalt Tile Stair=ЛеÑтница из плитки из базальта + +Black Moonstone Stair=ЛеÑтница из черного лунного ÐºÐ°Ð¼Ð½Ñ +Black Moonstone Brick Stair=ЛеÑтница из кирпича черного лунного ÐºÐ°Ð¼Ð½Ñ +Black Moonstone Block Stair=ЛеÑтница из блока черного лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Black Moonstone Brick Stair=Ð¢Ñ€ÐµÑ‰Ð¸Ð½Ð¾Ð²Ð°Ñ‚Ð°Ñ Ð»ÐµÑтница из кирпича черного лунного ÐºÐ°Ð¼Ð½Ñ + +Grey Calcite Stair=Ступень Серого Кальцита +Grey Calcite Brick Stair=Ступень Кирпича Серого Кальцита +Grey Calcite Block Stair=Ступень Блока Серого Кальцита +Cracked Grey Calcite Brick Stair=Ступень ТреÑнутого Кирпича Серого Кальцита + +Calcite Stair=ЛеÑтница из кальцита +Calcite Brick Stair=ЛеÑтница из кирпича кальцита +Calcite Block Stair=ЛеÑтница из блока кальцита +Cracked Calcite Brick Stair=Ð¢Ñ€ÐµÑ‰Ð¸Ð½Ð¾Ð²Ð°Ñ‚Ð°Ñ Ð»ÐµÑтница из кальцитового кирпича + +Orange Calcite Stair=Ступень Оранжевого Кальцита +Orange Calcite Brick Stair=Ступень Кирпича Оранжевого Кальцита +Orange Calcite Block Stair=Ступень Блока Оранжевого Кальцита +Cracked Orange Calcite Brick Stair=Ступень ТреÑнутого Кирпича Оранжевого Кальцита + +Carnotite Stair=ЛеÑтница из карнотита +Carnotite Brick Stair=ЛеÑтница из кирпича карнотита +Carnotite Block Stair=ЛеÑтница из блока карнотита +Cracked Carnotite Brick Stair=ЛеÑтница из треÑнувшего кирпича карнотита +Cobbled Carnotite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из карнотита + +Celestine Stair=ЛеÑтница из ÑелеÑтина +Celestine Brick Stair=ЛеÑтница из кирпича ÑелеÑтина +Celestine Block Stair=ЛеÑтница из блока ÑелеÑтина +Cracked Celestine Brick Stair=ЛеÑтница из треÑнувшего кирпича ÑелеÑтина + +Chalcanthite Stair=Ступень Халкантита +Chalcanthite Brick Stair=Ступень Кирпича Халкантита +Chalcanthite Block Stair=Ступень Блока Халкантита +Cracked Chalcanthite Brick Stair=Ступень ТреÑнутого Кирпича Халкантита +Cobbled Chalcanthite Stair=Ступень БруÑчатки Халкантита + +Chrysoprase Stair=ЛеÑтница из хризопраза +Chrysoprase Brick Stair=ЛеÑтница из кирпича хризопраза +Chrysoprase Block Stair=ЛеÑтница из блока хризопраза +Cracked Chrysoprase Brick Stair=ЛеÑтница из треÑнувшего кирпича хризопраза + +Citrine Stair=ЛеÑтница из цитрина +Citrine Brick Stair=ЛеÑтница из кирпича цитрина +Citrine Block Stair=ЛеÑтница из блока цитрина +Cracked Citrine Brick Stair=ЛеÑтница из треÑнувшего кирпича цитрина + +Covellite Stair=ЛеÑтница из ковеллита +Covellite Brick Stair=ЛеÑтница из кирпича ковеллита +Covellite Block Stair=ЛеÑтница из блока ковеллита +Cracked Covellite Brick Stair=ЛеÑтница из треÑнувшего кирпича ковеллита +Cobbled Covellite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из ковеллита + +Crocoite Stair=ЛеÑтница из крокоита +Crocoite Brick Stair=ЛеÑтница из кирпича крокоита +Crocoite Block Stair=ЛеÑтница из блока крокоита +Cracked Crocoite Brick Stair=ЛеÑтница из треÑнувшего кирпича крокоита + +Diorite Stair=ЛеÑтница из Диорита +Diorite Brick Stair=ЛеÑтница из кирпича Диорита +Diorite Block Stair=ЛеÑтница из блока Диорита +Cracked Diorite Brick Stair=ЛеÑтница из треÑнувшего кирпича Диорита +Cobbled Diorite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Диорита + +Erythrite Stair=ЛеÑтница из Ñритритового ÐºÐ°Ð¼Ð½Ñ +Erythrite Brick Stair=ЛеÑтница из кирпича Ñритритового ÐºÐ°Ð¼Ð½Ñ +Erythrite Block Stair=ЛеÑтница из блока Ñритритового ÐºÐ°Ð¼Ð½Ñ +Cracked Erythrite Brick Stair=ЛеÑтница из треÑнувшего кирпича Ñритритового ÐºÐ°Ð¼Ð½Ñ + +Eudialite Stair=ЛеÑтница из Ñудиалита +Eudialite Brick Stair=ЛеÑтница из кирпича Ñудиалита +Eudialite Block Stair=ЛеÑтница из блока Ñудиалита +Cracked Eudialite Brick Stair=ЛеÑтница из треÑнувшего кирпича Ñудиалита + +Fluorite Stair=ЛеÑтница из флюорита +Fluorite Brick Stair=ЛеÑтница из кирпича флюорита +Fluorite Block Stair=ЛеÑтница из блока флюорита +Cracked Fluorite Brick Stair=ЛеÑтница из треÑнувшего кирпича флюорита + +Gabbro Stair=ЛеÑтница из габбро +Cobbled Gabbro Stair=ЛеÑтница из булыжника габбро +Gabbro Brick Stair=ЛеÑтница из кирпича габбро +Gabbro Block Stair=ЛеÑтница из блока габбро +Cracked Gabbro Brick Stair=ЛеÑтница из треÑнувшего кирпича габбро + +Galena Stair=ЛеÑтница из галены +Galena Brick Stair=ЛеÑтница из кирпича галены +Galena Block Stair=ЛеÑтница из блока галены +Cracked Galena Brick Stair=ЛеÑтница из треÑнувшего кирпича галены + +Black Granite Stair=ЛеÑтница из черного гранита +Black Granite Brick Stair=ЛеÑтница из кирпича черного гранита +Black Granite Block Stair=ЛеÑтница из блока черного гранита +Cracked Black Granite Brick Stair=ЛеÑтница из треÑнувшего кирпича черного гранита +Cobbled Black Granite Stair=ЛеÑтница из булыжника черного гранита + +Blue Granite Stair=ЛеÑтница из Ñинего гранита +Blue Granite Brick Stair=ЛеÑтница из кирпича Ñинего гранита +Blue Granite Block Stair=ЛеÑтница из блока Ñинего гранита +Cracked Blue Granite Brick Stair=ТреÑнувший кирпичный блок из Ñинего гранита +Cobbled Blue Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита + +Gray Granite Stair=ЛеÑтница из Ñерого гранита +Gray Granite Brick Stair=ЛеÑтница из кирпича Ñерого гранита +Gray Granite Block Stair=ЛеÑтница из блока Ñерого гранита +Cracked Gray Granite Brick Stair=ТреÑнувший кирпичный блок из Ñерого гранита +Cobbled Gray Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита + +Green Granite Stair=ЛеÑтница из зеленого гранита +Green Granite Brick Stair=ЛеÑтница из кирпича зеленого гранита +Green Granite Block Stair=ЛеÑтница из блока зеленого гранита +Cracked Green Granite Brick Stair=ТреÑнувший кирпичный блок из зеленого гранита +Cobbled Green Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из зеленого гранита + +Pink Granite Stair=ЛеÑтница из розового гранита +Pink Granite Brick Stair=ЛеÑтница из кирпича розового гранита +Pink Granite Block Stair=ЛеÑтница из блока розового гранита +Cracked Pink Granite Brick Stair=ТреÑнувший кирпичный блок из розового гранита +Cobbled Pink Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из розового гранита + +Red Granite Stair=ЛеÑтница из краÑного гранита +Red Granite Brick Stair=ЛеÑтница из кирпича краÑного гранита +Red Granite Block Stair=ЛеÑтница из блока краÑного гранита +Cracked Red Granite Brick Stair=ТреÑнувший кирпичный блок из краÑного гранита +Cobbled Red Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из краÑного гранита + +White Granite Stair=Ð‘ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð»ÐµÑтница +White Granite Brick Stair=Белый гранитный кирпич Ð´Ð»Ñ Ð»ÐµÑтницы +White Granite Block Stair=Белый гранитный блок Ð´Ð»Ñ Ð»ÐµÑтницы +Cracked White Granite Brick Stair=ТреÑнувший белый гранитный кирпич Ð´Ð»Ñ Ð»ÐµÑтницы +Cobbled White Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð±ÐµÐ»Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð»ÐµÑтница + +Yellow Granite Stair=Ð–ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð»ÐµÑтница +Yellow Granite Brick Stair=Желтый гранитный кирпич Ð´Ð»Ñ Ð»ÐµÑтницы +Yellow Granite Block Stair=Желтый гранитный блок Ð´Ð»Ñ Ð»ÐµÑтницы +Cracked Yellow Granite Brick Stair=ТреÑнувший желтый гранитный кирпич Ð´Ð»Ñ Ð»ÐµÑтницы +Cobbled Yellow Granite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð¶ÐµÐ»Ñ‚Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ‚Ð½Ð°Ñ Ð»ÐµÑтница + +Heliodor Stair=ЛеÑтница из гелиодора +Heliodor Brick Stair=Кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из гелиодора +Heliodor Block Stair=Блок Ð´Ð»Ñ Ð»ÐµÑтницы из гелиодора +Cracked Heliodor Brick Stair=ТреÑнувший кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из гелиодора + +Howlite Stair=ЛеÑтница из хаулита +Howlite Brick Stair=Кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из хаулита +Howlite Block Stair=Блок Ð´Ð»Ñ Ð»ÐµÑтницы из хаулита +Cracked Howlite Brick Stair=ТреÑнувший кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из хаулита +Cobbled Howlite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из хаулита + +Ilvaite Stair=ЛеÑтница из ильваита +Ilvaite Brick Stair=Кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из ильваита +Ilvaite Block Stair=Блок Ð´Ð»Ñ Ð»ÐµÑтницы из ильваита +Cracked Ilvaite Brick Stair=ТреÑнувший кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из ильваита +Cobbled Ilvaite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из ильваита + +Jade Stair=ЛеÑтница из нефрита +Jade Brick Stair=Кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из нефрита +Jade Block Stair=Блок Ð´Ð»Ñ Ð»ÐµÑтницы из нефрита +Cracked Jade Brick Stair=ТреÑнувший кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из нефрита +Cobbled Jade Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из нефрита + +Red Jasper Stair=Ступень КраÑного Яшмы +Red Jasper Brick Stair=Ступень Кирпича КраÑного Яшмы +Red Jasper Block Stair=Ступень Блока КраÑного Яшмы +Cracked Red Jasper Brick Stair=Ступень ТреÑнутого Кирпича КраÑного Яшмы +Cobbled Red Jasper Stair=Ступень БруÑчатки КраÑного Яшмы + +Kyanite Stair=ЛеÑтница из кианита +Kyanite Brick Stair=Кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из кианита +Kyanite Block Stair=Блок Ð´Ð»Ñ Ð»ÐµÑтницы из кианита +Cracked Kyanite Brick Stair=ТреÑнувший кирпич Ð´Ð»Ñ Ð»ÐµÑтницы из кианита +Cobbled Kyanite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из кианита + +Lapis Lazuli Stair=ЛеÑтница из лÑпиÑ-лазури +Lapis Lazuli Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из лÑпиÑ-лазури +Lapis Lazuli Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из лÑпиÑ-лазури +Cracked Lapis Lazuli Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из лÑпиÑ-лазури + +Lepidolite Stair=Ступенька лепидолита +Lepidolite Brick Stair=Ступенька из лепидолитового кирпича +Lepidolite Block Stair=Ступенька из блока лепидолита +Cracked Lepidolite Brick Stair=Ступенька из треÑнутого лепидолитового кирпича +Cobbled Lepidolite Stair=Ступенька из бруÑчатки лепидолита + +Blue Limestone Stair=ЛеÑтница из Ñинего извеÑтнÑка +Blue Limestone Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего извеÑтнÑка +Blue Limestone Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего извеÑтнÑка +Cracked Blue Limestone Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего извеÑтнÑка +Cobbled Blue Limestone Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñинего извеÑтнÑка + +White Limestone Stair=ЛеÑтница из белого извеÑтнÑка +White Limestone Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого извеÑтнÑка +White Limestone Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого извеÑтнÑка +Cracked White Limestone Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого извеÑтнÑка +Cobbled White Limestone Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из белого извеÑтнÑка + +Marble Stair=ЛеÑтница из мрамора +Marble Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мрамора +Marble Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мрамора +Cracked Marble Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мрамора +Cobbled Marble Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из мрамора + +Moonstone Stair=Ступенька лунного ÐºÐ°Ð¼Ð½Ñ +Moonstone Brick Stair=Ступенька из лунного кирпича +Moonstone Block Stair=Ступенька из блока лунного ÐºÐ°Ð¼Ð½Ñ +Cracked Moonstone Brick Stair=Ступенька из треÑнутого лунного каменного кирпича + +Morion Quartz Stair=ЛеÑтница из Морионового Кварца +Morion Quartz Brick Stair=ЛеÑтница из кирпичей Морионового Кварца +Morion Quartz Block Stair=ЛеÑтница из блоков Морионового Кварца +Cracked Morion Quartz Brick Stair=ЛеÑтница из треÑнувших кирпичей Морионового Кварца + +Mudstone Stair=ЛеÑтница из мулÑжного ÐºÐ°Ð¼Ð½Ñ +Cobbled Mudstone Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из мулÑжного ÐºÐ°Ð¼Ð½Ñ +Mudstone Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мулÑжного ÐºÐ°Ð¼Ð½Ñ +Mudstone Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мулÑжного ÐºÐ°Ð¼Ð½Ñ +Cracked Mudstone Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мулÑжного ÐºÐ°Ð¼Ð½Ñ + +Prasiolite Stair=ЛеÑтница из празиолита +Prasiolite Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из празиолита +Prasiolite Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из празиолита +Cracked Prasiolite Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из празиолита + +Pumice Stair=ЛеÑтница из пемзы +Pumice Brick Stair=ЛеÑтница из кирпичей пемзы +Pumice Block Stair=ЛеÑтница из блоков пемзы +Cracked Pumice Brick Stair=ЛеÑтница из треÑнувших кирпичей пемзы + +Pyrite Stair=ЛеÑтница из пирита +Pyrite Brick Stair=ЛеÑтница из кирпичей пирита +Pyrite Block Stair=ЛеÑтница из блоков пирита +Cracked Pyrite Brick Stair=ЛеÑтница из треÑнувших кирпичей пирита + +Quartz Stair=ЛеÑтница из кварца +Quartz Brick Stair=ЛеÑтница из кирпичей кварца +Quartz Block Stair=ЛеÑтница из блоков кварца +Cracked Quartz Brick Stair=ЛеÑтница из треÑнувших кирпичей кварца + +Rhodonite Stair=Ступенька родонита +Rhodonite Brick Stair=Ступенька из родонитового кирпича +Rhodonite Block Stair=Ступенька из блока родонита +Cracked Rhodonite Brick Stair=Ступенька из треÑнутого родонитового кирпича +Cobbled Rhodonite Stair=Ступенька из бруÑчатки родонита + +Rose Quartz Stair=ЛеÑтница из розового кварца +Rose Quartz Brick Stair=ЛеÑтница из кирпичей розового кварца +Rose Quartz Block Stair=ЛеÑтница из блоков розового кварца +Cracked Rose Quartz Brick Stair=ЛеÑтница из треÑнувших кирпичей розового кварца + +Scoria Stair=ЛеÑтница из Ñкории +Scoria Brick Stair=ЛеÑтница из кирпичей Ñкории +Scoria Block Stair=ЛеÑтница из блоков Ñкории +Cracked Scoria Brick Stair=ЛеÑтница из треÑнувших кирпичей Ñкории +Cobbled Scoria Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñкории + +Serpentine Stair=ЛеÑтница из Ñерпентина +Cobbled Serpentine Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерпентина +Serpentine Brick Stair=ЛеÑтница из кирпичей Ñерпентина +Serpentine Block Stair=ЛеÑтница из блоков Ñерпентина +Cracked Serpentine Brick Stair=ЛеÑтница из треÑнувших кирпичей Ñерпентина + +Shale Stair=Ð¡Ð»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð»ÐµÑтница +Shale Brick Stair=ЛеÑтница из Ñланцевого кирпича +Shale Block Stair=ЛеÑтница из Ñланцевого блока +Cracked Shale Brick Stair=ЛеÑтница из треÑнувшего Ñланцевого кирпича +Cobbled Shale Stair=Ð’Ñ‹Ð¼Ð¾Ñ‰ÐµÐ½Ð½Ð°Ñ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð»ÐµÑтница + +Slate Stair=ЛеÑтница из Ñланца +Slate Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Slate Block Stair=Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Cracked Slate Brick Stair=РаÑтреÑкавшаÑÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Cobbled Slate Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñланца +Slate Tile Stair=ЛеÑтница из Ñланцевых плит + +Smokey Quartz Stair=ЛеÑтница из дымчатого кварца +Smokey Quartz Brick Stair=ÐšÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из дымчатого кварца +Smokey Quartz Block Stair=ЛеÑтница из блока дымчатого кварца +Cracked Smokey Quartz Brick Stair=ЛеÑтница из треÑнувшего кирпича дымчатого кварца + +Soapstone Stair=ЛеÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ +Soapstone Brick Stair=ЛеÑтница из кирпича мыльного ÐºÐ°Ð¼Ð½Ñ +Soapstone Block Stair=ЛеÑтница из блока мыльного ÐºÐ°Ð¼Ð½Ñ +Cracked Soapstone Brick Stair=ЛеÑтница из треÑнувшего кирпича мыльного ÐºÐ°Ð¼Ð½Ñ + +Sodalite Stair=ЛеÑтница из Ñодалита +Cobbled Sodalite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñодалита +Sodalite Brick Stair=ЛеÑтница из кирпича Ñодалита +Sodalite Block Stair=ЛеÑтница из блока Ñодалита +Cracked Sodalite Brick Stair=ЛеÑтница из треÑнувшего кирпича Ñодалита + +Sugilite Stair=ЛеÑтница из Ñугилита +Sugilite Brick Stair=ЛеÑтница из кирпича Ñугилита +Sugilite Block Stair=ЛеÑтница из блока Ñугилита +Cracked Sugilite Brick Stair=ЛеÑтница из треÑнувшего кирпича Ñугилита +Cobbled Sugilite Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñугилита + +Green Tourmaline Stair=Ступенька зеленого турмалина +Green Tourmaline Brick Stair=Ступенька из зеленого турмалинового кирпича +Green Tourmaline Block Stair=Ступенька из блока зеленого турмалина +Cracked Green Tourmaline Brick Stair=Ступенька из треÑнутого зеленого турмалинового кирпича + +Paraiba Tourmaline Stair=Ступенька парайба турмалина +Paraiba Tourmaline Brick Stair=Ступенька из парайба турмалинового кирпича +Paraiba Tourmaline Block Stair=Ступенька из блока парайба турмалина +Cracked Paraiba Tourmaline Brick Stair=Ступенька из треÑнутого парайба турмалинового кирпича + +Pink Tourmaline Stair=Ступенька розового турмалина +Pink Tourmaline Brick Stair=Ступенька из розового турмалинового кирпича +Pink Tourmaline Block Stair=Ступенька из блока розового турмалина +Cracked Pink Tourmaline Brick Stair=Ступенька из треÑнутого розового турмалинового кирпича + +Travertine Stair=ЛеÑтница из травертина +Cobbled Travertine Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из травертина +Travertine Brick Stair=ЛеÑтница из кирпича травертина +Travertine Block Stair=ЛеÑтница из блока травертина +Cracked Travertine Brick Stair=ЛеÑтница из треÑнувшего кирпича травертина + +Yellow Travertine Stair=ЛеÑтница из желтого травертина +Cobbled Yellow Travertine Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из желтого травертина +Yellow Travertine Brick Stair=ЛеÑтница из кирпича желтого травертина +Yellow Travertine Block Stair=ЛеÑтница из блока желтого травертина +Cracked Yellow Travertine Brick Stair=ЛеÑтница из треÑнувшего кирпича желтого травертина + +Beige Tuff Stair=ЛеÑтница из бежевого туфа +Beige Tuff Brick Stair=ЛеÑтница из кирпича из бежевого туфа +Beige Tuff Block Stair=ЛеÑтница из блока бежевого туфа +Cracked Beige Tuff Brick Stair=ЛеÑтница из треÑнувшего кирпича из бежевого туфа +Cobbled Beige Tuff Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из бежевого туфа + +Grey Tuff Stair=ЛеÑтница из Ñерого туфа +Grey Tuff Brick Stair=ЛеÑтница из кирпича из Ñерого туфа +Grey Tuff Block Stair=ЛеÑтница из блока Ñерого туфа +Cracked Grey Tuff Brick Stair=ЛеÑтница из треÑнувшего кирпича из Ñерого туфа +Cobbled Grey Tuff Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерого туфа + +Red Tuff Stair=ЛеÑтница из краÑного туфа +Red Tuff Brick Stair=ЛеÑтница из кирпича из краÑного туфа +Red Tuff Block Stair=ЛеÑтница из блока краÑного туфа +Cracked Red Tuff Brick Stair=ЛеÑтница из треÑнувшего кирпича из краÑного туфа +Cobbled Red Tuff Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из краÑного туфа + +Turquoise Stair=ЛеÑтница из бирюзы +Turquoise Brick Stair=ЛеÑтница из кирпича из бирюзы +Turquoise Block Stair=ЛеÑтница из блока бирюзы +Cracked Turquoise Brick Stair=ЛеÑтница из треÑнувшего кирпича из бирюзы +Cobbled Turquoise Stair=ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из бирюзы + +Vivianite Stair=ЛеÑтница из вивианита +Vivianite Brick Stair=ЛеÑтница из кирпича из вивианита +Vivianite Block Stair=ЛеÑтница из блока вивианита +Cracked Vivianite Brick Stair=ЛеÑтница из треÑнувшего кирпича из вивианита + + + +Inner Blue Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñинего агата +Inner Gray Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñерого агата +Inner Green Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из зеленого агата +Inner Moss Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из мохового агата +Inner Orange Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из оранжевого агата +Inner Purple Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из фиолетового агата +Inner Red Agate Stair=ВнутреннÑÑ Ð»ÐµÑтница из краÑного агата + +Inner Amazonite Stair=ВнутреннÑÑ Ð»ÐµÑтница из амазонита +Inner Cobbled Amazonite Stair=ВнутреннÑÑ Ð»ÐµÑтница из булыжника из амазонита +Inner Amazonite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из амазонита +Inner Amazonite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из амазонита +Inner Cracked Amazonite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича из амазонита + +Inner Amber Stair=ВнутреннÑÑ Ð»ÐµÑтница из ÑÐ½Ñ‚Ð°Ñ€Ñ +Inner Amber Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из ÑÐ½Ñ‚Ð°Ñ€Ñ +Inner Amber Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из ÑÐ½Ñ‚Ð°Ñ€Ñ +Inner Cracked Amber Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича из ÑÐ½Ñ‚Ð°Ñ€Ñ + +Inner Amethyst Stair=ВнутреннÑÑ Ð»ÐµÑтница из аметиÑта +Inner Amethyst Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из аметиÑта +Inner Amethyst Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из аметиÑта +Inner Cracked Amethyst Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича из аметиÑта + +Inner Andesite Stair=ВнутреннÑÑ Ð»ÐµÑтница из андезита +Inner Andesite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из андезита +Inner Andesite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из андезита +Inner Cracked Andesite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича из андезита +Inner Cobbled Andesite Stair=ВнутреннÑÑ Ð»ÐµÑтница из булыжника из андезита + +Inner Basalt Stair=ВнутреннÑÑ Ð»ÐµÑтница из базальта +Inner Basalt Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из базальта +Inner Basalt Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из базальта +Inner Cracked Basalt Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из базальта +Inner Cobbled Basalt Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из базальта +Inner Basalt Tile Stair=ВнутреннÑÑ Ð»ÐµÑтница из плитки из базальта + +Inner Black Moonstone Stair=ВнутреннÑÑ Ð»ÐµÑтница из черного лунного ÐºÐ°Ð¼Ð½Ñ +Inner Black Moonstone Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного лунного ÐºÐ°Ð¼Ð½Ñ +Inner Black Moonstone Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного лунного ÐºÐ°Ð¼Ð½Ñ +Inner Cracked Black Moonstone Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного лунного ÐºÐ°Ð¼Ð½Ñ + +Inner Grey Calcite Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Серого Кальцита +Inner Grey Calcite Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича Серого Кальцита +Inner Grey Calcite Block Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока Серого Кальцита +Inner Cracked Grey Calcite Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича Серого Кальцита + +Inner Calcite Stair=ВнутреннÑÑ Ð»ÐµÑтница из кальцита +Inner Calcite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из кальцита +Inner Calcite Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из кальцита +Inner Cracked Calcite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из кальцита + +Inner Orange Calcite Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Оранжевого Кальцита +Inner Orange Calcite Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича Оранжевого Кальцита +Inner Orange Calcite Block Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока Оранжевого Кальцита +Inner Cracked Orange Calcite Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича Оранжевого Кальцита + +Inner Carnotite Stair=ВнутреннÑÑ Ð»ÐµÑтница из карнотита +Inner Carnotite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из карнотита +Inner Carnotite Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из карнотита +Inner Cracked Carnotite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из карнотита +Inner Cobbled Carnotite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из карнотита + +Inner Celestine Stair=ВнутреннÑÑ Ð»ÐµÑтница из целеÑтина +Inner Celestine Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из целеÑтина +Inner Celestine Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из целеÑтина +Inner Cracked Celestine Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из целеÑтина + +Inner Chalcanthite Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Халкантита +Inner Chalcanthite Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича Халкантита +Inner Chalcanthite Block Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока Халкантита +Inner Cracked Chalcanthite Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича Халкантита +Inner Cobbled Chalcanthite Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ БруÑчатки Халкантита + +Inner Chrysoprase Stair=ВнутреннÑÑ Ð»ÐµÑтница из хризопраза +Inner Chrysoprase Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хризопраза +Inner Chrysoprase Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хризопраза +Inner Cracked Chrysoprase Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хризопраза + +Inner Citrine Stair=ВнутреннÑÑ Ð»ÐµÑтница из цитрина +Inner Citrine Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из цитрина +Inner Citrine Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из цитрина +Inner Cracked Citrine Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ + +Inner Covellite Stair=ВнутреннÑÑ Ð»ÐµÑтница из ковеллита +Inner Covellite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ковеллита +Inner Covellite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока ковеллита +Inner Cracked Covellite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ковеллита +Inner Cobbled Covellite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из ковеллита + +Inner Crocoite Stair=ВнутреннÑÑ Ð»ÐµÑтница из крокоита +Inner Crocoite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из крокоита +Inner Crocoite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока крокоита +Inner Cracked Crocoite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из крокоита + +Inner Diorite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Диорита +Inner Diorite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Диорита +Inner Diorite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Диорита +Inner Cracked Diorite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Диорита +Inner Cobbled Diorite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Диорита + +Inner Erythrite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñритрита +Inner Erythrite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñритрита +Inner Erythrite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Ñритрита +Inner Cracked Erythrite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñритрита + +Inner Eudialite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñвдиалита +Inner Eudialite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñвдиалита +Inner Eudialite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Ñвдиалита +Inner Cracked Eudialite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñвдиалита + +Inner Fluorite Stair=ВнутреннÑÑ Ð»ÐµÑтница из флюорита +Inner Fluorite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из флюорита +Inner Fluorite Block Stair=ВнутреннÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из флюорита +Inner Cracked Fluorite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича флюорита + +Inner Gabbro Stair=ВнутреннÑÑ Ð»ÐµÑтница из габбро +Inner Cobbled Gabbro Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из габбро +Inner Gabbro Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из габбро +Inner Gabbro Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока габбро +Inner Cracked Gabbro Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из габбро + +Inner Galena Stair=ВнутреннÑÑ Ð»ÐµÑтница из галены +Inner Galena Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича галены +Inner Galena Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока галены +Inner Cracked Galena Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича галены + +Inner Black Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из черного гранита +Inner Black Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного гранита +Inner Black Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока черного гранита +Inner Cracked Black Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного гранита +Inner Cobbled Black Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из черного гранита + +Inner Blue Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñинего гранита +Inner Blue Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита +Inner Blue Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Ñинего гранита +Inner Cracked Blue Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита +Inner Cobbled Blue Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита + +Inner Gray Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñерого гранита +Inner Gray Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита +Inner Gray Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Ñерого гранита +Inner Cracked Gray Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита +Inner Cobbled Gray Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита + +Inner Green Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из зеленого гранита +Inner Green Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из зеленого гранита +Inner Green Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока зеленого гранита +Inner Cracked Green Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из зеленого гранита +Inner Cobbled Green Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из зеленого гранита + +Inner Pink Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из розового гранита +Inner Pink Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из розового гранита +Inner Pink Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока розового гранита +Inner Cracked Pink Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из розового гранита + +Inner Red Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из краÑного гранита +Inner Red Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из краÑного гранита +Inner Red Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока краÑного гранита +Inner Cracked Red Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из краÑного гранита +Inner Cobbled Red Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из краÑного гранита + +Inner White Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из белого гранита +Inner White Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого гранита +Inner White Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока белого гранита +Inner Cracked White Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого гранита +Inner Cobbled White Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из белого гранита + +Inner Yellow Granite Stair=ВнутреннÑÑ Ð»ÐµÑтница из желтого гранита +Inner Yellow Granite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из желтого гранита +Inner Yellow Granite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока желтого гранита +Inner Cracked Yellow Granite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из желтого гранита +Inner Cobbled Yellow Granite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из желтого гранита + +Inner Heliodor Stair=ВнутреннÑÑ Ð»ÐµÑтница из гелиодора +Inner Heliodor Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из гелиодора +Inner Heliodor Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока гелиодора +Inner Cracked Heliodor Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из гелиодора + +Inner Howlite Stair=ВнутреннÑÑ Ð»ÐµÑтница из хаулита +Inner Howlite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хаулита +Inner Howlite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока хаулита +Inner Cracked Howlite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хаулита +Inner Cobbled Howlite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из хаулита + +Inner Ilvaite Stair=ВнутреннÑÑ Ð»ÐµÑтница из ильвайта +Inner Ilvaite Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ильвайта +Inner Ilvaite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока ильвайта +Inner Cracked Ilvaite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ильвайта +Inner Cobbled Ilvaite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из ильвайта + +Inner Jade Stair=ВнутреннÑÑ Ð»ÐµÑтница из нефрита +Inner Jade Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из нефрита +Inner Jade Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока нефрита +Inner Cracked Jade Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из нефрита +Inner Cobbled Jade Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из нефрита + +Inner Red Jasper Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ КраÑного Яшмы +Inner Red Jasper Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича КраÑного Яшмы +Inner Red Jasper Block Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока КраÑного Яшмы +Inner Cracked Red Jasper Brick Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича КраÑного Яшмы +Inner Cobbled Red Jasper Stair=ВнутреннÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ БруÑчатки КраÑного Яшмы + +Inner Kyanite Stair=ВнутреннÑÑ Ð»ÐµÑтница из кианита +Inner Kyanite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из кианита +Inner Kyanite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока кианита +Inner Cracked Kyanite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из кианита +Inner Cobbled Kyanite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из кианита + +Inner Lapis Lazuli Stair=ВнутреннÑÑ Ð»ÐµÑтница из лÑпиÑ-лавы +Inner Lapis Lazuli Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из лÑпиÑ-лавы +Inner Lapis Lazuli Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока лÑпиÑ-лавы +Inner Cracked Lapis Lazuli Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из лÑпиÑ-лавы + +Inner Lepidolite Stair=ВнутреннÑÑ Ñтупенька лепидолита +Inner Lepidolite Brick Stair=ВнутреннÑÑ Ñтупенька из лепидолитового кирпича +Inner Lepidolite Block Stair=ВнутреннÑÑ Ñтупенька из блока лепидолита +Inner Cracked Lepidolite Brick Stair=ВнутреннÑÑ Ñтупенька из треÑнутого лепидолитового кирпича +Inner Cobbled Lepidolite Stair=ВнутреннÑÑ Ñтупенька из бруÑчатки лепидолита + +Inner Blue Limestone Stair=ВнутреннÑÑ Ð»ÐµÑтница из голубого извеÑтнÑка +Inner Blue Limestone Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из голубого извеÑтнÑка +Inner Blue Limestone Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока голубого извеÑтнÑка +Inner Cracked Blue Limestone Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из голубого извеÑтнÑка +Inner Cobbled Blue Limestone Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из голубого извеÑтнÑка + +Inner White Limestone Stair=ВнутреннÑÑ Ð»ÐµÑтница из белого извеÑтнÑка +Inner White Limestone Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из белого извеÑтнÑка +Inner White Limestone Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока белого извеÑтнÑка +Inner Cracked White Limestone Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из белого извеÑтнÑка +Inner Cobbled White Limestone Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница + +Inner Marble Stair=ВнутреннÑÑ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð»ÐµÑтница +Inner Marble Brick Stair=ВнутреннÑÑ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Marble Block Stair=ВнутреннÑÑ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Cracked Marble Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Cobbled Marble Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð»ÐµÑтница + +Inner Moonstone Stair=ВнутреннÑÑ Ñтупенька лунного ÐºÐ°Ð¼Ð½Ñ +Inner Moonstone Brick Stair=ВнутреннÑÑ Ñтупенька из лунного кирпича +Inner Moonstone Block Stair=ВнутреннÑÑ Ñтупенька из блока лунного ÐºÐ°Ð¼Ð½Ñ +Inner Cracked Moonstone Brick Stair=ВнутреннÑÑ Ñтупенька из треÑнутого лунного каменного кирпича + +Inner Morion Quartz Stair=ВнутреннÑÑ Ð»ÐµÑтница из Морионового Кварца +Inner Morion Quartz Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из Морионового Кварца +Inner Morion Quartz Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из Морионового Кварца +Inner Cracked Morion Quartz Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из Морионового Кварца + +Inner Mudstone Stair=ВнутреннÑÑ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ +Inner Cobbled Mudstone Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ +Inner Mudstone Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ +Inner Mudstone Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока иловатого ÐºÐ°Ð¼Ð½Ñ +Inner Cracked Mudstone Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ + +Inner Prasiolite Stair=ВнутреннÑÑ Ð»ÐµÑтница из празиолита +Inner Prasiolite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из празиолита +Inner Prasiolite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из празиолита +Inner Cracked Prasiolite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из празиолита + +Inner Pumice Stair=ВнутреннÑÑ Ð»ÐµÑтница из пемзы +Inner Pumice Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из пемзы +Inner Pumice Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из пемзы +Inner Cracked Pumice Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из пемзы + +Inner Pyrite Stair=ВнутреннÑÑ Ð»ÐµÑтница из пирита +Inner Pyrite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из пирита +Inner Pyrite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из пирита +Inner Cracked Pyrite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из пирита + +Inner Quartz Stair=ВнутреннÑÑ Ð»ÐµÑтница из кварца +Inner Quartz Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из кварца +Inner Quartz Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из кварца +Inner Cracked Quartz Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из кварца + +Inner Rhodonite Stair=ВнутреннÑÑ Ñтупенька родонита +Inner Rhodonite Brick Stair=ВнутреннÑÑ Ñтупенька из родонитового кирпича +Inner Rhodonite Block Stair=ВнутреннÑÑ Ñтупенька из блока родонита +Inner Cracked Rhodonite Brick Stair=ВнутреннÑÑ Ñтупенька из треÑнутого родонитового кирпича +Inner Cobbled Rhodonite Stair=ВнутреннÑÑ Ñтупенька из бруÑчатки родонита + +Inner Rose Quartz Stair=ВнутреннÑÑ Ð»ÐµÑтница из розового кварца +Inner Rose Quartz Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича из розового кварца +Inner Rose Quartz Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока из розового кварца +Inner Cracked Rose Quartz Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнутого кирпича из розового кварца + +Inner Scoria Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñкории +Inner Scoria Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñкории +Inner Scoria Block Stair=Внутренний блочный Ñтупенька из Ñкории +Inner Cracked Scoria Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñкории +Inner Cobbled Scoria Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñкории + +Inner Serpentine Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñерпентина +Inner Cobbled Serpentine Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерпентина +Inner Serpentine Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерпентина +Inner Serpentine Block Stair=Внутренний блочный Ñтупенька из Ñерпентина +Inner Cracked Serpentine Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерпентина + +Inner Shale Stair=ВнутреннÑÑ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð»ÐµÑтница +Inner Shale Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñланцевого кирпича +Inner Shale Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñланцевого блока +Inner Cracked Shale Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего Ñланцевого кирпича +Inner Cobbled Shale Stair=ВнутреннÑÑ Ð²Ñ‹Ð¼Ð¾Ñ‰ÐµÐ½Ð½Ð°Ñ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð»ÐµÑтница + +Inner Slate Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñланца +Inner Slate Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Inner Slate Block Stair=Внутренний блочный Ñтупенька из Ñланца +Inner Cracked Slate Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Inner Cobbled Slate Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñланца +Inner Slate Tile Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñланцевых плит + +Inner Smokey Quartz Stair=ВнутреннÑÑ Ð»ÐµÑтница из дымчатого кварца +Inner Smokey Quartz Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из дымчатого кварца +Inner Smokey Quartz Block Stair=Внутренний блочный Ñтупенька из дымчатого кварца +Inner Cracked Smokey Quartz Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из дымчатого кварца + +Inner Soapstone Stair=ВнутреннÑÑ Ð»ÐµÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ +Inner Soapstone Brick Stair=ВнутреннÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ +Inner Soapstone Block Stair=Внутренний блочный Ñтупенька из мыльного ÐºÐ°Ð¼Ð½Ñ +Inner Cracked Soapstone Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ + +Inner Sodalite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñодалита +Inner Cobbled Sodalite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñодалита +Inner Sodalite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñодалитового кирпича +Inner Sodalite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñодалитового блока +Inner Cracked Sodalite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего Ñодалитового кирпича + +Inner Sugilite Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñугилита +Inner Sugilite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича Ñугилита +Inner Sugilite Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Ñугилита +Inner Cracked Sugilite Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича Ñугилита +Inner Cobbled Sugilite Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñугилита + +Inner Green Tourmaline Stair=ВнутреннÑÑ Ñтупенька зеленого турмалина +Inner Green Tourmaline Brick Stair=ВнутреннÑÑ Ñтупенька из зеленого турмалинового кирпича +Inner Green Tourmaline Block Stair=ВнутреннÑÑ Ñтупенька из блока зеленого турмалина +Inner Cracked Green Tourmaline Brick Stair=ВнутреннÑÑ Ñтупенька из треÑнутого зеленого турмалинового кирпича + +Inner Paraiba Tourmaline Stair=ВнутреннÑÑ Ñтупенька парайба турмалина +Inner Paraiba Tourmaline Brick Stair=ВнутреннÑÑ Ñтупенька из парайба турмалинового кирпича +Inner Paraiba Tourmaline Block Stair=ВнутреннÑÑ Ñтупенька из блока парайба турмалина +Inner Cracked Paraiba Tourmaline Brick Stair=ВнутреннÑÑ Ñтупенька из треÑнутого парайба турмалинового кирпича + +Inner Pink Tourmaline Stair=ВнутреннÑÑ Ñтупенька из розового турмалина +Inner Pink Tourmaline Brick Stair=ВнутреннÑÑ Ñтупенька из розового турмалинового кирпича +Inner Pink Tourmaline Block Stair=ВнутреннÑÑ Ñтупенька из блока розового турмалина +Inner Cracked Pink Tourmaline Brick Stair=ВнутреннÑÑ Ñтупенька из треÑнутого розового турмалинового кирпича + +Inner Travertine Stair=ВнутреннÑÑ Ð»ÐµÑтница из травертина +Inner Cobbled Travertine Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из травертина +Inner Travertine Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича травертина +Inner Travertine Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока травертина +Inner Cracked Travertine Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича травертина + +Inner Yellow Travertine Stair=ВнутреннÑÑ Ð»ÐµÑтница из жёлтого травертина +Inner Cobbled Yellow Travertine Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из жёлтого травертина +Inner Yellow Travertine Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича жёлтого травертина +Inner Yellow Travertine Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока жёлтого травертина +Inner Cracked Yellow Travertine Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича жёлтого травертина + +Inner Beige Tuff Stair=ВнутреннÑÑ Ð»ÐµÑтница из бежевого туфа +Inner Cobbled Beige Tuff Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из бежевого туфа +Inner Beige Tuff Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича бежевого туфа +Inner Beige Tuff Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока бежевого туфа +Inner Cracked Beige Tuff Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича бежевого туфа + +Inner Grey Tuff Stair=ВнутреннÑÑ Ð»ÐµÑтница из Ñерого туфа +Inner Cobbled Grey Tuff Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерого туфа +Inner Grey Tuff Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из кирпича Ñерого туфа +Inner Grey Tuff Block Stair=ВнутреннÑÑ Ð»ÐµÑтница из блока Ñерого туфа +Inner Cracked Grey Tuff Brick Stair=ВнутреннÑÑ Ð»ÐµÑтница из треÑнувшего кирпича Ñерого туфа + +Inner Red Tuff Stair=ВнутреннÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Inner Cobbled Red Tuff Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Inner Red Tuff Brick Stair=ВнутреннÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Red Tuff Block Stair=ВнутреннÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Cracked Red Tuff Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница + +Inner Turquoise Stair=ВнутреннÑÑ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Inner Turquoise Brick Stair=ВнутреннÑÑ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Turquoise Block Stair=ВнутреннÑÑ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Cracked Turquoise Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Cobbled Turquoise Stair=ВнутреннÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ Ð»ÐµÑтница + +Inner Vivianite Stair=ВнутреннÑÑ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Inner Vivianite Brick Stair=ВнутреннÑÑ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Vivianite Block Stair=ВнутреннÑÑ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Inner Cracked Vivianite Brick Stair=ВнутреннÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница + + + +Outer Blue Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñинего агата +Outer Gray Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñерого агата +Outer Green Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из зеленого агата +Outer Moss Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из мохового агата +Outer Orange Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из оранжевого агата +Outer Purple Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из фиолетового агата +Outer Red Agate Stair=ВнешнÑÑ Ð»ÐµÑтница из краÑного агата + +Outer Amazonite Stair=ВнешнÑÑ Ð»ÐµÑтница из амазонита +Outer Cobbled Amazonite Stair=ВнешнÑÑ Ð»ÐµÑтница из булыжника амазонита +Outer Amazonite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича амазонита +Outer Amazonite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока амазонита +Outer Cracked Amazonite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича амазонита + +Outer Amber Stair=ВнешнÑÑ Ð»ÐµÑтница из ÑÐ½Ñ‚Ð°Ñ€Ñ +Outer Amber Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича ÑÐ½Ñ‚Ð°Ñ€Ñ +Outer Amber Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока ÑÐ½Ñ‚Ð°Ñ€Ñ +Outer Cracked Amber Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича ÑÐ½Ñ‚Ð°Ñ€Ñ + +Outer Amethyst Stair=ВнешнÑÑ Ð»ÐµÑтница из аметиÑта +Outer Amethyst Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича аметиÑта +Outer Amethyst Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока аметиÑта +Outer Cracked Amethyst Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича аметиÑта + +Outer Andesite Stair=ВнешнÑÑ Ð»ÐµÑтница из андезита +Outer Andesite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока андезита +Outer Andesite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича андезита +Outer Cracked Andesite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича андезита +Outer Cobbled Andesite Stair=ВнешнÑÑ Ð»ÐµÑтница из булыжника андезита + +Outer Basalt Stair=ВнешнÑÑ Ð»ÐµÑтница из базальта +Outer Basalt Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из базальта +Outer Basalt Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из базальта +Outer Cracked Basalt Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из базальта +Outer Cobbled Basalt Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из базальта +Outer Basalt Tile Stair=ВнешнÑÑ Ð»ÐµÑтница из плитки из базальта + +Outer Black Moonstone Stair=ВнешнÑÑ Ð»ÐµÑтница из чёрного лунного ÐºÐ°Ð¼Ð½Ñ +Outer Black Moonstone Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из чёрного лунного ÐºÐ°Ð¼Ð½Ñ +Outer Black Moonstone Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из чёрного лунного ÐºÐ°Ð¼Ð½Ñ +Outer Cracked Black Moonstone Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из чёрного лунного ÐºÐ°Ð¼Ð½Ñ + +Outer Grey Calcite Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Серого Кальцита +Outer Grey Calcite Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича Серого Кальцита +Outer Grey Calcite Block Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока Серого Кальцита +Outer Cracked Grey Calcite Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича Серого Кальцита + +Outer Calcite Stair=ВнешнÑÑ Ð»ÐµÑтница из кальцита +Outer Calcite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из кальцита +Outer Calcite Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из кальцита +Outer Cracked Calcite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из кальцита + +Outer Orange Calcite Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Оранжевого Кальцита +Outer Orange Calcite Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича Оранжевого Кальцита +Outer Orange Calcite Block Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока Оранжевого Кальцита +Outer Cracked Orange Calcite Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича Оранжевого Кальцита + +Outer Carnotite Stair=ВнешнÑÑ Ð»ÐµÑтница из карнотита +Outer Carnotite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из карнотита +Outer Carnotite Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из карнотита +Outer Cracked Carnotite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из карнотита +Outer Cobbled Carnotite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из карнотита + +Outer Celestine Stair=ВнешнÑÑ Ð»ÐµÑтница из целеÑтина +Outer Celestine Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из целеÑтина +Outer Celestine Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из целеÑтина +Outer Cracked Celestine Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из целеÑтина + +Outer Chalcanthite Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Халкантита +Outer Chalcanthite Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича Халкантита +Outer Chalcanthite Block Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока Халкантита +Outer Cracked Chalcanthite Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича Халкантита +Outer Cobbled Chalcanthite Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ БруÑчатки Халкантита + +Outer Chrysoprase Stair=ВнешнÑÑ Ð»ÐµÑтница из хризопраза +Outer Chrysoprase Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хризопраза +Outer Chrysoprase Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хризопраза +Outer Cracked Chrysoprase Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хризопраза + +Outer Citrine Stair=ВнешнÑÑ Ð»ÐµÑтница из цитрина +Outer Citrine Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из цитрина +Outer Citrine Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из цитрина +Outer Cracked Citrine Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ + +Outer Covellite Stair=ВнешнÑÑ Ð»ÐµÑтница из ковеллита +Outer Covellite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ковеллита +Outer Covellite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока ковеллита +Outer Cracked Covellite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ковеллита +Outer Cobbled Covellite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из ковеллита + +Outer Crocoite Stair=ВнешнÑÑ Ð»ÐµÑтница из крокоита +Outer Crocoite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из крокоита +Outer Crocoite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока крокоита +Outer Cracked Crocoite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из крокоита + +Outer Diorite Stair=ВнешнÑÑ Ð»ÐµÑтница из Диорита +Outer Diorite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Диорита +Outer Diorite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Диорита +Outer Cracked Diorite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Диорита +Outer Cobbled Diorite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Диорита + +Outer Erythrite Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñритрита +Outer Erythrite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñритрита +Outer Erythrite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Ñритрита +Outer Cracked Erythrite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñритрита + +Outer Eudialite Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñвдиалита +Outer Eudialite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñвдиалита +Outer Eudialite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Ñвдиалита +Outer Cracked Eudialite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñвдиалита + +Outer Fluorite Stair=ВнешнÑÑ Ð»ÐµÑтница из флюорита +Outer Fluorite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из флюорита +Outer Fluorite Block Stair=ВнешнÑÑ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из флюорита +Outer Cracked Fluorite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича флюорита + +Outer Gabbro Stair=ВнешнÑÑ Ð»ÐµÑтница из габбро +Outer Cobbled Gabbro Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из габбро +Outer Gabbro Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из габбро +Outer Gabbro Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока габбро +Outer Cracked Gabbro Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из габбро + +Outer Galena Stair=ВнешнÑÑ Ð»ÐµÑтница из галены +Outer Galena Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича галены +Outer Galena Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока галены +Outer Cracked Galena Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича галены + +Outer Black Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из черного гранита +Outer Black Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного гранита +Outer Black Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока черного гранита +Outer Cracked Black Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из черного гранита +Outer Cobbled Black Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из черного гранита + +Outer Blue Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñинего гранита +Outer Blue Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита +Outer Blue Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Ñинего гранита +Outer Cracked Blue Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита +Outer Cobbled Blue Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñинего гранита + +Outer Gray Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñерого гранита +Outer Gray Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита +Outer Gray Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Ñерого гранита +Outer Cracked Gray Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита +Outer Cobbled Gray Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерого гранита + +Outer Green Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из зеленого гранита +Outer Green Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из зеленого гранита +Outer Green Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока зеленого гранита +Outer Cracked Green Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из зеленого гранита +Outer Cobbled Green Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из зеленого гранита + +Outer Pink Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из розового гранита +Outer Pink Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из розового гранита +Outer Pink Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока розового гранита +Outer Cracked Pink Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из розового гранита + +Outer Red Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из краÑного гранита +Outer Red Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из краÑного гранита +Outer Red Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока краÑного гранита +Outer Cracked Red Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из краÑного гранита +Outer Cobbled Red Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из краÑного гранита + +Outer White Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из белого гранита +Outer White Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого гранита +Outer White Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока белого гранита +Outer Cracked White Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из белого гранита +Outer Cobbled White Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из белого гранита + +Outer Yellow Granite Stair=ВнешнÑÑ Ð»ÐµÑтница из желтого гранита +Outer Yellow Granite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из желтого гранита +Outer Yellow Granite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока желтого гранита +Outer Cracked Yellow Granite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из желтого гранита +Outer Cobbled Yellow Granite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из желтого гранита + +Outer Heliodor Stair=ВнешнÑÑ Ð»ÐµÑтница из гелиодора +Outer Heliodor Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из гелиодора +Outer Heliodor Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока гелиодора +Outer Cracked Heliodor Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из гелиодора + +Outer Howlite Stair=ВнешнÑÑ Ð»ÐµÑтница из хаулита +Outer Howlite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хаулита +Outer Howlite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока хаулита +Outer Cracked Howlite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из хаулита +Outer Cobbled Howlite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из хаулита + +Outer Ilvaite Stair=ВнешнÑÑ Ð»ÐµÑтница из ильвайта +Outer Ilvaite Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ильвайта +Outer Ilvaite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока ильвайта +Outer Cracked Ilvaite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из ильвайта +Outer Cobbled Ilvaite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из ильвайта + +Outer Jade Stair=ВнешнÑÑ Ð»ÐµÑтница из нефрита +Outer Jade Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из нефрита +Outer Jade Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока нефрита +Outer Cracked Jade Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из нефрита +Outer Cobbled Jade Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из нефрита + +Outer Red Jasper Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ КраÑного Яшмы +Outer Red Jasper Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Кирпича КраÑного Яшмы +Outer Red Jasper Block Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ Блока КраÑного Яшмы +Outer Cracked Red Jasper Brick Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ ТреÑнутого Кирпича КраÑного Яшмы +Outer Cobbled Red Jasper Stair=ВнешнÑÑ Ð¡Ñ‚ÑƒÐ¿ÐµÐ½ÑŒ БруÑчатки КраÑного Яшмы + +Outer Kyanite Stair=ВнешнÑÑ Ð»ÐµÑтница из кианита +Outer Kyanite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из кианита +Outer Kyanite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока кианита +Outer Cracked Kyanite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из кианита +Outer Cobbled Kyanite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из кианита + +Outer Lapis Lazuli Stair=ВнешнÑÑ Ð»ÐµÑтница из лÑпиÑ-лавы +Outer Lapis Lazuli Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из лÑпиÑ-лавы +Outer Lapis Lazuli Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока лÑпиÑ-лавы +Outer Cracked Lapis Lazuli Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из лÑпиÑ-лавы + +Outer Lepidolite Stair=ВнешнÑÑ Ñтупенька лепидолита +Outer Lepidolite Brick Stair=ВнешнÑÑ Ñтупенька из лепидолитового кирпича +Outer Lepidolite Block Stair=ВнешнÑÑ Ñтупенька из блока лепидолита +Outer Cracked Lepidolite Brick Stair=ВнешнÑÑ Ñтупенька из треÑнутого лепидолитового кирпича +Outer Cobbled Lepidolite Stair=ВнешнÑÑ Ñтупенька из бруÑчатки лепидолита + +Outer Blue Limestone Stair=ВнешнÑÑ Ð»ÐµÑтница из голубого извеÑтнÑка +Outer Blue Limestone Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из голубого извеÑтнÑка +Outer Blue Limestone Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока голубого извеÑтнÑка +Outer Cracked Blue Limestone Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из голубого извеÑтнÑка +Outer Cobbled Blue Limestone Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из голубого извеÑтнÑка + +Outer White Limestone Stair=ВнешнÑÑ Ð»ÐµÑтница из белого извеÑтнÑка +Outer White Limestone Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из белого извеÑтнÑка +Outer White Limestone Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока белого извеÑтнÑка +Outer Cracked White Limestone Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из белого извеÑтнÑка +Outer Cobbled White Limestone Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница + +Outer Marble Stair=ВнешнÑÑ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð»ÐµÑтница +Outer Marble Brick Stair=ВнешнÑÑ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Marble Block Stair=ВнешнÑÑ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Cracked Marble Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Cobbled Marble Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð¼Ñ€Ð°Ð¼Ð¾Ñ€Ð½Ð°Ñ Ð»ÐµÑтница + +Outer Moonstone Stair=ВнешнÑÑ Ñтупенька лунного ÐºÐ°Ð¼Ð½Ñ +Outer Moonstone Brick Stair=ВнешнÑÑ Ñтупенька из лунного кирпича +Outer Moonstone Block Stair=ВнешнÑÑ Ñтупенька из блока лунного ÐºÐ°Ð¼Ð½Ñ +Outer Cracked Moonstone Brick Stair=ВнешнÑÑ Ñтупенька из треÑнутого лунного каменного кирпича + +Outer Morion Quartz Stair=ВнешнÑÑ Ð»ÐµÑтница из Морионового Кварца +Outer Morion Quartz Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из Морионового Кварца +Outer Morion Quartz Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока из Морионового Кварца +Outer Cracked Morion Quartz Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из Морионового Кварца + +Outer Mudstone Stair=ВнешнÑÑ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ +Outer Cobbled Mudstone Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ +Outer Mudstone Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ +Outer Mudstone Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока иловатого ÐºÐ°Ð¼Ð½Ñ +Outer Cracked Mudstone Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из иловатого ÐºÐ°Ð¼Ð½Ñ + +Outer Prasiolite Stair=ВнешнÑÑ Ð»ÐµÑтница из празиолита +Outer Prasiolite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из празиолита +Outer Prasiolite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока из празиолита +Outer Cracked Prasiolite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из празиолита + +Outer Pumice Stair=ВнешнÑÑ Ð»ÐµÑтница из пемзы +Outer Pumice Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из пемзы +Outer Pumice Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока из пемзы +Outer Cracked Pumice Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из пемзы + +Outer Pyrite Stair=ВнешнÑÑ Ð»ÐµÑтница из пирита +Outer Pyrite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из пирита +Outer Pyrite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока из пирита +Outer Cracked Pyrite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из пирита + +Outer Quartz Stair=ВнешнÑÑ Ð»ÐµÑтница из кварца +Outer Quartz Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из кварца +Outer Quartz Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока из кварца +Outer Cracked Quartz Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из кварца + +Outer Rhodonite Stair=ВнешнÑÑ Ñтупенька родонита +Outer Rhodonite Brick Stair=ВнешнÑÑ Ñтупенька из родонитового кирпича +Outer Rhodonite Block Stair=ВнешнÑÑ Ñтупенька из блока родонита +Outer Cracked Rhodonite Brick Stair=ВнешнÑÑ Ñтупенька из треÑнутого родонитового кирпича +Outer Cobbled Rhodonite Stair=ВнешнÑÑ Ñтупенька из бруÑчатки родонита + +Outer Rose Quartz Stair=ВнешнÑÑ Ð»ÐµÑтница из розового кварца +Outer Rose Quartz Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича из розового кварца +Outer Rose Quartz Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока из розового кварца +Outer Cracked Rose Quartz Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнутого кирпича из розового кварца + +Outer Scoria Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñкории +Outer Scoria Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñкории +Outer Scoria Block Stair=Внутренний блочный Ñтупенька из Ñкории +Outer Cracked Scoria Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñкории +Outer Cobbled Scoria Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñкории + +Outer Serpentine Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñерпентина +Outer Cobbled Serpentine Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерпентина +Outer Serpentine Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерпентина +Outer Serpentine Block Stair=Внутренний блочный Ñтупенька из Ñерпентина +Outer Cracked Serpentine Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñерпентина + +Outer Shale Stair=ВнешнÑÑ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð»ÐµÑтница +Outer Shale Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñланцевого кирпича +Outer Shale Block Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñланцевого блока +Outer Cracked Shale Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего Ñланцевого кирпича +Outer Cobbled Shale Stair=ВнешнÑÑ Ð²Ñ‹Ð¼Ð¾Ñ‰ÐµÐ½Ð½Ð°Ñ ÑÐ»Ð°Ð½Ñ†ÐµÐ²Ð°Ñ Ð»ÐµÑтница + +Outer Slate Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñланца +Outer Slate Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Outer Slate Block Stair=Внутренний блочный Ñтупенька из Ñланца +Outer Cracked Slate Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из Ñланца +Outer Cobbled Slate Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñланца +Outer Slate Tile Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñланцевых плит + +Outer Smokey Quartz Stair=ВнешнÑÑ Ð»ÐµÑтница из дымчатого кварца +Outer Smokey Quartz Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из дымчатого кварца +Outer Smokey Quartz Block Stair=Внутренний блочный Ñтупенька из дымчатого кварца +Outer Cracked Smokey Quartz Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из дымчатого кварца + +Outer Soapstone Stair=ВнешнÑÑ Ð»ÐµÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ +Outer Soapstone Brick Stair=ВнешнÑÑ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ +Outer Soapstone Block Stair=Внутренний блочный Ñтупенька из мыльного ÐºÐ°Ð¼Ð½Ñ +Outer Cracked Soapstone Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÑ‚Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница из мыльного ÐºÐ°Ð¼Ð½Ñ + +Outer Sodalite Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñодалита +Outer Cobbled Sodalite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñодалита +Outer Sodalite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñодалитового кирпича +Outer Sodalite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñодалитового блока +Outer Cracked Sodalite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего Ñодалитового кирпича + +Outer Sugilite Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñугилита +Outer Sugilite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича Ñугилита +Outer Sugilite Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Ñугилита +Outer Cracked Sugilite Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича Ñугилита +Outer Cobbled Sugilite Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñугилита + +Outer Green Tourmaline Stair=ВнешнÑÑ Ñтупенька зеленого турмалина +Outer Green Tourmaline Brick Stair=ВнешнÑÑ Ñтупенька из зеленого турмалинового кирпича +Outer Green Tourmaline Block Stair=ВнешнÑÑ Ñтупенька из блока зеленого турмалина +Outer Cracked Green Tourmaline Brick Stair=ВнешнÑÑ Ñтупенька из треÑнутого зеленого турмалинового кирпича + +Outer Paraiba Tourmaline Stair=ВнешнÑÑ Ñтупенька парайба турмалина +Outer Paraiba Tourmaline Brick Stair=ВнешнÑÑ Ñтупенька из парайба турмалинового кирпича +Outer Paraiba Tourmaline Block Stair=ВнешнÑÑ Ñтупенька из блока парайба турмалина +Outer Cracked Paraiba Tourmaline Brick Stair=ВнешнÑÑ Ñтупенька из треÑнутого парайба турмалинового кирпича + +Outer Pink Tourmaline Stair=ВнешнÑÑ Ñтупенька из розового турмалина +Outer Pink Tourmaline Brick Stair=ВнешнÑÑ Ñтупенька из розового турмалинового кирпича +Outer Pink Tourmaline Block Stair=ВнешнÑÑ Ñтупенька из блока розового турмалина +Outer Cracked Pink Tourmaline Brick Stair=ВнешнÑÑ Ñтупенька из треÑнутого розового турмалинового кирпича + +Outer Travertine Stair=ВнешнÑÑ Ð»ÐµÑтница из травертина +Outer Cobbled Travertine Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из травертина +Outer Travertine Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича травертина +Outer Travertine Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока травертина +Outer Cracked Travertine Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича травертина + +Outer Yellow Travertine Stair=ВнешнÑÑ Ð»ÐµÑтница из жёлтого травертина +Outer Cobbled Yellow Travertine Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из жёлтого травертина +Outer Yellow Travertine Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича жёлтого травертина +Outer Yellow Travertine Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока жёлтого травертина +Outer Cracked Yellow Travertine Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича жёлтого травертина + +Outer Beige Tuff Stair=ВнешнÑÑ Ð»ÐµÑтница из бежевого туфа +Outer Cobbled Beige Tuff Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из бежевого туфа +Outer Beige Tuff Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича бежевого туфа +Outer Beige Tuff Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока бежевого туфа +Outer Cracked Beige Tuff Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича бежевого туфа + +Outer Grey Tuff Stair=ВнешнÑÑ Ð»ÐµÑтница из Ñерого туфа +Outer Cobbled Grey Tuff Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð»ÐµÑтница из Ñерого туфа +Outer Grey Tuff Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из кирпича Ñерого туфа +Outer Grey Tuff Block Stair=ВнешнÑÑ Ð»ÐµÑтница из блока Ñерого туфа +Outer Cracked Grey Tuff Brick Stair=ВнешнÑÑ Ð»ÐµÑтница из треÑнувшего кирпича Ñерого туфа + +Outer Red Tuff Stair=ВнешнÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Outer Cobbled Red Tuff Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Outer Red Tuff Brick Stair=ВнешнÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Red Tuff Block Stair=ВнешнÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Cracked Red Tuff Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ñ‚ÑƒÑ„Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница + +Outer Turquoise Stair=ВнешнÑÑ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Outer Turquoise Brick Stair=ВнешнÑÑ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Turquoise Block Stair=ВнешнÑÑ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Cracked Turquoise Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Cobbled Turquoise Stair=ВнешнÑÑ Ð¼Ð¾Ñ‰ÐµÐ½Ð°Ñ Ð±Ð¸Ñ€ÑŽÐ·Ð¾Ð²Ð°Ñ Ð»ÐµÑтница + +Outer Vivianite Stair=ВнешнÑÑ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð»ÐµÑтница +Outer Vivianite Brick Stair=ВнешнÑÑ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Vivianite Block Stair=ВнешнÑÑ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница +Outer Cracked Vivianite Brick Stair=ВнешнÑÑ Ñ‚Ñ€ÐµÑÐ½ÑƒÐ²ÑˆÐ°Ñ Ð²Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚Ð¾Ð²Ð°Ñ ÐºÐ¸Ñ€Ð¿Ð¸Ñ‡Ð½Ð°Ñ Ð»ÐµÑтница + +### nodes_glowing.lua ### + +Glowing Apatite=СветÑщийÑÑ Ð°Ð¿Ð°Ñ‚Ð¸Ñ‚ +Glowing Apatite Block=Блок ÑветÑщегоÑÑ Ð°Ð¿Ð°Ñ‚Ð¸Ñ‚Ð° +Cobbled Glowing Apatite=Мощеный ÑветÑщийÑÑ Ð°Ð¿Ð°Ñ‚Ð¸Ñ‚ +Glowing Apatite Brick=Кирпич ÑветÑщегоÑÑ Ð°Ð¿Ð°Ñ‚Ð¸Ñ‚Ð° +Cracked Glowing Apatite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ Ð°Ð¿Ð°Ñ‚Ð¸Ñ‚Ð° + +Glowing Calcite=СветÑщийÑÑ ÐºÐ°Ð»ÑŒÑ†Ð¸Ñ‚ +Glowing Calcite Block=Блок ÑветÑщегоÑÑ ÐºÐ°Ð»ÑŒÑ†Ð¸Ñ‚Ð° +Cobbled Glowing Calcite=Мощеный ÑветÑщийÑÑ ÐºÐ°Ð»ÑŒÑ†Ð¸Ñ‚ +Glowing Calcite Brick=Кирпич ÑветÑщегоÑÑ ÐºÐ°Ð»ÑŒÑ†Ð¸Ñ‚Ð° +Cracked Glowing Calcite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ ÐºÐ°Ð»ÑŒÑ†Ð¸Ñ‚Ð° + +Glowing Esperite=СветÑщийÑÑ ÑÑперит +Glowing Esperite Block=Блок ÑветÑщегоÑÑ ÑÑперита +Cobbled Glowing Esperite=Мощеный ÑветÑщийÑÑ ÑÑперит +Glowing Esperite Brick=Кирпич ÑветÑщегоÑÑ ÑÑперита +Cracked Glowing Esperite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ ÑÑперита + +Glowing Fluorite=СветÑщийÑÑ Ñ„Ð»ÑŽÐ¾Ñ€Ð¸Ñ‚ +Glowing Fluorite Block=Блок ÑветÑщегоÑÑ Ñ„Ð»ÑŽÐ¾Ñ€Ð¸Ñ‚Ð° +Cobbled Glowing Fluorite=Мощеный ÑветÑщийÑÑ Ñ„Ð»ÑŽÐ¾Ñ€Ð¸Ñ‚ +Glowing Fluorite Brick=Кирпич ÑветÑщегоÑÑ Ñ„Ð»ÑŽÐ¾Ñ€Ð¸Ñ‚Ð° +Cracked Glowing Fluorite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ Ñ„Ð»ÑŽÐ¾Ñ€Ð¸Ñ‚Ð° + +Glowing Selenite=СветÑщийÑÑ Ñеленит +Glowing Selenite Block=Блок ÑветÑщегоÑÑ Ñеленита +Cobbled Glowing Selenite=Мощеный ÑветÑщийÑÑ Ñеленит +Glowing Selenite Brick=Кирпич ÑветÑщегоÑÑ Ñеленита +Cracked Glowing Selenite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ Ñеленита + +Glowing Sodalite=СветÑщийÑÑ Ñодалит +Glowing Sodalite Block=Блок ÑветÑщегоÑÑ Ñодалита +Cobbled Glowing Sodalite=Мощеный ÑветÑщийÑÑ Ñодалит +Glowing Sodalite Brick=Кирпич ÑветÑщегоÑÑ Ñодалита +Cracked Glowing Sodalite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ Ñодалита + +Glowing Willemite=СветÑщийÑÑ Ð²Ð¸Ð»Ð»ÐµÐ¼Ð¸Ñ‚ +Glowing Willemite Block=Блок ÑветÑщегоÑÑ Ð²Ð¸Ð»Ð»ÐµÐ¼Ð¸Ñ‚Ð° +Cobbled Glowing Willemite=Мощеный ÑветÑщийÑÑ Ð²Ð¸Ð»Ð»ÐµÐ¼Ð¸Ñ‚ +Glowing Willemite Brick=Кирпич ÑветÑщегоÑÑ Ð²Ð¸Ð»Ð»ÐµÐ¼Ð¸Ñ‚Ð° +Cracked Glowing Willemite Brick=ТреÑнувший кирпич ÑветÑщегоÑÑ Ð²Ð¸Ð»Ð»ÐµÐ¼Ð¸Ñ‚Ð° + +### nodes_crystal.lua ### + +Budding Amazonite=ЗарождающийÑÑ Ðмазонит +Amazonite Crystal=КриÑталл Ðмазонита + +Budding Amber=ЗарождающийÑÑ Ð¯Ð½Ñ‚Ð°Ñ€ÑŒ +Amber Crystal=КриÑталл Ð¯Ð½Ñ‚Ð°Ñ€Ñ + +Budding Amethyst=ЗарождающийÑÑ ÐметиÑÑ‚ +Amethyst Crystal=КриÑталл ÐметиÑта + +Budding Celestine=ЗарождающийÑÑ Ð¡ÐµÐ»ÐµÑтин +Celestine Crystal=КриÑталл СелеÑтина + +Budding Chalcanthite=ЗарождающийÑÑ Ð¥Ð°Ð»ÐºÐ°Ð½Ñ‚Ð¸Ñ‚ +Chalcanthite Crystal=КриÑталл Халкантита + +Budding Citrine=ЗарождающийÑÑ Ð¦Ð¸Ñ‚Ñ€Ð¸Ð½ +Citrine Crystal=КриÑталл Цитрина + +Budding Crocoite=ЗарождающийÑÑ ÐšÑ€Ð¾ÐºÐ¾Ð¸Ñ‚ +Crocoite Crystal=КриÑталл Крокоита + +Budding Eudialite=ЗарождающийÑÑ Ð­ÑƒÐ´Ð¸Ð°Ð»Ð¸Ñ‚ +Eudialite Crystal=КриÑталл Эудиалита + +Budding Heliodor=ЗарождающийÑÑ Ð“ÐµÐ»Ð¸Ð¾Ð´Ð¾Ñ€ +Heliodor Crystal=КриÑталл Гелиодора + +Budding Kyanite=ЗарождающийÑÑ ÐšÐ¸Ð°Ð½Ð¸Ñ‚ +Kyanite Crystal=КриÑталл Кианита + +Budding Moonstone=ЗарождающийÑÑ Ð›ÑƒÐ½Ð½Ñ‹Ð¹ Камень +Moonstone Crystal=КриÑталл Лунного ÐšÐ°Ð¼Ð½Ñ + +Budding Morion Quartz=ЗарождающийÑÑ ÐœÐ¾Ñ€Ð¸Ð¾Ð½Ð¾Ð²Ñ‹Ð¹ Кварц +Morion Quartz Crystal=КриÑталл Морионового Кварца + +Budding Prasiolite=ЗарождающийÑÑ ÐŸÑ€Ð°Ð·Ð¸Ð¾Ð»Ð¸Ñ‚ +Prasiolite Crystal=КриÑталл Празиолита + +Budding Quartz=ЗарождающийÑÑ ÐšÐ²Ð°Ñ€Ñ† +Quartz Crystal=КриÑталл Кварца + +Budding Rose Quartz=ЗарождающийÑÑ Ð Ð¾Ð·Ð¾Ð²Ñ‹Ð¹ Кварц +Rose Quartz Crystal=КриÑталл Розового Кварца + +Budding Smokey Quartz=ЗарождающийÑÑ Ð”Ñ‹Ð¼Ñ‡Ð°Ñ‚Ñ‹Ð¹ Кварц +Smokey Quartz Crystal=КриÑталл Дымчатого Кварца + +Budding Green Tourmaline=ЗарождающийÑÑ Ð—ÐµÐ»ÐµÐ½Ñ‹Ð¹ Турмалин +Green Tourmaline Crystal=КриÑталл Зеленого Турмалина + +Budding Paraiba Tourmaline=ЗарождающийÑÑ ÐŸÐ°Ñ€Ð°Ð¸Ð±Ð°-Турмалин +Paraiba Tourmaline Crystal=КриÑталл Параиба-Турмалина + +Budding Pink Tourmaline=ЗарождающийÑÑ Ð Ð¾Ð·Ð¾Ð²Ñ‹Ð¹ Турмалин +Pink Tourmaline Crystal=КриÑталл Розового Турмалина + +Budding Vivianite=ЗарождающийÑÑ Ð’Ð¸Ð²Ð¸Ð°Ð½Ð¸Ñ‚ +Vivianite Crystal=КриÑталл Вивианита diff --git a/mods/too_many_stones/mapgen.lua b/mods/too_many_stones/mapgen.lua new file mode 100644 index 00000000..efc8b328 --- /dev/null +++ b/mods/too_many_stones/mapgen.lua @@ -0,0 +1,7771 @@ +-- Queue up ores for later registration after all mods are loaded +-- Kindly provided by EmptyStar +local oreq = {} +local function register_ore_by_climate(ore) + -- Queue up ore for processing after all mods are loaded + table.insert(oreq,ore) +end + +-- Do actual ore registration based on provided climate data after all mods are loaded +minetest.register_on_mods_loaded(function() + for _,ore in ipairs(oreq) do + -- Initialize any missing biome or climate values + ore.biomes = ore.biomes or {} + + local checksum = 0 + if not ore.heat_min then + ore.heat_min = -100 + checksum = checksum + 1 + end + + if not ore.heat_max then + ore.heat_max = 200 + checksum = checksum + 1 + end + + if not ore.humidity_min then + ore.humidity_min = -100 + checksum = checksum + 1 + end + + if not ore.humidity_max then + ore.humidity_max = 200 + checksum = checksum + 1 + end + + -- Add matching biomes to ore biome list if any climate data was specified + if checksum ~= 4 then + checksum = #ore.biomes + for name,biome in pairs(minetest.registered_biomes) do + -- Increment biome checksum + checksum = checksum + 1 + + -- Ensure climate values + local heat = biome.heat_point or 50 + local humidity = biome.humidity_point or 50 + + -- Add biome if climate values match + if ( + heat >= ore.heat_min and + heat <= ore.heat_max and + humidity >= ore.humidity_min and + humidity <= ore.humidity_max + ) then + table.insert(ore.biomes,name) + end + end + else + checksum = #ore.biomes + 1 + end + + -- Don't use an empty biome list or a biome list that contains all biomes + ore.biomes = #ore.biomes > 0 and #ore.biomes < checksum and ore.biomes or nil + + -- Register ore with Minetest one source node at a time due to an engine timing bug + local sources = ore.wherein + for i = 1, #sources do + ore.wherein = sources[i] + minetest.register_ore(ore) + end + end +end) + +-- Generate unique seeds for each stone +local _seed = 12345 +local function seed() + _seed = _seed + 97 + return _seed +end + +-- Replace some naturally generated lapis lazuli with pyrite +minetest.register_lbm({ + label = "Replace a fraction of lapis lazuli with pyrite", + name = "too_many_stones:lapis2pyrite", + nodenames = {"too_many_stones:lapis_lazuli"}, + run_at_every_load = true, + action = function(pos,node) + local coordinate_sum = pos.x ^ 2 + pos.y * 2 + pos.z + local newnode = "too_many_stones:lapis_lazuli" + if coordinate_sum % 17 == 4 and node.param2 == 1 then + newnode = "too_many_stones:pyrite" + end + minetest.set_node(pos,{ name = newnode , param2 = 0 }) + end, +}) + +-- Lists of source stones for different environments +local src = { + -- Source stone groups + stone = {"mapgen_stone"}, + sand = {}, + desert_sand = {}, + silver_sand = {}, + desert_stone = {}, + sandstone = {}, + desert_sandstone = {}, + silver_sandstone = {}, + + -- Select function for selecting multiple source stones/groups + select = function(self,...) + local nodes = {} + for _,group in ipairs({...}) do + local stones = self[group] + if stones then + for _,node in ipairs(self[group]) do + table.insert(nodes,node) + end + else + table.insert(nodes,stones) + end + end + return nodes + end, +} + +-- ------------- -- +-- Mod Support -- +-- ------------- -- + +-- Minetest Game +if too_many_stones.mods.default then + table.insert(src.desert_stone,"default:desert_stone") + table.insert(src.sand,"default:sand") + table.insert(src.desert_sand,"default:desert_sand") + table.insert(src.silver_sand,"default:silver_sand") + table.insert(src.sandstone,"default:sandstone") + table.insert(src.desert_sandstone,"default:desert_sandstone") + table.insert(src.silver_sandstone,"default:silver_sandstone") +end + +-- Everness +if too_many_stones.mods.everness then + for _,stone in ipairs({ + "everness:coral_desert_stone", + "everness:crystal_stone", + "everness:cursed_stone_carved", + "everness:forsaken_tundra_stone", + "everness:mineral_stone", + "everness:mineral_cave_stone", + }) do + table.insert(src.stone,stone) + end + table.insert(src.desert_stone,"everness:forsaken_desert_stone") +end + +-- Natural Biomes +if too_many_stones.mods.naturalbiomes then + for _,stone in ipairs({ + "naturalbiomes:bambooforest_rock", + "naturalbiomes:mediterran_rock", + "naturalbiomes:alpine_rock", + "naturalbiomes:outback_ground", + }) do + table.insert(src.stone,stone) + end + table.insert(src.sand,"naturalbiomes:palmbeach_sand") +end + +-- Dorwinion (Biomes modpack, Variety) +if too_many_stones.mods.dorwinion then + table.insert(src.stone,"dorwinion:dorwinion") +end + +-- Minetest Game, Mesecraft, and Others + +if too_many_stones.mods.default then + +-- Blue Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_blue", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gray Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_gray", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_green", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Moss Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_moss", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Orange Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_orange", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Purple Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_purple", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_red", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amazonite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amazonite", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amber + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amber", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amber", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amethyst + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amethyst", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amethyst", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Ammolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:ammolite", + wherein = src:select("stone","sand"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 50, + heat_max = 100, + humidity_min = 50, + humidity_max = 100, + y_max = -5, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Andesite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:andesite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Basalt + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:basalt", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Columnar Basalt + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:basalt_columnar", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Moonstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_moonstone", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_moonstone", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Grey Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite_grey", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 30, + humidity_min = 50, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = src:select("sand","silver_sand"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 0, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Orange Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite_orange", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 70, + heat_max = 100, + humidity_min = 0, + humidity_max = 50, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Carnotite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:carnotite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = -300, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Celestine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:celestine", + wherein = too_many_stones.mods.asuna_core and src:select("stone") or src:select("silver_sandstone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = too_many_stones.mods.asuna_core and 60 or 0, + heat_max = 100, + humidity_min = too_many_stones.mods.asuna_core and 60 or 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Citrine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:citrine", + wherein = src:select("desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Chalcanthite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chalcanthite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 80, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = -10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chalcanthite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 80, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = 100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Chrysoprase + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chrysoprase", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chrysoprase", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Covellite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:covellite", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Crocoite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:crocoite", + wherein = src:select("stone","desert_stone","sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Diorite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:diorite", + wherein = src:select("stone","desert_stone","sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 20, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Erythrite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:erythrite", + wherein = src:select("stone","desert_stone","sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Eudialite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:eudialite", + wherein = src:select("stone","desert_stone","sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Fluorite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:fluorite", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gabbro + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:gabbro", + wherein = src:select("stone","desert_stone","sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 20, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Galena + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:galena", + ore_param2 = 1, + wherein = src:select("stone","desert_stone","sandstone_desert","desert_sandstone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:galena", + wherein = src:select("stone","desert_stone","sandstone_desert","desert_sandstone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_black", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Blue Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_blue", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 60, + humidity_max = 100, + y_max = 30, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gray Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_gray", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_gray", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_green", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 56, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pink Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_pink", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_red", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 55, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- White Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_white", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_white", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Yellow Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_yellow", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Heliodor + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:heliodor", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -30, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:heliodor", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = -30, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Howlite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:howlite", + wherein = src:select("stone","silver_sandstone","desert_sandstone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Ilvaite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:ilvaite", + wherein = src:select("stone","desert_stone","default:permafrost"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Jade + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jade", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jade", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Jasper + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jasper_red", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 20, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Kyanite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:kyanite", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 60, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:kyanite", + wherein = src:select("silver_sand"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Lapis Lazuli + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:lapis_lazuli", + wherein = src:select("desert_stone","sandstone_desert","silver_sandstone"), + clust_scarcity = 80 * 48 * 80, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + ore_param2 = 1, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Lepidolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:lepidolite", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 30, + humidity_min = 40, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Blue Limestone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:limestone_blue", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- White Limestone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:limestone_white", + wherein = src:select("stone","silver_sand"), + clust_scarcity = 56 * 56 * 56, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Marble + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:marble", + wherein = src:select("stone","sandstone_desert","silver_sandstone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Moonstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:moonstone", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Morion Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:morion_quartz", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:morion_quartz", + wherein = src:select("sand","desert_sand","silver_sand"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Mudstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:mudstone", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_opal", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Fire Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:fire_opal", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:opal", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Prasiolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:prasiolite", + wherein = src:select("stone","desert_stone","silver_sandstone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 50, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:prasiolite", + wherein = src:select("sand","desert_sand","silver_sand"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pumice + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pumice", + wherein = src:select("stone","desert_stone","default:gravel"), + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pumice", + wherein = {"mapgen_water_source"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + y_max = 31000, + y_min = -1, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pyrite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pyrite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 48 * 48 * 48, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -40, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pyrite", + wherein = src:select("desert_stone","sandstone_desert","silver_sandstone"), + clust_scarcity = 80 * 48 * 80, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = src:select("sand","desert_sand","silver_sand"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Rhodonite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rhodonite", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Rose Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rose_quartz", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rose_quartz", + wherein = src:select("sand","desert_sand","silver_sand"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Scoria + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:scoria", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Serpentine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:serpentine", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Shale + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:shale", + wherein = src:select("stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 40, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:shale", + wherein = src:select("stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Slate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:slate", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:slate", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Smokey Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:smokey_quartz", + wherein = src:select("desert_stone","sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Soapstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:soapstone", + wherein = src:select("sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:soapstone", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 0, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Sodalite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sodalite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Sugilite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sugilite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 30, + y_min = -2000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sugilite", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 30, + y_min = -2000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_green", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Paraiba Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_paraiba", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pink Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_pink", + wherein = src:select("stone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Travertine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = src:select("sandstone_desert"), + clust_scarcity = 72 * 72 * 72, + clust_size = 30, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Yellow Travertine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine_yellow", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Beige Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_beige", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Grey Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_grey", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_red", + wherein = src:select("stone","desert_stone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Turquoise + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sandstone_with_turquoise", + wherein = src:select("sandstone_desert"), + clust_scarcity = 56 * 56 * 56, + clust_size = 15, +-- heat_min = 20, +-- heat_max = 60, +-- humidity_min = 20, +-- humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:desert_sandstone_with_turquoise", + wherein = src:select("desert_sandstone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 15, +-- heat_min = 20, +-- heat_max = 60, +-- humidity_min = 20, +-- humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:silver_sandstone_with_turquoise", + wherein = src:select("silver_sandstone"), + clust_scarcity = 56 * 56 * 56, + clust_size = 15, +-- heat_min = 20, +-- heat_max = 60, +-- humidity_min = 20, +-- humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Vivianite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:vivianite", + wherein = src:select("stone","silver_sandstone"), + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Minebase Version + +elseif too_many_stones.mods.base_earth then + +-- Blue Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_blue", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gray Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_gray", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_green", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Moss Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_moss", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Orange Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_orange", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Purple Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_purple", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_red", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amazonite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amazonite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amber + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amber", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amber", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amethyst + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amethyst", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amethyst", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Ammolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:ammolite", + wherein = {"mapgen_stone", "base_earth:sand"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 50, + heat_max = 100, + humidity_min = 50, + humidity_max = 100, + y_max = -5, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Andesite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:andesite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Basalt + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:basalt", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Columnar Basalt + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:basalt_columnar", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Moonstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_moonstone", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_moonstone", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Grey Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite_grey", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 30, + humidity_min = 50, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = {"base_earth:sand", "base_earth:silver_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 0, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Orange Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite_orange", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 70, + heat_max = 100, + humidity_min = 0, + humidity_max = 50, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Carnotite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:carnotite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = -300, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Celestine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:celestine", + wherein = {"base_earth:silver_sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Citrine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:citrine", + wherein = {"base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Chalcanthite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chalcanthite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 80, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = -10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chalcanthite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 80, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = 100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Chrysoprase + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chrysoprase", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chrysoprase", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Covellite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:covellite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Crocoite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:crocoite", + wherein = {"mapgen_stone","base_earth:desert_stone","base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Diorite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:diorite", + wherein = {"mapgen_stone","base_earth:desert_stone","base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 20, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Erythrite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:erythrite", + wherein = {"mapgen_stone","base_earth:desert_stone","base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Eudialite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:eudialite", + wherein = {"mapgen_stone","base_earth:desert_stone","base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Fluorite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:fluorite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gabbro + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:gabbro", + wherein = {"mapgen_stone","base_earth:desert_stone","base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 20, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Galena + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:galena", + ore_param2 = 1, + wherein = {"mapgen_stone", "base_earth:sandstone", "base_earth:desert_sandstone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:galena", + wherein = {"mapgen_stone", "base_earth:sandstone", "base_earth:desert_sandstone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_black", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Blue Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_blue", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 60, + humidity_max = 100, + y_max = 30, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gray Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_gray", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_gray", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_green", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 56, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pink Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_pink", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_red", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 55, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- White Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_white", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_white", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Yellow Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_yellow", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Heliodor + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:heliodor", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -30, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:heliodor", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = -30, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Howlite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:howlite", + wherein = {"mapgen_stone", "base_earth:silver_sandstone", "base_earth:desert_sandstone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Ilvaite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:ilvaite", + wherein = {"mapgen_stone", "base_earth:desert_stone", "base_earth:permafrost"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Jade + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jade", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jade", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Jasper + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jasper_red", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 20, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Kyanite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:kyanite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 60, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:kyanite", + wherein = {"base_earth:silver_sand"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Lapis Lazuli + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:lapis_lazuli", + wherein = {"base_earth:sandstone", "base_earth:desert_stone", "base_earth:silver_sandstone"}, + clust_scarcity = 80 * 48 * 80, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + ore_param2 = 1, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Lepidolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:lepidolite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 30, + humidity_min = 40, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Blue Limestone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:limestone_blue", + wherein = {"mapgen_stone", "base_earth:sand", "base_earth:desert_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- White Limestone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:limestone_white", + wherein = {"mapgen_stone", "base_earth:silver_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Marble + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:marble", + wherein = {"mapgen_stone", "base_earth:sandstone", "base_earth:silver_sandstone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Moonstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:moonstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Morion Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:morion_quartz", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:morion_quartz", + wherein = {"base_earth:sand", "base_earth:silver_sand", "base_earth:desert_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Mudstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:mudstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_opal", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Fire Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:fire_opal", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:opal", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Picture Jasper + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:picture_jasper", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Prasiolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:prasiolite", + wherein = {"mapgen_stone", "base_earth:silver_sandstone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 50, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:prasiolite", + wherein = {"base_earth:sand", "base_earth:silver_sand", "base_earth:desert_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pumice + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pumice", + wherein = {"mapgen_stone", "base_earth:gravel", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pumice", + wherein = {"mapgen_water_source"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + y_max = 31000, + y_min = -1, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pyrite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pyrite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 48 * 48 * 48, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -40, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pyrite", + wherein = {"base_earth:sandstone", "base_earth:desert_stone", "base_earth:silver_sandstone"}, + clust_scarcity = 80 * 48 * 80, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = {"base_earth:sand", "base_earth:silver_sand", "base_earth:desert_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Rhodonite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rhodonite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Rose Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rose_quartz", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rose_quartz", + wherein = {"base_earth:sand", "base_earth:silver_sand", "base_earth:desert_sand"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + y_max = -2, + y_min = -50, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Scoria + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:scoria", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Serpentine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:serpentine", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Slate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:slate", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:slate", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Smokey Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:smokey_quartz", + wherein = {"base_earth:sandstone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Soapstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:soapstone", + wherein = {"base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:soapstone", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 0, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Sodalite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sodalite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Sugilite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sugilite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 30, + y_min = -2000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sugilite", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 30, + y_min = -2000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_green", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Paraiba Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_paraiba", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pink Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_pink", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Travertine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = {"base_earth:sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 30, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Yellow Travertine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine_yellow", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Beige Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_beige", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Grey Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_grey", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_red", + wherein = {"mapgen_stone", "base_earth:desert_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Turquoise + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sandstone_with_turquoise", + wherein = {"base_earth:sandstone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 15, +-- heat_min = 20, +-- heat_max = 60, +-- humidity_min = 20, +-- humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:desert_sandstone_with_turquoise", + wherein = {"base_earth:desert_sandstone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 15, +-- heat_min = 20, +-- heat_max = 60, +-- humidity_min = 20, +-- humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:silver_sandstone_with_turquoise", + wherein = {"base_earth:silver_sandstone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 15, +-- heat_min = 20, +-- heat_max = 60, +-- humidity_min = 20, +-- humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Vivianite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:vivianite", + wherein = {"mapgen_stone", "base_earth:silver_sandstone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Universal + +else + +-- Blue Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_blue", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gray Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_gray", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_green", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Moss Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_moss", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Orange Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_orange", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Purple Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_purple", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Agate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:agate_red", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amazonite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amazonite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amber + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amber", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amber", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Amethyst + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amethyst", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:amethyst", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Ammolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:ammolite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 50, + heat_max = 100, + humidity_min = 50, + humidity_max = 100, + y_max = -5, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Andesite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:andesite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Basalt + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:basalt", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Columnar Basalt + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:basalt_columnar", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Moonstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_moonstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_moonstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Grey Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite_grey", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 30, + humidity_min = 50, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite", + wherein = {"mapgen_stone"}, + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Orange Calcite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:calcite_orange", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 70, + heat_max = 100, + humidity_min = 0, + humidity_max = 50, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Carnotite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:carnotite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = -300, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Celestine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:celestine", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Citrine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:citrine", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Chalcanthite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chalcanthite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 80, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = -10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chalcanthite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 80, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = 100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Chrysoprase + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chrysoprase", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:chrysoprase", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Covellite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:covellite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Crocoite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:crocoite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Diorite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:diorite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 20, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Erythrite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:erythrite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Eudialite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:eudialite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Fluorite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:fluorite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gabbro + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:gabbro", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 20, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Galena + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:galena", + ore_param2 = 1, + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:galena", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_black", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Blue Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_blue", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 60, + humidity_max = 100, + y_max = 30, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Gray Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_gray", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_gray", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_green", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 56, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pink Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_pink", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_red", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 55, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- White Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_white", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_white", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Yellow Granite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:granite_yellow", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 10, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Heliodor + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:heliodor", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -30, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:heliodor", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = -30, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Howlite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:howlite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Ilvaite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:ilvaite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Jade + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jade", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jade", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Jasper + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:jasper_red", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 20, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Kyanite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:kyanite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 60, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Lapis Lazuli + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:lapis_lazuli", + wherein = {"mapgen_stone"}, + clust_scarcity = 80 * 48 * 80, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + ore_param2 = 1, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Lepidolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:lepidolite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 30, + humidity_min = 40, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Blue Limestone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:limestone_blue", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- White Limestone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:limestone_white", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -300, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Marble + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:marble", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -500, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Moonstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:moonstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Morion Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:morion_quartz", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Mudstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:mudstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -100, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Black Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:black_opal", + wherein = {"mapgen_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Fire Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:fire_opal", + wherein = {"mapgen_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Opal + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:opal", + wherein = {"mapgen_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Picture Jasper + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:picture_jasper", + wherein = {"mapgen_stone"}, + clust_scarcity = 80 * 80 * 80, + clust_size = 4, + y_max = -1000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Prasiolite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:prasiolite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 50, + y_min = -1000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pumice + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pumice", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pumice", + wherein = {"mapgen_water_source"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 10, + y_max = 31000, + y_min = -1, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pyrite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:pyrite", + wherein = {"mapgen_stone"}, + clust_scarcity = 48 * 48 * 48, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -40, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0 + }, + }) + +-- Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:quartz", + wherein = {"mapgen_stone"}, + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Rhodonite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rhodonite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Rose Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:rose_quartz", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = -300, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Scoria + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:scoria", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Serpentine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:serpentine", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Shale + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:shale", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 40, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:shale", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Slate + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:slate", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:slate", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Smokey Quartz + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:smokey_quartz", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 40, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Soapstone + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:soapstone", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 0, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Sodalite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sodalite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 40, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Sugilite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sugilite", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 30, + y_min = -2000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:sugilite", + wherein = {"mapgen_stone"}, + clust_scarcity = 68 * 68 * 68, + clust_size = 7, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 30, + y_min = -2000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Green Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_green", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Paraiba Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_paraiba", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Pink Tourmaline + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tourmaline_pink", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 10, + heat_min = 0, + heat_max = 20, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 50, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Travertine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 0, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine", + wherein = {"mapgen_stone"}, + clust_scarcity = 70 * 70 * 70, + clust_size = 14, + heat_min = 41, + heat_max = 59, + humidity_min = 41, + humidity_max = 59, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Yellow Travertine + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:travertine_yellow", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Beige Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_beige", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Grey Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_grey", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Red Tuff + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:tuff_red", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 14, + heat_min = 60, + heat_max = 100, + humidity_min = 0, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Turquoise + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:turquoise", + wherein = {"mapgen_stone"}, + clust_scarcity = 56 * 56 * 56, + clust_size = 15, + heat_min = 20, + heat_max = 60, + humidity_min = 20, + humidity_max = 60, + y_max = 300, + y_min = -60, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 61, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +-- Vivianite + + register_ore_by_climate({ + ore_type = "blob", + ore = "too_many_stones:vivianite", + wherein = {"mapgen_stone"}, + clust_scarcity = 72 * 72 * 72, + clust_size = 7, + heat_min = 0, + heat_max = 100, + humidity_min = 60, + humidity_max = 100, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + octaves = 1, + persist = 0.0, + seed = seed(), + }, + }) + +end diff --git a/mods/too_many_stones/mod.conf b/mods/too_many_stones/mod.conf new file mode 100644 index 00000000..806eb079 --- /dev/null +++ b/mods/too_many_stones/mod.conf @@ -0,0 +1,6 @@ +name = too_many_stones +description = Adds several new stone types to nearly any Minetest Game and mapgen to any game that uses mapgen_stone. V6 terrain may be buggy, but is supported. Stairs, slabs, and walls will be available only if your game supplies stairs and walls or you install the mods to your game. Geodes are added if you have "geodes" or "geodes_lib" mod. Some blocks can be dyed to make others if you have dye. +optional_depends = stairs, walls, geodes, moreores, geodes_lib, dye, default, lottmapgen, base_earth, asuna_core, naturalbiomes, everness, dorwinion +min_minetest_version = 5.3 +title = Too Many Stones +author = JoeEnderman diff --git a/mods/too_many_stones/nodes.lua b/mods/too_many_stones/nodes.lua new file mode 100644 index 00000000..5fd5ee93 --- /dev/null +++ b/mods/too_many_stones/nodes.lua @@ -0,0 +1,3515 @@ +-- mods/too_many_stones/nodes.lua + +-- support for MT game translation. +local S = minetest.get_translator("too_many_stones") + + +--[[ Index: + +Blue Agate +Gray Agate +Green Agate +Moss Agate +Orange Agate +Purple Agate +Red Agate +Amazonite +Amber +Amethyst +Andesite +Basalt +Columnar Basalt +Black Moonstone +Black Opal +Grey Calcite +Calcite +Orange Calcite +Carnotite +Celestine +Chalcanthite +Chrysoprase +Citrine +Covellite +Crocoite +Diorite +Erythrite +Eudialite +Fire Opal +Fluorite +Gabbro +Galena +Granite +Heliodor +Howlite +Ilvaite +Jade +Red Jasper +Kyanite +Lapis Lazuli +Lepidolite +Limestone +Marble +Moonstone +Morion Quartz +Mudstone +Opal +Picture Jasper +Prasiolite +Pumice +Pyrite +Quartz +Rhodonite +Rose Quartz +Scoria +Serpentine +Shale +Slate +Smokey Quartz +Soapstone +Sodalite +Sugilite +Green Tourmaline +Paraiba Tourmaline +Pink Tourmaline +Travertine +Yellow Travertine +Beige Tuff +Grey Tuff +Red Tuff +Turquoise +Vivianite + +--]] + +-- +-- Stones +-- +-- Blue Agate +minetest.register_node("too_many_stones:agate_blue", { + description = S("Blue Agate"), + tiles = {"tms_agate_blue.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Gray Agate +minetest.register_node("too_many_stones:agate_gray", { + description = S("Gray Agate"), + tiles = {"tms_agate_gray.png"}, + is_ground_content = true, + groups = {cracky = 3, grey_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Green Agate +minetest.register_node("too_many_stones:agate_green", { + description = S("Green Agate"), + tiles = {"tms_agate_green.png"}, + is_ground_content = true, + groups = {cracky = 3, green_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Moss Agate +minetest.register_node("too_many_stones:agate_moss", { + description = S("Moss Agate"), + tiles = {"tms_agate_moss.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Orange Agate +minetest.register_node("too_many_stones:agate_orange", { + description = S("Orange Agate"), + tiles = {"tms_agate_orange.png"}, + is_ground_content = true, + groups = {cracky = 3, orange_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Purple Agate +minetest.register_node("too_many_stones:agate_purple", { + description = S("Purple Agate"), + tiles = {"tms_agate_purple.png"}, + is_ground_content = true, + groups = {cracky = 3, violet_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Red Agate +minetest.register_node("too_many_stones:agate_red", { + description = S("Red Agate"), + tiles = {"tms_agate_red.png"}, + is_ground_content = true, + groups = {cracky = 3, red_stone = 1, stone = 1, agate = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Amazonite +minetest.register_node("too_many_stones:amazonite", { + description = S("Amazonite"), + tiles = {"tms_amazonite.png"}, + is_ground_content = true, + groups = {cracky = 3, green_stone = 1, stone = 1}, + drop = "too_many_stones:amazonite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amazonite_block", { + description = S("Amazonite Block"), + tiles = {"tms_amazonite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amazonite_cobble", { + description = S("Cobbled Amazonite"), + tiles = {"tms_amazonite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, green_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amazonite_brick", { + description = S("Amazonite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_amazonite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amazonite_cracked_brick", { + description = S("Cracked Amazonite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_amazonite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Amber +minetest.register_node("too_many_stones:amber", { + description = S("Amber"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amber.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, brown_stone = 1, stone = 1}, + drop = "too_many_stones:amber", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:amber_block", { + description = S("Amber Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amber_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, brown_stone = 1, stone = 1}, + drop = "too_many_stones:amber_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:amber_brick", { + description = S("Amber Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_amber_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, brown_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:amber_cracked_brick", { + description = S("Cracked Amber Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_amber_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, brown_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Amethyst +minetest.register_node("too_many_stones:amethyst", { + description = S("Amethyst"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amethyst.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, violet_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:amethyst", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:amethyst_block", { + description = S("Amethyst Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amethyst_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, violet_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:amethyst_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:amethyst_brick", { + description = S("Amethyst Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_amethyst_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, violet_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:amethyst_cracked_brick", { + description = S("Cracked Amethyst Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_amethyst_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, violet_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Ammolite +minetest.register_node("too_many_stones:ammolite", { + description = S("Ammolite"), + tiles = { + { + name = "tms_ammolite_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 6.0, + }, + }, +}, + is_ground_content = true, + groups = {cracky = 3, orange_stone = 1, stone = 1, opal = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Andesite +minetest.register_node("too_many_stones:andesite", { + description = S("Andesite"), + tiles = {"tms_andesite.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + drop = "too_many_stones:andesite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:andesite_block", { + description = S("Andesite Block"), + tiles = {"tms_andesite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:andesite_cobble", { + description = S("Cobbled Andesite"), + tiles = {"tms_andesite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:andesite_brick", { + description = S("Andesite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_andesite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:andesite_cracked_brick", { + description = S("Cracked Andesite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_andesite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Basalt +minetest.register_node("too_many_stones:basalt", { + description = S("Basalt"), + tiles = {"tms_basalt.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + drop = "too_many_stones:basalt_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:basalt_block", { + description = S("Basalt Block"), + tiles = {"tms_basalt_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:basalt_cobble", { + description = S("Cobbled Basalt"), + tiles = {"tms_basalt_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:basalt_brick", { + description = S("Basalt Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_basalt_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:basalt_cracked_brick", { + description = S("Cracked Basalt Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_basalt_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +minetest.register_node("too_many_stones:basalt_tile", { + description = S("Cracked Basalt Tile"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_basalt_tile.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Columnar Basalt +minetest.register_node("too_many_stones:basalt_columnar", { + description = S("Columnar Basalt"), + tiles = {"tms_basalt_columnar_top.png", "tms_basalt_columnar_top.png", "tms_basalt_columnar.png"}, + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), + on_place = minetest.rotate_node +}) +-- Black Moonstone +minetest.register_node("too_many_stones:black_moonstone", { + description = S("Black Moonstone"), + tiles = {"tms_black_moonstone.png"}, + is_ground_content = true, + groups = {cracky = 3, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:black_moonstone_block", { + description = S("Black Moonstone Block"), + tiles = {"tms_black_moonstone_block.png"}, + is_ground_content = false, + groups = {cracky = 3, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:black_moonstone_brick", { + description = S("Black Moonstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_black_moonstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:black_moonstone_cracked_brick", { + description = S("Cracked Black Moonstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_black_moonstone_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Black Opal +minetest.register_node("too_many_stones:black_opal", { + description = S("Black Opal"), + tiles = { + { + name = "tms_black_opal_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 6.0, + }, + }, +}, + is_ground_content = true, + groups = {cracky = 3, green_stone = 1, stone = 1, opal = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Grey Calcite +minetest.register_node("too_many_stones:calcite_grey", { + description = S("Grey Calcite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_calcite_grey.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, grey_stone = 1, stone = 1}, + drop = "too_many_stones:calcite_grey", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_grey_block", { + description = S("Grey Calcite Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_calcite_grey_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 1}, + drop = "too_many_stones:calcite_grey_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_grey_brick", { + description = S("Grey Calcite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_calcite_grey_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_grey_cracked_brick", { + description = S("Cracked Grey Calcite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_calcite_grey_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Calcite +minetest.register_node("too_many_stones:calcite", { + description = S("Calcite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_calcite.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:calcite", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_block", { + description = S("Calcite Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_calcite_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:calcite_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_brick", { + description = S("Calcite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_calcite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_cracked_brick", { + description = S("Cracked Calcite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_calcite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Orange Calcite +minetest.register_node("too_many_stones:calcite_orange", { + description = S("Orange Calcite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_calcite_orange.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, orange_stone = 1, stone = 1}, + drop = "too_many_stones:calcite_orange", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_orange_block", { + description = S("Orange Calcite Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_calcite_orange_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, orange_stone = 1, stone = 1}, + drop = "too_many_stones:calcite_orange_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_orange_brick", { + description = S("Orange Calcite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_calcite_orange_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, orange_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:calcite_orange_cracked_brick", { + description = S("Cracked Orange Calcite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_calcite_orange_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, orange_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Carnotite +minetest.register_node("too_many_stones:carnotite", { + description = S("Carnotite"), + tiles = {"tms_carnotite.png"}, + is_ground_content = true, + groups = {cracky = 3, yellow_stone = 1, stone = 1}, + drop = "too_many_stones:carnotite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:carnotite_block", { + description = S("Carnotite Block"), + tiles = {"tms_carnotite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 1}, + drop = "too_many_stones:carnotite_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:carnotite_cobble", { + description = S("Cobbled Carnotite"), + tiles = {"tms_carnotite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:carnotite_brick", { + description = S("Carnotite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_carnotite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:carnotite_cracked_brick", { + description = S("Cracked Carnotite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_carnotite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Celestine +minetest.register_node("too_many_stones:celestine", { + description = S("Celestine"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_celestine.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + drop = "too_many_stones:celestine", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:celestine_block", { + description = S("Celestine Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_celestine_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + drop = "too_many_stones:celestine_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:celestine_brick", { + description = S("Celestine Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_celestine_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:celestine_cracked_brick", { + description = S("Cracked Celestine Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_celestine_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Chalcanthite +minetest.register_node("too_many_stones:chalcanthite", { + description = S("Chalcanthite"), + tiles = {"tms_chalcanthite.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + drop = "too_many_stones:chalcanthite", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chalcanthite_cobble", { + description = S("Cobbled Chalcanthite"), + tiles = {"tms_chalcanthite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:chalcanthite_block", { + description = S("Chalcanthite Block"), + tiles = {"tms_chalcanthite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + drop = "too_many_stones:chalcanthite_block", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chalcanthite_brick", { + description = S("Chalcanthite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_chalcanthite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chalcanthite_cracked_brick", { + description = S("Cracked Chalcanthite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_chalcanthite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Chrysoprase +minetest.register_node("too_many_stones:chrysoprase", { + description = S("Chrysoprase"), + tiles = {"tms_chrysoprase.png"}, + is_ground_content = true, + groups = {cracky = 3, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chrysoprase_block", { + description = S("Chrysoprase Block"), + tiles = {"tms_chrysoprase_block.png"}, + is_ground_content = false, + groups = {cracky = 3, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chrysoprase_brick", { + description = S("Chrysoprase Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_chrysoprase_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chrysoprase_cracked_brick", { + description = S("Cracked Chrysoprase Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_chrysoprase_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Citrine +minetest.register_node("too_many_stones:citrine", { + description = S("Citrine"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_citrine.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, yellow_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:citrine", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:citrine_block", { + description = S("Citrine Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_citrine_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:citrine_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:citrine_brick", { + description = S("Citrine Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_citrine_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:citrine_cracked_brick", { + description = S("Cracked Citrine Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_citrine_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Covellite +minetest.register_node("too_many_stones:covellite", { + description = S("Covellite"), + tiles = {"tms_covellite.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + drop = "too_many_stones:covellite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:covellite_cobble", { + description = S("Cobbled Covellite"), + tiles = {"tms_covellite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:covellite_block", { + description = S("Covellite Block"), + tiles = {"tms_covellite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:covellite_brick", { + description = S("Covellite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_covellite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:covellite_cracked_brick", { + description = S("Cracked Covellite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_covellite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Crocoite +minetest.register_node("too_many_stones:crocoite", { + description = S("Crocoite"), + tiles = {"tms_crocoite.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, orange_stone = 1, stone = 1}, + drop = "too_many_stones:crocoite", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:crocoite_block", { + description = S("Crocoite Block"), + tiles = {"tms_crocoite_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, orange_stone = 1, stone = 1}, + drop = "too_many_stones:crocoite_block", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:crocoite_brick", { + description = S("Crocoite Brick"), + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_crocoite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, orange_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:crocoite_cracked_brick", { + description = S("Cracked Crocoite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_crocoite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, orange_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Diorite +minetest.register_node("too_many_stones:diorite", { + description = S("Diorite"), + tiles = {"tms_diorite.png"}, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:diorite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:diorite_cobble", { + description = S("Cobbled Diorite"), + tiles = {"tms_diorite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:diorite_block", { + description = S("Diorite Block"), + tiles = {"tms_diorite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:diorite_brick", { + description = S("Diorite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_diorite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:diorite_cracked_brick", { + description = S("Cracked Diorite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_diorite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Erythrite +minetest.register_node("too_many_stones:erythrite", { + description = S("Erythrite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_erythrite.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, magenta_stone = 1, stone = 1}, + drop = "too_many_stones:erythrite", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:erythrite_block", { + description = S("Erythrite Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_erythrite_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, magenta_stone = 1, stone = 1}, + drop = "too_many_stones:erythrite_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:erythrite_brick", { + description = S("Erythrite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_erythrite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:erythrite_cracked_brick", { + description = S("Cracked Erythrite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_erythrite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Eudialite +minetest.register_node("too_many_stones:eudialite", { + description = S("Eudialite"), + tiles = {"tms_eudialite.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, magenta_stone = 1, stone = 1}, + drop = "too_many_stones:eudialite", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:eudialite_block", { + description = S("Eudialite Block"), + tiles = {"tms_eudialite_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, magenta_stone = 1, stone = 1}, + drop = "too_many_stones:eudialite_block", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:eudialite_brick", { + description = S("Eudialite Brick"), + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_eudialite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:eudialite_cracked_brick", { + description = S("Cracked Eudialite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_eudialite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Fire Opal +minetest.register_node("too_many_stones:fire_opal", { + description = S("Fire Opal"), + tiles = { + { + name = "tms_fire_opal_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 6.0, + }, + }, +}, + is_ground_content = true, + groups = {cracky = 3, orange_stone = 1, stone = 1, opal = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Fluorite +minetest.register_node("too_many_stones:fluorite", { + description = S("Fluorite"), + tiles = {"tms_fluorite.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:fluorite_block", { + description = S("Fluorite Block"), + tiles = {"tms_fluorite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:fluorite_brick", { + description = S("Fluorite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_fluorite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:fluorite_cracked_brick", { + description = S("Cracked Fluorite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_fluorite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Gabbro +minetest.register_node("too_many_stones:gabbro", { + description = S("Gabbro"), + tiles = {"tms_gabbro.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + drop = "too_many_stones:gabbro_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:gabbro_block", { + description = S("Gabbro Block"), + tiles = {"tms_gabbro_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + drop = "too_many_stones:gabbro_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:gabbro_cobble", { + description = S("Cobbled Gabbro"), + tiles = {"tms_gabbro_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:gabbro_brick", { + description = S("Gabbro Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_gabbro_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:gabbro_cracked_brick", { + description = S("Cracked Gabbro Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_gabbro_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Galena +minetest.register_node("too_many_stones:galena", { + description = S("Galena"), + tiles = {"tms_galena.png"}, + is_ground_content = true, + groups = {cracky = 3, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:galena_block", { + description = S("Galena Block"), + tiles = {"tms_galena_block.png"}, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:galena_brick", { + description = S("Galena Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_galena_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:galena_cracked_brick", { + description = S("Cracked Galena Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_galena_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Black Granite +minetest.register_node("too_many_stones:granite_black", { + description = S("Black Granite"), + tiles = {"tms_granite_black.png"}, + is_ground_content = true, + groups = {cracky = 3, black_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_black_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_black_block", { + description = S("Black Granite Block"), + tiles = {"tms_granite_black_block.png"}, + is_ground_content = false, + groups = {cracky = 3, black_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_black_cobble", { + description = S("Cobbled Black Granite"), + tiles = {"tms_granite_black_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, black_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_black_brick", { + description = S("Black Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_black_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_black_cracked_brick", { + description = S("Cracked Black Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_black_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Blue Granite +minetest.register_node("too_many_stones:granite_blue", { + description = S("Blue Granite"), + tiles = {"tms_granite_blue.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_blue_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_blue_block", { + description = S("Blue Granite Block"), + tiles = {"tms_granite_blue_block.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_blue_cobble", { + description = S("Cobbled Blue Granite"), + tiles = {"tms_granite_blue_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_blue_brick", { + description = S("Blue Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_blue_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_blue_cracked_brick", { + description = S("Cracked Blue Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_blue_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Gray Granite +minetest.register_node("too_many_stones:granite_gray", { + description = S("Gray Granite"), + tiles = {"tms_granite_gray.png"}, + is_ground_content = true, + groups = {cracky = 3, grey_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_gray_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_gray_block", { + description = S("Gray Granite Block"), + tiles = {"tms_granite_gray_block.png"}, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_gray_cobble", { + description = S("Cobbled Gray Granite"), + tiles = {"tms_granite_gray_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_gray_brick", { + description = S("Gray Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_gray_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_gray_cracked_brick", { + description = S("Cracked Gray Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_gray_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Green Granite +minetest.register_node("too_many_stones:granite_green", { + description = S("Green Granite"), + tiles = {"tms_granite_green.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_green_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_green_block", { + description = S("Green Granite Block"), + tiles = {"tms_granite_green_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_green_cobble", { + description = S("Cobbled Green Granite"), + tiles = {"tms_granite_green_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_green_brick", { + description = S("Green Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_green_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_green_cracked_brick", { + description = S("Cracked Green Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_green_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Pink Granite +minetest.register_node("too_many_stones:granite_pink", { + description = S("Pink Granite"), + tiles = {"tms_granite_pink.png"}, + is_ground_content = true, + groups = {cracky = 3, pink_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_pink_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_pink_block", { + description = S("Pink Granite Block"), + tiles = {"tms_granite_pink_block.png"}, + is_ground_content = false, + groups = {cracky = 3, pink_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_pink_cobble", { + description = S("Cobbled Pink Granite"), + tiles = {"tms_granite_pink_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, pink_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_pink_brick", { + description = S("Pink Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_pink_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, pink_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_pink_cracked_brick", { + description = S("Cracked Pink Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_pink_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, pink_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Red Granite +minetest.register_node("too_many_stones:granite_red", { + description = S("Red Granite"), + tiles = {"tms_granite_red.png"}, + is_ground_content = true, + groups = {cracky = 3, red_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_red_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_red_block", { + description = S("Red Granite Block"), + tiles = {"tms_granite_red_block.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_red_cobble", { + description = S("Cobbled Red Granite"), + tiles = {"tms_granite_red_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_red_brick", { + description = S("Red Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_red_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_red_cracked_brick", { + description = S("Cracked Red Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_red_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- White Granite +minetest.register_node("too_many_stones:granite_white", { + description = S("White Granite"), + tiles = {"tms_granite_white.png"}, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_white_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_white_block", { + description = S("White Granite Block"), + tiles = {"tms_granite_white_block.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_white_cobble", { + description = S("Cobbled White Granite"), + tiles = {"tms_granite_white_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_white_brick", { + description = S("White Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_white_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_white_cracked_brick", { + description = S("Cracked White Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_white_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Yellow Granite +minetest.register_node("too_many_stones:granite_yellow", { + description = S("Yellow Granite"), + tiles = {"tms_granite_yellow.png"}, + is_ground_content = true, + groups = {cracky = 3, yellow_stone = 1, stone = 1, granite = 1}, + drop = "too_many_stones:granite_yellow_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_yellow_block", { + description = S("Yellow Granite Block"), + tiles = {"tms_granite_yellow_block.png"}, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_yellow_cobble", { + description = S("Cobbled Yellow Granite"), + tiles = {"tms_granite_yellow_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 2, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_yellow_brick", { + description = S("Yellow Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_yellow_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:granite_yellow_cracked_brick", { + description = S("Cracked Yellow Granite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_granite_yellow_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1, granite = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Heliodor +minetest.register_node("too_many_stones:heliodor", { + description = S("Heliodor"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_heliodor.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, yellow_stone = 1, stone = 1, beryl = 1}, + drop = "too_many_stones:heliodor", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:heliodor_block", { + description = S("Heliodor Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_heliodor_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 1, beryl = 1}, + drop = "too_many_stones:heliodor_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:heliodor_brick", { + description = S("Heliodor Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_heliodor_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1, beryl = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:heliodor_cracked_brick", { + description = S("Cracked Heliodor Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_heliodor_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1, beryl = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Howlite +minetest.register_node("too_many_stones:howlite", { + description = S("Howlite"), + tiles = {"tms_howlite.png"}, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:howlite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:howlite_block", { + description = S("Howlite Block"), + tiles = {"tms_howlite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:howlite_cobble", { + description = S("Cobbled Howlite"), + tiles = {"tms_howlite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:howlite_brick", { + description = S("Howlite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_howlite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:howlite_cracked_brick", { + description = S("Cracked Howlite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_howlite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Ilvaite +minetest.register_node("too_many_stones:ilvaite", { + description = S("Ilvaite"), + tiles = {"tms_ilvaite.png"}, + is_ground_content = true, + groups = {cracky = 3, black_stone = 1, stone = 1}, + drop = "too_many_stones:ilvaite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:ilvaite_block", { + description = S("Ilvaite Block"), + tiles = {"tms_ilvaite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, black_stone = 1, stone = 1}, + drop = "too_many_stones:ilvaite_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:ilvaite_cobble", { + description = S("Cobbled Ilvaite"), + tiles = {"tms_ilvaite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, black_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:ilvaite_brick", { + description = S("Ilvaite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_ilvaite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:ilvaite_cracked_brick", { + description = S("Cracked Ilvaite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_ilvaite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +--Jade + +minetest.register_node("too_many_stones:jade", { + description = S("Jade"), + tiles = {"tms_jade.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:jade_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jade_block", { + description = S("Jade Block"), + tiles = {"tms_jade_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:jade_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jade_cobble", { + description = S("Cobbled Jade"), + tiles = {"tms_jade_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jade_brick", { + description = S("Jade Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_jade_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jade_cracked_brick", { + description = S("Cracked Jade Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_jade_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +--Red Jasper + +minetest.register_node("too_many_stones:jasper_red", { + description = S("Red Jasper"), + tiles = {"tms_jasper_red.png"}, + is_ground_content = true, + groups = {cracky = 3, red_stone = 1, stone = 1}, + drop = "too_many_stones:jasper_red_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jasper_red_block", { + description = S("Red Jasper Block"), + tiles = {"tms_jasper_red_block.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 1}, + drop = "too_many_stones:jasper_red_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jasper_red_cobble", { + description = S("Cobbled Red Jasper"), + tiles = {"tms_jasper_red_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jasper_red_brick", { + description = S("Red Jasper Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_jasper_red_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:jasper_red_cracked_brick", { + description = S("Cracked Red Jasper Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_jasper_red_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Kyanite +minetest.register_node("too_many_stones:kyanite", { + description = S("Kyanite"), + tiles = {"tms_kyanite.png"}, + is_ground_content = true, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + drop = "too_many_stones:kyanite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:kyanite_block", { + description = S("Kyanite Block"), + tiles = {"tms_kyanite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + drop = "too_many_stones:kyanite_block", + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:kyanite_cobble", { + description = S("Cobbled Kyanite"), + tiles = {"tms_kyanite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:kyanite_brick", { + description = S("Kyanite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_kyanite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:kyanite_cracked_brick", { + description = S("Cracked Kyanite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_kyanite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Lapis Lazuli +minetest.register_node("too_many_stones:lapis_lazuli", { + description = S("Lapis Lazuli"), + tiles = {"tms_lapis_lazuli.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lapis_lazuli_block", { + description = S("Lapis Lazuli Block"), + tiles = {"tms_lapis_lazuli_block.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + drop = "too_many_stones:lapis_lazuli_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lapis_lazuli_brick", { + description = S("Lapis Lazuli Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_lapis_lazuli_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lapis_lazuli_cracked_brick", { + description = S("Cracked Lapis Lazuli Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_lapis_lazuli_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Lepidolite +minetest.register_node("too_many_stones:lepidolite", { + description = S("Lepidolite"), + tiles = {"tms_lepidolite.png"}, + is_ground_content = true, + groups = {cracky = 3, magenta_stone = 1, stone = 1}, + drop = "too_many_stones:lepidolite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lepidolite_block", { + description = S("Lepidolite Block"), + tiles = {"tms_lepidolite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, magenta_stone = 1, stone = 1}, + drop = "too_many_stones:lepidolite_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lepidolite_cobble", { + description = S("Cobbled Lepidolite"), + tiles = {"tms_lepidolite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, magenta_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lepidolite_brick", { + description = S("Lepidolite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_lepidolite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:lepidolite_cracked_brick", { + description = S("Cracked Lepidolite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_lepidolite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Blue Limestone +minetest.register_node("too_many_stones:limestone_blue", { + description = S("Blue Limestone"), + tiles = {"tms_limestone_blue.png"}, + is_ground_content = true, + groups = {limestone = 1, cracky = 3, grey_stone = 1, stone = 1}, + drop = "too_many_stones:limestone_blue_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_blue_block", { + description = S("Blue Limestone Block"), + tiles = {"tms_limestone_blue_block.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, grey_stone = 1, stone = 1}, + drop = "too_many_stones:limestone_blue_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_blue_cobble", { + description = S("Cobbled Blue Limestone"), + tiles = {"tms_limestone_blue_cobble.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, grey_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_blue_brick", { + description = S("Blue Limestone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_limestone_blue_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_blue_cracked_brick", { + description = S("Cracked Blue Limestone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_limestone_blue_cracked_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- White Limestone +minetest.register_node("too_many_stones:limestone_white", { + description = S("White Limestone"), + tiles = {"tms_limestone_white.png"}, + is_ground_content = true, + groups = {limestone = 1, cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:limestone_white_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_white_block", { + description = S("White Limestone Block"), + tiles = {"tms_limestone_white_block.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:limestone_white_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_white_cobble", { + description = S("Cobbled White Limestone"), + tiles = {"tms_limestone_white_cobble.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, white_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_white_brick", { + description = S("White Limestone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_limestone_white_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:limestone_white_cracked_brick", { + description = S("Cracked White Limestone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_limestone_white_cracked_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Marble +minetest.register_node("too_many_stones:marble", { + description = S("Marble"), + tiles = {"tms_marble.png"}, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:marble_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:marble_block", { + description = S("Marble Block"), + tiles = {"tms_marble_block.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1}, + drop = "too_many_stones:marble_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:marble_cobble", { + description = S("Cobbled Marble"), + tiles = {"tms_marble_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:marble_brick", { + description = S("Marble Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_marble_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:marble_cracked_brick", { + description = S("Cracked Marble Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_marble_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Moonstone +minetest.register_node("too_many_stones:moonstone", { + description = S("Moonstone"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_moonstone.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:moonstone_block", { + description = S("Moonstone Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_moonstone_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:moonstone_brick", { + description = S("Moonstone Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_moonstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:moonstone_cracked_brick", { + description = S("Cracked Moonstone Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_moonstone_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Morion Quartz +minetest.register_node("too_many_stones:morion_quartz", { + description = S("Morion Quartz"), + tiles = {"tms_morion_quartz.png"}, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:morion_quartz_block", { + description = S("Morion Quartz Block"), + tiles = {"tms_morion_quartz_block.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:morion_quartz_brick", { + description = S("Morion Quartz Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_morion_quartz_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:morion_quartz_cracked_brick", { + description = S("Cracked Morion Quartz Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_morion_quartz_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) +-- Mudstone +minetest.register_node("too_many_stones:mudstone", { + description = S("Mudstone"), + tiles = {"tms_mudstone.png"}, + is_ground_content = true, + groups = {cracky = 3, brown_stone = 1, stone = 1}, + drop = "too_many_stones:mudstone_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:mudstone_block", { + description = S("Mudstone Block"), + tiles = {"tms_mudstone_block.png"}, + is_ground_content = false, + groups = {cracky = 3, brown_stone = 1, stone = 1}, + drop = "too_many_stones:mudstone_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:mudstone_cobble", { + description = S("Cobbled Mudstone"), + tiles = {"tms_mudstone_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, brown_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:mudstone_brick", { + description = S("Mudstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_mudstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, brown_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:mudstone_cracked_brick", { + description = S("Cracked Mudstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_mudstone_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, brown_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Opal +minetest.register_node("too_many_stones:opal", { + description = S("Opal"), + tiles = { + { + name = "tms_opal_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, +}, + is_ground_content = true, + groups = {cracky = 3, cyan_stone = 1, stone = 1, opal = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Prasiolite +minetest.register_node("too_many_stones:prasiolite", { + description = S("Prasiolite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_prasiolite.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:prasiolite", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:prasiolite_block", { + description = S("Prasiolite Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_prasiolite_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:prasiolite_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:prasiolite_brick", { + description = S("Prasiolite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_prasiolite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:prasiolite_cracked_brick", { + description = S("Cracked Prasiolite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_prasiolite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Pumice +minetest.register_node("too_many_stones:pumice", { + description = S("Pumice"), + tiles = {"tms_pumice.png"}, + is_ground_content = true, + groups = {cracky = 3, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:pumice_block", { + description = S("Pumice Block"), + tiles = {"tms_pumice_block.png"}, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:pumice_brick", { + description = S("Pumice Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_pumice_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:pumice_cracked_brick", { + description = S("Cracked Pumice Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_pumice_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Pyrite +minetest.register_node("too_many_stones:pyrite", { + description = S("Pyrite"), + tiles = {"tms_pyrite.png"}, + is_ground_content = true, + groups = {cracky = 3, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:pyrite_block", { + description = S("Pyrite Block"), + tiles = {"tms_pyrite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +minetest.register_node("too_many_stones:pyrite_brick", { + description = S("Pyrite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_pyrite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:pyrite_cracked_brick", { + description = S("Cracked Pyrite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_pyrite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +-- Quartz +minetest.register_node("too_many_stones:quartz", { + description = S("Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_quartz.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:quartz", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:quartz_block", { + description = S("Quartz Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_quartz_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:quartz_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:quartz_brick", { + description = S("Quartz Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_quartz_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:quartz_cracked_brick", { + description = S("Cracked Quartz Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_quartz_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Rhodonite +minetest.register_node("too_many_stones:rhodonite", { + description = S("Rhodonite"), + tiles = {"tms_rhodonite.png"}, + is_ground_content = true, + groups = {cracky = 3, red_stone = 1, stone = 1}, + drop = "too_many_stones:rhodonite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:rhodonite_block", { + description = S("Rhodonite Block"), + tiles = {"tms_rhodonite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 1}, + drop = "too_many_stones:rhodonite_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:rhodonite_cobble", { + description = S("Cobbled Rhodonite"), + tiles = {"tms_rhodonite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:rhodonite_brick", { + description = S("Rhodonite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_rhodonite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:rhodonite_cracked_brick", { + description = S("Cracked Rhodonite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_rhodonite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Rose Quartz +minetest.register_node("too_many_stones:rose_quartz", { + description = S("Rose Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_rose_quartz.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, pink_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:rose_quartz_block", { + description = S("Rose Quartz Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_rose_quartz_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, pink_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:rose_quartz_brick", { + description = S("Rose Quartz Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_rose_quartz_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, pink_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:rose_quartz_cracked_brick", { + description = S("Cracked Rose Quartz Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_rose_quartz_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, pink_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Scoria +minetest.register_node("too_many_stones:scoria", { + description = S("Scoria"), + tiles = {"tms_scoria.png"}, + is_ground_content = true, + groups = {cracky = 3, red_stone = 1, stone = 1}, + drop = "too_many_stones:scoria_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:scoria_block", { + description = S("Scoria Block"), + tiles = {"tms_scoria_block.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 1}, + drop = "too_many_stones:scoria_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:scoria_cobble", { + description = S("Cobbled Scoria"), + tiles = {"tms_scoria_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, red_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:scoria_brick", { + description = S("Scoria Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_scoria_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:scoria_cracked_brick", { + description = S("Cracked Scoria Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_scoria_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, red_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Serpentine +minetest.register_node("too_many_stones:serpentine", { + description = S("Serpentine"), + tiles = {"tms_serpentine.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:serpentine_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:serpentine_block", { + description = S("Serpentine Block"), + tiles = {"tms_serpentine_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:serpentine_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:serpentine_cobble", { + description = S("Cobbled Serpentine"), + tiles = {"tms_serpentine_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:serpentine_brick", { + description = S("Serpentine Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_serpentine_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:serpentine_cracked_brick", { + description = S("Cracked Serpentine Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_serpentine_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Shale +minetest.register_node("too_many_stones:shale", { + description = S("Shale"), + tiles = {"tms_shale.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:shale_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:shale_block", { + description = S("Shale Block"), + tiles = {"tms_shale_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:shale_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:shale_cobble", { + description = S("Cobbled Shale"), + tiles = {"tms_shale_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:shale_brick", { + description = S("Shale Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_shale_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:shale_cracked_brick", { + description = S("Cracked Shale Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_shale_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Slate +minetest.register_node("too_many_stones:slate", { + description = S("Slate"), + tiles = {"tms_slate.png"}, + is_ground_content = true, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + drop = "too_many_stones:slate_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:slate_block", { + description = S("Slate Block"), + tiles = {"tms_slate_block.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 1}, + drop = "too_many_stones:slate_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:slate_cobble", { + description = S("Cobbled Slate"), + tiles = {"tms_slate_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, dark_grey_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:slate_brick", { + description = S("Slate Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_slate_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:slate_cracked_brick", { + description = S("Cracked Slate Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_slate_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:slate_tile", { + description = S("Slate Tile"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_slate_tile.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_grey_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), + on_place = minetest.rotate_node +}) + +-- Smokey Quartz +minetest.register_node("too_many_stones:smokey_quartz", { + description = S("Smokey Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_smokey_quartz.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, brown_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:smokey_quartz", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:smokey_quartz_block", { + description = S("Smokey Quartz Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_smokey_quartz_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, brown_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:smokey_quartz_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:smokey_quartz_brick", { + description = S("Smokey Quartz Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_smokey_quartz_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, brown_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:smokey_quartz_cracked_brick", { + description = S("Cracked Smokey Quartz Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_smokey_quartz_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, brown_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Soapstone +minetest.register_node("too_many_stones:soapstone", { + description = S("Soapstone"), + tiles = {"tms_soapstone.png"}, + is_ground_content = true, + groups = {cracky = 3, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:soapstone_block", { + description = S("Soapstone Block"), + tiles = {"tms_soapstone_block.png"}, + is_ground_content = false, + groups = {cracky = 3, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:soapstone_brick", { + description = S("Soapstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_soapstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:soapstone_cracked_brick", { + description = S("Cracked Soapstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_soapstone_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, black_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Sodalite + +minetest.register_node("too_many_stones:sodalite", { + description = S("Sodalite"), + tiles = {"tms_sodalite.png"}, + is_ground_content = true, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + drop = "too_many_stones:sodalite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sodalite_block", { + description = S("Sodalite Block"), + tiles = {"tms_sodalite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 1}, + drop = "too_many_stones:sodalite_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sodalite_cobble", { + description = S("Cobbled Sodalite"), + tiles = {"tms_sodalite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, blue_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sodalite_brick", { + description = S("Sodalite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_sodalite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sodalite_cracked_brick", { + description = S("Cracked Sodalite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_sodalite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, blue_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Sugilite +minetest.register_node("too_many_stones:sugilite", { + description = S("Sugilite"), + tiles = {"tms_sugilite.png"}, + is_ground_content = true, + groups = {cracky = 3, violet_stone = 1, stone = 1}, + drop = "too_many_stones:sugilite_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sugilite_block", { + description = S("Sugilite Block"), + tiles = {"tms_sugilite_block.png"}, + is_ground_content = false, + groups = {cracky = 3, violet_stone = 1, stone = 1}, + drop = "too_many_stones:sugilite_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sugilite_cobble", { + description = S("Cobbled Sugilite"), + tiles = {"tms_sugilite_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, violet_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sugilite_brick", { + description = S("Sugilite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_sugilite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, violet_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:sugilite_cracked_brick", { + description = S("Cracked Sugilite Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_sugilite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, violet_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Green Tourmaline +minetest.register_node("too_many_stones:tourmaline_green", { + description = S("Green Tourmaline"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_green.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, green_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:tourmaline_green", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_green_block", { + description = S("Green Tourmaline Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_green_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, green_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:tourmaline_green_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_green_brick", { + description = S("Green Tourmaline Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tourmaline_green_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, green_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_green_cracked_brick", { + description = S("Cracked Green Tourmaline Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tourmaline_green_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, green_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Paraiba Tourmaline +minetest.register_node("too_many_stones:tourmaline_paraiba", { + description = S("Paraiba Tourmaline"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_paraiba.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, cyan_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:tourmaline_paraiba", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_paraiba_block", { + description = S("Paraiba Tourmaline Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_paraiba_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:tourmaline_paraiba_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_paraiba_brick", { + description = S("Paraiba Tourmaline Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tourmaline_paraiba_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_paraiba_cracked_brick", { + description = S("Cracked Paraiba Tourmaline Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tourmaline_paraiba_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Pink Tourmaline +minetest.register_node("too_many_stones:tourmaline_pink", { + description = S("Pink Tourmaline"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_pink.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, magenta_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:tourmaline_pink", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_pink_block", { + description = S("Pink Tourmaline Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_pink_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, magenta_stone = 1, stone = 1, quartz = 1}, + drop = "too_many_stones:tourmaline_pink_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_pink_brick", { + description = S("Pink Tourmaline Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tourmaline_pink_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:tourmaline_pink_cracked_brick", { + description = S("Cracked Pink Tourmaline Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tourmaline_pink_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, magenta_stone = 1, stone = 1, quartz = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) +-- Travertine +minetest.register_node("too_many_stones:travertine", { + description = S("Travertine"), + tiles = {"tms_travertine.png"}, + is_ground_content = true, + groups = {limestone = 1, cracky = 3, yellow_stone = 1, stone = 1}, + drop = "too_many_stones:travertine_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_block", { + description = S("Travertine Block"), + tiles = {"tms_travertine_block.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, yellow_stone = 1, stone = 1}, + drop = "too_many_stones:travertine_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_cobble", { + description = S("Cobbled Travertine"), + tiles = {"tms_travertine_cobble.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, yellow_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_brick", { + description = S("Travertine Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_travertine_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_cracked_brick", { + description = S("Cracked Travertine Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_travertine_cracked_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Yellow Travertine +minetest.register_node("too_many_stones:travertine_yellow", { + description = S("Yellow Travertine"), + tiles = {"tms_travertine_yellow.png"}, + is_ground_content = true, + groups = {limestone = 1, cracky = 3, yellow_stone = 1, stone = 1}, + drop = "too_many_stones:travertine_yellow_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_yellow_block", { + description = S("Yellow Travertine Block"), + tiles = {"tms_travertine_yellow_block.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, yellow_stone = 1, stone = 1}, + drop = "too_many_stones:travertine_yellow_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_yellow_cobble", { + description = S("Cobbled Yellow Travertine"), + tiles = {"tms_travertine_yellow_cobble.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 3, yellow_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_yellow_brick", { + description = S("Yellow Travertine Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_travertine_yellow_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:travertine_yellow_cracked_brick", { + description = S("Cracked Yellow Travertine Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_travertine_yellow_cracked_brick.png"}, + is_ground_content = false, + groups = {limestone = 1, cracky = 2, yellow_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Beige Tuff +minetest.register_node("too_many_stones:tuff_beige", { + description = S("Beige Tuff"), + tiles = {"tms_tuff_beige.png"}, + is_ground_content = true, + groups = {cracky = 3, white_stone = 1, stone = 1, tuff = 1}, + drop = "too_many_stones:tuff_beige_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_beige_block", { + description = S("Beige Tuff Block"), + tiles = {"tms_tuff_beige_block.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_beige_cobble", { + description = S("Cobbled Beige Tuff"), + tiles = {"tms_tuff_beige_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, white_stone = 1, stone = 2, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_beige_brick", { + description = S("Beige Tuff Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tuff_beige_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_beige_cracked_brick", { + description = S("Cracked Beige Tuff Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tuff_beige_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, white_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Grey Tuff +minetest.register_node("too_many_stones:tuff_grey", { + description = S("Grey Tuff"), + tiles = {"tms_tuff_grey.png"}, + is_ground_content = true, + groups = {cracky = 3, grey_stone = 1, stone = 1, tuff = 1}, + drop = "too_many_stones:tuff_grey_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_grey_block", { + description = S("Grey Tuff Block"), + tiles = {"tms_tuff_grey_block.png"}, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_grey_cobble", { + description = S("Cobbled Grey Tuff"), + tiles = {"tms_tuff_grey_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, grey_stone = 1, stone = 2, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_grey_brick", { + description = S("Grey Tuff Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tuff_grey_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_grey_cracked_brick", { + description = S("Cracked Grey Tuff Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tuff_grey_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, grey_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Red Tuff +minetest.register_node("too_many_stones:tuff_red", { + description = S("Red Tuff"), + tiles = {"tms_tuff_red.png"}, + is_ground_content = true, + groups = {cracky = 3, orange_stone = 1, stone = 1, tuff = 1}, + drop = "too_many_stones:tuff_red_cobble", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_red_block", { + description = S("Red Tuff Block"), + tiles = {"tms_tuff_red_block.png"}, + is_ground_content = false, + groups = {cracky = 3, orange_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_red_cobble", { + description = S("Cobbled Red Tuff"), + tiles = {"tms_tuff_red_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, orange_stone = 1, stone = 2, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_red_brick", { + description = S("Red Tuff Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tuff_red_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, orange_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:tuff_red_cracked_brick", { + description = S("Cracked Red Tuff Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_tuff_red_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, orange_stone = 1, stone = 1, tuff = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Turquoise +minetest.register_node("too_many_stones:sandstone_with_turquoise", { + description = S("Sandstone Turquoise Ore"), + tiles = {"tms_sandstone.png^tms_mineral_turquoise.png"}, + is_ground_content = true, + groups = {cracky = 3}, + drop = { + max_items = 4, -- Maximum number of item stacks to drop + items = { + { + items = {"too_many_stones:turquoise_pebble 3"}, + rarity = 1, + }, + { + items = {"too_many_stones:turquoise_pebble 4"}, + rarity = 1, + }, + { + items = {"too_many_stones:turquoise_pebble 2"}, + rarity = 2, + }, + { + items = {"too_many_stones:turquoise_pebble 5"}, + rarity = 2, + }, + { + items = {"too_many_stones:turquoise_pebble 1"}, + rarity = 4, + }, + }, + }, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:desert_sandstone_with_turquoise", { + description = S("Desert Sandstone Turquoise Ore"), + tiles = {"tms_desert_sandstone.png^tms_mineral_turquoise.png"}, + is_ground_content = false, + groups = {cracky = 3}, + drop = { + max_items = 4, -- Maximum number of item stacks to drop + items = { + { + items = {"too_many_stones:turquoise_pebble 3"}, + rarity = 1, + }, + { + items = {"too_many_stones:turquoise_pebble 4"}, + rarity = 1, + }, + { + items = {"too_many_stones:turquoise_pebble 2"}, + rarity = 2, + }, + { + items = {"too_many_stones:turquoise_pebble 5"}, + rarity = 2, + }, + { + items = {"too_many_stones:turquoise_pebble 1"}, + rarity = 4, + }, + }, + }, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:silver_sandstone_with_turquoise", { + description = S("Silver Sandstone Turquoise Ore"), + tiles = {"tms_silver_sandstone.png^tms_mineral_turquoise.png"}, + is_ground_content = false, + groups = {cracky = 3}, + drop = { + max_items = 4, -- Maximum number of item stacks to drop + items = { + { + items = {"too_many_stones:turquoise_pebble 3"}, + rarity = 1, + }, + { + items = {"too_many_stones:turquoise_pebble 4"}, + rarity = 1, + }, + { + items = {"too_many_stones:turquoise_pebble 2"}, + rarity = 2, + }, + { + items = {"too_many_stones:turquoise_pebble 5"}, + rarity = 2, + }, + { + items = {"too_many_stones:turquoise_pebble 1"}, + rarity = 4, + }, + }, + }, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_craftitem("too_many_stones:turquoise_pebble", { + description = S("Turquoise Pebble"), + inventory_image = "tms_turquoise_pebble.png" +}) + +minetest.register_node("too_many_stones:turquoise", { + description = S("Turquoise"), + tiles = {"tms_turquoise.png"}, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + drop = "too_many_stones:turquoise", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:turquoise_block", { + description = S("Turquoise Block"), + tiles = {"tms_turquoise_block.png"}, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 1}, + drop = "too_many_stones:turquoise_block", + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:turquoise_cobble", { + description = S("Cobbled Turquoise"), + tiles = {"tms_turquoise_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, cyan_stone = 1, stone = 2}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:turquoise_brick", { + description = S("Turquoise Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_turquoise_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) + +minetest.register_node("too_many_stones:turquoise_cracked_brick", { + description = S("Cracked Turquoise Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_turquoise_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, cyan_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_stone_defaults(), +}) +-- Vivianite +minetest.register_node("too_many_stones:vivianite", { + description = S("Vivianite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_vivianite.png"}, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:vivianite", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:vivianite_block", { + description = S("Vivianite Block"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_vivianite_block.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, dark_green_stone = 1, stone = 1}, + drop = "too_many_stones:vivianite_block", + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:vivianite_brick", { + description = S("Vivianite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_vivianite_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +minetest.register_node("too_many_stones:vivianite_cracked_brick", { + description = S("Cracked Vivianite Brick"), + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"tms_vivianite_cracked_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, dark_green_stone = 1, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Non-Stone Items + +minetest.register_craftitem("too_many_stones:batch", { + description = S("Batch"), + inventory_image = "tms_batch.png" +}) diff --git a/mods/too_many_stones/nodes_crystal.lua b/mods/too_many_stones/nodes_crystal.lua new file mode 100644 index 00000000..d85be4a3 --- /dev/null +++ b/mods/too_many_stones/nodes_crystal.lua @@ -0,0 +1,1005 @@ +-- mods/too_many_stones/nodes_crystal.lua + +-- support for MT game translation. +local S = minetest.get_translator("too_many_stones") + +local all_directions = { + vector.new(1, 0, 0), + vector.new(0, 1, 0), + vector.new(0, 0, 1), + vector.new(-1, 0, 0), + vector.new(0, -1, 0), + vector.new(0, 0, -1), +} + +-- Amazonite + +minetest.register_abm({ + label = "TMS Amazonite Crystal growth", + nodenames = "too_many_stones:amazonite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:amazonite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:amazonite_crystal", { + description = S("Amazonite Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_amazonite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amazonite_budding", { + description = S("Budding Amazonite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amazonite_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Amber + +minetest.register_abm({ + label = "TMS Amber Crystal growth", + nodenames = "too_many_stones:amber_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:amber_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:amber_crystal", { + description = S("Amber Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_amber_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amber_budding", { + description = S("Budding Amber"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amber_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Amethyst + +minetest.register_abm({ + label = "TMS Amethyst Crystal growth", + nodenames = "too_many_stones:amethyst_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:amethyst_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:amethyst_crystal", { + description = S("Amethyst Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_amethyst_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:amethyst_budding", { + description = S("Budding Amethyst"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_amethyst_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Celestine + +minetest.register_abm({ + label = "TMS Celestine Crystal growth", + nodenames = "too_many_stones:celestine_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:celestine_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:celestine_crystal", { + description = S("Celestine Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_celestine_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:celestine_budding", { + description = S("Budding Celestine"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_celestine_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Chalcanthite + +minetest.register_abm({ + label = "TMS Chalcanthite Crystal growth", + nodenames = "too_many_stones:chalcanthite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:chalcanthite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:chalcanthite_crystal", { + description = S("Chalcanthite Crystal"), + tiles = {"tms_chalcanthite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:chalcanthite_budding", { + description = S("Budding Chalcanthite"), + tiles = {"tms_chalcanthite_budding.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +-- Citrine + +minetest.register_abm({ + label = "TMS Citrine Crystal growth", + nodenames = "too_many_stones:citrine_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:citrine_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:citrine_crystal", { + description = S("Citrine Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_citrine_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:citrine_budding", { + description = S("Budding Citrine"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_citrine_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Crocoite + +minetest.register_abm({ + label = "TMS Crocoite Crystal growth", + nodenames = "too_many_stones:crocoite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:crocoite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:crocoite_crystal", { + description = S("Crocoite Crystal"), + tiles = {"tms_crocoite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:crocoite_budding", { + description = S("Budding Crocoite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_crocoite_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Eudialite + +minetest.register_abm({ + label = "TMS Eudialite Crystal growth", + nodenames = "too_many_stones:eudialite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:eudialite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:eudialite_crystal", { + description = S("Eudialite Crystal"), + tiles = {"tms_eudialite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:eudialite_budding", { + description = S("Budding Eudialite"), + drawtype = "glasslike", + tiles = {"tms_eudialite_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Heliodor + +minetest.register_abm({ + label = "TMS Heliodor Crystal growth", + nodenames = "too_many_stones:heliodor_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:heliodor_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:heliodor_crystal", { + description = S("Heliodor Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_heliodor_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:heliodor_budding", { + description = S("Budding Heliodor"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_heliodor_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Kyanite + +minetest.register_abm({ + label = "TMS Kyanite Crystal growth", + nodenames = "too_many_stones:kyanite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:kyanite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:kyanite_crystal", { + description = S("Kyanite Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_kyanite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:kyanite_budding", { + description = S("Budding Kyanite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_kyanite_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Prasiolite + +minetest.register_abm({ + label = "TMS Prasiolite Crystal growth", + nodenames = "too_many_stones:prasiolite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:prasiolite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:prasiolite_crystal", { + description = S("Prasiolite Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_prasiolite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:prasiolite_budding", { + description = S("Budding Prasiolite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_prasiolite_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Moonstone + +minetest.register_abm({ + label = "TMS Moonstone Crystal growth", + nodenames = "too_many_stones:moonstone_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:moonstone_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:moonstone_crystal", { + description = S("Moonstone Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_moonstone_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:moonstone_budding", { + description = S("Budding Moonstone"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_moonstone_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Morion Quartz + +minetest.register_abm({ + label = "TMS Morion Quartz Crystal growth", + nodenames = "too_many_stones:morion_quartz_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:morion_quartz_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:morion_quartz_crystal", { + description = S("Morion Quartz Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_morion_quartz_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:morion_quartz_budding", { + description = S("Budding Morion Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_morion_quartz_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Quartz + +minetest.register_abm({ + label = "TMS Quartz Crystal growth", + nodenames = "too_many_stones:quartz_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:quartz_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:quartz_crystal", { + description = S("Quartz Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_quartz_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:quartz_budding", { + description = S("Budding Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_quartz_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Rose Quartz + +minetest.register_abm({ + label = "TMS Rose Quartz Crystal growth", + nodenames = "too_many_stones:rose_quartz_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:rose_quartz_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:rose_quartz_crystal", { + description = S("Rose Quartz Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_rose_quartz_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:rose_quartz_budding", { + description = S("Budding Rose Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_rose_quartz_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Smokey Quartz + +minetest.register_abm({ + label = "TMS Smokey Quartz Crystal growth", + nodenames = "too_many_stones:smokey_quartz_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:smokey_quartz_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:smokey_quartz_crystal", { + description = S("Smokey Quartz Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_smokey_quartz_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:smokey_quartz_budding", { + description = S("Budding Smokey Quartz"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_smokey_quartz_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Green Tourmaline + +minetest.register_abm({ + label = "TMS Green Tourmaline Crystal growth", + nodenames = "too_many_stones:tourmaline_green_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:tourmaline_green_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:tourmaline_green_crystal", { + description = S("Green Tourmaline Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_tourmaline_green_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:tourmaline_green_budding", { + description = S("Budding Green Tourmaline"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_green_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Paraiba Tourmaline + +minetest.register_abm({ + label = "TMS Paraiba Tourmaline Crystal growth", + nodenames = "too_many_stones:tourmaline_paraiba_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:tourmaline_paraiba_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:tourmaline_paraiba_crystal", { + description = S("Paraiba Tourmaline Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_tourmaline_paraiba_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:tourmaline_paraiba_budding", { + description = S("Budding Paraiba Tourmaline"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_paraiba_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Pink Tourmaline + +minetest.register_abm({ + label = "TMS Pink Tourmaline Crystal growth", + nodenames = "too_many_stones:tourmaline_pink_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:tourmaline_pink_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:tourmaline_pink_crystal", { + description = S("Pink Tourmaline Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_tourmaline_pink_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:tourmaline_pink_budding", { + description = S("Budding Pink Tourmaline"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_tourmaline_pink_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) + +-- Vivianite + +minetest.register_abm({ + label = "TMS Vivianite Crystal growth", + nodenames = "too_many_stones:vivianite_budding", + interval = 10, + chance = 1, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node + if check_node_name == "air" then + new_node = "too_many_stones:vivianite_crystal" + else return end + minetest.swap_node(check_pos, {name = new_node, param2 = param2}) + end, +}) + +minetest.register_node("too_many_stones:vivianite_crystal", { + description = S("Vivianite Crystal"), + use_texture_alpha = "blend", + tiles = {"tms_vivianite_crystal.png"}, + drawtype = "plantlike", + sunlight_propagates = true, + light_source = 6, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-5/16, -8/16, -5/16, 5/16, 4/16, 5/16}, + }, + groups = {cracky = 3, attached_node = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), +}) + +minetest.register_node("too_many_stones:vivianite_budding", { + description = S("Budding Vivianite"), + use_texture_alpha = "blend", + drawtype = "glasslike", + tiles = {"tms_vivianite_budding.png"}, + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + paramtype = "light", +}) diff --git a/mods/too_many_stones/nodes_glowing.lua b/mods/too_many_stones/nodes_glowing.lua new file mode 100644 index 00000000..251c9083 --- /dev/null +++ b/mods/too_many_stones/nodes_glowing.lua @@ -0,0 +1,828 @@ +-- mods/too_many_stones/nodes_glowing.lua + +-- support for MT game translation. +local S = minetest.get_translator("too_many_stones") + + + +--[[ Index: + + Apatite + Calcite + Esperite + Fluorite + Selenite + Sodalite + Willemite + +--]] + +-- +-- Glowing Stones +-- + +--Glow Apatite +minetest.register_node("too_many_stones:glow_apatite", { + description = S("Glowing Apatite"), + drawtype = "glasslike", + tiles = {"tms_glow_apatite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, violet_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_apatite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_apatite_block", { + description = S("Glowing Apatite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_apatite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, violet_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_apatite_cobble", { + description = S("Cobbled Glowing Apatite"), + drawtype = "glasslike", + tiles = {"tms_glow_apatite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, violet_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_apatite_brick", { + description = S("Glowing Apatite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_apatite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, violet_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_apatite_cracked_brick", { + description = S("Cracked Glowing Apatite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_apatite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, violet_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) +--Glow Calcite +minetest.register_node("too_many_stones:glow_calcite", { + description = S("Glowing Calcite"), + drawtype = "glasslike", + tiles = {"tms_glow_calcite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, red_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_calcite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_calcite_block", { + description = S("Glowing Calcite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_calcite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, red_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_calcite_cobble", { + description = S("Cobbled Glowing Calcite"), + drawtype = "glasslike", + tiles = {"tms_glow_calcite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, red_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_calcite_brick", { + description = S("Glowing Calcite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_calcite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, red_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_calcite_cracked_brick", { + description = S("Cracked Glowing Calcite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_calcite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, red_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) +--Glow Eserite +minetest.register_node("too_many_stones:glow_esperite", { + description = S("Glowing Esperite"), + drawtype = "glasslike", + tiles = {"tms_glow_esperite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, yellow_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_esperite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_esperite_block", { + description = S("Glowing Esperite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_esperite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, yellow_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_esperite_cobble", { + description = S("Cobbled Glowing Esperite"), + drawtype = "glasslike", + tiles = {"tms_glow_esperite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, yellow_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_esperite_brick", { + description = S("Glowing Esperite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_esperite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, yellow_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_esperite_cracked_brick", { + description = S("Cracked Glowing Esperite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_esperite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, yellow_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) +--Glow Fluorite +minetest.register_node("too_many_stones:glow_fluorite", { + description = S("Glowing Fluorite"), + drawtype = "glasslike", + tiles = {"tms_glow_fluorite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, blue_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_fluorite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_fluorite_block", { + description = S("Glowing Fluorite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_fluorite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, blue_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_fluorite_cobble", { + description = S("Cobbled Glowing Fluorite"), + drawtype = "glasslike", + tiles = {"tms_glow_fluorite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, blue_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_fluorite_brick", { + description = S("Glowing Fluorite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_fluorite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, blue_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_fluorite_cracked_brick", { + description = S("Cracked Glowing Fluorite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_fluorite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, blue_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) +--Glow Selenite +minetest.register_node("too_many_stones:glow_selenite", { + description = S("Glowing Selenite"), + drawtype = "glasslike", + tiles = {"tms_glow_selenite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, cyan_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_selenite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_selenite_block", { + description = S("Glowing Selenite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_selenite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, cyan_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_selenite_cobble", { + description = S("Cobbled Glowing Selenite"), + drawtype = "glasslike", + tiles = {"tms_glow_selenite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, cyan_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_selenite_brick", { + description = S("Glowing Selenite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_selenite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, cyan_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_selenite_cracked_brick", { + description = S("Cracked Glowing Selenite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_selenite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, cyan_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) +--Glow Sodalite +minetest.register_node("too_many_stones:glow_sodalite", { + description = S("Glowing Sodalite"), + drawtype = "glasslike", + tiles = {"tms_glow_sodalite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, orange_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_sodalite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_sodalite_block", { + description = S("Glowing Sodalite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_sodalite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, orange_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_sodalite_cobble", { + description = S("Cobbled Glowing Sodalite"), + drawtype = "glasslike", + tiles = {"tms_glow_sodalite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, orange_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_sodalite_brick", { + description = S("Glowing Sodalite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_sodalite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, orange_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_sodalite_cracked_brick", { + description = S("Cracked Glowing Sodalite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_sodalite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, orange_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) +--Glow Willemite +minetest.register_node("too_many_stones:glow_willemite", { + description = S("Glowing Willemite"), + drawtype = "glasslike", + tiles = {"tms_glow_willemite.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + groups = {glow_stone = 1, green_stone = 1, cracky = 3, stone = 1}, + drop = "too_many_stones:glow_willemite_cobble", + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_willemite_block", { + description = S("Glowing Willemite Block"), + drawtype = "glasslike", + tiles = {"tms_glow_willemite_block.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, green_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_willemite_cobble", { + description = S("Cobbled Glowing Willemite"), + drawtype = "glasslike", + tiles = {"tms_glow_willemite_cobble.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, green_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_willemite_brick", { + description = S("Glowing Willemite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_willemite_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, green_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +minetest.register_node("too_many_stones:glow_willemite_cracked_brick", { + description = S("Cracked Glowing Willemite Brick"), + drawtype = "glasslike", + tiles = {"tms_glow_willemite_cracked_brick.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {glow_stone = 1, green_stone = 1, cracky = 3, stone = 1}, + sounds = too_many_stones.node_sound_glass_defaults(), + light_source = minetest.LIGHT_MAX, +}) + +-- +-- Crafting +-- + +-- Glow Apatite +minetest.register_craft({ + output = "too_many_stones:glow_apatite_brick 4", + recipe = { + {"too_many_stones:glow_apatite", "too_many_stones:glow_apatite"}, + {"too_many_stones:glow_apatite", "too_many_stones:glow_apatite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_apatite_block 9", + recipe = { + {"too_many_stones:glow_apatite", "too_many_stones:glow_apatite", "too_many_stones:glow_apatite"}, + {"too_many_stones:glow_apatite", "too_many_stones:glow_apatite", "too_many_stones:glow_apatite"}, + {"too_many_stones:glow_apatite", "too_many_stones:glow_apatite", "too_many_stones:glow_apatite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_apatite", + recipe = "too_many_stones:glow_apatite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_apatite_cracked_brick", + recipe = "too_many_stones:glow_apatite_brick", +}) + +-- Glow Calcite +minetest.register_craft({ + output = "too_many_stones:glow_calcite_brick 4", + recipe = { + {"too_many_stones:glow_calcite", "too_many_stones:glow_calcite"}, + {"too_many_stones:glow_calcite", "too_many_stones:glow_calcite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_calcite_block 9", + recipe = { + {"too_many_stones:glow_calcite", "too_many_stones:glow_calcite", "too_many_stones:glow_calcite"}, + {"too_many_stones:glow_calcite", "too_many_stones:glow_calcite", "too_many_stones:glow_calcite"}, + {"too_many_stones:glow_calcite", "too_many_stones:glow_calcite", "too_many_stones:glow_calcite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_calcite", + recipe = "too_many_stones:glow_calcite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_calcite_cracked_brick", + recipe = "too_many_stones:glow_calcite_brick", +}) + +-- Glow Esperite +minetest.register_craft({ + output = "too_many_stones:glow_esperite_brick 4", + recipe = { + {"too_many_stones:glow_esperite", "too_many_stones:glow_esperite"}, + {"too_many_stones:glow_esperite", "too_many_stones:glow_esperite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_esperite_block 9", + recipe = { + {"too_many_stones:glow_esperite", "too_many_stones:glow_esperite", "too_many_stones:glow_esperite"}, + {"too_many_stones:glow_esperite", "too_many_stones:glow_esperite", "too_many_stones:glow_esperite"}, + {"too_many_stones:glow_esperite", "too_many_stones:glow_esperite", "too_many_stones:glow_esperite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_esperite", + recipe = "too_many_stones:glow_esperite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_esperite_cracked_brick", + recipe = "too_many_stones:glow_esperite_brick", +}) + +-- Glow Fluorite +minetest.register_craft({ + output = "too_many_stones:glow_fluorite_brick 4", + recipe = { + {"too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite"}, + {"too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_fluorite_block 9", + recipe = { + {"too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite"}, + {"too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite"}, + {"too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite", "too_many_stones:glow_fluorite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_fluorite", + recipe = "too_many_stones:glow_fluorite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_fluorite_cracked_brick", + recipe = "too_many_stones:glow_fluorite_brick", +}) + +-- Glow Selenite +minetest.register_craft({ + output = "too_many_stones:glow_selenite_brick 4", + recipe = { + {"too_many_stones:glow_selenite", "too_many_stones:glow_selenite"}, + {"too_many_stones:glow_selenite", "too_many_stones:glow_selenite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_selenite_block 9", + recipe = { + {"too_many_stones:glow_selenite", "too_many_stones:glow_selenite", "too_many_stones:glow_selenite"}, + {"too_many_stones:glow_selenite", "too_many_stones:glow_selenite", "too_many_stones:glow_selenite"}, + {"too_many_stones:glow_selenite", "too_many_stones:glow_selenite", "too_many_stones:glow_selenite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_selenite", + recipe = "too_many_stones:glow_selenite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_selenite_cracked_brick", + recipe = "too_many_stones:glow_selenite_brick", +}) + +-- Glow Sodalite +minetest.register_craft({ + output = "too_many_stones:glow_sodalite_brick 4", + recipe = { + {"too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite"}, + {"too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_sodalite_block 9", + recipe = { + {"too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite"}, + {"too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite"}, + {"too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite", "too_many_stones:glow_sodalite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_sodalite", + recipe = "too_many_stones:glow_sodalite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_sodalite_cracked_brick", + recipe = "too_many_stones:glow_sodalite_brick", +}) + +-- Glow Willemite +minetest.register_craft({ + output = "too_many_stones:glow_willemite_brick 4", + recipe = { + {"too_many_stones:glow_willemite", "too_many_stones:glow_willemite"}, + {"too_many_stones:glow_willemite", "too_many_stones:glow_willemite"}, + } +}) + +minetest.register_craft({ + output = "too_many_stones:glow_willemite_block 9", + recipe = { + {"too_many_stones:glow_willemite", "too_many_stones:glow_willemite", "too_many_stones:glow_willemite"}, + {"too_many_stones:glow_willemite", "too_many_stones:glow_willemite", "too_many_stones:glow_willemite"}, + {"too_many_stones:glow_willemite", "too_many_stones:glow_willemite", "too_many_stones:glow_willemite"}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_willemite", + recipe = "too_many_stones:glow_willemite_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "too_many_stones:glow_willemite_cracked_brick", + recipe = "too_many_stones:glow_willemite_brick", +}) + +-- +-- Mapgen +-- + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_apatite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_calcite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_esperite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_fluorite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_selenite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_sodalite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_willemite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -1000, + y_min = -31000, + }) + +if minetest.get_modpath("mcl_mapgen_core") ~= nil then + +-- +-- Mapgen MineClone +-- + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_apatite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_calcite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_esperite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_fluorite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_selenite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_sodalite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "too_many_stones:glow_willemite", + wherein = "mapgen_stone", + clust_scarcity = 48 * 48 * 48, + clust_num_ores = 20, + clust_size = 5, + y_max = -40, + y_min = -64, + }) + +end diff --git a/mods/too_many_stones/sounds.lua b/mods/too_many_stones/sounds.lua new file mode 100644 index 00000000..1715e75c --- /dev/null +++ b/mods/too_many_stones/sounds.lua @@ -0,0 +1,170 @@ +-- +-- Sounds +-- + +function too_many_stones.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "", gain = 1.0} + table.dug = table.dug or + {name = "tms_dug_node", gain = 0.25} + table.place = table.place or + {name = "tms_place_node_hard", gain = 1.0} + return table +end + +function too_many_stones.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_hard_footstep", gain = 0.2} + table.dig = table.dig or + {name = "tms_dig_cracky", gain = 0.4} + table.dug = table.dug or + {name = "tms_break_node_hard", gain = 10.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_dirt_footstep", gain = 0.25} + table.dig = table.dig or + {name = "tms_dig_crumbly", gain = 0.4} + table.dug = table.dug or + {name = "tms_dirt_footstep", gain = 1.0} + table.place = table.place or + {name = "tms_place_node", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_sand_footstep", gain = 0.05} + table.dug = table.dug or + {name = "tms_sand_footstep", gain = 0.15} + table.place = table.place or + {name = "tms_place_node", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_gravel_footstep", gain = 0.25} + table.dig = table.dig or + {name = "tms_gravel_dig", gain = 0.35} + table.dug = table.dug or + {name = "tms_gravel_dug", gain = 1.0} + table.place = table.place or + {name = "tms_place_node", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_wood_footstep", gain = 0.15} + table.dig = table.dig or + {name = "tms_dig_choppy", gain = 0.4} + table.dug = table.dug or + {name = "tms_wood_footstep", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_grass_footstep", gain = 0.45} + table.dug = table.dug or + {name = "tms_grass_footstep", gain = 0.7} + table.place = table.place or + {name = "tms_place_node", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_glass_footstep", gain = 0.3} + table.dig = table.dig or + {name = "tms_glass_footstep", gain = 0.5} + table.dug = table.dug or + {name = "tms_break_glass", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_ice_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_ice_footstep", gain = 0.15} + table.dig = table.dig or + {name = "tms_ice_dig", gain = 0.5} + table.dug = table.dug or + {name = "tms_ice_dug", gain = 0.5} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_metal_footstep", gain = 0.2} + table.dig = table.dig or + {name = "tms_dig_metal", gain = 0.5} + table.dug = table.dug or + {name = "tms_dug_metal", gain = 0.5} + table.place = table.place or + {name = "tms_place_node_metal", gain = 0.5} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_water_footstep", gain = 0.2} + too_many_stones.node_sound_defaults(table) + return table +end + +function too_many_stones.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "tms_snow_footstep", gain = 0.2} + table.dig = table.dig or + {name = "tms_snow_footstep", gain = 0.3} + table.dug = table.dug or + {name = "tms_snow_footstep", gain = 0.3} + table.place = table.place or + {name = "tms_place_node", gain = 1.0} + too_many_stones.node_sound_defaults(table) + return table +end + +-- Asuna uses default sounds for consistency with default nodes +if too_many_stones.mods.asuna_core then + too_many_stones.node_sound_defaults = default.node_sound_defaults + for _,sound in pairs({ + "stone", + "dirt", + "sand", + "gravel", + "wood", + "leaves", + "grass", + "ice", + "metal", + "water", + "snow", + }) do + too_many_stones["node_sound_" .. sound .. "_defaults"] = default["node_sound_" .. sound .. "_defaults"] + end +end \ No newline at end of file diff --git a/mods/too_many_stones/sounds/tms_break_glass.1.ogg b/mods/too_many_stones/sounds/tms_break_glass.1.ogg new file mode 100644 index 00000000..c8e056d4 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_break_glass.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_break_glass.2.ogg b/mods/too_many_stones/sounds/tms_break_glass.2.ogg new file mode 100644 index 00000000..0b8feb31 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_break_glass.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_break_glass.3.ogg b/mods/too_many_stones/sounds/tms_break_glass.3.ogg new file mode 100644 index 00000000..ae6a6bfc Binary files /dev/null and b/mods/too_many_stones/sounds/tms_break_glass.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_break_node_hard1.ogg b/mods/too_many_stones/sounds/tms_break_node_hard1.ogg new file mode 100644 index 00000000..4da032ae Binary files /dev/null and b/mods/too_many_stones/sounds/tms_break_node_hard1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_break_node_hard2.ogg b/mods/too_many_stones/sounds/tms_break_node_hard2.ogg new file mode 100644 index 00000000..ba00ff09 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_break_node_hard2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_break_node_hard3.ogg b/mods/too_many_stones/sounds/tms_break_node_hard3.ogg new file mode 100644 index 00000000..8f6ea45a Binary files /dev/null and b/mods/too_many_stones/sounds/tms_break_node_hard3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_choppy.1.ogg b/mods/too_many_stones/sounds/tms_dig_choppy.1.ogg new file mode 100644 index 00000000..95fa6d4e Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_choppy.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_choppy.2.ogg b/mods/too_many_stones/sounds/tms_dig_choppy.2.ogg new file mode 100644 index 00000000..5d3a0444 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_choppy.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_choppy.3.ogg b/mods/too_many_stones/sounds/tms_dig_choppy.3.ogg new file mode 100644 index 00000000..2bb0aceb Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_choppy.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_cracky.1.ogg b/mods/too_many_stones/sounds/tms_dig_cracky.1.ogg new file mode 100644 index 00000000..eb3752a3 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_cracky.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_cracky.2.ogg b/mods/too_many_stones/sounds/tms_dig_cracky.2.ogg new file mode 100644 index 00000000..f64e50ab Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_cracky.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_cracky.3.ogg b/mods/too_many_stones/sounds/tms_dig_cracky.3.ogg new file mode 100644 index 00000000..f1a2ddfa Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_cracky.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_crumbly.ogg b/mods/too_many_stones/sounds/tms_dig_crumbly.ogg new file mode 100644 index 00000000..a0b2a1f9 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_crumbly.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_metal.ogg b/mods/too_many_stones/sounds/tms_dig_metal.ogg new file mode 100644 index 00000000..0b585097 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_metal.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dig_snappy.ogg b/mods/too_many_stones/sounds/tms_dig_snappy.ogg new file mode 100644 index 00000000..3686fcdd Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dig_snappy.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dirt_footstep.1.ogg b/mods/too_many_stones/sounds/tms_dirt_footstep.1.ogg new file mode 100644 index 00000000..201aa3b2 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dirt_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dirt_footstep.2.ogg b/mods/too_many_stones/sounds/tms_dirt_footstep.2.ogg new file mode 100644 index 00000000..2667dbc2 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dirt_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dug_metal.1.ogg b/mods/too_many_stones/sounds/tms_dug_metal.1.ogg new file mode 100644 index 00000000..5d6cb5b1 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dug_metal.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dug_metal.2.ogg b/mods/too_many_stones/sounds/tms_dug_metal.2.ogg new file mode 100644 index 00000000..63567fc0 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dug_metal.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dug_node.1.ogg b/mods/too_many_stones/sounds/tms_dug_node.1.ogg new file mode 100644 index 00000000..c04975d4 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dug_node.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_dug_node.2.ogg b/mods/too_many_stones/sounds/tms_dug_node.2.ogg new file mode 100644 index 00000000..9f209268 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_dug_node.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_glass_footstep.1.ogg b/mods/too_many_stones/sounds/tms_glass_footstep.1.ogg new file mode 100644 index 00000000..654ef4ce Binary files /dev/null and b/mods/too_many_stones/sounds/tms_glass_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_glass_footstep.2.ogg b/mods/too_many_stones/sounds/tms_glass_footstep.2.ogg new file mode 100644 index 00000000..bda79776 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_glass_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_glass_footstep.3.ogg b/mods/too_many_stones/sounds/tms_glass_footstep.3.ogg new file mode 100644 index 00000000..b8bed454 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_glass_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_glass_footstep.4.ogg b/mods/too_many_stones/sounds/tms_glass_footstep.4.ogg new file mode 100644 index 00000000..191287a3 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_glass_footstep.4.ogg differ diff --git a/mods/too_many_stones/sounds/tms_grass_footstep.1.ogg b/mods/too_many_stones/sounds/tms_grass_footstep.1.ogg new file mode 100644 index 00000000..a04cdb47 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_grass_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_grass_footstep.2.ogg b/mods/too_many_stones/sounds/tms_grass_footstep.2.ogg new file mode 100644 index 00000000..d193068d Binary files /dev/null and b/mods/too_many_stones/sounds/tms_grass_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_grass_footstep.3.ogg b/mods/too_many_stones/sounds/tms_grass_footstep.3.ogg new file mode 100644 index 00000000..e1897ea3 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_grass_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_dig.1.ogg b/mods/too_many_stones/sounds/tms_gravel_dig.1.ogg new file mode 100644 index 00000000..baf8fca7 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_dig.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_dig.2.ogg b/mods/too_many_stones/sounds/tms_gravel_dig.2.ogg new file mode 100644 index 00000000..e0c0c50f Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_dig.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_dug.1.ogg b/mods/too_many_stones/sounds/tms_gravel_dug.1.ogg new file mode 100644 index 00000000..13034335 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_dug.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_dug.2.ogg b/mods/too_many_stones/sounds/tms_gravel_dug.2.ogg new file mode 100644 index 00000000..ee5ed330 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_dug.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_dug.3.ogg b/mods/too_many_stones/sounds/tms_gravel_dug.3.ogg new file mode 100644 index 00000000..add4c54b Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_dug.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_footstep.1.ogg b/mods/too_many_stones/sounds/tms_gravel_footstep.1.ogg new file mode 100644 index 00000000..8d260ce0 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_footstep.2.ogg b/mods/too_many_stones/sounds/tms_gravel_footstep.2.ogg new file mode 100644 index 00000000..2aba2c65 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_footstep.3.ogg b/mods/too_many_stones/sounds/tms_gravel_footstep.3.ogg new file mode 100644 index 00000000..1bcd8a11 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_gravel_footstep.4.ogg b/mods/too_many_stones/sounds/tms_gravel_footstep.4.ogg new file mode 100644 index 00000000..696c9ffd Binary files /dev/null and b/mods/too_many_stones/sounds/tms_gravel_footstep.4.ogg differ diff --git a/mods/too_many_stones/sounds/tms_hard_footstep.1.ogg b/mods/too_many_stones/sounds/tms_hard_footstep.1.ogg new file mode 100644 index 00000000..11c85f1e Binary files /dev/null and b/mods/too_many_stones/sounds/tms_hard_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_hard_footstep.2.ogg b/mods/too_many_stones/sounds/tms_hard_footstep.2.ogg new file mode 100644 index 00000000..bcc1e9e3 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_hard_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_hard_footstep.3.ogg b/mods/too_many_stones/sounds/tms_hard_footstep.3.ogg new file mode 100644 index 00000000..c503e1cb Binary files /dev/null and b/mods/too_many_stones/sounds/tms_hard_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_dig.1.ogg b/mods/too_many_stones/sounds/tms_ice_dig.1.ogg new file mode 100644 index 00000000..97399c83 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_dig.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_dig.2.ogg b/mods/too_many_stones/sounds/tms_ice_dig.2.ogg new file mode 100644 index 00000000..8a5da119 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_dig.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_dig.3.ogg b/mods/too_many_stones/sounds/tms_ice_dig.3.ogg new file mode 100644 index 00000000..765fb9be Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_dig.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_dug.ogg b/mods/too_many_stones/sounds/tms_ice_dug.ogg new file mode 100644 index 00000000..ae37673e Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_dug.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_footstep.1.ogg b/mods/too_many_stones/sounds/tms_ice_footstep.1.ogg new file mode 100644 index 00000000..c235f1ef Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_footstep.2.ogg b/mods/too_many_stones/sounds/tms_ice_footstep.2.ogg new file mode 100644 index 00000000..61d2c990 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_ice_footstep.3.ogg b/mods/too_many_stones/sounds/tms_ice_footstep.3.ogg new file mode 100644 index 00000000..2ecbb431 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_ice_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_metal_footstep.1.ogg b/mods/too_many_stones/sounds/tms_metal_footstep.1.ogg new file mode 100644 index 00000000..49fe89ba Binary files /dev/null and b/mods/too_many_stones/sounds/tms_metal_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_metal_footstep.2.ogg b/mods/too_many_stones/sounds/tms_metal_footstep.2.ogg new file mode 100644 index 00000000..878711d5 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_metal_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_metal_footstep.3.ogg b/mods/too_many_stones/sounds/tms_metal_footstep.3.ogg new file mode 100644 index 00000000..2a566a83 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_metal_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node.1.ogg b/mods/too_many_stones/sounds/tms_place_node.1.ogg new file mode 100644 index 00000000..46b9756d Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node.2.ogg b/mods/too_many_stones/sounds/tms_place_node.2.ogg new file mode 100644 index 00000000..d34c01a4 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node.3.ogg b/mods/too_many_stones/sounds/tms_place_node.3.ogg new file mode 100644 index 00000000..fc293650 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node_hard.1.ogg b/mods/too_many_stones/sounds/tms_place_node_hard.1.ogg new file mode 100644 index 00000000..9f97faca Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node_hard.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node_hard.2.ogg b/mods/too_many_stones/sounds/tms_place_node_hard.2.ogg new file mode 100644 index 00000000..1d3b3de2 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node_hard.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node_hard.3.ogg b/mods/too_many_stones/sounds/tms_place_node_hard.3.ogg new file mode 100644 index 00000000..c503e1cb Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node_hard.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node_metal.1.ogg b/mods/too_many_stones/sounds/tms_place_node_metal.1.ogg new file mode 100644 index 00000000..5da085ea Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node_metal.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_place_node_metal.2.ogg b/mods/too_many_stones/sounds/tms_place_node_metal.2.ogg new file mode 100644 index 00000000..5ee67fcf Binary files /dev/null and b/mods/too_many_stones/sounds/tms_place_node_metal.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_sand_footstep.1.ogg b/mods/too_many_stones/sounds/tms_sand_footstep.1.ogg new file mode 100644 index 00000000..b92feabb Binary files /dev/null and b/mods/too_many_stones/sounds/tms_sand_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_sand_footstep.2.ogg b/mods/too_many_stones/sounds/tms_sand_footstep.2.ogg new file mode 100644 index 00000000..6bc5da3e Binary files /dev/null and b/mods/too_many_stones/sounds/tms_sand_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_sand_footstep.3.ogg b/mods/too_many_stones/sounds/tms_sand_footstep.3.ogg new file mode 100644 index 00000000..880306fd Binary files /dev/null and b/mods/too_many_stones/sounds/tms_sand_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_snow_footstep.1.ogg b/mods/too_many_stones/sounds/tms_snow_footstep.1.ogg new file mode 100644 index 00000000..97cc8252 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_snow_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_snow_footstep.2.ogg b/mods/too_many_stones/sounds/tms_snow_footstep.2.ogg new file mode 100644 index 00000000..97a6baa4 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_snow_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_snow_footstep.3.ogg b/mods/too_many_stones/sounds/tms_snow_footstep.3.ogg new file mode 100644 index 00000000..bde1f21d Binary files /dev/null and b/mods/too_many_stones/sounds/tms_snow_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_snow_footstep.4.ogg b/mods/too_many_stones/sounds/tms_snow_footstep.4.ogg new file mode 100644 index 00000000..8ca6a590 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_snow_footstep.4.ogg differ diff --git a/mods/too_many_stones/sounds/tms_snow_footstep.5.ogg b/mods/too_many_stones/sounds/tms_snow_footstep.5.ogg new file mode 100644 index 00000000..220d60c9 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_snow_footstep.5.ogg differ diff --git a/mods/too_many_stones/sounds/tms_water_footstep.1.ogg b/mods/too_many_stones/sounds/tms_water_footstep.1.ogg new file mode 100644 index 00000000..63b9744c Binary files /dev/null and b/mods/too_many_stones/sounds/tms_water_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_water_footstep.2.ogg b/mods/too_many_stones/sounds/tms_water_footstep.2.ogg new file mode 100644 index 00000000..8d79c1f4 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_water_footstep.2.ogg differ diff --git a/mods/too_many_stones/sounds/tms_water_footstep.3.ogg b/mods/too_many_stones/sounds/tms_water_footstep.3.ogg new file mode 100644 index 00000000..f8891506 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_water_footstep.3.ogg differ diff --git a/mods/too_many_stones/sounds/tms_wood_footstep.1.ogg b/mods/too_many_stones/sounds/tms_wood_footstep.1.ogg new file mode 100644 index 00000000..34f63a17 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_wood_footstep.1.ogg differ diff --git a/mods/too_many_stones/sounds/tms_wood_footstep.2.ogg b/mods/too_many_stones/sounds/tms_wood_footstep.2.ogg new file mode 100644 index 00000000..124fc297 Binary files /dev/null and b/mods/too_many_stones/sounds/tms_wood_footstep.2.ogg differ diff --git a/mods/too_many_stones/stairs.lua b/mods/too_many_stones/stairs.lua new file mode 100644 index 00000000..960252fa --- /dev/null +++ b/mods/too_many_stones/stairs.lua @@ -0,0 +1,4168 @@ +-- support for MT game translation. +local S = minetest.get_translator("too_many_stones") + +if minetest.get_modpath("stairs") ~= nil then + +-- Blue Agate +stairs.register_stair_and_slab( + "agate_blue", + "too_many_stones:agate_blue", + {cracky = 3}, + {"tms_agate_blue.png"}, + S("Blue Agate Stair"), + S("Blue Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Blue Agate Stair"), + S("Outer Blue Agate Stair") +) + +-- Gray Agate +stairs.register_stair_and_slab( + "agate_gray", + "too_many_stones:agate_gray", + {cracky = 3}, + {"tms_agate_gray.png"}, + S("Gray Agate Stair"), + S("Gray Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Gray Agate Stair"), + S("Outer Gray Agate Stair") +) +-- Green Agate +stairs.register_stair_and_slab( + "agate_green", + "too_many_stones:agate_green", + {cracky = 3}, + {"tms_agate_green.png"}, + S("Green Agate Stair"), + S("Green Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Green Agate Stair"), + S("Outer Green Agate Stair") +) +-- Moss Agate +stairs.register_stair_and_slab( + "agate_moss", + "too_many_stones:agate_moss", + {cracky = 3}, + {"tms_agate_moss.png"}, + S("Moss Agate Stair"), + S("Moss Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Moss Agate Stair"), + S("Outer Moss Agate Stair") +) +-- Orange Agate +stairs.register_stair_and_slab( + "agate_orange", + "too_many_stones:agate_orange", + {cracky = 3}, + {"tms_agate_orange.png"}, + S("Orange Agate Stair"), + S("Orange Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Orange Agate Stair"), + S("Outer Orange Agate Stair") +) +-- Purple Agate +stairs.register_stair_and_slab( + "agate_purple", + "too_many_stones:agate_purple", + {cracky = 3}, + {"tms_agate_purple.png"}, + S("Purple Agate Stair"), + S("Purple Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Purple Agate Stair"), + S("Outer Purple Agate Stair") +) +-- Red Agate +stairs.register_stair_and_slab( + "agate_red", + "too_many_stones:agate_red", + {cracky = 3}, + {"tms_agate_red.png"}, + S("Red Agate Stair"), + S("Red Agate Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Red Agate Stair"), + S("Outer Red Agate Stair") +) + +-- Amazonite +stairs.register_stair_and_slab( + "amazonite", + "too_many_stones:amazonite", + {cracky = 3}, + {"tms_amazonite.png"}, + S("Amazonite Stair"), + S("Amazonite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Amazonite Stair"), + S("Outer Amazonite Stair") +) + +stairs.register_stair_and_slab( + "amazonite_cobble", + "too_many_stones:amazonite_cobble", + {cracky = 3}, + {"tms_amazonite_cobble.png"}, + S("Cobbled Amazonite Stair"), + S("Cobbled Amazonite Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cobbled Amazonite Stair"), + S("Outer Cobbled Amazonite Stair") +) + +stairs.register_stair_and_slab( + "amazonite_brick", + "too_many_stones:amazonite_brick", + {cracky = 2}, + {"tms_amazonite_brick.png"}, + S("Amazonite Brick Stair"), + S("Amazonite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Amazonite Brick Stair"), + S("Outer Amazonite Brick Stair") +) + +stairs.register_stair_and_slab( + "amazonite_cracked_brick", + "too_many_stones:amazonite_cracked_brick", + {cracky = 2}, + {"tms_amazonite_cracked_brick.png"}, + S("Cracked Amazonite Brick Stair"), + S("Cracked Amazonite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Amazonite Brick Stair"), + S("Outer Cracked Amazonite Brick Stair") +) + +stairs.register_stair_and_slab( + "amazonite_block", + "too_many_stones:amazonite_block", + {cracky = 2}, + {"tms_amazonite_block.png"}, + S("Amazonite Block Stair"), + S("Amazonite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Amazonite Block Stair"), + S("Outer Amazonite Block Stair") +) +-- Amber +stairs.register_stair_and_slab( + "amber", + "too_many_stones:amber", + {cracky = 3}, + {"tms_amber.png"}, + S("Amber Stair"), + S("Amber Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Amber Stair"), + S("Outer Amber Stair") +) + +stairs.register_stair_and_slab( + "amber_brick", + "too_many_stones:amber_brick", + {cracky = 2}, + {"tms_amber_brick.png"}, + S("Amber Brick Stair"), + S("Amber Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Amber Brick Stair"), + S("Outer Amber Brick Stair") +) + +stairs.register_stair_and_slab( + "amber_cracked_brick", + "too_many_stones:amber_cracked_brick", + {cracky = 2}, + {"tms_amber_cracked_brick.png"}, + S("Cracked Amber Brick Stair"), + S("Cracked Amber Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Amber Brick Stair"), + S("Outer Cracked Amber Brick Stair") +) + +stairs.register_stair_and_slab( + "amber_block", + "too_many_stones:amber_block", + {cracky = 2}, + {"tms_amber_block.png"}, + S("Amber Block Stair"), + S("Amber Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Amber Block Stair"), + S("Outer Amber Block Stair") +) +-- Amethyst +stairs.register_stair_and_slab( + "amethyst", + "too_many_stones:amethyst", + {cracky = 3}, + {"tms_amethyst.png"}, + S("Amethyst Stair"), + S("Amethyst Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Amethyst Stair"), + S("Outer Amethyst Stair") +) + +stairs.register_stair_and_slab( + "amethyst_brick", + "too_many_stones:amethyst_brick", + {cracky = 2}, + {"tms_amethyst_brick.png"}, + S("Amethyst Brick Stair"), + S("Amethyst Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Amethyst Brick Stair"), + S("Outer Amethyst Brick Stair") +) + +stairs.register_stair_and_slab( + "amethyst_cracked_brick", + "too_many_stones:amethyst_cracked_brick", + {cracky = 2}, + {"tms_amethyst_cracked_brick.png"}, + S("Cracked Amethyst Brick Stair"), + S("Cracked Amethyst Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Amethyst Brick Stair"), + S("Outer Cracked Amethyst Brick Stair") +) + +stairs.register_stair_and_slab( + "amethyst_block", + "too_many_stones:amethyst_block", + {cracky = 2}, + {"tms_amethyst_block.png"}, + S("Amethyst Block Stair"), + S("Amethyst Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Amethyst Block Stair"), + S("Outer Amethyst Block Stair") +) +-- Andesite +stairs.register_stair_and_slab( + "andesite", + "too_many_stones:andesite", + {cracky = 3}, + {"tms_andesite.png"}, + S("Andesite Stair"), + S("Andesite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Andesite Stair"), + S("Outer Andesite Stair") +) + +stairs.register_stair_and_slab( + "andesite_cobble", + "too_many_stones:andesite_cobble", + {cracky = 3}, + {"tms_andesite_cobble.png"}, + S("Cobbled Andesite Stair"), + S("Cobbled Andesite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Andesite Stair"), + S("Outer Cobbled Andesite Stair") +) + +stairs.register_stair_and_slab( + "andesite_brick", + "too_many_stones:andesite_brick", + {cracky = 2}, + {"tms_andesite_brick.png"}, + S("Andesite Brick Stair"), + S("Andesite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Andesite Brick Stair"), + S("Outer Andesite Brick Stair") +) + +stairs.register_stair_and_slab( + "andesite_cracked_brick", + "too_many_stones:andesite_cracked_brick", + {cracky = 2}, + {"tms_andesite_cracked_brick.png"}, + S("Cracked Andesite Brick Stair"), + S("Cracked Andesite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Andesite Brick Stair"), + S("Outer Cracked Andesite Brick Stair") +) + +stairs.register_stair_and_slab( + "andesite_block", + "too_many_stones:andesite_block", + {cracky = 2}, + {"tms_andesite_block.png"}, + S("Andesite Block Stair"), + S("Andesite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Andesite Block Stair"), + S("Outer Andesite Block Stair") +) +-- Basalt +stairs.register_stair_and_slab( + "basalt", + "too_many_stones:basalt", + {cracky = 3}, + {"tms_basalt.png"}, + S("Basalt Stair"), + S("Basalt Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Basalt Stair"), + S("Outer Basalt Stair") +) + +stairs.register_stair_and_slab( + "basalt_cobble", + "too_many_stones:basalt_cobble", + {cracky = 3}, + {"tms_basalt_cobble.png"}, + S("Cobbled Basalt Stair"), + S("Cobbled Basalt Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Basalt Stair"), + S("Outer Cobbled Basalt Stair") +) + +stairs.register_stair_and_slab( + "basalt_brick", + "too_many_stones:basalt_brick", + {cracky = 2}, + {"tms_basalt_brick.png"}, + S("Basalt Brick Stair"), + S("Basalt Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Basalt Brick Stair"), + S("Outer Basalt Brick Stair") +) + +stairs.register_stair_and_slab( + "basalt_cracked_brick", + "too_many_stones:basalt_cracked_brick", + {cracky = 2}, + {"tms_basalt_cracked_brick.png"}, + S("Cracked Basalt Brick Stair"), + S("Cracked Basalt Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Basalt Brick Stair"), + S("Outer Cracked Basalt Brick Stair") +) + +stairs.register_stair_and_slab( + "basalt_block", + "too_many_stones:basalt_block", + {cracky = 2}, + {"tms_basalt_block.png"}, + S("Basalt Block Stair"), + S("Basalt Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Basalt Block Stair"), + S("Outer Basalt Block Stair") +) + +stairs.register_stair_and_slab( + "basalt_tile", + "too_many_stones:basalt_tile", + {cracky = 2}, + {"tms_basalt_tile.png"}, + S("Basalt Tile Stair"), + S("Basalt Tile Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Basalt Tile Stair"), + S("Outer Basalt Tile Stair") +) +-- Black Moonstone +stairs.register_stair_and_slab( + "black_moonstone", + "too_many_stones:black_moonstone", + {cracky = 3}, + {"tms_black_moonstone.png"}, + S("Black Moonstone Stair"), + S("Black Moonstone Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Black Moonstone Stair"), + S("Outer Black Moonstone Stair") +) + +stairs.register_stair_and_slab( + "black_moonstone_brick", + "too_many_stones:black_moonstone_brick", + {cracky = 2}, + {"tms_black_moonstone_brick.png"}, + S("Black Moonstone Brick Stair"), + S("Black Moonstone Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Black Moonstone Brick Stair"), + S("Outer Black Moonstone Brick Stair") +) + +stairs.register_stair_and_slab( + "black_moonstone_cracked_brick", + "too_many_stones:black_moonstone_cracked_brick", + {cracky = 2}, + {"tms_black_moonstone_cracked_brick.png"}, + S("Cracked Black Moonstone Brick Stair"), + S("Cracked Black Moonstone Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Black Moonstone Brick Stair"), + S("Outer Cracked Black Moonstone Brick Stair") +) + +stairs.register_stair_and_slab( + "black_moonstone_block", + "too_many_stones:black_moonstone_block", + {cracky = 2}, + {"tms_black_moonstone_block.png"}, + S("Black Moonstone Block Stair"), + S("Black Moonstone Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Black Moonstone Block Stair"), + S("Outer Black Moonstone Block Stair") +) +-- Grey Calcite +stairs.register_stair_and_slab( + "calcite_grey", + "too_many_stones:calcite_grey", + {cracky = 3}, + {"tms_calcite_grey.png"}, + S("Grey Calcite Stair"), + S("Grey Calcite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Grey Calcite Stair"), + S("Outer Grey Calcite Stair") +) + +stairs.register_stair_and_slab( + "calcite_grey_brick", + "too_many_stones:calcite_grey_brick", + {cracky = 2}, + {"tms_calcite_grey_brick.png"}, + S("Grey Calcite Brick Stair"), + S("Grey Calcite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Grey Calcite Brick Stair"), + S("Outer Grey Calcite Brick Stair") +) + +stairs.register_stair_and_slab( + "calcite_grey_cracked_brick", + "too_many_stones:calcite_grey_cracked_brick", + {cracky = 2}, + {"tms_calcite_grey_cracked_brick.png"}, + S("Cracked Grey Calcite Brick Stair"), + S("Cracked Grey Calcite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Grey Calcite Brick Stair"), + S("Outer Cracked Grey Calcite Brick Stair") +) + +stairs.register_stair_and_slab( + "calcite_grey_block", + "too_many_stones:calcite_grey_block", + {cracky = 2}, + {"tms_calcite_grey_block.png"}, + S("Grey Calcite Block Stair"), + S("Grey Calcite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Grey Calcite Block Stair"), + S("Outer Grey Calcite Block Stair") +) +-- Calcite +stairs.register_stair_and_slab( + "calcite", + "too_many_stones:calcite", + {cracky = 3}, + {"tms_calcite.png"}, + S("Calcite Stair"), + S("Calcite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Calcite Stair"), + S("Outer Calcite Stair") +) + +stairs.register_stair_and_slab( + "calcite_brick", + "too_many_stones:calcite_brick", + {cracky = 2}, + {"tms_calcite_brick.png"}, + S("Calcite Brick Stair"), + S("Calcite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Calcite Brick Stair"), + S("Outer Calcite Brick Stair") +) + +stairs.register_stair_and_slab( + "calcite_cracked_brick", + "too_many_stones:calcite_cracked_brick", + {cracky = 2}, + {"tms_calcite_cracked_brick.png"}, + S("Cracked Calcite Brick Stair"), + S("Cracked Calcite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Calcite Brick Stair"), + S("Outer Cracked Calcite Brick Stair") +) + +stairs.register_stair_and_slab( + "calcite_block", + "too_many_stones:calcite_block", + {cracky = 2}, + {"tms_calcite_block.png"}, + S("Calcite Block Stair"), + S("Calcite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Calcite Block Stair"), + S("Outer Calcite Block Stair") +) +-- Orange Calcite +stairs.register_stair_and_slab( + "calcite_orange", + "too_many_stones:calcite_orange", + {cracky = 3}, + {"tms_calcite_orange.png"}, + S("Orange Calcite Stair"), + S("Orange Calcite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Orange Calcite Stair"), + S("Outer Orange Calcite Stair") +) + +stairs.register_stair_and_slab( + "calcite_orange_brick", + "too_many_stones:calcite_orange_brick", + {cracky = 2}, + {"tms_calcite_orange_brick.png"}, + S("Orange Calcite Brick Stair"), + S("Orange Calcite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Orange Calcite Brick Stair"), + S("Outer Orange Calcite Brick Stair") +) + +stairs.register_stair_and_slab( + "calcite_orange_cracked_brick", + "too_many_stones:calcite_orange_cracked_brick", + {cracky = 2}, + {"tms_calcite_orange_cracked_brick.png"}, + S("Cracked Orange Calcite Brick Stair"), + S("Cracked Orange Calcite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Orange Calcite Brick Stair"), + S("Outer Cracked Orange Calcite Brick Stair") +) + +stairs.register_stair_and_slab( + "calcite_orange_block", + "too_many_stones:calcite_orange_block", + {cracky = 2}, + {"tms_calcite_orange_block.png"}, + S("Orange Calcite Block Stair"), + S("Orange Calcite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Orange Calcite Block Stair"), + S("Outer Orange Calcite Block Stair") +) +-- Carnotite +stairs.register_stair_and_slab( + "carnotite", + "too_many_stones:carnotite", + {cracky = 3}, + {"tms_carnotite.png"}, + S("Carnotite Stair"), + S("Carnotite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Carnotite Stair"), + S("Outer Carnotite Stair") +) + +stairs.register_stair_and_slab( + "carnotite_cobble", + "too_many_stones:carnotite_cobble", + {cracky = 3}, + {"tms_carnotite_cobble.png"}, + S("Cobbled Carnotite Stair"), + S("Cobbled Carnotite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Carnotite Stair"), + S("Outer Cobbled Carnotite Stair") +) + +stairs.register_stair_and_slab( + "carnotite_brick", + "too_many_stones:carnotite_brick", + {cracky = 2}, + {"tms_carnotite_brick.png"}, + S("Carnotite Brick Stair"), + S("Carnotite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Carnotite Brick Stair"), + S("Outer Carnotite Brick Stair") +) + +stairs.register_stair_and_slab( + "carnotite_cracked_brick", + "too_many_stones:carnotite_cracked_brick", + {cracky = 2}, + {"tms_carnotite_cracked_brick.png"}, + S("Cracked Carnotite Brick Stair"), + S("Cracked Carnotite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Carnotite Brick Stair"), + S("Outer Cracked Carnotite Brick Stair") +) + +stairs.register_stair_and_slab( + "carnotite_block", + "too_many_stones:carnotite_block", + {cracky = 2}, + {"tms_carnotite_block.png"}, + S("Carnotite Block Stair"), + S("Carnotite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Carnotite Block Stair"), + S("Outer Carnotite Block Stair") +) +-- Celestine +stairs.register_stair_and_slab( + "celestine", + "too_many_stones:celestine", + {cracky = 3}, + {"tms_celestine.png"}, + S("Celestine Stair"), + S("Celestine Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Celestine Stair"), + S("Outer Celestine Stair") +) + +stairs.register_stair_and_slab( + "celestine_brick", + "too_many_stones:celestine_brick", + {cracky = 2}, + {"tms_celestine_brick.png"}, + S("Celestine Brick Stair"), + S("Celestine Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Celestine Brick Stair"), + S("Outer Celestine Brick Stair") +) + +stairs.register_stair_and_slab( + "celestine_cracked_brick", + "too_many_stones:celestine_cracked_brick", + {cracky = 2}, + {"tms_celestine_cracked_brick.png"}, + S("Cracked Celestine Brick Stair"), + S("Cracked Celestine Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Celestine Brick Stair"), + S("Outer Cracked Celestine Brick Stair") +) + +stairs.register_stair_and_slab( + "celestine_block", + "too_many_stones:celestine_block", + {cracky = 2}, + {"tms_celestine_block.png"}, + S("Celestine Block Stair"), + S("Celestine Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Celestine Block Stair"), + S("Outer Celestine Block Stair") +) +-- Chalcanthite +stairs.register_stair_and_slab( + "chalcanthite", + "too_many_stones:chalcanthite", + {cracky = 3}, + {"tms_chalcanthite.png"}, + S("Chalcanthite Stair"), + S("Chalcanthite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Chalcanthite Stair"), + S("Outer Chalcanthite Stair") +) + +stairs.register_stair_and_slab( + "chalcanthite_brick", + "too_many_stones:chalcanthite_brick", + {cracky = 2}, + {"tms_chalcanthite_brick.png"}, + S("Chalcanthite Brick Stair"), + S("Chalcanthite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Chalcanthite Brick Stair"), + S("Outer Chalcanthite Brick Stair") +) + +stairs.register_stair_and_slab( + "chalcanthite_cracked_brick", + "too_many_stones:chalcanthite_cracked_brick", + {cracky = 2}, + {"tms_chalcanthite_cracked_brick.png"}, + S("Cracked Chalcanthite Brick Stair"), + S("Cracked Chalcanthite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Chalcanthite Brick Stair"), + S("Outer Cracked Chalcanthite Brick Stair") +) + +stairs.register_stair_and_slab( + "chalcanthite_block", + "too_many_stones:chalcanthite_block", + {cracky = 2}, + {"tms_chalcanthite_block.png"}, + S("Chalcanthite Block Stair"), + S("Chalcanthite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Chalcanthite Block Stair"), + S("Outer Chalcanthite Block Stair") +) + +stairs.register_stair_and_slab( + "chalcanthite_cobble", + "too_many_stones:chalcanthite_cobble", + {cracky = 2}, + {"tms_chalcanthite_cobble.png"}, + S("Cobbled Chalcanthite Stair"), + S("Cobbled Chalcanthite Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cobbled Chalcanthite Stair"), + S("Outer Cobbled Chalcanthite Stair") +) +-- Chrysoprase +stairs.register_stair_and_slab( + "chrysoprase", + "too_many_stones:chrysoprase", + {cracky = 3}, + {"tms_chrysoprase.png"}, + S("Chrysoprase Stair"), + S("Chrysoprase Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Chrysoprase Stair"), + S("Outer Chrysoprase Stair") +) + +stairs.register_stair_and_slab( + "chrysoprase_brick", + "too_many_stones:chrysoprase_brick", + {cracky = 2}, + {"tms_chrysoprase_brick.png"}, + S("Chrysoprase Brick Stair"), + S("Chrysoprase Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Chrysoprase Brick Stair"), + S("Outer Chrysoprase Brick Stair") +) + +stairs.register_stair_and_slab( + "chrysoprase_cracked_brick", + "too_many_stones:chrysoprase_cracked_brick", + {cracky = 2}, + {"tms_chrysoprase_cracked_brick.png"}, + S("Cracked Chrysoprase Brick Stair"), + S("Cracked Chrysoprase Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Chrysoprase Brick Stair"), + S("Outer Cracked Chrysoprase Brick Stair") +) + +stairs.register_stair_and_slab( + "chrysoprase_block", + "too_many_stones:chrysoprase_block", + {cracky = 2}, + {"tms_chrysoprase_block.png"}, + S("Chrysoprase Block Stair"), + S("Chrysoprase Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Chrysoprase Block Stair"), + S("Outer Chrysoprase Block Stair") +) +-- Citrine +stairs.register_stair_and_slab( + "citrine", + "too_many_stones:citrine", + {cracky = 3}, + {"tms_citrine.png"}, + S("Citrine Stair"), + S("Citrine Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Citrine Stair"), + S("Outer Citrine Stair") +) + +stairs.register_stair_and_slab( + "citrine_brick", + "too_many_stones:citrine_brick", + {cracky = 2}, + {"tms_citrine_brick.png"}, + S("Citrine Brick Stair"), + S("Citrine Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Citrine Brick Stair"), + S("Outer Citrine Brick Stair") +) + +stairs.register_stair_and_slab( + "citrine_cracked_brick", + "too_many_stones:citrine_cracked_brick", + {cracky = 2}, + {"tms_citrine_cracked_brick.png"}, + S("Cracked Citrine Brick Stair"), + S("Cracked Citrine Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Citrine Brick Stair"), + S("Outer Cracked Citrine Brick Stair") +) + +stairs.register_stair_and_slab( + "citrine_block", + "too_many_stones:citrine_block", + {cracky = 2}, + {"tms_citrine_block.png"}, + S("Citrine Block Stair"), + S("Citrine Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Citrine Block Stair"), + S("Outer Citrine Block Stair") +) +-- Covellite +stairs.register_stair_and_slab( + "covellite", + "too_many_stones:covellite", + {cracky = 3}, + {"tms_covellite.png"}, + S("Covellite Stair"), + S("Covellite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Covellite Stair"), + S("Outer Covellite Stair") +) + +stairs.register_stair_and_slab( + "covellite_brick", + "too_many_stones:covellite_brick", + {cracky = 2}, + {"tms_covellite_brick.png"}, + S("Covellite Brick Stair"), + S("Covellite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Covellite Brick Stair"), + S("Outer Covellite Brick Stair") +) + +stairs.register_stair_and_slab( + "covellite_cracked_brick", + "too_many_stones:covellite_cracked_brick", + {cracky = 2}, + {"tms_covellite_cracked_brick.png"}, + S("Cracked Covellite Brick Stair"), + S("Cracked Covellite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Covellite Brick Stair"), + S("Outer Cracked Covellite Brick Stair") +) + +stairs.register_stair_and_slab( + "covellite_block", + "too_many_stones:covellite_block", + {cracky = 2}, + {"tms_covellite_block.png"}, + S("Covellite Block Stair"), + S("Covellite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Covellite Block Stair"), + S("Outer Covellite Block Stair") +) + +stairs.register_stair_and_slab( + "covellite_cobble", + "too_many_stones:covellite_cobble", + {cracky = 2}, + {"tms_covellite_cobble.png"}, + S("Cobbled Covellite Stair"), + S("Cobbled Covellite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Covellite Stair"), + S("Outer Cobbled Covellite Stair") +) +-- Crocoite +stairs.register_stair_and_slab( + "crocoite", + "too_many_stones:crocoite", + {cracky = 3}, + {"tms_crocoite.png"}, + S("Crocoite Stair"), + S("Crocoite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Crocoite Stair"), + S("Outer Crocoite Stair") +) + +stairs.register_stair_and_slab( + "crocoite_brick", + "too_many_stones:crocoite_brick", + {cracky = 2}, + {"tms_crocoite_brick.png"}, + S("Crocoite Brick Stair"), + S("Crocoite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Crocoite Brick Stair"), + S("Outer Crocoite Brick Stair") +) + +stairs.register_stair_and_slab( + "crocoite_cracked_brick", + "too_many_stones:crocoite_cracked_brick", + {cracky = 2}, + {"tms_crocoite_cracked_brick.png"}, + S("Cracked Crocoite Brick Stair"), + S("Cracked Crocoite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Crocoite Brick Stair"), + S("Outer Cracked Crocoite Brick Stair") +) + +stairs.register_stair_and_slab( + "crocoite_block", + "too_many_stones:crocoite_block", + {cracky = 2}, + {"tms_crocoite_block.png"}, + S("Crocoite Block Stair"), + S("Crocoite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Crocoite Block Stair"), + S("Outer Crocoite Block Stair") +) +-- Diorite +stairs.register_stair_and_slab( + "diorite", + "too_many_stones:diorite", + {cracky = 3}, + {"tms_diorite.png"}, + S("Diorite Stair"), + S("Diorite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Diorite Stair"), + S("Outer Diorite Stair") +) + +stairs.register_stair_and_slab( + "diorite_brick", + "too_many_stones:diorite_brick", + {cracky = 2}, + {"tms_diorite_brick.png"}, + S("Diorite Brick Stair"), + S("Diorite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Diorite Brick Stair"), + S("Outer Diorite Brick Stair") +) + +stairs.register_stair_and_slab( + "diorite_cracked_brick", + "too_many_stones:diorite_cracked_brick", + {cracky = 2}, + {"tms_diorite_cracked_brick.png"}, + S("Cracked Diorite Brick Stair"), + S("Cracked Diorite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Diorite Brick Stair"), + S("Outer Cracked Diorite Brick Stair") +) + +stairs.register_stair_and_slab( + "diorite_block", + "too_many_stones:diorite_block", + {cracky = 2}, + {"tms_diorite_block.png"}, + S("Diorite Block Stair"), + S("Diorite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Diorite Block Stair"), + S("Outer Diorite Block Stair") +) + +stairs.register_stair_and_slab( + "diorite_cobble", + "too_many_stones:diorite_cobble", + {cracky = 2}, + {"tms_diorite_cobble.png"}, + S("Cobbled Diorite Stair"), + S("Cobbled Diorite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Diorite Stair"), + S("Outer Cobbled Diorite Stair") +) +-- Erythrite +stairs.register_stair_and_slab( + "erythrite", + "too_many_stones:erythrite", + {cracky = 3}, + {"tms_erythrite.png"}, + S("Erythrite Stair"), + S("Erythrite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Erythrite Stair"), + S("Outer Erythrite Stair") +) + +stairs.register_stair_and_slab( + "erythrite_brick", + "too_many_stones:erythrite_brick", + {cracky = 2}, + {"tms_erythrite_brick.png"}, + S("Erythrite Brick Stair"), + S("Erythrite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Erythrite Brick Stair"), + S("Outer Erythrite Brick Stair") +) + +stairs.register_stair_and_slab( + "erythrite_cracked_brick", + "too_many_stones:erythrite_cracked_brick", + {cracky = 2}, + {"tms_erythrite_cracked_brick.png"}, + S("Cracked Erythrite Brick Stair"), + S("Cracked Erythrite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Erythrite Brick Stair"), + S("Outer Cracked Erythrite Brick Stair") +) + +stairs.register_stair_and_slab( + "erythrite_block", + "too_many_stones:erythrite_block", + {cracky = 2}, + {"tms_erythrite_block.png"}, + S("Erythrite Block Stair"), + S("Erythrite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Erythrite Block Stair"), + S("Outer Erythrite Block Stair") +) +-- Eudialite +stairs.register_stair_and_slab( + "eudialite", + "too_many_stones:eudialite", + {cracky = 3}, + {"tms_eudialite.png"}, + S("Eudialite Stair"), + S("Eudialite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Eudialite Stair"), + S("Outer Eudialite Stair") +) + +stairs.register_stair_and_slab( + "eudialite_brick", + "too_many_stones:eudialite_brick", + {cracky = 2}, + {"tms_eudialite_brick.png"}, + S("Eudialite Brick Stair"), + S("Eudialite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Eudialite Brick Stair"), + S("Outer Eudialite Brick Stair") +) + +stairs.register_stair_and_slab( + "eudialite_cracked_brick", + "too_many_stones:eudialite_cracked_brick", + {cracky = 2}, + {"tms_eudialite_cracked_brick.png"}, + S("Cracked Eudialite Brick Stair"), + S("Cracked Eudialite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Eudialite Brick Stair"), + S("Outer Cracked Eudialite Brick Stair") +) + +stairs.register_stair_and_slab( + "eudialite_block", + "too_many_stones:eudialite_block", + {cracky = 2}, + {"tms_eudialite_block.png"}, + S("Eudialite Block Stair"), + S("Eudialite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Eudialite Block Stair"), + S("Outer Eudialite Block Stair") +) +-- Fluorite +stairs.register_stair_and_slab( + "fluorite", + "too_many_stones:fluorite", + {cracky = 3}, + {"tms_fluorite.png"}, + S("Fluorite Stair"), + S("Fluorite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Fluorite Stair"), + S("Outer Fluorite Stair") +) + +stairs.register_stair_and_slab( + "fluorite_brick", + "too_many_stones:fluorite_brick", + {cracky = 2}, + {"tms_fluorite_brick.png"}, + S("Fluorite Brick Stair"), + S("Fluorite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Fluorite Brick Stair"), + S("Outer Fluorite Brick Stair") +) + +stairs.register_stair_and_slab( + "fluorite_cracked_brick", + "too_many_stones:fluorite_cracked_brick", + {cracky = 2}, + {"tms_fluorite_cracked_brick.png"}, + S("Cracked Fluorite Brick Stair"), + S("Cracked Fluorite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Fluorite Brick Stair"), + S("Outer Cracked Fluorite Brick Stair") +) + +stairs.register_stair_and_slab( + "fluorite_block", + "too_many_stones:fluorite_block", + {cracky = 2}, + {"tms_fluorite_block.png"}, + S("Fluorite Block Stair"), + S("Fluorite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Fluorite Block Stair"), + S("Outer Fluorite Block Stair") +) +-- Gabbro +stairs.register_stair_and_slab( + "gabbro", + "too_many_stones:gabbro", + {cracky = 3}, + {"tms_gabbro.png"}, + S("Gabbro Stair"), + S("Gabbro Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Gabbro Stair"), + S("Outer Gabbro Stair") +) + +stairs.register_stair_and_slab( + "gabbro_cobble", + "too_many_stones:gabbro_cobble", + {cracky = 3}, + {"tms_gabbro_cobble.png"}, + S("Cobbled Gabbro Stair"), + S("Cobbled Gabbro Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Gabbro Stair"), + S("Outer Cobbled Gabbro Stair") +) + +stairs.register_stair_and_slab( + "gabbro_brick", + "too_many_stones:gabbro_brick", + {cracky = 2}, + {"tms_gabbro_brick.png"}, + S("Gabbro Brick Stair"), + S("Gabbro Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Gabbro Brick Stair"), + S("Outer Gabbro Brick Stair") +) + +stairs.register_stair_and_slab( + "gabbro_cracked_brick", + "too_many_stones:gabbro_cracked_brick", + {cracky = 2}, + {"tms_gabbro_cracked_brick.png"}, + S("Cracked Gabbro Brick Stair"), + S("Cracked Gabbro Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Gabbro Brick Stair"), + S("Outer Cracked Gabbro Brick Stair") +) + +stairs.register_stair_and_slab( + "gabbro_block", + "too_many_stones:gabbro_block", + {cracky = 2}, + {"tms_gabbro_block.png"}, + S("Gabbro Block Stair"), + S("Gabbro Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Gabbro Block Stair"), + S("Outer Gabbro Block Stair") +) +-- Galena +stairs.register_stair_and_slab( + "galena", + "too_many_stones:galena", + {cracky = 3}, + {"tms_galena.png"}, + S("Galena Stair"), + S("Galena Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Galena Stair"), + S("Outer Galena Stair") +) + +stairs.register_stair_and_slab( + "galena_brick", + "too_many_stones:galena_brick", + {cracky = 2}, + {"tms_galena_brick.png"}, + S("Galena Brick Stair"), + S("Galena Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Galena Brick Stair"), + S("Outer Galena Brick Stair") +) + +stairs.register_stair_and_slab( + "galena_cracked_brick", + "too_many_stones:galena_cracked_brick", + {cracky = 2}, + {"tms_galena_cracked_brick.png"}, + S("Cracked Galena Brick Stair"), + S("Cracked Galena Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Galena Brick Stair"), + S("Outer Cracked Galena Brick Stair") +) + +stairs.register_stair_and_slab( + "galena_block", + "too_many_stones:galena_block", + {cracky = 2}, + {"tms_galena_block.png"}, + S("Galena Block Stair"), + S("Galena Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Galena Block Stair"), + S("Outer Galena Block Stair") +) +-- Black Granite +stairs.register_stair_and_slab( + "granite_black", + "too_many_stones:granite_black", + {cracky = 3}, + {"tms_granite_black.png"}, + S("Black Granite Stair"), + S("Black Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Black Granite Stair"), + S("Outer Black Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_black_brick", + "too_many_stones:granite_black_brick", + {cracky = 2}, + {"tms_granite_black_brick.png"}, + S("Black Granite Brick Stair"), + S("Black Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Black Granite Brick Stair"), + S("Outer Black Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_black_cracked_brick", + "too_many_stones:granite_black_cracked_brick", + {cracky = 2}, + {"tms_granite_black_cracked_brick.png"}, + S("Cracked Black Granite Brick Stair"), + S("Cracked Black Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Black Granite Brick Stair"), + S("Outer Cracked Black Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_black_block", + "too_many_stones:granite_black_block", + {cracky = 2}, + {"tms_granite_black_block.png"}, + S("Black Granite Block Stair"), + S("Black Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Black Granite Block Stair"), + S("Outer Black Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_black_cobble", + "too_many_stones:granite_black_cobble", + {cracky = 2}, + {"tms_granite_black_cobble.png"}, + S("Cobbled Black Granite Stair"), + S("Cobbled Black Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Black Granite Stair"), + S("Outer Cobbled Black Granite Stair") +) +-- Blue Granite +stairs.register_stair_and_slab( + "granite_blue", + "too_many_stones:granite_blue", + {cracky = 3}, + {"tms_granite_blue.png"}, + S("Blue Granite Stair"), + S("Blue Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Blue Granite Stair"), + S("Outer Blue Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_blue_brick", + "too_many_stones:granite_blue_brick", + {cracky = 2}, + {"tms_granite_blue_brick.png"}, + S("Blue Granite Brick Stair"), + S("Blue Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Blue Granite Brick Stair"), + S("Outer Blue Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_blue_cracked_brick", + "too_many_stones:granite_blue_cracked_brick", + {cracky = 2}, + {"tms_granite_blue_cracked_brick.png"}, + S("Cracked Blue Granite Brick Stair"), + S("Cracked Blue Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Blue Granite Brick Stair"), + S("Outer Cracked Blue Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_blue_block", + "too_many_stones:granite_blue_block", + {cracky = 2}, + {"tms_granite_blue_block.png"}, + S("Blue Granite Block Stair"), + S("Blue Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Blue Granite Block Stair"), + S("Outer Blue Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_blue_cobble", + "too_many_stones:granite_blue_cobble", + {cracky = 2}, + {"tms_granite_blue_cobble.png"}, + S("Cobbled Blue Granite Stair"), + S("Cobbled Blue Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Blue Granite Stair"), + S("Outer Cobbled Blue Granite Stair") +) +-- Gray Granite +stairs.register_stair_and_slab( + "granite_gray", + "too_many_stones:granite_gray", + {cracky = 3}, + {"tms_granite_gray.png"}, + S("Gray Granite Stair"), + S("Gray Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Gray Granite Stair"), + S("Outer Gray Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_gray_brick", + "too_many_stones:granite_gray_brick", + {cracky = 2}, + {"tms_granite_gray_brick.png"}, + S("Gray Granite Brick Stair"), + S("Gray Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Gray Granite Brick Stair"), + S("Outer Gray Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_gray_cracked_brick", + "too_many_stones:granite_gray_cracked_brick", + {cracky = 2}, + {"tms_granite_gray_cracked_brick.png"}, + S("Cracked Gray Granite Brick Stair"), + S("Cracked Gray Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Gray Granite Brick Stair"), + S("Outer Cracked Gray Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_gray_block", + "too_many_stones:granite_gray_block", + {cracky = 2}, + {"tms_granite_gray_block.png"}, + S("Gray Granite Block Stair"), + S("Gray Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Gray Granite Block Stair"), + S("Outer Gray Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_gray_cobble", + "too_many_stones:granite_gray_cobble", + {cracky = 2}, + {"tms_granite_gray_cobble.png"}, + S("Cobbled Gray Granite Stair"), + S("Cobbled Gray Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Gray Granite Stair"), + S("Outer Cobbled Gray Granite Stair") +) +-- Green Granite +stairs.register_stair_and_slab( + "granite_green", + "too_many_stones:granite_green", + {cracky = 3}, + {"tms_granite_green.png"}, + S("Green Granite Stair"), + S("Green Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Green Granite Stair"), + S("Outer Green Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_green_brick", + "too_many_stones:granite_green_brick", + {cracky = 2}, + {"tms_granite_green_brick.png"}, + S("Green Granite Brick Stair"), + S("Green Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Green Granite Brick Stair"), + S("Outer Green Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_green_cracked_brick", + "too_many_stones:granite_green_cracked_brick", + {cracky = 2}, + {"tms_granite_green_cracked_brick.png"}, + S("Cracked Green Granite Brick Stair"), + S("Cracked Green Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Green Granite Brick Stair"), + S("Outer Cracked Green Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_green_block", + "too_many_stones:granite_green_block", + {cracky = 2}, + {"tms_granite_green_block.png"}, + S("Green Granite Block Stair"), + S("Green Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Green Granite Block Stair"), + S("Outer Green Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_green_cobble", + "too_many_stones:granite_green_cobble", + {cracky = 2}, + {"tms_granite_green_cobble.png"}, + S("Cobbled Green Granite Stair"), + S("Cobbled Green Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Green Granite Stair"), + S("Outer Cobbled Green Granite Stair") +) +-- Pink Granite +stairs.register_stair_and_slab( + "granite_pink", + "too_many_stones:granite_pink", + {cracky = 3}, + {"tms_granite_pink.png"}, + S("Pink Granite Stair"), + S("Pink Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Pink Granite Stair"), + S("Outer Pink Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_pink_brick", + "too_many_stones:granite_pink_brick", + {cracky = 2}, + {"tms_granite_pink_brick.png"}, + S("Pink Granite Brick Stair"), + S("Pink Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Pink Granite Brick Stair"), + S("Outer Pink Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_pink_cracked_brick", + "too_many_stones:granite_pink_cracked_brick", + {cracky = 2}, + {"tms_granite_pink_cracked_brick.png"}, + S("Cracked Pink Granite Brick Stair"), + S("Cracked Pink Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Pink Granite Brick Stair"), + S("Outer Cracked Pink Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_pink_block", + "too_many_stones:granite_pink_block", + {cracky = 2}, + {"tms_granite_pink_block.png"}, + S("Pink Granite Block Stair"), + S("Pink Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Pink Granite Block Stair"), + S("Outer Pink Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_pink_cobble", + "too_many_stones:granite_pink_cobble", + {cracky = 2}, + {"tms_granite_pink_cobble.png"}, + S("Cobbled Pink Granite Stair"), + S("Cobbled Pink Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Pink Granite Stair"), + S("Outer Cobbled Pink Granite Stair") +) +-- Red Granite +stairs.register_stair_and_slab( + "granite_red", + "too_many_stones:granite_red", + {cracky = 3}, + {"tms_granite_red.png"}, + S("Red Granite Stair"), + S("Red Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Red Granite Stair"), + S("Outer Red Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_red_brick", + "too_many_stones:granite_red_brick", + {cracky = 2}, + {"tms_granite_red_brick.png"}, + S("Red Granite Brick Stair"), + S("Red Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Red Granite Brick Stair"), + S("Outer Red Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_red_cracked_brick", + "too_many_stones:granite_red_cracked_brick", + {cracky = 2}, + {"tms_granite_red_cracked_brick.png"}, + S("Cracked Red Granite Brick Stair"), + S("Cracked Red Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Red Granite Brick Stair"), + S("Outer Cracked Red Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_red_block", + "too_many_stones:granite_red_block", + {cracky = 2}, + {"tms_granite_red_block.png"}, + S("Red Granite Block Stair"), + S("Red Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Red Granite Block Stair"), + S("Outer Red Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_red_cobble", + "too_many_stones:granite_red_cobble", + {cracky = 2}, + {"tms_granite_red_cobble.png"}, + S("Cobbled Red Granite Stair"), + S("Cobbled Red Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Red Granite Stair"), + S("Outer Cobbled Red Granite Stair") +) +-- White Granite +stairs.register_stair_and_slab( + "granite_white", + "too_many_stones:granite_white", + {cracky = 3}, + {"tms_granite_white.png"}, + S("White Granite Stair"), + S("White Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner White Granite Stair"), + S("Outer White Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_white_brick", + "too_many_stones:granite_white_brick", + {cracky = 2}, + {"tms_granite_white_brick.png"}, + S("White Granite Brick Stair"), + S("White Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner White Granite Brick Stair"), + S("Outer White Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_white_cracked_brick", + "too_many_stones:granite_white_cracked_brick", + {cracky = 2}, + {"tms_granite_white_cracked_brick.png"}, + S("Cracked White Granite Brick Stair"), + S("Cracked White Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked White Granite Brick Stair"), + S("Outer Cracked White Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_white_block", + "too_many_stones:granite_white_block", + {cracky = 2}, + {"tms_granite_white_block.png"}, + S("White Granite Block Stair"), + S("White Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner White Granite Block Stair"), + S("Outer White Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_white_cobble", + "too_many_stones:granite_white_cobble", + {cracky = 2}, + {"tms_granite_white_cobble.png"}, + S("Cobbled White Granite Stair"), + S("Cobbled White Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled White Granite Stair"), + S("Outer Cobbled White Granite Stair") +) +-- Yellow Granite +stairs.register_stair_and_slab( + "granite_yellow", + "too_many_stones:granite_yellow", + {cracky = 3}, + {"tms_granite_yellow.png"}, + S("Yellow Granite Stair"), + S("Yellow Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Yellow Granite Stair"), + S("Outer Yellow Granite Stair") +) + +stairs.register_stair_and_slab( + "granite_yellow_brick", + "too_many_stones:granite_yellow_brick", + {cracky = 2}, + {"tms_granite_yellow_brick.png"}, + S("Yellow Granite Brick Stair"), + S("Yellow Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Yellow Granite Brick Stair"), + S("Outer Yellow Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_yellow_cracked_brick", + "too_many_stones:granite_yellow_cracked_brick", + {cracky = 2}, + {"tms_granite_yellow_cracked_brick.png"}, + S("Cracked Yellow Granite Brick Stair"), + S("Cracked Yellow Granite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Yellow Granite Brick Stair"), + S("Outer Cracked Yellow Granite Brick Stair") +) + +stairs.register_stair_and_slab( + "granite_yellow_block", + "too_many_stones:granite_yellow_block", + {cracky = 2}, + {"tms_granite_yellow_block.png"}, + S("Yellow Granite Block Stair"), + S("Yellow Granite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Yellow Granite Block Stair"), + S("Outer Yellow Granite Block Stair") +) + +stairs.register_stair_and_slab( + "granite_yellow_cobble", + "too_many_stones:granite_yellow_cobble", + {cracky = 2}, + {"tms_granite_yellow_cobble.png"}, + S("Cobbled Yellow Granite Stair"), + S("Cobbled Yellow Granite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Yellow Granite Stair"), + S("Outer Cobbled Yellow Granite Stair") +) +-- Heliodor +stairs.register_stair_and_slab( + "heliodor", + "too_many_stones:heliodor", + {cracky = 3}, + {"tms_heliodor.png"}, + S("Heliodor Stair"), + S("Heliodor Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Heliodor Stair"), + S("Outer Heliodor Stair") +) + +stairs.register_stair_and_slab( + "heliodor_brick", + "too_many_stones:heliodor_brick", + {cracky = 2}, + {"tms_heliodor_brick.png"}, + S("Heliodor Brick Stair"), + S("Heliodor Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Heliodor Brick Stair"), + S("Outer Heliodor Brick Stair") +) + +stairs.register_stair_and_slab( + "heliodor_cracked_brick", + "too_many_stones:heliodor_cracked_brick", + {cracky = 2}, + {"tms_heliodor_cracked_brick.png"}, + S("Cracked Heliodor Brick Stair"), + S("Cracked Heliodor Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Heliodor Brick Stair"), + S("Outer Cracked Heliodor Brick Stair") +) + +stairs.register_stair_and_slab( + "heliodor_block", + "too_many_stones:heliodor_block", + {cracky = 2}, + {"tms_heliodor_block.png"}, + S("Heliodor Block Stair"), + S("Heliodor Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Heliodor Block Stair"), + S("Outer Heliodor Block Stair") +) +-- Howlite +stairs.register_stair_and_slab( + "howlite", + "too_many_stones:howlite", + {cracky = 3}, + {"tms_howlite.png"}, + S("Howlite Stair"), + S("Howlite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Howlite Stair"), + S("Outer Howlite Stair") +) + +stairs.register_stair_and_slab( + "howlite_brick", + "too_many_stones:howlite_brick", + {cracky = 2}, + {"tms_howlite_brick.png"}, + S("Howlite Brick Stair"), + S("Howlite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Howlite Brick Stair"), + S("Outer Howlite Brick Stair") +) + +stairs.register_stair_and_slab( + "howlite_cracked_brick", + "too_many_stones:howlite_cracked_brick", + {cracky = 2}, + {"tms_howlite_cracked_brick.png"}, + S("Cracked Howlite Brick Stair"), + S("Cracked Howlite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Howlite Brick Stair"), + S("Outer Cracked Howlite Brick Stair") +) + +stairs.register_stair_and_slab( + "howlite_block", + "too_many_stones:howlite_block", + {cracky = 2}, + {"tms_howlite_block.png"}, + S("Howlite Block Stair"), + S("Howlite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Howlite Block Stair"), + S("Outer Howlite Block Stair") +) + +stairs.register_stair_and_slab( + "howlite_cobble", + "too_many_stones:howlite_cobble", + {cracky = 2}, + {"tms_howlite_cobble.png"}, + S("Cobbled Howlite Stair"), + S("Cobbled Howlite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Howlite Stair"), + S("Outer Cobbled Howlite Stair") +) +-- Ilvaite +stairs.register_stair_and_slab( + "ilvaite", + "too_many_stones:ilvaite", + {cracky = 3}, + {"tms_ilvaite.png"}, + S("Ilvaite Stair"), + S("Ilvaite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Ilvaite Stair"), + S("Outer Ilvaite Stair") +) + +stairs.register_stair_and_slab( + "ilvaite_cobble", + "too_many_stones:ilvaite_cobble", + {cracky = 3}, + {"tms_ilvaite_cobble.png"}, + S("Cobbled Ilvaite Stair"), + S("Cobbled Ilvaite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Ilvaite Stair"), + S("Outer Cobbled Ilvaite Stair") +) + +stairs.register_stair_and_slab( + "ilvaite_brick", + "too_many_stones:ilvaite_brick", + {cracky = 2}, + {"tms_ilvaite_brick.png"}, + S("Ilvaite Brick Stair"), + S("Ilvaite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Ilvaite Brick Stair"), + S("Outer Ilvaite Brick Stair") +) + +stairs.register_stair_and_slab( + "ilvaite_cracked_brick", + "too_many_stones:ilvaite_cracked_brick", + {cracky = 2}, + {"tms_ilvaite_cracked_brick.png"}, + S("Cracked Ilvaite Brick Stair"), + S("Cracked Ilvaite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Ilvaite Brick Stair"), + S("Outer Cracked Ilvaite Brick Stair") +) + +stairs.register_stair_and_slab( + "ilvaite_block", + "too_many_stones:ilvaite_block", + {cracky = 2}, + {"tms_ilvaite_block.png"}, + S("Ilvaite Block Stair"), + S("Ilvaite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Ilvaite Block Stair"), + S("Outer Ilvaite Block Stair") +) +-- Jade +stairs.register_stair_and_slab( + "jade", + "too_many_stones:jade", + {cracky = 3}, + {"tms_jade.png"}, + S("Jade Stair"), + S("Jade Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Jade Stair"), + S("Outer Jade Stair") +) + +stairs.register_stair_and_slab( + "jade_cobble", + "too_many_stones:jade_cobble", + {cracky = 3}, + {"tms_jade_cobble.png"}, + S("Cobbled Jade Stair"), + S("Cobbled Jade Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Jade Stair"), + S("Outer Cobbled Jade Stair") +) + +stairs.register_stair_and_slab( + "jade_brick", + "too_many_stones:jade_brick", + {cracky = 2}, + {"tms_jade_brick.png"}, + S("Jade Brick Stair"), + S("Jade Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Jade Brick Stair"), + S("Outer Jade Brick Stair") +) + +stairs.register_stair_and_slab( + "jade_cracked_brick", + "too_many_stones:jade_cracked_brick", + {cracky = 2}, + {"tms_jade_cracked_brick.png"}, + S("Cracked Jade Brick Stair"), + S("Cracked Jade Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Jade Brick Stair"), + S("Outer Cracked Jade Brick Stair") +) + +stairs.register_stair_and_slab( + "jade_block", + "too_many_stones:jade_block", + {cracky = 2}, + {"tms_jade_block.png"}, + S("Jade Block Stair"), + S("Jade Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Jade Block Stair"), + S("Outer Jade Block Stair") +) +-- Red Jasper +stairs.register_stair_and_slab( + "jasper_red", + "too_many_stones:jasper_red", + {cracky = 3}, + {"tms_jasper_red.png"}, + S("Red Jasper Stair"), + S("Red Jasper Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Red Jasper Stair"), + S("Outer Red Jasper Stair") +) + +stairs.register_stair_and_slab( + "jasper_red_brick", + "too_many_stones:jasper_red_brick", + {cracky = 2}, + {"tms_jasper_red_brick.png"}, + S("Red Jasper Brick Stair"), + S("Red Jasper Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Red Jasper Brick Stair"), + S("Outer Red Jasper Brick Stair") +) + +stairs.register_stair_and_slab( + "jasper_red_cracked_brick", + "too_many_stones:jasper_red_cracked_brick", + {cracky = 2}, + {"tms_jasper_red_cracked_brick.png"}, + S("Cracked Red Jasper Brick Stair"), + S("Cracked Red Jasper Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Red Jasper Brick Stair"), + S("Outer Cracked Red Jasper Brick Stair") +) + +stairs.register_stair_and_slab( + "jasper_red_block", + "too_many_stones:jasper_red_block", + {cracky = 2}, + {"tms_jasper_red_block.png"}, + S("Red Jasper Block Stair"), + S("Red Jasper Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Red Jasper Block Stair"), + S("Outer Red Jasper Block Stair") +) + +stairs.register_stair_and_slab( + "jasper_red_cobble", + "too_many_stones:jasper_red_cobble", + {cracky = 2}, + {"tms_jasper_red_cobble.png"}, + S("Cobbled Red Jasper Stair"), + S("Cobbled Red Jasper Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Red Jasper Stair"), + S("Outer Cobbled Jasper Stair") +) +-- Kyanite +stairs.register_stair_and_slab( + "kyanite", + "too_many_stones:kyanite", + {cracky = 3}, + {"tms_kyanite.png"}, + S("Kyanite Stair"), + S("Kyanite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Kyanite Stair"), + S("Outer Kyanite Stair") +) + +stairs.register_stair_and_slab( + "kyanite_cobble", + "too_many_stones:kyanite_cobble", + {cracky = 3}, + {"tms_kyanite_cobble.png"}, + S("Cobbled Kyanite Stair"), + S("Cobbled Kyanite Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cobbled Kyanite Stair"), + S("Outer Cobbled Kyanite Stair") +) + +stairs.register_stair_and_slab( + "kyanite_brick", + "too_many_stones:kyanite_brick", + {cracky = 2}, + {"tms_kyanite_brick.png"}, + S("Kyanite Brick Stair"), + S("Kyanite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Kyanite Brick Stair"), + S("Outer Kyanite Brick Stair") +) + +stairs.register_stair_and_slab( + "kyanite_cracked_brick", + "too_many_stones:kyanite_cracked_brick", + {cracky = 2}, + {"tms_kyanite_cracked_brick.png"}, + S("Cracked Kyanite Brick Stair"), + S("Cracked Kyanite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Kyanite Brick Stair"), + S("Outer Cracked Kyanite Brick Stair") +) + +stairs.register_stair_and_slab( + "kyanite_block", + "too_many_stones:kyanite_block", + {cracky = 2}, + {"tms_kyanite_block.png"}, + S("Kyanite Block Stair"), + S("Kyanite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Kyanite Block Stair"), + S("Outer Kyanite Block Stair") +) +-- Lapis Lazuli +stairs.register_stair_and_slab( + "lapis_lazuli", + "too_many_stones:lapis_lazuli", + {cracky = 3}, + {"tms_lapis_lazuli.png"}, + S("Lapis Lazuli Stair"), + S("Lapis Lazuli Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Lapis Lazuli Stair"), + S("Outer Lapis Lazuli Stair") +) + +stairs.register_stair_and_slab( + "lapis_lazuli_brick", + "too_many_stones:lapis_lazuli_brick", + {cracky = 2}, + {"tms_lapis_lazuli_brick.png"}, + S("Lapis Lazuli Brick Stair"), + S("Lapis Lazuli Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Lapis Lazuli Brick Stair"), + S("Outer Lapis Lazuli Brick Stair") +) + +stairs.register_stair_and_slab( + "lapis_lazuli_cracked_brick", + "too_many_stones:lapis_lazuli_cracked_brick", + {cracky = 2}, + {"tms_lapis_lazuli_cracked_brick.png"}, + S("Cracked Lapis Lazuli Brick Stair"), + S("Cracked Lapis Lazuli Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Lapis Lazuli Brick Stair"), + S("Outer Cracked Lapis Lazuli Brick Stair") +) + +stairs.register_stair_and_slab( + "lapis_lazuli_block", + "too_many_stones:lapis_lazuli_block", + {cracky = 2}, + {"tms_lapis_lazuli_block.png"}, + S("Lapis Lazuli Block Stair"), + S("Lapis Lazuli Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Lapis Lazuli Block Stair"), + S("Outer Lapis Lazuli Block Stair") +) +-- Lepidolite +stairs.register_stair_and_slab( + "lepidolite", + "too_many_stones:lepidolite", + {cracky = 3}, + {"tms_lepidolite.png"}, + S("Lepidolite Stair"), + S("Lepidolite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Lepidolite Stair"), + S("Outer Lepidolite Stair") +) + +stairs.register_stair_and_slab( + "lepidolite_brick", + "too_many_stones:lepidolite_brick", + {cracky = 2}, + {"tms_lepidolite_brick.png"}, + S("Lepidolite Brick Stair"), + S("Lepidolite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Lepidolite Brick Stair"), + S("Outer Lepidolite Brick Stair") +) + +stairs.register_stair_and_slab( + "lepidolite_cracked_brick", + "too_many_stones:lepidolite_cracked_brick", + {cracky = 2}, + {"tms_lepidolite_cracked_brick.png"}, + S("Cracked Lepidolite Brick Stair"), + S("Cracked Lepidolite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Lepidolite Brick Stair"), + S("Outer Cracked Lepidolite Brick Stair") +) + +stairs.register_stair_and_slab( + "lepidolite_block", + "too_many_stones:lepidolite_block", + {cracky = 2}, + {"tms_lepidolite_block.png"}, + S("Lepidolite Block Stair"), + S("Lepidolite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Lepidolite Block Stair"), + S("Outer Lepidolite Block Stair") +) + +stairs.register_stair_and_slab( + "lepidolite_cobble", + "too_many_stones:lepidolite_cobble", + {cracky = 2}, + {"tms_lepidolite_cobble.png"}, + S("CobbledLepidolite Stair"), + S("Cobbled Lepidolite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Lepidolite Stair"), + S("Outer Cobbled Lepidolite Stair") +) +-- Blue Limestone +stairs.register_stair_and_slab( + "limestone_blue", + "too_many_stones:limestone_blue", + {cracky = 3}, + {"tms_limestone_blue.png"}, + S("Blue Limestone Stair"), + S("Blue Limestone Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Blue Limestone Stair"), + S("Outer Blue Limestone Stair") +) + +stairs.register_stair_and_slab( + "limestone_blue_cobble", + "too_many_stones:limestone_blue_cobble", + {cracky = 3}, + {"tms_limestone_blue_cobble.png"}, + S("Cobbled Blue Limestone Stair"), + S("Cobbled Blue Limestone Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Blue Limestone Stair"), + S("Outer Cobbled Blue Limestone Stair") +) + +stairs.register_stair_and_slab( + "limestone_blue_brick", + "too_many_stones:limestone_blue_brick", + {cracky = 2}, + {"tms_limestone_blue_brick.png"}, + S("Blue Limestone Brick Stair"), + S("Blue Limestone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Blue Limestone Brick Stair"), + S("Outer Blue Limestone Brick Stair") +) + +stairs.register_stair_and_slab( + "limestone_blue_cracked_brick", + "too_many_stones:limestone_blue_cracked_brick", + {cracky = 2}, + {"tms_limestone_blue_cracked_brick.png"}, + S("Cracked Blue Limestone Brick Stair"), + S("Cracked Blue Limestone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Blue Limestone Brick Stair"), + S("Outer Cracked Blue Limestone Brick Stair") +) + +stairs.register_stair_and_slab( + "limestone_blue_block", + "too_many_stones:limestone_blue_block", + {cracky = 2}, + {"tms_limestone_blue_block.png"}, + S("Blue Limestone Block Stair"), + S("Blue Limestone Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Blue Limestone Block Stair"), + S("Outer Blue Limestone Block Stair") +) +-- White Limestone +stairs.register_stair_and_slab( + "limestone_white", + "too_many_stones:limestone_white", + {cracky = 3}, + {"tms_limestone_white.png"}, + S("White Limestone Stair"), + S("White Limestone Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner White Limestone Stair"), + S("Outer White Limestone Stair") +) + +stairs.register_stair_and_slab( + "limestone_white_cobble", + "too_many_stones:limestone_white_cobble", + {cracky = 3}, + {"tms_limestone_white_cobble.png"}, + S("Cobbled White Limestone Stair"), + S("Cobbled White Limestone Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled White Limestone Stair"), + S("Outer Cobbled White Limestone Stair") +) + +stairs.register_stair_and_slab( + "limestone_white_brick", + "too_many_stones:limestone_white_brick", + {cracky = 2}, + {"tms_limestone_white_brick.png"}, + S("White Limestone Brick Stair"), + S("White Limestone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner White Limestone Brick Stair"), + S("Outer White Limestone Brick Stair") +) + +stairs.register_stair_and_slab( + "limestone_white_cracked_brick", + "too_many_stones:limestone_white_cracked_brick", + {cracky = 2}, + {"tms_limestone_white_cracked_brick.png"}, + S("Cracked White Limestone Brick Stair"), + S("Cracked White Limestone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked White Limestone Brick Stair"), + S("Outer Cracked White Limestone Brick Stair") +) + +stairs.register_stair_and_slab( + "limestone_white_block", + "too_many_stones:limestone_white_block", + {cracky = 2}, + {"tms_limestone_white_block.png"}, + S("White Limestone Block Stair"), + S("White Limestone Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner White Limestone Block Stair"), + S("Outer White Limestone Block Stair") +) +-- Marble +stairs.register_stair_and_slab( + "marble", + "too_many_stones:marble", + {cracky = 3}, + {"tms_marble.png"}, + S("Marble Stair"), + S("Marble Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Marble Stair"), + S("Outer Marble Stair") +) + +stairs.register_stair_and_slab( + "marble_cobble", + "too_many_stones:marble_cobble", + {cracky = 3}, + {"tms_marble_cobble.png"}, + S("Cobbled Marble Stair"), + S("Cobbled Marble Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Marble Stair"), + S("Outer Cobbled Marble Stair") +) + +stairs.register_stair_and_slab( + "marble_brick", + "too_many_stones:marble_brick", + {cracky = 2}, + {"tms_marble_brick.png"}, + S("Marble Brick Stair"), + S("Marble Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Marble Brick Stair"), + S("Outer Marble Brick Stair") +) + +stairs.register_stair_and_slab( + "marble_cracked_brick", + "too_many_stones:marble_cracked_brick", + {cracky = 2}, + {"tms_marble_cracked_brick.png"}, + S("Cracked Marble Brick Stair"), + S("Cracked Marble Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Marble Brick Stair"), + S("Outer Cracked Marble Brick Stair") +) + +stairs.register_stair_and_slab( + "marble_block", + "too_many_stones:marble_block", + {cracky = 2}, + {"tms_marble_block.png"}, + S("Marble Block Stair"), + S("Marble Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Marble Block Stair"), + S("Outer Marble Block Stair") +) +-- Moonstone +stairs.register_stair_and_slab( + "moonstone", + "too_many_stones:moonstone", + {cracky = 3}, + {"tms_moonstone.png"}, + S("Moonstone Stair"), + S("Moonstone Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Moonstone Stair"), + S("Outer Moonstone Stair") +) + +stairs.register_stair_and_slab( + "moonstone_brick", + "too_many_stones:moonstone_brick", + {cracky = 2}, + {"tms_moonstone_brick.png"}, + S("Moonstone Brick Stair"), + S("Moonstone Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Moonstone Brick Stair"), + S("Outer Moonstone Brick Stair") +) + +stairs.register_stair_and_slab( + "moonstone_cracked_brick", + "too_many_stones:moonstone_cracked_brick", + {cracky = 2}, + {"tms_moonstone_cracked_brick.png"}, + S("Cracked Moonstone Brick Stair"), + S("Cracked Moonstone Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Moonstone Brick Stair"), + S("Outer Cracked Moonstone Brick Stair") +) + +stairs.register_stair_and_slab( + "moonstone_block", + "too_many_stones:moonstone_block", + {cracky = 2}, + {"tms_moonstone_block.png"}, + S("Moonstone Block Stair"), + S("Moonstone Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Moonstone Block Stair"), + S("Outer Moonstone Block Stair") +) +-- Morion Quartz +stairs.register_stair_and_slab( + "morion_quartz", + "too_many_stones:morion_quartz", + {cracky = 3}, + {"tms_morion_quartz.png"}, + S("Morion Quartz Stair"), + S("Morion Quartz Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Morion Quartz Stair"), + S("Outer Morion Quartz Stair") +) + +stairs.register_stair_and_slab( + "morion_quartz_brick", + "too_many_stones:morion_quartz_brick", + {cracky = 2}, + {"tms_morion_quartz_brick.png"}, + S("Morion Quartz Brick Stair"), + S("Morion Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Morion Quartz Brick Stair"), + S("Outer Morion Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "morion_quartz_cracked_brick", + "too_many_stones:morion_quartz_cracked_brick", + {cracky = 2}, + {"tms_morion_quartz_cracked_brick.png"}, + S("Cracked Morion Quartz Brick Stair"), + S("Cracked Morion Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Morion Quartz Brick Stair"), + S("Outer Cracked Morion Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "morion_quartz_block", + "too_many_stones:morion_quartz_block", + {cracky = 2}, + {"tms_morion_quartz_block.png"}, + S("Morion Quartz Block Stair"), + S("Morion Quartz Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Morion Quartz Block Stair"), + S("Outer Morion Quartz Block Stair") +) +-- Mudstone +stairs.register_stair_and_slab( + "mudstone", + "too_many_stones:mudstone", + {cracky = 3}, + {"tms_mudstone.png"}, + S("Mudstone Stair"), + S("Mudstone Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Mudstone Stair"), + S("Outer Mudstone Stair") +) + +stairs.register_stair_and_slab( + "mudstone_cobble", + "too_many_stones:mudstone_cobble", + {cracky = 3}, + {"tms_mudstone_cobble.png"}, + S("Cobbled Mudstone Stair"), + S("Cobbled Mudstone Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Mudstone Stair"), + S("Outer Cobbled Mudstone Stair") +) + +stairs.register_stair_and_slab( + "mudstone_brick", + "too_many_stones:mudstone_brick", + {cracky = 2}, + {"tms_mudstone_brick.png"}, + S("Mudstone Brick Stair"), + S("Mudstone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Mudstone Brick Stair"), + S("Outer Mudstone Brick Stair") +) + +stairs.register_stair_and_slab( + "mudstone_cracked_brick", + "too_many_stones:mudstone_cracked_brick", + {cracky = 2}, + {"tms_mudstone_cracked_brick.png"}, + S("Cracked Mudstone Brick Stair"), + S("Cracked Mudstone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Mudstone Brick Stair"), + S("Outer Cracked Mudstone Brick Stair") +) + +stairs.register_stair_and_slab( + "mudstone_block", + "too_many_stones:mudstone_block", + {cracky = 2}, + {"tms_mudstone_block.png"}, + S("Mudstone Block Stair"), + S("Mudstone Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Mudstone Block Stair"), + S("Outer Mudstone Block Stair") +) +-- Prasiolite +stairs.register_stair_and_slab( + "prasiolite", + "too_many_stones:prasiolite", + {cracky = 3}, + {"tms_prasiolite.png"}, + S("Prasiolite Stair"), + S("Prasiolite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Prasiolite Stair"), + S("Outer Prasiolite Stair") +) + +stairs.register_stair_and_slab( + "prasiolite_brick", + "too_many_stones:prasiolite_brick", + {cracky = 2}, + {"tms_prasiolite_brick.png"}, + S("Prasiolite Brick Stair"), + S("Prasiolite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Prasiolite Brick Stair"), + S("Outer Prasiolite Brick Stair") +) + +stairs.register_stair_and_slab( + "prasiolite_cracked_brick", + "too_many_stones:prasiolite_cracked_brick", + {cracky = 2}, + {"tms_prasiolite_cracked_brick.png"}, + S("Cracked Prasiolite Brick Stair"), + S("Cracked Prasiolite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Prasiolite Brick Stair"), + S("Outer Cracked Prasiolite Brick Stair") +) + +stairs.register_stair_and_slab( + "prasiolite_block", + "too_many_stones:prasiolite_block", + {cracky = 2}, + {"tms_prasiolite_block.png"}, + S("Prasiolite Block Stair"), + S("Prasiolite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Prasiolite Block Stair"), + S("Outer Prasiolite Block Stair") +) +-- Pumice +stairs.register_stair_and_slab( + "pumice", + "too_many_stones:pumice", + {cracky = 3}, + {"tms_pumice.png"}, + S("Pumice Stair"), + S("Pumice Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Pumice Stair"), + S("Outer Pumice Stair") +) + +stairs.register_stair_and_slab( + "pumice_brick", + "too_many_stones:pumice_brick", + {cracky = 2}, + {"tms_pumice_brick.png"}, + S("Pumice Brick Stair"), + S("Pumice Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Pumice Brick Stair"), + S("Outer Pumice Brick Stair") +) + +stairs.register_stair_and_slab( + "pumice_cracked_brick", + "too_many_stones:pumice_cracked_brick", + {cracky = 2}, + {"tms_pumice_cracked_brick.png"}, + S("Cracked Pumice Brick Stair"), + S("Cracked Pumice Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Pumice Brick Stair"), + S("Outer Cracked Pumice Brick Stair") +) + +stairs.register_stair_and_slab( + "pumice_block", + "too_many_stones:pumice_block", + {cracky = 2}, + {"tms_pumice_block.png"}, + S("Pumice Block Stair"), + S("Pumice Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Pumice Block Stair"), + S("Outer Pumice Block Stair") +) +-- Pyrite +stairs.register_stair_and_slab( + "pyrite", + "too_many_stones:pyrite", + {cracky = 3}, + {"tms_pyrite.png"}, + S("Pyrite Stair"), + S("Pyrite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Pyrite Stair"), + S("Outer Pyrite Stair") +) + +stairs.register_stair_and_slab( + "pyrite_brick", + "too_many_stones:pyrite_brick", + {cracky = 2}, + {"tms_pyrite_brick.png"}, + S("Pyrite Brick Stair"), + S("Pyrite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Pyrite Brick Stair"), + S("Outer Pyrite Brick Stair") +) + +stairs.register_stair_and_slab( + "pyrite_cracked_brick", + "too_many_stones:pyrite_cracked_brick", + {cracky = 2}, + {"tms_pyrite_cracked_brick.png"}, + S("Cracked Pyrite Brick Stair"), + S("Cracked Pyrite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Pyrite Brick Stair"), + S("Outer Cracked Pyrite Brick Stair") +) + +stairs.register_stair_and_slab( + "pyrite_block", + "too_many_stones:pyrite_block", + {cracky = 2}, + {"tms_pyrite_block.png"}, + S("Pyrite Block Stair"), + S("Pyrite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Pyrite Block Stair"), + S("Outer Pyrite Block Stair") +) +-- Quartz +stairs.register_stair_and_slab( + "quartz", + "too_many_stones:quartz", + {cracky = 3}, + {"tms_quartz.png"}, + S("Quartz Stair"), + S("Quartz Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Quartz Stair"), + S("Outer Quartz Stair") +) + +stairs.register_stair_and_slab( + "quartz_brick", + "too_many_stones:quartz_brick", + {cracky = 2}, + {"tms_quartz_brick.png"}, + S("Quartz Brick Stair"), + S("Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Quartz Brick Stair"), + S("Outer Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "quartz_cracked_brick", + "too_many_stones:quartz_cracked_brick", + {cracky = 2}, + {"tms_quartz_cracked_brick.png"}, + S("Cracked Quartz Brick Stair"), + S("Cracked Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Quartz Brick Stair"), + S("Outer Cracked Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "quartz_block", + "too_many_stones:quartz_block", + {cracky = 2}, + {"tms_quartz_block.png"}, + S("Quartz Block Stair"), + S("Quartz Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Quartz Block Stair"), + S("Outer Quartz Block Stair") +) +-- Rhodonite +stairs.register_stair_and_slab( + "rhodonite", + "too_many_stones:rhodonite", + {cracky = 3}, + {"tms_rhodonite.png"}, + S("Rhodonite Stair"), + S("Rhodonite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Rhodonite Stair"), + S("Outer Rhodonite Stair") +) + +stairs.register_stair_and_slab( + "rhodonite_brick", + "too_many_stones:rhodonite_brick", + {cracky = 2}, + {"tms_rhodonite_brick.png"}, + S("Rhodonite Brick Stair"), + S("Rhodonite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Rhodonite Brick Stair"), + S("Outer Rhodonite Brick Stair") +) + +stairs.register_stair_and_slab( + "rhodonite_cracked_brick", + "too_many_stones:rhodonite_cracked_brick", + {cracky = 2}, + {"tms_rhodonite_cracked_brick.png"}, + S("Cracked Rhodonite Brick Stair"), + S("Cracked Rhodonite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Rhodonite Brick Stair"), + S("Outer Cracked Rhodonite Brick Stair") +) + +stairs.register_stair_and_slab( + "rhodonite_block", + "too_many_stones:rhodonite_block", + {cracky = 2}, + {"tms_rhodonite_block.png"}, + S("Rhodonite Block Stair"), + S("Rhodonite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Rhodonite Block Stair"), + S("Outer Rhodonite Block Stair") +) + +stairs.register_stair_and_slab( + "rhodonite_cobble", + "too_many_stones:rhodonite_cobble", + {cracky = 2}, + {"tms_rhodonite_cobble.png"}, + S("Cobbled Rhodonite Stair"), + S("Cobbled Rhodonite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Rhodonite Stair"), + S("Outer Cobbled Rhodonite Stair") +) +-- Rose Quartz +stairs.register_stair_and_slab( + "rose_quartz", + "too_many_stones:rose_quartz", + {cracky = 3}, + {"tms_rose_quartz.png"}, + S("Rose Quartz Stair"), + S("Rose Quartz Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Rose Quartz Stair"), + S("Outer Rose Quartz Stair") +) + +stairs.register_stair_and_slab( + "rose_quartz_brick", + "too_many_stones:rose_quartz_brick", + {cracky = 2}, + {"tms_rose_quartz_brick.png"}, + S("Rose Quartz Brick Stair"), + S("Rose Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Rose Quartz Brick Stair"), + S("Outer Rose Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "rose_quartz_cracked_brick", + "too_many_stones:rose_quartz_cracked_brick", + {cracky = 2}, + {"tms_rose_quartz_cracked_brick.png"}, + S("Cracked Rose Quartz Brick Stair"), + S("Cracked Rose Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Rose Quartz Brick Stair"), + S("Outer Cracked Rose Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "rose_quartz_block", + "too_many_stones:rose_quartz_block", + {cracky = 2}, + {"tms_rose_quartz_block.png"}, + S("Rose Quartz Block Stair"), + S("Rose Quartz Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Rose Quartz Block Stair"), + S("Outer Rose Quartz Block Stair") +) +-- Scoria +stairs.register_stair_and_slab( + "scoria", + "too_many_stones:scoria", + {cracky = 3}, + {"tms_scoria.png"}, + S("Scoria Stair"), + S("Scoria Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Scoria Stair"), + S("Outer Scoria Stair") +) + +stairs.register_stair_and_slab( + "scoria_cobble", + "too_many_stones:scoria_cobble", + {cracky = 3}, + {"tms_scoria_cobble.png"}, + S("Cobbled Scoria Stair"), + S("Cobbled Scoria Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Scoria Stair"), + S("Outer Cobbled Scoria Stair") +) + +stairs.register_stair_and_slab( + "scoria_brick", + "too_many_stones:scoria_brick", + {cracky = 2}, + {"tms_scoria_brick.png"}, + S("Scoria Brick Stair"), + S("Scoria Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Scoria Brick Stair"), + S("Outer Scoria Brick Stair") +) + +stairs.register_stair_and_slab( + "scoria_cracked_brick", + "too_many_stones:scoria_cracked_brick", + {cracky = 2}, + {"tms_scoria_cracked_brick.png"}, + S("Cracked Scoria Brick Stair"), + S("Cracked Scoria Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Scoria Brick Stair"), + S("Outer Cracked Scoria Brick Stair") +) + +stairs.register_stair_and_slab( + "scoria_block", + "too_many_stones:scoria_block", + {cracky = 2}, + {"tms_scoria_block.png"}, + S("Scoria Block Stair"), + S("Scoria Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Scoria Block Stair"), + S("Outer Scoria Block Stair") +) +-- Serpentine +stairs.register_stair_and_slab( + "serpentine", + "too_many_stones:serpentine", + {cracky = 3}, + {"tms_serpentine.png"}, + S("Serpentine Stair"), + S("Serpentine Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Serpentine Stair"), + S("Outer Serpentine Stair") +) + +stairs.register_stair_and_slab( + "serpentine_cobble", + "too_many_stones:serpentine_cobble", + {cracky = 3}, + {"tms_serpentine_cobble.png"}, + S("Cobbled Serpentine Stair"), + S("Cobbled Serpentine Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Serpentine Stair"), + S("Outer Cobbled Serpentine Stair") +) + +stairs.register_stair_and_slab( + "serpentine_brick", + "too_many_stones:serpentine_brick", + {cracky = 2}, + {"tms_serpentine_brick.png"}, + S("Serpentine Brick Stair"), + S("Serpentine Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Serpentine Brick Stair"), + S("Outer Serpentine Brick Stair") +) + +stairs.register_stair_and_slab( + "serpentine_cracked_brick", + "too_many_stones:serpentine_cracked_brick", + {cracky = 2}, + {"tms_serpentine_cracked_brick.png"}, + S("Cracked Serpentine Brick Stair"), + S("Cracked Serpentine Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Serpentine Brick Stair"), + S("Outer Cracked Serpentine Brick Stair") +) + +stairs.register_stair_and_slab( + "serpentine_block", + "too_many_stones:serpentine_block", + {cracky = 2}, + {"tms_serpentine_block.png"}, + S("Serpentine Block Stair"), + S("Serpentine Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Serpentine Block Stair"), + S("Outer Serpentine Block Stair") +) +-- Shale +stairs.register_stair_and_slab( + "shale", + "too_many_stones:shale", + {cracky = 3}, + {"tms_shale.png"}, + S("Shale Stair"), + S("Shale Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Shale Stair"), + S("Outer Shale Stair") +) + +stairs.register_stair_and_slab( + "shale_cobble", + "too_many_stones:shale_cobble", + {cracky = 3}, + {"tms_shale_cobble.png"}, + S("Cobbled Shale Stair"), + S("Cobbled Shale Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Shale Stair"), + S("Outer Cobbled Shale Stair") +) + +stairs.register_stair_and_slab( + "shale_brick", + "too_many_stones:shale_brick", + {cracky = 2}, + {"tms_shale_brick.png"}, + S("Shale Brick Stair"), + S("Shale Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Shale Brick Stair"), + S("Outer Shale Brick Stair") +) + +stairs.register_stair_and_slab( + "shale_cracked_brick", + "too_many_stones:shale_cracked_brick", + {cracky = 2}, + {"tms_shale_cracked_brick.png"}, + S("Cracked Shale Brick Stair"), + S("Cracked Shale Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Shale Brick Stair"), + S("Outer Cracked Shale Brick Stair") +) + +stairs.register_stair_and_slab( + "shale_block", + "too_many_stones:shale_block", + {cracky = 2}, + {"tms_shale_block.png"}, + S("Shale Block Stair"), + S("Shale Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Shale Block Stair"), + S("Outer Shale Block Stair") +) +-- Slate +stairs.register_stair_and_slab( + "slate", + "too_many_stones:slate", + {cracky = 3}, + {"tms_slate.png"}, + S("Slate Stair"), + S("Slate Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Slate Stair"), + S("Outer Slate Stair") +) + +stairs.register_stair_and_slab( + "slate_cobble", + "too_many_stones:slate_cobble", + {cracky = 3}, + {"tms_slate_cobble.png"}, + S("Cobbled Slate Stair"), + S("Cobbled Slate Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Slate Stair"), + S("Outer Cobbled Slate Stair") +) + +stairs.register_stair_and_slab( + "slate_brick", + "too_many_stones:slate_brick", + {cracky = 2}, + {"tms_slate_brick.png"}, + S("Slate Brick Stair"), + S("Slate Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Slate Brick Stair"), + S("Outer Slate Brick Stair") +) + +stairs.register_stair_and_slab( + "slate_cracked_brick", + "too_many_stones:slate_cracked_brick", + {cracky = 2}, + {"tms_slate_cracked_brick.png"}, + S("Cracked Slate Brick Stair"), + S("Cracked Slate Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Slate Brick Stair"), + S("Outer Cracked Slate Brick Stair") +) + +stairs.register_stair_and_slab( + "slate_block", + "too_many_stones:slate_block", + {cracky = 2}, + {"tms_slate_block.png"}, + S("Slate Block Stair"), + S("Slate Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Slate Block Stair"), + S("Outer Slate Block Stair") +) + +stairs.register_stair_and_slab( + "slate_tile", + "too_many_stones:slate_tile", + {cracky = 2}, + {"tms_slate_tile.png"}, + S("Slate Tile Stair"), + S("Slate Tile Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Slate Tile Stair"), + S("Outer Slate Tile Stair") +) +-- Smokey Quartz +stairs.register_stair_and_slab( + "smokey_quartz", + "too_many_stones:smokey_quartz", + {cracky = 3}, + {"tms_smokey_quartz.png"}, + S("Smokey Quartz Stair"), + S("Smokey Quartz Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Smokey Quartz Stair"), + S("Outer Smokey Quartz Stair") +) + +stairs.register_stair_and_slab( + "smokey_quartz_brick", + "too_many_stones:smokey_quartz_brick", + {cracky = 2}, + {"tms_smokey_quartz_brick.png"}, + S("Smokey Quartz Brick Stair"), + S("Smokey Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Smokey Quartz Brick Stair"), + S("Outer Smokey Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "smokey_quartz_cracked_brick", + "too_many_stones:smokey_quartz_cracked_brick", + {cracky = 2}, + {"tms_smokey_quartz_cracked_brick.png"}, + S("Cracked Smokey Quartz Brick Stair"), + S("Cracked Smokey Quartz Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Smokey Quartz Brick Stair"), + S("Outer Cracked Smokey Quartz Brick Stair") +) + +stairs.register_stair_and_slab( + "smokey_quartz_block", + "too_many_stones:smokey_quartz_block", + {cracky = 2}, + {"tms_smokey_quartz_block.png"}, + S("Smokey Quartz Block Stair"), + S("Smokey Quartz Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Smokey Quartz Block Stair"), + S("Outer Smokey Quartz Block Stair") +) +-- Soapstone +stairs.register_stair_and_slab( + "soapstone", + "too_many_stones:soapstone", + {cracky = 3}, + {"tms_soapstone.png"}, + S("Soapstone Stair"), + S("Soapstone Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Soapstone Stair"), + S("Outer Soapstone Stair") +) + +stairs.register_stair_and_slab( + "soapstone_brick", + "too_many_stones:soapstone_brick", + {cracky = 2}, + {"tms_soapstone_brick.png"}, + S("Soapstone Brick Stair"), + S("Soapstone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Soapstone Brick Stair"), + S("Outer Soapstone Brick Stair") +) + +stairs.register_stair_and_slab( + "soapstone_cracked_brick", + "too_many_stones:soapstone_cracked_brick", + {cracky = 2}, + {"tms_soapstone_cracked_brick.png"}, + S("Cracked Soapstone Brick Stair"), + S("Cracked Soapstone Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Soapstone Brick Stair"), + S("Outer Cracked Soapstone Brick Stair") +) + +stairs.register_stair_and_slab( + "soapstone_block", + "too_many_stones:soapstone_block", + {cracky = 2}, + {"tms_soapstone_block.png"}, + S("Soapstone Block Stair"), + S("Soapstone Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Soapstone Block Stair"), + S("Outer Soapstone Block Stair") +) +-- Sodalite +stairs.register_stair_and_slab( + "sodalite", + "too_many_stones:sodalite", + {cracky = 3}, + {"tms_sodalite.png"}, + S("Sodalite Stair"), + S("Sodalite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Sodalite Stair"), + S("Outer Sodalite Stair") +) + +stairs.register_stair_and_slab( + "sodalite_cobble", + "too_many_stones:sodalite_cobble", + {cracky = 3}, + {"tms_sodalite_cobble.png"}, + S("Cobbled Sodalite Stair"), + S("Cobbled Sodalite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Sodalite Stair"), + S("Outer Cobbled Sodalite Stair") +) + +stairs.register_stair_and_slab( + "sodalite_brick", + "too_many_stones:sodalite_brick", + {cracky = 2}, + {"tms_sodalite_brick.png"}, + S("Sodalite Brick Stair"), + S("Sodalite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Sodalite Brick Stair"), + S("Outer Sodalite Brick Stair") +) + +stairs.register_stair_and_slab( + "sodalite_cracked_brick", + "too_many_stones:sodalite_cracked_brick", + {cracky = 2}, + {"tms_sodalite_cracked_brick.png"}, + S("Cracked Sodalite Brick Stair"), + S("Cracked Sodalite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Sodalite Brick Stair"), + S("Outer Cracked Sodalite Brick Stair") +) + +stairs.register_stair_and_slab( + "sodalite_block", + "too_many_stones:sodalite_block", + {cracky = 2}, + {"tms_sodalite_block.png"}, + S("Sodalite Block Stair"), + S("Sodalite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Sodalite Block Stair"), + S("Outer Sodalite Block Stair") +) +-- Sugilite +stairs.register_stair_and_slab( + "sugilite", + "too_many_stones:sugilite", + {cracky = 3}, + {"tms_sugilite.png"}, + S("Sugilite Stair"), + S("Sugilite Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Sugilite Stair"), + S("Outer Sugilite Stair") +) + +stairs.register_stair_and_slab( + "sugilite_cobble", + "too_many_stones:sugilite_cobble", + {cracky = 3}, + {"tms_sugilite_cobble.png"}, + S("Cobbled Sugilite Stair"), + S("Cobbled Sugilite Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Sugilite Stair"), + S("Outer Cobbled Sugilite Stair") +) + +stairs.register_stair_and_slab( + "sugilite_brick", + "too_many_stones:sugilite_brick", + {cracky = 2}, + {"tms_sugilite_brick.png"}, + S("Sugilite Brick Stair"), + S("Sugilite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Sugilite Brick Stair"), + S("Outer Sugilite Brick Stair") +) + +stairs.register_stair_and_slab( + "sugilite_cracked_brick", + "too_many_stones:sugilite_cracked_brick", + {cracky = 2}, + {"tms_sugilite_cracked_brick.png"}, + S("Cracked Sugilite Brick Stair"), + S("Cracked Sugilite Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Sugilite Brick Stair"), + S("Outer Cracked Sugilite Brick Stair") +) + +stairs.register_stair_and_slab( + "sugilite_block", + "too_many_stones:sugilite_block", + {cracky = 2}, + {"tms_sugilite_block.png"}, + S("Sugilite Block Stair"), + S("Sugilite Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Sugilite Block Stair"), + S("Outer Sugilite Block Stair") +) +-- Green Tourmaline +stairs.register_stair_and_slab( + "tourmaline_green", + "too_many_stones:tourmaline_green", + {cracky = 3}, + {"tms_tourmaline_green.png"}, + S("Green Tourmaline Stair"), + S("Green Tourmaline Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Green Tourmaline Stair"), + S("Outer Green Tourmaline Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_green_brick", + "too_many_stones:tourmaline_green_brick", + {cracky = 2}, + {"tms_tourmaline_green_brick.png"}, + S("Green Tourmaline Brick Stair"), + S("Green Tourmaline Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Green Tourmaline Brick Stair"), + S("Outer Green Tourmaline Brick Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_green_cracked_brick", + "too_many_stones:tourmaline_green_cracked_brick", + {cracky = 2}, + {"tms_tourmaline_green_cracked_brick.png"}, + S("Cracked Green Tourmaline Brick Stair"), + S("Cracked Green Tourmaline Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Green Tourmaline Brick Stair"), + S("Outer Cracked Green Tourmaline Brick Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_green_block", + "too_many_stones:tourmaline_green_block", + {cracky = 2}, + {"tms_tourmaline_green_block.png"}, + S("Green Tourmaline Block Stair"), + S("Green Tourmaline Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Green Tourmaline Block Stair"), + S("Outer Green Tourmaline Block Stair") +) +-- Paraiba Tourmaline +stairs.register_stair_and_slab( + "tourmaline_paraiba", + "too_many_stones:tourmaline_paraiba", + {cracky = 3}, + {"tms_tourmaline_paraiba.png"}, + S("Paraiba Tourmaline Stair"), + S("Paraiba Tourmaline Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Paraiba Tourmaline Stair"), + S("Outer Paraiba Tourmaline Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_paraiba_brick", + "too_many_stones:tourmaline_paraiba_brick", + {cracky = 2}, + {"tms_tourmaline_paraiba_brick.png"}, + S("Paraiba Tourmaline Brick Stair"), + S("Paraiba Tourmaline Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Paraiba Tourmaline Brick Stair"), + S("Outer Paraiba Tourmaline Brick Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_paraiba_cracked_brick", + "too_many_stones:tourmaline_paraiba_cracked_brick", + {cracky = 2}, + {"tms_tourmaline_paraiba_cracked_brick.png"}, + S("Cracked Paraiba Tourmaline Brick Stair"), + S("Cracked Paraiba Tourmaline Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Paraiba Tourmaline Brick Stair"), + S("Outer Cracked Paraiba Tourmaline Brick Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_paraiba_block", + "too_many_stones:tourmaline_paraiba_block", + {cracky = 2}, + {"tms_tourmaline_paraiba_block.png"}, + S("Paraiba Tourmaline Block Stair"), + S("Paraiba Tourmaline Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Paraiba Tourmaline Block Stair"), + S("Outer Paraiba Tourmaline Block Stair") +) +-- Pink Tourmaline +stairs.register_stair_and_slab( + "tourmaline_pink", + "too_many_stones:tourmaline_pink", + {cracky = 3}, + {"tms_tourmaline_pink.png"}, + S("Pink Tourmaline Stair"), + S("Pink Tourmaline Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Pink Tourmaline Stair"), + S("Outer Pink Tourmaline Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_pink_brick", + "too_many_stones:tourmaline_pink_brick", + {cracky = 2}, + {"tms_tourmaline_pink_brick.png"}, + S("Pink Tourmaline Brick Stair"), + S("Pink Tourmaline Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Pink Tourmaline Brick Stair"), + S("Outer Pink Tourmaline Brick Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_pink_cracked_brick", + "too_many_stones:tourmaline_pink_cracked_brick", + {cracky = 2}, + {"tms_tourmaline_pink_cracked_brick.png"}, + S("Cracked Pink Tourmaline Brick Stair"), + S("Cracked Pink Tourmaline Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Pink Tourmaline Brick Stair"), + S("Outer Cracked Pink Tourmaline Brick Stair") +) + +stairs.register_stair_and_slab( + "tourmaline_pink_block", + "too_many_stones:tourmaline_pink_block", + {cracky = 2}, + {"tms_tourmaline_pink_block.png"}, + S("Pink Tourmaline Block Stair"), + S("Pink Tourmaline Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Pink Tourmaline Block Stair"), + S("Outer Pink Tourmaline Block Stair") +) +-- Travertine +stairs.register_stair_and_slab( + "travertine", + "too_many_stones:travertine", + {cracky = 3}, + {"tms_travertine.png"}, + S("Travertine Stair"), + S("Travertine Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Tarvertine Stair"), + S("Outer Tarvertine Stair") +) + +stairs.register_stair_and_slab( + "travertine_cobble", + "too_many_stones:travertine_cobble", + {cracky = 3}, + {"tms_travertine_cobble.png"}, + S("Cobbled Travertine Stair"), + S("Cobbled Travertine Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Tarvertine Stair"), + S("Outer Cobbled Tarvertine Stair") +) + +stairs.register_stair_and_slab( + "travertine_brick", + "too_many_stones:travertine_brick", + {cracky = 2}, + {"tms_travertine_brick.png"}, + S("Travertine Brick Stair"), + S("Travertine Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Tarvertine Brick Stair"), + S("Outer Tarvertine Brick Stair") +) + +stairs.register_stair_and_slab( + "travertine_cracked_brick", + "too_many_stones:travertine_cracked_brick", + {cracky = 2}, + {"tms_travertine_cracked_brick.png"}, + S("Cracked Travertine Brick Stair"), + S("Cracked Travertine Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Tarvertine Brick Stair"), + S("Outer Cracked Tarvertine Brick Stair") +) + +stairs.register_stair_and_slab( + "travertine_block", + "too_many_stones:travertine_block", + {cracky = 2}, + {"tms_travertine_block.png"}, + S("Travertine Block Stair"), + S("Travertine Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Tarvertine Block Stair"), + S("Outer Tarvertine Block Stair") +) +-- Yellow Travertine +stairs.register_stair_and_slab( + "travertine_yellow", + "too_many_stones:travertine_yellow", + {cracky = 3}, + {"tms_travertine_yellow.png"}, + S("Yellow Travertine Stair"), + S("Yellow Travertine Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Yellow Tarvertine Stair"), + S("Outer Yellow Tarvertine Stair") +) + +stairs.register_stair_and_slab( + "travertine_yellow_cobble", + "too_many_stones:travertine_yellow_cobble", + {cracky = 3}, + {"tms_travertine_yellow_cobble.png"}, + S("Cobbled Yellow Travertine Stair"), + S("Cobbled Yellow Travertine Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Yellow Tarvertine Stair"), + S("Outer Cobbled Yellow Tarvertine Stair") +) + +stairs.register_stair_and_slab( + "travertine_yellow_brick", + "too_many_stones:travertine_yellow_brick", + {cracky = 2}, + {"tms_travertine_yellow_brick.png"}, + S("Yellow Travertine Brick Stair"), + S("Yellow Travertine Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Yellow Tarvertine Brick Stair"), + S("Outer Yellow Tarvertine Brick Stair") +) + +stairs.register_stair_and_slab( + "travertine_yellow_cracked_brick", + "too_many_stones:travertine_yellow_cracked_brick", + {cracky = 2}, + {"tms_travertine_yellow_cracked_brick.png"}, + S("Cracked Yellow Travertine Brick Stair"), + S("Cracked Yellow Travertine Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Yellow Tarvertine Brick Stair"), + S("Outer Cracked Yellow Tarvertine Brick Stair") +) + +stairs.register_stair_and_slab( + "travertine_yellow_block", + "too_many_stones:travertine_yellow_block", + {cracky = 2}, + {"tms_travertine_yellow_block.png"}, + S("Yellow Travertine Block Stair"), + S("Yellow Travertine Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Yellow Tarvertine Block Stair"), + S("Outer Yellow Tarvertine Block Stair") +) +-- Beige Tuff +stairs.register_stair_and_slab( + "tuff_beige", + "too_many_stones:tuff_beige", + {cracky = 3}, + {"tms_tuff_beige.png"}, + S("Beige Tuff Stair"), + S("Beige Tuff Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Beige Tuff Stair"), + S("Outer Beige Tuff Stair") +) + +stairs.register_stair_and_slab( + "tuff_beige_brick", + "too_many_stones:tuff_beige_brick", + {cracky = 2}, + {"tms_tuff_beige_brick.png"}, + S("Beige Tuff Brick Stair"), + S("Beige Tuff Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Beige Tuff Brick Stair"), + S("Outer Beige Tuff Brick Stair") +) + +stairs.register_stair_and_slab( + "tuff_beige_cracked_brick", + "too_many_stones:tuff_beige_cracked_brick", + {cracky = 2}, + {"tms_tuff_beige_cracked_brick.png"}, + S("Cracked Beige Tuff Brick Stair"), + S("Cracked Beige Tuff Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Beige Tuff Brick Stair"), + S("Outer Cracked Beige Tuff Brick Stair") +) + +stairs.register_stair_and_slab( + "tuff_beige_block", + "too_many_stones:tuff_beige_block", + {cracky = 2}, + {"tms_tuff_beige_block.png"}, + S("Beige Tuff Block Stair"), + S("Beige Tuff Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Beige Tuff Block Stair"), + S("Outer Beige Tuff Block Stair") +) + +stairs.register_stair_and_slab( + "tuff_beige_cobble", + "too_many_stones:tuff_beige_cobble", + {cracky = 2}, + {"tms_tuff_beige_cobble.png"}, + S("Cobbled Beige Tuff Stair"), + S("Cobbled Beige Tuff Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Beige Tuff Stair"), + S("Outer Cobbled Beige Tuff Stair") +) +-- Grey Tuff +stairs.register_stair_and_slab( + "tuff_grey", + "too_many_stones:tuff_grey", + {cracky = 3}, + {"tms_tuff_grey.png"}, + S("Grey Tuff Stair"), + S("Grey Tuff Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Grey Tuff Stair"), + S("Outer Grey Tuff Stair") +) + +stairs.register_stair_and_slab( + "tuff_grey_brick", + "too_many_stones:tuff_grey_brick", + {cracky = 2}, + {"tms_tuff_grey_brick.png"}, + S("Grey Tuff Brick Stair"), + S("Grey Tuff Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Grey Tuff Brick Stair"), + S("Outer Grey Tuff Brick Stair") +) + +stairs.register_stair_and_slab( + "tuff_grey_cracked_brick", + "too_many_stones:tuff_grey_cracked_brick", + {cracky = 2}, + {"tms_tuff_grey_cracked_brick.png"}, + S("Cracked Grey Tuff Brick Stair"), + S("Cracked Grey Tuff Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Grey Tuff Brick Stair"), + S("Outer Cracked Grey Tuff Brick Stair") +) + +stairs.register_stair_and_slab( + "tuff_grey_block", + "too_many_stones:tuff_grey_block", + {cracky = 2}, + {"tms_tuff_grey_block.png"}, + S("Grey Tuff Block Stair"), + S("Grey Tuff Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Grey Tuff Block Stair"), + S("Outer Grey Tuff Block Stair") +) + +stairs.register_stair_and_slab( + "tuff_grey_cobble", + "too_many_stones:tuff_grey_cobble", + {cracky = 2}, + {"tms_tuff_grey_cobble.png"}, + S("Cobbled Grey Tuff Stair"), + S("Cobbled Grey Tuff Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Grey Tuff Stair"), + S("Outer Cobbled Grey Tuff Stair") +) +-- Red Tuff +stairs.register_stair_and_slab( + "tuff_red", + "too_many_stones:tuff_red", + {cracky = 3}, + {"tms_tuff_red.png"}, + S("Red Tuff Stair"), + S("Red Tuff Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Red Tuff Stair"), + S("Outer Red Tuff Stair") +) + +stairs.register_stair_and_slab( + "tuff_red_brick", + "too_many_stones:tuff_red_brick", + {cracky = 2}, + {"tms_tuff_red_brick.png"}, + S("Red Tuff Brick Stair"), + S("Red Tuff Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Red Tuff Brick Stair"), + S("Outer Red Tuff Brick Stair") +) + +stairs.register_stair_and_slab( + "tuff_red_cracked_brick", + "too_many_stones:tuff_red_cracked_brick", + {cracky = 2}, + {"tms_tuff_red_cracked_brick.png"}, + S("Cracked Red Tuff Brick Stair"), + S("Cracked Red Tuff Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Red Tuff Brick Stair"), + S("Outer Cracked Red Tuff Brick Stair") +) + +stairs.register_stair_and_slab( + "tuff_red_block", + "too_many_stones:tuff_red_block", + {cracky = 2}, + {"tms_tuff_red_block.png"}, + S("Red Tuff Block Stair"), + S("Red Tuff Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Red Tuff Block Stair"), + S("Outer Red Tuff Block Stair") +) + +stairs.register_stair_and_slab( + "tuff_red_cobble", + "too_many_stones:tuff_red_cobble", + {cracky = 2}, + {"tms_tuff_red_cobble.png"}, + S("Cobbled Red Tuff Stair"), + S("Cobbled Red Tuff Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Red Tuff Stair"), + S("Outer Cobbled Red Tuff Stair") +) +-- Turquoise +stairs.register_stair_and_slab( + "turquoise", + "too_many_stones:turquoise", + {cracky = 3}, + {"tms_turquoise.png"}, + S("Turquoise Stair"), + S("Turquoise Slab"), + too_many_stones.node_sound_stone_defaults(), + true, + S("Inner Turquoise Stair"), + S("Outer Turquoise Stair") +) + +stairs.register_stair_and_slab( + "turquoise_cobble", + "too_many_stones:turquoise_cobble", + {cracky = 3}, + {"tms_turquoise_cobble.png"}, + S("Cobbled Turquoise Stair"), + S("Cobbled Turquoise Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cobbled Turquoise Stair"), + S("Outer Cobbled Turquoise Stair") +) + +stairs.register_stair_and_slab( + "turquoise_brick", + "too_many_stones:turquoise_brick", + {cracky = 2}, + {"tms_turquoise_brick.png"}, + S("Turquoise Brick Stair"), + S("Turquoise Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Turquoise Brick Stair"), + S("Outer Turquoise Brick Stair") +) + +stairs.register_stair_and_slab( + "turquoise_cracked_brick", + "too_many_stones:turquoise_cracked_brick", + {cracky = 2}, + {"tms_turquoise_cracked_brick.png"}, + S("Cracked Turquoise Brick Stair"), + S("Cracked Turquoise Brick Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Cracked Turquoise Brick Stair"), + S("Outer Cracked Turquoise Brick Stair") +) + +stairs.register_stair_and_slab( + "turquoise_block", + "too_many_stones:turquoise_block", + {cracky = 2}, + {"tms_turquoise_block.png"}, + S("Turquoise Block Stair"), + S("Turquoise Block Slab"), + too_many_stones.node_sound_stone_defaults(), + false, + S("Inner Turquoise Block Stair"), + S("Outer Turquoise Block Stair") +) +-- Vivianite +stairs.register_stair_and_slab( + "vivianite", + "too_many_stones:vivianite", + {cracky = 3}, + {"tms_vivianite.png"}, + S("Vivianite Stair"), + S("Vivianite Slab"), + too_many_stones.node_sound_glass_defaults(), + true, + S("Inner Vivianite Stair"), + S("Outer Vivianite Stair") +) + +stairs.register_stair_and_slab( + "vivianite_brick", + "too_many_stones:vivianite_brick", + {cracky = 2}, + {"tms_vivianite_brick.png"}, + S("Vivianite Brick Stair"), + S("Vivianite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Vivianite Brick Stair"), + S("Outer Vivianite Brick Stair") +) + +stairs.register_stair_and_slab( + "vivianite_cracked_brick", + "too_many_stones:vivianite_cracked_brick", + {cracky = 2}, + {"tms_vivianite_cracked_brick.png"}, + S("Cracked Vivianite Brick Stair"), + S("Cracked Vivianite Brick Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Cracked Vivianite Brick Stair"), + S("Outer Cracked Vivianite Brick Stair") +) + +stairs.register_stair_and_slab( + "vivianite_block", + "too_many_stones:vivianite_block", + {cracky = 2}, + {"tms_vivianite_block.png"}, + S("Vivianite Block Stair"), + S("Vivianite Block Slab"), + too_many_stones.node_sound_glass_defaults(), + false, + S("Inner Vivianite Block Stair"), + S("Outer Vivianite Block Stair") +) +end diff --git a/mods/too_many_stones/textures/tms_aegirine.png b/mods/too_many_stones/textures/tms_aegirine.png new file mode 100644 index 00000000..f48da18f Binary files /dev/null and b/mods/too_many_stones/textures/tms_aegirine.png differ diff --git a/mods/too_many_stones/textures/tms_aegirine_block.png b/mods/too_many_stones/textures/tms_aegirine_block.png new file mode 100644 index 00000000..ac244726 Binary files /dev/null and b/mods/too_many_stones/textures/tms_aegirine_block.png differ diff --git a/mods/too_many_stones/textures/tms_aegirine_brick.png b/mods/too_many_stones/textures/tms_aegirine_brick.png new file mode 100644 index 00000000..75cba8cc Binary files /dev/null and b/mods/too_many_stones/textures/tms_aegirine_brick.png differ diff --git a/mods/too_many_stones/textures/tms_aegirine_budding.png b/mods/too_many_stones/textures/tms_aegirine_budding.png new file mode 100644 index 00000000..f05345db Binary files /dev/null and b/mods/too_many_stones/textures/tms_aegirine_budding.png differ diff --git a/mods/too_many_stones/textures/tms_aegirine_cracked_brick.png b/mods/too_many_stones/textures/tms_aegirine_cracked_brick.png new file mode 100644 index 00000000..49e04d2c Binary files /dev/null and b/mods/too_many_stones/textures/tms_aegirine_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_aegirine_crystal.png b/mods/too_many_stones/textures/tms_aegirine_crystal.png new file mode 100644 index 00000000..be4e1b72 Binary files /dev/null and b/mods/too_many_stones/textures/tms_aegirine_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_agate_blue.png b/mods/too_many_stones/textures/tms_agate_blue.png new file mode 100644 index 00000000..bea6433b Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_blue.png differ diff --git a/mods/too_many_stones/textures/tms_agate_gray.png b/mods/too_many_stones/textures/tms_agate_gray.png new file mode 100644 index 00000000..5a0af497 Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_gray.png differ diff --git a/mods/too_many_stones/textures/tms_agate_green.png b/mods/too_many_stones/textures/tms_agate_green.png new file mode 100644 index 00000000..164cd3dc Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_green.png differ diff --git a/mods/too_many_stones/textures/tms_agate_moss.png b/mods/too_many_stones/textures/tms_agate_moss.png new file mode 100644 index 00000000..d967954f Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_moss.png differ diff --git a/mods/too_many_stones/textures/tms_agate_orange.png b/mods/too_many_stones/textures/tms_agate_orange.png new file mode 100644 index 00000000..d327a3ef Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_orange.png differ diff --git a/mods/too_many_stones/textures/tms_agate_purple.png b/mods/too_many_stones/textures/tms_agate_purple.png new file mode 100644 index 00000000..49b6b1c3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_purple.png differ diff --git a/mods/too_many_stones/textures/tms_agate_red.png b/mods/too_many_stones/textures/tms_agate_red.png new file mode 100644 index 00000000..8c8bb33c Binary files /dev/null and b/mods/too_many_stones/textures/tms_agate_red.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite.png b/mods/too_many_stones/textures/tms_amazonite.png new file mode 100644 index 00000000..606f6453 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite_block.png b/mods/too_many_stones/textures/tms_amazonite_block.png new file mode 100644 index 00000000..e493ead9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite_block.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite_brick.png b/mods/too_many_stones/textures/tms_amazonite_brick.png new file mode 100644 index 00000000..5c4cd299 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite_budding.png b/mods/too_many_stones/textures/tms_amazonite_budding.png new file mode 100644 index 00000000..bfcec175 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite_cobble.png b/mods/too_many_stones/textures/tms_amazonite_cobble.png new file mode 100644 index 00000000..f1d8cb5a Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite_cracked_brick.png b/mods/too_many_stones/textures/tms_amazonite_cracked_brick.png new file mode 100644 index 00000000..0755fd53 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_amazonite_crystal.png b/mods/too_many_stones/textures/tms_amazonite_crystal.png new file mode 100644 index 00000000..f3bf9738 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amazonite_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_amber.png b/mods/too_many_stones/textures/tms_amber.png new file mode 100644 index 00000000..cc33b791 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amber.png differ diff --git a/mods/too_many_stones/textures/tms_amber_block.png b/mods/too_many_stones/textures/tms_amber_block.png new file mode 100644 index 00000000..a9aefbb3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amber_block.png differ diff --git a/mods/too_many_stones/textures/tms_amber_brick.png b/mods/too_many_stones/textures/tms_amber_brick.png new file mode 100644 index 00000000..c0ceca74 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amber_brick.png differ diff --git a/mods/too_many_stones/textures/tms_amber_budding.png b/mods/too_many_stones/textures/tms_amber_budding.png new file mode 100644 index 00000000..57448ab7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amber_budding.png differ diff --git a/mods/too_many_stones/textures/tms_amber_cracked_brick.png b/mods/too_many_stones/textures/tms_amber_cracked_brick.png new file mode 100644 index 00000000..e58d3116 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amber_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_amber_crystal.png b/mods/too_many_stones/textures/tms_amber_crystal.png new file mode 100644 index 00000000..ff5cb73a Binary files /dev/null and b/mods/too_many_stones/textures/tms_amber_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_amethyst.png b/mods/too_many_stones/textures/tms_amethyst.png new file mode 100644 index 00000000..056a7c79 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amethyst.png differ diff --git a/mods/too_many_stones/textures/tms_amethyst_block.png b/mods/too_many_stones/textures/tms_amethyst_block.png new file mode 100644 index 00000000..d1ccf9a0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amethyst_block.png differ diff --git a/mods/too_many_stones/textures/tms_amethyst_brick.png b/mods/too_many_stones/textures/tms_amethyst_brick.png new file mode 100644 index 00000000..97f87b74 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amethyst_brick.png differ diff --git a/mods/too_many_stones/textures/tms_amethyst_budding.png b/mods/too_many_stones/textures/tms_amethyst_budding.png new file mode 100644 index 00000000..e3adaa0d Binary files /dev/null and b/mods/too_many_stones/textures/tms_amethyst_budding.png differ diff --git a/mods/too_many_stones/textures/tms_amethyst_cracked_brick.png b/mods/too_many_stones/textures/tms_amethyst_cracked_brick.png new file mode 100644 index 00000000..9093faf6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amethyst_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_amethyst_crystal.png b/mods/too_many_stones/textures/tms_amethyst_crystal.png new file mode 100644 index 00000000..07b601d9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_amethyst_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_ammolite_animated.png b/mods/too_many_stones/textures/tms_ammolite_animated.png new file mode 100644 index 00000000..a208f091 Binary files /dev/null and b/mods/too_many_stones/textures/tms_ammolite_animated.png differ diff --git a/mods/too_many_stones/textures/tms_andesite.png b/mods/too_many_stones/textures/tms_andesite.png new file mode 100644 index 00000000..a5c47c5b Binary files /dev/null and b/mods/too_many_stones/textures/tms_andesite.png differ diff --git a/mods/too_many_stones/textures/tms_andesite_block.png b/mods/too_many_stones/textures/tms_andesite_block.png new file mode 100644 index 00000000..f009822d Binary files /dev/null and b/mods/too_many_stones/textures/tms_andesite_block.png differ diff --git a/mods/too_many_stones/textures/tms_andesite_brick.png b/mods/too_many_stones/textures/tms_andesite_brick.png new file mode 100644 index 00000000..dbef11d9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_andesite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_andesite_cobble.png b/mods/too_many_stones/textures/tms_andesite_cobble.png new file mode 100644 index 00000000..8beda8fe Binary files /dev/null and b/mods/too_many_stones/textures/tms_andesite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_andesite_cracked_brick.png b/mods/too_many_stones/textures/tms_andesite_cracked_brick.png new file mode 100644 index 00000000..b4e7ab47 Binary files /dev/null and b/mods/too_many_stones/textures/tms_andesite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_basalt.png b/mods/too_many_stones/textures/tms_basalt.png new file mode 100644 index 00000000..55ab7568 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_block.png b/mods/too_many_stones/textures/tms_basalt_block.png new file mode 100644 index 00000000..82eed887 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_block.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_brick.png b/mods/too_many_stones/textures/tms_basalt_brick.png new file mode 100644 index 00000000..575ffd48 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_brick.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_cobble.png b/mods/too_many_stones/textures/tms_basalt_cobble.png new file mode 100644 index 00000000..d80f0395 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_columnar.png b/mods/too_many_stones/textures/tms_basalt_columnar.png new file mode 100644 index 00000000..f47b13b3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_columnar.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_columnar_top.png b/mods/too_many_stones/textures/tms_basalt_columnar_top.png new file mode 100644 index 00000000..33bd57d5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_columnar_top.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_cracked_brick.png b/mods/too_many_stones/textures/tms_basalt_cracked_brick.png new file mode 100644 index 00000000..d10ae018 Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_basalt_tile.png b/mods/too_many_stones/textures/tms_basalt_tile.png new file mode 100644 index 00000000..916a3c7d Binary files /dev/null and b/mods/too_many_stones/textures/tms_basalt_tile.png differ diff --git a/mods/too_many_stones/textures/tms_batch.png b/mods/too_many_stones/textures/tms_batch.png new file mode 100644 index 00000000..6962ef75 Binary files /dev/null and b/mods/too_many_stones/textures/tms_batch.png differ diff --git a/mods/too_many_stones/textures/tms_black_moonstone.png b/mods/too_many_stones/textures/tms_black_moonstone.png new file mode 100644 index 00000000..af2ccdac Binary files /dev/null and b/mods/too_many_stones/textures/tms_black_moonstone.png differ diff --git a/mods/too_many_stones/textures/tms_black_moonstone_block.png b/mods/too_many_stones/textures/tms_black_moonstone_block.png new file mode 100644 index 00000000..a38dcd81 Binary files /dev/null and b/mods/too_many_stones/textures/tms_black_moonstone_block.png differ diff --git a/mods/too_many_stones/textures/tms_black_moonstone_brick.png b/mods/too_many_stones/textures/tms_black_moonstone_brick.png new file mode 100644 index 00000000..68a172b6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_black_moonstone_brick.png differ diff --git a/mods/too_many_stones/textures/tms_black_moonstone_cracked_brick.png b/mods/too_many_stones/textures/tms_black_moonstone_cracked_brick.png new file mode 100644 index 00000000..c083e926 Binary files /dev/null and b/mods/too_many_stones/textures/tms_black_moonstone_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_black_opal_animated.png b/mods/too_many_stones/textures/tms_black_opal_animated.png new file mode 100644 index 00000000..a379d0a3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_black_opal_animated.png differ diff --git a/mods/too_many_stones/textures/tms_calcite.png b/mods/too_many_stones/textures/tms_calcite.png new file mode 100644 index 00000000..1ea6ef7d Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_block.png b/mods/too_many_stones/textures/tms_calcite_block.png new file mode 100644 index 00000000..ea0b7b3e Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_block.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_brick.png b/mods/too_many_stones/textures/tms_calcite_brick.png new file mode 100644 index 00000000..2d658acc Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_cracked_brick.png b/mods/too_many_stones/textures/tms_calcite_cracked_brick.png new file mode 100644 index 00000000..34d0455a Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_grey.png b/mods/too_many_stones/textures/tms_calcite_grey.png new file mode 100644 index 00000000..1385b0d7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_grey.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_grey_block.png b/mods/too_many_stones/textures/tms_calcite_grey_block.png new file mode 100644 index 00000000..52b9a77b Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_grey_block.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_grey_brick.png b/mods/too_many_stones/textures/tms_calcite_grey_brick.png new file mode 100644 index 00000000..43e1931d Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_grey_brick.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_grey_cracked_brick.png b/mods/too_many_stones/textures/tms_calcite_grey_cracked_brick.png new file mode 100644 index 00000000..8919c6f6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_grey_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_orange.png b/mods/too_many_stones/textures/tms_calcite_orange.png new file mode 100644 index 00000000..7ea20171 Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_orange.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_orange_block.png b/mods/too_many_stones/textures/tms_calcite_orange_block.png new file mode 100644 index 00000000..ef2487e5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_orange_block.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_orange_brick.png b/mods/too_many_stones/textures/tms_calcite_orange_brick.png new file mode 100644 index 00000000..a29d7d95 Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_orange_brick.png differ diff --git a/mods/too_many_stones/textures/tms_calcite_orange_cracked_brick.png b/mods/too_many_stones/textures/tms_calcite_orange_cracked_brick.png new file mode 100644 index 00000000..c46ea3eb Binary files /dev/null and b/mods/too_many_stones/textures/tms_calcite_orange_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_carnotite.png b/mods/too_many_stones/textures/tms_carnotite.png new file mode 100644 index 00000000..5b26ccf9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_carnotite.png differ diff --git a/mods/too_many_stones/textures/tms_carnotite_block.png b/mods/too_many_stones/textures/tms_carnotite_block.png new file mode 100644 index 00000000..aecebcee Binary files /dev/null and b/mods/too_many_stones/textures/tms_carnotite_block.png differ diff --git a/mods/too_many_stones/textures/tms_carnotite_brick.png b/mods/too_many_stones/textures/tms_carnotite_brick.png new file mode 100644 index 00000000..703fafe5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_carnotite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_carnotite_cobble.png b/mods/too_many_stones/textures/tms_carnotite_cobble.png new file mode 100644 index 00000000..17d55b29 Binary files /dev/null and b/mods/too_many_stones/textures/tms_carnotite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_carnotite_cracked_brick.png b/mods/too_many_stones/textures/tms_carnotite_cracked_brick.png new file mode 100644 index 00000000..53990935 Binary files /dev/null and b/mods/too_many_stones/textures/tms_carnotite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_celestine.png b/mods/too_many_stones/textures/tms_celestine.png new file mode 100644 index 00000000..94ca51c7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_celestine.png differ diff --git a/mods/too_many_stones/textures/tms_celestine_block.png b/mods/too_many_stones/textures/tms_celestine_block.png new file mode 100644 index 00000000..6afff4a4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_celestine_block.png differ diff --git a/mods/too_many_stones/textures/tms_celestine_brick.png b/mods/too_many_stones/textures/tms_celestine_brick.png new file mode 100644 index 00000000..a74cd2ad Binary files /dev/null and b/mods/too_many_stones/textures/tms_celestine_brick.png differ diff --git a/mods/too_many_stones/textures/tms_celestine_budding.png b/mods/too_many_stones/textures/tms_celestine_budding.png new file mode 100644 index 00000000..aabdb53d Binary files /dev/null and b/mods/too_many_stones/textures/tms_celestine_budding.png differ diff --git a/mods/too_many_stones/textures/tms_celestine_cracked_brick.png b/mods/too_many_stones/textures/tms_celestine_cracked_brick.png new file mode 100644 index 00000000..e7944b58 Binary files /dev/null and b/mods/too_many_stones/textures/tms_celestine_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_celestine_crystal.png b/mods/too_many_stones/textures/tms_celestine_crystal.png new file mode 100644 index 00000000..45b992c6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_celestine_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite.png b/mods/too_many_stones/textures/tms_chalcanthite.png new file mode 100644 index 00000000..4ce89bda Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite_block.png b/mods/too_many_stones/textures/tms_chalcanthite_block.png new file mode 100644 index 00000000..4a2fd1e3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite_block.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite_brick.png b/mods/too_many_stones/textures/tms_chalcanthite_brick.png new file mode 100644 index 00000000..58f67ba8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite_budding.png b/mods/too_many_stones/textures/tms_chalcanthite_budding.png new file mode 100644 index 00000000..4480c341 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite_cobble.png b/mods/too_many_stones/textures/tms_chalcanthite_cobble.png new file mode 100644 index 00000000..6a1d0a99 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite_cracked_brick.png b/mods/too_many_stones/textures/tms_chalcanthite_cracked_brick.png new file mode 100644 index 00000000..ddd1b073 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_chalcanthite_crystal.png b/mods/too_many_stones/textures/tms_chalcanthite_crystal.png new file mode 100644 index 00000000..252e5609 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chalcanthite_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_chrysoprase.png b/mods/too_many_stones/textures/tms_chrysoprase.png new file mode 100644 index 00000000..f057a19b Binary files /dev/null and b/mods/too_many_stones/textures/tms_chrysoprase.png differ diff --git a/mods/too_many_stones/textures/tms_chrysoprase_block.png b/mods/too_many_stones/textures/tms_chrysoprase_block.png new file mode 100644 index 00000000..1ffdb44f Binary files /dev/null and b/mods/too_many_stones/textures/tms_chrysoprase_block.png differ diff --git a/mods/too_many_stones/textures/tms_chrysoprase_brick.png b/mods/too_many_stones/textures/tms_chrysoprase_brick.png new file mode 100644 index 00000000..931af3c0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_chrysoprase_brick.png differ diff --git a/mods/too_many_stones/textures/tms_chrysoprase_cracked_brick.png b/mods/too_many_stones/textures/tms_chrysoprase_cracked_brick.png new file mode 100644 index 00000000..4704c64a Binary files /dev/null and b/mods/too_many_stones/textures/tms_chrysoprase_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_citrine.png b/mods/too_many_stones/textures/tms_citrine.png new file mode 100644 index 00000000..0f973070 Binary files /dev/null and b/mods/too_many_stones/textures/tms_citrine.png differ diff --git a/mods/too_many_stones/textures/tms_citrine_block.png b/mods/too_many_stones/textures/tms_citrine_block.png new file mode 100644 index 00000000..9f41f9ac Binary files /dev/null and b/mods/too_many_stones/textures/tms_citrine_block.png differ diff --git a/mods/too_many_stones/textures/tms_citrine_brick.png b/mods/too_many_stones/textures/tms_citrine_brick.png new file mode 100644 index 00000000..bc1761ca Binary files /dev/null and b/mods/too_many_stones/textures/tms_citrine_brick.png differ diff --git a/mods/too_many_stones/textures/tms_citrine_budding.png b/mods/too_many_stones/textures/tms_citrine_budding.png new file mode 100644 index 00000000..798e0fc0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_citrine_budding.png differ diff --git a/mods/too_many_stones/textures/tms_citrine_cracked_brick.png b/mods/too_many_stones/textures/tms_citrine_cracked_brick.png new file mode 100644 index 00000000..173b881a Binary files /dev/null and b/mods/too_many_stones/textures/tms_citrine_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_citrine_crystal.png b/mods/too_many_stones/textures/tms_citrine_crystal.png new file mode 100644 index 00000000..fcc8d37a Binary files /dev/null and b/mods/too_many_stones/textures/tms_citrine_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_covellite.png b/mods/too_many_stones/textures/tms_covellite.png new file mode 100644 index 00000000..45cbebd5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_covellite.png differ diff --git a/mods/too_many_stones/textures/tms_covellite_block.png b/mods/too_many_stones/textures/tms_covellite_block.png new file mode 100644 index 00000000..4e0a26b2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_covellite_block.png differ diff --git a/mods/too_many_stones/textures/tms_covellite_brick.png b/mods/too_many_stones/textures/tms_covellite_brick.png new file mode 100644 index 00000000..72ecbc66 Binary files /dev/null and b/mods/too_many_stones/textures/tms_covellite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_covellite_cobble.png b/mods/too_many_stones/textures/tms_covellite_cobble.png new file mode 100644 index 00000000..223567e8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_covellite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_covellite_cracked_brick.png b/mods/too_many_stones/textures/tms_covellite_cracked_brick.png new file mode 100644 index 00000000..d233d73a Binary files /dev/null and b/mods/too_many_stones/textures/tms_covellite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_crocoite.png b/mods/too_many_stones/textures/tms_crocoite.png new file mode 100644 index 00000000..de43b642 Binary files /dev/null and b/mods/too_many_stones/textures/tms_crocoite.png differ diff --git a/mods/too_many_stones/textures/tms_crocoite_block.png b/mods/too_many_stones/textures/tms_crocoite_block.png new file mode 100644 index 00000000..031f7ca8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_crocoite_block.png differ diff --git a/mods/too_many_stones/textures/tms_crocoite_brick.png b/mods/too_many_stones/textures/tms_crocoite_brick.png new file mode 100644 index 00000000..65f88883 Binary files /dev/null and b/mods/too_many_stones/textures/tms_crocoite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_crocoite_budding.png b/mods/too_many_stones/textures/tms_crocoite_budding.png new file mode 100644 index 00000000..c442d0de Binary files /dev/null and b/mods/too_many_stones/textures/tms_crocoite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_crocoite_cracked_brick.png b/mods/too_many_stones/textures/tms_crocoite_cracked_brick.png new file mode 100644 index 00000000..cbac9b7e Binary files /dev/null and b/mods/too_many_stones/textures/tms_crocoite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_crocoite_crystal.png b/mods/too_many_stones/textures/tms_crocoite_crystal.png new file mode 100644 index 00000000..3c7ae2e0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_crocoite_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_desert_sandstone.png b/mods/too_many_stones/textures/tms_desert_sandstone.png new file mode 100644 index 00000000..315626b9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_desert_sandstone.png differ diff --git a/mods/too_many_stones/textures/tms_diorite.png b/mods/too_many_stones/textures/tms_diorite.png new file mode 100644 index 00000000..c275b4c1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_diorite.png differ diff --git a/mods/too_many_stones/textures/tms_diorite_block.png b/mods/too_many_stones/textures/tms_diorite_block.png new file mode 100644 index 00000000..038ba145 Binary files /dev/null and b/mods/too_many_stones/textures/tms_diorite_block.png differ diff --git a/mods/too_many_stones/textures/tms_diorite_brick.png b/mods/too_many_stones/textures/tms_diorite_brick.png new file mode 100644 index 00000000..876e0227 Binary files /dev/null and b/mods/too_many_stones/textures/tms_diorite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_diorite_cobble.png b/mods/too_many_stones/textures/tms_diorite_cobble.png new file mode 100644 index 00000000..64e0dcba Binary files /dev/null and b/mods/too_many_stones/textures/tms_diorite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_diorite_cracked_brick.png b/mods/too_many_stones/textures/tms_diorite_cracked_brick.png new file mode 100644 index 00000000..bb76099a Binary files /dev/null and b/mods/too_many_stones/textures/tms_diorite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_erythrite.png b/mods/too_many_stones/textures/tms_erythrite.png new file mode 100644 index 00000000..00ffc056 Binary files /dev/null and b/mods/too_many_stones/textures/tms_erythrite.png differ diff --git a/mods/too_many_stones/textures/tms_erythrite_block.png b/mods/too_many_stones/textures/tms_erythrite_block.png new file mode 100644 index 00000000..536a697f Binary files /dev/null and b/mods/too_many_stones/textures/tms_erythrite_block.png differ diff --git a/mods/too_many_stones/textures/tms_erythrite_brick.png b/mods/too_many_stones/textures/tms_erythrite_brick.png new file mode 100644 index 00000000..86999e42 Binary files /dev/null and b/mods/too_many_stones/textures/tms_erythrite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_erythrite_cracked_brick.png b/mods/too_many_stones/textures/tms_erythrite_cracked_brick.png new file mode 100644 index 00000000..f1aaf22e Binary files /dev/null and b/mods/too_many_stones/textures/tms_erythrite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_eudialite.png b/mods/too_many_stones/textures/tms_eudialite.png new file mode 100644 index 00000000..c7ba6974 Binary files /dev/null and b/mods/too_many_stones/textures/tms_eudialite.png differ diff --git a/mods/too_many_stones/textures/tms_eudialite_block.png b/mods/too_many_stones/textures/tms_eudialite_block.png new file mode 100644 index 00000000..79047208 Binary files /dev/null and b/mods/too_many_stones/textures/tms_eudialite_block.png differ diff --git a/mods/too_many_stones/textures/tms_eudialite_brick.png b/mods/too_many_stones/textures/tms_eudialite_brick.png new file mode 100644 index 00000000..ef396145 Binary files /dev/null and b/mods/too_many_stones/textures/tms_eudialite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_eudialite_budding.png b/mods/too_many_stones/textures/tms_eudialite_budding.png new file mode 100644 index 00000000..fb11404f Binary files /dev/null and b/mods/too_many_stones/textures/tms_eudialite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_eudialite_cracked_brick.png b/mods/too_many_stones/textures/tms_eudialite_cracked_brick.png new file mode 100644 index 00000000..6196f83c Binary files /dev/null and b/mods/too_many_stones/textures/tms_eudialite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_eudialite_crystal.png b/mods/too_many_stones/textures/tms_eudialite_crystal.png new file mode 100644 index 00000000..176b041c Binary files /dev/null and b/mods/too_many_stones/textures/tms_eudialite_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_fire_opal_animated.png b/mods/too_many_stones/textures/tms_fire_opal_animated.png new file mode 100644 index 00000000..5c47e44e Binary files /dev/null and b/mods/too_many_stones/textures/tms_fire_opal_animated.png differ diff --git a/mods/too_many_stones/textures/tms_fluorite.png b/mods/too_many_stones/textures/tms_fluorite.png new file mode 100644 index 00000000..8ba12ce0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_fluorite.png differ diff --git a/mods/too_many_stones/textures/tms_fluorite_block.png b/mods/too_many_stones/textures/tms_fluorite_block.png new file mode 100644 index 00000000..c68a2112 Binary files /dev/null and b/mods/too_many_stones/textures/tms_fluorite_block.png differ diff --git a/mods/too_many_stones/textures/tms_fluorite_brick.png b/mods/too_many_stones/textures/tms_fluorite_brick.png new file mode 100644 index 00000000..007d7b3c Binary files /dev/null and b/mods/too_many_stones/textures/tms_fluorite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_fluorite_cracked_brick.png b/mods/too_many_stones/textures/tms_fluorite_cracked_brick.png new file mode 100644 index 00000000..82d5b009 Binary files /dev/null and b/mods/too_many_stones/textures/tms_fluorite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_gabbro.png b/mods/too_many_stones/textures/tms_gabbro.png new file mode 100644 index 00000000..5c9a735c Binary files /dev/null and b/mods/too_many_stones/textures/tms_gabbro.png differ diff --git a/mods/too_many_stones/textures/tms_gabbro_block.png b/mods/too_many_stones/textures/tms_gabbro_block.png new file mode 100644 index 00000000..dbc01aa1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_gabbro_block.png differ diff --git a/mods/too_many_stones/textures/tms_gabbro_brick.png b/mods/too_many_stones/textures/tms_gabbro_brick.png new file mode 100644 index 00000000..077ef126 Binary files /dev/null and b/mods/too_many_stones/textures/tms_gabbro_brick.png differ diff --git a/mods/too_many_stones/textures/tms_gabbro_cobble.png b/mods/too_many_stones/textures/tms_gabbro_cobble.png new file mode 100644 index 00000000..72cf81ef Binary files /dev/null and b/mods/too_many_stones/textures/tms_gabbro_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_gabbro_cracked_brick.png b/mods/too_many_stones/textures/tms_gabbro_cracked_brick.png new file mode 100644 index 00000000..1c921611 Binary files /dev/null and b/mods/too_many_stones/textures/tms_gabbro_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_galena.png b/mods/too_many_stones/textures/tms_galena.png new file mode 100644 index 00000000..dffd8bbc Binary files /dev/null and b/mods/too_many_stones/textures/tms_galena.png differ diff --git a/mods/too_many_stones/textures/tms_galena_block.png b/mods/too_many_stones/textures/tms_galena_block.png new file mode 100644 index 00000000..f3ceeffa Binary files /dev/null and b/mods/too_many_stones/textures/tms_galena_block.png differ diff --git a/mods/too_many_stones/textures/tms_galena_brick.png b/mods/too_many_stones/textures/tms_galena_brick.png new file mode 100644 index 00000000..05d38f0a Binary files /dev/null and b/mods/too_many_stones/textures/tms_galena_brick.png differ diff --git a/mods/too_many_stones/textures/tms_galena_cracked_brick.png b/mods/too_many_stones/textures/tms_galena_cracked_brick.png new file mode 100644 index 00000000..e6a5382c Binary files /dev/null and b/mods/too_many_stones/textures/tms_galena_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite.png b/mods/too_many_stones/textures/tms_geyserite.png new file mode 100644 index 00000000..9cd16e5d Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_block.png b/mods/too_many_stones/textures/tms_geyserite_block.png new file mode 100644 index 00000000..4624f9ee Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_block.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_brick.png b/mods/too_many_stones/textures/tms_geyserite_brick.png new file mode 100644 index 00000000..beabccbf Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_cobble.png b/mods/too_many_stones/textures/tms_geyserite_cobble.png new file mode 100644 index 00000000..343d4890 Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_cracked_brick.png b/mods/too_many_stones/textures/tms_geyserite_cracked_brick.png new file mode 100644 index 00000000..52ab604c Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_flowstone_1.png b/mods/too_many_stones/textures/tms_geyserite_flowstone_1.png new file mode 100644 index 00000000..d8482f07 Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_flowstone_1.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_flowstone_2.png b/mods/too_many_stones/textures/tms_geyserite_flowstone_2.png new file mode 100644 index 00000000..116778be Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_flowstone_2.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_flowstone_3.png b/mods/too_many_stones/textures/tms_geyserite_flowstone_3.png new file mode 100644 index 00000000..a61f5282 Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_flowstone_3.png differ diff --git a/mods/too_many_stones/textures/tms_geyserite_flowstone_4.png b/mods/too_many_stones/textures/tms_geyserite_flowstone_4.png new file mode 100644 index 00000000..1a0c4675 Binary files /dev/null and b/mods/too_many_stones/textures/tms_geyserite_flowstone_4.png differ diff --git a/mods/too_many_stones/textures/tms_glow_apatite.png b/mods/too_many_stones/textures/tms_glow_apatite.png new file mode 100644 index 00000000..6156af9e Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_apatite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_apatite_block.png b/mods/too_many_stones/textures/tms_glow_apatite_block.png new file mode 100644 index 00000000..81639c66 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_apatite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_apatite_brick.png b/mods/too_many_stones/textures/tms_glow_apatite_brick.png new file mode 100644 index 00000000..08fed3e3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_apatite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_apatite_cobble.png b/mods/too_many_stones/textures/tms_glow_apatite_cobble.png new file mode 100644 index 00000000..f5a3e831 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_apatite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_apatite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_apatite_cracked_brick.png new file mode 100644 index 00000000..df14b961 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_apatite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_calcite.png b/mods/too_many_stones/textures/tms_glow_calcite.png new file mode 100644 index 00000000..e9ead622 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_calcite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_calcite_block.png b/mods/too_many_stones/textures/tms_glow_calcite_block.png new file mode 100644 index 00000000..d276d14a Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_calcite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_calcite_brick.png b/mods/too_many_stones/textures/tms_glow_calcite_brick.png new file mode 100644 index 00000000..da902ac4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_calcite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_calcite_cobble.png b/mods/too_many_stones/textures/tms_glow_calcite_cobble.png new file mode 100644 index 00000000..fcd5beb1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_calcite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_calcite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_calcite_cracked_brick.png new file mode 100644 index 00000000..edb52a87 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_calcite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_esperite.png b/mods/too_many_stones/textures/tms_glow_esperite.png new file mode 100644 index 00000000..891b07d2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_esperite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_esperite_block.png b/mods/too_many_stones/textures/tms_glow_esperite_block.png new file mode 100644 index 00000000..95811a9f Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_esperite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_esperite_brick.png b/mods/too_many_stones/textures/tms_glow_esperite_brick.png new file mode 100644 index 00000000..9f4b6c8f Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_esperite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_esperite_cobble.png b/mods/too_many_stones/textures/tms_glow_esperite_cobble.png new file mode 100644 index 00000000..b26f9fcd Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_esperite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_esperite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_esperite_cracked_brick.png new file mode 100644 index 00000000..94310b7e Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_esperite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_fluorite.png b/mods/too_many_stones/textures/tms_glow_fluorite.png new file mode 100644 index 00000000..538243b7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_fluorite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_fluorite_block.png b/mods/too_many_stones/textures/tms_glow_fluorite_block.png new file mode 100644 index 00000000..4aa0dd5c Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_fluorite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_fluorite_brick.png b/mods/too_many_stones/textures/tms_glow_fluorite_brick.png new file mode 100644 index 00000000..cfe37808 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_fluorite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_fluorite_cobble.png b/mods/too_many_stones/textures/tms_glow_fluorite_cobble.png new file mode 100644 index 00000000..e03c6d50 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_fluorite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_fluorite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_fluorite_cracked_brick.png new file mode 100644 index 00000000..76a6bc51 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_fluorite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_selenite.png b/mods/too_many_stones/textures/tms_glow_selenite.png new file mode 100644 index 00000000..e9c97646 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_selenite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_selenite_block.png b/mods/too_many_stones/textures/tms_glow_selenite_block.png new file mode 100644 index 00000000..f7b178e0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_selenite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_selenite_brick.png b/mods/too_many_stones/textures/tms_glow_selenite_brick.png new file mode 100644 index 00000000..965af72b Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_selenite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_selenite_cobble.png b/mods/too_many_stones/textures/tms_glow_selenite_cobble.png new file mode 100644 index 00000000..f6c65e6e Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_selenite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_selenite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_selenite_cracked_brick.png new file mode 100644 index 00000000..b09da80c Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_selenite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_sodalite.png b/mods/too_many_stones/textures/tms_glow_sodalite.png new file mode 100644 index 00000000..35bff99c Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_sodalite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_sodalite_block.png b/mods/too_many_stones/textures/tms_glow_sodalite_block.png new file mode 100644 index 00000000..03e12346 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_sodalite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_sodalite_brick.png b/mods/too_many_stones/textures/tms_glow_sodalite_brick.png new file mode 100644 index 00000000..8873b12a Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_sodalite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_sodalite_cobble.png b/mods/too_many_stones/textures/tms_glow_sodalite_cobble.png new file mode 100644 index 00000000..7d872682 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_sodalite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_sodalite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_sodalite_cracked_brick.png new file mode 100644 index 00000000..e9397352 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_sodalite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_willemite.png b/mods/too_many_stones/textures/tms_glow_willemite.png new file mode 100644 index 00000000..b158faa9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_willemite.png differ diff --git a/mods/too_many_stones/textures/tms_glow_willemite_block.png b/mods/too_many_stones/textures/tms_glow_willemite_block.png new file mode 100644 index 00000000..36f6d79b Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_willemite_block.png differ diff --git a/mods/too_many_stones/textures/tms_glow_willemite_brick.png b/mods/too_many_stones/textures/tms_glow_willemite_brick.png new file mode 100644 index 00000000..3c9ad369 Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_willemite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_glow_willemite_cobble.png b/mods/too_many_stones/textures/tms_glow_willemite_cobble.png new file mode 100644 index 00000000..470b70fb Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_willemite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_glow_willemite_cracked_brick.png b/mods/too_many_stones/textures/tms_glow_willemite_cracked_brick.png new file mode 100644 index 00000000..bc19a8ea Binary files /dev/null and b/mods/too_many_stones/textures/tms_glow_willemite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_black.png b/mods/too_many_stones/textures/tms_granite_black.png new file mode 100644 index 00000000..1fca40c0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_black.png differ diff --git a/mods/too_many_stones/textures/tms_granite_black_block.png b/mods/too_many_stones/textures/tms_granite_black_block.png new file mode 100644 index 00000000..39aeb382 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_black_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_black_brick.png b/mods/too_many_stones/textures/tms_granite_black_brick.png new file mode 100644 index 00000000..2eb6df75 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_black_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_black_cobble.png b/mods/too_many_stones/textures/tms_granite_black_cobble.png new file mode 100644 index 00000000..84b8f5e2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_black_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_black_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_black_cracked_brick.png new file mode 100644 index 00000000..c4fc4c10 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_black_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_blue.png b/mods/too_many_stones/textures/tms_granite_blue.png new file mode 100644 index 00000000..1c865305 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_blue.png differ diff --git a/mods/too_many_stones/textures/tms_granite_blue_block.png b/mods/too_many_stones/textures/tms_granite_blue_block.png new file mode 100644 index 00000000..4a1b275e Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_blue_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_blue_brick.png b/mods/too_many_stones/textures/tms_granite_blue_brick.png new file mode 100644 index 00000000..54647aa6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_blue_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_blue_cobble.png b/mods/too_many_stones/textures/tms_granite_blue_cobble.png new file mode 100644 index 00000000..ba2a360e Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_blue_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_blue_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_blue_cracked_brick.png new file mode 100644 index 00000000..d18a1851 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_blue_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_gray.png b/mods/too_many_stones/textures/tms_granite_gray.png new file mode 100644 index 00000000..04a38f67 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_gray.png differ diff --git a/mods/too_many_stones/textures/tms_granite_gray_block.png b/mods/too_many_stones/textures/tms_granite_gray_block.png new file mode 100644 index 00000000..4ea514c6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_gray_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_gray_brick.png b/mods/too_many_stones/textures/tms_granite_gray_brick.png new file mode 100644 index 00000000..6fa948e0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_gray_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_gray_cobble.png b/mods/too_many_stones/textures/tms_granite_gray_cobble.png new file mode 100644 index 00000000..44e3c2e2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_gray_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_gray_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_gray_cracked_brick.png new file mode 100644 index 00000000..e5b235ef Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_gray_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_green.png b/mods/too_many_stones/textures/tms_granite_green.png new file mode 100644 index 00000000..f856f3fa Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_green.png differ diff --git a/mods/too_many_stones/textures/tms_granite_green_block.png b/mods/too_many_stones/textures/tms_granite_green_block.png new file mode 100644 index 00000000..4eb61557 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_green_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_green_brick.png b/mods/too_many_stones/textures/tms_granite_green_brick.png new file mode 100644 index 00000000..56f2c844 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_green_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_green_cobble.png b/mods/too_many_stones/textures/tms_granite_green_cobble.png new file mode 100644 index 00000000..9b80942e Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_green_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_green_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_green_cracked_brick.png new file mode 100644 index 00000000..31ec7e9e Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_green_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_pink.png b/mods/too_many_stones/textures/tms_granite_pink.png new file mode 100644 index 00000000..26b14aa0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_pink.png differ diff --git a/mods/too_many_stones/textures/tms_granite_pink_block.png b/mods/too_many_stones/textures/tms_granite_pink_block.png new file mode 100644 index 00000000..f10865d7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_pink_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_pink_brick.png b/mods/too_many_stones/textures/tms_granite_pink_brick.png new file mode 100644 index 00000000..42a74096 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_pink_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_pink_cobble.png b/mods/too_many_stones/textures/tms_granite_pink_cobble.png new file mode 100644 index 00000000..c30f2ba4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_pink_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_pink_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_pink_cracked_brick.png new file mode 100644 index 00000000..b4a9d962 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_pink_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_red.png b/mods/too_many_stones/textures/tms_granite_red.png new file mode 100644 index 00000000..6b909a1d Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_red.png differ diff --git a/mods/too_many_stones/textures/tms_granite_red_block.png b/mods/too_many_stones/textures/tms_granite_red_block.png new file mode 100644 index 00000000..74787fa8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_red_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_red_brick.png b/mods/too_many_stones/textures/tms_granite_red_brick.png new file mode 100644 index 00000000..71ed3071 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_red_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_red_cobble.png b/mods/too_many_stones/textures/tms_granite_red_cobble.png new file mode 100644 index 00000000..89e23bb7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_red_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_red_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_red_cracked_brick.png new file mode 100644 index 00000000..0e62b109 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_red_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_white.png b/mods/too_many_stones/textures/tms_granite_white.png new file mode 100644 index 00000000..23967172 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_white.png differ diff --git a/mods/too_many_stones/textures/tms_granite_white_block.png b/mods/too_many_stones/textures/tms_granite_white_block.png new file mode 100644 index 00000000..de658ea1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_white_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_white_brick.png b/mods/too_many_stones/textures/tms_granite_white_brick.png new file mode 100644 index 00000000..c33a33aa Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_white_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_white_cobble.png b/mods/too_many_stones/textures/tms_granite_white_cobble.png new file mode 100644 index 00000000..ac3dbc64 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_white_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_white_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_white_cracked_brick.png new file mode 100644 index 00000000..d26e0770 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_white_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_yellow.png b/mods/too_many_stones/textures/tms_granite_yellow.png new file mode 100644 index 00000000..0f7d3601 Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_yellow.png differ diff --git a/mods/too_many_stones/textures/tms_granite_yellow_block.png b/mods/too_many_stones/textures/tms_granite_yellow_block.png new file mode 100644 index 00000000..be403dce Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_yellow_block.png differ diff --git a/mods/too_many_stones/textures/tms_granite_yellow_brick.png b/mods/too_many_stones/textures/tms_granite_yellow_brick.png new file mode 100644 index 00000000..4158271e Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_yellow_brick.png differ diff --git a/mods/too_many_stones/textures/tms_granite_yellow_cobble.png b/mods/too_many_stones/textures/tms_granite_yellow_cobble.png new file mode 100644 index 00000000..d36066ca Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_yellow_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_granite_yellow_cracked_brick.png b/mods/too_many_stones/textures/tms_granite_yellow_cracked_brick.png new file mode 100644 index 00000000..ffcd0bcd Binary files /dev/null and b/mods/too_many_stones/textures/tms_granite_yellow_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_heliodor.png b/mods/too_many_stones/textures/tms_heliodor.png new file mode 100644 index 00000000..6a26283b Binary files /dev/null and b/mods/too_many_stones/textures/tms_heliodor.png differ diff --git a/mods/too_many_stones/textures/tms_heliodor_block.png b/mods/too_many_stones/textures/tms_heliodor_block.png new file mode 100644 index 00000000..87d10ed3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_heliodor_block.png differ diff --git a/mods/too_many_stones/textures/tms_heliodor_brick.png b/mods/too_many_stones/textures/tms_heliodor_brick.png new file mode 100644 index 00000000..26afea00 Binary files /dev/null and b/mods/too_many_stones/textures/tms_heliodor_brick.png differ diff --git a/mods/too_many_stones/textures/tms_heliodor_budding.png b/mods/too_many_stones/textures/tms_heliodor_budding.png new file mode 100644 index 00000000..c2ea888f Binary files /dev/null and b/mods/too_many_stones/textures/tms_heliodor_budding.png differ diff --git a/mods/too_many_stones/textures/tms_heliodor_cracked_brick.png b/mods/too_many_stones/textures/tms_heliodor_cracked_brick.png new file mode 100644 index 00000000..2f7a1711 Binary files /dev/null and b/mods/too_many_stones/textures/tms_heliodor_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_heliodor_crystal.png b/mods/too_many_stones/textures/tms_heliodor_crystal.png new file mode 100644 index 00000000..901aff7b Binary files /dev/null and b/mods/too_many_stones/textures/tms_heliodor_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_howlite.png b/mods/too_many_stones/textures/tms_howlite.png new file mode 100644 index 00000000..96ae5324 Binary files /dev/null and b/mods/too_many_stones/textures/tms_howlite.png differ diff --git a/mods/too_many_stones/textures/tms_howlite_block.png b/mods/too_many_stones/textures/tms_howlite_block.png new file mode 100644 index 00000000..6eb1ca97 Binary files /dev/null and b/mods/too_many_stones/textures/tms_howlite_block.png differ diff --git a/mods/too_many_stones/textures/tms_howlite_brick.png b/mods/too_many_stones/textures/tms_howlite_brick.png new file mode 100644 index 00000000..24248dda Binary files /dev/null and b/mods/too_many_stones/textures/tms_howlite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_howlite_cobble.png b/mods/too_many_stones/textures/tms_howlite_cobble.png new file mode 100644 index 00000000..ddfb1d57 Binary files /dev/null and b/mods/too_many_stones/textures/tms_howlite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_howlite_cracked_brick.png b/mods/too_many_stones/textures/tms_howlite_cracked_brick.png new file mode 100644 index 00000000..ca7ce41f Binary files /dev/null and b/mods/too_many_stones/textures/tms_howlite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_ilvaite.png b/mods/too_many_stones/textures/tms_ilvaite.png new file mode 100644 index 00000000..148c76b6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_ilvaite.png differ diff --git a/mods/too_many_stones/textures/tms_ilvaite_block.png b/mods/too_many_stones/textures/tms_ilvaite_block.png new file mode 100644 index 00000000..294da86d Binary files /dev/null and b/mods/too_many_stones/textures/tms_ilvaite_block.png differ diff --git a/mods/too_many_stones/textures/tms_ilvaite_brick.png b/mods/too_many_stones/textures/tms_ilvaite_brick.png new file mode 100644 index 00000000..5f455098 Binary files /dev/null and b/mods/too_many_stones/textures/tms_ilvaite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_ilvaite_cobble.png b/mods/too_many_stones/textures/tms_ilvaite_cobble.png new file mode 100644 index 00000000..2c53692d Binary files /dev/null and b/mods/too_many_stones/textures/tms_ilvaite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_ilvaite_cracked_brick.png b/mods/too_many_stones/textures/tms_ilvaite_cracked_brick.png new file mode 100644 index 00000000..adc28740 Binary files /dev/null and b/mods/too_many_stones/textures/tms_ilvaite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_jade.png b/mods/too_many_stones/textures/tms_jade.png new file mode 100644 index 00000000..bb192b97 Binary files /dev/null and b/mods/too_many_stones/textures/tms_jade.png differ diff --git a/mods/too_many_stones/textures/tms_jade_block.png b/mods/too_many_stones/textures/tms_jade_block.png new file mode 100644 index 00000000..a291facd Binary files /dev/null and b/mods/too_many_stones/textures/tms_jade_block.png differ diff --git a/mods/too_many_stones/textures/tms_jade_brick.png b/mods/too_many_stones/textures/tms_jade_brick.png new file mode 100644 index 00000000..e5da5aee Binary files /dev/null and b/mods/too_many_stones/textures/tms_jade_brick.png differ diff --git a/mods/too_many_stones/textures/tms_jade_cobble.png b/mods/too_many_stones/textures/tms_jade_cobble.png new file mode 100644 index 00000000..cd2e02f9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_jade_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_jade_cracked_brick.png b/mods/too_many_stones/textures/tms_jade_cracked_brick.png new file mode 100644 index 00000000..dd3e604d Binary files /dev/null and b/mods/too_many_stones/textures/tms_jade_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_jasper_red.png b/mods/too_many_stones/textures/tms_jasper_red.png new file mode 100644 index 00000000..085083b1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_jasper_red.png differ diff --git a/mods/too_many_stones/textures/tms_jasper_red_block.png b/mods/too_many_stones/textures/tms_jasper_red_block.png new file mode 100644 index 00000000..3a0124b1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_jasper_red_block.png differ diff --git a/mods/too_many_stones/textures/tms_jasper_red_brick.png b/mods/too_many_stones/textures/tms_jasper_red_brick.png new file mode 100644 index 00000000..06c8adcf Binary files /dev/null and b/mods/too_many_stones/textures/tms_jasper_red_brick.png differ diff --git a/mods/too_many_stones/textures/tms_jasper_red_cobble.png b/mods/too_many_stones/textures/tms_jasper_red_cobble.png new file mode 100644 index 00000000..9d04af78 Binary files /dev/null and b/mods/too_many_stones/textures/tms_jasper_red_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_jasper_red_cracked_brick.png b/mods/too_many_stones/textures/tms_jasper_red_cracked_brick.png new file mode 100644 index 00000000..6de1b7d8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_jasper_red_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite.png b/mods/too_many_stones/textures/tms_kyanite.png new file mode 100644 index 00000000..9e032aa9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite_block.png b/mods/too_many_stones/textures/tms_kyanite_block.png new file mode 100644 index 00000000..b331714f Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite_block.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite_brick.png b/mods/too_many_stones/textures/tms_kyanite_brick.png new file mode 100644 index 00000000..1f0d3ef5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite_budding.png b/mods/too_many_stones/textures/tms_kyanite_budding.png new file mode 100644 index 00000000..86300755 Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite_cobble.png b/mods/too_many_stones/textures/tms_kyanite_cobble.png new file mode 100644 index 00000000..446cfaa2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite_cracked_brick.png b/mods/too_many_stones/textures/tms_kyanite_cracked_brick.png new file mode 100644 index 00000000..d4efe76d Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_kyanite_crystal.png b/mods/too_many_stones/textures/tms_kyanite_crystal.png new file mode 100644 index 00000000..3992adb0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_kyanite_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_lapis_lazuli.png b/mods/too_many_stones/textures/tms_lapis_lazuli.png new file mode 100644 index 00000000..fab4f293 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lapis_lazuli.png differ diff --git a/mods/too_many_stones/textures/tms_lapis_lazuli_block.png b/mods/too_many_stones/textures/tms_lapis_lazuli_block.png new file mode 100644 index 00000000..bb29f9f0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lapis_lazuli_block.png differ diff --git a/mods/too_many_stones/textures/tms_lapis_lazuli_brick.png b/mods/too_many_stones/textures/tms_lapis_lazuli_brick.png new file mode 100644 index 00000000..20c9cfb3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lapis_lazuli_brick.png differ diff --git a/mods/too_many_stones/textures/tms_lapis_lazuli_cracked_brick.png b/mods/too_many_stones/textures/tms_lapis_lazuli_cracked_brick.png new file mode 100644 index 00000000..d908cf28 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lapis_lazuli_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_lepidolite.png b/mods/too_many_stones/textures/tms_lepidolite.png new file mode 100644 index 00000000..bbac01c9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lepidolite.png differ diff --git a/mods/too_many_stones/textures/tms_lepidolite_block.png b/mods/too_many_stones/textures/tms_lepidolite_block.png new file mode 100644 index 00000000..02a58a1f Binary files /dev/null and b/mods/too_many_stones/textures/tms_lepidolite_block.png differ diff --git a/mods/too_many_stones/textures/tms_lepidolite_brick.png b/mods/too_many_stones/textures/tms_lepidolite_brick.png new file mode 100644 index 00000000..0d1249c0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lepidolite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_lepidolite_cobble.png b/mods/too_many_stones/textures/tms_lepidolite_cobble.png new file mode 100644 index 00000000..92ad89c7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_lepidolite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_lepidolite_cracked_brick.png b/mods/too_many_stones/textures/tms_lepidolite_cracked_brick.png new file mode 100644 index 00000000..72f7f4da Binary files /dev/null and b/mods/too_many_stones/textures/tms_lepidolite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_blue.png b/mods/too_many_stones/textures/tms_limestone_blue.png new file mode 100644 index 00000000..73fc5b36 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_blue.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_blue_block.png b/mods/too_many_stones/textures/tms_limestone_blue_block.png new file mode 100644 index 00000000..5f8f6c9e Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_blue_block.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_blue_brick.png b/mods/too_many_stones/textures/tms_limestone_blue_brick.png new file mode 100644 index 00000000..4630ef18 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_blue_brick.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_blue_cobble.png b/mods/too_many_stones/textures/tms_limestone_blue_cobble.png new file mode 100644 index 00000000..5f8615e3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_blue_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_blue_cracked_brick.png b/mods/too_many_stones/textures/tms_limestone_blue_cracked_brick.png new file mode 100644 index 00000000..885fdbe2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_blue_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_white.png b/mods/too_many_stones/textures/tms_limestone_white.png new file mode 100644 index 00000000..08bdbf43 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_white.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_white_block.png b/mods/too_many_stones/textures/tms_limestone_white_block.png new file mode 100644 index 00000000..da1c113c Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_white_block.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_white_brick.png b/mods/too_many_stones/textures/tms_limestone_white_brick.png new file mode 100644 index 00000000..b85d006a Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_white_brick.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_white_cobble.png b/mods/too_many_stones/textures/tms_limestone_white_cobble.png new file mode 100644 index 00000000..419d1918 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_white_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_limestone_white_cracked_brick.png b/mods/too_many_stones/textures/tms_limestone_white_cracked_brick.png new file mode 100644 index 00000000..f5a22116 Binary files /dev/null and b/mods/too_many_stones/textures/tms_limestone_white_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_marble.png b/mods/too_many_stones/textures/tms_marble.png new file mode 100644 index 00000000..f4a6da20 Binary files /dev/null and b/mods/too_many_stones/textures/tms_marble.png differ diff --git a/mods/too_many_stones/textures/tms_marble_block.png b/mods/too_many_stones/textures/tms_marble_block.png new file mode 100644 index 00000000..0e13f8d0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_marble_block.png differ diff --git a/mods/too_many_stones/textures/tms_marble_brick.png b/mods/too_many_stones/textures/tms_marble_brick.png new file mode 100644 index 00000000..0879f004 Binary files /dev/null and b/mods/too_many_stones/textures/tms_marble_brick.png differ diff --git a/mods/too_many_stones/textures/tms_marble_cobble.png b/mods/too_many_stones/textures/tms_marble_cobble.png new file mode 100644 index 00000000..d43d9a0d Binary files /dev/null and b/mods/too_many_stones/textures/tms_marble_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_marble_cracked_brick.png b/mods/too_many_stones/textures/tms_marble_cracked_brick.png new file mode 100644 index 00000000..ff889aa6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_marble_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_marble_rough.png b/mods/too_many_stones/textures/tms_marble_rough.png new file mode 100644 index 00000000..4f4e4c77 Binary files /dev/null and b/mods/too_many_stones/textures/tms_marble_rough.png differ diff --git a/mods/too_many_stones/textures/tms_mineral_turquoise.png b/mods/too_many_stones/textures/tms_mineral_turquoise.png new file mode 100644 index 00000000..62e2ac23 Binary files /dev/null and b/mods/too_many_stones/textures/tms_mineral_turquoise.png differ diff --git a/mods/too_many_stones/textures/tms_moonstone.png b/mods/too_many_stones/textures/tms_moonstone.png new file mode 100644 index 00000000..36f843d9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_moonstone.png differ diff --git a/mods/too_many_stones/textures/tms_moonstone_block.png b/mods/too_many_stones/textures/tms_moonstone_block.png new file mode 100644 index 00000000..ac175dbf Binary files /dev/null and b/mods/too_many_stones/textures/tms_moonstone_block.png differ diff --git a/mods/too_many_stones/textures/tms_moonstone_brick.png b/mods/too_many_stones/textures/tms_moonstone_brick.png new file mode 100644 index 00000000..c66cf111 Binary files /dev/null and b/mods/too_many_stones/textures/tms_moonstone_brick.png differ diff --git a/mods/too_many_stones/textures/tms_moonstone_budding.png b/mods/too_many_stones/textures/tms_moonstone_budding.png new file mode 100644 index 00000000..63fc27ef Binary files /dev/null and b/mods/too_many_stones/textures/tms_moonstone_budding.png differ diff --git a/mods/too_many_stones/textures/tms_moonstone_cracked_brick.png b/mods/too_many_stones/textures/tms_moonstone_cracked_brick.png new file mode 100644 index 00000000..df672bb0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_moonstone_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_moonstone_crystal.png b/mods/too_many_stones/textures/tms_moonstone_crystal.png new file mode 100644 index 00000000..127ef0f1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_moonstone_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_morion_quartz.png b/mods/too_many_stones/textures/tms_morion_quartz.png new file mode 100644 index 00000000..29f1fb91 Binary files /dev/null and b/mods/too_many_stones/textures/tms_morion_quartz.png differ diff --git a/mods/too_many_stones/textures/tms_morion_quartz_block.png b/mods/too_many_stones/textures/tms_morion_quartz_block.png new file mode 100644 index 00000000..5c3bc027 Binary files /dev/null and b/mods/too_many_stones/textures/tms_morion_quartz_block.png differ diff --git a/mods/too_many_stones/textures/tms_morion_quartz_brick.png b/mods/too_many_stones/textures/tms_morion_quartz_brick.png new file mode 100644 index 00000000..0fffdb1b Binary files /dev/null and b/mods/too_many_stones/textures/tms_morion_quartz_brick.png differ diff --git a/mods/too_many_stones/textures/tms_morion_quartz_budding.png b/mods/too_many_stones/textures/tms_morion_quartz_budding.png new file mode 100644 index 00000000..e70b7990 Binary files /dev/null and b/mods/too_many_stones/textures/tms_morion_quartz_budding.png differ diff --git a/mods/too_many_stones/textures/tms_morion_quartz_cracked_brick.png b/mods/too_many_stones/textures/tms_morion_quartz_cracked_brick.png new file mode 100644 index 00000000..5323c019 Binary files /dev/null and b/mods/too_many_stones/textures/tms_morion_quartz_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_morion_quartz_crystal.png b/mods/too_many_stones/textures/tms_morion_quartz_crystal.png new file mode 100644 index 00000000..e67952a0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_morion_quartz_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_mudstone.png b/mods/too_many_stones/textures/tms_mudstone.png new file mode 100644 index 00000000..b3ad6776 Binary files /dev/null and b/mods/too_many_stones/textures/tms_mudstone.png differ diff --git a/mods/too_many_stones/textures/tms_mudstone_block.png b/mods/too_many_stones/textures/tms_mudstone_block.png new file mode 100644 index 00000000..110bf9c3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_mudstone_block.png differ diff --git a/mods/too_many_stones/textures/tms_mudstone_brick.png b/mods/too_many_stones/textures/tms_mudstone_brick.png new file mode 100644 index 00000000..d47cc246 Binary files /dev/null and b/mods/too_many_stones/textures/tms_mudstone_brick.png differ diff --git a/mods/too_many_stones/textures/tms_mudstone_cobble.png b/mods/too_many_stones/textures/tms_mudstone_cobble.png new file mode 100644 index 00000000..a5a04fba Binary files /dev/null and b/mods/too_many_stones/textures/tms_mudstone_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_mudstone_cracked_brick.png b/mods/too_many_stones/textures/tms_mudstone_cracked_brick.png new file mode 100644 index 00000000..017fe08d Binary files /dev/null and b/mods/too_many_stones/textures/tms_mudstone_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_opal_animated.png b/mods/too_many_stones/textures/tms_opal_animated.png new file mode 100644 index 00000000..a02e534e Binary files /dev/null and b/mods/too_many_stones/textures/tms_opal_animated.png differ diff --git a/mods/too_many_stones/textures/tms_picture_jasper.png b/mods/too_many_stones/textures/tms_picture_jasper.png new file mode 100644 index 00000000..f1cd6fe0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_picture_jasper.png differ diff --git a/mods/too_many_stones/textures/tms_prasiolite.png b/mods/too_many_stones/textures/tms_prasiolite.png new file mode 100644 index 00000000..ab390eab Binary files /dev/null and b/mods/too_many_stones/textures/tms_prasiolite.png differ diff --git a/mods/too_many_stones/textures/tms_prasiolite_block.png b/mods/too_many_stones/textures/tms_prasiolite_block.png new file mode 100644 index 00000000..332a81ad Binary files /dev/null and b/mods/too_many_stones/textures/tms_prasiolite_block.png differ diff --git a/mods/too_many_stones/textures/tms_prasiolite_brick.png b/mods/too_many_stones/textures/tms_prasiolite_brick.png new file mode 100644 index 00000000..4287d368 Binary files /dev/null and b/mods/too_many_stones/textures/tms_prasiolite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_prasiolite_budding.png b/mods/too_many_stones/textures/tms_prasiolite_budding.png new file mode 100644 index 00000000..8f8d4ad2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_prasiolite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_prasiolite_cracked_brick.png b/mods/too_many_stones/textures/tms_prasiolite_cracked_brick.png new file mode 100644 index 00000000..4f07af0d Binary files /dev/null and b/mods/too_many_stones/textures/tms_prasiolite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_prasiolite_crystal.png b/mods/too_many_stones/textures/tms_prasiolite_crystal.png new file mode 100644 index 00000000..0ae9f5f3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_prasiolite_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_pumice.png b/mods/too_many_stones/textures/tms_pumice.png new file mode 100644 index 00000000..39fed25f Binary files /dev/null and b/mods/too_many_stones/textures/tms_pumice.png differ diff --git a/mods/too_many_stones/textures/tms_pumice_block.png b/mods/too_many_stones/textures/tms_pumice_block.png new file mode 100644 index 00000000..f7a0ae71 Binary files /dev/null and b/mods/too_many_stones/textures/tms_pumice_block.png differ diff --git a/mods/too_many_stones/textures/tms_pumice_brick.png b/mods/too_many_stones/textures/tms_pumice_brick.png new file mode 100644 index 00000000..f5e79db5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_pumice_brick.png differ diff --git a/mods/too_many_stones/textures/tms_pumice_cracked_brick.png b/mods/too_many_stones/textures/tms_pumice_cracked_brick.png new file mode 100644 index 00000000..4c2d5776 Binary files /dev/null and b/mods/too_many_stones/textures/tms_pumice_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_pyrite.png b/mods/too_many_stones/textures/tms_pyrite.png new file mode 100644 index 00000000..1fa15a6b Binary files /dev/null and b/mods/too_many_stones/textures/tms_pyrite.png differ diff --git a/mods/too_many_stones/textures/tms_pyrite_block.png b/mods/too_many_stones/textures/tms_pyrite_block.png new file mode 100644 index 00000000..d744bea3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_pyrite_block.png differ diff --git a/mods/too_many_stones/textures/tms_pyrite_brick.png b/mods/too_many_stones/textures/tms_pyrite_brick.png new file mode 100644 index 00000000..2b8a302a Binary files /dev/null and b/mods/too_many_stones/textures/tms_pyrite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_pyrite_cracked_brick.png b/mods/too_many_stones/textures/tms_pyrite_cracked_brick.png new file mode 100644 index 00000000..ca98d982 Binary files /dev/null and b/mods/too_many_stones/textures/tms_pyrite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_quartz.png b/mods/too_many_stones/textures/tms_quartz.png new file mode 100644 index 00000000..12987e00 Binary files /dev/null and b/mods/too_many_stones/textures/tms_quartz.png differ diff --git a/mods/too_many_stones/textures/tms_quartz_block.png b/mods/too_many_stones/textures/tms_quartz_block.png new file mode 100644 index 00000000..56dc61f8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_quartz_block.png differ diff --git a/mods/too_many_stones/textures/tms_quartz_brick.png b/mods/too_many_stones/textures/tms_quartz_brick.png new file mode 100644 index 00000000..1e831a8c Binary files /dev/null and b/mods/too_many_stones/textures/tms_quartz_brick.png differ diff --git a/mods/too_many_stones/textures/tms_quartz_budding.png b/mods/too_many_stones/textures/tms_quartz_budding.png new file mode 100644 index 00000000..2903e7bb Binary files /dev/null and b/mods/too_many_stones/textures/tms_quartz_budding.png differ diff --git a/mods/too_many_stones/textures/tms_quartz_cracked_brick.png b/mods/too_many_stones/textures/tms_quartz_cracked_brick.png new file mode 100644 index 00000000..b6158d56 Binary files /dev/null and b/mods/too_many_stones/textures/tms_quartz_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_quartz_crystal.png b/mods/too_many_stones/textures/tms_quartz_crystal.png new file mode 100644 index 00000000..44f058fc Binary files /dev/null and b/mods/too_many_stones/textures/tms_quartz_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_rhodonite.png b/mods/too_many_stones/textures/tms_rhodonite.png new file mode 100644 index 00000000..725e5ebb Binary files /dev/null and b/mods/too_many_stones/textures/tms_rhodonite.png differ diff --git a/mods/too_many_stones/textures/tms_rhodonite_block.png b/mods/too_many_stones/textures/tms_rhodonite_block.png new file mode 100644 index 00000000..a20d9a4b Binary files /dev/null and b/mods/too_many_stones/textures/tms_rhodonite_block.png differ diff --git a/mods/too_many_stones/textures/tms_rhodonite_brick.png b/mods/too_many_stones/textures/tms_rhodonite_brick.png new file mode 100644 index 00000000..ac1c60f3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_rhodonite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_rhodonite_cobble.png b/mods/too_many_stones/textures/tms_rhodonite_cobble.png new file mode 100644 index 00000000..613241e5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_rhodonite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_rhodonite_cracked_brick.png b/mods/too_many_stones/textures/tms_rhodonite_cracked_brick.png new file mode 100644 index 00000000..c26210e5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_rhodonite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_rose_quartz.png b/mods/too_many_stones/textures/tms_rose_quartz.png new file mode 100644 index 00000000..91e6a07a Binary files /dev/null and b/mods/too_many_stones/textures/tms_rose_quartz.png differ diff --git a/mods/too_many_stones/textures/tms_rose_quartz_block.png b/mods/too_many_stones/textures/tms_rose_quartz_block.png new file mode 100644 index 00000000..82a90d1a Binary files /dev/null and b/mods/too_many_stones/textures/tms_rose_quartz_block.png differ diff --git a/mods/too_many_stones/textures/tms_rose_quartz_brick.png b/mods/too_many_stones/textures/tms_rose_quartz_brick.png new file mode 100644 index 00000000..861a8a99 Binary files /dev/null and b/mods/too_many_stones/textures/tms_rose_quartz_brick.png differ diff --git a/mods/too_many_stones/textures/tms_rose_quartz_budding.png b/mods/too_many_stones/textures/tms_rose_quartz_budding.png new file mode 100644 index 00000000..7115b09b Binary files /dev/null and b/mods/too_many_stones/textures/tms_rose_quartz_budding.png differ diff --git a/mods/too_many_stones/textures/tms_rose_quartz_cracked_brick.png b/mods/too_many_stones/textures/tms_rose_quartz_cracked_brick.png new file mode 100644 index 00000000..9de826e7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_rose_quartz_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_rose_quartz_crystal.png b/mods/too_many_stones/textures/tms_rose_quartz_crystal.png new file mode 100644 index 00000000..20fdad49 Binary files /dev/null and b/mods/too_many_stones/textures/tms_rose_quartz_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_sandstone.png b/mods/too_many_stones/textures/tms_sandstone.png new file mode 100644 index 00000000..4960bc1e Binary files /dev/null and b/mods/too_many_stones/textures/tms_sandstone.png differ diff --git a/mods/too_many_stones/textures/tms_scoria.png b/mods/too_many_stones/textures/tms_scoria.png new file mode 100644 index 00000000..9efac999 Binary files /dev/null and b/mods/too_many_stones/textures/tms_scoria.png differ diff --git a/mods/too_many_stones/textures/tms_scoria_block.png b/mods/too_many_stones/textures/tms_scoria_block.png new file mode 100644 index 00000000..62b6694d Binary files /dev/null and b/mods/too_many_stones/textures/tms_scoria_block.png differ diff --git a/mods/too_many_stones/textures/tms_scoria_brick.png b/mods/too_many_stones/textures/tms_scoria_brick.png new file mode 100644 index 00000000..e911efe8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_scoria_brick.png differ diff --git a/mods/too_many_stones/textures/tms_scoria_cobble.png b/mods/too_many_stones/textures/tms_scoria_cobble.png new file mode 100644 index 00000000..cf82818a Binary files /dev/null and b/mods/too_many_stones/textures/tms_scoria_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_scoria_cobble_alt.png b/mods/too_many_stones/textures/tms_scoria_cobble_alt.png new file mode 100644 index 00000000..1bef7a18 Binary files /dev/null and b/mods/too_many_stones/textures/tms_scoria_cobble_alt.png differ diff --git a/mods/too_many_stones/textures/tms_scoria_cracked_brick.png b/mods/too_many_stones/textures/tms_scoria_cracked_brick.png new file mode 100644 index 00000000..8be3c52d Binary files /dev/null and b/mods/too_many_stones/textures/tms_scoria_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_serpentine.png b/mods/too_many_stones/textures/tms_serpentine.png new file mode 100644 index 00000000..01607c58 Binary files /dev/null and b/mods/too_many_stones/textures/tms_serpentine.png differ diff --git a/mods/too_many_stones/textures/tms_serpentine_block.png b/mods/too_many_stones/textures/tms_serpentine_block.png new file mode 100644 index 00000000..6f64ecd7 Binary files /dev/null and b/mods/too_many_stones/textures/tms_serpentine_block.png differ diff --git a/mods/too_many_stones/textures/tms_serpentine_brick.png b/mods/too_many_stones/textures/tms_serpentine_brick.png new file mode 100644 index 00000000..b36cac80 Binary files /dev/null and b/mods/too_many_stones/textures/tms_serpentine_brick.png differ diff --git a/mods/too_many_stones/textures/tms_serpentine_cobble.png b/mods/too_many_stones/textures/tms_serpentine_cobble.png new file mode 100644 index 00000000..f3ff3d09 Binary files /dev/null and b/mods/too_many_stones/textures/tms_serpentine_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_serpentine_cracked_brick.png b/mods/too_many_stones/textures/tms_serpentine_cracked_brick.png new file mode 100644 index 00000000..86b2ec3c Binary files /dev/null and b/mods/too_many_stones/textures/tms_serpentine_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_shale.png b/mods/too_many_stones/textures/tms_shale.png new file mode 100644 index 00000000..85d011e1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_shale.png differ diff --git a/mods/too_many_stones/textures/tms_shale_block.png b/mods/too_many_stones/textures/tms_shale_block.png new file mode 100644 index 00000000..a7efc735 Binary files /dev/null and b/mods/too_many_stones/textures/tms_shale_block.png differ diff --git a/mods/too_many_stones/textures/tms_shale_brick.png b/mods/too_many_stones/textures/tms_shale_brick.png new file mode 100644 index 00000000..e892b930 Binary files /dev/null and b/mods/too_many_stones/textures/tms_shale_brick.png differ diff --git a/mods/too_many_stones/textures/tms_shale_cobble.png b/mods/too_many_stones/textures/tms_shale_cobble.png new file mode 100644 index 00000000..2237aa13 Binary files /dev/null and b/mods/too_many_stones/textures/tms_shale_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_shale_cracked_brick.png b/mods/too_many_stones/textures/tms_shale_cracked_brick.png new file mode 100644 index 00000000..9f472530 Binary files /dev/null and b/mods/too_many_stones/textures/tms_shale_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_silver_sandstone.png b/mods/too_many_stones/textures/tms_silver_sandstone.png new file mode 100644 index 00000000..345eebe9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_silver_sandstone.png differ diff --git a/mods/too_many_stones/textures/tms_slate.png b/mods/too_many_stones/textures/tms_slate.png new file mode 100644 index 00000000..2333620a Binary files /dev/null and b/mods/too_many_stones/textures/tms_slate.png differ diff --git a/mods/too_many_stones/textures/tms_slate_block.png b/mods/too_many_stones/textures/tms_slate_block.png new file mode 100644 index 00000000..743a54f1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_slate_block.png differ diff --git a/mods/too_many_stones/textures/tms_slate_brick.png b/mods/too_many_stones/textures/tms_slate_brick.png new file mode 100644 index 00000000..9958967a Binary files /dev/null and b/mods/too_many_stones/textures/tms_slate_brick.png differ diff --git a/mods/too_many_stones/textures/tms_slate_cobble.png b/mods/too_many_stones/textures/tms_slate_cobble.png new file mode 100644 index 00000000..d0e4888c Binary files /dev/null and b/mods/too_many_stones/textures/tms_slate_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_slate_cracked_brick.png b/mods/too_many_stones/textures/tms_slate_cracked_brick.png new file mode 100644 index 00000000..dd8a6014 Binary files /dev/null and b/mods/too_many_stones/textures/tms_slate_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_slate_tile.png b/mods/too_many_stones/textures/tms_slate_tile.png new file mode 100644 index 00000000..58d877e2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_slate_tile.png differ diff --git a/mods/too_many_stones/textures/tms_smokey_quartz.png b/mods/too_many_stones/textures/tms_smokey_quartz.png new file mode 100644 index 00000000..a8f8e6b4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_smokey_quartz.png differ diff --git a/mods/too_many_stones/textures/tms_smokey_quartz_block.png b/mods/too_many_stones/textures/tms_smokey_quartz_block.png new file mode 100644 index 00000000..d1192334 Binary files /dev/null and b/mods/too_many_stones/textures/tms_smokey_quartz_block.png differ diff --git a/mods/too_many_stones/textures/tms_smokey_quartz_brick.png b/mods/too_many_stones/textures/tms_smokey_quartz_brick.png new file mode 100644 index 00000000..be0425be Binary files /dev/null and b/mods/too_many_stones/textures/tms_smokey_quartz_brick.png differ diff --git a/mods/too_many_stones/textures/tms_smokey_quartz_budding.png b/mods/too_many_stones/textures/tms_smokey_quartz_budding.png new file mode 100644 index 00000000..d92f2d34 Binary files /dev/null and b/mods/too_many_stones/textures/tms_smokey_quartz_budding.png differ diff --git a/mods/too_many_stones/textures/tms_smokey_quartz_cracked_brick.png b/mods/too_many_stones/textures/tms_smokey_quartz_cracked_brick.png new file mode 100644 index 00000000..42d3894e Binary files /dev/null and b/mods/too_many_stones/textures/tms_smokey_quartz_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_smokey_quartz_crystal.png b/mods/too_many_stones/textures/tms_smokey_quartz_crystal.png new file mode 100644 index 00000000..7521778e Binary files /dev/null and b/mods/too_many_stones/textures/tms_smokey_quartz_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_soapstone.png b/mods/too_many_stones/textures/tms_soapstone.png new file mode 100644 index 00000000..b27c9fa9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_soapstone.png differ diff --git a/mods/too_many_stones/textures/tms_soapstone_block.png b/mods/too_many_stones/textures/tms_soapstone_block.png new file mode 100644 index 00000000..2d97512a Binary files /dev/null and b/mods/too_many_stones/textures/tms_soapstone_block.png differ diff --git a/mods/too_many_stones/textures/tms_soapstone_brick.png b/mods/too_many_stones/textures/tms_soapstone_brick.png new file mode 100644 index 00000000..19f12fcc Binary files /dev/null and b/mods/too_many_stones/textures/tms_soapstone_brick.png differ diff --git a/mods/too_many_stones/textures/tms_soapstone_cracked_brick.png b/mods/too_many_stones/textures/tms_soapstone_cracked_brick.png new file mode 100644 index 00000000..faa36024 Binary files /dev/null and b/mods/too_many_stones/textures/tms_soapstone_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_sodalite.png b/mods/too_many_stones/textures/tms_sodalite.png new file mode 100644 index 00000000..1d3f04c9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_sodalite.png differ diff --git a/mods/too_many_stones/textures/tms_sodalite_block.png b/mods/too_many_stones/textures/tms_sodalite_block.png new file mode 100644 index 00000000..acc71124 Binary files /dev/null and b/mods/too_many_stones/textures/tms_sodalite_block.png differ diff --git a/mods/too_many_stones/textures/tms_sodalite_brick.png b/mods/too_many_stones/textures/tms_sodalite_brick.png new file mode 100644 index 00000000..110a9c7f Binary files /dev/null and b/mods/too_many_stones/textures/tms_sodalite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_sodalite_cobble.png b/mods/too_many_stones/textures/tms_sodalite_cobble.png new file mode 100644 index 00000000..a4ab7a89 Binary files /dev/null and b/mods/too_many_stones/textures/tms_sodalite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_sodalite_cracked_brick.png b/mods/too_many_stones/textures/tms_sodalite_cracked_brick.png new file mode 100644 index 00000000..1fa7f577 Binary files /dev/null and b/mods/too_many_stones/textures/tms_sodalite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_sugilite.png b/mods/too_many_stones/textures/tms_sugilite.png new file mode 100644 index 00000000..173b763b Binary files /dev/null and b/mods/too_many_stones/textures/tms_sugilite.png differ diff --git a/mods/too_many_stones/textures/tms_sugilite_block.png b/mods/too_many_stones/textures/tms_sugilite_block.png new file mode 100644 index 00000000..937e7102 Binary files /dev/null and b/mods/too_many_stones/textures/tms_sugilite_block.png differ diff --git a/mods/too_many_stones/textures/tms_sugilite_brick.png b/mods/too_many_stones/textures/tms_sugilite_brick.png new file mode 100644 index 00000000..37b84cdf Binary files /dev/null and b/mods/too_many_stones/textures/tms_sugilite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_sugilite_cobble.png b/mods/too_many_stones/textures/tms_sugilite_cobble.png new file mode 100644 index 00000000..b347b37c Binary files /dev/null and b/mods/too_many_stones/textures/tms_sugilite_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_sugilite_cracked_brick.png b/mods/too_many_stones/textures/tms_sugilite_cracked_brick.png new file mode 100644 index 00000000..35c1553c Binary files /dev/null and b/mods/too_many_stones/textures/tms_sugilite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_green.png b/mods/too_many_stones/textures/tms_tourmaline_green.png new file mode 100644 index 00000000..326c34ee Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_green.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_green_block.png b/mods/too_many_stones/textures/tms_tourmaline_green_block.png new file mode 100644 index 00000000..a70e04ee Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_green_block.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_green_brick.png b/mods/too_many_stones/textures/tms_tourmaline_green_brick.png new file mode 100644 index 00000000..62312d72 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_green_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_green_budding.png b/mods/too_many_stones/textures/tms_tourmaline_green_budding.png new file mode 100644 index 00000000..59c423b3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_green_budding.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_green_cracked_brick.png b/mods/too_many_stones/textures/tms_tourmaline_green_cracked_brick.png new file mode 100644 index 00000000..5efd63ef Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_green_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_green_crystal.png b/mods/too_many_stones/textures/tms_tourmaline_green_crystal.png new file mode 100644 index 00000000..e3d8bcfc Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_green_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_paraiba.png b/mods/too_many_stones/textures/tms_tourmaline_paraiba.png new file mode 100644 index 00000000..0304653f Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_paraiba.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_paraiba_block.png b/mods/too_many_stones/textures/tms_tourmaline_paraiba_block.png new file mode 100644 index 00000000..045893a3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_paraiba_block.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_paraiba_brick.png b/mods/too_many_stones/textures/tms_tourmaline_paraiba_brick.png new file mode 100644 index 00000000..af7289c0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_paraiba_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_paraiba_budding.png b/mods/too_many_stones/textures/tms_tourmaline_paraiba_budding.png new file mode 100644 index 00000000..60c94fe3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_paraiba_budding.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_paraiba_cracked_brick.png b/mods/too_many_stones/textures/tms_tourmaline_paraiba_cracked_brick.png new file mode 100644 index 00000000..26be4c09 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_paraiba_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_paraiba_crystal.png b/mods/too_many_stones/textures/tms_tourmaline_paraiba_crystal.png new file mode 100644 index 00000000..ceecf5ad Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_paraiba_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_pink.png b/mods/too_many_stones/textures/tms_tourmaline_pink.png new file mode 100644 index 00000000..f0526135 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_pink.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_pink_block.png b/mods/too_many_stones/textures/tms_tourmaline_pink_block.png new file mode 100644 index 00000000..5bd16159 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_pink_block.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_pink_brick.png b/mods/too_many_stones/textures/tms_tourmaline_pink_brick.png new file mode 100644 index 00000000..156bb4b5 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_pink_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_pink_budding.png b/mods/too_many_stones/textures/tms_tourmaline_pink_budding.png new file mode 100644 index 00000000..35517e4c Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_pink_budding.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_pink_cracked_brick.png b/mods/too_many_stones/textures/tms_tourmaline_pink_cracked_brick.png new file mode 100644 index 00000000..67d345b0 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_pink_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tourmaline_pink_crystal.png b/mods/too_many_stones/textures/tms_tourmaline_pink_crystal.png new file mode 100644 index 00000000..05e3a8b3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tourmaline_pink_crystal.png differ diff --git a/mods/too_many_stones/textures/tms_travertine.png b/mods/too_many_stones/textures/tms_travertine.png new file mode 100644 index 00000000..0b0afd21 Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_block.png b/mods/too_many_stones/textures/tms_travertine_block.png new file mode 100644 index 00000000..9ec45dd4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_block.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_brick.png b/mods/too_many_stones/textures/tms_travertine_brick.png new file mode 100644 index 00000000..0fd0bead Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_brick.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_cobble.png b/mods/too_many_stones/textures/tms_travertine_cobble.png new file mode 100644 index 00000000..b59ac6b2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_cracked_brick.png b/mods/too_many_stones/textures/tms_travertine_cracked_brick.png new file mode 100644 index 00000000..87bfdbcc Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_yellow.png b/mods/too_many_stones/textures/tms_travertine_yellow.png new file mode 100644 index 00000000..e789416d Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_yellow.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_yellow_block.png b/mods/too_many_stones/textures/tms_travertine_yellow_block.png new file mode 100644 index 00000000..2732e8f2 Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_yellow_block.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_yellow_brick.png b/mods/too_many_stones/textures/tms_travertine_yellow_brick.png new file mode 100644 index 00000000..2904e2ae Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_yellow_brick.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_yellow_cobble.png b/mods/too_many_stones/textures/tms_travertine_yellow_cobble.png new file mode 100644 index 00000000..ff54c166 Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_yellow_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_travertine_yellow_cracked_brick.png b/mods/too_many_stones/textures/tms_travertine_yellow_cracked_brick.png new file mode 100644 index 00000000..cce1615e Binary files /dev/null and b/mods/too_many_stones/textures/tms_travertine_yellow_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_beige.png b/mods/too_many_stones/textures/tms_tuff_beige.png new file mode 100644 index 00000000..4da719d1 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_beige.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_beige_block.png b/mods/too_many_stones/textures/tms_tuff_beige_block.png new file mode 100644 index 00000000..b13cf82a Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_beige_block.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_beige_brick.png b/mods/too_many_stones/textures/tms_tuff_beige_brick.png new file mode 100644 index 00000000..f234ed1b Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_beige_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_beige_cobble.png b/mods/too_many_stones/textures/tms_tuff_beige_cobble.png new file mode 100644 index 00000000..dad44201 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_beige_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_beige_cracked_brick.png b/mods/too_many_stones/textures/tms_tuff_beige_cracked_brick.png new file mode 100644 index 00000000..677b4763 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_beige_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_grey.png b/mods/too_many_stones/textures/tms_tuff_grey.png new file mode 100644 index 00000000..36b81faa Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_grey.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_grey_block.png b/mods/too_many_stones/textures/tms_tuff_grey_block.png new file mode 100644 index 00000000..2b3375d4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_grey_block.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_grey_brick.png b/mods/too_many_stones/textures/tms_tuff_grey_brick.png new file mode 100644 index 00000000..8a902af4 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_grey_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_grey_cobble.png b/mods/too_many_stones/textures/tms_tuff_grey_cobble.png new file mode 100644 index 00000000..da02f9cc Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_grey_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_grey_cracked_brick.png b/mods/too_many_stones/textures/tms_tuff_grey_cracked_brick.png new file mode 100644 index 00000000..04614315 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_grey_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_red.png b/mods/too_many_stones/textures/tms_tuff_red.png new file mode 100644 index 00000000..8b108b3a Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_red.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_red_block.png b/mods/too_many_stones/textures/tms_tuff_red_block.png new file mode 100644 index 00000000..9ddfc323 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_red_block.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_red_brick.png b/mods/too_many_stones/textures/tms_tuff_red_brick.png new file mode 100644 index 00000000..840ab775 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_red_brick.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_red_cobble.png b/mods/too_many_stones/textures/tms_tuff_red_cobble.png new file mode 100644 index 00000000..9f11f4db Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_red_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_tuff_red_cracked_brick.png b/mods/too_many_stones/textures/tms_tuff_red_cracked_brick.png new file mode 100644 index 00000000..7d9811e8 Binary files /dev/null and b/mods/too_many_stones/textures/tms_tuff_red_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_turquoise.png b/mods/too_many_stones/textures/tms_turquoise.png new file mode 100644 index 00000000..f05e1c06 Binary files /dev/null and b/mods/too_many_stones/textures/tms_turquoise.png differ diff --git a/mods/too_many_stones/textures/tms_turquoise_block.png b/mods/too_many_stones/textures/tms_turquoise_block.png new file mode 100644 index 00000000..c2853a4e Binary files /dev/null and b/mods/too_many_stones/textures/tms_turquoise_block.png differ diff --git a/mods/too_many_stones/textures/tms_turquoise_brick.png b/mods/too_many_stones/textures/tms_turquoise_brick.png new file mode 100644 index 00000000..e2d2f730 Binary files /dev/null and b/mods/too_many_stones/textures/tms_turquoise_brick.png differ diff --git a/mods/too_many_stones/textures/tms_turquoise_cobble.png b/mods/too_many_stones/textures/tms_turquoise_cobble.png new file mode 100644 index 00000000..729e15e6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_turquoise_cobble.png differ diff --git a/mods/too_many_stones/textures/tms_turquoise_cracked_brick.png b/mods/too_many_stones/textures/tms_turquoise_cracked_brick.png new file mode 100644 index 00000000..0595a2a9 Binary files /dev/null and b/mods/too_many_stones/textures/tms_turquoise_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_turquoise_pebble.png b/mods/too_many_stones/textures/tms_turquoise_pebble.png new file mode 100644 index 00000000..4312dcdf Binary files /dev/null and b/mods/too_many_stones/textures/tms_turquoise_pebble.png differ diff --git a/mods/too_many_stones/textures/tms_vivianite.png b/mods/too_many_stones/textures/tms_vivianite.png new file mode 100644 index 00000000..10386cf6 Binary files /dev/null and b/mods/too_many_stones/textures/tms_vivianite.png differ diff --git a/mods/too_many_stones/textures/tms_vivianite_block.png b/mods/too_many_stones/textures/tms_vivianite_block.png new file mode 100644 index 00000000..b575a00b Binary files /dev/null and b/mods/too_many_stones/textures/tms_vivianite_block.png differ diff --git a/mods/too_many_stones/textures/tms_vivianite_brick.png b/mods/too_many_stones/textures/tms_vivianite_brick.png new file mode 100644 index 00000000..4d4471f3 Binary files /dev/null and b/mods/too_many_stones/textures/tms_vivianite_brick.png differ diff --git a/mods/too_many_stones/textures/tms_vivianite_budding.png b/mods/too_many_stones/textures/tms_vivianite_budding.png new file mode 100644 index 00000000..840e34db Binary files /dev/null and b/mods/too_many_stones/textures/tms_vivianite_budding.png differ diff --git a/mods/too_many_stones/textures/tms_vivianite_cracked_brick.png b/mods/too_many_stones/textures/tms_vivianite_cracked_brick.png new file mode 100644 index 00000000..f73d619a Binary files /dev/null and b/mods/too_many_stones/textures/tms_vivianite_cracked_brick.png differ diff --git a/mods/too_many_stones/textures/tms_vivianite_crystal.png b/mods/too_many_stones/textures/tms_vivianite_crystal.png new file mode 100644 index 00000000..3b526856 Binary files /dev/null and b/mods/too_many_stones/textures/tms_vivianite_crystal.png differ diff --git a/mods/too_many_stones/wall.lua b/mods/too_many_stones/wall.lua new file mode 100644 index 00000000..75889b88 --- /dev/null +++ b/mods/too_many_stones/wall.lua @@ -0,0 +1,956 @@ +-- support for MT game translation. +local S = minetest.get_translator("too_many_stones") + +if minetest.get_modpath("walls") ~= nil then +-- Blue Agate +walls.register("too_many_stones:agate_blue_wall", S("Blue Agate Wall"), "tms_agate_blue.png", + "too_many_stones:agate_blue", too_many_stones.node_sound_glass_defaults()) +-- Gray Agate +walls.register("too_many_stones:agate_gray_wall", S("Gray Agate Wall"), "tms_agate_gray.png", + "too_many_stones:agate_gray", too_many_stones.node_sound_glass_defaults()) +-- Green Agate +walls.register("too_many_stones:agate_green_wall", S("Green Agate Wall"), "tms_agate_green.png", + "too_many_stones:agate_green", too_many_stones.node_sound_glass_defaults()) +-- Moss Agate +walls.register("too_many_stones:agate_moss_wall", S("Moss Agate Wall"), "tms_agate_moss.png", + "too_many_stones:agate_moss", too_many_stones.node_sound_glass_defaults()) +-- Orange Agate +walls.register("too_many_stones:agate_orange_wall", S("Orange Agate Wall"), "tms_agate_orange.png", + "too_many_stones:agate_orange", too_many_stones.node_sound_glass_defaults()) +-- Purple Agate +walls.register("too_many_stones:agate_purple_wall", S("Purple Agate Wall"), "tms_agate_purple.png", + "too_many_stones:agate_purple", too_many_stones.node_sound_glass_defaults()) +-- Red Agate +walls.register("too_many_stones:agate_red_wall", S("Red Agate Wall"), "tms_agate_red.png", + "too_many_stones:agate_red", too_many_stones.node_sound_glass_defaults()) +-- Amazonite +walls.register("too_many_stones:amazonite_wall", S("Amazonite Wall"), "tms_amazonite.png", + "too_many_stones:amazonite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amazonite_brick_wall", S("Amazonite Brick Wall"), "tms_amazonite_brick.png", + "too_many_stones:amazonite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amazonite_cracked_brick_wall", S("Cracked Amazonite Brick Wall"), "tms_amazonite_cracked_brick.png", + "too_many_stones:amazonite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amazonite_block_wall", S("Amazonite Block Wall"), "tms_amazonite_block.png", + "too_many_stones:amazonite_block", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amazonite_cobble_wall", S("Cobbled Amazonite Wall"), "tms_amazonite_cobble.png", + "too_many_stones:amazonite_cobble", too_many_stones.node_sound_glass_defaults()) +-- Amber +walls.register("too_many_stones:amber_wall", S("Amber Wall"), "tms_amber.png", + "too_many_stones:amber", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amber_brick_wall", S("Amber Brick Wall"), "tms_amber_brick.png", + "too_many_stones:amber_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amber_cracked_brick_wall", S("Cracked Amber Brick Wall"), "tms_amber_cracked_brick.png", + "too_many_stones:amber_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amber_block_wall", S("Amber Block Wall"), "tms_amber_block.png", + "too_many_stones:amber_block", too_many_stones.node_sound_glass_defaults()) +-- Amethyst +walls.register("too_many_stones:amethyst_wall", S("Amethyst Wall"), "tms_amethyst.png", + "too_many_stones:amethyst", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amethyst_brick_wall", S("Amethyst Brick Wall"), "tms_amethyst_brick.png", + "too_many_stones:amethyst_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amethyst_cracked_brick_wall", S("Cracked Amethyst Brick Wall"), "tms_amethyst_cracked_brick.png", + "too_many_stones:amethyst_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:amethyst_block_wall", S("Amethyst Block Wall"), "tms_amethyst_block.png", + "too_many_stones:amethyst_block", too_many_stones.node_sound_glass_defaults()) +-- Andesite +walls.register("too_many_stones:andesite_wall", S("Andesite Wall"), "tms_andesite.png", + "too_many_stones:andesite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:andesite_brick_wall", S("Andesite Brick Wall"), "tms_andesite_brick.png", + "too_many_stones:andesite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:andesite_cracked_brick_wall", S("Cracked Andesite Brick Wall"), "tms_andesite_cracked_brick.png", + "too_many_stones:andesite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:andesite_block_wall", S("Andesite Block Wall"), "tms_andesite_block.png", + "too_many_stones:andesite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:andesite_cobble_wall", S("Cobbled Andesite Wall"), "tms_andesite_cobble.png", + "too_many_stones:andesite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Basalt +walls.register("too_many_stones:basalt_wall", S("Basalt Wall"), "tms_basalt.png", + "too_many_stones:basalt", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:basalt_brick_wall", S("Basalt Brick Wall"), "tms_basalt_brick.png", + "too_many_stones:basalt_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:basalt_cracked_brick_wall", S("Cracked Basalt Brick Wall"), "tms_basalt_cracked_brick.png", + "too_many_stones:basalt_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:basalt_block_wall", S("Basalt Block Wall"), "tms_basalt_block.png", + "too_many_stones:basalt_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:basalt_cobble_wall", S("Cobbled Basalt Wall"), "tms_basalt_cobble.png", + "too_many_stones:basalt_cobble", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:basalt_tile_wall", S("Basalt Tile Wall"), "tms_basalt_tile.png", + "too_many_stones:basalt_tile", too_many_stones.node_sound_stone_defaults()) +-- Black Moonstone +walls.register("too_many_stones:black_moonstone_wall", S("Black Moonstone Wall"), "tms_black_moonstone.png", + "too_many_stones:black_moonstone", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:black_moonstone_brick_wall", S("Black Moonstone Brick Wall"), "tms_black_moonstone_brick.png", + "too_many_stones:black_moonstone_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:black_moonstone_cracked_brick_wall", S("Cracked Black Moonstone Brick Wall"), "tms_black_moonstone_cracked_brick.png", + "too_many_stones:black_moonstone_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:black_moonstone_block_wall", S("Black Moonstone Block Wall"), "tms_black_moonstone_block.png", + "too_many_stones:black_moonstone_block", too_many_stones.node_sound_glass_defaults()) +-- Grey Calcite +walls.register("too_many_stones:calcite_grey_wall", S("Grey Calcite Wall"), "tms_calcite_grey.png", + "too_many_stones:calcite_grey", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_grey_brick_wall", S("Grey Calcite Brick Wall"), "tms_calcite_grey_brick.png", + "too_many_stones:calcite_grey_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_grey_cracked_brick_wall", S("Cracked Grey Calcite Brick Wall"), "tms_calcite_grey_cracked_brick.png", + "too_many_stones:calcite_grey_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_grey_block_wall", S("Grey Calcite Block Wall"), "tms_calcite_grey_block.png", + "too_many_stones:calcite_grey_block", too_many_stones.node_sound_glass_defaults()) +-- Calcite +walls.register("too_many_stones:calcite_wall", S("Calcite Wall"), "tms_calcite.png", + "too_many_stones:calcite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_brick_wall", S("Calcite Brick Wall"), "tms_calcite_brick.png", + "too_many_stones:calcite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_cracked_brick_wall", S("Cracked Calcite Brick Wall"), "tms_calcite_cracked_brick.png", + "too_many_stones:calcite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_block_wall", S("Calcite Block Wall"), "tms_calcite_block.png", + "too_many_stones:calcite_block", too_many_stones.node_sound_glass_defaults()) +-- Orange Calcite +walls.register("too_many_stones:calcite_orange_wall", S("Orange Calcite Wall"), "tms_calcite_orange.png", + "too_many_stones:calcite_orange", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_orange_brick_wall", S("Orange Calcite Brick Wall"), "tms_calcite_orange_brick.png", + "too_many_stones:calcite_orange_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_orange_cracked_brick_wall", S("Cracked Orange Calcite Brick Wall"), "tms_calcite_orange_cracked_brick.png", + "too_many_stones:calcite_orange_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:calcite_orange_block_wall", S("Orange Calcite Block Wall"), "tms_calcite_orange_block.png", + "too_many_stones:calcite_orange_block", too_many_stones.node_sound_glass_defaults()) +-- Carnotite +walls.register("too_many_stones:carnotite_wall", S("Carnotite Wall"), "tms_carnotite.png", + "too_many_stones:carnotite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:carnotite_brick_wall", S("Carnotite Brick Wall"), "tms_carnotite_brick.png", + "too_many_stones:carnotite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:carnotite_cracked_brick_wall", S("Cracked Carnotite Brick Wall"), "tms_carnotite_cracked_brick.png", + "too_many_stones:carnotite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:carnotite_block_wall", S("Carnotite Block Wall"), "tms_carnotite_block.png", + "too_many_stones:carnotite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:carnotite_cobble_wall", S("Cobbled Carnotite Wall"), "tms_carnotite_cobble.png", + "too_many_stones:carnotite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Celestine +walls.register("too_many_stones:celestine_wall", S("Celestine Wall"), "tms_celestine.png", + "too_many_stones:celestine", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:celestine_brick_wall", S("Celestine Brick Wall"), "tms_celestine_brick.png", + "too_many_stones:celestine_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:celestine_cracked_brick_wall", S("Cracked Celestine Brick Wall"), "tms_celestine_cracked_brick.png", + "too_many_stones:celestine_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:celestine_block_wall", S("Celestine Block Wall"), "tms_celestine_block.png", + "too_many_stones:celestine_block", too_many_stones.node_sound_glass_defaults()) +-- Chalcanthite +walls.register("too_many_stones:chalcanthite_wall", S("Chalcanthite Wall"), "tms_chalcanthite.png", + "too_many_stones:chalcanthite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:chalcanthite_brick_wall", S("Chalcanthite Brick Wall"), "tms_chalcanthite_brick.png", + "too_many_stones:chalcanthite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:chalcanthite_cracked_brick_wall", S("Cracked Chalcanthite Brick Wall"), "tms_chalcanthite_cracked_brick.png", + "too_many_stones:chalcanthite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:chalcanthite_block_wall", S("Chalcanthite Block Wall"), "tms_chalcanthite_block.png", + "too_many_stones:chalcanthite_block", too_many_stones.node_sound_glass_defaults()) +-- Chrysoprase +walls.register("too_many_stones:chrysoprase_wall", S("Chrysoprase Wall"), "tms_chrysoprase.png", + "too_many_stones:chrysoprase", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:chrysoprase_brick_wall", S("Chrysoprase Brick Wall"), "tms_chrysoprase_brick.png", + "too_many_stones:chrysoprase_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:chrysoprase_cracked_brick_wall", S("Cracked Chrysoprase Brick Wall"), "tms_chrysoprase_cracked_brick.png", + "too_many_stones:chrysoprase_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:chrysoprase_block_wall", S("Chrysoprase Block Wall"), "tms_chrysoprase_block.png", + "too_many_stones:chrysoprase_block", too_many_stones.node_sound_glass_defaults()) +-- Citrine +walls.register("too_many_stones:citrine_wall", S("Citrine Wall"), "tms_citrine.png", + "too_many_stones:citrine", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:citrine_brick_wall", S("Citrine Brick Wall"), "tms_citrine_brick.png", + "too_many_stones:citrine_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:citrine_cracked_brick_wall", S("Cracked Citrine Brick Wall"), "tms_citrine_cracked_brick.png", + "too_many_stones:citrine_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:citrine_block_wall", S("Citrine Block Wall"), "tms_citrine_block.png", + "too_many_stones:citrine_block", too_many_stones.node_sound_glass_defaults()) +-- Covellite +walls.register("too_many_stones:covellite_wall", S("Covellite Wall"), "tms_covellite.png", + "too_many_stones:covellite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:covellite_brick_wall", S("Covellite Brick Wall"), "tms_covellite_brick.png", + "too_many_stones:covellite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:covellite_cracked_brick_wall", S("Cracked Covellite Brick Wall"), "tms_covellite_cracked_brick.png", + "too_many_stones:covellite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:covellite_block_wall", S("Covellite Block Wall"), "tms_covellite_block.png", + "too_many_stones:covellite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:covellite_cobble_wall", S("Cobbled Covellite Wall"), "tms_covellite_cobble.png", + "too_many_stones:covellite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Crocoite +walls.register("too_many_stones:crocoite_wall", S("Crocoite Wall"), "tms_crocoite.png", + "too_many_stones:crocoite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:crocoite_brick_wall", S("Crocoite Brick Wall"), "tms_crocoite_brick.png", + "too_many_stones:crocoite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:crocoite_cracked_brick_wall", S("Cracked Crocoite Brick Wall"), "tms_crocoite_cracked_brick.png", + "too_many_stones:crocoite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:crocoite_block_wall", S("Crocoite Block Wall"), "tms_crocoite_block.png", + "too_many_stones:crocoite_block", too_many_stones.node_sound_glass_defaults()) +-- Diorite +walls.register("too_many_stones:diorite_wall", S("Diorite Wall"), "tms_diorite.png", + "too_many_stones:diorite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:diorite_brick_wall", S("Diorite Brick Wall"), "tms_diorite_brick.png", + "too_many_stones:diorite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:diorite_cracked_brick_wall", S("Cracked Diorite Brick Wall"), "tms_diorite_cracked_brick.png", + "too_many_stones:diorite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:diorite_block_wall", S("Diorite Block Wall"), "tms_diorite_block.png", + "too_many_stones:diorite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:diorite_cobble_wall", S("Cobbled Diorite Wall"), "tms_diorite_cobble.png", + "too_many_stones:diorite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Erythrite +walls.register("too_many_stones:erythrite_wall", S("Erythrite Wall"), "tms_erythrite.png", + "too_many_stones:erythrite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:erythrite_brick_wall", S("Erythrite Brick Wall"), "tms_erythrite_brick.png", + "too_many_stones:erythrite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:erythrite_cracked_brick_wall", S("Cracked Erythrite Brick Wall"), "tms_erythrite_cracked_brick.png", + "too_many_stones:erythrite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:erythrite_block_wall", S("Erythrite Block Wall"), "tms_erythrite_block.png", + "too_many_stones:erythrite_block", too_many_stones.node_sound_glass_defaults()) +-- Eudialite +walls.register("too_many_stones:eudialite_wall", S("Eudialite Wall"), "tms_eudialite.png", + "too_many_stones:eudialite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:eudialite_brick_wall", S("Eudialite Brick Wall"), "tms_eudialite_brick.png", + "too_many_stones:eudialite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:eudialite_cracked_brick_wall", S("Cracked Eudialite Brick Wall"), "tms_eudialite_cracked_brick.png", + "too_many_stones:eudialite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:eudialite_block_wall", S("Eudialite Block Wall"), "tms_eudialite_block.png", + "too_many_stones:eudialite_block", too_many_stones.node_sound_glass_defaults()) +-- Fluorite +walls.register("too_many_stones:fluorite_wall", S("Fluorite Wall"), "tms_fluorite.png", + "too_many_stones:fluorite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:fluorite_brick_wall", S("Fluorite Brick Wall"), "tms_fluorite_brick.png", + "too_many_stones:fluorite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:fluorite_cracked_brick_wall", S("Cracked Fluorite Brick Wall"), "tms_fluorite_cracked_brick.png", + "too_many_stones:fluorite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:fluorite_block_wall", S("Fluorite Block Wall"), "tms_fluorite_block.png", + "too_many_stones:fluorite_block", too_many_stones.node_sound_glass_defaults()) +-- Gabbro +walls.register("too_many_stones:gabbro_wall", S("Gabbro Wall"), "tms_gabbro.png", + "too_many_stones:gabbro", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:gabbro_brick_wall", S("Gabbro Brick Wall"), "tms_gabbro_brick.png", + "too_many_stones:gabbro_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:gabbro_cracked_brick_wall", S("Cracked Gabbro Brick Wall"), "tms_gabbro_cracked_brick.png", + "too_many_stones:gabbro_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:gabbro_block_wall", S("Gabbro Block Wall"), "tms_gabbro_block.png", + "too_many_stones:gabbro_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:gabbro_cobble_wall", S("Cobbled Gabbro Wall"), "tms_gabbro_cobble.png", + "too_many_stones:gabbro_cobble", too_many_stones.node_sound_stone_defaults()) +-- Galena +walls.register("too_many_stones:galena_wall", S("Galena Wall"), "tms_galena.png", + "too_many_stones:galena", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:galena_brick_wall", S("Galena Brick Wall"), "tms_galena_brick.png", + "too_many_stones:galena_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:galena_cracked_brick_wall", S("Cracked Galena Brick Wall"), "tms_galena_cracked_brick.png", + "too_many_stones:galena_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:galena_block_wall", S("Galena Block Wall"), "tms_galena_block.png", + "too_many_stones:galena_block", too_many_stones.node_sound_stone_defaults()) +-- Black Granite +walls.register("too_many_stones:granite_black_wall", S("Black Granite Wall"), "tms_granite_black.png", + "too_many_stones:granite_black", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_black_brick_wall", S("Black Granite Brick Wall"), "tms_granite_black_brick.png", + "too_many_stones:granite_black_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_black_cracked_brick_wall", S("Cracked Black Granite Brick Wall"), "tms_granite_black_cracked_brick.png", + "too_many_stones:granite_black_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_black_block_wall", S("Black Granite Block Wall"), "tms_granite_black_block.png", + "too_many_stones:granite_black_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_black_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_black_cobble.png", + "too_many_stones:granite_black_cobble", too_many_stones.node_sound_stone_defaults()) +-- Blue Granite +walls.register("too_many_stones:granite_blue_wall", S("Blue Granite Wall"), "tms_granite_blue.png", + "too_many_stones:granite_blue", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_blue_brick_wall", S("Blue Granite Brick Wall"), "tms_granite_blue_brick.png", + "too_many_stones:granite_blue_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_blue_cracked_brick_wall", S("Cracked Blue Granite Brick Wall"), "tms_granite_blue_cracked_brick.png", + "too_many_stones:granite_blue_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_blue_block_wall", S("Blue Granite Block Wall"), "tms_granite_blue_block.png", + "too_many_stones:granite_blue_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_blue_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_blue_cobble.png", + "too_many_stones:granite_blue_cobble", too_many_stones.node_sound_stone_defaults()) +-- Gray Granite +walls.register("too_many_stones:granite_gray_wall", S("Gray Granite Wall"), "tms_granite_gray.png", + "too_many_stones:granite_gray", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_gray_brick_wall", S("Gray Granite Brick Wall"), "tms_granite_gray_brick.png", + "too_many_stones:granite_gray_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_gray_cracked_brick_wall", S("Cracked Gray Granite Brick Wall"), "tms_granite_gray_cracked_brick.png", + "too_many_stones:granite_gray_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_gray_block_wall", S("Gray Granite Block Wall"), "tms_granite_gray_block.png", + "too_many_stones:granite_gray_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_gray_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_gray_cobble.png", + "too_many_stones:granite_gray_cobble", too_many_stones.node_sound_stone_defaults()) +-- Green Granite +walls.register("too_many_stones:granite_green_wall", S("Green Granite Wall"), "tms_granite_green.png", + "too_many_stones:granite_green", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_green_brick_wall", S("Green Granite Brick Wall"), "tms_granite_green_brick.png", + "too_many_stones:granite_green_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_green_cracked_brick_wall", S("Cracked Green Granite Brick Wall"), "tms_granite_green_cracked_brick.png", + "too_many_stones:granite_green_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_green_block_wall", S("Green Granite Block Wall"), "tms_granite_green_block.png", + "too_many_stones:granite_green_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_green_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_green_cobble.png", + "too_many_stones:granite_green_cobble", too_many_stones.node_sound_stone_defaults()) +-- Pink Granite +walls.register("too_many_stones:granite_pink_wall", S("Pink Granite Wall"), "tms_granite_pink.png", + "too_many_stones:granite_pink", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_pink_brick_wall", S("Pink Granite Brick Wall"), "tms_granite_pink_brick.png", + "too_many_stones:granite_pink_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_pink_cracked_brick_wall", S("Cracked Pink Granite Brick Wall"), "tms_granite_pink_cracked_brick.png", + "too_many_stones:granite_pink_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_pink_block_wall", S("Pink Granite Block Wall"), "tms_granite_pink_block.png", + "too_many_stones:granite_pink_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_pink_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_pink_cobble.png", + "too_many_stones:granite_pink_cobble", too_many_stones.node_sound_stone_defaults()) +-- Red Granite +walls.register("too_many_stones:granite_red_wall", S("Red Granite Wall"), "tms_granite_red.png", + "too_many_stones:granite_red", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_red_brick_wall", S("Red Granite Brick Wall"), "tms_granite_red_brick.png", + "too_many_stones:granite_red_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_red_cracked_brick_wall", S("Cracked Red Granite Brick Wall"), "tms_granite_red_cracked_brick.png", + "too_many_stones:granite_red_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_red_block_wall", S("Red Granite Block Wall"), "tms_granite_red_block.png", + "too_many_stones:granite_red_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_red_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_red_cobble.png", + "too_many_stones:granite_red_cobble", too_many_stones.node_sound_stone_defaults()) +-- White Granite +walls.register("too_many_stones:granite_white_wall", S("White Granite Wall"), "tms_granite_white.png", + "too_many_stones:granite_white", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_white_brick_wall", S("White Granite Brick Wall"), "tms_granite_white_brick.png", + "too_many_stones:granite_white_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_white_cracked_brick_wall", S("Cracked White Granite Brick Wall"), "tms_granite_white_cracked_brick.png", + "too_many_stones:granite_white_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_white_block_wall", S("White Granite Block Wall"), "tms_granite_white_block.png", + "too_many_stones:granite_white_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_white_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_white_cobble.png", + "too_many_stones:granite_white_cobble", too_many_stones.node_sound_stone_defaults()) +-- Yellow Granite +walls.register("too_many_stones:granite_yellow_wall", S("Yellow Granite Wall"), "tms_granite_yellow.png", + "too_many_stones:granite_yellow", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_yellow_brick_wall", S("Yellow Granite Brick Wall"), "tms_granite_yellow_brick.png", + "too_many_stones:granite_yellow_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_yellow_cracked_brick_wall", S("Cracked Yellow Granite Brick Wall"), "tms_granite_yellow_cracked_brick.png", + "too_many_stones:granite_yellow_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_yellow_block_wall", S("Yellow Granite Block Wall"), "tms_granite_yellow_block.png", + "too_many_stones:granite_yellow_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:granite_yellow_cobble_wall", S("Cobbled Black Granite Wall"), "tms_granite_yellow_cobble.png", + "too_many_stones:granite_yellow_cobble", too_many_stones.node_sound_stone_defaults()) +-- Heliodor +walls.register("too_many_stones:heliodor_wall", S("Heliodor Wall"), "tms_heliodor.png", + "too_many_stones:heliodor", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:heliodor_brick_wall", S("Heliodor Brick Wall"), "tms_heliodor_brick.png", + "too_many_stones:heliodor_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:heliodor_cracked_brick_wall", S("Cracked Heliodor Brick Wall"), "tms_heliodor_cracked_brick.png", + "too_many_stones:heliodor_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:heliodor_block_wall", S("Heliodor Block Wall"), "tms_heliodor_block.png", + "too_many_stones:heliodor_block", too_many_stones.node_sound_glass_defaults()) +-- Howlite +walls.register("too_many_stones:howlite_wall", S("Howlite Wall"), "tms_howlite.png", + "too_many_stones:howlite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:howlite_brick_wall", S("Howlite Brick Wall"), "tms_howlite_brick.png", + "too_many_stones:howlite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:howlite_cracked_brick_wall", S("Cracked Howlite Brick Wall"), "tms_howlite_cracked_brick.png", + "too_many_stones:howlite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:howlite_block_wall", S("Howlite Block Wall"), "tms_howlite_block.png", + "too_many_stones:howlite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:howlite_cobble_wall", S("Cobbled Howlite Wall"), "tms_howlite_cobble.png", + "too_many_stones:howlite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Ilvaite +walls.register("too_many_stones:ilvaite_wall", S("Ilvaite Wall"), "tms_ilvaite.png", + "too_many_stones:ilvaite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:ilvaite_brick_wall", S("Ilvaite Brick Wall"), "tms_ilvaite_brick.png", + "too_many_stones:ilvaite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:ilvaite_cracked_brick_wall", S("Cracked Ilvaite Brick Wall"), "tms_ilvaite_cracked_brick.png", + "too_many_stones:ilvaite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:ilvaite_block_wall", S("Ilvaite Block Wall"), "tms_ilvaite_block.png", + "too_many_stones:ilvaite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:ilvaite_cobble_wall", S("Cobbled Ilvaite Wall"), "tms_ilvaite_cobble.png", + "too_many_stones:ilvaite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Red Jasper +walls.register("too_many_stones:jasper_red_wall", S("Red Jasper Wall"), "tms_jasper_red.png", + "too_many_stones:jasper_red", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jasper_red_brick_wall", S("Red Jasper Brick Wall"), "tms_jasper_red_brick.png", + "too_many_stones:jasper_red_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jasper_red_cracked_brick_wall", S("Cracked Red Jasper Brick Wall"), "tms_jasper_red_cracked_brick.png", + "too_many_stones:jasper_red_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jasper_red_block_wall", S("Red Jasper Block Wall"), "tms_jasper_red_block.png", + "too_many_stones:jasper_red_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jasper_red_cobble_wall", S("Cobbled Red Jasper Wall"), "tms_jasper_red_cobble.png", + "too_many_stones:jasper_red_cobble", too_many_stones.node_sound_stone_defaults()) +-- Jade +walls.register("too_many_stones:jade_wall", S("Jade Wall"), "tms_jade.png", + "too_many_stones:jade", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jade_brick_wall", S("Jade Brick Wall"), "tms_jade_brick.png", + "too_many_stones:jade_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jade_cracked_brick_wall", S("Cracked Jade Brick Wall"), "tms_jade_cracked_brick.png", + "too_many_stones:jade_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jade_block_wall", S("Jade Block Wall"), "tms_jade_block.png", + "too_many_stones:jade_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:jade_cobble_wall", S("Cobbled Jade Wall"), "tms_jade_cobble.png", + "too_many_stones:jade_cobble", too_many_stones.node_sound_stone_defaults()) +-- Kyanite +walls.register("too_many_stones:kyanite_wall", S("Kyanite Wall"), "tms_kyanite.png", + "too_many_stones:kyanite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:kyanite_brick_wall", S("Kyanite Brick Wall"), "tms_kyanite_brick.png", + "too_many_stones:kyanite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:kyanite_cracked_brick_wall", S("Cracked Kyanite Brick Wall"), "tms_kyanite_cracked_brick.png", + "too_many_stones:kyanite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:kyanite_block_wall", S("Kyanite Block Wall"), "tms_kyanite_block.png", + "too_many_stones:kyanite_block", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:kyanite_cobble_wall", S("Cobbled Kyanite Wall"), "tms_kyanite_cobble.png", + "too_many_stones:kyanite_cobble", too_many_stones.node_sound_glass_defaults()) +-- Lapis Lazuli +walls.register("too_many_stones:lapis_lazuli_wall", S("Lapis Lazuli Wall"), "tms_lapis_lazuli.png", + "too_many_stones:lapis_lazuli", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lapis_lazuli_brick_wall", S("Lapis Lazuli Brick Wall"), "tms_lapis_lazuli_brick.png", + "too_many_stones:lapis_lazuli_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lapis_lazuli_cracked_brick_wall", S("Cracked Lapis Lazuli Brick Wall"), "tms_lapis_lazuli_cracked_brick.png", + "too_many_stones:lapis_lazuli_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lapis_lazuli_block_wall", S("Lapis Lazuli Block Wall"), "tms_lapis_lazuli_block.png", + "too_many_stones:lapis_lazuli_block", too_many_stones.node_sound_stone_defaults()) +-- Lepidolite +walls.register("too_many_stones:lepidolite_wall", S("Lepidolite Wall"), "tms_lepidolite.png", + "too_many_stones:lepidolite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lepidolite_cobble_wall", S("Cobbled Lepidolite Wall"), "tms_lepidolite_cobble.png", + "too_many_stones:lepidolite_cobble", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lepidolite_brick_wall", S("Lepidolite Brick Wall"), "tms_lepidolite_brick.png", + "too_many_stones:lepidolite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lepidolite_cracked_brick_wall", S("Cracked Lepidolite Brick Wall"), "tms_lepidolite_cracked_brick.png", + "too_many_stones:lepidolite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:lepidolite_block_wall", S("Lepidolite Block Wall"), "tms_lepidolite_block.png", + "too_many_stones:lepidolite_block", too_many_stones.node_sound_stone_defaults()) +-- Blue Limestone +walls.register("too_many_stones:limestone_blue_wall", S("Blue Limestone Wall"), "tms_limestone_blue.png", + "too_many_stones:limestone_blue", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_blue_brick_wall", S("Blue Limestone Brick Wall"), "tms_limestone_blue_brick.png", + "too_many_stones:limestone_blue_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_blue_cracked_brick_wall", S("Cracked Blue Limestone Brick Wall"), "tms_limestone_blue_cracked_brick.png", + "too_many_stones:limestone_blue_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_blue_block_wall", S("Blue Limestone Block Wall"), "tms_limestone_blue_block.png", + "too_many_stones:limestone_blue_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_blue_cobble_wall", S("Cobbled Blue Limestone Wall"), "tms_limestone_blue_cobble.png", + "too_many_stones:limestone_blue_cobble", too_many_stones.node_sound_stone_defaults()) +-- White Limestone +walls.register("too_many_stones:limestone_white_wall", S("White Limestone Wall"), "tms_limestone_white.png", + "too_many_stones:limestone_white", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_white_brick_wall", S("White Limestone Brick Wall"), "tms_limestone_white_brick.png", + "too_many_stones:limestone_white_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_white_cracked_brick_wall", S("Cracked White Limestone Brick Wall"), "tms_limestone_white_cracked_brick.png", + "too_many_stones:limestone_white_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_white_block_wall", S("White Limestone Block Wall"), "tms_limestone_white_block.png", + "too_many_stones:limestone_white_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:limestone_white_cobble_wall", S("Cobbled White Limestone Wall"), "tms_limestone_white_cobble.png", + "too_many_stones:limestone_white_cobble", too_many_stones.node_sound_stone_defaults()) +-- Marble +walls.register("too_many_stones:marble_wall", S("Marble Wall"), "tms_marble.png", + "too_many_stones:marble", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:marble_brick_wall", S("Marble Brick Wall"), "tms_marble_brick.png", + "too_many_stones:marble_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:marble_cracked_brick_wall", S("Cracked Marble Brick Wall"), "tms_marble_cracked_brick.png", + "too_many_stones:marble_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:marble_block_wall", S("Marble Block Wall"), "tms_marble_block.png", + "too_many_stones:marble_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:marble_cobble_wall", S("Cobbled Marble Wall"), "tms_marble_cobble.png", + "too_many_stones:marble_cobble", too_many_stones.node_sound_stone_defaults()) +-- Moonstone +walls.register("too_many_stones:moonstone_wall", S("Moonstone Wall"), "tms_moonstone.png", + "too_many_stones:moonstone", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:moonstone_brick_wall", S("Moonstone Brick Wall"), "tms_moonstone_brick.png", + "too_many_stones:moonstone_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:moonstone_cracked_brick_wall", S("Cracked Moonstone Brick Wall"), "tms_moonstone_cracked_brick.png", + "too_many_stones:moonstone_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:moonstone_block_wall", S("Moonstone Block Wall"), "tms_moonstone_block.png", + "too_many_stones:moonstone_block", too_many_stones.node_sound_glass_defaults()) +-- Morion Quartz +walls.register("too_many_stones:morion_quartz_wall", S("Morion Quartz Wall"), "tms_morion_quartz.png", + "too_many_stones:morion_quartz", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:morion_quartz_brick_wall", S("Morion Quartz Brick Wall"), "tms_morion_quartz_brick.png", + "too_many_stones:morion_quartz_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:morion_quartz_cracked_brick_wall", S("Cracked Morion Quartz Brick Wall"), "tms_morion_quartz_cracked_brick.png", + "too_many_stones:morion_quartz_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:morion_quartz_block_wall", S("Morion Quartz Block Wall"), "tms_morion_quartz_block.png", + "too_many_stones:morion_quartz_block", too_many_stones.node_sound_glass_defaults()) +-- Mudstone +walls.register("too_many_stones:mudstone_wall", S("Mudstone Wall"), "tms_mudstone.png", + "too_many_stones:mudstone", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:mudstone_brick_wall", S("Mudstone Brick Wall"), "tms_mudstone_brick.png", + "too_many_stones:mudstone_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:mudstone_cracked_brick_wall", S("Cracked Mudstone Brick Wall"), "tms_mudstone_cracked_brick.png", + "too_many_stones:mudstone_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:mudstone_block_wall", S("Mudstone Block Wall"), "tms_mudstone_block.png", + "too_many_stones:mudstone_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:mudstone_cobble_wall", S("Cobbled Mudstone Wall"), "tms_mudstone_cobble.png", + "too_many_stones:mudstone_cobble", too_many_stones.node_sound_stone_defaults()) +-- Prasiolite +walls.register("too_many_stones:prasiolite_wall", S("Prasiolite Wall"), "tms_prasiolite.png", + "too_many_stones:prasiolite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:prasiolite_brick_wall", S("Prasiolite Brick Wall"), "tms_prasiolite_brick.png", + "too_many_stones:prasiolite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:prasiolite_cracked_brick_wall", S("Cracked Prasiolite Brick Wall"), "tms_prasiolite_cracked_brick.png", + "too_many_stones:prasiolite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:prasiolite_block_wall", S("Prasiolite Block Wall"), "tms_prasiolite_block.png", + "too_many_stones:prasiolite_block", too_many_stones.node_sound_glass_defaults()) +-- Pumice +walls.register("too_many_stones:pumice_wall", S("Pumice Wall"), "tms_pumice.png", + "too_many_stones:pumice", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:pumice_brick_wall", S("Pumice Brick Wall"), "tms_pumice_brick.png", + "too_many_stones:pumice_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:pumice_cracked_brick_wall", S("Cracked Pumice Brick Wall"), "tms_pumice_cracked_brick.png", + "too_many_stones:pumice_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:pumice_block_wall", S("Pumice Block Wall"), "tms_pumice_block.png", + "too_many_stones:pumice_block", too_many_stones.node_sound_stone_defaults()) +-- Pyrite +walls.register("too_many_stones:pyrite_wall", S("Pyrite Wall"), "tms_pyrite.png", + "too_many_stones:pyrite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:pyrite_brick_wall", S("Pyrite Brick Wall"), "tms_pyrite_brick.png", + "too_many_stones:pyrite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:pyrite_cracked_brick_wall", S("Cracked Pyrite Brick Wall"), "tms_pyrite_cracked_brick.png", + "too_many_stones:pyrite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:pyrite_block_wall", S("Pyrite Block Wall"), "tms_pyrite_block.png", + "too_many_stones:pyrite_block", too_many_stones.node_sound_stone_defaults()) +-- Quartz +walls.register("too_many_stones:quartz_wall", S("Quartz Wall"), "tms_quartz.png", + "too_many_stones:quartz", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:quartz_brick_wall", S("Quartz Brick Wall"), "tms_quartz_brick.png", + "too_many_stones:quartz_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:quartz_cracked_brick_wall", S("Cracked Quartz Brick Wall"), "tms_quartz_cracked_brick.png", + "too_many_stones:quartz_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:quartz_block_wall", S("Quartz Block Wall"), "tms_quartz_block.png", + "too_many_stones:quartz_block", too_many_stones.node_sound_glass_defaults()) +-- Rhodonite +walls.register("too_many_stones:rhodonite_wall", S("Rhodonite Wall"), "tms_rhodonite.png", + "too_many_stones:rhodonite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:rhodonite_brick_wall", S("Rhodonite Brick Wall"), "tms_rhodonite_brick.png", + "too_many_stones:rhodonite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:rhodonite_cracked_brick_wall", S("Cracked Rhodonite Brick Wall"), "tms_rhodonite_cracked_brick.png", + "too_many_stones:rhodonite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:rhodonite_block_wall", S("Rhodonite Block Wall"), "tms_rhodonite_block.png", + "too_many_stones:rhodonite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:rhodonite_cobble_wall", S("Cobbled Rhodonite Wall"), "tms_rhodonite_cobble.png", + "too_many_stones:rhodonite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Rose Quartz +walls.register("too_many_stones:rose_quartz_wall", S("Rose Quartz Wall"), "tms_rose_quartz.png", + "too_many_stones:rose_quartz", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:rose_quartz_brick_wall", S("Rose Quartz Brick Wall"), "tms_rose_quartz_brick.png", + "too_many_stones:rose_quartz_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:rose_quartz_cracked_brick_wall", S("Cracked Rose Quartz Brick Wall"), "tms_rose_quartz_cracked_brick.png", + "too_many_stones:rose_quartz_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:rose_quartz_block_wall", S("Rose Quartz Block Wall"), "tms_rose_quartz_block.png", + "too_many_stones:rose_quartz_block", too_many_stones.node_sound_glass_defaults()) +-- Scoria +walls.register("too_many_stones:scoria_wall", S("Scoria Wall"), "tms_scoria.png", + "too_many_stones:scoria", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:scoria_brick_wall", S("Scoria Brick Wall"), "tms_scoria_brick.png", + "too_many_stones:scoria_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:scoria_cracked_brick_wall", S("Cracked Scoria Brick Wall"), "tms_scoria_cracked_brick.png", + "too_many_stones:scoria_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:scoria_block_wall", S("Scoria Block Wall"), "tms_scoria_block.png", + "too_many_stones:scoria_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:scoria_cobble_wall", S("Cobbled Scoria Wall"), "tms_scoria_cobble.png", + "too_many_stones:scoria_cobble", too_many_stones.node_sound_stone_defaults()) +-- Serpentine +walls.register("too_many_stones:serpentine_wall", S("Serpentine Wall"), "tms_serpentine.png", + "too_many_stones:serpentine", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:serpentine_brick_wall", S("Serpentine Brick Wall"), "tms_serpentine_brick.png", + "too_many_stones:serpentine_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:serpentine_cracked_brick_wall", S("Cracked Serpentine Brick Wall"), "tms_serpentine_cracked_brick.png", + "too_many_stones:serpentine_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:serpentine_block_wall", S("Serpentine Block Wall"), "tms_serpentine_block.png", + "too_many_stones:serpentine_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:serpentine_cobble_wall", S("Cobbled Serpentine Wall"), "tms_serpentine_cobble.png", + "too_many_stones:serpentine_cobble", too_many_stones.node_sound_stone_defaults()) +-- Shale +walls.register("too_many_stones:shale_wall", S("Shale Wall"), "tms_shale.png", + "too_many_stones:shale", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:shale_brick_wall", S("Shale Brick Wall"), "tms_shale_brick.png", + "too_many_stones:shale_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:shale_cracked_brick_wall", S("Cracked Shale Brick Wall"), "tms_shale_cracked_brick.png", + "too_many_stones:shale_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:shale_block_wall", S("Shale Block Wall"), "tms_shale_block.png", + "too_many_stones:shale_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:shale_cobble_wall", S("Cobbled Shale Wall"), "tms_shale_cobble.png", + "too_many_stones:shale_cobble", too_many_stones.node_sound_stone_defaults()) +-- Slate +walls.register("too_many_stones:slate_wall", S("Slate Wall"), "tms_slate.png", + "too_many_stones:slate", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:slate_brick_wall", S("Slate Brick Wall"), "tms_slate_brick.png", + "too_many_stones:slate_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:slate_cracked_brick_wall", S("Cracked Slate Brick Wall"), "tms_slate_cracked_brick.png", + "too_many_stones:slate_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:slate_block_wall", S("Slate Block Wall"), "tms_slate_block.png", + "too_many_stones:slate_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:slate_cobble_wall", S("Cobbled Slate Wall"), "tms_slate_cobble.png", + "too_many_stones:slate_cobble", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:slate_tile_wall", S("Slate Tile Wall"), "tms_slate_tile.png", + "too_many_stones:slate_tile", too_many_stones.node_sound_stone_defaults()) +-- Smokey Quartz +walls.register("too_many_stones:smokey_quartz_wall", S("Smokey Quartz Wall"), "tms_smokey_quartz.png", + "too_many_stones:smokey_quartz", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:smokey_quartz_brick_wall", S("Smokey Quartz Brick Wall"), "tms_smokey_quartz_brick.png", + "too_many_stones:smokey_quartz_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:smokey_quartz_cracked_brick_wall", S("Cracked Smokey Quartz Brick Wall"), "tms_smokey_quartz_cracked_brick.png", + "too_many_stones:smokey_quartz_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:smokey_quartz_block_wall", S("Smokey Quartz Block Wall"), "tms_smokey_quartz_block.png", + "too_many_stones:smokey_quartz_block", too_many_stones.node_sound_glass_defaults()) +-- Soapstone +walls.register("too_many_stones:soapstone_wall", S("Soapstone Wall"), "tms_soapstone.png", + "too_many_stones:soapstone", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:soapstone_brick_wall", S("Soapstone Brick Wall"), "tms_soapstone_brick.png", + "too_many_stones:soapstone_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:soapstone_cracked_brick_wall", S("Cracked Soapstone Brick Wall"), "tms_soapstone_cracked_brick.png", + "too_many_stones:soapstone_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:soapstone_block_wall", S("Soapstone Block Wall"), "tms_soapstone_block.png", + "too_many_stones:soapstone_block", too_many_stones.node_sound_stone_defaults()) +-- Sodalite +walls.register("too_many_stones:sodalite_wall", S("Sodalite Wall"), "tms_sodalite.png", + "too_many_stones:sodalite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sodalite_brick_wall", S("Sodalite Brick Wall"), "tms_sodalite_brick.png", + "too_many_stones:sodalite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sodalite_cracked_brick_wall", S("Cracked Sodalite Brick Wall"), "tms_sodalite_cracked_brick.png", + "too_many_stones:sodalite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sodalite_block_wall", S("Sodalite Block Wall"), "tms_sodalite_block.png", + "too_many_stones:sodalite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sodalite_cobble_wall", S("Cobbled Sodalite Wall"), "tms_sodalite_cobble.png", + "too_many_stones:sodalite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Sugilite +walls.register("too_many_stones:sugilite_wall", S("Sugilite Wall"), "tms_sugilite.png", + "too_many_stones:sugilite", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sugilite_brick_wall", S("Sugilite Brick Wall"), "tms_sugilite_brick.png", + "too_many_stones:sugilite_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sugilite_cracked_brick_wall", S("Cracked Sugilite Brick Wall"), "tms_sugilite_cracked_brick.png", + "too_many_stones:sugilite_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sugilite_block_wall", S("Sugilite Block Wall"), "tms_sugilite_block.png", + "too_many_stones:sugilite_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:sugilite_cobble_wall", S("Cobbled Sugilite Wall"), "tms_sugilite_cobble.png", + "too_many_stones:sugilite_cobble", too_many_stones.node_sound_stone_defaults()) +-- Green Tourmaline +walls.register("too_many_stones:tourmaline_green_wall", S("Green Tourmaline Wall"), "tms_tourmaline_green.png", + "too_many_stones:tourmaline_green", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_green_brick_wall", S("Green Tourmaline Brick Wall"), "tms_tourmaline_green_brick.png", + "too_many_stones:tourmaline_green_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_green_cracked_brick_wall", S("Cracked Green Tourmaline Brick Wall"), "tms_tourmaline_green_cracked_brick.png", + "too_many_stones:tourmaline_green_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_green_block_wall", S("Green Tourmaline Block Wall"), "tms_tourmaline_green_block.png", + "too_many_stones:tourmaline_green_block", too_many_stones.node_sound_glass_defaults()) +-- Paraiba Tourmaline +walls.register("too_many_stones:tourmaline_paraiba_wall", S("Paraiba Tourmaline Wall"), "tms_tourmaline_paraiba.png", + "too_many_stones:tourmaline_paraiba", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_paraiba_brick_wall", S("Paraiba Tourmaline Brick Wall"), "tms_tourmaline_paraiba_brick.png", + "too_many_stones:tourmaline_paraiba_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_paraiba_cracked_brick_wall", S("Cracked Paraiba Tourmaline Brick Wall"), "tms_tourmaline_paraiba_cracked_brick.png", + "too_many_stones:tourmaline_paraiba_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_paraiba_block_wall", S("Paraiba Tourmaline Block Wall"), "tms_tourmaline_paraiba_block.png", + "too_many_stones:tourmaline_paraiba_block", too_many_stones.node_sound_glass_defaults()) +-- Pink Tourmaline +walls.register("too_many_stones:tourmaline_pink_wall", S("Pink Tourmaline Wall"), "tms_tourmaline_pink.png", + "too_many_stones:tourmaline_pink", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_pink_brick_wall", S("Pink Tourmaline Brick Wall"), "tms_tourmaline_pink_brick.png", + "too_many_stones:tourmaline_pink_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_pink_cracked_brick_wall", S("Cracked Pink Tourmaline Brick Wall"), "tms_tourmaline_pink_cracked_brick.png", + "too_many_stones:tourmaline_pink_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:tourmaline_pink_block_wall", S("Pink Tourmaline Block Wall"), "tms_tourmaline_pink_block.png", + "too_many_stones:tourmaline_pink_block", too_many_stones.node_sound_glass_defaults()) +-- Travertine +walls.register("too_many_stones:travertine_wall", S("Travertine Wall"), "tms_travertine.png", + "too_many_stones:travertine", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:travertine_brick_wall", S("Travertine Brick Wall"), "tms_travertine_brick.png", + "too_many_stones:travertine_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:travertine_cracked_brick_wall", S("Cracked Travertine Brick Wall"), "tms_travertine_cracked_brick.png", + "too_many_stones:travertine_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:travertine_block_wall", S("Travertine Block Wall"), "tms_travertine_block.png", + "too_many_stones:travertine_block", too_many_stones.node_sound_stone_defaults()) +-- Yellow Travertine +walls.register("too_many_stones:travertine_yellow_wall", S("Yellow Travertine Wall"), "tms_travertine_yellow.png", + "too_many_stones:travertine_yellow", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:travertine_yellow_brick_wall", S("Yellow Travertine Brick Wall"), "tms_travertine_yellow_brick.png", + "too_many_stones:travertine_yellow_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:travertine_yellow_cracked_brick_wall", S("Cracked Yellow Travertine Brick Wall"), "tms_travertine_yellow_cracked_brick.png", + "too_many_stones:travertine_yellow_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:travertine_yellow_block_wall", S("Yellow Travertine Block Wall"), "tms_travertine_yellow_block.png", + "too_many_stones:travertine_yellow_block", too_many_stones.node_sound_stone_defaults()) +-- Beige Tuff +walls.register("too_many_stones:tuff_beige_wall", S("Beige Tuff Wall"), "tms_tuff_beige.png", + "too_many_stones:tuff_beige", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_beige_brick_wall", S("Beige Tuff Brick Wall"), "tms_tuff_beige_brick.png", + "too_many_stones:tuff_beige_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_beige_cracked_brick_wall", S("Cracked Beige Tuff Brick Wall"), "tms_tuff_beige_cracked_brick.png", + "too_many_stones:tuff_beige_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_beige_block_wall", S("Beige Tuff Block Wall"), "tms_tuff_beige_block.png", + "too_many_stones:tuff_beige_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_beige_cobble_wall", S("Cobbled Beige Tuff Wall"), "tms_tuff_beige_cobble.png", + "too_many_stones:tuff_beige_cobble", too_many_stones.node_sound_stone_defaults()) +-- Grey Tuff +walls.register("too_many_stones:tuff_grey_wall", S("Grey Tuff Wall"), "tms_tuff_grey.png", + "too_many_stones:tuff_grey", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_grey_brick_wall", S("Grey Tuff Brick Wall"), "tms_tuff_grey_brick.png", + "too_many_stones:tuff_grey_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_grey_cracked_brick_wall", S("Cracked Grey Tuff Brick Wall"), "tms_tuff_grey_cracked_brick.png", + "too_many_stones:tuff_grey_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_grey_block_wall", S("Grey Tuff Block Wall"), "tms_tuff_grey_block.png", + "too_many_stones:tuff_grey_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_grey_cobble_wall", S("Cobbled Grey Tuff Wall"), "tms_tuff_grey_cobble.png", + "too_many_stones:tuff_grey_cobble", too_many_stones.node_sound_stone_defaults()) +-- Red Tuff +walls.register("too_many_stones:tuff_red_wall", S("Red Tuff Wall"), "tms_tuff_red.png", + "too_many_stones:tuff_red", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_red_brick_wall", S("Red Tuff Brick Wall"), "tms_tuff_red_brick.png", + "too_many_stones:tuff_red_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_red_cracked_brick_wall", S("Cracked Red Tuff Brick Wall"), "tms_tuff_red_cracked_brick.png", + "too_many_stones:tuff_red_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_red_block_wall", S("Red Tuff Block Wall"), "tms_tuff_red_block.png", + "too_many_stones:tuff_red_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:tuff_red_cobble_wall", S("Cobbled Red Tuff Wall"), "tms_tuff_red_cobble.png", + "too_many_stones:tuff_red_cobble", too_many_stones.node_sound_stone_defaults()) +-- Turquoise +walls.register("too_many_stones:turquoise_wall", S("Turquoise Wall"), "tms_turquoise.png", + "too_many_stones:turquoise", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:turquoise_brick_wall", S("Turquoise Brick Wall"), "tms_turquoise_brick.png", + "too_many_stones:turquoise_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:turquoise_cracked_brick_wall", S("Cracked Turquoise Brick Wall"), "tms_turquoise_cracked_brick.png", + "too_many_stones:turquoise_cracked_brick", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:turquoise_block_wall", S("Turquoise Block Wall"), "tms_turquoise_block.png", + "too_many_stones:turquoise_block", too_many_stones.node_sound_stone_defaults()) + +walls.register("too_many_stones:turquoise_cobble_wall", S("Cobbled Turquoise Wall"), "tms_turquoise_cobble.png", + "too_many_stones:turquoise_cobble", too_many_stones.node_sound_stone_defaults()) +-- Vivianite +walls.register("too_many_stones:vivianite_wall", S("Vivianite Wall"), "tms_vivianite.png", + "too_many_stones:vivianite", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:vivianite_brick_wall", S("Vivianite Brick Wall"), "tms_vivianite_brick.png", + "too_many_stones:vivianite_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:vivianite_cracked_brick_wall", S("Cracked Vivianite Brick Wall"), "tms_vivianite_cracked_brick.png", + "too_many_stones:vivianite_cracked_brick", too_many_stones.node_sound_glass_defaults()) + +walls.register("too_many_stones:vivianite_block_wall", S("Vivianite Block Wall"), "tms_vivianite_block.png", + "too_many_stones:vivianite_block", too_many_stones.node_sound_glass_defaults()) +end diff --git a/mods/tt/.mailmap b/mods/tt/.mailmap new file mode 100644 index 00000000..5e3ac1df --- /dev/null +++ b/mods/tt/.mailmap @@ -0,0 +1 @@ +Wuzzy diff --git a/mods/tt/API.md b/mods/tt/API.md new file mode 100644 index 00000000..4ddc57c2 --- /dev/null +++ b/mods/tt/API.md @@ -0,0 +1,29 @@ +# Tooltip API +This API explains how to handle the extended item tooltips (`description` field). + +## Fields + +Add these to the item definition. + +* `_tt_ignore`: If `true`, the `description` of this item won't be altered at all +* `_tt_help`: Custom help text + +Once this mod had overwritten the `description` field of an item was overwritten, it will save the original (unaltered) `description` in the `_tt_original_description` field. + +## `tt.register_snippet(func)` + +Register a custom snippet function. +`func` is a function of the form `func(itemstring)`. +It will be called for (nearly) every itemstring. + +Returns: Two values, the first one is required. +1st return value: A string you want to append to this item or `nil` if nothing shall be appended. +2nd return value: If nil, `tt` will take of the text color. If a ColorString in `"#RRGGBB"` format, entire text is colorized in this color. Return `false` to force `tt` to not apply text any colorization (useful if you want to call `minetest.colorize` yourself. + +Example: + + tt.register_snippet(function(itemstring) + if minetest.get_item_group(itemstring, "magic") == 1 then + return "This item is magic" + end + end) diff --git a/mods/tt/LICENSE.txt b/mods/tt/LICENSE.txt new file mode 100644 index 00000000..b735b82a --- /dev/null +++ b/mods/tt/LICENSE.txt @@ -0,0 +1,9 @@ +Copyright 2024 Wuzzy + +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mods/tt/README.md b/mods/tt/README.md new file mode 100644 index 00000000..38062afb --- /dev/null +++ b/mods/tt/README.md @@ -0,0 +1,12 @@ +# Extended Tooltips (`tt`) +This mod extends the tooltip of items to add more informative texts. + +The mod itself does nothing and is meant to be integrated into +games to use the API to define custom tooltips (see `API.md`). + +## Version +1.0.0 + +## License +This mod is free software, released under the MIT License. +See `LICENSE.txt` for the full text. diff --git a/mods/tt/init.lua b/mods/tt/init.lua new file mode 100644 index 00000000..a79bf27b --- /dev/null +++ b/mods/tt/init.lua @@ -0,0 +1,50 @@ +tt = {} +tt.COLOR_DEFAULT = "#d0ffd0" +tt.COLOR_DANGER = "#ffff00" +tt.COLOR_GOOD = "#00ff00" + +-- API +tt.registered_snippets = {} + +tt.register_snippet = function(func) + table.insert(tt.registered_snippets, func) +end + +dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets.lua") + +-- Apply item description updates + +local function append_snippets() + for itemstring, def in pairs(minetest.registered_items) do + if itemstring ~= "" and itemstring ~= "air" and itemstring ~= "ignore" and itemstring ~= "unknown" and def ~= nil and def.description ~= nil and def.description ~= "" and def._tt_ignore ~= true then + local desc = def.description + local orig_desc = desc + local first = true + -- Apply snippets + for s=1, #tt.registered_snippets do + local str, snippet_color = tt.registered_snippets[s](itemstring) + if snippet_color == nil then + snippet_color = tt.COLOR_DEFAULT + elseif snippet_color == false then + snippet_color = false + end + if str then + if first then + first = false + end + desc = desc .. "\n" + if snippet_color then + desc = desc .. minetest.colorize(snippet_color, str) + else + desc = desc .. str + end + end + end + if desc ~= def.description then + minetest.override_item(itemstring, { description = desc, _tt_original_description = orig_desc }) + end + end + end +end + +minetest.register_on_mods_loaded(append_snippets) diff --git a/mods/tt/locale/template.txt b/mods/tt/locale/template.txt new file mode 100644 index 00000000..95745d4d --- /dev/null +++ b/mods/tt/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: tt +Extended Tooltips= +Support for custom tooltip extensions for items= diff --git a/mods/tt/locale/tt.de.tr b/mods/tt/locale/tt.de.tr new file mode 100644 index 00000000..410bc204 --- /dev/null +++ b/mods/tt/locale/tt.de.tr @@ -0,0 +1,3 @@ +# textdomain: tt +Extended Tooltips=Erweiterte Tooltips +Support for custom tooltip extensions for items=Unterstützung für eigene Tooltip-Erweiterungen für Gegenstände diff --git a/mods/tt/mod.conf b/mods/tt/mod.conf new file mode 100644 index 00000000..c6ec7ece --- /dev/null +++ b/mods/tt/mod.conf @@ -0,0 +1,3 @@ +name = tt +title = Extended Tooltips +description = Support for custom tooltip extensions for items diff --git a/mods/tt/snippets.lua b/mods/tt/snippets.lua new file mode 100644 index 00000000..694b2251 --- /dev/null +++ b/mods/tt/snippets.lua @@ -0,0 +1,11 @@ +-- CUSTOM SNIPPETS -- + +-- Custom text (_tt_help) +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + if def._tt_help then + return def._tt_help + end +end) + + diff --git a/mods/tt_base/.mailmap b/mods/tt_base/.mailmap new file mode 100644 index 00000000..5e3ac1df --- /dev/null +++ b/mods/tt_base/.mailmap @@ -0,0 +1 @@ +Wuzzy diff --git a/mods/tt_base/README.md b/mods/tt_base/README.md new file mode 100644 index 00000000..17b5c14d --- /dev/null +++ b/mods/tt_base/README.md @@ -0,0 +1,28 @@ +# Extended Tooltips: Base +This mod is for the Extended Tooltips [tt] mod to extend item tooltips with the following +basic info: + +* Tool digging times +* Weapon stats +* Food stats +* Node damage +* Node light level +* Node info: climbable, slippery, bouncy, jumping restriction + +This mod assumes that the default gameplay behavior of Luanti is used. + +This mod introduces support for new item definition fields: + +* `_tt_food`: If `true`, item is a food item that can be consumed by the player +* `_tt_food_hp`: Health increase (in HP) for player when consuming food item + +Because there is no standard way in Luanti to mark an item as food, these fields +are required for food items to be recognized as such. + +## Version +1.0.0 + +This mod requires Luanti 5.10.0 or later. + +## License +MIT License. diff --git a/mods/tt_base/init.lua b/mods/tt_base/init.lua new file mode 100644 index 00000000..40813818 --- /dev/null +++ b/mods/tt_base/init.lua @@ -0,0 +1,196 @@ +local S, PS = minetest.get_translator("tt_base") + +local function get_min_digtime(caps) + local mintime + local unique = true + local maxlevel = caps.maxlevel + if not maxlevel then + maxlevel = 1 + end + if maxlevel > 1 then + unique = false + end + if caps.times then + for r=1,3 do + local time = caps.times[r] + if time and maxlevel > 1 then + time = time / maxlevel + end + if time and ((not mintime) or (time < mintime)) then + if mintime and (time < mintime) then + unique = false + end + mintime = time + end + end + end + return mintime, unique +end + +local function newline(str) + if str ~= "" then + str = str .. "\n" + end + return str +end + +-- Tool information (digging times, weapon stats) +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + local desc = "" + if def.tool_capabilities then + -- Digging times + local digs = "" + local d + if def.tool_capabilities.groupcaps then + for group, caps in pairs(def.tool_capabilities.groupcaps) do + local mintime, unique_mintime + if caps.times then + mintime, unique_mintime = get_min_digtime(caps) + if mintime and (mintime > 0 or (not unique_mintime)) then + d = S("Digs @1 blocks", group) .. "\n" + d = d .. S("Minimum dig time: @1s", string.format("%.2f", mintime)) + digs = newline(digs) + digs = digs .. d + elseif mintime and mintime == 0 then + d = S("Digs @1 blocks instantly", group) + digs = newline(digs) + digs = digs .. d + end + end + end + if digs ~= "" then + desc = desc .. digs + end + end + -- Weapon stats + if def.tool_capabilities.damage_groups then + for group, damage in pairs(def.tool_capabilities.damage_groups) do + local msg + if group == "fleshy" then + if damage >= 0 then + msg = S("Damage: @1", damage) + else + msg = S("Healing: @1", math.abs(damage)) + end + else + if damage >= 0 then + msg = S("Damage (@1): @2", group, damage) + else + msg = S("Healing (@1): @2", group, math.abs(damage)) + end + end + desc = newline(desc) + desc = desc .. msg + end + local full_punch_interval = def.tool_capabilities.full_punch_interval + if not full_punch_interval then + full_punch_interval = 1 + end + desc = newline(desc) + desc = desc .. S("Full punch interval: @1s", string.format("%.2f", full_punch_interval)) + end + end + if desc == "" then + desc = nil + end + return desc +end) + +-- Food +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + local desc + if def._tt_food then + desc = S("Food item") + if def._tt_food_hp then + local msg + if PS then + msg = PS("+@1 food point", "+@1 food points", def._tt_food_hp, def._tt_food_hp) + else + -- fallback when plural forms are unavailable + msg = S("+@1 food points", def._tt_food_hp) + end + desc = desc .. "\n" .. msg + end + end + return desc +end) + +-- Node info +tt.register_snippet(function(itemstring) + local def = minetest.registered_items[itemstring] + local desc = "" + + -- Health-related node facts + if def.damage_per_second then + if def.damage_per_second > 0 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DANGER, S("Contact damage: @1 per second", def.damage_per_second)) + elseif def.damage_per_second < 0 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_GOOD, S("Contact healing: @1 per second", math.abs(def.damage_per_second))) + end + end + if def.drowning and def.drowning ~= 0 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DANGER, S("Drowning damage: @1", def.drowning)) + end + local tmp = minetest.get_item_group(itemstring, "fall_damage_add_percent") + if tmp > 0 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DANGER, S("Fall damage: +@1%", tmp)) + elseif tmp == -100 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_GOOD, S("No fall damage")) + elseif tmp < 0 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("Fall damage: @1%", tmp)) + end + + -- Movement-related node facts + if minetest.get_item_group(itemstring, "disable_jump") == 1 and not def.climbable then + if def.liquidtype == "none" then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("No jumping")) + elseif minetest.get_item_group(itemstring, "fake_liquid") == 0 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("No swimming upwards")) + else + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("No rising")) + end + end + if def.climbable then + if minetest.get_item_group(itemstring, "disable_jump") == 1 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("Climbable (only downwards)")) + else + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("Climbable")) + end + end + if minetest.get_item_group(itemstring, "slippery") >= 1 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("Slippery")) + end + tmp = minetest.get_item_group(itemstring, "bouncy") + if tmp >= 1 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("Bouncy (@1%)", tmp)) + end + + -- Node appearance + tmp = def.light_source + if tmp and tmp >= 1 then + desc = newline(desc) + desc = desc .. minetest.colorize(tt.COLOR_DEFAULT, S("Luminance: @1", tmp)) + end + + + if desc == "" then + desc = nil + end + return desc, false +end) + diff --git a/mods/tt_base/locale/tt_base.de.po b/mods/tt_base/locale/tt_base.de.po new file mode 100644 index 00000000..ecebe58d --- /dev/null +++ b/mods/tt_base/locale/tt_base.de.po @@ -0,0 +1,94 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain tt_base x.x.x\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: de\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" + +msgid "Extended Tooltips: Base" +msgstr "Erweiterte Tooltips: Basis" + +msgid "Adds generic tooltip extensions to items" +msgstr "Fügt generische Tooltip-Erweiterungen zu Gegenständen hinzu" + +msgid "Damage: @1" +msgstr "Schaden: @1" + +msgid "Damage (@1): @2" +msgstr "Schaden (@1): @2" + +msgid "Healing: @1" +msgstr "Heilung: @1" + +msgid "Healing (@1): @2" +msgstr "Heilung (@1): @2" + +msgid "Full punch interval: @1s" +msgstr "Zeit zum Ausholen: @1s" + +msgid "Food item" +msgstr "Lebensmittel" + +msgid "+@1 food point" +msgid_plural "+@1 food points" +msgstr[0] "+@1 Nahrungspunkt" +msgstr[1] "+@1 Nahrungspunkte" + +msgid "Contact damage: @1 per second" +msgstr "Kontaktschaden: @1 pro Sekunde" + +msgid "Contact healing: @1 per second" +msgstr "Kontaktheilung: @1 pro Sekunde" + +msgid "Drowning damage: @1" +msgstr "Ertrinkensschaden: @1" + +msgid "Bouncy (@1%)" +msgstr "Sprunghaft (@1%)" + +msgid "Luminance: @1" +msgstr "Lichtstärke: @1" + +msgid "Slippery" +msgstr "Rutschig" + +msgid "Climbable" +msgstr "Erkletterbar" + +msgid "Climbable (only downwards)" +msgstr "Erkletterbar (nur nach unten)" + +msgid "No jumping" +msgstr "Kein Springen" + +msgid "No swimming upwards" +msgstr "Kein nach oben schwimmen" + +msgid "No rising" +msgstr "Kein Aufsteigen" + +msgid "Fall damage: @1%" +msgstr "Fallschaden: @1%" + +msgid "Fall damage: +@1%" +msgstr "Fallschaden: +@1%" + +msgid "No fall damage" +msgstr "Kein Fallschaden" + +msgid "Digs @1 blocks" +msgstr "Gräbt „@1“-Blöcke" + +msgid "Digs @1 blocks instantly" +msgstr "Gräbt „@1“-Blöcke sofort" + +msgid "Minimum dig time: @1s" +msgstr "Minimale Grabezeit: @1s" + diff --git a/mods/tt_base/locale/tt_base.fr.po b/mods/tt_base/locale/tt_base.fr.po new file mode 100644 index 00000000..83a07601 --- /dev/null +++ b/mods/tt_base/locale/tt_base.fr.po @@ -0,0 +1,95 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain tt_base x.x.x\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: fr\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" + +msgid "Extended Tooltips: Base" +msgstr "" + +msgid "Adds generic tooltip extensions to items" +msgstr "" + +msgid "Damage: @1" +msgstr "Dégâts: @1" + +msgid "Damage (@1): @2" +msgstr "Dégâts (@1): @2" + +msgid "Healing: @1" +msgstr "Guérison: @1" + +msgid "Healing (@1): @2" +msgstr "Guérison (@1): @2" + +msgid "Full punch interval: @1s" +msgstr "Intervalle de coup: @1s" + +msgid "Food item" +msgstr "alimentaire" + +#, fuzzy +msgid "+@1 food point" +msgid_plural "+@1 food points" +msgstr[0] "+@1 de saturation" +msgstr[1] "+@1 de saturation" + +msgid "Contact damage: @1 per second" +msgstr "Dégâts de contact: @1 par seconde" + +msgid "Contact healing: @1 per second" +msgstr "Guérison de contact: @1 par seconde" + +msgid "Drowning damage: @1" +msgstr "Dégâts de noyade: @1" + +msgid "Bouncy (@1%)" +msgstr "Rebondissant (@1%)" + +msgid "Luminance: @1" +msgstr "Luminance: @1" + +msgid "Slippery" +msgstr "Glissant" + +msgid "Climbable" +msgstr "Grimpable" + +msgid "Climbable (only downwards)" +msgstr "Grimpable (uniquement vers le bas)" + +msgid "No jumping" +msgstr "Ne pas sauter" + +msgid "No swimming upwards" +msgstr "Ne pas nager vers le haut" + +msgid "No rising" +msgstr "Pas de montée" + +msgid "Fall damage: @1%" +msgstr "Dégâts de chute: @1%" + +msgid "Fall damage: +@1%" +msgstr "Dégâts de chute: +@1%" + +msgid "No fall damage" +msgstr "Pas de dégâts de chute" + +msgid "Digs @1 blocks" +msgstr "Digs @1 blocks" + +msgid "Digs @1 blocks instantly" +msgstr "Digs @1 blocks instantly" + +msgid "Minimum dig time: @1s" +msgstr "Minimum dig time: @1s" + diff --git a/mods/tt_base/locale/tt_base.pot b/mods/tt_base/locale/tt_base.pot new file mode 100644 index 00000000..8b8242e0 --- /dev/null +++ b/mods/tt_base/locale/tt_base.pot @@ -0,0 +1,94 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain tt_base x.x.x\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" + +msgid "Extended Tooltips: Base" +msgstr "" + +msgid "Adds generic tooltip extensions to items" +msgstr "" + +msgid "Damage: @1" +msgstr "" + +msgid "Damage (@1): @2" +msgstr "" + +msgid "Healing: @1" +msgstr "" + +msgid "Healing (@1): @2" +msgstr "" + +msgid "Full punch interval: @1s" +msgstr "" + +msgid "Food item" +msgstr "" + +msgid "+@1 food point" +msgid_plural "+@1 food points" +msgstr[0] "" +msgstr[1] "" + +msgid "Contact damage: @1 per second" +msgstr "" + +msgid "Contact healing: @1 per second" +msgstr "" + +msgid "Drowning damage: @1" +msgstr "" + +msgid "Bouncy (@1%)" +msgstr "" + +msgid "Luminance: @1" +msgstr "" + +msgid "Slippery" +msgstr "" + +msgid "Climbable" +msgstr "" + +msgid "Climbable (only downwards)" +msgstr "" + +msgid "No jumping" +msgstr "" + +msgid "No swimming upwards" +msgstr "" + +msgid "No rising" +msgstr "" + +msgid "Fall damage: @1%" +msgstr "" + +msgid "Fall damage: +@1%" +msgstr "" + +msgid "No fall damage" +msgstr "" + +msgid "Digs @1 blocks" +msgstr "" + +msgid "Digs @1 blocks instantly" +msgstr "" + +msgid "Minimum dig time: @1s" +msgstr "" + diff --git a/mods/tt_base/locale/tt_base.ru.po b/mods/tt_base/locale/tt_base.ru.po new file mode 100644 index 00000000..b8f8e6da --- /dev/null +++ b/mods/tt_base/locale/tt_base.ru.po @@ -0,0 +1,96 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain tt_base x.x.x\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\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" + +msgid "Extended Tooltips: Base" +msgstr "" + +msgid "Adds generic tooltip extensions to items" +msgstr "" + +msgid "Damage: @1" +msgstr "Урон: @1" + +msgid "Damage (@1): @2" +msgstr "Урон (@1): @2" + +msgid "Healing: @1" +msgstr "ИÑцеление: @1" + +msgid "Healing (@1): @2" +msgstr "ИÑцеление (@1): @2" + +msgid "Full punch interval: @1s" +msgstr "Интервал полного удара: @1 Ñ" + +msgid "Food item" +msgstr "Еда" + +#, fuzzy +msgid "+@1 food point" +msgid_plural "+@1 food points" +msgstr[0] "+@1 к ÑытоÑти" +msgstr[1] "+@1 к ÑытоÑти" +msgstr[2] "+@1 к ÑытоÑти" + +msgid "Contact damage: @1 per second" +msgstr "Урон при контакте: @1 в Ñекунду" + +msgid "Contact healing: @1 per second" +msgstr "ИÑцеление при контакте: @1 в Ñекунду" + +msgid "Drowning damage: @1" +msgstr "Урон при падении: @1" + +msgid "Bouncy (@1%)" +msgstr "УпругоÑть (@1%)" + +msgid "Luminance: @1" +msgstr "Свечение: @1" + +msgid "Slippery" +msgstr "СкользкоÑть" + +msgid "Climbable" +msgstr "Можно карабкатьÑÑ" + +msgid "Climbable (only downwards)" +msgstr "Можно ÑпуÑкатьÑÑ" + +msgid "No jumping" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ñ‹Ð³Ð°Ñ‚ÑŒ" + +msgid "No swimming upwards" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð»Ñ‹Ñ‚ÑŒ вверх" + +msgid "No rising" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´Ð½Ð¸Ð¼Ð°Ñ‚ÑŒÑÑ" + +msgid "Fall damage: @1%" +msgstr "Урон при падении: @1%" + +msgid "Fall damage: +@1%" +msgstr "Урон при падении: +@1%" + +msgid "No fall damage" +msgstr "Ðет урона при падении" + +msgid "Digs @1 blocks" +msgstr "Добывает @1 блоки" + +msgid "Digs @1 blocks instantly" +msgstr "Добывает @1 блоки мгновенно" + +msgid "Minimum dig time: @1s" +msgstr "Минимальный интервал добычи: @1Ñ" + diff --git a/mods/tt_base/mod.conf b/mods/tt_base/mod.conf new file mode 100644 index 00000000..870ff255 --- /dev/null +++ b/mods/tt_base/mod.conf @@ -0,0 +1,4 @@ +name = tt_base +title = Extended Tooltips: Base +description = Adds generic tooltip extensions to items +depends = tt diff --git a/mods/unified_inventory/.github/workflows/check-release.yml b/mods/unified_inventory/.github/workflows/check-release.yml new file mode 100644 index 00000000..47313ff9 --- /dev/null +++ b/mods/unified_inventory/.github/workflows/check-release.yml @@ -0,0 +1,11 @@ +on: [push, pull_request] +name: Check & Release +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: lint + uses: Roang-zero1/factorio-mod-luacheck@master + with: + luacheckrc_url: https://raw.githubusercontent.com/minetest-mods/unified_inventory/master/.luacheckrc diff --git a/mods/unified_inventory/.gitignore b/mods/unified_inventory/.gitignore new file mode 100644 index 00000000..5236e1e4 --- /dev/null +++ b/mods/unified_inventory/.gitignore @@ -0,0 +1,2 @@ +*~ + diff --git a/mods/unified_inventory/.luacheckrc b/mods/unified_inventory/.luacheckrc new file mode 100644 index 00000000..a951e481 --- /dev/null +++ b/mods/unified_inventory/.luacheckrc @@ -0,0 +1,22 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +globals = { + "unified_inventory", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + "dump", + "minetest", "vector", + "ItemStack", "datastorage", + + "hb", + "doors", +} + +files["callbacks.lua"].ignore = { "player", "draw_lite_mode" } +files["bags.lua"].ignore = { "player" } diff --git a/mods/unified_inventory/LICENSE.txt b/mods/unified_inventory/LICENSE.txt new file mode 100644 index 00000000..32492e43 --- /dev/null +++ b/mods/unified_inventory/LICENSE.txt @@ -0,0 +1,19 @@ +Unified Inventory for Minetest +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +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 Street, Fifth Floor, Boston, MA 02110-1301 USA + +Contact information: + Examine a git patch to get the contributor's email address. diff --git a/mods/unified_inventory/README.md b/mods/unified_inventory/README.md new file mode 100644 index 00000000..e71fb42c --- /dev/null +++ b/mods/unified_inventory/README.md @@ -0,0 +1,120 @@ +# Unified Inventory + +[![](https://github.com/minetest-mods/unified_inventory/workflows/Check%20&%20Release/badge.svg)](https://github.com/minetest-mods/unified_inventory/actions) + +![Screenshot](screenshot.png) + +Unified Inventory replaces the default survival and creative inventory. + + +## Features + + * Node, item and tool browser + * Crafting guide + * Can copy the recipe to the crafting grid + * Recipe search function by ingredients + * Up to four bags with up to 24 slots each + * Home function to teleport + * Trash slot and refill slot for creative + * Waypoints to keep track of important locations + * Lite mode: reduces the item browser width + * `minetest.conf` setting `unified_inventory_lite = true` + * Mod API for modders: see [mod_api.txt](doc/mod_api.txt) + * Setting-determinated features: see [settingtypes.txt](settingtypes.txt) + + +## Requirements + + * Minetest 5.4.0+ + * Mod `default` for category filters (contained in Minetest Game) + * Mod `farming` for craftable bags (contained in Minetest Game) + * For waypoint migration: `datastorage` + + +# Licenses + +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +Copyright (C) 2012-? Various minetest-mods contributors + + +## Code + +GNU LGPLv2+, see [license notice](LICENSE.txt) + + +## Textures + +VanessaE: (CC-BY-4.0) + + * `ui_group.png` + +Tango Project: (Public Domain, CC-BY-4.0) + + * [`ui_reset_icon.png`](https://commons.wikimedia.org/wiki/File:Edit-clear.svg) + * [`ui_doubleleft_icon.png`](http://commons.wikimedia.org/wiki/File:Media-seek-backward.svg) + * [`ui_doubleright_icon.png`](http://commons.wikimedia.org/wiki/File:Media-seek-forward.svg) + * [`ui_left_icon.png` / `ui_right_icon.png`](http://commons.wikimedia.org/wiki/File:Media-playback-start.svg) + * [`ui_skip_backward_icon.png`](http://commons.wikimedia.org/wiki/File:Media-skip-backward.svg) + * [`ui_skip_forward_icon.png`](http://commons.wikimedia.org/wiki/File:Media-skip-forward.svg) + +From http://www.clker.com (Public Domain, CC-BY-4.0): + + * [`bags_small.png`](http://www.clker.com/clipart-moneybag-empty.html) + * [`bags_medium.png`](http://www.clker.com/clipart-backpack-1.html) + * [`bags_large.png` / `ui_bags_icon.png`](http://www.clker.com/clipart-backpack-green-brown.html) + * `ui_trash_icon.png`: and + * [`ui_search_icon.png`](http://www.clker.com/clipart-24887.html) + * [`ui_off_icon.png` / `ui_on_icon.png`](http://www.clker.com/clipart-on-off-switches.html) + * [`ui_waypoints_icon.png`](http://www.clker.com/clipart-map-pin-red.html) + * [`ui_circular_arrows_icon.png`](http://www.clker.com/clipart-circular-arrow-pattern.html) + * [`ui_pencil_icon.pnc`](http://www.clker.com/clipart-2256.html) + * [`ui_waypoint_set_icon.png`](http://www.clker.com/clipart-larger-flag.html) + +From https://www.svgrepo.com (CC-BY) + * [`ui_teleport.png`](https://www.svgrepo.com/svg/321565/teleport) + +Everaldo Coelho (YellowIcon) (LGPL v2.1+): + + * [`ui_craftguide_icon.png` / `ui_craft_icon.png`](http://commons.wikimedia.org/wiki/File:Advancedsettings.png) + +Gregory H. Revera: (CC-BY-SA 3.0) + + * [`ui_moon_icon.png`](http://commons.wikimedia.org/wiki/File:FullMoon2010.jpg) + +Thomas Bresson: (CC-BY 3.0) + + * [`ui_sun_icon.png`](http://commons.wikimedia.org/wiki/File:2012-10-13_15-29-35-sun.jpg) + +Fibonacci: (Public domain, CC-BY 4.0) + + * [`ui_xyz_off_icon.png`](http://commons.wikimedia.org/wiki/File:No_sign.svg) + +Gregory Maxwell: (Public domain, CC-BY 4.0) + + * [`ui_ok_icon.png`](http://commons.wikimedia.org/wiki/File:Yes_check.svg) + +Adrien Facélina: (LGPL v2.1+) + + * [`inventory_plus_worldedit_gui.png`](http://commons.wikimedia.org/wiki/File:Erioll_world_2.svg) + +Other files from Wikimedia Commons: + + * [`ui_gohome_icon.png` / `ui_home_icon.png` / `ui_sethome_icon.png`](http://commons.wikimedia.org/wiki/File:Home_256x256.png) (GPL v2+) + +RealBadAngel: (CC-BY-4.0) + + * Everything else. + + +## Sounds + + * [`bell.ogg`](https://freesound.org/people/bennstir/sounds/81072/) by bennstir, CC 4.0 + * [`electricity.ogg`](https://freesound.org/people/Halleck/sounds/19486/) by Halleck, CC 4.0 (cut) + * [`pageflip1.ogg`](https://freesound.org/people/themfish/sounds/45823/) by themfish, CC 4.0 (cut, slowed down) + * `pageflip2.ogg` (derived from `pageflip1.ogg`) + * [`trash.ogg`](https://freesound.org/people/OwlStorm/sounds/151231/) by OwlStorm, CC 0 (speed up) + * [`trash_all.ogg`](https://freesound.org/people/abel_K/sounds/68280/) by abel_K, Sampling Plus 1.0 (speed up) + * [`ui_click.ogg`](https://freesound.org/people/lartti/sounds/527569/) by lartti, CC 0 (cut) + * [`ui_morning.ogg`](https://freesound.org/people/InspectorJ/sounds/439472/) by InspectorJ, CC 4.0 + * [`ui_owl.ogg`](https://freesound.org/people/manda_g/sounds/54987/) by manda_g, Sampling Plus 1.0 (cut) diff --git a/mods/unified_inventory/api.lua b/mods/unified_inventory/api.lua new file mode 100644 index 00000000..604d49ef --- /dev/null +++ b/mods/unified_inventory/api.lua @@ -0,0 +1,445 @@ +local S = minetest.get_translator("unified_inventory") +local F = minetest.formspec_escape +local ui = unified_inventory + +local function is_recipe_craftable(recipe) + -- Ensure the ingedients exist + for _, itemname in pairs(recipe.items) do + local groups = string.find(itemname, "group:") + if groups then + if not ui.get_group_item(string.sub(groups, 8)).item then + return false + end + else + -- Possibly an item + local itemname_cleaned = ItemStack(itemname):get_name() + if not minetest.registered_items[itemname_cleaned] + or minetest.get_item_group(itemname_cleaned, "not_in_craft_guide") ~= 0 then + return false + end + end + end + return true +end + +-- Create detached creative inventory after loading all mods +minetest.after(0.01, function() + local rev_aliases = {} + for original, newname in pairs(minetest.registered_aliases) do + if not rev_aliases[newname] then + rev_aliases[newname] = {} + end + table.insert(rev_aliases[newname], original) + end + + -- Filtered item list + ui.items_list = {} + for name, def in pairs(minetest.registered_items) do + if ui.is_itemdef_listable(def) then + table.insert(ui.items_list, name) + + -- Alias processing: Find recipes that belong to the current item name + local all_names = rev_aliases[name] or {} + table.insert(all_names, name) + for _, itemname in ipairs(all_names) do + local recipes = minetest.get_all_craft_recipes(itemname) + for _, recipe in ipairs(recipes or {}) do + if is_recipe_craftable(recipe) then + ui.register_craft(recipe) + end + end + end + end + end + + table.sort(ui.items_list) + ui.items_list_size = #ui.items_list + print("Unified Inventory. Inventory size: "..ui.items_list_size) + + -- Analyse dropped items -> custom "digging" recipes + for _, name in ipairs(ui.items_list) do + local def = minetest.registered_items[name] + -- Simple drops + if type(def.drop) == "string" then + local dstack = ItemStack(def.drop) + if not dstack:is_empty() and dstack:get_name() ~= name then + ui.register_craft({ + type = "digging", + items = {name}, + output = def.drop, + width = 0, + }) + + end + -- Complex drops. Yes, it's really complex! + elseif type(def.drop) == "table" then + --[[ Extract single items from the table and save them into dedicated tables + to register them later, in order to avoid duplicates. These tables counts + the total number of guaranteed drops and drops by chance (“maybesâ€) for each item. + For “maybesâ€, the final count is the theoretical maximum number of items, not + neccessarily the actual drop count. ]] + local drop_guaranteed = {} + local drop_maybe = {} + -- This is for catching an obscure corner case: If the top items table has + -- only items with rarity = 1, but max_items is set, then only the first + -- max_items will be part of the drop, any later entries are logically + -- impossible, so this variable is for keeping track of this + local max_items_left = def.drop.max_items + -- For checking whether we still encountered only guaranteed only so far; + -- for the first “maybe†item it will become false which will cause ALL + -- later items to be considered “maybesâ€. + -- A common idiom is: + -- { max_items 1, { items = { + -- { items={"example:1"}, rarity = 5 }, + -- { items={"example:2"}, rarity = 1 }, }}} + -- example:2 must be considered a “maybe†because max_items is set and it + -- appears after a “maybe†+ local max_start = true + -- Let's iterate through the items madness! + -- Handle invalid drop entries gracefully. + local drop_items = def.drop.items or { } + for i=1,#drop_items do + if max_items_left ~= nil and max_items_left <= 0 then break end + local itit = drop_items[i] + for j=1,#itit.items do + local dstack = ItemStack(itit.items[j]) + if not dstack:is_empty() and dstack:get_name() ~= name then + local dname = dstack:get_name() + local dcount = dstack:get_count() + -- Guaranteed drops AND we are not yet in “maybe mode†+ if #itit.items == 1 and itit.rarity == 1 and max_start then + if drop_guaranteed[dname] == nil then + drop_guaranteed[dname] = 0 + end + drop_guaranteed[dname] = drop_guaranteed[dname] + dcount + + if max_items_left ~= nil then + max_items_left = max_items_left - 1 + if max_items_left <= 0 then break end + end + -- Drop was a “maybe†+ else + if max_items_left ~= nil then max_start = false end + if drop_maybe[dname] == nil then + drop_maybe[dname] = 0 + end + drop_maybe[dname] = drop_maybe[dname] + dcount + end + end + end + end + for itemstring, count in pairs(drop_guaranteed) do + ui.register_craft({ + type = "digging", + items = {name}, + output = itemstring .. " " .. count, + width = 0, + }) + end + for itemstring, count in pairs(drop_maybe) do + ui.register_craft({ + type = "digging_chance", + items = {name}, + output = itemstring .. " " .. count, + width = 0, + }) + end + end + end + + -- Step 1: Initialize cache for looking up groups + unified_inventory.init_matching_cache() + + -- Step 2: Find all matching items for the given spec (groups) + local get_matching_spec_items = unified_inventory.get_matching_items + + for outputitemname, recipes in pairs(ui.crafts_for.recipe) do + -- List of crafts that return this item string (variable "_") + + -- Problem: The group cache must be initialized after all mods finished loading + -- thus, invalid recipes might be indexed. Hence perform filtering with `new_recipe_list` + local new_recipe_list = {} + for _, recipe in ipairs(recipes) do + local ingredient_items = {} + for _, spec in pairs(recipe.items) do + -- Get items that fit into this spec (group or item name) + local specname = ItemStack(spec):get_name() + for item_name, _ in pairs(get_matching_spec_items(specname)) do + ingredient_items[item_name] = true + end + end + for name, _ in pairs(ingredient_items) do + if not ui.crafts_for.usage[name] then + ui.crafts_for.usage[name] = {} + end + table.insert(ui.crafts_for.usage[name], recipe) + end + + if next(ingredient_items) then + -- There's at least one known ingredient: mark as good recipe + -- PS: What whatll be done about partially incomplete recipes? + table.insert(new_recipe_list, recipe) + end + end + ui.crafts_for.recipe[outputitemname] = new_recipe_list + end + + -- Remove unknown items from all categories + local total_removed = 0 + for cat_name, cat_def in pairs(ui.registered_category_items) do + for itemname, _ in pairs(cat_def) do + local idef = minetest.registered_items[itemname] + if not idef then + total_removed = total_removed + 1 + --[[ + -- For analysis + minetest.log("warning", "[unified_inventory] Removed item '" + .. itemname .. "' from category '" .. cat_name + .. "'. Reason: item not registered") + ]] + cat_def[itemname] = nil + elseif not ui.is_itemdef_listable(idef) then + total_removed = total_removed + 1 + --[[ + -- For analysis + minetest.log("warning", "[unified_inventory] Removed item '" + .. itemname .. "' from category '" .. cat_name + .. "'. Reason: item is in 'not_in_creative_inventory' group") + ]] + cat_def[itemname] = nil + end + end + end + if total_removed > 0 then + minetest.log("info", "[unified_inventory] Removed " .. total_removed .. + " items from the categories.") + end + + for _, callback in ipairs(ui.initialized_callbacks) do + callback() + end +end) + +---------------- Home API ---------------- + +local function load_home() + local input = io.open(ui.home_filename, "r") + if not input then + ui.home_pos = {} + return + end + while true do + local x = input:read("*n") + if not x then break end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + ui.home_pos[name:sub(2)] = {x = x, y = y, z = z} + end + io.close(input) +end + +load_home() + +function ui.set_home(player, pos) + local player_name = player:get_player_name() + ui.home_pos[player_name] = vector.round(pos) + + -- save the home data from the table to the file + local output = io.open(ui.home_filename, "w") + if not output then + minetest.log("warning", "[unified_inventory] Failed to save file: " + .. ui.home_filename) + return + end + for k, v in pairs(ui.home_pos) do + output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n") + end + io.close(output) +end + +function ui.go_home(player) + local pos = ui.home_pos[player:get_player_name()] + if pos then + player:set_pos(pos) + return true + end + return false +end + +---------------- Crafting API ---------------- + +function ui.register_craft(options) + if not options.output then + return + end + local itemstack = ItemStack(options.output) + if itemstack:is_empty() then + return + end + if options.type == "normal" and options.width == 0 then + options = { type = "shapeless", items = options.items, output = options.output, width = 0 } + end + local item_name = itemstack:get_name() + if not ui.crafts_for.recipe[item_name] then + ui.crafts_for.recipe[item_name] = {} + end + table.insert(ui.crafts_for.recipe[item_name],options) + + for _, callback in ipairs(ui.craft_registered_callbacks) do + callback(item_name, options) + end +end + +local craft_type_defaults = { + width = 3, + height = 3, + uses_crafting_grid = false, +} + +function ui.craft_type_defaults(name, options) + if not options.description then + options.description = name + end + setmetatable(options, {__index = craft_type_defaults}) + return options +end + + +function ui.register_craft_type(name, options) + ui.registered_craft_types[name] = ui.craft_type_defaults(name, options) +end + + +ui.register_craft_type("normal", { + description = F(S("Crafting")), + icon = "ui_craftgrid_icon.png", + width = 3, + height = 3, + get_shaped_craft_width = function (craft) return craft.width end, + dynamic_display_size = function (craft) + local w = craft.width + local h = math.ceil(table.maxn(craft.items) / craft.width) + local g = w < h and h or w + return { width = g, height = g } + end, + uses_crafting_grid = true, +}) + + +ui.register_craft_type("shapeless", { + description = F(S("Mixing")), + icon = "ui_craftgrid_icon.png", + width = 3, + height = 3, + dynamic_display_size = function (craft) + local maxn = table.maxn(craft.items) + local g = 1 + while g*g < maxn do g = g + 1 end + return { width = g, height = g } + end, + uses_crafting_grid = true, +}) + + +ui.register_craft_type("cooking", { + description = F(S("Cooking")), + icon = "default_furnace_front.png", + width = 1, + height = 1, +}) + + +ui.register_craft_type("digging", { + description = F(S("Digging")), + icon = "default_tool_steelpick.png", + width = 1, + height = 1, +}) + +ui.register_craft_type("digging_chance", { + description = "Digging (by chance)", + icon = "default_tool_steelpick.png^[transformFY.png", + width = 1, + height = 1, +}) + +---------------- GUI registrations ---------------- + +function ui.register_page(name, def) + ui.pages[name] = def +end + + +function ui.register_button(name, def) + if not def.action then + def.action = function(player) + ui.set_inventory_formspec(player, name) + end + end + def.name = name + table.insert(ui.buttons, def) +end + +---------------- Callback registrations ---------------- + +function ui.register_on_initialized(callback) + if type(callback) ~= "function" then + error(("Initialized callback must be a function, %s given."):format(type(callback))) + end + table.insert(ui.initialized_callbacks, callback) +end + +function ui.register_on_craft_registered(callback) + if type(callback) ~= "function" then + error(("Craft registered callback must be a function, %s given."):format(type(callback))) + end + table.insert(ui.craft_registered_callbacks, callback) +end + +---------------- List getters ---------------- + +function ui.get_recipe_list(output) + return ui.crafts_for.recipe[output] +end + +function ui.get_registered_outputs() + local outputs = {} + for item_name, _ in pairs(ui.crafts_for.recipe) do + table.insert(outputs, item_name) + end + return outputs +end + +---------------- Player utilities ---------------- + +function ui.is_creative(playername) + return minetest.check_player_privs(playername, {creative=true}) + or minetest.settings:get_bool("creative_mode") +end + +---------------- Formspec helpers ---------------- + +function ui.single_slot(xpos, ypos, bright) + return string.format("background9[%f,%f;%f,%f;ui_single_slot%s.png;false;16]", + xpos, ypos, ui.imgscale, ui.imgscale, (bright and "_bright" or "") ) +end + +function ui.make_trash_slot(xpos, ypos) + return + ui.single_slot(xpos, ypos).. + "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png]".. + "list[detached:trash;main;"..(xpos + ui.list_img_offset)..","..(ypos + ui.list_img_offset)..";1,1;]" +end + +function ui.make_inv_img_grid(xpos, ypos, width, height, bright) + local tiled = {} + local n=1 + for y = 0, (height - 1) do + for x = 0, (width -1) do + tiled[n] = ui.single_slot(xpos + (ui.imgscale * x), ypos + (ui.imgscale * y), bright) + n = n + 1 + end + end + return table.concat(tiled) +end diff --git a/mods/unified_inventory/bags.lua b/mods/unified_inventory/bags.lua new file mode 100644 index 00000000..8563c2f7 --- /dev/null +++ b/mods/unified_inventory/bags.lua @@ -0,0 +1,299 @@ +--[[ +Bags for Minetest + +Copyright (c) 2012 cornernote, Brett O'Donnell +License: GPLv3 +--]] + +local S = minetest.get_translator("unified_inventory") +local F = minetest.formspec_escape +local ui = unified_inventory + +ui.register_page("bags", { + get_formspec = function(player, perplayer_formspec) + local player_name = player:get_player_name() + local std_inv_x = perplayer_formspec.std_inv_x + local formspec = { + perplayer_formspec.standard_inv_bg, + "label[", perplayer_formspec.form_header_x, ",", + perplayer_formspec.form_header_y, ";", F(S("Bags")), "]", + "listcolors[#00000000;#00000000]", + } + + for i = 1, 4 do + local x = std_inv_x + i * 2.5 + formspec[#formspec + 1] = ui.single_slot(x - 1.875, 1.5) + formspec[#formspec + 1] = string.format("list[detached:%s_bags;bag%i;%.3f,1.65;1,1;]", + F(player_name), i, x - 1.725) + formspec[#formspec + 1] = string.format("button[%.4f,2.75;1.875,0.75;bag%i;%s]", + x - 2.1875, i, F(S("Bag @1", i))) + end + + return { formspec = table.concat(formspec) } + end, +}) + +ui.register_button("bags", { + type = "image", + image = "ui_bags_icon.png", + tooltip = S("Bags"), +}) + +local function get_player_bag_stack(player, i) + return minetest.get_inventory({ + type = "detached", + name = player:get_player_name() .. "_bags" + }):get_stack("bag" .. i, 1) +end + +for bag_i = 1, 4 do + ui.register_page("bag" .. bag_i, { + get_formspec = function(player, perplayer_formspec) + local stack = get_player_bag_stack(player, bag_i) + local image = stack:get_definition().inventory_image + local slots = stack:get_definition().groups.bagslots + local std_inv_x = perplayer_formspec.std_inv_x + local lite_mode = perplayer_formspec.is_lite_mode + + local bag_inv_y, header_x, header_y = 1.5, 0.3, 0.65 + if lite_mode then + bag_inv_y = 0.5 + header_x = perplayer_formspec.form_header_x + header_y = perplayer_formspec.form_header_y + end + + local formspec = { + perplayer_formspec.standard_inv_bg, + ui.make_inv_img_grid(std_inv_x, bag_inv_y, 8, slots/8), + "label[", header_x, ",", header_y, ";", F(S("Bag @1", bag_i)), "]", + "listcolors[#00000000;#00000000]", + "listring[current_player;main]", + string.format("list[current_player;bag%icontents;%f,%f;8,3;]", + bag_i, std_inv_x + ui.list_img_offset, bag_inv_y + ui.list_img_offset), + "listring[current_name;bag", bag_i, "contents]", + } + + if lite_mode then + return { formspec = table.concat(formspec) } + end + + local n = #formspec + 1 + formspec[n] = "image[" .. std_inv_x + 8.9 .. ",0.4;1,1;" .. image .. "]" + n = n + 1 + + local player_name = player:get_player_name() -- For if statement. + if ui.trash_enabled + or ui.is_creative(player_name) + or minetest.get_player_privs(player_name).give then + formspec[n] = ui.make_trash_slot(7.8, 0.25) + n = n + 1 + end + local inv = player:get_inventory() + for i = 1, 4 do + local def = get_player_bag_stack(player, i):get_definition() + if def.groups.bagslots then + local list_name = "bag" .. i .. "contents" + local size = inv:get_size(list_name) + local used = 0 + for si = 1, size do + local stk = inv:get_stack(list_name, si) + if not stk:is_empty() then + used = used + 1 + end + end + local img = def.inventory_image + local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size + formspec[n] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]", + (i + 1.35)*1.25, img, i, label) + n = n + 1 + end + end + return { formspec = table.concat(formspec) } + end, + }) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then + return + end + for i = 1, 4 do + if fields["bag" .. i] then + local stack = get_player_bag_stack(player, i) + if not stack:get_definition().groups.bagslots then + return + end + ui.set_inventory_formspec(player, "bag" .. i) + return + end + end +end) + +-- Player slots are preserved when unified_inventory is disabled. Do not allow modification. +-- Fix: use a detached inventory and store the data separately. +local function save_bags_metadata(player, bags_inv) + local is_empty = true + local bags = {} + for i = 1, 4 do + local bag = "bag" .. i + if not bags_inv:is_empty(bag) then + -- Stack limit is 1, otherwise use stack:to_string() + bags[i] = bags_inv:get_stack(bag, 1):get_name() + is_empty = false + end + end + local meta = player:get_meta() + if is_empty then + meta:set_string("unified_inventory:bags", "") + else + meta:set_string("unified_inventory:bags", + minetest.serialize(bags)) + end +end + +local function load_bags_metadata(player, bags_inv) + local player_inv = player:get_inventory() + local meta = player:get_meta() + local bags_meta = meta:get("unified_inventory:bags") + local bags = bags_meta and minetest.deserialize(bags_meta) or {} + local dirty_meta = false + if not bags_meta then + -- Backwards compatiblity + for i = 1, 4 do + local bag = "bag" .. i + if not player_inv:is_empty(bag) then + -- Stack limit is 1, otherwise use stack:to_string() + bags[i] = player_inv:get_stack(bag, 1):get_name() + dirty_meta = true + end + end + end + -- Fill detached slots + for i = 1, 4 do + local bag = "bag" .. i + bags_inv:set_size(bag, 1) + bags_inv:set_stack(bag, 1, bags[i] or "") + end + + if dirty_meta then + -- Requires detached inventory to be set up + save_bags_metadata(player, bags_inv) + end + + -- Legacy: Clean up old player lists + for i = 1, 4 do + local bag = "bag" .. i + player_inv:set_size(bag, 0) + end +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local bags_inv = minetest.create_detached_inventory(player_name .. "_bags", { + allow_put = function(inv, listname, index, stack, player) + local new_slots = stack:get_definition().groups.bagslots + if not new_slots then + return 0 -- ItemStack is not a bag. + end + + -- The execution order of `allow_put`/`allow_take` is not defined. + -- We do not know the replacement ItemStack if the items are swapped. + -- Hence, bag slot upgrades and downgrades are not possible with the + -- current API. + + if not player:get_inventory():is_empty(listname .. "contents") then + -- Legacy: in case `allow_take` is not executed on old Minetest versions. + return 0 + end + return 1 + end, + on_put = function(inv, listname, index, stack, player) + player:get_inventory():set_size(listname .. "contents", + stack:get_definition().groups.bagslots) + save_bags_metadata(player, inv) + end, + allow_take = function(inv, listname, index, stack, player) + if player:get_inventory():is_empty(listname .. "contents") then + return stack:get_count() + end + return 0 + end, + on_take = function(inv, listname, index, stack, player) + player:get_inventory():set_size(listname .. "contents", 0) + save_bags_metadata(player, inv) + if listname == ui.current_page[player:get_player_name()] then + -- Bag is currently open: avoid follow-up issues by navigating back + -- Trick: the list name is the same as the registered page name + ui.set_inventory_formspec(player, "bags") + end + end, + allow_move = function() + return 0 + end, + }, player_name) + + load_bags_metadata(player, bags_inv) +end) + + +minetest.register_allow_player_inventory_action(function(player, action, inventory, info) + -- From detached inventory -> player inventory: put & take callbacks + if action ~= "put" or not info.listname:find("bag%dcontents") then + return + end + if info.stack:get_definition().groups.bagslots then + -- Problem 1: empty bags could be moved into their own slots + -- Problem 2: cannot reliably keep track of ItemStack ownership due to + --> Disallow all external bag movements into this list + return 0 + end +end) + +-- register bag tools +minetest.register_tool("unified_inventory:bag_small", { + description = S("Small Bag"), + inventory_image = "bags_small.png", + groups = {bagslots=8}, +}) + +minetest.register_tool("unified_inventory:bag_medium", { + description = S("Medium Bag"), + inventory_image = "bags_medium.png", + groups = {bagslots=16}, +}) + +minetest.register_tool("unified_inventory:bag_large", { + description = S("Large Bag"), + inventory_image = "bags_large.png", + groups = {bagslots=24}, +}) + +-- register bag crafts +if minetest.get_modpath("farming") ~= nil then + minetest.register_craft({ + output = "unified_inventory:bag_small", + recipe = { + {"", "farming:string", ""}, + {"group:wool", "group:wool", "group:wool"}, + {"group:wool", "group:wool", "group:wool"}, + }, + }) + + minetest.register_craft({ + output = "unified_inventory:bag_medium", + recipe = { + {"", "", ""}, + {"farming:string", "unified_inventory:bag_small", "farming:string"}, + {"farming:string", "unified_inventory:bag_small", "farming:string"}, + }, + }) + + minetest.register_craft({ + output = "unified_inventory:bag_large", + recipe = { + {"", "", ""}, + {"farming:string", "unified_inventory:bag_medium", "farming:string"}, + {"farming:string", "unified_inventory:bag_medium", "farming:string"}, + }, + }) +end diff --git a/mods/unified_inventory/callbacks.lua b/mods/unified_inventory/callbacks.lua new file mode 100644 index 00000000..52cb7103 --- /dev/null +++ b/mods/unified_inventory/callbacks.lua @@ -0,0 +1,260 @@ +local ui = unified_inventory + +local function default_refill(stack) + stack:set_count(stack:get_stack_max()) + local itemdef = minetest.registered_items[stack:get_name()] + if itemdef + and (itemdef.wear_represents or "mechanical_wear") == "mechanical_wear" + and stack:get_wear() ~= 0 then + stack:set_wear(0) + end + return stack +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + unified_inventory.players[player_name] = {} + unified_inventory.current_index[player_name] = 1 -- Item (~page) index + unified_inventory.filtered_items_list[player_name] = + unified_inventory.items_list + unified_inventory.activefilter[player_name] = "" + unified_inventory.active_search_direction[player_name] = "nochange" + unified_inventory.current_searchbox[player_name] = "" + unified_inventory.current_category[player_name] = "all" + unified_inventory.current_category_scroll[player_name] = 0 + unified_inventory.alternate[player_name] = 1 + unified_inventory.current_item[player_name] = nil + unified_inventory.current_craft_direction[player_name] = "recipe" + + -- Refill slot + local refill = minetest.create_detached_inventory(player_name.."refill", { + allow_put = function(inv, listname, index, stack, player) + if unified_inventory.is_creative(player_name) then + return stack:get_count() + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + local handle_refill = (minetest.registered_items[stack:get_name()] or {}).on_refill or default_refill + stack = handle_refill(stack) + inv:set_stack(listname, index, stack) + minetest.sound_play("electricity", + {to_player=player_name, gain = 1.0}) + end, + }, player_name) + refill:set_size("main", 1) +end) + +minetest.register_on_mods_loaded(function() + minetest.register_on_joinplayer(function(player) + -- After everything is initialized, set up the formspec + ui.apply_filter(player, "", "nochange") + ui.set_inventory_formspec(player, unified_inventory.default) + end) +end) + +local function apply_new_filter(player, search_text, new_dir) + local player_name = player:get_player_name() + + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) + ui.apply_filter(player, search_text, new_dir) + ui.current_searchbox[player_name] = search_text + ui.set_inventory_formspec(player, ui.current_page[player_name]) +end + +-- Search box handling +local function receive_fields_searchbox(player, formname, fields) + local player_name = player:get_player_name() + + -- always take new search text, even if not searching on it yet + if fields.searchbox and fields.searchbox ~= ui.current_searchbox[player_name] then + ui.current_searchbox[player_name] = fields.searchbox + end + + if fields.searchbutton + or fields.key_enter_field == "searchbox" then + + if ui.current_searchbox[player_name] ~= ui.activefilter[player_name] then + ui.apply_filter(player, ui.current_searchbox[player_name], "nochange") + ui.set_inventory_formspec(player, ui.current_page[player_name]) + minetest.sound_play("paperflip2", + {to_player=player_name, gain = 1.0}) + end + elseif fields.searchresetbutton then + if ui.activefilter[player_name] ~= "" then + apply_new_filter(player, "", "nochange") + end + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then + return + end + + receive_fields_searchbox(player, formname, fields) + + local player_name = player:get_player_name() + + local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) + + local clicked_category + for name, value in pairs(fields) do + local category_name = string.match(name, "^category_(.+)$") + if category_name then + clicked_category = category_name + break + end + end + + if clicked_category + and clicked_category ~= unified_inventory.current_category[player_name] then + unified_inventory.current_category[player_name] = clicked_category + unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange") + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + + if fields.next_category or fields.prev_category then + local step = fields.next_category and 1 or -1 + local scroll_old = ui.current_category_scroll[player_name] + local scroll_new = math.max(0, math.min(#ui.category_list - ui_peruser.pagecols, scroll_old + step)) + + if scroll_old ~= scroll_new then + ui.current_category_scroll[player_name] = scroll_new + ui.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + end + + for i, def in pairs(unified_inventory.buttons) do + if fields[def.name] then + def.action(player) + minetest.sound_play("ui_click", + {to_player=player_name, gain = 0.1}) + return + end + end + + -- Inventory page controls + local start = math.floor( + unified_inventory.current_index[player_name] / ui_peruser.items_per_page + 1) + local start_i = start + local pagemax = math.floor( + (#unified_inventory.filtered_items_list[player_name] - 1) + / (ui_peruser.items_per_page) + 1) + + if fields.start_list then + start_i = 1 + end + if fields.rewind1 then + start_i = start_i - 1 + end + if fields.forward1 then + start_i = start_i + 1 + end + if fields.rewind3 then + start_i = start_i - 3 + end + if fields.forward3 then + start_i = start_i + 3 + end + if fields.end_list then + start_i = pagemax + end + if start_i < 1 then + start_i = 1 + end + if start_i > pagemax then + start_i = pagemax + end + if start_i ~= start then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + unified_inventory.current_index[player_name] = (start_i - 1) * ui_peruser.items_per_page + 1 + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + + -- Check clicked item image button + local clicked_item + for name, value in pairs(fields) do + local new_dir, mangled_item = string.match(name, "^[0-9]*_?item_button_([a-z]+)_(.*)$") + if new_dir and mangled_item then + clicked_item = unified_inventory.demangle_for_formspec(mangled_item) + if string.sub(clicked_item, 1, 6) == "group:" then + -- Change search filter to this group + unified_inventory.current_category[player_name] = "all" + apply_new_filter(player, clicked_item, new_dir) + return + end + if new_dir == "recipe" or new_dir == "usage" then + unified_inventory.current_craft_direction[player_name] = new_dir + end + break + end + end + if clicked_item then + minetest.sound_play("ui_click", + {to_player=player_name, gain = 0.1}) + local page = unified_inventory.current_page[player_name] + local player_creative = unified_inventory.is_creative(player_name) + if not player_creative then + page = "craftguide" + end + if page == "craftguide" then + unified_inventory.current_item[player_name] = clicked_item + unified_inventory.alternate[player_name] = 1 + unified_inventory.set_inventory_formspec(player, "craftguide") + elseif player_creative then + -- Creative page: Add entire stack to inventory + local inv = player:get_inventory() + local stack = ItemStack(clicked_item) + stack:set_count(stack:get_stack_max()) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + end + end + end + + -- alternate buttons + if not (fields.alternate or fields.alternate_prev) then + return + end + minetest.sound_play("ui_click", + {to_player=player_name, gain = 0.1}) + local item_name = unified_inventory.current_item[player_name] + if not item_name then + return + end + local crafts = unified_inventory.crafts_for[unified_inventory.current_craft_direction[player_name]][item_name] + if not crafts then + return + end + local alternates = #crafts + if alternates <= 1 then + return + end + local alternate + if fields.alternate then + alternate = unified_inventory.alternate[player_name] + 1 + if alternate > alternates then + alternate = 1 + end + elseif fields.alternate_prev then + alternate = unified_inventory.alternate[player_name] - 1 + if alternate < 1 then + alternate = alternates + end + end + unified_inventory.alternate[player_name] = alternate + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) +end) + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + minetest.remove_detached_inventory(player_name.."_bags") + minetest.remove_detached_inventory(player_name.."refill") +end) diff --git a/mods/unified_inventory/category.lua b/mods/unified_inventory/category.lua new file mode 100644 index 00000000..f32a9470 --- /dev/null +++ b/mods/unified_inventory/category.lua @@ -0,0 +1,158 @@ +local S = minetest.get_translator("unified_inventory") + +unified_inventory.registered_categories = {} +unified_inventory.registered_category_items = {} +unified_inventory.category_list = {} + +local function char_to_sort_index(char_code) + if char_code <= 32 then + -- Command codes, no thanks + return 0 + end + if char_code <= 64 then + -- Sorts numbers, and some punctuation, after letters + return char_code + end + if char_code >= 158 then + -- Out of sortable range + return 0 + end + if char_code > 122 then + -- Avoids overlap with {, |, } and ~ + return char_code - 58 + end + if char_code > 96 then + -- Normalises lowercase with uppercase + return char_code - 96 + end + return char_code - 64 +end + +local function string_to_sort_index(str) + local max_chars = 5 + local power = 100 + local index = 0 + for i=1,math.min(#str, max_chars) do + index = index + (char_to_sort_index(string.byte(str, i))/(power^i)) + end + return index +end + +function update_category_list() + local category_list = {} + table.insert(category_list, { + name = "all", + label = S("All Items"), + symbol = "ui_category_all.png", + index = -2, + }) + table.insert(category_list, { + name = "uncategorized", + label = S("Misc. Items"), + symbol = "ui_category_none.png", + index = -1, + }) + for category, def in pairs(unified_inventory.registered_categories) do + table.insert(category_list, { + name = category, + label = def.label or category, + symbol = def.symbol, + index = def.index or -- sortby defined order + string_to_sort_index(category) -- or do a rudimentary alphabetical sort + }) + end + table.sort(category_list, function (a,b) + return a.index < b.index + end) + unified_inventory.category_list = category_list +end + +local function ensure_category_exists(category_name) + if not unified_inventory.registered_categories[category_name] then + unified_inventory.registered_categories[category_name] = { + symbol = "unknown_item.png", + label = category_name + } + end + if not unified_inventory.registered_category_items[category_name] then + unified_inventory.registered_category_items[category_name] = {} + end +end + +function unified_inventory.register_category(category_name, config) + ensure_category_exists(category_name) + config = config or {} + if config.symbol then + unified_inventory.set_category_symbol(category_name, config.symbol) + end + if config.label then + unified_inventory.set_category_label(category_name, config.label) + end + if config.index then + unified_inventory.set_category_index(category_name, config.index) + end + if config.items then + unified_inventory.add_category_items(category_name, config.items) + end + update_category_list() +end + +-- TODO: Mark these for removal. They are pretty much useless + +function unified_inventory.set_category_symbol(category_name, symbol) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].symbol = symbol + update_category_list() +end +function unified_inventory.set_category_label(category_name, label) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].label = label + update_category_list() +end +function unified_inventory.set_category_index(category_name, index) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].index = index + update_category_list() +end +function unified_inventory.add_category_item(category_name, item) + if type(item) ~= "string" then + minetest.log("warning", "[unified_inventory] Cannot register category item: " .. dump(item)) + return + end + + ensure_category_exists(category_name) + unified_inventory.registered_category_items[category_name][item] = true +end +function unified_inventory.add_category_items(category_name, items) + for _,item in ipairs(items) do + unified_inventory.add_category_item(category_name, item) + end +end + +function unified_inventory.remove_category_item(category_name, item) + unified_inventory.registered_category_items[category_name][item] = nil +end +function unified_inventory.remove_category(category_name) + unified_inventory.registered_categories[category_name] = nil + unified_inventory.registered_category_items[category_name] = nil + update_category_list() +end + +function unified_inventory.find_category(item) + -- Returns the first category the item exists in + -- Best for checking if an item has any category at all + for category, items in pairs(unified_inventory.registered_category_items) do + if items[item] then return category end + end +end +function unified_inventory.find_categories(item) + -- Returns all the categories the item exists in + -- Best for listing all categories + local categories = {} + for category, items in pairs(unified_inventory.registered_category_items) do + if items[item] then + table.insert(categories, category) + end + end + return categories +end diff --git a/mods/unified_inventory/default-categories.lua b/mods/unified_inventory/default-categories.lua new file mode 100644 index 00000000..19825277 --- /dev/null +++ b/mods/unified_inventory/default-categories.lua @@ -0,0 +1,704 @@ +local S = minetest.get_translator("unified_inventory") +local ui = unified_inventory + +unified_inventory.register_category('plants', { + symbol = "flowers:tulip", + label = S("Plant Life") +}) +unified_inventory.register_category('building', { + symbol = "default:brick", + label = S("Building Materials") +}) +unified_inventory.register_category('tools', { + symbol = "default:pick_diamond", + label = S("Tools") +}) +unified_inventory.register_category('minerals', { + symbol = "default:iron_lump", + label = S("Minerals and Metals") +}) +unified_inventory.register_category('environment', { + symbol = "default:dirt_with_grass", + label = S("Environment and Worldgen") +}) +unified_inventory.register_category('lighting', { + symbol = "default:torch", + label = S("Lighting") +}) + +local function register_automatic_categorization() + -- Add biome nodes to environment category + for _,def in pairs(minetest.registered_biomes) do + local env_nodes = { + def.node_riverbed, def.node_top, def.node_filler, def.node_dust, + } + for i,node in pairs(env_nodes) do + if node then + unified_inventory.add_category_item('environment', node) + end + end + end + + -- Preparation for ore registration: find all possible drops (digging) + local possible_node_dig_drops = { + -- ["default:stone_with_coal"] = { "default:coal_lump", "mymod:raregem" } + -- Ores may be contained multiple times, depending on drop chances. + } + for itemname, recipes in pairs(ui.crafts_for.usage) do + for _, recipe in ipairs(recipes) do + if recipe.type == "digging" or recipe.type == "digging_chance" then + if not possible_node_dig_drops[itemname] then + possible_node_dig_drops[itemname] = {} + end + local stack = ItemStack(recipe.output) + table.insert(possible_node_dig_drops[itemname], stack:get_name()) + end + end + end + + -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment + for _, odef in pairs(minetest.registered_ores) do + local drops = possible_node_dig_drops[odef.ore] + if drops and odef.ore_type == "scatter" then + ui.add_category_item('minerals', odef.ore) + -- Register all possible drops as "minerals" + ui.add_category_items('minerals', drops) + possible_node_dig_drops[odef.ore] = {} -- mask as handled + else + ui.add_category_item('environment', odef.ore) + end + end + + -- Add items by item definition + for name, def in pairs(minetest.registered_items) do + local group = def.groups or {} + if not group.not_in_creative_inventory then + if group.stair or + group.slab or + group.wall or + group.fence then + unified_inventory.add_category_item('building', name) + elseif group.flora or + group.flower or + group.seed or + group.leaves or + group.sapling or + group.tree then + unified_inventory.add_category_item('plants', name) + elseif def.type == 'tool' then + unified_inventory.add_category_item('tools', name) + elseif def.liquidtype == 'source' then + unified_inventory.add_category_item('environment', name) + elseif def.light_source and def.light_source > 0 then + unified_inventory.add_category_item('lighting', name) + elseif group.door or + minetest.global_exists("doors") and ( + doors.registered_doors and doors.registered_doors[name..'_a'] or + doors.registered_trapdoors and doors.registered_trapdoors[name] + ) then + unified_inventory.add_category_item('building', name) + end + end + end +end + +if ui.automatic_categorization then + ui.register_on_initialized(register_automatic_categorization) +end + + +-- [[ +unified_inventory.add_category_items('plants', { + "default:dry_grass_5", + "default:acacia_sapling", + "default:blueberry_bush_sapling", + "default:grass_2", + "default:pine_bush_stem", + "default:leaves", + "default:pine_needles", + "default:cactus", + "default:junglegrass", + "default:pine_sapling", + "default:sapling", + "default:bush_stem", + "default:dry_grass_2", + "default:fern_1", + "default:grass_3", + "default:marram_grass_1", + "default:pine_tree", + "default:dry_grass_3", + "default:dry_shrub", + "default:grass_4", + "default:marram_grass_2", + "default:jungleleaves", + "default:apple", + "default:tree", + "default:aspen_tree", + "default:bush_sapling", + "default:grass_5", + "default:blueberry_bush_leaves_with_berries", + "default:acacia_bush_sapling", + "default:grass_1", + "default:aspen_leaves", + "default:marram_grass_3", + "default:large_cactus_seedling", + "default:junglesapling", + "default:dry_grass_4", + "default:acacia_bush_stem", + "default:papyrus", + "default:pine_bush_needles", + "default:bush_leaves", + "default:fern_3", + "default:aspen_sapling", + "default:acacia_tree", + "default:apple_mark", + "default:acacia_leaves", + "default:jungletree", + "default:dry_grass_1", + "default:acacia_bush_leaves", + "default:emergent_jungle_sapling", + "default:fern_2", + "default:blueberries", + "default:sand_with_kelp", + "default:blueberry_bush_leaves", + "default:pine_bush_sapling", + + "farming:cotton", + "farming:cotton_1", + "farming:cotton_2", + "farming:cotton_3", + "farming:cotton_4", + "farming:cotton_5", + "farming:cotton_6", + "farming:cotton_7", + "farming:cotton_8", + "farming:cotton_wild", + "farming:seed_cotton", + "farming:seed_wheat", + "farming:straw", + "farming:wheat", + "farming:wheat_1", + "farming:wheat_2", + "farming:wheat_3", + "farming:wheat_4", + "farming:wheat_5", + "farming:wheat_6", + "farming:wheat_7", + "farming:wheat_8", + + "flowers:chrysanthemum_green", + "flowers:dandelion_white", + "flowers:dandelion_yellow", + "flowers:geranium", + "flowers:mushroom_brown", + "flowers:mushroom_red", + "flowers:rose", + "flowers:tulip", + "flowers:tulip_black", + "flowers:viola", + "flowers:waterlily", + "flowers:waterlily_waving", +}) + +unified_inventory.add_category_items('tools', { + "default:sword_diamond", + "default:axe_diamond", + "default:shovel_diamond", + "default:axe_steel", + "default:shovel_mese", + "default:sword_wood", + "default:pick_bronze", + "default:axe_stone", + "default:sword_stone", + "default:pick_stone", + "default:shovel_stone", + "default:sword_mese", + "default:shovel_bronze", + "default:sword_bronze", + "default:axe_bronze", + "default:shovel_steel", + "default:sword_steel", + "default:axe_mese", + "default:shovel_wood", + "default:pick_mese", + "default:axe_wood", + "default:pick_diamond", + "default:pick_wood", + "default:pick_steel", + + "farming:hoe_bronze", + "farming:hoe_diamond", + "farming:hoe_mese", + "farming:hoe_steel", + "farming:hoe_stone", + "farming:hoe_wood", + + "fire:flint_and_steel", + "map:mapping_kit", + "screwdriver:screwdriver", + + "fireflies:bug_net", + "bucket:bucket_empty", + + "binoculars:binoculars", + "default:skeleton_key", +}) + +unified_inventory.add_category_items('minerals', { + "default:stone_with_copper", + "default:stone_with_gold", + "default:stone_with_iron", + "default:copper_ingot", + "default:copper_lump", + "default:gold_lump", + "default:diamondblock", + "default:stone_with_diamond", + "default:stone_with_mese", + "default:steel_ingot", + "default:gold_ingot", + "default:iron_lump", + "default:tinblock", + "default:tin_lump", + "default:stone_with_tin", + "default:mese_crystal", + "default:diamond", + "default:bronze_ingot", + "default:mese", + "default:mese_crystal_fragment", + "default:copperblock", + "default:stone_with_coal", + "default:steelblock", + "default:tin_ingot", + "default:coalblock", + "default:coal_lump", + "default:bronzeblock", + "default:goldblock", +}) + +unified_inventory.add_category_items('building', { + "default:fence_rail_aspen_wood", + "default:fence_rail_acacia_wood", + "default:fence_junglewood", + "default:fence_rail_junglewood", + "default:fence_aspen_wood", + "default:fence_pine_wood", + "default:fence_rail_wood", + "default:fence_rail_pine_wood", + "default:fence_acacia_wood", + "default:junglewood", + "default:acacia_wood", + "default:aspen_wood", + "default:fence_wood", + "default:pine_wood", + "default:silver_sandstone", + "default:desert_sandstone", + "default:sandstone_block", + "default:desert_sandstone_brick", + "default:stone_block", + "default:stonebrick", + "default:obsidian_glass", + "default:desert_sandstone_block", + "default:silver_sandstone_brick", + "default:brick", + "default:obsidianbrick", + "default:sandstonebrick", + "default:sandstone", + "default:desert_stone_block", + "default:silver_sandstone_block", + "default:wood", + "default:obsidian_block", + "default:glass", + "default:clay_brick", + "default:desert_stonebrick", + "default:desert_cobble", + "default:cobble", + "default:mossycobble", + + "doors:door_glass", + "doors:door_glass_a", + "doors:door_glass_b", + "doors:door_glass_c", + "doors:door_glass_d", + "doors:door_obsidian_glass", + "doors:door_obsidian_glass_a", + "doors:door_obsidian_glass_b", + "doors:door_obsidian_glass_c", + "doors:door_obsidian_glass_d", + "doors:door_steel", + "doors:door_steel_a", + "doors:door_steel_b", + "doors:door_steel_c", + "doors:door_steel_d", + "doors:door_wood", + "doors:door_wood_a", + "doors:door_wood_b", + "doors:door_wood_c", + "doors:door_wood_d", + "doors:gate_acacia_wood_closed", + "doors:gate_acacia_wood_open", + "doors:gate_aspen_wood_closed", + "doors:gate_aspen_wood_open", + "doors:gate_junglewood_closed", + "doors:gate_junglewood_open", + "doors:gate_pine_wood_closed", + "doors:gate_pine_wood_open", + "doors:gate_wood_closed", + "doors:gate_wood_open", + "doors:hidden", + "doors:trapdoor", + "doors:trapdoor_open", + "doors:trapdoor_steel", + "doors:trapdoor_steel_open", + + "stairs:slab_bronzeblock", + "stairs:slab_copperblock", + "stairs:slab_steelblock", + "stairs:slab_tinblock", + "stairs:stair_bronzeblock", + "stairs:stair_copperblock", + "stairs:stair_inner_bronzeblock", + "stairs:stair_inner_copperblock", + "stairs:stair_inner_steelblock", + "stairs:stair_inner_tinblock", + "stairs:stair_outer_bronzeblock", + "stairs:stair_outer_copperblock", + "stairs:stair_outer_steelblock", + "stairs:stair_outer_tinblock", + "stairs:stair_steelblock", + "stairs:stair_tinblock", + + "stairs:slab_acacia_wood", + "stairs:slab_aspen_wood", + "stairs:slab_brick", + "stairs:slab_cobble", + "stairs:slab_desert_cobble", + "stairs:slab_desert_sandstone", + "stairs:slab_desert_sandstone_block", + "stairs:slab_desert_sandstone_brick", + "stairs:slab_desert_stone", + "stairs:slab_desert_stone_block", + "stairs:slab_desert_stonebrick", + "stairs:slab_glass", + "stairs:slab_goldblock", + "stairs:slab_ice", + "stairs:slab_junglewood", + "stairs:slab_mossycobble", + "stairs:slab_obsidian", + "stairs:slab_obsidian_block", + "stairs:slab_obsidian_glass", + "stairs:slab_obsidianbrick", + "stairs:slab_pine_wood", + "stairs:slab_sandstone", + "stairs:slab_sandstone_block", + "stairs:slab_sandstonebrick", + "stairs:slab_silver_sandstone", + "stairs:slab_silver_sandstone_block", + "stairs:slab_silver_sandstone_brick", + "stairs:slab_snowblock", + "stairs:slab_stone", + "stairs:slab_stone_block", + "stairs:slab_stonebrick", + "stairs:slab_straw", + "stairs:slab_wood", + "stairs:stair_acacia_wood", + "stairs:stair_aspen_wood", + "stairs:stair_brick", + "stairs:stair_cobble", + "stairs:stair_desert_cobble", + "stairs:stair_desert_sandstone", + "stairs:stair_desert_sandstone_block", + "stairs:stair_desert_sandstone_brick", + "stairs:stair_desert_stone", + "stairs:stair_desert_stone_block", + "stairs:stair_desert_stonebrick", + "stairs:stair_glass", + "stairs:stair_goldblock", + "stairs:stair_ice", + "stairs:stair_inner_acacia_wood", + "stairs:stair_inner_aspen_wood", + "stairs:stair_inner_brick", + "stairs:stair_inner_cobble", + "stairs:stair_inner_desert_cobble", + "stairs:stair_inner_desert_sandstone", + "stairs:stair_inner_desert_sandstone_block", + "stairs:stair_inner_desert_sandstone_brick", + "stairs:stair_inner_desert_stone", + "stairs:stair_inner_desert_stone_block", + "stairs:stair_inner_desert_stonebrick", + "stairs:stair_inner_glass", + "stairs:stair_inner_goldblock", + "stairs:stair_inner_ice", + "stairs:stair_inner_junglewood", + "stairs:stair_inner_mossycobble", + "stairs:stair_inner_obsidian", + "stairs:stair_inner_obsidian_block", + "stairs:stair_inner_obsidian_glass", + "stairs:stair_inner_obsidianbrick", + "stairs:stair_inner_pine_wood", + "stairs:stair_inner_sandstone", + "stairs:stair_inner_sandstone_block", + "stairs:stair_inner_sandstonebrick", + "stairs:stair_inner_silver_sandstone", + "stairs:stair_inner_silver_sandstone_block", + "stairs:stair_inner_silver_sandstone_brick", + "stairs:stair_inner_snowblock", + "stairs:stair_inner_stone", + "stairs:stair_inner_stone_block", + "stairs:stair_inner_stonebrick", + "stairs:stair_inner_straw", + "stairs:stair_inner_wood", + "stairs:stair_junglewood", + "stairs:stair_mossycobble", + "stairs:stair_obsidian", + "stairs:stair_obsidian_block", + "stairs:stair_obsidian_glass", + "stairs:stair_obsidianbrick", + "stairs:stair_outer_acacia_wood", + "stairs:stair_outer_aspen_wood", + "stairs:stair_outer_brick", + "stairs:stair_outer_cobble", + "stairs:stair_outer_desert_cobble", + "stairs:stair_outer_desert_sandstone", + "stairs:stair_outer_desert_sandstone_block", + "stairs:stair_outer_desert_sandstone_brick", + "stairs:stair_outer_desert_stone", + "stairs:stair_outer_desert_stone_block", + "stairs:stair_outer_desert_stonebrick", + "stairs:stair_outer_glass", + "stairs:stair_outer_goldblock", + "stairs:stair_outer_ice", + "stairs:stair_outer_junglewood", + "stairs:stair_outer_mossycobble", + "stairs:stair_outer_obsidian", + "stairs:stair_outer_obsidian_block", + "stairs:stair_outer_obsidian_glass", + "stairs:stair_outer_obsidianbrick", + "stairs:stair_outer_pine_wood", + "stairs:stair_outer_sandstone", + "stairs:stair_outer_sandstone_block", + "stairs:stair_outer_sandstonebrick", + "stairs:stair_outer_silver_sandstone", + "stairs:stair_outer_silver_sandstone_block", + "stairs:stair_outer_silver_sandstone_brick", + "stairs:stair_outer_snowblock", + "stairs:stair_outer_stone", + "stairs:stair_outer_stone_block", + "stairs:stair_outer_stonebrick", + "stairs:stair_outer_straw", + "stairs:stair_outer_wood", + "stairs:stair_pine_wood", + "stairs:stair_sandstone", + "stairs:stair_sandstone_block", + "stairs:stair_sandstonebrick", + "stairs:stair_silver_sandstone", + "stairs:stair_silver_sandstone_block", + "stairs:stair_silver_sandstone_brick", + "stairs:stair_snowblock", + "stairs:stair_stone", + "stairs:stair_stone_block", + "stairs:stair_stonebrick", + "stairs:stair_straw", + "stairs:stair_wood", + + "xpanes:bar", + "xpanes:bar_flat", + "xpanes:door_steel_bar", + "xpanes:door_steel_bar_a", + "xpanes:door_steel_bar_b", + "xpanes:door_steel_bar_c", + "xpanes:door_steel_bar_d", + "xpanes:obsidian_pane", + "xpanes:obsidian_pane_flat", + "xpanes:pane", + "xpanes:pane_flat", + "xpanes:trapdoor_steel_bar", + "xpanes:trapdoor_steel_bar_open", + + "walls:cobble", + "walls:desertcobble", + "walls:mossycobble", +}) + +unified_inventory.add_category_items('environment', { + "air", + "default:cave_ice", + "default:dirt_with_rainforest_litter", + "default:gravel", + "default:dry_dirt_with_dry_grass", + "default:permafrost", + "default:desert_stone", + "default:ice", + "default:dry_dirt", + "default:obsidian", + "default:sand", + "default:river_water_source", + "default:dirt_with_snow", + "default:dirt_with_grass", + "default:water_flowing", + "default:dirt", + "default:desert_sand", + "default:permafrost_with_moss", + "default:dirt_with_coniferous_litter", + "default:water_source", + "default:dirt_with_dry_grass", + "default:river_water_flowing", + "default:stone", + "default:snow", + "default:lava_flowing", + "default:lava_source", + "default:permafrost_with_stones", + "default:dirt_with_grass_footsteps", + "default:silver_sand", + "default:snowblock", + "default:clay", + + "farming:desert_sand_soil", + "farming:desert_sand_soil_wet", + "farming:dry_soil", + "farming:dry_soil_wet", + "farming:soil", + "farming:soil_wet", +}) + +unified_inventory.add_category_items('lighting', { + "default:mese_post_light_junglewood", + "default:torch_ceiling", + "default:meselamp", + "default:torch", + "default:mese_post_light_acacia_wood", + "default:mese_post_light", + "default:torch_wall", + "default:mese_post_light_pine_wood", + "default:mese_post_light_aspen_wood" +}) +--]] + + +--[[ UNCATEGORISED + + "farming:string", + + "beds:bed_bottom", + "beds:bed_top", + "beds:fancy_bed_bottom", + "beds:fancy_bed_top", + "boats:boat", + "bones:bones", + + "bucket:bucket_lava", + "bucket:bucket_river_water", + "bucket:bucket_water", + + "butterflies:butterfly_red", + "butterflies:butterfly_violet", + "butterflies:butterfly_white", + "butterflies:hidden_butterfly_red", + "butterflies:hidden_butterfly_violet", + "butterflies:hidden_butterfly_white", + + "carts:brakerail", + "carts:cart", + "carts:powerrail", + "carts:rail", + + "default:book", + "default:book_written", + "default:bookshelf", + "default:chest", + "default:chest_locked", + "default:chest_locked_open", + "default:chest_open", + "default:clay_lump", + "default:cloud", + "default:coral_brown", + "default:coral_cyan", + "default:coral_green", + "default:coral_orange", + "default:coral_pink", + "default:coral_skeleton", + "default:flint", + "default:furnace", + "default:furnace_active", + "default:key", + "default:ladder_steel", + "default:ladder_wood", + "default:obsidian_shard", + "default:paper", + "default:sign_wall_steel", + "default:sign_wall_wood", + "default:stick", + + "fire:basic_flame", + "fire:permanent_flame", + "fireflies:firefly", + "fireflies:firefly_bottle", + "fireflies:hidden_firefly", + + "ignore", + "unknown", + + "tnt:boom", + "tnt:gunpowder", + "tnt:gunpowder_burning", + "tnt:tnt", + "tnt:tnt_burning", + "tnt:tnt_stick", + + "vessels:drinking_glass", + "vessels:glass_bottle", + "vessels:glass_fragments", + "vessels:shelf", + "vessels:steel_bottle", + + "dye:black", + "dye:blue", + "dye:brown", + "dye:cyan", + "dye:dark_green", + "dye:dark_grey", + "dye:green", + "dye:grey", + "dye:magenta", + "dye:orange", + "dye:pink", + "dye:red", + "dye:violet", + "dye:white", + "dye:yellow", + + "wool:black", + "wool:blue", + "wool:brown", + "wool:cyan", + "wool:dark_green", + "wool:dark_grey", + "wool:green", + "wool:grey", + "wool:magenta", + "wool:orange", + "wool:pink", + "wool:red", + "wool:violet", + "wool:white", + "wool:yellow", + + "unified_inventory:bag_large", + "unified_inventory:bag_medium", + "unified_inventory:bag_small", +--]] + +--[[ LIST UNCATEGORIZED AFTER LOAD +minetest.register_on_mods_loaded(function() + minetest.after(1, function ( ) + local l = {} + for name,_ in pairs(minetest.registered_items) do + if not unified_inventory.find_category(name) then + -- minetest.log("error", minetest.serialize(minetest.registered_items[name])) + table.insert(l, name) + end + end + table.sort(l) + minetest.log(table.concat(l, '",'.."\n"..'"')) + end) +end) +--]] \ No newline at end of file diff --git a/mods/unified_inventory/doc/mod_api.txt b/mods/unified_inventory/doc/mod_api.txt new file mode 100644 index 00000000..45eb4327 --- /dev/null +++ b/mods/unified_inventory/doc/mod_api.txt @@ -0,0 +1,222 @@ +unified_inventory API +===================== + +This file provides information about the API of unified_inventory +and can be viewed in Markdown readers. + +API revisions within unified_inventory can be checked using: + + (unified_inventory.version or 1) + +**Revision history** + +* Version `1`: Classic formspec layout (no real_coordinates) +* Version `2`: Force formspec version 4 (includes real_coordinates) + +Misc functions +-------------- +Grouped by use-case, afterwards sorted alphabetically. + +* `unified_inventory.is_creative(name)` + * Checks whether creative is enabled or the player has `creative` + + +Callbacks +--------- + +Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft. +This callback is run before any recipe ingredients checks, hence it is also executed on recipes that are +purged after all mods finished loading. + + unified_inventory.register_on_craft_registered( + function (item_name, options) + -- item_name (string): name of the output item, equivalent to `ItemStack:get_name()` + -- options (table): definition table of crafts registered by `unified_inventory.register_craft` + end + ) + +Register a callback that will be run after all mods have loaded and after the unified_inventory mod has initialised all its internal structures: + + unified_inventory.register_on_initialized(callback) + -- The callback is passed no arguments + + +Accessing Data +-------------- + +These methods should be used instead of accessing the unified_inventory data structures directly - this will ensure your code survives any potential restructuring of the mod. + +Get a list of recipes for a particular output item: + + unified_inventory.get_recipe_list(output_item) + + Returns a list of tables, each holding a recipe definition, like: + { + { + type = "normal", + items = { "default:stick", "default:stick", "default:stick", "default:stick" }, + output = "default:wood", + width = 2 + }, + { + type = "shapeless", + items = { "default:tree" }, + output = "default:wood 4", + width = 0 + }, + ... + } + +Get a list of all the output items crafts have been registered for: + + unified_inventory.get_registered_outputs() + + Returns a list of item names, like: + { + "default:stone", + "default:chest", + "default:brick", + "doors:door_wood", + ... + } + + +Pages +----- + +Register a new page: The callback inside this function is called on user input. + + unified_inventory.register_page("pagename", { + get_formspec = function(player) + -- ^ `player` is an `ObjectRef` + -- Compute the formspec string here + return { + formspec = "button[2,2;2,1;mybutton;Press me]", + -- ^ Final form of the formspec to display + draw_inventory = false, -- default `true` + -- ^ Optional. Hides the player's `main` inventory list + draw_item_list = false, -- default `true` + -- ^ Optional. Hides the item list on the right side + formspec_prepend = false, -- default `false` + -- ^ Optional. When `false`: Disables the formspec prepend + } + end, + }) + + +Buttons +------- + +Register a new button for the bottom row: + + unified_inventory.register_button("skins", { + type = "image", + image = "skins_skin_button.png", + tooltip = "Skins", + hide_lite = true + -- ^ Button is hidden when following two conditions are met: + -- Configuration line `unified_inventory_lite = true` + -- Player does not have the privilege `ui_full` + }) + + + +Crafting +-------- + +The code blocks below document each possible parameter using exemplary values. + +Provide information to display custom craft types: + + unified_inventory.register_craft_type("mytype", { + -- ^ Unique identifier for `register_craft` + description = "Sample Craft", + -- ^ Text shown below the crafting arrow + icon = "dummy.png", + -- ^ Image shown above the crafting arrow + width = 3, + height = 3, + -- ^ Maximal input dimensions of the recipes + dynamic_display_size = function(craft) + -- ^ `craft` is the definition from `register_craft` + return { + width = 2, + height = 3 + } + end, + -- ^ Optional callback to change the displayed recipe size + uses_crafting_grid = true, + }) + +Register a non-standard craft recipe: + + unified_inventory.register_craft({ + output = "default:foobar", + type = "mytype", + -- ^ Standard craft type or custom (see `register_craft_type`) + items = { + { "default:foo" }, + { "default:bar" } + }, + width = 3, + -- ^ Same as `minetest.register_recipe` + }) + + +Categories +---------- + + * `unified_inventory.register_category(name, def)` + * Registers a new category + * `name` (string): internal category name + * `def` (optional, table): also its fields are optional + + unified_inventory.register_category("category_name", { + symbol = source, + -- ^ Can be in the format "mod_name:item_name" or "texture.png", + label = "Human Readable Label", + index = 5, + -- ^ Categories are sorted by index. Lower numbers appear before higher ones. + -- By default, the name is translated to a number: AA -> 0.0101, ZZ -> 0.2626 + --- Predefined category indices: "all" = -2, "uncategorized" = -1 + items = { + "mod_name:item_name", + "another_mod:different_item" + } + -- ^ List of items within this category + }) + * `unified_inventory.remove_category(name)` + * Removes an entire category + +Modifier functions (to be removed) + + * `unified_inventory.set_category_symbol(name, source)` + * Changes the symbol of the category. The category does not need to exist yet. + * `name` (string): internal category name + * `source` (string, optional): `"mod_name:item_name"` or `"texture.png"`. + Defaults to `"default:stick"` if not specified. + * `unified_inventory.set_category_label(name, label)` + * Changes the human readable label of the category. + * `name` (string): internal category name + * `label` (string): human readable label. Defaults to the category name. + * `unified_inventory.set_category_index(name, index)` + * Changes the sorting index of the category. + * `name` (string): internal category name + * `index` (numeric): any real number + +Item management + + * ` unified_inventory.add_category_item(name, itemname)` + * Adds a single item to the category + * `itemname` (string): self-explanatory + * `unified_inventory.add_category_items(name, { itemname1, itemname2, ... }` + * Same as above but with multiple items + * `unified_inventory.remove_category_item(name, itemname)` + * Removes an item from the category + * `unified_inventory.find_category(itemname)` + * Looks up the first category containing this item + * Returns: category name (string) or nil + * `unified_inventory.find_categories(itemname)` + * Looks up the item name within all registered categories + * Returns: array of category names (table) + diff --git a/mods/unified_inventory/group.lua b/mods/unified_inventory/group.lua new file mode 100644 index 00000000..1483b3cd --- /dev/null +++ b/mods/unified_inventory/group.lua @@ -0,0 +1,146 @@ +local S = minetest.get_translator("unified_inventory") +local ui = unified_inventory + +function unified_inventory.extract_groupnames(groupname) + local specname = ItemStack(groupname):get_name() + if specname:sub(1, 6) ~= "group:" then + return nil, 0 + end + local group_names = specname:sub(7):split(",") + return table.concat(group_names, S(" and ")), #group_names +end + + +-- This is used when displaying craft recipes, where an ingredient is +-- specified by group rather than as a specific item. A single-item group +-- is represented by that item, with the single-item status signalled +-- in the "sole" field. If the group contains no items at all, the item +-- field will be nil. +-- +-- Within a multiple-item group, we prefer to use an item that has the +-- same specific name as the group, and if there are more than one of +-- those items we prefer the one registered for the group by a mod. +-- Among equally-preferred items, we just pick the one with the +-- lexicographically earliest name. +-- +-- The parameter to this function isn't just a single group name. +-- It may be a comma-separated list of group names. This is really a +-- "group:..." ingredient specification, minus the "group:" prefix. + +-- TODO Replace this with the more efficient spec matcher (below) +local function compute_group_item(group_name_list) + local group_names = group_name_list:split(",") + local candidate_items = {} + for itemname, itemdef in pairs(minetest.registered_items) do + if (itemdef.groups.not_in_creative_inventory or 0) == 0 then + local all = true + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + all = false + end + end + if all then table.insert(candidate_items, itemname) end + end + end + local num_candidates = #candidate_items + if num_candidates == 0 then + return {sole = true} + elseif num_candidates == 1 then + return {item = candidate_items[1], sole = true} + end + local is_group = {} + local registered_rep = {} + for _, group_name in ipairs(group_names) do + is_group[group_name] = true + local rep = unified_inventory.registered_group_items[group_name] + if rep then registered_rep[rep] = true end + end + local bestitem = "" + local bestpref = 0 + for _, item in ipairs(candidate_items) do + local pref + if registered_rep[item] then + pref = 4 + elseif string.sub(item, 1, 8) == "default:" and is_group[string.sub(item, 9)] then + pref = 3 + elseif is_group[item:gsub("^[^:]*:", "")] then + pref = 2 + else + pref = 1 + end + if pref > bestpref or (pref == bestpref and item < bestitem) then + bestitem = item + bestpref = pref + end + end + return {item = bestitem, sole = false} +end + + +local group_item_cache = {} + +function unified_inventory.get_group_item(group_name) + if not group_item_cache[group_name] then + group_item_cache[group_name] = compute_group_item(group_name) + end + return group_item_cache[group_name] +end + + +--[[ +This is for filtering known items by groups +e.g. find all items that match "group:flower,yellow" (flower AND yellow groups) +]] +local spec_matcher = {} +function unified_inventory.init_matching_cache() + for _, name in ipairs(ui.items_list) do + -- we only need to care about groups, exact items are handled separately + for group, value in pairs(minetest.registered_items[name].groups) do + if value and value ~= 0 then + if not spec_matcher[group] then + spec_matcher[group] = {} + end + spec_matcher[group][name] = true + end + end + end +end + +--[[ +Retrieves all matching items + +Arguments: + specname (string): Item name or group(s) to filter + +Output: + { + matchingitem1 = true, + ... + } +]] +function unified_inventory.get_matching_items(specname) + if specname:sub(1,6) ~= "group:" then + return { [specname] = true } + end + + local accepted = {} + for i, group in ipairs(specname:sub(7):split(",")) do + if i == 1 then + -- First step: Copy all possible item names in this group + for name, _ in pairs(spec_matcher[group] or {}) do + accepted[name] = true + end + else + -- Perform filtering + if spec_matcher[group] then + for name, _ in pairs(accepted) do + accepted[name] = spec_matcher[group][name] + end + else + -- No matching items + return {} + end + end + end + return accepted +end diff --git a/mods/unified_inventory/image_credits.txt b/mods/unified_inventory/image_credits.txt new file mode 100644 index 00000000..12fbc650 --- /dev/null +++ b/mods/unified_inventory/image_credits.txt @@ -0,0 +1,69 @@ +bags_small.png: + http://www.clker.com/clipart-moneybag-empty.html + +bags_medium.png: + http://www.clker.com/clipart-backpack-1.html + +bags_large.png / ui_bags_icon.png: + http://www.clker.com/clipart-backpack-green-brown.html + +ui_craftguide_icon.png / ui_craft_icon.png + http://commons.wikimedia.org/wiki/File:Advancedsettings.png + +ui_doubleleft_icon.png + http://commons.wikimedia.org/wiki/File:Media-seek-backward.svg + +ui_doubleright_icon.png + http://commons.wikimedia.org/wiki/File:Media-seek-forward.svg + +ui_left_icon.png / ui_right_icon.png + http://commons.wikimedia.org/wiki/File:Media-playback-start.svg + +ui_skip_backward_icon.png + http://commons.wikimedia.org/wiki/File:Media-skip-backward.svg + +ui_skip_forward_icon.png + http://commons.wikimedia.org/wiki/File:Media-skip-forward.svg + +ui_reset_icon.png + https://commons.wikimedia.org/wiki/File:Edit-clear.svg + +ui_gohome_icon.png / ui_home_icon.png / ui_sethome_icon.png + http://commons.wikimedia.org/wiki/File:Home_256x256.png + +ui_moon_icon.png + http://commons.wikimedia.org/wiki/File:FullMoon2010.jpg + +ui_sun_icon.png + http://commons.wikimedia.org/wiki/File:2012-10-13_15-29-35-sun.jpg + +ui_trash_icon.png + http://www.clker.com/clipart-29090.html + http://www.clker.com/clipart-trash.html + +ui_search_icon.png + http://www.clker.com/clipart-24887.html + +ui_off_icon.png / ui_on_icon.png + http://www.clker.com/clipart-on-off-switches.html + +ui_waypoints_icon.png + http://www.clker.com/clipart-map-pin-red.html + +ui_circular_arrows_icon.png + http://www.clker.com/clipart-circular-arrow-pattern.html + +ui_pencil_icon.pnc + http://www.clker.com/clipart-2256.html + +ui_waypoint_set_icon.png + http://www.clker.com/clipart-larger-flag.html + +ui_xyz_off_icon.png + http://commons.wikimedia.org/wiki/File:No_sign.svg + +ui_ok_icon.png + http://commons.wikimedia.org/wiki/File:Yes_check.svg + +inventory_plus_worldedit_gui.png + http://commons.wikimedia.org/wiki/File:Erioll_world_2.svg diff --git a/mods/unified_inventory/init.lua b/mods/unified_inventory/init.lua new file mode 100644 index 00000000..9c8ec35d --- /dev/null +++ b/mods/unified_inventory/init.lua @@ -0,0 +1,201 @@ +-- Unified Inventory + +if not minetest.features.formspec_version_element then + -- At least formspec_version[] is the minimal feature requirement + error("Unified Inventory requires Minetest version 5.4.0 or newer.\n" .. + " Please update Minetest or use an older version of Unified Inventory.") +end + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local worldpath = minetest.get_worldpath() + +-- Data tables definitions +unified_inventory = { + activefilter = {}, + active_search_direction = {}, + alternate = {}, + current_page = {}, + current_searchbox = {}, + current_category = {}, + current_category_scroll = {}, + current_index = {}, + current_item = {}, + current_craft_direction = {}, + registered_craft_types = {}, + crafts_for = {usage = {}, recipe = {} }, + players = {}, + items_list_size = 0, + items_list = {}, + filtered_items_list_size = {}, + filtered_items_list = {}, + pages = {}, + buttons = {}, + initialized_callbacks = {}, + craft_registered_callbacks = {}, + + -- Homepos stuff + home_pos = {}, + home_filename = worldpath.."/unified_inventory_home.home", + + -- Default inventory page + default = "craft", + + -- "Lite" mode + lite_mode = minetest.settings:get_bool("unified_inventory_lite"), + + -- Items automatically added to categories based on item definitions + automatic_categorization = (minetest.settings:get_bool("unified_inventory_automatic_categorization") ~= false), + + -- Trash enabled + trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), + imgscale = 1.25, + list_img_offset = 0.13, + standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", + + hide_disabled_buttons = minetest.settings:get_bool("unified_inventory_hide_disabled_buttons", false), + hide_uncraftable_items = minetest.settings:get_bool("unified_inventory_hide_uncraftable_items", false), + + version = 5 +} + +local ui = unified_inventory + +-- These tables establish position and layout for the two UI styles. +-- UI doesn't use formspec_[xy] anymore, but other mods may need them. + +ui.style_full = { + formspec_x = 1, + formspec_y = 1, + formw = 17.75, + formh = 12.25, + -- Item browser size, pos + pagecols = 8, + pagerows = 9, + page_x = 10.75, + page_y = 2.30, + -- Item browser controls + page_buttons_x = 11.60, + page_buttons_y = 10.15, + searchwidth = 3.4, + -- Crafting grid positions + craft_x = 2.8, + craft_y = 1.15, + craftresult_x = 7.8, + craft_arrow_x = 6.55, + craft_guide_x = 3.3, + craft_guide_y = 1.15, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.3, + craft_guide_resultstr_y = 0.6, + give_btn_x = 0.25, + -- Tab switching buttons + main_button_x = 0.4, + main_button_y = 11.0, + main_button_cols = 12, + main_button_rows = 1, + -- Tab title position + form_header_x = 0.4, + form_header_y = 0.4, + -- Generic sizes + btn_spc = 0.85, + btn_size = 0.75, + std_inv_x = 0.3, + std_inv_y = 5.75, +} + +ui.style_lite = { + formspec_x = 0.6, + formspec_y = 0.6, + formw = 14, + formh = 9.75, + -- Item browser size, pos + pagecols = 4, + pagerows = 5, + page_x = 10.5, + page_y = 2.15, + -- Item browser controls + page_buttons_x = 10.5, + page_buttons_y = 6.15, + searchwidth = 1.6, + -- Crafting grid positions + craft_x = 2.6, + craft_y = 0.75, + craftresult_x = 5.75, + craft_arrow_x = 6.35, + craft_guide_x = 3.1, + craft_guide_y = 0.75, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.15, + craft_guide_resultstr_y = 0.35, + give_btn_x = 0.15, + -- Tab switching buttons + main_button_x = 10.5, + main_button_y = 8.15, + main_button_cols = 4, + main_button_rows = 2, + -- Tab title position + form_header_x = 0.2, + form_header_y = 0.2, + -- Generic sizes + btn_spc = 0.8, + btn_size = 0.7, + std_inv_x = 0.1, + std_inv_y = 4.6, +} + +dofile(modpath.."/api.lua") + +for _, style in ipairs({ui.style_full, ui.style_lite}) do + style.items_per_page = style.pagecols * style.pagerows + style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + style.std_inv_x + ui.list_img_offset, style.std_inv_y + ui.list_img_offset) + + style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. + ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) + + style.craft_grid = table.concat({ + ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), + ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot + string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale), + string.format("list[current_player;craft;%f,%f;3,3;]", + style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), + string.format("list[current_player;craftpreview;%f,%f;1,1;]", + style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset) + }) +end + +-- Disable default creative inventory +local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") +if creative then + function creative.set_creative_formspec(player, start_i, pagenum) + return + end +end + +-- Disable sfinv inventory +local sfinv = rawget(_G, "sfinv") +if sfinv then + sfinv.enabled = false +end + +dofile(modpath.."/group.lua") +dofile(modpath.."/category.lua") +dofile(modpath.."/default-categories.lua") +dofile(modpath.."/internal.lua") +dofile(modpath.."/callbacks.lua") +dofile(modpath.."/match_craft.lua") +dofile(modpath.."/register.lua") + +if minetest.settings:get_bool("unified_inventory_bags") ~= false then + dofile(modpath.."/bags.lua") +end +if minetest.settings:get_bool("unified_inventory_item_names") ~= false then + dofile(modpath.."/item_names.lua") +end +if minetest.settings:get_bool("unified_inventory_waypoints") ~= false then + dofile(modpath.."/waypoints.lua") +end +dofile(modpath.."/legacy.lua") -- mod compatibility diff --git a/mods/unified_inventory/internal.lua b/mods/unified_inventory/internal.lua new file mode 100644 index 00000000..3caa43a5 --- /dev/null +++ b/mods/unified_inventory/internal.lua @@ -0,0 +1,448 @@ +local S = minetest.get_translator("unified_inventory") +local F = minetest.formspec_escape +local ui = unified_inventory + +-- This pair of encoding functions is used where variable text must go in +-- button names, where the text might contain formspec metacharacters. +-- We can escape button names for the formspec, to avoid screwing up +-- form structure overall, but they then don't get de-escaped, and so +-- the input we get back from the button contains the formspec escaping. +-- This is a game engine bug, and in the anticipation that it might be +-- fixed some day we don't want to rely on it. So for safety we apply +-- an encoding that avoids all formspec metacharacters. + +function ui.mangle_for_formspec(str) + return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end) +end +function ui.demangle_for_formspec(str) + return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) +end + +-- Get the player-specific unified_inventory style +function ui.get_per_player_formspec(player_name) + local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) + + local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full) + style.is_lite_mode = draw_lite_mode + return style +end + +-- Creates an item image or regular image button with a tooltip +local function formspec_button(ui_peruser, name, image, offset, pos, scale, label) + local element = 'image_button' + if minetest.registered_items[image] then + element = 'item_image_button' + elseif image:find(":", 1, true) then + image = "unknown_item.png" + end + local spc = (1-scale)*ui_peruser.btn_size/2 + local size = ui_peruser.btn_size*scale + return string.format("%s[%f,%f;%f,%f;%s;%s;]", element, + (offset.x or offset[1]) + ( ui_peruser.btn_spc * (pos.x or pos[1]) ) + spc, + (offset.y or offset[2]) + ( ui_peruser.btn_spc * (pos.y or pos[2]) ) + spc, + size, size, image, name) .. + string.format("tooltip[%s;%s]", name, F(label or name)) +end + +-- Add registered buttons (tabs) +local function formspec_tab_buttons(player, formspec, style) + local n = #formspec + 1 + + -- Main buttons + + local filtered_inv_buttons = {} + + for _, def in pairs(ui.buttons) do + if not (style.is_lite_mode and def.hide_lite) then + if def.condition == nil or def.condition(player) or not ui.hide_disabled_buttons then + table.insert(filtered_inv_buttons, def) + end + end + end + + local needs_scrollbar = #filtered_inv_buttons > style.main_button_cols * style.main_button_rows + + formspec[n] = ("scroll_container[%g,%g;%g,%g;tabbtnscroll;vertical]"):format( + style.main_button_x, style.main_button_y, -- position + style.main_button_cols * style.btn_spc, style.main_button_rows -- size + ) + n = n + 1 + + for i, def in pairs(filtered_inv_buttons) do + local pos_x = ((i - 1) % style.main_button_cols) * style.btn_spc + local pos_y = math.floor((i - 1) / style.main_button_cols) * style.btn_spc + + if def.type == "image" then + if (def.condition == nil or def.condition(player)) then + formspec[n] = string.format("image_button[%g,%g;%g,%g;%s;%s;]", + pos_x, pos_y, style.btn_size, style.btn_size, + F(def.image), + F(def.name)) + formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" + n = n+2 + + else + formspec[n] = string.format("image[%g,%g;%g,%g;%s^[colorize:#808080:alpha]", + pos_x, pos_y, style.btn_size, style.btn_size, + def.image) + n = n+1 + end + end + end + formspec[n] = "scroll_container_end[]" + if needs_scrollbar then + local total_rows = math.ceil(#filtered_inv_buttons / style.main_button_cols) + formspec[n+1] = ("scrollbaroptions[max=%i;arrows=hide]"):format( + -- This calculation is not 100% accurate but "good enough" + (total_rows - style.main_button_rows) * style.btn_spc * 10 + ) + formspec[n+2] = ("scrollbar[%g,%g;0.4,%g;vertical;tabbtnscroll;0]"):format( + style.main_button_x + style.main_button_cols * style.btn_spc - 0.1, -- x pos + style.main_button_y, -- y pos + style.main_button_rows * style.btn_spc -- height + ) + formspec[n+3] = "scrollbaroptions[max=1000;arrows=default]" + end +end + +-- Add category GUI elements (top right) +local function formspec_add_categories(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + local categories_pos = { + ui_peruser.page_x, + ui_peruser.page_y-ui_peruser.btn_spc-0.5 + } + local categories_scroll_pos = { + ui_peruser.page_x, + ui_peruser.form_header_y - (ui_peruser.is_lite_mode and 0 or 0.2) + } + + formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;16]", + ui_peruser.page_x-0.15, categories_scroll_pos[2], + (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.2, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), + "ui_smallbg_9_sliced.png") + n = n + 1 + + formspec[n] = string.format("label[%f,%f;%s]", + ui_peruser.page_x, + ui_peruser.form_header_y + (ui_peruser.is_lite_mode and 0.3 or 0.2), F(S("Category:"))) + n = n + 1 + + local scroll_offset = 0 + local category_count = #ui.category_list + if category_count > ui_peruser.pagecols then + scroll_offset = ui.current_category_scroll[player_name] + end + + for index, category in ipairs(ui.category_list) do + local column = index - scroll_offset + if column > 0 and column <= ui_peruser.pagecols then + local scale = 0.8 + if ui.current_category[player_name] == category.name then + scale = 1 + end + formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label) + n = n + 1 + end + end + if category_count > ui_peruser.pagecols and scroll_offset > 0 then + -- prev + formspec[n] = formspec_button(ui_peruser, "prev_category", "ui_left_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 2, 0}, 0.8, S("Scroll categories left")) + n = n + 1 + end + if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then + -- next + formspec[n] = formspec_button(ui_peruser, "next_category", "ui_right_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 1, 0}, 0.8, S("Scroll categories right")) + end +end + +local function formspec_add_search_box(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + formspec[n] = "field_close_on_enter[searchbox;false]" + + formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]", + ui_peruser.page_buttons_x, ui_peruser.page_buttons_y, + ui_peruser.searchwidth - 0.1, ui_peruser.btn_size, + F(ui.current_searchbox[player_name])) + formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_search_icon.png;searchbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth, ui_peruser.page_buttons_y, + ui_peruser.btn_size,ui_peruser.btn_size) + formspec[n+3] = "tooltip[searchbutton;" ..F(S("Search")) .. "]" + formspec[n+4] = string.format("image_button[%f,%f;%f,%f;ui_reset_icon.png;searchresetbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth + ui_peruser.btn_spc, + ui_peruser.page_buttons_y, + ui_peruser.btn_size, ui_peruser.btn_size) + formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]" + + if ui.activefilter[player_name] ~= "" then + formspec[n+6] = string.format("label[%f,%f;%s: %s]", + ui_peruser.page_x, ui_peruser.page_y - 0.25, + F(S("Filter")), F(ui.activefilter[player_name])) + end +end + +local function formspec_add_item_browser(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + -- Controls to flip items pages + + local btnlist = { + { "ui_skip_backward_icon.png", "start_list", S("First page") }, + { "ui_doubleleft_icon.png", "rewind3", S("Back three pages") }, + { "ui_left_icon.png", "rewind1", S("Back one page") }, + { "ui_right_icon.png", "forward1", S("Forward one page") }, + { "ui_doubleright_icon.png", "forward3", S("Forward three pages") }, + { "ui_skip_forward_icon.png", "end_list", S("Last page") }, + } + + if ui_peruser.is_lite_mode then + btnlist[2] = nil + btnlist[5] = nil + end + + local bn = 0 + for _, b in pairs(btnlist) do + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + ui_peruser.page_buttons_x + ui_peruser.btn_spc*bn, + ui_peruser.page_buttons_y + ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, + b[1],b[2]) + formspec[n+1] = "tooltip["..b[2]..";"..F(b[3]).."]" + bn = bn + 1 + n = n + 2 + end + + -- Items list + if #ui.filtered_items_list[player_name] == 0 then + local no_matches = S("No matching items") + if ui_peruser.is_lite_mode then + no_matches = S("No matches.") + end + + formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]" + return + end + + local dir = ui.active_search_direction[player_name] + local list_index = ui.current_index[player_name] + local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1) + local pagemax = math.floor( + (#ui.filtered_items_list[player_name] - 1) + / (ui_peruser.items_per_page) + 1) + for y = 0, ui_peruser.pagerows - 1 do + for x = 0, ui_peruser.pagecols - 1 do + local name = ui.filtered_items_list[player_name][list_index] + local item = minetest.registered_items[name] + if item then + -- Clicked on current item: Flip crafting direction + if name == ui.current_item[player_name] then + local cdir = ui.current_craft_direction[player_name] + if cdir == "recipe" then + dir = "usage" + elseif cdir == "usage" then + dir = "recipe" + end + else + -- Default: use active search direction by default + dir = ui.active_search_direction[player_name] + end + + local button_name = "item_button_" .. dir .. "_" + .. ui.mangle_for_formspec(name) + formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format( + ui_peruser.page_x + x * ui_peruser.btn_spc, + ui_peruser.page_y + y * ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, + name, button_name + ) + local tooltip = item.description + if item.mod_origin then + -- "mod_origin" may not be specified for items that were + -- registered in a callback (during or before ServerEnv init) + tooltip = tooltip .. " [" .. item.mod_origin .. "]" + end + formspec[n + 1] = ("tooltip[%s;%s]"):format( + button_name, minetest.formspec_escape(tooltip) + ) + n = n + 2 + end + list_index = list_index + 1 + end + end + formspec[n] = "style[page_number;content_offset=0]" + formspec[n + 1] = string.format("image_button[%f,%f;%f,0.4;;page_number;%s: %s;false;false;]", + ui_peruser.page_buttons_x, + ui_peruser.page_buttons_y + ui_peruser.btn_spc * 2 - 0.1, + ui_peruser.btn_spc * (bn - 1) + ui_peruser.btn_size, + F(S("Page")), S("@1 of @2",page2,pagemax)) +end + +function ui.get_formspec(player, page) + + if not player then + return "" + end + + local player_name = player:get_player_name() + local ui_peruser = ui.get_per_player_formspec(player_name) + + ui.current_page[player_name] = page + local pagedef = ui.pages[page] + + if not pagedef then + return "" -- Invalid page name + end + + local fs = { + "formspec_version[4]", + "size["..ui_peruser.formw..","..ui_peruser.formh.."]", + pagedef.formspec_prepend and "" or "no_prepend[]", + ui.standard_background + } + + local perplayer_formspec = ui.get_per_player_formspec(player_name) + local fsdata = pagedef.get_formspec(player, perplayer_formspec) + + fs[#fs + 1] = fsdata.formspec + + formspec_tab_buttons(player, fs, ui_peruser) + + if fsdata.draw_inventory ~= false then + -- Player inventory + fs[#fs + 1] = "listcolors[#00000000;#00000000]" + fs[#fs + 1] = ui_peruser.standard_inv + end + + if fsdata.draw_item_list == false then + return table.concat(fs, "") + end + + formspec_add_categories(player, fs, ui_peruser) + formspec_add_search_box(player, fs, ui_peruser) + formspec_add_item_browser(player, fs, ui_peruser) + + return table.concat(fs) +end + +function ui.set_inventory_formspec(player, page) + if player then + player:set_inventory_formspec(ui.get_formspec(player, page)) + end +end + +function ui.is_itemdef_listable(def) + return (not def.groups.not_in_creative_inventory + or def.groups.not_in_creative_inventory == 0) + and def.description + and def.description ~= "" +end + +--apply filter to the inventory list (create filtered copy of full one) +function ui.apply_filter(player, filter, search_dir) + if not player then + return false + end + local player_name = player:get_player_name() + + -- Whether to show uncraftable items + local fprefilter = function(_) + return true + end + if ui.hide_uncraftable_items and not ui.is_creative(player_name) then + fprefilter = function(name) + return ui.get_recipe_list(name) + end + end + + local registered_items = minetest.registered_items + local lfilter = string.lower(filter) + local ffilter + + if lfilter:sub(1, 6) == "group:" then + -- Group filter: all groups of the item must match + local groups = lfilter:sub(7):split(",") + ffilter = function(name) + local def = registered_items[name] + if not def then + return false + end + + for _, group in ipairs(groups) do + if not def.groups[group] + or def.groups[group] <= 0 then + return false + end + end + return true + end + else + -- Name filter: fuzzy match item names and descriptions + local player_info = minetest.get_player_information(player_name) + local lang = player_info and player_info.lang_code or "" + + ffilter = function(name) + local def = registered_items[name] + if not def then + return false + end + + local lname = string.lower(name) + local ldesc = string.lower(def.description) + local llocaldesc = minetest.get_translated_string + and string.lower(minetest.get_translated_string(lang, def.description)) + return string.find(lname, lfilter, 1, true) or string.find(ldesc, lfilter, 1, true) + or llocaldesc and string.find(llocaldesc, lfilter, 1, true) + end + end + + local filtered_items = {} + + local category = ui.current_category[player_name] or 'all' + if category == 'all' then + for _, name in ipairs(ui.items_list) do + if fprefilter(name) and ffilter(name) then + table.insert(filtered_items, name) + end + end + elseif category == 'uncategorized' then + for _, name in ipairs(ui.items_list) do + if not ui.find_category(name) + and fprefilter(name) + and ffilter(name) then + table.insert(filtered_items, name) + end + end + else + -- Any other category is selected + for name, exists in pairs(ui.registered_category_items[category]) do + if exists + and fprefilter(name) + and ffilter(name) then + table.insert(filtered_items, name) + end + end + end + table.sort(filtered_items) + + ui.filtered_items_list_size[player_name] = #filtered_items + ui.filtered_items_list[player_name] = filtered_items + ui.current_index[player_name] = 1 + ui.activefilter[player_name] = filter + ui.active_search_direction[player_name] = search_dir + ui.set_inventory_formspec(player, ui.current_page[player_name]) +end + +-- Inform players about potential visual issues +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local info = minetest.get_player_information(player_name) + if info and (info.formspec_version or 0) < 4 then + minetest.chat_send_player(player_name, S("Unified Inventory: Your game version is too old" + .. " and does not support the GUI requirements. You might experience visual issues.")) + end +end) diff --git a/mods/unified_inventory/item_names.lua b/mods/unified_inventory/item_names.lua new file mode 100644 index 00000000..5eb0e40c --- /dev/null +++ b/mods/unified_inventory/item_names.lua @@ -0,0 +1,88 @@ +-- Based on 4itemnames mod by 4aiman + +local item_names = {} -- [player_name] = { hud, dtime, itemname } +local dlimit = 3 -- HUD element will be hidden after this many seconds +local hudbars_mod = minetest.get_modpath("hudbars") +local only_names = minetest.settings:get_bool("unified_inventory_only_names", true) +local max_length = tonumber(minetest.settings:get("unified_inventory_max_item_name_length")) or 80 + +local function set_hud(player) + local player_name = player:get_player_name() + local off = {x=0, y=-65} + if hudbars_mod then + -- Assume no alignment (2 per line) + off.y = off.y - math.ceil(hb.hudbars_count / 2) * 25 + else + off.y = off.y - 25 + end + + item_names[player_name] = { + hud = player:hud_add({ + -- TODO: remove compatibility code when 5.8.0 is no longer used + [minetest.features.hud_def_type_field and "type" or "hud_elem_type"] = "text", + position = {x=0.5, y=1}, + offset = off, + alignment = {x=0, y=-1}, + number = 0xFFFFFF, + text = "", + }), + dtime = dlimit, + index = 1, + itemname = "" + } +end + +minetest.register_on_joinplayer(function(player) + minetest.after(0, set_hud, player) +end) + +minetest.register_on_leaveplayer(function(player) + item_names[player:get_player_name()] = nil +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local data = item_names[player:get_player_name()] + if not data or not data.hud then + data = {} -- Update on next step + set_hud(player) + end + + local index = player:get_wield_index() + local stack = player:get_wielded_item() + local itemname = stack:get_name() + + if data.hud and data.dtime < dlimit then + data.dtime = data.dtime + dtime + if data.dtime > dlimit then + player:hud_change(data.hud, 'text', "") + end + end + + if data.hud and (itemname ~= data.itemname or index ~= data.index) then + data.itemname = itemname + data.index = index + data.dtime = 0 + local lang_code = minetest.get_player_information(player:get_player_name()).lang_code + + local desc = stack.get_meta + and stack:get_meta():get_string("description") + + if not desc or desc == "" then + -- Try to use default description when none is set in the meta + local def = minetest.registered_items[itemname] + desc = def and def.description or "" + end + if only_names and desc and string.find(desc, "\n") then + desc = string.match(desc, "([^\n]*)") + end + desc = minetest.get_translated_string(lang_code, desc) + desc = minetest.strip_colors(desc) + if string.len(desc) > max_length and max_length > 0 then + desc = string.sub(desc, 1, max_length) .. " [...]" + end + player:hud_change(data.hud, 'text', desc) + end + end +end) + diff --git a/mods/unified_inventory/legacy.lua b/mods/unified_inventory/legacy.lua new file mode 100644 index 00000000..5b62894c --- /dev/null +++ b/mods/unified_inventory/legacy.lua @@ -0,0 +1,55 @@ +-- Inefficient pattern matching + +local warned_funcs = {} +local function LOG_ONCE(funcname) + if warned_funcs[funcname] then return end + warned_funcs[funcname] = true + minetest.log("error", "Call to undocumented, deprecated API '" .. funcname .. "'." + .. " In a future version of Unified Inventory this will result in a real error.") +end + +function unified_inventory.canonical_item_spec_matcher(spec) + LOG_ONCE("canonical_item_spec_matcher") + local specname = ItemStack(spec):get_name() + if specname:sub(1, 6) ~= "group:" then + return function (itemname) + return itemname == specname + end + end + + local group_names = specname:sub(7):split(",") + return function (itemname) + local itemdef = minetest.registered_items[itemname] + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + return false + end + end + return true + end +end + +function unified_inventory.item_matches_spec(item, spec) + LOG_ONCE("item_matches_spec") + local itemname = ItemStack(item):get_name() + return unified_inventory.canonical_item_spec_matcher(spec)(itemname) +end + + +unified_inventory.registered_group_items = { + mesecon_conductor_craftable = "mesecons:wire_00000000_off", + stone = "default:cobble", + wood = "default:wood", + book = "default:book", + sand = "default:sand", + leaves = "default:leaves", + tree = "default:tree", + vessel = "vessels:glass_bottle", + wool = "wool:white", +} + +function unified_inventory.register_group_item(groupname, itemname) + LOG_ONCE("register_group_item") + unified_inventory.registered_group_items[groupname] = itemname +end + diff --git a/mods/unified_inventory/locale/template.pot b/mods/unified_inventory/locale/template.pot new file mode 100644 index 00000000..105fd644 --- /dev/null +++ b/mods/unified_inventory/locale/template.pot @@ -0,0 +1,358 @@ +# LANGUAGE translation for the unified_inventory mod. +# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) +# This file is distributed under the same license as the unified_inventory package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: unified_inventory\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-02 03:34+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: api.lua register.lua +msgid "Crafting" +msgstr "" + +#: api.lua +msgid "Mixing" +msgstr "" + +#: api.lua +msgid "Cooking" +msgstr "" + +#: api.lua +msgid "Digging" +msgstr "" + +#: bags.lua +msgid "Bags" +msgstr "" + +#: bags.lua +msgid "Bag @1" +msgstr "" + +#: bags.lua +msgid "Small Bag" +msgstr "" + +#: bags.lua +msgid "Medium Bag" +msgstr "" + +#: bags.lua +msgid "Large Bag" +msgstr "" + +#: group.lua +msgid " and " +msgstr "" + +#: internal.lua +msgid "First page" +msgstr "" + +#: internal.lua +msgid "Back three pages" +msgstr "" + +#: internal.lua +msgid "Back one page" +msgstr "" + +#: internal.lua +msgid "Forward one page" +msgstr "" + +#: internal.lua +msgid "Forward three pages" +msgstr "" + +#: internal.lua +msgid "Last page" +msgstr "" + +#: internal.lua +msgid "Search" +msgstr "" + +#: internal.lua +msgid "Reset search and display everything" +msgstr "" + +#: internal.lua +msgid "No matching items" +msgstr "" + +#: internal.lua +msgid "No matches." +msgstr "" + +#: internal.lua +msgid "Page" +msgstr "" + +#: internal.lua +#, lua-format +msgid "%s of %s" +msgstr "" + +#: internal.lua +msgid "Filter" +msgstr "" + +#: register.lua +msgid "Can use the creative inventory" +msgstr "" + +#: register.lua +msgid "" +"Forces Unified Inventory to be displayed in Full mode if Lite mode is " +"configured globally" +msgstr "" + +#: register.lua +msgid "Crafting Grid" +msgstr "" + +#: register.lua +msgid "Crafting Guide" +msgstr "" + +#: register.lua +msgid "Set home position" +msgstr "" + +#: register.lua +#, lua-format +msgid "Home position set to: %s" +msgstr "" + +#: register.lua +msgid "You don't have the \"home\" privilege!" +msgstr "" + +#: register.lua +msgid "Go home" +msgstr "" + +#: register.lua +msgid "Set time to day" +msgstr "" + +#: register.lua +msgid "Time of day set to 6am" +msgstr "" + +#: register.lua +msgid "You don't have the settime privilege!" +msgstr "" + +#: register.lua +msgid "Set time to night" +msgstr "" + +#: register.lua +msgid "Time of day set to 9pm" +msgstr "" + +#: register.lua +msgid "Clear inventory" +msgstr "" + +#: register.lua +msgid "" +"This button has been disabled outside of creative mode to prevent accidental " +"inventory trashing.\n" +"Use the trash slot instead." +msgstr "" + +#: register.lua +msgid "Inventory cleared!" +msgstr "" + +#: register.lua +msgid "Trash:" +msgstr "" + +#: register.lua +msgid "Refill:" +msgstr "" + +#: register.lua +#, lua-format +msgid "Any item belonging to the %s group" +msgstr "" + +#: register.lua +#, lua-format +msgid "Any item belonging to the groups %s" +msgstr "" + +#: register.lua +#, lua-format +msgid "Recipe %d of %d" +msgstr "" + +#: register.lua +#, lua-format +msgid "Usage %d of %d" +msgstr "" + +#: register.lua +msgid "No recipes" +msgstr "" + +#: register.lua +msgid "No usages" +msgstr "" + +#: register.lua +msgid "Result" +msgstr "" + +#: register.lua +msgid "Ingredient" +msgstr "" + +#: register.lua +msgid "Show next recipe" +msgstr "" + +#: register.lua +msgid "Show next usage" +msgstr "" + +#: register.lua +msgid "Show previous recipe" +msgstr "" + +#: register.lua +msgid "Show previous usage" +msgstr "" + +#: register.lua +#, lua-format +msgid "%s (%s)" +msgstr "" + +#: register.lua +msgid "Give me:" +msgstr "" + +#: register.lua +msgid "" +"This recipe is too\n" +"large to be displayed." +msgstr "" + +#: register.lua +msgid "To craft grid:" +msgstr "" + +#: register.lua +msgid "All" +msgstr "" + +#: waypoints.lua +msgid "White" +msgstr "" + +#: waypoints.lua +msgid "Yellow" +msgstr "" + +#: waypoints.lua +msgid "Red" +msgstr "" + +#: waypoints.lua +msgid "Green" +msgstr "" + +#: waypoints.lua +msgid "Blue" +msgstr "" + +#: waypoints.lua +msgid "Waypoints" +msgstr "" + +#: waypoints.lua +#, lua-format +msgid "Select Waypoint #%d" +msgstr "" + +#: waypoints.lua +#, lua-format +msgid "Waypoint %d" +msgstr "" + +#: waypoints.lua +msgid "Set waypoint to current location" +msgstr "" + +#: waypoints.lua +msgid "invisible" +msgstr "" + +#: waypoints.lua +msgid "visible" +msgstr "" + +#: waypoints.lua +msgid "Make waypoint @1" +msgstr "" + +#: waypoints.lua +msgid "Disable" +msgstr "" + +#: waypoints.lua +msgid "Enable" +msgstr "" + +#: waypoints.lua +msgid "@1 display of waypoint coordinates" +msgstr "" + +#: waypoints.lua +msgid "Change color of waypoint display" +msgstr "" + +#: waypoints.lua +msgid "Edit waypoint name" +msgstr "" + +#: waypoints.lua +msgid "Waypoint active" +msgstr "" + +#: waypoints.lua +msgid "Waypoint inactive" +msgstr "" + +#: waypoints.lua +msgid "Finish editing" +msgstr "" + +#: waypoints.lua +msgid "World position" +msgstr "" + +#: waypoints.lua +msgid "Name" +msgstr "" + +#: waypoints.lua +msgid "HUD text color" +msgstr "" diff --git a/mods/unified_inventory/locale/template.txt b/mods/unified_inventory/locale/template.txt new file mode 100644 index 00000000..fd931d88 --- /dev/null +++ b/mods/unified_inventory/locale/template.txt @@ -0,0 +1,90 @@ +# textdomain: unified_inventory +Mixing= +Cooking= +Digging= +Bags= +Bag @1= +Small Bag= +Medium Bag= +Large Bag= +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = +Scroll categories left= +Scroll categories right= +Search= +Reset search and display everything= +First page= +Back three pages= +Back one page= +Forward one page= +Forward three pages= +Last page= +No matching items= +No matches.= +Page= +@1 of @2= +Filter= +Can use the creative inventory= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid= +Crafting Guide= +Set home position= +Home position set to: @1= +You don't have the "home" privilege!= +Go home= +Set time to day= +Time of day set to 6am= +You don't have the settime privilege!= +Set time to night= +Time of day set to 9pm= +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!= +Trash:= +Refill:= +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2= +Usage @1 of @2= +No recipes= +No usages= +Result= +Ingredient= +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:= +This recipe is too@@large to be displayed.= +To craft grid:= +All= +Crafting= +White= +Yellow= +Red= +Green= +Blue= +Waypoints= +Select Waypoint #@1= +Waypoint @1= +Set waypoint to current location= +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display= +Edit waypoint name= +Waypoint active= +Waypoint inactive= +Finish editing= +World position= +Name= +HUD text color= diff --git a/mods/unified_inventory/locale/unified_inventory.de.tr b/mods/unified_inventory/locale/unified_inventory.de.tr new file mode 100644 index 00000000..f1b16707 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.de.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Mischen +Cooking=Kochen +Digging=Graben +Bags=Taschen +Bag @1=Tasche @1 +Small Bag=Kleine Tasche +Medium Bag=Mittelgroße Tasche +Large Bag=Große Tasche +All Items=Alle Gegenstände +Misc. Items=Sonstige Gegenstände +Plant Life=Pfanzenwelt +Building Materials=Baumaterialien +Tools=Werkzeuge +Minerals and Metals=Minerale und Metalle +Environment and Worldgen=Umwelt und Welterstellung +Lighting=Beleuchtung + and = und +Scroll categories left=Kategorien nach links blättern +Scroll categories right=Kategorien nach rechts blättern +Search=Suchen +Reset search and display everything=Suche zurücksetzen und alles anzeigen +First page=Erste Seite +Back three pages=3 Seiten zurückblättern +Back one page=1 Seite zurückblättern +Forward one page=1 Seite vorblättern +Forward three pages=3 Seiten vorblättern +Last page=Letzte Seite +No matching items=Keine passenden Gegenstände +No matches.=Keine Treffer +Page=Seite +@1 of @2=@1 von @2 +Filter=Filter +Can use the creative inventory=Kann das Kreativinventar nutzen +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist +Crafting Grid=Fertigungsraster +Crafting Guide=Fertigungsführer +Set home position=Heimatposition setzen +Home position set to: @1=Heimatposition nach @1 gesetzt +You don't have the "home" privilege!=Du hast das „home“-Privileg nicht! +Go home=Nach Hause gehen +Set time to day=Zur Tageszeit wechseln +Time of day set to 6am=Tageszeit auf 6 Uhr gesetzt +You don't have the settime privilege!=Du hast das „settime“-Privileg nicht! +Set time to night=Zur Nachtzeit wechseln +Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt +Clear inventory=Inventar leeren +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventar geleert! +Trash:=Müll: +Refill:=Nachfüllen: +Any item belonging to the @1 group=Irgendein Gegenstand, der zur Gruppe @1 gehört +Any item belonging to the groups @1=Irgendein Gegenstand, der zu den Gruppen @1 gehört +Recipe @1 of @2=Rezept @1 von @2 +Usage @1 of @2=Verwendung @1 von @2 +No recipes=Keine Rezepte +No usages=Keine Verwendungen +Result=Ergebnis +Ingredient=Zutat +Show next recipe=Nächstes Rezept zeigen +Show next usage=Nächste Verwendung zeigen +Show previous recipe=Vorheriges Rezept zeigen +Show previous usage=Vorherige Verwendung zeigen +@1 (@2)= +Give me:=Gib mir: +This recipe is too@@large to be displayed.= +To craft grid:=Ins Fertigungsraster: +All=Alles +Crafting=Fertigung +White=Weiß +Yellow=Gelb +Red=Rot +Green=Grün +Blue=Blau +Waypoints=Wegpunkte +Select Waypoint #@1=Wegpunkt Nr. @1 auswählen +Waypoint @1=Wegpunkt Nr. @1 +Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position +Hide waypoint=Wegpunkt verstecken +Show waypoint=Wegpunkt zeigen +Hide coordinates=Koordinaten verstecken +Show coordinates=Koordinaten zeigen +Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern +Edit waypoint name=Name des Wegpunkts ändern +Waypoint active=Wegpunkt aktiv +Waypoint inactive=Wegpunkt inaktiv +Finish editing=Bearbeitung abschließen +World position=Weltposition +Name=Name +HUD text color=HUD-Textfarbe + + +##### not used anymore ##### + +invisible=unsichtbar +visible=sichtbar +Make waypoint @1=Wegpunkt @1 machen +Disable=ausschalten +Enable=einschalten +@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1 diff --git a/mods/unified_inventory/locale/unified_inventory.es.tr b/mods/unified_inventory/locale/unified_inventory.es.tr new file mode 100644 index 00000000..85a794ee --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.es.tr @@ -0,0 +1,108 @@ +# textdomain: unified_inventory +# api.lua +Mixing=Mezclar +Cooking=Hornear +Digging=Recoger +# bags.lua +Bags=Bolsos +Bag @1=Bolso @1 +Small Bag=Bolso Pequeño +Medium Bag=Bolso Mediano +Large Bag=Bolso Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= +# group.lua + and = y +Scroll categories left= +Scroll categories right= +Search=Buscar +Reset search and display everything=Limpiar la busqueda y mostrar todo +# internal.lua +First page=Primera página +Back three pages=Volver tres páginas +Back one page=Volver una página +Forward one page=Avanzar una página +Forward three pages=Avanzar tres páginas +Last page=Ultima Pagina +No matching items=No se encontraron elementos +No matches.=No hay resultados. +Page=Página +@1 of @2=@1 de @2 +Filter=Filtro +# register.lua +Can use the creative inventory=Puede usar el inventario creativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Obliga al Inventario Unificado a mostrarse en modo Completo si el modo Simple está configurado globalmente +Crafting Grid=Cuadricula de Elaboración +Crafting Guide=Guía de Elaboración +Set home position=Establecer posición de la casa +Home position set to: @1=Posición de la casa cambiada a: @1 +You don't have the "home" privilege!= +Go home=Ir a casa +Set time to day=Cambiar a dia +Time of day set to 6am=Hora del día cambiada a 6 AM +You don't have the settime privilege!=¡No tienes el privilegio "settime"! +Set time to night=Cambiar a noche +Time of day set to 9pm=Hora del día cambiada a 9 PM +Clear inventory=Limpiar inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=¡Inventario limpio! +Trash:=Basura: +Refill:=Rellenar: +Any item belonging to the @1 group=Cualquier elemento que pertenezca al grupo @1 +Any item belonging to the groups @1=Cualquier elemento perteneciente a los grupos @1 +Recipe @1 of @2=Receta @1 de @2 +Usage @1 of @2=Uso @1 de @2 +No recipes=No tiene receta +No usages=No tiene uso +Result=Resultado +Ingredient=Ingrediente +Show next recipe=Mostrar la siguiente receta +Show next usage=Mostrar el siguiente uso +Show previous recipe=Mostrar la receta anterior +Show previous usage=Mostrar el uso anterior +@1 (@2)=@1 (@2) +Give me:=Dame: +This recipe is too@@large to be displayed.= +To craft grid:=Construir: +All=Todos +Crafting=Elaboración +White=Blanco +Yellow=Amarillo +Red=Rojo +Green=Verde +Blue=Azul +Waypoints=Puntos +Select Waypoint #@1=Seleccionar Punto #@1 +Waypoint @1=Punto @1 +Set waypoint to current location=Establecer el punto a la ubicación actual +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Cambiar el color del punto +Edit waypoint name=Editar nombre del punto +Waypoint active=Punto activo +Waypoint inactive=Punto inactivo +Finish editing=Terminar edición +World position=Posición en el mundo +Name=Nombre +HUD text color=Color del texto de la Interfaz + + +##### not used anymore ##### + +Make waypoint @1=Hacer punto @1 +invisible=invisible +visible=visible +@1 display of waypoint coordinates=Visualizar coordenadas del punto @1 +Disable=Deshabilitado +Enable=Habilitado +You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"! +This button has been disabled outside=Este botón ha sido deshabilitado +This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada. diff --git a/mods/unified_inventory/locale/unified_inventory.fr.tr b/mods/unified_inventory/locale/unified_inventory.fr.tr new file mode 100644 index 00000000..96d8c3f5 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.fr.tr @@ -0,0 +1,96 @@ +# textdomain: unified_inventory +Mixing= +Cooking=Cuisson +Digging=Creuser +Bags=Sacs +Bag @1=Sac @1 +Small Bag=Petit sac +Medium Bag=Sac moyen +Large Bag=Grand sac +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = et +Scroll categories left= +Scroll categories right= +Search=Rechercher +Reset search and display everything= +First page=1ère page +Back three pages=3 pages en arrière +Back one page=Page précédente +Forward one page=Page suivante +Forward three pages=3 pages en avant +Last page=Dernière page +No matching items=Aucun élément correspondant +No matches.=Aucun match +Page=Page +@1 of @2=@1 de @2 +Filter=Filtre +Can use the creative inventory=Vous pouvez utiliser l'inventaire créatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Grille de création +Crafting Guide=Guide de création +Set home position=Position dans le monde +Home position set to: @1=Position de votre base fixée à: @1 +You don't have the "home" privilege!=Vous n'avez pas le privilège "home"! +Go home= +Set time to day= +Time of day set to 6am=Heure fixée à 6h +You don't have the settime privilege!=Vous n'avez pas le privilège "settime"! +Set time to night= +Time of day set to 9pm=Heure fixée à 21h +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventaire vidé ! +Trash:=Poubelle : +Refill:=Remplir : +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2=Recette @1 de @2 +Usage @1 of @2= +No recipes= +No usages= +Result=Résultat +Ingredient= +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:= +This recipe is too@@large to be displayed.= +To craft grid:=Sur de création: +All=Tout +Crafting=Création +White=Blanc +Yellow=Jaune +Red=Rouge +Green=Vert +Blue=Bleu +Waypoints=Point de passage +Select Waypoint #@1=Choisir un point de passage #@1 +Waypoint @1=Point de passage @1 +Set waypoint to current location=Marquer un point de passage à la position actuelle +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Changer la couleur du point de passage +Edit waypoint name=Editer le nom du point de passage +Waypoint active=Point de passage actif +Waypoint inactive=Point de passage inactif +Finish editing=Terminer l'édition +World position=Position dans le monde +Name=Nom +HUD text color=Couleur de texte du HUD + + +##### not used anymore ##### + +Make waypoint @1=Rendre @1 le point de passage +@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages diff --git a/mods/unified_inventory/locale/unified_inventory.it.tr b/mods/unified_inventory/locale/unified_inventory.it.tr new file mode 100644 index 00000000..c30d9e08 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.it.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Unione +Cooking=Cottura +Digging=Scavo +Bags=Borse +Bag @1=Borsa @1 +Small Bag=Borsa piccola +Medium Bag=Borsa media +Large Bag=Borsa grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = e +Scroll categories left= +Scroll categories right= +Search=Cerca +Reset search and display everything=Azzera la ricerca e mostra tutto +First page=Prima pagina +Back three pages=Indietro di tre pagine +Back one page=Indietro di una pagina +Forward one page=Avanti di una pagina +Forward three pages=Avanti di tre pagine +Last page=Ultima pagina +No matching items=Nessun oggetto corrispondente +No matches.=Nessuna corrispondenza. +Page=Pagina +@1 of @2=@1 di @2 +Filter=Filtro +Can use the creative inventory=Può usare l'inventario creativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice +Crafting Grid=Griglia di assemblaggio +Crafting Guide=Guida di assemblaggio +Set home position=Imposta la residenza +Home position set to: @1=Residenza impostata su: @1 +You don't have the "home" privilege!=Non hai il privilegio "home"! +Go home=Torna a casa +Set time to day=Imposta l'orario sul giorno +Time of day set to 6am=Orario impostato sulle 6am +You don't have the settime privilege!=Non hai il privilegio "time"! +Set time to night=Imposta l'orario sulla notte +Time of day set to 9pm=Orario impostato sulle 9am +Clear inventory=Ripulisci l'inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventario ripulito! +Trash:=Butta: +Refill:=Riempi: +Any item belonging to the @1 group=Qualunque oggetto appartenente al gruppo @1 +Any item belonging to the groups @1=Qualunque oggetto appartenente ai gruppi @1 +Recipe @1 of @2=Ricetta @1 di @2 +Usage @1 of @2=Uso @1 di @2 +No recipes=Nessuna ricetta +No usages=Nessun utilizzo +Result=Risultato +Ingredient=Ingrediente +Show next recipe=Mostra la prossima ricetta +Show next usage=Mostra il prossimo utilizzo +Show previous recipe=Mostra la ricetta precedente +Show previous usage=Mostra l'utilizzo precedente +@1 (@2)= +Give me:=Dammi: +This recipe is too@@large to be displayed.= +To craft grid:=Alla griglia di assemblaggio: +All=Tutto +Crafting=Assemblaggio +White=Bianco +Yellow=Giallo +Red=Rosso +Green=Verde +Blue=Blu +Waypoints=Tappe +Select Waypoint #@1=Seleziona tappa n°@1 +Waypoint @1=Tappa @1 +Set waypoint to current location=Imposta tappa alla posizione attuale +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Modifica il colore della visualizzazione della tappa +Edit waypoint name=Modifica il nome della tappa +Waypoint active=Tappa attiva +Waypoint inactive=Tappa inattiva +Finish editing=Termina la modifica +World position=Posizione del mondo +Name=Nome +HUD text color=Colore del testo del visore + + +##### not used anymore ##### + +invisible=invisibile +visible=visibile +Make waypoint @1=Crea tappa @1 +Disable=Disabilita +Enable=Abilita +@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa diff --git a/mods/unified_inventory/locale/unified_inventory.ms.tr b/mods/unified_inventory/locale/unified_inventory.ms.tr new file mode 100644 index 00000000..be4eb5e3 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.ms.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Pencampuran +Cooking=Pemasakan +Digging=Penggalian +Bags=Beg +Bag @1=Beg @1 +Small Bag=Beg Kecil +Medium Bag=Beg Sederhana +Large Bag=Beg Besar +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = dan +Scroll categories left= +Scroll categories right= +Search=Cari +Reset search and display everything=Set semula carian dan tunjukkan semua benda +First page=Halaman pertama +Back three pages=Tiga halaman sebelumnya +Back one page=Halaman sebelumnya +Forward one page=Halaman seterusnya +Forward three pages=Tiga halaman seterusnya +Last page=Halaman terakhir +No matching items=Tiada item sepadan +No matches.=Tiada padanan. +Page=Halaman +@1 of @2=@1 drpd @2 +Filter=Tapis +Can use the creative inventory=Boleh guna inventori kreatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Grid Pertukangan +Crafting Guide=Panduan Pertukangan +Set home position=Tetapkan kedudukan rumah +Home position set to: @1=Kedudukan rumah ditetapkan ke: @1 +You don't have the "home" privilege!=Anda tidak ada keistimewaan "home"! +Go home=Balik rumah +Set time to day=Tetapkan masa jadi siang +Time of day set to 6am=Masa ditetapkan ke 6 pagi +You don't have the settime privilege!=Anda tidak ada keistimewaan settime! +Set time to night=Tetapkan masa jadi malam +Time of day set to 9pm=Masa ditetapkan ke 9 malam +Clear inventory=Kosongkan inventori +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventori dikosongkan! +Trash:=Buang: +Refill:=Isi balik: +Any item belonging to the @1 group=Sebarang item dari kumpulan @1 +Any item belonging to the groups @1=Sebarang item dari kumpulan @1 +Recipe @1 of @2=Resipi @1 drpd @2 +Usage @1 of @2=Kegunaan @1 drpd @2 +No recipes=Tiada resipi +No usages=Tiada kegunaan +Result=Hasil +Ingredient=Bahan +Show next recipe=Tunjuk resipi seterusnya +Show next usage=Tunjuk kegunaan seterusnya +Show previous recipe=Tunjuk resipi sebelumnya +Show previous usage=Tunjuk kegunaan sebelumnya +@1 (@2)=@1 (@2) +Give me:=Beri saya: +This recipe is too@@large to be displayed.= +To craft grid:=Ke grid pertukangan: +All= +Crafting=Pertukangan +White=Putih +Yellow=Kuning +Red=Merah +Green=Hijau +Blue=Biru +Waypoints=Titik Arah +Select Waypoint #@1=Pilih Titik Arah #@1 +Waypoint @1=Titik Arah @1 +Set waypoint to current location=Tetapkan titik arah ke lokasi semasa +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Tukar warna paparan titik arah +Edit waypoint name=Edit nama titik arah +Waypoint active=Titik arah aktif +Waypoint inactive=Titik arah tidak aktif +Finish editing=Selesai edit +World position=Kedudukan dunia +Name=Nama +HUD text color=Warna tulisan HUD + + +##### not used anymore ##### + +invisible=Sembunyikan +visible=Paparkan +Make waypoint @1=@1 titik arah +Disable=Sembunyikan +Enable=Paparkan +@1 display of waypoint coordinates=@1 koordinat untuk titik arah diff --git a/mods/unified_inventory/locale/unified_inventory.pl.tr b/mods/unified_inventory/locale/unified_inventory.pl.tr new file mode 100644 index 00000000..1e06bc13 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.pl.tr @@ -0,0 +1,91 @@ +# textdomain: unified_inventory +Category:=Kategorie: +Mixing=Miksowanie +Cooking=Gotowanie +Digging=Kopanie +Bags=Plecaki +Bag @1=Plecak @1 +Small Bag=MaÅ‚y plecak +Medium Bag=Åšredni plecak +Large Bag=Duży plecak +All Items=Wszystkie przedmioty +Misc. Items=Różne przedmioty +Plant Life=Å»ycie roÅ›lin +Building Materials=MateriaÅ‚y budowlane +Tools=NarzÄ™dzia +Minerals and Metals=MineraÅ‚y i metale +Environment and Worldgen=Otoczenie i generowanie Å›wiata +Lighting=OÅ›wietlenie + and = i +Scroll categories left=PrzewiÅ„ kategoriÄ™ w lewo +Scroll categories right=PrzewiÅ„ kategoriÄ™ w prawo +Search=Szukaj +Reset search and display everything=Zresetuj wyszukiwanie i pokaż wszystko +First page=Pierwsza strona +Back three pages=Trzy strony do tyÅ‚u +Back one page=StronÄ™ do tyÅ‚u +Forward one page=StronÄ™ do przodu +Forward three pages=Trzy strony do przodu +Last page=Ostatnia strona +No matching items=Brak pasujÄ…cych przedmiotów +No matches.=Brak wyników +Page=Strona +@1 of @2=@1 z @2 +Filter=Filtr +Can use the creative inventory=Może używać kreatywnego ekwipunku +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Wymusza wyÅ›wietlanie Unified Inventory w trybie Full jeżeli tryb Lite jest skonfigurowany globalnie +Crafting Grid=Siatka craftingu +Crafting Guide=Przewodnik craftingu +Set home position=Ustaw pozycjÄ™ domu +Home position set to: @1=Pozycja domu ustawiona na: @1 +You don't have the "home" privilege!=Brak uprawnieÅ„ "home"! +Go home=Idź do domu +Set time to day=Ustaw czas na dzieÅ„ +Time of day set to 6am=Czas ustawiony na 6:00 +You don't have the settime privilege!=Brak uprawnieÅ„ "settime"! +Set time to night=Ustaw czas na noc +Time of day set to 9pm=Czas ustawiony na 21:00 +Clear inventory=Wyczyść ekwipunek +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=Aby zapobiec przypadkowemu skasowaniu ekwipunku, ten przycisk zostaÅ‚ wyłączony poza trybem kreatywnym.@nUżyj zamiast tego ikony Å›mietnika. +Inventory cleared!=Ekwipunek zostaÅ‚ wyczyszczony! +Trash:=Åšmietnik: +Refill:=UzupeÅ‚nianie: +Any item belonging to the @1 group=Każdy przedmiot należący do @1 grupy +Any item belonging to the groups @1=Każdy przedmiot należacy do grup @1 +Recipe @1 of @2=Recepta @1 z @2 +Usage @1 of @2=Użycie @1 z @2 +No recipes=Brak recepty +No usages=Bez użycia +Result=Wynik +Ingredient=SkÅ‚adnik +Show next recipe=Pokaż nastepnÄ… recepturÄ™ +Show next usage=Pokaż nastÄ™pne użycie +Show previous recipe=Pokaż poprzedniÄ… recepturÄ™ +Show previous usage=Pokaż poprzednie użycie +@1 (@2)=@1 (@2) +Give me:=Daj mi: +This recipe is too@@large to be displayed.=Receptura jest zbyt@@duża aby jÄ… wyÅ›wietlić. +To craft grid:=Do siatki craftingu. +All=Wszystko +Crafting=Crafting +White=BiaÅ‚y +Yellow=Zółty +Red=Czerwony +Green=Zielony +Blue=Niebieski +Waypoints=Punkty orientacyjne +Select Waypoint #@1=Wybierz punkt #@1 +Waypoint @1=Punkty orientacyjne @1 +Set waypoint to current location=Ustaw punkt orientacyjny na bieżacej pozycji +Hide waypoint=Ukryj punkt orientacyjny +Show waypoint=Pokaż punkt orientacyjny +Hide coordinates=Ukryj koordynaty +Show coordinates=Pokaż koordynaty +Change color of waypoint display=ZmieÅ„ kolor punktu +Edit waypoint name=Edytuj nazwÄ™ punktu +Waypoint active=Punkt włączony +Waypoint inactive=Punkt wyłączony +Finish editing=ZakoÅ„cz edycjÄ™ +World position=Pozycja +Name=Nazwa +HUD text color=Kolor tekstu HUD \ No newline at end of file diff --git a/mods/unified_inventory/locale/unified_inventory.pt.tr b/mods/unified_inventory/locale/unified_inventory.pt.tr new file mode 100644 index 00000000..5fedbc05 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.pt.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing=Muistura +Cooking=Cozimento +Digging=Escavação +Bags=Bolsas +Bag @1=Bolsa @1 +Small Bag=Bolsa Pequena +Medium Bag=Bolsa Média +Large Bag=Bolsa Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = e +Scroll categories left= +Scroll categories right= +Search=Pesquisar +Reset search and display everything=Redefinir pesquisa e exibir tudo +First page=Primeira Página +Back three pages=Voltar 3 Páginas +Back one page=Voltar 1 Página +Forward one page=Avançar 1 Página +Forward three pages=Avançar 3 Páginas +Last page=Ultima Página +No matching items=Nenhum item correspondente +No matches.=Sem correspondências +Page=Página +@1 of @2=@1 de @2 +Filter=Filtro +Can use the creative inventory=Pode usar o inventário do criativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Grade de Artesanato +Crafting Guide=Guia de Artesanato +Set home position=Definir posição de casa +Home position set to: @1=Posição inicial definida para: @1 +You don't have the "home" privilege!=Você não tem o privilégio de "home"! +Go home=Transportar para Casa +Set time to day=Definir turno para dia +Time of day set to 6am=Hora do dia definida para 06h +You don't have the settime privilege!=Você não tem o privilégio de "settime"! +Set time to night=Definir turno para noite +Time of day set to 9pm=Hora do dia ajustada para 21h +Clear inventory=Limpar Inventário +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventário Apagado! +Trash:=Lixo: +Refill:=Recarga: +Any item belonging to the @1 group=Qualquer item pertencente ao grupo '@1'. +Any item belonging to the groups @1=Qualquer item pertencente aos grupos '@1'. +Recipe @1 of @2=Receita @1 de @2 +Usage @1 of @2=Utilização @1 de @2 +No recipes=Sem Receita +No usages=Sem Utilização +Result=Resultado +Ingredient=Ingrediente +Show next recipe=Exibir Próxima Receita +Show next usage=Mostrar Próxima Utilização +Show previous recipe=Exibir Receita Anterior +Show previous usage=Exibir Utilização Anterior +@1 (@2)= +Give me:=Gerado: +This recipe is too@@large to be displayed.= +To craft grid:=Para Grade de Artesanato +All=MAX +Crafting=Artesanato +White=Branco +Yellow=Amarelo +Red=Vermelho +Green=Verde +Blue=Azul +Waypoints=Apontador de Direção +Select Waypoint #@1=Seleção de Apontador de Direção #@1 +Waypoint @1=Apontador de Direção @1 +Set waypoint to current location=Configurar localização atual do Apontador de Direção +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Mudar cor exibida do Apontador de Direção +Edit waypoint name=Editar Nome de Apontador de Direção +Waypoint active=Apontador de Direção Ativo +Waypoint inactive=Apontador de Direção Inativo +Finish editing=Edição Finalizada +World position=Posição Mundial +Name=Nome +HUD text color=Cor de HUD + + +##### not used anymore ##### + +invisible=invisível +visible=visível +Make waypoint @1=Fazer Apontador de Direção @1 +@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção diff --git a/mods/unified_inventory/locale/unified_inventory.ru.tr b/mods/unified_inventory/locale/unified_inventory.ru.tr new file mode 100644 index 00000000..0d0dbe13 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.ru.tr @@ -0,0 +1,91 @@ +# textdomain: unified_inventory +Mixing=Мешать +Cooking=Готовить +Digging=Копать +Bags=Сумки +Bag @1=Сумка @1 +Small Bag=ÐœÐ°Ð»Ð°Ñ Ñумка +Medium Bag=СреднÑÑ Ñумка +Large Bag=Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñумка +All Items=Ð’Ñе предметы +Misc. Items=Разн. предметы +Plant Life=РаÑÑ‚ÐµÐ½Ð¸Ñ +Building Materials=Стройматериалы +Tools=ИнÑтрументы +Minerals and Metals=Металлы и минералы +Environment and Worldgen=Окружение и генер.мира +Lighting=ОÑвещение + and = и +Scroll categories left=ЛиÑтать влево +Scroll categories right=ЛиÑтать вправо +Search=ПоиÑк +Reset search and display everything=Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð¾Ð¸Ñка, показать вÑÑ‘ +First page=ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница +Back three pages=3 Ñтраницы назад +Back one page=1 Ñтраницу назад +Forward one page=1 Ñтраницу вперёд +Forward three pages=3 Ñтраницы вперёд +Last page=ПоÑледнÑÑ Ñтраница +No matching items=Ðет подходÑщих Ñлементов +No matches.=Ðичего не найдено +Page=Страница +@1 of @2=@1 из @2 +Filter=Фильтр +Can use the creative inventory=Можно иÑпользовать инвентарь творчеÑкого режима +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Отображает инвентарь в полном режиме, еÑли проÑтой режим уÑтановлен глобально +Crafting Grid=Решетка крафта +Crafting Guide=Книга рецептов +Set home position=УÑтановить позицию дома +Home position set to: @1=Дом теперь раÑположен по коодинатам: @1 +You don't have the "home" privilege!=У Ð²Ð°Ñ Ð½ÐµÑ‚ привилегии "home"! +Go home=ОтправитьÑÑ Ð´Ð¾Ð¼Ð¾Ð¹ +Set time to day=День +Time of day set to 6am=УÑтановлено Ð²Ñ€ÐµÐ¼Ñ 6 утра +You don't have the settime privilege!=Вам не разрешено уÑтанавливать времÑ! (нет привилегии "settime") +Set time to night=Ðочь +Time of day set to 9pm=УÑтановлено Ð²Ñ€ÐµÐ¼Ñ 9 вечера +Clear inventory=ОчиÑтить инвентарь +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Инвентарь очищен! +Trash:=МуÑор: +Refill:=Ðаполнить: +Any item belonging to the @1 group=Любой Ñлемент из группы: @1 +Any item belonging to the groups @1=Любой Ñлемент из группы: @1 +Recipe @1 of @2=Рецепт @1 из @2 +Usage @1 of @2=Вариант @1 of @2 +No recipes=Рецептов нет +No usages=Ðе иÑпользуетÑÑ +Result=Результат +Ingredient=СоÑтав +Show next recipe=Следующий рецепт +Show next usage=Следующее иÑпользование +Show previous recipe=Предыдущий рецепт +Show previous usage=ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница +@1 (@2)= +Give me:=Дай мне: +This recipe is too@@large to be displayed.=Этот рецепт Ñлишком большой +To craft grid:=Ðа решeтку крафта: +All=Ð’Ñе +Crafting=Крафт +White=Белый +Yellow=Желтый +Red=КраÑный +Green=Зелёный +Blue=Синий +Waypoints=Путевые точки +Select Waypoint #@1=Выбрать путевую точку â„–@1 +Waypoint @1=ÐŸÑƒÑ‚ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° @1 +Set waypoint to current location=УÑтановить путевую точку по текущей позиции +Hide waypoint=Скрыть точку +Show waypoint=Показать точку +Hide coordinates=Скрыть координаты +Show coordinates=Показать координаты +Change color of waypoint display=ПоменÑть цвет путевой точки +Edit waypoint name=Переименовать путевую точку +Waypoint active=ÐŸÑƒÑ‚ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° включена +Waypoint inactive=ÐŸÑƒÑ‚ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° выключена +Finish editing=Закончить редакцию +World position=ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¼Ð¸Ñ€Ð° +Name=Ð˜Ð¼Ñ +HUD text color=Цвет текÑта HUDа +Category:=Категории: diff --git a/mods/unified_inventory/locale/unified_inventory.tr.tr b/mods/unified_inventory/locale/unified_inventory.tr.tr new file mode 100644 index 00000000..b4e15b8a --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.tr.tr @@ -0,0 +1,99 @@ +# textdomain: unified_inventory +Mixing=Karıştırma +Cooking=PiÅŸirme +Digging=Kazma +Bags=Çantalarım +Bag @1=@1. Çanta +Small Bag=Küçük Çanta +Medium Bag=Çanta +Large Bag=Büyük Çanta +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = ve +Scroll categories left= +Scroll categories right= +Search=Ara +Reset search and display everything= +First page=İlk Sayfa +Back three pages=3 Sayfa Gerile +Back one page=Geri +Forward one page=İleri +Forward three pages=3 Sayfa İlerile +Last page=Son Sayfa +No matching items=EÅŸleÅŸme yok +No matches.=EÅŸleÅŸme yok +Page=Sayfa +@1 of @2=@1 dan @2 +Filter=Süzgeç +Can use the creative inventory=Yaratıcı envanteri kullanabilir +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Üretim tablosu +Crafting Guide=Kılavuz +Set home position=Set ev pozisyon +Home position set to: @1=Yeni eviniz: @1 +You don't have the "home" privilege!="home" yetkiniz yok! +Go home=Eve git +Set time to day=Güne zaman ayarla +Time of day set to 6am=Saat 06:00 olarak ayarlandı +You don't have the settime privilege!="settime" yetkiniz yok! +Set time to night=Geceye zaman ayarla +Time of day set to 9pm=Saat 19:00 olarak ayarlandı +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Envanter temizlendi! +Trash:=Çöp +Refill:=Doldur +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2=@1 dan @2 tarifi +Usage @1 of @2=Kullanım @1/@2 +No recipes=Tarifi yok +No usages=Kullanım yok +Result=Çıktı +Ingredient=BileÅŸen +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:=Ver bana: +This recipe is too@@large to be displayed.= +To craft grid:=Üretim tablosuna kopyala +All=Tümü +Crafting=Üretim +White=Beyaz +Yellow=Sarı +Red=Kırmızı +Green=YeÅŸil +Blue=Mavi +Waypoints=Konum Noktaları +Select Waypoint #@1=#@1 konum noktası seç +Waypoint @1=@1 Konum Noktaları +Set waypoint to current location=BulunduÄŸun noktayı iÅŸaretle +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Konum Gösterge Rengi +Edit waypoint name=Konum Noktasını Düzenle +Waypoint active=Konum Etkin +Waypoint inactive=Konum Devredışı +Finish editing=Düzenleme bitti +World position=Dünya konumu +Name=İsim +HUD text color=Metin rengi + + +##### not used anymore ##### + +msgid ""=Yaratıcı modu dışında iken bu tuÅŸ kullanılamaz. +invisible=görünmez +visible=görünür +Make waypoint @1=Yol noktası @1 +@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1 diff --git a/mods/unified_inventory/locale/unified_inventory.uk.tr b/mods/unified_inventory/locale/unified_inventory.uk.tr new file mode 100644 index 00000000..f60f74c3 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.uk.tr @@ -0,0 +1,92 @@ +# textdomain: unified_inventory +Replaces the default inventory and adds a number of features, such as a crafting guide=Замінює Ñтандартний інвентар та додає Ñ€Ñд оÑобливоÑтей, таких Ñк книга рецептів +Mixing=Перемішати +Cooking=Виплавити +Digging=Викопати +Bags=Сумки +Bag @1=Сумка @1 +Small Bag=Мала Ñумка +Medium Bag=Ð¡ÐµÑ€ÐµÐ´Ð½Ñ Ñумка +Large Bag=Велика Ñумка +All Items=Ð’Ñе +Misc. Items=Різне +Plant Life=РоÑлини +Building Materials=Будматеріали +Tools=ІнÑтрументи +Minerals and Metals=Руди й метали +Environment and Worldgen=ÐžÑ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð° Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ñвіту +Lighting=ОÑÐ²Ñ–Ñ‚Ð»ÐµÐ½Ð½Ñ + and = та +Scroll categories left=Ліворуч +Scroll categories right=Праворуч +Search=Пошук +Reset search and display everything=Скинути пошук та відобразити уÑе +First page=Перша Ñторінка +Back three pages=3 Ñторінки назад +Back one page=ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка +Forward one page=ÐаÑтупна Ñторінка +Forward three pages=3 Ñторінки вперед +Last page=ОÑÑ‚Ð°Ð½Ð½Ñ Ñторінка +No matching items=Ðе знайдено предметів +No matches.=Ðемає результатів. +Page=Сторінка +@1 of @2=@1 з @2 +Filter=Фільтр +Can use the creative inventory=Можна викориÑтовувати творчий інвентар +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Відображає повний режим, Ñкщо проÑтий режим Ñконфігуровано глобально +Crafting Grid=Сітка майÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ +Crafting Guide=Книга рецептів +Set home position=Ð’Ñтановити позицію дому +Home position set to: @1=Тепер дім розташований по координатам: @1 +You don't have the "home" privilege!=У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” привілею "home"! +Go home=Додому +Set time to day=День +Time of day set to 6am=Ð§Ð°Ñ Ð²Ñтановлено на 6:00 +You don't have the settime privilege!=Ви не можете вÑтановлювати Ñ‡Ð°Ñ (нема привілею "settime") +Set time to night=Ðіч +Time of day set to 9pm=Ð§Ð°Ñ Ð²Ñтановлено на 21:00 +Clear inventory=ОчиÑтити інвентар +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=Цю кнопку було вимкнено в творчому режимі, щоб запобігти випадковому очищенню інвентарÑ.@nВикориÑтовуйте Ñлот Ñмітника натоміÑть. +Inventory cleared!=Інвентар очищено! +Trash:=Смітник: +Refill:=Заповнити: +Any item belonging to the @1 group=Будь-Ñкий елемент із групи @1 +Any item belonging to the groups @1=Будь-Ñкий елемент із груп @1 +Recipe @1 of @2=Рецепт @1 із @2 +Usage @1 of @2=ВикориÑÑ‚Ð°Ð½Ð½Ñ @1 із @2 +No recipes=Ðемає рецептів +No usages=Ðіде не викориÑтовуєтьÑÑ +Result=Результат +Ingredient=Інгредієнт +Show next recipe=ÐаÑтупний рецепт +Show next usage=ÐаÑтупне викориÑÑ‚Ð°Ð½Ð½Ñ +Show previous recipe=Попередній рецепт +Show previous usage=Попереднє викориÑÑ‚Ð°Ð½Ð½Ñ +@1 (@2)=@1 (@2) +Give me:=Дай мені: +This recipe is too@@large to be displayed.=Цей рецепт надто великий, щоб його відобразити +To craft grid:=Ðа Ñітку крафту: +All=Ð’Ñе +Crafting=Крафт +White=Білий +Yellow=Жовтий +Red=Червоний +Green=Зелений +Blue=Синій +Waypoints=Геомітки +Select Waypoint #@1=Вибрати геомітку â„–@1 +Waypoint @1=Геомітка @1 +Set waypoint to current location=Ð’Ñтановити тут +Hide waypoint=Сховати геомітку +Show waypoint=Показати геомітку +Hide coordinates=Сховати координати +Show coordinates=Показати координати +Change color of waypoint display=Змінити колір геомітки +Edit waypoint name=Перейменувати геомітку +Waypoint active=Геомітку показано +Waypoint inactive=Геомітку приховано +Finish editing=Закінчити Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ +World position=Світова Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ +Name=Ðазва +HUD text color=Колір текÑту +Category:=Категорії: diff --git a/mods/unified_inventory/locale/unified_inventory.zh_CN.tr b/mods/unified_inventory/locale/unified_inventory.zh_CN.tr new file mode 100644 index 00000000..fccb0f76 --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.zh_CN.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing=æ··åˆ +Cooking=烹饪 +Digging=挖出 +Bags=背包 +Bag @1=背包@1 +Small Bag=å°èƒŒåŒ… +Medium Bag=中背包 +Large Bag=大背包 +All Items=æ‰€æœ‰ç‰©å“ +Misc. Items=æ‚项 +Plant Life=æ¤ç‰© +Building Materials=建æ +Tools=工具 +Minerals and Metals=矿物与金属 +Environment and Worldgen=自然环境 +Lighting=å…‰æº + and = å’Œ +Scroll categories left=å‘å·¦æ»šåŠ¨åˆ†ç±»æ  +Scroll categories right=å‘峿»šåŠ¨åˆ†ç±»æ  +Search=æœç´¢ +Reset search and display everything=é‡ç½®æœç´¢å¹¶æ˜¾ç¤ºæ‰€æœ‰ç‰©å“ +First page=第一页 +Back three pages=åŽé€€ä¸‰é¡µ +Back one page=åŽé€€ä¸€é¡µ +Forward one page=å‰è¿›ä¸€é¡µ +Forward three pages=å‰è¿›ä¸‰é¡µ +Last page=最åŽä¸€é¡µ +No matching items=没有匹é…ç‰©å“ +No matches.=æ²¡æœ‰åŒ¹é… +Page=é¡µé¢ +@1 of @2=第@1页,共@2页 +Filter=过滤器 +Can use the creative inventory=å¯ä»¥ä½¿ç”¨åˆ›é€ èƒŒåŒ… +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=å¦‚æžœè½»é‡æ¨¡å¼è¢«å…¨å±€é…置,强迫Unified Inventory以完全模å¼å±•现。 +Crafting Grid=åˆæˆè¡¨ +Crafting Guide=åˆæˆæŒ‡å— +Set home position=设置家的ä½ç½® +Home position set to: @1=å®¶çš„ä½ç½®è®¾ç½®åˆ°ï¼š @1 +You don't have the "home" privilege!=你没有“homeâ€æƒé™ï¼ +Go home=回家 +Set time to day=设置时间到白天 +Time of day set to 6am=时间设置到早晨6点 +You don't have the settime privilege!=你没有“settimeâ€æƒé™ï¼ +Set time to night=设置时间到晚上 +Time of day set to 9pm=时间设置到晚上9点 +Clear inventory=清空背包 +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=此按钮已在éžåˆ›é€ æ¨¡å¼ä¸­ç¦ç”¨ä»¥é˜²æ­¢æ„外的背包清空。@n请使用垃圾桶æ ã€‚ +Inventory cleared!=清空背包 +Trash:=丢弃: +Refill:=填满: +Any item belonging to the @1 group=属于@1组的任何项目 +Any item belonging to the groups @1=属于组@1的任何项目 +Recipe @1 of @2=第@1é…æ–¹ï¼Œå…±@2个 +Usage @1 of @2=第@1用法,共@2个 +No recipes=æ²¡æœ‰é…æ–¹ +No usages=没有用法 +Result=结果 +Ingredient=原料 +Show next recipe=æ˜¾ç¤ºä¸‹ä¸€ä¸ªé…æ–¹ +Show next usage=显示下一个用法 +Show previous recipe=显示å‰ä¸€ä¸ªé…æ–¹ +Show previous usage=显示å‰ä¸€ä¸ªç”¨æ³• +@1 (@2)=@1 (@2) +Give me:=给予: +This recipe is too@@large to be displayed.=è¯¥é…æ–¹å¤ª@@大,ä¸èƒ½æ˜¾ç¤ºã€‚ +To craft grid:=填充物å“åˆ°åˆæˆè¡¨ +All=全部 +Crafting=åˆæˆ +White=白 +Yellow=黄 +Red=红 +Green=绿 +Blue=è“ +Waypoints=航路点 +Select Waypoint #@1=查询航路点 #@1 +Waypoint @1=航路点 @1 +Set waypoint to current location=将航路点设置到当å‰ä½ç½® +Hide waypoint=éšè—航路点 +Show waypoint=显示航路点 +Hide coordinates=éšè—åæ ‡ +Show coordinates=æ˜¾ç¤ºåæ ‡ +Change color of waypoint display=改å˜èˆªè·¯ç‚¹æ˜¾ç¤ºçš„颜色 +Edit waypoint name=编辑航路点åç§° +Waypoint active=航路点已激活 +Waypoint inactive=航路点未激活 +Finish editing=完æˆç¼–辑 +World position=世界ä½ç½® +Name=åç§° +HUD text color=HUD文本颜色 + + +##### not used anymore ##### + +invisible=ä¸å¯è§çš„ +visible=å¯è§çš„ +Make waypoint @1=设置航路点 @1 +@1 display of waypoint coordinates=显示航路点@1åæ ‡ diff --git a/mods/unified_inventory/locale/unified_inventory.zh_TW.tr b/mods/unified_inventory/locale/unified_inventory.zh_TW.tr new file mode 100644 index 00000000..536c703b --- /dev/null +++ b/mods/unified_inventory/locale/unified_inventory.zh_TW.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing=æ··åˆ +Cooking=烹飪 +Digging=挖出 +Bags=æ¹åŒ… +Bag @1=æ¹åŒ…@1 +Small Bag=å°æ¹åŒ… +Medium Bag=中æ¹åŒ… +Large Bag=大æ¹åŒ… +All Items=æ‰€æœ‰ç‰©å“ +Misc. Items=雜項 +Plant Life=æ¤ç‰© +Building Materials=建æ +Tools=工具 +Minerals and Metals=礦物與金屬 +Environment and Worldgen=自然環境 +Lighting=å…‰æº + and = å’Œ +Scroll categories left=å‘左滾動分類欄 +Scroll categories right=å‘峿»¾å‹•分類欄 +Search=æœç´¢ +Reset search and display everything=é‡ç½®æœç´¢ä¸¦é¡¯ç¤ºæ‰€æœ‰ç‰©å“ +First page=ç¬¬ä¸€é  +Back three pages=å¾Œé€€ä¸‰é  +Back one page=å¾Œé€€ä¸€é  +Forward one page=å‰é€²ä¸€é  +Forward three pages=å‰é€²ä¸‰é  +Last page=æœ€å¾Œä¸€é  +No matching items=沒有匹é…ç‰©å“ +No matches.=æ²’æœ‰åŒ¹é… +Page=é é¢ +@1 of @2=第@1é ï¼Œå…±@2é  +Filter=éŽæ¿¾å™¨ +Can use the creative inventory=å¯ä»¥ä½¿ç”¨å‰µé€ æ¹åŒ… +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=å¦‚æžœè¼•é‡æ¨¡å¼è¢«å…¨å±€é…置,強迫Unified Inventory以完全模å¼å±•ç¾ã€‚ +Crafting Grid=åˆæˆè¡¨ +Crafting Guide=åˆæˆæŒ‡å— +Set home position=設置家的ä½ç½® +Home position set to: @1=å®¶çš„ä½ç½®è¨­ç½®åˆ°ï¼š @1 +You don't have the "home" privilege!=你沒有“homeâ€æ¬Šé™ï¼ +Go home=回家 +Set time to day=設置時間到白天 +Time of day set to 6am=時間設置到早晨6點 +You don't have the settime privilege!=你沒有“settimeâ€æ¬Šé™ï¼ +Set time to night=設置時間到晚上 +Time of day set to 9pm=時間設置到晚上9點 +Clear inventory=清空æ¹åŒ… +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=此按鈕已在éžå‰µé€ æ¨¡å¼ä¸­ç¦ç”¨ä»¥é˜²æ­¢æ„外的背包清空。@n請使用垃圾桶欄。 +Inventory cleared!=清空æ¹åŒ… +Trash:=丟棄: +Refill:=填滿: +Any item belonging to the @1 group=屬於@1組的任何項目 +Any item belonging to the groups @1=屬於組@1的任何項目 +Recipe @1 of @2=第@1é…æ–¹ï¼Œå…±@2個 +Usage @1 of @2=第@1用法,共@2個 +No recipes=æ²’æœ‰é…æ–¹ +No usages=沒有用法 +Result=çµæžœ +Ingredient=原料 +Show next recipe=é¡¯ç¤ºä¸‹ä¸€å€‹é…æ–¹ +Show next usage=顯示下一個用法 +Show previous recipe=é¡¯ç¤ºä¸Šä¸€å€‹é…æ–¹ +Show previous usage=顯示上一個用法 +@1 (@2)=@1 (@2) +Give me:=給予: +This recipe is too@@large to be displayed.=è©²é…æ–¹å¤ª@@大,ä¸èƒ½é¡¯ç¤ºã€‚ +To craft grid:=填充物å“åˆ°åˆæˆè¡¨ +All=全部 +Crafting=åˆæˆ +White=白 +Yellow=黃 +Red=ç´… +Green=ç¶  +Blue=è— +Waypoints=航路點 +Select Waypoint #@1=查詢航路點 #@1 +Waypoint @1=航路點 @1 +Set waypoint to current location=將航路點設置到當å‰ä½ç½® +Hide waypoint=éš±è—航路點 +Show waypoint=顯示航路點 +Hide coordinates=éš±è—忍™ +Show coordinates=é¡¯ç¤ºåæ¨™ +Change color of waypoint display=改變航路點顯示的é¡è‰² +Edit waypoint name=編輯航路點å稱 +Waypoint active=航路點已激活 +Waypoint inactive=航路點未激活 +Finish editing=完æˆç·¨è¼¯ +World position=世界ä½ç½® +Name=å稱 +HUD text color=HUD文本é¡è‰² + + +##### not used anymore ##### + +invisible=ä¸å¯è¦‹çš„ +visible=å¯è¦‹çš„ +Make waypoint @1=設置航路點 @1 +@1 display of waypoint coordinates=顯示航路點@1座標 diff --git a/mods/unified_inventory/match_craft.lua b/mods/unified_inventory/match_craft.lua new file mode 100644 index 00000000..b2d18ec5 --- /dev/null +++ b/mods/unified_inventory/match_craft.lua @@ -0,0 +1,402 @@ +-- match_craft.lua +-- Find and automatically move inventory items to the crafting grid +-- according to the recipe. + +--[[ +Retrieve items from inventory lists and calculate their total count. +Return a table of "item name" - "total count" pairs. + +Arguments: + inv: minetest inventory reference + lists: names of inventory lists to use + +Example usage: + -- Count items in "main" and "craft" lists of player inventory + unified_inventory.count_items(player_inv_ref, {"main", "craft"}) + +Example output: + { + ["default:pine_wood"] = 2, + ["default:acacia_wood"] = 4, + ["default:chest"] = 3, + ["default:axe_diamond"] = 2, -- unstackable item are counted too + ["wool:white"] = 6 + } +]]-- +function unified_inventory.count_items(inv, lists) + local counts = {} + + for i = 1, #lists do + local name = lists[i] + local size = inv:get_size(name) + local list = inv:get_list(name) + + for j = 1, size do + local stack = list[j] + + if not stack:is_empty() then + local item = stack:get_name() + local count = stack:get_count() + + counts[item] = (counts[item] or 0) + count + end + end + end + + return counts +end + +--[[ +Retrieve craft recipe items and their positions in the crafting grid. +Return a table of "craft item name" - "set of positions" pairs. + +Note that if craft width is not 3 then positions are recalculated as +if items were placed on a 3x3 grid. Also note that craft can contain +groups of items with "group:" prefix. + +Arguments: + craft: minetest craft recipe + +Example output: + -- Bed recipe + { + ["wool:white"] = {[1] = true, [2] = true, [3] = true} + ["group:wood"] = {[4] = true, [5] = true, [6] = true} + } +--]] +function unified_inventory.count_craft_positions(craft) + local positions = {} + local craft_items = craft.items + local craft_type = unified_inventory.registered_craft_types[craft.type] + or unified_inventory.craft_type_defaults(craft.type, {}) + local display_width = craft_type.dynamic_display_size + and craft_type.dynamic_display_size(craft).width + or craft_type.width + local craft_width = craft_type.get_shaped_craft_width + and craft_type.get_shaped_craft_width(craft) + or display_width + local i = 0 + + for y = 1, 3 do + for x = 1, craft_width do + i = i + 1 + local item = craft_items[i] + + if item ~= nil then + local pos = 3 * (y - 1) + x + local set = positions[item] + + if set ~= nil then + set[pos] = true + else + positions[item] = {[pos] = true} + end + end + end + end + + return positions +end + +--[[ +For every craft item find all matching inventory items. +- If craft item is a group then find all inventory items that matches + this group. +- If craft item is not a group (regular item) then find only this item. + +If inventory doesn't contain needed item then found set is empty for +this item. + +Return a table of "craft item name" - "set of matching inventory items" +pairs. + +Arguments: + inv_items: table with items names as keys + craft_items: table with items names or groups as keys + +Example output: + { + ["group:wood"] = { + ["default:pine_wood"] = true, + ["default:acacia_wood"] = true + }, + ["wool:white"] = { + ["wool:white"] = true + } + } +--]] +function unified_inventory.find_usable_items(inv_items, craft_items) + local result = {} + + for craft_item in pairs(craft_items) do + -- may specify group:type1,type2 + local items = unified_inventory.get_matching_items(craft_item) + + local found = {} + for itemname, _ in pairs(items) do + if inv_items[itemname] then + found[itemname] = true + end + end + result[craft_item] = found + end + + return result +end + +--[[ +Match inventory items with craft grid positions. +For every position select the matching inventory item with maximum +(total_count / (times_matched + 1)) value. + +If for some position matching item cannot be found or match count is 0 +then return nil. + +Return a table of "matched item name" - "set of craft positions" pairs +and overall match count. + +Arguments: + inv_counts: table of inventory items counts from "count_items" + craft_positions: table of craft positions from "count_craft_positions" + +Example output: + match_table = { + ["wool:white"] = {[1] = true, [2] = true, [3] = true} + ["default:acacia_wood"] = {[4] = true, [6] = true} + ["default:pine_wood"] = {[5] = true} + } + match_count = 2 +--]] +function unified_inventory.match_items(inv_counts, craft_positions) + local usable = unified_inventory.find_usable_items(inv_counts, craft_positions) + local match_table = {} + local match_count + local matches = {} + + for craft_item, pos_set in pairs(craft_positions) do + local use_set = usable[craft_item] + + for pos in pairs(pos_set) do + local pos_item + local pos_count + + for use_item in pairs(use_set) do + local count = inv_counts[use_item] + local times_matched = matches[use_item] or 0 + local new_pos_count = math.floor(count / (times_matched + 1)) + + if pos_count == nil or pos_count < new_pos_count then + pos_item = use_item + pos_count = new_pos_count + end + end + + if pos_item == nil or pos_count == 0 then + return nil + end + + local set = match_table[pos_item] + + if set ~= nil then + set[pos] = true + else + match_table[pos_item] = {[pos] = true} + end + + matches[pos_item] = (matches[pos_item] or 0) + 1 + end + end + + for match_item, times_matched in pairs(matches) do + local count = inv_counts[match_item] + local item_count = math.floor(count / times_matched) + + if match_count == nil or item_count < match_count then + match_count = item_count + end + end + + return match_table, match_count +end + +--[[ +Remove item from inventory lists. +Return stack of actually removed items. + +This function replicates the inv:remove_item function but can accept +multiple lists. + +Arguments: + inv: minetest inventory reference + lists: names of inventory lists + stack: minetest item stack +--]] +function unified_inventory.remove_item(inv, lists, stack) + local removed = ItemStack(nil) + local leftover = ItemStack(stack) + + for i = 1, #lists do + if leftover:is_empty() then + break + end + + local cur_removed = inv:remove_item(lists[i], leftover) + removed:add_item(cur_removed) + leftover:take_item(cur_removed:get_count()) + end + + return removed +end + +--[[ +Add item to inventory lists. +Return leftover stack. + +This function replicates the inv:add_item function but can accept +multiple lists. + +Arguments: + inv: minetest inventory reference + lists: names of inventory lists + stack: minetest item stack +--]] +function unified_inventory.add_item(inv, lists, stack) + local leftover = ItemStack(stack) + + for i = 1, #lists do + if leftover:is_empty() then + break + end + + leftover = inv:add_item(lists[i], leftover) + end + + return leftover +end + +--[[ +Move items from source list to destination list if possible. +Skip positions specified in exclude set. + +Arguments: + inv: minetest inventory reference + src_list: name of source list + dst_list: name of destination list + exclude: set of positions to skip +--]] +function unified_inventory.swap_items(inv, src_list, dst_list, exclude) + local size = inv:get_size(src_list) + local empty = ItemStack(nil) + + for i = 1, size do + if exclude == nil or exclude[i] == nil then + local stack = inv:get_stack(src_list, i) + + if not stack:is_empty() then + inv:set_stack(src_list, i, empty) + local leftover = inv:add_item(dst_list, stack) + + if not leftover:is_empty() then + inv:set_stack(src_list, i, leftover) + end + end + end + end +end + +--[[ +Move matched items to the destination list. + +If destination list position is already occupied with some other item +then function tries to (in that order): +1. Move it to the source list +2. Move it to some other unused position in destination list itself +3. Drop it to the ground if nothing else is possible. + +Arguments: + player: minetest player object + src_list: name of source list + dst_list: name of destination list + match_table: table of matched items + amount: amount of items per every position +--]] +function unified_inventory.move_match(player, src_list, dst_list, match_table, amount) + local inv = player:get_inventory() + local item_drop = minetest.item_drop + local src_dst_list = {src_list, dst_list} + local dst_src_list = {dst_list, src_list} + + local needed = {} + local moved = {} + + -- Remove stacks needed for craft + for item, pos_set in pairs(match_table) do + local stack = ItemStack(item) + local stack_max = stack:get_stack_max() + local bounded_amount = math.min(stack_max, amount) + stack:set_count(bounded_amount) + + for pos in pairs(pos_set) do + needed[pos] = unified_inventory.remove_item(inv, dst_src_list, stack) + end + end + + -- Add already removed stacks + for pos, stack in pairs(needed) do + local occupied = inv:get_stack(dst_list, pos) + inv:set_stack(dst_list, pos, stack) + + if not occupied:is_empty() then + local leftover = unified_inventory.add_item(inv, src_dst_list, occupied) + + if not leftover:is_empty() then + inv:set_stack(dst_list, pos, leftover) + local oversize = unified_inventory.add_item(inv, src_dst_list, stack) + + if not oversize:is_empty() then + item_drop(oversize, player, player:get_pos()) + end + end + end + + moved[pos] = true + end + + -- Swap items from unused positions to src (moved positions excluded) + unified_inventory.swap_items(inv, dst_list, src_list, moved) +end + +--[[ +Find craft match and move matched items to the destination list. + +If match cannot be found or match count is smaller than the desired +amount then do nothing. + +If amount passed is -1 then amount is defined by match count itself. +This is used to indicate "craft All" case. + +Arguments: + player: minetest player object + src_list: name of source list + dst_list: name of destination list + craft: minetest craft recipe + amount: desired amount of output items +--]] +function unified_inventory.craftguide_match_craft(player, src_list, dst_list, craft, amount) + local inv = player:get_inventory() + local src_dst_list = {src_list, dst_list} + + local counts = unified_inventory.count_items(inv, src_dst_list) + local positions = unified_inventory.count_craft_positions(craft) + local match_table, match_count = unified_inventory.match_items(counts, positions) + + if match_table == nil or match_count < amount then + return + end + + if amount == -1 then + amount = match_count + end + + unified_inventory.move_match(player, src_list, dst_list, match_table, amount) +end diff --git a/mods/unified_inventory/mod.conf b/mods/unified_inventory/mod.conf new file mode 100644 index 00000000..53d07703 --- /dev/null +++ b/mods/unified_inventory/mod.conf @@ -0,0 +1,11 @@ +name = unified_inventory + +optional_depends = default, creative, sfinv, datastorage +description = """ +Unified Inventory replaces the default survival and creative inventory. +It adds a nicer interface and a number of features, such as a crafting guide. +""" +min_minetest_version = 5.4.0 +release = 30322 +author = RealBadAngel +title = Unified Inventory diff --git a/mods/unified_inventory/register.lua b/mods/unified_inventory/register.lua new file mode 100644 index 00000000..f2b689ec --- /dev/null +++ b/mods/unified_inventory/register.lua @@ -0,0 +1,534 @@ +local S = minetest.get_translator("unified_inventory") +local NS = function(s) return s end +local F = minetest.formspec_escape +local ui = unified_inventory + +minetest.register_privilege("creative", { + description = S("Can use the creative inventory"), + give_to_singleplayer = false, +}) + +minetest.register_privilege("ui_full", { + description = S("Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally"), + give_to_singleplayer = false, +}) + +local trash = minetest.create_detached_inventory("trash", { + --allow_put = function(inv, listname, index, stack, player) + -- if ui.is_creative(player:get_player_name()) then + -- return stack:get_count() + -- else + -- return 0 + -- end + --end, + on_put = function(inv, listname, index, stack, player) + inv:set_stack(listname, index, nil) + local player_name = player:get_player_name() + minetest.sound_play("trash", {to_player=player_name, gain = 1.0}) + end, +}) +trash:set_size("main", 1) + +ui.register_button("craft", { + type = "image", + image = "ui_craft_icon.png", + tooltip = S("Crafting Grid") +}) + +ui.register_button("craftguide", { + type = "image", + image = "ui_craftguide_icon.png", + tooltip = S("Crafting Guide") +}) + +ui.register_button("home_gui_set", { + type = "image", + image = "ui_sethome_icon.png", + tooltip = S("Set home position"), + hide_lite=true, + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {home=true}) then + ui.set_home(player, player:get_pos()) + local home = ui.home_pos[player_name] + if home ~= nil then + minetest.sound_play("dingdong", + {to_player=player_name, gain = 1.0}) + minetest.chat_send_player(player_name, + S("Home position set to: @1", minetest.pos_to_string(home))) + end + else + minetest.chat_send_player(player_name, + S("You don't have the \"home\" privilege!")) + ui.set_inventory_formspec(player, ui.current_page[player_name]) + end + end, + condition = function(player) + return minetest.check_player_privs(player:get_player_name(), {home=true}) + end, +}) + +ui.register_button("home_gui_go", { + type = "image", + image = "ui_gohome_icon.png", + tooltip = S("Go home"), + hide_lite=true, + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {home=true}) then + if ui.go_home(player) then + minetest.sound_play("teleport", {to_player = player_name}) + end + else + minetest.chat_send_player(player_name, + S("You don't have the \"home\" privilege!")) + ui.set_inventory_formspec(player, ui.current_page[player_name]) + end + end, + condition = function(player) + return minetest.check_player_privs(player:get_player_name(), {home=true}) + end, +}) + +ui.register_button("misc_set_day", { + type = "image", + image = "ui_sun_icon.png", + tooltip = S("Set time to day"), + hide_lite=true, + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {settime=true}) then + minetest.sound_play("ui_morning", + {to_player=player_name, gain = 1.0}) + minetest.set_timeofday((6000 % 24000) / 24000) + minetest.chat_send_player(player_name, + S("Time of day set to 6am")) + else + minetest.chat_send_player(player_name, + S("You don't have the settime privilege!")) + ui.set_inventory_formspec(player, ui.current_page[player_name]) + end + end, + condition = function(player) + return minetest.check_player_privs(player:get_player_name(), {settime=true}) + end, +}) + +ui.register_button("misc_set_night", { + type = "image", + image = "ui_moon_icon.png", + tooltip = S("Set time to night"), + hide_lite=true, + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {settime=true}) then + minetest.sound_play("ui_owl", + {to_player=player_name, gain = 1.0}) + minetest.set_timeofday((21000 % 24000) / 24000) + minetest.chat_send_player(player_name, + S("Time of day set to 9pm")) + else + minetest.chat_send_player(player_name, + S("You don't have the settime privilege!")) + ui.set_inventory_formspec(player, ui.current_page[player_name]) + end + end, + condition = function(player) + return minetest.check_player_privs(player:get_player_name(), {settime=true}) + end, +}) + +ui.register_button("clear_inv", { + type = "image", + image = "ui_trash_icon.png", + tooltip = S("Clear inventory"), + action = function(player) + local player_name = player:get_player_name() + if not ui.is_creative(player_name) then + minetest.chat_send_player(player_name, + S("This button has been disabled outside" + .." of creative mode to prevent" + .." accidental inventory trashing." + .."\nUse the trash slot instead.")) + ui.set_inventory_formspec(player, ui.current_page[player_name]) + return + end + player:get_inventory():set_list("main", {}) + minetest.chat_send_player(player_name, S('Inventory cleared!')) + minetest.sound_play("trash_all", + {to_player=player_name, gain = 1.0}) + end, + condition = function(player) + return ui.is_creative(player:get_player_name()) + end, +}) + +ui.register_page("craft", { + get_formspec = function(player, perplayer_formspec) + + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local craftx = perplayer_formspec.craft_x + local crafty = perplayer_formspec.craft_y + + local player_name = player:get_player_name() + local formspec = { + perplayer_formspec.standard_inv_bg, + perplayer_formspec.craft_grid, + "label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", + "listcolors[#00000000;#00000000]", + "listring[current_name;craft]", + "listring[current_player;main]" + } + local n=#formspec+1 + + if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then + formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.35, crafty + 2.3, F(S("Trash:"))) + formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) + n=n + 2 + end + + if ui.is_creative(player_name) then + formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) + formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.4, crafty + 2.3, F(S("Refill:"))) + formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", + F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) + end + return {formspec=table.concat(formspec)} + end, +}) + +-- stack_image_button(): generate a form button displaying a stack of items +-- +-- The specified item may be a group. In that case, the group will be +-- represented by some item in the group, along with a flag indicating +-- that it's a group. If the group contains only one item, it will be +-- treated as if that item had been specified directly. + +local function stack_image_button(x, y, w, h, buttonname_prefix, item) + local name = item:get_name() + local description = item:get_meta():get_string("description") + local show_is_group = false + local displayitem = item:to_string() + local selectitem = name + if name:sub(1, 6) == "group:" then + local group_name = name:sub(7) + local group_item = ui.get_group_item(group_name) + show_is_group = not group_item.sole + displayitem = group_item.item or name + selectitem = group_item.sole and displayitem or name + end + local label = show_is_group and "G" or "" + -- Unique id to prevent tooltip being overridden + local id = string.format("%i%i_", x*10, y*10) + local buttonname = F(id..buttonname_prefix..ui.mangle_for_formspec(selectitem)) + local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]", + x, y, w, h, + F(displayitem), buttonname, label) + if show_is_group then + local groupstring, andcount = ui.extract_groupnames(name) + local grouptip + if andcount == 1 then + grouptip = S("Any item belonging to the @1 group", groupstring) + elseif andcount > 1 then + grouptip = S("Any item belonging to the groups @1", groupstring) + end + grouptip = F(grouptip) + if andcount >= 1 then + button = button .. string.format("tooltip[%s;%s]", buttonname, grouptip) + end + elseif description ~= "" then + button = button .. string.format("tooltip[%s;%s]", buttonname, F(description)) + end + return button +end + +-- The recipe text contains parameters, hence they can yet not be translated. +-- Instead, use a dummy translation call so that it can be picked up by the +-- static parsing of the translation string update script +local recipe_text = { + recipe = NS("Recipe @1 of @2"), + usage = NS("Usage @1 of @2"), +} +local no_recipe_text = { + recipe = S("No recipes"), + usage = S("No usages"), +} +local role_text = { + recipe = S("Result"), + usage = S("Ingredient"), +} +local next_alt_text = { + recipe = S("Show next recipe"), + usage = S("Show next usage"), +} +local prev_alt_text = { + recipe = S("Show previous recipe"), + usage = S("Show previous usage"), +} +local other_dir = { + recipe = "usage", + usage = "recipe", +} + +ui.register_page("craftguide", { + get_formspec = function(player, perplayer_formspec) + + local craftguidex = perplayer_formspec.craft_guide_x + local craftguidey = perplayer_formspec.craft_guide_y + local craftguidearrowx = perplayer_formspec.craft_guide_arrow_x + local craftguideresultx = perplayer_formspec.craft_guide_result_x + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local give_x = perplayer_formspec.give_btn_x + + local player_name = player:get_player_name() + local player_privs = minetest.get_player_privs(player_name) + + local formspec = { + perplayer_formspec.standard_inv_bg, + "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", + "listcolors[#00000000;#00000000]" + } + + local item_name = ui.current_item[player_name] + if not item_name then + return { formspec = table.concat(formspec) } + end + + local n = 4 + + local item_def = minetest.registered_items[item_name] + local item_name_shown + if item_def and item_def.description then + item_name_shown = S("@1 (@2)", item_def.description, item_name) + else + item_name_shown = item_name + end + + local dir = ui.current_craft_direction[player_name] + local rdir = dir == "recipe" and "usage" or "recipe" + + local crafts = ui.crafts_for[dir][item_name] + local alternate = ui.alternate[player_name] + local alternates, craft + if crafts and #crafts > 0 then + alternates = #crafts + craft = crafts[alternate] + end + local has_give = player_privs.give or ui.is_creative(player_name) + + formspec[n] = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + craftguidearrowx, craftguidey, ui.imgscale, ui.imgscale) + + formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", + perplayer_formspec.craft_guide_resultstr_x, perplayer_formspec.craft_guide_resultstr_y, + F(role_text[dir]), item_name_shown) + n = n + 2 + + local giveme_form = + "label[" .. (give_x + 0.1) .. "," .. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]" .. + "button[" .. (give_x) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]" + if item_def and item_def.type ~= "tool" then + giveme_form = giveme_form .. + "button[" .. (give_x + 0.8) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]" .. + "button[" .. (give_x + 1.6) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" + end + + if not craft then + -- No craft recipes available for this item. + formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir])) + local no_pos = dir == "recipe" and (craftguidex+2.5) or craftguideresultx + local item_pos = dir == "recipe" and craftguideresultx or (craftguidex+2.5) + formspec[n+1] = "image["..no_pos..","..craftguidey..";1.2,1.2;ui_no.png]" + formspec[n+2] = stack_image_button(item_pos, craftguidey, 1.2, 1.2, + "item_button_" .. other_dir[dir] .. "_", ItemStack(item_name)) + if has_give then + formspec[n+3] = giveme_form + end + return { formspec = table.concat(formspec) } + else + formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2, + "item_button_" .. rdir .. "_", ItemStack(craft.output)) + n = n + 1 + end + + local craft_type = ui.registered_craft_types[craft.type] or + ui.craft_type_defaults(craft.type, {}) + if craft_type.icon then + formspec[n] = string.format("image[%f,%f;%f,%f;%s]", + craftguidearrowx+0.35, craftguidey, 0.5, 0.5, craft_type.icon) + n = n + 1 + end + formspec[n] = string.format("label[%f,%f;%s]", craftguidearrowx + 0.15, craftguidey + 1.4, F(craft_type.description)) + n = n + 1 + + local display_size = craft_type.dynamic_display_size + and craft_type.dynamic_display_size(craft) + or { width = craft_type.width, height = craft_type.height } + local craft_width = craft_type.get_shaped_craft_width + and craft_type.get_shaped_craft_width(craft) + or display_size.width + + -- This keeps recipes aligned to the right, + -- so that they're close to the arrow. + local xoffset = craftguidex+3.75 + local bspc = 1.25 + -- Offset factor for crafting grids with side length > 4 + local of = (3/math.max(3, math.max(display_size.width, display_size.height))) + local od = 0 + -- Minimum grid size at which size optimization measures kick in + local mini_craft_size = 6 + if display_size.width >= mini_craft_size then + od = math.max(1, display_size.width - 2) + xoffset = xoffset - 0.1 + end + -- Size modifier factor + local sf = math.min(1, of * (1.05 + 0.05*od)) + -- Button size + local bsize = 1.2 * sf + + if display_size.width >= mini_craft_size then -- it's not a normal 3x3 grid + bsize = 0.8 * sf + end + if (bsize > 0.35 and display_size.width) then + for y = 1, display_size.height do + for x = 1, display_size.width do + local item + if craft and x <= craft_width then + item = craft.items[(y-1) * craft_width + x] + end + -- Flipped x, used to build formspec buttons from right to left + local fx = display_size.width - (x-1) + -- x offset, y offset + local xof = ((fx-1) * of + of) * bspc + local yof = ((y-1) * of + 1) * bspc + if item then + formspec[n] = stack_image_button( + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize, + "item_button_recipe_", + ItemStack(item)) + else + -- Fake buttons just to make grid + formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize) + end + n = n + 1 + end + end + else + -- Error + formspec[n] = string.format("label[2,%f;%s]", + craftguidey, F(S("This recipe is too@nlarge to be displayed."))) + n = n + 1 + end + + if craft_type.uses_crafting_grid and display_size.width <= 3 then + formspec[n] = "label["..(give_x+0.1)..",".. (craftguidey + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + formspec[n+1] = "button[".. (give_x)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" + formspec[n+2] = "button[".. (give_x+0.8)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" + formspec[n+3] = "button[".. (give_x+1.6)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + n = n + 4 + end + + if has_give then + formspec[n] = giveme_form + n = n + 1 + end + + if alternates and alternates > 1 then + formspec[n] = string.format("label[%f,%f;%s]", + craftguidex+4, craftguidey + 2.3, F(S(recipe_text[dir], alternate, alternates))) + formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]", + craftguidearrowx+0.2, craftguidey + 2.6) + formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]", + craftguidearrowx+1.35, craftguidey + 2.6) + formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" + formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" + end + + return { formspec = table.concat(formspec) } + end, +}) + +local function craftguide_giveme(player, formname, fields) + local player_name = player:get_player_name() + local player_privs = minetest.get_player_privs(player_name) + if not player_privs.give and + not ui.is_creative(player_name) then + minetest.log("action", "[unified_inventory] Denied give action to player " .. + player_name) + return + end + + local amount + for k, v in pairs(fields) do + amount = k:match("craftguide_giveme_(.*)") + if amount then break end + end + + amount = tonumber(amount) or 0 + if amount == 0 then return end + + local output = ui.current_item[player_name] + if (not output) or (output == "") then return end + + local player_inv = player:get_inventory() + + player_inv:add_item("main", {name = output, count = amount}) +end + +local function craftguide_craft(player, formname, fields) + local amount + for k, v in pairs(fields) do + amount = k:match("craftguide_craft_(.*)") + if amount then break end + end + if not amount then return end + + amount = tonumber(amount) or -1 -- fallback for "all" + if amount == 0 or amount < -1 or amount > 99 then return end + + local player_name = player:get_player_name() + + local output = ui.current_item[player_name] or "" + if output == "" then return end + + local crafts = ui.crafts_for[ + ui.current_craft_direction[player_name]][output] or {} + if #crafts == 0 then return end + + local alternate = ui.alternate[player_name] + + local craft = crafts[alternate] + if not craft.width then + if not craft.output then + minetest.log("warning", "[unified_inventory] Craft has no output.") + else + minetest.log("warning", ("[unified_inventory] Craft for '%s' has no width."):format(craft.output)) + end + return + end + if craft.width > 3 then return end + + ui.craftguide_match_craft(player, "main", "craft", craft, amount) + + ui.set_inventory_formspec(player, "craft") +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then + return + end + + for k, v in pairs(fields) do + if k:match("craftguide_craft_") then + craftguide_craft(player, formname, fields) + return + end + if k:match("craftguide_giveme_") then + craftguide_giveme(player, formname, fields) + return + end + end +end) diff --git a/mods/unified_inventory/screenshot.png b/mods/unified_inventory/screenshot.png new file mode 100644 index 00000000..bf9e6be3 Binary files /dev/null and b/mods/unified_inventory/screenshot.png differ diff --git a/mods/unified_inventory/settingtypes.txt b/mods/unified_inventory/settingtypes.txt new file mode 100644 index 00000000..6f04aeae --- /dev/null +++ b/mods/unified_inventory/settingtypes.txt @@ -0,0 +1,36 @@ +# Reduced formspec layout, optimized for smaller displays. +# Note: This may also disable some features to free up visual space. +unified_inventory_lite (Lite mode) bool false + +# Provides craftable bag items to extend the inventory space. +unified_inventory_bags (Enable bags) bool true + +# Shows the trash slot to everyone. +# When disabled, only players with the privilege "creative" or "give" will +# have this slot shown in their inventory. +unified_inventory_trash (Enable trash) bool true + +# Provides waypoints on a per-player basis to remember positions on the map. +unified_inventory_waypoints (Enable waypoints) bool true + +# If enabled, disabled buttons will be hidden instead of grayed out. +unified_inventory_hide_disabled_buttons (Hide disabled buttons) bool false + +# Hides items with no known craft recipe from the category "all" (default). +# This setting has no effect on players in creative mode. +unified_inventory_hide_uncraftable_items (Hide uncraftable items) bool false + +# Automatically categorizes registered items based on their +# groups. This is based on a fuzzy match, thus is not 100% accurate. +unified_inventory_automatic_categorization (Categories: add items automatically) bool true + +# Shows the selected wielded item description in the HUD for a few seconds. +unified_inventory_item_names (Enable HUD item names) bool true + +# Trims the shown wielded item description to the first line. +unified_inventory_only_names (HUD item name: first line only) bool true + +# Hard character limit of the wielded item description. +# Crops the shown description to the specified length. +# 0 disables this functionality. +unified_inventory_max_item_name_length (HUD item names: character limit) int 80 diff --git a/mods/unified_inventory/sounds/click.ogg b/mods/unified_inventory/sounds/click.ogg new file mode 100644 index 00000000..3db63a07 Binary files /dev/null and b/mods/unified_inventory/sounds/click.ogg differ diff --git a/mods/unified_inventory/sounds/dingdong.ogg b/mods/unified_inventory/sounds/dingdong.ogg new file mode 100644 index 00000000..2c9d7ef7 Binary files /dev/null and b/mods/unified_inventory/sounds/dingdong.ogg differ diff --git a/mods/unified_inventory/sounds/electricity.ogg b/mods/unified_inventory/sounds/electricity.ogg new file mode 100644 index 00000000..4cd7c846 Binary files /dev/null and b/mods/unified_inventory/sounds/electricity.ogg differ diff --git a/mods/unified_inventory/sounds/paperflip1.ogg b/mods/unified_inventory/sounds/paperflip1.ogg new file mode 100644 index 00000000..eaed13f8 Binary files /dev/null and b/mods/unified_inventory/sounds/paperflip1.ogg differ diff --git a/mods/unified_inventory/sounds/paperflip2.ogg b/mods/unified_inventory/sounds/paperflip2.ogg new file mode 100644 index 00000000..321bc487 Binary files /dev/null and b/mods/unified_inventory/sounds/paperflip2.ogg differ diff --git a/mods/unified_inventory/sounds/teleport.ogg b/mods/unified_inventory/sounds/teleport.ogg new file mode 100644 index 00000000..ca32f745 Binary files /dev/null and b/mods/unified_inventory/sounds/teleport.ogg differ diff --git a/mods/unified_inventory/sounds/trash.ogg b/mods/unified_inventory/sounds/trash.ogg new file mode 100644 index 00000000..51e4f24a Binary files /dev/null and b/mods/unified_inventory/sounds/trash.ogg differ diff --git a/mods/unified_inventory/sounds/trash_all.ogg b/mods/unified_inventory/sounds/trash_all.ogg new file mode 100644 index 00000000..85c3f66c Binary files /dev/null and b/mods/unified_inventory/sounds/trash_all.ogg differ diff --git a/mods/unified_inventory/sounds/ui_click.ogg b/mods/unified_inventory/sounds/ui_click.ogg new file mode 100644 index 00000000..0c9fe31b Binary files /dev/null and b/mods/unified_inventory/sounds/ui_click.ogg differ diff --git a/mods/unified_inventory/sounds/ui_morning.ogg b/mods/unified_inventory/sounds/ui_morning.ogg new file mode 100644 index 00000000..7fb8c22b Binary files /dev/null and b/mods/unified_inventory/sounds/ui_morning.ogg differ diff --git a/mods/unified_inventory/sounds/ui_owl.ogg b/mods/unified_inventory/sounds/ui_owl.ogg new file mode 100644 index 00000000..a1433f9e Binary files /dev/null and b/mods/unified_inventory/sounds/ui_owl.ogg differ diff --git a/mods/unified_inventory/textures/bags_large.png b/mods/unified_inventory/textures/bags_large.png new file mode 100644 index 00000000..187021c0 Binary files /dev/null and b/mods/unified_inventory/textures/bags_large.png differ diff --git a/mods/unified_inventory/textures/bags_medium.png b/mods/unified_inventory/textures/bags_medium.png new file mode 100644 index 00000000..d908883f Binary files /dev/null and b/mods/unified_inventory/textures/bags_medium.png differ diff --git a/mods/unified_inventory/textures/bags_small.png b/mods/unified_inventory/textures/bags_small.png new file mode 100644 index 00000000..9e4f4f61 Binary files /dev/null and b/mods/unified_inventory/textures/bags_small.png differ diff --git a/mods/unified_inventory/textures/ui_1_icon.png b/mods/unified_inventory/textures/ui_1_icon.png new file mode 100644 index 00000000..ed4ceb9e Binary files /dev/null and b/mods/unified_inventory/textures/ui_1_icon.png differ diff --git a/mods/unified_inventory/textures/ui_2_icon.png b/mods/unified_inventory/textures/ui_2_icon.png new file mode 100644 index 00000000..f4566d83 Binary files /dev/null and b/mods/unified_inventory/textures/ui_2_icon.png differ diff --git a/mods/unified_inventory/textures/ui_3_icon.png b/mods/unified_inventory/textures/ui_3_icon.png new file mode 100644 index 00000000..ff6ebbba Binary files /dev/null and b/mods/unified_inventory/textures/ui_3_icon.png differ diff --git a/mods/unified_inventory/textures/ui_4_icon.png b/mods/unified_inventory/textures/ui_4_icon.png new file mode 100644 index 00000000..3a12bfd2 Binary files /dev/null and b/mods/unified_inventory/textures/ui_4_icon.png differ diff --git a/mods/unified_inventory/textures/ui_5_icon.png b/mods/unified_inventory/textures/ui_5_icon.png new file mode 100644 index 00000000..c3891528 Binary files /dev/null and b/mods/unified_inventory/textures/ui_5_icon.png differ diff --git a/mods/unified_inventory/textures/ui_bags_icon.png b/mods/unified_inventory/textures/ui_bags_icon.png new file mode 100644 index 00000000..2882a239 Binary files /dev/null and b/mods/unified_inventory/textures/ui_bags_icon.png differ diff --git a/mods/unified_inventory/textures/ui_blank_image.png b/mods/unified_inventory/textures/ui_blank_image.png new file mode 100644 index 00000000..83d9d1a6 Binary files /dev/null and b/mods/unified_inventory/textures/ui_blank_image.png differ diff --git a/mods/unified_inventory/textures/ui_blue_icon_background.png b/mods/unified_inventory/textures/ui_blue_icon_background.png new file mode 100644 index 00000000..2f872a46 Binary files /dev/null and b/mods/unified_inventory/textures/ui_blue_icon_background.png differ diff --git a/mods/unified_inventory/textures/ui_category_all.png b/mods/unified_inventory/textures/ui_category_all.png new file mode 100644 index 00000000..0af7a537 Binary files /dev/null and b/mods/unified_inventory/textures/ui_category_all.png differ diff --git a/mods/unified_inventory/textures/ui_category_none.png b/mods/unified_inventory/textures/ui_category_none.png new file mode 100644 index 00000000..8976fb0e Binary files /dev/null and b/mods/unified_inventory/textures/ui_category_none.png differ diff --git a/mods/unified_inventory/textures/ui_circular_arrows_icon.png b/mods/unified_inventory/textures/ui_circular_arrows_icon.png new file mode 100644 index 00000000..c6846e62 Binary files /dev/null and b/mods/unified_inventory/textures/ui_circular_arrows_icon.png differ diff --git a/mods/unified_inventory/textures/ui_craft_icon.png b/mods/unified_inventory/textures/ui_craft_icon.png new file mode 100644 index 00000000..a2283e30 Binary files /dev/null and b/mods/unified_inventory/textures/ui_craft_icon.png differ diff --git a/mods/unified_inventory/textures/ui_craftgrid_icon.png b/mods/unified_inventory/textures/ui_craftgrid_icon.png new file mode 100644 index 00000000..5111f1e9 Binary files /dev/null and b/mods/unified_inventory/textures/ui_craftgrid_icon.png differ diff --git a/mods/unified_inventory/textures/ui_craftguide_icon.png b/mods/unified_inventory/textures/ui_craftguide_icon.png new file mode 100644 index 00000000..d6c89e6e Binary files /dev/null and b/mods/unified_inventory/textures/ui_craftguide_icon.png differ diff --git a/mods/unified_inventory/textures/ui_crafting_arrow.png b/mods/unified_inventory/textures/ui_crafting_arrow.png new file mode 100644 index 00000000..6901c588 Binary files /dev/null and b/mods/unified_inventory/textures/ui_crafting_arrow.png differ diff --git a/mods/unified_inventory/textures/ui_doubleleft_icon.png b/mods/unified_inventory/textures/ui_doubleleft_icon.png new file mode 100644 index 00000000..64d50c05 Binary files /dev/null and b/mods/unified_inventory/textures/ui_doubleleft_icon.png differ diff --git a/mods/unified_inventory/textures/ui_doubleright_icon.png b/mods/unified_inventory/textures/ui_doubleright_icon.png new file mode 100644 index 00000000..af209302 Binary files /dev/null and b/mods/unified_inventory/textures/ui_doubleright_icon.png differ diff --git a/mods/unified_inventory/textures/ui_formbg_9_sliced.png b/mods/unified_inventory/textures/ui_formbg_9_sliced.png new file mode 100644 index 00000000..817ced5e Binary files /dev/null and b/mods/unified_inventory/textures/ui_formbg_9_sliced.png differ diff --git a/mods/unified_inventory/textures/ui_gohome_icon.png b/mods/unified_inventory/textures/ui_gohome_icon.png new file mode 100644 index 00000000..c5126ae5 Binary files /dev/null and b/mods/unified_inventory/textures/ui_gohome_icon.png differ diff --git a/mods/unified_inventory/textures/ui_green_icon_background.png b/mods/unified_inventory/textures/ui_green_icon_background.png new file mode 100644 index 00000000..ea28c822 Binary files /dev/null and b/mods/unified_inventory/textures/ui_green_icon_background.png differ diff --git a/mods/unified_inventory/textures/ui_group.png b/mods/unified_inventory/textures/ui_group.png new file mode 100644 index 00000000..b6b8d28c Binary files /dev/null and b/mods/unified_inventory/textures/ui_group.png differ diff --git a/mods/unified_inventory/textures/ui_home_icon.png b/mods/unified_inventory/textures/ui_home_icon.png new file mode 100644 index 00000000..b9ce4f3d Binary files /dev/null and b/mods/unified_inventory/textures/ui_home_icon.png differ diff --git a/mods/unified_inventory/textures/ui_left_icon.png b/mods/unified_inventory/textures/ui_left_icon.png new file mode 100644 index 00000000..373b71ef Binary files /dev/null and b/mods/unified_inventory/textures/ui_left_icon.png differ diff --git a/mods/unified_inventory/textures/ui_moon_icon.png b/mods/unified_inventory/textures/ui_moon_icon.png new file mode 100644 index 00000000..cec7009d Binary files /dev/null and b/mods/unified_inventory/textures/ui_moon_icon.png differ diff --git a/mods/unified_inventory/textures/ui_no.png b/mods/unified_inventory/textures/ui_no.png new file mode 100644 index 00000000..aa98ed62 Binary files /dev/null and b/mods/unified_inventory/textures/ui_no.png differ diff --git a/mods/unified_inventory/textures/ui_off_icon.png b/mods/unified_inventory/textures/ui_off_icon.png new file mode 100644 index 00000000..187e59a6 Binary files /dev/null and b/mods/unified_inventory/textures/ui_off_icon.png differ diff --git a/mods/unified_inventory/textures/ui_ok_icon.png b/mods/unified_inventory/textures/ui_ok_icon.png new file mode 100644 index 00000000..4073899c Binary files /dev/null and b/mods/unified_inventory/textures/ui_ok_icon.png differ diff --git a/mods/unified_inventory/textures/ui_on_icon.png b/mods/unified_inventory/textures/ui_on_icon.png new file mode 100644 index 00000000..0f5c48ff Binary files /dev/null and b/mods/unified_inventory/textures/ui_on_icon.png differ diff --git a/mods/unified_inventory/textures/ui_pencil_icon.png b/mods/unified_inventory/textures/ui_pencil_icon.png new file mode 100644 index 00000000..dfcc19bc Binary files /dev/null and b/mods/unified_inventory/textures/ui_pencil_icon.png differ diff --git a/mods/unified_inventory/textures/ui_red_icon_background.png b/mods/unified_inventory/textures/ui_red_icon_background.png new file mode 100644 index 00000000..8d4d8070 Binary files /dev/null and b/mods/unified_inventory/textures/ui_red_icon_background.png differ diff --git a/mods/unified_inventory/textures/ui_reset_icon.png b/mods/unified_inventory/textures/ui_reset_icon.png new file mode 100644 index 00000000..e966685c Binary files /dev/null and b/mods/unified_inventory/textures/ui_reset_icon.png differ diff --git a/mods/unified_inventory/textures/ui_right_icon.png b/mods/unified_inventory/textures/ui_right_icon.png new file mode 100644 index 00000000..cbdab76d Binary files /dev/null and b/mods/unified_inventory/textures/ui_right_icon.png differ diff --git a/mods/unified_inventory/textures/ui_search_icon.png b/mods/unified_inventory/textures/ui_search_icon.png new file mode 100644 index 00000000..2934bdcf Binary files /dev/null and b/mods/unified_inventory/textures/ui_search_icon.png differ diff --git a/mods/unified_inventory/textures/ui_sethome_icon.png b/mods/unified_inventory/textures/ui_sethome_icon.png new file mode 100644 index 00000000..4c0f6e58 Binary files /dev/null and b/mods/unified_inventory/textures/ui_sethome_icon.png differ diff --git a/mods/unified_inventory/textures/ui_single_slot.png b/mods/unified_inventory/textures/ui_single_slot.png new file mode 100644 index 00000000..2451623c Binary files /dev/null and b/mods/unified_inventory/textures/ui_single_slot.png differ diff --git a/mods/unified_inventory/textures/ui_single_slot_bright.png b/mods/unified_inventory/textures/ui_single_slot_bright.png new file mode 100644 index 00000000..c66365c9 Binary files /dev/null and b/mods/unified_inventory/textures/ui_single_slot_bright.png differ diff --git a/mods/unified_inventory/textures/ui_skip_backward_icon.png b/mods/unified_inventory/textures/ui_skip_backward_icon.png new file mode 100644 index 00000000..eac6e4c7 Binary files /dev/null and b/mods/unified_inventory/textures/ui_skip_backward_icon.png differ diff --git a/mods/unified_inventory/textures/ui_skip_forward_icon.png b/mods/unified_inventory/textures/ui_skip_forward_icon.png new file mode 100644 index 00000000..3f85a9f7 Binary files /dev/null and b/mods/unified_inventory/textures/ui_skip_forward_icon.png differ diff --git a/mods/unified_inventory/textures/ui_smallbg_9_sliced.png b/mods/unified_inventory/textures/ui_smallbg_9_sliced.png new file mode 100644 index 00000000..916b1463 Binary files /dev/null and b/mods/unified_inventory/textures/ui_smallbg_9_sliced.png differ diff --git a/mods/unified_inventory/textures/ui_sun_icon.png b/mods/unified_inventory/textures/ui_sun_icon.png new file mode 100644 index 00000000..11c7eef2 Binary files /dev/null and b/mods/unified_inventory/textures/ui_sun_icon.png differ diff --git a/mods/unified_inventory/textures/ui_teleport.png b/mods/unified_inventory/textures/ui_teleport.png new file mode 100644 index 00000000..8ea5d203 Binary files /dev/null and b/mods/unified_inventory/textures/ui_teleport.png differ diff --git a/mods/unified_inventory/textures/ui_trash_icon.png b/mods/unified_inventory/textures/ui_trash_icon.png new file mode 100644 index 00000000..c5ac97c6 Binary files /dev/null and b/mods/unified_inventory/textures/ui_trash_icon.png differ diff --git a/mods/unified_inventory/textures/ui_trash_slot_icon.png b/mods/unified_inventory/textures/ui_trash_slot_icon.png new file mode 100644 index 00000000..5fc4de1d Binary files /dev/null and b/mods/unified_inventory/textures/ui_trash_slot_icon.png differ diff --git a/mods/unified_inventory/textures/ui_waypoint_set_icon.png b/mods/unified_inventory/textures/ui_waypoint_set_icon.png new file mode 100644 index 00000000..4649a4d4 Binary files /dev/null and b/mods/unified_inventory/textures/ui_waypoint_set_icon.png differ diff --git a/mods/unified_inventory/textures/ui_waypoints_icon.png b/mods/unified_inventory/textures/ui_waypoints_icon.png new file mode 100644 index 00000000..91d6e3b9 Binary files /dev/null and b/mods/unified_inventory/textures/ui_waypoints_icon.png differ diff --git a/mods/unified_inventory/textures/ui_xyz_icon.png b/mods/unified_inventory/textures/ui_xyz_icon.png new file mode 100644 index 00000000..003ea633 Binary files /dev/null and b/mods/unified_inventory/textures/ui_xyz_icon.png differ diff --git a/mods/unified_inventory/waypoints.lua b/mods/unified_inventory/waypoints.lua new file mode 100644 index 00000000..8fdd8014 --- /dev/null +++ b/mods/unified_inventory/waypoints.lua @@ -0,0 +1,375 @@ +local S = minetest.get_translator("unified_inventory") +local F = minetest.formspec_escape +local ui = unified_inventory +local COUNT = 5 + +local hud_colors = { + {"#FFFFFF", 0xFFFFFF, S("White")}, + {"#DBBB00", 0xf1d32c, S("Yellow")}, + {"#DD0000", 0xDD0000, S("Red")}, + {"#2cf136", 0x2cf136, S("Green")}, + {"#2c4df1", 0x2c4df1, S("Blue")}, +} + +-- Storage compatibility code + +--[[ +Stores temporary player data (persists until player leaves) + [player_name] = { + [] = { + edit = , + hud = , + }, + [] = { ... }, + ... + } +]] +local waypoints_temp = {} + +--[[ +Datastorage format (per-player): + { + selected = , + [] = { + name = + world_pos = , + color = <"hud_colors" index>, + active = , + display_pos = , + }, + [] = { ... }, + ... + } +Player metadata format: + { + selected = , + -- Cannot mix integer/string keys in JSON + data = { + [] = { same as above }, + ... + } + } +]] + +local function set_waypoint_data(player, waypoints) + local meta = player:get_meta() + if not next(waypoints.data or {}) then + -- Empty data. Do not save anything, or delete + meta:set_string("ui_waypoints", "") + else + meta:set_string("ui_waypoints", minetest.write_json(waypoints)) + end +end + +local function migrate_datastorage(player, waypoints) + -- Copy values from old table + local new_data = { + selected = waypoints.selected, + data = {} + } + for i = 1, COUNT do + new_data.data[i] = waypoints[i] + end + + set_waypoint_data(player, new_data) + + -- Delete values, but keep one entry so that it's saved by datastorage + for k, _ in pairs(waypoints) do + waypoints[k] = nil + end + waypoints[1] = 1 +end + +local have_datastorage = minetest.get_modpath("datastorage") ~= nil +local function get_waypoint_data(player) + local player_name = player:get_player_name() + + -- Migration step + if have_datastorage then + local waypoints = datastorage.get(player_name, "waypoints") + if waypoints.selected then + migrate_datastorage(player, waypoints) + minetest.log("action", "[unified_inventory] " .. + "Migrated waypoints of player: " .. player_name) + end + end + + -- Get directly from metadata + local waypoints = player:get_meta():get("ui_waypoints") + waypoints = waypoints and minetest.parse_json(waypoints) or {} + waypoints.data = waypoints.data or {} + + return waypoints +end + +ui.register_page("waypoints", { + get_formspec = function(player, perplayer_formspec) + local player_name = player:get_player_name() + local wp_info_x = ui.style_full.form_header_x + 1.25 + local wp_info_y = ui.style_full.form_header_y + 0.5 + local wp_bottom_row = ui.style_full.std_inv_y - 1 + local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc + local wp_edit_w = ui.style_full.btn_spc * 4 - 0.1 + + local waypoints = get_waypoint_data(player) + local sel = waypoints.selected or 1 + + local formspec = { + string.format("label[%f,%f;%s]", + ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), + "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" + } + local n=3 + + if not perplayer_formspec.is_lite_mode then + formspec[n] = ui.style_full.standard_inv_bg + n = n + 1 + end + + -- Tabs buttons: + for i = 1, COUNT do + local sw="select_waypoint"..i + formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]", + ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, + (i == sel) and "ui_blue_icon_background.png^" or "", + i, sw) + formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]" + n = n + 2 + end + + local waypoint = waypoints.data[sel] or {} + local temp = waypoints_temp[player_name][sel] or {} + local default_name = S("Waypoint @1", sel) + + -- Main buttons: + local btnlist = { + -- 1. formspec name + -- 2. button image + -- 3. translation text + { + "toggle_waypoint", + waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", + waypoint.active and S("Hide waypoint") or S("Show waypoint") + }, + { + "rename_waypoint", + "ui_pencil_icon.png", + S("Edit waypoint name") + }, + { + "set_waypoint", + "ui_waypoint_set_icon.png", + S("Set waypoint to current location") + }, + { + "toggle_display_pos", + waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", + waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") + }, + { + "toggle_color", + "ui_circular_arrows_icon.png", + S("Change color of waypoint display") + }, + } + if minetest.get_player_privs(player_name).teleport then + table.insert(btnlist, { + "teleport_waypoint", + "ui_teleport.png", + S("Teleport to waypoint") + }) + end + + for i, def in pairs(btnlist) do + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", + wp_buttons_rj + ui.style_full.btn_spc * (i - #btnlist), wp_bottom_row, + ui.style_full.btn_size, ui.style_full.btn_size, + def[2], def[1], sel) + formspec[n+1] = "tooltip["..def[1]..sel..";"..F(def[3]).."]" + n = n + 2 + end + + -- Waypoint's info: + formspec[n] = ("label[%f,%f;%s]"):format( + wp_info_x, wp_info_y + 1.1, + F(waypoint.active and S("Waypoint active") or S("Waypoint inactive")) + ) + n = n + 1 + + if temp.edit then + formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]", + wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc, + wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name)) + formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]", + wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, sel) + formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]" + n = n + 3 + end + + formspec[n] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+1.6, F(S("World position")), + minetest.pos_to_string(waypoint.world_pos or vector.new())) + formspec[n+1] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.10, F(S("Name")), (waypoint.name or default_name)) + formspec[n+2] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) + + return { + formspec = table.concat(formspec), + draw_inventory = not perplayer_formspec.is_lite_mode, + } + end, +}) + +ui.register_button("waypoints", { + type = "image", + image = "ui_waypoints_icon.png", + tooltip = S("Waypoints"), +}) + +local function update_hud(player, waypoints, temp, i) + local waypoint = waypoints.data[i] + if not waypoint then return end + + temp[i] = temp[i] or {} + temp = temp[i] + + local pos = waypoint.world_pos or vector.new() + local name + if waypoint.display_pos then + name = minetest.pos_to_string(pos) + if waypoint.name then + name = name..", "..waypoint.name + end + else + name = waypoint.name or S("Waypoint @1", i) + end + + -- Perform HUD updates + if temp.hud then + player:hud_remove(temp.hud) + temp.hud = nil + end + if waypoint.active then + temp.hud = player:hud_add({ + hud_elem_type = "waypoint", + number = hud_colors[waypoint.color or 1][2] , + name = name, + text = "m", + world_pos = pos + }) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then return end + + local player_name = player:get_player_name() + local update_formspec = false + local need_update_hud = false + local hit = false + + local waypoints = get_waypoint_data(player) + local temp = waypoints_temp[player_name] + for i = 1, COUNT do + local waypoint = waypoints.data[i] or {} + + if fields["select_waypoint"..i] then + hit = true + waypoints.selected = i + update_formspec = true + end + + if fields["toggle_waypoint"..i] then + hit = true + waypoint.active = not (waypoint.active) + need_update_hud = true + update_formspec = true + end + + if fields["set_waypoint"..i] then + hit = true + local pos = vector.round(player:get_pos()) + waypoint.world_pos = pos + need_update_hud = true + update_formspec = true + end + + if fields["rename_waypoint"..i] then + hit = true + temp[i] = temp[i] or {} + temp[i].edit = true + update_formspec = true + end + + if fields["toggle_display_pos"..i] then + hit = true + waypoint.display_pos = not waypoint.display_pos + need_update_hud = true + update_formspec = true + end + + if fields["toggle_color"..i] then + hit = true + local color = waypoint.color or 0 + color = color + 1 + if color > #hud_colors then + color = 1 + end + waypoint.color = color + need_update_hud = true + update_formspec = true + end + + if fields["confirm_rename"..i] then + hit = true + temp[i] = temp[i] or {} + temp[i].edit = false + waypoint.name = fields["rename_box"..i] + need_update_hud = true + update_formspec = true + end + + if fields["teleport_waypoint" .. i] and waypoint.world_pos then + if minetest.get_player_privs(player_name).teleport then + minetest.sound_play("teleport", {to_player = player_name}) + player:set_pos(waypoint.world_pos) + end + end + + if hit then + -- Save first + waypoints.data[i] = waypoint + set_waypoint_data(player, waypoints) + end + -- Update after + if need_update_hud then + update_hud(player, waypoints, temp, i) + end + if update_formspec then + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) + ui.set_inventory_formspec(player, "waypoints") + end + + if hit then return end + end +end) + +-- waypoints_temp must be initialized before the general unified_inventory +-- joinplayer callback is run for updating the inventory +table.insert(minetest.registered_on_joinplayers, 1, function(player) + local player_name = player:get_player_name() + local waypoints = get_waypoint_data(player) + + waypoints_temp[player_name] = {} + for i = 1, COUNT do + update_hud(player, waypoints, waypoints_temp[player_name], i) + end +end) + +minetest.register_on_leaveplayer(function(player) + waypoints_temp[player:get_player_name()] = nil +end) + diff --git a/mods/wielded_light/LICENSE b/mods/wielded_light/LICENSE new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/mods/wielded_light/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/mods/wielded_light/README.md b/mods/wielded_light/README.md new file mode 100644 index 00000000..59b79cba --- /dev/null +++ b/mods/wielded_light/README.md @@ -0,0 +1,24 @@ +# wielded_light mod for Minetest + +Idea taken from torches_wieldlight in https://github.com/minetest-mods/torches, but written from scratch and usable for all shining items. + +![Screenshot](https://github.com/bell07/minetest-wielded_light/raw/master/screenshot.png) + +All bright nodes with light value > 2 lighten the player environment if wielded, with value fewer by 2. (Torch 13->11 for example) + +Dependencies: none + +License: [GPL-3](https://github.com/bell07/minetest-wielded_light/blob/master/LICENSE) + + +Shining API: + +`function wielded_light.update_light(pos, light_level)` +Enable or update the shining at pos with light_level for 0.6 seconds. Can be used in any on_step call to get other entitys shining for example + + +`wielded_light.register_item_light(itemname, light_level)` +Override or set custom light level to an item. This does not change the item/node definition, just the lighting in this mod. + +`function wielded_light.update_light_by_item(stack, pos)` +Update light at pos using item shining settings -from registered item_light or from item definition diff --git a/mods/wielded_light/init.lua b/mods/wielded_light/init.lua new file mode 100644 index 00000000..f36789f6 --- /dev/null +++ b/mods/wielded_light/init.lua @@ -0,0 +1,646 @@ +local mod_name = minetest.get_current_modname() + +-- Node replacements that emit light +-- Sets of lighting_node={ node=original_node, level=light_level } +local lighting_nodes = {} + +-- The nodes that can be replaced with lighting nodes +-- Sets of original_node={ [1]=lighting_node_1, [2]=lighting_node_2, ... } +local lightable_nodes = {} + +-- Prefixes used for each node so we can avoid overlap +-- Pairs of prefix=original_node +local lighting_prefixes = {} + +-- node_name=true pairs of lightable nodes that are liquids and can flood some light sources +local lightable_liquids = {} + +-- How often will the positions of lights be recalculated +local update_interval = 0.2 + +-- How long until a previously lit node should be updated - reduces flicker +local removal_delay = update_interval * 0.5 + +-- How often will a node attempt to check itself for deletion +local cleanup_interval = update_interval * 3 + +-- How far in the future will the position be projected based on the velocity +local velocity_projection = update_interval * 1 + +-- How many light levels should an item held in the hand be reduced by, compared to the placed node +-- does not apply to manually registered light levels +local level_delta = 2 + +-- item=light_level pairs of registered wielded lights +local shiny_items = {} + +-- List of custom callbacks for each update step +local update_callbacks = {} +local update_player_callbacks = {} + +-- position={id=light_level} sets of known about light sources and their levels by position +local active_lights = {} + +--[[ Sets of entities being tracked, in the form: +entity_id = { + obj = entity, + items = { + category_id..entity_id = { + level = light_level, + item? = item_name + } + }, + update = true | false, + pos? = position_vector, + offset? = offset_vector, +} +]] +local tracked_entities = {} + +-- position=true pairs of positions that need to be recaculated this update step +local light_recalcs = {} + +--[[ + Using 2-digit hex codes for categories + Starts at 00, ends at FF + This makes it easier extract `uid` from `cat_id..uid` by slicing off 2 characters + The category ID must be of a fixed length (2 characters) +]] +local cat_id = 0 +local cat_codes = {} +local function get_light_category_id(cat) + -- If the category id does not already exist generate a new one + if not cat_codes[cat] then + if cat_id >= 256 then + error("Wielded item category limit exceeded, maximum 256 wield categories") + end + local code = string.format("%02x", cat_id) + cat_id = cat_id+1 + cat_codes[cat] = code + end + -- If the category id does exist, return it + return cat_codes[cat] +end + +-- Log an error coming from this mod +local function error_log(message, ...) + minetest.log("error", "[Wielded Light] " .. (message:format(...))) +end + +-- Is a node lightable and a liquid capable of flooding some light sources +local function is_lightable_liquid(pos) + local node = minetest.get_node_or_nil(pos) + if not node then return end + return lightable_liquids[node.name] +end + +-- Check if an entity instance still exists in the world +local function is_entity_valid(entity) + return entity and (entity.obj:is_player() or (entity.obj:get_luaentity() and entity.obj:get_luaentity().name) or false) +end + +-- Check whether a node was registered by the wield_light mod +local function is_wieldlight_node(pos_vec) + local name = string.sub(minetest.get_node(pos_vec).name, 1, #mod_name) + return name == mod_name +end + +-- Get the projected position of an entity based on its velocity, rounded to the nearest block +local function entity_pos(obj, offset) + local velocity + if (minetest.features.direct_velocity_on_players or not obj:is_player()) and obj.get_velocity then + velocity = obj:get_velocity() + else + velocity = obj:get_player_velocity() + end + + return wielded_light.get_light_position( + vector.round( + vector.add( + vector.add( + offset or { x=0, y=0, z=0 }, + obj:get_pos() + ), + vector.multiply( + velocity or { x=0, y=0, z=0 }, + velocity_projection + ) + ) + ) + ) +end + +-- Add light to active light list and mark position for update +local function add_light(pos, id, light_level) + if not active_lights[pos] then + active_lights[pos] = {} + end + if active_lights[pos][id] ~= light_level then + -- minetest.log("error", "add "..id.." "..pos.." "..tostring(light_level)) + active_lights[pos][id] = light_level + light_recalcs[pos] = true + end +end + +-- Remove light from active light list and mark position for update +local function remove_light(pos, id) + if not active_lights[pos] then return end + -- minetest.log("error", "rem "..id.." "..pos) + active_lights[pos][id] = nil + minetest.after(removal_delay, function () + light_recalcs[pos] = true + end) +end + +-- Track an entity's position and update its light, will be called on every update step +local function update_entity(entity) + local pos = entity_pos(entity.obj, entity.offset) + local pos_str = pos and minetest.pos_to_string(pos) + + -- If the position has changed, remove the old light and mark the entity for update + if entity.pos and pos_str ~= entity.pos then + entity.update = true + for id,_ in pairs(entity.items) do + remove_light(entity.pos, id) + end + end + + -- Update the recorded position + entity.pos = pos_str + + -- If the position is still loaded, pump the timer up so it doesn't get removed + if pos then + -- If the entity is marked for an update, add the light in the position if it emits light + if entity.update then + for id, item in pairs(entity.items) do + if item.level > 0 and not (item.floodable and is_lightable_liquid(pos)) then + add_light(pos_str, id, item.level) + else + remove_light(pos_str, id) + end + end + end + end + if active_lights[pos_str] then + if is_wieldlight_node(pos) then + minetest.get_node_timer(pos):start(cleanup_interval) + end + end + entity.update = false +end + + +-- Save the original nodes timer if it has one +local function save_timer(pos_vec) + local timer = minetest.get_node_timer(pos_vec) + if timer:is_started() then + local meta = minetest.get_meta(pos_vec) + meta:set_float("saved_timer_timeout", timer:get_timeout()) + meta:set_float("saved_timer_elapsed", timer:get_elapsed()) + end +end + +-- Restore the original nodes timer if it had one +local function restore_timer(pos_vec) + local meta = minetest.get_meta(pos_vec) + local timeout = meta:get_float("saved_timer_timeout") + if timeout > 0 then + local elapsed = meta:get_float("saved_timer_elapsed") + local timer = minetest.get_node_timer(pos_vec) + timer:set(timeout, elapsed) + meta:set_string("saved_timer_timeout","") + meta:set_string("saved_timer_elapsed","") + end +end + +-- Replace a lighting node with its original counterpart +local function reset_lighting_node(pos) + local existing_node = minetest.get_node(pos) + local lighting_node = wielded_light.get_lighting_node(existing_node.name) + if not lighting_node then + return + end + minetest.swap_node(pos, { name = lighting_node.node,param2 = existing_node.param2 }) + restore_timer(pos) +end + +-- Will be run once the node timer expires +local function cleanup_timer_callback(pos, elapsed) + local pos_str = minetest.pos_to_string(pos) + local lights = active_lights[pos_str] + -- If no active lights for this position, remove itself + if not lights then + reset_lighting_node(pos) + else + -- Clean up any tracked entities for this position that no longer exist + for id,_ in pairs(lights) do + local uid = string.sub(id,3) + local entity = tracked_entities[uid] + if not is_entity_valid(entity) then + remove_light(pos_str, id) + end + end + minetest.get_node_timer(pos):start(cleanup_interval) + end +end + + +-- Recalculate the total light level for a given position and update the light level there +local function recalc_light(pos) + -- If not in active lights list we can't do anything + if not active_lights[pos] then return end + + -- Calculate the light level of the node + local any_light = false + local max_light = 0 + for id, light_level in pairs(active_lights[pos]) do + any_light = true + if light_level > max_light then + max_light = light_level + end + end + + -- Convert the position back to a vector + local pos_vec = minetest.string_to_pos(pos) + + -- If no items in this position, delete it from the list and remove any light node + if not any_light then + active_lights[pos] = nil + reset_lighting_node(pos_vec) + return + end + + -- If no light in this position remove any light node + if max_light == 0 then + reset_lighting_node(pos_vec) + return + end + + -- Limit the light level + max_light = math.min(max_light, minetest.LIGHT_MAX) + + -- Get the current light level in this position + local existing_node = minetest.get_node(pos_vec) + local name = existing_node.name + local old_value = wielded_light.level_of_lighting_node(name) or 0 + + -- If the light level has changed, set the coresponding light node and initiate the cleanup timer + if old_value ~= max_light then + local node_name + if lightable_nodes[name] then + node_name = name + elseif lighting_nodes[name] then + node_name = lighting_nodes[name].node + end + if node_name then + if not is_wieldlight_node(pos_vec) then + save_timer(pos_vec) + end + + minetest.swap_node(pos_vec, { + name = lightable_nodes[node_name][max_light], + param2 = existing_node.param2 + }) + minetest.get_node_timer(pos_vec):start(cleanup_interval) + else + active_lights[pos] = nil + end + end +end + +local timer = 0 +-- Will be run on every global step +local function global_timer_callback(dtime) + -- Only run once per update interval, global step will be called much more often than that + timer = timer + dtime; + if timer < update_interval then + return + end + timer = 0 + + -- Run all custom player callbacks for each player + local connected_players = minetest.get_connected_players() + for _,callback in pairs(update_player_callbacks) do + for _, player in pairs(connected_players) do + callback(player) + end + end + + -- Run all custom callbacks + for _,callback in pairs(update_callbacks) do + callback() + end + + -- Look at each tracked entity and update its position + for uid, entity in pairs(tracked_entities) do + if is_entity_valid(entity) then + update_entity(entity) + else + -- If the entity no longer exists, stop tracking it + tracked_entities[uid] = nil + end + end + + -- Recalculate light levels + for pos,_ in pairs(light_recalcs) do + recalc_light(pos) + end + light_recalcs = {} +end + +--- Shining API --- +wielded_light = {} + +-- Registers a callback to be called every time the update interval is passed +function wielded_light.register_lightstep(callback) + table.insert(update_callbacks, callback) +end + +-- Registers a callback to be called for each player every time the update interval is passed +function wielded_light.register_player_lightstep(callback) + table.insert(update_player_callbacks, callback) +end + +-- Returns the node name for a given light level +function wielded_light.lighting_node_of_level(light_level, prefix) + return mod_name..":"..(prefix or "")..light_level +end + +-- Gets the light level for a given node name, inverse of lighting_node_of_level +function wielded_light.level_of_lighting_node(node_name) + local lighting_node = wielded_light.get_lighting_node(node_name) + if lighting_node then + return lighting_node.level + end +end + +-- Check if a node name is one of the wielded light nodes +function wielded_light.get_lighting_node(node_name) + return lighting_nodes[node_name] +end + +-- Register any node as lightable, register all light level variations for it +function wielded_light.register_lightable_node(node_name, property_overrides, custom_prefix) + -- Node name must be string + if type(node_name) ~= "string" then + error_log("You must provide a node name to be registered as lightable, '%s' given.", type(node_name)) + return + end + + -- Node must already be registered + local original_definition = minetest.registered_nodes[node_name] + if not original_definition then + error_log("The node '%s' cannot be registered as lightable because it does not exist.", node_name) + return + end + + -- Decide the prefix for the lighting node + local prefix = custom_prefix or node_name:gsub(":", "_", 1, true) .. "_" + if lighting_prefixes[prefix] then + error_log("The lighting prefix '%s' cannot be used for '%s' as it is already used for '%s'.", prefix, node_name, lighting_prefixes[prefix]) + return + end + lighting_prefixes[prefix] = node_name + + -- Default for property overrides + if not property_overrides then property_overrides = {} end + + -- Copy the node definition and provide required settings for a lighting node + local new_definition = table.copy(original_definition) + new_definition.on_timer = cleanup_timer_callback + new_definition.paramtype = "light" + new_definition.mod_origin = mod_name + new_definition.groups = new_definition.groups or {} + new_definition.groups.not_in_creative_inventory = 1 + -- Make sure original node is dropped if a lit node is dug + if not new_definition.drop then + new_definition.drop = node_name + end + + -- Allow any properties to be overridden on registration + for prop, val in pairs(property_overrides) do + new_definition[prop] = val + end + + -- If it's a liquid, we need to stop it flowing + if new_definition.groups.liquid then + new_definition.liquid_range = 0 + lightable_liquids[node_name] = true + end + + -- Register the lighting nodes + lightable_nodes[node_name] = {} + for i=1, minetest.LIGHT_MAX do + local lighting_node_name = wielded_light.lighting_node_of_level(i, prefix) + + -- Index for quick finding later + lightable_nodes[node_name][i] = lighting_node_name + lighting_nodes[lighting_node_name] = { + node = node_name, + level = i + } + + -- Copy the base definition and apply the light level + local level_definition = table.copy(new_definition) + level_definition.light_source = i + + -- If it's a liquid, we need to stop it replacing itself with the original + if level_definition.groups.liquid then + level_definition.liquid_alternative_source = lighting_node_name + level_definition.liquid_alternative_flowing = lighting_node_name + end + + minetest.register_node(":"..lighting_node_name, level_definition) + end +end + +-- Check if node can have a wielded light node placed in it +function wielded_light.is_lightable_node(node_pos) + local name = minetest.get_node(node_pos).name + if lightable_nodes[name] then + return true + elseif wielded_light.get_lighting_node(name) then + return true + end + return false +end + +-- Gets the closest position to pos that's a lightable node +function wielded_light.get_light_position(pos) + local around_vector = { + {x=0, y=0, z=0}, + {x=0, y=1, z=0}, {x=0, y=-1, z=0}, + {x=1, y=0, z=0}, {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, {x=0, y=0, z=-1}, + } + for _, around in ipairs(around_vector) do + local light_pos = vector.add(pos, around) + if wielded_light.is_lightable_node(light_pos) then + return light_pos + end + end +end + +-- Gets the emitted light level of a given item name +function wielded_light.get_light_def(item_name) + -- Invalid item? No light + if not item_name or item_name == "" then + return 0, false + end + + -- If the item is cached return the cached level + local cached_definition = shiny_items[item_name] + if cached_definition then + return cached_definition.level, cached_definition.floodable + end + + -- Get the item definition + local stack = ItemStack(item_name) + local itemdef = stack:get_definition() + + -- If invalid, no light + if not itemdef then + return 0, false + end + + -- Get the light level of an item from its definition + -- Reduce the light level by level_delta - original functionality + -- Limit between 0 and the max light level + return math.min(math.max((itemdef.light_source or 0) - level_delta, 0), minetest.LIGHT_MAX), itemdef.floodable +end + +-- Register an item as shining +function wielded_light.register_item_light(item_name, light_level, floodable) + if shiny_items[item_name] then + if light_level then + shiny_items[item_name].level = light_level + end + if floodable ~= nil then + shiny_items[item_name].floodable = floodable + end + else + if floodable == nil then + local stack = ItemStack(item_name) + local itemdef = stack:get_definition() + floodable = itemdef.floodable + end + shiny_items[item_name] = { + level = light_level, + floodable = floodable or false + } + end +end + +-- Mark an item as floodable or not +function wielded_light.register_item_floodable(item_name, floodable) + if floodable == nil then floodable = true end + if shiny_items[item_name] then + shiny_items[item_name].floodable = floodable + else + local calced_level = wielded_light.get_light_def(item_name) + shiny_items[item_name] = { + level = calced_level, + floodable = floodable + } + end +end + +-- Keep track of an item entity. Should be called once for an item +function wielded_light.track_item_entity(obj, cat, item) + if not is_entity_valid({ obj=obj }) then return end + + local light_level, light_is_floodable = wielded_light.get_light_def(item) + -- If the item does not emit light do not track it + if light_level <= 0 then return end + + -- Generate the uid for the item and the id for the light category + local uid = tostring(obj) + local id = get_light_category_id(cat)..uid + + -- Create the main tracking object for this item instance if it does not already exist + if not tracked_entities[uid] then + tracked_entities[uid] = { obj=obj, items={}, update = true } + end + + -- Create the item tracking object for this item + category + tracked_entities[uid].items[id] = { level=light_level, floodable=light_is_floodable } + + -- Add the light in on creation so it's immediate + local pos = entity_pos(obj) + local pos_str = pos and minetest.pos_to_string(pos) + if pos_str then + if not (light_is_floodable and is_lightable_liquid(pos)) then + add_light(pos_str, id, light_level) + end + end + tracked_entities[uid].pos = pos_str +end + +-- A player's light should appear near their head not their feet +local player_height_offset = { x=0, y=1, z=0 } + +-- Keep track of a user / player entity. Should be called as often as the user updates +function wielded_light.track_user_entity(obj, cat, item) + -- Generate the uid for the player and the id for the light category + local uid = tostring(obj) + local id = get_light_category_id(cat)..uid + + -- Create the main tracking object for this player instance if it does not already exist + if not tracked_entities[uid] then + tracked_entities[uid] = { obj=obj, items={}, offset = player_height_offset, update = true } + end + + local tracked_entity = tracked_entities[uid] + local tracked_item = tracked_entity.items[id] + + -- If the item being tracked for the player changes, update the item tracking object for this item + category + if not tracked_item or tracked_item.item ~= item then + local light_level, light_is_floodable = wielded_light.get_light_def(item) + tracked_entity.items[id] = { level=light_level, item=item, floodable=light_is_floodable } + tracked_entity.update = true + end +end + + +-- Setup -- + +-- Wielded item shining globalstep +minetest.register_globalstep(global_timer_callback) + +-- Dropped item on_step override +-- https://github.com/minetest/minetest/issues/6909 +local builtin_item = minetest.registered_entities["__builtin:item"] +local item = { + on_step = function(self, dtime, ...) + builtin_item.on_step(self, dtime, ...) + -- Register an item once for tracking + -- If it's already being tracked, exit + if self.wielded_light then return end + self.wielded_light = true + local stack = ItemStack(self.itemstring) + local item_name = stack:get_name() + wielded_light.track_item_entity(self.object, "item", item_name) + end +} +setmetatable(item, {__index = builtin_item}) +minetest.register_entity(":__builtin:item", item) + +-- Track a player's wielded item +wielded_light.register_player_lightstep(function (player) + wielded_light.track_user_entity(player, "wield", player:get_wielded_item():get_name()) +end) + +-- Register helper nodes +wielded_light.register_lightable_node("air", nil, "") + +if minetest.get_modpath("default") then + wielded_light.register_lightable_node("default:water_source", nil, "water_") + wielded_light.register_lightable_node("default:river_water_source", nil, "river_water_") +elseif minetest.get_modpath("hades_core") then + wielded_light.register_lightable_node("hades_core:water_source", nil, "water_") +else + error_log("Not running in a supported game, lightable water disabled") +end + +---TEST +--wielded_light.register_item_light('default:dirt', 14) diff --git a/mods/wielded_light/mod.conf b/mods/wielded_light/mod.conf new file mode 100644 index 00000000..855b69d7 --- /dev/null +++ b/mods/wielded_light/mod.conf @@ -0,0 +1,2 @@ +name = wielded_light +optional_depends = default, hades_core, builtin_item diff --git a/mods/worldgate/API.md b/mods/worldgate/API.md new file mode 100644 index 00000000..d15a270d --- /dev/null +++ b/mods/worldgate/API.md @@ -0,0 +1,92 @@ +API +--- + +All of the API functions for Worldgate are defined in the `worldgate` global variable. + +### `worldgate.add_gate(def)` + +This function adds a worldgate to the world. This is useful for adding your own custom worldgates to the world. The `def` parameter must be a table with the following fields: + +```lua +{ + -- position: The x/y/z location where the worldgate will be generated. This + -- value must be a vector created with vector.new. + position = vector.new(...), + + -- base: A schematic specifier that identifies a 'base' schematic that forms + -- the base, or bottom half, of the worldgate which typically contains a + -- Telemosaic beacon and range extender marker nodes. + base = worldgate.get_random_base(pcgr), + + -- decor: A schematic specifier that identifies a 'decor' schematic that forms + -- a decoration placed on the worldgate base. This is typically some form of + -- housing or adornment for the worldgate. + decor = worldgate.get_random_decor(pcgr), + + -- quality: Determines the quality of range extenders that generate as part + -- of this worldgate. It must be an integer with a value of -1, 0, or 1 which + -- corresponds to lower quality, equal quality, or better quality extenders, + -- respectively. + quality = worldgate.get_random_quality(pcgr), + + -- exact: A boolean value that specifies if the worldgate should be placed at + -- the exact position specified. If true, the worldgate will be placed at the + -- point specified by the position parameter regardless of surrounding + -- terrain. If false, the mod will attempt to place the worldgate according to + -- the available terrain which favors the heightmap first, below air second, + -- then any random position in the mapchunk if all else fails. + exact = false, + + -- destination: A vector that matches the position of another worldgate that + -- this worldgate will be linked to automatically. If this value is nil, then + -- the gate's beacon will be deactivated and it will have no destination. + destination = nil, +} +``` + +### `worldgate.get_random_base(pcgr)` + +This function returns a path to a random schematic file in the `worldgate/schematics/base/` directory that corresponds to a worldgate base. Every built-in base schematic will contain a single beacon and extender marker nodes. The optional argument is a PcgRandom object that can be used to choose the random base schematic. + +### `worldgate.get_random_decor(pcgr)` + +This function returns a path to a random schematic file in the `worldgate/schematics/decor/` directory that corresponds to a worldgate decoration. Decorations typically provide some form of housing or adornment surrounding the worldgate's Telemosaic beacon. A decoration schematic is not necessary for a worldgate to function, but decor does look pretty nice! + +The optional argument is a PcgRandom object that can be used to choose the random decor schematic. + +### `worldgate.get_random_quality(pcgr)` + +This function returns a random value of either -1, 0, or 1, values which correspond to the quality values of a worldgate. This is useful for creating gates with a random quality. The optional argument is a PcgRandom object that can be used to choose the random value. + +### `worldgate.get_gates_for_mapblock(position)` + +This function returns a list of all gates that should be generated for the mapblock of the given vector location. The `position` parameter must be a vector created with `vector.new`. + +### `worldgate.reigster_on_worldgate_generated(fn)` + +This function registers a callback function that will be called when a worldgate is successfully generated in the world. The function is called with three parameters: + +- `location`: A vector representing the point at which the worldgate was actually placed in the world +- `gate`: The definition of the generated worldgate as specified for `worldgate.add_gate(def)` +- `strategy`: A string that specifies the placement algorithm that the mapgen function used to place the worldgate, in order of mapgen preference: + - `"exact"`: The location is the worldgate's `position` value specified with `exact = true` + - `"heightmap"`: A suitable location was found matching the heightmap for the worldgate's mapchunk + - `"grounded"`: A suitable location was found by probing downwards from a random air node + - `"random"`: A location was selected at random with no regards for the surrounding terrain + +### `worldgate.register_on_worldgate_failed(fn)` + +This function registers a callback function that will be called when a worldgate tries but fails to generate. This is most likely to happen if mod settings prevent worldgates from spawning in midair or underwater and such a position is selected via the `random` placement strategy during mapgen. A gate that fails to generate in this manner will not attempt to be generated again. + +The callback function is called with just one parameter + +- `gate`: The gate definition of the worldgate that failed to generate as specified for `worldgate.add_gate(def)` + +Dark and Dangerous API +---------------------- + +**WARNING: ACCESSING THESE FUNCTIONS/VARIABLES CAN CAUSE UNPREDICTABLE LOSS/DAMAGE TO YOUR WORLD; DO NOT USE UNLESS YOU KNOW WHAT YOU ARE DOING** + +### `worldgate.add_gate_unsafe(def)` + +This function fills the same role as `worldgate.add_gate(def)`, but it doesn't perform any validation checks to ensure that the gate is valid. This function is used internally during native gate generation for faster performance. Use only if you're sure that your gate definitions do not require validation. \ No newline at end of file diff --git a/mods/worldgate/LICENSE b/mods/worldgate/LICENSE new file mode 100644 index 00000000..d63c1558 --- /dev/null +++ b/mods/worldgate/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright © 2023 EmptyStar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mods/worldgate/README.md b/mods/worldgate/README.md new file mode 100644 index 00000000..6e9ee586 --- /dev/null +++ b/mods/worldgate/README.md @@ -0,0 +1,24 @@ +Worldgate +========= + +Discover the Worldgates, an ancient teleportation network that can carry you to distant lands in an instant. Despite their long abandonment, the Worldgates are still highly functional. They can be found throughout the world, some more intact than others, and each adorned in stone by the elder hands that wrought them. + +Gates found at the surface of the world are linked randomly to neighboring gates, and gates found at elevations above and below ground are linked to gates on the surface. To use a Worldgate, right-click its active teleportation beacon. But understand the danger of teleporting through a random gate as it may take you very far from your starting point with no way back! + +The gates can be linked to any gate through use of mese crystal fragments, and additional teleportation beacons can be crafted. To learn more, see [the Telemosaic mod](https://content.minetest.net/packages/mt-mods/telemosaic/) which is the teleportation technology that underpins the Worldgates. + +For the truly brave of heart who wish to fundamentally alter their Worldgate experience, see the mod settings and [the API documentation](https://github.com/EmptyStar/worldgate/blob/main/API.md). + +Notes +----- + +- Worldgates will only generate in parts of the world that have not yet been explored. +- By default, Worldgates will generate roughly every 1000 nodes between (0,0,0) and 29000 nodes in every direction for a possible total of 195112 Worldgates per world (although many will not generate if midair spawning is disabled which it is by default); this can be configured via mod settings. + +Caveats +------- + +- When you first approach a newly discovered Worldgate, it may take a few seconds to become fully active. +- Teleportation has a five-second cooldown to prevent spamming and to give new Worldgates a little extra time to configure themselves. +- Rarely, a Worldgate may fail to link to a neighboring Worldgate, thus leaving you stranded at your destination. +- Rarely, depending on the terrain, a Worldgate can fail to generate. \ No newline at end of file diff --git a/mods/worldgate/init.lua b/mods/worldgate/init.lua new file mode 100644 index 00000000..ea8fd03e --- /dev/null +++ b/mods/worldgate/init.lua @@ -0,0 +1,46 @@ +-- +-- Globals +-- + +worldgate = { + modpath = minetest.get_modpath("worldgate"), + gates = {}, + hash_index = {}, + forceload_index = {}, + settings = { + mapgen = minetest.settings:get_bool("worldgate.mapgen",true), + native = minetest.settings:get_bool("worldgate.native",true), + native_link = minetest.settings:get_bool("worldgate.native.link",true), + native_spread = tonumber(minetest.settings:get("worldgate.native.spread",1000) or 1000), + native_xzjitter = tonumber(minetest.settings:get("worldgate.native.xzjitter",12.5) or 12.5), + ymin = tonumber(minetest.settings:get("worldgate.ymin",-29900) or -29900), + ymax = tonumber(minetest.settings:get("worldgate.ymax",29900) or 29900), + underwaterspawn = minetest.settings:get_bool("worldgate.underwaterspawn",false), + midairspawn = minetest.settings:get_bool("worldgate.midairspawn",false), + breakage = tonumber(minetest.settings:get("worldgate.breakage",8) or 8), + superextenders = minetest.settings:get_bool("worldgate.superextenders",true), + beaconglow = minetest.settings:get_bool("worldgate.beaconglow",true), + destroykeys = minetest.settings:get_bool("worldgate.destroykeys",true), + }, +} + +-- Disable mapgen via Asuna settings if set +if minetest.get_modpath("asuna_core") then + worldgate.settings.mapgen = minetest.settings:get_bool("asuna.content.wayfarer.worldgate",true) +end + +-- +-- Modules +-- + +local function load(file) + dofile(worldgate.modpath .. "/src/" .. file .. ".lua") +end + +load("nodes") +load("functions") +load("gates") +load("mapgen") +load("logging") +load("settings_overrides") +load("link") \ No newline at end of file diff --git a/mods/worldgate/mod.conf b/mods/worldgate/mod.conf new file mode 100644 index 00000000..6634a732 --- /dev/null +++ b/mods/worldgate/mod.conf @@ -0,0 +1,4 @@ +name = worldgate +title = Worldgate +author = EmptyStar +depends = telemosaic, default, stairs \ No newline at end of file diff --git a/mods/worldgate/schematics/base/worldgate_base_basic.mts b/mods/worldgate/schematics/base/worldgate_base_basic.mts new file mode 100644 index 00000000..8c86acd7 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_basic.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_basic_better.mts b/mods/worldgate/schematics/base/worldgate_base_basic_better.mts new file mode 100644 index 00000000..a678e3c3 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_basic_better.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_basic_crumbled.mts b/mods/worldgate/schematics/base/worldgate_base_basic_crumbled.mts new file mode 100644 index 00000000..6564f5b5 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_basic_crumbled.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_flower.mts b/mods/worldgate/schematics/base/worldgate_base_flower.mts new file mode 100644 index 00000000..3a99e7bb Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_flower.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_fountain.mts b/mods/worldgate/schematics/base/worldgate_base_fountain.mts new file mode 100644 index 00000000..2d5fe838 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_fountain.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_lava.mts b/mods/worldgate/schematics/base/worldgate_base_lava.mts new file mode 100644 index 00000000..8b3397b5 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_lava.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_smiling.mts b/mods/worldgate/schematics/base/worldgate_base_smiling.mts new file mode 100644 index 00000000..c320f690 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_smiling.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_smiling_better.mts b/mods/worldgate/schematics/base/worldgate_base_smiling_better.mts new file mode 100644 index 00000000..20ebd07e Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_smiling_better.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_strong.mts b/mods/worldgate/schematics/base/worldgate_base_strong.mts new file mode 100644 index 00000000..1c9e8cf0 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_strong.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_strong_better.mts b/mods/worldgate/schematics/base/worldgate_base_strong_better.mts new file mode 100644 index 00000000..3b09600d Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_strong_better.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_wide.mts b/mods/worldgate/schematics/base/worldgate_base_wide.mts new file mode 100644 index 00000000..f1bd60a5 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_wide.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_wide_better.mts b/mods/worldgate/schematics/base/worldgate_base_wide_better.mts new file mode 100644 index 00000000..cd5ff11c Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_wide_better.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_ziggurat.mts b/mods/worldgate/schematics/base/worldgate_base_ziggurat.mts new file mode 100644 index 00000000..ece6bf4b Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_ziggurat.mts differ diff --git a/mods/worldgate/schematics/base/worldgate_base_ziggurat_better.mts b/mods/worldgate/schematics/base/worldgate_base_ziggurat_better.mts new file mode 100644 index 00000000..94fa55a9 Binary files /dev/null and b/mods/worldgate/schematics/base/worldgate_base_ziggurat_better.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_arches.mts b/mods/worldgate/schematics/decor/worldgate_decor_arches.mts new file mode 100644 index 00000000..766d4c34 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_arches.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_basic.mts b/mods/worldgate/schematics/decor/worldgate_decor_basic.mts new file mode 100644 index 00000000..784b8528 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_basic.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_basic_crumbled.mts b/mods/worldgate/schematics/decor/worldgate_decor_basic_crumbled.mts new file mode 100644 index 00000000..0bdea12a Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_basic_crumbled.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_basic_super.mts b/mods/worldgate/schematics/decor/worldgate_decor_basic_super.mts new file mode 100644 index 00000000..bb16c56a Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_basic_super.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_collapsed.mts b/mods/worldgate/schematics/decor/worldgate_decor_collapsed.mts new file mode 100644 index 00000000..72aacb1a Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_collapsed.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_cube.mts b/mods/worldgate/schematics/decor/worldgate_decor_cube.mts new file mode 100644 index 00000000..049c5e06 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_cube.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_fortress.mts b/mods/worldgate/schematics/decor/worldgate_decor_fortress.mts new file mode 100644 index 00000000..9d6b201b Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_fortress.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_mini_pillars.mts b/mods/worldgate/schematics/decor/worldgate_decor_mini_pillars.mts new file mode 100644 index 00000000..862e23b1 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_mini_pillars.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_minimal.mts b/mods/worldgate/schematics/decor/worldgate_decor_minimal.mts new file mode 100644 index 00000000..83d7458e Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_minimal.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_none.mts b/mods/worldgate/schematics/decor/worldgate_decor_none.mts new file mode 100644 index 00000000..5de0a5ba Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_none.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_pagoda.mts b/mods/worldgate/schematics/decor/worldgate_decor_pagoda.mts new file mode 100644 index 00000000..8dfd6e77 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_pagoda.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_pillars.mts b/mods/worldgate/schematics/decor/worldgate_decor_pillars.mts new file mode 100644 index 00000000..51160aef Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_pillars.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_stargate.mts b/mods/worldgate/schematics/decor/worldgate_decor_stargate.mts new file mode 100644 index 00000000..ee24f66c Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_stargate.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_supertotem.mts b/mods/worldgate/schematics/decor/worldgate_decor_supertotem.mts new file mode 100644 index 00000000..24500190 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_supertotem.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_totems.mts b/mods/worldgate/schematics/decor/worldgate_decor_totems.mts new file mode 100644 index 00000000..1ead04d5 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_totems.mts differ diff --git a/mods/worldgate/schematics/decor/worldgate_decor_ziggurat.mts b/mods/worldgate/schematics/decor/worldgate_decor_ziggurat.mts new file mode 100644 index 00000000..0ead3373 Binary files /dev/null and b/mods/worldgate/schematics/decor/worldgate_decor_ziggurat.mts differ diff --git a/mods/worldgate/schematics/worldgate_airspace.mts b/mods/worldgate/schematics/worldgate_airspace.mts new file mode 100644 index 00000000..f29a4dcc Binary files /dev/null and b/mods/worldgate/schematics/worldgate_airspace.mts differ diff --git a/mods/worldgate/schematics/worldgate_platform.mts b/mods/worldgate/schematics/worldgate_platform.mts new file mode 100644 index 00000000..68319c74 Binary files /dev/null and b/mods/worldgate/schematics/worldgate_platform.mts differ diff --git a/mods/worldgate/settingtypes.txt b/mods/worldgate/settingtypes.txt new file mode 100644 index 00000000..d0d15e1d --- /dev/null +++ b/mods/worldgate/settingtypes.txt @@ -0,0 +1,38 @@ +# Enable mapgen? Unset this to prevent all worldgates from generating. +worldgate.mapgen (Enable mapgen?) bool true + +# Generate native worldgates? Native worldgates are the built-in worldgates that this mod provides by default. +worldgate.native (Generate native worldgates?) bool true + +# Link native worldgates? This links surface worldgates to a random neighbor and underground/aerial worldgates to worldgates on the surface. +worldgate.native.link (Link native worldgates?) bool true + +# Average number of nodes between native worldgates. +worldgate.native.spread (Distance between native worldgates) int 1000 500 25000 + +# The percentage of spread by which to randomly offset the x/z coordinates of native worldgates. A higher jitter randomly moves the gates further from their generated positions, thereby making their locations less predictable. +worldgate.native.xzjitter (Native worldgate x/z jitter) float 12.5 0 25 + +# The maximum y position of any worldgate. Any worldgates above this elevation will not generate. +worldgate.ymax (Worldgate maximum y position) int 29900 0 29900 + +# The minimum y position of any worldgate. Any worldgates below this elevation will not generate. +worldgate.ymin (Worldgate minimum y position) int -29900 -29900 0 + +# Generate worldgates underwater? If set, worldgates can spawn on the ocean floor; if unset, worldgates will spawn on the water's surface. +worldgate.underwaterspawn (Generate worldgates underwater?) bool false + +# Generate worldgates in midair? If set, worldgates can be floating on their own in the air; if unset, gates that attempt to generate in the air will fail to generate. +worldgate.midairspawn (Generate worldgates in midair?) bool false + +# Percentage chance of a Telemosaic extender structure node being broken when a gate generates. This causes extenders to be replaced with cobblestone. +worldgate.breakage (Percent chance of an extender being broken) int 8 0 100 + +# Increase extender range? This supersedes the Telemosaic configuration values for extender ranges. If you wish to use the Telemosaic settings instead, unset this configuration option and change the Telemosaic settings accordingly. +worldgate.superextenders (Increase extender range?) bool true + +# Glowing Telemosaic beacons? +worldgate.beaconglow (Glowing Telemosaic beacons?) bool true + +# Consume Mese Crystal Fragments after converting to a Telemosaic key? By default, Telemosaic keys are converted back to crystal fragments after use. +worldgate.destroykeys (Consume Telemosaic keys?) bool true \ No newline at end of file diff --git a/mods/worldgate/src/functions.lua b/mods/worldgate/src/functions.lua new file mode 100644 index 00000000..b43fc80e --- /dev/null +++ b/mods/worldgate/src/functions.lua @@ -0,0 +1,122 @@ +-- +-- Worldgate functions +-- + +-- Function for selecting a random base schematic +local base_schematics = (function() + local schems = {} + for _,schematic in ipairs(minetest.get_dir_list(worldgate.modpath .. "/schematics/base/",false)) do + table.insert(schems,worldgate.modpath .. "/schematics/base/" .. schematic) + end + return schems +end)() +local base_count = #base_schematics +worldgate.schematics = {} +worldgate.schematics.base = base_schematics + +function worldgate.get_random_base(pcgr) + return base_schematics[pcgr and pcgr:next(1,base_count) or math.random(1,base_count)] +end + +-- Function for selecting a random decor schematic +local decor_schematics = (function() + local schems = {} + for _,schematic in ipairs(minetest.get_dir_list(worldgate.modpath .. "/schematics/decor/",false)) do + table.insert(schems,worldgate.modpath .. "/schematics/decor/" .. schematic) + end + return schems +end)() +local decor_count = #decor_schematics +worldgate.schematics.decor = decor_schematics + +function worldgate.get_random_decor(pcgr) + return decor_schematics[pcgr and pcgr:next(1,decor_count) or math.random(1,decor_count)] +end + +-- Function for selecting a random quality value +function worldgate.get_random_quality(pcgr) + return pcgr and pcgr:next(-1,1) or math.random(-1,1) +end + +-- Function for adding new worldgates without data checks +function worldgate.add_gate_unsafe(def) + -- Add gate to list of gates + local ngates = #worldgate.gates + worldgate.gates[ngates + 1] = def + + -- Index the gate via mapblock hashing + local hash = minetest.hash_node_position(def.position:divide(16):floor()) + local gates = worldgate.hash_index[hash] or {} + gates[#gates + 1] = ngates + 1 + worldgate.hash_index[hash] = gates +end + +-- Function for adding new worldgates +local ymin = math.max(-29900,worldgate.settings.ymin) +local ymax = math.min(29900,worldgate.settings.ymax) +function worldgate.add_gate(def) + -- Position must be a valid vector + if not def.position then + error("Attempted to add a worldgate without a position") + elseif not vector.check(def.position) then + error("Worldgate position must be a vector created with vector.new") + elseif def.position.y > ymax or def.position.y < ymin then + error("Worldgate position " .. minetest.pos_to_string(def.position) .. " is beyond ymin/ymax values") + end + + if not def.base then + def.base = worldgate.get_random_base() + elseif type(def.base) ~= "string" then + error("Worldgate base must be a string that identifies a schematic") + end + + if not def.decor then + def.decor = worldgate.get_random_decor() + elseif type(def.decor) ~= "string" then + error("Worldgate decor must be a string that identifies a schematic") + end + + if not def.quality then + def.quality = worldgate.get_random_quality() + elseif not (def.quality == -1 or def.quality == 0 or def.quality == 1) then + error("Worldgate quality must be an integer between -1 and 1 inclusive") + end + + if def.exact == nil then + def.exact = false + else + def.exact = not not def.exact -- boolean cast + end + + -- Add gate via unsafe function + worldgate.add_gate_unsafe(def) +end + +-- Function for checking a mapblock against the gate hash index +function worldgate.get_gates_for_mapblock(pos) + local gates = worldgate.hash_index[minetest.hash_node_position(pos:divide(16):floor())] or {} + for i = 0, #gates do + gates[i] = worldgate.gates[gates[i]] + end + return gates +end + +-- Function for finding a suitable placement for a worldgate within a given area +function worldgate.find_worldgate_location_in_area(minp,maxp) +end + +-- Function for spawning a worldgate +function worldgate.generate_gate(pos) +end + +-- Function for gate generation callbacks +worldgate.worldgate_generated_callbacks = {} +function worldgate.reigster_on_worldgate_generated(fn) + table.insert(worldgate.worldgate_generated_callbacks,fn) +end + +-- Function for failed gate generation callbacks +worldgate.worldgate_failed_callbacks = {} +function worldgate.reigster_on_worldgate_failed(fn) + table.insert(worldgate.worldgate_failed_callbacks,fn) +end \ No newline at end of file diff --git a/mods/worldgate/src/gates.lua b/mods/worldgate/src/gates.lua new file mode 100644 index 00000000..9c30dfa0 --- /dev/null +++ b/mods/worldgate/src/gates.lua @@ -0,0 +1,123 @@ +-- +-- Native worldgate generation +-- + +-- Generate gates if the mod is configured to do so +if worldgate.settings.native then + -- Define rng based on the world seed + local pcgr = PcgRandom(minetest.get_mapgen_setting("seed")) + + -- Get distance between gates (spread) + local spread = worldgate.settings.native_spread + + -- Do not generate gates beyond totalmax to prevent any wierdness with world + -- boundaries + local totalmax = 29900 + + -- Get minimum and maximum y values + local ymin = math.max(-totalmax,worldgate.settings.ymin) + local ymax = math.min(totalmax,worldgate.settings.ymax) + + -- Cache frequently used global functions for better performance + local add_gate = worldgate.add_gate_unsafe -- native gates are made with respect to checks + local get_random_base = worldgate.get_random_base + local get_random_decor = worldgate.get_random_decor + local get_random_quality = worldgate.get_random_quality + local vn = vector.new + + -- Align coordinate values with 0 for more centered/grounded generation + local alignment_offset = totalmax - spread * math.floor(totalmax / spread) + local ymin_offset = -ymin - spread * math.floor(-ymin / spread) + local ymax_offset = ymax - spread * math.floor(ymax / spread) + local min = -totalmax + alignment_offset + local max = totalmax - alignment_offset + ymin = ymin + ymin_offset + ymax = ymax - ymax_offset + + -- Generate x/z values with jitter so that worldgate locations are less + -- predictable + local xzjitterp = math.floor(spread * worldgate.settings.native_xzjitter / 100) + local xzjittern = -xzjitterp + + -- Function to get a gate based on an x/y/z coordinate + local function generate_gate(x,y,z) + return { + position = vn(x + pcgr:next(xzjittern,xzjitterp),y + pcgr:next(0,24),z + pcgr:next(xzjittern,xzjitterp)), + base = get_random_base(pcgr), + decor = get_random_decor(pcgr), + quality = get_random_quality(pcgr), + exact = false, + } + end + + -- Probability table for gate quality bias in favor of average and above + -- average quality values (20% poor, 50% average, 30% above average) + local quality_bias = {-1,-1,0,0,0,0,0,1,1,1} + + -- Link gates if configured, else generate gates with no destinations + if worldgate.settings.native_link then + -- Generate x/z gate definitions for y = 0 since these are the destination + -- gates of all native gates + local surface_gates = {} + for x = min, max, spread do + for z = min, max, spread do + local pos = vn(x,0,z) + local hpos = minetest.hash_node_position(pos) + surface_gates[hpos] = { + position = vn(x + pcgr:next(xzjittern,xzjitterp),pcgr:next(0,24),z + pcgr:next(xzjittern,xzjitterp)), + base = get_random_base(pcgr), + decor = get_random_decor(pcgr), + quality = quality_bias[pcgr:next(1,10)], + exact = false, + destination = (function() -- placeholder to be converted to an actual gate + local nhashes = { + minetest.hash_node_position(vn(x == min and x + spread or x - spread,0,z == min and z + spread or z - spread)), + minetest.hash_node_position(vn(x == min and x + spread or x - spread,0,z == max and z - spread or z + spread)), + minetest.hash_node_position(vn(x == max and x - spread or x + spread,0,z == min and z + spread or z - spread)), + minetest.hash_node_position(vn(x == max and x - spread or x + spread,0,z == max and z - spread or z + spread)), + } + local neighbors = {} + for n = 1, 4 do + n = nhashes[n] + local g = surface_gates[n] + if not g or g.destination ~= hpos then + neighbors[#neighbors + 1] = n + end + end + return neighbors[1] and neighbors[pcgr:next(1,#neighbors)] or nhashes[pcgr:next(1,4)] + end)(), + } + end + + -- Override gate generation function to generate destinations + generate_gate = function(x,y,z) + local pos = vn(x,y,z) + local gate + if y == 0 then + gate = surface_gates[minetest.hash_node_position(pos)] + gate.destination = surface_gates[gate.destination].position + else + gate = { + position = vn(x + pcgr:next(xzjittern,xzjitterp),y + pcgr:next(0,24),z + pcgr:next(xzjittern,xzjitterp)), + base = get_random_base(pcgr), + decor = get_random_decor(pcgr), + quality = get_random_quality(pcgr), + exact = false, + } + pos.y = 0 + gate.destination = surface_gates[minetest.hash_node_position(pos)].position + end + return gate + end + end + end + + -- Generate gates + for x = min, max, spread do + for y = ymin, ymax, spread do + for z = min, max, spread do + add_gate(generate_gate(x,y,z)) + end + end + end +end \ No newline at end of file diff --git a/mods/worldgate/src/link.lua b/mods/worldgate/src/link.lua new file mode 100644 index 00000000..df5c56be --- /dev/null +++ b/mods/worldgate/src/link.lua @@ -0,0 +1,188 @@ +-- +-- Worldgate linking functions +-- + +-- Telemosaic location hashing and unhashing functions +local function hash_pos(pos) + return math.floor(pos.x + 0.5)..':'.. + math.floor(pos.y + 0.5)..':'.. + math.floor(pos.z + 0.5) +end + +local function unhash_pos(hash) + local list = string.split(hash, ':') + local p = { + x = tonumber(list[1]), + y = tonumber(list[2]), + z = tonumber(list[3]) + } + if p.x and p.y and p.z then + return p + end +end + +-- Polyfill for vector.in_area +if not vector.in_area then + function vector.in_area(pos, min, max) + return (pos.x >= min.x) and (pos.x <= max.x) and + (pos.y >= min.y) and (pos.y <= max.y) and + (pos.z >= min.z) and (pos.z <= max.z) + end +end + +-- Garbage collection index to manage force-loaded chunks +local forceloader = { + index = {}, + load = function(self,blockpos) + -- Get the reference counter for the mapblock + local hash = minetest.hash_node_position(blockpos) + local refcounter = self.index[hash] or 0 + + -- Force-load mapblock if it is not yet force-loaded + if refcounter == 0 then + minetest.forceload_block(blockpos,true) + end + + -- Store updated reference counter + refcounter = refcounter + 1 + self.index[hash] = refcounter + end, + unload = function(self,blockpos) + -- Get the reference counter for the mapblock + local hash = minetest.hash_node_position(blockpos) + local refcounter = self.index[hash] or 1 + + -- Decrement reference counter and unload mapblock if there are no more + -- references to it + refcounter = refcounter - 1 + if refcounter == 0 then + minetest.forceload_free_block(blockpos,true) + end + + -- Store updated reference counter + self.index[hash] = refcounter + end, +} + +-- Function for linking and force-loading gate destinations +function worldgate.link(pos) + -- Get meta/destination + local nodemeta = minetest.get_meta(pos) + local destination = nodemeta:get("telemosaic:dest") + local do_worldgate_link = false + + -- Check for worldgate destination and convert to vector + local dpos = nil + if not destination then + dpos = nodemeta:get("worldgate:destination") + if not dpos then + return true + end + destination = minetest.string_to_pos(dpos) + do_worldgate_link = true + else + destination = vector.new(unhash_pos(destination)) + end + + -- Look for players near this gate + local players = minetest.get_connected_players() + for i = 1, #players do + -- If a player is found, then force-load the destination + local player = players[i] + if player and player:get_pos():in_area(pos:add(-32),pos:add(32)) then + if not nodemeta:get("worldgate:player_nearby") then + -- Define destination area to emerge + local mapblock = destination:divide(16):floor():multiply(16) + local emin = mapblock:add(vector.new(0,-32,0)) + local emax = mapblock:add(vector.new(0,47,0)) + + -- Emerge the destination mapblocks + minetest.emerge_area(emin,emax,function(blockpos,action,calls_remaining) + -- Do worldgate link to Telemosaic if defined for this gate + if calls_remaining == 0 then + if do_worldgate_link then + destination = nil + local beacons = minetest.find_nodes_in_area(emin:add(vector.new(-1,-1,-1)),emax:add(vector.new(1,1,1)),"group:telemosaic") + for beacon = 1, #beacons do + beacon = beacons[beacon] + local spos = minetest.get_meta(beacon):get("worldgate:source") + if dpos == spos then + destination = beacon + nodemeta:set_string("telemosaic:dest",hash_pos(beacon)) + break + end + end + end + + if destination then + -- Force-load destination mapblocks and own mapblock + forceloader:load(pos:divide(16):floor()) + for p = -32, 32, 16 do + forceloader:load(destination:add(vector.new(0,p,0)):divide(16):floor()) + end + else + -- Beacon cannot be linked + minetest.swap_node(pos,{ name = "telemosaic:beacon_off", param2 = 0 }) + return false + end + end + end) + + -- Flag this beacon as having a player nearby + nodemeta:set_string("worldgate:player_nearby","1") + end + return true + end + end + + -- No players found, unload all force-loaded blocks and unflag the beacon + if nodemeta:get("worldgate:player_nearby") then + forceloader:unload(pos:divide(16):floor()) + for p = -32, 32, 16 do + forceloader:unload(destination:add(vector.new(0,p,0)):divide(16):floor()) + end + nodemeta:set_string("worldgate:player_nearby","") + end + return true +end + +-- Run linking function on node timer +for _,beacon in ipairs({ + "telemosaic:beacon", + "telemosaic:beacon_protected", +}) do + minetest.override_item(beacon,{ + on_timer = worldgate.link, + }) +end + +-- Queue for linking function calls +local linkq = {} + +-- Run linking function when a player teleports +local tt = telemosaic.teleport +telemosaic.teleport = function(player,src,dest) + tt(player,src,dest) + dest.y = dest.y - 1 + worldgate.link(vector.new(src)) + worldgate.link(vector.new(dest)) +end + +-- Run linking function when a beacon changes its state +local tss = telemosaic.set_state +telemosaic.set_state = function(pos,state) + tss(pos,state) + worldgate.link(vector.new(pos)) +end + +-- Register LBM to jump-start force-load timers +minetest.register_abm({ + label = "Run worldgate linking function", + nodenames = "group:telemosaic", + interval = 3, + chance = 1, + catch_up = false, + action = function(pos) + worldgate.link(pos) + end, +}) \ No newline at end of file diff --git a/mods/worldgate/src/logging.lua b/mods/worldgate/src/logging.lua new file mode 100644 index 00000000..d5cfadd0 --- /dev/null +++ b/mods/worldgate/src/logging.lua @@ -0,0 +1,9 @@ +-- Logging for successfully generated worldgates +worldgate.reigster_on_worldgate_generated(function(pos,gate,strategy) + minetest.log("action","Worldgate generated at " .. minetest.pos_to_string(pos) .. " using the " .. strategy .. " strategy") +end) + +-- Logging for worldgates that failed to generate +worldgate.reigster_on_worldgate_failed(function(gate) + minetest.log("warning","Worldgate failed to generate" .. (gate.exact and " at " or " near ") .. minetest.pos_to_string(gate.position)) +end) \ No newline at end of file diff --git a/mods/worldgate/src/mapgen.lua b/mods/worldgate/src/mapgen.lua new file mode 100644 index 00000000..9f541c4d --- /dev/null +++ b/mods/worldgate/src/mapgen.lua @@ -0,0 +1,301 @@ +-- +-- Worldgate mapgen +-- + +-- Do not register mapgen if worldgate mapgen is disabled +if not worldgate.settings.mapgen then + return +end + +-- Spawning flags +local underwaterspawn = worldgate.settings.underwaterspawn +local midairspawn = worldgate.settings.midairspawn + +-- Telemosaic location hashing function +local function hash_pos(pos) + return math.floor(pos.x + 0.5)..':'.. + math.floor(pos.y + 0.5)..':'.. + math.floor(pos.z + 0.5) +end + +-- Common cached variables and functions +local vmcache = {} -- VoxelManip data cache, increases performance + +local schematic_airspace = worldgate.modpath .. "/schematics/worldgate_airspace.mts" +local schematic_platform = worldgate.modpath .. "/schematics/worldgate_platform.mts" + +local extender_break_chance = worldgate.settings.breakage + +local quality_selector = { + [0] = function(pcgr) -- 25% chance for tier 1 extender to be cobblestone + return { name = (pcgr:next(1,4) == 1 and "default:cobble" or "telemosaic:extender_one"), param2 = 0 } + end, + function() return { name = "telemosaic:extender_one", param2 = 0 } end, + function() return { name = "telemosaic:extender_two", param2 = 0 } end, + function() return { name = "telemosaic:extender_three", param2 = 0 } end, + function() return { name = "telemosaic:extender_three", param2 = 0 } end, +} + +local water = { + [minetest.get_content_id("mapgen_water_source")] = true, + [minetest.get_content_id("mapgen_river_water_source")] = true, +} + +local vn = vector.new + +-- Disallowed nodes to spawn on; no prefix means group +local disallowed_nodes = { + "leaves", + "tree", +} +local disallowed_nodes_length = #disallowed_nodes +local disallowed_cids = {[minetest.CONTENT_AIR] = true} + +minetest.register_on_mods_loaded(function() + for node,def in pairs(minetest.registered_nodes) do + for i = 1, disallowed_nodes_length do + i = disallowed_nodes[i] + if node == i or minetest.get_item_group(node,i) > 0 then + disallowed_cids[minetest.get_content_id(node)] = true + end + end + end +end) + +-- Bricks to cobblestone map for quality degradation +local bricks_list = { + "default:stonebrick", + "stairs:stair_stonebrick", + "stairs:stair_inner_stonebrick", + "stairs:stair_outer_stonebrick", + "stairs:slab_stonebrick", +} + +local bricks_map = { + ["default:stonebrick"] = "default:cobble", + ["stairs:stair_stonebrick"] = "stairs:stair_cobble", + ["stairs:stair_inner_stonebrick"] = "stairs:stair_inner_cobble", + ["stairs:stair_outer_stonebrick"] = "stairs:stair_outer_cobble", + ["stairs:slab_stonebrick"] = "stairs:slab_cobble", +} + +local bricks_degrade_chance = { + [-1] = 9, + [0] = 42, + [1] = 200, +} + +-- Worldgate mapgen function +minetest.register_on_generated(function(minp,maxp,blockseed) + -- Find all gates within the emerged area of the current mapchunk + local gates = {} + for x = 0, 4 do + for y = 0, 4 do + for z = 0, 4 do + local hashed = worldgate.get_gates_for_mapblock(vn(minp.x + x * 16,minp.y + y * 16,minp.z + z * 16)) + for h = 1, #hashed do + gates[#gates + 1] = hashed[h] + end + end + end + end + + if #gates == 0 then + return -- no gates to generate + end + + -- Get LVM values + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local va = VoxelArea(emin,emax) + local ystride = va.ystride + local zstride = va.zstride + + -- Generate the gates in this mapchunk, if any + for gate = 1, #gates do + gate = gates[gate] + + -- Random number generator + local pcgr = PcgRandom(minetest.hash_node_position(gate.position)) + + -- Define location variable + local location = nil + + -- Variable for tracking location selection strategy + local strategy = nil + + -- Set the exact position if gate is exact, else find a suitable location + -- in the current mapchunk + if gate.exact then + location = gate.position + strategy = "exact" + else + -- Load LVM data + local vdata = vm:get_data(vmcache) + + -- Constrain the area to +/- 2 vertical mapblocks for more consistent and + -- deterministic mapgen + local mapblock = gate.position:divide(16):floor():multiply(16) + emin = mapblock:add(vn(0,-32,0)) + emax = mapblock:add(vn(0,47,0)) + + -- Function for indexing 2D heightmap array + local function index2d(x,z) -- (portions of this function © FaceDeer 2018, licensed MIT, copied from https://github.com/minetest-mods/mapgen_helper/blob/2521562a42472271d9d761f2b1e84ead59250a14/noise_manager.lua) + return x - minp.x + + (maxp.x - minp.x + 1) + *(z - minp.z) + + 1 + end + + -- Probe heightmap for suitable location + local heightmap = minetest.get_mapgen_object("heightmap") or {} + for i = 1, 8 do + local randomx = pcgr:next(emin.x,emax.x) + local randomz = pcgr:next(emin.z,emax.z) + local heightmapy = heightmap[index2d(randomx,randomz)] + + if not heightmapy then + goto retry_probe + end + + local pos = va:index(randomx,heightmapy,randomz) + local cid = vdata[pos] + local above = vdata[pos + ystride] + + if cid and cid ~= minetest.CONTENT_AIR and cid ~= minetest.CONTENT_IGNORE and above and above ~= cid then + -- Only spawn underwater if allowed + if not underwaterspawn and (water[cid] or water[above]) then + goto retry_probe + end + + -- Check for valid space above + for ypos = pos + ystride * 2, pos + ystride * 10, ystride do + local ydata = vdata[ypos] + if not ydata or ydata == minetest.CONTENT_IGNORE or (not underwaterspawn and water[ydata]) then + goto retry_probe + end + end + + -- A valid location was found on the heightmap + location = vn(randomx,heightmapy,randomz) + strategy = "heightmap" + break + end + ::retry_probe:: + end + + -- If no heightmap location found, then generate on a random node under air + if not location then + local air, nodecount = minetest.find_nodes_in_area(emin,emax,"air") + local nair = nodecount.air + for i = 1, math.min(nair,8) do + local pos = va:indexp(air[pcgr:next(1,nair)]) + while disallowed_cids[vdata[pos]] do + pos = pos - ystride -- probe downwards until we find something that isn't air + end + if vdata[pos] and vdata[pos] ~= minetest.CONTENT_IGNORE then + location = va:position(pos) + strategy = "grounded" + break + end + end + end + + -- If mapchunk is completely solid or empty, then generate in a random location + if not location then + for i = 1, 8 do + local randomx = pcgr:next(emin.x,emax.x) + local randomy = pcgr:next(emin.y,emax.y) + local randomz = pcgr:next(emin.z,emax.z) + + -- Only spawn in midair or underwater if allowed + local pos = va:indexp(vn(randomx,randomy,randomz)) + for ypos = pos, pos + ystride * 11, ystride do + local ydata = vdata[ypos] + if ydata and ydata ~= minetest.CONTENT_IGNORE and (underwaterspawn or not water[ydata]) and (ypos == pos and (midairspawn or ydata ~= minetest.CONTENT_AIR) or true) then + location = va:position(pos) + strategy = "random" + break + end + end + end + end + + -- Fail if no suitable location found + if not location then + -- Trigger failure callbacks + for c = 1, #worldgate.worldgate_failed_callbacks do + worldgate.worldgate_failed_callbacks[c](gate) + end + return -- cannot generate this worldgate + end + + -- Adjust location by y + 1 + location = location:add(vn(0,1,0)) + end + + -- Place airspace + minetest.place_schematic_on_vmanip(vm,location,schematic_airspace,"90",nil,true,"place_center_x,place_center_z") + + -- Place platform + minetest.place_schematic_on_vmanip(vm,location:add(vn(0,-8,0)),schematic_platform,"random",nil,true,"place_center_x,place_center_z") + + -- Place base + minetest.place_schematic_on_vmanip(vm,location,gate.base,"random",nil,false,"place_center_x,place_center_z") + + -- Place decor + minetest.place_schematic_on_vmanip(vm,location:add(vn(0,3,0)),gate.decor,"random",nil,false,"place_center_x,place_center_z") + + -- Update liquids + vm:update_liquids() + + -- Write back to LVM + vm:write_to_map() + + -- Process extenders based on gate quality + for _,epos in ipairs(minetest.find_nodes_in_area(location:add(vn(-6,0,-6)),location:add(vn(6,3,6)),"group:worldgate_extender")) do + if pcgr:next(1,100) <= extender_break_chance then -- chance for any extender to be broken + minetest.swap_node(epos,{ name = "default:cobble", param2 = 0 }) + else + minetest.swap_node(epos,quality_selector[minetest.get_item_group(minetest.get_node(epos).name,"worldgate_extender") + gate.quality](pcgr)) + end + end + + -- Replace bricks with cobblestone based on gate quality + local bricks = minetest.find_nodes_in_area(location:add(vn(-6,0,-6)),location:add(vn(6,13,6)),bricks_list) + local brick_degrade_chance = bricks_degrade_chance[gate.quality] + for _,brick in ipairs(bricks) do + if pcgr:next(1,brick_degrade_chance) == 1 then + local brick_node = minetest.get_node(brick) + local cobble_node = bricks_map[brick_node.name] + if cobble_node then + minetest.swap_node(brick,{ name = cobble_node, param2 = brick_node.param2 }) + end + end + end + + -- Write the gate's position to the beacon's node meta for linking purposes + local beacon = (function() + for dy = 2, 0, -1 do + local beacon_location = location:add(vn(0,dy,0)) + local beacon_node = minetest.get_node(beacon_location) + if beacon_node and beacon_node.name:find("^telemosaic:beacon") then + return beacon_location + end + end + end)() + local nodemeta = minetest.get_meta(beacon) + nodemeta:set_string("worldgate:source",minetest.pos_to_string(gate.position)) + if gate.destination then + nodemeta:set_string("worldgate:destination",minetest.pos_to_string(gate.destination)) + minetest.swap_node(beacon,{ name = "telemosaic:beacon", param2 = 0 }) + end + + -- Fix lighting + minetest.fix_light(location:add(vn(-6,-8,-6)),location:add(vn(6,11,6))) + + -- Trigger callbacks + for c = 1, #worldgate.worldgate_generated_callbacks do + worldgate.worldgate_generated_callbacks[c](location,gate,strategy) + end + end +end) \ No newline at end of file diff --git a/mods/worldgate/src/nodes.lua b/mods/worldgate/src/nodes.lua new file mode 100644 index 00000000..64c464a7 --- /dev/null +++ b/mods/worldgate/src/nodes.lua @@ -0,0 +1,31 @@ +-- +-- Worldgate structure nodes +-- These get replaced with "real" nodes defined by games/mods/mapgen + +for name,def in pairs({ + Extender1 = { + color = "#00FF00", + group = "worldgate_extender", + group_value = 1, + }, + Extender2 = { + color = "#0000FF", + group = "worldgate_extender", + group_value = 2, + }, + Extender3 = { + color = "#FF00FF", + group = "worldgate_extender", + group_value = 3, + }, +}) do + minetest.register_node("worldgate:structure_" .. name:lower(),{ + description = "Worldgate Structure Node: " .. name, + groups = { + not_in_creative_inventory = 1, + oddly_breakable_by_hand = 1, + [def.group] = def.group_value, + }, + color = def.color, + }) +end \ No newline at end of file diff --git a/mods/worldgate/src/settings_overrides.lua b/mods/worldgate/src/settings_overrides.lua new file mode 100644 index 00000000..510bb2cd --- /dev/null +++ b/mods/worldgate/src/settings_overrides.lua @@ -0,0 +1,78 @@ +-- +-- Overrides for Telemosaic settings +-- + +-- Give extenders a lot more range +if worldgate.settings.superextenders then + -- Global extender values + telemosaic.extender_ranges = { 250, 750, 1500 } + + -- Tier 1 extenders + local tier1range = telemosaic.extender_ranges[1] + local tier1groups = minetest.registered_nodes["telemosaic:extender_one"].groups + tier1groups.telemosaic_extender = tier1range + minetest.override_item("telemosaic:extender_one",{ groups = tier1groups }) + + -- Tier 2 extenders + local tier2range = telemosaic.extender_ranges[2] + local tier2groups = minetest.registered_nodes["telemosaic:extender_two"].groups + tier2groups.telemosaic_extender = tier2range + minetest.override_item("telemosaic:extender_two",{ groups = tier2groups }) + + -- Tier 3 extenders + local tier3range = telemosaic.extender_ranges[3] + local tier3groups = minetest.registered_nodes["telemosaic:extender_three"].groups + tier3groups.telemosaic_extender = tier3range + minetest.override_item("telemosaic:extender_three",{ groups = tier3groups }) +end + +-- Implement a longer minimum delay for teleportation to prevent spamming and +-- weirdness with loading/unloading mapblocks +local min_delay = 5 +if telemosaic.teleport_delay < min_delay then + telemosaic.teleport_delay = min_delay +end + +-- Override beacons to give off light if configured +if worldgate.settings.beaconglow then + for _,beacon in ipairs({ + "telemosaic:beacon", + "telemosaic:beacon_protected", + "telemosaic:beacon_err", + "telemosaic:beacon_err_protected", + }) do + minetest.override_item(beacon,{ + light_source = 15, + }) + end +end + +-- Override right-click function to consume mese crystal shards after use as a +-- Telemosaic key, if configured +if worldgate.settings.destroykeys then + local trc = telemosaic.rightclick + telemosaic.rightclick = function(pos, node, player, itemstack, pointed_thing) + local item = itemstack:get_name() + local returned_item = trc(pos, node, player, itemstack, pointed_thing) + if item == "telemosaic:key" and returned_item:get_name() == "default:mese_crystal_fragment" then + return ItemStack() + else + return returned_item + end + end + + for _,beacon in ipairs({ + "telemosaic:beacon", + "telemosaic:beacon_err", + "telemosaic:beacon_disabled", + "telemosaic:beacon_off", + "telemosaic:beacon_protected", + "telemosaic:beacon_err_protected", + "telemosaic:beacon_disabled_protected", + "telemosaic:beacon_off_protected", + }) do + minetest.override_item(beacon,{ + on_rightclick = telemosaic.rightclick + }) + end +end \ No newline at end of file diff --git a/mods/x_farming/API.md b/mods/x_farming/API.md new file mode 100644 index 00000000..b5844745 --- /dev/null +++ b/mods/x_farming/API.md @@ -0,0 +1,63 @@ +# [Mod] X Farming [x_farming] API + +## Types + +`BonemealTreeDef` + +```typescript +type BonemealTreeDef = { + // sapling name + name: string + // 1 out of `chance`, e.g. 2 = 50% chance + chance: number + // grow tree from sapling, should return `true` if the growing was successful + grow_tree: function(pos: Vector): boolean +} +``` + +## Class `x_farming.x_bonemeal` + +**Method** + +`is_on_soil(pos: Vector): boolean` + +Check if node has a soil below its self. + +**Method** + +`is_on_sand(pos: Vector): boolean` + +Check if node has a sand below its self. + +**Method** + +`register_tree_defs(self: x_bonemeal, defs: BonemealTreeDef[]): void` + +Register tree definition for bonemeal to work on this sapling. +Other mods can register new tree growth from sapling using bonemeal. + +example + +```lua + x_farming.x_bonemeal:register_tree_defs({ + { + name = 'everness:coral_tree_sapling', + chance = 3, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + minetest.place_schematic( + { x = pos.x - 19, y = pos.y, z = pos.z - 19 }, + minetest.get_modpath('mymod') .. '/schematics/mymod_mytree_from_sapling.mts', + 'random', + nil, + false + ) + + return true + end + } +}) +``` diff --git a/mods/x_farming/LICENSE.txt b/mods/x_farming/LICENSE.txt new file mode 100644 index 00000000..eca24188 --- /dev/null +++ b/mods/x_farming/LICENSE.txt @@ -0,0 +1,1313 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 2023 SaKeL + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +### Code + +GNU Lesser General Public License v2.1 or later (see included LICENSE file) + +### Textures + +**CC-BY-SA-4.0, by SaKeL** + +- x_farming_carrot_seed.png +- x_farming_potato_seed.png +- x_farming_coffee.png +- x_farming_coffee_seed.png +- x_farming_corn_popcorn.png +- x_farming_obsidian_soil.png +- x_farming_obsidian_soil_wet.png +- x_farming_obsidian_wart_seed.png +- x_farming_corn_1.png +- x_farming_corn_2.png +- x_farming_corn_3.png +- x_farming_corn_4.png +- x_farming_corn_5.png +- x_farming_corn_6.png +- x_farming_corn_7.png +- x_farming_corn_8.png +- x_farming_corn_9.png +- x_farming_corn_10.png +- x_farming_corn_pop.png +- x_farming_corn_seed.png +- x_farming_kiwi.png +- x_farming_kiwi_fruit.png +- x_farming_kiwi_sapling.png +- x_farming_cactus_fruit_bottom.png +- x_farming_cactus_fruit_sides.png +- x_farming_cactus_fruit_top.png +- x_farming_cactus_fruit_item.png +- x_farming_large_cactus_with_fruit_seedling.png +- x_farming_large_cactus_with_fruit_seedling +- x_farming_strawberry_seed.png +- x_farming_strawberry.png +- x_farming_jungleleaves.png +- x_farming_jungle_tree.png +- x_farming_jungle_tree_top.png +- x_farming_jungle_wood.png +- x_farming_pine_nut.png +- x_farming_pine_nut_roasted.png +- x_farming_coffee_cup_hot.png +- x_farming_bottle_coffee.png +- x_farming_bottle_water.png +- x_farming_bottle_soymilk_raw.png +- x_farming_bottle_soymilk.png +- x_farming_donut.png +- x_farming_donut_chocolate.png +- x_farming_soybean.png +- x_farming_soybean_1.png +- x_farming_soybean_2.png +- x_farming_soybean_3.png +- x_farming_soybean_4.png +- x_farming_soybean_5.png +- x_farming_soybean_6.png +- x_farming_soybean_7.png +- x_farming_soybean_seed.png +- x_farming_stevia.png +- x_farming_stevia_1.png +- x_farming_stevia_2.png +- x_farming_stevia_3.png +- x_farming_stevia_4.png +- x_farming_stevia_5.png +- x_farming_stevia_6.png +- x_farming_stevia_7.png +- x_farming_stevia_8.png +- x_farming_stevia_seed.png +- x_farming_x_bonemeal_bonemeal.png +- x_farming_salt_1_side.png +- x_farming_salt_1_top.png +- x_farming_salt_2_side.png +- x_farming_salt_2_top.png +- x_farming_salt_3_side.png +- x_farming_salt_3_top.png +- x_farming_salt_4_side.png +- x_farming_salt_4_top.png +- x_farming_salt_water.png +- x_farming_drilled_ice.png +- x_farming_ice_auger.png +- x_farming_icefishing_back_0.png +- x_farming_icefishing_back_1.png +- x_farming_icefishing_back_2.png +- x_farming_icefishing_back_3.png +- x_farming_icefishing_back_4.png +- x_farming_icefishing_back_5.png +- x_farming_icefishing_back_6.png +- x_farming_icefishing_back_7.png +- x_farming_icefishing_back_8.png +- x_farming_icefishing_back_9.png +- x_farming_icefishing_bottom.png +- x_farming_icefishing_front_0.png +- x_farming_icefishing_front_1.png +- x_farming_icefishing_front_2.png +- x_farming_icefishing_front_3.png +- x_farming_icefishing_front_4.png +- x_farming_icefishing_front_5.png +- x_farming_icefishing_front_6.png +- x_farming_icefishing_front_7.png +- x_farming_icefishing_front_8.png +- x_farming_icefishing_front_9.png +- x_farming_icefishing_inv.png +- x_farming_icefishing_left.png +- x_farming_icefishing_right.png +- x_farming_icefishing_top_1.png +- x_farming_icefishing_top_2.png +- x_farming_icefishing_top_3.png +- x_farming_icefishing_top_4.png +- x_farming_icefishing_top_5.png +- x_farming_icefishing_top_6.png +- x_farming_icefishing_top_7.png +- x_farming_icefishing_top_8.png +- x_farming_icefishing_top_9.png +- x_farming_icefishing_top_animated.png +- x_farming_icefishing_top_animated_9.png +- x_farming_hog_stew_mesh.png +- x_farming_beetroot_soup_mesh.png +- x_farming_pumpkin_pie_mesh.png +- x_farming_kiwi_fruit_mesh.png +- x_farming_corn_popcorn_mesh.png +- x_farming_fries_mesh.png +- x_farming_coffee_cup_hot_mesh.png +- x_farming_donut_mesh.png +- x_farming_donut_chocolate_mesh.png +- x_farming_bag_salt.png +- x_farming_crate_beetroot_3.png +- x_farming_crate_cactus_fruit_item_3.png +- x_farming_crate_carrot_3.png +- x_farming_crate_cocoa_bean_3.png +- x_farming_crate_coffee_3.png +- x_farming_crate_corn_3.png +- x_farming_crate_cotton_3.png +- x_farming_crate_fish_3.png +- x_farming_crate_kiwi_fruit_3.png +- x_farming_crate_melon_3.png +- x_farming_crate_obsidian_wart_3.png +- x_farming_crate_pine_nut_3.png +- x_farming_crate_potato_3.png +- x_farming_crate_pumpkin_block_3.png +- x_farming_crate_soybean_3.png +- x_farming_crate_stevia_3.png +- x_farming_crate_strawberry_3.png +- x_farming_crate_wheat_3.png +- x_farming_fly.png +- x_farming_composter_1.png +- x_farming_composter_4.png +- x_farming_composter_5.png +- x_farming_composter_2.png +- x_farming_composter_3.png +- x_farming_coffee_1.png +- x_farming_coffee_2.png +- x_farming_coffee_3.png +- x_farming_coffee_4.png +- x_farming_coffee_5.png +- x_farming_pumpkin_1.png +- x_farming_pumpkin_2.png +- x_farming_pumpkin_3.png +- x_farming_pumpkin_4.png +- x_farming_pumpkin_5.png +- x_farming_pumpkin_6.png +- x_farming_pumpkin_7.png +- x_farming_pumpkin_8.png +- x_farming_corn.png +- x_farming_chocolate.png +- x_farming_fries.png +- x_farming_bag_empty.png -- Derived from Farmer's Delight by vectorwing (MIT) +- x_farming_crate_empty.png -- Derived from Farmer's Delight by vectorwing (MIT) +- x_farming_melon_1.png +- x_farming_melon_2.png +- x_farming_melon_3.png +- x_farming_melon_4.png +- x_farming_melon_5.png +- x_farming_melon_6.png +- x_farming_melon_7.png +- x_farming_melon_8.png +- x_farming_strawberry_1.png +- x_farming_strawberry_2.png +- x_farming_strawberry_3.png +- x_farming_strawberry_4.png +- x_farming_pine_nut_leaves.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- x_farming_x_bonemeal_particles.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- x_farming_salt.png +- x_farming_kiwi_leaves.png -- Derived from texture by paramat (CC BY-SA 3.0) +- x_farming_junglesapling.png -- Derived from texture by PilzAdam (CC BY-SA 3.0) +- x_farming_pine_nut_sapling.png -- Derived from texture by Splizard (CC BY-SA 3.0) +- x_farming_salt_1_bottom.png -- Derived from a texture by random-geek (CC BY-SA 3.0) -- Derived from texture by Neuromancer (CC BY-SA 3.0) +- x_farming_fish_woodskip.png +- x_farming_fish_wolffish.png +- x_farming_fish_whitefish.png +- x_farming_fish_purple_seashroom.png +- x_farming_fish_black_seashroom.png +- x_farming_fish_blue_seashroom.png +- x_farming_fish_brown_seashroom.png +- x_farming_fish_cyan_seashroom.png +- x_farming_fish_gray_seashroom.png +- x_farming_fish_green_seashroom.png +- x_farming_fish_light_gray_seashroom.png +- x_farming_fish_lime_seashroom.png +- x_farming_fish_magenta_seashroom.png +- x_farming_fish_orange_seashroom.png +- x_farming_fish_pink_seashroom.png +- x_farming_fish_red_seashroom.png +- x_farming_fish_white_seashroom.png +- x_farming_fish_yellow_seashroom.png +- x_farming_fish_white_bullhead.png +- x_farming_fish_cold_ocean_hermit_crab.png +- x_farming_fish_frozen_ocean_hermit_crab.png +- x_farming_fish_lukewarm_ocean_hermit_crab.png +- x_farming_fish_ocean_hermit_crab.png +- x_farming_fish_warm_ocean_hermit_crab.png +- x_farming_fish_walleye.png +- x_farming_fish_vampire_squid.png +- x_farming_fish_true_goldfish.png +- x_farming_fish_totemfish.png +- x_farming_fish_tilapia.png +- x_farming_fish_tench.png +- x_farming_fish_tancho_koi.png +- x_farming_fish_mother_moon.png +- x_farming_fish_swordfish.png +- x_farming_fish_desert_frog.png +- x_farming_fish_jungle_frog.png +- x_farming_fish_swamp_frog.png +- x_farming_fish_swamp_darter.png +- x_farming_fish_sunfish.png +- x_farming_fish_sturgeon.png +- x_farming_fish_stingray.png +- x_farming_fish_sterlet.png +- x_farming_fish_smallmouth_bass.png +- x_farming_fish_largemouth_bass.png +- x_farming_fish_slimefish.png +- x_farming_fish_skykoi.png +- x_farming_fish_skullfin.png +- x_farming_fish_rusty_skullfin.png +- x_farming_fish_skate.png +- x_farming_fish_shrimp.png +- x_farming_fish_sea_cucumber.png +- x_farming_fish_sawfish.png +- x_farming_fish_sardine.png +- x_farming_fish_sablefish.png +- x_farming_fish_rosefish.png +- x_farming_fish_rohu.png +- x_farming_fish_rockfish.png +- x_farming_fish_redbreast_sunfish.png +- x_farming_fish_red_snapper.png +- x_farming_fish_red_mullet.png +- x_farming_fish_rainbowfish.png +- x_farming_fish_rainbow_trout.png +- x_farming_fish_pumpkinseed.png +- x_farming_fish_prismfish.png +- x_farming_fish_piranha.png +- x_farming_fish_pike.png +- x_farming_fish_piglish.png +- x_farming_fish_perch.png +- x_farming_fish_pearlwog.png +- x_farming_fish_pearl_isopod.png +- x_farming_fish_paddlefish.png +- x_farming_fish_oscar.png +- x_farming_fish_octopus.png +- x_farming_fish_obster.png +- x_farming_fish_lobster.png +- x_farming_fish_neon_tetra.png +- x_farming_fish_mud_flounder.png +- x_farming_fish_minnow.png +- x_farming_fish_manta_ray.png +- x_farming_fish_magma_slimefish.png +- x_farming_fish_lingcod.png +- x_farming_fish_leerfish.png +- x_farming_fish_leech.png +- x_farming_fish_lava_eel.png +- x_farming_fish_albacore.png +- x_farming_fish_anchovy.png +- x_farming_fish_angelfish.png +- x_farming_fish_angler.png +- x_farming_fish_armored_catfish.png +- x_farming_fish_arrow_squid.png +- x_farming_fish_barracuda.png +- x_farming_fish_blobfish.png +- x_farming_fish_bream.png +- x_farming_fish_burbot.png +- x_farming_fish_carp.png +- x_farming_fish_catfish.png +- x_farming_fish_catla.png +- x_farming_fish_chorus_snail.png +- x_farming_fish_chub.png +- x_farming_fish_clam.png +- x_farming_fish_conger.png +- x_farming_fish_congo_tiger_fish.png +- x_farming_fish_convict_cichlid.png +- x_farming_fish_crab.png +- x_farming_fish_crayfish.png +- x_farming_fish_damselfish.png +- x_farming_fish_danios.png +- x_farming_fish_desert_sunfish.png +- x_farming_fish_diamond_angler.png +- x_farming_fish_dwarf_caiman.png +- x_farming_fish_eel.png +- x_farming_fish_electric_eel.png +- x_farming_fish_endray.png +- x_farming_fish_father_sun.png +- x_farming_fish_flier.png +- x_farming_fish_floral_faefish.png +- x_farming_fish_flounder.png +- x_farming_fish_fourhorn_sculpin.png +- x_farming_fish_frozen_boneminnow.png +- x_farming_fish_gar.png +- x_farming_fish_giant_moray.png +- x_farming_fish_goldeye.png +- x_farming_fish_goldfish.png +- x_farming_fish_grass_pickerel.png +- x_farming_fish_guppy.png +- x_farming_fish_hagfish.png +- x_farming_fish_halibut.png +- x_farming_fish_herring.png +- x_farming_fish_illager_ghostfish.png +- x_farming_fish_ironfish.png +- x_farming_fish_koi.png +- x_farming_fish_lamprey.png +- x_farming_cactus_brick.png -- Derived from a texture by Calinou (CC BY-SA 3.0) +- x_farming_cooked_mask.png +- x_farming_scarecrow_1_item.png +- x_farming_scarecrow_1.png +- x_farming_christmas_tree_leaves_animated.png -- Derived from texture by Splizard (CC BY-SA 3.0) +- x_farming_christmas_tree_leaves_decorated.png -- Derived from texture by Splizard (CC BY-SA 3.0) +- x_farming_christmas_tree_sapling.png +- x_farming_christmas_tree_star.png +- x_farming_scarecrow_2.png +- x_farming_barley.png +- x_farming_barley_1.png +- x_farming_barley_2.png +- x_farming_barley_3.png +- x_farming_barley_4.png +- x_farming_barley_5.png +- x_farming_barley_6.png +- x_farming_barley_7.png +- x_farming_barley_8.png +- x_farming_barley_seed.png +- x_farming_barley_stack_side.png +- x_farming_barley_stack_top.png +- x_farming_bread.png +- x_farming_cotton.png +- x_farming_cotton_1.png +- x_farming_cotton_2.png +- x_farming_cotton_3.png +- x_farming_cotton_4.png +- x_farming_cotton_5.png +- x_farming_cotton_6.png +- x_farming_cotton_7.png +- x_farming_cotton_8.png +- x_farming_cotton_seed.png +- x_farming_crate_barley_3.png +- x_farming_crate_cotton2_3.png +- x_farming_flour.png +- x_farming_string.png +- x_farming_tool_steelhoe.png +- x_farming_tool_stonehoe.png +- x_farming_tool_woodhoe.png +- x_farming_pine_nut_tree.png +- x_farming_pine_nut_tree_top.png +- x_farming_pine_nut_wood.png +- x_farming_kiwi_tree.png +- x_farming_kiwi_tree_top.png +- x_farming_kiwi_tree_wood.png +- x_farming_beetroot_1.png +- x_farming_beetroot_2.png +- x_farming_beetroot_3.png +- x_farming_beetroot_4.png +- x_farming_beetroot_5.png +- x_farming_beetroot_6.png +- x_farming_beetroot_7.png +- x_farming_beetroot_8.png +- x_farming_beetroot.png +- x_farming_beetroot_seed.png +- x_farming_beetroot_soup.png +- x_farming_bowl.png +- x_farming_carrot_1.png +- x_farming_carrot_2.png +- x_farming_carrot_3.png +- x_farming_carrot_4.png +- x_farming_carrot_5.png +- x_farming_carrot_6.png +- x_farming_carrot_7.png +- x_farming_carrot_8.png +- x_farming_carrot_golden.png +- x_farming_carrot.png +- x_farming_fish_stew.png +- x_farming_potato_1.png +- x_farming_potato_2.png +- x_farming_potato_3.png +- x_farming_potato_4.png +- x_farming_potato_5.png +- x_farming_potato_6.png +- x_farming_potato_7.png +- x_farming_potato_8.png +- x_farming_potato_baked.png +- x_farming_potato.png +- x_farming_potato_poisonous.png +- x_farming_obsidian_wart_1.png +- x_farming_obsidian_wart_2.png +- x_farming_obsidian_wart_3.png +- x_farming_obsidian_wart_4.png +- x_farming_obsidian_wart_5.png +- x_farming_obsidian_wart_6.png +- x_farming_obsidian_wart.png +- x_farming_wart_block.png +- x_farming_wart_brick_block.png +- x_farming_wart_brick.png +- x_farming_wartrack.png +- x_farming_wart_red_brick_block.png +- x_farming_cookie.png +- x_farming_sugar.png +- x_farming_cocoa_top_1.png +- x_farming_cocoa_right_1.png +- x_farming_cocoa_left_1.png +- x_farming_cocoa_front_1.png +- x_farming_cocoa_bottom_1.png +- x_farming_cocoa_left_2.png +- x_farming_cocoa_top_2.png +- x_farming_cocoa_bottom_2.png +- x_farming_cocoa_front_2.png +- x_farming_cocoa_right_2.png +- x_farming_cocoa_right_3.png +- x_farming_cocoa_front_3.png +- x_farming_cocoa_top_3.png +- x_farming_cocoa_bottom_3.png +- x_farming_cocoa_left_3.png +- x_farming_cocoa_bean +- x_farming_melon_seed.png +- x_farming_melon_fruit_side.png +- x_farming_melon_fruit_top.png +- x_farming_melon_fruit_bottom.png +- x_farming_melon.png +- x_farming_golden_melon.png +- x_farming_pumpkin_fruit_side_off.png +- x_farming_pumpkin_fruit_side_on.png +- x_farming_pumpkin_fruit_side.png +- x_farming_pumpkin_fruit_top.png +- x_farming_pumpkin_fruit_bottom.png +- x_farming_pumpkin_pie.png +- x_farming_pumpkin_seed.png +- x_farming_bee_hive_bottom.png +- x_farming_bee_hive_front.png +- x_farming_bee_hive_saturated_overlay.png +- x_farming_bee_hive_side.png +- x_farming_bee_hive_top.png +- x_farming_bee_mesh_animated.png +- x_farming_bottle_honey.png +- x_farming_default_particle.png +- x_farming_honey_block_mesh.png +- x_farming_honeycomb.png +- x_farming_honeycomb_block.png +- x_farming_honeycomb_saw.png +- x_farming_jar_empty.png +- x_farming_jar_with_bee.png +- x_farming_candle_flame_animated.png +- x_farming_candle_item.png +- x_farming_candle_mesh.png +- x_farming_candle_no_flame.png +- x_farming_rope.png +- x_farming_rope_item.png +- x_farming_rope_fence.png +- x_farming_rope_fence_item.png +- x_farming_safety_net.png +- x_farming_safety_net_side.png +- x_farming_pillow_violet.png +- x_farming_pillow_pink.png +- x_farming_pillow_yellow.png +- x_farming_pillow_white.png +- x_farming_pillow_light_blue.png +- x_farming_pillow_green.png +- x_farming_pillow_orange.png +- x_farming_pillow_red.png +- x_farming_pillow_blue.png +- x_farming_pillow_magenta.png +- x_farming_pillow_cyan.png +- x_farming_pillow_dark_green.png +- x_farming_pillow_brown.png +- x_farming_pillow_grey.png +- x_farming_pillow_dark_grey.png +- x_farming_pillow_black.png +- x_farming_bag_rice_grains.png +- x_farming_crate_rice_3.png +- x_farming_rice.png +- x_farming_rice_1.png +- x_farming_rice_2.png +- x_farming_rice_3.png +- x_farming_rice_4.png +- x_farming_rice_5.png +- x_farming_rice_6.png +- x_farming_rice_7.png +- x_farming_rice_8.png +- x_farming_rice_grains.png +- x_farming_rice_seed.png +- x_farming_rice_seed_inv.png +- x_farming_rice_stack_bottom.png +- x_farming_rice_stack_side.png +- x_farming_rice_stack_top.png +- x_farming_silt_loam_soil.png +- x_farming_stove_front.png +- x_farming_stove_front_animated.png +- x_farming_stove_item_smoke_particle.png +- x_farming_stove_side.png +- x_farming_stove_top.png +- x_farming_stove_top_animated.png +- x_farming_sushi_maki.png +- x_farming_sushi_nigiri.png +- x_farming_silt_loam_brick.png +- x_farming_silt_loam_brick_block.png +- x_farming_baked_fish_item.png +- x_farming_baked_fish_mesh.png +- x_farming_baked_fish_mesh_1.png +- x_farming_baked_fish_mesh_2.png +- x_farming_baked_fish_mesh_3.png +- x_farming_baked_fish_mesh_4.png +- x_farming_baked_fish_mesh_5.png +- x_farming_bowl_baked_fish.png +- x_farming_bowl_french_potatoes.png +- x_farming_french_potatoes_item.png +- x_farming_french_potatoes_mesh.png +- x_farming_french_potatoes_mesh_1.png +- x_farming_french_potatoes_mesh_2.png +- x_farming_french_potatoes_mesh_3.png +- x_farming_french_potatoes_mesh_4.png +- x_farming_french_potatoes_mesh_5.png +- x_farming_bowl_melon_slush.png +- x_farming_melon_slush_item.png +- x_farming_melon_slush_mesh_1.png +- x_farming_melon_slush_mesh_2.png +- x_farming_melon_slush_mesh_3.png +- x_farming_melon_slush_mesh_4.png +- x_farming_melon_slush_mesh_5.png +- x_farming_melon_slush_mesh.png +- x_farming_chocolate_pie_item.png +- x_farming_chocolate_pie_mesh_1.png +- x_farming_chocolate_pie_mesh_2.png +- x_farming_chocolate_pie_mesh_3.png +- x_farming_chocolate_pie_mesh_4.png +- x_farming_honey_kiwi_pie_item.png +- x_farming_honey_kiwi_pie_mesh_1.png +- x_farming_honey_kiwi_pie_mesh_2.png +- x_farming_honey_kiwi_pie_mesh_3.png +- x_farming_honey_kiwi_pie_mesh_4.png +- x_farming_slice_chocolate_pie.png +- x_farming_slice_honey_kiwi_pie.png +- x_farming_slice_strawberry_pie.png +- x_farming_strawberry_pie_item.png +- x_farming_strawberry_pie_mesh_1.png +- x_farming_strawberry_pie_mesh_2.png +- x_farming_strawberry_pie_mesh_3.png +- x_farming_strawberry_pie_mesh_4.png +- x_farming_honey_block_item.png + +**CC-BY-SA-3.0, modified by Thomas-S** + +- x_farming_vessels_glass_bottle.png + +**CC-BY-SA-3.0, BlockMen** + +- x_farming_gui_hb_bg.png + +### Sound + +**CC-BY-3.0, by MaxDemianAGL**, https://freesound.org + +- x_farming_x_bonemeal_grow.ogg + +**CC-BY-3.0, by Angel_Perez_Grandi**, https://freesound.org + +- x_farming_ice_dug.ogg + +**CC0-1.0, by felix.blume**, https://freesound.org/people/felix.blume/sounds/583040/ + +- x_farming_bee.1.ogg +- x_farming_bee.2.ogg +- x_farming_bee.3.ogg +- x_farming_bee.4.ogg +- x_farming_bee.5.ogg +- x_farming_bee.6.ogg +- x_farming_bee.7.ogg + +**CC0-1.0, by niittymaa**, https://freesound.org/people/niittymaa/sounds/666969/ + +- x_farming_slime_footstep.1.ogg +- x_farming_slime_footstep.2.ogg +- x_farming_slime_footstep.3.ogg +- x_farming_slime_footstep.4.ogg + +**CC0-1.0, by EminYILDIRIM**, https://freesound.org/people/EminYILDIRIM/sounds/544636/ + +- x_farming_slime_dug.1.ogg +- x_farming_slime_dug.2.ogg +- x_farming_slime_dug.3.ogg + +**CC0-1.0, by jtap97**, https://freesound.org/people/jtap97/sounds/448885/ + +- x_farming_slime_dig.1.ogg +- x_farming_slime_dig.2.ogg +- x_farming_slime_dig.3.ogg + +**CC0-1.0, by kyles**, https://freesound.org + +- x_farming_dirt_hit.1.ogg +- x_farming_dirt_hit.2.ogg +- x_farming_dirt_hit.3.ogg + +**CC-BY-4.0, by RICHERlandTV**, https://freesound.org + +- x_farming_wood_place.1.ogg +- x_farming_wood_place.2.ogg +- x_farming_wood_place.3.ogg + +**CC0-1.0, by igroglaz**, https://freesound.org + +- x_farming_wood_hit.1.ogg +- x_farming_wood_hit.2.ogg +- x_farming_wood_hit.3.ogg +- x_farming_wood_hit.4.ogg +- x_farming_wood_hit.5.ogg +- x_farming_wood_hit.6.ogg + +**CC0-1.0, by Fission9**, https://freesound.org + +- x_farming_dirt_footstep.1.ogg +- x_farming_dirt_footstep.2.ogg +- x_farming_dirt_footstep.3.ogg +- x_farming_dirt_footstep.4.ogg +- x_farming_wood_footstep.1.ogg +- x_farming_wood_footstep.2.ogg +- x_farming_wood_footstep.3.ogg +- x_farming_wood_footstep.4.ogg +- x_farming_wood_footstep.5.ogg +- x_farming_wood_footstep.6.ogg + +**CC-BY-4.0, by HerbertBoland**, https://freesound.org/people/AtevonHes/sounds/454783/ + +- x_farming_tool_breaks.1.ogg +- x_farming_tool_breaks.2.ogg +- x_farming_tool_breaks.3.ogg + +**CC-BY-3.0, by Mito551**, https://freesound.org + +- x_farming_thin_glass_footstep.ogg + +**CC-BY-4.0, by F.M.Audio**, https://freesound.org + +- x_farming_stone_place.1.ogg +- x_farming_stone_place.2.ogg +- x_farming_stone_place.3.ogg +- x_farming_stone_place.4.ogg + + +**CC0-1.0, by lolamadeus**, https://freesound.org + +- x_farming_stone_hit.1.ogg +- x_farming_stone_hit.2.ogg +- x_farming_stone_hit.3.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org + +- x_farming_stone_dug.1.ogg +- x_farming_stone_dug.2.ogg +- x_farming_stone_dug.3.ogg +- x_farming_stone_footstep.1.ogg +- x_farming_stone_footstep.2.ogg +- x_farming_stone_footstep.3.ogg +- x_farming_stone_footstep.4.ogg +- x_farming_stone_footstep.5.ogg + +**CC-BY-3.0, by Coral_Island_Studios**, https://freesound.org + +- x_farming_sand_place.1.ogg +- x_farming_sand_place.2.ogg +- x_farming_sand_place.3.ogg +- x_farming_sand_place.4.ogg +- x_farming_sand_place.5.ogg + +**CC0-1.0, by Lukeo135**, https://freesound.org + +- x_farming_sand_hit.1.ogg +- x_farming_sand_hit.2.ogg +- x_farming_sand_hit.3.ogg + +**CC0-1.0, by pan14**, https://freesound.org + +- x_farming_sand_footstep.1.ogg +- x_farming_sand_footstep.2.ogg +- x_farming_sand_footstep.3.ogg + +**CC0-1.0, by schneidi67**, https://freesound.org + +- x_farming_sand_dug.1.ogg +- x_farming_sand_dug.2.ogg +- x_farming_sand_dug.3.ogg + +**CC0-1.0, by vgraham1**, https://freesound.org + +- x_farming_leaves_place.1.ogg +- x_farming_leaves_place.2.ogg + +**CC-BY-4.0, by Abacagi**, https://freesound.org + +- x_farming_leaves_hit.1.ogg +- x_farming_leaves_hit.2.ogg + +**CC-BY-4.0, by elektroproleter**, https://freesound.org + +- x_farming_leaves_footstep.1.ogg +- x_farming_leaves_footstep.2.ogg +- x_farming_leaves_footstep.3.ogg +- x_farming_leaves_footstep.4.ogg + +**CC-BY-4.0, by JanKoehl**, https://freesound.org + +- x_farming_leaves_dug.1.ogg +- x_farming_leaves_dug.2.ogg + +**CC-BY-4.0, by EminYILDIRIM**, https://freesound.org + +- x_farming_ice_hit.1.ogg +- x_farming_ice_hit.2.ogg +- x_farming_ice_hit.3.ogg +- x_farming_ice_hit.4.ogg + +**CC-BY-4.0, by InspectorJ**, https://freesound.org + +- x_farming_ice_footstep.1.ogg +- x_farming_ice_footstep.2.ogg +- x_farming_ice_footstep.3.ogg +- x_farming_ice_footstep.4.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org + +- x_farming_grass_hit.1.ogg +- x_farming_grass_hit.3.ogg +- x_farming_grass_hit.2.ogg + +**CC0-1.0, by Yuval**, https://freesound.org + +- x_farming_grass_footstep.1.ogg +- x_farming_grass_footstep.2.ogg +- x_farming_grass_footstep.3.ogg + +**CC0-1.0, by Robson220pl**, https://freesound.org + +- x_farming_glass_place.1.ogg +- x_farming_glass_place.2.ogg +- x_farming_glass_place.3.ogg + +**CC-BY-3.0, by cmusounddesign**, http://www.freesound.org/people/cmusounddesign/sounds/71947/ + +- x_farming_break_thin_glass.1.ogg + +**CC-BY-3.0, by Tomlija**, http://www.freesound.org/people/Tomlija/sounds/97669/ + +- x_farming_break_thin_glass.2.ogg + +**CC-BY-3.0, by lsprice**, http://www.freesound.org/people/lsprice/sounds/88808/ + +- x_farming_break_thin_glass.3.ogg + +**CC0-1.0, by 16FThumaF**, https://freesound.org/people/16FThumaF/sounds/499020/ + +- x_farming_extinguish_candle.ogg + +**CC0-1.0, by bahaish**, https://freesound.org/people/bahaish/sounds/145786/ + +- x_farming_rope_footstep.1.ogg +- x_farming_rope_footstep.2.ogg +- x_farming_rope_footstep.3.ogg +- x_farming_rope_footstep.4.ogg + +**CC0-1.0, by dansotak**, https://freesound.org/people/dansotak/sounds/137711/ + +- x_farming_rope_hit.1.ogg +- x_farming_rope_hit.2.ogg +- x_farming_rope_hit.3.ogg +- x_farming_rope_hit.4.ogg + +**CC-BY-4.0, by Benboncan**, +https://freesound.org/people/Benboncan/sounds/78248/ +https://freesound.org/people/Benboncan/sounds/78249/ +https://freesound.org/people/Benboncan/sounds/78250/ + +- x_farming_rope_dug.1.ogg +- x_farming_rope_dug.2.ogg +- x_farming_rope_dug.3.ogg + +**CC0-1.0, by cmorris035**, https://freesound.org/people/cmorris035/sounds/207275/ + +- x_farming_pillow_footstep.1.ogg +- x_farming_pillow_footstep.2.ogg +- x_farming_pillow_footstep.3.ogg +- x_farming_pillow_footstep.4.ogg +- x_farming_pillow_dug.1.ogg +- x_farming_pillow_dug.2.ogg +- x_farming_pillow_dug.3.ogg + +**CC0-1.0, by Jay_You**, https://freesound.org/people/Jay_You/sounds/538744/ + +- x_farming_pillow_hit.1.ogg +- x_farming_pillow_hit.2.ogg +- x_farming_pillow_hit.3.ogg +- x_farming_pillow_hit.4.ogg + +**CC-BY-3.0, by nebulousflynn**, https://freesound.org/people/nebulousflynn/sounds/269062/ + +- x_farming_stove_active.ogg + +**CC0-1.0, by ToniTobe**, https://freesound.org/people/ToniTobe/sounds/233294/ + +- x_farming_stove_sizzle.1.ogg +- x_farming_stove_sizzle.3.ogg +- x_farming_stove_sizzle.2.ogg + +**CC-BY-3.0, by Quistard**, https://freesound.org/people/Quistard/sounds/240234/ + +- x_farming_stove_sizzle_put.1.ogg +- x_farming_stove_sizzle_put.2.ogg +- x_farming_stove_sizzle_put.3.ogg + +**CC-BY-3.0, by youandbiscuitme**, +https://freesound.org/people/youandbiscuitme/sounds/258248/ +https://freesound.org/people/youandbiscuitme/sounds/258247/ +https://freesound.org/people/youandbiscuitme/sounds/258246/ + +- x_farming_wooden_bowl.1.ogg +- x_farming_wooden_bowl.2.ogg +- x_farming_wooden_bowl.3.ogg + +### Models + +**CC-BY-SA-4.0, by SaKeL** + +- x_farming_hog_stew.obj +- x_farming_beetroot_soup.obj +- x_farming_pumpkin_pie.obj +- x_farming_kiwi_fruit.obj +- x_farming_corn_popcorn.obj +- x_farming_fries.obj +- x_farming_coffee_cup_hot.obj +- x_farming_donut.obj +- x_farming_crate.obj +- x_farming_bag.obj +- x_farming_scarecrow.obj +- x_farming_scarecrow_2.obj +- x_farming_bee.obj +- x_farming_honey.obj +- x_farming_candle_1.obj +- x_farming_candle_2.obj +- x_farming_candle_3.obj +- x_farming_candle_4.obj +- x_farming_baked_fish.obj +- x_farming_french_potatoes.obj +- x_farming_melon_slush.obj +- x_farming_pie.obj diff --git a/mods/x_farming/README.md b/mods/x_farming/README.md new file mode 100644 index 00000000..f5905476 --- /dev/null +++ b/mods/x_farming/README.md @@ -0,0 +1,438 @@ +# X Farming [x_farming] + +Farming with new plants, crops and ice fishing. + +![screenshot](screenshot.png) + +## Description + +Hunger points in the description assume that you have [hbhubger](https://forum.minetest.net/viewtopic.php?t=11336) with hunger mod configured with x_farming. If not then you can consider hunger points as health points. + +## Features + +- shareable food items +- stove +- ropes, rope fence, rope safety net +- candles (with colors) +- adds bees, bee hives and honey harvesting +- compatible with Mineclone +- compatible with Everness +- adds christmas tree +- adds scarecrow +- adds food source to almost every biome, allows traveling the world without relying on apples only +- block farming, instead of food items, blocks can be harvested/crafted and used for building or decoration +- adds ice fishing - farming fish based on biomes and amount of ice around +- farming on different block than dirt, e.g. obsidian, jungle tree.. +- farming in dark, no need for light for farming, e.g. obsidian wart +- vertical farming, e.g. farming cocoa on jungle tree trunk +- new trees and wood blocks allows for tree farms +- food items can heal or poison you +- some food items can be placed and used as decoration +- some food items can grow back on trees/cactus after harvesting +- using combination of snow block and pumpkin can spawn snowman mob +- mod is lightweight and optimized for servers +- plants and trees are spawning as decoration troughout the world (see biomes below) +- stairs and slabs for all new blocks +- leafdecay with falling fruit after tree trunk is harvested +- supports hbhunger mod +- crates and bags for storage (holds 1 stack) +- composter + +### Composter + +Right-click/place action with most plants, leaves, harvest, grass... will create/add compost. Once full another right-click/place action will give back bonemeal. +Each item has different chance for creating compost. In general items harder to obtain have higher chance of creating compost. +Additionally other mods can add group `{compost = 50}` to the items, where the number is chance of creating compost. + +### Crates and Bags + +Crafting crate/bag will give you empty crate/bag and can be used as a storage for raw farming items. Storage holds up to 1 stack making it work as "place-able" stacks. Crate/bag can be dug and carried while remembering the contents of the crate/bag. After placing the crate/bag you can access the contents again with right click (or the key by placing the node). List of items what can be placed in crates: melon, pumpkin_block, coffee, corn, obsidian_wart, potato, beetroot, carrot, cocoa_bean, kiwi_fruit, cactus_fruit_item, strawberry, pine_nut, stevia, soybean, fish, wheat, cotton. List of items what can be placed in bags: salt. + +### Empty Soup Bowl ![screenshot](textures/x_farming_bowl.png) + +Empty soup bowl is used as a vessel for soups and stew. To craft bowl put any kind of block with group wood in the middle of the bottom row in the crafting grid and then diagonal left and right also the same block, this will give you 3 empty soup bowls. + +### Fish Stew ![screenshot](textures/x_farming_fish_stew.png) + +Eating fish stew will restore 8 hunger points. To craft fish stew put empty soup bowl in the middle of the bottom row of the crafting grid, then bake potato above it, right from the potato will come salt, left from the potato will come carrot, then on top of the potato put any fish. + +### Beetroot ![screenshot](textures/x_farming_beetroot.png) + +Beetroots are obtained from harvesting a fully grown crop plant, which drops the beetroot and seeds. +Beetroots can be eaten to restore 3 hunger points. + +**Beetroot Soup** ![screenshot](textures/x_farming_beetroot_soup.png) + +Beetroots soup can be eaten to restore 6 hunger points. +To craft beetroot soup put beetroot in the first two rows in the crafting grid and in the middle of the bottom row empty soup bowl. + +### Carrot ![screenshot](textures/x_farming_carrot.png) + +Carrot can be farmed and harvested on wet soil. Planted carrots take 8 stages to grow and go through 4 visually distinct stages. +Eating a carrot restores 3 hunger points. +Carrot can be used as an ingredient for hog stew. + +**Golden Carrot** ![screenshot](textures/x_farming_carrot_golden.png) + +Eating golden carrot will restore 10 hunger points and 10 health points - the highest values currently in x_farming mod. +To craft golden carrot put regular carrot in the middle of the crafting grid and surround it with golden lumps. + +### Coffee ![screenshot](textures/x_farming_coffee.png) + +Planted coffee take 5 stages to grow. Farming coffee plants will drop coffee beans. Coffee beans cannot be eaten but are used to craft cup of coffee. + +**Coffee Cup (hot)** ![screenshot](textures/x_farming_coffee_cup_hot.png) + +Drinking/eating hot cup of coffee will restore 6 hunger points, 4 health points and will return a empty glass. +Hot cup of coffee can be obtained by cooking cold cup of coffee in a furnace. +Coffee cup can be placed as a block in the world for decoration. + +### Corn ![screenshot](textures/x_farming_corn.png) + +When farmed, corn will take 10 stages to grow. +Corn cannot be eaten but is used for crafting popped corn. + +**Popped Corn** ![screenshot](textures/x_farming_corn_pop.png) + +Eating popped corn will restore 1 hunger point. +Popped corn can be obtained by cooking corn cobin a furnace. +Pooped corn can be furhter used for crafting popcorn. + +**Popcorn** ![screenshot](textures/x_farming_corn_popcorn.png) + +Eating popcorn will restore 5 hunger points. +Popcorn can be crafted by adding popped corn in the first row of the crafting grid and surround the rest of the grid with paper leaving the middle input empty. +Popcorn can be placed as a block in the world for decoration. + +### Melon ![screenshot](textures/x_farming_melon.png) + +Farming melons will generate melon block in the last stage of growth. When harvesting this block and leaving the melon stem intact the melon block will grow from the stem again (in about 1 minetest day). The placement of the melon is completely random around the stem and it needs to have space 1 air in order to grow the melon block. +Melon fruit will drop melon slices. +Eeting melon slices will restore 2 health points. +Melon slices can be used for crafting melon block. + +**Golden Melon** ![screenshot](textures/x_farming_golden_melon.png) + +Eating golden melon slice will restore 10 hunger points and 10 health points - the highest values currently in x_farming mod. +To craft golden melon slice put melon slice in the middle of the crafting grid and surround it with golden lumps. + +**Melon Block** ![screenshot](textures/x_farming_melon_fruit_side.png) + +Melon block cannot be eating nor crafted to seeds or melon slices. +Melon block can placed in to the world as a building block or for decoration. +To craft melon block fill the crafting grid with melon slices. + +### Obsidian Wart ![screenshot](textures/x_farming_obsidian_wart.png) + +When planted on plowed and wet obsidian soil, obsidian wart will grow through 6 stages. The growth rate is not affected by light or any other environmental factors. +Harvesting obsidian wart plant will drop obsidian wart what can be used for further crafting (see below). + +**Wart Brick** ![screenshot](textures/x_farming_wart_brick.png) + +Wart brick can be obtained by cooking obsidian wart in a furnace. +Wart brick is used for furhter crafting. + +**Wart Block** ![screenshot](textures/x_farming_wart_block.png) + +Wart block is used as a building block and for decoration. +To craft wart block fill the crafting grid with obsidian wart. + +**Wart Brick Block** ![screenshot](textures/x_farming_wart_brick_block.png) + +Wart brick block is used as a building block and for decoration. +To craft wart brick block put wart brick next to wart brick to the first row of crafting grid and wart brick next to wart brick to the second row. + +**Wart Red Brick Block** ![screenshot](textures/x_farming_wart_red_brick_block.png) + +Wart red brick block is used as a building block and for decoration. +To craft wart red brick block put obsidian wart and wart brick to the first row of crafting grid and wart brick and obsidian wart to the second row. + +**Wartrack** ![screenshot](textures/x_farming_wartrack.png) + +Wartrack is used as a building block and for decoration. +To craft wartrack put two wart blocks next to each other in first and second row of the crafting grid. This will return 4 wartracks. + +All wart blocks includes slabs and stairs. + +### Potato ![screenshot](textures/x_farming_potato.png) + +When farmed, potatoes will take 8 stages to grow. However, there are only 4 distinct textures, so only 4 visible stages. +Fully grown potato crops have chance of dropping an additional poisonous potato. +Eating a potato restores 2 hunger points. + +**Baked potato** ![screenshot](textures/x_farming_potato_baked.png) + +Baked potato can be obtained by cooking potato in a furnace. +Eating a baked potato restores 6 hunger points. +Baked potato can be used as an ingredient for hog stew. + +**Poisonous potato** ![screenshot](textures/x_farming_potato_poisonous.png) + +The poisonous potato is a rare drop when harvesting potato crops. +Eating a poisonous potato reduces 6 hunger points and 5 health points. +Poisonous potato cannot be planted on soil or baked. + +### Pumpkin ![screenshot](textures/x_farming_pumpkin.png) + +Farming pumpkin will generate pumpkin block in the last stage of growth. When harvesting this block and leaving the pumpkin stem intact the pumpkin block will grow from the stem again (in about 1 minetest day). The placement of the pumpkin is completely random around the stem and it needs to have space 1 air in order to grow the pumpkin block. +Pumpkin fruit/block will drop pumpking block. +Pumpking block can be used for crafting pumpkin pie, pumpkin lantern or can be used as a fuel (better than cactus). + +**Pumpkin lantern** ![screenshot](textures/x_farming_pumpkin_fruit_side_on.png) + +Pumpkin lantern gives the same light as torch but it's not flowed away by water. +To craft pumpkin lantern place torch in the middle of the crafting grid and put pumpkin block above it. +Pumpking lantern can be used as a fuel (better than cactus). + +**Pumpkin pie** ![screenshot](textures/x_farming_pumpkin_pie.png) + +Eating pumpkin pie will restore 6 healt points. +To craft pumpkin pie put pumpkin block in the second row of the crafting grid, then flour next to it and egg below the flower. +Egg is currently dependent on [mobs redo](https://github.com/tenplus1/mobs_redo) mod. + +**Snow golem** ![screenshot](textures/x_farming_pumpkin_fruit_side_off.png) + +When [mobs npc installed with snow golem mob](https://bitbucket.org/minetest_gamers/mobs_npc/overview), placing 2 snowblocks vertically ending up with pumpkin block or pumpkin lantern a snow golem NPC will spawn. This mob is not tamed. You can tame snow golem with bread, meat or diamond. Snow golem will follow you and help you fight mobs or can stay in place (right click). Giving snow golem a gold lump will drop random item. + +### Cocoa + +Cocoa is planted on jungletree using cocoa bean and fully grown cocoa will drop cocoa bean. From cocoa bean you can further craft eat items. Cocoa have 3 stages of growth. + +### Kiwi Tree + +Kiwi tree can be found in savana and drops kiwi fruit and sapling from leaves. This tree adds new tree trunk and wood planks also (including stairs and slabs). Kiwi fruit will grow back on the tree after harvested from the tree enabling farming Kiwis. Can be placed as a decoration. + +### Large Cactus with Fruit + +Cactus with Fruits can be found in desert. You will need axe to harvest the fruit. Fruit will grow back on cactus after harvested - enabling harvesting Dragon Fruits. Can be placed as a decoration. Seedling can be crafted for more farming and harvesting. + +### Strawberry + +Strawberries can be found in coniferous forest. They drop seeds and strawberries. + +### Pine Nut Tree + +Allows to harvest pine nuts. Roasted pine nuts can be eaten. + +### Salt + +Can be farmed as ingredient to craft other food recipes. + +### Ice Fishing + +Ice fish for getting various kinds of fish, treasures and junk. What type of fish you get depends on the biome where you'r fishing and how many ice blocks are directly around your fishing equipment (there has to be space above the ice and nothing can obstruct the ice otherwise it will not count). For planting you fishing equipment you need to first drill a hole in ice using Ice Auger. Ice fishing equipment can be crafted, occasionally dropped out from digging your ice fishing equipment and can also spawn in cold biomes. + +## Biomes + +**Grassland** + +- Melon +- Carrot +- Soybean + +**Coniferous Forest** + +- Strawberry +- Pine Nut Tree + +**Desert** + +- Large Cactus with Fruit (dragon fruit) + +**Savanna** + +- Kiwi Tree +- Coffee +- Stevia + +**Rainforest** + +- Cocoa + +**Underground** + +- Obsidian Wart (below -1000) + +**Sandstone desert** + +- Corn +- Pumpkin + +**Cold desert** + +- Potato +- Beetroot + +**Taiga** + +- Pine Nut Tree + +**Rainforest Swamp** + +- Salt +- Swamp Darter +- Swamp Frog +- Sturgeon +- Sunfish +- Swordfish + +**Savanna Shore** + +- Salt +- Angelfish +- Lingcod +- Lukewarm Ocean Hermit Crab +- Magma Slimefish +- Manta Ray + +**Icesheet Ocean** + +- Angler +- Frozen Boneminnow +- Frozen Ocean Hermit Crab +- Paddlefish +- Pearl Isopod + +**Taiga Ocean** + +- Armored Catfish +- Gar +- Giant Moray +- Perch +- Piglish + +**Desert Ocean** + +- Arrow Squid +- Desert Frog +- Desert Sunfish +- Piranha +- Prismfish +- Pumpkinseed + +**Tundra Ocean** + +- Barracuda +- Flier +- Floral Faefish +- Flounder +- Fourhorn Sculpin + +**Snowy Grassland Ocean** + +- Grass Pickerel +- Guppy +- Hagfish +- Rainbowfish +- Red Snapper + +**Coniferous Forest Ocean** + +- Bream +- Redbreast Sunfish +- Rockfish +- Rohu +- Rosefish + +**Grassland Ocean** + +- Conger +- Sablefish +- Sardine +- Sawfish +- Skate +- Skullfin + +**Savanna Ocean** + +- Chorus Snail +- White Bullhead +- Whitefish +- Wolffish +- Woodskip + +**Cold Desert Ocean** + +- Chub +- Cold Ocean Hermit Crab +- Oscar +- Leerfish + +**Sandstone Desert Ocean** + +- Clam +- Skykoi +- Smallmouth Bass +- Sterlet + +**Deciduous Forest Ocean** + +- Crayfish +- Damselfish +- Danios +- Vampire Squid +- Walleye +- Warm Ocean Hermit Crab + +**Rainforest Ocean** + +- Burbot +- Koi +- Lamprey +- Largemouth Bass +- Lava Eel +- Leech + +**Icesheet** + +- Dwarf Caiman +- Eel +- Electric Eel +- Endray +- Tench + +**Tundra Beach** + +- Carp +- Catfish +- Catla +- Ocean Hermit Crab +- Octopus + +**Deciduous Forest Shore** + +- Congo Tiger Fish +- Convict Cichlid +- Minnow +- Mud Flounder +- Neon Tetra + +Seeds can be found also in dungeon chests. + +## Dependencies + +- _none_ + +## Optional Dependencies + +- default +- farming +- hbhunger +- stairs +- wool +- dye +- vessels (recipes, if not present then x_farming will load its own vessels needed for recipe) +- bucket (recipes) +- mcl_core +- mcl_farming +- mcl_potions +- hunger_ng +- mcl_stairs + +## License: + +- see attached LICENSE.txt file + +## Installation + +see: https://wiki.minetest.net/Installing_Mods diff --git a/mods/x_farming/api.lua b/mods/x_farming/api.lua new file mode 100644 index 00000000..d189710d --- /dev/null +++ b/mods/x_farming/api.lua @@ -0,0 +1,2940 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- main class +x_farming = { + hunger_ng = minetest.get_modpath('hunger_ng'), + hbhunger = minetest.get_modpath('hbhunger'), + vessels = minetest.get_modpath('vessels'), + bucket = minetest.get_modpath('bucket'), + colors = { + brown = '#DEB887', + red = '#FF8080', + green = '#98E698' + }, + x_bonemeal = { + tree_defs = { + ['x_farming:christmas_tree_sapling'] = { + -- christmas tree + name = 'x_farming:christmas_tree_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + x_farming.grow_christmas_tree(pos) + + return true + end + }, + ['x_farming:kiwi_sapling'] = { + -- Kiwi Tree + name = 'x_farming:kiwi_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + x_farming.grow_kiwi_tree(pos) + + return true + end + }, + ['x_farming:large_cactus_with_fruit_seedling'] = { + -- Cactus Seedling + name = 'x_farming:large_cactus_with_fruit_seedling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_sand(pos) then + return false + end + + x_farming.grow_large_cactus(pos) + + return true + end + }, + ['x_farming:jungle_with_cocoa_sapling'] = { + -- Jungle Tree with Cocoa + name = 'x_farming:jungle_with_cocoa_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + x_farming.grow_jungle_tree(pos) + + return true + end + }, + ['x_farming:pine_nut_sapling'] = { + -- Pine Nut Tree + name = 'x_farming:pine_nut_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + x_farming.grow_pine_nut_tree(pos) + + return true + end + }, + } + }, + allowed_crate_items = {}, + allowed_bag_items = {}, + registered_crates = {}, + lbm_nodenames_crates = {}, + registered_plants = {}, + mcl = {}, + candle_colors = { + black = { + name = S('Black'), + hex = '#2B2B2B', + mcl_groups = { basecolor_black = 1, excolor_black = 1, unicolor_black = 1 } + }, + dark_grey = { + name = S('Dark Grey'), + hex = '#4E4E4E', + mcl_groups = { basecolor_grey = 1, excolor_darkgrey = 1, unicolor_darkgrey = 1 } + }, + grey = { + name = S('Grey'), + hex = '#A5A5A5', + mcl_groups = { basecolor_grey = 1, excolor_grey = 1, unicolor_grey = 1 } + }, + red = { + name = S('Red'), + hex = '#AB5C4A', + mcl_groups = { basecolor_red = 1, excolor_red = 1, unicolor_red = 1 } + }, + violet = { + name = S('Violet'), + hex = '#595287', + mcl_groups = { basecolor_magenta = 1, excolor_violet = 1, unicolor_violet = 1 } + }, + magenta = { + name = S('Magenta'), + hex = '#A25B5D', + mcl_groups = { basecolor_magenta = 1, excolor_red_violet = 1, unicolor_red_violet = 1 } + }, + pink = { + name = S('Pink'), + hex = '#FFA6A6', + mcl_groups = { basecolor_red = 1, excolor_red = 1, unicolor_light_red = 1 } + }, + dark_green = { + name = S('Dark Green'), + hex = '#556E48', + mcl_groups = { basecolor_green = 1, excolor_green = 1, unicolor_dark_green = 1 } + }, + green = { + name = S('Green'), + hex = '#779154', + mcl_groups = { basecolor_green = 1, excolor_green = 1, unicolor_green = 1 } + }, + cyan = { + name = S('Cyan'), + hex = '#4E7683', + mcl_groups = { basecolor_cyan = 1, excolor_cyan = 1, unicolor_cyan = 1 } + }, + blue = { + name = S('Blue'), + hex = '#4B6696', + mcl_groups = { basecolor_blue = 1, excolor_blue = 1, unicolor_blue = 1 } + }, + light_blue = { + name = S('Light Blue'), + hex = '#648CB4', + craft_dye = 'group:dye,color_light_blue', + mcl_groups = { basecolor_blue = 1, excolor_blue = 1, unicolor_light_blue = 1 } + }, + orange = { + name = S('Orange'), + hex = '#A86A4D', + mcl_groups = { basecolor_orange = 1, excolor_orange = 1, unicolor_orange = 1 } + }, + yellow = { + name = S('Yellow'), + hex = '#BD8D39', + mcl_groups = { basecolor_yellow = 1, excolor_yellow = 1, unicolor_yellow = 1 } + }, + brown = { + name = S('Brown'), + hex = '#684E45', + mcl_groups = { basecolor_brown = 1, excolor_orange = 1, unicolor_dark_orange = 1 } + } + }, +} + +function x_farming.node_sound_grass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_grass_footstep', gain = 0.4 } + table.dig = table.dig or { name = 'x_farming_grass_hit', gain = 1.2 } + table.dug = table.dug or { name = 'x_farming_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'x_farming_dirt_hit', gain = 1.0 } + return table +end + +function x_farming.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_leaves_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'x_farming_leaves_hit', gain = 0.25 } + table.dug = table.dug or { name = 'x_farming_leaves_dug', gain = 0.5 } + table.place = table.place or { name = 'x_farming_leaves_place', gain = 0.4 } + return table +end + +function x_farming.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_wood_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'x_farming_wood_hit', gain = 0.5 } + table.dug = table.dug or { name = 'x_farming_wood_place', gain = 0.1 } + table.place = table.place or { name = 'x_farming_wood_place', gain = 0.15 } + return table +end + +function x_farming.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_sand_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'x_farming_sand_hit', gain = 0.5 } + table.dug = table.dug or { name = 'x_farming_sand_dug', gain = 0.1 } + table.place = table.place or { name = 'x_farming_sand_place', gain = 0.15 } + return table +end + +function x_farming.node_sound_thin_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_thin_glass_footstep', gain = 0.3 } + table.dig = table.dig or { name = 'x_farming_thin_glass_footstep', gain = 0.5 } + table.dug = table.dug or { name = 'x_farming_break_thin_glass', gain = 1.0 } + table.place = table.place or { name = 'x_farming_glass_place', gain = 0.2 } + return table +end + +function x_farming.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_dirt_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'x_farming_dirt_hit', gain = 0.4 } + table.dug = table.dug or { name = 'x_farming_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'x_farming_dirt_hit', gain = 1.0 } + return table +end + +function x_farming.node_sound_ice_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_ice_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'x_farming_ice_hit', gain = 0.4 } + table.dug = table.dug or { name = 'x_farming_ice_hit', gain = 1.0 } + table.place = table.place or { name = 'x_farming_ice_hit', gain = 1.0 } + return table +end + +function x_farming.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_stone_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'x_farming_stone_hit', gain = 1.0 } + table.dug = table.dug or { name = 'x_farming_stone_dug', gain = 0.6 } + table.place = table.place or { name = 'x_farming_stone_place', gain = 1.0 } + return table +end + +function x_farming.node_sound_slime_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_slime_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'x_farming_slime_dig', gain = 1.0 } + table.dug = table.dug or { name = 'x_farming_slime_dug', gain = 0.3 } + table.place = table.place or { name = 'x_farming_slime_footstep', gain = 1.0 } + return table +end + +function x_farming.node_sound_rope_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_rope_footstep', gain = 0.05 } + table.dig = table.dig or { name = 'x_farming_rope_hit', gain = 0.7 } + table.dug = table.dug or { name = 'x_farming_rope_dug', gain = 0.2 } + table.place = table.place or { name = 'x_farming_rope_hit', gain = 0.8 } + return table +end + +function x_farming.node_sound_pillow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'x_farming_pillow_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'x_farming_pillow_hit', gain = 0.15 } + table.dug = table.dug or { name = 'x_farming_pillow_dug', gain = 0.2 } + table.place = table.place or { name = 'x_farming_pillow_footstep', gain = 0.25 } + return table +end + +---how often node timers for plants will tick, +/- some random value +function x_farming.tick_block(pos) + minetest.get_node_timer(pos):start(math.random(498, 1287)) +end + +---how often a growth failure tick is retried (e.g. too dark) +function x_farming.tick_block_short(pos) + minetest.get_node_timer(pos):start(math.random(332, 858)) +end + +-- how often node timers for plants will tick, +/- some random value +function x_farming.tick(pos) + minetest.get_node_timer(pos):start(math.random(166, 286)) +end +-- how often a growth failure tick is retried (e.g. too dark) +function x_farming.tick_again(pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +---just shorthand for minetest metadata handling +function x_farming.meta_get_str(key, pos) + local meta = minetest.get_meta(pos) + return meta:get_string(key) +end + +---just shorthand for minetest metadata handling +function x_farming.meta_set_str(key, value, pos) + local meta = minetest.get_meta(pos) + meta:set_string(key, value) +end + +---merge two indexed tables +function x_farming.mergeTables(t1, t2) + local _t1 = { unpack(t1) } + local _t2 = { unpack(t2) } + + for k, v in ipairs(_t2) do + table.insert(_t1, v) + end + + return _t1 +end + +---Change an entire string to Title Case (i.e. capitalise the first letter of each word) +function x_farming.tchelper(first, rest) + return first:upper() .. rest:lower() +end + +--- Hoes - copy from MTG + +x_farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= 'node' then + return + end + + local under = minetest.get_node(pt.under) + local p = { x = pt.under.x, y = pt.under.y + 1, z = pt.under.z } + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= 'air' then + return + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, 'soil') ~= 1 then + return + end + + -- check if (wet) soil defined + local regN = minetest.registered_nodes + if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then + return + end + + local player_name = user and user:get_player_name() or '' + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + -- turn the node into soil and play sound + minetest.set_node(pt.under, { name = regN[under.name].soil.dry }) + minetest.sound_play('x_farming_dirt_hit', { + pos = pt.under, + gain = 0.3, + }, true) + + if not minetest.is_creative_enabled(player_name) then + -- wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear_by_uses(uses) + -- tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pt.above, + gain = 0.5}, true) + end + end + return itemstack +end + +-- Register new hoes +x_farming.register_hoe = function(name, def) + local _def = table.copy(def) + -- Check for : prefix (register new hoes in your mod's namespace) + if name:sub(1, 1) ~= ':' then + name = ':' .. name + end + -- Check def table + if _def.description == nil then + _def.description = S('Hoe') + end + if _def.inventory_image == nil then + _def.inventory_image = 'x_farming_unknown_item.png' + end + if _def.max_uses == nil then + _def.max_uses = 30 + end + + if minetest.get_modpath('farming') then + _def.on_use = function(itemstack, user, pointed_thing) + return x_farming.hoe_on_use(itemstack, user, pointed_thing, _def.max_uses) + end + end + + if minetest.get_modpath('mcl_farming') then + _def.on_place = x_farming.mcl.hoe_on_place_function(_def.max_uses) + end + + -- MCL + _def.groups = _def.groups + _def.sound = { breaks = 'x_farming_tool_breaks' } + _def.wield_scale = _def.wield_scale or { x = 1, y = 1, z = 1 } + + -- Register the tool + minetest.register_tool(name, _def) + -- Register its recipe + if _def.recipe then + minetest.register_craft({ + output = name:sub(2), + recipe = _def.recipe + }) + elseif _def.material then + minetest.register_craft({ + output = name:sub(2), + recipe = { + { _def.material, 'group:stick' }, + { _def.material, 'group:stick' }, + { '', 'group:stick' } + } + }) + end +end + +-- +-- Log API / helpers - copy from MTG +-- + +local log_non_player_actions = minetest.settings:get_bool('log_non_player_actions', false) + +local is_pos = function(v) + return type(v) == 'table' and + type(v.x) == 'number' and type(v.y) == 'number' and type(v.z) == 'number' +end + +function x_farming.log_player_action(player, ...) + local msg = player:get_player_name() + if player.is_fake_player or not player:is_player() then + if not log_non_player_actions then + return + end + msg = msg .. '(' .. (type(player.is_fake_player) == 'string' + and player.is_fake_player or '*') .. ')' + end + for _, v in ipairs({ ... }) do + -- translate pos + local part = is_pos(v) and minetest.pos_to_string(v) or v + -- no leading spaces before punctuation marks + msg = msg .. (string.match(part, '^[;,.]') and '' or ' ') .. part + end + minetest.log('action', msg) +end + +function x_farming.set_inventory_action_loggers(def, name) + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + x_farming.log_player_action(player, 'moves stuff in', name, 'at', pos) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + x_farming.log_player_action(player, 'moves', stack:get_name(), 'to', name, 'at', pos) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + x_farming.log_player_action(player, 'takes', stack:get_name(), 'from', name, 'at', pos) + end +end + +-- +-- Sapling 'on place' function to check protection of node and resulting tree volume +-- + +function x_farming.sapling_on_place(itemstack, placer, pointed_thing, sapling_name, minp_relative, maxp_relative, interval) + -- Position of sapling + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local pdef = node and minetest.registered_nodes[node.name] + + if not node then + return itemstack + end + + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) + then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + if not pdef or not pdef.buildable_to then + pos = pointed_thing.above + node = minetest.get_node_or_nil(pos) + pdef = node and minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local player_name = placer and placer:get_player_name() or '' + + -- Check sapling position for protection + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + -- Check tree volume for protection + if minetest.is_area_protected( + vector.add(pos, minp_relative), + vector.add(pos, maxp_relative), + player_name, + interval) then + minetest.record_protection_violation(pos, player_name) + -- Print extra information to explain + -- minetest.chat_send_player(player_name, + -- itemstack:get_definition().description .. ' will intersect protection ' .. + -- 'on growth') + minetest.chat_send_player( + player_name, + S('@1 will intersect protection on growth.', itemstack:get_definition().description) + ) + return itemstack + end + + x_farming.log_player_action(placer, 'places node', sapling_name, 'at', pos) + + local take_item = not minetest.is_creative_enabled(player_name) + local newnode = { name = sapling_name } + local ndef = minetest.registered_nodes[sapling_name] + minetest.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + return itemstack +end + +-- +-- Leafdecay +-- + +-- Prevent decay of placed leaves + +function x_farming.after_place_leaves(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end +end + +-- Leafdecay +local function leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), vector.add(pos, def.radius), def.leaves)) do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if (node.param2 ~= 1 or minetest.get_item_group('cocoa') == 0) and not timer:is_started() then + timer:start(math.random(20, 120) / 10) + end + end +end + +local movement_gravity = tonumber(minetest.settings:get('movement_gravity')) or 9.81 + +local function leafdecay_on_timer(pos, def) + if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + + if minetest.get_item_group(item, 'leafdecay_drop') ~= 0 or not is_leaf then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) + + -- spawn a few particles for the removed node + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, { x = 0.5, y = 0.5, z = 0.5 }), + maxpos = vector.add(pos, { x = 0.5, y = 0.5, z = 0.5 }), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) +end + +function x_farming.register_leafdecay(def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + +-- Seed placement - copy from MTG +function x_farming.place_seed(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= 'node' then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + local player_name = placer and placer:get_player_name() or '' + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return itemstack + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return itemstack + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y + 1 then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, 'soil') < 2 then + return itemstack + end + + -- add the node and remove 1 item from the itemstack + x_farming.log_player_action(placer, 'places node', plantname, 'at', pt.above) + minetest.add_node(pt.above, { name = plantname, param2 = 1 }) + x_farming.tick(pt.above) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack +end + +x_farming.grow_plant = function(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + -- disable timer for fully grown plant + return + end + + -- grow seed + if minetest.get_item_group(node.name, 'seed') and def.fertility then + local soil_node = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + if not soil_node then + x_farming.tick_again(pos) + return + end + -- omitted is a check for light, we assume seeds can germinate in the dark. + for _, v in pairs(def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 or string.find(soil_node.name, 'mcl_farming:soil') then + local placenode = { name = def.next_plant } + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + if minetest.registered_nodes[def.next_plant].next_plant then + x_farming.tick(pos) + return + end + end + end + + return + end + + -- check if on wet soil + local below = minetest.get_node({ x = pos.x, y = pos.y - 1, z = pos.z }) + if minetest.get_item_group(below.name, 'soil') < 3 then + x_farming.tick_again(pos) + return + end + + -- check light + local light = minetest.get_node_light(pos) + if not light or light < def.minlight or light > def.maxlight then + x_farming.tick_again(pos) + return + end + + -- grow + local placenode = { name = def.next_plant } + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + + -- new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + x_farming.tick(pos) + end + return +end + +-- Register plants +x_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.harvest_description then + def.harvest_description = pname:gsub('^%l', string.upper) + end + if not def.inventory_image then + def.inventory_image = 'unknown_item.png' + end + if not def.steps then + return nil + end + if not def.minlight then + def.minlight = 1 + end + if not def.maxlight then + def.maxlight = 14 + end + if not def.fertility then + def.fertility = {} + end + + x_farming.registered_plants[pname] = def + + -- Register seed + local lbm_nodes = { mname .. ':seed_' .. pname } + local g = { + -- MTG + seed = 1, + snappy = 3, + attached_node = 1, + flammable = 2, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + } + + for k, v in pairs(def.fertility) do + g[v] = 1 + end + + if def.groups then + for group, value in pairs(def.groups) do + g[group] = value + end + end + + minetest.register_node(':' .. mname .. ':seed_' .. pname, { + description = def.description, + tiles = def.tiles or { def.inventory_image }, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = def.drawtype or 'signlike', + groups = g, + paramtype = 'light', + paramtype2 = def.paramtype2 or 'wallmounted', + place_param2 = def.place_param2 or nil, -- this isn't actually used for placement + walkable = false, + sunlight_propagates = true, + selection_box = def.selection_box or { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -5 / 16, 0.5 }, + }, + fertility = def.fertility, + sounds = x_farming.node_sound_grass_defaults(), + special_tiles = def.special_tiles and { { name = def.special_tiles, tileable_vertical = true } } or nil, + visual_scale = def.visual_scale or 1, + node_dig_prediction = def.node_dig_prediction or '', + node_placement_prediction = def.node_placement_prediction or nil, + + on_place = def.on_place or function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) + then + return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack + end + + return x_farming.place_seed(itemstack, placer, pointed_thing, mname .. ':seed_' .. pname) + end, + after_destruct = def.after_destruct or nil, + next_plant = mname .. ':' .. pname .. '_1', + on_timer = def.on_timer or x_farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + }) + + -- Register harvest + minetest.register_craftitem(':' .. mname .. ':' .. pname, { + description = def.harvest_description, + inventory_image = mname .. '_' .. pname .. '.png', + groups = def.groups or { flammable = 2 }, + }) + + -- Register growing steps + for i = 1, def.steps do + local base_rarity = 1 + if def.steps ~= 1 then + base_rarity = 8 - (i - 1) * 7 / (def.steps - 1) + end + local drop = { + items = { + {items = { mname .. ':' .. pname }, rarity = base_rarity }, + {items = { mname .. ':' .. pname }, rarity = base_rarity * 2 }, + {items = { mname .. ':seed_' .. pname }, rarity = base_rarity }, + {items = { mname .. ':seed_' .. pname }, rarity = base_rarity * 2 }, + } + } + local nodegroups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + } + nodegroups[pname] = i + + if def.groups then + for group, value in pairs(def.groups) do + nodegroups[group] = value + end + end + + local next_plant = nil + + if i < def.steps then + next_plant = mname .. ':' .. pname .. '_' .. (i + 1) + lbm_nodes[#lbm_nodes + 1] = mname .. ':' .. pname .. '_' .. i + end + + local _buildable_to = true + + if def.buildable_to ~= nil then + _buildable_to = def.buildable_to + end + + minetest.register_node(':' .. mname .. ':' .. pname .. '_' .. i, { + drawtype = def.drawtype or 'plantlike', + waving = 1, + tiles = def.tiles or { mname .. '_' .. pname .. '_' .. i .. '.png' }, + special_tiles = def.special_tiles and { { name = mname .. '_' .. pname .. '_' .. i .. '.png', tileable_vertical = true } } or nil, + paramtype = 'light', + paramtype2 = def.paramtype2 or nil, + place_param2 = def.place_param2 or nil, + visual_scale = def.visual_scale or 1, + node_dig_prediction = def.node_dig_prediction or '', + node_placement_prediction = def.node_placement_prediction or nil, + walkable = false, + buildable_to = _buildable_to, + drop = drop, + selection_box = def['selection_box_' .. i] and def['selection_box_' .. i] or { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -5 / 16, 0.5 }, + }, + groups = nodegroups, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = next_plant, + on_timer = def.on_timer or x_farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + after_destruct = def.after_destruct or nil, + }) + end + + -- replacement LBM for pre-nodetimer plants + minetest.register_lbm({ + name = ':' .. mname .. ':start_nodetimer_' .. pname, + nodenames = lbm_nodes, + action = function(pos, node) + x_farming.tick_again(pos) + end, + }) + + -- Return + local r = { + seed = mname .. ':seed_' .. pname, + harvest = mname .. ':' .. pname + } + return r +end + +---grow blocks next to the plant +function x_farming.grow_block(pos, elapsed) + local node = minetest.get_node(pos) + local random_pos = false + local spawn_positions = {} + local right_pos = { x = pos.x + 1, y = pos.y, z = pos.z } + local front_pos = { x = pos.x, y = pos.y, z = pos.z + 1 } + local left_pos = { x = pos.x - 1, y = pos.y, z = pos.z } + local back_pos = { x = pos.x, y = pos.y, z = pos.z - 1 } + local right = minetest.get_node(right_pos) + local front = minetest.get_node(front_pos) + local left = minetest.get_node(left_pos) + local back = minetest.get_node(back_pos) + local def = minetest.registered_nodes[node.name] + + local children = {} + + ---look for fruits around the stem + if (right.name == def.next_plant) then + children.right = right_pos + end + if (front.name == def.next_plant) then + children.front = front_pos + end + if (left.name == def.next_plant) then + children.left = left_pos + end + if (back.name == def.next_plant) then + children.back = back_pos + end + + ---check if the fruit belongs to this stem + for side, child_pos in pairs(children) do + + local parent_pos_from_child = x_farming.meta_get_str('parent', child_pos) + + ---disable timer for fully grown plant - fruit for this stem already exists + if minetest.pos_to_string(pos) == parent_pos_from_child then + return + end + end + + ---make sure that at least one side of the plant has space to put fruit + if right.name == 'air' then + table.insert(spawn_positions, right_pos) + end + if front.name == 'air' then + table.insert(spawn_positions, front_pos) + end + if left.name == 'air' then + table.insert(spawn_positions, left_pos) + end + if back.name == 'air' then + table.insert(spawn_positions, back_pos) + end + + ---plant is closed from all sides + if #spawn_positions < 1 then + x_farming.tick_block_short(pos) + return + else + ---pick random from the open sides + local pick_random + + if #spawn_positions == 1 then + pick_random = #spawn_positions + else + pick_random = math.random(1, #spawn_positions) + end + + for k, v in pairs(spawn_positions) do + if k == pick_random then + random_pos = v + end + end + end + + ---check light + local light = minetest.get_node_light(pos) + if not light or light < 13 or light > 14 then + x_farming.tick_block_short(pos) + return + end + + ---spawn block + if random_pos then + minetest.set_node(random_pos, { name = def.next_plant }) + x_farming.meta_set_str('parent', minetest.pos_to_string(pos), random_pos) + end + return +end + +function x_farming.grow_kiwi_tree(pos) + local path = minetest.get_modpath('x_farming') .. + '/schematics/x_farming_kiwi_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 2, y = pos.y, z = pos.z - 2 }, + path, 'random', nil, false) +end + +-- 'can grow' function - copy from MTG + +function x_farming.can_grow(pos) + local node_under = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + if not node_under then + return false + end + + if minetest.get_item_group(node_under.name, 'soil') == 0 then + return false + end + + local light_level = minetest.get_node_light(pos) + + if not light_level or light_level < 13 then + return false + end + + return true +end + +---Grow sapling + +function x_farming.grow_sapling(pos) + if not x_farming.can_grow(pos) then + ---try again 5 min later + minetest.get_node_timer(pos):start(300) + return + end + + local node = minetest.get_node(pos) + if node.name == 'x_farming:kiwi_sapling' then + minetest.log('action', 'A sapling grows into a tree at ' .. + minetest.pos_to_string(pos)) + x_farming.grow_kiwi_tree(pos) + end +end + +---Grow Large Cactus + +function x_farming.grow_large_cactus(pos) + local path = minetest.get_modpath('x_farming') .. + '/schematics/x_farming_large_cactus_from_seedling.mts' + minetest.place_schematic({ x = pos.x, y = pos.y, z = pos.z }, + path, 'random', nil, false, 'place_center_x, place_center_z') +end + +---Grow Jungle Tree + +function x_farming.grow_jungle_tree(pos) + local path = minetest.get_modpath('x_farming') .. + '/schematics/x_farming_jungle_tree_with_cocoa_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 2, y = pos.y - 1, z = pos.z - 2 }, + path, nil, nil, false) +end + +---Pine Nut Tree + +function x_farming.grow_pine_nut_tree(pos) + local path = minetest.get_modpath('x_farming') .. + '/schematics/x_farming_pine_nut_tree_from_sapling.mts' + minetest.place_schematic({ x = pos.x - 2, y = pos.y, z = pos.z - 2 }, + path, '0', nil, false) +end + +---Christmas Tree + +function x_farming.grow_christmas_tree(pos) + local path + if math.random() > 0.5 then + path = minetest.get_modpath('x_farming') .. '/schematics/x_farming_christmas_tree_large.mts' + minetest.place_schematic({ x = pos.x - 2, y = pos.y, z = pos.z - 2 }, path, '0', nil, false) + else + path = minetest.get_modpath('x_farming') .. '/schematics/x_farming_christmas_tree.mts' + minetest.place_schematic({ x = pos.x - 1, y = pos.y, z = pos.z - 1 }, path, '0', nil, false) + end +end + +---- +--- Crates and Bags +---- + +function x_farming.tick_crates(pos) + minetest.get_node_timer(pos):start(math.random(332, 572)) +end + +function x_farming.tick_again_crates(pos) + minetest.get_node_timer(pos):start(math.random(80, 160)) +end + +function x_farming.get_crate_or_bag_formspec(pos, label_copy) + local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z + local hotbar_bg = '' + local list_bg = '' + + for i = 0, 7, 1 do + hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;x_farming_crate_ui_bg_hb_slot.png]' + end + + for row = 0, 2, 1 do + for i = 0, 7, 1 do + list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;x_farming_crate_ui_bg_slot.png]' + end + end + + local formspec = { + 'size[8,9]', + 'style_type[label;textcolor=#FFFFFF]', + 'background[5,5;1,1;x_farming_crate_ui_bg.png;true]', + 'list[nodemeta:', spos, ';main;0,0.3;8,4;]', + 'list[current_player;main;0,4.85;8,1;]', + 'list[current_player;main;0,6.08;8,3;8]', + 'listring[nodemeta:', spos, ';main]', + 'listring[current_player;main]', + 'label[2,0;' .. minetest.formspec_escape(label_copy) .. ']', + list_bg, + hotbar_bg, + 'image[0,0.3;1,1;x_farming_crate_ui_bg_hb_slot.png]' + } + + formspec = table.concat(formspec, '') + + return formspec +end + +---Crate +function x_farming.register_crate(name, def) + local _def = table.copy(def) or {} + + _def._custom = _def._custom or {} + + local mod = "x_farming" + if name:find(":") then + local n = name:split(":") + mod = n[1] + name = n[2] + end + + _def.name = 'x_farming:' .. name + _def.description = def.description or name + _def.short_description = def.short_description or def.description + _def.drawtype = 'mesh' + _def.paramtype = 'light' + _def.paramtype2 = 'facedir' + _def.mesh = 'x_farming_crate.obj' + _def.tiles = def.tiles + _def.use_texture_alpha = 'clip' + _def.sounds = def.sounds or x_farming.node_sound_wood_defaults() + _def.is_ground_content = false + _def.groups = def.groups or { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + material_wood = 1, + deco_block = 1, + fire_encouragement = 3, + fire_flammability = 4, + -- ALL + not_in_creative_inventory = 1, + flammable = 2 + } + _def.stack_max = def.stack_max or 1 + _def.mod_origin = mod + -- MCL + _def._mcl_hardness = 0.6 + _def._mcl_blast_resistance = 0.6 + + if _def._custom.crate_item then + x_farming.allowed_crate_items[_def._custom.crate_item] = true + end + + _def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + meta:set_string('infotext', _def.short_description) + meta:set_string('owner', '') + inv:set_size('main', 1) + end + + _def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local meta_st = itemstack:get_meta() + local crate_inv = minetest.deserialize(meta_st:get_string('crate_inv')) + local inv = meta:get_inventory() + + if crate_inv then + inv:add_item('main', ItemStack(crate_inv)) + end + + local node = minetest.get_node(pos) + + meta:set_string('owner', placer:get_player_name() or '') + + if not inv:is_empty('main') then + local inv_stack = inv:get_stack('main', 1) + + meta:set_string('infotext', _def.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + else + local swap_node = minetest.registered_nodes['x_farming:crate_empty'] + if swap_node and inv:is_empty('main') and node.name ~= swap_node.name then + minetest.swap_node(pos, { name = swap_node.name, param2 = node.param2 }) + meta:set_string('infotext', swap_node.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')') + end + end + end + + _def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local p_name = clicker:get_player_name() + if minetest.is_protected(pos, p_name) then + return itemstack + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = _def.short_description .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') + .. ')\n' .. inv_stack:get_description() + minetest.show_formspec(p_name, _def.name, x_farming.get_crate_or_bag_formspec(pos, label_copy)) + minetest.sound_play('x_farming_wood_hit', { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + end + + _def.on_blast = function(pos, intensity) + if minetest.is_protected(pos, '') then + return + end + + local drops = {} + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + + for i = 1, inv:get_size('main') do + local stack = inv:get_stack('main', i) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end + + drops[#drops + 1] = name + minetest.remove_node(pos) + return drops + end + + _def.can_dig = function(pos, player) + return not minetest.is_protected(pos, player:get_player_name()) + end + + _def.preserve_metadata = function(pos, oldnode, oldmeta, drops) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = drops[1] + local meta_drop = stack:get_meta() + + if not inv:is_empty('main') then + local inv_stack = inv:get_stack('main', 1) + + meta_drop:set_string('crate_inv', minetest.serialize(inv_stack:to_table())) + meta_drop:set_string('description', stack:get_description() .. '\n' .. inv_stack:get_description() + .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + + return + end + end + + _def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local st_name = stack:get_name() + + if minetest.is_protected(pos, player:get_player_name()) + or ( + not x_farming.allowed_crate_items[st_name] + and minetest.get_item_group(st_name, 'fish') == 0 + ) + then + return 0 + end + + return stack:get_count() + end + + _def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local st_name = stack:get_name() + + if minetest.is_protected(pos, player:get_player_name()) + or ( + not x_farming.allowed_crate_items[st_name] + and minetest.get_item_group(st_name, 'fish') == 0 + ) + then + return 0 + end + + return stack:get_count() + end + + _def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + local stack_name = stack:get_name() + + if not stack_name or stack_name == '' then + return + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local node = minetest.get_node(pos) + local inv_stack = inv:get_stack('main', 1) + local split_name = stack_name:split(':') + + if minetest.get_item_group(stack_name, 'fish') ~= 0 then + split_name = { 'x_farming', 'fish' } + end + + if stack_name == 'x_farming:cotton' then + split_name = { 'x_farming', 'cotton2' } + end + + local swap_node = minetest.registered_nodes['x_farming:crate_' .. split_name[2] .. '_3'] + + if not swap_node then + return + end + + if not inv:is_empty(listname) and node.name ~= swap_node.name then + local p_name = player:get_player_name() + + minetest.swap_node(pos, { name = swap_node.name, param2 = node.param2 }) + + local label_copy = swap_node.short_description .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() + + minetest.show_formspec(p_name, _def.name, x_farming.get_crate_or_bag_formspec(pos, label_copy)) + end + + meta:set_string('infotext', swap_node.short_description .. ' (' .. S('owned by') + .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + end + + _def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local node = minetest.get_node(pos) + + if inv:is_empty(listname) then + local p_name = player:get_player_name() + local swap_node = minetest.registered_nodes['x_farming:crate_empty'] + + if swap_node then + minetest.swap_node(pos, { name = swap_node.name, param2 = node.param2 }) + meta:set_string('infotext', swap_node.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')') + + local label_copy = swap_node.short_description .. ' (' .. S('owned by') .. ' ' + .. meta:get_string('owner') .. ')\n' .. inv_stack:get_description() + + minetest.show_formspec(p_name, _def.name, x_farming.get_crate_or_bag_formspec(pos, label_copy)) + end + else + local node_def = minetest.registered_nodes[node.name] + + if node_def then + meta:set_string('infotext', node_def.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + end + end + end + + _def.on_timer = function(pos, elapsed) + local pos_above = { x = pos.x, y = pos.y + 1, z = pos.z } + local node_above = minetest.get_node(pos_above) + + if not node_above then + x_farming.tick_again_crates(pos) + return + end + + if node_above.name ~= 'air' then + x_farming.tick_again_crates(pos) + return + end + + local rand1 = math.random(1, 2) / 10 + + minetest.add_particlespawner({ + amount = 60, + time = 15, + minpos = { x = pos_above.x - 0.1, y = pos_above.y - 0.3, z = pos_above.z - 0.1 }, + maxpos = { x = pos_above.x + 0.1, y = pos_above.y + 0.4, z = pos_above.z + 0.1 }, + minvel = { x = rand1 * -1, y = rand1 * -1, z = rand1 * -1 }, + maxvel = { x = rand1, y = rand1, z = rand1 }, + minacc = { x = rand1 * -1, y = rand1 * -1, z = rand1 * -1 }, + maxacc = { x = rand1, y = rand1, z = rand1 }, + minexptime = 1, + maxexptime = 1.5, + minsize = 0.1, + maxsize = 0.3, + texture = 'x_farming_fly.png', + collisiondetection = true, + object_collision = true + }) + + x_farming.tick_crates(pos) + end + + x_farming.registered_crates[_def.name] = _def + + if _def.name ~= 'x_farming:crate_empty' then + table.insert(x_farming.lbm_nodenames_crates, _def.name) + end + + minetest.register_node(_def.name, _def) +end + +---Bag +function x_farming.register_bag(name, def) + local _def = table.copy(def) or {} + + _def._custom = _def._custom or {} + + _def.name = 'x_farming:' .. name + _def.description = def.description or name + _def.short_description = def.short_description or def.description + _def.drawtype = 'mesh' + _def.paramtype = 'light' + _def.paramtype2 = 'facedir' + _def.mesh = 'x_farming_bag.obj' + _def.tiles = def.tiles + _def.use_texture_alpha = 'clip' + _def.sounds = def.sounds or x_farming.node_sound_sand_defaults() + _def.is_ground_content = false + _def.groups = def.groups or { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + building_block = 1, + deco_block = 1, + -- ALL + not_in_creative_inventory = 1, + flammable = 2 + } + -- MCL + _def._mcl_hardness = 0.6 + _def._mcl_blast_resistance = 0.6 + _def.stack_max = def.stack_max or 1 + _def.mod_origin = 'x_farming' + + if _def._custom.bag_item then + x_farming.allowed_bag_items[_def._custom.bag_item] = true + end + + _def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + meta:set_string('infotext', _def.short_description) + meta:set_string('owner', '') + inv:set_size('main', 1) + end + + _def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local meta_st = itemstack:get_meta() + local bag_inv = minetest.deserialize(meta_st:get_string('bag_inv')) + local inv = meta:get_inventory() + + if bag_inv then + inv:add_item('main', ItemStack(bag_inv)) + end + + local node = minetest.get_node(pos) + + meta:set_string('owner', placer:get_player_name() or '') + + if not inv:is_empty('main') then + local inv_stack = inv:get_stack('main', 1) + + meta:set_string('infotext', _def.short_description .. ' (' .. S('owned by') .. ' ' + .. meta:get_string('owner') .. ')\n' .. inv_stack:get_description() + .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + else + local swap_node = minetest.registered_nodes['x_farming:bag_empty'] + if swap_node and inv:is_empty('main') and node.name ~= swap_node.name then + minetest.swap_node(pos, { name = swap_node.name, param2 = node.param2 }) + meta:set_string('infotext', swap_node.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')') + end + end + end + + _def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local p_name = clicker:get_player_name() + + if minetest.is_protected(pos, p_name) then + return itemstack + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = _def.short_description .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() + minetest.show_formspec(p_name, _def.name, x_farming.get_crate_or_bag_formspec(pos, label_copy)) + minetest.sound_play('x_farming_sand_footstep', { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + end + + _def.on_blast = function(pos, intensity) + if minetest.is_protected(pos, '') then + return + end + + local drops = {} + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + + for i = 1, inv:get_size('main') do + local stack = inv:get_stack('main', i) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end + + drops[#drops + 1] = name + minetest.remove_node(pos) + return drops + end + + _def.can_dig = function(pos, player) + return not minetest.is_protected(pos, player:get_player_name()) + end + + _def.preserve_metadata = function(pos, oldnode, oldmeta, drops) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = drops[1] + local meta_drop = stack:get_meta() + + if not inv:is_empty('main') then + local inv_stack = inv:get_stack('main', 1) + + meta_drop:set_string('bag_inv', minetest.serialize(inv_stack:to_table())) + meta_drop:set_string('description', stack:get_description() .. '\n' + .. inv_stack:get_description() .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + + return + end + end + + _def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) or not x_farming.allowed_bag_items[stack:get_name()] then + return 0 + end + + return stack:get_count() + end + + _def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) or not x_farming.allowed_bag_items[stack:get_name()] then + return 0 + end + + return stack:get_count() + end + + _def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + local stack_name = stack:get_name() + + if not stack_name or stack_name == '' then + return + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local split_name = stack_name:split(':') + local node = minetest.get_node(pos) + local swap_node = minetest.registered_nodes['x_farming:bag_' .. split_name[2]] + local inv_stack = inv:get_stack('main', 1) + + if not swap_node then + return + end + + if not inv:is_empty(listname) and node.name ~= swap_node.name then + local p_name = player:get_player_name() + + minetest.swap_node(pos, { name = swap_node.name, param2 = node.param2 }) + + local label_copy = swap_node.short_description .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() + + minetest.show_formspec(p_name, _def.name, x_farming.get_crate_or_bag_formspec(pos, label_copy)) + end + + meta:set_string('infotext', swap_node.short_description .. ' (' .. S('owned by') + .. ' ' .. meta:get_string('owner') .. ')\n' + .. inv_stack:get_description() .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + end + + _def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local node = minetest.get_node(pos) + + if inv:is_empty(listname) then + local p_name = player:get_player_name() + local swap_node = minetest.registered_nodes['x_farming:bag_empty'] + + if swap_node then + minetest.swap_node(pos, { name = swap_node.name, param2 = node.param2 }) + meta:set_string('infotext', swap_node.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')') + + local label_copy = swap_node.short_description + .. ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')\n' .. inv_stack:get_description() + + minetest.show_formspec(p_name, _def.name, x_farming.get_crate_or_bag_formspec(pos, label_copy)) + end + else + local node_def = minetest.registered_nodes[node.name] + + if node_def then + meta:set_string('infotext', node_def.short_description .. ' (' .. S('owned by') .. ' ' + .. meta:get_string('owner') .. ')\n' .. inv_stack:get_description() + .. '\n' .. S('Quantity') .. ': ' .. inv_stack:get_count()) + end + end + end + + minetest.register_node(_def.name, _def) +end + +-- +---Bonemeal +-- + +------------ +---Main API for x_bonemeal Mod +---@author Juraj Vajda +---@license GNU LGPL 2.1 +---- + +---Get creative mode setting from minetest.conf +local creative_mod_cache = minetest.settings:get_bool('creative_mode') + +---Check if creating mode is enabled or player has creative privs +---@param name string name +---@return boolean +function x_farming.x_bonemeal.is_creative(name) + return creative_mod_cache or minetest.check_player_privs(name, { creative = true }) +end + +---Check if node has a soil below its self +---@param under Vector of position +---@return boolean +function x_farming.x_bonemeal.is_on_soil(under) + local below = minetest.get_node_or_nil({ x = under.x, y = under.y - 1, z = under.z }) + + if not below then + return false + end + + if minetest.get_item_group(below.name, 'soil') == 0 and below.name ~= 'mcl_farming:soil_wet' then + return false + end + + return true +end + +---Check if node has a sand below its self +---@param under Vector of position +---@return boolean +function x_farming.x_bonemeal.is_on_sand(under) + local below = minetest.get_node_or_nil({ x = under.x, y = under.y - 1, z = under.z }) + + if not below then + return false + end + + if minetest.get_item_group(below.name, 'sand') == 0 + and minetest.get_item_group(below.name, 'everness_sand') == 0 + then + return false + end + + return true +end + +---Growth steps for farming plants, there is no way of getting them dynamically, +--- so they are defined in the local table variable +local farming_steps = { + ['farming:wheat'] = 8, + ['farming:cotton'] = 8, + ['x_farming:coffee'] = 5, + ['x_farming:corn'] = 10, + ['x_farming:obsidian_wart'] = 6, + ['x_farming:melon'] = 8, + ['x_farming:pumpkin'] = 8, + ['x_farming:carrot'] = 8, + ['x_farming:potato'] = 8, + ['x_farming:beetroot'] = 8, + ['x_farming:strawberry'] = 4, + ['x_farming:stevia'] = 8, + ['x_farming:soybean'] = 7, + ['x_farming:salt'] = 7, + ['x_farming:barley'] = 8, + ['x_farming:cotton'] = 8, +} + +---Particle and sound effect after the bone meal is successfully used +---@param pos Vector containing position +function x_farming.x_bonemeal.particle_effect(pos) + minetest.sound_play('x_farming_x_bonemeal_grow', { + pos = pos, + gain = 0.5, + }) + + minetest.add_particlespawner({ + amount = 6, + time = 3, + minpos = { x = pos.x - 0.4, y = pos.y - 0.4, z = pos.z - 0.4 }, + maxpos = { x = pos.x + 0.4, y = pos.y, z = pos.z + 0.4 }, + minvel = { x = 0, y = 0, z = 0 }, + maxvel = { x = 0, y = 0.1, z = 0 }, + minacc = vector.new({ x = 0, y = 0, z = 0 }), + maxacc = vector.new({ x = 0, y = 0.1, z = 0 }), + minexptime = 2, + maxexptime = 3, + minsize = 1, + maxsize = 3, + texture = 'x_farming_x_bonemeal_particles.png', + animation = { + type = 'vertical_frames', + aspect_w = 8, + aspect_h = 8, + length = 3, + }, + }) +end + +function x_farming.x_bonemeal.tableContains(table, value) + local found = false + + if not table or type(table) ~= 'table' then + return found + end + + for k, v in ipairs(table) do + if v == value then + found = true + break + end + end + + return found +end + +function x_farming.x_bonemeal.groupContains(groups, fertility, value) + local found = false + + if not groups or type(groups) ~= 'table' then + return found + end + + if groups[fertility] and groups[fertility] == value then + found = true + end + + return found +end + +---Handle growth of decorations based on biome +---@param itemstack ItemStack +---@param user ObjectRef | nil +---@param pointed_thing PointedThingDef +---@return { ['success']: boolean, ['itemstack']: ItemStack } +function x_farming.x_bonemeal.grow_grass_and_flowers(itemstack, user, pointed_thing) + local result = { + success = false, + itemstack = itemstack + } + local node = minetest.get_node(pointed_thing.under) + + if not node then + return result + end + + local pos0 = vector.subtract(pointed_thing.under, 3) + local pos1 = vector.add(pointed_thing.under, 3) + local biome_data = minetest.get_biome_data(pointed_thing.under) + + if not biome_data then + return result + end + + local biome_name = minetest.get_biome_name(biome_data.biome) + + if not biome_name then + return result + end + + local random_number = math.random(2, 6) + local registered_decorations_filtered = {} + ---@type ItemStack | nil + local returned_itemstack + local node_def = minetest.registered_nodes[node.name] + local below_water = false + local floats_on_water = false + local node_in_decor = false + local positions_dirty + local positions = {} + local decor_place_on = {} + -- print('biome_name', biome_name) + + ---check 1 node below pointed node (floats on water) + local test_node = minetest.get_node({ + x = pointed_thing.under.x, + y = pointed_thing.under.y - 1, + z = pointed_thing.under.z + }) + local test_node_def = minetest.registered_nodes[test_node.name] + + if test_node_def + and test_node_def.liquidtype == 'source' + and minetest.get_item_group(test_node_def.name, 'water') > 0 + then + floats_on_water = true + end + + ---check 2 nodes above pointed nodes (below water) + local water_nodes_above = 0 + for i = 1, 2 do + local test_node2 = minetest.get_node({ + x = pointed_thing.under.x, + y = pointed_thing.under.y + i, + z = pointed_thing.under.z + }) + local test_node_def2 = minetest.registered_nodes[test_node2.name] + + if test_node_def2 + and test_node_def2.liquidtype == 'source' + and minetest.get_item_group(test_node_def2.name, 'water') > 0 + then + water_nodes_above = water_nodes_above + 1 + end + end + + if water_nodes_above == 2 then + below_water = true + end + + if below_water then + positions_dirty = minetest.find_nodes_in_area(pos0, pos1, node.name) + elseif floats_on_water then + positions_dirty = minetest.find_nodes_in_area(pos0, pos1, 'air') + else + positions_dirty = minetest.find_nodes_in_area_under_air(pos0, pos1, node.name) + end + + ---find suitable decorations + for _, v in pairs(minetest.registered_decorations) do + ---only for 'simple' decoration types + if v.deco_type == 'simple' then + ---filter based on biome name in `biomes` table and node name in `place_on` table + if x_farming.x_bonemeal.tableContains(v.biomes, biome_name) then + table.insert(registered_decorations_filtered, v) + end + end + + ---clicked node is in decoration + local _decoration = v.decoration + + if type(v.decoration) == 'string' then + _decoration = { v.decoration } + end + + if x_farming.x_bonemeal.tableContains(_decoration, node.name) then + node_in_decor = true + end + + ---all nodes on which decoration can be placed on + ---indexed by name + if not decor_place_on[v.place_on] then + if type(v.place_on) == 'string' then + decor_place_on[v.place_on] = true + elseif type(v.place_on) == 'table' then + for _, v2 in ipairs(v.place_on) do + decor_place_on[v2] = true + end + end + end + end + + ---find suitable positions + for j, pos_value in ipairs(positions_dirty) do + local node_at_pos = minetest.get_node(pos_value) + + if below_water then + ---below water + local water_nodes_above2 = 0 + + ---check if 2 nodes above are water + for i = 1, 2 do + local test_node3 = minetest.get_node({ x = pos_value.x, y = pos_value.y + i, z = pos_value.z }) + local test_node_def3 = minetest.registered_nodes[test_node3.name] + + if test_node_def3 + and test_node_def3.liquidtype == 'source' + and minetest.get_item_group(test_node_def3.name, 'water') > 0 + then + water_nodes_above2 = water_nodes_above2 + 1 + end + end + + if water_nodes_above2 == 2 and decor_place_on[test_node.name] then + table.insert(positions, pos_value) + end + else + ---above water (not on water) + if decor_place_on[node_at_pos.name] then + table.insert(positions, pos_value) + end + end + end + + ---find suitable positions (float on water) + if floats_on_water then + for _, pos_value in ipairs(positions_dirty) do + local node_at_pos_below = minetest.get_node({ x = pos_value.x, y = pos_value.y - 1, z = pos_value.z }) + local test_node_def4 = minetest.registered_nodes[node_at_pos_below.name] + + if test_node_def4 + and test_node_def4.liquidtype == 'source' + and minetest.get_item_group(test_node_def4.name, 'water') > 0 + then + table.insert(positions, pos_value) + end + end + end + + local returned_itemstack_success = 0 + + ---place decorations on random positions + if #positions > 0 and #registered_decorations_filtered > 0 then + for i = 1, random_number do + local idx = math.random(1, #positions) + local random_pos = positions[idx] + local random_decor = registered_decorations_filtered[math.random(1, #registered_decorations_filtered)] + local random_decor_item = random_decor.decoration + + if floats_on_water and node_in_decor then + random_decor_item = node.name + elseif type(random_decor.decoration) == 'table' then + random_decor_item = random_decor.decoration[math.random(1, #random_decor.decoration)] + end + + local random_decor_item_def = minetest.registered_nodes[random_decor_item] + + if random_pos ~= nil and random_decor_item_def.drawtype ~= 'airlike' then + if random_decor_item_def.on_place ~= nil and node_def and not node_def.on_rightclick then + ---on_place + local pt = { + type = 'node', + above = { + x = random_pos.x, + y = random_pos.y + 1, + z = random_pos.z + }, + under = { + x = random_pos.x, + y = random_pos.y, + z = random_pos.z + } + } + + if floats_on_water then + pt.above.y = random_pos.y + pt.under.y = random_pos.y - 1 + end + + returned_itemstack = random_decor_item_def.on_place(ItemStack(random_decor_item), user, pt) + + if returned_itemstack and returned_itemstack:is_empty() then + returned_itemstack_success = returned_itemstack_success + 1 + x_farming.x_bonemeal.particle_effect(pt.above) + end + elseif random_decor_item_def ~= nil then + ---everything else + local pos_y = 1 + + if random_decor.place_offset_y ~= nil then + pos_y = random_decor.place_offset_y + end + + x_farming.x_bonemeal.particle_effect(random_pos) + minetest.set_node({ + x = random_pos.x, + y = random_pos.y + pos_y, + z = random_pos.z + }, + { name = random_decor_item }) + end + + table.remove(positions, idx) + else + return result + end + end + else + return result + end + + ---take item + if user and returned_itemstack_success > 0 + and not x_farming.x_bonemeal.is_creative(user:get_player_name()) + then + itemstack:take_item() + end + + result.success = true + result.itemstack = itemstack + return result +end + +---Handle farming and farming addons plants. +---Needed to copy this function from minetest_game and modify it in order to ommit some checks (e.g. light..) +---@param itemstack ItemStack +---@param user ObjectRef | nil +---@param pointed_thing PointedThingDef +---@return { ['success']: boolean, ['itemstack']: ItemStack } +function x_farming.x_bonemeal.grow_farming(itemstack, user, pointed_thing) + local result = { + success = false, + itemstack = itemstack + } + local pos_under = pointed_thing.under + local replace_node_name = minetest.get_node(pos_under).name + local ndef = minetest.registered_nodes[replace_node_name] + local take_item = false + + if not ndef.next_plant + or ndef.next_plant == 'x_farming:pumpkin_fruit' + or ndef.next_plant == 'x_farming:melon_fruit' + then + return result + end + + local pos0 = vector.subtract(pointed_thing.under, 3) + local pos1 = vector.add(pointed_thing.under, 3) + local positions = minetest.find_nodes_in_area(pos0, pos1, { 'group:plant', 'group:seed' }) + + for i, pos in ipairs(positions) do + local isFertile = false + replace_node_name = minetest.get_node(pos).name + + ---check if on wet soil + local below = minetest.get_node({ x = pos.x, y = pos.y - 1, z = pos.z }) + local below_def = minetest.registered_nodes[below.name] + + if minetest.get_item_group(below.name, 'soil') == 3 or below.name == 'mcl_farming:soil_wet' then + local current_step = tonumber(string.reverse(string.reverse(replace_node_name):split('_')[1])) + local max_step = farming_steps[replace_node_name:gsub('_%d+', '', 1)] + + ---check if seed + ---farming:seed_wheat + local mod_plant = replace_node_name:split(':') + ---seed_wheat + local seed_plant = mod_plant[2]:split('_') + local seed_name = replace_node_name + + if seed_plant[1] == 'seed' then + current_step = 0 + if replace_node_name == 'x_farming:seed_obsidian_wart' then + replace_node_name = mod_plant[1] .. ':' .. seed_plant[2] .. '_' .. seed_plant[3] + else + replace_node_name = mod_plant[1] .. ':' .. seed_plant[2] + end + max_step = farming_steps[replace_node_name] + replace_node_name = replace_node_name .. '_' .. current_step + else + if string.find(replace_node_name, 'obsidian_wart') then + seed_name = mod_plant[1] .. ':seed_' .. seed_plant[1] .. '_' .. seed_plant[2] + else + seed_name = mod_plant[1] .. ':seed_' .. seed_plant[1] + end + end + + ---search for fertility (again after checking soil) + local seed_def = minetest.registered_nodes[seed_name] + + if seed_def and below_def then + if below_def.groups then + for _, v in ipairs(seed_def.fertility) do + if not isFertile then + isFertile = x_farming.x_bonemeal.groupContains(below_def.groups, v, 1) or below.name == 'mcl_farming:soil_wet' + end + end + end + end + + if current_step ~= nil and max_step ~= nil and current_step ~= max_step and isFertile then + local available_steps = max_step - current_step + local new_step = max_step - available_steps + math.random(available_steps) + local new_plant = replace_node_name:gsub('_%d+', '_' .. new_step, 1) + take_item = true + + local placenode_def = minetest.registered_nodes[new_plant] + + local placenode = { name = new_plant } + if placenode_def and placenode_def.place_param2 then + placenode.param2 = placenode_def.place_param2 + end + x_farming.x_bonemeal.particle_effect(pos) + minetest.swap_node(pos, placenode) + end + end + end + + ---take item if not in creative + if user and not x_farming.x_bonemeal.is_creative(user:get_player_name()) and take_item then + itemstack:take_item() + end + + return { + success = true, + itemstack = itemstack + } +end + +---XBonemeal on_use +---@param self table x_farming.x_bonemeal +---@param itemstack ItemStack +---@param user ObjectRef | nil +---@param pointed_thing any +---@return { ['success']: boolean, ['itemstack']: ItemStack } +function x_farming.x_bonemeal.on_use(self, itemstack, user, pointed_thing) + local result = { + success = false, + itemstack = itemstack + } + + if not user then + return result + end + + local under = pointed_thing.under + + if not under then + return result + end + if pointed_thing.type ~= 'node' then + return result + end + if minetest.is_protected(under, user:get_player_name()) then + return result + end + + local node = minetest.get_node(under) + + if not node then + return result + end + if node.name == 'ignore' then + return result + end + + local mod = node.name:split(':')[1] + + if (mod == 'farming' or mod == 'x_farming') + and not string.find(node.name, '_sapling') + and not string.find(node.name, '_seedling') + then + -- + -- Farming + -- + return self.grow_farming(itemstack, user, pointed_thing) + elseif self.tree_defs[node.name] then + -- + -- Default (Trees, Bushes, Papyrus) + -- + local def = self.tree_defs[node.name] + local chance = math.random(1, def.chance) + + if chance == 1 then + local success = def.grow_tree(under) + + if not success then + return result + end + + self.particle_effect({ x = under.x, y = under.y + 1, z = under.z }) + end + + -- take item if not in creative + if not self.is_creative(user:get_player_name()) then + itemstack:take_item() + end + + return { + success = true, + itemstack = itemstack + } + else + return self.grow_grass_and_flowers(itemstack, user, pointed_thing) + end +end + +--- API for registering tree growing from saplings using bonemeal +function x_farming.x_bonemeal.register_tree_defs(self, defs) + if not defs or type(defs) ~= 'table' then + minetest.log('warning', '[x_farming][x_bonemeal] Missing or incorrect definition: \n' .. dump(defs)) + end + + for _, value in ipairs(defs) do + local def = table.copy(value) + if not self.tree_defs[def.name] then + self.tree_defs[def.name] = value + end + end +end + +-- TheTermos (MIT) +-- vec components can be omitted e.g. vec={y=1} +function x_farming.pos_shift(pos, vec) + vec.x = vec.x or 0 + vec.y = vec.y or 0 + vec.z = vec.z or 0 + + return { + x = pos.x + vec.x, + y = pos.y + vec.y, + z = pos.z + vec.z + } +end + +-- TheTermos (MIT) +function x_farming.get_node_pos(pos) + return { + x = math.floor(pos.x + 0.5), + y = math.floor(pos.y + 0.5), + z = math.floor(pos.z + 0.5), + } +end + +-- TheTermos (MIT) +function x_farming.nodeatpos(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return minetest.registered_nodes[node.name] + end +end + +-- TheTermos (MIT) +function x_farming.get_node_height(pos) + local npos = x_farming.get_node_pos(pos) + local node = x_farming.nodeatpos(npos) + if node == nil then + return nil + end + + if node.walkable then + if node.drawtype == 'nodebox' then + if node.node_box and node.node_box.type == 'fixed' then + if type(node.node_box.fixed[1]) == 'number' then + return npos.y + node.node_box.fixed[5], 0, false + elseif type(node.node_box.fixed[1]) == 'table' then + return npos.y + node.node_box.fixed[1][5], 0, false + else + -- todo handle table of boxes + return npos.y + 0.5, 1, false + end + elseif node.node_box and node.node_box.type == 'leveled' then + return minetest.get_node_level(pos) / 64 - 0.5 + x_farming.get_node_pos(pos).y, 0, false + else + -- the unforeseen + return npos.y + 0.5, 1, false + end + else + -- full node + return npos.y + 0.5, 1, false + end + else + local liquidflag = false + if node.drawtype == 'liquid' then liquidflag = true end + return npos.y - 0.5, -1, liquidflag + end +end + +-- TheTermos (MIT) +-- get_terrain_height +-- steps(optional) number of recursion steps; default=3 +-- dir(optional) is 1=up, -1=down, 0=both; default=0 +-- liquidflag(forbidden) never provide this parameter. +-- dir is 1=up, -1=down, 0=both +function x_farming.get_terrain_height(pos, steps, dir, liquidflag) + steps = steps or 3 + dir = dir or 0 + + local h, f, l = x_farming.get_node_height(pos) + if h == nil then + return nil + end + if l then + liquidflag = true + end + + if f == 0 then + return h, liquidflag + end + + if dir == 0 or dir == f then + steps = steps - 1 + if steps <= 0 then + return nil + end + + return x_farming.get_terrain_height(x_farming.pos_shift(pos, { y = f }), steps, f, liquidflag) + else + return h, liquidflag + end +end + +-- TheTermos (MIT) +-- modified by SaKeL +function x_farming.get_spawn_pos_abr(dtime, intrvl, radius, chance, reduction) + dtime = math.min(dtime, 0.1) + local players = minetest.get_connected_players() + intrvl = 1 / intrvl + + if math.random() < dtime * (intrvl * #players) then + -- choose random player + local player = players[math.random(#players)] + local vel = player:get_velocity() + local spd = vector.length(vel) + chance = (1 - chance) * 1 / (spd * 0.75 + 1) + + local yaw + if spd > 1 then + -- spawn in the front arc + yaw = minetest.dir_to_yaw(vel) + math.random() * 0.35 - 0.75 + else + -- random yaw + yaw = math.random() * math.pi * 2 - math.pi + end + + local pos = player:get_pos() + local dir = vector.multiply(minetest.yaw_to_dir(yaw), radius) + local pos2 = vector.add(pos, dir) + + pos2.y = pos2.y - 5 + + local height, liquidflag = x_farming.get_terrain_height(pos2, 32) + if height then + local objs = minetest.find_node_near(pos, radius * 1.1, { 'group:bee' }) or {} + + -- count mobs in abrange + for _, obj in ipairs(objs) do + chance = chance + (1 - chance) * reduction + end + + if chance < math.random() then + pos2.y = height + objs = minetest.get_objects_inside_radius(pos2, radius * 0.95) + + -- do not spawn if another player around + for _, obj in ipairs(objs) do + if obj:is_player() then + return + end + end + + return pos2, liquidflag + end + end + end +end + +function x_farming.on_flood_candle(pos, oldnode, newnode) + local drops = minetest.get_node_drops(oldnode) + + for _, item_name in ipairs(drops) do + minetest.add_item(pos, ItemStack(item_name)) + end + + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + + if not (nodedef and nodedef.groups + and nodedef.groups.igniter and nodedef.groups.igniter > 0) + and minetest.get_item_group(oldnode.name, 'candle_on') > 0 + then + minetest.sound_play( + 'x_farming_extinguish_candle', + { pos = pos, max_hear_distance = 16, gain = 0.07 }, + true + ) + end + + -- Remove the torch node + return false +end + +-- Feasts +function x_farming.register_feast(name, def) + local g = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 3, + compost = 100, + no_silktouch = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 100, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + } + + -- merge groups from `def` + if def.groups then + for group, value in pairs(def.groups) do + g[group] = value + end + end + + local _def = { + description = def.description, + short_description = def.short_description or def.description, + drawtype = 'mesh', + mesh = def.mesh, + use_texture_alpha = def.use_texture_alpha or 'clip', + inventory_image = def.inventory_image or ('x_farming_' .. name .. '_item.png'), + wield_image = def.wield_image or ('x_farming_' .. name .. '_item.png'), + wield_scale = { x = 2, y = 2, z = 1 }, + paramtype = 'light', + paramtype2 = '4dir', + is_ground_content = false, + walkable = false, + selection_box = def.selection_box, + groups = g, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = def.sounds or x_farming.node_sound_wood_defaults(), + sunlight_propagates = true, + } + + for i = 1, def.steps do + local d = table.copy(_def) + + d._next_step = i + 1 + d.tiles = { + { name = 'x_farming_' .. name .. '_mesh.png', backface_culling = def.tiles_backface_culling or false }, + { name = 'x_farming_' .. name .. '_mesh_' .. i .. '.png', backface_culling = def.tiles_backface_culling or false }, + } + + if i ~= 1 then + d.groups['not_in_creative_inventory'] = 1 + end + + -- last (no more food) step + if i == def.steps then + d.drop = def.last_drop or 'x_farming:bowl' + else + d.drop = { + max_items = def.steps - i, + items = { + { + rarity = 1, + items = { + 'x_farming:bowl_' .. name + } + }, + { + rarity = 1, + items = { + 'x_farming:bowl_' .. name + } + }, + { + rarity = 1, + items = { + 'x_farming:bowl_' .. name + } + }, + { + rarity = 1, + items = { + 'x_farming:bowl_' .. name + } + }, + } + } + end + + d.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local n = minetest.registered_nodes[node.name] + local p_name = clicker:get_player_name() + local inv = clicker:get_inventory() + local stack_name = itemstack:get_name() + + if not n then + return itemstack + end + + -- last (no more food) step + if n._next_step > def.steps then + minetest.chat_send_player(p_name, S('There is no more food left!')) + return itemstack + end + + if stack_name == 'x_farming:bowl' then + minetest.swap_node(pos, { name = 'x_farming:' .. name .. '_' .. n._next_step, param2 = node.param2 }) + + if not minetest.is_creative_enabled(p_name) then + itemstack:take_item() + end + + minetest.sound_play('x_farming_wooden_bowl', { + pos = pos, + gain = 0.4, + max_hear_distance = 16 + }) + + local stack_bowl = ItemStack({ name = 'x_farming:bowl_' .. name }) + + if inv and inv:room_for_item('main', stack_bowl) then + inv:add_item('main', stack_bowl) + else + -- drop on the ground + minetest.add_item(clicker:get_pos(), stack_bowl) + end + else + minetest.chat_send_player(p_name, S('You need to hold empty bowl if you want to take portion of the food!')) + end + + return itemstack + end + + -- Node + minetest.register_node('x_farming:' .. name .. '_' .. i, d) + + -- Craftitem definition + local craftitem_def = { + description = def.short_description .. ' ' .. S('Bowl') .. '\n' .. S('Compost chance') .. ': 100%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 8'), + inventory_image = 'x_farming_bowl_' .. name .. '.png', + wield_image = 'x_farming_bowl_' .. name .. '.png', + groups = { + -- MTG + -- X Farming + compost = 100, + -- MCL + food = 3, + eatable = 10, + compostability = 100, + }, + -- MCL + _mcl_saturation = 12.0, + } + + if minetest.get_modpath('farming') then + craftitem_def.on_use = minetest.item_eat(8) + end + + if minetest.get_modpath('mcl_farming') then + craftitem_def.on_place = minetest.item_eat(8) + craftitem_def.on_secondary_use = minetest.item_eat(8) + end + + -- Craftitem + minetest.register_craftitem('x_farming:bowl_' .. name, craftitem_def) + end +end + +-- Pies + +function x_farming.register_pie(name, def) + local g = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 3, + compost = 100, + no_silktouch = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 100, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + } + + -- merge groups from `def` + if def.groups then + for group, value in pairs(def.groups) do + g[group] = value + end + end + + local _def = { + description = def.description, + short_description = def.short_description or def.description, + drawtype = 'mesh', + mesh = def.mesh, + use_texture_alpha = def.use_texture_alpha or 'clip', + inventory_image = def.inventory_image or ('x_farming_' .. name .. '_item.png'), + wield_image = def.wield_image or ('x_farming_' .. name .. '_item.png'), + wield_scale = { x = 2, y = 2, z = 1 }, + paramtype = 'light', + paramtype2 = '4dir', + is_ground_content = false, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -8 / 16, -7 / 16, 7 / 16, -3 / 16, 7 / 16 } + }, + groups = g, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = def.sounds or x_farming.node_sound_wood_defaults(), + sunlight_propagates = true, + item_eat = 6 + } + + for i = 1, def.steps do + local d = table.copy(_def) + + d._next_step = i + 1 + d.tiles = { + { name = 'x_farming_' .. name .. '_mesh_' .. i .. '.png', backface_culling = def.tiles_backface_culling or false }, + } + + if i ~= 1 then + d.groups['not_in_creative_inventory'] = 1 + end + + d.drop = { + max_items = def.steps - i + 1, + items = { + { + rarity = 1, + items = { + 'x_farming:slice_' .. name + } + }, + { + rarity = 1, + items = { + 'x_farming:slice_' .. name + } + }, + { + rarity = 1, + items = { + 'x_farming:slice_' .. name + } + }, + { + rarity = 1, + items = { + 'x_farming:slice_' .. name + } + }, + } + } + + d.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local n = minetest.registered_nodes[node.name] + + if not n then + return itemstack + end + + if i < def.steps then + minetest.swap_node(pos, { name = 'x_farming:' .. name .. '_' .. n._next_step, param2 = node.param2 }) + else + minetest.remove_node(pos) + minetest.check_for_falling(pos) + end + + local sound_name = 'x_farming_wooden_bowl' + + if minetest.get_modpath('hunger_ng') then + hunger_ng.alter_hunger(clicker:get_player_name(), _def.item_eat) + sound_name = 'hunger_ng_eat' + elseif minetest.get_modpath('hbhunger') then + hbhunger.eat(_def.item_eat, nil, ItemStack({ name = 'x_farming:' .. name .. '_1' }), clicker, pointed_thing) + sound_name = nil + elseif minetest.get_modpath('stamina') and minetest.global_exists('stamina') then + -- extra check for global variable since there are some mods called "stamina" without registering global "stamina" namespace + -- @see https://content.minetest.net/threads/6791/ + stamina.change_saturation(clicker, _def.item_eat) + sound_name = 'stamina_eat' + elseif minetest.get_modpath('mcl_hunger') then + local h = mcl_hunger.get_hunger(clicker) + mcl_hunger.set_hunger(clicker, math.min(h + _def.item_eat, 20)) + sound_name = 'mcl_hunger_bite' + else + minetest.item_eat(_def.item_eat) + end + + if sound_name then + minetest.sound_play(sound_name, { pos = pos, gain = 0.7, max_hear_distance = 5 }, true) + end + + return itemstack + end + + -- Node + minetest.register_node('x_farming:' .. name .. '_' .. i, d) + + local craftitem_def = { + description = def.short_description .. ' ' .. S('Slice') .. '\n' .. S('Compost chance') .. ': 100%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': ' .. _def.item_eat), + inventory_image = 'x_farming_slice_' .. name .. '.png', + wield_image = 'x_farming_slice_' .. name .. '.png', + groups = { + -- MTG + -- X Farming + compost = 100, + -- MCL + food = 3, + eatable = 10, + compostability = 100, + }, + -- MCL + _mcl_saturation = 10.0, + } + + if minetest.get_modpath('farming') then + craftitem_def.on_use = minetest.item_eat(_def.item_eat) + end + + if minetest.get_modpath('mcl_farming') then + craftitem_def.on_place = minetest.item_eat(_def.item_eat) + craftitem_def.on_secondary_use = minetest.item_eat(_def.item_eat) + end + + -- Craftitem + minetest.register_craftitem('x_farming:slice_' .. name, craftitem_def) + end +end + +-- +-- MCL +-- + +function x_farming.mcl.create_soil(pos, inv) + if pos == nil then + return false + end + local node = minetest.get_node(pos) + local name = node.name + local above = minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }) + if minetest.get_item_group(name, 'cultivatable') == 2 then + if above.name == 'air' then + node.name = 'mcl_farming:soil' + minetest.set_node(pos, node) + minetest.sound_play('x_farming_dirt_hit', { pos = pos, gain = 0.5 }, true) + return true + end + elseif minetest.get_item_group(name, 'cultivatable') == 1 then + if above.name == 'air' then + node.name = 'mcl_core:dirt' + minetest.set_node(pos, node) + minetest.sound_play('x_farming_dirt_hit', { pos = pos, gain = 0.6 }, true) + return true + end + end + return false +end + +function x_farming.mcl.hoe_on_place_function(uses) + return function(itemstack, user, pointed_thing) + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + + -- Custom: add support for MTG definition farming + local regN = minetest.registered_nodes + if regN[node.name].soil ~= nil + and regN[node.name].soil.wet ~= nil + and regN[node.name].soil.dry ~= nil + then + return x_farming.hoe_on_use(itemstack, user, pointed_thing, uses) + end + + if user and not user:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + end + end + + if minetest.is_protected(pointed_thing.under, user:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) + return itemstack + end + + if x_farming.mcl.create_soil(pointed_thing.under, user:get_inventory()) then + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:add_wear_by_uses(uses) + end + return itemstack + end + end +end diff --git a/mods/x_farming/bags.lua b/mods/x_farming/bags.lua new file mode 100644 index 00000000..590decfb --- /dev/null +++ b/mods/x_farming/bags.lua @@ -0,0 +1,27 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +---Empty bag +x_farming.register_bag('bag_empty', { + description = S('Empty Bag'), + tiles = { 'x_farming_bag_empty.png' }, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + stack_max = tonumber(minetest.settings:get('default_stack_max')) or 99 +}) diff --git a/mods/x_farming/barley.lua b/mods/x_farming/barley.lua new file mode 100644 index 00000000..e201a93f --- /dev/null +++ b/mods/x_farming/barley.lua @@ -0,0 +1,105 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- BARLEY +x_farming.register_plant('x_farming:barley', { + description = S('Barley Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Barley Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_barley_seed.png', + steps = 8, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 0, +}) + +-- needed +local override_def = { + description = S('Barley') .. '\n' .. S('Compost chance') .. ': 50%', + short_description = S('Barley'), + groups = { + -- X Farming + compost = 50, + -- MCL + compostability = 50 + }, + _mcl_blast_resistance = 0, +} + +minetest.override_item('x_farming:barley', override_def) + +-- Registered before the stairs so the stairs get fuel recipes. +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:barley_stack', + burntime = 3, +}) + +if minetest.get_modpath('stairs') then + do + local recipe = 'x_farming:barley' + local groups = { snappy = 3, flammable = 4 } + local images = { 'x_farming_barley_stack_side.png' } + local sounds = x_farming.node_sound_leaves_defaults() + + stairs.register_stair('barley_stack', recipe, groups, images, S('Barley Stack Stair'), + sounds, true) + stairs.register_stair_inner('barley_stack', recipe, groups, images, '', + sounds, true, S('Inner Barley Stack Stair')) + stairs.register_stair_outer('barley_stack', recipe, groups, images, '', + sounds, true, S('Outer Barley Stack Stair')) + stairs.register_slab('barley_stack', recipe, groups, images, S('Barley Stack Slab'), + sounds, true) + end +end + +---crate +x_farming.register_crate('crate_barley_3', { + description = S('Barley Crate'), + short_description = S('Barley Crate'), + tiles = { 'x_farming_crate_barley_3.png' }, + _custom = { + crate_item = 'x_farming:barley' + } +}) + +minetest.register_decoration(asuna.features.crops.barley.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1100, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:barley_5", + "x_farming:barley_6", + "x_farming:barley_7", + "x_farming:barley_8", + }, +})) diff --git a/mods/x_farming/bees.lua b/mods/x_farming/bees.lua new file mode 100644 index 00000000..a9e3da91 --- /dev/null +++ b/mods/x_farming/bees.lua @@ -0,0 +1,624 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local rand = PcgRandom(tonumber(tostring(os.time()):reverse():sub(1, 9))) + +local function update_hive_infotext(pos) + local meta = minetest.get_meta(pos) + local data = minetest.deserialize(meta:get_string('x_farming')) + + if data then + local text = 'Occupancy: ' .. data.occupancy .. ' / 3\n' + .. 'Saturation: ' .. data.saturation .. ' / 5' + meta:set_string('infotext', text) + end +end + +local function bee_particles(pos) + minetest.add_particlespawner({ + amount = 20, + time = 0.1, + minpos = { x = pos.x - 0.25, y = pos.y, z = pos.z - 0.25 }, + maxpos = { x = pos.x + 0.25, y = pos.y, z = pos.z + 0.25 }, + minvel = { x = -0.5, y = -2, z = -0.5 }, + maxvel = { x = 0.5, y = -2, z = 0.5 }, + minacc = { x = -0.5, y = -2, z = -0.5 }, + maxacc = { x = 0.5, y = -2, z = 0.5 }, + minexptime = 0.5, + maxexptime = 1, + texture = 'x_farming_default_particle.png^[colorize:#FFD69C:255', + collisiondetection = true + }) +end + +local function update_bee_infotext(pos) + local meta = minetest.get_meta(pos) + local data = minetest.deserialize(meta:get_string('x_farming')) + + if data then + meta:set_string('infotext', 'Hive position: ' .. data.pos_hive) + end +end + +-- how often node timers for plants will tick, +/- some random value +local function tick_hive(pos) + minetest.get_node_timer(pos):start(math.random(15, 25)) +end +-- how often a growth failure tick is retried (e.g. too dark) +local function tick_bee(pos) + minetest.get_node_timer(pos):start(math.random(90, 150)) +end + +local function is_valid_hive_position(pos, params) + if not pos then + return false + end + + local _params = params or {} + local ommit_node_group_check = _params.ommit_node_group_check or false + + local hive_node = minetest.get_node(pos) + + if not hive_node then + return false + end + + if not ommit_node_group_check then + if minetest.get_item_group(hive_node.name, 'bee_hive') == 0 then + return false + end + end + + local meta_hive = minetest.get_meta(pos) + local data_hive = minetest.deserialize(meta_hive:get_string('x_farming')) + + if not data_hive then + return false + end + + if not data_hive.occupancy then + return false + end + + if data_hive.occupancy >= 3 then + return false + end + + return true +end + +local function get_valid_hive_position(pos_hive, pos_bee) + local valid_pos = nil + + if pos_hive then + valid_pos = vector.copy(pos_hive) + end + + if is_valid_hive_position(valid_pos) then + return valid_pos + end + + valid_pos = nil + + -- Find neighboring bee hive position + local hive_positions = minetest.find_nodes_in_area( + vector.add(pos_bee, 5), + vector.subtract(pos_bee, 5), + { 'group:bee_hive' } + ) + + for _, p in ipairs(hive_positions) do + if is_valid_hive_position(p, { ommit_node_group_check = true }) then + valid_pos = p + break + end + end + + return valid_pos +end + +-- Hive +minetest.register_node('x_farming:bee_hive', { + description = S('Bee Hive'), + short_description = S('Bee Hive'), + tiles = { + 'x_farming_bee_hive_top.png', + 'x_farming_bee_hive_bottom.png', + 'x_farming_bee_hive_side.png', + 'x_farming_bee_hive_side.png', + 'x_farming_bee_hive_side.png', + 'x_farming_bee_hive_front.png', + }, + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + bee_hive = 1, + no_silktouch = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + on_timer = function(pos, elapsed) + -- Hive data + local meta_hive = minetest.get_meta(pos) + local data_hive = minetest.deserialize(meta_hive:get_string('x_farming')) + local node = minetest.get_node(pos) + + if data_hive.occupancy == 0 then + return + end + + local flower_positions = minetest.find_nodes_in_area_under_air( + vector.add(pos, 5), + vector.subtract(pos, 5), + { 'group:flower' } + ) + + if not flower_positions then + tick_hive(pos) + end + + if flower_positions and #flower_positions > 0 then + local random_pos = flower_positions[rand:next(1, #flower_positions)] + local pos_bee = vector.new(random_pos.x, random_pos.y + 1, random_pos.z) + local tod = minetest.get_timeofday() + local is_day = false + + if tod > 0.2 and tod < 0.805 then + is_day = true + end + + if data_hive and data_hive.occupancy > 0 and is_day then + local pos_hive_front = vector.subtract(vector.new(pos.x, pos.y + 0.5, pos.z), minetest.facedir_to_dir(node.param2)) + + -- Send bee out + data_hive.occupancy = data_hive.occupancy - 1 + + minetest.swap_node(pos_bee, { name = 'x_farming:bee', param2 = rand:next(0, 3) }) + tick_bee(pos_bee) + + minetest.sound_play('x_farming_bee', { + pos = pos_bee, + }) + + bee_particles(pos_bee) + bee_particles(pos_hive_front) + + -- Bee data + local meta_bee = minetest.get_meta(pos_bee) + local data_bee = { + pos_hive = vector.new(pos):to_string() + } + + meta_bee:set_string('x_farming', minetest.serialize(data_bee)) + meta_hive:set_string('x_farming', minetest.serialize(data_hive)) + + update_hive_infotext(pos) + update_bee_infotext(pos_bee) + end + end + + if data_hive and data_hive.occupancy > 0 then + tick_hive(pos) + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local data = { + occupancy = 0, + saturation = 0 + } + + meta:set_string('x_farming', minetest.serialize(data)) + update_hive_infotext(pos) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + tick_hive(pos) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local data = minetest.deserialize(meta:get_string('x_farming')) + + if not data then + return itemstack + end + + if data.occupancy == 3 then + return itemstack + end + + if minetest.get_item_group(itemstack:get_name(), 'bee') > 0 then + data.occupancy = data.occupancy + 1 + meta:set_string('x_farming', minetest.serialize(data)) + update_hive_infotext(pos) + itemstack:take_item() + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + end + + if data.occupancy > 0 and not minetest.get_node_timer(pos):is_started() then + tick_hive(pos) + end + + return itemstack + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local data = minetest.deserialize(oldmetadata.fields.x_farming) + local positions = minetest.find_nodes_in_area_under_air( + vector.add(pos, 5), + vector.subtract(pos, 5), + { 'group:flower', 'group:flora' } + ) + + if positions and #positions > 0 and data.occupancy and data.occupancy > 0 then + for i = 1, data.occupancy do + local p = positions[i] + + if p then + local pos_bee = vector.new(p.x, p.y + 1, p.z) + minetest.swap_node(pos_bee, { name = 'x_farming:bee', param2 = rand:next(0, 3) }) + tick_bee(pos_bee) + bee_particles(pos_bee) + + if i == 1 then + minetest.sound_play('x_farming_bee', { + pos = pos_bee, + }) + end + end + end + end + end, +}) + +-- Hive saturrated +minetest.register_node('x_farming:bee_hive_saturated', { + description = S('Bee Hive'), + short_description = S('Bee Hive'), + tiles = { + 'x_farming_bee_hive_top.png', + 'x_farming_bee_hive_bottom.png', + 'x_farming_bee_hive_side.png^x_farming_bee_hive_saturated_overlay.png', + 'x_farming_bee_hive_side.png^x_farming_bee_hive_saturated_overlay.png', + 'x_farming_bee_hive_side.png^x_farming_bee_hive_saturated_overlay.png', + 'x_farming_bee_hive_front.png^x_farming_bee_hive_saturated_overlay.png', + }, + paramtype2 = 'facedir', + drop = 'x_farming:bee_hive', + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + bee_hive = 1, + no_silktouch = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local stack_name = itemstack:get_name() + local stack = itemstack + local meta = minetest.get_meta(pos) + local data = minetest.deserialize(meta:get_string('x_farming')) + + if stack_name == 'vessels:glass_bottle' or stack_name == 'x_farming:glass_bottle' then + -- Fill bottle with honey and return it + itemstack:take_item() + + local pos_hive_front = vector.subtract(vector.new(pos.x, pos.y + 0.5, pos.z), minetest.facedir_to_dir(node.param2)) + + minetest.add_item( + pos_hive_front, + ItemStack({ name = 'x_farming:bottle_honey' }) + ) + + minetest.swap_node(pos, { name = 'x_farming:bee_hive', param2 = node.param2 }) + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + + bee_particles(pos_hive_front) + + data.saturation = 0 + meta:set_string('x_farming', minetest.serialize(data)) + update_hive_infotext(pos) + + tick_hive(pos) + elseif stack_name == 'x_farming:honeycomb_saw' then + -- Add use to the tool and drop honeycomb + itemstack:add_wear(65535 / 50) + + local pos_hive_front = vector.subtract(vector.new(pos.x, pos.y + 0.5, pos.z), minetest.facedir_to_dir(node.param2)) + + minetest.add_item( + pos_hive_front, + ItemStack({ name = 'x_farming:honeycomb' }) + ) + + minetest.swap_node(pos, { name = 'x_farming:bee_hive', param2 = node.param2 }) + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + + bee_particles(pos_hive_front) + + data.saturation = 0 + meta:set_string('x_farming', minetest.serialize(data)) + update_hive_infotext(pos) + + tick_hive(pos) + end + + return stack + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local data = minetest.deserialize(oldmetadata.fields.x_farming) + local positions = minetest.find_nodes_in_area_under_air( + vector.add(pos, 5), + vector.subtract(pos, 5), + { 'group:flower', 'group:flora' } + ) + + if positions and #positions > 0 and data.occupancy and data.occupancy > 0 then + for i = 1, data.occupancy do + local p = positions[i] + + if p then + local pos_bee = vector.new(p.x, p.y + 1, p.z) + minetest.swap_node(pos_bee, { name = 'x_farming:bee', param2 = rand:next(0, 3) }) + tick_bee(pos_bee) + bee_particles(pos_bee) + + if i == 1 then + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + end + end + end + end + end, +}) + +-- Bee +minetest.register_node('x_farming:bee', { + description = S('Bee'), + short_description = S('Bee'), + drawtype = 'mesh', + mesh = 'x_farming_bee.obj', + tiles = { + { + name = 'x_farming_bee_mesh_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 34, + aspect_h = 30, + length = 0.3 + }, + backface_culling = false + }, + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -4 / 16, -4 / 16, 4 / 16, 4 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + cracky = 2, + crumbly = 2, + choppy = 2, + fleshy = 10, + oddly_breakable_by_hand = 1, + disable_jump = 1, + bee = 1, + no_silktouch = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + }, + damage_per_second = 2, + move_resistance = 7, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + sounds = x_farming.node_sound_wood_defaults(), + drop = { + max_items = 1, + items = { + { + -- 1/20 chance + items = { 'x_farming:honeycomb' }, + rarity = 10, + } + } + }, + on_timer = function(pos, elapsed) + -- Bee data + local meta_bee = minetest.get_meta(pos) + local data_bee = minetest.deserialize(meta_bee:get_string('x_farming')) or {} + local pos_hive = get_valid_hive_position(data_bee.pos_hive and vector.from_string(data_bee.pos_hive) or nil, pos) + + if not pos_hive then + -- Bee data not found, remove bee + minetest.remove_node(pos) + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + + bee_particles(pos) + + return + end + + local meta_hive = minetest.get_meta(pos_hive) + local data_hive = minetest.deserialize(meta_hive:get_string('x_farming')) + local node_hive = minetest.get_node(pos_hive) + + -- Bee go home + data_hive.occupancy = data_hive.occupancy + 1 + + local flower_node = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + + if flower_node then + if minetest.get_item_group(flower_node.name, 'flower') > 0 and data_hive.saturation < 5 then + data_hive.saturation = data_hive.saturation + 1 + end + + if data_hive.saturation >= 5 then + minetest.swap_node(pos_hive, { name = 'x_farming:bee_hive_saturated', param2 = node_hive.param2 }) + end + end + + meta_hive:set_string('x_farming', minetest.serialize(data_hive)) + minetest.remove_node(pos) + update_hive_infotext(pos_hive) + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + + local pos_hive_front = vector.subtract(vector.new(pos_hive.x, pos_hive.y + 0.5, pos_hive.z), minetest.facedir_to_dir(node_hive.param2)) + + bee_particles(pos) + bee_particles(pos_hive_front) + + if not minetest.get_node_timer(pos_hive):is_started() then + tick_hive(pos_hive) + end + end, + on_punch = function(pos, node, puncher, pointed_thing) + if not puncher then + return + end + + -- Hurt player when punching bee + local armor_groups = puncher:get_armor_groups() + local damage = 2 + + if armor_groups.fleshy then + damage = math.round((2 * 100) / armor_groups.fleshy) + end + + puncher:punch(puncher, 1, { + full_punch_interval = 1, + damage_groups = { fleshy = damage }, + }, nil) + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + + bee_particles(pos) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local stack_name = itemstack:get_name() + + if stack_name == 'x_farming:jar_empty' then + itemstack:take_item() + minetest.remove_node(pos) + minetest.add_item(vector.new(pos.x, pos.y + 0.3, pos.z), ItemStack({ name = 'x_farming:jar_with_bee' })) + + minetest.sound_play('x_farming_bee', { + pos = pos, + }) + + bee_particles(pos) + end + + return itemstack + end +}) + +-- Spawn bees on flowers +-- local bee_spawn_timer = 0 +minetest.register_globalstep(function(dtime) + -- bee_spawn_timer = bee_spawn_timer + dtime + + -- if bee_spawn_timer > rand:next(90, 150) then + local abr = minetest.get_mapgen_setting('active_block_range') or 4 + local spawn_reduction = 0.5 + local spawn_rate = 0.5 + local spawnpos, liquidflag = x_farming.get_spawn_pos_abr(dtime, 3, abr * 16, spawn_rate, spawn_reduction) + local tod = minetest.get_timeofday() + local is_day = false + + if tod > 0.2 and tod < 0.805 then + is_day = true + end + + if spawnpos and not liquidflag and is_day then + local bees = minetest.find_node_near(spawnpos, abr * 16 * 1.1, { 'group:bee' }) or {} + + if #bees > 1 then + return + end + + local flower_positions = minetest.find_nodes_in_area_under_air( + vector.add(spawnpos, 5), + vector.subtract(spawnpos, 5), + { 'group:flower' } + ) + + if flower_positions and #flower_positions > 1 then + local rand_pos = flower_positions[rand:next(1, #flower_positions)] + local bee_pos = vector.new(rand_pos.x, rand_pos.y + 1, rand_pos.z) + + minetest.swap_node(bee_pos, { name = 'x_farming:bee', param2 = rand:next(0, 3) }) + tick_bee(bee_pos) + + minetest.log('action', '[x_farming] Added Bee at ' .. minetest.pos_to_string(bee_pos)) + end + end + + -- bee_spawn_timer = 0 + -- end +end) diff --git a/mods/x_farming/beetroot.lua b/mods/x_farming/beetroot.lua new file mode 100644 index 00000000..2803ef5c --- /dev/null +++ b/mods/x_farming/beetroot.lua @@ -0,0 +1,94 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local minlight = 13 +local maxlight = 14 + +---BEETROOT +x_farming.register_plant('x_farming:beetroot', { + description = S('Beetroot Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Beetroot Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_beetroot_seed.png', + steps = 8, + minlight = minlight, + maxlight = maxlight, + fertility = { 'grassland' }, + groups = { flammable = 4, compost = 65 }, + place_param2 = 0, +}) + +---needed +local beetroot_def = { + description = S('Beetroot') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 3'), + short_description = S('Beetroot'), + groups = { + -- X Farming + compost = 65, + -- MCL + food = 2, + eatable = 1, + compostability = 65 + }, + _mcl_saturation = 1.2, + _mcl_blast_resistance = 0, +} + +if minetest.get_modpath('farming') then + beetroot_def.on_use = minetest.item_eat(3) +end + +if minetest.get_modpath('mcl_farming') then + beetroot_def.on_place = minetest.item_eat(3) + beetroot_def.on_secondary_use = minetest.item_eat(3) +end + +minetest.override_item('x_farming:beetroot', beetroot_def) + +---crate +x_farming.register_crate('crate_beetroot_3', { + description = S('Beetroot Crate'), + tiles = { 'x_farming_crate_beetroot_3.png' }, + _custom = { + crate_item = 'x_farming:beetroot' + } +}) + +minetest.register_decoration(asuna.features.crops.beetroot.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1101, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:beetroot_5", + "x_farming:beetroot_6", + "x_farming:beetroot_7", + "x_farming:beetroot_8", + }, +})) diff --git a/mods/x_farming/bonemeal.lua b/mods/x_farming/bonemeal.lua new file mode 100644 index 00000000..eb7763e8 --- /dev/null +++ b/mods/x_farming/bonemeal.lua @@ -0,0 +1,64 @@ +--[[ + X Farming Bonemeal. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +if minetest.get_modpath("bonemeal") then + -- Alias + minetest.register_alias("x_farming:bonemeal","bonemeal:bonemeal") +else + --- Register craftitem definition - added to minetest.registered_items[name] + minetest.register_craftitem('x_farming:bonemeal', { + description = S('Bonemeal - use it as a fertilizer for most plants.'), + inventory_image = 'x_farming_x_bonemeal_bonemeal.png', + on_use = function(itemstack, user, pointed_thing) + local result = x_farming.x_bonemeal:on_use(itemstack, user, pointed_thing) + return result.itemstack + end, + }) + + -- Crafting + minetest.register_craft({ + output = 'x_farming:bonemeal 4', + recipe = { + { 'bones:bones' } + } + }) + + if minetest.get_modpath('default') then + minetest.register_craft({ + output = 'x_farming:bonemeal 4', + recipe = { + { 'default:coral_skeleton' } + } + }) + end +end + +-- +-- Crafting +-- + +if minetest.get_modpath('everness') then + minetest.register_craft({ + output = 'x_farming:bonemeal 4', + recipe = { + { 'everness:coral_skeleton' } + } + }) +end diff --git a/mods/x_farming/cactus.lua b/mods/x_farming/cactus.lua new file mode 100644 index 00000000..76c2c681 --- /dev/null +++ b/mods/x_farming/cactus.lua @@ -0,0 +1,337 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Large cactus + +if minetest.get_modpath("default") then + -- Alias cactus and seedling + minetest.register_alias("x_farming:cactus","default:cactus") + minetest.register_alias("x_farming:large_cactus_with_fruit_seedling","default:large_cactus_seedling") + + -- Add cactus fruits to grown large cactus + local oglcsot = minetest.registered_items["default:large_cactus_seedling"].on_timer + minetest.override_item("default:large_cactus_seedling",{ + on_timer = function(pos) + local retval = oglcsot(pos) + local fruit_locations = minetest.find_nodes_in_area_under_air(pos:add(vector.new(-2,1,-2)),pos:add(vector.new(2,8,2)),"default:cactus") + for _,cpos in ipairs(fruit_locations) do + if math.random(1,10) < 7 then + minetest.set_node(cpos:add(vector.new(0,1,0)),{ name = "x_farming:cactus_fruit" }) + end + end + return retval + end, + }) +else + minetest.register_node('x_farming:cactus', { + description = S('Cactus'), + tiles = { + 'x_farming_cactus_top.png', + 'x_farming_cactus_top.png', + 'x_farming_cactus.png', + 'x_farming_cactus.png', + 'x_farming_cactus.png^[transformFX', + 'x_farming_cactus.png^[transformFX', + }, + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + sounds = x_farming.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + }) + + minetest.register_node('x_farming:large_cactus_with_fruit_seedling', { + description = S('Large Cactus with Fruit Seedling') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Large Cactus with Fruit Seedling'), + drawtype = 'plantlike', + tiles = { 'x_farming_large_cactus_with_fruit_seedling.png' }, + inventory_image = 'x_farming_large_cactus_with_fruit_seedling.png', + wield_image = 'x_farming_large_cactus_with_fruit_seedling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { + -5 / 16, -0.5, -5 / 16, + 5 / 16, 0.5, 5 / 16 + } + }, + groups = { + -- MTG + choppy = 3, + dig_immediate = 3, + attached_node = 1, + compost = 30, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + compostability = 30 + }, + sounds = x_farming.node_sound_wood_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + itemstack = x_farming.sapling_on_place(itemstack, placer, pointed_thing, + 'x_farming:large_cactus_with_fruit_seedling', + { x = -3, y = 0, z = -3 }, + { x = 3, y = 6, z = 3 }, + 4) + + return itemstack + end, + + on_construct = function(pos) + -- Normal cactus farming adds 1 cactus node by ABM, + -- interval 12s, chance 83. + -- Consider starting with 5 cactus nodes. We make sure that growing a + -- large cactus is not a faster way to produce new cactus nodes. + -- Confirmed by experiment, when farming 5 cacti, on average 1 new + -- cactus node is added on average every + -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s. + -- Large cactus contains on average 14 cactus nodes. + -- 14 * 199.2 = 2788.8s. + -- Set random range to average to 2789s. + minetest.get_node_timer(pos):start(math.random(1859, 3719)) + end, + + on_timer = function(pos, elapsed) + local node_under = minetest.get_node_or_nil( + { x = pos.x, y = pos.y - 1, z = pos.z }) + if not node_under then + -- Node under not yet loaded, try later + minetest.get_node_timer(pos):start(300) + return + end + + if minetest.get_item_group(node_under.name, 'sand') == 0 then + -- Seedling dies + minetest.remove_node(pos) + return + end + + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + -- Too dark for growth, try later in case it's night + minetest.get_node_timer(pos):start(300) + return + end + + minetest.log('action', 'A large cactus seedling grows into a large' .. + 'cactus at ' .. minetest.pos_to_string(pos)) + x_farming.grow_large_cactus(pos) + end, + }) + + minetest.register_craft({ + output = 'x_farming:large_cactus_with_fruit_seedling', + recipe = { + { '', 'x_farming:cactus_fruit_item', '' }, + { 'x_farming:cactus_fruit_item', 'x_farming:cactus', 'x_farming:cactus_fruit_item' }, + { '', 'x_farming:cactus_fruit_item', '' }, + } + }) + + minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:large_cactus_with_fruit_seedling', + burntime = 5, + }) +end + +minetest.register_node('x_farming:cactus_fruit', { + description = S('Dragon Fruit'), + short_description = S('Dragon Fruit'), + inventory_image = 'x_farming_cactus_fruit_sides.png', + is_ground_content = false, + tiles = { + 'x_farming_cactus_fruit_top.png', + 'x_farming_cactus_fruit_bottom.png', + 'x_farming_cactus_fruit_sides.png', + 'x_farming_cactus_fruit_sides.png', + 'x_farming_cactus_fruit_sides.png', + 'x_farming_cactus_fruit_sides.png' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.0625, 0.25 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.0625, 0.25 }, + }, + drop = { + max_items = 1, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'x_farming:cactus_fruit_item' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + } + }, + }, + groups = { + -- MTG + choppy = 3, + flammable = 2, + not_in_creative_inventory = 1, + leafdecay = 3, + leafdecay_drop = 1, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + sounds = x_farming.node_sound_wood_defaults(), + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 20 then + minetest.set_node(pos, { name = 'x_farming:cactus_fruit_mark' }) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +minetest.register_node('x_farming:cactus_fruit_mark', { + description = S('Cactus Fruit Marker'), + short_description = S('Cactus Fruit Marker'), + inventory_image = 'x_farming_cactus_fruit_sides.png^x_farming_invisible_node_overlay.png', + wield_image = 'x_farming_cactus_fruit_sides.png^x_farming_invisible_node_overlay.png', + drawtype = 'airlike', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = '', + groups = { not_in_creative_inventory = 1 }, + on_timer = function(pos, elapsed) + local n = minetest.get_node({ x = pos.x, y = pos.y - 1, z = pos.z }) + + if not ( n.name == 'x_farming:cactus' or n.name == "default:cactus" ) then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, { name = 'x_farming:cactus_fruit', param2 = 20 }) + end + end +}) + +-- Fruit Item + +local cactus_fruit_item_def = { + description = S('Dragon Fruit') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + short_description = S('Dragon Fruit'), + drawtype = 'plantlike', + tiles = { 'x_farming_cactus_fruit_item.png' }, + inventory_image = 'x_farming_cactus_fruit_item.png', + on_use = minetest.item_eat(2), + sounds = x_farming.node_sound_leaves_defaults(), + groups = { + -- X Farming + compost = 65, + -- MCL + food = 2, + eatable = 1, + compostability = 65, + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.set_node(pos, { name = 'x_farming:cactus_fruit' }) + end, +} + +if minetest.get_modpath('mcl_farming') then + cactus_fruit_item_def.on_secondary_use = minetest.item_eat(2) +end + + +minetest.register_node('x_farming:cactus_fruit_item', cactus_fruit_item_def) + +x_farming.register_leafdecay({ + trunks = { 'x_farming:cactus' }, + leaves = { 'x_farming:cactus_fruit' }, + radius = 1, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:cactus_fruit_item', + burntime = 10, +}) + +---crate +x_farming.register_crate('crate_cactus_fruit_item_3', { + description = S('Cactus Fruit Crate'), + short_description = S('Cactus Fruit Crate'), + tiles = { 'x_farming_crate_cactus_fruit_item_3.png' }, + _custom = { + crate_item = 'x_farming:cactus_fruit_item' + } +}) + +--[[minetest.register_decoration(asuna.features.crops.cactus.inject_decoration({ + deco_type = "schematic", + sidelen = 16, + noise_params = { + offset = -0.0004, + scale = 0.0005, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 2, + persist = 0.6 + }, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("x_farming") .. '/schematics/x_farming_large_cactus.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}))]] + +minetest.register_decoration({ + deco_type = "simple", + decoration = "x_farming:cactus_fruit", + place_on = "default:cactus", + sidelen = 80, + y_min = 4, + y_max = 31000, + fill_ratio = 0.05, +}) \ No newline at end of file diff --git a/mods/x_farming/carrot.lua b/mods/x_farming/carrot.lua new file mode 100644 index 00000000..d41c4f5d --- /dev/null +++ b/mods/x_farming/carrot.lua @@ -0,0 +1,123 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local minlight = 13 +local maxlight = 14 + +-- carrot +x_farming.register_plant('x_farming:carrot', { + description = S('Planting Carrot') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Planting Carrot'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_carrot_seed.png', + steps = 8, + minlight = minlight, + maxlight = maxlight, + fertility = { 'grassland' }, + groups = { flammable = 4, compost = 65 }, + place_param2 = 3, +}) + +-- needed +local carrot_def = { + description = S('Carrot') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 3'), + short_description = S('Carrot'), + groups = { + -- X Farming + compost = 65, + -- MCL + food = 2, + eatable = 1, + compostability = 65 + }, + _mcl_saturation = 3.6, + _mcl_blast_resistance = 0, +} + +if minetest.get_modpath('farming') then + carrot_def.on_use = minetest.item_eat(3) +end + +if minetest.get_modpath('mcl_farming') then + carrot_def.on_place = minetest.item_eat(3) + carrot_def.on_secondary_use = minetest.item_eat(3) +end + +minetest.override_item('x_farming:carrot', carrot_def) + +-- Golden carrot +local golden_carrot_def = { + description = S('Golden Carrot') .. '\n' .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 10'), + inventory_image = 'x_farming_carrot_golden.png', + wield_image = 'x_farming_carrot_golden.png', + groups = { + -- MCL + food = 2, + eatable = 1, + }, + _mcl_saturation = 14.4, +} + +if x_farming.hbhunger ~= nil or x_farming.hunger_ng ~= nil then + golden_carrot_def.description = golden_carrot_def.description .. '\n' .. minetest.colorize(x_farming.colors.red, S('Heal') .. ': 10') +end + +if minetest.get_modpath('farming') then + golden_carrot_def.on_use = minetest.item_eat(10) +end + +if minetest.get_modpath('mcl_farming') then + golden_carrot_def.on_place = minetest.item_eat(10) + golden_carrot_def.on_secondary_use = minetest.item_eat(10) +end + +minetest.register_craftitem('x_farming:carrot_golden', golden_carrot_def) + +---crate +x_farming.register_crate('crate_carrot_3', { + description = S('Carrot Crate'), + short_description = S('Carrot Crate'), + tiles = { 'x_farming_crate_carrot_3.png' }, + _custom = { + crate_item = 'x_farming:carrot' + } +}) + +minetest.register_decoration(asuna.features.crops.carrot.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1103, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:carrot_5", + "x_farming:carrot_6", + "x_farming:carrot_7", + "x_farming:carrot_8", + }, +})) diff --git a/mods/x_farming/christmas_tree.lua b/mods/x_farming/christmas_tree.lua new file mode 100644 index 00000000..3c5992b8 --- /dev/null +++ b/mods/x_farming/christmas_tree.lua @@ -0,0 +1,163 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node('x_farming:christmas_tree_sapling', { + description = S('Christmas Tree Sapling') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Christmas Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'x_farming_christmas_tree_sapling.png' }, + inventory_image = 'x_farming_christmas_tree_sapling.png', + wield_image = 'x_farming_christmas_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = x_farming.grow_sapling, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + flammable = 3, + attached_node = 1, + sapling = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = x_farming.sapling_on_place(itemstack, placer, pointed_thing, + 'x_farming:christmas_tree_sapling', + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + { x = -2, y = 1, z = -2 }, + { x = 2, y = 14, z = 2 }, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +-- Decorated Pine Leaves +minetest.register_node('x_farming:christmas_tree_leaves', { + description = S('Decorated Pine Leaves') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Decorated Pine Leaves'), + drawtype = 'allfaces_optional', + tiles = { + { + -- Animated, 'blinking lights' version. ~ LazyJ + name = 'x_farming_christmas_tree_leaves_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 20.0 + }, + } + }, + waving = 0, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + sounds = x_farming.node_sound_leaves_defaults(), + after_place_node = x_farming.after_place_leaves, + light_source = 5, +}) + +-- Star +minetest.register_node('x_farming:christmas_tree_star', { + description = S('Christmas Tree Star'), + tiles = { 'x_farming_christmas_tree_star.png' }, + inventory_image = 'x_farming_christmas_tree_star.png', + wield_image = 'x_farming_christmas_tree_star.png', + drawtype = 'plantlike', + paramtype = 'light', + walkable = false, + groups = { + -- MTG + cracky = 1, + crumbly = 1, + choppy = 1, + oddly_breakable_by_hand = 1, + not_in_creative_inventory = 1, + leafdecay = 3, + leafdecay_drop = 1, + -- MCL + handy = 1, + glass = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = x_farming.node_sound_thin_glass_defaults(), + light_source = 5, +}) + +x_farming.register_leafdecay({ + trunks = { 'x_farming:pine_nut_tree' }, + leaves = { + 'x_farming:christmas_tree_leaves', + 'x_farming:christmas_tree_star', + -- since christmas tree is loaded after pine_nut_tree + -- we are including pine_nut_leaves here + 'x_farming:pine_nut', + 'x_farming:pine_nut_leaves', + }, + radius = 3, +}) diff --git a/mods/x_farming/cocoa.lua b/mods/x_farming/cocoa.lua new file mode 100644 index 00000000..5561b38d --- /dev/null +++ b/mods/x_farming/cocoa.lua @@ -0,0 +1,720 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local dpath = minetest.get_modpath("default") + +-- how often node timers for plants will tick, +/- some random value +local function tick(pos) + minetest.get_node_timer(pos):start(math.random(332, 572)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +local function tick_again(pos) + minetest.get_node_timer(pos):start(math.random(80, 160)) +end + +function x_farming.grow_cocoa_plant(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + -- disable timer for fully grown plant + return + end + + -- check if on jungletree + local direction = minetest.facedir_to_dir(node.param2) + local below_pos = vector.add(pos, direction) + local below = minetest.get_node(below_pos) + if below.name ~= 'default:jungletree' and below.name ~= 'x_farming:jungle_tree' then + tick_again(pos) + return + end + + -- check light + local light = minetest.get_node_light(pos) + if not light or light < def.minlight or light > def.maxlight then + tick_again(pos) + return + end + + -- grow + minetest.swap_node(pos, { name = def.next_plant, param2 = node.param2 }) + + -- new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + end +end + +function x_farming.place_cocoa_bean(itemstack, placer, pointed_thing) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= 'node' then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + local udef = minetest.registered_nodes[under.name] + if udef and udef.on_rightclick + and not (placer and placer:is_player() + and placer:get_player_control().sneak) + then + return udef.on_rightclick(pt.under, under, placer, itemstack, pointed_thing) or itemstack + end + + local player_name = placer and placer:get_player_name() or '' + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if NOT pointing at the top/below of the node + if pt.above.y == pt.under.y - 1 + or pt.above.y == pt.under.y + 1 + then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- check if pointing at soil + if under.name ~= 'default:jungletree' and under.name ~= 'x_farming:jungle_tree' then + return itemstack + end + + local direction = vector.direction(pt.above, pt.under) + local new_param2 = minetest.dir_to_facedir(direction) + + -- add the node and remove 1 item from the itemstack + minetest.set_node(pt.above, { name = 'x_farming:cocoa_1', param2 = new_param2 }) + + tick(pt.above) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack +end + +-- COCOA +minetest.register_craftitem('x_farming:cocoa_bean', { + description = S('Cocoa bean') .. ' (' .. S('plant on jungle tree trunk') .. ')' + .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Cocoa bean'), + tiles = { 'x_farming_cocoa_bean.png' }, + inventory_image = 'x_farming_cocoa_bean.png', + wield_image = 'x_farming_cocoa_bean.png', + groups = { compost = 65 }, + on_place = x_farming.place_cocoa_bean, +}) + +-- 1 +minetest.register_node('x_farming:cocoa_1', { + description = S('Cocoa') .. ' 1', + short_description = S('Cocoa') .. ' 1', + drawtype = 'nodebox', + tiles = { + 'x_farming_cocoa_top_1.png', + 'x_farming_cocoa_bottom_1.png', + 'x_farming_cocoa_right_1.png', + 'x_farming_cocoa_left_1.png', + 'x_farming_cocoa_front_1.png', + 'x_farming_cocoa_front_1.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + wield_scale = { x = 2, y = 2, z = 2 }, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + paramtype2 = 'facedir', + is_ground_content = false, + drop = { + items = { + { items = { 'x_farming:cocoa_bean' }, rarity = 3 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.125, -0.0625, 0.1875, 0.125, 0.25, 0.4375 }, -- fruit + { 0, 0.25, 0.3125, 0, 0.375, 0.375 }, -- stem_1 + { 0, 0.375, 0.4375, 0, 0.4375, 0.5 }, -- stem_2 + { 0, 0.3125, 0.375, 0, 0.4375, 0.4375 }, -- stem_3 + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.125, -0.0625, 0.1875, 0.125, 0.5, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.125, -0.0625, 0.1875, 0.125, 0.5, 0.5 }, + }, + }, + groups = { + -- MTG + choppy = 3, + flammable = 2, + plant = 1, + cocoa = 1, + -- MCL + handy = 1, + axey = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + attached_node_facedir = 1, + -- ALL + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 0.2, + sounds = x_farming.node_sound_wood_defaults(), + next_plant = 'x_farming:cocoa_2', + on_timer = x_farming.grow_cocoa_plant, + minlight = 13, + maxlight = 15, +}) + +-- 2 +minetest.register_node('x_farming:cocoa_2', { + description = S('Cocoa') .. ' 2', + short_description = S('Cocoa') .. ' 2', + drawtype = 'nodebox', + tiles = { + 'x_farming_cocoa_top_2.png', + 'x_farming_cocoa_bottom_2.png', + 'x_farming_cocoa_right_2.png', + 'x_farming_cocoa_left_2.png', + 'x_farming_cocoa_front_2.png', + 'x_farming_cocoa_front_2.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + wield_scale = { x = 1.5, y = 1.5, z = 1.5 }, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + paramtype2 = 'facedir', + is_ground_content = false, + drop = { + items = { + { items = { 'x_farming:cocoa_bean' }, rarity = 2 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.1875, -0.1875, 0.0625, 0.1875, 0.25, 0.4375 }, -- fruit + { 0, 0.25, 0.25, 0, 0.375, 0.375 }, -- stem_1 + { 0, 0.375, 0.375, 0, 0.5, 0.5 }, -- stem_2 + { 0, 0.375, 0.3125, 0, 0.4375, 0.375 }, -- stem_3 + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.1875, -0.1875, 0.0625, 0.1875, 0.5, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.1875, -0.1875, 0.0625, 0.1875, 0.5, 0.5 }, + }, + }, + groups = { + -- MTG + choppy = 3, + flammable = 2, + plant = 1, + cocoa = 2, + -- MCL + handy = 1, + axey = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + attached_node_facedir = 1, + -- ALL + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 0.2, + sounds = x_farming.node_sound_wood_defaults(), + next_plant = 'x_farming:cocoa_3', + on_timer = x_farming.grow_cocoa_plant, + minlight = 13, + maxlight = 15 +}) + +-- 3 +minetest.register_node('x_farming:cocoa_3', { + description = S('Cocoa') .. ' 3', + short_description = S('Cocoa') .. ' 3', + drawtype = 'nodebox', + tiles = { + 'x_farming_cocoa_top_3.png', + 'x_farming_cocoa_bottom_3.png', + 'x_farming_cocoa_right_3.png', + 'x_farming_cocoa_left_3.png', + 'x_farming_cocoa_front_3.png', + 'x_farming_cocoa_front_3.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + wield_scale = { x = 1.5, y = 1.5, z = 1.5 }, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + paramtype2 = 'facedir', + is_ground_content = false, + drop = { + items = { + { items = { 'x_farming:cocoa_bean' }, rarity = 1 }, + { items = { 'x_farming:cocoa_bean' }, rarity = 2 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.3125, -0.0625, 0.25, 0.25, 0.4375 }, + { -0.0624999, 0.25, 0.25, 0.0625, 0.375, 0.4375 }, + { -0.0625, 0.375, 0.375, 0.0625, 0.5, 0.5 }, + { -0.0624999, 0.375, 0.3125, 0.0625, 0.4375, 0.375 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.25, -0.3125, -0.0625, 0.25, 0.5, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.25, -0.3125, -0.0625, 0.25, 0.5, 0.5 }, + }, + }, + groups = { + -- MTG + choppy = 3, + flammable = 2, + plant = 1, + leafdecay = 3, + leafdecay_drop = 1, + cocoa = 3, + -- MCL + handy = 1, + axey = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + attached_node_facedir = 1, + -- ALL + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 0.2, + sounds = x_farming.node_sound_wood_defaults(), + minlight = 13, + maxlight = 15 +}) + +-- replacement LBM for pre-nodetimer plants +minetest.register_lbm({ + name = 'x_farming:start_nodetimer_cocoa', + nodenames = { + 'x_farming:cocoa_1', + 'x_farming:cocoa_2' + }, + action = function(pos, node) + tick_again(pos) + end, +}) + +if dpath then + minetest.register_alias("x_farming:jungle_tree","default:jungletree") + minetest.register_alias("x_farming:jungle_wood","default:junglewood") + minetest.register_alias("x_farming:jungle_leaves","default:jungleleaves") + minetest.register_alias("x_farming:jungle_with_cocoa_sapling","default:junglesapling") + minetest.register_alias("stairs:stair_jungle_wood","stairs:stair_junglewood") + minetest.register_alias("stairs:stair_inner_jungle_wood","stairs:stair_inner_junglewood") + minetest.register_alias("stairs:stair_outer_jungle_wood","stairs:stair_outer_junglewood") + minetest.register_alias("stairs:slab_jungle_wood","stairs:slab_junglewood") + + -- leafdecay + default.register_leafdecay({ + trunks = { 'default:jungletree' }, + leaves = { + 'x_farming:cocoa_1', + 'x_farming:cocoa_2', + 'x_farming:cocoa_3', + }, + radius = 2, + }) +else + --sapling + minetest.register_node('x_farming:jungle_with_cocoa_sapling', { + description = S('Jungle Tree with Cocoa Sapling') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Jungle Tree with Cocoa Sapling'), + drawtype = 'plantlike', + tiles = { 'x_farming_junglesapling.png' }, + inventory_image = 'x_farming_junglesapling.png', + wield_image = 'x_farming_junglesapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = x_farming.grow_jungle_tree, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = x_farming.sapling_on_place(itemstack, placer, pointed_thing, + 'x_farming:jungle_with_cocoa_sapling', + -- minp, maxp to be checked, relative to sapling pos + { x = -3, y = -5, z = -3 }, + { x = 3, y = 31, z = 3 }, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + -- trunk + minetest.register_node('x_farming:jungle_tree', { + description = S('Jungle Tree'), + short_description = S('Jungle Tree'), + tiles = { 'x_farming_jungle_tree_top.png', 'x_farming_jungle_tree_top.png', 'x_farming_jungle_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + + on_place = minetest.rotate_node + }) + + -- leaves + minetest.register_node('x_farming:jungle_leaves', { + description = S('Jungle Tree Leaves') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Jungle Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'x_farming_jungleleaves.png' }, + special_tiles = { 'x_farming_jungleleaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'x_farming:jungle_with_cocoa_sapling' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'x_farming:jungle_leaves' }, + } + } + }, + sounds = x_farming.node_sound_leaves_defaults(), + + after_place_node = x_farming.after_place_leaves, + }) + + -- leafdecay + x_farming.register_leafdecay({ + trunks = { 'x_farming:jungle_tree' }, + leaves = { + 'x_farming:jungle_leaves' + }, + radius = 2, + }) + + -- planks + minetest.register_node('x_farming:jungle_wood', { + description = S('Jungle Wood Planks'), + short_description = S('Jungle Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'x_farming_jungle_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + }) + + -- Stairs + if minetest.global_exists('stairs') and minetest.get_modpath('stairs') then + stairs.register_stair_and_slab( + 'jungle_wood', + 'x_farming:jungle_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'x_farming_jungle_wood.png' }, + 'Jungle Wooden Stair', + 'Jungle Wooden Slab', + x_farming.node_sound_wood_defaults(), + false + ) + end +end + +-- Cookie +local cookie_def = { + description = S('Cookie') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + inventory_image = 'x_farming_cookie.png', + groups = { + -- MTG + compost = 85, + -- MCL + food = 2, + eatable = 2, + compostability = 85 + }, +} + +if minetest.get_modpath('farming') then + cookie_def.on_use = minetest.item_eat(2) +end + +if minetest.get_modpath('mcl_farming') then + cookie_def.on_place = minetest.item_eat(2) + cookie_def.on_secondary_use = minetest.item_eat(2) +end + +minetest.register_craftitem('x_farming:cookie', cookie_def) + +-- Chocolate +local chocolate_def = { + description = S('Chocolate') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 3'), + inventory_image = 'x_farming_chocolate.png', + groups = { + -- MTG + compost = 65, + -- MCL + food = 2, + eatable = 2, + compostability = 65 + }, +} + +if minetest.get_modpath('farming') then + chocolate_def.on_use = minetest.item_eat(3) +end + +if minetest.get_modpath('mcl_farming') then + chocolate_def.on_place = minetest.item_eat(3) + chocolate_def.on_secondary_use = minetest.item_eat(3) +end + +minetest.register_craftitem('x_farming:chocolate', chocolate_def) + +if minetest.get_modpath('mcl_stairs') then + mcl_stairs.register_stair_and_slab( + 'x_farming_jungle_wood', + 'x_farming:jungle_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'x_farming_jungle_wood.png' }, + S('Jungle Wooden Stair'), + S('Jungle Wooden Slab'), + x_farming.node_sound_wood_defaults(), + 6, + 2, + S('Double Jungle Wooden Slab'), + nil + ) +end + +-- Crate +x_farming.register_crate('crate_cocoa_bean_3', { + description = S('Cocoa Bean Crate'), + short_description = S('Cocoa Bean Crate'), + tiles = { 'x_farming_crate_cocoa_bean_3.png' }, + _custom = { + crate_item = 'x_farming:cocoa_bean' + } +}) + +local c_jungletree = minetest.get_content_id("default:jungletree") +local c_cocoa2 = minetest.get_content_id("x_farming:cocoa_2") +local c_cocoa3 = minetest.get_content_id("x_farming:cocoa_3") + +abdecor.register_advanced_decoration("x_farming_cocoa",{ + target = { + place_on = "default:jungletree", + fill_ratio = 0.0075, + biomes = asuna.features.crops.cocoa, + y_min = 6, + y_max = 31000, + }, + fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + local vparam2 = mapgen.param2 + + -- Get stride values and adjust position + local ystride = va.ystride + local zstride = va.zstride + pos = va:index(pos.x,pos.y + 2,pos.z) + + -- Get adjacent tree trunk direction + local cardinal = { + zstride, + 1, + -zstride, + -1, + } + for i = 1, 4 do + local treepos = pos + cardinal[i] + if vdata[treepos] == c_jungletree then + for j = 2, 6 do + pos = pos + ystride + treepos = treepos + ystride + if j % 2 == 0 and vdata[treepos] == c_jungletree and vdata[pos] == minetest.CONTENT_AIR then + vdata[pos] = (pos + 2 * j) % 7 == 0 and c_cocoa2 or c_cocoa3 + vparam2[pos] = i - 1 + end + end + end + end + end, + flags = { + param2 = true, + }, +}) \ No newline at end of file diff --git a/mods/x_farming/coffee.lua b/mods/x_farming/coffee.lua new file mode 100644 index 00000000..31929f36 --- /dev/null +++ b/mods/x_farming/coffee.lua @@ -0,0 +1,141 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- COFFEE +x_farming.register_plant('x_farming:coffee', { + description = S('Coffee Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Coffee Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_coffee_seed.png', + steps = 5, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 0, +}) + +-- needed +minetest.override_item('x_farming:coffee', { + description = S('Coffee bean') .. '\n' .. S('Compost chance') .. ': 50%', + short_description = S('Coffee bean'), + groups = { + -- MTG + compost = 50, + -- MCL + compostability = 50, + } +}) + +minetest.register_craftitem('x_farming:bottle_coffee', { + description = S('Coffee Bottle'), + tiles = { 'x_farming_bottle_coffee.png' }, + inventory_image = 'x_farming_bottle_coffee.png', + wield_image = 'x_farming_bottle_coffee.png', + groups = { vessel = 1 }, +}) + +-- Hot cup of coffee +local coffee_cup_hot_def = { + description = S('Hot Cup of Coffee') .. '\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + short_description = S('Hot Cup of Coffee') .. '\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + drawtype = 'mesh', + mesh = 'x_farming_coffee_cup_hot.obj', + tiles = { 'x_farming_coffee_cup_hot_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_coffee_cup_hot.png', + wield_image = 'x_farming_coffee_cup_hot.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.4, 0.25, 0.5, 0.25 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.4, 0.25, 0, 0.25 } + }, + groups = { + -- MTG + vessel = 1, + dig_immediate = 3, + attached_node = 1, + -- MCL + food = 3, + eatable = 6, + handy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + }, + on_use = minetest.item_eat(6), + sounds = x_farming.node_sound_thin_glass_defaults(), + sunlight_propagates = true, + -- MCL + _mcl_saturation = 0.6, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, +} + +if x_farming.hbhunger ~= nil or x_farming.hunger_ng ~= nil then + coffee_cup_hot_def.description = coffee_cup_hot_def.description .. '\n' .. minetest.colorize(x_farming.colors.red, S('Heal') .. ': 4') + coffee_cup_hot_def.short_description = coffee_cup_hot_def.short_description .. '\n' .. minetest.colorize(x_farming.colors.red, S('Heal') .. ': 4') +end + +if minetest.get_modpath('mcl_farming') then + coffee_cup_hot_def.on_secondary_use = minetest.item_eat(6) +end + +minetest.register_node('x_farming:coffee_cup_hot', coffee_cup_hot_def) + +-- Crate +x_farming.register_crate('crate_coffee_3', { + description = S('Coffee Crate'), + short_description = S('Coffee Crate'), + tiles = { 'x_farming_crate_coffee_3.png' }, + _custom = { + crate_item = 'x_farming:coffee' + } +}) + +minetest.register_decoration(asuna.features.crops.coffee.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1104, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:coffee_3", + "x_farming:coffee_4", + "x_farming:coffee_5", + }, +})) diff --git a/mods/x_farming/composter.lua b/mods/x_farming/composter.lua new file mode 100644 index 00000000..066d47e2 --- /dev/null +++ b/mods/x_farming/composter.lua @@ -0,0 +1,238 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local function particle_effect(pos) + minetest.add_particlespawner({ + amount = 8, + time = 2, + minpos = { x = pos.x - 0.4, y = pos.y + 0.4, z = pos.z - 0.4 }, + maxpos = { x = pos.x + 0.4, y = pos.y + 0.6, z = pos.z + 0.4 }, + minvel = { x = -0.1, y = 0, z = -0.1 }, + maxvel = { x = 0.1, y = 0.1, z = 0.1 }, + minacc = vector.new({ x = -0.1, y = 0, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.1, z = 0.1 }), + minexptime = 1, + maxexptime = 2, + minsize = 1, + maxsize = 2, + texture = 'x_farming_x_bonemeal_particles.png', + animation = { + type = 'vertical_frames', + aspect_w = 8, + aspect_h = 8, + length = 3, + }, + }) +end + +for i = 1, 5, 1 do + local def = {} + + def.name = 'x_farming:composter_' .. i + def.description = S('Composter') .. ' ' .. i + def.short_description = S('Composter') .. ' ' .. i + def.drawtype = 'mesh' + def.mesh = 'x_farming_crate.obj' + def.tiles = { 'x_farming_composter_' .. i .. '.png' } + def.use_texture_alpha = 'clip' + def.sounds = x_farming.node_sound_wood_defaults() + def.paramtype = 'light' + def.paramtype2 = 'facedir' + def.place_param2 = 0 + def.is_ground_content = false + def.groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + flammable = 2, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + material_wood = 1, + deco_block = 1, + dirtifier = 1, + fire_encouragement = 3, + fire_flammability = 4, + } + def.stack_max = 1 + def.mod_origin = 'x_farming' + def.drop = 'x_farming:composter_1' + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local p_name = clicker:get_player_name() + + if minetest.is_protected(pos, p_name) then + return itemstack + end + + local wield_stack = clicker:get_wielded_item() + local wield_stack_name = wield_stack:get_name() + + -- percentage, higher = better, max 100% + local chance = 0 + + if minetest.get_item_group(wield_stack_name, 'compost') > 0 then + -- defined in groups, e.g. `{ compost = 10 }` + chance = minetest.get_item_group(wield_stack_name, 'compost') + elseif minetest.get_item_group(wield_stack_name, 'food_bread') == 1 + or minetest.get_item_group(wield_stack_name, 'wool') == 1 + or node.name == 'farming:straw' + then + chance = 85 + elseif minetest.get_item_group(wield_stack_name, 'flora') == 1 + or minetest.get_item_group(wield_stack_name, 'food_apple') == 1 + or minetest.get_item_group(wield_stack_name, 'fern') == 1 + or minetest.get_item_group(wield_stack_name, 'food_wheat') == 1 + or minetest.get_item_group(wield_stack_name, 'food_flour') == 1 + or minetest.get_item_group(wield_stack_name, 'mushroom') == 1 + or minetest.get_item_group(wield_stack_name, 'flower') == 1 + then + chance = 65 + elseif minetest.get_item_group(wield_stack_name, 'marram_grass') == 1 + or minetest.get_item_group(wield_stack_name, 'junglegrass') == 1 + or node.name == 'default:cactus' + or node.name == 'default:coral_green' + or node.name == 'default:coral_pink' + or node.name == 'default:coral_cyan' + then + chance = 50 + elseif minetest.get_item_group(wield_stack_name, 'leaves') == 1 + or minetest.get_item_group(wield_stack_name, 'seed') == 1 + or minetest.get_item_group(wield_stack_name, 'grass') == 1 + or minetest.get_item_group(wield_stack_name, 'snappy') == 3 + or minetest.get_item_group(wield_stack_name, 'sapling') == 1 + or minetest.get_item_group(wield_stack_name, 'food_blueberries') == 1 + or minetest.get_item_group(wield_stack_name, 'food_berry') == 1 + or node.name == 'default:sand_with_kelp' + or node.name == 'default:large_cactus_seedling' + then + chance = 30 + end + + if chance == 0 then + return itemstack + end + + -- fill the composter + if math.random() < chance / 100 then + local meta = minetest.get_meta(pos) + local prev_status = meta:get_int('composter_status') + local status = prev_status + 10 + + if status > 100 then + status = 100 + end + + meta:set_int('composter_status', status) + + local node_def = minetest.registered_nodes[node.name] + + if math.fmod(status, 50) == 0 and node_def._next_state then + local placenode = { name = node_def._next_state } + + minetest.swap_node(pos, placenode) + particle_effect(pos) + + if i == 3 then + -- placed nr 4 + minetest.get_node_timer(pos):start(math.random(1, 2)) + end + elseif i == 1 then + -- convert to visual 1st level + minetest.swap_node(pos, { name = 'x_farming:composter_2' }) + particle_effect(pos) + end + end + + minetest.sound_play('x_farming_dirt_hit', { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + itemstack:take_item() + end + + return itemstack + end + + if i == 1 then + -- empty composter is craftable, so can be in creative inventory + def.groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + material_wood = 1, + deco_block = 1, + dirtifier = 1, + fire_encouragement = 3, + fire_flammability = 4, + -- ALL + flammable = 2, + } + def.description = S('Composter') .. ' (' .. S('right-click/place with item to create compost') .. ')' + def.short_description = S('Composter') + end + + if i < 4 then + -- all except the last + def._next_state = 'x_farming:composter_' .. i + 1 + end + + if i == 4 then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + -- do nothing + end + + -- last step + def.on_timer = function(pos, elapsed) + minetest.swap_node(pos, { name = 'x_farming:composter_5' }) + end + end + + if i == 5 then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local p_name = clicker:get_player_name() + + if minetest.is_protected(pos, p_name) then + return itemstack + end + + local meta = minetest.get_meta(pos) + local above = vector.new(pos.x, pos.y + 0.5, pos.z) + local drop_pos = minetest.find_node_near(above, 0.5, { 'air' }) or above + + minetest.sound_play('x_farming_dirt_hit', { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + -- drop bonemeal + minetest.add_item( + vector.new(drop_pos.x, drop_pos.y + 1, drop_pos.z), + ItemStack({ name = 'x_farming:bonemeal', count = math.random(1, 2) }) + ) + -- swap to beginning + minetest.swap_node(pos, { name = 'x_farming:composter_1' }) + -- reset status + meta:set_int('composter_status', 0) + end + end + + -- MCL + def._mcl_hardness = 0.6 + def._mcl_blast_resistance = 0.6 + + minetest.register_node(def.name, def) +end diff --git a/mods/x_farming/corn.lua b/mods/x_farming/corn.lua new file mode 100644 index 00000000..833d74e9 --- /dev/null +++ b/mods/x_farming/corn.lua @@ -0,0 +1,200 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- CORN +x_farming.register_plant('x_farming:corn', { + description = S('Corn Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Corn Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_corn_seed.png', + steps = 10, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 3, +}) + +-- needed +local corn_def = { + description = S('Corn') .. '\n' .. S('Compost chance') .. ': 50%', + short_description = S('Corn'), + groups = { + -- X Farming + compost = 50, + -- MCL + compostability = 50, + }, +} + +minetest.override_item('x_farming:corn', corn_def) + +minetest.override_item('x_farming:corn_6', { + visual_scale = 2.0, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.6, 0.25 } + } +}) + +minetest.override_item('x_farming:corn_7', { + visual_scale = 2.0, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.6, 0.25 } + } +}) + +minetest.override_item('x_farming:corn_8', { + visual_scale = 2.0, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.6, 0.25 } + } +}) + +minetest.override_item('x_farming:corn_9', { + visual_scale = 2.0, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.6, 0.25 } + } +}) + +minetest.override_item('x_farming:corn_10', { + visual_scale = 2.0, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.6, 0.25 } + } +}) + +-- Popped corn +local popperd_corn_def = { + description = S('Popped corn') .. '\n' .. S('Compost chance') .. ': 50%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 1'), + short_description = S('Popped corn'), + inventory_image = 'x_farming_corn_pop.png', + groups = { + -- MTG + compost = 50, + -- MCL + food = 2, + eatable = 2, + compostability = 50 + }, +} + +if minetest.get_modpath('farming') then + popperd_corn_def.on_use = minetest.item_eat(1) +end + +if minetest.get_modpath('mcl_farming') then + popperd_corn_def.on_place = minetest.item_eat(1) + popperd_corn_def.on_secondary_use = minetest.item_eat(1) +end + +minetest.register_craftitem('x_farming:corn_pop', popperd_corn_def) + +-- Popcorn +local popcorn_def = { + description = S('Popcorn') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 5'), + short_description = S('Popcorn'), + drawtype = 'mesh', + mesh = 'x_farming_corn_popcorn.obj', + tiles = { 'x_farming_corn_popcorn_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_corn_popcorn.png', + wield_image = 'x_farming_corn_popcorn.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, 0.4, 0.3 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, 0.25, 0.3 } + }, + groups = { + -- MTG + dig_immediate = 3, + attached_node = 1, + -- X Farming + compost = 65, + -- MCL + food = 2, + eatable = 2, + compostability = 65, + handy = 1, + deco_block = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + }, + sounds = x_farming.node_sound_leaves_defaults(), + on_use = minetest.item_eat(5), + sunlight_propagates = true, + _mcl_saturation = 0.6, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, +} + +if minetest.get_modpath('mcl_farming') then + popcorn_def.on_secondary_use = minetest.item_eat(5) +end + +minetest.register_node('x_farming:corn_popcorn', popcorn_def) + +---crate +x_farming.register_crate('crate_corn_3', { + description = S('Corn Crate'), + short_description = S('Corn Crate'), + tiles = { 'x_farming_crate_corn_3.png' }, + _custom = { + crate_item = 'x_farming:corn' + } +}) + +minetest.register_decoration(asuna.features.crops.corn.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1105, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:corn_6", + "x_farming:corn_7", + "x_farming:corn_8", + "x_farming:corn_9", + "x_farming:corn_10", + }, +})) diff --git a/mods/x_farming/cotton.lua b/mods/x_farming/cotton.lua new file mode 100644 index 00000000..43706183 --- /dev/null +++ b/mods/x_farming/cotton.lua @@ -0,0 +1,83 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +if minetest.get_modpath("farming") then + minetest.register_alias("x_farming:cotton","farming:cotton") +else + -- COTTON + x_farming.register_plant('x_farming:cotton', { + description = S('Cotton Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Cotton Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_cotton_seed.png', + steps = 8, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 34, + }) + + -- needed + local cotton_def = { + description = S('Cotton') .. '\n' .. S('Compost chance') .. ': 50%', + short_description = S('Cotton'), + groups = { + -- X Farming + compost = 50, + -- MCL + compostability = 50, + } + } + + minetest.override_item('x_farming:cotton', cotton_def) + + minetest.register_decoration(asuna.features.crops.cotton.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1106, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:cotton_5", + "x_farming:cotton_6", + "x_farming:cotton_7", + "x_farming:cotton_8", + }, + })) +end + +-- Crate +x_farming.register_crate('crate_cotton2_3', { + description = S('Cotton Crate'), + short_description = S('Cotton Crate'), + tiles = { 'x_farming_crate_cotton2_3.png' }, + _custom = { + crate_item = 'x_farming:cotton' + } +}) \ No newline at end of file diff --git a/mods/x_farming/crafting.lua b/mods/x_farming/crafting.lua new file mode 100644 index 00000000..e392843f --- /dev/null +++ b/mods/x_farming/crafting.lua @@ -0,0 +1,1040 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- +-- Crafting recipes +-- + +-- Cocoa +minetest.register_craft({ + output = 'dye:brown', + recipe = { + { 'x_farming:cocoa_bean' }, + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:cookie 8', + recipe = { 'x_farming:barley', 'x_farming:cocoa_bean', 'x_farming:flour', 'x_farming:bottle_soymilk', 'x_farming:sugar' } +}) + +minetest.register_craft({ + output = 'x_farming:chocolate', + recipe = { + { '', '', 'x_farming:cocoa_bean' }, + { '', 'x_farming:cocoa_bean', '' }, + { 'default:paper', '', '' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:jungle_wood 4', + recipe = { + { 'x_farming:jungle_tree' }, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:jungle_tree', + burntime = 38, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:jungle_wood', + burntime = 9, +}) + +-- Soup Bowl +minetest.register_craft({ + output = 'x_farming:bowl 3', + recipe = { + { 'group:wood', '', 'group:wood' }, + { '', 'group:wood', '' } + } +}) + +-- fish stew +minetest.register_craft({ + output = 'x_farming:fish_stew', + recipe = { + { '', 'group:fish', '' }, + { 'x_farming:carrot', 'x_farming:bakedpotato', 'x_farming:salt' }, + { '', 'x_farming:bowl', '' } + } +}) + +minetest.register_craft({ + output = 'x_farming:beetroot_soup', + recipe = { + { 'x_farming:beetroot', 'x_farming:beetroot', 'x_farming:beetroot' }, + { 'x_farming:beetroot', 'x_farming:beetroot', 'x_farming:beetroot' }, + { '', 'x_farming:bowl', '' } + } +}) + +-- Carrot +minetest.register_craft({ + output = 'x_farming:carrot_golden', + recipe = { + { 'default:gold_lump', 'default:gold_lump', 'default:gold_lump' }, + { 'default:gold_lump', 'x_farming:carrot', 'default:gold_lump' }, + { 'default:gold_lump', 'default:gold_lump', 'default:gold_lump' } + }, +}) + +-- Coffee +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:bottle_coffee', + recipe = { 'x_farming:coffee', 'x_farming:bottle_water' } +}) + +if x_farming.vessels then + minetest.register_craft({ + type = 'cooking', + cooktime = 7, + output = 'x_farming:coffee_cup_hot', + recipe = 'x_farming:bottle_coffee', + replacements = { { 'x_farming:bottle_coffee', 'vessels:glass_bottle' } } + }) +else + minetest.register_craft({ + type = 'cooking', + cooktime = 7, + output = 'x_farming:coffee_cup_hot', + recipe = 'x_farming:bottle_coffee', + replacements = { { 'x_farming:bottle_coffee', 'x_farming:glass_bottle' } } + }) +end + +-- Corn +minetest.register_craft({ + type = 'cooking', + cooktime = 10, + output = 'x_farming:corn_pop', + recipe = 'x_farming:corn' +}) + +minetest.register_craft({ + output = 'x_farming:corn_popcorn', + recipe = { + { 'x_farming:corn_pop', 'x_farming:corn_pop', 'x_farming:corn_pop' }, + { 'default:paper', 'x_farming:salt', 'default:paper' }, + { 'default:paper', 'default:paper', 'default:paper' }, + } +}) + +-- Melon +minetest.register_craft({ + output = 'x_farming:golden_melon', + recipe = { + { 'default:gold_lump', 'default:gold_lump', 'default:gold_lump' }, + { 'default:gold_lump', 'x_farming:melon', 'default:gold_lump' }, + { 'default:gold_lump', 'default:gold_lump', 'default:gold_lump' } + }, +}) + +minetest.register_craft({ + output = 'x_farming:melon_block', + recipe = { + { 'x_farming:melon', 'x_farming:melon', 'x_farming:melon' }, + { 'x_farming:melon', 'x_farming:melon', 'x_farming:melon' }, + { 'x_farming:melon', 'x_farming:melon', 'x_farming:melon' } + }, +}) + +-- Obsidian Wart +minetest.register_craft({ + type = 'cooking', + cooktime = 10, + output = 'x_farming:wart_brick', + recipe = 'x_farming:obsidian_wart' +}) + +minetest.register_craft({ + output = 'x_farming:wart_block', + groups = { compost = 85 }, + recipe = { + { 'x_farming:obsidian_wart', 'x_farming:obsidian_wart', 'x_farming:obsidian_wart' }, + { 'x_farming:obsidian_wart', 'x_farming:obsidian_wart', 'x_farming:obsidian_wart' }, + { 'x_farming:obsidian_wart', 'x_farming:obsidian_wart', 'x_farming:obsidian_wart' } + } +}) + +minetest.register_craft({ + output = 'x_farming:wart_brick_block', + recipe = { + { 'x_farming:wart_brick', 'x_farming:wart_brick', '' }, + { 'x_farming:wart_brick', 'x_farming:wart_brick', '' } + } +}) + +minetest.register_craft({ + output = 'x_farming:wart_red_brick_block', + recipe = { + { 'x_farming:obsidian_wart', 'x_farming:wart_brick', '' }, + { 'x_farming:wart_brick', 'x_farming:obsidian_wart', '' } + }, +}) + +minetest.register_craft({ + output = 'x_farming:wartrack 4', + recipe = { + { 'x_farming:wart_block', 'x_farming:wart_block', '' }, + { 'x_farming:wart_block', 'x_farming:wart_block', '' } + }, +}) + +minetest.register_craft({ + type = 'cooking', + cooktime = 10, + output = 'x_farming:bakedpotato', + recipe = 'x_farming:potato' +}) + +-- Pumpkin +-- pumpkin lantern recipe +minetest.register_craft({ + output = 'x_farming:pumpkin_lantern', + recipe = { + { '', '', '' }, + { '', 'x_farming:pumpkin_block', '' }, + { '', 'group:torch', '' } + }, +}) + +-- pumpkin pie crafting recipe +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:pumpkin_pie', + recipe = { 'group:pumpkin', 'x_farming:flour', 'x_farming:bottle_soymilk', 'x_farming:sugar' } +}) + +-- pumpkin block carving +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:pumpkin_block', + recipe = { 'x_farming:pumpkin_fruit' } +}) + +--- FUELS + +-- pumpkin as fuel (better than cactus) +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:pumpkin_block', + burntime = 20, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:pumpkin_lantern', + burntime = 20, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:string', + burntime = 1, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:barley', + burntime = 1, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:rice', + burntime = 1, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:cotton', + burntime = 1, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:hoe_wood', + burntime = 5, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'group:pillow', + burntime = 5, +}) + +-- Bottle Water +if minetest.get_modpath("bottles_default") then + -- do nothing, water bottles are implemented via Filled Bottles mod +elseif x_farming.vessels then + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:bottle_water 5', + recipe = { + 'vessels:glass_bottle', 'vessels:glass_bottle', 'vessels:glass_bottle', + 'vessels:glass_bottle', 'vessels:glass_bottle', 'bucket:bucket_water' + }, + replacements = { { 'bucket:water_bucket', 'bucket:bucket_empty' } }, + }) + + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:bottle_water 5', + recipe = { + 'vessels:glass_bottle', 'vessels:glass_bottle', 'vessels:glass_bottle', + 'vessels:glass_bottle', 'vessels:glass_bottle', 'x_farming:seed_salt' + }, + replacements = { { 'x_farming:seed_salt', 'x_farming:seed_salt' } }, + }) +else + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:bottle_water 5', + recipe = { + 'x_farming:glass_bottle', 'x_farming:glass_bottle', 'x_farming:glass_bottle', + 'x_farming:glass_bottle', 'x_farming:glass_bottle', 'bucket:bucket_water' + }, + replacements = { { 'bucket:water_bucket', 'bucket:bucket_empty' } }, + }) + + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:bottle_water 5', + recipe = { + 'x_farming:glass_bottle', 'x_farming:glass_bottle', 'x_farming:glass_bottle', + 'x_farming:glass_bottle', 'x_farming:glass_bottle', 'x_farming:seed_salt' + }, + replacements = { { 'x_farming:seed_salt', 'x_farming:seed_salt' } }, + }) +end + +-- Donuts +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:donut', + recipe = { 'x_farming:bottle_soymilk', 'x_farming:sugar', 'x_farming:flour' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:donut_chocolate', + recipe = { 'x_farming:bottle_soymilk', 'x_farming:sugar', 'x_farming:flour', 'x_farming:cocoa_bean' } +}) + +-- Fries + +minetest.register_craft({ + output = 'x_farming:fries', + recipe = { + { '', '', 'x_farming:salt' }, + { '', 'x_farming:bakedpotato', '' }, + { 'default:paper', '', '' } + }, +}) + +-- Ice Fishing + +minetest.register_craft({ + output = 'x_farming:seed_icefishing', + recipe = { + { 'group:pillow', 'x_farming:string', 'group:stick' }, + { '', 'x_farming:string', 'group:stick' }, + { '', 'x_farming:string', 'group:stick' } + }, +}) + +minetest.register_craft({ + output = 'dye:black 4', + recipe = { + { 'x_farming:black_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:blue 4', + recipe = { + { 'x_farming:blue_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:brown 4', + recipe = { + { 'x_farming:brown_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:cyan 4', + recipe = { + { 'x_farming:cyan_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:dark_grey 4', + recipe = { + { 'x_farming:gray_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:grey 4', + recipe = { + { 'x_farming:light_gray_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:dark_green 4', + recipe = { + { 'x_farming:green_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:green 4', + recipe = { + { 'x_farming:lime_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:magenta 4', + recipe = { + { 'x_farming:magenta_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:orange 4', + recipe = { + { 'x_farming:orange_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:pink 4', + recipe = { + { 'x_farming:pink_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:violet 4', + recipe = { + { 'x_farming:purple_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:red 4', + recipe = { + { 'x_farming:red_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:white 4', + recipe = { + { 'x_farming:white_seashroom' } + } +}) + +minetest.register_craft({ + output = 'dye:yellow 4', + recipe = { + { 'x_farming:yellow_seashroom' } + } +}) + +minetest.register_craft({ + output = 'default:diamond', + recipe = { + { 'x_farming:diamond_angler' } + } +}) + +minetest.register_craft({ + output = 'default:gold_lump', + recipe = { + { 'x_farming:goldfish' } + } +}) + +minetest.register_craft({ + output = 'default:gold_ingot', + recipe = { + { 'x_farming:true_goldfish' } + } +}) + +minetest.register_craft({ + output = 'default:iron_lump', + recipe = { + { 'x_farming:ironfish' } + } +}) + +minetest.register_craft({ + output = 'x_farming:seed_pumpkin', + recipe = { + { 'x_farming:pumpkinseed' } + } +}) + + +-- crates and bags +minetest.register_craft({ + output = 'x_farming:crate_empty', + recipe = { + { 'group:wood', 'group:stick', 'group:wood' }, + { 'group:wood', 'group:stick', 'group:wood' }, + { 'group:wood', 'group:wood', 'group:wood' } + } +}) + +minetest.register_craft({ + output = 'x_farming:bag_empty', + recipe = { + { 'x_farming:barley_stack', '', 'x_farming:barley_stack' }, + { 'x_farming:barley_stack', '', 'x_farming:barley_stack' }, + { 'x_farming:barley_stack', 'x_farming:barley_stack', 'x_farming:barley_stack' } + } +}) + +-- composter +minetest.register_craft({ + output = 'x_farming:composter_1', + recipe = { + { 'group:wood', 'group:fence', 'group:wood' }, + { 'group:wood', 'group:fence', 'group:wood' }, + { 'group:wood', 'group:wood', 'group:wood' } + } +}) + +-- Cactus brick +minetest.register_craft({ + output = 'x_farming:cactus_brick', + recipe = { + { 'x_farming:cactus_fruit_item', 'x_farming:cactus_fruit_item' }, + { 'x_farming:cactus_fruit_item', 'x_farming:cactus_fruit_item' }, + } +}) + +-- Scarecrow +minetest.register_craft({ + output = 'x_farming:scarecrow', + recipe = { + { '', 'x_farming:pumpkin_block', '' }, + { 'x_farming:barley_stack', 'group:pillow', 'x_farming:barley_stack' }, + { '', 'group:wood', '' }, + } +}) + +-- Pine wood +minetest.register_craft({ + output = 'x_farming:pine_nut_wood 4', + recipe = { + { 'x_farming:pine_nut_tree' }, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:pine_nut_wood', + burntime = 6, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:pine_nut_tree', + burntime = 26, +}) + +minetest.register_craft({ + type = 'cooking', + cooktime = 7, + output = 'x_farming:pine_nut_roasted', + recipe = 'x_farming:pine_nut' +}) + +-- Kiwi + +minetest.register_craft({ + output = 'x_farming:kiwi_wood 4', + recipe = { + { 'x_farming:kiwi_tree' }, + } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:kiwi_wood', + burntime = 8, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:kiwi_tree', + burntime = 22, +}) + +-- Christmas tree +minetest.register_craft({ + output = 'x_farming:christmas_tree_sapling', + recipe = { + { 'default:goldblock', 'default:meselamp', 'default:goldblock' }, + { 'x_farming:pillow_green', 'default:pine_sapling', 'x_farming:pillow_blue' }, + { 'x_farming:pillow_yellow', 'default:pine_sapling', 'x_farming:pillow_red' } + } +}) + +-- Barley + +minetest.register_craft({ + output = 'x_farming:barley_stack 3', + recipe = { + { 'x_farming:barley', 'x_farming:barley', 'x_farming:barley' }, + { 'x_farming:barley', 'x_farming:barley', 'x_farming:barley' }, + { 'x_farming:barley', 'x_farming:barley', 'x_farming:barley' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:barley 3', + recipe = { + { 'x_farming:barley_stack' }, + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:flour', + recipe = { 'x_farming:barley', 'x_farming:barley', 'x_farming:barley', 'x_farming:barley' } +}) + +minetest.register_craft({ + type = 'cooking', + cooktime = 15, + output = 'x_farming:bread', + recipe = 'x_farming:flour' +}) + +-- Cotton +minetest.register_craft({ + output = 'x_farming:pillow_white', + recipe = { + { 'x_farming:cotton', 'x_farming:cotton' }, + { 'x_farming:cotton', 'x_farming:cotton' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:string 2', + recipe = { + { 'x_farming:cotton' }, + { 'x_farming:cotton' }, + } +}) + +-- Soybean +minetest.register_craft({ + type = 'cooking', + output = 'x_farming:bottle_soymilk', + recipe = 'x_farming:bottle_soymilk_raw', + cooktime = 15, +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:soybean', + burntime = 1, +}) + +-- Stevia + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:sugar', + recipe = { 'x_farming:stevia', 'x_farming:stevia', 'x_farming:stevia', 'x_farming:stevia' } +}) + +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:stevia', + burntime = 1, +}) + +-- Empty Jar +minetest.register_craft({ + output = 'x_farming:jar_empty', + recipe = { + { 'x_farming:glass_bottle', 'x_farming:glass_bottle' } + } +}) + +minetest.register_craft({ + output = 'x_farming:jar_empty', + recipe = { + { 'vessels:glass_bottle', 'vessels:glass_bottle' } + } +}) + +-- Hive +minetest.register_craft({ + output = 'x_farming:bee_hive', + recipe = { + { 'group:wood', 'group:wood', 'group:wood' }, + { 'x_farming:honeycomb', 'x_farming:honeycomb', 'x_farming:honeycomb' }, + { 'group:wood', 'group:wood', 'group:wood' } + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:honeycomb', + recipe = { 'x_farming:jar_with_bee', 'x_farming:jar_with_bee', 'x_farming:jar_with_bee' } +}) + +-- Honeycomb saw +minetest.register_craft({ + output = 'x_farming:honeycomb_saw', + recipe = { + { '', 'x_farming:honeycomb', 'default:steel_ingot' }, + { 'x_farming:honeycomb', 'default:steel_ingot', '' }, + { 'group:stick', '', '' } + } +}) + +minetest.register_craft({ + output = 'x_farming:honeycomb_block', + recipe = { + { 'x_farming:honeycomb', 'x_farming:honeycomb' }, + { 'x_farming:honeycomb', 'x_farming:honeycomb' }, + }, +}) + +minetest.register_craft({ + output = 'x_farming:honey_block', + recipe = { + { 'x_farming:bottle_honey', 'x_farming:bottle_honey' }, + { 'x_farming:bottle_honey', 'x_farming:bottle_honey' }, + }, + replacements = { + { 'x_farming:bottle_honey', 'x_farming:glass_bottle' }, + { 'x_farming:bottle_honey', 'x_farming:glass_bottle' }, + { 'x_farming:bottle_honey', 'x_farming:glass_bottle' }, + { 'x_farming:bottle_honey', 'x_farming:glass_bottle' }, + }, +}) + +minetest.register_craft({ + output = 'x_farming:honey_block', + recipe = { + { 'x_farming:bottle_honey', 'x_farming:bottle_honey' }, + { 'x_farming:bottle_honey', 'x_farming:bottle_honey' }, + }, + replacements = { + { 'x_farming:bottle_honey', 'vessels:glass_bottle' }, + { 'x_farming:bottle_honey', 'vessels:glass_bottle' }, + { 'x_farming:bottle_honey', 'vessels:glass_bottle' }, + { 'x_farming:bottle_honey', 'vessels:glass_bottle' }, + }, +}) + +-- Candles + +minetest.register_craft({ + output = 'x_farming:candle_off_1', + recipe = { + { 'x_farming:string' }, + { 'x_farming:honeycomb' }, + }, +}) + +minetest.register_craft({ + output = 'x_farming:candle_off_1', + recipe = { + { 'farming:string' }, + { 'x_farming:honeycomb' }, + }, +}) + +-- Rope + +minetest.register_craft({ + output = 'x_farming:rope', + recipe = { + { '', 'x_farming:barley', '' }, + { '', 'x_farming:barley', '' }, + { '', 'x_farming:barley', '' } + } +}) + +minetest.register_craft({ + output = 'x_farming:rope', + recipe = { + { '', 'group:vine', '' }, + { '', 'group:vine', '' }, + { '', 'group:vine', '' } + } +}) + +if minetest.get_modpath("ethereal") then + minetest.register_craft({ + output = 'x_farming:rope', + recipe = { + { '', 'ethereal:vine', '' }, + { '', 'ethereal:vine', '' }, + { '', 'ethereal:vine', '' } + } + }) +end + +if minetest.get_modpath("farming") and farming.mod == "redo" then + minetest.register_alias_force("farming:hemp_rope","x_farming:rope") + minetest.register_craft({ + output = 'x_farming:rope', + recipe = { + { '', 'farming:hemp_fibre', '' }, + { '', 'farming:hemp_fibre', '' }, + { '', 'farming:hemp_fibre', '' } + } + }) +end + +minetest.register_craft({ + output = 'x_farming:rope_fence 4', + recipe = { + { 'x_farming:rope', 'x_farming:rope', 'x_farming:rope' }, + { 'x_farming:rope', 'x_farming:rope', 'x_farming:rope' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:safety_net', + recipe = { + { 'x_farming:rope', 'x_farming:rope' }, + { 'x_farming:rope', 'x_farming:rope' }, + } +}) + +-- Rice +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:silt_loam_soil', + recipe = { 'group:soil', 'default:clay', 'group:sand' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:silt_loam_soil', + recipe = { 'group:soil', 'default:clay', 'group:everness_sand' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:silt_loam_soil', + recipe = { 'group:soil', 'group:hardenedclay', 'group:sand' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:silt_loam_soil', + recipe = { 'group:soil', 'group:hardenedclay', 'group:everness_sand' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:silt_loam_soil', + recipe = { 'group:soil', 'group:hardenedclay_smooth', 'group:sand' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:silt_loam_soil', + recipe = { 'group:soil', 'group:hardenedclay_smooth', 'group:everness_sand' } +}) + +minetest.register_craft({ + type = 'cooking', + output = 'x_farming:rice_grains', + recipe = 'x_farming:rice' +}) + +minetest.register_craft({ + output = 'x_farming:rice_stack 3', + recipe = { + { 'x_farming:rice', 'x_farming:rice', 'x_farming:rice' }, + { 'x_farming:rice', 'x_farming:rice', 'x_farming:rice' }, + { 'x_farming:rice', 'x_farming:rice', 'x_farming:rice' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:rice 3', + recipe = { + { 'x_farming:rice_stack' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:silt_loam_brick_block', + recipe = { + { 'x_farming:silt_loam_brick', 'x_farming:silt_loam_brick' }, + { 'x_farming:silt_loam_brick', 'x_farming:silt_loam_brick' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:silt_loam_brick 4', + recipe = { + { 'x_farming:silt_loam_brick_block' }, + } +}) + +minetest.register_craft({ + type = 'cooking', + output = 'x_farming:silt_loam_brick', + recipe = 'x_farming:silt_loam_soil', +}) + +minetest.register_craft({ + output = 'x_farming:stove', + recipe = { + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' }, + { 'x_farming:silt_loam_brick_block', '', 'x_farming:silt_loam_brick_block' }, + { 'x_farming:silt_loam_brick_block', 'default:furnace', 'x_farming:silt_loam_brick_block' } + } +}) + +-- Sushi + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:sushi_maki', + recipe = { 'x_farming:rice_grains', 'default:sand_with_kelp', 'group:fish' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:sushi_nigiri', + recipe = { 'x_farming:rice_grains', 'group:fish' } +}) + +-- Feasts + +minetest.register_craft({ + output = 'x_farming:french_potatoes_1', + recipe = { + { 'x_farming:bakedpotato', 'x_farming:bottle_soymilk', 'x_farming:bakedpotato' }, + { 'x_farming:bakedpotato', 'x_farming:corn', 'x_farming:bakedpotato' }, + { 'x_farming:salt', 'x_farming:bowl', 'x_farming:salt' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:baked_fish_1', + recipe = { + { 'x_farming:beetroot', 'x_farming:rice_grains', 'x_farming:beetroot' }, + { 'x_farming:carrot', 'group:fish', 'x_farming:carrot' }, + { 'x_farming:salt', 'x_farming:bowl', 'x_farming:salt' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:melon_slush_1', + recipe = { + { 'x_farming:sugar', 'x_farming:melon_block', 'x_farming:sugar' }, + { 'default:ice', 'x_farming:melon_block', 'default:ice' }, + { 'default:ice', 'default:glass', 'default:ice' }, + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:french_potatoes_1', + recipe = { 'x_farming:bowl_french_potatoes', 'x_farming:bowl_french_potatoes', 'x_farming:bowl_french_potatoes', 'x_farming:bowl_french_potatoes' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:baked_fish_1', + recipe = { 'x_farming:bowl_baked_fish', 'x_farming:bowl_baked_fish', 'x_farming:bowl_baked_fish', 'x_farming:bowl_baked_fish' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:melon_slush_1', + recipe = { 'x_farming:bowl_melon_slush', 'x_farming:bowl_melon_slush', 'x_farming:bowl_melon_slush', 'x_farming:bowl_melon_slush' } +}) + +-- Pies +minetest.register_craft({ + output = 'x_farming:strawberry_pie_1', + recipe = { + { 'x_farming:barley', 'x_farming:barley', 'x_farming:barley' }, + { 'x_farming:strawberry', 'x_farming:strawberry', 'x_farming:strawberry' }, + { 'x_farming:sugar', 'x_farming:flour', 'x_farming:sugar' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:chocolate_pie_1', + recipe = { + { 'x_farming:chocolate', 'x_farming:chocolate', 'x_farming:chocolate' }, + { 'x_farming:bottle_soymilk', 'x_farming:bottle_soymilk', 'x_farming:bottle_soymilk' }, + { 'x_farming:sugar', 'x_farming:flour', 'x_farming:sugar' }, + } +}) + +minetest.register_craft({ + output = 'x_farming:honey_kiwi_pie_1', + recipe = { + { 'x_farming:bottle_honey', 'x_farming:bottle_honey', 'x_farming:bottle_honey' }, + { 'x_farming:kiwi_fruit', 'x_farming:kiwi_fruit', 'x_farming:kiwi_fruit' }, + { 'x_farming:bottle_soymilk', 'x_farming:flour', 'x_farming:bottle_soymilk' }, + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:strawberry_pie_1', + recipe = { 'x_farming:slice_strawberry_pie', 'x_farming:slice_strawberry_pie', 'x_farming:slice_strawberry_pie', 'x_farming:slice_strawberry_pie' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:chocolate_pie_1', + recipe = { 'x_farming:slice_chocolate_pie', 'x_farming:slice_chocolate_pie', 'x_farming:slice_chocolate_pie', 'x_farming:slice_chocolate_pie' } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:honey_kiwi_pie_1', + recipe = { 'x_farming:slice_honey_kiwi_pie', 'x_farming:slice_honey_kiwi_pie', 'x_farming:slice_honey_kiwi_pie', 'x_farming:slice_honey_kiwi_pie' } +}) diff --git a/mods/x_farming/craftitems.lua b/mods/x_farming/craftitems.lua new file mode 100644 index 00000000..6f07ac8a --- /dev/null +++ b/mods/x_farming/craftitems.lua @@ -0,0 +1,214 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- +-- Craft items +-- + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Flour + +minetest.register_craftitem('x_farming:flour', { + description = S('Barley Flour'), + inventory_image = 'x_farming_flour.png', + groups = { food_flour = 1, flammable = 1 }, +}) + +-- Bread + +local bread_def = { + description = S('Barley Bread'), + inventory_image = 'x_farming_bread.png', + groups = { + -- MTG + food_bread = 1, + flammable = 2, + -- MCL + food = 2, + eatable = 5, + compostability = 85 + }, + _mcl_saturation = 6.0, +} + +if minetest.get_modpath('farming') then + bread_def.on_use = minetest.item_eat(5) +end + +if minetest.get_modpath('mcl_farming') then + bread_def.on_place = minetest.item_eat(5) + bread_def.on_secondary_use = minetest.item_eat(5) +end + +minetest.register_craftitem('x_farming:bread', bread_def) + +-- String( +if minetest.get_modpath("farming") then + minetest.register_alias("x_farming:string","farming:string") +else + minetest.register_craftitem('x_farming:string', { + description = S('Cotton String'), + inventory_image = 'x_farming_string.png', + groups = { flammable = 2 }, + }) +end + +-- Soup Bowl +if minetest.registered_items["farming:bowl"] then + minetest.register_alias("x_farming:bowl","farming:bowl") +else + minetest.register_craftitem('x_farming:bowl', { + description = S('Empty Soup Bowl'), + inventory_image = 'x_farming_bowl.png', + }) +end + +-- Bottle Water +if minetest.registered_items["bottles:bottle_of_water"] then + minetest.register_alias("x_farming:bottle_water","bottles:bottle_of_water") +else + minetest.register_craftitem('x_farming:bottle_water', { + description = S('Water Bottle'), + tiles = { 'x_farming_bottle_water.png' }, + inventory_image = 'x_farming_bottle_water.png', + wield_image = 'x_farming_bottle_water.png', + groups = { vessel = 1 }, + }) +end + +-- Bottle Honey +local bottle_honey_def = { + description = S('Honey Bottle') .. '\n' .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + tiles = { 'x_farming_bottle_honey.png' }, + inventory_image = 'x_farming_bottle_honey.png', + wield_image = 'x_farming_bottle_honey.png', + groups = { + -- MCL + craftitem = 1, + food = 3, + eatable = 6, + can_eat_when_full = 1 + }, + _mcl_saturation = 1.2, +} + +if minetest.get_modpath('farming') then + if x_farming.vessels then + bottle_honey_def.on_use = minetest.item_eat(6, 'vessels:glass_bottle') + else + bottle_honey_def.on_use = minetest.item_eat(6, 'x_farming:glass_bottle') + end +end + +if minetest.get_modpath('mcl_farming') then + if x_farming.vessels then + bottle_honey_def.on_place = minetest.item_eat(6, 'x_farming:glass_bottle') + bottle_honey_def.on_secondary_use = minetest.item_eat(6, 'x_farming:glass_bottle') + else + bottle_honey_def.on_place = minetest.item_eat(6, 'x_farming:glass_bottle') + bottle_honey_def.on_secondary_use = minetest.item_eat(6, 'x_farming:glass_bottle') + end +end + +minetest.register_craftitem('x_farming:bottle_honey', bottle_honey_def) + +-- Honeycomb +minetest.register_craftitem('x_farming:honeycomb', { + description = S('Honeycomb'), + inventory_image = 'x_farming_honeycomb.png', +}) + +-- Jar empty +minetest.register_craftitem('x_farming:jar_empty', { + description = S('Empty Jar - Right-click to catch Bee with it'), + inventory_image = 'x_farming_jar_empty.png', + groups = { vessel = 1 } +}) + +-- Jar with bee +minetest.register_craftitem('x_farming:jar_with_bee', { + description = S('Jar with Bee - Right-click to add bee to a Hive'), + inventory_image = 'x_farming_jar_with_bee.png', + groups = { bee = 1, not_in_creative_inventory = 1 } +}) + +-- Rice +minetest.register_craftitem('x_farming:rice_grains', { + description = S('Rice Grains'), + inventory_image = 'x_farming_rice_grains.png', +}) + +-- Sushi +local sushi_maki_def = { + description = S('Sushi Maki') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 5'), + inventory_image = 'x_farming_sushi_maki.png', + groups = { + -- MTG + flammable = 2, + -- MCL + food = 2, + eatable = 5, + compostability = 85 + }, + _mcl_saturation = 6.0, +} + +if minetest.get_modpath('farming') then + sushi_maki_def.on_use = minetest.item_eat(5) +end + +if minetest.get_modpath('mcl_farming') then + sushi_maki_def.on_place = minetest.item_eat(5) + sushi_maki_def.on_secondary_use = minetest.item_eat(5) +end + +minetest.register_craftitem('x_farming:sushi_maki', sushi_maki_def) + +local sushi_nigiri_def = { + description = S('Sushi Nigiri') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 3'), + inventory_image = 'x_farming_sushi_nigiri.png', + groups = { + -- MTG + flammable = 2, + -- MCL + food = 2, + eatable = 3, + compostability = 85 + }, + _mcl_saturation = 4.0, +} + +if minetest.get_modpath('farming') then + sushi_nigiri_def.on_use = minetest.item_eat(3) +end + +if minetest.get_modpath('mcl_farming') then + sushi_nigiri_def.on_place = minetest.item_eat(3) + sushi_nigiri_def.on_secondary_use = minetest.item_eat(3) +end + +minetest.register_craftitem('x_farming:sushi_nigiri', sushi_nigiri_def) + +-- Brick +minetest.register_craftitem('x_farming:silt_loam_brick', { + description = S('Silt Loam Brick'), + inventory_image = 'x_farming_silt_loam_brick.png', +}) diff --git a/mods/x_farming/crates.lua b/mods/x_farming/crates.lua new file mode 100644 index 00000000..2d4dbb08 --- /dev/null +++ b/mods/x_farming/crates.lua @@ -0,0 +1,122 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +---Crates +x_farming.register_crate('crate_empty', { + description = S('Empty Crate'), + tiles = { 'x_farming_crate_empty.png' }, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + material_wood = 1, + deco_block = 1, + fire_encouragement = 3, + fire_flammability = 4, + -- ALL + flammable = 2 + }, + stack_max = tonumber(minetest.settings:get('default_stack_max')) or 99 +}) + +if minetest.get_modpath('farming') then + ---crate wheat + x_farming.register_crate('crate_wheat_3', { + description = S('Wheat Crate'), + short_description = S('Wheat Crate'), + tiles = { 'x_farming_crate_wheat_3.png' }, + _custom = { + crate_item = 'farming:wheat' + } + }) + + ---crate cotton + x_farming.register_crate('crate_cotton_3', { + description = S('Cotton Crate'), + short_description = S('Cotton Crate'), + tiles = { 'x_farming_crate_cotton_3.png' }, + _custom = { + crate_item = 'farming:cotton' + } + }) + + if farming.mod == "redo" then + -- Register crates for Farming Redo crops + for name,crop in pairs({ + Artichoke = "artichoke", + Asparagus = "asparagus", + Barley = "barley", + Beans = "beans", + Beetroot = "beetroot", + Blackberry = "blackberry", + Blueberry = "blueberry", + Cabbage = "cabbage", + Carrot = "carrot", + Chili = "chili_pepper", + Cocoa = "cocoa_beans", + Coffee = "coffee_beans", + Corn = "corn", + --Cotton = "cotton", + Cucumber = "cucumber", + Eggplant = "eggplant", + Garlic = "garlic", + Ginger = "ginger", + Grapes = "grapes", + Hemp = "hemp_leaf", + Lettuce = "lettuce", + Melon = "melon", + Mint = "mint_leaf", + Oat = "oat", + Onion = "onion", + Parsley = "parsley", + Peas = "pea_pod", + Pepper = "pepper", + ["Yellow Pepper"] = "pepper_yellow", + ["Red Pepper"] = "pepper_red", + Pineapple = "pineapple", + Potato = "potato", + Pumpkin = "pumpkin", + Raspberry = "raspberry", + Rhubarb = "rhubarb", + Rice = "rice", + Rye = "rye", + Soy = "soy_pod", + Spinach = "spinach", + Strawberry = "strawberry", + Sunflower = "sunflower", + Tomato = "tomato", + Vanilla = "vanilla", + -- "Wheat", + }) do + if minetest.registered_items["farming:" .. crop] then + x_farming.register_crate("crate_" .. crop .. "_3", { + description = name .. " Crate", + short_description = name .. " Crate", + tiles = { "x_farming_crate_" .. crop .. "_3.png" }, + _custom = { + crate_item = "farming:" .. crop, + }, + }) + end + end + end +end diff --git a/mods/x_farming/functions.lua b/mods/x_farming/functions.lua new file mode 100644 index 00000000..adfff05d --- /dev/null +++ b/mods/x_farming/functions.lua @@ -0,0 +1,47 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it pos the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- Activate timers on bees which were spawned without starting the timer (bug was fixed in 5d04f7fdc5cb43e7573438a864c3730e05cff608) +minetest.register_lbm({ + -- Descriptive label for profiling purposes (optional). + -- Definitions with identical labels will be listed as one. + label = 'x_farming_bee_timers', + + -- Identifier of the LBM, should follow the modname: convention + name = 'x_farming:bee_timers', + + -- List of node names to trigger the LBM on. + -- Names of non-registered nodes and groups (as group:groupname) + -- will work as well. + nodenames = { + 'x_farming:bee', + 'x_farming:lotus_flower_purple', + 'x_farming:lotus_flower_pink' + }, + + -- Function triggered for each qualifying node. + -- `dtime_s` is the in-game time (in seconds) elapsed since the block + -- was last active + action = function(pos, node, dtime_s) + local timer = minetest.get_node_timer(pos) + + if not timer:is_started() then + minetest.get_node_timer(pos):start(1) + end + end +}) diff --git a/mods/x_farming/hoes.lua b/mods/x_farming/hoes.lua new file mode 100644 index 00000000..d500dd0e --- /dev/null +++ b/mods/x_farming/hoes.lua @@ -0,0 +1,56 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local hoe_wood_def = { + description = S('Wooden Hoe'), + inventory_image = 'x_farming_tool_woodhoe.png', + wield_scale = { x = 2, y = 2, z = 1 }, + max_uses = 30, + material = 'group:wood', + groups = { hoe = 1, flammable = 2 }, +} + +local hoe_stone_def = { + description = S('Stone Hoe'), + inventory_image = 'x_farming_tool_stonehoe.png', + wield_scale = { x = 2, y = 2, z = 1 }, + max_uses = 90, + material = 'group:stone', + groups = { hoe = 1 } +} + +local hoe_steel_def = { + description = S('Steel Hoe'), + inventory_image = 'x_farming_tool_steelhoe.png', + wield_scale = { x = 2, y = 2, z = 1 }, + max_uses = 500, + material = 'default:steel_ingot', + groups = { hoe = 1 } +} + +if minetest.get_modpath('farming') then + minetest.override_item('farming:hoe_wood', hoe_wood_def) + minetest.override_item('farming:hoe_stone', hoe_stone_def) + minetest.override_item('farming:hoe_steel', hoe_steel_def) +else + x_farming.register_hoe('x_farming:hoe_wood', hoe_wood_def) + x_farming.register_hoe('x_farming:hoe_stone', hoe_stone_def) + x_farming.register_hoe('x_farming:hoe_steel', hoe_steel_def) +end diff --git a/mods/x_farming/ice_fishing.lua b/mods/x_farming/ice_fishing.lua new file mode 100644 index 00000000..0b151383 --- /dev/null +++ b/mods/x_farming/ice_fishing.lua @@ -0,0 +1,1111 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +---ICE FISHING +local icefishing = { + drops = { + treasure = { + "default:mese_crystal", + "default:diamond", + "x_farming:diamond_angler", + "x_farming:goldfish", + "x_farming:true_goldfish", + "x_farming:rusty_skullfin", + "x_farming:slimefish", + "x_farming:illager_ghostfish", + "x_farming:father_sun", + "x_farming:mother_moon", + }, + tier_1 = { + "default:stick", + "default:wood", + "default:coral_brown", + "default:coral_orange", + "default:coral_skeleton", + "bones:bones", + "default:clay", + "x_farming:sea_cucumber", + "default:sand_with_kelp" + }, + tier_2 = { + "x_farming:shrimp", + "x_farming:anchovy", + "x_farming:albacore", + "x_farming:black_seashroom", + "x_farming:blue_seashroom", + "x_farming:brown_seashroom", + "x_farming:cyan_seashroom", + "x_farming:gray_seashroom", + "x_farming:light_gray_seashroom", + "x_farming:green_seashroom", + "x_farming:lime_seashroom", + "x_farming:magenta_seashroom", + "x_farming:orange_seashroom", + "x_farming:pink_seashroom", + "x_farming:purple_seashroom", + "x_farming:red_seashroom", + "x_farming:white_seashroom", + "x_farming:yellow_seashroom", + "default:sand_with_kelp" + }, + tier_3 = { + "x_farming:goldeye", + "x_farming:halibut", + "x_farming:herring", + "x_farming:ironfish", + "x_farming:pearlwog", + "x_farming:blobfish", + "x_farming:tancho_koi", + "x_farming:pike", + }, + tier_4 = { + "x_farming:red_mullet", + "x_farming:rainbow_trout", + "x_farming:crab", + "x_farming:lobster", + "x_farming:stingray", + "x_farming:tilapia", + "x_farming:obster", + "x_farming:totemfish", + } + }, + biomes = { + ["icesheet_ocean"] = { + "x_farming:angler", + "x_farming:frozen_boneminnow", + "x_farming:frozen_ocean_hermit_crab", + "x_farming:paddlefish", + "x_farming:pearl_isopod", + }, + ["taiga_ocean"] = { + "x_farming:armored_catfish", + "x_farming:gar", + "x_farming:giant_moray", + "x_farming:perch", + "x_farming:piglish", + }, + ["desert_ocean"] = { + "x_farming:arrow_squid", + "x_farming:desert_frog", + "x_farming:desert_sunfish", + "x_farming:piranha", + "x_farming:prismfish", + "x_farming:pumpkinseed", + }, + ["tundra_ocean"] = { + "x_farming:barracuda", + "x_farming:flier", + "x_farming:floral_faefish", + "x_farming:flounder", + "x_farming:fourhorn_sculpin", + }, + ["snowy_grassland_ocean"] = { + "x_farming:grass_pickerel", + "x_farming:guppy", + "x_farming:hagfish", + "x_farming:rainbowfish", + "x_farming:red_snapper", + }, + ["coniferous_forest_ocean"] = { + "x_farming:bream", + "x_farming:redbreast_sunfish", + "x_farming:rockfish", + "x_farming:rohu", + "x_farming:rosefish", + }, + ["grassland_ocean"] = { + "x_farming:conger", + "x_farming:sablefish", + "x_farming:sardine", + "x_farming:sawfish", + "x_farming:skate", + "x_farming:skullfin", + }, + ["savanna_ocean"] = { + "x_farming:chorus_snail", + "x_farming:white_bullhead", + "x_farming:whitefish", + "x_farming:wolffish", + "x_farming:woodskip", + }, + ["cold_desert_ocean"] = { + "x_farming:chub", + "x_farming:cold_ocean_hermit_crab", + "x_farming:oscar", + "x_farming:leerfish", + }, + ["sandstone_desert_ocean"] = { + "x_farming:clam", + "x_farming:skykoi", + "x_farming:smallmouth_bass", + "x_farming:sterlet", + }, + ["deciduous_forest_ocean"] = { + "x_farming:crayfish", + "x_farming:damselfish", + "x_farming:danios", + "x_farming:vampire_squid", + "x_farming:walleye", + "x_farming:warm_ocean_hermit_crab", + }, + ["rainforest_ocean"] = { + "x_farming:burbot", + "x_farming:koi", + "x_farming:lamprey", + "x_farming:largemouth_bass", + "x_farming:lava_eel", + "x_farming:leech", + }, + ["rainforest_swamp"] = { + "x_farming:swamp_darter", + "x_farming:swamp_frog", + "x_farming:sturgeon", + "x_farming:sunfish", + "x_farming:swordfish", + }, + ["icesheet"] = { + "x_farming:dwarf_caiman", + "x_farming:eel", + "x_farming:electric_eel", + "x_farming:endray", + "x_farming:tench", + }, + ["tundra_beach"] = { + "x_farming:carp", + "x_farming:catfish", + "x_farming:catla", + "x_farming:ocean_hermit_crab", + "x_farming:octopus", + }, + ["savanna_shore"] = { + "x_farming:angelfish", + "x_farming:lingcod", + "x_farming:lukewarm_ocean_hermit_crab", + "x_farming:magma_slimefish", + "x_farming:manta_ray", + }, + ["deciduous_forest_shore"] = { + "x_farming:congo_tiger_fish", + "x_farming:convict_cichlid", + "x_farming:minnow", + "x_farming:mud_flounder", + "x_farming:neon_tetra", + }, + } +} + +---how often node timers for plants will tick, +/- some random value +function icefishing.tick(pos) + minetest.get_node_timer(pos):start(math.random(166, 286)) +end + +---how often a growth failure tick is retried (e.g. too dark) +function icefishing.tick_again(pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +icefishing.on_construct = function(pos) + local under = { x = pos.x, y = pos.y - 1, z = pos.z } + local biome_data = minetest.get_biome_data(under) + + if not biome_data then + return + end + + local biome_name = minetest.get_biome_name(biome_data.biome) + + if not biome_name then + return + end + + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Biome") .. ": " + .. string.gsub(string.gsub(biome_name, "(_)", " "), "(%a)([%w_']*)", x_farming.tchelper)) +end + +icefishing.after_destruct = function(pos, oldnode, oldmetadata, digger) + local max_steps = 9 + local current_step = tonumber(string.reverse(string.reverse(oldnode.name):split("_")[1])) + + ---is a seed + if not current_step then + minetest.add_item(pos, ItemStack("x_farming:seed_icefishing")) + return + end + + ---too short for getting a fish or junk (tier_1) + if current_step < 6 then + minetest.add_item(pos, ItemStack("x_farming:seed_icefishing")) + return + end + + ---get ice nodes around + local under = { x = pos.x, y = pos.y - 1, z = pos.z } + local biome_data = minetest.get_biome_data(under) + + if not biome_data then + return + end + + local biome_name = minetest.get_biome_name(biome_data.biome) + local positions = minetest.find_nodes_in_area_under_air( + { x = under.x - 1, y = under.y, z = under.z - 1 }, + { x = under.x + 1, y = under.y, z = under.z + 1 }, + { 'default:ice', 'group:ice' } + ) + ---subtract 1 - not including the node where the icefishing was + local rarity = 8 - (current_step - 1) * 7 / (max_steps - 1) + rarity = math.floor(rarity) + local positions_count = #positions - 1 + local items_to_drop = {} + local tier = 1 + + ---tiers + if current_step == max_steps then + if positions_count >= 4 and positions_count < 6 then + tier = 2 + elseif positions_count >= 6 and positions_count < 8 then + tier = 3 + elseif positions_count >= 8 then + tier = 4 + end + end + + ---initial item to drop + local tier_items = icefishing.drops["tier_" .. tier] + local biome_items = icefishing.biomes[biome_name] + + ---add specific biome items + if biome_items ~= nil and tier == 4 then + tier_items = x_farming.mergeTables(tier_items, biome_items) + end + + local tier_item = tier_items[math.random(1, #tier_items)] + table.insert(items_to_drop, tier_item) + + ---rarity - add extra item from list of items to drop + if math.random(1, rarity) == 1 then + local random_item = items_to_drop[math.random(1, #items_to_drop)] + + table.insert(items_to_drop, random_item) + end + + ---50% chance to drop the ice fishing equipment + if math.random(1, 2) == 1 then + table.insert(items_to_drop, "x_farming:seed_icefishing") + end + + ---treasure chance (10%) + if math.random(1, 10) == 1 and tier == 4 then + local random_items = icefishing.drops.treasure + local random_item = random_items[math.random(1, #random_items)] + + table.insert(items_to_drop, random_item) + end + + for i, v in ipairs(items_to_drop) do + local obj = minetest.add_item(pos, ItemStack(v)) + + if obj and minetest.registered_items[v] then + if obj then + obj:set_velocity({ + x = math.random(-1, 1), + y = 2, + z = math.random(-1, 1), + }) + end + else + minetest.log('warning', '[x_farming] Tried to drop non-existing item "' .. dump(v) .. '" ') + end + end +end + +---Seed placement +icefishing.place_seed = function(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + ---check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + ---return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + ---check if pointing at the top of the node + if pt.above.y ~= pt.under.y + 1 then + return itemstack + end + + ---check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + ---check if pointing at soil + if under.name ~= "x_farming:drilled_ice" then + return itemstack + end + + ---add the node and remove 1 item from the itemstack + minetest.log("action", player_name .. " places node " .. plantname .. " at " .. + minetest.pos_to_string(pt.above)) + minetest.add_node(pt.above, { name = plantname, param2 = 1 }) + icefishing.tick(pt.above) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + return itemstack +end + +icefishing.grow_plant = function(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + ---disable timer for fully grown plant + return + end + + ---grow seed + if minetest.get_item_group(node.name, "seed") and def.fertility then + local soil_node = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + if not soil_node then + icefishing.tick_again(pos) + return + end + ---omitted is a check for light, we assume seeds can germinate in the dark. + for _, v in pairs(def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 then + local placenode = { name = def.next_plant } + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + if minetest.registered_nodes[def.next_plant].next_plant then + icefishing.tick(pos) + return + end + end + end + + return + end + + ---check if on ice + local below = minetest.get_node({ x = pos.x, y = pos.y - 1, z = pos.z }) + if below.name ~= "x_farming:drilled_ice" then + icefishing.tick_again(pos) + return + end + + ---check light + local light = minetest.get_node_light(pos) + if not light or light < def.minlight or light > def.maxlight then + icefishing.tick_again(pos) + return + end + + ---grow + local placenode = { name = def.next_plant } + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + + minetest.add_particlespawner({ + amount = 7, + time = 3, + minpos = { x = pos.x - 0.2, y = pos.y - 0.2, z = pos.z - 0.2 }, + maxpos = { x = pos.x + 0.2, y = pos.y - 0.4, z = pos.z + 0.2 }, + minacc = { x = -0.1, y = 0.1, z = -0.1 }, + maxacc = { x = 0.1, y = 0.1, z = 0.1 }, + minexptime = 0.4, + maxexptime = 0.8, + minsize = 1.5, + maxsize = 2, + texture = 'bubble.png' + }) + + ---new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + icefishing.tick(pos) + end + return +end + +---Items / Harvest + +local fishes = { + { name = "crab", item_eat = 1, item_eat_cooked = 6 }, + { name = "goldeye", item_eat = 1, item_eat_cooked = 3 }, + { name = "halibut", item_eat = 1, item_eat_cooked = 6 }, + { name = "herring", item_eat = 1, item_eat_cooked = 3 }, + { name = "rainbow_trout", item_eat = 1, item_eat_cooked = 6 }, + { name = "red_mullet", item_eat = 1, item_eat_cooked = 6 }, + { name = "shrimp", item_eat = 1, item_eat_cooked = 2 }, + { name = "swamp_frog", item_eat = 1, item_eat_cooked = 2 }, + { name = "swamp_darter", item_eat = 1, item_eat_cooked = 4 }, + { name = "jungle_frog", item_eat = 1, item_eat_cooked = 2 }, + { name = "albacore", item_eat = 1, item_eat_cooked = 4 }, + { name = "anchovy", item_eat = 1, item_eat_cooked = 4 }, + { name = "angelfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "angler", item_eat = 1, item_eat_cooked = 4 }, + { name = "armored_catfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "arrow_squid", item_eat = 1, item_eat_cooked = 8 }, + { name = "barracuda", item_eat = 1, item_eat_cooked = 4 }, + { name = "black_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "blobfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "blue_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "bream", item_eat = 1, item_eat_cooked = 4 }, + { name = "brown_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "burbot", item_eat = 1, item_eat_cooked = 4 }, + { name = "carp", item_eat = 1, item_eat_cooked = 4 }, + { name = "catfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "catla", item_eat = 1, item_eat_cooked = 4 }, + { name = "chorus_snail", item_eat = 1, item_eat_cooked = 2 }, + { name = "chub", item_eat = 1, item_eat_cooked = 4 }, + { name = "clam", item_eat = 1, item_eat_cooked = 2 }, + { name = "cold_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 }, + { name = "conger", item_eat = 1, item_eat_cooked = 4 }, + { name = "congo_tiger_fish", item_eat = 1, item_eat_cooked = 4 }, + { name = "convict_cichlid", item_eat = 1, item_eat_cooked = 4 }, + { name = "crayfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "cyan_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "damselfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "danios", item_eat = 1, item_eat_cooked = 4 }, + { name = "desert_frog", item_eat = 1, item_eat_cooked = 2 }, + { name = "desert_sunfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "diamond_angler", item_eat = 1, item_eat_cooked = 8 }, + { name = "dwarf_caiman", item_eat = 1, item_eat_cooked = 4 }, + { name = "eel", item_eat = 1, item_eat_cooked = 4 }, + { name = "electric_eel", item_eat = 1, item_eat_cooked = 4 }, + { name = "endray", item_eat = 1, item_eat_cooked = 5 }, + { name = "father_sun", item_eat = 1, item_eat_cooked = 10 }, + { name = "flier", item_eat = 1, item_eat_cooked = 4 }, + { name = "floral_faefish", item_eat = 1, item_eat_cooked = 4 }, + { name = "flounder", item_eat = 1, item_eat_cooked = 4 }, + { name = "fourhorn_sculpin", item_eat = 1, item_eat_cooked = 4 }, + { name = "frozen_boneminnow", item_eat = 1, item_eat_cooked = 4 }, + { name = "frozen_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 }, + { name = "gar", item_eat = 1, item_eat_cooked = 4 }, + { name = "giant_moray", item_eat = 1, item_eat_cooked = 6 }, + { name = "goldfish", item_eat = 1, item_eat_cooked = 8 }, + { name = "grass_pickerel", item_eat = 1, item_eat_cooked = 4 }, + { name = "gray_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "green_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "guppy", item_eat = 1, item_eat_cooked = 4 }, + { name = "hagfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "illager_ghostfish", item_eat = 1, item_eat_cooked = 10 }, + { name = "ironfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "koi", item_eat = 1, item_eat_cooked = 4 }, + { name = "lamprey", item_eat = 1, item_eat_cooked = 4 }, + { name = "largemouth_bass", item_eat = 1, item_eat_cooked = 4 }, + { name = "lava_eel", item_eat = 1, item_eat_cooked = 6 }, + { name = "leech", item_eat = 1, item_eat_cooked = 4 }, + { name = "leerfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "light_gray_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "lime_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "lingcod", item_eat = 1, item_eat_cooked = 4 }, + { name = "lobster", item_eat = 1, item_eat_cooked = 8 }, + { name = "lukewarm_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 }, + { name = "magenta_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "magma_slimefish", item_eat = 1, item_eat_cooked = 4 }, + { name = "manta_ray", item_eat = 1, item_eat_cooked = 4 }, + { name = "minnow", item_eat = 1, item_eat_cooked = 4 }, + { name = "mother_moon", item_eat = 1, item_eat_cooked = 10 }, + { name = "mud_flounder", item_eat = 1, item_eat_cooked = 4 }, + { name = "neon_tetra", item_eat = 1, item_eat_cooked = 4 }, + { name = "obster", item_eat = 1, item_eat_cooked = 4 }, + { name = "ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 }, + { name = "octopus", item_eat = 1, item_eat_cooked = 8 }, + { name = "orange_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "oscar", item_eat = 1, item_eat_cooked = 4 }, + { name = "paddlefish", item_eat = 1, item_eat_cooked = 4 }, + { name = "pearl_isopod", item_eat = 1, item_eat_cooked = 4 }, + { name = "pearlwog", item_eat = 1, item_eat_cooked = 4 }, + { name = "perch", item_eat = 1, item_eat_cooked = 4 }, + { name = "piglish", item_eat = 1, item_eat_cooked = 4 }, + { name = "pike", item_eat = 1, item_eat_cooked = 4 }, + { name = "pink_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "piranha", item_eat = 1, item_eat_cooked = 6 }, + { name = "prismfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "pumpkinseed", item_eat = 1, item_eat_cooked = 4 }, + { name = "purple_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "rainbowfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "red_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "red_snapper", item_eat = 1, item_eat_cooked = 6 }, + { name = "redbreast_sunfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "rockfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "rohu", item_eat = 1, item_eat_cooked = 4 }, + { name = "rosefish", item_eat = 1, item_eat_cooked = 4 }, + { name = "rusty_skullfin", item_eat = 1, item_eat_cooked = 10 }, + { name = "sablefish", item_eat = 1, item_eat_cooked = 4 }, + { name = "sardine", item_eat = 1, item_eat_cooked = 4 }, + { name = "sawfish", item_eat = 1, item_eat_cooked = 5 }, + { name = "sea_cucumber", item_eat = 1, item_eat_cooked = 2 }, + { name = "skate", item_eat = 1, item_eat_cooked = 4 }, + { name = "skullfin", item_eat = 1, item_eat_cooked = 4 }, + { name = "skykoi", item_eat = 1, item_eat_cooked = 4 }, + { name = "slimefish", item_eat = 1, item_eat_cooked = 8 }, + { name = "smallmouth_bass", item_eat = 1, item_eat_cooked = 4 }, + { name = "sterlet", item_eat = 1, item_eat_cooked = 4 }, + { name = "stingray", item_eat = 1, item_eat_cooked = 6 }, + { name = "sturgeon", item_eat = 1, item_eat_cooked = 4 }, + { name = "sunfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "swordfish", item_eat = 1, item_eat_cooked = 6 }, + { name = "tancho_koi", item_eat = 1, item_eat_cooked = 4 }, + { name = "tench", item_eat = 1, item_eat_cooked = 4 }, + { name = "tilapia", item_eat = 1, item_eat_cooked = 4 }, + { name = "totemfish", item_eat = 1, item_eat_cooked = 4 }, + { name = "true_goldfish", item_eat = 1, item_eat_cooked = 10 }, + { name = "vampire_squid", item_eat = 1, item_eat_cooked = 6 }, + { name = "walleye", item_eat = 1, item_eat_cooked = 4 }, + { name = "warm_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 }, + { name = "white_bullhead", item_eat = 1, item_eat_cooked = 4 }, + { name = "white_seashroom", item_eat = 1, item_eat_cooked = 3 }, + { name = "whitefish", item_eat = 1, item_eat_cooked = 4 }, + { name = "wolffish", item_eat = 1, item_eat_cooked = 4 }, + { name = "woodskip", item_eat = 1, item_eat_cooked = 4 }, + { name = "yellow_seashroom", item_eat = 1, item_eat_cooked = 3 }, +} + +for i, def in ipairs(fishes) do + local name = "x_farming:" .. def.name + local desc = string.gsub(string.gsub(def.name, "(_)", " "), "(%a)([%w_']*)", x_farming.tchelper) + local img = "x_farming_fish_" .. def.name .. ".png" + + -- raw + local raw_fish_def = { + description = desc .. "\n" + .. minetest.colorize(x_farming.colors.brown, S("Hunger") .. ": " .. def.item_eat), + tiles = { img }, + inventory_image = img, + wield_image = img .. "^[transformFXR90", + groups = { + -- X Farming + fish = 1, + -- MCL + food = 2, + eatable = 2, + smoker_cookable = 1 + }, + _mcl_saturation = 0.4 + } + + if minetest.get_modpath('farming') then + raw_fish_def.on_use = minetest.item_eat(def.item_eat) + end + + if minetest.get_modpath('mcl_farming') then + raw_fish_def.on_place = minetest.item_eat(def.item_eat) + raw_fish_def.on_secondary_use = minetest.item_eat(def.item_eat) + end + + minetest.register_craftitem(name, raw_fish_def) + + -- hbhunger + if x_farming.hbhunger ~= nil then + if hbhunger.register_food ~= nil then + hbhunger.register_food(name, def.item_eat) + end + end + + -- hunger_ng + if x_farming.hunger_ng ~= nil then + hunger_ng.add_hunger_data(name, { satiates = def.item_eat }) + end + + if def.item_eat_cooked ~= nil then + -- cooked + local cooked_fish_def = { + description = S("Cooked") .. " " .. desc .. "\n" + .. minetest.colorize(x_farming.colors.brown, S("Hunger") .. ": " + .. def.item_eat_cooked), + tiles = { img }, + inventory_image = img .. '^[colorize:#3B2510:204' .. + '^(' .. img .. '^[colorize:#FFFFFF:255^[mask:x_farming_cooked_mask.png^[opacity:191)', + wield_image = img .. '^[transformFXR90^[colorize:#3B2510:204' .. + '^(' .. img .. '^[colorize:#FFFFFF:255^[mask:x_farming_cooked_mask.png^[opacity:191)', + groups = { + -- MCL + food = 2, + eatable = 5, + }, + _mcl_saturation = 6, + } + + if minetest.get_modpath('farming') then + cooked_fish_def.on_use = minetest.item_eat(def.item_eat_cooked) + end + + if minetest.get_modpath('mcl_farming') then + cooked_fish_def.on_place = minetest.item_eat(def.item_eat_cooked) + cooked_fish_def.on_secondary_use = minetest.item_eat(def.item_eat_cooked) + end + + minetest.register_craftitem(name .. "_cooked", cooked_fish_def) + + minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = name .. "_cooked", + recipe = name + }) + + ---hbhunger + if x_farming.hbhunger ~= nil then + if hbhunger.register_food ~= nil then + hbhunger.register_food(name .. "_cooked", def.item_eat_cooked) + end + end + + -- hunger_ng + if x_farming.hunger_ng ~= nil then + hunger_ng.add_hunger_data(name .. "_cooked", { satiates = def.item_eat_cooked }) + end + end +end + +---Ice fishing equipment + +icefishing.register_equipment = function(name, def) + local mname = name:split(":")[1] + local pname = name:split(":")[2] + + ---Register seed + local lbm_nodes = { mname .. ":seed_" .. pname } + + minetest.register_node(mname .. ":seed_" .. pname, { + description = def.description, + ---top, bottom, sides + tiles = { + "x_farming_icefishing_bottom.png", + "x_farming_icefishing_bottom.png", + "x_farming_icefishing_right.png", + "x_farming_icefishing_left.png", + "x_farming_icefishing_front_0.png", + "x_farming_icefishing_back_0.png" + }, + use_texture_alpha = 'clip', + inventory_image = "x_farming_icefishing_inv.png", + wield_image = "x_farming_icefishing_inv.png", + drawtype = "nodebox", + groups = { + -- MTG + seed = 1, + snappy = 3, + plant = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + paramtype = "light", + walkable = false, + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.5, -0.375, 0, 0.5, 0.5, 0 }, + { 0, -0.375, -0.5, 0, -0.25, 0.5 }, + } + }, + collision_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + fertility = { "ice_fishing" }, + drop = "", + sounds = x_farming.node_sound_wood_defaults(), + next_plant = mname .. ":" .. pname .. "_1", + on_timer = icefishing.grow_plant, + minlight = 13, + maxlight = 15, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick + and not (placer and placer:is_player() + and placer:get_player_control().sneak) + then + return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack + end + + return icefishing.place_seed(itemstack, placer, pointed_thing, "x_farming:seed_icefishing") + end, + + on_construct = icefishing.on_construct, + after_destruct = icefishing.after_destruct, + }) + + ---Register growing steps + for i = 1, def.steps do + local next_plant = nil + local last_step = i == def.steps + + if i < def.steps then + next_plant = mname .. ":" .. pname .. "_" .. (i + 1) + lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i + end + + local tiles = { + { + name = "x_farming_icefishing_top_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { name = mname .. "_" .. pname .. "_bottom.png" }, + { name = mname .. "_" .. pname .. "_right.png" }, + { name = mname .. "_" .. pname .. "_left.png" }, + { name = mname .. "_" .. pname .. "_front_" .. i .. ".png" }, + { name = mname .. "_" .. pname .. "_back_" .. i .. ".png" }, + } + + if last_step then + tiles[1] = { + name = "x_farming_icefishing_top_animated_9.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + } + end + + minetest.register_node(mname .. ":" .. pname .. "_" .. i, { + drawtype = "nodebox", + ---Textures of node; +Y, -Y, +X, -X, +Z, -Z + ---Textures of node; top, bottom, right, left, front, back + tiles = tiles, + use_texture_alpha = 'clip', + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + drop = "", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.5, -0.375, 0, 0.5, 0.5, 0 }, + { 0, -0.375, -0.5, 0, -0.25, 0.5 }, + } + }, + collision_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + seed = 1, + snappy = 3, + plant = 1, + attached_node = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = next_plant, + on_timer = icefishing.grow_plant, + minlight = 13, + maxlight = 15, + + after_destruct = icefishing.after_destruct, + }) + end + + ---replacement LBM for pre-nodetimer plants + minetest.register_lbm({ + name = mname .. ":start_nodetimer_" .. pname, + nodenames = lbm_nodes, + action = function(pos, node) + icefishing.tick_again(pos) + end, + }) + + ---Return + local r = { + seed = mname .. ":seed_" .. pname + } + return r +end + +icefishing.register_equipment("x_farming:icefishing", { + description = S("Ice Fishing (Place on drilled Ice)"), + steps = 9, +}) + +---nodes + +minetest.register_node("x_farming:drilled_ice", { + description = S("Drilled Ice"), + tiles = { + { name = "x_farming_ice.png^x_farming_drilled_ice.png", tileable_vertical = false }, + "x_farming_ice.png", + "x_farming_ice.png", + "x_farming_ice.png", + "x_farming_ice.png", + "x_farming_ice.png", + }, + paramtype = "light", + drop = "default:ice", + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + not_in_creative_inventory = 1, + ice_fishing = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3 + }, + sounds = x_farming.node_sound_ice_defaults(), +}) + +---tools + +minetest.register_tool("x_farming:ice_auger", { + description = S("Ice Auger drills hole in ice for ice fishing."), + inventory_image = "x_farming_ice_auger.png", + wield_image = "x_farming_ice_auger.png^[transformR270", + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + if not user then + return + end + + local pt = pointed_thing + ---check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local uses = 500 + local under = minetest.get_node(pt.under) + local p = { x = pt.under.x, y = pt.under.y + 1, z = pt.under.z } + local above = minetest.get_node(p) + + ---return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + ---check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + ---check if pointing at soil + if under.name ~= "default:ice" and minetest.get_item_group(under.name, 'ice') == 0 then + return + end + + if minetest.is_protected(pt.under, user:get_player_name()) then + minetest.record_protection_violation(pt.under, user:get_player_name()) + return + end + + if minetest.is_protected(pt.above, user:get_player_name()) then + minetest.record_protection_violation(pt.above, user:get_player_name()) + return + end + + ---turn the node into soil and play sound + minetest.set_node(pt.under, { name = "x_farming:drilled_ice" }) + minetest.sound_play("x_farming_ice_dug", { + pos = pt.under, + gain = 0.5, + }, true) + + minetest.add_particlespawner({ + amount = 10, + time = 0.5, + minpos = { x = pt.above.x - 0.4, y = pt.above.y - 0.4, z = pt.above.z - 0.4 }, + maxpos = { x = pt.above.x + 0.4, y = pt.above.y - 0.5, z = pt.above.z + 0.4 }, + minvel = { x = 0, y = 1, z = 0 }, + maxvel = { x = 0, y = 2, z = 0 }, + minacc = { x = 0, y = -4, z = 0 }, + maxacc = { x = 0, y = -8, z = 0 }, + minexptime = 1, + maxexptime = 1.5, + node = { name = "default:snowblock" }, + collisiondetection = true, + object_collision = true, + }) + + if not (creative and creative.is_enabled_for and creative.is_enabled_for(user:get_player_name())) then + ---wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear(65535 / (uses - 1)) + ---tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, { pos = pt.above, + gain = 0.5 }, true) + end + end + + return itemstack + end, + sound = { breaks = "default_tool_breaks" }, +}) + +minetest.register_craft({ + output = "x_farming:ice_auger", + recipe = { + { "group:stick", "default:coalblock", "group:stick" }, + { "", "default:steel_ingot", "" }, + { "", "default:steel_ingot", "" }, + } +}) + +---crate +x_farming.register_crate('crate_fish_3', { + description = S('Fish Crate'), + tiles = { 'x_farming_crate_fish_3.png' }, +}) + +minetest.register_on_mods_loaded(function() + local deco_place_on = {} + local deco_biomes = {} + + -- MTG + if minetest.get_modpath('default') then + table.insert(deco_place_on, 'default:ice') + table.insert(deco_place_on, 'default:snowblock') + table.insert(deco_place_on, 'default:snow') + table.insert(deco_place_on, 'default:dirt_with_snow') + table.insert(deco_biomes, 'icesheet') + table.insert(deco_biomes, 'snowy_grassland') + table.insert(deco_biomes, 'icesheet_ocean') + end + + -- Everness + if minetest.get_modpath('everness') then + table.insert(deco_place_on, 'everness:frosted_snowblock') + table.insert(deco_biomes, 'everness:frosted_icesheet') + end + + -- MCL + if minetest.get_modpath('mcl_core') then + table.insert(deco_place_on, 'mcl_core:snow') + table.insert(deco_biomes, 'IcePlains') + end + + if next(deco_place_on) and next(deco_biomes) then + minetest.register_decoration({ + name = 'x_farming:icefishing', + deco_type = 'schematic', + place_on = deco_place_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.0025, + spread = { x = 100, y = 100, z = 100 }, + seed = 2, + octaves = 3, + persist = 0.7 + }, + biomes = deco_biomes, + y_max = 30, + y_min = 1, + schematic = minetest.get_modpath('x_farming') .. '/schematics/x_farming_icefishing.mts', + flags = 'force_placement', + rotation = 'random', + }) + end +end) + diff --git a/mods/x_farming/init.lua b/mods/x_farming/init.lua new file mode 100644 index 00000000..b81ec0bf --- /dev/null +++ b/mods/x_farming/init.lua @@ -0,0 +1,109 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it pos the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local mod_start_time = minetest.get_us_time() +local path = minetest.get_modpath('x_farming') + +-- Legacy backwards compatibility +minetest.register_alias('x_farming:hog_stew', 'x_farming:fish_stew') + +-- MineClone2 support +if minetest.get_modpath('mcl_core') and minetest.global_exists('mcl_core') then + dofile(path .. '/mod_support_mcl_aliases.lua') +end + +dofile(path .. '/api.lua') +dofile(path .. '/craftitems.lua') +dofile(path .. '/nodes.lua') +dofile(path .. '/functions.lua') + +dofile(path .. '/melon.lua') +dofile(path .. '/pumpkin.lua') +dofile(path .. '/coffee.lua') +dofile(path .. '/corn.lua') +dofile(path .. '/obsidian_wart.lua') +dofile(path .. '/potato.lua') +dofile(path .. '/beetroot.lua') +dofile(path .. '/carrot.lua') +dofile(path .. '/cocoa.lua') +dofile(path .. '/seeds.lua') +dofile(path .. '/kiwi_tree.lua') +dofile(path .. '/cactus.lua') +dofile(path .. '/strawberry.lua') +dofile(path .. '/pine_nut.lua') +dofile(path .. '/christmas_tree.lua') +dofile(path .. '/stevia.lua') +dofile(path .. '/soybean.lua') +dofile(path .. '/salt.lua') +dofile(path .. '/cotton.lua') +dofile(path .. '/barley.lua') +dofile(path .. '/bees.lua') +dofile(path .. '/ropes.lua') +dofile(path .. '/rice.lua') +dofile(path .. '/stove.lua') + +dofile(path .. '/tools.lua') +dofile(path .. '/hoes.lua') + +dofile(path .. '/ice_fishing.lua') +dofile(path .. '/bonemeal.lua') +dofile(path .. '/crates.lua') +dofile(path .. '/bags.lua') +dofile(path .. '/composter.lua') +dofile(path .. '/crafting.lua') + +if not x_farming.vessels then + dofile(path .. '/vessels.lua') +end + +---timer for crates +minetest.register_lbm({ + label = 'x_farming timer for crates', + name = 'x_farming:start_nodetimer_crates', + nodenames = x_farming.lbm_nodenames_crates, + action = function(pos, node) + x_farming.tick_again_crates(pos) + end +}) + +-- MOD support + +if minetest.get_modpath('default') then + dofile(path .. '/mod_support_default.lua') +end + +-- hbhunger +if x_farming.hbhunger ~= nil then + if hbhunger.register_food ~= nil then + dofile(path .. '/mod_support_hbhunger.lua') + end +end + +-- hunger_ng +if x_farming.hunger_ng then + dofile(path .. '/mod_support_hunger_ng.lua') +end + +-- candles_3d +if minetest.get_modpath('candles_3d') then + dofile(path .. '/mod_support_candles_3d.lua') +end + +local mod_end_time = (minetest.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] x_farming loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/x_farming/kiwi_tree.lua b/mods/x_farming/kiwi_tree.lua new file mode 100644 index 00000000..2cc685a9 --- /dev/null +++ b/mods/x_farming/kiwi_tree.lua @@ -0,0 +1,391 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Required wrapper to allow customization of x_farming.after_place_leaves +local function after_place_leaves(...) + return x_farming.after_place_leaves(...) +end + +-- trunk +minetest.register_node('x_farming:kiwi_tree', { + description = S('Kiwi Tree'), + short_description = S('Kiwi Tree'), + tiles = { 'x_farming_kiwi_tree_top.png', 'x_farming_kiwi_tree_top.png', 'x_farming_kiwi_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +-- leaves +minetest.register_node('x_farming:kiwi_leaves', { + description = S('Kiwi Tree Leaves') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Kiwi Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'x_farming_kiwi_leaves.png' }, + special_tiles = { 'x_farming_kiwi_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'x_farming:kiwi_sapling' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'x_farming:kiwi_leaves' }, + } + } + }, + sounds = x_farming.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +-- sapling +minetest.register_node('x_farming:kiwi_sapling', { + description = S('Kiwi Tree Sapling') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Kiwi Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'x_farming_kiwi_sapling.png' }, + inventory_image = 'x_farming_kiwi_sapling.png', + wield_image = 'x_farming_kiwi_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = x_farming.grow_sapling, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = x_farming.sapling_on_place(itemstack, placer, pointed_thing, + 'x_farming:kiwi_sapling', + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + { x = -2, y = 1, z = -2 }, + { x = 2, y = 4, z = 2 }, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +-- fruit - for marker only +minetest.register_node('x_farming:kiwi', { + description = S('Kiwi'), + short_description = S('Kiwi'), + drawtype = 'plantlike', + visual_scale = 0.5, + tiles = { 'x_farming_kiwi.png' }, + inventory_image = 'x_farming_kiwi.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + drop = { + max_items = 1, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'x_farming:kiwi_fruit' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + } + }, + }, + selection_box = { + type = 'fixed', + fixed = { -3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16 } + }, + groups = { + -- MTG + fleshy = 3, + dig_immediate = 3, + leafdecay = 3, + leafdecay_drop = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, { name = 'x_farming:kiwi_mark' }) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +minetest.register_node('x_farming:kiwi_mark', { + description = S('Kiwi Marker'), + short_description = S('Kiwi Marker'), + inventory_image = 'x_farming:kiwi_fruit.png^x_farming_invisible_node_overlay.png', + wield_image = 'x_farming:kiwi_fruit.png^x_farming_invisible_node_overlay.png', + drawtype = 'airlike', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = '', + groups = { not_in_creative_inventory = 1 }, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, 'x_farming:kiwi_leaves') then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, { name = 'x_farming:kiwi' }) + end + end +}) + +-- Kiwi eatable fruit +local kiwi_fruit_def = { + description = S('Kiwi') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + short_description = S('Kiwi'), + drawtype = 'mesh', + mesh = 'x_farming_kiwi_fruit.obj', + tiles = { 'x_farming_kiwi_fruit_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_kiwi_fruit.png', + wield_image = 'x_farming_kiwi_fruit.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.2, -0.5, -0.2, 0.2, -0.2, 0.2 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.1, -0.5, -0.1, 0.1, -0.3, 0.1 } + }, + groups = { + -- MTG + dig_immediate = 3, + compost = 65, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 65, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + on_use = minetest.item_eat(2), + sunlight_propagates = true +} + +if minetest.get_modpath('mcl_farming') then + kiwi_fruit_def.on_secondary_use = minetest.item_eat(2) +end + +minetest.register_node('x_farming:kiwi_fruit', kiwi_fruit_def) + +-- leafdecay +x_farming.register_leafdecay({ + trunks = { 'x_farming:kiwi_tree' }, + leaves = { 'x_farming:kiwi', 'x_farming:kiwi_leaves' }, + radius = 3, +}) + +-- planks +minetest.register_node('x_farming:kiwi_wood', { + description = S('Kiwi Wood Planks'), + short_description = S('Kiwi Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'x_farming_kiwi_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), +}) + +-- Stairs +if minetest.global_exists('stairs') and minetest.get_modpath('stairs') then + stairs.register_stair_and_slab( + 'kiwi_wood', + 'x_farming:kiwi_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'x_farming_kiwi_wood.png' }, + S('Kiwi Wooden Stair'), + S('Kiwi Wooden Slab'), + x_farming.node_sound_wood_defaults(), + false + ) +end + +if minetest.get_modpath('mcl_stairs') then + mcl_stairs.register_stair_and_slab( + 'kiwi_wood', + 'x_farming:kiwi_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'x_farming_kiwi_wood.png' }, + S('Kiwi Wooden Stair'), + S('Kiwi Wooden Slab'), + x_farming.node_sound_wood_defaults(), + 6, + 2, + S('Double Kiwi Wooden Slab'), + nil + ) +end + +-- Crate +x_farming.register_crate('crate_kiwi_fruit_3', { + description = S('Kiwi Fruit Crate'), + short_description = S('Kiwi Fruit Crate'), + tiles = { 'x_farming_crate_kiwi_fruit_3.png' }, + _custom = { + crate_item = 'x_farming:kiwi_fruit' + } +}) + +minetest.register_decoration(asuna.features.crops.kiwi.inject_decoration({ + deco_type = "schematic", + sidelen = 16, + noise_params = { + offset = -0.0005, + scale = 0.001, + spread = { x = 80, y = 80, z = 80 }, + seed = 2, + octaves = 1, + persist = 0.66 + }, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("x_farming") .. '/schematics/x_farming_kiwi_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +})) diff --git a/mods/x_farming/locale/template.txt b/mods/x_farming/locale/template.txt new file mode 100644 index 00000000..2bcfd28b --- /dev/null +++ b/mods/x_farming/locale/template.txt @@ -0,0 +1,135 @@ +# textdomain: x_farming +owned by= +Quantity= +Bag Empty= +Beetroot Seed= +Beetroot= +Beetroot Crate= +Bonemeal - use it as a fertilizer for most plants= +Dragon Fruit= +Cactus Fruit Marker= +Large Cactus with Fruit Seedling= +Cactus Fruit Crate= +Planting Carrot= +Carrot= +Carrot Crate= +Cocoa bean= +plant on jungle tree trunk= +Cocoa= +Jungle Tree with Cocoa Sapling= +Jungle Tree= +Jungle Tree Leaves= +Jungle Wood Planks= +Cocoa Bean Crate= +Coffee Seed= +Coffee bean= +Hot Cup of Coffee= +Coffee Crate= +Composter= +right-click/place with item to create compost= +Corn Seed= +Corn= +Popcorn= +Corn Crate= +Hunger= +Compost chance= +Cookie= +Chocolate= +Empty Soup Bowl= +Golden Carrot= +Coffee Bottle= +Popped corn= +Golden Melon= +Wart Brick= +Baked Potato= +Poisonous Potato= +Poison= +Water Bottle= +Heal= +Crate Empty= +Wheat Crate= +Cotton Crate= +Biome= +Cooked= +Ice Fishing (Place on drilled Ice)= +Drilled Ice= +Ice Auger drills hole in ice for ice fishing.= +Fish Crate= +Kiwi Tree= +Kiwi Tree Leaves= +Kiwi Tree Sapling= +Kiwi= +Kiwi Marker= +Kiwi Wood Planks= +Kiwi Wooden Stair= +Kiwi Wooden Slab= +Kiwi Fruit Crate= +Melon Seed= +Melon= +Melon Fruit= +Melon Block= +Melon Crate= +Donut= +Chocolate Donut= +Fries= +Pumpkin Pie= +Beetroot Soup= +Fish Stew= +Cactus Brick= +Cactus Brick Stair= +Cactus Brick Slab= +Scarecrow= +Obsidian Wart Seed= +Plant on Obsidian= +Obsidian Wart= +Obsidian Soil= +Wet Obsidian Soil= +Wart Block= +Wartrack= +Wart Brick Block= +Wart Red Brick Block= +Wart Block Stair= +Wart Block Slab= +Wart Brick Stair= +Wart Brick Slab= +Wart Red Brick Stair= +Wart Red Brick Slab= +Wartrack Stair= +Wartrack Slab= +Obsidian Wart Crate= +Pine Nut Tree= +Pine Nut Needles= +Pine Nut Sapling= +Pine Nut= +Pine Nut Roasted= +Pine Nut Marker= +Pine Nut Wood Planks= +Pine Nut Wooden Stair= +Pine Nut Wooden Slab= +Pine Nut Crate= +Planting Potato= +Potato= +Potato Crate= +Pumpkin Seed= +Pumpkin Fruit= +Pumpkin Block= +Pumpkin Lantern= +Pumpkin Crate= +Salt= +Salty Water (plant on wet soil)= +Snow Golem dropped you an item for gold!= +NPC stands still.= +NPC will follow you.= +Soybean Seed= +Soybean= +Soymilk Bottle= +Raw Soymilk Bottle= +Soybean Crate= +Stevia Seed= +Stevia= +Sugar= +Stevia Crate= +Strawberry Seed= +Strawberry= +Strawberry Crate= +Empty Glass Bottle= diff --git a/mods/x_farming/melon.lua b/mods/x_farming/melon.lua new file mode 100644 index 00000000..d8a4e936 --- /dev/null +++ b/mods/x_farming/melon.lua @@ -0,0 +1,250 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- MELON +x_farming.register_plant('x_farming:melon', { + description = S('Melon Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Melon Seed'), + inventory_image = 'x_farming_melon_seed.png', + steps = 8, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 3, +}) + +-- needed +local melon_def = { + description = S('Melon') .. '\n' .. S('Compost chance') .. ': 50%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + groups = { + -- X Farming + compost = 50, + -- MCL + food = 2, + eatable = 2, + compostability = 50, + }, + _mcl_saturation = 1.2, + wield_image = 'x_farming_melon.png', +} + +if minetest.get_modpath('farming') then + melon_def.on_use = minetest.item_eat(2) +end + +if minetest.get_modpath('mcl_farming') then + melon_def.on_place = minetest.item_eat(2) + melon_def.on_secondary_use = minetest.item_eat(2) +end + +minetest.override_item('x_farming:melon', melon_def) + +-- MELON FRUIT - HARVEST +minetest.register_node('x_farming:melon_fruit', { + description = S('Melon Fruit'), + tiles = { + 'x_farming_melon_fruit_top.png', + 'x_farming_melon_fruit_bottom.png', + 'x_farming_melon_fruit_side.png', + 'x_farming_melon_fruit_side.png', + 'x_farming_melon_fruit_side.png', + 'x_farming_melon_fruit_side.png' + }, + sounds = x_farming.node_sound_wood_defaults(), + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + flammable = 4, + fall_damage_add_percent = -30, + -- MCL + handy = 1, + axey = 1, + plant = 1, + dig_by_piston = 1, + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + drop = { + max_items = 7, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 2, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 2, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 2, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 3, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 3, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:melon' }, -- Items to drop. + rarity = 3, -- Probability of dropping is 1 / rarity. + }, + }, + }, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local parent = oldmetadata.fields.parent + local parent_pos_from_child = minetest.string_to_pos(parent) + local parent_node = nil + + -- make sure we have position + if parent_pos_from_child + and parent_pos_from_child ~= nil then + + parent_node = minetest.get_node(parent_pos_from_child) + end + + -- tick parent if parent stem still exists + if parent_node + and parent_node ~= nil + and parent_node.name == 'x_farming:melon_8' then + + x_farming.tick_block(parent_pos_from_child) + end + end +}) + +-- MELON BLOCK - HARVEST from crops +minetest.register_node('x_farming:melon_block', { + description = S('Melon Block') .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Melon Block'), + tiles = { + 'x_farming_melon_fruit_top.png', + 'x_farming_melon_fruit_bottom.png', + 'x_farming_melon_fruit_side.png', + 'x_farming_melon_fruit_side.png', + 'x_farming_melon_fruit_side.png', + 'x_farming_melon_fruit_side.png' + }, + sounds = x_farming.node_sound_wood_defaults(), + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + flammable = 4, + fall_damage_add_percent = -30, + not_in_creative_inventory = 1, + compost = 65, + -- MCL + handy = 1, + axey = 1, + plant = 1, + dig_by_piston = 1, + building_block = 1, + enderman_takable = 1, + compostability = 65 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) + +-- take over the growth from minetest_game farming from here +minetest.override_item('x_farming:melon_8', { + next_plant = 'x_farming:melon_fruit', + on_timer = x_farming.grow_block +}) + +-- Golden Melon +local golden_melon_def = { + description = S('Golden Melon') .. '\n' .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 10'), + inventory_image = 'x_farming_golden_melon.png', + wield_image = 'x_farming_golden_melon.png', + groups = { + -- MCL + food = 2, + eatable = 1, + }, + _mcl_saturation = 14.4, +} + +if x_farming.hbhunger ~= nil or x_farming.hunger_ng ~= nil then + golden_melon_def.description = golden_melon_def.description .. '\n' .. minetest.colorize(x_farming.colors.red, S('Heal') .. ': 10') +end + +if minetest.get_modpath('farming') then + golden_melon_def.on_use = minetest.item_eat(10) +end + +if minetest.get_modpath('mcl_farming') then + golden_melon_def.on_place = minetest.item_eat(10) + golden_melon_def.on_secondary_use = minetest.item_eat(10) +end + +minetest.register_craftitem('x_farming:golden_melon', golden_melon_def) + +-- replacement LBM for pre-nodetimer plants +minetest.register_lbm({ + name = 'x_farming:start_nodetimer_melon', + nodenames = { 'x_farming:melon_8' }, + action = function(pos, node) + x_farming.tick_block_short(pos) + end, +}) + +---crate +x_farming.register_crate('crate_melon_3', { + description = S('Melon Crate'), + short_description = S('Melon Crate'), + tiles = { 'x_farming_crate_melon_3.png' }, + _custom = { + crate_item = 'x_farming:melon' + } +}) + +minetest.register_decoration(asuna.features.crops.melon.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1107, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:melon_5", + "x_farming:melon_6", + "x_farming:melon_7", + "x_farming:melon_8", + "x_farming:melon_block", + }, +})) diff --git a/mods/x_farming/mod.conf b/mods/x_farming/mod.conf new file mode 100644 index 00000000..709797d4 --- /dev/null +++ b/mods/x_farming/mod.conf @@ -0,0 +1,6 @@ +name = x_farming +description = Farming with new plants, crops, trees, ice fishing, bees, candles, scarecrow, crates, composter, bonemeal, ropes, pies... +depends = +optional_depends = default, farming, hbhunger, stairs, wool, dye, vessels, bucket, mcl_core, mcl_farming, mcl_potions, hunger_ng, mcl_stairs, candles_3d, mcl_dye, stamina, ethereal, abdecor, naturalbiomes, bottles_default +supported_games = +min_minetest_version = 5.4 diff --git a/mods/x_farming/mod_support_candles_3d.lua b/mods/x_farming/mod_support_candles_3d.lua new file mode 100644 index 00000000..45ac77b4 --- /dev/null +++ b/mods/x_farming/mod_support_candles_3d.lua @@ -0,0 +1,36 @@ +--[[ + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- Candles + +minetest.register_craft({ + output = 'candles_3d:unlit_orange_1', + recipe = { + { 'x_farming:string' }, + { 'x_farming:honeycomb' }, + { 'x_farming:honeycomb' }, + }, +}) + +minetest.register_craft({ + output = 'candles_3d:unlit_orange_1', + recipe = { + { 'farming:string' }, + { 'x_farming:honeycomb' }, + { 'x_farming:honeycomb' }, + }, +}) diff --git a/mods/x_farming/mod_support_default.lua b/mods/x_farming/mod_support_default.lua new file mode 100644 index 00000000..cd3cbdce --- /dev/null +++ b/mods/x_farming/mod_support_default.lua @@ -0,0 +1,196 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local tree_defs = { + ['default:sapling'] = { + -- apple tree + name = 'default:sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_new_apple_tree(pos) + + return true + end + }, + ['default:junglesapling'] = { + -- jungle tree + name = 'default:junglesapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_new_jungle_tree(pos) + + return true + end + }, + ['default:emergent_jungle_sapling'] = { + -- emergent jungle tree + name = 'default:emergent_jungle_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_new_emergent_jungle_tree(pos) + + return true + end + }, + ['default:acacia_sapling'] = { + -- acacia tree + name = 'default:acacia_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_new_acacia_tree(pos) + + return true + end + }, + ['default:aspen_sapling'] = { + -- aspen tree + name = 'default:aspen_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_new_aspen_tree(pos) + + return true + end + }, + ['default:pine_sapling'] = { + -- pine tree + name = 'default:pine_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + if minetest.find_node_near(pos, 1, { 'group:snowy' }) then + default.grow_new_snowy_pine_tree(pos) + else + default.grow_new_pine_tree(pos) + end + + return true + end + }, + ['default:bush_sapling'] = { + -- Bush + name = 'default:bush_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_bush(pos) + + return true + end + }, + ['default:acacia_bush_sapling'] = { + -- Acacia bush + name = 'default:acacia_bush_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_acacia_bush(pos) + + return true + end + }, + ['default:pine_bush_sapling'] = { + -- Pine bush + name = 'default:pine_bush_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_pine_bush(pos) + + return true + end + }, + ['default:blueberry_bush_sapling'] = { + -- Blueberry bush + name = 'default:blueberry_bush_sapling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + default.grow_blueberry_bush(pos) + + return true + end + }, + ['default:papyrus'] = { + -- Papyrus + name = 'default:papyrus', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + local node = minetest.get_node(pos) + + default.grow_papyrus(pos, node) + + return true + end + }, + ['default:large_cactus_seedling'] = { + -- Large Cactus + name = 'default:large_cactus_seedling', + chance = 2, + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_sand(pos) then + return false + end + + default.grow_large_cactus(pos) + + return true + end + }, +} + +x_farming.x_bonemeal:register_tree_defs(tree_defs) diff --git a/mods/x_farming/mod_support_hbhunger.lua b/mods/x_farming/mod_support_hbhunger.lua new file mode 100644 index 00000000..a854498c --- /dev/null +++ b/mods/x_farming/mod_support_hbhunger.lua @@ -0,0 +1,95 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- name, hunger_change, replace_with_item, poisen, heal, sound + +-- Beetroot +hbhunger.register_food('x_farming:beetroot', 3) +hbhunger.register_food('x_farming:beetroot_soup', 6, 'x_farming:bowl') + +-- Carrot +hbhunger.register_food('x_farming:carrot', 3) +hbhunger.register_food('x_farming:carrot_golden', 10, nil, nil, 10) + +-- Coffee +hbhunger.register_food('x_farming:coffee_cup_hot', 6, nil, nil, 4) + +-- Corn +hbhunger.register_food('x_farming:corn_pop', 1) +hbhunger.register_food('x_farming:corn_popcorn', 5) + +-- Melon +hbhunger.register_food('x_farming:melon', 2) +hbhunger.register_food('x_farming:golden_melon', 10, '', nil, 10) + +-- Potato +hbhunger.register_food('x_farming:potato', 2) +hbhunger.register_food('x_farming:bakedpotato', 6) +hbhunger.register_food('x_farming:poisonouspotato', -6, nil, 5) + +-- Pumpkin +hbhunger.register_food('x_farming:pumpkin_pie', 6) + +-- Fish stew +hbhunger.register_food('x_farming:fish_stew', 8, 'x_farming:bowl') + +-- Cocoa +hbhunger.register_food('x_farming:cookie', 2) +hbhunger.register_food('x_farming:chocolate', 3) + +-- Kiwi +hbhunger.register_food('x_farming:kiwi_fruit', 2) + +-- Dragon fruit +hbhunger.register_food('x_farming:cactus_fruit_item', 2) + +-- Strawberry +hbhunger.register_food('x_farming:strawberry', 2) + +-- Pine Nut Roasted +hbhunger.register_food('x_farming:pine_nut_roasted', 2) + +-- Donuts +hbhunger.register_food('x_farming:donut', 3) +hbhunger.register_food('x_farming:donut_chocolate', 4) + +-- Fries +hbhunger.register_food('x_farming:fries', 6) + +-- Bread +hbhunger.register_food('x_farming:bread', 5) + +-- Bottle Honey +if x_farming.vessels then + hbhunger.register_food('x_farming:bottle_honey', 6, 'vessels:glass_bottle') +else + hbhunger.register_food('x_farming:bottle_honey', 6, 'x_farming:glass_bottle') +end + +-- Sushi +hbhunger.register_food('x_farming:sushi_maki', 5) +hbhunger.register_food('x_farming:sushi_nigiri', 3) + + +hbhunger.register_food('x_farming:bowl_french_potatoes', 8, 'x_farming:bowl') +hbhunger.register_food('x_farming:bowl_baked_fish', 8, 'x_farming:bowl') +hbhunger.register_food('x_farming:bowl_melon_slush', 8, 'x_farming:bowl') + +hbhunger.register_food('x_farming:slice_strawberry_pie', 6) +hbhunger.register_food('x_farming:slice_chocolate_pie', 6) +hbhunger.register_food('x_farming:slice_honey_kiwi_pie', 6) diff --git a/mods/x_farming/mod_support_hunger_ng.lua b/mods/x_farming/mod_support_hunger_ng.lua new file mode 100644 index 00000000..5511e63e --- /dev/null +++ b/mods/x_farming/mod_support_hunger_ng.lua @@ -0,0 +1,90 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- Beetroot +hunger_ng.add_hunger_data('x_farming:beetroot', { satiates = 3 }) +hunger_ng.add_hunger_data('x_farming:beetroot_soup', { satiates = 6 }, 'x_farming:bowl') + +-- Carrot +hunger_ng.add_hunger_data('x_farming:carrot', { satiates = 3 }) +hunger_ng.add_hunger_data('x_farming:carrot_golden', { satiates = 10, heals = 10 }) + +-- Coffee +hunger_ng.add_hunger_data('x_farming:coffee_cup_hot', { satiates = 6, heals = 4 }) + +-- Corn +hunger_ng.add_hunger_data('x_farming:corn_pop', { satiates = 1 }) +hunger_ng.add_hunger_data('x_farming:corn_popcorn', { satiates = 5 }) + +-- Melon +hunger_ng.add_hunger_data('x_farming:melon', { satiates = 2 }) +hunger_ng.add_hunger_data('x_farming:golden_melon', { satiates = 10, heals = 10 }) + +-- Potato +hunger_ng.add_hunger_data('x_farming:potato', { satiates = 2 }) +hunger_ng.add_hunger_data('x_farming:bakedpotato', { satiates = 6 }) +hunger_ng.add_hunger_data('x_farming:poisonouspotato', { satiates = -6, heals= -6 }) + +-- Pumpkin +hunger_ng.add_hunger_data('x_farming:pumpkin_pie', { satiates = 6 }) + +-- Fish stew +hunger_ng.add_hunger_data('x_farming:fish_stew', { satiates = 8, returns = 'x_farming:bowl' }) + +-- Cocoa +hunger_ng.add_hunger_data('x_farming:cookie', { satiates = 2 }) +hunger_ng.add_hunger_data('x_farming:chocolate', { satiates = 3 }) + +-- Kiwi +hunger_ng.add_hunger_data('x_farming:kiwi_fruit', { satiates = 2 }) + +-- Dragon fruit +hunger_ng.add_hunger_data('x_farming:cactus_fruit_item', { satiates = 2 }) + +-- Strawberry +hunger_ng.add_hunger_data('x_farming:strawberry', { satiates = 2 }) + +-- Pine Nut Roasted +hunger_ng.add_hunger_data('x_farming:pine_nut_roasted', { satiates = 2 }) + +-- Donuts +hunger_ng.add_hunger_data('x_farming:donut', { satiates = 3 }) +hunger_ng.add_hunger_data('x_farming:donut_chocolate', { satiates = 4 }) + +-- Fries +hunger_ng.add_hunger_data('x_farming:fries', { satiates = 6 }) +hunger_ng.add_hunger_data('x_farming:bread', { satiates = 5 }) + +-- Bottle Honey +if x_farming.vessels then + hunger_ng.add_hunger_data('x_farming:bottle_honey', { satiates = 6, returns = 'vessels:glass_bottle' }) +else + hunger_ng.add_hunger_data('x_farming:bottle_honey', { satiates = 6, returns = 'x_farming:glass_bottle' }) +end + +-- Sushi +hunger_ng.add_hunger_data('x_farming:sushi_maki', { satiates = 5 }) +hunger_ng.add_hunger_data('x_farming:sushi_nigiri', { satiates = 3 }) + +hunger_ng.add_hunger_data('x_farming:bowl_french_potatoes', { satiates = 8, returns = 'x_farming:bowl' }) +hunger_ng.add_hunger_data('x_farming:bowl_baked_fish', { satiates = 8, returns = 'x_farming:bowl' }) +hunger_ng.add_hunger_data('x_farming:bowl_melon_slush', { satiates = 8, returns = 'x_farming:bowl' }) + +hunger_ng.add_hunger_data('x_farming:slice_strawberry_pie', { satiates = 6 }) +hunger_ng.add_hunger_data('x_farming:slice_chocolate_pie', { satiates = 6 }) +hunger_ng.add_hunger_data('x_farming:slice_honey_kiwi_pie', { satiates = 6 }) diff --git a/mods/x_farming/mod_support_mcl_aliases.lua b/mods/x_farming/mod_support_mcl_aliases.lua new file mode 100644 index 00000000..2f6d02bb --- /dev/null +++ b/mods/x_farming/mod_support_mcl_aliases.lua @@ -0,0 +1,168 @@ +--[[ + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +minetest.register_alias('default:water_source', 'mcl_core:water_source') +minetest.register_alias('default:dirt', 'mcl_core:dirt') +minetest.register_alias('default:dirt_with_rainforest_litter', 'mcl_core:dirt_with_grass') +minetest.register_alias('default:dirt_with_snow', 'mcl_core:dirt_with_grass_snow') +minetest.register_alias('default:dirt_with_coniferous_litter', 'mcl_core:podzol') +minetest.register_alias('default:dirt_with_grass', 'mcl_core:dirt_with_grass') +minetest.register_alias('default:stick', 'mcl_core:stick') +minetest.register_alias('default:paper', 'mcl_core:paper') +minetest.register_alias('default:book', 'mcl_books:book') +minetest.register_alias('default:skeleton_key', 'mcl_core:gold_nugget') +minetest.register_alias('default:flint', 'mcl_core:flint') +minetest.register_alias('default:obsidian_shard', 'mcl_core:prismarine_shard') +minetest.register_alias('default:clay_brick', 'mcl_core:brick') +minetest.register_alias('default:mese_crystal_fragment', 'mcl_amethyst:amethyst_shard') +-- Ingots +minetest.register_alias('default:gold_ingot', 'mcl_core:gold_ingot') +minetest.register_alias('default:bronze_ingot', 'mcl_copper:copper_ingot') +minetest.register_alias('default:tin_ingot', 'mcl_core:iron_ingot') +minetest.register_alias('default:copper_ingot', 'mcl_copper:copper_ingot') +minetest.register_alias('default:steel_ingot', 'mcl_core:iron_ingot') +minetest.register_alias('default:coal_lump', 'mcl_core:coal_lump') +minetest.register_alias('default:gold_lump', 'mcl_core:gold_nugget') + +-- Tools +minetest.register_alias('default:pick_stone', 'mcl_tools:pick_stone') +minetest.register_alias('default:pick_bronze', 'mcl_tools:pick_gold') +minetest.register_alias('default:pick_steel', 'mcl_tools:pick_iron') +minetest.register_alias('default:shovel_stone', 'mcl_tools:shovel_stone') +minetest.register_alias('default:shovel_bronze', 'mcl_tools:shovel_gold') +minetest.register_alias('default:shovel_steel', 'mcl_tools:shovel_iron') +minetest.register_alias('default:axe_stone', 'mcl_tools:axe_stone') +minetest.register_alias('default:axe_bronze', 'mcl_tools:axe_gold') +minetest.register_alias('default:axe_steel', 'mcl_tools:axe_iron') +minetest.register_alias('default:sword_stone', 'mcl_tools:sword_stone') +minetest.register_alias('default:sword_bronze', 'mcl_tools:sword_gold') +minetest.register_alias('default:sword_steel', 'mcl_tools:sword_iron') +-- Items / Nodes +minetest.register_alias('default:bookshelf', 'mcl_books:bookshelf') +minetest.register_alias('default:sign_wall_wood', 'mcl_signs:wall_sign') +minetest.register_alias('default:ladder_wood', 'mcl_core:ladder') +minetest.register_alias('default:ladder_steel', 'mcl_core:ladder') +minetest.register_alias('default:glass', 'mcl_core:glass') +minetest.register_alias('default:obsidian_glass', 'mcl_core:glass') +-- Trees +minetest.register_alias('default:tree', 'mcl_core:tree') +minetest.register_alias('default:jungletree', 'mcl_core:jungletree') +minetest.register_alias('default:pine_tree', 'mcl_core:sprucetree') +minetest.register_alias('default:cactus', 'mcl_core:cactus') +minetest.register_alias('default:large_cactus_seedling', 'mcl_core:cactus') +minetest.register_alias('default:papyrus', 'mcl_core:reeds') +minetest.register_alias('default:junglegrass', 'mcl_flowers:double_grass') +minetest.register_alias('default:blueberry_bush_sapling', 'mcl_flowers:rose_bush') +minetest.register_alias('default:sapling', 'mcl_core:sapling') +minetest.register_alias('default:junglesapling', 'mcl_core:junglesapling') +minetest.register_alias('default:pine_sapling', 'mcl_core:sprucesapling') +minetest.register_alias('default:acacia_sapling', 'mcl_core:acaciasapling') +minetest.register_alias('default:aspen_sapling', 'mcl_core:birchsapling') + +minetest.register_alias('default:clay_lump', 'mcl_core:clay_lump') +minetest.register_alias('default:tin_lump', 'mcl_raw_ores:raw_gold') +minetest.register_alias('default:copper_lump', 'mcl_copper:raw_copper') +minetest.register_alias('default:iron_lump', 'mcl_raw_ores:raw_iron') +minetest.register_alias('default:coalblock', 'mcl_core:coalblock') +minetest.register_alias('default:steelblock', 'mcl_core:ironblock') +minetest.register_alias('default:copperblock', 'mcl_copper:block') +minetest.register_alias('default:tinblock', 'mcl_core:goldblock') +minetest.register_alias('default:bronzeblock', 'mcl_copper:block') +minetest.register_alias('default:mese', 'mesecons_torch:redstoneblock') +minetest.register_alias('default:meselamp', 'mesecons_lightstone:lightstone_off') +minetest.register_alias('default:obsidian', 'mcl_core:obsidian') +minetest.register_alias('default:mese_crystal', 'mcl_ocean:prismarine_crystals') +minetest.register_alias('default:diamond', 'mcl_core:diamond') +minetest.register_alias('default:pick_mese', 'mcl_tools:pick_diamond') +minetest.register_alias('default:shovel_mese', 'mcl_tools:shovel_diamond') +minetest.register_alias('default:axe_mese', 'mcl_tools:axe_diamond') +minetest.register_alias('default:sword_mese', 'mcl_tools:sword_diamond') + +minetest.register_alias('default:snowblock', 'mcl_core:snowblock') +minetest.register_alias('default:ice', 'mcl_core:ice') +minetest.register_alias('default:torch', 'mcl_torches:torch') +minetest.register_alias('default:cobble', 'mcl_core:cobble') +minetest.register_alias('default:chest', 'mcl_chests:chest') +minetest.register_alias('default:snow', 'mcl_core:snow') +minetest.register_alias('default:stone', 'mcl_core:stone') +minetest.register_alias('default:sand', 'mcl_core:sand') +minetest.register_alias('default:gravel', 'mcl_core:gravel') +minetest.register_alias('default:stone_with_coal', 'mcl_core:stone_with_coal') +minetest.register_alias('default:stone_with_iron', 'mcl_core:stone_with_iron') +minetest.register_alias('default:stone_with_tin', 'mcl_core:stone_with_copper') +minetest.register_alias('default:stone_with_gold', 'mcl_core:stone_with_gold') +minetest.register_alias('default:stone_with_mese', 'mcl_core:stone_with_redstone') +minetest.register_alias('default:stone_with_diamond', 'mcl_core:stone_with_diamond') +minetest.register_alias('default:lava_source', 'mcl_core:lava_source') +minetest.register_alias('default:mossycobble', 'mcl_core:mossycobble') +minetest.register_alias('default:clay', 'mcl_colorblocks:hardened_clay') +minetest.register_alias('default:dry_dirt_with_dry_grass', 'mcl_core:dirt_with_grass') +minetest.register_alias('default:dry_dirt', 'mcl_core:coarse_dirt') +minetest.register_alias('default:coral_skeleton', 'mcl_core:bone_block') +minetest.register_alias('default:coral_orange', 'mcl_ocean:tube_coral_block') +minetest.register_alias('default:coral_brown', 'mcl_ocean:brain_coral_block') +minetest.register_alias('default:lava_flowing', 'mcl_core:lava_flowing') +minetest.register_alias('stairs:slab_cursed_brick_with_growth', 'mcl_stairs:slab_cursed_brick_with_growth') +minetest.register_alias('default:fence_wood', 'mcl_fences:fence') +minetest.register_alias('default:torch_wall', 'mcl_torches:torch_wall') +minetest.register_alias('default:wood', 'mcl_core:wood') +minetest.register_alias('default:junglewood', 'mcl_core:junglewood') +minetest.register_alias('default:pine_wood', 'mcl_core:sprucewood') +minetest.register_alias('default:mese_post_light_pine_wood', 'mcl_torches:torch') +minetest.register_alias_force('default:acacia_tree', 'mcl_core:acaciatree') +minetest.register_alias('default:dry_grass_4', 'mcl_core:deadbush') +minetest.register_alias('default:dry_grass_2', 'mcl_core:deadbush') +minetest.register_alias('default:dry_shrub', 'mcl_core:deadbush') +minetest.register_alias('default:stonebrick', 'mcl_core:stonebrick') +minetest.register_alias('default:jungleleaves', 'mcl_core:jungleleaves') +minetest.register_alias('default:torch_ceiling', 'mcl_torches:torch_wall') +minetest.register_alias('default:goldblock', 'mcl_core:goldblock') +minetest.register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood') +minetest.register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood') +minetest.register_alias('stairs:slab_dry_wood', 'mcl_stairs:slab_dry_wood') +minetest.register_alias('stairs:stair_dry_wood', 'mcl_stairs:stair_dry_wood') +minetest.register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood') +minetest.register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick') +minetest.register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner') +minetest.register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer') +minetest.register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick') +minetest.register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble') + +minetest.register_alias('walls:cobble', 'mcl_walls:cobble') +minetest.register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor') +minetest.register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open') +minetest.register_alias('doors:trapdoor', 'mcl_doors:trapdoor') +minetest.register_alias('doors:door_wood_a', 'mcl_doors:wooden_door') +minetest.register_alias('doors:hidden', 'air') + +-- Dye +minetest.register_alias('dye:brown', 'mcl_dye:brown') +minetest.register_alias('dye:black', 'mcl:dye:black') +minetest.register_alias('dye:blue', 'mcl:dye:blue') +minetest.register_alias('dye:cyan', 'mcl:dye:cyan') +minetest.register_alias('dye:dark_grey', 'mcl:dye:dark_grey') +minetest.register_alias('dye:grey', 'mcl:dye:grey') +minetest.register_alias('dye:dark_green', 'mcl:dye:dark_green') +minetest.register_alias('dye:green', 'mcl:dye:green') +minetest.register_alias('dye:magenta', 'mcl:dye:magenta') +minetest.register_alias('dye:orange', 'mcl:dye:orange') +minetest.register_alias('dye:pink', 'mcl:dye:pink') +minetest.register_alias('dye:violet', 'mcl:dye:violet') +minetest.register_alias('dye:red', 'mcl:dye:red') +minetest.register_alias('dye:white', 'mcl:dye:white') +minetest.register_alias('dye:yellow', 'mcl:dye:yellow') +minetest.register_alias('default:sand_with_kelp', 'mcl_ocean:kelp') diff --git a/mods/x_farming/models/x_farming_bag.obj b/mods/x_farming/models/x_farming_bag.obj new file mode 100644 index 00000000..acd0da84 --- /dev/null +++ b/mods/x_farming/models/x_farming_bag.obj @@ -0,0 +1,1125 @@ +# Blender v3.3.1 OBJ File: 'x_farming_bag.blend' +# www.blender.org +mtllib bag.vox.mtl +o bag.vox +v 0.437500 -0.500000 -0.437500 +v 0.375000 -0.437500 0.375000 +v -0.187500 -0.187500 -0.437500 +v -0.125000 -0.187500 -0.500000 +v -0.250000 -0.062500 -0.500000 +v -0.125000 0.187500 -0.437500 +v -0.312500 0.250000 -0.437500 +v -0.312500 0.250000 -0.500000 +v -0.250000 0.250000 -0.500000 +v 0.125000 0.187500 -0.437500 +v 0.437500 0.250000 -0.437500 +v 0.500000 0.312500 -0.500000 +v -0.500000 0.375000 -0.500000 +v -0.375000 0.437500 0.375000 +v -0.375000 0.500000 0.375000 +v -0.312500 0.437500 -0.125000 +v -0.312500 0.437500 0.187500 +v -0.312500 0.500000 0.187500 +v -0.250000 0.500000 0.187500 +v -0.250000 0.437500 -0.062500 +v -0.250000 0.500000 -0.062500 +v -0.125000 0.437500 -0.187500 +v 0.000000 0.500000 -0.312500 +v 0.000000 0.437500 -0.312500 +v -0.062500 0.437500 -0.187500 +v 0.000000 0.437500 -0.187500 +v 0.000000 0.437500 -0.250000 +v 0.000000 0.437500 -0.125000 +v 0.125000 0.437500 -0.250000 +v 0.187500 0.500000 -0.187500 +v 0.250000 0.500000 -0.187500 +v 0.375000 0.437500 0.375000 +v -0.437500 -0.500000 0.437500 +v 0.437500 -0.500000 0.437500 +v 0.375000 -0.437500 -0.375000 +v 0.437500 0.250000 0.437500 +v -0.500000 0.250000 0.500000 +v -0.437500 0.437500 -0.437500 +v -0.375000 0.375000 0.375000 +v 0.500000 0.375000 0.500000 +v -0.312500 0.500000 -0.062500 +v -0.312500 0.500000 0.250000 +v -0.187500 0.437500 0.250000 +v -0.187500 0.500000 0.250000 +v -0.187500 0.437500 0.187500 +v -0.125000 0.437500 0.187500 +v -0.062500 0.500000 0.312500 +v 0.000000 0.500000 -0.250000 +v 0.000000 0.437500 0.187500 +v 0.125000 0.437500 0.312500 +v 0.125000 0.500000 0.312500 +v 0.187500 0.437500 0.000000 +v 0.187500 0.500000 0.000000 +v 0.250000 0.437500 0.187500 +v 0.250000 0.500000 0.187500 +v 0.250000 0.437500 0.062500 +v -0.187500 -0.187500 -0.500000 +v -0.312500 -0.062500 -0.500000 +v -0.437500 0.250000 -0.437500 +v -0.500000 0.250000 -0.500000 +v -0.500000 0.312500 0.500000 +v -0.437500 0.312500 0.437500 +v -0.500000 0.375000 0.500000 +v 0.437500 0.375000 -0.437500 +v 0.437500 0.375000 0.437500 +v -0.500000 0.500000 -0.500000 +v -0.312500 0.437500 -0.062500 +v -0.312500 0.437500 0.250000 +v -0.250000 0.437500 0.187500 +v -0.187500 0.437500 -0.062500 +v -0.125000 0.437500 -0.312500 +v -0.125000 0.500000 -0.312500 +v -0.125000 0.437500 0.312500 +v -0.125000 0.500000 0.312500 +v 0.062500 0.437500 -0.125000 +v 0.062500 0.437500 0.187500 +v 0.062500 0.437500 0.250000 +v 0.125000 0.437500 -0.187500 +v 0.125000 0.500000 -0.250000 +v 0.125000 0.437500 0.250000 +v 0.250000 0.437500 -0.062500 +v 0.250000 0.500000 -0.125000 +v 0.250000 0.500000 0.062500 +v -0.375000 -0.437500 -0.375000 +v -0.125000 -0.187500 -0.437500 +v -0.250000 -0.062500 -0.437500 +v -0.125000 0.187500 -0.500000 +v -0.250000 0.250000 -0.437500 +v 0.125000 0.187500 -0.500000 +v 0.125000 0.250000 -0.437500 +v 0.500000 0.312500 0.125000 +v 0.500000 0.312500 0.500000 +v 0.500000 0.250000 0.500000 +v -0.375000 0.375000 -0.375000 +v 0.437500 0.312500 -0.437500 +v 0.500000 0.375000 -0.500000 +v -0.250000 0.437500 -0.125000 +v -0.250000 0.500000 -0.125000 +v -0.187500 0.500000 0.187500 +v -0.062500 0.437500 -0.250000 +v -0.062500 0.437500 0.312500 +v 0.000000 0.500000 0.187500 +v 0.062500 0.437500 -0.187500 +v 0.187500 0.437500 -0.250000 +v 0.187500 0.500000 -0.125000 +v 0.187500 0.437500 0.187500 +v 0.250000 0.437500 0.000000 +v 0.312500 0.437500 -0.125000 +v 0.312500 0.437500 -0.062500 +v 0.312500 0.500000 0.000000 +v 0.312500 0.437500 0.062500 +v -0.437500 -0.500000 -0.437500 +v -0.312500 -0.062500 -0.437500 +v -0.437500 0.250000 0.437500 +v -0.187500 0.250000 -0.500000 +v -0.187500 0.250000 -0.437500 +v 0.125000 0.250000 -0.500000 +v 0.500000 0.250000 -0.500000 +v -0.500000 0.375000 -0.125000 +v -0.437500 0.375000 -0.437500 +v -0.437500 0.375000 0.437500 +v -0.375000 0.437500 -0.375000 +v -0.437500 0.437500 0.437500 +v 0.437500 0.437500 -0.437500 +v 0.437500 0.437500 0.437500 +v -0.375000 -0.437500 0.375000 +v -0.500000 0.312500 -0.500000 +v -0.437500 0.312500 -0.437500 +v 0.437500 0.312500 0.437500 +v 0.375000 0.375000 -0.375000 +v 0.375000 0.375000 0.375000 +v -0.187500 0.437500 -0.187500 +v -0.062500 0.437500 0.250000 +v 0.062500 0.437500 -0.250000 +v 0.000000 0.437500 0.250000 +v 0.187500 0.437500 -0.187500 +v 0.187500 0.437500 -0.125000 +v 0.187500 0.437500 -0.062500 +v 0.187500 0.437500 0.062500 +v 0.187500 0.437500 0.312500 +v 0.250000 0.437500 -0.187500 +v 0.250000 0.437500 -0.125000 +v 0.375000 0.437500 -0.375000 +v 0.312500 0.437500 0.000000 +v -0.500000 0.500000 0.500000 +v -0.375000 0.500000 -0.375000 +v -0.312500 0.500000 -0.125000 +v -0.187500 0.500000 -0.187500 +v -0.187500 0.500000 -0.062500 +v -0.125000 0.500000 -0.187500 +v -0.125000 0.500000 0.187500 +v -0.062500 0.500000 -0.250000 +v -0.062500 0.500000 -0.187500 +v 0.000000 0.500000 -0.125000 +v 0.000000 0.500000 -0.187500 +v -0.062500 0.500000 0.250000 +v 0.000000 0.500000 0.250000 +v 0.062500 0.500000 -0.187500 +v 0.062500 0.500000 -0.250000 +v 0.062500 0.500000 0.187500 +v 0.062500 0.500000 -0.125000 +v 0.062500 0.500000 0.250000 +v 0.125000 0.500000 -0.187500 +v 0.187500 0.500000 -0.250000 +v 0.187500 0.500000 -0.062500 +v 0.187500 0.500000 0.062500 +v 0.187500 0.500000 0.187500 +v 0.125000 0.500000 0.250000 +v 0.187500 0.500000 0.312500 +v 0.250000 0.500000 0.000000 +v 0.250000 0.500000 -0.062500 +v 0.312500 0.500000 -0.062500 +v 0.312500 0.500000 -0.125000 +v 0.312500 0.500000 0.062500 +v 0.375000 0.500000 -0.375000 +v 0.375000 0.500000 0.375000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 0.937500 0.187500 +vt 0.718750 0.203125 +vt 0.937500 0.203125 +vt 0.703125 0.203125 +vt 0.500000 0.218750 +vt 0.718750 0.218750 +vt 0.875000 0.796875 +vt 0.796875 0.796875 +vt 0.718750 0.812500 +vt 0.468750 0.468750 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.437500 0.765625 +vt 0.453125 0.750000 +vt 0.437500 0.750000 +vt 0.421875 0.609375 +vt 0.437500 0.593750 +vt 0.421875 0.593750 +vt 0.484375 0.781250 +vt 0.468750 0.796875 +vt 0.468750 0.781250 +vt 0.718750 0.953125 +vt 0.468750 0.921875 +vt 0.718750 0.921875 +vt 0.687500 0.671875 +vt 0.500000 0.656250 +vt 0.687500 0.656250 +vt 0.406250 0.703125 +vt 0.218750 0.718750 +vt 0.406250 0.718750 +vt 0.468750 0.593750 +vt 0.484375 0.578125 +vt 0.468750 0.578125 +vt 0.468750 0.718750 +vt 0.453125 0.734375 +vt 0.453125 0.718750 +vt 0.484375 0.015625 +vt 0.343750 0.000000 +vt 0.265625 0.015625 +vt 0.468750 0.578125 +vt 0.453125 0.500000 +vt 0.468750 0.500000 +vt 0.718750 0.000000 +vt 0.906250 0.187500 +vt 0.718750 0.187500 +vt 0.421875 0.609375 +vt 0.406250 0.500000 +vt 0.421875 0.500000 +vt 0.484375 0.671875 +vt 0.468750 0.687500 +vt 0.468750 0.671875 +vt 0.218750 0.921875 +vt 0.000000 0.906250 +vt 0.218750 0.906250 +vt 0.500000 0.562500 +vt 0.484375 0.578125 +vt 0.484375 0.562500 +vt 0.484375 0.640625 +vt 0.468750 0.656250 +vt 0.468750 0.640625 +vt 0.437500 0.640625 +vt 0.453125 0.625000 +vt 0.437500 0.625000 +vt 0.500000 0.421875 +vt 0.687500 0.437500 +vt 0.687500 0.421875 +vt 0.468750 0.734375 +vt 0.484375 0.718750 +vt 0.468750 0.718750 +vt 0.468750 0.218750 +vt 0.484375 0.234375 +vt 0.500000 0.531250 +vt 0.484375 0.546875 +vt 0.484375 0.531250 +vt 0.500000 0.515625 +vt 0.484375 0.531250 +vt 0.484375 0.515625 +vt 0.500000 0.703125 +vt 0.484375 0.718750 +vt 0.484375 0.703125 +vt 0.484375 0.765625 +vt 0.500000 0.750000 +vt 0.484375 0.750000 +vt 0.515625 0.015625 +vt 0.718750 0.000000 +vt 0.500000 0.000000 +vt 0.468750 0.609375 +vt 0.453125 0.625000 +vt 0.453125 0.609375 +vt 0.218750 0.718750 +vt 0.000000 0.500000 +vt 0.000000 0.718750 +vt 0.453125 0.593750 +vt 0.453125 0.578125 +vt 0.437500 0.625000 +vt 0.437500 0.609375 +vt 0.718750 0.218750 +vt 0.437500 0.968750 +vt 0.218750 0.953125 +vt 0.437500 0.953125 +vt 0.484375 0.562500 +vt 0.468750 0.500000 +vt 0.468750 0.562500 +vt 0.468750 0.953125 +vt 0.218750 0.921875 +vt 0.218750 0.953125 +vt 0.468750 0.281250 +vt 0.250000 0.250000 +vt 0.500000 0.250000 +vt 0.468750 0.578125 +vt 0.468750 0.562500 +vt 0.484375 0.687500 +vt 0.468750 0.703125 +vt 0.468750 0.687500 +vt 0.687500 0.640625 +vt 0.937500 0.671875 +vt 0.937500 0.640625 +vt 0.484375 0.656250 +vt 0.500000 0.640625 +vt 0.421875 0.718750 +vt 0.437500 0.703125 +vt 0.421875 0.703125 +vt 0.500000 0.453125 +vt 0.500000 0.437500 +vt 0.500000 0.593750 +vt 0.437500 0.609375 +vt 0.687500 0.093750 +vt 0.687500 0.078125 +vt 0.703125 0.015625 +vt 0.156250 0.250000 +vt 0.015625 0.234375 +vt 0.234375 0.234375 +vt 0.453125 0.578125 +vt 0.437500 0.500000 +vt 0.437500 0.578125 +vt 0.968750 0.968750 +vt 0.718750 0.953125 +vt 0.968750 0.953125 +vt 0.437500 0.656250 +vt 0.453125 0.640625 +vt 0.437500 0.640625 +vt 0.218750 0.968750 +vt 0.000000 0.953125 +vt 0.218750 0.953125 +vt 0.687500 0.453125 +vt 0.687500 0.218750 +vt 0.875000 0.437500 +vt 0.687500 0.453125 +vt 0.875000 0.453125 +vt 0.406250 0.734375 +vt 0.421875 0.718750 +vt 0.406250 0.718750 +vt 0.453125 0.718750 +vt 0.437500 0.734375 +vt 0.437500 0.718750 +vt 0.000000 0.937500 +vt 0.468750 0.671875 +vt 0.453125 0.687500 +vt 0.453125 0.671875 +vt 0.484375 0.734375 +vt 0.500000 0.718750 +vt 0.484375 0.718750 +vt 0.500000 0.625000 +vt 0.468750 0.625000 +vt 0.546875 0.125000 +vt 0.546875 0.140625 +vt 0.531250 0.109375 +vt 0.484375 0.703125 +vt 0.500000 0.687500 +vt 0.484375 0.687500 +vt 0.468750 0.625000 +vt 0.453125 0.640625 +vt 0.453125 0.625000 +vt 0.500000 0.578125 +vt 0.484375 0.593750 +vt 0.484375 0.578125 +vt 0.500000 0.734375 +vt 0.484375 0.750000 +vt 0.484375 0.734375 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.265625 0.234375 +vt 0.406250 0.734375 +vt 0.218750 0.734375 +vt 0.468750 0.781250 +vt 0.453125 0.796875 +vt 0.453125 0.781250 +vt 0.406250 0.718750 +vt 0.421875 0.703125 +vt 0.406250 0.703125 +vt 0.421875 0.656250 +vt 0.437500 0.640625 +vt 0.421875 0.640625 +vt 0.218750 0.937500 +vt 0.000000 0.921875 +vt 0.000000 0.937500 +vt 0.468750 0.750000 +vt 0.453125 0.765625 +vt 0.453125 0.750000 +vt 0.031250 0.828125 +vt 0.046875 0.828125 +vt 0.062500 0.796875 +vt 0.906250 0.640625 +vt 0.687500 0.453125 +vt 0.687500 0.640625 +vt 0.453125 0.812500 +vt 0.468750 0.796875 +vt 0.453125 0.796875 +vt 0.437500 0.593750 +vt 0.437500 0.578125 +vt 0.453125 0.718750 +vt 0.468750 0.703125 +vt 0.453125 0.703125 +vt 0.687500 0.421875 +vt 0.875000 0.421875 +vt 0.406250 0.625000 +vt 0.421875 0.609375 +vt 0.406250 0.609375 +vt 0.406250 0.656250 +vt 0.406250 0.640625 +vt 0.484375 0.515625 +vt 0.500000 0.500000 +vt 0.484375 0.500000 +vt 0.500000 0.656250 +vt 0.468750 0.671875 +vt 0.468750 0.656250 +vt 0.687500 0.218750 +vt 0.875000 0.218750 +vt 0.500000 0.875000 +vt 0.718750 0.687500 +vt 0.718750 0.875000 +vt 0.937500 0.687500 +vt 0.687500 0.671875 +vt 0.937500 0.671875 +vt 0.421875 0.593750 +vt 0.437500 0.500000 +vt 0.421875 0.500000 +vt 0.484375 0.765625 +vt 0.468750 0.781250 +vt 0.468750 0.765625 +vt 0.531250 0.890625 +vt 0.687500 0.890625 +vt 0.687500 0.921875 +vt 0.468750 0.640625 +vt 0.484375 0.625000 +vt 0.421875 0.734375 +vt 0.437500 0.718750 +vt 0.421875 0.718750 +vt 0.406250 0.500000 +vt 0.218750 0.703125 +vt 0.218750 0.500000 +vt 0.234375 0.015625 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.437500 0.671875 +vt 0.406250 0.687500 +vt 0.406250 0.671875 +vt 0.437500 0.687500 +vt 0.437500 0.671875 +vt 0.281250 0.031250 +vt 0.437500 0.781250 +vt 0.453125 0.765625 +vt 0.437500 0.765625 +vt 0.218750 0.968750 +vt 0.437500 0.984375 +vt 0.437500 0.718750 +vt 0.453125 0.703125 +vt 0.437500 0.703125 +vt 0.859375 0.921875 +vt 0.875000 0.937500 +vt 0.843750 0.937500 +vt 0.437500 0.796875 +vt 0.453125 0.781250 +vt 0.437500 0.781250 +vt 0.437500 0.750000 +vt 0.453125 0.734375 +vt 0.437500 0.734375 +vt 0.468750 0.750000 +vt 0.484375 0.734375 +vt 0.468750 0.734375 +vt 0.421875 0.640625 +vt 0.421875 0.625000 +vt 0.468750 0.765625 +vt 0.484375 0.750000 +vt 0.468750 0.750000 +vt 0.421875 0.625000 +vt 0.453125 0.796875 +vt 0.437500 0.812500 +vt 0.437500 0.796875 +vt 0.468750 0.687500 +vt 0.437500 0.703125 +vt 0.468750 0.703125 +vt 0.468750 0.656250 +vt 0.437500 0.671875 +vt 0.468750 0.671875 +vt 0.250000 0.500000 +vt 0.250000 0.250000 +vt 0.234375 0.484375 +vt 0.484375 0.687500 +vt 0.500000 0.671875 +vt 0.500000 0.546875 +vt 0.484375 0.562500 +vt 0.484375 0.546875 +vt 0.437500 0.671875 +vt 0.406250 0.656250 +vt 0.437500 0.656250 +vt 0.437500 0.921875 +vt 0.218750 0.734375 +vt 0.437500 0.734375 +vt 0.468750 0.718750 +vt 0.484375 0.703125 +vt 0.468750 0.703125 +vt 0.500000 0.781250 +vt 0.484375 0.796875 +vt 0.484375 0.781250 +vt 0.437500 0.953125 +vt 0.593750 0.968750 +vt 0.687500 0.953125 +vt 0.468750 0.640625 +vt 0.453125 0.656250 +vt 0.500000 0.687500 +vt 0.687500 0.687500 +vt 0.500000 0.765625 +vt 0.484375 0.781250 +vt 0.484375 0.765625 +vt 0.437500 0.687500 +vt 0.406250 0.703125 +vt 0.406250 0.687500 +vt 0.468750 0.734375 +vt 0.453125 0.750000 +vt 0.453125 0.734375 +vt 0.484375 0.796875 +vt 0.468750 0.812500 +vt 0.468750 0.796875 +vt 0.468750 0.765625 +vt 0.453125 0.781250 +vt 0.453125 0.765625 +vt 0.500000 0.625000 +vt 0.484375 0.640625 +vt 0.484375 0.625000 +vt 0.406250 0.640625 +vt 0.406250 0.625000 +vt 0.281250 0.218750 +vt 0.718750 0.187500 +vt 0.515625 0.203125 +vt 0.968750 0.812500 +vt 0.968750 0.796875 +vt 0.875000 0.781250 +vt 0.812500 0.781250 +vt 0.765625 0.796875 +vt 0.718750 0.796875 +vt 0.781250 0.718750 +vt 0.765625 0.718750 +vt 0.781250 0.796875 +vt 0.812500 0.687500 +vt 0.796875 0.687500 +vt 0.281250 0.281250 +vt 0.281250 0.468750 +vt 0.453125 0.765625 +vt 0.484375 0.796875 +vt 0.468750 0.953125 +vt 0.500000 0.671875 +vt 0.484375 0.593750 +vt 0.468750 0.734375 +vt 0.500000 0.000000 +vt 0.453125 0.578125 +vt 0.906250 0.000000 +vt 0.406250 0.609375 +vt 0.500000 0.578125 +vt 0.453125 0.640625 +vt 0.484375 0.734375 +vt 0.468750 0.031250 +vt 0.500000 0.546875 +vt 0.500000 0.531250 +vt 0.500000 0.718750 +vt 0.500000 0.765625 +vt 0.218750 0.500000 +vt 0.937500 0.218750 +vt 0.484375 0.500000 +vt 0.468750 0.921875 +vt 0.484375 0.703125 +vt 0.687500 0.671875 +vt 0.500000 0.656250 +vt 0.437500 0.718750 +vt 0.687500 0.453125 +vt 0.500000 0.609375 +vt 0.656250 0.125000 +vt 0.656250 0.109375 +vt 0.671875 0.109375 +vt 0.671875 0.093750 +vt 0.656250 0.078125 +vt 0.671875 0.062500 +vt 0.656250 0.062500 +vt 0.671875 0.031250 +vt 0.656250 0.031250 +vt 0.656250 0.046875 +vt 0.593750 0.046875 +vt 0.593750 0.031250 +vt 0.687500 0.140625 +vt 0.671875 0.140625 +vt 0.671875 0.125000 +vt 0.000000 0.250000 +vt 0.453125 0.500000 +vt 0.718750 0.968750 +vt 0.000000 0.968750 +vt 0.500000 0.453125 +vt 0.500000 0.218750 +vt 0.687500 0.437500 +vt 0.421875 0.734375 +vt 0.453125 0.734375 +vt 0.218750 0.937500 +vt 0.468750 0.687500 +vt 0.500000 0.734375 +vt 0.500000 0.609375 +vt 0.578125 0.031250 +vt 0.687500 0.156250 +vt 0.656250 0.171875 +vt 0.656250 0.156250 +vt 0.625000 0.187500 +vt 0.625000 0.171875 +vt 0.593750 0.171875 +vt 0.609375 0.171875 +vt 0.609375 0.187500 +vt 0.593750 0.187500 +vt 0.562500 0.171875 +vt 0.578125 0.171875 +vt 0.578125 0.187500 +vt 0.562500 0.062500 +vt 0.578125 0.046875 +vt 0.593750 0.062500 +vt 0.562500 0.078125 +vt 0.531250 0.078125 +vt 0.546875 0.156250 +vt 0.562500 0.156250 +vt 0.562500 0.125000 +vt 0.562500 0.140625 +vt 0.546875 0.109375 +vt 0.500000 0.703125 +vt 0.500000 0.593750 +vt 0.500000 0.750000 +vt 0.500000 0.250000 +vt 0.468750 0.796875 +vt 0.421875 0.718750 +vt 0.437500 0.656250 +vt 0.468750 0.765625 +vt 0.140625 0.906250 +vt 0.218750 0.906250 +vt 0.140625 0.890625 +vt 0.218750 0.718750 +vt 0.000000 0.718750 +vt 0.000000 0.906250 +vt 0.031250 0.906250 +vt 0.078125 0.796875 +vt 0.078125 0.890625 +vt 0.046875 0.906250 +vt 0.062500 0.906250 +vt 0.906250 0.453125 +vt 0.468750 0.812500 +vt 0.468750 0.718750 +vt 0.500000 0.515625 +vt 0.500000 0.671875 +vt 0.500000 0.687500 +vt 0.687500 0.687500 +vt 0.437500 0.593750 +vt 0.484375 0.781250 +vt 0.437500 0.921875 +vt 0.437500 0.890625 +vt 0.484375 0.640625 +vt 0.437500 0.734375 +vt 0.015625 0.015625 +vt 0.250000 0.250000 +vt 0.437500 0.687500 +vt 0.453125 0.781250 +vt 0.218750 0.984375 +vt 0.453125 0.718750 +vt 0.765625 0.890625 +vt 0.750000 0.890625 +vt 0.750000 0.875000 +vt 0.734375 0.875000 +vt 0.734375 0.890625 +vt 0.718750 0.890625 +vt 0.718750 0.859375 +vt 0.750000 0.859375 +vt 0.750000 0.843750 +vt 0.781250 0.843750 +vt 0.781250 0.828125 +vt 0.843750 0.828125 +vt 0.843750 0.812500 +vt 0.859375 0.812500 +vt 0.843750 0.890625 +vt 0.843750 0.843750 +vt 0.750000 0.921875 +vt 0.750000 0.906250 +vt 0.765625 0.906250 +vt 0.843750 0.859375 +vt 0.859375 0.843750 +vt 0.765625 0.937500 +vt 0.734375 0.937500 +vt 0.734375 0.921875 +vt 0.765625 0.953125 +vt 0.750000 0.953125 +vt 0.750000 0.937500 +vt 0.875000 0.859375 +vt 0.859375 0.875000 +vt 0.875000 0.875000 +vt 0.781250 0.937500 +vt 0.796875 0.937500 +vt 0.859375 0.890625 +vt 0.843750 0.906250 +vt 0.859375 0.906250 +vt 0.796875 0.953125 +vt 0.781250 0.953125 +vt 0.843750 0.953125 +vt 0.812500 0.953125 +vt 0.812500 0.937500 +vt 0.875000 0.921875 +vt 0.453125 0.796875 +vt 0.453125 0.750000 +vt 0.484375 0.750000 +vt 0.484375 0.765625 +vt 0.453125 0.812500 +vt 0.437500 0.687500 +vt 0.437500 0.656250 +vt 0.000000 0.250000 +vt 0.000000 0.296875 +vt 0.015625 0.265625 +vt 0.015625 0.296875 +vt 0.015625 0.406250 +vt 0.000000 0.406250 +vt 0.015625 0.484375 +vt 0.000000 0.500000 +vt 0.234375 0.265625 +vt 0.500000 0.687500 +vt 0.500000 0.562500 +vt 0.406250 0.671875 +vt 0.218750 0.921875 +vt 0.484375 0.718750 +vt 0.500000 0.796875 +vt 0.437500 0.968750 +vt 0.687500 0.968750 +vt 0.468750 0.656250 +vt 0.500000 0.781250 +vt 0.437500 0.703125 +vt 0.468750 0.750000 +vt 0.484375 0.812500 +vt 0.468750 0.781250 +vt 0.500000 0.640625 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +usemtl bag.vox_Material +s off +f 129/1/1 64/2/1 65/3/1 +f 32/4/2 124/5/2 125/6/2 +f 117/7/3 115/8/3 127/9/3 +f 176/10/4 178/11/4 177/12/4 +f 115/13/2 88/14/2 9/15/2 +f 98/16/1 20/17/1 97/18/1 +f 41/19/4 98/20/4 147/21/4 +f 178/22/5 63/23/5 40/24/5 +f 32/25/5 39/26/5 131/27/5 +f 131/28/1 143/29/1 32/30/1 +f 158/31/3 78/32/3 103/33/3 +f 54/34/5 167/35/5 106/36/5 +f 121/37/2 119/38/2 120/39/2 +f 7/40/6 58/41/6 113/42/6 +f 84/43/4 2/44/4 35/45/4 +f 116/46/6 57/47/6 3/48/6 +f 27/49/5 152/50/5 100/51/5 +f 65/52/5 62/53/5 129/54/5 +f 111/55/5 83/56/5 56/57/5 +f 20/58/5 41/59/5 67/60/5 +f 155/61/1 28/62/1 26/63/1 +f 94/64/3 143/65/3 130/66/3 +f 18/67/3 69/68/3 17/69/3 +f 131/70/4 121/37/4 65/71/4 +f 83/72/4 110/73/4 170/74/4 +f 80/75/5 162/76/5 77/77/5 +f 140/78/5 51/79/5 50/80/5 +f 152/81/1 25/82/1 100/83/1 +f 122/84/2 123/85/2 38/86/2 +f 56/87/6 170/88/6 107/89/6 +f 34/90/2 112/91/2 1/92/2 +f 103/33/5 155/93/5 26/94/5 +f 171/95/1 107/89/1 81/96/1 +f 65/3/6 124/97/6 64/2/6 +f 121/98/6 128/99/6 62/100/6 +f 10/101/2 87/102/2 89/103/2 +f 177/104/3 13/105/3 66/106/3 +f 15/107/4 66/108/4 145/109/4 +f 166/110/3 56/57/3 139/111/3 +f 77/112/6 160/113/6 76/114/6 +f 96/115/1 178/116/1 40/117/1 +f 21/118/3 70/119/3 20/58/3 +f 79/120/3 104/121/3 29/122/3 +f 143/65/5 146/123/5 122/124/5 +f 69/125/6 21/126/6 20/17/6 +f 101/127/4 73/128/4 14/129/4 +f 91/130/4 95/131/4 129/132/4 +f 88/133/1 5/134/1 9/135/1 +f 92/136/5 37/137/5 93/138/5 +f 165/139/3 81/140/3 138/141/3 +f 124/142/5 120/143/5 64/144/5 +f 2/145/3 39/26/3 131/27/3 +f 94/64/5 35/146/5 130/66/5 +f 14/147/1 146/148/1 15/149/1 +f 4/150/2 3/151/2 57/152/2 +f 139/153/4 107/154/4 52/155/4 +f 64/144/3 128/156/3 120/143/3 +f 75/157/6 158/158/6 103/159/6 +f 105/160/1 138/161/1 137/162/1 +f 55/163/1 56/87/1 83/164/1 +f 134/165/4 29/166/4 24/167/4 +f 117/168/1 10/169/1 89/170/1 +f 142/171/5 105/172/5 137/173/5 +f 46/174/5 99/175/5 45/176/5 +f 78/177/6 79/178/6 29/179/6 +f 13/180/2 96/181/2 64/182/2 +f 143/29/6 176/183/6 175/184/6 +f 101/185/5 74/186/5 73/187/5 +f 30/188/3 141/189/3 136/190/3 +f 170/191/3 144/192/3 107/193/3 +f 125/194/3 121/195/3 123/196/3 +f 67/197/6 147/198/6 16/199/6 +f 113/200/3 86/201/3 3/202/3 +f 36/203/1 1/204/1 11/205/1 +f 156/206/1 101/207/1 133/208/1 +f 153/209/3 26/94/3 25/210/3 +f 102/211/1 135/212/1 49/213/1 +f 14/147/6 94/214/6 39/215/6 +f 31/216/1 142/217/1 141/218/1 +f 107/193/5 53/219/5 52/220/5 +f 110/221/1 111/222/1 144/223/1 +f 70/224/6 148/225/6 132/226/6 +f 84/227/1 39/215/1 126/228/1 +f 59/229/6 33/230/6 114/231/6 +f 61/232/6 60/233/6 37/234/6 +f 87/235/1 85/236/1 4/237/1 +f 138/238/4 142/239/4 137/240/4 +f 119/241/6 63/242/6 145/243/6 +f 82/244/3 108/245/3 142/171/3 +f 148/246/3 22/247/3 132/248/3 +f 2/249/6 130/250/6 35/251/6 +f 62/252/4 127/253/4 61/254/4 +f 22/255/6 72/256/6 71/257/6 +f 159/258/1 103/159/1 134/259/1 +f 94/260/4 64/182/4 120/39/4 +f 5/261/2 113/262/2 58/263/2 +f 120/264/1 123/265/1 121/98/1 +f 99/266/1 43/267/1 45/268/1 +f 168/269/4 169/270/4 167/271/4 +f 154/272/3 75/273/3 28/274/3 +f 164/275/1 136/276/1 104/277/1 +f 173/278/1 109/279/1 108/280/1 +f 26/63/6 48/281/6 27/282/6 +f 147/283/3 97/284/3 16/285/3 +f 81/96/6 82/286/6 142/217/6 +f 155/287/4 159/288/4 48/289/4 +f 140/290/1 167/291/1 169/292/1 +f 24/293/3 72/294/3 23/295/3 +f 93/296/2 37/297/2 36/298/2 +f 48/299/3 134/300/3 27/49/3 +f 135/301/5 156/302/5 133/303/5 +f 44/304/5 68/305/5 43/306/5 +f 36/307/5 33/308/5 34/309/5 +f 53/310/1 139/311/1 52/312/1 +f 28/313/4 103/314/4 26/315/4 +f 118/316/1 91/317/1 93/318/1 +f 109/319/5 171/320/5 81/140/5 +f 32/25/3 15/321/3 176/322/3 +f 76/323/5 102/324/5 49/325/5 +f 73/326/6 151/327/6 46/328/6 +f 171/329/4 173/330/4 82/331/4 +f 50/332/6 168/333/6 80/334/6 +f 25/335/4 27/336/4 100/337/4 +f 68/338/6 18/339/6 17/340/6 +f 23/341/1 27/282/1 24/342/1 +f 131/70/2 94/260/2 130/343/2 +f 129/1/1 95/344/1 64/2/1 +f 143/345/2 122/84/2 124/5/2 +f 125/6/2 123/85/2 32/4/2 +f 32/4/2 143/345/2 124/5/2 +f 127/9/3 12/346/3 117/7/3 +f 12/346/3 118/347/3 117/7/3 +f 117/7/3 89/348/3 87/349/3 +f 8/350/3 60/351/3 127/9/3 +f 5/352/3 58/353/3 8/350/3 +f 9/354/3 5/352/3 8/350/3 +f 87/349/3 4/355/3 57/356/3 +f 115/8/3 9/354/3 127/9/3 +f 9/354/3 8/350/3 127/9/3 +f 87/349/3 57/356/3 115/8/3 +f 117/7/3 87/349/3 115/8/3 +f 176/10/4 15/107/4 145/109/4 +f 177/12/4 66/108/4 146/357/4 +f 177/12/4 146/357/4 175/358/4 +f 176/10/4 145/109/4 178/11/4 +f 177/12/4 175/358/4 176/10/4 +f 115/13/2 116/359/2 88/14/2 +f 98/16/1 21/126/1 20/17/1 +f 41/19/4 21/360/4 98/20/4 +f 178/22/5 145/361/5 63/23/5 +f 32/25/5 14/362/5 39/26/5 +f 131/28/1 130/250/1 143/29/1 +f 158/31/3 163/363/3 78/32/3 +f 54/34/5 55/364/5 167/35/5 +f 121/37/2 63/365/2 119/38/2 +f 7/40/6 8/366/6 58/41/6 +f 84/43/4 126/367/4 2/44/4 +f 116/46/6 115/368/6 57/47/6 +f 27/49/5 48/299/5 152/50/5 +f 65/52/5 121/195/5 62/53/5 +f 111/55/5 174/369/5 83/56/5 +f 20/58/5 21/118/5 41/59/5 +f 155/61/1 154/370/1 28/62/1 +f 94/64/3 122/124/3 143/65/3 +f 18/67/3 19/371/3 69/68/3 +f 64/182/4 130/343/4 131/70/4 +f 39/372/4 120/39/4 121/37/4 +f 65/71/4 64/182/4 131/70/4 +f 131/70/4 39/372/4 121/37/4 +f 83/72/4 174/373/4 110/73/4 +f 80/75/5 168/374/5 162/76/5 +f 140/78/5 169/375/5 51/79/5 +f 152/81/1 153/376/1 25/82/1 +f 14/129/2 32/4/2 123/85/2 +f 38/86/2 124/5/2 122/84/2 +f 122/84/2 14/129/2 123/85/2 +f 56/87/6 83/164/6 170/88/6 +f 34/90/2 33/377/2 112/91/2 +f 103/33/5 158/31/5 155/93/5 +f 171/95/1 170/88/1 107/89/1 +f 65/3/6 125/378/6 124/97/6 +f 121/98/6 120/264/6 128/99/6 +f 10/101/2 6/379/2 87/102/2 +f 177/104/3 96/380/3 13/105/3 +f 15/107/4 146/357/4 66/108/4 +f 166/110/3 83/56/3 56/57/3 +f 77/112/6 162/381/6 160/113/6 +f 96/115/1 177/382/1 178/116/1 +f 21/118/3 149/383/3 70/119/3 +f 79/120/3 164/384/3 104/121/3 +f 143/65/5 175/385/5 146/123/5 +f 69/125/6 19/386/6 21/126/6 +f 76/387/4 49/388/4 135/389/4 +f 135/389/4 133/390/4 101/127/4 +f 73/128/4 46/391/4 43/392/4 +f 46/391/4 45/393/4 43/392/4 +f 73/128/4 43/392/4 14/129/4 +f 43/392/4 68/394/4 14/129/4 +f 17/395/4 69/396/4 20/397/4 +f 20/397/4 67/398/4 17/395/4 +f 67/398/4 14/129/4 17/395/4 +f 14/129/4 32/4/4 101/127/4 +f 32/4/4 50/399/4 101/127/4 +f 50/399/4 80/400/4 77/401/4 +f 77/401/4 76/387/4 135/389/4 +f 77/401/4 135/389/4 101/127/4 +f 68/394/4 17/395/4 14/129/4 +f 50/399/4 77/401/4 101/127/4 +f 91/130/4 12/402/4 95/131/4 +f 88/133/1 86/403/1 5/134/1 +f 92/136/5 61/404/5 37/137/5 +f 165/139/3 171/320/3 81/140/3 +f 124/142/5 38/405/5 120/143/5 +f 2/145/3 126/406/3 39/26/3 +f 94/64/5 84/407/5 35/146/5 +f 14/147/1 122/408/1 146/148/1 +f 4/150/2 85/409/2 3/151/2 +f 139/153/4 56/410/4 107/154/4 +f 64/144/3 95/411/3 128/156/3 +f 75/157/6 161/412/6 158/158/6 +f 105/160/1 165/413/1 138/161/1 +f 55/163/1 54/414/1 56/87/1 +f 122/84/4 14/129/4 67/398/4 +f 122/84/4 67/398/4 16/415/4 +f 140/416/4 50/399/4 32/4/4 +f 54/417/4 106/418/4 140/416/4 +f 111/419/4 56/420/4 54/417/4 +f 81/421/4 107/422/4 144/423/4 +f 109/424/4 81/421/4 144/423/4 +f 141/425/4 142/426/4 108/427/4 +f 109/424/4 144/423/4 143/345/4 +f 144/423/4 111/419/4 32/4/4 +f 143/345/4 144/423/4 32/4/4 +f 108/427/4 109/424/4 143/345/4 +f 54/417/4 140/416/4 32/4/4 +f 111/419/4 54/417/4 32/4/4 +f 122/84/4 16/415/4 132/428/4 +f 16/415/4 97/429/4 132/428/4 +f 97/429/4 20/397/4 70/430/4 +f 132/428/4 22/431/4 71/432/4 +f 97/429/4 70/430/4 132/428/4 +f 122/84/4 132/428/4 71/432/4 +f 141/425/4 108/427/4 143/345/4 +f 104/433/4 136/434/4 141/425/4 +f 103/435/4 78/436/4 29/166/4 +f 104/433/4 141/425/4 143/345/4 +f 134/165/4 103/435/4 29/166/4 +f 29/166/4 104/433/4 24/167/4 +f 104/433/4 143/345/4 24/167/4 +f 143/345/4 122/84/4 24/167/4 +f 122/84/4 71/432/4 24/167/4 +f 24/167/4 27/437/4 134/165/4 +f 117/168/1 90/438/1 10/169/1 +f 142/171/5 82/244/5 105/172/5 +f 46/174/5 151/439/5 99/175/5 +f 78/177/6 163/440/6 79/178/6 +f 40/441/2 63/365/2 121/37/2 +f 40/441/2 121/37/2 65/71/2 +f 120/39/2 119/38/2 13/180/2 +f 40/441/2 65/71/2 64/182/2 +f 64/182/2 120/39/2 13/180/2 +f 96/181/2 40/441/2 64/182/2 +f 143/29/6 32/30/6 176/183/6 +f 101/185/5 47/442/5 74/186/5 +f 30/188/3 31/443/3 141/189/3 +f 170/191/3 110/444/3 144/192/3 +f 125/194/3 65/52/3 121/195/3 +f 67/197/6 41/445/6 147/198/6 +f 90/446/3 11/447/3 10/448/3 +f 11/447/3 1/449/3 10/448/3 +f 112/450/3 59/451/3 113/200/3 +f 59/451/3 7/452/3 113/200/3 +f 85/453/3 6/454/3 10/448/3 +f 88/455/3 116/456/3 86/201/3 +f 116/456/3 3/202/3 86/201/3 +f 85/453/3 10/448/3 1/449/3 +f 3/202/3 85/453/3 112/450/3 +f 85/453/3 1/449/3 112/450/3 +f 112/450/3 113/200/3 3/202/3 +f 36/203/1 34/457/1 1/204/1 +f 156/206/1 47/458/1 101/207/1 +f 153/209/3 155/93/3 26/94/3 +f 102/211/1 157/459/1 135/212/1 +f 14/147/6 122/408/6 94/214/6 +f 31/216/1 82/286/1 142/217/1 +f 107/193/5 170/191/5 53/219/5 +f 110/221/1 174/460/1 111/222/1 +f 70/224/6 149/461/6 148/225/6 +f 84/227/1 94/214/1 39/215/1 +f 59/229/6 112/462/6 33/230/6 +f 61/232/6 127/463/6 60/233/6 +f 87/235/1 6/464/1 85/236/1 +f 138/238/4 81/465/4 142/239/4 +f 145/243/6 66/466/6 119/241/6 +f 66/466/6 13/467/6 119/241/6 +f 82/244/3 173/468/3 108/245/3 +f 148/246/3 150/469/3 22/247/3 +f 2/249/6 131/28/6 130/250/6 +f 128/470/4 95/131/4 12/402/4 +f 92/471/4 91/130/4 129/132/4 +f 92/471/4 129/132/4 62/252/4 +f 128/470/4 12/402/4 127/253/4 +f 61/254/4 92/471/4 62/252/4 +f 62/252/4 128/470/4 127/253/4 +f 22/255/6 150/472/6 72/256/6 +f 159/258/1 158/158/1 103/159/1 +f 94/260/4 130/343/4 64/182/4 +f 120/39/4 39/372/4 94/260/4 +f 5/261/2 86/473/2 113/262/2 +f 120/264/1 38/474/1 123/265/1 +f 99/266/1 44/475/1 43/267/1 +f 154/476/4 155/477/4 153/478/4 +f 152/479/4 48/480/4 23/481/4 +f 152/479/4 23/481/4 72/482/4 +f 150/483/4 148/484/4 149/485/4 +f 152/479/4 72/482/4 150/483/4 +f 153/478/4 152/479/4 150/483/4 +f 149/485/4 21/486/4 19/487/4 +f 153/478/4 150/483/4 149/485/4 +f 154/476/4 153/478/4 149/485/4 +f 19/487/4 18/488/4 42/489/4 +f 154/476/4 149/485/4 102/490/4 +f 149/485/4 19/487/4 99/491/4 +f 163/492/4 158/493/4 161/494/4 +f 161/494/4 154/476/4 102/490/4 +f 149/485/4 99/491/4 151/495/4 +f 19/487/4 42/489/4 44/496/4 +f 19/487/4 44/496/4 99/491/4 +f 163/492/4 161/494/4 105/497/4 +f 149/485/4 151/495/4 102/490/4 +f 164/498/4 79/499/4 163/492/4 +f 82/500/4 31/501/4 30/502/4 +f 30/502/4 164/498/4 163/492/4 +f 151/495/4 74/503/4 156/504/4 +f 74/503/4 47/505/4 156/504/4 +f 165/506/4 161/494/4 53/507/4 +f 82/500/4 30/502/4 105/497/4 +f 30/502/4 163/492/4 105/497/4 +f 156/504/4 157/508/4 102/490/4 +f 160/509/4 162/510/4 168/269/4 +f 151/495/4 156/504/4 102/490/4 +f 102/490/4 160/509/4 161/494/4 +f 161/494/4 160/509/4 53/507/4 +f 161/494/4 165/506/4 105/497/4 +f 170/511/4 171/512/4 165/506/4 +f 53/507/4 170/511/4 165/506/4 +f 55/513/4 83/514/4 166/515/4 +f 167/271/4 55/513/4 166/515/4 +f 166/515/4 53/507/4 160/509/4 +f 168/269/4 51/516/4 169/270/4 +f 166/515/4 160/509/4 167/271/4 +f 160/509/4 168/269/4 167/271/4 +f 154/272/3 161/517/3 75/273/3 +f 164/275/1 30/518/1 136/276/1 +f 173/278/1 172/519/1 109/279/1 +f 26/63/6 155/61/6 48/281/6 +f 147/283/3 98/520/3 97/284/3 +f 81/96/6 171/95/6 82/286/6 +f 155/287/4 158/521/4 159/288/4 +f 140/290/1 106/522/1 167/291/1 +f 24/293/3 71/523/3 72/294/3 +f 60/524/2 8/525/2 59/526/2 +f 8/525/2 7/527/2 59/526/2 +f 90/528/2 117/529/2 11/530/2 +f 117/529/2 118/531/2 11/530/2 +f 37/297/2 60/524/2 59/526/2 +f 37/297/2 59/526/2 114/532/2 +f 11/530/2 118/531/2 93/296/2 +f 37/297/2 114/532/2 36/298/2 +f 36/298/2 11/530/2 93/296/2 +f 48/299/3 159/533/3 134/300/3 +f 135/301/5 157/534/5 156/302/5 +f 44/304/5 42/535/5 68/305/5 +f 36/307/5 114/536/5 33/308/5 +f 53/310/1 166/537/1 139/311/1 +f 28/313/4 75/538/4 103/314/4 +f 12/539/1 91/317/1 118/316/1 +f 91/317/1 92/540/1 93/318/1 +f 109/319/5 172/541/5 171/320/5 +f 32/25/3 14/362/3 15/321/3 +f 76/323/5 160/542/5 102/324/5 +f 73/326/6 74/543/6 151/327/6 +f 171/329/4 172/544/4 173/330/4 +f 50/332/6 51/545/6 168/333/6 +f 25/335/4 26/546/4 27/336/4 +f 68/338/6 42/547/6 18/339/6 +f 23/341/1 48/281/1 27/282/1 +f 131/70/2 39/372/2 94/260/2 diff --git a/mods/x_farming/models/x_farming_baked_fish.obj b/mods/x_farming/models/x_farming_baked_fish.obj new file mode 100644 index 00000000..f1b625e2 --- /dev/null +++ b/mods/x_farming/models/x_farming_baked_fish.obj @@ -0,0 +1,822 @@ +# Blender v2.83.20 OBJ File: 'x_farming_baked_fish.blend' +# www.blender.org +mtllib x_farming_baked_fish.mtl +o wood_with_skeleton_x_farming_baked_fish +v 0.455000 -0.370000 0.455000 +v 0.455000 -0.370000 -0.455000 +v -0.455000 -0.370000 0.455000 +v -0.455000 -0.370000 -0.455000 +v 0.455000 -0.500000 0.455000 +v 0.455000 -0.500000 -0.455000 +v -0.455000 -0.500000 0.455000 +v -0.455000 -0.500000 -0.455000 +v -0.192156 -0.135307 0.128485 +v 0.455000 -0.234628 -0.065000 +v 0.325000 -0.234628 -0.130000 +v 0.325000 -0.234628 0.130000 +v 0.520000 -0.234628 -0.065000 +v 0.455000 -0.234628 -0.130000 +v 0.520000 -0.234628 0.130000 +v -0.192156 -0.135307 -0.195000 +v -0.195000 -0.299804 -0.130000 +v -0.195000 -0.234804 -0.130000 +v -0.195000 -0.234804 0.130000 +v -0.195000 -0.299804 0.130000 +v 0.260781 -0.135307 0.128485 +v 0.195781 -0.135307 0.128485 +v 0.130781 -0.135307 0.128485 +v 0.065781 -0.135307 0.128485 +v 0.000781 -0.135307 0.128485 +v -0.064219 -0.135307 0.128485 +v -0.129219 -0.135307 0.128485 +v -0.129219 -0.135307 -0.195000 +v -0.064219 -0.135307 -0.195000 +v 0.000781 -0.135307 -0.195000 +v 0.065781 -0.135307 -0.195000 +v 0.130781 -0.135307 -0.195000 +v 0.195781 -0.135307 -0.195000 +v 0.260781 -0.135307 -0.195000 +v -0.192156 -0.366443 0.128485 +v -0.192156 -0.366443 -0.195000 +v 0.260781 -0.366443 0.128485 +v 0.195781 -0.366443 0.128485 +v 0.130781 -0.366443 0.128485 +v 0.065781 -0.366443 0.128485 +v 0.000781 -0.366443 0.128485 +v -0.064219 -0.366443 0.128485 +v -0.129219 -0.366443 0.128485 +v -0.129219 -0.366443 -0.195000 +v -0.064219 -0.366443 -0.195000 +v 0.000781 -0.366443 -0.195000 +v 0.065781 -0.366443 -0.195000 +v 0.130781 -0.366443 -0.195000 +v 0.195781 -0.366443 -0.195000 +v 0.260781 -0.366443 -0.195000 +v 0.325000 -0.265845 0.130000 +v 0.325000 -0.200845 0.130000 +v 0.325000 -0.200845 -0.130000 +v 0.325000 -0.265845 -0.130000 +v -0.260000 -0.267304 -0.130000 +v -0.195000 -0.267304 -0.130000 +v -0.195000 -0.267304 0.130000 +v -0.260000 -0.267304 0.130000 +v -0.260000 -0.267304 0.065000 +v -0.325000 -0.267304 0.130000 +v -0.390000 -0.267304 0.195000 +v -0.520000 -0.267304 0.195000 +v -0.455000 -0.267304 -0.130000 +v -0.325000 -0.267304 -0.130000 +v -0.520000 -0.267304 0.130000 +v -0.390000 -0.267304 -0.195000 +v -0.520000 -0.267304 -0.195000 +v -0.260000 -0.267304 -0.065000 +v -0.325000 -0.267304 -0.065000 +v -0.325000 -0.267304 0.065000 +v -0.390000 -0.267304 -0.130000 +v -0.390000 -0.267304 0.130000 +v -0.455000 -0.267304 0.130000 +v -0.520000 -0.267304 -0.130000 +v -0.192156 -0.193091 0.128485 +v -0.192156 -0.308659 0.128485 +v 0.325000 -0.308659 0.128485 +v 0.325000 -0.193091 0.128485 +v -0.129219 -0.308659 0.128485 +v -0.129219 -0.193091 0.128485 +v -0.064219 -0.308659 0.128485 +v -0.064219 -0.193091 0.128485 +v 0.000781 -0.308659 0.128485 +v 0.000781 -0.193091 0.128485 +v 0.065781 -0.308659 0.128485 +v 0.065781 -0.193091 0.128485 +v 0.130781 -0.308659 0.128485 +v 0.130781 -0.193091 0.128485 +v 0.195781 -0.308659 0.128485 +v 0.195781 -0.193091 0.128485 +v 0.260781 -0.308659 0.128485 +v 0.260781 -0.193091 0.128485 +v 0.325000 -0.370000 0.130000 +v 0.520000 -0.240000 0.130000 +v -0.195000 -0.305000 0.130000 +v -0.260000 -0.305000 0.130000 +v -0.260000 -0.240000 0.065000 +v -0.325000 -0.305000 0.130000 +v -0.325000 -0.240000 0.130000 +v -0.390000 -0.305000 0.130000 +v -0.390000 -0.240000 0.195000 +v -0.520000 -0.240000 0.195000 +v -0.520000 -0.305000 0.195000 +v -0.455000 -0.305000 -0.130000 +v -0.455000 -0.240000 -0.130000 +v 0.520000 -0.175000 0.130000 +v 0.260000 -0.240000 0.130000 +v 0.260000 -0.240000 0.195000 +v -0.130000 -0.240000 0.260000 +v -0.065000 -0.240000 0.130000 +v 0.026125 -0.012500 0.065000 +v 0.260000 -0.305000 -0.195000 +v 0.455000 -0.305000 -0.130000 +v 0.260000 -0.305000 -0.260000 +v -0.130000 -0.240000 -0.260000 +v -0.195000 -0.305000 -0.260000 +v -0.325000 -0.240000 -0.130000 +v -0.520000 -0.240000 0.130000 +v -0.520000 -0.305000 -0.195000 +v -0.000000 -0.240000 -0.325000 +v -0.065000 -0.240000 -0.325000 +v -0.130000 -0.240000 0.195000 +v -0.130000 -0.240000 -0.390000 +v -0.260000 -0.175000 -0.195000 +v 0.325000 -0.370000 -0.195000 +v 0.325000 -0.305000 -0.130000 +v 0.520000 -0.305000 0.130000 +v 0.520000 -0.305000 -0.065000 +v 0.455000 -0.305000 -0.065000 +v -0.325000 -0.305000 -0.130000 +v -0.390000 -0.305000 0.195000 +v -0.390000 -0.305000 -0.130000 +v -0.390000 -0.305000 -0.195000 +v -0.390000 -0.240000 -0.195000 +v 0.455000 -0.175000 -0.130000 +v 0.260000 -0.175000 -0.195000 +v 0.195000 -0.240000 0.260000 +v -0.065000 -0.240000 -0.390000 +v 0.325000 -0.175000 0.130000 +v 0.325000 -0.110000 0.130000 +v 0.325000 -0.175000 -0.130000 +v 0.325000 -0.110000 -0.195000 +v 0.082417 -0.045000 -0.065000 +v -0.195000 -0.370000 0.130000 +v -0.195000 -0.370000 -0.195000 +v -0.260000 -0.240000 0.130000 +v -0.260000 -0.305000 0.065000 +v -0.260000 -0.305000 -0.065000 +v -0.520000 -0.305000 0.130000 +v -0.520000 -0.240000 -0.195000 +v -0.195000 -0.175000 -0.260000 +v -0.260000 -0.175000 0.130000 +v -0.260000 -0.240000 -0.065000 +v -0.195000 -0.175000 0.130000 +v 0.325000 -0.305000 0.130000 +v -0.195000 -0.305000 -0.195000 +v -0.260000 -0.305000 -0.195000 +v -0.325000 -0.305000 0.065000 +v -0.325000 -0.305000 -0.065000 +v -0.455000 -0.305000 0.130000 +v -0.520000 -0.305000 -0.130000 +v 0.195000 -0.240000 0.195000 +v -0.065000 -0.240000 0.195000 +v -0.000000 -0.240000 -0.260000 +v -0.325000 -0.240000 -0.065000 +v -0.325000 -0.240000 0.065000 +v -0.390000 -0.240000 -0.130000 +v -0.390000 -0.240000 0.130000 +v -0.455000 -0.240000 0.130000 +v -0.520000 -0.240000 -0.130000 +v 0.520000 -0.175000 -0.065000 +v 0.455000 -0.175000 -0.065000 +v 0.260000 -0.175000 -0.260000 +v -0.195000 -0.175000 -0.195000 +v -0.195000 -0.110000 0.130000 +v -0.195000 -0.110000 -0.195000 +v 0.082417 -0.045000 -0.000000 +v 0.026125 -0.012500 -0.000000 +v 0.195000 -0.110000 0.065000 +v 0.195000 -0.110000 -0.065000 +v 0.323250 -0.370000 0.130000 +v 0.323250 -0.370000 -0.195000 +v -0.192156 -0.110000 -0.195000 +v -0.192156 -0.110000 0.130000 +v 0.323250 -0.110000 0.130000 +v -0.192156 -0.370000 -0.195000 +v 0.323250 -0.110000 -0.195000 +v -0.192156 -0.370000 0.130000 +v 0.065000 -0.110000 -0.195000 +v 0.065000 -0.110000 0.130000 +v 0.065000 -0.370000 -0.195000 +v 0.065000 -0.370000 0.130000 +v 0.065000 -0.175000 -0.195000 +v 0.065000 -0.305000 -0.195000 +v 0.065000 -0.175000 -0.260000 +v 0.065000 -0.305000 -0.260000 +vt 0.437500 -0.000000 +vt 0.500000 0.437500 +vt 0.500000 -0.000000 +vt -0.000000 1.000000 +vt 0.437500 0.937500 +vt 0.437500 1.000000 +vt 0.500000 0.875000 +vt 0.437500 0.437500 +vt 0.500000 0.437500 +vt -0.000000 0.437500 +vt 0.437500 0.437500 +vt -0.000000 0.437500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.937500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.812500 0.750000 +vt 0.875000 0.718750 +vt 0.875000 0.843750 +vt 0.937500 0.843750 +vt 0.906250 1.000000 +vt 0.906250 0.843750 +vt 0.656250 0.968750 +vt 0.687500 0.843750 +vt 0.656250 0.843750 +vt 0.968750 0.843750 +vt 0.937500 1.000000 +vt 0.937500 0.843750 +vt 0.906250 0.843750 +vt 0.875000 1.000000 +vt 0.875000 0.843750 +vt 0.812500 0.843750 +vt 0.781250 1.000000 +vt 0.781250 0.843750 +vt 0.875000 0.843750 +vt 0.843750 1.000000 +vt 0.843750 0.843750 +vt 0.781250 0.843750 +vt 0.750000 1.000000 +vt 0.750000 0.843750 +vt 0.750000 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.843750 +vt 0.843750 0.843750 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.656250 0.843750 +vt 0.625000 0.968750 +vt 0.625000 0.843750 +vt 0.718750 0.968750 +vt 0.687500 0.843750 +vt 0.718750 0.843750 +vt 0.593750 0.937500 +vt 0.562500 0.968750 +vt 0.531250 0.968750 +vt 0.562500 0.750000 +vt 0.562500 0.812500 +vt 0.593750 0.812500 +vt -0.000000 0.937500 +vt 0.437500 0.875000 +vt 0.000000 -0.000000 +vt 0.437500 0.437500 +vt 0.437500 0.937500 +vt 0.781250 0.843750 +vt 0.781250 0.750000 +vt 0.812500 0.718750 +vt 0.937500 1.000000 +vt 0.687500 0.968750 +vt 0.968750 1.000000 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.875000 1.000000 +vt 0.781250 1.000000 +vt 0.750000 1.000000 +vt 0.843750 1.000000 +vt 0.656250 0.968750 +vt 0.687500 0.968750 +vt 0.593750 0.875000 +vt 0.625000 0.875000 +vt 0.625000 0.937500 +vt 0.593750 0.968750 +vt 0.562500 0.843750 +vt 0.593750 0.843750 +vt 0.500000 0.812500 +vt 0.562500 0.812500 +vt 0.531250 0.843750 +vt 0.500000 0.843750 +vt 0.500000 1.000000 +vt 0.500000 0.968750 +vt 0.562500 1.000000 +vt 0.781250 0.843750 +vt 0.781250 0.812500 +vt 0.750000 0.843750 +vt 0.781250 0.750000 +vt 0.750000 0.812500 +vt 0.781250 0.718750 +vt 0.750000 0.718750 +vt 0.750000 0.750000 +vt 0.718750 0.750000 +vt 0.718750 0.812500 +vt 0.687500 0.843750 +vt 0.718750 0.843750 +vt 0.687500 0.812500 +vt 0.718750 0.718750 +vt 0.687500 0.718750 +vt 0.687500 0.750000 +vt 0.625000 0.843750 +vt 0.656250 0.843750 +vt 0.656250 0.812500 +vt 0.656250 0.750000 +vt 0.625000 0.812500 +vt 0.656250 0.718750 +vt 0.625000 0.718750 +vt 0.562500 0.843750 +vt 0.593750 0.843750 +vt 0.625000 0.750000 +vt 0.593750 0.750000 +vt 0.593750 0.718750 +vt 0.562500 0.718750 +vt 0.531250 0.750000 +vt 0.531250 0.812500 +vt 0.687500 0.156250 +vt 0.687500 0.125000 +vt 0.562500 0.093750 +vt 0.750000 0.781250 +vt 0.812500 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.875000 +vt 0.812500 0.843750 +vt 0.750000 0.843750 +vt 0.750000 0.968750 +vt 0.812500 0.937500 +vt 0.750000 0.937500 +vt 0.000000 1.000000 +vt 0.312500 0.968750 +vt 0.000000 0.968750 +vt 0.187500 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.218750 +vt 0.312500 0.906250 +vt 0.000000 0.937500 +vt 0.000000 0.906250 +vt 0.187500 0.906250 +vt 0.312500 0.906250 +vt 0.312500 0.875000 +vt 0.875000 0.843750 +vt 0.812500 0.875000 +vt 0.812500 0.843750 +vt 0.875000 0.812500 +vt 0.812500 0.843750 +vt 0.812500 0.812500 +vt 0.750000 0.937500 +vt 0.875000 0.906250 +vt 0.750000 0.906250 +vt 0.875000 0.937500 +vt 0.812500 0.968750 +vt 0.812500 0.937500 +vt 0.250000 0.187500 +vt 0.187500 0.250000 +vt 0.187500 0.187500 +vt 0.500000 0.343750 +vt 0.562500 0.343750 +vt 0.562500 0.468750 +vt 0.312500 0.156250 +vt 0.312500 0.281250 +vt 0.250000 0.187500 +vt 0.187500 0.312500 +vt 0.250000 0.375000 +vt 0.000000 0.375000 +vt 0.750000 0.656250 +vt 0.687500 0.718750 +vt 0.687500 0.656250 +vt 0.625000 0.968750 +vt 0.687500 0.750000 +vt 0.625000 0.750000 +vt 0.812500 0.812500 +vt 0.750000 0.843750 +vt 0.750000 0.812500 +vt 0.875000 0.750000 +vt 0.812500 0.781250 +vt 0.812500 0.750000 +vt 0.812500 0.781250 +vt 0.750000 0.812500 +vt 0.750000 0.781250 +vt 0.875000 0.781250 +vt 0.812500 0.812500 +vt 0.812500 0.781250 +vt 0.562500 0.218750 +vt 0.437500 0.281250 +vt 0.437500 0.218750 +vt 0.750000 0.750000 +vt 0.687500 0.968750 +vt 0.687500 0.750000 +vt 0.875000 0.562500 +vt 0.937500 0.593750 +vt 0.937500 0.625000 +vt 0.875000 0.875000 +vt 0.750000 0.906250 +vt 0.750000 0.875000 +vt 0.812500 0.750000 +vt 0.875000 0.718750 +vt 0.812500 0.718750 +vt 0.750000 0.750000 +vt 0.812500 0.718750 +vt 0.750000 0.718750 +vt 0.625000 0.187500 +vt 0.500000 0.187500 +vt 0.437500 0.218750 +vt 0.062500 0.468750 +vt 0.000000 0.500000 +vt 0.000000 0.375000 +vt 0.625000 0.718750 +vt 0.687500 0.656250 +vt 0.625000 0.656250 +vt 0.625000 1.000000 +vt 0.875000 0.968750 +vt 0.625000 0.968750 +vt 0.875000 0.656250 +vt 0.812500 0.718750 +vt 0.812500 0.656250 +vt 0.937500 0.500000 +vt 0.875000 0.468750 +vt 0.937500 0.531250 +vt 0.500000 0.375000 +vt 0.500000 0.312500 +vt 0.437500 0.312500 +vt 0.625000 0.250000 +vt 0.687500 0.281250 +vt 0.562500 0.281250 +vt 0.812500 0.656250 +vt 0.750000 0.718750 +vt 0.750000 0.656250 +vt 0.000000 0.750000 +vt 0.312500 0.500000 +vt 0.312500 0.750000 +vt 0.375000 0.218750 +vt 0.375000 0.250000 +vt 0.312500 0.250000 +vt 0.750000 0.093750 +vt 0.750000 0.062500 +vt 0.687500 0.062500 +vt 0.000000 0.968750 +vt 0.312500 0.937500 +vt 0.000000 0.937500 +vt 0.500000 0.406250 +vt 0.062500 0.468750 +vt 0.062500 0.406250 +vt 0.312500 0.875000 +vt 0.000000 0.750000 +vt 0.000000 0.875000 +vt 0.625000 1.000000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.625000 0.781250 +vt 0.625000 0.750000 +vt 0.312500 0.750000 +vt 0.312500 0.750000 +vt 0.375000 0.687500 +vt 0.312500 0.687500 +vt 0.250000 0.093750 +vt 0.000000 0.093750 +vt 0.187500 0.125000 +vt 0.000000 0.125000 +vt 0.187500 0.156250 +vt 0.750000 0.125000 +vt 0.812500 0.781250 +vt 0.812500 0.875000 +vt 0.812500 0.968750 +vt 0.312500 1.000000 +vt 0.000000 0.187500 +vt 0.187500 0.187500 +vt 0.312500 0.937500 +vt 0.000000 0.875000 +vt 0.000000 0.906250 +vt 0.062500 0.906250 +vt 0.875000 0.875000 +vt 0.875000 0.843750 +vt 0.875000 0.937500 +vt 0.875000 0.968750 +vt 0.250000 0.250000 +vt 0.562500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.468750 +vt 0.562500 0.500000 +vt 0.500000 0.500000 +vt 0.000000 0.281250 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.187500 +vt 0.000000 0.156250 +vt 0.000000 0.281250 +vt 0.187500 0.281250 +vt 0.250000 0.312500 +vt 0.750000 0.718750 +vt 0.687500 0.968750 +vt 0.812500 0.843750 +vt 0.875000 0.781250 +vt 0.812500 0.812500 +vt 0.875000 0.812500 +vt 0.562500 0.281250 +vt 0.750000 0.968750 +vt 0.750000 0.562500 +vt 0.750000 0.531250 +vt 0.875000 0.531250 +vt 0.937500 0.562500 +vt 0.687500 0.593750 +vt 0.687500 0.562500 +vt 0.625000 0.656250 +vt 0.625000 0.593750 +vt 0.687500 0.625000 +vt 0.687500 0.656250 +vt 1.000000 0.656250 +vt 0.937500 0.656250 +vt 1.000000 0.593750 +vt 0.875000 0.906250 +vt 0.875000 0.750000 +vt 0.812500 0.750000 +vt 0.437500 0.156250 +vt 0.437500 0.187500 +vt 0.500000 0.156250 +vt 0.750000 0.218750 +vt 0.750000 0.156250 +vt 0.625000 0.156250 +vt 0.500000 0.468750 +vt 0.500000 0.500000 +vt 0.500000 0.375000 +vt 0.062500 0.406250 +vt 0.500000 0.406250 +vt 0.687500 0.718750 +vt 0.875000 1.000000 +vt 0.875000 0.718750 +vt 0.875000 0.437500 +vt 0.750000 0.437500 +vt 0.750000 0.468750 +vt 0.687500 0.468750 +vt 0.687500 0.500000 +vt 0.625000 0.500000 +vt 0.687500 0.531250 +vt 0.625000 0.562500 +vt 0.687500 0.562500 +vt 0.937500 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.500000 +vt 0.937500 0.468750 +vt 0.437500 0.281250 +vt 0.250000 0.281250 +vt 0.250000 0.375000 +vt 0.562500 0.218750 +vt 0.625000 0.218750 +vt 0.687500 0.250000 +vt 0.812500 0.718750 +vt 0.000000 0.500000 +vt 0.312500 0.156250 +vt 0.437500 0.156250 +vt 0.437500 0.218750 +vt 0.687500 0.031250 +vt 0.187500 0.031250 +vt 0.187500 0.062500 +vt 0.000000 0.062500 +vt 0.312500 0.968750 +vt 0.500000 0.468750 +vt 0.312500 0.750000 +vt 0.625000 0.875000 +vt 0.312500 0.875000 +vt 0.625000 0.843750 +vt 0.625000 0.875000 +vt 0.375000 0.750000 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.5000 0.8660 -0.0000 +g wood_with_skeleton_x_farming_baked_fish_wood_with_skeleton +usemtl wood_with_skeleton +s off +f 7/1/1 1/2/1 3/3/1 +f 8/4/2 2/5/2 6/6/2 +f 4/7/3 7/8/3 3/9/3 +f 7/1/4 6/10/4 5/11/4 +f 4/12/5 1/13/5 2/14/5 +f 5/15/6 2/16/6 1/17/6 +f 10/18/5 11/19/5 12/20/5 +f 16/21/5 27/22/5 28/23/5 +f 20/24/3 18/25/3 17/26/3 +f 33/27/5 21/28/5 34/29/5 +f 31/30/5 23/31/5 32/32/5 +f 29/33/5 25/34/5 30/35/5 +f 36/36/5 43/37/5 44/38/5 +f 49/39/5 37/40/5 50/41/5 +f 47/42/5 39/43/5 48/44/5 +f 45/45/5 41/46/5 46/47/5 +f 53/48/6 51/49/6 54/50/6 +f 58/51/5 56/52/5 55/53/5 +f 69/54/5 71/55/5 63/56/5 +f 91/57/1 92/58/1 90/59/1 +f 7/1/1 5/11/1 1/2/1 +f 8/4/2 4/60/2 2/5/2 +f 4/7/3 8/61/3 7/8/3 +f 7/1/4 8/62/4 6/10/4 +f 4/12/5 3/63/5 1/13/5 +f 5/15/6 6/64/6 2/16/6 +f 12/20/5 15/65/5 10/18/5 +f 15/65/5 13/66/5 10/18/5 +f 10/18/5 14/67/5 11/19/5 +f 16/21/5 9/68/5 27/22/5 +f 20/24/3 19/69/3 18/25/3 +f 33/27/5 22/70/5 21/28/5 +f 31/30/5 24/71/5 23/31/5 +f 29/33/5 26/72/5 25/34/5 +f 36/36/5 35/73/5 43/37/5 +f 49/39/5 38/74/5 37/40/5 +f 47/42/5 40/75/5 39/43/5 +f 45/45/5 42/76/5 41/46/5 +f 53/48/6 52/77/6 51/49/6 +f 58/51/5 57/78/5 56/52/5 +f 70/79/5 59/80/5 68/81/5 +f 69/54/5 64/82/5 71/55/5 +f 70/79/5 68/81/5 69/54/5 +f 72/83/5 60/84/5 70/79/5 +f 62/85/5 61/86/5 73/87/5 +f 61/86/5 72/83/5 73/87/5 +f 73/87/5 65/88/5 62/85/5 +f 67/89/5 74/90/5 63/56/5 +f 66/91/5 67/89/5 63/56/5 +f 63/56/5 73/87/5 69/54/5 +f 73/87/5 72/83/5 70/79/5 +f 69/54/5 73/87/5 70/79/5 +f 71/55/5 66/91/5 63/56/5 +f 9/92/1 75/93/1 27/94/1 +f 75/93/1 76/95/1 80/96/1 +f 27/94/1 75/93/1 80/96/1 +f 76/95/1 35/97/1 43/98/1 +f 76/95/1 43/98/1 79/99/1 +f 76/95/1 79/99/1 80/96/1 +f 79/99/1 81/100/1 82/101/1 +f 82/101/1 80/96/1 79/99/1 +f 25/102/1 26/103/1 82/101/1 +f 84/104/1 25/102/1 82/101/1 +f 81/100/1 42/105/1 41/106/1 +f 81/100/1 41/106/1 83/107/1 +f 84/104/1 82/101/1 81/100/1 +f 23/108/1 24/109/1 86/110/1 +f 86/110/1 84/104/1 83/107/1 +f 84/104/1 81/100/1 83/107/1 +f 83/107/1 85/111/1 86/110/1 +f 86/110/1 85/111/1 88/112/1 +f 23/108/1 86/110/1 88/112/1 +f 85/111/1 40/113/1 39/114/1 +f 21/115/1 22/116/1 90/59/1 +f 90/59/1 88/112/1 87/117/1 +f 88/112/1 85/111/1 87/117/1 +f 85/111/1 39/114/1 87/117/1 +f 89/118/1 38/119/1 37/120/1 +f 89/118/1 37/120/1 91/57/1 +f 90/59/1 87/117/1 89/118/1 +f 92/58/1 21/115/1 90/59/1 +f 77/121/1 78/122/1 92/58/1 +f 90/59/1 89/118/1 91/57/1 +f 91/57/1 77/121/1 92/58/1 +g wood_with_skeleton_x_farming_baked_fish_fish +usemtl fish +f 175/123/1 154/124/1 110/125/1 +f 97/126/1 158/127/1 147/128/1 +f 99/129/1 100/130/1 98/131/1 +f 105/132/1 161/133/1 104/134/1 +f 95/135/3 145/136/3 144/137/3 +f 171/138/6 106/139/6 94/140/6 +f 174/141/5 152/142/5 154/143/5 +f 148/144/4 157/145/4 156/146/4 +f 159/147/2 153/148/2 148/149/2 +f 132/150/2 117/151/2 130/152/2 +f 101/153/1 103/154/1 131/155/1 +f 149/156/2 169/157/2 160/158/2 +f 113/159/6 172/160/6 129/161/6 +f 137/162/5 162/163/5 163/164/5 +f 125/165/6 142/166/6 126/167/6 +f 172/168/5 141/169/5 139/170/5 +f 129/171/2 171/172/2 128/173/2 +f 156/174/4 114/175/4 112/176/4 +f 158/177/6 99/178/6 98/179/6 +f 130/180/6 165/181/6 159/182/6 +f 100/183/6 101/184/6 131/185/6 +f 133/186/6 167/187/6 132/188/6 +f 126/189/2 135/190/2 113/191/2 +f 173/192/5 174/193/5 136/194/5 +f 165/195/5 167/196/5 105/197/5 +f 119/198/2 134/199/2 133/200/2 +f 102/201/3 149/202/3 103/203/3 +f 170/204/3 119/205/3 161/206/3 +f 153/207/3 97/208/3 152/209/3 +f 136/210/2 142/211/2 125/212/2 +f 174/213/3 116/214/3 156/215/3 +f 169/216/3 104/217/3 160/218/3 +f 114/219/6 136/220/6 112/221/6 +f 132/222/4 159/223/4 104/224/4 +f 126/225/4 113/226/4 129/227/4 +f 121/228/5 123/229/5 115/230/5 +f 157/231/2 174/232/2 156/233/2 +f 175/234/5 142/235/5 176/236/5 +f 177/237/7 178/238/7 111/239/7 +f 146/240/1 96/241/1 95/242/1 +f 175/243/3 174/244/3 154/245/3 +f 116/246/2 173/247/2 114/248/2 +f 187/249/3 181/250/3 185/251/3 +f 183/252/3 188/253/3 184/254/3 +f 194/255/3 191/256/3 192/257/3 +f 193/258/3 196/259/3 194/260/3 +f 107/261/1 94/262/1 139/263/1 +f 94/262/1 106/264/1 139/263/1 +f 139/263/1 140/265/1 107/261/1 +f 140/265/1 175/123/1 110/125/1 +f 152/266/1 146/240/1 154/124/1 +f 146/240/1 110/125/1 154/124/1 +f 110/125/1 107/261/1 140/265/1 +f 97/126/1 166/267/1 158/127/1 +f 99/129/1 168/268/1 100/130/1 +f 105/132/1 170/269/1 161/133/1 +f 95/135/3 156/270/3 145/136/3 +f 94/140/6 127/271/6 128/272/6 +f 128/272/6 171/138/6 94/140/6 +f 174/141/5 124/273/5 152/142/5 +f 156/146/4 95/274/4 148/144/4 +f 95/274/4 96/275/4 147/276/4 +f 147/276/4 148/144/4 95/274/4 +f 159/147/2 165/277/2 153/148/2 +f 132/150/2 167/278/2 117/151/2 +f 101/153/1 102/279/1 103/154/1 +f 149/156/2 118/280/2 169/157/2 +f 113/159/6 135/281/6 172/160/6 +f 162/163/5 108/282/5 107/283/5 +f 107/283/5 110/284/5 162/163/5 +f 110/284/5 163/164/5 162/163/5 +f 163/164/5 122/285/5 109/286/5 +f 109/286/5 137/162/5 163/164/5 +f 142/166/6 140/287/6 141/288/6 +f 140/287/6 139/289/6 141/288/6 +f 155/290/6 93/291/6 126/167/6 +f 93/291/6 125/165/6 126/167/6 +f 142/166/6 141/288/6 126/167/6 +f 139/170/5 106/292/5 172/168/5 +f 106/292/5 171/293/5 172/168/5 +f 172/168/5 135/294/5 141/169/5 +f 129/171/2 172/295/2 171/172/2 +f 156/174/4 116/296/4 114/175/4 +f 158/177/6 166/297/6 99/178/6 +f 130/180/6 117/298/6 165/181/6 +f 100/183/6 168/299/6 101/184/6 +f 133/186/6 134/300/6 167/187/6 +f 126/189/2 141/301/2 135/190/2 +f 173/192/5 151/302/5 174/193/5 +f 166/303/5 97/304/5 153/305/5 +f 165/195/5 117/306/5 167/196/5 +f 166/303/5 153/305/5 165/195/5 +f 168/307/5 99/308/5 166/303/5 +f 102/309/5 101/310/5 169/311/5 +f 101/310/5 168/307/5 169/311/5 +f 169/311/5 118/312/5 102/309/5 +f 150/313/5 170/314/5 105/197/5 +f 134/315/5 150/313/5 105/197/5 +f 105/197/5 169/311/5 165/195/5 +f 169/311/5 168/307/5 166/303/5 +f 165/195/5 169/311/5 166/303/5 +f 167/196/5 134/315/5 105/197/5 +f 119/198/2 150/316/2 134/199/2 +f 102/201/3 118/317/3 149/202/3 +f 170/204/3 150/318/3 119/205/3 +f 96/319/3 146/320/3 147/321/3 +f 146/320/3 152/209/3 97/208/3 +f 147/321/3 146/320/3 97/208/3 +f 124/322/3 157/323/3 153/207/3 +f 157/323/3 148/324/3 153/207/3 +f 124/322/3 153/207/3 152/209/3 +f 136/210/2 174/325/2 176/326/2 +f 125/212/2 145/327/2 112/328/2 +f 145/327/2 156/329/2 112/328/2 +f 136/210/2 176/326/2 142/211/2 +f 125/212/2 112/328/2 136/210/2 +f 174/213/3 151/330/3 116/214/3 +f 169/216/3 105/331/3 104/217/3 +f 114/219/6 173/332/6 136/220/6 +f 148/333/4 147/334/4 158/335/4 +f 158/335/4 98/336/4 100/337/4 +f 100/337/4 131/338/4 160/339/4 +f 131/338/4 103/340/4 160/339/4 +f 103/340/4 149/341/4 160/339/4 +f 104/224/4 161/342/4 119/343/4 +f 104/224/4 119/343/4 133/344/4 +f 100/337/4 160/339/4 158/335/4 +f 160/339/4 104/224/4 159/223/4 +f 148/333/4 158/335/4 159/223/4 +f 159/223/4 158/335/4 160/339/4 +f 132/222/4 130/345/4 159/223/4 +f 104/224/4 133/344/4 132/222/4 +f 128/346/4 127/347/4 129/227/4 +f 127/347/4 155/348/4 129/227/4 +f 155/348/4 126/225/4 129/227/4 +f 115/230/5 164/349/5 121/228/5 +f 164/349/5 120/350/5 121/228/5 +f 121/228/5 138/351/5 123/229/5 +f 157/231/2 124/352/2 174/232/2 +f 175/234/5 140/353/5 142/235/5 +f 111/239/7 179/354/7 177/237/7 +f 179/354/7 180/355/7 177/237/7 +f 180/355/7 143/356/7 177/237/7 +f 144/357/1 93/358/1 110/125/1 +f 93/358/1 155/359/1 107/261/1 +f 110/125/1 93/358/1 107/261/1 +f 155/359/1 127/360/1 94/262/1 +f 110/125/1 146/240/1 95/242/1 +f 155/359/1 94/262/1 107/261/1 +f 95/242/1 144/357/1 110/125/1 +f 175/243/3 176/361/3 174/244/3 +f 116/246/2 151/362/2 173/247/2 +f 187/249/3 182/363/3 181/250/3 +f 183/252/3 186/364/3 188/253/3 +f 192/257/3 190/365/3 193/366/3 +f 190/365/3 189/367/3 193/366/3 +f 193/366/3 194/255/3 192/257/3 +f 193/258/3 195/368/3 196/259/3 diff --git a/mods/x_farming/models/x_farming_bee.obj b/mods/x_farming/models/x_farming_bee.obj new file mode 100644 index 00000000..5f98e852 --- /dev/null +++ b/mods/x_farming/models/x_farming_bee.obj @@ -0,0 +1,238 @@ +# Blender v2.83.20 OBJ File: 'x_farming_bee.blend' +# www.blender.org +mtllib x_farming_bee.mtl +o torso_Mesh_0 +v 0.164062 0.164062 0.234375 +v 0.164062 -0.164062 0.234375 +v 0.164062 0.164062 -0.234375 +v 0.164062 -0.164062 0.234375 +v 0.164062 -0.164062 -0.234375 +v 0.164062 0.164062 -0.234375 +v -0.164062 0.164062 -0.234375 +v -0.164062 -0.164062 -0.234375 +v -0.164062 0.164062 0.234375 +v -0.164062 -0.164062 -0.234375 +v -0.164062 -0.164062 0.234375 +v -0.164062 0.164062 0.234375 +v -0.164062 0.164062 -0.234375 +v -0.164062 0.164062 0.234375 +v 0.164062 0.164062 -0.234375 +v -0.164062 0.164062 0.234375 +v 0.164062 0.164062 0.234375 +v 0.164062 0.164062 -0.234375 +v -0.164062 -0.164062 0.234375 +v -0.164062 -0.164062 -0.234375 +v 0.164062 -0.164062 0.234375 +v -0.164062 -0.164062 -0.234375 +v 0.164062 -0.164062 -0.234375 +v 0.164062 -0.164062 0.234375 +v -0.164062 0.164062 0.234375 +v -0.164062 -0.164062 0.234375 +v 0.164062 0.164062 0.234375 +v -0.164062 -0.164062 0.234375 +v 0.164062 -0.164062 0.234375 +v 0.164062 0.164062 0.234375 +v 0.164062 0.164062 -0.234375 +v 0.164062 -0.164062 -0.234375 +v -0.164062 0.164062 -0.234375 +v 0.164062 -0.164062 -0.234375 +v -0.164062 -0.164062 -0.234375 +v -0.164062 0.164062 -0.234375 +v 0.070312 0.164062 -0.375000 +v 0.070312 0.070312 -0.375000 +v 0.070312 0.164062 -0.234375 +v 0.070312 0.070312 -0.375000 +v 0.070312 0.070312 -0.234375 +v 0.070312 0.164062 -0.234375 +v 0.000000 0.023438 0.234375 +v 0.000000 -0.023438 0.234375 +v 0.000000 0.023438 0.328125 +v 0.000000 -0.023438 0.234375 +v 0.000000 -0.023438 0.328125 +v 0.000000 0.023438 0.328125 +v -0.070312 0.164062 -0.234375 +v -0.070312 0.070312 -0.234375 +v -0.070312 0.164062 -0.375000 +v -0.070312 0.070312 -0.234375 +v -0.070312 0.070312 -0.375000 +v -0.070312 0.164062 -0.375000 +v 0.117188 -0.164062 0.093750 +v 0.117188 -0.257812 0.093750 +v -0.117188 -0.164062 0.093750 +v 0.117188 -0.257812 0.093750 +v -0.117188 -0.257812 0.093750 +v -0.117188 -0.164062 0.093750 +v 0.117188 -0.164062 0.000000 +v 0.117188 -0.257812 0.000000 +v -0.117188 -0.164062 0.000000 +v 0.117188 -0.257812 0.000000 +v -0.117188 -0.257812 0.000000 +v -0.117188 -0.164062 0.000000 +v 0.070312 -0.164062 -0.093750 +v 0.070312 -0.257812 -0.093750 +v -0.070312 -0.164062 -0.093750 +v 0.070312 -0.257812 -0.093750 +v -0.070312 -0.257812 -0.093750 +v -0.070312 -0.164062 -0.093750 +v 0.070312 0.164109 -0.140625 +v 0.070312 0.164109 0.140625 +v 0.466745 0.308399 -0.140625 +v -0.466745 0.308399 -0.140625 +v -0.466745 0.308399 0.140625 +v -0.070312 0.164109 -0.140625 +v -0.466745 0.308399 0.140625 +v -0.070312 0.164109 0.140625 +v -0.070312 0.164109 -0.140625 +v 0.070312 0.164109 0.140625 +v 0.466745 0.308399 0.140625 +v 0.466745 0.308399 -0.140625 +v 0.070312 0.164109 -0.140625 +v 0.070312 0.164109 0.140625 +v 0.466745 0.019820 -0.140625 +v 0.070312 0.164109 0.140625 +v 0.466745 0.019820 0.140625 +v 0.466745 0.019820 -0.140625 +v -0.466745 0.019820 -0.140625 +v -0.466745 0.019820 0.140625 +v -0.070312 0.164109 -0.140625 +v -0.466745 0.019820 0.140625 +v -0.070312 0.164109 0.140625 +v -0.070312 0.164109 -0.140625 +vt -0.000000 0.666667 +vt -0.000000 0.433333 +vt 0.294118 0.666667 +vt -0.000000 0.433333 +vt 0.294118 0.433333 +vt 0.294118 0.666667 +vt 0.500000 0.666667 +vt 0.500000 0.433333 +vt 0.794118 0.666667 +vt 0.500000 0.433333 +vt 0.794118 0.433333 +vt 0.794118 0.666667 +vt 0.500000 0.666667 +vt 0.500000 1.000000 +vt 0.294118 0.666667 +vt 0.500000 1.000000 +vt 0.294118 1.000000 +vt 0.294118 0.666667 +vt 0.705882 1.000000 +vt 0.705882 0.666667 +vt 0.500000 1.000000 +vt 0.705882 0.666667 +vt 0.500000 0.666667 +vt 0.500000 1.000000 +vt 0.794118 0.666667 +vt 0.794118 0.433333 +vt 1.000000 0.666667 +vt 0.794118 0.433333 +vt 1.000000 0.433333 +vt 1.000000 0.666667 +vt 0.294118 0.666667 +vt 0.294118 0.433333 +vt 0.500000 0.666667 +vt 0.294118 0.433333 +vt 0.500000 0.433333 +vt 0.500000 0.666667 +vt 0.176471 0.800000 +vt 0.176471 0.733333 +vt 0.264706 0.800000 +vt 0.176471 0.733333 +vt 0.264706 0.733333 +vt 0.264706 0.800000 +vt 0.764706 0.666667 +vt 0.764706 0.700000 +vt 0.823529 0.666667 +vt 0.764706 0.700000 +vt 0.823529 0.700000 +vt 0.823529 0.666667 +vt 0.058824 0.900000 +vt 0.058824 0.833333 +vt 0.147059 0.900000 +vt 0.058824 0.833333 +vt 0.147059 0.833333 +vt 0.147059 0.900000 +vt 0.794118 0.833333 +vt 0.794118 0.766667 +vt 0.941176 0.833333 +vt 0.794118 0.766667 +vt 0.941176 0.766667 +vt 0.941176 0.833333 +vt 0.794118 0.900000 +vt 0.794118 0.833333 +vt 0.941176 0.900000 +vt 0.794118 0.833333 +vt 0.941176 0.833333 +vt 0.941176 0.900000 +vt 0.823529 0.966667 +vt 0.823529 0.900000 +vt 0.911765 0.966667 +vt 0.823529 0.900000 +vt 0.911765 0.900000 +vt 0.911765 0.966667 +vt 0.441176 0.200000 +vt 0.441176 0.400000 +vt 0.235294 0.200000 +vt 0.235294 0.200000 +vt 0.235294 0.400000 +vt 0.441176 0.200000 +vt 0.235294 0.400000 +vt 0.441176 0.400000 +vt 0.441176 0.200000 +vt 0.441176 0.400000 +vt 0.235294 0.400000 +vt 0.235294 0.200000 +vt 0.441176 0.000000 +vt 0.441176 0.200000 +vt 0.647059 0.000000 +vt 0.441176 0.200000 +vt 0.647059 0.200000 +vt 0.647059 0.000000 +vt 0.647059 0.000000 +vt 0.647059 0.200000 +vt 0.441176 0.000000 +vt 0.647059 0.200000 +vt 0.441176 0.200000 +vt 0.441176 0.000000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.3420 0.9397 0.0000 +vn 0.3420 0.9397 0.0000 +usemtl bee.png +s off +f 1/1/1 2/2/1 3/3/1 +f 4/4/1 5/5/1 6/6/1 +f 7/7/2 8/8/2 9/9/2 +f 10/10/2 11/11/2 12/12/2 +f 13/13/3 14/14/3 15/15/3 +f 16/16/3 17/17/3 18/18/3 +f 19/19/4 20/20/4 21/21/4 +f 22/22/4 23/23/4 24/24/4 +f 25/25/5 26/26/5 27/27/5 +f 28/28/5 29/29/5 30/30/5 +f 31/31/6 32/32/6 33/33/6 +f 34/34/6 35/35/6 36/36/6 +f 37/37/2 38/38/2 39/39/2 +f 40/40/2 41/41/2 42/42/2 +f 43/43/2 44/44/2 45/45/2 +f 46/46/2 47/47/2 48/48/2 +f 49/49/1 50/50/1 51/51/1 +f 52/52/1 53/53/1 54/54/1 +f 55/55/6 56/56/6 57/57/6 +f 58/58/6 59/59/6 60/60/6 +f 61/61/6 62/62/6 63/63/6 +f 64/64/6 65/65/6 66/66/6 +f 67/67/6 68/68/6 69/69/6 +f 70/70/6 71/71/6 72/72/6 +f 73/73/7 74/74/7 75/75/7 +f 76/76/8 77/77/8 78/78/8 +f 79/79/8 80/80/8 81/81/8 +f 82/82/7 83/83/7 84/84/7 +f 85/85/8 86/86/8 87/87/8 +f 88/88/8 89/89/8 90/90/8 +f 91/91/7 92/92/7 93/93/7 +f 94/94/7 95/95/7 96/96/7 diff --git a/mods/x_farming/models/x_farming_beetroot_soup.obj b/mods/x_farming/models/x_farming_beetroot_soup.obj new file mode 100644 index 00000000..f6490115 --- /dev/null +++ b/mods/x_farming/models/x_farming_beetroot_soup.obj @@ -0,0 +1,1030 @@ +# Blender v3.3.0 OBJ File: 'x_farming_hog_stew.blend' +# www.blender.org +mtllib x_farming_beetroot_soup.mtl +o x_farming_beetroot_soup +v -0.240000 -0.499000 0.240000 +v -0.240000 -0.499000 -0.240000 +v -0.300000 -0.379000 0.240000 +v -0.300000 -0.439000 -0.300000 +v -0.240000 -0.379000 -0.300000 +v -0.300000 -0.379000 0.360000 +v -0.360000 -0.379000 0.240000 +v -0.240000 -0.319000 -0.420000 +v -0.360000 -0.259000 0.300000 +v 0.240000 -0.199000 0.300000 +v 0.300000 -0.139000 0.240000 +v -0.120000 -0.139000 0.060000 +v -0.120000 -0.139000 -0.060000 +v -0.120000 -0.139000 -0.120000 +v -0.120000 -0.199000 -0.120000 +v 0.300000 -0.199000 -0.240000 +v -0.360000 -0.139000 -0.240000 +v 0.240000 -0.139000 -0.240000 +v 0.240000 -0.199000 -0.300000 +v -0.360000 -0.139000 -0.360000 +v -0.180000 -0.139000 0.060000 +v -0.180000 -0.139000 -0.060000 +v -0.300000 -0.079000 0.060000 +v -0.480000 0.041000 -0.060000 +v 0.240000 -0.499000 0.240000 +v 0.240000 -0.439000 0.240000 +v 0.180000 -0.439000 0.360000 +v 0.300000 -0.379000 0.240000 +v 0.360000 -0.439000 -0.180000 +v 0.360000 -0.379000 -0.180000 +v 0.300000 -0.439000 -0.300000 +v 0.300000 -0.379000 -0.300000 +v 0.360000 -0.379000 0.300000 +v 0.360000 -0.319000 0.240000 +v 0.360000 -0.319000 -0.240000 +v 0.420000 -0.319000 0.240000 +v 0.300000 -0.259000 -0.300000 +v 0.360000 -0.259000 -0.300000 +v 0.360000 -0.259000 -0.360000 +v 0.420000 -0.139000 0.240000 +v 0.120000 -0.139000 0.060000 +v 0.120000 -0.139000 -0.060000 +v 0.060000 -0.199000 -0.060000 +v -0.300000 -0.199000 -0.240000 +v 0.420000 -0.139000 -0.240000 +v 0.240000 -0.139000 -0.420000 +v 0.240000 -0.139000 -0.360000 +v -0.180000 -0.019000 0.060000 +v -0.180000 -0.079000 -0.060000 +v -0.300000 0.041000 0.060000 +v -0.240000 -0.379000 0.360000 +v -0.300000 -0.439000 0.300000 +v -0.240000 -0.439000 0.300000 +v 0.180000 -0.379000 0.300000 +v 0.300000 -0.379000 0.300000 +v -0.360000 -0.439000 0.240000 +v -0.360000 -0.379000 0.300000 +v -0.300000 -0.379000 0.300000 +v 0.240000 -0.319000 0.420000 +v -0.240000 -0.319000 0.360000 +v -0.300000 -0.259000 0.360000 +v 0.360000 -0.259000 0.300000 +v 0.300000 -0.259000 0.300000 +v 0.300000 -0.259000 0.360000 +v 0.360000 -0.259000 0.360000 +v 0.240000 -0.139000 0.360000 +v 0.360000 -0.139000 0.360000 +v -0.420000 -0.139000 0.240000 +v -0.120000 -0.199000 0.120000 +v 0.060000 -0.139000 0.060000 +v -0.240000 -0.199000 -0.240000 +v -0.240000 -0.199000 -0.300000 +v 0.240000 -0.139000 -0.300000 +v -0.360000 -0.379000 -0.180000 +v -0.300000 -0.379000 -0.180000 +v -0.300000 -0.439000 -0.180000 +v 0.300000 -0.439000 -0.180000 +v 0.180000 -0.379000 -0.300000 +v 0.180000 -0.379000 -0.360000 +v 0.360000 -0.379000 -0.300000 +v -0.300000 -0.379000 -0.360000 +v -0.240000 -0.379000 -0.360000 +v -0.240000 -0.319000 -0.360000 +v 0.240000 -0.319000 -0.360000 +v -0.420000 -0.319000 -0.240000 +v 0.420000 -0.319000 -0.240000 +v -0.360000 -0.259000 -0.300000 +v -0.300000 -0.259000 -0.300000 +v 0.300000 -0.259000 -0.360000 +v 0.240000 -0.319000 -0.420000 +v -0.300000 -0.199000 0.240000 +v 0.240000 -0.139000 0.240000 +v 0.300000 -0.199000 0.240000 +v 0.060000 -0.139000 -0.120000 +v 0.360000 -0.139000 -0.240000 +v -0.240000 -0.139000 -0.360000 +v -0.240000 -0.139000 -0.420000 +v -0.300000 -0.079000 -0.060000 +v -0.300000 -0.019000 -0.060000 +v -0.300000 0.041000 -0.060000 +v 0.240000 -0.499000 -0.240000 +v -0.240000 -0.439000 0.360000 +v -0.240000 -0.439000 0.240000 +v 0.180000 -0.439000 0.300000 +v 0.300000 -0.439000 0.240000 +v 0.300000 -0.439000 0.300000 +v -0.300000 -0.439000 0.240000 +v 0.360000 -0.439000 0.240000 +v -0.360000 -0.439000 -0.180000 +v -0.240000 -0.439000 -0.240000 +v -0.240000 -0.439000 -0.300000 +v 0.240000 -0.439000 -0.240000 +v -0.240000 -0.439000 -0.360000 +v 0.180000 -0.439000 -0.360000 +v 0.180000 -0.439000 -0.300000 +v -0.240000 -0.379000 0.300000 +v 0.180000 -0.379000 0.360000 +v 0.300000 -0.379000 0.360000 +v 0.360000 -0.379000 0.240000 +v 0.300000 -0.379000 -0.180000 +v -0.360000 -0.379000 -0.300000 +v -0.300000 -0.379000 -0.300000 +v 0.300000 -0.379000 -0.360000 +v -0.240000 -0.319000 0.420000 +v 0.240000 -0.319000 0.360000 +v -0.420000 -0.319000 0.240000 +v -0.360000 -0.319000 0.240000 +v -0.360000 -0.319000 -0.240000 +v -0.360000 -0.259000 0.360000 +v -0.300000 -0.259000 0.300000 +v -0.360000 -0.259000 -0.360000 +v -0.300000 -0.259000 -0.360000 +v -0.180000 -0.079000 0.060000 +v -0.480000 -0.019000 0.060000 +v -0.300000 -0.019000 0.060000 +v -0.480000 -0.019000 -0.060000 +v -0.240000 -0.199000 0.300000 +v -0.240000 -0.199000 0.240000 +v 0.240000 -0.199000 0.240000 +v 0.060000 -0.199000 0.120000 +v 0.120000 -0.199000 0.060000 +v 0.060000 -0.199000 0.060000 +v 0.120000 -0.199000 -0.060000 +v 0.060000 -0.199000 -0.120000 +v 0.240000 -0.199000 -0.240000 +v -0.240000 -0.139000 0.420000 +v 0.240000 -0.139000 0.420000 +v -0.360000 -0.139000 0.360000 +v -0.240000 -0.139000 0.360000 +v -0.240000 -0.139000 0.300000 +v -0.240000 -0.139000 0.240000 +v -0.300000 -0.139000 0.240000 +v 0.240000 -0.139000 0.300000 +v 0.360000 -0.139000 0.240000 +v -0.360000 -0.139000 0.240000 +v -0.120000 -0.139000 0.120000 +v 0.060000 -0.139000 0.120000 +v 0.060000 -0.139000 -0.060000 +v -0.420000 -0.139000 -0.240000 +v -0.300000 -0.139000 -0.240000 +v -0.240000 -0.139000 -0.240000 +v -0.240000 -0.139000 -0.300000 +v 0.300000 -0.139000 -0.240000 +v 0.360000 -0.139000 -0.360000 +v -0.120000 -0.079000 0.060000 +v -0.120000 -0.079000 -0.060000 +v -0.180000 -0.019000 -0.060000 +v -0.480000 0.041000 0.060000 +vt 0.400000 0.685714 +vt 0.342857 0.657143 +vt 0.400000 0.657143 +vt 0.400000 0.714286 +vt 0.342857 0.685714 +vt 0.342857 0.714286 +vt 0.971429 0.571429 +vt 0.742857 0.542857 +vt 0.742857 0.571429 +vt 0.771429 0.514286 +vt 0.714286 0.457143 +vt 0.771429 0.457143 +vt 0.914286 0.771429 +vt 0.857143 0.742857 +vt 0.857143 0.771429 +vt 0.228571 0.885714 +vt 0.000000 0.914286 +vt 0.000000 0.885714 +vt 0.314286 0.942857 +vt 0.342857 0.914286 +vt 0.314286 0.914286 +vt 0.914286 0.800000 +vt 0.942857 0.771428 +vt 0.914286 0.771428 +vt 0.914286 0.771429 +vt 0.942857 0.742857 +vt 0.914286 0.742857 +vt 0.914286 0.457143 +vt 0.942857 0.428571 +vt 0.914286 0.428571 +vt 0.857143 0.514286 +vt 0.885714 0.428571 +vt 0.857143 0.428571 +vt 0.971429 0.600000 +vt 0.742857 0.628571 +vt 0.742857 0.600000 +vt 0.942857 0.314286 +vt 0.914286 0.342857 +vt 0.914286 0.314286 +vt 0.571429 0.200000 +vt 0.571429 0.171429 +vt 0.600000 0.171429 +vt 0.914286 0.514286 +vt 0.942857 0.485714 +vt 0.914286 0.485714 +vt 0.400000 0.885714 +vt 0.342857 0.857143 +vt 0.400000 0.857143 +vt 0.971429 0.714286 +vt 0.742857 0.685714 +vt 0.742857 0.714286 +vt 0.371429 0.628571 +vt 0.342857 0.400000 +vt 0.342857 0.628571 +vt 0.742857 0.628571 +vt 0.742857 0.657143 +vt 0.771429 0.657143 +vt 0.914286 0.000000 +vt 0.685714 0.085714 +vt 0.914286 0.085714 +vt 0.857143 0.428571 +vt 0.885714 0.342857 +vt 0.885714 0.428571 +vt 0.828571 0.828571 +vt 0.857143 0.742857 +vt 0.857143 0.828571 +vt 0.942857 0.200000 +vt 0.914286 0.228571 +vt 0.914286 0.200000 +vt 0.800000 0.914286 +vt 0.771429 0.942857 +vt 0.771429 0.914286 +vt 0.000000 0.942857 +vt 0.228571 0.914286 +vt 0.228571 0.942857 +vt 0.857143 0.285714 +vt 0.628571 0.371429 +vt 0.857143 0.371429 +vt 0.942857 0.257143 +vt 0.914286 0.285714 +vt 0.914286 0.257143 +vt 0.914286 0.228571 +vt 0.885714 0.171429 +vt 0.885714 0.228571 +vt 0.885714 0.914286 +vt 0.914286 0.885714 +vt 0.885714 0.885714 +vt 0.342857 0.885714 +vt 0.342857 0.828571 +vt 0.314286 0.828571 +vt 0.914286 0.400000 +vt 0.885714 0.342857 +vt 0.914286 0.342857 +vt 0.371429 0.914286 +vt 0.342857 0.942857 +vt 0.342857 0.914286 +vt 0.885714 0.885714 +vt 0.857143 0.914286 +vt 0.857143 0.885714 +vt 0.914286 0.314286 +vt 0.942857 0.285714 +vt 0.914286 0.285714 +vt 0.885714 0.342857 +vt 0.857143 0.257143 +vt 0.885714 0.257143 +vt 0.885714 0.857143 +vt 0.828571 0.828571 +vt 0.885714 0.828571 +vt 0.828571 0.914286 +vt 0.800000 0.942857 +vt 0.800000 0.914286 +vt 0.685714 0.171429 +vt 0.914286 0.085714 +vt 0.914286 0.171429 +vt 0.828572 0.857143 +vt 0.742857 0.828571 +vt 0.742857 0.857143 +vt 0.342857 0.742857 +vt 0.885714 0.857143 +vt 0.828571 0.885714 +vt 0.885714 0.885714 +vt 0.342857 0.828571 +vt 0.371429 0.742857 +vt 0.371429 0.828571 +vt 0.771429 0.514286 +vt 0.828572 0.457143 +vt 0.771429 0.457143 +vt 0.742857 0.942857 +vt 0.771429 0.914286 +vt 0.742857 0.914286 +vt 0.000000 0.942857 +vt 0.228571 0.971429 +vt 0.228571 0.942857 +vt 0.342857 0.314286 +vt 0.371429 0.085714 +vt 0.371429 0.314286 +vt 0.857143 0.514286 +vt 0.857143 0.457143 +vt 0.828572 0.657143 +vt 0.771429 0.685714 +vt 0.285714 0.685714 +vt 0.314286 0.657143 +vt 0.285714 0.457143 +vt 0.628571 0.457143 +vt 0.857143 0.371429 +vt 0.857143 0.457143 +vt 0.714286 0.885714 +vt 0.742857 0.885714 +vt 0.742857 0.942857 +vt 0.342857 0.885714 +vt 0.314286 0.914286 +vt 0.314286 0.885714 +vt 0.800000 0.914286 +vt 0.742857 0.885714 +vt 0.800000 0.885714 +vt 0.685714 0.257143 +vt 0.714286 0.200000 +vt 0.685714 0.200000 +vt 0.914286 0.400000 +vt 0.942857 0.371429 +vt 0.914286 0.371429 +vt 0.400000 0.628571 +vt 0.371429 0.400000 +vt 0.371429 0.628571 +vt 0.971429 0.571429 +vt 0.742857 0.600000 +vt 0.971429 0.600000 +vt 0.942857 0.457143 +vt 0.914286 0.485714 +vt 0.914286 0.457143 +vt 0.085714 0.028571 +vt 0.314286 0.028571 +vt 0.085714 0.057143 +vt 0.914286 0.257143 +vt 0.942857 0.228571 +vt 0.914286 0.228571 +vt 0.828572 0.285714 +vt 0.857143 0.257143 +vt 0.828572 0.257143 +vt 0.714286 0.514286 +vt 0.628572 0.457143 +vt 0.628572 0.514286 +vt 0.800000 0.200000 +vt 0.800000 0.257143 +vt 0.714286 0.257143 +vt 0.742857 0.742857 +vt 0.828571 0.800000 +vt 0.742857 0.800000 +vt 0.314286 0.914286 +vt 0.228571 0.885714 +vt 0.314286 0.885714 +vt 0.942857 0.400000 +vt 0.914286 0.428572 +vt 0.914286 0.400000 +vt 0.914286 0.200000 +vt 0.942857 0.171429 +vt 0.914286 0.171429 +vt 0.371429 0.828571 +vt 0.400000 0.742857 +vt 0.371429 0.742857 +vt 0.914286 0.114286 +vt 0.942857 0.085714 +vt 0.914286 0.085714 +vt 0.857143 0.828571 +vt 0.885714 0.771428 +vt 0.857143 0.771428 +vt 0.914286 0.171429 +vt 0.942857 0.142857 +vt 0.914286 0.142857 +vt 0.400000 0.514286 +vt 0.628572 0.285714 +vt 0.400000 0.285714 +vt 0.914286 0.371429 +vt 0.942857 0.342857 +vt 0.914286 0.342857 +vt 0.914286 0.628571 +vt 0.857143 0.657143 +vt 0.857143 0.628571 +vt 0.457143 0.714286 +vt 0.657143 0.685714 +vt 0.457143 0.685714 +vt 0.971429 0.514286 +vt 0.742857 0.542857 +vt 0.742857 0.514286 +vt 0.942857 0.114286 +vt 0.914286 0.142857 +vt 0.914286 0.114286 +vt 0.228571 0.942857 +vt 0.257143 0.914286 +vt 0.228571 0.914286 +vt 0.400000 0.857143 +vt 0.342857 0.828571 +vt 0.342857 0.857143 +vt 0.914286 0.685714 +vt 0.857143 0.657143 +vt 0.857143 0.685714 +vt 0.400000 0.914286 +vt 0.371429 0.942857 +vt 0.371429 0.914286 +vt 0.828571 0.885714 +vt 0.742857 0.857143 +vt 0.742857 0.885714 +vt 0.914286 0.828571 +vt 0.885714 0.771428 +vt 0.885714 0.828571 +vt 0.857143 0.257143 +vt 0.885714 0.171429 +vt 0.857143 0.171429 +vt 0.828572 0.257143 +vt 0.857143 0.171429 +vt 0.828572 0.171429 +vt 0.657143 0.028571 +vt 0.600000 0.114286 +vt 0.571429 0.085714 +vt 0.714286 0.600000 +vt 0.742857 0.600000 +vt 0.742857 0.657143 +vt 0.400000 0.914286 +vt 0.342857 0.885714 +vt 0.342857 0.914286 +vt 0.400000 0.628571 +vt 0.914286 0.457143 +vt 0.885714 0.400000 +vt 0.914286 0.400000 +vt 0.914286 0.885714 +vt 0.885714 0.885714 +vt 0.285714 0.942857 +vt 0.314286 0.914286 +vt 0.285714 0.914286 +vt 0.742857 0.828571 +vt 0.828572 0.800000 +vt 0.828572 0.828571 +vt 0.257143 0.714286 +vt 0.057143 0.685714 +vt 0.057143 0.714286 +vt 0.914286 0.514286 +vt 0.885714 0.457143 +vt 0.885714 0.514286 +vt 0.942857 0.628571 +vt 0.914286 0.657143 +vt 0.914286 0.628571 +vt 0.628572 0.942857 +vt 0.400000 0.971429 +vt 0.628572 0.971429 +vt 0.942857 0.057143 +vt 0.914286 0.085714 +vt 0.914286 0.057143 +vt 0.257143 0.942857 +vt 0.285714 0.914286 +vt 0.257143 0.914286 +vt 0.857143 0.885714 +vt 0.800000 0.914286 +vt 0.857143 0.914286 +vt 0.885714 0.342857 +vt 0.914286 0.285714 +vt 0.885714 0.285714 +vt 0.914286 0.685714 +vt 0.942857 0.657143 +vt 0.914286 0.657143 +vt 0.828571 0.942857 +vt 0.857143 0.914286 +vt 0.828571 0.914286 +vt 0.942857 0.057143 +vt 0.914286 0.000000 +vt 0.942857 0.000000 +vt 0.885714 0.285714 +vt 0.914286 0.228571 +vt 0.914286 0.285714 +vt 0.971429 0.742857 +vt 0.742857 0.714286 +vt 0.742857 0.742857 +vt 0.342857 0.685714 +vt 0.400000 0.685714 +vt 0.971429 0.542857 +vt 0.914286 0.742857 +vt 0.228571 0.914286 +vt 0.342857 0.942857 +vt 0.942857 0.800000 +vt 0.942857 0.771429 +vt 0.942857 0.457143 +vt 0.885714 0.514286 +vt 0.971429 0.628571 +vt 0.942857 0.342857 +vt 0.685714 0.257143 +vt 0.657143 0.257143 +vt 0.942857 0.514286 +vt 0.342857 0.885714 +vt 0.971429 0.685714 +vt 0.371429 0.400000 +vt 0.857143 0.657143 +vt 0.857143 0.628571 +vt 0.685714 0.000000 +vt 0.857143 0.342857 +vt 0.828571 0.742857 +vt 0.942857 0.228571 +vt 0.800000 0.942857 +vt 0.000000 0.914286 +vt 0.628571 0.285714 +vt 0.942857 0.285714 +vt 0.914286 0.171429 +vt 0.914286 0.914286 +vt 0.028571 0.828571 +vt 0.000000 0.828571 +vt 0.000000 0.885714 +vt 0.057143 0.885714 +vt 0.057143 0.800000 +vt 0.285714 0.800000 +vt 0.285714 0.885714 +vt 0.028571 0.771429 +vt 0.257143 0.742857 +vt 0.057143 0.742857 +vt 0.057143 0.771429 +vt 0.257143 0.771429 +vt 0.314286 0.771429 +vt 0.885714 0.400000 +vt 0.371429 0.942857 +vt 0.885714 0.914286 +vt 0.942857 0.314286 +vt 0.857143 0.342857 +vt 0.828571 0.857143 +vt 0.828571 0.942857 +vt 0.685714 0.085714 +vt 0.828572 0.828571 +vt 0.400000 0.742857 +vt 0.828571 0.857143 +vt 0.342857 0.742857 +vt 0.828572 0.514286 +vt 0.771429 0.942857 +vt 0.000000 0.971429 +vt 0.371429 0.371429 +vt 0.314286 0.342857 +vt 0.314286 0.314286 +vt 0.342857 0.085714 +vt 0.400000 0.085714 +vt 0.400000 0.314286 +vt 0.828572 0.685714 +vt 0.314286 0.714286 +vt 0.628571 0.371429 +vt 0.457143 0.942857 +vt 0.400000 0.942857 +vt 0.428571 0.885714 +vt 0.400000 0.885714 +vt 0.428571 0.828572 +vt 0.457143 0.857143 +vt 0.457143 0.828572 +vt 0.457143 0.800000 +vt 0.657143 0.800000 +vt 0.685714 0.942857 +vt 0.685714 0.857143 +vt 0.657143 0.828572 +vt 0.714286 0.828572 +vt 0.342857 0.914286 +vt 0.742857 0.914286 +vt 0.942857 0.400000 +vt 0.400000 0.400000 +vt 0.742857 0.571429 +vt 0.942857 0.485714 +vt 0.057143 0.314286 +vt 0.085714 0.314286 +vt 0.085714 0.342857 +vt 0.314286 0.371429 +vt 0.314286 0.400000 +vt 0.085714 0.400000 +vt 0.085714 0.371429 +vt 0.028571 0.371429 +vt 0.028571 0.314286 +vt 0.000000 0.314286 +vt 0.000000 0.085714 +vt 0.028571 0.085714 +vt 0.028571 0.028571 +vt 0.057143 0.085714 +vt 0.085714 0.000000 +vt 0.314286 0.000000 +vt 0.371429 0.028571 +vt 0.314286 0.057143 +vt 0.085714 0.085714 +vt 0.314286 0.085714 +vt 0.942857 0.257143 +vt 0.857143 0.285714 +vt 0.828572 0.200000 +vt 0.828572 0.257143 +vt 0.800000 0.285714 +vt 0.714286 0.285714 +vt 0.714286 0.171429 +vt 0.800000 0.171429 +vt 0.828571 0.742857 +vt 0.228571 0.914286 +vt 0.942857 0.428572 +vt 0.942857 0.200000 +vt 0.400000 0.828571 +vt 0.942857 0.114286 +vt 0.885714 0.828571 +vt 0.942857 0.171429 +vt 0.628572 0.514286 +vt 0.942857 0.371429 +vt 0.914286 0.657143 +vt 0.685714 0.800000 +vt 0.742857 0.800000 +vt 0.714286 0.742857 +vt 0.742857 0.742857 +vt 0.714286 0.685714 +vt 0.685714 0.714286 +vt 0.657143 0.657143 +vt 0.457143 0.657143 +vt 0.400000 0.800000 +vt 0.457143 0.800000 +vt 0.428571 0.742857 +vt 0.428571 0.685714 +vt 0.400000 0.742857 +vt 0.971429 0.542857 +vt 0.942857 0.142857 +vt 0.257143 0.942857 +vt 0.400000 0.828571 +vt 0.914286 0.657143 +vt 0.400000 0.942857 +vt 0.828571 0.857143 +vt 0.914286 0.771428 +vt 0.885714 0.257143 +vt 0.857143 0.257143 +vt 0.428571 0.257143 +vt 0.400000 0.257143 +vt 0.485714 0.200000 +vt 0.400000 0.028571 +vt 0.485714 0.085714 +vt 0.428571 0.028571 +vt 0.428571 0.000000 +vt 0.657143 0.000000 +vt 0.657143 0.285714 +vt 0.428571 0.285714 +vt 0.685714 0.028571 +vt 0.571429 0.114286 +vt 0.457143 0.657143 +vt 0.400000 0.657143 +vt 0.428571 0.600000 +vt 0.400000 0.600000 +vt 0.428571 0.542857 +vt 0.457143 0.571429 +vt 0.457143 0.542857 +vt 0.457143 0.514286 +vt 0.657143 0.514286 +vt 0.685714 0.657143 +vt 0.685714 0.571429 +vt 0.657143 0.542857 +vt 0.714286 0.542857 +vt 0.400000 0.885714 +vt 0.342857 0.628571 +vt 0.885714 0.457143 +vt 0.314286 0.942857 +vt 0.742857 0.800000 +vt 0.314286 0.457143 +vt 0.342857 0.657143 +vt 0.342857 0.457143 +vt 0.314286 0.428571 +vt 0.257143 0.428571 +vt 0.257143 0.400000 +vt 0.057143 0.400000 +vt 0.057143 0.428571 +vt 0.028571 0.428571 +vt 0.028571 0.457143 +vt 0.057143 0.457143 +vt 0.000000 0.457143 +vt 0.000000 0.657143 +vt 0.028571 0.657143 +vt 0.028571 0.714286 +vt 0.057143 0.742857 +vt 0.257143 0.742857 +vt 0.914286 0.457143 +vt 0.942857 0.657143 +vt 0.400000 0.942857 +vt 0.942857 0.085714 +vt 0.285714 0.942857 +vt 0.800000 0.885714 +vt 0.914286 0.342857 +vt 0.942857 0.685714 +vt 0.857143 0.942857 +vt 0.914286 0.057143 +vt 0.885714 0.228571 +vt 0.971429 0.714286 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl x_farming_beetroot_soup_Material +s off +f 100/1/1 135/2/1 99/3/1 +f 49/4/2 21/5/2 133/6/2 +f 110/7/2 1/8/2 103/9/2 +f 167/10/3 135/11/3 48/12/3 +f 122/13/2 76/14/2 75/15/2 +f 25/16/4 103/17/4 1/18/4 +f 153/19/2 139/20/2 10/21/2 +f 89/22/5 38/23/5 37/24/5 +f 63/25/5 65/26/5 64/27/5 +f 7/28/5 58/29/5 57/30/5 +f 96/31/2 8/32/2 83/33/2 +f 101/34/1 26/35/1 25/36/1 +f 53/37/4 58/38/4 52/39/4 +f 144/40/3 43/41/3 143/42/3 +f 158/43/6 143/44/6 43/45/6 +f 48/46/4 23/47/4 133/48/4 +f 125/49/5 124/50/5 60/51/5 +f 86/52/5 34/53/5 35/54/5 +f 69/55/2 156/56/2 12/57/2 +f 85/58/2 68/59/2 159/60/2 +f 47/61/1 90/62/1 46/63/1 +f 147/64/1 125/65/1 66/66/1 +f 72/67/1 161/68/1 71/69/1 +f 12/70/4 133/71/4 21/72/4 +f 162/73/4 19/74/4 73/75/4 +f 90/76/6 97/77/6 46/78/6 +f 138/79/1 150/80/1 137/81/1 +f 132/82/2 122/83/2 88/84/2 +f 92/85/6 93/86/6 139/87/6 +f 20/88/2 131/89/2 87/90/2 +f 89/91/1 32/92/1 123/93/1 +f 105/94/1 55/95/1 106/96/1 +f 104/97/1 117/98/1 27/99/1 +f 81/100/5 5/101/5 122/102/5 +f 155/103/4 126/104/4 127/105/4 +f 55/106/4 104/107/4 106/108/4 +f 108/109/4 28/110/4 105/111/4 +f 40/112/1 86/113/1 45/114/1 +f 94/115/6 15/116/6 14/117/6 +f 49/4/1 48/118/1 133/6/1 +f 32/119/5 79/120/5 123/121/5 +f 154/122/4 36/123/4 40/124/4 +f 98/125/5 133/126/5 23/127/5 +f 49/128/6 13/129/6 22/130/6 +f 137/131/6 153/132/6 10/133/6 +f 163/134/3 154/135/3 95/136/3 +f 166/137/3 133/126/3 165/138/3 +f 13/139/1 165/140/1 12/57/1 +f 112/141/5 77/142/5 26/143/5 +f 146/144/4 59/145/4 147/146/4 +f 64/147/4 65/148/4 67/149/4 +f 114/150/1 78/151/1 115/152/1 +f 32/153/1 77/154/1 31/155/1 +f 22/156/5 12/157/5 21/158/5 +f 152/159/6 138/160/6 91/161/6 +f 128/162/5 126/163/5 85/164/5 +f 16/165/2 11/166/2 163/167/2 +f 141/168/4 70/169/4 142/170/4 +f 149/171/3 66/172/3 150/173/3 +f 51/174/2 53/175/2 102/176/2 +f 74/177/6 76/178/6 109/179/6 +f 99/180/5 134/181/5 136/182/5 +f 70/183/3 158/184/3 13/185/3 +f 168/186/3 100/187/3 24/188/3 +f 50/189/4 134/190/4 135/191/4 +f 142/192/1 157/193/1 140/194/1 +f 9/195/5 61/196/5 129/197/5 +f 95/198/6 86/199/6 35/200/6 +f 18/201/2 19/202/2 145/203/2 +f 121/204/5 75/205/5 74/206/5 +f 131/207/5 88/208/5 87/209/5 +f 2/210/5 25/211/5 1/212/5 +f 58/213/2 107/214/2 52/215/2 +f 143/216/1 41/217/1 141/218/1 +f 83/219/6 79/220/6 82/221/6 +f 44/222/1 152/223/1 91/224/1 +f 107/225/4 7/226/4 56/227/4 +f 5/228/2 113/229/2 111/230/2 +f 167/231/6 98/232/6 99/233/6 +f 32/234/6 115/235/6 78/236/6 +f 71/237/4 160/238/4 44/239/4 +f 100/240/6 136/241/6 24/242/6 +f 80/243/5 120/244/5 32/245/5 +f 146/246/2 60/247/2 124/248/2 +f 159/249/6 128/250/6 85/251/6 +f 139/252/3 141/253/3 140/254/3 +f 38/255/1 39/256/1 164/257/1 +f 55/258/5 117/259/5 54/260/5 +f 98/261/2 135/2/2 99/3/2 +f 63/262/1 118/263/1 55/264/1 +f 38/265/6 32/245/6 37/266/6 +f 122/267/6 111/268/6 4/269/6 +f 156/270/4 140/271/4 157/272/4 +f 115/273/5 110/274/5 111/275/5 +f 88/276/6 121/277/6 87/278/6 +f 144/279/1 158/280/1 43/281/1 +f 101/282/6 110/283/6 112/284/6 +f 16/285/4 18/286/4 145/287/4 +f 58/288/5 51/289/5 6/290/5 +f 136/291/2 168/292/2 24/293/2 +f 61/294/2 58/295/2 6/296/2 +f 120/297/6 29/298/6 77/299/6 +f 28/300/5 33/301/5 55/302/5 +f 62/303/4 55/304/4 33/305/4 +f 9/306/4 58/307/4 130/308/4 +f 90/309/5 83/310/5 8/311/5 +f 100/1/1 50/312/1 135/2/1 +f 49/4/2 22/313/2 21/5/2 +f 110/7/2 2/314/2 1/8/2 +f 167/10/3 99/180/3 135/11/3 +f 122/13/2 4/315/2 76/14/2 +f 25/16/4 26/316/4 103/17/4 +f 153/19/2 92/317/2 139/20/2 +f 89/22/5 39/318/5 38/23/5 +f 63/25/5 62/319/5 65/26/5 +f 7/28/5 3/320/5 58/29/5 +f 96/31/2 97/321/2 8/32/2 +f 101/34/1 112/322/1 26/35/1 +f 53/37/4 116/323/4 58/38/4 +f 16/324/3 145/325/3 143/42/3 +f 145/325/3 144/40/3 143/42/3 +f 158/43/6 42/326/6 143/44/6 +f 48/46/4 135/327/4 23/47/4 +f 125/49/5 59/328/5 124/50/5 +f 86/52/5 36/329/5 34/53/5 +f 12/57/2 13/139/2 69/55/2 +f 13/139/2 14/330/2 15/331/2 +f 69/55/2 13/139/2 15/331/2 +f 85/58/2 126/332/2 68/59/2 +f 47/61/1 84/333/1 90/62/1 +f 147/64/1 59/334/1 125/65/1 +f 72/67/1 162/335/1 161/68/1 +f 12/70/4 165/336/4 133/71/4 +f 162/73/4 72/337/4 19/74/4 +f 90/76/6 8/338/6 97/77/6 +f 138/79/1 151/339/1 150/80/1 +f 132/82/2 81/340/2 122/83/2 +f 92/85/6 11/341/6 93/86/6 +f 9/342/2 129/343/2 148/344/2 +f 148/344/2 155/345/2 9/342/2 +f 155/345/2 127/346/2 9/342/2 +f 128/347/2 17/348/2 87/90/2 +f 17/348/2 20/88/2 87/90/2 +f 57/349/2 9/342/2 127/346/2 +f 109/350/2 56/351/2 7/352/2 +f 7/352/2 57/349/2 127/346/2 +f 7/352/2 127/346/2 74/353/2 +f 127/346/2 128/347/2 74/353/2 +f 74/353/2 109/350/2 7/352/2 +f 87/90/2 121/354/2 128/347/2 +f 121/354/2 74/353/2 128/347/2 +f 89/91/1 37/355/1 32/92/1 +f 105/94/1 28/356/1 55/95/1 +f 104/97/1 54/357/1 117/98/1 +f 81/100/5 82/358/5 5/101/5 +f 155/103/4 68/359/4 126/104/4 +f 55/106/4 54/360/4 104/107/4 +f 108/109/4 119/361/4 28/110/4 +f 40/112/1 36/362/1 86/113/1 +f 94/115/6 144/363/6 15/116/6 +f 49/4/1 167/364/1 48/118/1 +f 32/119/5 78/365/5 79/120/5 +f 154/122/4 34/366/4 36/123/4 +f 98/125/5 49/367/5 133/126/5 +f 49/128/6 166/368/6 13/129/6 +f 137/131/6 150/369/6 153/132/6 +f 95/136/3 164/370/3 163/134/3 +f 164/370/3 73/371/3 163/134/3 +f 73/371/3 18/372/3 163/134/3 +f 163/134/3 11/373/3 154/135/3 +f 154/135/3 40/374/3 45/375/3 +f 154/135/3 45/375/3 95/136/3 +f 166/137/3 49/367/3 133/126/3 +f 13/139/1 166/376/1 165/140/1 +f 112/141/5 31/377/5 77/142/5 +f 146/144/4 124/378/4 59/145/4 +f 149/379/4 148/380/4 61/381/4 +f 148/380/4 129/382/4 61/381/4 +f 61/381/4 6/383/4 60/384/4 +f 6/383/4 51/385/4 60/384/4 +f 60/384/4 149/379/4 61/381/4 +f 51/385/4 102/386/4 27/387/4 +f 67/149/4 66/388/4 64/147/4 +f 66/388/4 125/389/4 64/147/4 +f 125/389/4 60/384/4 117/390/4 +f 60/384/4 51/385/4 117/390/4 +f 51/385/4 27/387/4 117/390/4 +f 117/390/4 118/391/4 125/389/4 +f 118/391/4 64/147/4 125/389/4 +f 114/150/1 79/392/1 78/151/1 +f 32/153/1 120/393/1 77/154/1 +f 22/156/5 13/185/5 12/157/5 +f 152/159/6 151/394/6 138/160/6 +f 128/162/5 127/395/5 126/163/5 +f 16/165/2 93/396/2 11/166/2 +f 141/168/4 41/397/4 70/169/4 +f 160/398/3 161/399/3 162/400/3 +f 162/400/3 73/371/3 47/401/3 +f 73/371/3 164/370/3 47/401/3 +f 47/401/3 46/402/3 97/403/3 +f 47/401/3 97/403/3 96/404/3 +f 96/404/3 20/405/3 162/400/3 +f 20/405/3 17/406/3 160/398/3 +f 17/406/3 159/407/3 68/408/3 +f 155/409/3 148/410/3 152/411/3 +f 148/410/3 149/171/3 150/173/3 +f 17/406/3 68/408/3 155/409/3 +f 162/400/3 47/401/3 96/404/3 +f 160/398/3 162/400/3 20/405/3 +f 149/171/3 146/412/3 147/413/3 +f 66/172/3 67/414/3 153/415/3 +f 67/414/3 154/135/3 11/373/3 +f 149/171/3 147/413/3 66/172/3 +f 150/173/3 151/416/3 152/411/3 +f 152/411/3 160/398/3 17/406/3 +f 67/414/3 11/373/3 153/415/3 +f 11/373/3 92/417/3 153/415/3 +f 152/411/3 17/406/3 155/409/3 +f 66/172/3 153/415/3 150/173/3 +f 150/173/3 152/411/3 148/410/3 +f 51/174/2 116/418/2 53/175/2 +f 74/177/6 75/419/6 76/178/6 +f 99/180/5 135/11/5 134/181/5 +f 70/183/3 41/420/3 42/421/3 +f 158/184/3 94/422/3 14/423/3 +f 70/183/3 42/421/3 158/184/3 +f 156/424/3 157/425/3 70/183/3 +f 14/423/3 13/185/3 158/184/3 +f 13/185/3 12/157/3 70/183/3 +f 12/157/3 156/424/3 70/183/3 +f 168/186/3 50/426/3 100/187/3 +f 50/189/4 168/427/4 134/190/4 +f 142/192/1 70/428/1 157/193/1 +f 9/195/5 130/429/5 61/196/5 +f 95/198/6 45/430/6 86/199/6 +f 18/201/2 73/431/2 19/202/2 +f 121/204/5 122/432/5 75/205/5 +f 131/207/5 132/433/5 88/208/5 +f 2/210/5 101/434/5 25/211/5 +f 58/213/2 3/435/2 107/214/2 +f 143/216/1 42/436/1 41/217/1 +f 47/437/6 164/438/6 89/439/6 +f 164/438/6 39/440/6 89/439/6 +f 89/439/6 123/441/6 84/442/6 +f 123/441/6 79/220/6 84/442/6 +f 84/442/6 47/437/6 89/439/6 +f 79/220/6 114/443/6 113/444/6 +f 20/445/6 96/446/6 132/447/6 +f 96/446/6 83/219/6 132/447/6 +f 83/219/6 84/442/6 79/220/6 +f 79/220/6 113/444/6 82/221/6 +f 82/221/6 81/448/6 83/219/6 +f 81/448/6 132/447/6 83/219/6 +f 132/447/6 131/449/6 20/445/6 +f 44/222/1 160/450/1 152/223/1 +f 107/225/4 3/451/4 7/226/4 +f 5/228/2 82/452/2 113/229/2 +f 167/231/6 49/453/6 98/232/6 +f 32/234/6 31/454/6 115/235/6 +f 71/237/4 161/455/4 160/238/4 +f 100/240/6 99/456/6 136/241/6 +f 80/243/5 30/457/5 120/244/5 +f 146/246/2 149/458/2 60/247/2 +f 159/249/6 17/459/6 128/250/6 +f 71/460/3 44/461/3 15/462/3 +f 44/461/3 91/463/3 69/464/3 +f 138/465/3 137/466/3 69/464/3 +f 137/466/3 10/467/3 140/254/3 +f 44/461/3 69/464/3 15/462/3 +f 91/463/3 138/465/3 69/464/3 +f 19/468/3 72/469/3 144/40/3 +f 72/469/3 71/460/3 15/462/3 +f 144/40/3 145/325/3 19/468/3 +f 15/462/3 144/40/3 72/469/3 +f 137/466/3 140/254/3 69/464/3 +f 10/467/3 139/252/3 140/254/3 +f 139/252/3 93/470/3 141/253/3 +f 93/470/3 16/324/3 141/253/3 +f 16/324/3 143/42/3 141/253/3 +f 141/253/3 142/471/3 140/254/3 +f 154/472/1 67/473/1 62/474/1 +f 67/473/1 65/475/1 62/474/1 +f 62/474/1 33/476/1 34/477/1 +f 33/476/1 119/478/1 34/477/1 +f 34/477/1 154/472/1 62/474/1 +f 119/478/1 108/479/1 29/480/1 +f 164/257/1 95/481/1 38/255/1 +f 95/481/1 35/482/1 38/255/1 +f 35/482/1 34/477/1 30/483/1 +f 34/477/1 119/478/1 30/483/1 +f 119/478/1 29/480/1 30/483/1 +f 30/483/1 80/484/1 35/482/1 +f 80/484/1 38/255/1 35/482/1 +f 55/258/5 118/485/5 117/259/5 +f 98/261/2 23/486/2 135/2/2 +f 63/262/1 64/487/1 118/263/1 +f 38/265/6 80/243/6 32/245/6 +f 122/267/6 5/488/6 111/268/6 +f 156/270/4 69/489/4 140/271/4 +f 26/143/5 77/142/5 105/490/5 +f 77/142/5 29/491/5 105/490/5 +f 29/491/5 108/492/5 105/490/5 +f 105/490/5 106/493/5 26/143/5 +f 106/493/5 104/494/5 26/143/5 +f 104/494/5 27/495/5 102/496/5 +f 53/497/5 52/498/5 107/499/5 +f 104/494/5 102/496/5 53/497/5 +f 103/500/5 26/143/5 104/494/5 +f 103/500/5 104/494/5 53/497/5 +f 107/499/5 56/501/5 109/502/5 +f 31/377/5 112/141/5 115/273/5 +f 112/141/5 110/274/5 115/273/5 +f 103/500/5 53/497/5 107/499/5 +f 110/274/5 103/500/5 76/503/5 +f 103/500/5 107/499/5 76/503/5 +f 107/499/5 109/502/5 76/503/5 +f 76/503/5 4/504/5 110/274/5 +f 4/504/5 111/275/5 110/274/5 +f 111/275/5 113/505/5 114/506/5 +f 114/506/5 115/273/5 111/275/5 +f 88/276/6 122/507/6 121/277/6 +f 144/279/1 94/508/1 158/280/1 +f 101/282/6 2/509/6 110/283/6 +f 16/285/4 163/510/4 18/286/4 +f 58/288/5 116/511/5 51/289/5 +f 136/291/2 134/512/2 168/292/2 +f 61/294/2 130/513/2 58/295/2 +f 120/297/6 30/514/6 29/298/6 +f 28/300/5 119/515/5 33/301/5 +f 62/303/4 63/516/4 55/304/4 +f 9/306/4 57/517/4 58/307/4 +f 90/309/5 84/518/5 83/310/5 diff --git a/mods/x_farming/models/x_farming_candle_1.obj b/mods/x_farming/models/x_farming_candle_1.obj new file mode 100644 index 00000000..cadd7068 --- /dev/null +++ b/mods/x_farming/models/x_farming_candle_1.obj @@ -0,0 +1,73 @@ +# Blender v2.83.20 OBJ File: 'x_farming_candle_1.blend' +# www.blender.org +mtllib x_farming_candle_1.mtl +o Cube.002 +v -0.088683 0.250000 -0.088682 +v -0.088683 -0.500000 -0.088682 +v 0.088682 0.250000 -0.088683 +v 0.088682 -0.500000 -0.088683 +v -0.088682 0.250000 0.088683 +v -0.088682 -0.500000 0.088683 +v 0.088683 0.250000 0.088682 +v 0.088683 -0.500000 0.088682 +vt 0.625000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.250000 0.000000 +vt 0.250000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +g Cube.002_Cube.002_candle +usemtl candle +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 6/13/4 2/14/4 4/15/4 8/16/4 +f 2/17/5 1/18/5 3/6/5 4/5/5 +f 6/19/6 5/20/6 1/21/6 2/22/6 +o Cube.006 +v -0.088683 0.250000 -0.088682 +v 0.088683 0.250000 0.088682 +v -0.088683 0.604730 -0.088682 +v 0.088683 0.604730 0.088682 +v -0.088682 0.250000 0.088683 +v 0.088682 0.250000 -0.088683 +v -0.088682 0.604730 0.088683 +v 0.088682 0.604730 -0.088683 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +g Cube.006_Cube.006_flame +usemtl flame +s off +f 9/23/7 11/24/7 12/25/7 10/26/7 +f 13/27/8 15/28/8 16/29/8 14/30/8 diff --git a/mods/x_farming/models/x_farming_candle_2.obj b/mods/x_farming/models/x_farming_candle_2.obj new file mode 100644 index 00000000..e047d167 --- /dev/null +++ b/mods/x_farming/models/x_farming_candle_2.obj @@ -0,0 +1,129 @@ +# Blender v2.83.20 OBJ File: 'x_farming_candle_2.blend' +# www.blender.org +mtllib x_farming_candle_2.mtl +o Cube.002 +v 0.027856 0.250000 -0.031531 +v 0.027856 -0.500000 -0.031531 +v 0.205221 0.250000 -0.031531 +v 0.205221 -0.500000 -0.031531 +v 0.027856 0.250000 0.145834 +v 0.027856 -0.500000 0.145834 +v 0.205221 0.250000 0.145834 +v 0.205221 -0.500000 0.145834 +v -0.205221 0.100000 -0.145834 +v -0.205221 -0.500000 -0.145834 +v -0.027856 0.100000 -0.145834 +v -0.027856 -0.500000 -0.145834 +v -0.205221 0.100000 0.031531 +v -0.205221 -0.500000 0.031531 +v -0.027856 0.100000 0.031531 +v -0.027856 -0.500000 0.031531 +vt 0.625000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.250000 0.000000 +vt 0.250000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.000000 +vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 0.625000 0.437500 +vt 0.625000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.437500 +vt 0.625000 0.000000 +vt 0.625000 0.437500 +vt 0.750000 0.437500 +vt 0.750000 0.000000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.437500 +vt 0.500000 0.437500 +vt 0.500000 0.000000 +vt 0.625000 0.437500 +vt 0.625000 0.875000 +vt 0.750000 0.875000 +vt 0.750000 0.437500 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +g Cube.002_Cube.002_candle +usemtl candle +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 6/13/4 2/14/4 4/15/4 8/16/4 +f 2/17/5 1/18/5 3/6/5 4/5/5 +f 6/19/6 5/20/6 1/21/6 2/22/6 +f 9/23/1 13/24/1 15/25/1 11/26/1 +f 12/27/2 11/28/2 15/29/2 16/30/2 +f 16/31/3 15/32/3 13/33/3 14/34/3 +f 14/35/4 10/36/4 12/37/4 16/38/4 +f 10/39/5 9/40/5 11/41/5 12/42/5 +f 14/43/6 13/44/6 9/45/6 10/46/6 +o Cube.006 +v 0.027856 0.250000 -0.031531 +v 0.205221 0.250000 0.145834 +v 0.027856 0.604730 -0.031531 +v 0.205221 0.604730 0.145834 +v 0.027856 0.250000 0.145834 +v 0.205221 0.250000 -0.031531 +v 0.027856 0.604730 0.145834 +v 0.205221 0.604730 -0.031531 +v -0.205221 0.100000 -0.145834 +v -0.027856 0.100000 0.031531 +v -0.205221 0.454730 -0.145834 +v -0.027856 0.454730 0.031531 +v -0.205221 0.100000 0.031531 +v -0.027856 0.100000 -0.145834 +v -0.205221 0.454730 0.031531 +v -0.027856 0.454730 -0.145834 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.250000 0.000000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +g Cube.006_Cube.006_flame +usemtl flame +s off +f 17/47/7 19/48/7 20/49/7 18/50/7 +f 21/51/8 23/52/8 24/53/8 22/54/8 +f 25/55/7 27/56/7 28/57/7 26/58/7 +f 29/59/8 31/60/8 32/61/8 30/62/8 diff --git a/mods/x_farming/models/x_farming_candle_3.obj b/mods/x_farming/models/x_farming_candle_3.obj new file mode 100644 index 00000000..6352138a --- /dev/null +++ b/mods/x_farming/models/x_farming_candle_3.obj @@ -0,0 +1,181 @@ +# Blender v2.83.20 OBJ File: 'x_farming_candle_3.blend' +# www.blender.org +mtllib x_farming_candle_3.mtl +o Cube.002 +v -0.085412 0.250000 -0.002180 +v -0.085412 -0.500000 -0.002180 +v 0.091953 0.250000 -0.002180 +v 0.091953 -0.500000 -0.002180 +v -0.085412 0.250000 0.175185 +v -0.085412 -0.500000 0.175185 +v 0.091953 0.250000 0.175185 +v 0.091953 -0.500000 0.175185 +v -0.318488 0.100000 -0.116482 +v -0.318488 -0.500000 -0.116482 +v -0.141123 0.100000 -0.116482 +v -0.141123 -0.500000 -0.116482 +v -0.318488 0.100000 0.060883 +v -0.318488 -0.500000 0.060883 +v -0.141123 0.100000 0.060883 +v -0.141123 -0.500000 0.060883 +v 0.141124 -0.020000 -0.175185 +v 0.141124 -0.500000 -0.175185 +v 0.318488 -0.020000 -0.175185 +v 0.318488 -0.500000 -0.175185 +v 0.141124 -0.020000 0.002180 +v 0.141124 -0.500000 0.002180 +v 0.318488 -0.020000 0.002180 +v 0.318488 -0.500000 0.002180 +vt 0.625000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.250000 0.000000 +vt 0.250000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.000000 +vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 0.625000 0.437500 +vt 0.625000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.437500 +vt 0.625000 0.000000 +vt 0.625000 0.437500 +vt 0.750000 0.437500 +vt 0.750000 0.000000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.437500 +vt 0.500000 0.437500 +vt 0.500000 0.000000 +vt 0.625000 0.437500 +vt 0.625000 0.875000 +vt 0.750000 0.875000 +vt 0.750000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.562500 +vt 0.375000 0.562500 +vt 0.000000 0.562500 +vt 0.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.562500 +vt 0.250000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.375000 0.562500 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +g Cube.002_Cube.002_candle +usemtl candle +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 6/13/4 2/14/4 4/15/4 8/16/4 +f 2/17/5 1/18/5 3/6/5 4/5/5 +f 6/19/6 5/20/6 1/21/6 2/22/6 +f 9/23/1 13/24/1 15/25/1 11/26/1 +f 12/27/2 11/28/2 15/29/2 16/30/2 +f 16/31/3 15/32/3 13/33/3 14/34/3 +f 14/35/4 10/36/4 12/37/4 16/38/4 +f 10/39/5 9/40/5 11/41/5 12/42/5 +f 14/43/6 13/44/6 9/45/6 10/46/6 +f 17/47/1 21/48/1 23/49/1 19/50/1 +f 20/51/2 19/50/2 23/49/2 24/52/2 +f 24/53/3 23/54/3 21/55/3 22/56/3 +f 22/57/4 18/58/4 20/59/4 24/60/4 +f 18/61/5 17/62/5 19/63/5 20/64/5 +f 22/56/6 21/55/6 17/65/6 18/66/6 +o Cube.006 +v -0.085412 0.250000 -0.002180 +v 0.091953 0.250000 0.175185 +v -0.085412 0.604730 -0.002180 +v 0.091953 0.604730 0.175185 +v -0.085412 0.250000 0.175185 +v 0.091953 0.250000 -0.002180 +v -0.085412 0.604730 0.175185 +v 0.091953 0.604730 -0.002180 +v 0.141123 -0.020000 -0.175185 +v 0.318488 -0.020000 0.002180 +v 0.141123 0.334730 -0.175185 +v 0.318488 0.334730 0.002180 +v 0.141123 -0.020000 0.002180 +v 0.318488 -0.020000 -0.175185 +v 0.141123 0.334730 0.002180 +v 0.318488 0.334730 -0.175185 +v -0.318488 0.100000 -0.116482 +v -0.141123 0.100000 0.060883 +v -0.318488 0.454730 -0.116482 +v -0.141123 0.454730 0.060883 +v -0.318488 0.100000 0.060883 +v -0.141123 0.100000 -0.116482 +v -0.318488 0.454730 0.060883 +v -0.141123 0.454730 -0.116482 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.250000 0.000000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +g Cube.006_Cube.006_flame +usemtl flame +s off +f 25/67/7 27/68/7 28/69/7 26/70/7 +f 29/71/8 31/72/8 32/73/8 30/74/8 +f 33/75/7 35/76/7 36/77/7 34/78/7 +f 37/79/8 39/80/8 40/81/8 38/82/8 +f 41/83/7 43/84/7 44/85/7 42/86/7 +f 45/87/8 47/88/8 48/89/8 46/90/8 diff --git a/mods/x_farming/models/x_farming_candle_4.obj b/mods/x_farming/models/x_farming_candle_4.obj new file mode 100644 index 00000000..7e9b0e48 --- /dev/null +++ b/mods/x_farming/models/x_farming_candle_4.obj @@ -0,0 +1,237 @@ +# Blender v2.83.20 OBJ File: 'x_farming_candle_4.blend' +# www.blender.org +mtllib x_farming_candle_4.mtl +o Cube.002 +v -0.085412 0.250000 0.082782 +v -0.085412 -0.500000 0.082782 +v 0.091953 0.250000 0.082782 +v 0.091953 -0.500000 0.082782 +v -0.085412 0.250000 0.260147 +v -0.085412 -0.500000 0.260147 +v 0.091953 0.250000 0.260147 +v 0.091953 -0.500000 0.260147 +v -0.318488 0.100000 -0.031520 +v -0.318488 -0.500000 -0.031520 +v -0.141123 0.100000 -0.031520 +v -0.141123 -0.500000 -0.031520 +v -0.318488 0.100000 0.145845 +v -0.318488 -0.500000 0.145845 +v -0.141123 0.100000 0.145845 +v -0.141123 -0.500000 0.145845 +v 0.141124 -0.020000 -0.090223 +v 0.141124 -0.500000 -0.090223 +v 0.318488 -0.020000 -0.090223 +v 0.318488 -0.500000 -0.090223 +v 0.141124 -0.020000 0.087142 +v 0.141124 -0.500000 0.087142 +v 0.318488 -0.020000 0.087142 +v 0.318488 -0.500000 0.087142 +v -0.100614 -0.260000 -0.260147 +v -0.100614 -0.500000 -0.260147 +v 0.076751 -0.260000 -0.260147 +v 0.076751 -0.500000 -0.260147 +v -0.100614 -0.260000 -0.082782 +v -0.100614 -0.500000 -0.082782 +v 0.076751 -0.260000 -0.082782 +v 0.076751 -0.500000 -0.082782 +vt 0.625000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.250000 0.000000 +vt 0.250000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.000000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.375000 0.000000 +vt 0.375000 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.000000 +vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 0.625000 0.437500 +vt 0.625000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.437500 +vt 0.625000 0.000000 +vt 0.625000 0.437500 +vt 0.750000 0.437500 +vt 0.750000 0.000000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.437500 +vt 0.500000 0.437500 +vt 0.500000 0.000000 +vt 0.625000 0.437500 +vt 0.625000 0.875000 +vt 0.750000 0.875000 +vt 0.750000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.562500 +vt 0.375000 0.562500 +vt 0.000000 0.562500 +vt 0.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.562500 +vt 0.250000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.375000 0.562500 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.250000 0.875000 +vt 0.875000 0.000000 +vt 0.875000 0.187500 +vt 0.750000 0.187500 +vt 0.750000 0.000000 +vt 0.750000 0.562500 +vt 0.750000 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.562500 +vt 0.000000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.875000 0.375000 +vt 0.875000 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.375000 +vt 0.750000 0.187500 +vt 0.750000 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.187500 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +g Cube.002_Cube.002_candle +usemtl candle +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 6/13/4 2/14/4 4/15/4 8/16/4 +f 2/17/5 1/18/5 3/6/5 4/5/5 +f 6/19/6 5/20/6 1/21/6 2/22/6 +f 9/23/1 13/24/1 15/25/1 11/26/1 +f 12/27/2 11/28/2 15/29/2 16/30/2 +f 16/31/3 15/32/3 13/33/3 14/34/3 +f 14/35/4 10/36/4 12/37/4 16/38/4 +f 10/39/5 9/40/5 11/41/5 12/42/5 +f 14/43/6 13/44/6 9/45/6 10/46/6 +f 17/47/1 21/48/1 23/49/1 19/50/1 +f 20/51/2 19/50/2 23/49/2 24/52/2 +f 24/53/3 23/54/3 21/55/3 22/56/3 +f 22/57/4 18/58/4 20/59/4 24/60/4 +f 18/61/5 17/62/5 19/63/5 20/64/5 +f 22/56/6 21/55/6 17/65/6 18/66/6 +f 25/67/1 29/68/1 31/69/1 27/70/1 +f 28/71/2 27/72/2 31/73/2 32/74/2 +f 32/75/3 31/76/3 29/77/3 30/78/3 +f 30/79/4 26/80/4 28/81/4 32/82/4 +f 26/83/5 25/84/5 27/85/5 28/86/5 +f 30/87/6 29/88/6 25/89/6 26/90/6 +o Cube.006 +v -0.085412 0.250000 0.082782 +v 0.091953 0.250000 0.260147 +v -0.085412 0.604730 0.082782 +v 0.091953 0.604730 0.260147 +v -0.085412 0.250000 0.260147 +v 0.091953 0.250000 0.082782 +v -0.085412 0.604730 0.260147 +v 0.091953 0.604730 0.082782 +v 0.141123 -0.020000 -0.090223 +v 0.318488 -0.020000 0.087142 +v 0.141123 0.334730 -0.090223 +v 0.318488 0.334730 0.087142 +v 0.141123 -0.020000 0.087142 +v 0.318488 -0.020000 -0.090223 +v 0.141123 0.334730 0.087142 +v 0.318488 0.334730 -0.090223 +v -0.318488 0.100000 -0.031520 +v -0.141123 0.100000 0.145845 +v -0.318488 0.454730 -0.031520 +v -0.141123 0.454730 0.145845 +v -0.318488 0.100000 0.145845 +v -0.141123 0.100000 -0.031520 +v -0.318488 0.454730 0.145845 +v -0.141123 0.454730 -0.031520 +v -0.100614 -0.260000 -0.260147 +v 0.076751 -0.260000 -0.082782 +v -0.100614 0.094730 -0.260147 +v 0.076751 0.094730 -0.082782 +v -0.100614 -0.260000 -0.082782 +v 0.076751 -0.260000 -0.260147 +v -0.100614 0.094730 -0.082782 +v 0.076751 0.094730 -0.260147 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.250000 0.000000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.500000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +g Cube.006_Cube.006_flame +usemtl flame +s off +f 33/91/7 35/92/7 36/93/7 34/94/7 +f 37/95/8 39/96/8 40/97/8 38/98/8 +f 41/99/7 43/100/7 44/101/7 42/102/7 +f 45/103/8 47/104/8 48/105/8 46/106/8 +f 49/107/7 51/108/7 52/109/7 50/110/7 +f 53/111/8 55/112/8 56/113/8 54/114/8 +f 57/115/7 59/116/7 60/117/7 58/118/7 +f 61/119/8 63/120/8 64/121/8 62/122/8 diff --git a/mods/x_farming/models/x_farming_coffee_cup_hot.obj b/mods/x_farming/models/x_farming_coffee_cup_hot.obj new file mode 100644 index 00000000..18b2926c --- /dev/null +++ b/mods/x_farming/models/x_farming_coffee_cup_hot.obj @@ -0,0 +1,386 @@ +# Blender v3.3.0 OBJ File: 'coffee_cup_2_hot.blend' +# www.blender.org +mtllib coffee_cup_2.mtl +o coffee_cup_2 +v -0.030000 -0.379625 -0.330000 +v 0.150000 -0.139625 -0.150000 +v -0.030000 -0.139625 -0.330000 +v 0.150000 -0.019625 -0.150000 +v 0.150000 -0.079625 -0.150000 +v -0.210000 -0.019625 -0.210000 +v -0.030000 0.040375 -0.090000 +v -0.030000 0.220375 -0.090000 +v -0.030000 0.220375 0.030000 +v -0.030000 0.340375 0.030000 +v -0.030000 0.280375 -0.030000 +v -0.030000 0.460375 -0.090000 +v 0.210000 -0.499625 -0.210000 +v -0.150000 -0.439625 -0.150000 +v 0.030000 -0.439625 -0.210000 +v 0.030000 -0.379625 -0.330000 +v 0.030000 -0.079625 -0.390000 +v -0.150000 -0.079625 0.150000 +v 0.210000 -0.019625 -0.210000 +v 0.030000 0.220375 -0.090000 +v 0.030000 0.220375 0.030000 +v 0.030000 0.220375 -0.030000 +v 0.030000 0.280375 -0.030000 +v 0.030000 0.340375 -0.150000 +v -0.210000 -0.499625 0.210000 +v 0.210000 -0.499625 0.210000 +v 0.150000 -0.439625 -0.150000 +v -0.150000 -0.139625 -0.150000 +v 0.030000 -0.139625 -0.330000 +v -0.150000 -0.019625 -0.150000 +v 0.030000 0.040375 -0.030000 +v 0.030000 0.340375 0.030000 +v 0.030000 0.460375 -0.090000 +v -0.030000 -0.379625 -0.210000 +v -0.030000 -0.439625 -0.210000 +v 0.030000 -0.439625 -0.390000 +v 0.030000 -0.379625 -0.210000 +v -0.150000 -0.019625 0.150000 +v -0.030000 -0.079625 -0.210000 +v 0.030000 -0.079625 -0.210000 +v -0.030000 0.280375 -0.090000 +v -0.030000 0.340375 -0.090000 +v 0.030000 0.280375 -0.090000 +v -0.030000 0.460375 -0.150000 +v 0.030000 0.460375 -0.150000 +v -0.210000 -0.499625 -0.210000 +v -0.030000 -0.439625 -0.390000 +v -0.150000 -0.139625 0.150000 +v 0.150000 -0.139625 0.150000 +v -0.030000 -0.139625 -0.210000 +v 0.030000 -0.139625 -0.210000 +v -0.030000 0.040375 -0.030000 +v 0.030000 0.040375 -0.090000 +v -0.030000 0.220375 -0.030000 +v -0.030000 0.340375 -0.150000 +v 0.030000 0.340375 -0.090000 +v -0.150000 -0.439625 0.150000 +v 0.150000 -0.439625 0.150000 +v 0.150000 -0.079625 0.150000 +v -0.150000 -0.079625 -0.150000 +v -0.030000 -0.079625 -0.390000 +v -0.210000 -0.019625 0.210000 +v 0.210000 -0.019625 0.210000 +v 0.150000 -0.019625 0.150000 +vt 0.407407 0.222222 +vt 0.407407 0.074074 +vt 0.370370 0.222222 +vt 0.888889 0.629629 +vt 0.925926 0.555555 +vt 0.925926 0.629629 +vt 0.259259 0.592593 +vt 0.518519 0.296296 +vt 0.518519 0.592593 +vt 0.888889 0.370370 +vt 0.925926 0.333333 +vt 0.888889 0.333333 +vt 0.481481 0.740741 +vt 0.518519 0.703704 +vt 0.481481 0.703704 +vt 0.851852 0.518518 +vt 0.888889 0.407407 +vt 0.851852 0.407407 +vt 0.925926 0.370370 +vt 0.888889 0.407407 +vt 0.518519 0.000000 +vt 0.777778 0.000000 +vt 0.740741 0.037037 +vt 0.925926 0.555556 +vt 0.888889 0.481481 +vt 0.888889 0.555556 +vt 0.481481 0.888889 +vt 0.444444 0.814815 +vt 0.481481 0.814815 +vt 0.925926 0.481481 +vt 0.888889 0.407407 +vt 0.925926 0.407407 +vt 0.851852 0.037037 +vt 0.851852 0.185185 +vt 0.888889 0.222222 +vt 0.370370 0.814815 +vt 0.185185 0.851852 +vt 0.185185 0.814815 +vt 0.888889 0.407407 +vt 0.851852 0.296296 +vt 0.851852 0.407407 +vt 0.703704 0.888889 +vt 0.888889 0.703704 +vt 0.703704 0.703704 +vt 0.851852 0.259259 +vt 0.814815 0.222222 +vt 0.814815 0.296296 +vt 0.481481 0.925926 +vt 0.518519 0.851852 +vt 0.481481 0.851852 +vt 0.888889 0.222222 +vt 0.925926 0.185185 +vt 0.888889 0.185185 +vt 0.925926 0.333333 +vt 0.888889 0.222222 +vt 0.888889 0.333333 +vt 0.814815 0.481481 +vt 0.851852 0.518518 +vt 0.777778 0.518518 +vt 0.925926 0.111111 +vt 0.888889 0.000000 +vt 0.925926 0.000000 +vt 0.518519 0.000000 +vt 0.259259 0.000000 +vt 0.407407 0.037037 +vt 0.000000 0.592593 +vt 0.259259 0.296296 +vt 0.185185 0.777778 +vt 0.370370 0.592593 +vt 0.370370 0.777778 +vt 0.481481 0.592593 +vt 0.518519 0.592593 +vt 0.518519 0.259259 +vt 0.777778 0.518519 +vt 0.777778 0.259259 +vt 0.370370 0.777778 +vt 0.185185 0.814815 +vt 0.370370 0.814815 +vt 0.259259 0.296296 +vt 0.407407 0.259259 +vt 0.370370 0.259259 +vt 0.185185 0.851852 +vt 0.370370 0.888889 +vt 0.370370 0.851852 +vt 0.444444 0.888889 +vt 0.407407 0.814815 +vt 0.407407 0.888889 +vt 0.000000 0.962963 +vt 0.185185 0.777778 +vt 0.185185 0.962963 +vt 0.000000 0.000000 +vt 0.000000 0.296296 +vt 0.888889 0.111111 +vt 0.925926 0.111111 +vt 0.518519 0.888889 +vt 0.703704 0.703704 +vt 0.703704 0.888889 +vt 0.851852 0.444444 +vt 0.814815 0.296296 +vt 0.851852 0.296296 +vt 0.444444 0.629630 +vt 0.481481 0.592593 +vt 0.481481 0.814815 +vt 0.555556 0.888889 +vt 0.518519 0.925926 +vt 0.518519 0.888889 +vt 0.814815 0.444444 +vt 0.777778 0.222222 +vt 0.777778 0.444444 +vt 0.370370 0.925926 +vt 0.185185 0.888889 +vt 0.370370 0.888889 +vt 0.555556 0.222222 +vt 0.518519 0.259259 +vt 0.703704 0.518519 +vt 0.518519 0.703704 +vt 0.703704 0.703704 +vt 0.407407 0.925926 +vt 0.444444 0.888889 +vt 0.407407 0.888889 +vt 0.370370 0.925926 +vt 0.407407 0.851852 +vt 0.407407 0.925926 +vt 0.703704 0.518519 +vt 0.888889 0.703704 +vt 0.888889 0.518519 +vt 0.444444 0.925926 +vt 0.481481 0.888889 +vt 0.444444 0.888889 +vt 0.370370 0.851852 +vt 0.407407 0.814815 +vt 0.370370 0.814815 +vt 0.481481 0.851852 +vt 0.518519 0.740741 +vt 0.518519 0.851852 +vt 0.000000 0.592593 +vt 0.000000 0.777778 +vt 0.518519 0.296296 +vt 0.370370 0.074074 +vt 0.888889 0.555555 +vt 0.518519 0.740741 +vt 0.888889 0.518518 +vt 0.925926 0.407407 +vt 0.777778 0.259259 +vt 0.740741 0.222222 +vt 0.555556 0.037037 +vt 0.925926 0.481481 +vt 0.444444 0.888889 +vt 0.888889 0.481481 +vt 0.888889 0.000000 +vt 0.777778 0.000000 +vt 0.777778 0.037037 +vt 0.777778 0.185185 +vt 0.777778 0.222222 +vt 0.370370 0.851852 +vt 0.888889 0.296296 +vt 0.888889 0.888889 +vt 0.888889 0.296296 +vt 0.888889 0.259259 +vt 0.851852 0.222222 +vt 0.518519 0.925926 +vt 0.925926 0.222222 +vt 0.925926 0.222222 +vt 0.777778 0.444444 +vt 0.814815 0.444444 +vt 0.851852 0.481481 +vt 0.888889 0.111111 +vt 0.370370 0.037037 +vt 0.000000 0.296296 +vt 0.185185 0.592593 +vt 0.518519 0.518519 +vt 0.185185 0.777778 +vt 0.185185 0.888889 +vt 0.444444 0.814815 +vt 0.000000 0.777778 +vt 0.518519 0.703704 +vt 0.814815 0.444444 +vt 0.370370 0.814815 +vt 0.444444 0.777778 +vt 0.370370 0.777778 +vt 0.370370 0.629630 +vt 0.370370 0.592593 +vt 0.555556 0.925926 +vt 0.814815 0.222222 +vt 0.185185 0.925926 +vt 0.518519 0.518519 +vt 0.444444 0.925926 +vt 0.703704 0.703704 +vt 0.481481 0.925926 +vt 0.481481 0.740741 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +usemtl coffee_cup_2_Material +s off +f 51/1/1 37/2/1 50/3/1 +f 1/4/2 37/5/2 16/6/2 +f 63/7/3 13/8/3 19/9/3 +f 54/10/4 21/11/4 9/12/4 +f 11/13/1 22/14/1 54/15/1 +f 54/16/5 7/17/5 52/18/5 +f 22/19/2 8/20/2 54/10/2 +f 62/21/2 63/22/2 64/23/2 +f 44/24/5 42/25/5 12/26/5 +f 32/27/6 9/28/6 21/29/6 +f 45/30/3 56/31/3 24/32/3 +f 1/33/5 3/34/5 61/35/5 +f 60/36/3 38/37/3 18/38/3 +f 36/39/4 35/40/4 47/41/4 +f 48/42/1 58/43/1 57/44/1 +f 11/45/5 9/46/5 10/47/5 +f 3/48/4 51/49/4 50/50/4 +f 55/51/4 56/52/4 42/53/4 +f 20/54/1 7/55/1 8/56/1 +f 23/57/3 56/58/3 32/59/3 +f 20/60/3 31/61/3 53/62/3 +f 13/63/1 46/64/1 15/65/1 +f 62/66/6 26/67/6 63/7/6 +f 28/68/6 27/69/6 2/70/6 +f 22/14/6 52/71/6 31/72/6 +f 25/73/4 13/74/4 26/75/4 +f 5/76/5 64/77/5 4/78/5 +f 6/79/1 40/80/1 39/81/1 +f 18/82/1 64/83/1 59/84/1 +f 45/85/1 55/86/1 44/87/1 +f 14/88/2 58/89/2 27/90/2 +f 6/79/5 25/91/5 62/92/5 +f 56/52/2 10/93/2 32/94/2 +f 60/95/2 59/96/2 5/97/2 +f 29/98/6 1/99/6 16/100/6 +f 16/101/3 36/102/3 17/103/3 +f 33/104/2 44/105/2 12/106/2 +f 17/107/1 47/108/1 61/109/1 +f 4/110/6 60/111/6 5/112/6 +f 30/113/2 6/114/2 62/21/2 +f 49/115/4 28/116/4 2/117/4 +f 7/118/4 31/119/4 52/120/4 +f 12/121/6 56/122/6 33/123/6 +f 58/124/5 2/125/5 27/126/5 +f 41/127/4 23/128/4 11/129/4 +f 42/130/1 43/131/1 41/132/1 +f 61/133/2 40/134/2 17/135/2 +f 57/136/3 28/68/3 48/137/3 +f 51/1/1 40/80/1 19/138/1 +f 19/138/1 13/63/1 37/2/1 +f 37/2/1 34/139/1 50/3/1 +f 34/139/1 6/79/1 50/3/1 +f 51/1/1 19/138/1 37/2/1 +f 1/4/2 34/140/2 37/5/2 +f 63/7/3 26/67/3 13/8/3 +f 54/10/4 22/19/4 21/11/4 +f 11/13/1 23/141/1 22/14/1 +f 54/16/5 8/142/5 7/17/5 +f 22/19/2 20/143/2 8/20/2 +f 19/144/2 6/114/2 4/145/2 +f 19/144/2 4/145/2 64/23/2 +f 38/146/2 30/113/2 62/21/2 +f 63/22/2 19/144/2 64/23/2 +f 64/23/2 38/146/2 62/21/2 +f 44/24/5 55/147/5 42/25/5 +f 32/27/6 10/148/6 9/28/6 +f 45/30/3 33/149/3 56/31/3 +f 47/150/5 35/151/5 1/33/5 +f 35/151/5 34/152/5 1/33/5 +f 50/153/5 39/154/5 3/34/5 +f 39/154/5 61/35/5 3/34/5 +f 47/150/5 1/33/5 61/35/5 +f 60/36/3 30/155/3 38/37/3 +f 36/39/4 15/156/4 35/40/4 +f 48/42/1 49/157/1 58/43/1 +f 10/47/5 42/158/5 11/45/5 +f 42/158/5 41/159/5 11/45/5 +f 11/45/5 54/160/5 9/46/5 +f 3/48/4 29/161/4 51/49/4 +f 55/51/4 24/162/4 56/52/4 +f 20/54/1 53/163/1 7/55/1 +f 32/59/3 21/164/3 23/57/3 +f 21/164/3 22/165/3 23/57/3 +f 23/57/3 43/166/3 56/58/3 +f 20/60/3 22/167/3 31/61/3 +f 46/64/1 6/79/1 34/139/1 +f 46/64/1 34/139/1 35/168/1 +f 15/65/1 37/2/1 13/63/1 +f 46/64/1 35/168/1 15/65/1 +f 62/66/6 25/169/6 26/67/6 +f 28/68/6 14/170/6 27/69/6 +f 22/14/6 54/15/6 52/71/6 +f 25/73/4 46/171/4 13/74/4 +f 5/76/5 59/172/5 64/77/5 +f 6/79/1 19/138/1 40/80/1 +f 39/81/1 50/3/1 6/79/1 +f 18/82/1 38/173/1 64/83/1 +f 45/85/1 24/174/1 55/86/1 +f 14/88/2 57/175/2 58/89/2 +f 6/79/5 46/64/5 25/91/5 +f 56/52/2 42/53/2 10/93/2 +f 60/95/2 18/176/2 59/96/2 +f 29/98/6 3/177/6 1/99/6 +f 17/103/3 40/178/3 29/179/3 +f 40/178/3 51/180/3 29/179/3 +f 37/181/3 15/182/3 16/101/3 +f 15/182/3 36/102/3 16/101/3 +f 17/103/3 29/179/3 16/101/3 +f 33/104/2 45/183/2 44/105/2 +f 17/107/1 36/184/1 47/108/1 +f 4/110/6 30/185/6 60/111/6 +f 30/113/2 4/145/2 6/114/2 +f 49/115/4 48/186/4 28/116/4 +f 7/118/4 53/187/4 31/119/4 +f 12/121/6 42/130/6 56/122/6 +f 58/124/5 49/188/5 2/125/5 +f 41/127/4 43/189/4 23/128/4 +f 42/130/1 56/122/1 43/131/1 +f 61/133/2 39/190/2 40/134/2 +f 57/136/3 14/170/3 28/68/3 diff --git a/mods/x_farming/models/x_farming_corn_popcorn.obj b/mods/x_farming/models/x_farming_corn_popcorn.obj new file mode 100644 index 00000000..463152da --- /dev/null +++ b/mods/x_farming/models/x_farming_corn_popcorn.obj @@ -0,0 +1,1366 @@ +# Blender v3.3.0 OBJ File: 'popcorn.blend' +# www.blender.org +mtllib popcorn.mtl +o popcorn +v 0.240000 -0.439000 0.240000 +v 0.240000 0.101000 -0.240000 +v -0.060000 0.161000 0.180000 +v 0.120000 0.161000 0.240000 +v 0.120000 0.221000 0.240000 +v 0.120000 0.161000 0.180000 +v 0.240000 0.161000 0.060000 +v -0.180000 0.161000 0.000000 +v -0.180000 0.161000 -0.180000 +v -0.180000 0.161000 -0.240000 +v -0.060000 0.221000 -0.180000 +v -0.060000 0.161000 -0.240000 +v 0.060000 0.221000 -0.180000 +v -0.240000 0.281000 0.180000 +v -0.240000 0.221000 0.180000 +v 0.000000 0.221000 0.240000 +v -0.180000 0.281000 0.180000 +v -0.180000 0.221000 0.120000 +v 0.120000 0.281000 0.180000 +v -0.120000 0.221000 0.060000 +v -0.120000 0.281000 0.060000 +v -0.120000 0.221000 0.000000 +v 0.180000 0.281000 0.000000 +v -0.120000 0.281000 -0.060000 +v -0.180000 0.281000 -0.240000 +v -0.180000 0.221000 -0.240000 +v -0.060000 0.281000 -0.180000 +v -0.060000 0.281000 -0.240000 +v -0.060000 0.221000 -0.240000 +v -0.180000 0.341000 0.180000 +v -0.180000 0.341000 0.120000 +v -0.180000 0.281000 0.120000 +v 0.060000 0.341000 0.000000 +v 0.000000 0.281000 -0.060000 +v -0.180000 0.341000 -0.180000 +v -0.180000 0.281000 -0.180000 +v 0.120000 0.341000 -0.120000 +v 0.300000 -0.499000 0.300000 +v 0.300000 -0.499000 -0.300000 +v -0.240000 -0.439000 0.240000 +v -0.240000 -0.439000 -0.240000 +v -0.240000 0.101000 0.240000 +v 0.300000 0.221000 0.300000 +v 0.060000 0.161000 0.180000 +v 0.060000 0.221000 0.180000 +v 0.060000 0.221000 0.240000 +v -0.240000 0.161000 0.180000 +v -0.240000 0.161000 0.000000 +v -0.240000 0.161000 -0.060000 +v -0.240000 0.221000 0.000000 +v 0.180000 0.161000 -0.120000 +v 0.180000 0.221000 -0.120000 +v -0.120000 0.221000 -0.240000 +v -0.120000 0.221000 -0.180000 +v 0.300000 0.221000 -0.300000 +v -0.180000 0.221000 0.180000 +v 0.240000 0.281000 0.120000 +v 0.180000 0.221000 0.120000 +v -0.180000 0.221000 0.060000 +v -0.180000 0.221000 0.000000 +v 0.120000 0.221000 0.060000 +v 0.120000 0.281000 0.000000 +v -0.180000 0.221000 -0.120000 +v 0.120000 0.221000 -0.120000 +v -0.120000 0.221000 -0.120000 +v 0.240000 0.221000 -0.180000 +v 0.240000 0.281000 -0.180000 +v 0.060000 0.281000 0.120000 +v 0.060000 0.341000 0.120000 +v 0.180000 0.341000 0.120000 +v 0.060000 0.341000 -0.120000 +v 0.060000 0.341000 -0.060000 +v -0.120000 0.281000 -0.180000 +v -0.120000 0.341000 -0.180000 +v 0.000000 0.281000 -0.180000 +v 0.000000 0.341000 -0.120000 +v 0.060000 0.401000 0.000000 +v 0.060000 0.401000 0.060000 +v -0.060000 0.341000 0.000000 +v -0.060000 0.341000 -0.060000 +v -0.060000 0.401000 -0.060000 +v -0.300000 -0.499000 0.300000 +v -0.240000 0.101000 -0.240000 +v -0.120000 0.161000 0.180000 +v -0.240000 0.161000 0.120000 +v -0.180000 0.161000 0.120000 +v -0.180000 0.161000 -0.060000 +v -0.240000 0.221000 -0.060000 +v 0.240000 0.221000 -0.120000 +v -0.240000 0.161000 -0.240000 +v -0.240000 0.221000 -0.240000 +v -0.120000 0.161000 -0.240000 +v 0.000000 0.161000 -0.240000 +v 0.000000 0.281000 0.240000 +v -0.120000 0.221000 0.180000 +v -0.060000 0.221000 0.180000 +v 0.240000 0.221000 0.180000 +v 0.000000 0.221000 0.120000 +v -0.240000 0.221000 0.060000 +v -0.180000 0.281000 0.060000 +v -0.240000 0.281000 0.060000 +v 0.240000 0.281000 0.000000 +v -0.060000 0.281000 0.120000 +v 0.120000 0.281000 0.120000 +v -0.180000 0.281000 0.000000 +v -0.060000 0.281000 0.000000 +v -0.120000 0.341000 0.000000 +v 0.120000 0.341000 0.000000 +v 0.060000 0.281000 -0.060000 +v 0.000000 0.341000 -0.060000 +v -0.180000 0.341000 -0.120000 +v -0.060000 0.281000 -0.120000 +v 0.000000 0.281000 -0.120000 +v 0.180000 0.341000 -0.120000 +v 0.000000 0.341000 0.060000 +v 0.060000 0.341000 0.060000 +v 0.000000 0.401000 0.060000 +v -0.060000 0.401000 0.000000 +v -0.120000 0.401000 0.000000 +v -0.300000 -0.499000 -0.300000 +v -0.120000 0.221000 0.240000 +v 0.060000 0.161000 0.240000 +v 0.180000 0.161000 -0.060000 +v -0.240000 0.161000 -0.180000 +v -0.120000 0.161000 -0.180000 +v 0.000000 0.161000 -0.180000 +v 0.000000 0.221000 -0.180000 +v 0.060000 0.161000 -0.180000 +v 0.000000 0.221000 0.180000 +v 0.060000 0.281000 0.180000 +v 0.180000 0.281000 0.120000 +v 0.240000 0.221000 0.120000 +v -0.120000 0.221000 -0.060000 +v 0.180000 0.281000 -0.060000 +v 0.240000 0.281000 -0.060000 +v -0.120000 0.281000 -0.120000 +v 0.000000 0.221000 -0.120000 +v 0.120000 0.281000 -0.120000 +v -0.240000 0.221000 -0.180000 +v 0.180000 0.221000 -0.180000 +v 0.180000 0.281000 -0.240000 +v 0.240000 0.281000 -0.240000 +v -0.120000 0.341000 0.120000 +v 0.120000 0.281000 0.060000 +v 0.120000 0.341000 0.060000 +v -0.180000 0.341000 -0.060000 +v -0.120000 0.341000 -0.060000 +v 0.060000 0.281000 -0.120000 +v -0.060000 0.341000 -0.180000 +v 0.120000 0.341000 -0.180000 +v 0.240000 0.101000 0.240000 +v 0.240000 -0.439000 -0.240000 +v -0.120000 0.161000 0.240000 +v -0.060000 0.161000 0.240000 +v -0.180000 0.161000 0.180000 +v 0.180000 0.161000 0.060000 +v 0.240000 0.161000 0.000000 +v 0.180000 0.161000 0.000000 +v 0.240000 0.161000 -0.060000 +v 0.240000 0.161000 -0.120000 +v -0.060000 0.161000 -0.180000 +v 0.060000 0.161000 -0.240000 +v -0.300000 0.221000 0.300000 +v -0.180000 0.221000 0.240000 +v -0.060000 0.221000 0.240000 +v -0.240000 0.221000 0.240000 +v 0.120000 0.221000 0.180000 +v 0.120000 0.221000 0.120000 +v -0.240000 0.221000 0.120000 +v 0.240000 0.221000 0.060000 +v 0.180000 0.221000 0.060000 +v 0.180000 0.221000 0.000000 +v 0.240000 0.221000 0.000000 +v 0.240000 0.221000 -0.060000 +v -0.180000 0.221000 -0.060000 +v 0.180000 0.221000 -0.060000 +v -0.060000 0.221000 -0.120000 +v 0.120000 0.221000 -0.180000 +v -0.300000 0.221000 -0.300000 +v 0.000000 0.221000 -0.240000 +v 0.060000 0.221000 -0.240000 +v 0.180000 0.221000 -0.240000 +v 0.240000 0.221000 -0.240000 +v -0.240000 0.281000 0.240000 +v -0.180000 0.281000 0.240000 +v 0.060000 0.281000 0.240000 +v 0.000000 0.281000 0.180000 +v -0.120000 0.281000 0.180000 +v 0.000000 0.281000 0.120000 +v 0.240000 0.281000 0.180000 +v -0.120000 0.281000 0.120000 +v -0.240000 0.281000 0.000000 +v -0.120000 0.281000 0.000000 +v 0.000000 0.281000 0.000000 +v 0.060000 0.281000 0.000000 +v -0.240000 0.281000 -0.060000 +v -0.180000 0.281000 -0.060000 +v -0.180000 0.281000 -0.120000 +v 0.120000 0.281000 -0.060000 +v -0.240000 0.281000 -0.180000 +v -0.120000 0.281000 -0.240000 +v 0.000000 0.281000 -0.240000 +v 0.180000 0.281000 -0.180000 +v -0.120000 0.341000 0.180000 +v -0.060000 0.341000 0.120000 +v 0.120000 0.341000 0.120000 +v 0.180000 0.341000 0.060000 +v 0.000000 0.341000 0.000000 +v -0.180000 0.341000 0.000000 +v 0.120000 0.341000 -0.060000 +v -0.120000 0.341000 -0.120000 +v -0.060000 0.341000 -0.120000 +v 0.000000 0.341000 -0.180000 +v 0.180000 0.341000 -0.180000 +v 0.000000 0.401000 0.000000 +v -0.120000 0.401000 -0.060000 +vt 0.948718 0.128205 +vt 0.923077 0.153846 +vt 0.923077 0.128205 +vt 0.205128 0.923077 +vt 0.230769 0.897436 +vt 0.205128 0.897436 +vt 0.948718 0.051282 +vt 0.974359 0.025641 +vt 0.948718 0.025641 +vt 0.743590 0.102564 +vt 0.717949 0.102564 +vt 0.743590 0.076923 +vt 0.948718 0.641026 +vt 0.923077 0.666667 +vt 0.923077 0.641026 +vt 0.000000 0.000000 +vt 0.256410 0.307692 +vt 0.256410 0.000000 +vt 0.256410 0.871795 +vt 0.230769 0.846154 +vt 0.230769 0.871795 +vt 0.487180 0.948718 +vt 0.512821 0.923077 +vt 0.487180 0.923077 +vt 0.307692 0.871795 +vt 0.282051 0.897436 +vt 0.282051 0.871795 +vt 0.794872 0.025641 +vt 0.794872 0.051282 +vt 0.769231 0.051282 +vt 0.923077 0.641026 +vt 0.948718 0.615385 +vt 0.923077 0.615385 +vt 0.410256 0.897436 +vt 0.384615 0.923077 +vt 0.384615 0.897436 +vt 0.923077 0.384616 +vt 0.897436 0.410257 +vt 0.897436 0.384616 +vt 0.923077 0.230769 +vt 0.923077 0.256410 +vt 0.897436 0.256410 +vt 0.487179 0.692308 +vt 0.487179 0.615385 +vt 0.512821 0.641026 +vt 0.923077 0.615385 +vt 0.948718 0.589744 +vt 0.923077 0.589744 +vt 0.794872 0.410256 +vt 0.769231 0.384615 +vt 0.820513 0.384615 +vt 0.948718 0.179487 +vt 0.923077 0.205128 +vt 0.923077 0.179487 +vt 0.512821 0.743590 +vt 0.717949 0.948718 +vt 0.717949 0.743590 +vt 0.102564 0.871795 +vt 0.102564 0.897436 +vt 0.128205 0.871795 +vt 0.256410 0.923077 +vt 0.282051 0.897436 +vt 0.256410 0.897436 +vt 0.897436 0.076923 +vt 0.923077 0.051282 +vt 0.897436 0.051282 +vt 0.948718 0.153846 +vt 0.923077 0.179487 +vt 0.923077 0.153846 +vt 0.871795 0.461538 +vt 0.871795 0.435897 +vt 0.897436 0.435897 +vt 0.358974 0.846154 +vt 0.333333 0.871795 +vt 0.333333 0.846154 +vt 0.871795 0.358974 +vt 0.871795 0.384615 +vt 0.897436 0.384615 +vt 0.820513 0.358974 +vt 0.794872 0.358974 +vt 0.769231 0.333333 +vt 0.948718 0.230769 +vt 0.923077 0.256410 +vt 0.923077 0.230769 +vt 0.948718 0.333333 +vt 0.923077 0.358974 +vt 0.923077 0.333333 +vt 0.871795 0.076923 +vt 0.871795 0.051282 +vt 0.948718 0.000000 +vt 0.923077 0.025641 +vt 0.923077 0.000000 +vt 0.948718 0.076923 +vt 0.923077 0.102564 +vt 0.923077 0.076923 +vt 0.923077 0.717949 +vt 0.948718 0.692308 +vt 0.923077 0.692308 +vt 0.948718 0.897436 +vt 0.923077 0.923077 +vt 0.923077 0.897436 +vt 0.923077 0.820513 +vt 0.948718 0.794872 +vt 0.923077 0.794872 +vt 0.256410 0.615385 +vt 0.000000 0.307692 +vt 0.256410 0.307692 +vt 0.897436 0.128205 +vt 0.923077 0.102564 +vt 0.923077 0.128205 +vt 0.435897 0.820513 +vt 0.410256 0.846154 +vt 0.410256 0.820513 +vt 0.230769 0.923077 +vt 0.205128 0.948718 +vt 0.205128 0.923077 +vt 0.897436 0.282051 +vt 0.846154 0.307692 +vt 0.897436 0.307692 +vt 0.076923 0.923077 +vt 0.051282 0.948718 +vt 0.051282 0.923077 +vt 0.358974 0.923077 +vt 0.384615 0.897436 +vt 0.358974 0.897436 +vt 0.897436 0.487180 +vt 0.923077 0.461539 +vt 0.897436 0.461539 +vt 0.897436 0.461539 +vt 0.923077 0.435898 +vt 0.897436 0.435898 +vt 0.333333 0.846154 +vt 0.307692 0.846154 +vt 0.205128 0.897436 +vt 0.153846 0.923077 +vt 0.205128 0.923077 +vt 0.948718 0.564103 +vt 0.923077 0.589744 +vt 0.923077 0.564103 +vt 0.435897 0.769231 +vt 0.410256 0.794872 +vt 0.410256 0.769231 +vt 0.923077 0.358974 +vt 0.897436 0.384616 +vt 0.897436 0.358974 +vt 0.358974 0.897436 +vt 0.333333 0.923077 +vt 0.333333 0.897436 +vt 0.435897 0.641026 +vt 0.410256 0.615385 +vt 0.410256 0.641026 +vt 0.435897 0.666667 +vt 0.461538 0.666667 +vt 0.153846 0.871795 +vt 0.128205 0.897436 +vt 0.333333 0.897436 +vt 0.307692 0.923077 +vt 0.307692 0.897436 +vt 0.333333 0.923077 +vt 0.307692 0.948718 +vt 0.307692 0.923077 +vt 0.025641 0.923077 +vt 0.000000 0.948718 +vt 0.000000 0.923077 +vt 0.948718 0.769231 +vt 0.923077 0.794872 +vt 0.923077 0.769231 +vt 0.871795 0.153846 +vt 0.897436 0.128205 +vt 0.871795 0.128205 +vt 0.076923 0.897436 +vt 0.076923 0.871795 +vt 0.897436 0.307692 +vt 0.923077 0.333333 +vt 0.897436 0.358974 +vt 0.948718 0.051282 +vt 0.923077 0.076923 +vt 0.923077 0.051282 +vt 0.948718 0.358974 +vt 0.923077 0.384615 +vt 0.923077 0.358974 +vt 0.410256 0.948718 +vt 0.435897 0.923077 +vt 0.410256 0.923077 +vt 0.923077 0.897436 +vt 0.948718 0.871795 +vt 0.923077 0.871795 +vt 0.948718 0.102564 +vt 0.923077 0.128205 +vt 0.923077 0.102564 +vt 0.794872 0.205128 +vt 0.820513 0.205128 +vt 0.794872 0.230769 +vt 0.923077 0.179487 +vt 0.897436 0.205128 +vt 0.897436 0.179487 +vt 0.384615 0.923077 +vt 0.358974 0.948718 +vt 0.358974 0.923077 +vt 0.948718 0.538462 +vt 0.923077 0.564103 +vt 0.923077 0.538462 +vt 0.230769 0.923077 +vt 0.256410 0.897436 +vt 0.230769 0.897436 +vt 0.923077 0.435897 +vt 0.948718 0.410256 +vt 0.923077 0.410256 +vt 0.461538 0.923077 +vt 0.435897 0.948718 +vt 0.435897 0.923077 +vt 0.820513 0.307692 +vt 0.794872 0.307692 +vt 0.820513 0.282051 +vt 0.487179 0.871795 +vt 0.487179 0.897436 +vt 0.461538 0.897436 +vt 0.307692 0.923077 +vt 0.282051 0.948718 +vt 0.282051 0.923077 +vt 0.256410 0.923077 +vt 0.230769 0.948718 +vt 0.230769 0.923077 +vt 0.358974 0.871795 +vt 0.384615 0.846154 +vt 0.871795 0.205128 +vt 0.897436 0.179487 +vt 0.871795 0.179487 +vt 0.923077 0.487180 +vt 0.948718 0.461539 +vt 0.923077 0.461539 +vt 0.487179 0.923077 +vt 0.461538 0.948718 +vt 0.461538 0.923077 +vt 0.897436 0.282051 +vt 0.897436 0.307692 +vt 0.923077 0.307692 +vt 0.717949 0.512821 +vt 0.923077 0.743590 +vt 0.717949 0.743590 +vt 0.512821 0.000000 +vt 0.538462 0.076923 +vt 0.538462 0.102564 +vt 0.282051 0.923077 +vt 0.256410 0.948718 +vt 0.256410 0.923077 +vt 0.282051 0.923077 +vt 0.307692 0.897436 +vt 0.282051 0.897436 +vt 0.205128 0.923077 +vt 0.179487 0.948718 +vt 0.179487 0.923077 +vt 0.897436 0.410256 +vt 0.897436 0.384615 +vt 0.871795 0.384615 +vt 0.282051 0.846154 +vt 0.256410 0.846154 +vt 0.974359 0.000000 +vt 0.948718 0.025641 +vt 0.948718 0.000000 +vt 0.512821 0.692308 +vt 0.487179 0.717949 +vt 0.487179 0.692308 +vt 0.948718 0.512821 +vt 0.923077 0.538462 +vt 0.923077 0.512821 +vt 0.256410 0.000000 +vt 0.512821 0.307692 +vt 0.512821 0.000000 +vt 0.487179 0.743590 +vt 0.487179 0.769231 +vt 0.461538 0.769231 +vt 0.435897 0.846154 +vt 0.461538 0.820513 +vt 0.487180 0.871795 +vt 0.487180 0.897436 +vt 0.512821 0.897436 +vt 0.948718 0.923077 +vt 0.923077 0.948718 +vt 0.923077 0.923077 +vt 0.923077 0.743590 +vt 0.948718 0.717949 +vt 0.923077 0.717949 +vt 0.820513 0.153846 +vt 0.820513 0.128205 +vt 0.846154 0.128205 +vt 0.846154 0.461538 +vt 0.820513 0.487180 +vt 0.846154 0.487180 +vt 0.128205 0.923077 +vt 0.102564 0.948718 +vt 0.102564 0.923077 +vt 0.897436 0.487180 +vt 0.871795 0.512821 +vt 0.871795 0.487180 +vt 0.000000 0.615385 +vt 0.205128 0.846154 +vt 0.205128 0.615385 +vt 0.948718 0.282051 +vt 0.923077 0.307692 +vt 0.923077 0.282051 +vt 0.512821 0.846154 +vt 0.487179 0.820513 +vt 0.512821 0.794872 +vt 0.871795 0.384615 +vt 0.846154 0.410256 +vt 0.846154 0.384615 +vt 0.358974 0.923077 +vt 0.333333 0.948718 +vt 0.333333 0.923077 +vt 0.051282 0.923077 +vt 0.025641 0.948718 +vt 0.025641 0.923077 +vt 0.051282 0.897436 +vt 0.051282 0.871795 +vt 0.025641 0.871795 +vt 0.948718 0.307692 +vt 0.923077 0.333333 +vt 0.923077 0.307692 +vt 0.435897 0.794872 +vt 0.923077 0.461539 +vt 0.948718 0.435898 +vt 0.923077 0.435898 +vt 0.025641 0.948718 +vt 0.000000 0.974359 +vt 0.000000 0.948718 +vt 0.102564 0.923077 +vt 0.076923 0.948718 +vt 0.076923 0.923077 +vt 0.923077 0.871795 +vt 0.948718 0.846154 +vt 0.923077 0.846154 +vt 0.923077 0.743590 +vt 0.717949 0.948718 +vt 0.717949 0.743590 +vt 0.487180 0.923077 +vt 0.512821 0.897436 +vt 0.487180 0.897436 +vt 0.179487 0.923077 +vt 0.153846 0.948718 +vt 0.153846 0.923077 +vt 0.487179 0.846154 +vt 0.435897 0.871795 +vt 0.435897 0.846154 +vt 0.923077 0.846154 +vt 0.948718 0.820513 +vt 0.923077 0.820513 +vt 0.769231 0.128205 +vt 0.794872 0.153846 +vt 0.794872 0.128205 +vt 0.948718 0.205128 +vt 0.923077 0.230769 +vt 0.923077 0.205128 +vt 0.948718 0.666667 +vt 0.923077 0.692308 +vt 0.923077 0.666667 +vt 0.410256 0.923077 +vt 0.384615 0.948718 +vt 0.384615 0.923077 +vt 0.153846 0.923077 +vt 0.128205 0.948718 +vt 0.128205 0.923077 +vt 0.871795 0.230769 +vt 0.846154 0.230769 +vt 0.358974 0.871795 +vt 0.384615 0.871795 +vt 0.384615 0.897436 +vt 0.410256 0.846154 +vt 0.205128 0.615385 +vt 0.205128 0.846154 +vt 0.897436 0.435898 +vt 0.923077 0.410257 +vt 0.897436 0.410257 +vt 0.435897 0.871795 +vt 0.435897 0.897436 +vt 0.410256 0.897436 +vt 0.820513 0.410256 +vt 0.871795 0.333333 +vt 0.846154 0.358974 +vt 0.871795 0.384615 +vt 0.820513 0.076923 +vt 0.846154 0.076923 +vt 0.820513 0.051282 +vt 0.000000 0.897436 +vt 0.000000 0.871795 +vt 0.153846 0.897436 +vt 0.153846 0.871795 +vt 0.179487 0.871795 +vt 0.948718 0.256410 +vt 0.923077 0.282051 +vt 0.923077 0.256410 +vt 0.384615 0.871795 +vt 0.410256 0.846154 +vt 0.384615 0.846154 +vt 0.461538 0.923077 +vt 0.487180 0.897436 +vt 0.461538 0.897436 +vt 0.897436 0.230769 +vt 0.871795 0.256410 +vt 0.871795 0.230769 +vt 0.769231 0.307692 +vt 0.794872 0.282051 +vt 0.769231 0.282051 +vt 0.435897 0.897436 +vt 0.410256 0.923077 +vt 0.410256 0.897436 +vt 0.435897 0.846154 +vt 0.410256 0.871795 +vt 0.435897 0.923077 +vt 0.461538 0.897436 +vt 0.435897 0.897436 +vt 0.948718 0.743590 +vt 0.923077 0.769231 +vt 0.923077 0.743590 +vt 0.512821 0.615385 +vt 0.512821 0.307692 +vt 0.769231 0.487179 +vt 0.769231 0.435897 +vt 0.794872 0.461538 +vt 0.948718 0.025641 +vt 0.923077 0.051282 +vt 0.923077 0.025641 +vt 0.846154 0.282051 +vt 0.871795 0.282051 +vt 0.923077 0.410256 +vt 0.948718 0.384615 +vt 0.923077 0.384615 +vt 0.769231 0.256410 +vt 0.512821 0.512821 +vt 0.769231 0.512821 +vt 0.512821 0.512821 +vt 0.948718 0.153846 +vt 0.230769 0.923077 +vt 0.974359 0.051282 +vt 0.743590 0.205128 +vt 0.717949 0.205128 +vt 0.717949 0.179487 +vt 0.743590 0.179487 +vt 0.743590 0.153846 +vt 0.769231 0.256410 +vt 0.743590 0.128205 +vt 0.717949 0.230769 +vt 0.743590 0.230769 +vt 0.743590 0.051282 +vt 0.769231 0.000000 +vt 0.717949 0.076923 +vt 0.948718 0.666667 +vt 0.000000 0.307692 +vt 0.230769 0.897436 +vt 0.256410 0.897436 +vt 0.512821 0.948718 +vt 0.282051 0.846154 +vt 0.307692 0.897436 +vt 0.769231 0.025641 +vt 0.769231 0.000000 +vt 0.794872 0.000000 +vt 0.948718 0.641026 +vt 0.410256 0.923077 +vt 0.923077 0.410257 +vt 0.897436 0.205128 +vt 0.923077 0.205128 +vt 0.512821 0.615385 +vt 0.512821 0.666667 +vt 0.512821 0.692308 +vt 0.948718 0.615385 +vt 0.820513 0.435898 +vt 0.794872 0.435898 +vt 0.769231 0.410256 +vt 0.948718 0.205128 +vt 0.512821 0.948718 +vt 0.102564 0.923077 +vt 0.128205 0.923077 +vt 0.128205 0.846154 +vt 0.102564 0.846154 +vt 0.282051 0.923077 +vt 0.923077 0.076923 +vt 0.948718 0.179487 +vt 0.897436 0.487180 +vt 0.871795 0.487180 +vt 0.897436 0.333333 +vt 0.871795 0.333333 +vt 0.846154 0.333333 +vt 0.820513 0.384615 +vt 0.794872 0.384615 +vt 0.769231 0.358974 +vt 0.948718 0.256410 +vt 0.948718 0.358974 +vt 0.948718 0.025641 +vt 0.948718 0.102564 +vt 0.948718 0.717949 +vt 0.948718 0.923077 +vt 0.948718 0.820513 +vt 0.000000 0.615385 +vt 0.923077 0.153846 +vt 0.897436 0.153846 +vt 0.897436 0.102564 +vt 0.230769 0.948718 +vt 0.846154 0.282051 +vt 0.076923 0.948718 +vt 0.384615 0.923077 +vt 0.923077 0.487180 +vt 0.923077 0.461539 +vt 0.333333 0.871795 +vt 0.153846 0.897436 +vt 0.948718 0.589744 +vt 0.923077 0.384616 +vt 0.358974 0.923077 +vt 0.410256 0.666667 +vt 0.435897 0.615385 +vt 0.487179 0.666667 +vt 0.487179 0.692308 +vt 0.487179 0.717949 +vt 0.461538 0.717949 +vt 0.461538 0.692308 +vt 0.435897 0.692308 +vt 0.461538 0.641026 +vt 0.153846 0.897436 +vt 0.333333 0.923077 +vt 0.333333 0.948718 +vt 0.025641 0.948718 +vt 0.948718 0.794872 +vt 0.897436 0.153846 +vt 0.923077 0.307692 +vt 0.923077 0.358974 +vt 0.948718 0.076923 +vt 0.948718 0.384615 +vt 0.435897 0.948718 +vt 0.948718 0.897436 +vt 0.948718 0.128205 +vt 0.794872 0.179487 +vt 0.846154 0.179487 +vt 0.846154 0.205128 +vt 0.820513 0.256410 +vt 0.794872 0.256410 +vt 0.769231 0.230769 +vt 0.769231 0.205128 +vt 0.897436 0.153846 +vt 0.923077 0.153846 +vt 0.923077 0.205128 +vt 0.384615 0.948718 +vt 0.948718 0.564103 +vt 0.256410 0.923077 +vt 0.948718 0.435897 +vt 0.461538 0.948718 +vt 0.846154 0.256410 +vt 0.846154 0.282051 +vt 0.846154 0.307692 +vt 0.820513 0.333333 +vt 0.794872 0.333333 +vt 0.820513 0.256410 +vt 0.435897 0.897436 +vt 0.435897 0.871795 +vt 0.307692 0.948718 +vt 0.256410 0.948718 +vt 0.384615 0.871795 +vt 0.897436 0.205128 +vt 0.948718 0.487180 +vt 0.487179 0.948718 +vt 0.923077 0.282051 +vt 0.923077 0.256410 +vt 0.897436 0.256410 +vt 0.923077 0.512821 +vt 0.692308 0.205128 +vt 0.666667 0.230769 +vt 0.512821 0.256410 +vt 0.641026 0.230769 +vt 0.692308 0.025641 +vt 0.692308 0.051282 +vt 0.666667 0.025641 +vt 0.641026 0.025641 +vt 0.641026 0.179487 +vt 0.692308 0.179487 +vt 0.666667 0.205128 +vt 0.641026 0.205128 +vt 0.615385 0.230769 +vt 0.589744 0.230769 +vt 0.641026 0.051282 +vt 0.615385 0.051282 +vt 0.538462 0.230769 +vt 0.564103 0.230769 +vt 0.615385 0.025641 +vt 0.589744 0.025641 +vt 0.589744 0.051282 +vt 0.564103 0.051282 +vt 0.564103 0.025641 +vt 0.538462 0.128205 +vt 0.538462 0.153846 +vt 0.538462 0.205128 +vt 0.538462 0.025641 +vt 0.538462 0.051282 +vt 0.564103 0.076923 +vt 0.564103 0.102564 +vt 0.282051 0.948718 +vt 0.307692 0.923077 +vt 0.205128 0.948718 +vt 0.871795 0.435898 +vt 0.897436 0.435898 +vt 0.282051 0.871795 +vt 0.974359 0.025641 +vt 0.512821 0.717949 +vt 0.948718 0.538462 +vt 0.256410 0.307692 +vt 0.487179 0.717949 +vt 0.512821 0.717949 +vt 0.512821 0.743590 +vt 0.512821 0.769231 +vt 0.461538 0.743590 +vt 0.487179 0.794872 +vt 0.461538 0.794872 +vt 0.461538 0.846154 +vt 0.487179 0.794872 +vt 0.435897 0.794872 +vt 0.512821 0.846154 +vt 0.487180 0.846154 +vt 0.948718 0.948718 +vt 0.948718 0.743590 +vt 0.820513 0.179487 +vt 0.794872 0.179487 +vt 0.820513 0.102564 +vt 0.846154 0.102564 +vt 0.871795 0.487180 +vt 0.871795 0.461538 +vt 0.871795 0.435897 +vt 0.846154 0.435897 +vt 0.820513 0.461538 +vt 0.820513 0.512820 +vt 0.846154 0.512820 +vt 0.128205 0.948718 +vt 0.897436 0.512821 +vt 0.000000 0.846154 +vt 0.948718 0.307692 +vt 0.487179 0.846154 +vt 0.871795 0.410256 +vt 0.358974 0.948718 +vt 0.051282 0.948718 +vt 0.025641 0.923077 +vt 0.051282 0.923077 +vt 0.051282 0.846154 +vt 0.025641 0.846154 +vt 0.025641 0.897436 +vt 0.948718 0.333333 +vt 0.948718 0.461539 +vt 0.025641 0.974359 +vt 0.102564 0.948718 +vt 0.948718 0.871795 +vt 0.923077 0.948718 +vt 0.512821 0.923077 +vt 0.179487 0.948718 +vt 0.487179 0.871795 +vt 0.948718 0.846154 +vt 0.794872 0.102564 +vt 0.769231 0.102564 +vt 0.769231 0.153846 +vt 0.948718 0.230769 +vt 0.948718 0.692308 +vt 0.410256 0.948718 +vt 0.153846 0.948718 +vt 0.846154 0.179487 +vt 0.333333 0.897436 +vt 0.333333 0.871795 +vt 0.410256 0.615385 +vt 0.923077 0.435898 +vt 0.384615 0.897436 +vt 0.384615 0.871795 +vt 0.846154 0.384615 +vt 0.820513 0.102564 +vt 0.846154 0.102564 +vt 0.794872 0.076923 +vt 0.820513 0.025641 +vt 0.179487 0.846154 +vt 0.205128 0.871795 +vt 0.230769 0.846154 +vt 0.230769 0.871795 +vt 0.205128 0.897436 +vt 0.948718 0.282051 +vt 0.487180 0.923077 +vt 0.897436 0.256410 +vt 0.435897 0.923077 +vt 0.435897 0.871795 +vt 0.461538 0.923077 +vt 0.948718 0.769231 +vt 0.820513 0.435897 +vt 0.820513 0.461538 +vt 0.794872 0.487179 +vt 0.794872 0.512821 +vt 0.769231 0.512821 +vt 0.948718 0.051282 +vt 0.846154 0.230769 +vt 0.948718 0.410256 +vt 0.512821 0.256410 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +usemtl popcorn_Material +s off +f 9/1/1 90/2/1 124/3/1 +f 19/4/2 168/5/2 167/6/2 +f 54/7/3 161/8/3 125/9/3 +f 170/10/1 171/11/1 132/12/1 +f 158/13/4 171/14/4 156/15/4 +f 120/16/3 55/17/3 39/18/3 +f 33/19/3 194/20/3 208/21/3 +f 13/22/2 162/23/2 128/24/2 +f 136/25/5 111/26/5 198/27/5 +f 175/28/5 197/29/5 196/30/5 +f 5/31/2 6/32/2 4/33/2 +f 132/34/4 190/35/4 97/36/4 +f 174/37/4 102/38/4 173/39/4 +f 198/40/1 36/41/1 200/42/1 +f 64/43/1 61/44/1 172/45/1 +f 170/46/2 157/47/2 7/48/2 +f 116/49/4 68/50/4 195/51/4 +f 155/52/1 85/53/1 47/54/1 +f 42/55/6 2/56/6 151/57/6 +f 60/58/2 105/59/2 175/60/2 +f 28/61/3 180/62/3 29/63/3 +f 72/64/3 199/65/3 109/66/3 +f 186/67/1 187/68/1 94/69/1 +f 131/70/4 58/71/4 171/72/4 +f 59/73/5 101/74/5 99/75/5 +f 144/76/3 145/77/3 207/78/3 +f 199/79/4 62/80/4 61/81/4 +f 161/82/1 92/83/1 125/84/1 +f 4/85/1 44/86/1 122/87/1 +f 109/66/5 110/88/5 34/89/5 +f 76/90/1 149/91/1 212/92/1 +f 211/93/1 35/94/1 111/95/1 +f 206/96/2 144/97/2 104/98/2 +f 160/99/5 52/100/5 51/101/5 +f 174/102/2 160/103/2 159/104/2 +f 43/105/5 82/106/5 38/107/5 +f 46/108/4 44/109/4 45/110/4 +f 113/111/5 212/112/5 112/113/5 +f 108/114/1 72/115/1 33/116/1 +f 139/117/2 196/118/2 200/119/2 +f 75/120/1 28/121/1 27/122/1 +f 119/123/2 147/124/2 107/125/2 +f 184/126/2 15/127/2 166/128/2 +f 117/129/2 208/130/2 115/131/2 +f 136/25/3 177/132/3 65/133/3 +f 106/134/2 205/135/2 79/136/2 +f 85/137/4 15/138/4 47/139/4 +f 34/140/4 208/141/4 194/142/4 +f 183/143/4 67/144/4 66/145/4 +f 46/146/5 94/147/5 16/148/5 +f 60/149/3 48/150/3 50/151/3 +f 105/152/5 60/149/5 193/153/5 +f 63/154/4 197/155/4 175/60/4 +f 80/156/4 118/157/4 79/158/4 +f 154/159/1 84/160/1 153/161/1 +f 195/162/1 34/163/1 194/164/1 +f 86/165/5 169/166/5 85/167/5 +f 187/168/3 45/169/3 129/170/3 +f 60/58/4 100/171/4 59/172/4 +f 68/173/1 144/174/1 195/175/1 +f 114/176/1 150/177/1 37/178/1 +f 7/179/1 158/180/1 156/181/1 +f 31/182/3 191/183/3 32/184/3 +f 121/185/3 154/186/3 153/187/3 +f 20/188/1 60/189/1 59/190/1 +f 191/191/1 103/192/1 21/193/1 +f 173/194/5 23/195/5 172/196/5 +f 90/197/4 139/198/4 124/199/4 +f 49/200/4 50/201/4 48/202/4 +f 23/203/2 176/204/2 172/205/2 +f 127/206/3 128/207/3 126/208/3 +f 159/209/1 51/210/1 123/211/1 +f 73/212/4 136/213/4 54/214/4 +f 34/215/1 113/216/1 112/217/1 +f 67/218/1 141/219/1 203/220/1 +f 177/221/1 54/222/1 65/223/1 +f 100/224/3 20/225/3 59/73/3 +f 203/226/2 182/227/2 140/228/2 +f 149/229/3 75/230/3 27/231/3 +f 191/232/4 204/233/4 188/234/4 +f 176/235/3 134/236/3 135/237/3 +f 41/238/5 2/239/5 83/240/5 +f 163/241/1 169/242/1 99/243/1 +f 102/244/1 134/245/1 23/246/1 +f 25/247/3 53/248/3 26/249/3 +f 185/250/1 14/251/1 184/252/1 +f 26/253/2 10/254/2 9/255/2 +f 62/256/5 33/19/5 195/257/5 +f 51/258/4 176/259/4 123/260/4 +f 116/261/5 117/262/5 115/263/5 +f 199/264/1 148/265/1 109/266/1 +f 82/267/2 179/268/2 120/269/2 +f 127/270/4 75/271/4 113/272/4 +f 113/111/3 76/273/3 148/274/3 +f 139/275/3 200/276/3 36/277/3 +f 6/278/5 45/279/5 44/280/5 +f 165/281/2 3/282/2 154/283/2 +f 188/284/5 95/285/5 96/286/5 +f 11/287/2 112/288/2 27/289/2 +f 70/290/1 145/291/1 206/292/1 +f 128/293/1 93/294/1 126/295/1 +f 1/296/2 2/297/2 152/298/2 +f 133/299/1 63/300/1 175/301/1 +f 114/302/5 138/303/5 52/304/5 +f 148/305/4 72/306/4 109/307/4 +f 131/308/5 206/309/5 104/310/5 +f 107/311/1 146/312/1 209/313/1 +f 32/314/2 18/315/2 56/316/2 +f 72/317/1 76/318/1 110/319/1 +f 110/320/2 113/272/2 34/140/2 +f 35/321/3 73/322/3 36/323/3 +f 12/324/5 53/325/5 92/326/5 +f 73/327/1 25/328/1 36/329/1 +f 46/330/3 4/331/3 122/332/3 +f 1/333/1 41/334/1 40/335/1 +f 141/336/3 183/337/3 182/338/3 +f 78/339/1 215/340/1 117/341/1 +f 97/342/5 19/343/5 167/344/5 +f 171/345/3 7/346/3 156/347/3 +f 15/348/3 17/349/3 56/350/3 +f 100/351/1 192/352/1 101/353/1 +f 10/354/5 91/355/5 90/356/5 +f 162/357/5 180/358/5 93/359/5 +f 8/360/1 49/361/1 48/362/1 +f 203/226/4 214/363/4 114/364/4 +f 45/365/1 167/366/1 168/367/1 +f 151/368/3 40/369/3 42/370/3 +f 101/371/2 50/372/2 99/373/2 +f 190/374/1 57/375/1 131/376/1 +f 33/377/2 109/307/2 195/51/2 +f 178/378/2 138/379/2 150/380/2 +f 147/381/3 80/382/3 24/383/3 +f 56/316/4 185/384/4 164/385/4 +f 205/386/5 103/387/5 189/388/5 +f 118/389/1 216/390/1 119/391/1 +f 94/392/2 129/393/2 16/394/2 +f 131/395/3 132/396/3 58/397/3 +f 66/398/5 203/399/5 140/400/5 +f 24/401/2 65/402/2 133/403/2 +f 164/404/5 184/405/5 166/406/5 +f 98/407/4 187/408/4 129/393/4 +f 21/409/2 22/410/2 20/411/2 +f 84/412/4 121/413/4 153/414/4 +f 55/415/4 38/107/4 39/416/4 +f 79/417/1 205/418/1 115/419/1 +f 204/420/1 31/421/1 30/422/1 +f 150/423/3 214/424/3 203/399/3 +f 111/425/2 36/426/2 198/427/2 +f 38/428/6 120/429/6 39/430/6 +f 83/240/4 40/431/4 41/238/4 +f 9/1/1 10/432/1 90/2/1 +f 19/4/2 104/433/2 168/5/2 +f 54/7/3 11/434/3 161/8/3 +f 66/435/1 140/436/1 52/437/1 +f 89/438/1 174/439/1 55/440/1 +f 174/439/1 173/441/1 55/440/1 +f 66/435/1 52/437/1 89/438/1 +f 55/440/1 182/442/1 183/443/1 +f 66/435/1 89/438/1 55/440/1 +f 55/440/1 183/443/1 66/435/1 +f 97/444/1 43/445/1 132/12/1 +f 43/445/1 55/440/1 173/441/1 +f 132/12/1 43/445/1 170/10/1 +f 171/11/1 58/446/1 132/12/1 +f 170/10/1 43/445/1 173/441/1 +f 158/13/4 172/447/4 171/14/4 +f 120/16/3 179/448/3 55/17/3 +f 208/21/3 215/449/3 77/450/3 +f 33/19/3 195/257/3 194/20/3 +f 208/21/3 77/450/3 33/19/3 +f 13/22/2 181/451/2 162/23/2 +f 63/452/5 65/133/5 136/25/5 +f 136/25/5 211/453/5 111/26/5 +f 198/27/5 63/452/5 136/25/5 +f 196/30/5 88/454/5 175/28/5 +f 88/454/5 49/455/5 175/28/5 +f 49/455/5 87/456/5 175/28/5 +f 5/31/2 167/457/2 6/32/2 +f 132/34/4 57/458/4 190/35/4 +f 174/37/4 135/459/4 102/38/4 +f 200/42/1 196/460/1 198/40/1 +f 196/460/1 197/461/1 198/40/1 +f 171/462/1 172/45/1 61/44/1 +f 172/45/1 176/463/1 64/43/1 +f 176/463/1 52/464/1 64/43/1 +f 170/46/2 173/465/2 157/47/2 +f 195/51/4 33/377/4 116/49/4 +f 33/377/4 77/466/4 116/49/4 +f 77/466/4 78/467/4 116/49/4 +f 116/49/4 69/468/4 68/50/4 +f 155/52/1 86/469/1 85/53/1 +f 42/55/6 83/470/6 2/56/6 +f 209/471/2 146/472/2 197/155/2 +f 175/60/2 87/473/2 8/474/2 +f 209/471/2 197/155/2 105/59/2 +f 197/155/2 175/60/2 105/59/2 +f 8/474/2 60/58/2 175/60/2 +f 28/61/3 202/475/3 180/62/3 +f 72/64/3 210/476/3 199/65/3 +f 186/67/1 130/477/1 187/68/1 +f 171/72/4 207/478/4 131/70/4 +f 207/478/4 70/479/4 131/70/4 +f 59/73/5 100/224/5 101/74/5 +f 207/78/3 171/480/3 144/76/3 +f 171/480/3 61/481/3 144/76/3 +f 61/81/4 64/482/4 199/79/4 +f 64/482/4 138/379/4 199/79/4 +f 199/79/4 210/483/4 108/484/4 +f 62/80/4 144/485/4 61/81/4 +f 199/79/4 108/484/4 62/80/4 +f 161/82/1 12/486/1 92/83/1 +f 4/85/1 6/487/1 44/86/1 +f 109/66/5 72/64/5 110/88/5 +f 76/90/1 213/488/1 149/91/1 +f 211/93/1 74/489/1 35/94/1 +f 206/96/2 145/490/2 144/97/2 +f 160/99/5 89/491/5 52/100/5 +f 174/102/2 89/492/2 160/103/2 +f 43/105/5 163/493/5 82/106/5 +f 130/494/4 186/495/4 46/108/4 +f 46/108/4 122/496/4 44/109/4 +f 45/110/4 130/494/4 46/108/4 +f 113/111/5 76/273/5 212/112/5 +f 108/114/1 210/497/1 72/115/1 +f 139/117/2 88/498/2 196/118/2 +f 75/120/1 202/499/1 28/121/1 +f 119/123/2 216/500/2 147/124/2 +f 184/126/2 14/501/2 15/127/2 +f 117/129/2 215/502/2 208/130/2 +f 136/25/3 112/503/3 177/132/3 +f 106/134/2 103/504/2 205/135/2 +f 85/137/4 169/505/4 15/138/4 +f 34/140/4 110/320/4 208/141/4 +f 183/143/4 142/506/4 67/144/4 +f 46/146/5 186/507/5 94/147/5 +f 192/508/3 105/152/3 60/149/3 +f 60/149/3 8/509/3 48/150/3 +f 50/151/3 192/508/3 60/149/3 +f 193/153/5 106/510/5 79/511/5 +f 79/511/5 118/512/5 119/513/5 +f 107/514/5 209/515/5 105/152/5 +f 79/511/5 119/513/5 107/514/5 +f 60/149/5 22/516/5 193/153/5 +f 193/153/5 79/511/5 107/514/5 +f 107/514/5 105/152/5 193/153/5 +f 63/154/4 198/517/4 197/155/4 +f 80/156/4 81/518/4 118/157/4 +f 154/159/1 3/519/1 84/160/1 +f 195/162/1 109/520/1 34/163/1 +f 86/165/5 18/521/5 169/166/5 +f 187/168/3 130/522/3 45/169/3 +f 60/58/4 105/59/4 100/171/4 +f 104/523/1 144/174/1 68/173/1 +f 144/174/1 62/524/1 195/175/1 +f 114/176/1 214/525/1 150/177/1 +f 7/179/1 157/526/1 158/180/1 +f 31/182/3 143/527/3 191/183/3 +f 121/185/3 165/528/3 154/186/3 +f 20/188/1 22/529/1 60/189/1 +f 191/191/1 188/530/1 103/192/1 +f 188/530/1 187/531/1 103/192/1 +f 187/531/1 189/532/1 103/192/1 +f 103/192/1 106/533/1 21/193/1 +f 106/533/1 193/534/1 21/193/1 +f 21/193/1 100/535/1 32/536/1 +f 21/193/1 32/536/1 191/191/1 +f 158/537/5 157/538/5 173/194/5 +f 173/194/5 102/539/5 23/195/5 +f 172/196/5 158/537/5 173/194/5 +f 90/197/4 91/540/4 139/198/4 +f 49/200/4 88/541/4 50/201/4 +f 23/203/2 134/542/2 176/204/2 +f 127/206/3 13/543/3 128/207/3 +f 159/209/1 160/544/1 51/210/1 +f 92/545/4 53/546/4 54/214/4 +f 53/546/4 201/547/4 73/212/4 +f 73/212/4 74/548/4 211/549/4 +f 53/546/4 73/212/4 54/214/4 +f 54/214/4 125/550/4 92/545/4 +f 136/213/4 65/402/4 54/214/4 +f 73/212/4 211/549/4 136/213/4 +f 136/551/1 24/552/1 112/217/1 +f 24/552/1 34/215/1 112/217/1 +f 67/218/1 142/553/1 141/219/1 +f 177/221/1 11/554/1 54/222/1 +f 100/224/3 21/555/3 20/225/3 +f 203/226/2 141/556/2 182/227/2 +f 149/229/3 213/557/3 75/230/3 +f 191/232/4 143/558/4 204/233/4 +f 135/237/3 174/559/3 176/235/3 +f 174/559/3 159/560/3 176/235/3 +f 159/560/3 123/561/3 176/235/3 +f 41/238/5 152/562/5 2/239/5 +f 178/563/1 140/436/1 182/442/1 +f 182/442/1 55/440/1 181/564/1 +f 55/440/1 179/565/1 180/566/1 +f 181/564/1 55/440/1 180/566/1 +f 43/445/1 97/444/1 5/567/1 +f 97/444/1 167/568/1 5/567/1 +f 5/567/1 46/569/1 43/445/1 +f 46/569/1 16/570/1 43/445/1 +f 43/445/1 16/570/1 163/241/1 +f 137/571/1 64/572/1 13/573/1 +f 64/572/1 178/563/1 13/573/1 +f 13/573/1 127/574/1 137/571/1 +f 29/575/1 180/566/1 179/565/1 +f 53/576/1 29/575/1 179/565/1 +f 181/564/1 13/573/1 178/563/1 +f 16/570/1 129/577/1 96/578/1 +f 181/564/1 178/563/1 182/442/1 +f 91/579/1 26/580/1 179/565/1 +f 26/580/1 53/576/1 179/565/1 +f 16/570/1 96/578/1 165/581/1 +f 121/582/1 95/583/1 56/584/1 +f 163/241/1 16/570/1 165/581/1 +f 121/582/1 56/584/1 164/585/1 +f 163/241/1 165/581/1 121/582/1 +f 50/586/1 88/587/1 179/565/1 +f 88/587/1 139/588/1 179/565/1 +f 50/586/1 179/565/1 163/241/1 +f 139/588/1 91/579/1 179/565/1 +f 163/241/1 121/582/1 164/585/1 +f 166/589/1 15/590/1 163/241/1 +f 15/590/1 169/242/1 163/241/1 +f 163/241/1 164/585/1 166/589/1 +f 99/243/1 50/586/1 163/241/1 +f 169/242/1 18/591/1 59/592/1 +f 169/242/1 59/592/1 99/243/1 +f 102/244/1 135/593/1 134/245/1 +f 25/247/3 201/594/3 53/248/3 +f 185/250/1 17/595/1 14/251/1 +f 9/255/2 36/596/2 26/253/2 +f 36/596/2 25/597/2 26/253/2 +f 62/256/5 108/598/5 33/19/5 +f 51/258/4 52/599/4 176/259/4 +f 116/261/5 78/600/5 117/262/5 +f 199/264/1 138/601/1 148/265/1 +f 82/267/2 163/602/2 179/268/2 +f 127/270/4 126/603/4 93/604/4 +f 180/605/4 202/606/4 75/271/4 +f 127/270/4 93/604/4 180/605/4 +f 113/272/4 137/607/4 127/270/4 +f 213/608/4 76/609/4 113/272/4 +f 127/270/4 180/605/4 75/271/4 +f 75/271/4 213/608/4 113/272/4 +f 76/273/3 71/610/3 148/274/3 +f 148/274/3 138/303/3 64/611/3 +f 64/611/3 137/612/3 148/274/3 +f 137/612/3 113/111/3 148/274/3 +f 36/277/3 9/613/3 139/275/3 +f 9/613/3 124/614/3 139/275/3 +f 6/278/5 167/615/5 45/279/5 +f 165/281/2 96/616/2 3/282/2 +f 129/170/5 187/168/5 96/286/5 +f 187/168/5 188/284/5 96/286/5 +f 188/284/5 204/617/5 30/618/5 +f 17/349/5 56/350/5 95/285/5 +f 188/284/5 30/618/5 17/349/5 +f 84/619/5 3/620/5 96/286/5 +f 188/284/5 17/349/5 95/285/5 +f 95/285/5 84/619/5 96/286/5 +f 28/621/2 29/622/2 27/289/2 +f 29/622/2 12/623/2 11/287/2 +f 27/289/2 29/622/2 11/287/2 +f 12/623/2 161/624/2 11/287/2 +f 11/287/2 177/625/2 112/288/2 +f 112/288/2 212/626/2 149/627/2 +f 112/288/2 149/627/2 27/289/2 +f 70/290/1 207/628/1 145/291/1 +f 128/293/1 162/629/1 93/294/1 +f 1/296/2 151/630/2 2/297/2 +f 133/299/1 65/631/1 63/300/1 +f 37/632/5 138/303/5 114/302/5 +f 138/303/5 64/611/5 52/304/5 +f 148/305/4 71/633/4 72/306/4 +f 131/308/5 70/634/5 206/309/5 +f 107/311/1 147/635/1 146/312/1 +f 30/636/2 31/637/2 32/314/2 +f 32/314/2 100/171/2 59/172/2 +f 18/315/2 86/638/2 155/639/2 +f 32/314/2 59/172/2 18/315/2 +f 17/640/2 30/636/2 32/314/2 +f 18/315/2 155/639/2 56/316/2 +f 56/316/2 17/640/2 32/314/2 +f 72/317/1 71/641/1 76/318/1 +f 110/320/2 76/609/2 113/272/2 +f 35/321/3 74/642/3 73/322/3 +f 12/324/5 29/643/5 53/325/5 +f 73/327/1 201/644/1 25/328/1 +f 46/330/3 5/645/3 4/331/3 +f 1/333/1 152/646/1 41/334/1 +f 141/336/3 142/647/3 183/337/3 +f 78/339/1 77/648/1 215/340/1 +f 97/342/5 190/649/5 19/343/5 +f 171/345/3 170/650/3 7/346/3 +f 155/651/3 47/652/3 15/348/3 +f 15/348/3 14/653/3 17/349/3 +f 56/350/3 155/651/3 15/348/3 +f 100/351/1 105/654/1 192/352/1 +f 10/354/5 26/655/5 91/355/5 +f 162/357/5 181/656/5 180/358/5 +f 8/360/1 87/657/1 49/361/1 +f 114/364/4 52/658/4 203/226/4 +f 52/658/4 140/228/4 203/226/4 +f 168/367/1 98/659/1 45/365/1 +f 98/659/1 129/660/1 45/365/1 +f 151/368/3 1/661/3 40/369/3 +f 101/371/2 192/662/2 50/372/2 +f 104/663/1 19/664/1 131/376/1 +f 19/664/1 190/374/1 131/376/1 +f 33/377/2 72/306/2 109/307/2 +f 64/482/2 138/379/2 178/378/2 +f 138/379/2 37/665/2 150/380/2 +f 147/381/3 216/666/3 81/667/3 +f 80/382/3 110/88/3 34/89/3 +f 147/381/3 81/667/3 80/382/3 +f 197/29/3 146/668/3 147/381/3 +f 133/669/3 175/28/3 197/29/3 +f 80/382/3 34/89/3 24/383/3 +f 24/383/3 133/669/3 197/29/3 +f 197/29/3 147/381/3 24/383/3 +f 56/316/4 17/640/4 185/384/4 +f 189/388/5 98/670/5 68/671/5 +f 98/670/5 168/672/5 68/671/5 +f 168/672/5 104/673/5 68/671/5 +f 68/671/5 69/674/5 189/388/5 +f 69/674/5 205/386/5 189/388/5 +f 118/389/1 81/675/1 216/390/1 +f 94/392/2 187/408/2 129/393/2 +f 131/395/3 57/676/3 132/396/3 +f 66/398/5 67/677/5 203/399/5 +f 24/401/2 136/213/2 65/402/2 +f 164/404/5 185/678/5 184/405/5 +f 98/407/4 189/679/4 187/408/4 +f 21/409/2 193/680/2 22/410/2 +f 84/412/4 95/681/4 121/413/4 +f 55/415/4 43/105/4 38/107/4 +f 205/418/1 69/682/1 115/419/1 +f 69/682/1 116/683/1 115/419/1 +f 115/419/1 208/684/1 79/417/1 +f 208/684/1 110/685/1 79/417/1 +f 110/685/1 80/686/1 79/417/1 +f 204/420/1 143/687/1 31/421/1 +f 140/400/3 178/688/3 203/399/3 +f 178/688/3 150/423/3 203/399/3 +f 111/425/2 35/689/2 36/426/2 +f 38/428/6 82/690/6 120/429/6 +f 83/240/4 42/55/4 40/431/4 diff --git a/mods/x_farming/models/x_farming_crate.obj b/mods/x_farming/models/x_farming_crate.obj new file mode 100644 index 00000000..975beb47 --- /dev/null +++ b/mods/x_farming/models/x_farming_crate.obj @@ -0,0 +1,815 @@ +# Blender v3.3.1 OBJ File: 'crate-empty.blend' +# www.blender.org +mtllib crate-empty.vox.mtl +o crate-empty.vox +v -0.500000 -0.500000 0.500000 +v 0.375000 -0.500000 -0.375000 +v -0.500000 -0.250000 0.375000 +v 0.375000 -0.250000 0.375000 +v 0.375000 -0.125000 -0.375000 +v -0.500000 -0.125000 -0.375000 +v -0.500000 0.000000 0.375000 +v -0.500000 0.000000 -0.375000 +v 0.375000 0.000000 -0.500000 +v -0.500000 0.125000 -0.375000 +v 0.375000 0.125000 -0.500000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.250000 0.375000 +v -0.500000 0.250000 -0.375000 +v 0.375000 0.250000 -0.500000 +v -0.500000 0.375000 -0.375000 +v 0.375000 0.375000 -0.500000 +v -0.375000 -0.437500 0.375000 +v -0.375000 -0.500000 -0.375000 +v 0.500000 -0.500000 -0.500000 +v -0.375000 -0.250000 -0.375000 +v 0.500000 -0.250000 -0.375000 +v -0.375000 -0.250000 -0.500000 +v -0.375000 -0.125000 0.500000 +v 0.500000 -0.125000 -0.375000 +v -0.375000 -0.125000 -0.500000 +v -0.375000 0.000000 0.375000 +v -0.375000 0.000000 0.500000 +v -0.375000 0.000000 -0.500000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.125000 -0.500000 +v 0.500000 0.125000 -0.375000 +v -0.375000 0.250000 0.500000 +v -0.375000 0.250000 -0.500000 +v 0.500000 0.375000 0.375000 +v 0.500000 0.500000 -0.500000 +v 0.187500 -0.500000 0.500000 +v -0.375000 -0.375000 -0.375000 +v -0.375000 -0.250000 0.500000 +v 0.375000 -0.250000 0.500000 +v 0.375000 -0.250000 -0.375000 +v -0.375000 -0.125000 -0.375000 +v 0.375000 -0.125000 0.500000 +v 0.375000 0.000000 0.500000 +v 0.375000 0.000000 -0.375000 +v 0.375000 0.125000 0.500000 +v 0.375000 0.250000 0.500000 +v 0.500000 0.250000 -0.375000 +v 0.375000 0.375000 0.500000 +v -0.375000 0.375000 -0.375000 +v 0.500000 0.375000 -0.375000 +v -0.500000 0.500000 0.500000 +v -0.375000 0.500000 -0.375000 +v 0.375000 -0.437500 0.375000 +v -0.500000 -0.500000 -0.500000 +v -0.375000 -0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.375000 -0.250000 -0.500000 +v 0.375000 0.000000 0.375000 +v 0.500000 0.125000 0.375000 +v 0.375000 0.125000 0.375000 +v -0.375000 0.250000 0.375000 +v 0.500000 0.250000 0.375000 +v -0.500000 0.375000 0.375000 +v -0.375000 0.375000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.375000 -0.500000 0.375000 +v 0.375000 -0.500000 0.375000 +v -0.375000 -0.437500 -0.375000 +v 0.375000 -0.437500 -0.375000 +v 0.375000 -0.125000 0.375000 +v -0.500000 -0.125000 0.375000 +v -0.375000 -0.125000 0.375000 +v 0.500000 -0.125000 0.375000 +v 0.375000 -0.125000 -0.500000 +v -0.375000 0.125000 0.375000 +v 0.375000 0.125000 -0.375000 +v -0.375000 0.375000 0.500000 +v -0.375000 0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 0.375000 -0.375000 +v 0.375000 -0.375000 -0.375000 +v -0.375000 -0.250000 0.375000 +v 0.500000 -0.250000 0.375000 +v -0.500000 -0.250000 -0.375000 +v 0.500000 0.000000 0.375000 +v -0.375000 0.000000 -0.375000 +v 0.500000 0.000000 -0.375000 +v -0.187500 0.250000 0.500000 +v 0.375000 0.250000 0.375000 +v 0.375000 0.250000 -0.375000 +v -0.375000 0.250000 -0.375000 +v 0.500000 0.500000 0.500000 +v 0.375000 0.500000 0.375000 +v -0.375000 0.500000 0.375000 +v 0.375000 0.500000 -0.375000 +v -0.500000 0.500000 -0.500000 +v 0.375000 -0.062500 -0.375000 +v -0.375000 -0.062500 -0.375000 +v 0.375000 -0.062500 0.375000 +v -0.375000 -0.062500 0.375000 +v 0.375000 0.187500 -0.375000 +v -0.375000 0.187500 -0.375000 +v 0.375000 0.187500 0.375000 +v -0.375000 0.187500 0.375000 +v 0.375000 0.437500 -0.375000 +v -0.375000 0.437500 -0.375000 +v 0.375000 0.437500 0.375000 +v -0.375000 0.437500 0.375000 +vt 0.181818 0.877193 +vt 0.000000 0.842105 +vt 0.000000 0.877193 +vt 0.545455 0.964912 +vt 0.727273 0.947368 +vt 0.727273 0.964912 +vt 0.000000 0.280702 +vt 0.030303 0.350877 +vt 0.212121 0.350877 +vt 0.818182 0.070175 +vt 0.787879 0.035088 +vt 0.787879 0.070175 +vt 0.181818 0.982456 +vt 0.363636 0.947368 +vt 0.363636 0.982456 +vt 0.606061 0.771930 +vt 0.636364 0.561404 +vt 0.606061 0.561404 +vt 0.666667 0.491228 +vt 0.696970 0.280702 +vt 0.696970 0.491228 +vt 0.757576 0.771930 +vt 0.787879 0.736842 +vt 0.787879 0.771930 +vt 0.272727 0.456140 +vt 0.318182 0.491228 +vt 0.272727 0.491228 +vt 0.545455 0.912281 +vt 0.363636 0.877193 +vt 0.363636 0.912281 +vt 0.545455 0.912281 +vt 0.727273 0.877193 +vt 0.727273 0.912281 +vt 0.727273 0.631579 +vt 0.757576 0.421053 +vt 0.727273 0.421053 +vt 0.606061 0.771930 +vt 0.787879 0.807018 +vt 0.606061 0.807018 +vt 0.727273 0.912281 +vt 0.757576 0.877193 +vt 0.727273 0.877193 +vt 0.424242 0.771930 +vt 0.242424 0.561404 +vt 0.242424 0.771930 +vt 0.030303 0.140351 +vt 0.030303 0.175439 +vt 0.000000 0.280702 +vt 0.424242 0.807018 +vt 0.242424 0.842105 +vt 0.424242 0.842105 +vt 0.000000 0.561404 +vt 0.242424 0.561404 +vt 0.030303 0.526316 +vt 0.757576 0.631579 +vt 0.727273 0.666667 +vt 0.757576 0.666667 +vt 0.757576 0.842105 +vt 0.727273 0.877193 +vt 0.757576 0.877193 +vt 0.666667 0.543860 +vt 0.484848 0.526316 +vt 0.484848 0.543860 +vt 0.484848 0.526316 +vt 0.666667 0.491228 +vt 0.484848 0.491228 +vt 0.181818 0.947368 +vt 0.363636 0.912281 +vt 0.363636 0.947368 +vt 0.818182 0.315789 +vt 0.787879 0.350877 +vt 0.787879 0.315789 +vt 0.545455 0.877193 +vt 0.363636 0.842105 +vt 0.363636 0.877193 +vt 0.666667 0.491228 +vt 0.484848 0.280702 +vt 0.666667 0.280702 +vt 0.181818 0.982456 +vt 0.000000 0.947368 +vt 0.000000 0.982456 +vt 0.696970 0.701754 +vt 0.727273 0.491228 +vt 0.696970 0.491228 +vt 0.787879 0.912281 +vt 0.757576 0.877193 +vt 0.787879 0.877193 +vt 0.409091 0.280702 +vt 0.454545 0.350877 +vt 0.272727 0.350877 +vt 0.212121 0.701754 +vt 0.242424 0.561404 +vt 0.212121 0.666667 +vt 0.545455 0.912281 +vt 0.363636 0.947368 +vt 0.545455 0.947368 +vt 0.242424 0.280702 +vt 0.454545 0.245614 +vt 0.272727 0.245614 +vt 0.787879 0.140351 +vt 0.818182 0.175439 +vt 0.787879 0.175439 +vt 0.212121 0.245614 +vt 0.242424 0.280702 +vt 0.757576 0.701754 +vt 0.727273 0.666667 +vt 0.727273 0.701754 +vt 0.787879 0.631579 +vt 0.757576 0.421053 +vt 0.787879 0.421053 +vt 0.696970 0.491228 +vt 0.666667 0.701754 +vt 0.696970 0.701754 +vt 0.545455 0.947368 +vt 0.727273 0.912281 +vt 0.545455 0.912281 +vt 0.787879 0.877193 +vt 0.757576 0.842105 +vt 0.757576 0.877193 +vt 0.424242 0.771930 +vt 0.606061 0.807018 +vt 0.424242 0.807018 +vt 0.818182 0.035088 +vt 0.787879 0.000000 +vt 0.787879 0.035088 +vt 0.848485 0.719298 +vt 0.666667 0.736842 +vt 0.666667 0.719298 +vt 0.484848 0.561404 +vt 0.242424 0.561404 +vt 0.454545 0.526316 +vt 0.000000 0.912281 +vt 0.000000 0.877193 +vt 0.045455 0.877193 +vt 0.818182 0.385965 +vt 0.787879 0.350877 +vt 0.787879 0.385965 +vt 0.787879 0.701754 +vt 0.757576 0.666667 +vt 0.757576 0.701754 +vt 0.727273 0.210526 +vt 0.757576 0.421053 +vt 0.757576 0.210526 +vt 0.606061 0.736842 +vt 0.424242 0.771930 +vt 0.606061 0.771930 +vt 0.787879 0.210526 +vt 0.818182 0.175439 +vt 0.818182 0.210526 +vt 0.787879 0.315789 +vt 0.818182 0.280702 +vt 0.818182 0.315789 +vt 0.787879 0.105263 +vt 0.818182 0.140351 +vt 0.787879 0.140351 +vt 0.424242 0.701754 +vt 0.606061 0.736842 +vt 0.424242 0.736842 +vt 0.424242 0.596491 +vt 0.606061 0.631579 +vt 0.606061 0.596491 +vt 0.606061 0.842105 +vt 0.787879 0.807018 +vt 0.787879 0.842105 +vt 0.727273 0.736842 +vt 0.757576 0.771930 +vt 0.727273 0.771930 +vt 0.606061 0.842105 +vt 0.424242 0.807018 +vt 0.606061 0.807018 +vt 0.666667 0.719298 +vt 0.848485 0.701754 +vt 0.666667 0.701754 +vt 0.424242 0.701754 +vt 0.606061 0.666667 +vt 0.606061 0.701754 +vt 0.818182 0.421053 +vt 0.787879 0.385965 +vt 0.787879 0.421053 +vt 0.606061 0.631579 +vt 0.424242 0.666667 +vt 0.606061 0.666667 +vt 0.787879 0.421053 +vt 0.757576 0.210526 +vt 0.787879 0.210526 +vt 0.727273 0.000000 +vt 0.696970 0.035088 +vt 0.484848 0.000000 +vt 0.181818 0.842105 +vt 0.363636 0.877193 +vt 0.363636 0.842105 +vt 0.696970 0.771930 +vt 0.727273 0.736842 +vt 0.727273 0.771930 +vt 0.545455 0.982456 +vt 0.363636 0.947368 +vt 0.545455 0.947368 +vt 0.787879 0.210526 +vt 0.818182 0.245614 +vt 0.787879 0.245614 +vt 0.696970 0.771930 +vt 0.666667 0.736842 +vt 0.696970 0.736842 +vt 0.727273 0.842105 +vt 0.545455 0.877193 +vt 0.727273 0.877193 +vt 0.757576 0.666667 +vt 0.787879 0.631579 +vt 0.787879 0.666667 +vt 0.757576 0.000000 +vt 0.787879 0.210526 +vt 0.757576 0.210526 +vt 0.757576 0.000000 +vt 0.727273 0.210526 +vt 0.757576 0.210526 +vt 0.484848 0.280702 +vt 0.515152 0.245614 +vt 0.727273 0.280702 +vt 0.181818 0.877193 +vt 0.363636 0.912281 +vt 0.181818 0.912281 +vt 0.818182 0.280702 +vt 0.787879 0.245614 +vt 0.787879 0.280702 +vt 0.424242 0.596491 +vt 0.606061 0.561404 +vt 0.606061 0.596491 +vt 0.454545 0.035088 +vt 0.484848 0.280702 +vt 0.484848 0.000000 +vt 0.666667 0.771930 +vt 0.636364 0.561404 +vt 0.666667 0.561404 +vt 0.818182 0.105263 +vt 0.787879 0.070175 +vt 0.787879 0.105263 +vt 0.030303 0.736842 +vt 0.000000 0.842105 +vt 0.030303 0.771930 +vt 0.242424 0.771930 +vt 0.424242 0.807018 +vt 0.242424 0.807018 +vt 0.696970 0.491228 +vt 0.727273 0.280702 +vt 0.727273 0.491228 +vt 0.181818 0.947368 +vt 0.000000 0.912281 +vt 0.000000 0.947368 +vt 0.272727 0.526316 +vt 0.454545 0.491228 +vt 0.454545 0.526316 +vt 0.454545 0.421053 +vt 0.272727 0.456140 +vt 0.272727 0.421053 +vt 0.454545 0.350877 +vt 0.272727 0.385965 +vt 0.272727 0.350877 +vt 0.212121 0.210526 +vt 0.030303 0.245614 +vt 0.030303 0.210526 +vt 0.030303 0.175439 +vt 0.212121 0.140351 +vt 0.212121 0.175439 +vt 0.030303 0.105263 +vt 0.212121 0.070175 +vt 0.212121 0.105263 +vt 0.030303 0.666667 +vt 0.212121 0.631579 +vt 0.212121 0.666667 +vt 0.030303 0.736842 +vt 0.212121 0.701754 +vt 0.212121 0.736842 +vt 0.212121 0.771930 +vt 0.030303 0.807018 +vt 0.030303 0.771930 +vt 0.030303 0.385965 +vt 0.212121 0.350877 +vt 0.212121 0.385965 +vt 0.030303 0.456140 +vt 0.212121 0.421053 +vt 0.212121 0.456140 +vt 0.212121 0.491228 +vt 0.030303 0.526316 +vt 0.030303 0.491228 +vt 1.000000 0.421053 +vt 0.818182 0.210526 +vt 1.000000 0.210526 +vt 1.000000 0.210526 +vt 0.818182 0.000000 +vt 1.000000 0.000000 +vt 0.696970 0.245614 +vt 0.515152 0.035088 +vt 0.696970 0.035088 +vt 0.181818 0.842105 +vt 0.545455 0.947368 +vt 0.212121 0.456140 +vt 0.030303 0.456140 +vt 0.030303 0.491228 +vt 0.212121 0.491228 +vt 0.030303 0.385965 +vt 0.030303 0.421053 +vt 0.212121 0.421053 +vt 0.212121 0.526316 +vt 0.212121 0.385965 +vt 0.818182 0.035088 +vt 0.181818 0.947368 +vt 0.636364 0.771930 +vt 0.666667 0.280702 +vt 0.757576 0.736842 +vt 0.242424 0.280702 +vt 0.272727 0.421053 +vt 0.545455 0.877193 +vt 0.545455 0.877193 +vt 0.757576 0.631579 +vt 0.787879 0.771930 +vt 0.757576 0.912281 +vt 0.424242 0.561404 +vt 0.000000 0.000000 +vt 0.030303 0.070175 +vt 0.030303 0.105263 +vt 0.212121 0.105263 +vt 0.212121 0.210526 +vt 0.030303 0.210526 +vt 0.242424 0.807018 +vt 0.727273 0.631579 +vt 0.727273 0.842105 +vt 0.666667 0.526316 +vt 0.666667 0.526316 +vt 0.181818 0.912281 +vt 0.818182 0.350877 +vt 0.545455 0.842105 +vt 0.484848 0.491228 +vt 0.181818 0.947368 +vt 0.727273 0.701754 +vt 0.757576 0.912281 +vt 0.484848 0.280702 +vt 0.212121 0.736842 +vt 0.242424 0.842105 +vt 0.212121 0.771930 +vt 0.212121 0.807018 +vt 0.030303 0.807018 +vt 0.000000 0.561404 +vt 0.212121 0.631579 +vt 0.030303 0.666667 +vt 0.363636 0.912281 +vt 0.272727 0.035088 +vt 0.242424 0.000000 +vt 0.818182 0.140351 +vt 0.212121 0.175439 +vt 0.212121 0.140351 +vt 0.242424 0.000000 +vt 0.212121 0.070175 +vt 0.030303 0.245614 +vt 0.757576 0.666667 +vt 0.757576 0.631579 +vt 0.666667 0.491228 +vt 0.727273 0.947368 +vt 0.787879 0.842105 +vt 0.606061 0.771930 +vt 0.818182 0.000000 +vt 0.848485 0.736842 +vt 0.272727 0.385965 +vt 0.454545 0.456140 +vt 0.454545 0.491228 +vt 0.454545 0.421053 +vt 0.454545 0.385965 +vt 0.272727 0.526316 +vt 0.181818 0.877193 +vt 0.181818 0.912281 +vt 0.818182 0.350877 +vt 0.787879 0.666667 +vt 0.727273 0.421053 +vt 0.424242 0.736842 +vt 0.787879 0.175439 +vt 0.787879 0.280702 +vt 0.818182 0.105263 +vt 0.606061 0.701754 +vt 0.424242 0.631579 +vt 0.606061 0.807018 +vt 0.757576 0.736842 +vt 0.424242 0.842105 +vt 0.848485 0.719298 +vt 0.424242 0.666667 +vt 0.818182 0.385965 +vt 0.424242 0.631579 +vt 0.757576 0.421053 +vt 0.696970 0.245614 +vt 0.515152 0.035088 +vt 0.181818 0.877193 +vt 0.696970 0.736842 +vt 0.363636 0.982456 +vt 0.818182 0.210526 +vt 0.666667 0.771930 +vt 0.545455 0.842105 +vt 0.757576 0.631579 +vt 0.787879 0.000000 +vt 0.727273 0.000000 +vt 0.363636 0.877193 +vt 0.818182 0.245614 +vt 0.424242 0.561404 +vt 0.409091 0.000000 +vt 0.636364 0.771930 +vt 0.818182 0.070175 +vt 0.030303 0.701754 +vt 0.030303 0.631579 +vt 0.424242 0.771930 +vt 0.696970 0.280702 +vt 0.181818 0.912281 +vt 0.272727 0.491228 +vt 0.454545 0.456140 +vt 0.454545 0.385965 +vt 0.212121 0.245614 +vt 0.030303 0.140351 +vt 0.030303 0.070175 +vt 0.030303 0.631579 +vt 0.030303 0.701754 +vt 0.212121 0.807018 +vt 0.030303 0.350877 +vt 0.030303 0.421053 +vt 0.212121 0.526316 +vt 0.818182 0.421053 +vt 0.818182 0.210526 +vt 0.515152 0.245614 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +usemtl crate-empty.vox_Material +s off +f 42/1/1 58/2/1 4/3/1 +f 70/4/2 2/5/2 71/6/2 +f 1/7/1 3/8/1 86/9/1 +f 80/10/3 13/11/3 65/12/3 +f 29/13/4 46/14/4 9/15/4 +f 6/16/5 74/17/5 73/18/5 +f 86/19/4 84/20/4 21/21/4 +f 43/22/6 23/23/6 26/24/6 +f 30/25/2 90/26/2 34/27/2 +f 60/28/3 74/29/3 27/30/3 +f 84/31/4 41/32/4 4/33/4 +f 82/34/5 36/35/5 81/36/5 +f 28/37/4 60/38/4 27/39/4 +f 5/40/1 59/41/1 42/42/1 +f 71/43/5 18/44/5 70/45/5 +f 87/46/6 61/47/6 94/48/6 +f 58/49/3 84/50/3 4/51/3 +f 53/52/1 98/53/1 65/54/1 +f 4/55/1 44/56/1 72/57/1 +f 60/58/1 47/59/1 62/60/1 +f 71/61/1 69/62/1 55/63/1 +f 96/64/3 81/65/3 80/66/3 +f 23/67/4 42/68/4 59/69/4 +f 35/70/6 51/71/6 93/72/6 +f 46/73/1 72/74/1 60/75/1 +f 83/76/4 57/77/4 58/78/4 +f 17/79/5 51/80/5 66/81/5 +f 10/82/5 77/83/5 12/84/5 +f 25/85/2 42/86/2 22/87/2 +f 38/88/2 41/89/2 40/90/2 +f 9/91/3 20/92/3 76/93/3 +f 5/94/5 26/95/5 76/96/5 +f 56/97/5 2/98/5 19/99/5 +f 88/100/6 32/101/6 31/102/6 +f 52/103/6 37/104/6 94/48/6 +f 74/105/3 3/106/3 73/107/3 +f 49/108/4 91/109/4 64/110/4 +f 80/111/5 16/112/5 51/113/5 +f 32/114/5 78/115/5 31/116/5 +f 75/117/3 4/118/3 72/119/3 +f 39/120/2 42/121/2 21/122/2 +f 81/123/1 48/124/1 50/125/1 +f 19/126/6 18/127/6 68/128/6 +f 94/129/2 53/130/2 50/131/2 +f 63/132/4 34/133/4 90/134/4 +f 36/135/3 91/136/3 81/137/3 +f 77/138/3 7/139/3 12/140/3 +f 62/141/5 33/142/5 61/143/5 +f 62/144/3 63/145/3 91/146/3 +f 79/147/6 63/148/6 80/149/6 +f 82/150/2 49/151/2 52/152/2 +f 46/153/2 33/154/2 78/155/2 +f 80/156/6 54/157/6 96/158/6 +f 62/159/1 92/160/1 78/161/1 +f 27/162/6 43/163/6 88/164/6 +f 8/165/2 31/166/2 10/167/2 +f 21/168/6 57/169/6 39/170/6 +f 18/171/3 69/172/3 68/173/3 +f 63/174/6 31/175/6 93/176/6 +f 17/177/1 92/178/1 82/179/1 +f 82/180/1 95/181/1 97/182/1 +f 89/183/4 60/184/4 87/185/4 +f 94/186/4 95/187/4 53/188/4 +f 30/189/5 62/190/5 47/191/5 +f 6/192/2 21/193/2 43/194/2 +f 15/195/4 93/196/4 92/197/4 +f 14/198/2 51/199/2 16/200/2 +f 74/201/6 40/202/6 84/203/6 +f 44/204/5 74/205/5 72/206/5 +f 30/207/6 27/208/6 77/209/6 +f 4/210/4 22/211/4 42/212/4 +f 75/213/5 5/214/5 25/215/5 +f 98/216/4 54/217/4 37/218/4 +f 43/219/2 46/220/2 88/221/2 +f 11/222/1 46/223/1 78/224/1 +f 54/225/2 82/226/2 97/227/2 +f 69/228/5 20/229/5 67/230/5 +f 93/231/4 13/232/4 63/233/4 +f 61/234/3 60/235/3 62/236/3 +f 32/237/3 98/238/3 35/239/3 +f 31/240/2 92/241/2 93/242/2 +f 8/243/4 27/244/4 88/245/4 +f 81/246/5 79/247/5 80/248/5 +f 91/249/2 80/250/2 63/251/2 +f 60/252/2 77/253/2 27/254/2 +f 4/255/2 74/256/2 84/257/2 +f 91/258/1 82/259/1 92/260/1 +f 46/261/6 62/262/6 60/263/6 +f 42/264/6 72/265/6 4/266/6 +f 42/267/2 43/268/2 21/269/2 +f 46/270/2 31/271/2 88/272/2 +f 92/273/2 51/274/2 93/275/2 +f 21/276/6 74/277/6 84/278/6 +f 88/279/6 77/280/6 27/281/6 +f 93/282/6 80/283/6 63/284/6 +f 101/285/4 100/286/4 102/287/4 +f 105/288/4 104/289/4 106/290/4 +f 109/291/4 108/292/4 110/293/4 +f 42/1/1 83/294/1 58/2/1 +f 70/4/2 19/295/2 2/5/2 +f 10/296/1 12/297/1 13/298/1 +f 10/296/1 13/298/1 14/299/1 +f 73/300/1 7/301/1 8/302/1 +f 10/296/1 14/299/1 98/53/1 +f 14/299/1 16/303/1 98/53/1 +f 10/296/1 98/53/1 8/302/1 +f 6/304/1 73/300/1 8/302/1 +f 8/302/1 98/53/1 56/97/1 +f 86/9/1 6/304/1 56/97/1 +f 6/304/1 8/302/1 56/97/1 +f 16/303/1 65/54/1 98/53/1 +f 56/97/1 1/7/1 86/9/1 +f 80/10/3 63/305/3 13/11/3 +f 29/13/4 88/306/4 46/14/4 +f 6/16/5 43/307/5 74/17/5 +f 86/19/4 3/308/4 84/20/4 +f 43/22/6 21/309/6 23/23/6 +f 34/27/2 53/130/2 30/25/2 +f 53/130/2 1/310/2 28/311/2 +f 30/25/2 53/130/2 28/311/2 +f 60/28/3 72/312/3 74/29/3 +f 84/31/4 40/313/4 41/32/4 +f 82/34/5 52/314/5 36/35/5 +f 28/37/4 45/315/4 60/38/4 +f 5/40/1 76/316/1 59/41/1 +f 71/43/5 55/317/5 18/44/5 +f 94/48/6 67/318/6 87/46/6 +f 67/318/6 85/319/6 75/320/6 +f 75/320/6 25/321/6 87/46/6 +f 67/318/6 75/320/6 87/46/6 +f 61/47/6 49/322/6 64/323/6 +f 61/47/6 64/323/6 94/48/6 +f 58/49/3 57/324/3 84/50/3 +f 65/54/1 13/298/1 53/52/1 +f 13/298/1 12/297/1 53/52/1 +f 53/52/1 12/297/1 7/301/1 +f 7/301/1 73/300/1 1/7/1 +f 73/300/1 3/8/1 1/7/1 +f 53/52/1 7/301/1 1/7/1 +f 4/55/1 41/325/1 44/56/1 +f 60/58/1 45/326/1 47/59/1 +f 71/61/1 2/327/1 69/62/1 +f 96/64/3 95/328/3 81/65/3 +f 23/67/4 21/329/4 42/68/4 +f 35/70/6 66/330/6 51/71/6 +f 46/73/1 5/331/1 72/74/1 +f 83/76/4 39/332/4 57/77/4 +f 17/79/5 82/333/5 51/80/5 +f 10/82/5 31/334/5 77/83/5 +f 25/85/2 5/335/2 42/86/2 +f 38/88/2 67/336/2 41/89/2 +f 9/91/3 11/337/3 37/338/3 +f 11/337/3 15/339/3 37/338/3 +f 9/91/3 37/338/3 20/92/3 +f 17/340/3 66/341/3 37/338/3 +f 15/339/3 17/340/3 37/338/3 +f 20/92/3 56/342/3 59/343/3 +f 76/93/3 26/344/3 9/91/3 +f 20/92/3 59/343/3 76/93/3 +f 5/94/5 43/345/5 26/95/5 +f 68/346/5 1/347/5 56/97/5 +f 56/97/5 20/229/5 2/98/5 +f 19/99/5 68/346/5 56/97/5 +f 88/100/6 29/348/6 32/101/6 +f 49/322/6 61/47/6 33/349/6 +f 89/350/6 87/46/6 25/321/6 +f 52/103/6 49/322/6 37/104/6 +f 49/322/6 33/349/6 37/104/6 +f 37/104/6 33/349/6 89/350/6 +f 89/350/6 25/321/6 20/351/6 +f 25/321/6 22/352/6 20/351/6 +f 37/104/6 89/350/6 20/351/6 +f 22/352/6 85/319/6 67/318/6 +f 22/352/6 67/318/6 20/351/6 +f 94/48/6 64/323/6 36/353/6 +f 94/48/6 36/353/6 52/103/6 +f 74/105/3 84/354/3 3/106/3 +f 49/108/4 92/355/4 91/109/4 +f 80/111/5 65/356/5 16/112/5 +f 32/114/5 11/357/5 78/115/5 +f 75/117/3 85/358/3 4/118/3 +f 39/120/2 83/359/2 42/121/2 +f 81/123/1 91/360/1 48/124/1 +f 19/126/6 70/361/6 18/127/6 +f 1/310/2 38/88/2 40/90/2 +f 1/310/2 40/90/2 24/362/2 +f 90/26/2 30/25/2 47/363/2 +f 48/364/2 90/26/2 47/363/2 +f 48/364/2 47/363/2 94/129/2 +f 47/363/2 45/365/2 94/129/2 +f 50/131/2 48/364/2 94/129/2 +f 28/311/2 1/310/2 24/362/2 +f 44/366/2 41/89/2 67/336/2 +f 28/311/2 24/362/2 44/366/2 +f 45/365/2 28/311/2 44/366/2 +f 44/366/2 67/336/2 45/365/2 +f 67/336/2 94/129/2 45/365/2 +f 53/130/2 34/27/2 79/367/2 +f 53/130/2 79/367/2 50/131/2 +f 48/368/4 91/369/4 90/134/4 +f 91/369/4 63/132/4 90/134/4 +f 36/135/3 64/370/3 91/136/3 +f 77/138/3 27/371/3 7/139/3 +f 62/141/5 78/372/5 33/142/5 +f 62/144/3 77/373/3 63/145/3 +f 79/147/6 34/374/6 63/148/6 +f 82/150/2 92/375/2 49/151/2 +f 46/153/2 89/376/2 33/154/2 +f 80/156/6 51/377/6 54/157/6 +f 62/159/1 91/378/1 92/160/1 +f 27/162/6 74/379/6 43/163/6 +f 8/165/2 88/380/2 31/166/2 +f 21/168/6 84/381/6 57/169/6 +f 18/171/3 55/382/3 69/172/3 +f 63/174/6 77/383/6 31/175/6 +f 17/177/1 15/384/1 92/178/1 +f 82/180/1 81/385/1 95/181/1 +f 89/183/4 46/386/4 60/184/4 +f 94/186/4 37/218/4 97/387/4 +f 95/187/4 96/388/4 53/188/4 +f 94/186/4 97/387/4 95/187/4 +f 30/189/5 77/389/5 62/190/5 +f 6/192/2 86/390/2 21/193/2 +f 15/195/4 35/391/4 93/196/4 +f 14/198/2 93/392/2 51/199/2 +f 74/201/6 24/393/6 40/202/6 +f 44/204/5 24/394/5 74/205/5 +f 30/207/6 28/395/6 27/208/6 +f 4/210/4 85/396/4 22/211/4 +f 75/213/5 72/397/5 5/214/5 +f 98/216/4 53/188/4 96/388/4 +f 54/217/4 97/387/4 37/218/4 +f 98/216/4 96/388/4 54/217/4 +f 43/219/2 5/398/2 46/220/2 +f 11/222/1 9/399/1 46/223/1 +f 54/225/2 51/400/2 82/226/2 +f 69/228/5 2/98/5 20/229/5 +f 67/230/5 38/401/5 69/228/5 +f 38/401/5 1/347/5 68/346/5 +f 69/228/5 38/401/5 68/346/5 +f 93/231/4 14/402/4 13/232/4 +f 61/234/3 87/403/3 60/235/3 +f 29/404/3 9/91/3 26/344/3 +f 23/405/3 59/343/3 56/342/3 +f 32/237/3 29/404/3 98/238/3 +f 29/404/3 26/344/3 56/342/3 +f 98/238/3 29/404/3 56/342/3 +f 26/344/3 23/405/3 56/342/3 +f 98/238/3 37/338/3 66/341/3 +f 35/239/3 15/339/3 11/337/3 +f 98/238/3 66/341/3 35/239/3 +f 35/239/3 11/337/3 32/237/3 +f 31/240/2 78/406/2 92/241/2 +f 8/243/4 7/407/4 27/244/4 +f 81/246/5 50/408/5 79/247/5 +f 91/249/2 81/409/2 80/250/2 +f 60/252/2 62/410/2 77/253/2 +f 4/255/2 72/411/2 74/256/2 +f 91/258/1 81/412/1 82/259/1 +f 46/261/6 78/413/6 62/262/6 +f 42/264/6 5/414/6 72/265/6 +f 42/267/2 5/415/2 43/268/2 +f 46/270/2 78/416/2 31/271/2 +f 92/273/2 82/417/2 51/274/2 +f 21/276/6 43/418/6 74/277/6 +f 88/279/6 31/419/6 77/280/6 +f 93/282/6 51/420/6 80/283/6 +f 101/285/4 99/421/4 100/286/4 +f 105/288/4 103/422/4 104/289/4 +f 109/291/4 107/423/4 108/292/4 diff --git a/mods/x_farming/models/x_farming_donut.obj b/mods/x_farming/models/x_farming_donut.obj new file mode 100644 index 00000000..2c4d1e03 --- /dev/null +++ b/mods/x_farming/models/x_farming_donut.obj @@ -0,0 +1,1444 @@ +# Blender v3.3.0 OBJ File: 'donut-chocolate.blend' +# www.blender.org +mtllib donut--chocolate.mtl +o donut--chocolate +v -0.150000 -0.499900 0.180000 +v -0.180000 -0.499900 0.180000 +v 0.060000 -0.469900 0.090000 +v 0.060000 -0.499900 0.090000 +v -0.240000 -0.499900 -0.090000 +v -0.210000 -0.499900 -0.090000 +v -0.210000 -0.469900 -0.090000 +v 0.060000 -0.469900 -0.090000 +v 0.060000 -0.469900 -0.120000 +v -0.180000 -0.499900 -0.180000 +v -0.150000 -0.499900 -0.210000 +v -0.090000 -0.469900 -0.210000 +v -0.090000 -0.499900 -0.240000 +v -0.240000 -0.469900 0.120000 +v -0.240000 -0.469900 0.090000 +v 0.030000 -0.469900 0.120000 +v 0.090000 -0.469900 0.060000 +v 0.120000 -0.469900 0.030000 +v -0.240000 -0.469900 -0.090000 +v 0.030000 -0.469900 -0.090000 +v 0.030000 -0.469900 -0.120000 +v -0.120000 -0.469900 -0.240000 +v -0.120000 -0.379900 0.240000 +v 0.030000 -0.379900 0.090000 +v -0.090000 -0.349900 0.210000 +v -0.150000 -0.349900 0.210000 +v -0.210000 -0.379900 0.120000 +v -0.210000 -0.379900 0.090000 +v 0.060000 -0.379900 0.120000 +v 0.090000 -0.349900 0.060000 +v 0.120000 -0.349900 0.060000 +v 0.120000 -0.379900 -0.030000 +v 0.120000 -0.349900 -0.060000 +v -0.240000 -0.379900 -0.090000 +v -0.180000 -0.349900 -0.180000 +v -0.150000 -0.349900 -0.210000 +v -0.090000 -0.349900 -0.240000 +v -0.090000 -0.379900 -0.240000 +v 0.090000 -0.499900 0.240000 +v 0.090000 -0.469900 0.210000 +v -0.060000 -0.499900 0.090000 +v -0.060000 -0.469900 0.120000 +v 0.210000 -0.469900 0.090000 +v -0.090000 -0.499900 0.090000 +v -0.090000 -0.499900 0.060000 +v 0.240000 -0.499900 0.090000 +v -0.120000 -0.469900 -0.060000 +v -0.090000 -0.469900 -0.060000 +v 0.240000 -0.499900 -0.090000 +v 0.180000 -0.499900 -0.150000 +v 0.180000 -0.499900 -0.180000 +v -0.030000 -0.469900 0.090000 +v 0.240000 -0.469900 0.090000 +v -0.090000 -0.469900 0.060000 +v -0.090000 -0.469900 0.030000 +v -0.120000 -0.469900 -0.030000 +v -0.090000 -0.469900 -0.030000 +v 0.240000 -0.469900 -0.090000 +v -0.030000 -0.469900 -0.090000 +v 0.120000 -0.379900 0.240000 +v -0.090000 -0.379900 0.060000 +v 0.240000 -0.379900 -0.120000 +v 0.120000 -0.379900 -0.210000 +v 0.090000 -0.349900 0.240000 +v -0.060000 -0.349900 0.120000 +v 0.240000 -0.379900 0.090000 +v -0.120000 -0.379900 0.060000 +v -0.120000 -0.349900 -0.060000 +v -0.090000 -0.379900 -0.060000 +v 0.240000 -0.379900 -0.090000 +v 0.240000 -0.349900 -0.090000 +v 0.210000 -0.379900 -0.090000 +v -0.090000 -0.499900 0.240000 +v -0.150000 -0.499900 0.210000 +v -0.090000 -0.499900 0.210000 +v -0.090000 -0.469900 0.210000 +v -0.120000 -0.469900 0.210000 +v 0.120000 -0.469900 0.210000 +v 0.150000 -0.499900 0.180000 +v 0.180000 -0.499900 0.180000 +v -0.210000 -0.499900 0.150000 +v 0.210000 -0.499900 0.150000 +v -0.210000 -0.469900 0.090000 +v 0.210000 -0.499900 0.090000 +v -0.090000 -0.499900 -0.060000 +v 0.090000 -0.499900 -0.060000 +v 0.120000 -0.469900 -0.060000 +v 0.090000 -0.469900 -0.060000 +v -0.060000 -0.499900 -0.090000 +v -0.060000 -0.499900 -0.120000 +v -0.090000 -0.469900 0.240000 +v 0.090000 -0.469900 0.240000 +v -0.210000 -0.469900 0.120000 +v 0.210000 -0.469900 0.120000 +v 0.240000 -0.469900 0.120000 +v 0.090000 -0.469900 -0.030000 +v -0.060000 -0.469900 -0.090000 +v -0.090000 -0.379900 0.240000 +v -0.240000 -0.379900 0.120000 +v 0.240000 -0.379900 0.120000 +v 0.210000 -0.379900 0.120000 +v -0.120000 -0.379900 -0.030000 +v 0.090000 -0.379900 -0.030000 +v -0.060000 -0.379900 -0.090000 +v 0.030000 -0.379900 -0.090000 +v 0.060000 -0.379900 -0.090000 +v -0.090000 -0.349900 0.240000 +v 0.090000 -0.379900 0.240000 +v -0.120000 -0.379900 0.210000 +v 0.090000 -0.379900 0.210000 +v 0.120000 -0.379900 0.210000 +v 0.150000 -0.349900 0.210000 +v -0.180000 -0.349900 0.180000 +v 0.150000 -0.349900 0.180000 +v -0.240000 -0.379900 0.090000 +v -0.240000 -0.349900 0.090000 +v 0.210000 -0.379900 0.090000 +v 0.240000 -0.349900 0.090000 +v 0.090000 -0.379900 -0.060000 +v -0.060000 -0.349900 -0.090000 +v -0.060000 -0.379900 -0.120000 +v -0.030000 -0.379900 -0.120000 +v 0.030000 -0.379900 -0.120000 +v 0.060000 -0.379900 -0.120000 +v -0.060000 -0.499900 0.120000 +v 0.060000 -0.499900 0.120000 +v 0.090000 -0.499900 0.060000 +v 0.120000 -0.469900 0.060000 +v 0.210000 -0.469900 -0.090000 +v -0.210000 -0.499900 -0.150000 +v 0.150000 -0.499900 -0.180000 +v 0.090000 -0.469900 -0.210000 +v 0.120000 -0.469900 -0.210000 +v 0.150000 -0.499900 -0.210000 +v -0.090000 -0.469900 -0.240000 +v 0.090000 -0.469900 -0.240000 +v -0.030000 -0.469900 0.120000 +v -0.060000 -0.469900 0.090000 +v -0.210000 -0.469900 -0.120000 +v -0.120000 -0.469900 -0.210000 +v 0.030000 -0.379900 0.120000 +v -0.060000 -0.379900 0.090000 +v -0.030000 -0.379900 0.090000 +v -0.120000 -0.379900 0.030000 +v 0.090000 -0.379900 0.030000 +v 0.120000 -0.379900 0.030000 +v -0.240000 -0.379900 -0.120000 +v -0.060000 -0.379900 0.120000 +v -0.060000 -0.349900 0.090000 +v 0.090000 -0.349900 0.090000 +v -0.120000 -0.349900 0.060000 +v -0.240000 -0.349900 -0.090000 +v 0.210000 -0.349900 -0.090000 +v -0.210000 -0.349900 -0.150000 +v 0.210000 -0.349900 -0.150000 +v -0.150000 -0.349900 -0.180000 +v 0.150000 -0.349900 -0.180000 +v 0.180000 -0.349900 -0.180000 +v -0.090000 -0.379900 -0.210000 +v 0.090000 -0.379900 -0.210000 +v 0.150000 -0.349900 -0.210000 +v 0.090000 -0.349900 -0.240000 +v 0.090000 -0.499900 0.210000 +v 0.150000 -0.499900 0.210000 +v 0.180000 -0.499900 0.150000 +v -0.180000 -0.499900 0.150000 +v 0.090000 -0.499900 0.090000 +v -0.240000 -0.499900 0.090000 +v -0.210000 -0.499900 0.090000 +v -0.120000 -0.499900 0.060000 +v 0.120000 -0.499900 0.060000 +v -0.120000 -0.499900 -0.060000 +v 0.120000 -0.499900 -0.060000 +v 0.210000 -0.499900 -0.090000 +v -0.090000 -0.499900 -0.090000 +v 0.060000 -0.499900 -0.090000 +v 0.090000 -0.499900 -0.090000 +v -0.180000 -0.499900 -0.150000 +v 0.060000 -0.499900 -0.120000 +v 0.210000 -0.499900 -0.150000 +v -0.150000 -0.499900 -0.180000 +v -0.090000 -0.499900 -0.210000 +v 0.090000 -0.499900 -0.240000 +v 0.090000 -0.499900 -0.210000 +v -0.120000 -0.469900 0.240000 +v 0.120000 -0.469900 0.240000 +v 0.030000 -0.469900 0.090000 +v 0.060000 -0.469900 0.120000 +v -0.120000 -0.469900 0.060000 +v -0.120000 -0.469900 0.030000 +v 0.090000 -0.469900 0.030000 +v 0.120000 -0.469900 -0.030000 +v -0.240000 -0.469900 -0.120000 +v -0.060000 -0.469900 -0.120000 +v -0.030000 -0.469900 -0.120000 +v 0.210000 -0.469900 -0.120000 +v 0.240000 -0.469900 -0.120000 +v 0.120000 -0.469900 -0.240000 +v -0.090000 -0.379900 0.210000 +v -0.030000 -0.379900 0.120000 +v 0.060000 -0.379900 0.090000 +v -0.090000 -0.379900 0.030000 +v 0.090000 -0.379900 0.060000 +v 0.120000 -0.379900 0.060000 +v -0.090000 -0.379900 -0.030000 +v -0.120000 -0.379900 -0.060000 +v 0.120000 -0.379900 -0.060000 +v -0.210000 -0.379900 -0.090000 +v -0.210000 -0.379900 -0.120000 +v -0.030000 -0.379900 -0.090000 +v 0.210000 -0.379900 -0.120000 +v -0.120000 -0.379900 -0.210000 +v -0.120000 -0.379900 -0.240000 +v 0.120000 -0.379900 -0.240000 +v 0.090000 -0.379900 -0.240000 +v 0.090000 -0.349900 0.210000 +v -0.150000 -0.349900 0.180000 +v -0.180000 -0.349900 0.150000 +v 0.180000 -0.349900 0.180000 +v -0.210000 -0.349900 0.150000 +v 0.180000 -0.349900 0.150000 +v 0.210000 -0.349900 0.150000 +v 0.060000 -0.349900 0.120000 +v 0.060000 -0.349900 0.090000 +v 0.210000 -0.349900 0.090000 +v -0.210000 -0.349900 0.090000 +v -0.090000 -0.349900 0.090000 +v -0.090000 -0.349900 0.060000 +v -0.090000 -0.349900 -0.060000 +v 0.090000 -0.349900 -0.060000 +v -0.210000 -0.349900 -0.090000 +v -0.090000 -0.349900 -0.090000 +v -0.060000 -0.349900 -0.120000 +v 0.060000 -0.349900 -0.090000 +v 0.090000 -0.349900 -0.090000 +v -0.180000 -0.349900 -0.150000 +v 0.060000 -0.349900 -0.120000 +v 0.180000 -0.349900 -0.150000 +v 0.090000 -0.349900 -0.210000 +v -0.090000 -0.349900 -0.210000 +vt 0.794118 0.323529 +vt 0.764706 0.294118 +vt 0.764706 0.441177 +vt 0.529412 0.911765 +vt 0.500000 0.941177 +vt 0.500000 0.911765 +vt 0.705882 0.911765 +vt 0.735294 0.882353 +vt 0.705882 0.882353 +vt 0.823530 0.588235 +vt 0.794118 0.558824 +vt 0.794118 0.470588 +vt 0.176471 0.941177 +vt 0.147059 0.970588 +vt 0.147059 0.941177 +vt 0.970588 0.588235 +vt 0.941177 0.617647 +vt 0.941177 0.588235 +vt 0.647059 0.911765 +vt 0.617647 0.941177 +vt 0.617647 0.911765 +vt 0.735294 0.941177 +vt 0.764706 0.911765 +vt 0.735294 0.911765 +vt 0.941177 0.088235 +vt 0.970588 0.000000 +vt 0.970588 0.088235 +vt 0.117647 0.176471 +vt 0.029412 0.323529 +vt 0.029412 0.147059 +vt 0.794118 0.941177 +vt 0.823529 0.911765 +vt 0.794118 0.911765 +vt 0.941177 0.352941 +vt 0.911765 0.264706 +vt 0.911765 0.352941 +vt 0.882353 0.882353 +vt 0.852941 0.911765 +vt 0.852941 0.882353 +vt 0.970588 0.676471 +vt 0.941177 0.705882 +vt 0.941177 0.676471 +vt 0.823530 0.441177 +vt 0.794118 0.470588 +vt 0.794118 0.558824 +vt 0.176471 0.970588 +vt 0.205882 0.941177 +vt 0.176471 0.941177 +vt 0.352941 0.176471 +vt 0.441177 0.323529 +vt 0.352941 0.294118 +vt 0.852941 0.882353 +vt 0.882353 0.735294 +vt 0.882353 0.882353 +vt 0.882353 0.588235 +vt 0.911765 0.441177 +vt 0.911765 0.588235 +vt 0.500000 0.558824 +vt 0.676471 0.470588 +vt 0.500000 0.470588 +vt 0.852941 0.558824 +vt 0.823530 0.588235 +vt 0.823530 0.441177 +vt 0.823529 0.941177 +vt 0.852941 0.911765 +vt 0.823529 0.911765 +vt 0.823529 0.147059 +vt 0.823529 0.294118 +vt 0.852941 0.176471 +vt 0.676471 0.117647 +vt 0.500000 0.029412 +vt 0.500000 0.117647 +vt 0.411765 0.852941 +vt 0.441177 0.794118 +vt 0.352941 0.764706 +vt 0.852941 0.882353 +vt 0.823529 0.735294 +vt 0.852941 0.735294 +vt 0.294118 0.823530 +vt 0.176471 0.823530 +vt 0.147059 0.911765 +vt 0.882353 0.911765 +vt 0.911765 0.882353 +vt 0.882353 0.882353 +vt 0.941176 0.764706 +vt 0.970588 0.735294 +vt 0.941176 0.735294 +vt 0.882353 0.294118 +vt 0.911765 0.147059 +vt 0.882353 0.147059 +vt 0.941176 0.911765 +vt 0.911765 0.823530 +vt 0.941176 0.823530 +vt 0.441176 0.970588 +vt 0.470588 0.941177 +vt 0.441176 0.941177 +vt 0.882353 0.294118 +vt 0.852941 0.323529 +vt 0.852941 0.411765 +vt 0.823529 0.911765 +vt 0.852941 0.882353 +vt 0.823529 0.882353 +vt 0.705882 0.882353 +vt 0.735294 0.735294 +vt 0.735294 0.882353 +vt 0.264706 0.941177 +vt 0.235294 0.970588 +vt 0.235294 0.941177 +vt 0.647059 0.882353 +vt 0.676471 0.735294 +vt 0.647059 0.735294 +vt 0.617647 0.705882 +vt 0.588235 0.735294 +vt 0.676471 0.705882 +vt 0.500000 0.882353 +vt 0.470588 0.911765 +vt 0.470588 0.882353 +vt 0.794118 0.911765 +vt 0.823529 0.882353 +vt 0.794118 0.882353 +vt 0.735294 0.911765 +vt 0.705882 0.941177 +vt 0.705882 0.911765 +vt 0.705882 0.911765 +vt 0.676471 0.941177 +vt 0.676471 0.911765 +vt 0.205882 0.970588 +vt 0.235294 0.941177 +vt 0.205882 0.941177 +vt 0.617647 0.941177 +vt 0.588235 0.970588 +vt 0.588235 0.941177 +vt 0.676471 0.323529 +vt 0.676471 0.411765 +vt 0.500000 0.411765 +vt 0.500000 0.705882 +vt 0.558824 0.617647 +vt 0.558824 0.705882 +vt 0.852941 0.941177 +vt 0.882353 0.911765 +vt 0.852941 0.911765 +vt 0.735294 0.470588 +vt 0.705882 0.441177 +vt 0.735294 0.558824 +vt 0.735294 0.176471 +vt 0.794118 0.176471 +vt 0.705882 0.147059 +vt 0.970588 0.558824 +vt 0.941177 0.588235 +vt 0.941177 0.558824 +vt 0.970588 0.264706 +vt 0.941177 0.176471 +vt 0.970588 0.176471 +vt 0.764706 0.588235 +vt 0.764706 0.735294 +vt 0.735294 0.617647 +vt 0.617647 0.911765 +vt 0.647059 0.882353 +vt 0.617647 0.882353 +vt 0.794118 0.029412 +vt 0.735294 0.029412 +vt 0.823529 0.000000 +vt 0.941177 0.441176 +vt 0.970588 0.352941 +vt 0.941177 0.352941 +vt 0.735294 0.411765 +vt 0.735294 0.323529 +vt 0.705882 0.441177 +vt 0.147059 0.941177 +vt 0.117647 0.970588 +vt 0.117647 0.941177 +vt 0.058824 0.941177 +vt 0.029412 0.970588 +vt 0.029412 0.941177 +vt 0.764706 0.882353 +vt 0.794118 0.735294 +vt 0.764706 0.735294 +vt 0.617647 0.882353 +vt 0.588235 0.911765 +vt 0.588235 0.882353 +vt 0.941177 0.617647 +vt 0.911765 0.529412 +vt 0.941177 0.529412 +vt 0.705882 0.882353 +vt 0.705882 0.735294 +vt 0.676471 0.911765 +vt 0.647059 0.941177 +vt 0.647059 0.911765 +vt 0.558824 0.911765 +vt 0.588235 0.882353 +vt 0.558824 0.882353 +vt 0.882353 0.147059 +vt 0.911765 0.000000 +vt 0.911765 0.147059 +vt 0.411765 0.970588 +vt 0.441176 0.941177 +vt 0.411765 0.941177 +vt 0.911765 0.088235 +vt 0.941177 0.000000 +vt 0.911765 0.000000 +vt 0.500000 0.970588 +vt 0.529412 0.941177 +vt 0.500000 0.941177 +vt 0.794118 0.882353 +vt 0.823530 0.735294 +vt 0.823530 0.882353 +vt 0.500000 0.941177 +vt 0.470588 0.970588 +vt 0.470588 0.941177 +vt 0.941176 0.911765 +vt 0.911765 0.941177 +vt 0.911765 0.911765 +vt 0.529412 0.882353 +vt 0.500000 0.911765 +vt 0.500000 0.882353 +vt 0.470588 0.941177 +vt 0.500000 0.911765 +vt 0.470588 0.911765 +vt 0.823530 0.735294 +vt 0.794118 0.735294 +vt 0.911765 0.264706 +vt 0.941177 0.176471 +vt 0.941177 0.264706 +vt 0.676471 0.911765 +vt 0.705882 0.882353 +vt 0.676471 0.882353 +vt 0.558824 0.970588 +vt 0.588235 0.941177 +vt 0.558824 0.941177 +vt 0.500000 0.176471 +vt 0.676471 0.176471 +vt 0.676471 0.264706 +vt 0.676471 0.882353 +vt 0.705883 0.735294 +vt 0.676471 0.735294 +vt 0.882353 0.882353 +vt 0.911765 0.735294 +vt 0.882353 0.735294 +vt 0.941176 0.823530 +vt 0.911765 0.735294 +vt 0.911765 0.823530 +vt 0.323529 0.941177 +vt 0.294118 0.970588 +vt 0.294118 0.941177 +vt 0.882353 0.941177 +vt 0.911765 0.911765 +vt 0.882353 0.911765 +vt 0.970588 0.647059 +vt 0.941177 0.676471 +vt 0.941177 0.647059 +vt 0.588235 0.882353 +vt 0.558824 0.852941 +vt 0.558824 0.764706 +vt 0.941177 0.529412 +vt 0.911765 0.441177 +vt 0.911765 0.529412 +vt 0.794118 0.882353 +vt 0.764706 0.911765 +vt 0.764706 0.882353 +vt 0.941177 0.647059 +vt 0.970588 0.617647 +vt 0.941177 0.617647 +vt 0.941177 0.441176 +vt 0.911765 0.352941 +vt 0.911765 0.441176 +vt 0.941177 0.176471 +vt 0.911765 0.088235 +vt 0.941177 0.088235 +vt 0.941177 0.705882 +vt 0.911765 0.617647 +vt 0.941177 0.617647 +vt 0.088235 0.941177 +vt 0.058824 0.970588 +vt 0.058824 0.941177 +vt 0.676471 0.970588 +vt 0.705882 0.941177 +vt 0.676471 0.941177 +vt 0.676471 0.941177 +vt 0.647059 0.970588 +vt 0.647059 0.941177 +vt 0.617647 0.970588 +vt 0.647059 0.941177 +vt 0.617647 0.941177 +vt 0.352941 0.941177 +vt 0.323529 0.970588 +vt 0.323529 0.941177 +vt 0.647059 0.911765 +vt 0.676471 0.882353 +vt 0.647059 0.882353 +vt 0.088235 0.970588 +vt 0.117647 0.941177 +vt 0.088235 0.941177 +vt 0.970588 0.352941 +vt 0.941177 0.264706 +vt 0.970588 0.264706 +vt 0.558824 0.882353 +vt 0.529412 0.911765 +vt 0.529412 0.882353 +vt 0.382353 0.970588 +vt 0.411765 0.941177 +vt 0.382353 0.941177 +vt 0.558824 0.941177 +vt 0.588235 0.911765 +vt 0.558824 0.911765 +vt 0.911765 0.441177 +vt 0.882353 0.294118 +vt 0.911765 0.294118 +vt 0.852941 0.117647 +vt 0.882353 0.147059 +vt 0.882353 0.000000 +vt 0.735294 0.470588 +vt 0.735294 0.558824 +vt 0.794118 0.705882 +vt 0.823530 0.735294 +vt 0.823530 0.588235 +vt 0.941177 0.529412 +vt 0.970588 0.441176 +vt 0.941177 0.441176 +vt 0.852941 0.705882 +vt 0.823530 0.735294 +vt 0.823530 0.588235 +vt 0.911765 0.735294 +vt 0.941177 0.705882 +vt 0.911765 0.705882 +vt 0.029412 0.941177 +vt 0.000000 0.970588 +vt 0.000000 0.941177 +vt 0.735294 0.882353 +vt 0.764706 0.735294 +vt 0.764706 0.882353 +vt 0.617647 0.764706 +vt 0.647059 0.735294 +vt 0.647059 0.882353 +vt 0.764706 0.941177 +vt 0.794118 0.911765 +vt 0.764706 0.911765 +vt 0.735294 0.941177 +vt 0.705882 0.970588 +vt 0.705882 0.941177 +vt 0.941177 0.176471 +vt 0.970588 0.088235 +vt 0.941177 0.088235 +vt 0.500000 0.764706 +vt 0.500000 0.852941 +vt 0.470588 0.735294 +vt 0.617647 0.911765 +vt 0.588235 0.941177 +vt 0.588235 0.911765 +vt 0.352941 0.970588 +vt 0.382353 0.941177 +vt 0.352941 0.941177 +vt 0.970588 0.529412 +vt 0.941177 0.558823 +vt 0.941177 0.529412 +vt 0.911765 0.735294 +vt 0.882353 0.588235 +vt 0.882353 0.735294 +vt 0.529412 0.970588 +vt 0.558824 0.941177 +vt 0.529412 0.941177 +vt 0.264706 0.970588 +vt 0.294118 0.941177 +vt 0.264706 0.941177 +vt 0.558824 0.911765 +vt 0.529412 0.941177 +vt 0.529412 0.911765 +vt 0.764706 0.882353 +vt 0.735294 0.911765 +vt 0.735294 0.882353 +vt 0.823530 0.323529 +vt 0.823530 0.294118 +vt 0.823530 0.441177 +vt 0.794118 0.411765 +vt 0.823530 0.411765 +vt 0.529412 0.941177 +vt 0.735294 0.911765 +vt 0.794118 0.441177 +vt 0.794118 0.588235 +vt 0.764706 0.558824 +vt 0.764706 0.470588 +vt 0.176471 0.970588 +vt 0.970588 0.617647 +vt 0.647059 0.941177 +vt 0.764706 0.941177 +vt 0.941177 0.000000 +vt 0.117647 0.294118 +vt 0.147059 0.294118 +vt 0.147059 0.323529 +vt 0.176471 0.323529 +vt 0.176471 0.352941 +vt 0.088235 0.411765 +vt 0.058824 0.411765 +vt 0.058824 0.382353 +vt 0.029412 0.382353 +vt 0.000000 0.323529 +vt 0.000000 0.147059 +vt 0.029412 0.088235 +vt 0.058824 0.088235 +vt 0.058824 0.058824 +vt 0.088235 0.058824 +vt 0.147059 0.147059 +vt 0.147059 0.176471 +vt 0.823529 0.941177 +vt 0.941177 0.264706 +vt 0.882353 0.911765 +vt 0.970588 0.705882 +vt 0.794118 0.588235 +vt 0.794118 0.441177 +vt 0.764706 0.470588 +vt 0.764706 0.558824 +vt 0.205882 0.970588 +vt 0.176471 0.117647 +vt 0.176471 0.147059 +vt 0.088235 0.029412 +vt 0.147059 0.029412 +vt 0.147059 0.000000 +vt 0.323529 0.000000 +vt 0.323529 0.029412 +vt 0.382353 0.029412 +vt 0.382353 0.058824 +vt 0.411765 0.058824 +vt 0.411765 0.088235 +vt 0.441177 0.088235 +vt 0.441177 0.147059 +vt 0.470588 0.147059 +vt 0.470588 0.323529 +vt 0.441177 0.382353 +vt 0.411765 0.382353 +vt 0.323529 0.147059 +vt 0.294118 0.117647 +vt 0.294118 0.147059 +vt 0.323529 0.176471 +vt 0.323529 0.323529 +vt 0.323529 0.294118 +vt 0.294118 0.352941 +vt 0.294118 0.323529 +vt 0.147059 0.441177 +vt 0.088235 0.441177 +vt 0.323529 0.470588 +vt 0.147059 0.470588 +vt 0.382353 0.411765 +vt 0.382353 0.441177 +vt 0.323529 0.441177 +vt 0.411765 0.411765 +vt 0.852941 0.735294 +vt 0.882353 0.441177 +vt 0.500000 0.588235 +vt 0.676471 0.588235 +vt 0.676471 0.558824 +vt 0.705882 0.558824 +vt 0.705882 0.470588 +vt 0.470588 0.470588 +vt 0.470588 0.558824 +vt 0.676471 0.441177 +vt 0.500000 0.441177 +vt 0.882353 0.558824 +vt 0.882353 0.588235 +vt 0.882353 0.441177 +vt 0.852941 0.470588 +vt 0.882353 0.470588 +vt 0.852941 0.941177 +vt 0.882353 0.294118 +vt 0.852941 0.264706 +vt 0.882353 0.264706 +vt 0.882353 0.176471 +vt 0.882353 0.147059 +vt 0.705882 0.117647 +vt 0.705882 0.029412 +vt 0.676471 0.029412 +vt 0.676471 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.147059 +vt 0.676471 0.147059 +vt 0.470588 0.029412 +vt 0.470588 0.117647 +vt 0.470588 0.794118 +vt 0.470588 0.617647 +vt 0.441177 0.617647 +vt 0.352941 0.647059 +vt 0.323529 0.764706 +vt 0.323529 0.794118 +vt 0.441177 0.852941 +vt 0.382353 0.882353 +vt 0.411765 0.882353 +vt 0.823529 0.882353 +vt 0.294118 0.588235 +vt 0.294118 0.617647 +vt 0.323529 0.617647 +vt 0.323529 0.647059 +vt 0.411765 0.558824 +vt 0.441177 0.558824 +vt 0.411765 0.529412 +vt 0.382353 0.529412 +vt 0.382353 0.500000 +vt 0.323529 0.500000 +vt 0.323529 0.470588 +vt 0.147059 0.470588 +vt 0.147059 0.617647 +vt 0.176471 0.617647 +vt 0.176471 0.588235 +vt 0.147059 0.500000 +vt 0.088235 0.500000 +vt 0.088235 0.529412 +vt 0.058824 0.529412 +vt 0.058824 0.558824 +vt 0.029412 0.558824 +vt 0.029412 0.617647 +vt 0.000000 0.617647 +vt 0.000000 0.794118 +vt 0.029412 0.794118 +vt 0.029412 0.852941 +vt 0.058824 0.852941 +vt 0.117647 0.647059 +vt 0.117647 0.764706 +vt 0.058824 0.882353 +vt 0.088235 0.882353 +vt 0.147059 0.647059 +vt 0.147059 0.794118 +vt 0.147059 0.764706 +vt 0.088235 0.911765 +vt 0.147059 0.941177 +vt 0.323529 0.941177 +vt 0.323529 0.911765 +vt 0.382353 0.911765 +vt 0.176471 0.794118 +vt 0.294118 0.794118 +vt 0.911765 0.911765 +vt 0.970588 0.764706 +vt 0.911765 0.294118 +vt 0.911765 0.911765 +vt 0.470588 0.970588 +vt 0.852941 0.441177 +vt 0.882353 0.441177 +vt 0.852941 0.294118 +vt 0.823530 0.323529 +vt 0.823530 0.411765 +vt 0.852941 0.911765 +vt 0.705882 0.735294 +vt 0.264706 0.970588 +vt 0.676471 0.882353 +vt 0.705882 0.588235 +vt 0.588235 0.588235 +vt 0.617647 0.617647 +vt 0.588235 0.617647 +vt 0.676471 0.617647 +vt 0.705882 0.617647 +vt 0.705882 0.735294 +vt 0.705882 0.705882 +vt 0.588235 0.705882 +vt 0.500000 0.911765 +vt 0.823529 0.911765 +vt 0.735294 0.941177 +vt 0.705882 0.941177 +vt 0.235294 0.970588 +vt 0.617647 0.970588 +vt 0.470588 0.411765 +vt 0.470588 0.323529 +vt 0.500000 0.323529 +vt 0.500000 0.294118 +vt 0.676471 0.294118 +vt 0.705882 0.323529 +vt 0.705882 0.411765 +vt 0.676471 0.441177 +vt 0.500000 0.441177 +vt 0.470588 0.588235 +vt 0.588235 0.588235 +vt 0.588235 0.617647 +vt 0.500000 0.617647 +vt 0.470588 0.617647 +vt 0.470588 0.735294 +vt 0.470588 0.705882 +vt 0.588235 0.735294 +vt 0.588235 0.705882 +vt 0.882353 0.941177 +vt 0.764706 0.558824 +vt 0.764706 0.470588 +vt 0.735294 0.441177 +vt 0.705882 0.588235 +vt 0.735294 0.588235 +vt 0.735294 0.264706 +vt 0.705882 0.264706 +vt 0.705882 0.294118 +vt 0.823529 0.294118 +vt 0.794118 0.264706 +vt 0.823529 0.264706 +vt 0.823529 0.176471 +vt 0.823529 0.147059 +vt 0.705882 0.176471 +vt 0.970588 0.588235 +vt 0.941177 0.264706 +vt 0.705882 0.617647 +vt 0.705882 0.588235 +vt 0.705882 0.735294 +vt 0.735294 0.705882 +vt 0.705882 0.705882 +vt 0.647059 0.911765 +vt 0.794118 0.117647 +vt 0.823529 0.117647 +vt 0.823529 0.147059 +vt 0.705882 0.147059 +vt 0.735294 0.117647 +vt 0.705882 0.117647 +vt 0.705882 0.029412 +vt 0.705882 0.000000 +vt 0.823529 0.029412 +vt 0.970588 0.441176 +vt 0.764706 0.411765 +vt 0.764706 0.323529 +vt 0.735294 0.294118 +vt 0.705882 0.294118 +vt 0.735294 0.441177 +vt 0.147059 0.970588 +vt 0.058824 0.970588 +vt 0.794118 0.882353 +vt 0.617647 0.911765 +vt 0.911765 0.617647 +vt 0.676471 0.941177 +vt 0.588235 0.911765 +vt 0.882353 0.000000 +vt 0.441176 0.970588 +vt 0.941177 0.088235 +vt 0.529412 0.970588 +vt 0.500000 0.970588 +vt 0.941176 0.941177 +vt 0.529412 0.911765 +vt 0.500000 0.941177 +vt 0.823530 0.882353 +vt 0.911765 0.176471 +vt 0.705882 0.911765 +vt 0.588235 0.970588 +vt 0.676471 0.294118 +vt 0.500000 0.294118 +vt 0.500000 0.264706 +vt 0.470588 0.264706 +vt 0.470588 0.176471 +vt 0.500000 0.147059 +vt 0.676471 0.147059 +vt 0.705882 0.176471 +vt 0.705882 0.264706 +vt 0.705883 0.882353 +vt 0.911765 0.882353 +vt 0.941176 0.735294 +vt 0.323529 0.970588 +vt 0.911765 0.941177 +vt 0.970588 0.676471 +vt 0.558824 0.735294 +vt 0.588235 0.735294 +vt 0.558824 0.882353 +vt 0.529412 0.852941 +vt 0.529412 0.764706 +vt 0.941177 0.441177 +vt 0.794118 0.911765 +vt 0.970588 0.647059 +vt 0.941177 0.352941 +vt 0.911765 0.176471 +vt 0.911765 0.705882 +vt 0.088235 0.970588 +vt 0.705882 0.970588 +vt 0.676471 0.970588 +vt 0.647059 0.970588 +vt 0.352941 0.970588 +vt 0.676471 0.911765 +vt 0.117647 0.970588 +vt 0.941177 0.352941 +vt 0.558824 0.911765 +vt 0.411765 0.970588 +vt 0.588235 0.941177 +vt 0.882353 0.441177 +vt 0.823529 0.000000 +vt 0.852941 0.029412 +vt 0.823529 0.029412 +vt 0.823529 0.117647 +vt 0.823529 0.147059 +vt 0.735294 0.588235 +vt 0.735294 0.441177 +vt 0.764706 0.470588 +vt 0.764706 0.558824 +vt 0.764706 0.588235 +vt 0.794118 0.617647 +vt 0.764706 0.617647 +vt 0.764706 0.705882 +vt 0.764706 0.735294 +vt 0.970588 0.529412 +vt 0.882353 0.705882 +vt 0.882353 0.735294 +vt 0.882353 0.588235 +vt 0.852941 0.617647 +vt 0.882353 0.617647 +vt 0.941177 0.735294 +vt 0.029412 0.970588 +vt 0.735294 0.735294 +vt 0.588235 0.882353 +vt 0.617647 0.852941 +vt 0.588235 0.852941 +vt 0.588235 0.764706 +vt 0.588235 0.735294 +vt 0.794118 0.941177 +vt 0.735294 0.970588 +vt 0.970588 0.176471 +vt 0.529412 0.764706 +vt 0.529412 0.852941 +vt 0.500000 0.882353 +vt 0.470588 0.882353 +vt 0.500000 0.735294 +vt 0.617647 0.941177 +vt 0.382353 0.970588 +vt 0.970588 0.558823 +vt 0.911765 0.588235 +vt 0.558824 0.970588 +vt 0.294118 0.970588 +vt 0.558824 0.941177 +vt 0.764706 0.911765 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl donut--chocolate_Material +s off +f 93/1/1 81/2/1 220/3/1 +f 98/4/2 109/5/2 23/6/2 +f 77/7/3 91/8/3 185/9/3 +f 235/10/4 106/11/4 8/12/4 +f 200/13/2 142/14/2 148/15/2 +f 66/16/4 225/17/4 117/18/4 +f 121/19/5 120/20/5 104/21/5 +f 17/22/6 171/23/6 127/24/6 +f 103/25/4 192/26/4 32/27/4 +f 151/28/2 231/29/2 226/30/2 +f 8/31/1 179/32/1 176/33/1 +f 209/34/6 193/35/6 147/36/6 +f 142/37/5 65/38/5 148/39/5 +f 70/40/2 211/41/2 72/42/2 +f 177/43/1 88/44/1 119/45/1 +f 138/46/3 137/47/3 42/48/3 +f 31/49/2 153/50/2 33/51/2 +f 157/52/5 134/53/5 161/54/5 +f 220/55/4 166/56/4 218/57/4 +f 38/58/6 136/59/6 135/60/6 +f 101/61/5 222/62/5 82/63/5 +f 40/64/3 186/65/3 92/66/3 +f 11/67/6 36/68/6 140/69/6 +f 34/70/1 15/71/1 115/72/1 +f 50/73/3 174/74/3 173/75/3 +f 219/76/4 79/77/4 80/78/4 +f 179/79/3 90/80/3 182/81/3 +f 151/82/6 61/83/6 67/84/6 +f 196/85/3 58/86/3 129/87/3 +f 238/88/6 180/89/6 50/90/6 +f 122/91/5 59/92/5 195/93/5 +f 240/94/1 38/95/1 159/96/1 +f 167/97/6 3/98/6 201/99/6 +f 189/100/6 45/101/6 170/102/6 +f 238/103/5 51/104/5 158/105/5 +f 205/106/2 206/107/2 102/108/2 +f 156/109/1 11/110/1 181/111/1 +f 146/112/1 31/113/1 32/114/1 +f 28/115/4 116/116/4 115/117/4 +f 223/118/1 201/119/1 29/120/1 +f 207/121/4 230/122/4 119/123/4 +f 173/124/4 88/125/4 86/126/4 +f 47/127/3 57/128/3 56/129/3 +f 210/130/2 121/131/2 104/132/2 +f 58/133/5 70/134/5 66/135/5 +f 122/136/4 21/137/4 123/138/4 +f 190/139/3 54/140/3 189/141/3 +f 138/142/6 44/143/6 142/144/6 +f 137/145/6 16/146/6 125/147/6 +f 215/148/5 239/149/5 160/150/5 +f 214/151/5 133/152/5 198/153/5 +f 164/154/4 112/155/4 78/156/4 +f 19/157/6 6/158/6 5/159/6 +f 56/160/5 190/161/5 172/162/5 +f 212/163/1 22/164/1 140/165/1 +f 203/166/1 17/167/1 150/168/1 +f 29/169/2 24/170/2 141/171/2 +f 208/172/2 147/173/2 34/174/2 +f 236/175/1 10/176/1 178/177/1 +f 110/178/5 64/179/5 108/180/5 +f 205/181/4 56/182/4 57/183/4 +f 157/184/6 51/104/6 131/185/6 +f 90/186/5 97/187/5 89/188/5 +f 91/189/1 75/190/1 73/191/1 +f 221/192/4 82/193/4 222/194/4 +f 21/195/3 8/196/3 20/197/3 +f 23/198/1 77/199/1 185/200/1 +f 12/201/1 13/202/1 182/203/1 +f 113/204/4 1/205/4 217/206/4 +f 183/207/5 132/208/5 184/209/5 +f 60/210/2 110/211/2 108/212/2 +f 169/213/4 15/214/4 168/215/4 +f 15/216/3 93/217/3 14/218/3 +f 113/204/1 166/219/1 2/220/1 +f 99/221/4 93/222/4 27/223/4 +f 107/224/1 199/225/1 98/226/1 +f 153/227/6 70/228/6 72/229/6 +f 91/230/4 92/231/4 108/232/4 +f 35/233/6 181/234/6 10/235/6 +f 26/236/1 1/237/1 74/238/1 +f 123/239/1 20/240/1 105/241/1 +f 46/242/4 43/243/4 84/244/4 +f 193/245/3 7/246/3 19/247/3 +f 159/248/2 213/249/2 212/250/2 +f 232/251/5 69/252/5 48/253/5 +f 202/254/6 190/255/6 144/256/6 +f 41/257/5 42/258/5 125/259/5 +f 22/260/3 12/261/3 140/262/3 +f 24/263/1 16/264/1 141/265/1 +f 111/266/5 186/267/5 78/268/5 +f 143/269/5 137/270/5 52/271/5 +f 204/272/2 145/273/2 203/274/2 +f 136/275/3 133/276/3 132/277/3 +f 100/278/2 117/279/2 101/280/2 +f 43/281/3 95/282/3 94/283/3 +f 106/284/2 123/285/2 105/286/2 +f 152/287/6 208/288/6 34/289/6 +f 191/290/3 128/291/3 17/292/3 +f 100/293/4 94/294/4 95/295/4 +f 163/296/5 92/297/5 39/298/5 +f 194/299/3 59/300/3 97/301/3 +f 188/302/1 4/303/1 126/304/1 +f 114/305/5 164/306/5 79/307/5 +f 63/308/6 161/309/6 134/310/6 +f 44/143/5 54/311/5 61/312/5 +f 209/313/1 154/314/1 130/315/1 +f 211/316/6 197/317/6 196/318/6 +f 109/319/4 26/320/4 74/321/4 +f 234/322/1 124/323/1 106/324/1 +f 61/325/2 144/326/2 67/327/2 +f 219/328/5 165/329/5 221/330/5 +f 196/331/5 180/332/5 155/333/5 +f 30/334/6 204/335/6 203/336/6 +f 63/337/2 215/338/2 160/339/2 +f 145/340/6 18/341/6 191/342/6 +f 97/343/4 104/344/4 175/345/4 +f 69/346/4 68/347/4 206/348/4 +f 88/349/3 192/350/3 96/351/3 +f 32/352/2 119/353/2 103/354/2 +f 236/355/6 130/356/6 154/357/6 +f 129/358/6 49/359/6 174/360/6 +f 187/361/3 188/362/3 16/363/3 +f 85/364/4 47/365/4 172/366/4 +f 27/367/2 115/368/2 99/369/2 +f 93/1/1 83/370/1 169/371/1 +f 220/3/1 226/372/1 27/373/1 +f 226/372/1 28/374/1 27/373/1 +f 93/1/1 169/371/1 81/2/1 +f 220/3/1 27/373/1 93/1/1 +f 98/4/2 199/375/2 109/5/2 +f 77/7/3 76/376/3 91/8/3 +f 176/377/4 177/43/4 8/12/4 +f 177/43/4 235/10/4 8/12/4 +f 235/10/4 234/378/4 106/11/4 +f 106/11/4 105/379/4 20/380/4 +f 106/11/4 20/380/4 8/12/4 +f 200/13/2 143/381/2 142/14/2 +f 66/16/4 118/382/4 225/17/4 +f 121/19/5 233/383/5 120/20/5 +f 17/22/6 128/384/6 171/23/6 +f 103/25/4 96/385/4 192/26/4 +f 68/386/2 229/387/2 232/388/2 +f 232/388/2 120/389/2 233/390/2 +f 233/390/2 156/391/2 232/388/2 +f 156/391/2 35/392/2 236/393/2 +f 236/393/2 154/394/2 231/29/2 +f 156/391/2 236/393/2 232/388/2 +f 231/29/2 152/395/2 116/396/2 +f 232/388/2 236/393/2 68/386/2 +f 236/393/2 231/29/2 68/386/2 +f 231/29/2 116/396/2 226/30/2 +f 226/30/2 220/397/2 218/398/2 +f 218/398/2 113/399/2 217/400/2 +f 217/400/2 227/401/2 218/398/2 +f 227/401/2 228/402/2 151/28/2 +f 151/28/2 68/386/2 231/29/2 +f 227/401/2 151/28/2 218/398/2 +f 226/30/2 218/398/2 151/28/2 +f 8/31/1 9/403/1 179/32/1 +f 209/34/6 139/404/6 193/35/6 +f 142/37/5 149/405/5 65/38/5 +f 70/40/2 62/406/2 211/41/2 +f 230/407/1 235/10/1 119/45/1 +f 235/10/1 177/43/1 119/45/1 +f 177/43/1 86/408/1 88/44/1 +f 88/44/1 96/409/1 103/410/1 +f 88/44/1 103/410/1 119/45/1 +f 138/46/3 52/411/3 137/47/3 +f 65/412/2 149/413/2 227/401/2 +f 227/401/2 217/400/2 65/412/2 +f 217/400/2 26/414/2 25/415/2 +f 25/415/2 107/416/2 64/417/2 +f 217/400/2 25/415/2 65/412/2 +f 25/415/2 64/417/2 216/418/2 +f 216/418/2 112/419/2 114/420/2 +f 114/420/2 219/421/2 221/422/2 +f 221/422/2 222/423/2 225/424/2 +f 225/424/2 118/425/2 71/426/2 +f 153/50/2 155/427/2 238/428/2 +f 225/424/2 71/426/2 153/50/2 +f 114/420/2 221/422/2 150/429/2 +f 221/422/2 225/424/2 31/49/2 +f 25/415/2 216/418/2 223/430/2 +f 216/418/2 114/420/2 223/430/2 +f 223/430/2 65/412/2 25/415/2 +f 150/429/2 224/431/2 223/430/2 +f 31/49/2 30/432/2 150/429/2 +f 235/433/2 230/434/2 33/51/2 +f 237/435/2 234/436/2 235/433/2 +f 156/391/2 233/390/2 240/437/2 +f 233/390/2 237/435/2 240/437/2 +f 240/437/2 36/438/2 156/391/2 +f 162/439/2 37/440/2 240/437/2 +f 157/441/2 161/442/2 239/443/2 +f 239/443/2 162/439/2 240/437/2 +f 239/443/2 240/437/2 237/435/2 +f 238/428/2 158/444/2 157/441/2 +f 157/441/2 239/443/2 237/435/2 +f 157/441/2 237/435/2 235/433/2 +f 153/50/2 238/428/2 33/51/2 +f 238/428/2 157/441/2 235/433/2 +f 33/51/2 238/428/2 235/433/2 +f 221/422/2 31/49/2 150/429/2 +f 225/424/2 153/50/2 31/49/2 +f 150/429/2 223/430/2 114/420/2 +f 157/52/5 131/445/5 134/53/5 +f 220/55/4 81/446/4 166/56/4 +f 38/58/6 37/447/6 162/448/6 +f 215/449/6 214/450/6 198/451/6 +f 38/58/6 162/448/6 215/449/6 +f 22/452/6 213/453/6 38/58/6 +f 183/454/6 13/455/6 135/60/6 +f 135/60/6 22/452/6 38/58/6 +f 38/58/6 215/449/6 136/59/6 +f 215/449/6 198/451/6 136/59/6 +f 136/59/6 183/454/6 135/60/6 +f 101/61/5 117/456/5 225/457/5 +f 82/63/5 84/458/5 94/459/5 +f 84/458/5 43/460/5 94/459/5 +f 101/61/5 225/457/5 222/62/5 +f 82/63/5 94/459/5 101/61/5 +f 40/64/3 78/461/3 186/65/3 +f 36/68/6 240/462/6 212/463/6 +f 240/462/6 159/464/6 212/463/6 +f 12/465/6 182/466/6 140/69/6 +f 182/466/6 11/67/6 140/69/6 +f 36/68/6 212/463/6 140/69/6 +f 34/70/1 147/467/1 193/468/1 +f 19/469/1 5/470/1 168/471/1 +f 34/70/1 193/468/1 19/469/1 +f 116/472/1 152/473/1 34/70/1 +f 14/474/1 99/475/1 115/72/1 +f 115/72/1 116/472/1 34/70/1 +f 34/70/1 19/469/1 15/71/1 +f 19/469/1 168/471/1 15/71/1 +f 15/71/1 14/474/1 115/72/1 +f 174/74/3 49/476/3 46/477/3 +f 46/477/3 84/478/3 174/74/3 +f 84/478/3 171/479/3 173/75/3 +f 173/75/3 86/480/3 177/481/3 +f 84/478/3 173/75/3 174/74/3 +f 50/73/3 180/482/3 174/74/3 +f 173/75/3 177/481/3 50/73/3 +f 177/481/3 131/483/3 50/73/3 +f 131/483/3 51/484/3 50/73/3 +f 219/76/4 114/485/4 79/77/4 +f 126/486/3 4/487/3 167/488/3 +f 167/488/3 127/489/3 171/479/3 +f 171/479/3 84/478/3 165/490/3 +f 84/478/3 82/491/3 165/490/3 +f 165/490/3 80/492/3 79/493/3 +f 167/488/3 171/479/3 165/490/3 +f 79/493/3 164/494/3 163/495/3 +f 167/488/3 165/490/3 79/493/3 +f 126/486/3 167/488/3 79/493/3 +f 163/495/3 39/496/3 73/497/3 +f 126/486/3 79/493/3 163/495/3 +f 44/498/3 41/499/3 125/500/3 +f 125/500/3 126/486/3 163/495/3 +f 163/495/3 73/497/3 75/501/3 +f 75/501/3 74/502/3 1/503/3 +f 1/503/3 2/504/3 166/505/3 +f 166/505/3 81/506/3 169/507/3 +f 169/507/3 168/508/3 5/509/3 +f 6/510/3 130/511/3 178/512/3 +f 169/507/3 5/509/3 6/510/3 +f 1/503/3 166/505/3 44/498/3 +f 166/505/3 169/507/3 170/513/3 +f 163/495/3 75/501/3 125/500/3 +f 75/501/3 1/503/3 125/500/3 +f 166/505/3 170/513/3 44/498/3 +f 169/507/3 6/510/3 172/514/3 +f 178/512/3 10/515/3 181/516/3 +f 169/507/3 172/514/3 170/513/3 +f 6/510/3 178/512/3 172/514/3 +f 44/498/3 125/500/3 1/503/3 +f 170/513/3 45/517/3 44/498/3 +f 175/518/3 85/519/3 172/514/3 +f 178/512/3 181/516/3 175/518/3 +f 172/514/3 178/512/3 175/518/3 +f 181/516/3 11/520/3 182/81/3 +f 182/81/3 13/521/3 183/522/3 +f 184/523/3 134/524/3 131/483/3 +f 182/81/3 183/522/3 184/523/3 +f 90/80/3 89/525/3 175/518/3 +f 181/516/3 182/81/3 90/80/3 +f 182/81/3 184/523/3 179/79/3 +f 184/523/3 131/483/3 179/79/3 +f 131/483/3 177/481/3 179/79/3 +f 177/481/3 176/526/3 179/79/3 +f 90/80/3 175/518/3 181/516/3 +f 151/82/6 228/527/6 61/83/6 +f 196/85/3 197/528/3 58/86/3 +f 238/88/6 155/529/6 180/89/6 +f 122/91/5 210/530/5 59/92/5 +f 240/94/1 37/531/1 38/95/1 +f 224/532/6 150/533/6 201/99/6 +f 150/533/6 167/97/6 201/99/6 +f 167/97/6 4/534/6 3/98/6 +f 3/98/6 187/535/6 24/536/6 +f 3/98/6 24/536/6 201/99/6 +f 189/100/6 54/537/6 45/101/6 +f 238/103/5 50/538/5 51/104/5 +f 205/106/2 69/539/2 206/107/2 +f 156/109/1 36/540/1 11/110/1 +f 173/541/1 171/542/1 18/543/1 +f 171/542/1 128/544/1 18/543/1 +f 192/545/1 87/546/1 173/541/1 +f 33/547/1 207/548/1 32/114/1 +f 192/545/1 173/541/1 18/543/1 +f 31/113/1 33/547/1 32/114/1 +f 32/114/1 192/545/1 18/543/1 +f 146/112/1 204/549/1 31/113/1 +f 32/114/1 18/543/1 146/112/1 +f 28/115/4 226/550/4 116/116/4 +f 223/118/1 224/551/1 201/119/1 +f 207/121/4 33/552/4 230/122/4 +f 173/124/4 87/553/4 88/125/4 +f 47/127/3 48/554/3 57/128/3 +f 210/130/2 122/555/2 121/131/2 +f 100/556/5 95/557/5 53/558/5 +f 53/558/5 46/559/5 49/560/5 +f 58/133/5 197/561/5 62/562/5 +f 53/558/5 49/560/5 58/133/5 +f 66/135/5 100/556/5 53/558/5 +f 71/563/5 118/564/5 66/135/5 +f 58/133/5 62/562/5 70/134/5 +f 70/134/5 71/563/5 66/135/5 +f 66/135/5 53/558/5 58/133/5 +f 90/565/4 179/566/4 21/137/4 +f 179/566/4 9/567/4 21/137/4 +f 195/568/4 194/569/4 90/565/4 +f 233/570/4 121/571/4 122/136/4 +f 195/568/4 90/565/4 21/137/4 +f 237/572/4 233/570/4 123/138/4 +f 233/570/4 122/136/4 123/138/4 +f 122/136/4 195/568/4 21/137/4 +f 123/138/4 124/573/4 237/572/4 +f 190/139/3 55/574/3 54/140/3 +f 143/575/6 52/576/6 138/142/6 +f 138/142/6 41/577/6 44/143/6 +f 44/143/6 227/578/6 142/144/6 +f 227/578/6 149/579/6 142/144/6 +f 142/144/6 143/575/6 138/142/6 +f 200/580/6 148/581/6 65/582/6 +f 65/582/6 223/583/6 141/584/6 +f 223/583/6 29/585/6 141/584/6 +f 200/580/6 65/582/6 141/584/6 +f 16/146/6 188/586/6 126/587/6 +f 200/580/6 141/584/6 16/146/6 +f 125/147/6 42/588/6 137/145/6 +f 137/145/6 200/580/6 16/146/6 +f 16/146/6 126/587/6 125/147/6 +f 215/148/5 162/589/5 239/149/5 +f 214/151/5 63/590/5 133/152/5 +f 40/591/4 163/592/4 78/156/4 +f 163/592/4 164/154/4 78/156/4 +f 112/155/4 216/593/4 111/594/4 +f 216/593/4 110/595/4 111/594/4 +f 112/155/4 111/594/4 78/156/4 +f 19/157/6 7/596/6 6/158/6 +f 102/597/5 206/598/5 68/599/5 +f 68/599/5 151/600/5 144/601/5 +f 151/600/5 67/602/5 144/601/5 +f 102/597/5 68/599/5 144/601/5 +f 190/161/5 189/603/5 170/604/5 +f 102/597/5 144/601/5 190/161/5 +f 172/162/5 47/605/5 56/160/5 +f 56/160/5 102/597/5 190/161/5 +f 190/161/5 170/604/5 172/162/5 +f 212/163/1 213/606/1 22/164/1 +f 203/166/1 145/607/1 191/608/1 +f 17/167/1 127/609/1 167/610/1 +f 203/166/1 191/608/1 17/167/1 +f 150/168/1 30/611/1 203/166/1 +f 17/167/1 167/610/1 150/168/1 +f 29/169/2 201/612/2 24/170/2 +f 208/172/2 209/613/2 147/173/2 +f 236/175/1 35/614/1 10/176/1 +f 110/178/5 216/615/5 64/179/5 +f 205/181/4 102/616/4 56/182/4 +f 157/184/6 158/105/6 51/104/6 +f 90/186/5 194/617/5 97/187/5 +f 91/189/1 76/618/1 75/190/1 +f 221/192/4 165/619/4 82/193/4 +f 21/195/3 9/620/3 8/196/3 +f 23/198/1 109/621/1 77/199/1 +f 12/201/1 135/622/1 13/202/1 +f 113/204/4 2/220/4 1/205/4 +f 183/207/5 136/623/5 132/208/5 +f 60/210/2 111/624/2 110/211/2 +f 169/213/4 83/625/4 15/214/4 +f 15/216/3 83/626/3 93/217/3 +f 113/204/1 218/627/1 166/219/1 +f 99/221/4 14/628/4 93/222/4 +f 107/224/1 25/629/1 199/225/1 +f 153/227/6 71/630/6 70/228/6 +f 64/631/4 107/632/4 98/633/4 +f 98/633/4 23/634/4 185/635/4 +f 91/230/4 73/636/4 39/637/4 +f 98/633/4 185/635/4 91/230/4 +f 108/232/4 64/631/4 98/633/4 +f 186/638/4 60/639/4 108/232/4 +f 91/230/4 39/637/4 92/231/4 +f 92/231/4 186/638/4 108/232/4 +f 108/232/4 98/633/4 91/230/4 +f 35/233/6 156/640/6 181/234/6 +f 26/236/1 217/641/1 1/237/1 +f 123/239/1 21/642/1 20/240/1 +f 46/242/4 53/643/4 43/243/4 +f 193/245/3 139/644/3 7/246/3 +f 159/248/2 38/645/2 213/249/2 +f 85/646/5 175/647/5 48/253/5 +f 175/647/5 232/251/5 48/253/5 +f 232/251/5 229/648/5 69/252/5 +f 69/252/5 205/649/5 57/650/5 +f 69/252/5 57/650/5 48/253/5 +f 202/254/6 55/651/6 190/255/6 +f 41/257/5 138/652/5 42/258/5 +f 22/260/3 135/653/3 12/261/3 +f 24/263/1 187/654/1 16/264/1 +f 111/266/5 60/655/5 186/267/5 +f 143/269/5 200/656/5 137/270/5 +f 204/272/2 146/657/2 145/273/2 +f 136/275/3 198/658/3 133/276/3 +f 100/278/2 66/659/2 117/279/2 +f 43/281/3 53/660/3 95/282/3 +f 106/284/2 124/661/2 123/285/2 +f 152/287/6 231/662/6 208/288/6 +f 191/290/3 18/663/3 128/291/3 +f 100/293/4 101/664/4 94/294/4 +f 163/296/5 40/665/5 92/297/5 +f 194/299/3 195/666/3 59/300/3 +f 188/302/1 3/667/1 4/303/1 +f 114/305/5 112/668/5 164/306/5 +f 134/310/6 184/669/6 133/670/6 +f 184/669/6 132/671/6 133/670/6 +f 160/672/6 239/673/6 63/308/6 +f 239/673/6 161/309/6 63/308/6 +f 134/310/6 133/670/6 63/308/6 +f 228/674/5 227/578/5 61/312/5 +f 227/578/5 44/143/5 61/312/5 +f 44/143/5 45/675/5 54/311/5 +f 54/311/5 55/676/5 202/677/5 +f 54/311/5 202/677/5 61/312/5 +f 130/315/1 6/678/1 139/679/1 +f 6/678/1 7/680/1 139/679/1 +f 208/681/1 231/682/1 209/313/1 +f 231/682/1 154/314/1 209/313/1 +f 130/315/1 139/679/1 209/313/1 +f 211/316/6 62/683/6 197/317/6 +f 109/319/4 199/684/4 25/685/4 +f 74/321/4 75/686/4 77/687/4 +f 75/686/4 76/688/4 77/687/4 +f 109/319/4 25/685/4 26/320/4 +f 74/321/4 77/687/4 109/319/4 +f 234/322/1 237/689/1 124/323/1 +f 61/325/2 202/690/2 144/326/2 +f 219/328/5 80/691/5 165/329/5 +f 155/333/5 153/692/5 211/693/5 +f 153/692/5 72/694/5 211/693/5 +f 129/695/5 174/696/5 196/331/5 +f 174/696/5 180/332/5 196/331/5 +f 155/333/5 211/693/5 196/331/5 +f 30/334/6 31/697/6 204/335/6 +f 63/337/2 214/698/2 215/338/2 +f 145/340/6 146/699/6 18/341/6 +f 97/343/4 59/700/4 210/701/4 +f 104/344/4 120/702/4 232/703/4 +f 97/343/4 210/701/4 104/344/4 +f 175/345/4 89/704/4 97/343/4 +f 104/344/4 232/703/4 175/345/4 +f 69/346/4 229/705/4 68/347/4 +f 88/349/3 87/706/3 192/350/3 +f 32/352/2 207/707/2 119/353/2 +f 236/355/6 178/708/6 130/356/6 +f 129/358/6 58/709/6 49/359/6 +f 187/361/3 3/710/3 188/362/3 +f 85/364/4 48/711/4 47/365/4 +f 27/367/2 28/712/2 115/368/2 diff --git a/mods/x_farming/models/x_farming_fish_stew.obj b/mods/x_farming/models/x_farming_fish_stew.obj new file mode 100644 index 00000000..a783c63f --- /dev/null +++ b/mods/x_farming/models/x_farming_fish_stew.obj @@ -0,0 +1,1399 @@ +# Blender v3.3.0 OBJ File: 'x_farming_hog_stew2.blend' +# www.blender.org +mtllib x_farming_hog_stew.mtl +o x_farming_hog_stew +v -0.240000 -0.499000 0.240000 +v -0.240000 -0.439000 0.240000 +v -0.240000 -0.439000 0.360000 +v -0.240000 -0.379000 0.300000 +v -0.300000 -0.379000 0.300000 +v -0.300000 -0.379000 -0.180000 +v -0.300000 -0.439000 -0.300000 +v -0.240000 -0.379000 -0.360000 +v -0.300000 -0.379000 0.360000 +v -0.360000 -0.379000 -0.180000 +v -0.360000 -0.379000 -0.300000 +v -0.300000 -0.259000 0.300000 +v -0.360000 -0.319000 0.240000 +v -0.420000 -0.319000 0.240000 +v -0.300000 -0.259000 -0.360000 +v -0.360000 -0.259000 -0.300000 +v -0.240000 -0.139000 0.420000 +v -0.240000 -0.139000 0.360000 +v -0.360000 -0.139000 0.360000 +v -0.360000 -0.139000 0.240000 +v -0.060000 -0.139000 0.300000 +v -0.420000 -0.139000 0.240000 +v 0.120000 -0.139000 0.180000 +v -0.120000 -0.139000 -0.120000 +v 0.120000 -0.139000 -0.180000 +v -0.120000 -0.139000 -0.240000 +v 0.300000 -0.199000 -0.240000 +v 0.240000 -0.139000 -0.300000 +v -0.180000 -0.139000 0.060000 +v -0.480000 0.041000 -0.060000 +v 0.180000 -0.379000 0.360000 +v 0.300000 -0.439000 0.300000 +v 0.300000 -0.439000 0.240000 +v 0.300000 -0.379000 0.240000 +v 0.300000 -0.379000 -0.180000 +v 0.180000 -0.439000 -0.360000 +v 0.360000 -0.379000 0.300000 +v 0.360000 -0.379000 0.240000 +v 0.360000 -0.379000 -0.180000 +v 0.360000 -0.319000 -0.240000 +v 0.360000 -0.379000 -0.300000 +v 0.300000 -0.379000 -0.300000 +v 0.300000 -0.379000 -0.360000 +v 0.420000 -0.319000 -0.240000 +v 0.360000 -0.259000 0.360000 +v 0.360000 -0.259000 0.300000 +v 0.060000 -0.199000 0.300000 +v 0.060000 -0.139000 0.180000 +v -0.180000 -0.199000 0.120000 +v -0.180000 -0.139000 0.180000 +v 0.240000 -0.139000 0.060000 +v 0.120000 -0.199000 -0.060000 +v -0.180000 -0.199000 -0.060000 +v -0.180000 -0.199000 -0.120000 +v -0.180000 -0.139000 -0.120000 +v 0.060000 -0.199000 -0.120000 +v -0.120000 -0.199000 -0.120000 +v 0.240000 -0.199000 -0.180000 +v 0.420000 -0.139000 -0.240000 +v 0.000000 -0.199000 -0.300000 +v 0.240000 -0.139000 -0.420000 +v -0.120000 -0.079000 0.060000 +v -0.180000 -0.019000 0.060000 +v -0.300000 0.041000 0.060000 +v -0.300000 -0.019000 -0.060000 +v -0.300000 0.041000 -0.060000 +v 0.240000 -0.499000 0.240000 +v -0.300000 -0.439000 0.300000 +v -0.240000 -0.439000 0.300000 +v 0.180000 -0.379000 0.300000 +v 0.360000 -0.439000 0.240000 +v -0.240000 -0.379000 0.360000 +v 0.240000 -0.319000 0.360000 +v 0.300000 -0.379000 0.360000 +v 0.240000 -0.319000 0.420000 +v -0.300000 -0.259000 0.360000 +v -0.360000 -0.259000 0.300000 +v 0.300000 -0.259000 0.300000 +v 0.360000 -0.319000 0.240000 +v -0.360000 -0.259000 0.360000 +v 0.300000 -0.259000 0.360000 +v 0.240000 -0.139000 0.420000 +v -0.240000 -0.139000 0.180000 +v 0.240000 -0.139000 0.180000 +v -0.120000 -0.199000 0.120000 +v -0.120000 -0.139000 0.120000 +v 0.120000 -0.199000 0.060000 +v 0.120000 -0.139000 0.060000 +v 0.060000 -0.139000 0.060000 +v -0.180000 -0.139000 -0.060000 +v 0.120000 -0.139000 -0.060000 +v 0.240000 -0.139000 -0.060000 +v 0.000000 -0.199000 -0.180000 +v -0.300000 -0.199000 -0.240000 +v -0.240000 -0.139000 -0.240000 +v -0.060000 -0.199000 -0.300000 +v -0.060000 -0.139000 -0.300000 +v 0.000000 -0.139000 -0.300000 +v 0.240000 -0.199000 -0.300000 +v -0.120000 -0.139000 0.060000 +v -0.180000 -0.079000 0.060000 +v -0.480000 0.041000 0.060000 +v -0.240000 -0.499000 -0.240000 +v 0.240000 -0.439000 -0.240000 +v -0.360000 -0.439000 -0.180000 +v -0.300000 -0.439000 -0.180000 +v -0.240000 -0.439000 -0.300000 +v 0.180000 -0.379000 -0.360000 +v 0.240000 -0.319000 -0.360000 +v -0.420000 -0.319000 -0.240000 +v 0.360000 -0.259000 -0.300000 +v 0.300000 -0.259000 -0.360000 +v -0.240000 -0.319000 -0.420000 +v 0.240000 -0.319000 -0.420000 +v -0.360000 -0.259000 -0.360000 +v 0.360000 -0.259000 -0.360000 +v -0.240000 -0.199000 0.300000 +v -0.240000 -0.139000 0.300000 +v 0.060000 -0.139000 0.300000 +v -0.240000 -0.139000 0.240000 +v 0.240000 -0.199000 0.240000 +v 0.300000 -0.199000 0.240000 +v -0.120000 -0.139000 0.180000 +v -0.060000 -0.139000 0.180000 +v -0.240000 -0.139000 0.120000 +v 0.120000 -0.199000 0.120000 +v 0.180000 -0.139000 0.060000 +v 0.060000 -0.139000 -0.120000 +v -0.420000 -0.139000 -0.240000 +v -0.360000 -0.139000 -0.240000 +v -0.060000 -0.199000 -0.240000 +v 0.360000 -0.139000 -0.360000 +v -0.120000 -0.079000 -0.060000 +v -0.180000 -0.079000 -0.060000 +v -0.480000 -0.019000 -0.060000 +v 0.240000 -0.499000 -0.240000 +v 0.180000 -0.439000 0.360000 +v -0.300000 -0.439000 0.240000 +v 0.180000 -0.439000 0.300000 +v 0.240000 -0.439000 0.240000 +v -0.360000 -0.439000 0.240000 +v 0.360000 -0.439000 -0.180000 +v 0.300000 -0.439000 -0.180000 +v -0.240000 -0.439000 -0.240000 +v 0.180000 -0.439000 -0.300000 +v 0.300000 -0.439000 -0.300000 +v -0.240000 -0.439000 -0.360000 +v -0.360000 -0.379000 0.300000 +v -0.360000 -0.379000 0.240000 +v -0.300000 -0.379000 0.240000 +v 0.300000 -0.379000 0.300000 +v -0.300000 -0.379000 -0.300000 +v -0.300000 -0.379000 -0.360000 +v -0.240000 -0.379000 -0.300000 +v 0.180000 -0.379000 -0.300000 +v -0.240000 -0.319000 0.420000 +v -0.240000 -0.319000 0.360000 +v 0.420000 -0.319000 0.240000 +v -0.360000 -0.319000 -0.240000 +v -0.240000 -0.319000 -0.360000 +v -0.300000 -0.259000 -0.300000 +v 0.300000 -0.259000 -0.300000 +v -0.300000 -0.079000 0.060000 +v -0.300000 -0.079000 -0.060000 +v -0.480000 -0.019000 0.060000 +v -0.300000 -0.019000 0.060000 +v -0.120000 -0.199000 0.240000 +v -0.180000 -0.199000 0.240000 +v -0.060000 -0.199000 0.300000 +v 0.240000 -0.199000 0.300000 +v -0.300000 -0.199000 0.240000 +v -0.240000 -0.199000 0.240000 +v -0.180000 -0.199000 0.180000 +v -0.120000 -0.199000 0.180000 +v -0.240000 -0.199000 0.180000 +v -0.240000 -0.199000 0.120000 +v -0.060000 -0.199000 0.180000 +v 0.060000 -0.199000 0.180000 +v 0.120000 -0.199000 0.180000 +v 0.240000 -0.199000 0.180000 +v 0.060000 -0.199000 0.120000 +v 0.060000 -0.199000 0.060000 +v 0.180000 -0.199000 0.120000 +v 0.180000 -0.199000 0.060000 +v 0.240000 -0.199000 0.060000 +v -0.240000 -0.199000 -0.060000 +v 0.060000 -0.199000 -0.060000 +v 0.240000 -0.199000 -0.060000 +v -0.240000 -0.199000 -0.180000 +v -0.120000 -0.199000 -0.180000 +v 0.120000 -0.199000 -0.180000 +v 0.240000 -0.199000 -0.240000 +v -0.240000 -0.199000 -0.240000 +v -0.240000 -0.199000 -0.300000 +v -0.120000 -0.199000 -0.240000 +v 0.240000 -0.139000 0.360000 +v 0.240000 -0.139000 0.300000 +v 0.360000 -0.139000 0.360000 +v -0.300000 -0.139000 0.240000 +v 0.240000 -0.139000 0.240000 +v 0.360000 -0.139000 0.240000 +v -0.180000 -0.139000 0.240000 +v -0.120000 -0.139000 0.240000 +v 0.300000 -0.139000 0.240000 +v 0.420000 -0.139000 0.240000 +v -0.180000 -0.139000 0.120000 +v 0.120000 -0.139000 0.120000 +v 0.060000 -0.139000 0.120000 +v 0.180000 -0.139000 0.120000 +v -0.240000 -0.139000 -0.060000 +v -0.120000 -0.139000 -0.060000 +v 0.060000 -0.139000 -0.060000 +v -0.240000 -0.139000 -0.180000 +v 0.240000 -0.139000 -0.180000 +v -0.300000 -0.139000 -0.240000 +v -0.120000 -0.139000 -0.180000 +v -0.060000 -0.139000 -0.240000 +v 0.000000 -0.139000 -0.180000 +v 0.240000 -0.139000 -0.240000 +v 0.300000 -0.139000 -0.240000 +v 0.360000 -0.139000 -0.240000 +v -0.360000 -0.139000 -0.360000 +v -0.240000 -0.139000 -0.300000 +v -0.240000 -0.139000 -0.360000 +v -0.240000 -0.139000 -0.420000 +v 0.240000 -0.139000 -0.360000 +v -0.180000 -0.019000 -0.060000 +vt 0.888889 0.861111 +vt 0.805555 0.888889 +vt 0.888889 0.888889 +vt 0.833333 0.805555 +vt 0.777778 0.833333 +vt 0.833333 0.833333 +vt 0.222222 0.888889 +vt 0.000000 0.916667 +vt 0.222222 0.916667 +vt 0.333333 0.694444 +vt 0.361111 0.611111 +vt 0.333333 0.611111 +vt 0.944444 0.527778 +vt 0.916667 0.555556 +vt 0.916667 0.527778 +vt 0.916667 0.500000 +vt 0.944444 0.472222 +vt 0.916667 0.472222 +vt 0.916667 0.722222 +vt 0.861111 0.694444 +vt 0.916667 0.694444 +vt 0.777778 0.805555 +vt 0.722222 0.833333 +vt 0.722222 0.805555 +vt 0.666667 0.944444 +vt 0.694444 0.916667 +vt 0.666667 0.916667 +vt 0.750000 0.777778 +vt 0.722222 0.805555 +vt 0.722222 0.777778 +vt 0.944444 0.222222 +vt 0.916667 0.166667 +vt 0.916667 0.222222 +vt 0.916667 0.861111 +vt 0.944444 0.833333 +vt 0.916667 0.833333 +vt 0.388889 0.611111 +vt 0.361111 0.388889 +vt 0.361111 0.611111 +vt 0.944444 0.611111 +vt 0.722222 0.638889 +vt 0.944444 0.638889 +vt 0.027778 0.972222 +vt 0.055556 0.944444 +vt 0.027778 0.944444 +vt 0.888889 0.916667 +vt 0.833333 0.888889 +vt 0.833333 0.916667 +vt 0.111111 0.972222 +vt 0.138889 0.944444 +vt 0.111111 0.944444 +vt 0.888889 0.944444 +vt 0.916667 0.916667 +vt 0.888889 0.916667 +vt 0.638889 0.944444 +vt 0.666667 0.916667 +vt 0.638889 0.916667 +vt 0.888889 0.472222 +vt 0.833333 0.500000 +vt 0.888889 0.500000 +vt 0.916667 0.305556 +vt 0.944444 0.277778 +vt 0.916667 0.277778 +vt 0.805555 0.777778 +vt 0.861111 0.722222 +vt 0.861111 0.777778 +vt 0.833333 0.694444 +vt 0.805555 0.666667 +vt 0.861111 0.666667 +vt 0.250000 0.694444 +vt 0.055556 0.666667 +vt 0.055556 0.694444 +vt 0.222222 0.944444 +vt 0.000000 0.916667 +vt 0.222222 0.916667 +vt 0.916667 0.805555 +vt 0.944444 0.777778 +vt 0.916667 0.777778 +vt 0.611111 0.444444 +vt 0.611111 0.472222 +vt 0.638889 0.472222 +vt 0.944444 0.861111 +vt 0.916667 0.888889 +vt 0.916667 0.861111 +vt 0.916667 0.750000 +vt 0.861111 0.722222 +vt 0.916667 0.722222 +vt 0.861111 0.194444 +vt 0.805555 0.166667 +vt 0.805555 0.194444 +vt 0.861111 0.916667 +vt 0.833333 0.944444 +vt 0.833333 0.916667 +vt 0.916667 0.333333 +vt 0.833333 0.361111 +vt 0.916667 0.361111 +vt 0.916667 0.055556 +vt 0.944444 0.000000 +vt 0.944444 0.055556 +vt 0.833333 0.472222 +vt 0.777778 0.444444 +vt 0.777778 0.472222 +vt 0.861111 0.250000 +vt 0.888889 0.222222 +vt 0.861111 0.222222 +vt 0.916667 0.388889 +vt 0.833333 0.361111 +vt 0.916667 0.361111 +vt 0.916667 0.527778 +vt 0.888889 0.472222 +vt 0.888889 0.527778 +vt 0.972222 0.055556 +vt 0.944444 0.083333 +vt 0.944444 0.055556 +vt 0.333333 0.611111 +vt 0.361111 0.388889 +vt 0.333333 0.388889 +vt 0.583333 0.111111 +vt 0.611111 0.083333 +vt 0.611111 0.111111 +vt 0.916667 0.222222 +vt 0.861111 0.194444 +vt 0.861111 0.222222 +vt 0.361111 0.027778 +vt 0.333333 0.083333 +vt 0.305555 0.055556 +vt 0.777778 0.777778 +vt 0.722222 0.722222 +vt 0.722222 0.777778 +vt 0.388889 0.694444 +vt 0.361111 0.611111 +vt 0.388889 0.611111 +vt 0.833333 0.916667 +vt 0.805555 0.944444 +vt 0.805555 0.916667 +vt 0.916667 0.722222 +vt 0.944444 0.694444 +vt 0.916667 0.694444 +vt 0.444444 0.527778 +vt 0.638889 0.527778 +vt 0.444444 0.555556 +vt 0.888889 0.916667 +vt 0.861111 0.944444 +vt 0.861111 0.916667 +vt 0.416667 0.166667 +vt 0.388889 0.027778 +vt 0.416667 0.083333 +vt 0.777778 0.194444 +vt 0.777778 0.250000 +vt 0.694444 0.250000 +vt 0.611111 0.944444 +vt 0.638889 0.916667 +vt 0.611111 0.916667 +vt 0.888889 0.888889 +vt 0.916667 0.861111 +vt 0.888889 0.861111 +vt 0.944444 0.083333 +vt 0.888889 0.055556 +vt 0.944444 0.055556 +vt 0.444444 0.694444 +vt 0.638889 0.666667 +vt 0.444444 0.666667 +vt 0.972222 0.027778 +vt 0.944444 0.055556 +vt 0.944444 0.027778 +vt 0.777778 0.944444 +vt 0.805555 0.916667 +vt 0.777778 0.916667 +vt 0.944444 0.888889 +vt 0.916667 0.916667 +vt 0.916667 0.888889 +vt 0.305556 0.944444 +vt 0.333333 0.916667 +vt 0.305556 0.916667 +vt 0.083333 0.944444 +vt 0.055556 0.972222 +vt 0.055556 0.944444 +vt 0.944444 0.111111 +vt 0.972222 0.083333 +vt 0.944444 0.138889 +vt 0.972222 0.111111 +vt 0.944444 0.111111 +vt 0.694444 0.944444 +vt 0.722222 0.916667 +vt 0.694444 0.916667 +vt 0.305556 0.916667 +vt 0.277778 0.944444 +vt 0.277778 0.916667 +vt 0.888889 0.055556 +vt 0.916667 0.000000 +vt 0.888889 0.000000 +vt 0.666667 0.083333 +vt 0.888889 0.000000 +vt 0.666667 0.000000 +vt 0.916667 0.444444 +vt 0.861111 0.472222 +vt 0.916667 0.472222 +vt 0.722222 0.944444 +vt 0.750000 0.916667 +vt 0.722222 0.916667 +vt 0.944444 0.138889 +vt 0.916667 0.083333 +vt 0.944444 0.083333 +vt 0.277778 0.666667 +vt 0.305556 0.638889 +vt 0.277778 0.444444 +vt 0.944444 0.277778 +vt 0.916667 0.222222 +vt 0.916667 0.277778 +vt 0.944444 0.388889 +vt 0.916667 0.416667 +vt 0.916667 0.388889 +vt 0.666667 0.166667 +vt 0.888889 0.083333 +vt 0.888889 0.166667 +vt 0.916667 0.222222 +vt 0.888889 0.250000 +vt 0.944444 0.333333 +vt 0.916667 0.361111 +vt 0.916667 0.333333 +vt 0.333333 0.777778 +vt 0.361111 0.694444 +vt 0.361111 0.777778 +vt 0.305556 0.888889 +vt 0.222222 0.916667 +vt 0.222222 0.888889 +vt 0.694444 0.861111 +vt 0.722222 0.861111 +vt 0.722222 0.916667 +vt 0.888889 0.666667 +vt 0.861111 0.694444 +vt 0.861111 0.666667 +vt 0.361111 0.861111 +vt 0.388889 0.777778 +vt 0.388889 0.861111 +vt 0.833333 0.472222 +vt 0.861111 0.388889 +vt 0.861111 0.472222 +vt 0.888889 0.916667 +vt 0.916667 0.888889 +vt 0.888889 0.888889 +vt 0.666667 0.250000 +vt 0.694444 0.194444 +vt 0.666667 0.194444 +vt 0.805555 0.222222 +vt 0.222222 0.888889 +vt 0.333333 0.861111 +vt 0.333333 0.888889 +vt 0.694444 0.472222 +vt 0.638889 0.500000 +vt 0.916667 0.777778 +vt 0.944444 0.750000 +vt 0.916667 0.750000 +vt 0.777778 0.861111 +vt 0.722222 0.833333 +vt 0.722222 0.861111 +vt 0.833333 0.861111 +vt 0.861111 0.777778 +vt 0.833333 0.777778 +vt 0.388889 0.500000 +vt 0.611111 0.277778 +vt 0.388889 0.277778 +vt 0.944444 0.611111 +vt 0.722222 0.583333 +vt 0.722222 0.611111 +vt 0.916667 0.305555 +vt 0.833333 0.277778 +vt 0.833333 0.305555 +vt 0.805555 0.222222 +vt 0.833333 0.222222 +vt 0.833333 0.250000 +vt 0.888889 0.555555 +vt 0.916667 0.527778 +vt 0.888889 0.527778 +vt 0.944444 0.916667 +vt 0.916667 0.944444 +vt 0.916667 0.916667 +vt 0.916667 0.444444 +vt 0.944444 0.416667 +vt 0.916667 0.416667 +vt 0.750000 0.444444 +vt 0.722222 0.472222 +vt 0.722222 0.444444 +vt 0.916667 0.805555 +vt 0.861111 0.777778 +vt 0.916667 0.777778 +vt 0.833333 0.444444 +vt 0.611111 0.361111 +vt 0.833333 0.361111 +vt 0.888889 0.444444 +vt 0.916667 0.388889 +vt 0.888889 0.388889 +vt 0.055556 0.777778 +vt 0.250000 0.750000 +vt 0.055556 0.750000 +vt 0.888889 0.138889 +vt 0.916667 0.083333 +vt 0.916667 0.138889 +vt 0.805555 0.555556 +vt 0.722222 0.500000 +vt 0.722222 0.555556 +vt 0.916667 0.166667 +vt 0.861111 0.194444 +vt 0.861111 0.166667 +vt 0.111111 0.944444 +vt 0.083333 0.972222 +vt 0.083333 0.944444 +vt 0.833333 0.777778 +vt 0.750000 0.805555 +vt 0.833333 0.805555 +vt 0.833333 0.833333 +vt 0.777778 0.833333 +vt 0.277778 0.944444 +vt 0.222222 0.916667 +vt 0.222222 0.944444 +vt 0.444444 0.027778 +vt 0.416667 0.055556 +vt 0.416667 0.027778 +vt 0.916667 0.333333 +vt 0.861111 0.305555 +vt 0.916667 0.305555 +vt 0.388889 0.888889 +vt 0.361111 0.916667 +vt 0.361111 0.888889 +vt 0.888889 0.694444 +vt 0.916667 0.666667 +vt 0.611111 0.361111 +vt 0.833333 0.277778 +vt 0.611111 0.277778 +vt 0.805555 0.777778 +vt 0.777778 0.722222 +vt 0.805555 0.722222 +vt 0.361111 0.777778 +vt 0.388889 0.694444 +vt 0.361111 0.694444 +vt 0.361111 0.888889 +vt 0.305556 0.916667 +vt 0.305556 0.888889 +vt 0.944444 0.138889 +vt 0.888889 0.166667 +vt 0.944444 0.166667 +vt 0.888889 0.555556 +vt 0.861111 0.500000 +vt 0.861111 0.555556 +vt 0.916667 0.472222 +vt 0.944444 0.444444 +vt 0.916667 0.444444 +vt 0.750000 0.472222 +vt 0.777778 0.444444 +vt 0.027778 0.944444 +vt 0.000000 0.972222 +vt 0.000000 0.944444 +vt 0.722222 0.722222 +vt 0.805555 0.666667 +vt 0.805555 0.722222 +vt 0.861111 0.444444 +vt 0.888889 0.388889 +vt 0.888889 0.444444 +vt 0.944444 0.583333 +vt 0.722222 0.555556 +vt 0.944444 0.555556 +vt 0.916667 0.694444 +vt 0.944444 0.666667 +vt 0.916667 0.666667 +vt 0.916667 0.527778 +vt 0.944444 0.500000 +vt 0.916667 0.500000 +vt 0.777778 0.500000 +vt 0.944444 0.805555 +vt 0.916667 0.833333 +vt 0.916667 0.805555 +vt 0.750000 0.944444 +vt 0.777778 0.916667 +vt 0.750000 0.916667 +vt 0.944444 0.638889 +vt 0.722222 0.666666 +vt 0.944444 0.666666 +vt 0.027778 0.305556 +vt 0.027778 0.083333 +vt 0.055556 0.305556 +vt 0.805555 0.861111 +vt 0.722222 0.888889 +vt 0.722222 0.861111 +vt 0.861111 0.555556 +vt 0.805555 0.500000 +vt 0.861111 0.500000 +vt 0.611111 0.916667 +vt 0.388889 0.944444 +vt 0.388889 0.916667 +vt 0.777778 0.888889 +vt 0.722222 0.916667 +vt 0.722222 0.888889 +vt 0.916667 0.750000 +vt 0.861111 0.777778 +vt 0.916667 0.777778 +vt 0.222222 0.888889 +vt 0.000000 0.861111 +vt 0.000000 0.888889 +vt 0.361111 0.916667 +vt 0.333333 0.944444 +vt 0.333333 0.916667 +vt 0.972222 0.000000 +vt 0.944444 0.027778 +vt 0.944444 0.000000 +vt 0.388889 0.888889 +vt 0.333333 0.861111 +vt 0.388889 0.861111 +vt 0.527778 0.222222 +vt 0.555555 0.194444 +vt 0.583333 0.222222 +vt 0.333333 0.861111 +vt 0.361111 0.777778 +vt 0.333333 0.777778 +vt 0.944444 0.305556 +vt 0.916667 0.333333 +vt 0.916667 0.305556 +vt 0.833333 0.888889 +vt 0.777778 0.916667 +vt 0.833333 0.916667 +vt 0.833333 0.333333 +vt 0.833333 0.305555 +vt 0.916667 0.833333 +vt 0.861111 0.805555 +vt 0.861111 0.833333 +vt 0.916667 0.750000 +vt 0.944444 0.722222 +vt 0.916667 0.722222 +vt 0.916667 0.861111 +vt 0.861111 0.833333 +vt 0.861111 0.861111 +vt 0.805555 0.861111 +vt 0.000000 0.888889 +vt 0.361111 0.694444 +vt 0.944444 0.555556 +vt 0.944444 0.500000 +vt 0.694444 0.944444 +vt 0.944444 0.166667 +vt 0.944444 0.861111 +vt 0.388889 0.388889 +vt 0.722222 0.611111 +vt 0.055556 0.972222 +vt 0.888889 0.888889 +vt 0.138889 0.972222 +vt 0.916667 0.944444 +vt 0.666667 0.944444 +vt 0.833333 0.472222 +vt 0.944444 0.305556 +vt 0.805555 0.722222 +vt 0.861111 0.722222 +vt 0.833333 0.722222 +vt 0.805555 0.694444 +vt 0.305556 0.444444 +vt 0.333333 0.638889 +vt 0.333333 0.444444 +vt 0.305556 0.416667 +vt 0.250000 0.416667 +vt 0.250000 0.388889 +vt 0.055556 0.388889 +vt 0.055556 0.416667 +vt 0.027778 0.416667 +vt 0.027778 0.444444 +vt 0.055556 0.444444 +vt 0.000000 0.444444 +vt 0.000000 0.638889 +vt 0.305556 0.694444 +vt 0.027778 0.638889 +vt 0.027778 0.694444 +vt 0.055556 0.722222 +vt 0.250000 0.722222 +vt 0.000000 0.944444 +vt 0.944444 0.805555 +vt 0.944444 0.888889 +vt 0.861111 0.750000 +vt 0.861111 0.166667 +vt 0.861111 0.944444 +vt 0.833333 0.333333 +vt 0.916667 0.000000 +vt 0.833333 0.444444 +vt 0.833333 0.388889 +vt 0.916667 0.472222 +vt 0.972222 0.083333 +vt 0.361111 0.611111 +vt 0.583333 0.166667 +vt 0.583333 0.083333 +vt 0.916667 0.194444 +vt 0.361111 0.083333 +vt 0.305555 0.083333 +vt 0.361111 0.694444 +vt 0.833333 0.944444 +vt 0.944444 0.722222 +vt 0.694444 0.583333 +vt 0.722222 0.583333 +vt 0.722222 0.638889 +vt 0.666667 0.638889 +vt 0.666667 0.555556 +vt 0.444444 0.638889 +vt 0.416667 0.583333 +vt 0.388889 0.638889 +vt 0.694444 0.527778 +vt 0.444444 0.500000 +vt 0.638889 0.500000 +vt 0.416667 0.527778 +vt 0.388889 0.583333 +vt 0.888889 0.944444 +vt 0.555555 0.055556 +vt 0.555555 0.000000 +vt 0.583333 0.055556 +vt 0.638889 0.000000 +vt 0.638889 0.027778 +vt 0.666667 0.027778 +vt 0.638889 0.055556 +vt 0.666667 0.250000 +vt 0.638889 0.111111 +vt 0.638889 0.166667 +vt 0.472222 0.027778 +vt 0.500000 0.000000 +vt 0.444444 0.083333 +vt 0.444444 0.055556 +vt 0.472222 0.055556 +vt 0.500000 0.055556 +vt 0.472222 0.083333 +vt 0.555555 0.083333 +vt 0.416667 0.250000 +vt 0.388889 0.250000 +vt 0.416667 0.222222 +vt 0.500000 0.277778 +vt 0.416667 0.277778 +vt 0.472222 0.250000 +vt 0.500000 0.250000 +vt 0.472222 0.222222 +vt 0.555555 0.111111 +vt 0.472222 0.194444 +vt 0.444444 0.166667 +vt 0.444444 0.194444 +vt 0.694444 0.166667 +vt 0.777778 0.166667 +vt 0.805555 0.194444 +vt 0.805555 0.250000 +vt 0.777778 0.277778 +vt 0.694444 0.277778 +vt 0.638889 0.944444 +vt 0.916667 0.888889 +vt 0.888889 0.083333 +vt 0.666667 0.777778 +vt 0.722222 0.777778 +vt 0.694444 0.722222 +vt 0.722222 0.722222 +vt 0.694444 0.666667 +vt 0.666667 0.694444 +vt 0.638889 0.638889 +vt 0.444444 0.638889 +vt 0.388889 0.777778 +vt 0.444444 0.777778 +vt 0.416667 0.722222 +vt 0.416667 0.666667 +vt 0.388889 0.722222 +vt 0.972222 0.055556 +vt 0.805555 0.944444 +vt 0.944444 0.916667 +vt 0.333333 0.944444 +vt 0.083333 0.972222 +vt 0.972222 0.111111 +vt 0.972222 0.138889 +vt 0.722222 0.944444 +vt 0.305556 0.944444 +vt 0.916667 0.055556 +vt 0.888889 0.083333 +vt 0.861111 0.444444 +vt 0.750000 0.944444 +vt 0.916667 0.138889 +vt 0.944444 0.222222 +vt 0.944444 0.416667 +vt 0.666667 0.083333 +vt 0.916667 0.250000 +vt 0.944444 0.361111 +vt 0.333333 0.694444 +vt 0.305556 0.916667 +vt 0.444444 0.916667 +vt 0.388889 0.916667 +vt 0.416667 0.861111 +vt 0.388889 0.861111 +vt 0.416667 0.805555 +vt 0.444444 0.833333 +vt 0.444444 0.805555 +vt 0.444444 0.777778 +vt 0.638889 0.777778 +vt 0.666667 0.916667 +vt 0.666667 0.833333 +vt 0.638889 0.805555 +vt 0.694444 0.805555 +vt 0.361111 0.777778 +vt 0.833333 0.388889 +vt 0.916667 0.916667 +vt 0.861111 0.222222 +vt 0.222222 0.861111 +vt 0.694444 0.500000 +vt 0.944444 0.777778 +vt 0.861111 0.861111 +vt 0.611111 0.500000 +vt 0.944444 0.583333 +vt 0.916667 0.277778 +vt 0.861111 0.250000 +vt 0.861111 0.277778 +vt 0.805555 0.277778 +vt 0.916667 0.555555 +vt 0.944444 0.944444 +vt 0.944444 0.444444 +vt 0.861111 0.805555 +vt 0.611111 0.444444 +vt 0.916667 0.444444 +vt 0.277778 0.777778 +vt 0.277778 0.861111 +vt 0.305556 0.805555 +vt 0.333333 0.861111 +vt 0.333333 0.805555 +vt 0.305556 0.750000 +vt 0.027778 0.750000 +vt 0.027778 0.805555 +vt 0.000000 0.861111 +vt 0.055556 0.861111 +vt 0.000000 0.805555 +vt 0.888889 0.083333 +vt 0.916667 0.194444 +vt 0.111111 0.972222 +vt 0.833333 0.861111 +vt 0.277778 0.916667 +vt 0.416667 0.000000 +vt 0.861111 0.333333 +vt 0.388889 0.916667 +vt 0.916667 0.694444 +vt 0.833333 0.361111 +vt 0.388889 0.777778 +vt 0.361111 0.916667 +vt 0.888889 0.138889 +vt 0.888889 0.500000 +vt 0.944444 0.472222 +vt 0.777778 0.472222 +vt 0.027778 0.972222 +vt 0.722222 0.666667 +vt 0.861111 0.388889 +vt 0.722222 0.583333 +vt 0.944444 0.694444 +vt 0.944444 0.527778 +vt 0.833333 0.500000 +vt 0.944444 0.833333 +vt 0.777778 0.944444 +vt 0.722222 0.638889 +vt 0.333333 0.305556 +vt 0.388889 0.083333 +vt 0.388889 0.305556 +vt 0.361111 0.305556 +vt 0.361111 0.361111 +vt 0.305555 0.361111 +vt 0.305555 0.333333 +vt 0.305555 0.305556 +vt 0.305555 0.388889 +vt 0.194444 0.333333 +vt 0.083333 0.388889 +vt 0.083333 0.361111 +vt 0.166667 0.333333 +vt 0.027778 0.361111 +vt 0.083333 0.333333 +vt 0.000000 0.305556 +vt 0.000000 0.083333 +vt 0.027778 0.027778 +vt 0.055556 0.083333 +vt 0.083333 0.027778 +vt 0.083333 0.055556 +vt 0.083333 0.000000 +vt 0.166667 0.055556 +vt 0.305555 0.000000 +vt 0.222222 0.055556 +vt 0.305555 0.027778 +vt 0.138889 0.305556 +vt 0.138889 0.277778 +vt 0.166667 0.305556 +vt 0.194444 0.277778 +vt 0.222222 0.111111 +vt 0.166667 0.111111 +vt 0.083333 0.083333 +vt 0.083333 0.305556 +vt 0.805555 0.888889 +vt 0.611111 0.944444 +vt 0.777778 0.916667 +vt 0.861111 0.750000 +vt 0.222222 0.861111 +vt 0.361111 0.944444 +vt 0.972222 0.027778 +vt 0.333333 0.888889 +vt 0.638889 0.250000 +vt 0.638889 0.277778 +vt 0.527778 0.277778 +vt 0.638889 0.222222 +vt 0.555555 0.166667 +vt 0.361111 0.861111 +vt 0.944444 0.333333 +vt 0.777778 0.888889 +vt 0.916667 0.805555 +vt 0.944444 0.750000 +vt 0.916667 0.833333 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl x_farming_hog_stew_Material +s off +f 169/1/1 118/2/1 21/3/1 +f 191/4/2 91/5/2 25/6/2 +f 27/7/2 204/8/2 220/9/2 +f 17/10/2 157/11/2 156/12/2 +f 139/13/3 31/14/3 137/15/3 +f 23/16/2 126/17/2 179/18/2 +f 214/19/3 188/20/3 58/21/3 +f 52/22/3 88/23/3 87/24/3 +f 72/25/2 69/26/2 3/27/2 +f 57/28/4 55/29/4 54/30/4 +f 41/31/5 35/32/5 42/33/5 +f 5/34/2 138/35/2 68/36/2 +f 44/37/5 79/38/5 40/39/5 +f 75/40/5 157/41/5 73/42/5 +f 127/43/1 185/44/1 184/45/1 +f 124/46/2 169/47/2 21/48/2 +f 219/49/2 99/50/2 192/51/2 +f 26/52/1 131/53/1 195/54/1 +f 77/55/5 76/56/5 80/57/5 +f 134/58/1 65/59/1 227/60/1 +f 153/61/5 154/62/5 152/63/5 +f 25/64/6 92/65/6 214/66/6 +f 209/67/6 23/68/6 84/69/6 +f 145/70/5 144/71/5 107/72/5 +f 215/73/3 171/74/3 94/75/3 +f 209/76/2 184/77/2 183/78/2 +f 85/79/2 86/80/2 100/81/2 +f 203/82/6 50/83/6 202/84/6 +f 151/85/4 139/86/4 32/87/4 +f 134/88/2 29/89/2 101/90/2 +f 33/91/3 151/92/3 32/93/3 +f 65/94/1 30/95/1 66/96/1 +f 81/97/3 151/98/3 78/99/3 +f 65/100/2 163/101/2 166/102/2 +f 202/103/2 173/104/2 168/105/2 +f 64/106/4 165/107/4 166/108/4 +f 152/109/5 10/110/5 11/111/5 +f 54/112/3 90/113/3 53/114/3 +f 110/115/5 13/116/5 14/117/5 +f 87/118/6 183/119/6 184/120/6 +f 43/121/5 155/122/5 108/123/5 +f 198/124/6 204/125/6 197/126/6 +f 134/127/5 163/128/5 164/129/5 +f 20/130/4 14/131/4 13/132/4 +f 69/133/4 5/134/4 68/135/4 +f 5/136/5 72/137/5 9/138/5 +f 38/139/3 39/140/3 79/141/3 +f 182/142/3 208/143/3 181/144/3 +f 186/145/6 171/146/6 176/147/6 +f 89/148/6 212/149/6 211/150/6 +f 207/151/1 183/152/1 126/153/1 +f 115/154/5 161/155/5 16/156/5 +f 42/157/3 143/158/3 146/159/3 +f 13/160/2 10/161/2 149/162/2 +f 56/163/3 212/164/3 187/165/3 +f 152/166/1 107/167/1 7/168/1 +f 50/169/6 125/170/6 83/171/6 +f 200/172/1 122/173/1 121/174/1 +f 87/175/4 89/176/4 182/177/4 +f 134/178/1 211/179/1 90/113/1 +f 217/180/2 96/181/2 131/182/2 +f 149/183/5 5/184/5 148/185/5 +f 36/186/3 155/187/3 145/188/3 +f 162/189/1 41/190/1 42/191/1 +f 225/192/1 114/193/1 113/194/1 +f 178/195/1 124/196/1 48/197/1 +f 197/198/2 121/199/2 170/200/2 +f 46/201/4 151/202/4 37/203/4 +f 104/204/5 143/205/5 140/206/5 +f 12/207/2 9/208/2 76/209/2 +f 27/210/4 219/211/4 192/212/4 +f 17/213/4 75/214/4 82/215/4 +f 49/216/3 50/217/3 173/104/3 +f 167/218/4 202/219/4 168/220/4 +f 82/221/3 73/222/3 196/223/3 +f 181/224/4 86/225/4 85/226/4 +f 81/227/4 45/228/4 198/229/4 +f 173/230/4 83/231/4 175/232/4 +f 226/233/3 114/234/3 61/235/3 +f 201/236/4 158/237/4 205/238/4 +f 112/239/5 111/240/5 162/241/5 +f 90/242/5 100/243/5 29/244/5 +f 134/88/3 63/245/3 101/90/3 +f 98/246/4 99/247/4 28/248/4 +f 211/249/3 62/250/3 100/81/3 +f 199/251/1 172/252/1 171/253/1 +f 216/254/1 189/255/1 213/256/1 +f 221/257/1 44/258/1 40/259/1 +f 103/260/5 67/261/5 1/262/5 +f 104/263/1 103/264/1 144/265/1 +f 197/266/1 47/267/1 119/268/1 +f 210/269/6 90/270/6 55/271/6 +f 154/272/2 147/273/2 107/274/2 +f 174/275/3 203/276/3 167/277/3 +f 10/278/1 106/279/1 105/280/1 +f 190/281/3 24/282/3 57/283/3 +f 84/284/4 179/285/4 180/286/4 +f 59/287/3 158/288/3 44/289/3 +f 16/290/1 152/291/1 11/292/1 +f 160/293/1 108/294/1 8/295/1 +f 77/296/4 5/297/4 12/298/4 +f 65/299/5 165/300/5 135/301/5 +f 101/302/4 166/303/4 163/304/4 +f 100/305/4 101/306/4 29/307/4 +f 56/308/1 24/309/1 128/310/1 +f 93/311/4 216/254/4 190/312/4 +f 30/313/2 165/314/2 102/315/2 +f 168/316/6 175/317/6 172/318/6 +f 92/319/4 52/320/4 188/321/4 +f 194/322/3 95/323/3 193/324/3 +f 50/325/1 174/326/1 173/230/1 +f 22/327/2 110/328/2 14/329/2 +f 133/330/6 101/331/6 62/332/6 +f 129/333/1 159/334/1 110/335/1 +f 185/336/3 84/337/3 180/338/3 +f 7/339/2 6/340/2 152/341/2 +f 15/342/2 152/343/2 161/344/2 +f 35/345/1 142/346/1 143/347/1 +f 216/348/2 195/349/2 190/281/2 +f 53/350/4 210/351/4 186/352/4 +f 30/353/6 64/354/6 66/355/6 +f 162/356/3 43/357/3 112/358/3 +f 140/359/4 1/360/4 67/361/4 +f 78/362/5 45/363/5 81/364/5 +f 83/365/2 176/366/2 175/367/2 +f 65/100/3 64/368/3 166/102/3 +f 172/369/3 118/370/3 117/371/3 +f 34/372/5 37/373/5 151/374/5 +f 109/375/5 113/376/5 114/377/5 +f 130/378/6 20/379/6 215/380/6 +f 96/381/4 223/382/4 194/383/4 +f 227/384/6 166/385/6 63/386/6 +f 136/387/3 140/388/3 67/389/3 +f 178/390/3 119/391/3 47/392/3 +f 189/393/2 210/394/2 213/395/2 +f 144/396/2 1/397/2 2/398/2 +f 71/399/4 34/400/4 33/401/4 +f 193/402/4 215/403/4 94/404/4 +f 98/405/3 93/406/3 60/407/3 +f 93/408/6 56/409/6 191/410/6 +f 224/411/2 113/412/2 160/413/2 +f 138/414/4 149/415/4 141/416/4 +f 58/417/1 25/418/1 214/419/1 +f 212/420/1 52/320/1 187/421/1 +f 151/422/5 31/423/5 70/424/5 +f 125/425/1 49/426/1 176/427/1 +f 42/428/1 145/429/1 155/430/1 +f 169/1/1 117/431/1 118/2/1 +f 191/4/2 52/22/2 91/5/2 +f 27/7/2 122/432/2 204/8/2 +f 17/10/2 18/433/2 157/11/2 +f 139/13/3 70/434/3 31/14/3 +f 23/16/2 207/435/2 126/17/2 +f 214/19/3 92/65/3 188/20/3 +f 52/22/3 91/5/3 88/23/3 +f 72/25/2 4/436/2 69/26/2 +f 57/28/4 24/309/4 55/29/4 +f 41/31/5 39/437/5 35/32/5 +f 5/34/2 150/438/2 138/35/2 +f 44/37/5 158/439/5 79/38/5 +f 75/40/5 156/440/5 157/41/5 +f 127/43/1 51/441/1 185/44/1 +f 124/46/2 177/442/2 169/47/2 +f 219/49/2 28/443/2 99/50/2 +f 26/52/1 217/444/1 131/53/1 +f 77/55/5 12/445/5 76/56/5 +f 134/58/1 164/446/1 65/59/1 +f 153/61/5 8/447/5 154/62/5 +f 25/64/6 91/448/6 92/65/6 +f 84/69/6 51/449/6 209/67/6 +f 51/449/6 127/450/6 209/67/6 +f 209/67/6 207/451/6 23/68/6 +f 140/206/5 143/205/5 33/452/5 +f 143/205/5 142/453/5 33/452/5 +f 142/453/5 71/454/5 33/452/5 +f 33/452/5 32/455/5 140/206/5 +f 32/455/5 139/456/5 140/206/5 +f 139/456/5 137/457/5 3/458/5 +f 69/459/5 68/460/5 138/461/5 +f 139/456/5 3/458/5 69/459/5 +f 2/462/5 140/206/5 139/456/5 +f 2/462/5 139/456/5 69/459/5 +f 138/461/5 141/463/5 105/464/5 +f 146/465/5 104/204/5 145/70/5 +f 104/204/5 144/71/5 145/70/5 +f 2/462/5 69/459/5 138/461/5 +f 144/71/5 2/462/5 106/466/5 +f 2/462/5 138/461/5 106/466/5 +f 138/461/5 105/464/5 106/466/5 +f 106/466/5 7/467/5 144/71/5 +f 7/467/5 107/72/5 144/71/5 +f 107/72/5 147/468/5 36/469/5 +f 36/469/5 145/70/5 107/72/5 +f 215/73/3 199/470/3 171/74/3 +f 209/76/2 127/471/2 184/77/2 +f 100/81/2 211/249/2 85/79/2 +f 211/249/2 24/282/2 57/283/2 +f 85/79/2 211/249/2 57/283/2 +f 203/82/6 123/472/6 50/83/6 +f 151/85/4 70/473/4 139/86/4 +f 134/88/2 90/474/2 29/89/2 +f 33/91/3 34/475/3 151/92/3 +f 65/94/1 135/476/1 30/95/1 +f 81/97/3 74/477/3 151/98/3 +f 65/100/2 164/478/2 163/101/2 +f 202/103/2 50/217/2 173/104/2 +f 64/106/4 102/479/4 165/107/4 +f 152/109/5 6/480/5 10/110/5 +f 54/112/3 55/481/3 90/113/3 +f 110/115/5 159/482/5 13/116/5 +f 184/120/6 52/483/6 87/118/6 +f 87/118/6 126/484/6 183/119/6 +f 43/121/5 42/485/5 155/122/5 +f 201/486/6 204/125/6 198/124/6 +f 204/125/6 200/487/6 197/126/6 +f 134/127/5 101/331/5 163/128/5 +f 20/130/4 22/488/4 14/131/4 +f 69/133/4 4/489/4 5/134/4 +f 5/136/5 4/490/5 72/137/5 +f 111/491/3 116/492/3 132/493/3 +f 132/493/3 221/494/3 111/491/3 +f 221/494/3 40/495/3 111/491/3 +f 79/141/3 201/496/3 46/497/3 +f 201/496/3 198/498/3 46/497/3 +f 41/499/3 111/491/3 40/495/3 +f 71/500/3 142/501/3 39/140/3 +f 39/140/3 41/499/3 40/495/3 +f 39/140/3 40/495/3 79/141/3 +f 38/139/3 71/500/3 39/140/3 +f 46/497/3 37/502/3 79/141/3 +f 37/502/3 38/139/3 79/141/3 +f 198/498/3 45/503/3 46/497/3 +f 182/142/3 89/504/3 208/143/3 +f 178/505/6 47/506/6 179/507/6 +f 47/506/6 170/508/6 179/507/6 +f 121/509/6 122/510/6 180/511/6 +f 122/510/6 27/512/6 185/513/6 +f 180/511/6 122/510/6 185/513/6 +f 170/508/6 121/509/6 179/507/6 +f 188/514/6 52/483/6 184/120/6 +f 188/514/6 184/120/6 185/513/6 +f 167/515/6 168/316/6 169/516/6 +f 49/517/6 173/518/6 174/519/6 +f 174/519/6 167/515/6 177/520/6 +f 167/515/6 169/516/6 177/520/6 +f 49/517/6 174/519/6 85/521/6 +f 174/519/6 177/520/6 85/521/6 +f 177/520/6 178/505/6 181/522/6 +f 85/521/6 177/520/6 181/522/6 +f 172/318/6 175/317/6 171/146/6 +f 175/317/6 176/147/6 171/146/6 +f 193/523/6 94/524/6 189/525/6 +f 94/524/6 171/146/6 186/145/6 +f 189/525/6 94/524/6 186/145/6 +f 96/526/6 194/527/6 195/528/6 +f 194/527/6 193/523/6 195/528/6 +f 195/528/6 131/529/6 96/526/6 +f 189/525/6 190/530/6 195/528/6 +f 189/525/6 195/528/6 193/523/6 +f 27/512/6 188/514/6 185/513/6 +f 179/507/6 126/484/6 181/522/6 +f 126/484/6 87/118/6 182/531/6 +f 121/509/6 180/511/6 179/507/6 +f 126/484/6 182/531/6 181/522/6 +f 178/505/6 179/507/6 181/522/6 +f 85/521/6 57/532/6 53/533/6 +f 57/532/6 54/534/6 53/533/6 +f 176/147/6 49/517/6 186/145/6 +f 49/517/6 85/521/6 53/533/6 +f 186/145/6 49/517/6 53/533/6 +f 86/535/6 208/536/6 89/148/6 +f 89/148/6 88/537/6 91/538/6 +f 212/149/6 128/539/6 24/540/6 +f 89/148/6 91/538/6 212/149/6 +f 100/243/6 86/535/6 89/148/6 +f 212/149/6 24/540/6 211/150/6 +f 211/150/6 100/243/6 89/148/6 +f 207/151/1 209/541/1 183/152/1 +f 115/154/5 15/542/5 161/155/5 +f 42/157/3 35/543/3 143/158/3 +f 130/544/2 222/545/2 16/546/2 +f 222/545/2 115/547/2 16/546/2 +f 16/546/2 11/548/2 159/549/2 +f 11/548/2 10/161/2 159/549/2 +f 159/549/2 130/544/2 16/546/2 +f 10/161/2 105/550/2 141/551/2 +f 19/552/2 20/553/2 77/554/2 +f 20/553/2 13/160/2 77/554/2 +f 13/160/2 159/549/2 10/161/2 +f 10/161/2 141/551/2 149/162/2 +f 149/162/2 148/555/2 13/160/2 +f 148/555/2 77/554/2 13/160/2 +f 77/554/2 80/556/2 19/552/2 +f 56/163/3 128/557/3 212/164/3 +f 152/166/1 154/558/1 107/167/1 +f 50/169/6 206/559/6 125/170/6 +f 200/172/1 204/560/1 122/173/1 +f 87/175/4 88/561/4 89/176/4 +f 134/178/1 133/562/1 211/179/1 +f 217/180/2 97/563/2 96/181/2 +f 149/183/5 150/564/5 5/184/5 +f 36/186/3 108/565/3 155/187/3 +f 162/189/1 111/566/1 41/190/1 +f 225/192/1 61/567/1 114/193/1 +f 178/195/1 177/568/1 124/196/1 +f 197/198/2 200/569/2 121/199/2 +f 46/201/4 78/570/4 151/202/4 +f 104/204/5 146/465/5 143/205/5 +f 12/207/2 5/571/2 9/208/2 +f 27/210/4 220/572/4 219/211/4 +f 17/213/4 156/573/4 75/214/4 +f 49/216/3 206/574/3 50/217/3 +f 167/218/4 203/575/4 202/219/4 +f 82/221/3 75/576/3 73/222/3 +f 181/224/4 208/577/4 86/225/4 +f 18/578/4 19/579/4 76/580/4 +f 19/579/4 80/581/4 76/580/4 +f 76/580/4 9/582/4 157/583/4 +f 9/582/4 72/584/4 157/583/4 +f 157/583/4 18/578/4 76/580/4 +f 72/584/4 3/585/4 137/586/4 +f 198/229/4 196/587/4 81/227/4 +f 196/587/4 73/588/4 81/227/4 +f 73/588/4 157/583/4 31/589/4 +f 157/583/4 72/584/4 31/589/4 +f 72/584/4 137/586/4 31/589/4 +f 31/589/4 74/590/4 73/588/4 +f 74/590/4 81/227/4 73/588/4 +f 173/230/4 50/325/4 83/231/4 +f 226/233/3 109/591/3 114/234/3 +f 201/236/4 79/592/4 158/237/4 +f 112/239/5 116/593/5 111/240/5 +f 90/242/5 211/150/5 100/243/5 +f 134/88/3 227/594/3 63/245/3 +f 98/246/4 60/595/4 99/247/4 +f 211/249/3 133/596/3 62/250/3 +f 199/251/1 120/597/1 172/252/1 +f 216/254/1 190/312/1 189/255/1 +f 221/257/1 59/598/1 44/258/1 +f 103/260/5 136/599/5 67/261/5 +f 104/263/1 136/600/1 103/264/1 +f 197/266/1 170/601/1 47/267/1 +f 24/602/6 216/603/6 55/271/6 +f 216/603/6 213/604/6 55/271/6 +f 213/604/6 210/269/6 55/271/6 +f 154/272/2 8/605/2 147/273/2 +f 174/275/3 123/606/3 203/276/3 +f 10/278/1 6/607/1 106/279/1 +f 190/281/3 216/348/3 24/282/3 +f 84/284/4 23/608/4 179/285/4 +f 59/287/3 205/609/3 158/288/3 +f 16/290/1 161/610/1 152/291/1 +f 109/611/1 226/612/1 112/613/1 +f 226/612/1 132/614/1 112/613/1 +f 132/614/1 116/615/1 112/613/1 +f 112/613/1 43/616/1 109/611/1 +f 43/616/1 108/294/1 109/611/1 +f 108/294/1 36/469/1 147/468/1 +f 8/295/1 153/617/1 160/293/1 +f 153/617/1 15/618/1 160/293/1 +f 108/294/1 147/468/1 8/295/1 +f 222/619/1 224/620/1 15/618/1 +f 224/620/1 160/293/1 15/618/1 +f 160/293/1 109/611/1 108/294/1 +f 15/618/1 115/621/1 222/619/1 +f 77/296/4 148/622/4 5/297/4 +f 65/299/5 166/385/5 165/300/5 +f 101/302/4 63/623/4 166/303/4 +f 100/305/4 62/624/4 101/306/4 +f 56/308/1 57/28/1 24/309/1 +f 93/311/4 218/625/4 216/254/4 +f 30/313/2 135/626/2 165/314/2 +f 172/318/6 117/627/6 168/316/6 +f 117/627/6 169/516/6 168/316/6 +f 168/316/6 173/518/6 175/317/6 +f 92/319/4 91/628/4 52/320/4 +f 194/322/3 223/629/3 95/323/3 +f 50/325/1 123/630/1 174/326/1 +f 22/327/2 129/631/2 110/328/2 +f 133/330/6 134/127/6 101/331/6 +f 129/333/1 130/632/1 159/334/1 +f 185/336/3 51/633/3 84/337/3 +f 7/339/2 106/634/2 6/340/2 +f 15/342/2 153/635/2 152/343/2 +f 35/345/1 39/636/1 142/346/1 +f 216/348/2 26/637/2 195/349/2 +f 53/350/4 90/638/4 210/351/4 +f 30/353/6 102/639/6 64/354/6 +f 162/356/3 42/640/3 43/357/3 +f 140/359/4 2/641/4 1/360/4 +f 78/362/5 46/642/5 45/363/5 +f 83/365/2 125/643/2 176/366/2 +f 65/100/3 66/644/3 64/368/3 +f 172/369/3 120/645/3 118/370/3 +f 34/372/5 38/646/5 37/373/5 +f 109/375/5 160/647/5 113/376/5 +f 220/648/6 204/125/6 201/486/6 +f 201/486/6 205/649/6 59/650/6 +f 221/651/6 132/652/6 220/648/6 +f 132/652/6 226/653/6 28/654/6 +f 220/648/6 132/652/6 28/654/6 +f 201/486/6 59/650/6 221/651/6 +f 28/654/6 219/655/6 220/648/6 +f 220/648/6 201/486/6 221/651/6 +f 226/653/6 61/656/6 98/657/6 +f 61/656/6 225/658/6 98/657/6 +f 225/658/6 224/659/6 97/660/6 +f 98/657/6 225/658/6 97/660/6 +f 224/659/6 222/661/6 223/662/6 +f 222/661/6 130/378/6 215/380/6 +f 223/662/6 222/661/6 215/380/6 +f 130/378/6 129/663/6 22/664/6 +f 20/379/6 19/665/6 199/666/6 +f 19/665/6 18/667/6 118/668/6 +f 130/378/6 22/664/6 20/379/6 +f 28/654/6 226/653/6 98/657/6 +f 18/667/6 17/669/6 21/670/6 +f 17/669/6 82/671/6 119/672/6 +f 196/673/6 198/124/6 197/126/6 +f 17/669/6 119/672/6 21/670/6 +f 82/671/6 196/673/6 119/672/6 +f 26/674/6 216/675/6 217/676/6 +f 216/675/6 218/677/6 217/676/6 +f 196/673/6 197/126/6 119/672/6 +f 119/672/6 48/678/6 124/679/6 +f 217/676/6 218/677/6 98/657/6 +f 97/660/6 217/676/6 98/657/6 +f 119/672/6 124/679/6 21/670/6 +f 118/668/6 120/680/6 199/666/6 +f 18/667/6 21/670/6 118/668/6 +f 215/380/6 95/681/6 223/662/6 +f 223/662/6 97/660/6 224/659/6 +f 19/665/6 118/668/6 199/666/6 +f 20/379/6 199/666/6 215/380/6 +f 96/381/4 97/682/4 223/382/4 +f 227/384/6 65/299/6 166/385/6 +f 136/387/3 104/683/3 140/388/3 +f 178/390/3 48/684/3 119/391/3 +f 189/393/2 186/685/2 210/394/2 +f 144/396/2 103/686/2 1/397/2 +f 71/399/4 38/687/4 34/400/4 +f 193/402/4 95/688/4 215/403/4 +f 98/405/3 218/689/3 93/406/3 +f 192/690/6 99/691/6 191/410/6 +f 99/691/6 60/692/6 191/410/6 +f 93/408/6 190/530/6 57/532/6 +f 60/692/6 93/408/6 191/410/6 +f 58/693/6 188/514/6 27/512/6 +f 187/694/6 52/483/6 56/409/6 +f 52/483/6 191/410/6 56/409/6 +f 191/410/6 58/693/6 192/690/6 +f 58/693/6 27/512/6 192/690/6 +f 93/408/6 57/532/6 56/409/6 +f 224/411/2 225/695/2 113/412/2 +f 138/414/4 150/696/4 149/415/4 +f 58/417/1 191/697/1 25/418/1 +f 212/420/1 91/628/1 52/320/1 +f 151/422/5 74/698/5 31/423/5 +f 125/425/1 206/699/1 49/426/1 +f 42/428/1 146/700/1 145/429/1 diff --git a/mods/x_farming/models/x_farming_french_potatoes.obj b/mods/x_farming/models/x_farming_french_potatoes.obj new file mode 100644 index 00000000..8132e23b --- /dev/null +++ b/mods/x_farming/models/x_farming_french_potatoes.obj @@ -0,0 +1,640 @@ +# Blender v2.83.20 OBJ File: 'x_farming_french_potatoes_2--clean.blend' +# www.blender.org +mtllib x_farming_french_potatoes.mtl +o french_potatoes_french_potatos.vox.002 +v 0.520000 -0.500000 -0.390000 +v -0.520000 -0.500000 0.390000 +v 0.520000 -0.500000 0.390000 +v -0.520000 -0.500000 -0.390000 +v -0.520000 -0.435000 -0.390000 +v 0.520000 -0.435000 -0.390000 +v 0.520000 -0.435000 0.390000 +v -0.390000 -0.435000 0.325000 +v 0.390000 -0.435000 0.325000 +v -0.520000 -0.435000 0.390000 +v -0.390000 -0.435000 -0.325000 +v 0.390000 -0.435000 -0.325000 +v -0.390000 -0.435000 0.390000 +v 0.390000 -0.435000 -0.390000 +v -0.455000 -0.240000 0.390000 +v -0.455000 -0.175000 0.390000 +v -0.455000 -0.240000 0.130000 +v -0.520000 -0.175000 0.130000 +v -0.520000 -0.175000 -0.130000 +v -0.520000 -0.240000 -0.130000 +v -0.455000 -0.240000 -0.130000 +v -0.455000 -0.240000 -0.390000 +v 0.390000 -0.240000 0.325000 +v 0.455000 -0.240000 0.130000 +v 0.455000 -0.175000 0.130000 +v 0.520000 -0.175000 -0.130000 +v 0.455000 -0.240000 -0.130000 +v 0.455000 -0.175000 -0.130000 +v 0.455000 -0.240000 -0.390000 +v 0.520000 -0.240000 -0.130000 +v -0.390000 -0.240000 0.325000 +v 0.455000 -0.240000 0.390000 +v -0.520000 -0.240000 0.130000 +v 0.520000 -0.240000 0.130000 +v -0.390000 -0.240000 -0.325000 +v 0.390000 -0.240000 -0.325000 +v 0.390000 -0.435000 0.325000 +v 0.390000 -0.435000 -0.325000 +v 0.455000 -0.175000 0.390000 +v -0.390000 -0.175000 0.325000 +v 0.390000 -0.175000 0.325000 +v -0.455000 -0.175000 0.130000 +v 0.520000 -0.175000 0.130000 +v -0.455000 -0.175000 -0.130000 +v -0.390000 -0.175000 -0.325000 +v -0.455000 -0.175000 -0.390000 +v 0.455000 -0.175000 -0.390000 +v -0.390000 -0.435000 0.325000 +v -0.390000 -0.240000 0.390000 +v -0.390000 -0.175000 0.390000 +v -0.390000 -0.435000 -0.325000 +v 0.390000 -0.175000 -0.390000 +v 0.390000 -0.240000 -0.390000 +v 0.390000 -0.175000 -0.325000 +v -0.260000 -0.175000 0.195000 +v -0.260000 -0.110000 0.195000 +v -0.325000 -0.110000 -0.130000 +v -0.260000 -0.175000 -0.130000 +v -0.260000 -0.110000 -0.130000 +v -0.260000 -0.110000 -0.195000 +v 0.000000 -0.175000 0.195000 +v 0.000000 -0.110000 0.195000 +v 0.000000 -0.110000 0.260000 +v 0.325000 -0.110000 0.130000 +v 0.325000 -0.175000 0.000000 +v 0.260000 -0.175000 0.000000 +v 0.260000 -0.110000 0.000000 +v 0.260000 -0.175000 -0.195000 +v 0.195000 -0.175000 -0.260000 +v 0.195000 -0.110000 -0.260000 +v -0.195000 -0.175000 0.260000 +v -0.195000 -0.175000 0.195000 +v 0.260000 -0.175000 0.130000 +v -0.325000 -0.175000 0.000000 +v -0.260000 -0.175000 0.000000 +v -0.260000 -0.110000 0.000000 +v -0.325000 -0.110000 0.000000 +v 0.325000 -0.110000 0.000000 +v -0.065000 -0.110000 -0.195000 +v -0.065000 -0.175000 -0.195000 +v 0.195000 -0.175000 -0.195000 +v 0.260000 -0.110000 -0.195000 +v -0.390000 -0.175000 0.325000 +v 0.000000 -0.175000 0.260000 +v 0.390000 -0.175000 0.325000 +v 0.260000 -0.175000 0.195000 +v 0.325000 -0.175000 0.130000 +v -0.325000 -0.175000 -0.130000 +v -0.260000 -0.175000 -0.195000 +v -0.390000 -0.175000 -0.325000 +v -0.065000 -0.175000 -0.260000 +v 0.390000 -0.175000 -0.325000 +v -0.195000 -0.110000 0.260000 +v -0.195000 -0.110000 0.195000 +v 0.260000 -0.110000 0.195000 +v 0.260000 -0.110000 0.130000 +v -0.065000 -0.110000 -0.260000 +v 0.195000 -0.110000 -0.195000 +v -0.195000 -0.175000 -0.325000 +v 0.195000 -0.435000 0.325000 +v 0.195000 -0.435000 -0.325000 +v -0.195000 -0.175000 0.325000 +v 0.195000 -0.175000 0.325000 +v 0.195000 -0.175000 -0.325000 +v -0.195000 -0.435000 -0.325000 +v -0.195000 -0.435000 0.325000 +v 0.390000 -0.175000 0.130000 +v -0.390000 -0.175000 -0.130000 +v 0.195000 -0.175000 -0.195000 +v 0.195000 -0.175000 0.195000 +v 0.195000 -0.110000 0.195000 +v 0.195000 -0.110000 -0.195000 +v 0.000000 -0.435000 0.325000 +v 0.000000 -0.435000 -0.325000 +v 0.000000 -0.175000 0.325000 +v 0.000000 -0.175000 -0.325000 +v 0.000000 -0.175000 -0.260000 +v 0.000000 -0.175000 0.195000 +v 0.000000 -0.110000 0.195000 +v 0.000000 -0.110000 -0.260000 +v -0.195000 -0.175000 -0.195000 +v -0.195000 -0.175000 0.195000 +v -0.195000 -0.110000 0.195000 +v -0.195000 -0.110000 -0.195000 +vt 0.437500 0.953125 +vt 0.500000 0.937500 +vt 0.000000 0.937500 +vt 0.500000 0.750000 +vt 0.000000 0.562500 +vt 0.000000 0.750000 +vt 0.062500 0.968750 +vt 0.000000 0.953125 +vt 0.500000 0.953125 +vt 0.375000 0.968750 +vt 0.000000 0.984375 +vt 0.375000 0.984375 +vt 0.375000 0.984375 +vt 0.000000 1.000000 +vt 0.000000 0.984375 +vt 0.062500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.765625 +vt 0.062500 0.921875 +vt 0.437500 0.937500 +vt 0.000000 0.937500 +vt 0.812500 0.343750 +vt 0.500000 0.328125 +vt 0.812500 0.328125 +vt 0.500000 0.406250 +vt 0.812500 0.390625 +vt 0.500000 0.390625 +vt 0.125000 0.421875 +vt 0.000000 0.437500 +vt 0.000000 0.421875 +vt 0.437500 0.375000 +vt 0.031250 0.390625 +vt 0.437500 0.390625 +vt 0.500000 0.218750 +vt 0.875000 0.265625 +vt 0.875000 0.218750 +vt 0.250000 0.421875 +vt 0.125000 0.437500 +vt 0.125000 0.421875 +vt 0.500000 0.265625 +vt 0.875000 0.281250 +vt 0.500000 0.281250 +vt 0.875000 0.203125 +vt 0.500000 0.218750 +vt 0.500000 0.203125 +vt 0.125000 0.468750 +vt 0.000000 0.453125 +vt 0.000000 0.468750 +vt 0.500000 0.000000 +vt 0.875000 0.156250 +vt 0.875000 0.000000 +vt 0.156250 0.468750 +vt 0.187500 0.453125 +vt 0.156250 0.453125 +vt 0.125000 0.484375 +vt 0.000000 0.468750 +vt 0.000000 0.484375 +vt 0.875000 0.156250 +vt 0.500000 0.156250 +vt 0.062500 0.390625 +vt 0.468750 0.406250 +vt 0.062500 0.406250 +vt 0.156250 0.406250 +vt 0.125000 0.421875 +vt 0.125000 0.406250 +vt 0.125000 0.406250 +vt 0.000000 0.421875 +vt 0.000000 0.406250 +vt 0.812500 0.343750 +vt 0.500000 0.343750 +vt 0.250000 0.484375 +vt 0.125000 0.468750 +vt 0.125000 0.484375 +vt 0.500000 0.281250 +vt 0.812500 0.281250 +vt 0.156250 0.421875 +vt 0.187500 0.406250 +vt 0.156250 0.406250 +vt 0.156250 0.453125 +vt 0.125000 0.468750 +vt 0.125000 0.453125 +vt 0.062500 0.171875 +vt 0.031250 0.187500 +vt 0.031250 0.125000 +vt 0.437500 0.015625 +vt 0.468750 0.000000 +vt 0.468750 0.062500 +vt 0.031250 0.375000 +vt 0.062500 0.359375 +vt 0.468750 0.187500 +vt 0.062500 0.187500 +vt 0.437500 0.203125 +vt 0.000000 0.953125 +vt 0.500000 0.953125 +vt 0.500000 0.562500 +vt 0.500000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.968750 +vt 0.375000 1.000000 +vt 0.500000 0.937500 +vt 0.437500 0.921875 +vt 0.062500 0.765625 +vt 0.000000 0.750000 +vt 0.500000 0.343750 +vt 0.812500 0.406250 +vt 0.125000 0.437500 +vt 0.468750 0.390625 +vt 0.468750 0.375000 +vt 0.250000 0.437500 +vt 0.875000 0.218750 +vt 0.125000 0.453125 +vt 0.500000 0.156250 +vt 0.187500 0.468750 +vt 0.125000 0.468750 +vt 0.031250 0.406250 +vt 0.031250 0.390625 +vt 0.468750 0.390625 +vt 0.156250 0.421875 +vt 0.125000 0.421875 +vt 0.250000 0.468750 +vt 0.187500 0.421875 +vt 0.156250 0.468750 +vt 0.031250 0.062500 +vt 0.031250 0.000000 +vt 0.062500 0.015625 +vt 0.062500 0.000000 +vt 0.000000 0.125000 +vt 0.000000 0.062500 +vt 0.437500 0.171875 +vt 0.437500 0.187500 +vt 0.500000 0.062500 +vt 0.500000 0.125000 +vt 0.468750 0.125000 +vt 0.468750 0.187500 +vt 0.062500 0.203125 +vt 0.031250 0.250000 +vt 0.031250 0.187500 +vt 0.000000 0.250000 +vt 0.000000 0.312500 +vt 0.031250 0.312500 +vt 0.437500 0.359375 +vt 0.468750 0.312500 +vt 0.500000 0.312500 +vt 0.500000 0.250000 +vt 0.468750 0.250000 +vt 0.250000 0.843750 +vt 0.000000 0.875000 +vt 0.250000 0.875000 +vt 0.187500 0.937500 +vt 0.000000 0.906250 +vt 0.000000 0.937500 +vt 0.250000 0.875000 +vt 0.000000 0.906250 +vt 0.000000 0.875000 +vt 0.375000 0.937500 +vt 0.312500 0.968750 +vt 0.312500 0.937500 +vt 0.375000 0.843750 +vt 0.312500 0.875000 +vt 0.312500 0.843750 +vt 0.375000 0.906250 +vt 0.187500 0.937500 +vt 0.187500 0.906250 +vt 0.312500 0.875000 +vt 0.250000 0.906250 +vt 0.250000 0.875000 +vt 0.125000 0.843750 +vt 0.187500 0.812500 +vt 0.125000 0.812500 +vt 0.187500 0.843750 +vt 0.250000 0.812500 +vt 0.187500 0.812500 +vt 0.312500 0.968750 +vt 0.187500 0.937500 +vt 0.312500 0.937500 +vt 0.312500 1.000000 +vt 0.187500 0.968750 +vt 0.187500 1.000000 +vt 0.062500 0.812500 +vt 0.000000 0.843750 +vt 0.000000 0.812500 +vt 0.375000 0.968750 +vt 0.437500 0.937500 +vt 0.375000 0.937500 +vt 0.312500 1.000000 +vt 0.375000 0.968750 +vt 0.312500 0.968750 +vt 0.312500 0.281250 +vt 0.375000 0.093750 +vt 0.625000 0.187500 +vt 0.437500 0.968750 +vt 0.375000 1.000000 +vt 0.375000 0.968750 +vt 0.250000 0.875000 +vt 0.312500 0.843750 +vt 0.250000 0.843750 +vt 0.187500 0.968750 +vt 0.000000 0.937500 +vt 0.000000 0.968750 +vt 0.312500 0.906250 +vt 0.375000 0.875000 +vt 0.312500 0.875000 +vt 0.187500 0.968750 +vt 0.000000 1.000000 +vt 0.000000 0.968750 +vt 0.125000 0.812500 +vt 0.062500 0.843750 +vt 0.062500 0.812500 +vt 0.000000 0.343750 +vt 0.125000 0.468750 +vt 0.500000 0.468750 +vt 0.000000 0.500000 +vt 0.125000 0.625000 +vt 0.500000 0.625000 +vt 0.187500 0.062500 +vt 0.125000 0.093750 +vt 0.000000 0.031250 +vt 0.312500 0.312500 +vt 0.562500 0.312500 +vt 0.750000 0.343750 +vt 0.125000 0.656250 +vt 0.500000 0.656250 +vt 0.000000 0.656250 +vt 0.000000 0.781250 +vt 0.125000 0.781250 +vt 0.562500 0.781250 +vt 0.125000 0.812500 +vt 0.562500 0.812500 +vt 0.125000 0.500000 +vt 0.500000 0.500000 +vt 0.000000 0.843750 +vt 0.187500 0.906250 +vt 0.250000 0.906250 +vt 0.375000 0.968750 +vt 0.375000 0.875000 +vt 0.375000 0.937500 +vt 0.312500 0.906250 +vt 0.187500 0.843750 +vt 0.250000 0.843750 +vt 0.187500 0.968750 +vt 0.312500 0.968750 +vt 0.062500 0.843750 +vt 0.437500 0.968750 +vt 0.375000 1.000000 +vt 0.125000 0.281250 +vt 0.125000 0.250000 +vt 0.062500 0.250000 +vt 0.062500 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.093750 +vt 0.187500 0.093750 +vt 0.562500 0.312500 +vt 0.312500 0.312500 +vt 0.187500 0.062500 +vt 0.375000 0.062500 +vt 0.562500 0.281250 +vt 0.625000 0.281250 +vt 0.687500 0.125000 +vt 0.687500 0.187500 +vt 0.625000 0.093750 +vt 0.625000 0.125000 +vt 0.437500 1.000000 +vt 0.312500 0.875000 +vt 0.187500 0.937500 +vt 0.375000 0.906250 +vt 0.187500 1.000000 +vt 0.125000 0.843750 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.000000 0.468750 +vt 0.625000 0.625000 +vt 0.625000 0.500000 +vt 0.000000 0.625000 +vt 0.062500 0.187500 +vt 0.062500 0.250000 +vt 0.000000 0.250000 +vt 0.750000 0.031250 +vt 0.750000 0.125000 +vt 0.625000 0.093750 +vt 0.687500 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.093750 +vt 0.375000 0.062500 +vt 0.187500 0.093750 +vt 0.125000 0.187500 +vt 0.125000 0.281250 +vt 0.312500 0.281250 +vt 0.562500 0.281250 +vt 0.625000 0.281250 +vt 0.625000 0.187500 +vt 0.687500 0.187500 +vt 0.000000 0.343750 +vt 0.125000 0.250000 +vt 0.625000 0.781250 +vt 0.625000 0.656250 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +g french_potatoes_french_potatos.vox.002_french-potatoes +usemtl french-potatoes +s off +f 14/1/1 1/2/1 4/3/1 +f 1/4/2 2/5/2 4/6/2 +f 13/7/3 2/8/3 3/9/3 +f 4/10/4 10/11/4 5/12/4 +f 1/13/5 7/14/5 3/15/5 +f 13/16/6 7/17/6 9/18/6 +f 11/19/6 14/20/6 5/21/6 +f 45/22/5 31/23/5 35/24/5 +f 41/25/4 36/26/4 23/27/4 +f 24/28/5 39/29/5 32/30/5 +f 53/31/1 46/32/1 52/33/1 +f 51/34/1 36/35/1 38/36/1 +f 29/37/5 28/38/5 27/39/5 +f 35/40/3 54/41/3 45/42/3 +f 23/43/3 40/44/3 31/45/3 +f 42/46/4 15/47/4 16/48/4 +f 48/49/2 38/50/2 37/51/2 +f 19/52/1 21/53/1 20/54/1 +f 19/55/4 33/56/4 18/57/4 +f 37/58/3 31/45/3 48/59/3 +f 49/60/3 39/61/3 50/62/3 +f 34/63/3 25/64/3 24/65/3 +f 30/66/5 43/67/5 34/68/5 +f 38/69/5 23/27/5 37/70/5 +f 46/71/4 21/72/4 44/73/4 +f 48/74/4 35/24/4 51/75/4 +f 28/76/1 30/77/1 27/78/1 +f 17/79/3 18/80/3 33/81/3 +f 45/82/6 46/83/6 44/84/6 +f 41/85/6 39/86/6 25/87/6 +f 22/88/2 53/31/2 35/89/2 +f 32/90/2 49/91/2 23/92/2 +f 4/3/1 5/93/1 14/1/1 +f 14/1/1 6/94/1 1/2/1 +f 1/4/2 3/95/2 2/5/2 +f 3/9/3 7/96/3 13/7/3 +f 13/7/3 10/97/3 2/8/3 +f 4/10/4 2/98/4 10/11/4 +f 1/13/5 6/99/5 7/14/5 +f 7/17/6 6/100/6 12/101/6 +f 6/100/6 14/20/6 12/101/6 +f 12/101/6 9/18/6 7/17/6 +f 8/102/6 13/16/6 9/18/6 +f 11/19/6 12/101/6 14/20/6 +f 5/21/6 10/103/6 8/102/6 +f 10/103/6 13/16/6 8/102/6 +f 8/102/6 11/19/6 5/21/6 +f 45/22/5 40/104/5 31/23/5 +f 41/25/4 54/105/4 36/26/4 +f 24/28/5 25/106/5 39/29/5 +f 52/33/1 47/107/1 29/108/1 +f 53/31/1 22/88/1 46/32/1 +f 52/33/1 29/108/1 53/31/1 +f 51/34/1 35/40/1 36/35/1 +f 29/37/5 47/109/5 28/38/5 +f 35/40/3 36/35/3 54/41/3 +f 23/43/3 41/110/3 40/44/3 +f 42/46/4 17/111/4 15/47/4 +f 48/49/2 51/112/2 38/50/2 +f 19/52/1 44/113/1 21/53/1 +f 19/55/4 20/114/4 33/56/4 +f 37/58/3 23/43/3 31/45/3 +f 16/115/3 15/116/3 49/60/3 +f 49/60/3 32/117/3 39/61/3 +f 50/62/3 16/115/3 49/60/3 +f 34/63/3 43/118/3 25/64/3 +f 30/66/5 26/119/5 43/67/5 +f 38/69/5 36/26/5 23/27/5 +f 46/71/4 22/120/4 21/72/4 +f 48/74/4 31/23/4 35/24/4 +f 28/76/1 26/121/1 30/77/1 +f 17/79/3 42/122/3 18/80/3 +f 42/123/6 16/124/6 40/125/6 +f 16/124/6 50/126/6 40/125/6 +f 40/125/6 45/82/6 42/123/6 +f 19/127/6 18/128/6 42/123/6 +f 45/82/6 54/129/6 52/130/6 +f 44/84/6 19/127/6 42/123/6 +f 45/82/6 52/130/6 46/83/6 +f 44/84/6 42/123/6 45/82/6 +f 25/87/6 43/131/6 26/132/6 +f 28/133/6 47/134/6 54/129/6 +f 47/134/6 52/130/6 54/129/6 +f 25/87/6 26/132/6 28/133/6 +f 40/125/6 50/126/6 41/85/6 +f 50/126/6 39/86/6 41/85/6 +f 54/129/6 41/85/6 25/87/6 +f 25/87/6 28/133/6 54/129/6 +f 35/89/2 31/135/2 17/136/2 +f 31/135/2 49/91/2 15/137/2 +f 17/136/2 31/135/2 15/137/2 +f 17/136/2 33/138/2 20/139/2 +f 17/136/2 20/139/2 21/140/2 +f 53/31/2 36/141/2 35/89/2 +f 17/136/2 21/140/2 35/89/2 +f 21/140/2 22/88/2 35/89/2 +f 23/92/2 36/141/2 27/142/2 +f 36/141/2 53/31/2 29/108/2 +f 27/142/2 36/141/2 29/108/2 +f 27/142/2 30/143/2 34/144/2 +f 27/142/2 34/144/2 24/145/2 +f 49/91/2 31/135/2 23/92/2 +f 27/142/2 24/145/2 23/92/2 +f 24/145/2 32/90/2 23/92/2 +g french_potatoes_french_potatos.vox.002_just_potatoes +usemtl just_potatoes +f 69/146/1 97/147/1 70/148/1 +f 79/149/1 89/150/1 60/151/1 +f 86/152/3 62/153/3 61/154/3 +f 72/155/3 56/156/3 55/157/3 +f 73/158/5 95/159/5 86/160/5 +f 84/161/3 93/162/3 71/163/3 +f 75/164/3 77/165/3 74/166/3 +f 79/167/4 91/168/4 80/169/4 +f 67/170/1 65/171/1 66/172/1 +f 78/173/5 87/174/5 65/175/5 +f 57/176/4 74/177/4 77/178/4 +f 61/179/5 63/180/5 84/181/5 +f 93/182/4 72/183/4 71/184/4 +f 98/185/1 68/186/1 81/187/1 +f 79/188/6 62/189/6 67/190/6 +f 69/191/5 98/192/5 81/193/5 +f 59/194/4 89/195/4 58/196/4 +f 76/197/4 55/198/4 56/199/4 +f 57/200/1 58/201/1 88/202/1 +f 68/203/5 67/204/5 66/205/5 +f 87/206/3 96/207/3 73/208/3 +f 106/209/4 122/210/4 121/211/4 +f 100/212/4 110/213/4 109/214/4 +f 71/215/6 55/216/6 83/217/6 +f 91/218/6 69/219/6 92/220/6 +f 109/214/4 111/221/4 112/222/4 +f 113/223/4 115/224/4 118/225/4 +f 117/226/4 119/227/4 120/228/4 +f 121/211/4 123/229/4 124/230/4 +f 69/146/1 91/231/1 97/147/1 +f 79/149/1 80/232/1 89/150/1 +f 86/152/3 95/233/3 62/153/3 +f 72/155/3 94/234/3 56/156/3 +f 73/158/5 96/235/5 95/159/5 +f 84/161/3 63/236/3 93/162/3 +f 75/164/3 76/237/3 77/165/3 +f 79/167/4 97/238/4 91/168/4 +f 67/170/1 78/239/1 65/171/1 +f 78/173/5 64/240/5 87/174/5 +f 57/176/4 88/241/4 74/177/4 +f 61/179/5 62/242/5 63/180/5 +f 93/182/4 94/243/4 72/183/4 +f 98/185/1 82/244/1 68/186/1 +f 79/188/6 60/245/6 59/246/6 +f 59/246/6 57/247/6 77/248/6 +f 76/249/6 56/250/6 94/251/6 +f 59/246/6 77/248/6 76/249/6 +f 70/252/6 97/253/6 79/188/6 +f 79/188/6 59/246/6 76/249/6 +f 94/251/6 93/254/6 63/255/6 +f 79/188/6 76/249/6 62/189/6 +f 76/249/6 94/251/6 62/189/6 +f 98/256/6 70/252/6 79/188/6 +f 67/190/6 82/257/6 98/256/6 +f 64/258/6 78/259/6 67/190/6 +f 62/189/6 95/260/6 96/261/6 +f 96/261/6 64/258/6 67/190/6 +f 67/190/6 98/256/6 79/188/6 +f 94/251/6 63/255/6 62/189/6 +f 62/189/6 96/261/6 67/190/6 +f 69/191/5 70/262/5 98/192/5 +f 59/194/4 60/263/4 89/195/4 +f 76/197/4 75/264/4 55/198/4 +f 57/200/1 59/265/1 58/201/1 +f 68/203/5 82/266/5 67/204/5 +f 87/206/3 64/267/3 96/207/3 +f 99/268/4 105/269/4 121/211/4 +f 105/269/4 106/209/4 121/211/4 +f 106/209/4 102/270/4 122/210/4 +f 104/271/4 101/272/4 109/214/4 +f 101/272/4 100/212/4 109/214/4 +f 100/212/4 103/273/4 110/213/4 +f 74/274/6 88/275/6 108/276/6 +f 85/277/6 107/278/6 86/279/6 +f 107/278/6 87/280/6 86/279/6 +f 87/280/6 73/281/6 86/279/6 +f 86/279/6 61/282/6 84/283/6 +f 71/215/6 72/284/6 55/216/6 +f 55/216/6 75/285/6 74/274/6 +f 74/274/6 108/276/6 83/217/6 +f 85/277/6 86/279/6 84/283/6 +f 55/216/6 74/274/6 83/217/6 +f 85/277/6 84/283/6 83/217/6 +f 84/283/6 71/215/6 83/217/6 +f 89/286/6 80/287/6 91/218/6 +f 69/219/6 81/288/6 68/289/6 +f 68/289/6 66/290/6 65/291/6 +f 65/291/6 87/280/6 107/278/6 +f 90/292/6 108/276/6 89/286/6 +f 108/276/6 88/275/6 89/286/6 +f 88/275/6 58/293/6 89/286/6 +f 65/291/6 107/278/6 92/220/6 +f 68/289/6 65/291/6 92/220/6 +f 90/292/6 89/286/6 91/218/6 +f 69/219/6 68/289/6 92/220/6 +f 90/292/6 91/218/6 92/220/6 +f 109/214/4 110/213/4 111/221/4 +f 116/294/4 114/295/4 117/226/4 +f 114/295/4 113/223/4 118/225/4 +f 117/226/4 114/295/4 118/225/4 +f 117/226/4 118/225/4 119/227/4 +f 121/211/4 122/210/4 123/229/4 diff --git a/mods/x_farming/models/x_farming_fries.obj b/mods/x_farming/models/x_farming_fries.obj new file mode 100644 index 00000000..b43810a7 --- /dev/null +++ b/mods/x_farming/models/x_farming_fries.obj @@ -0,0 +1,888 @@ +# Blender v3.3.0 OBJ File: 'fries.blend' +# www.blender.org +mtllib fries.mtl +o fries +v 0.200000 -0.459000 0.060000 +v 0.080000 -0.459000 0.060000 +v 0.000000 -0.459000 0.060000 +v -0.040000 -0.459000 0.060000 +v 0.240000 -0.459000 0.100000 +v 0.080000 -0.459000 -0.060000 +v -0.000000 -0.459000 -0.020000 +v -0.240000 -0.459000 0.100000 +v -0.200000 -0.219000 0.020000 +v -0.200000 -0.219000 -0.060000 +v 0.200000 -0.219000 0.060000 +v -0.120000 -0.059000 0.060000 +v 0.080000 -0.019000 -0.020000 +v 0.040000 -0.019000 0.060000 +v -0.040000 -0.059000 0.020000 +v 0.160000 0.021000 0.060000 +v 0.080000 0.021000 0.060000 +v 0.200000 -0.499000 -0.060000 +v 0.120000 -0.459000 -0.060000 +v -0.200000 -0.499000 -0.060000 +v -0.160000 -0.459000 -0.060000 +v 0.160000 -0.459000 -0.020000 +v -0.080000 -0.459000 -0.020000 +v -0.120000 -0.459000 0.060000 +v 0.160000 -0.259000 -0.100000 +v -0.160000 -0.259000 -0.100000 +v 0.080000 -0.259000 -0.060000 +v -0.120000 -0.219000 0.060000 +v -0.080000 -0.219000 0.060000 +v -0.240000 -0.219000 -0.100000 +v 0.040000 -0.139000 -0.020000 +v 0.160000 -0.059000 0.020000 +v 0.000000 -0.019000 0.020000 +v -0.080000 -0.019000 -0.020000 +v -0.160000 -0.019000 -0.060000 +v 0.160000 0.021000 0.020000 +v 0.120000 0.021000 0.020000 +v 0.200000 -0.499000 0.060000 +v -0.000000 -0.459000 -0.060000 +v -0.120000 -0.459000 -0.020000 +v -0.120000 -0.459000 -0.060000 +v -0.200000 -0.459000 0.060000 +v 0.120000 -0.259000 -0.060000 +v 0.240000 -0.219000 0.100000 +v 0.240000 -0.219000 -0.100000 +v -0.000000 -0.259000 -0.060000 +v -0.160000 -0.259000 -0.060000 +v -0.160000 -0.219000 -0.100000 +v 0.200000 -0.219000 -0.060000 +v 0.040000 -0.219000 0.060000 +v 0.080000 -0.139000 -0.020000 +v 0.040000 -0.139000 0.020000 +v 0.200000 -0.059000 -0.060000 +v 0.120000 -0.059000 0.020000 +v -0.040000 -0.059000 0.060000 +v -0.120000 -0.059000 0.020000 +v 0.120000 -0.019000 -0.060000 +v 0.040000 -0.019000 0.020000 +v -0.000000 -0.019000 -0.060000 +v -0.000000 -0.019000 -0.020000 +v -0.040000 -0.019000 -0.020000 +v 0.200000 0.021000 0.060000 +v 0.120000 0.021000 0.060000 +v -0.160000 0.021000 -0.020000 +v -0.200000 -0.499000 0.060000 +v -0.200000 -0.459000 -0.060000 +v 0.160000 -0.459000 0.060000 +v 0.120000 -0.459000 0.020000 +v 0.120000 -0.459000 -0.020000 +v 0.080000 -0.459000 0.020000 +v 0.040000 -0.459000 -0.020000 +v 0.000000 -0.459000 0.020000 +v -0.160000 -0.459000 0.020000 +v -0.160000 -0.459000 -0.020000 +v -0.240000 -0.459000 -0.100000 +v 0.200000 -0.219000 0.020000 +v 0.160000 -0.219000 0.060000 +v 0.160000 -0.219000 -0.060000 +v 0.160000 -0.259000 -0.060000 +v 0.000000 -0.219000 0.060000 +v -0.240000 -0.219000 0.100000 +v 0.080000 -0.219000 0.060000 +v 0.080000 -0.139000 0.020000 +v 0.160000 -0.059000 -0.060000 +v -0.080000 -0.059000 0.060000 +v -0.160000 -0.059000 0.060000 +v -0.160000 -0.059000 0.020000 +v -0.080000 -0.059000 0.020000 +v 0.200000 -0.459000 0.020000 +v 0.200000 -0.459000 -0.020000 +v 0.200000 -0.459000 -0.060000 +v 0.240000 -0.459000 -0.100000 +v 0.120000 -0.459000 0.060000 +v 0.160000 -0.459000 -0.060000 +v 0.040000 -0.459000 0.060000 +v -0.040000 -0.459000 -0.060000 +v -0.080000 -0.459000 0.060000 +v -0.160000 -0.459000 0.060000 +v -0.200000 -0.459000 0.020000 +v -0.200000 -0.459000 -0.020000 +v 0.160000 -0.459000 0.020000 +v 0.080000 -0.459000 -0.020000 +v 0.040000 -0.459000 0.020000 +v -0.040000 -0.459000 -0.020000 +v -0.120000 -0.459000 0.020000 +v -0.040000 -0.259000 -0.060000 +v -0.120000 -0.259000 -0.060000 +v 0.200000 -0.219000 -0.020000 +v 0.160000 -0.219000 -0.100000 +v 0.120000 -0.219000 0.060000 +v -0.040000 -0.219000 0.060000 +v -0.160000 -0.219000 0.060000 +v -0.200000 -0.219000 0.060000 +v -0.160000 -0.219000 -0.060000 +v -0.200000 -0.219000 -0.020000 +v 0.200000 -0.059000 -0.020000 +v 0.160000 -0.059000 -0.020000 +v 0.120000 -0.059000 -0.020000 +v 0.120000 -0.019000 -0.020000 +v 0.080000 -0.019000 -0.060000 +v 0.000000 -0.019000 0.060000 +v -0.040000 -0.019000 -0.060000 +v -0.040000 -0.019000 0.020000 +v -0.080000 -0.019000 0.020000 +v -0.120000 -0.019000 -0.020000 +v -0.120000 -0.019000 -0.060000 +v -0.160000 -0.019000 -0.020000 +v 0.200000 0.021000 0.020000 +v 0.080000 0.021000 0.020000 +v -0.160000 0.021000 0.020000 +v -0.200000 0.021000 -0.020000 +v -0.200000 0.021000 0.020000 +vt 0.837838 0.297297 +vt 0.864865 0.000000 +vt 0.837838 0.000000 +vt 0.243243 0.810811 +vt 0.216216 0.837838 +vt 0.216216 0.810811 +vt 0.567568 0.324324 +vt 0.540541 0.162162 +vt 0.540541 0.324324 +vt 0.702703 0.594595 +vt 0.675676 0.621622 +vt 0.675676 0.594595 +vt 0.891892 0.000000 +vt 0.891892 0.162162 +vt 0.108108 0.702703 +vt 0.108108 0.486486 +vt 0.135135 0.486486 +vt 0.189189 0.810811 +vt 0.162162 0.837838 +vt 0.162162 0.810811 +vt 0.432432 0.729730 +vt 0.405405 0.513513 +vt 0.432432 0.513513 +vt 0.648649 0.594595 +vt 0.621622 0.621622 +vt 0.621622 0.594595 +vt 0.270270 0.027027 +vt 0.243243 0.162162 +vt 0.270270 0.189189 +vt 0.081081 0.810811 +vt 0.054054 0.810811 +vt 0.054054 0.756757 +vt 0.000000 0.972973 +vt 0.027027 0.810811 +vt 0.027027 0.972973 +vt 0.810811 0.621622 +vt 0.783784 0.621622 +vt 0.783784 0.594595 +vt 0.270270 0.702703 +vt 0.297297 0.486486 +vt 0.297297 0.702703 +vt 0.405405 0.324324 +vt 0.540541 0.162162 +vt 0.540541 0.324324 +vt 0.243243 0.189189 +vt 0.243243 0.324324 +vt 0.216216 0.324324 +vt 0.891892 0.162162 +vt 0.918919 0.000000 +vt 0.918919 0.216216 +vt 0.081081 0.486486 +vt 0.081081 0.702703 +vt 0.216216 0.648649 +vt 0.216216 0.621621 +vt 0.189189 0.756757 +vt 0.891892 0.891892 +vt 0.918919 0.594595 +vt 0.918919 0.891892 +vt 0.783784 0.297297 +vt 0.810811 0.297297 +vt 0.810811 0.162162 +vt 0.513513 0.513513 +vt 0.540541 0.351351 +vt 0.540541 0.513513 +vt 0.648649 0.837838 +vt 0.675676 0.675676 +vt 0.675676 0.837838 +vt 0.945946 0.756757 +vt 0.918919 0.594595 +vt 0.918919 0.756757 +vt 0.810811 0.324324 +vt 0.891892 0.594595 +vt 0.891892 0.324324 +vt 0.810811 0.864865 +vt 0.783784 0.837838 +vt 0.783784 0.783784 +vt 0.027027 0.027027 +vt 0.000000 0.000000 +vt 0.054054 0.027027 +vt 0.405405 0.810811 +vt 0.378378 0.837838 +vt 0.378378 0.810811 +vt 0.513513 0.351351 +vt 0.594595 0.324324 +vt 0.486486 0.351351 +vt 0.351351 0.783784 +vt 0.378378 0.513513 +vt 0.378378 0.783784 +vt 0.702703 0.378378 +vt 0.675676 0.405405 +vt 0.675676 0.378378 +vt 0.135135 0.810811 +vt 0.162162 0.810811 +vt 0.162162 0.756757 +vt 0.081081 0.162162 +vt 0.135135 0.027027 +vt 0.081081 0.027027 +vt 0.351351 0.513513 +vt 0.378378 0.351351 +vt 0.378378 0.513513 +vt 0.378378 0.810811 +vt 0.351351 0.837838 +vt 0.351351 0.810811 +vt 0.405405 0.729730 +vt 0.324324 0.810811 +vt 0.297297 0.837838 +vt 0.297297 0.810811 +vt 0.675676 0.540541 +vt 0.675676 0.567568 +vt 0.648649 0.567568 +vt 0.729730 0.324324 +vt 0.594595 0.324324 +vt 0.675676 0.351351 +vt 0.216216 0.027027 +vt 0.162162 0.162162 +vt 0.216216 0.162162 +vt 0.270270 0.810811 +vt 0.243243 0.837838 +vt 0.243243 0.810811 +vt 0.972973 0.162162 +vt 0.945946 0.000000 +vt 0.972973 0.000000 +vt 0.459459 0.810811 +vt 0.432432 0.837838 +vt 0.432432 0.810811 +vt 0.675676 0.486486 +vt 0.648649 0.486486 +vt 0.675676 0.459459 +vt 0.756757 0.648649 +vt 0.729730 0.675676 +vt 0.702703 0.675676 +vt 0.594595 0.000000 +vt 0.270270 0.162162 +vt 0.594595 0.162162 +vt 0.918919 0.459459 +vt 0.918919 0.594595 +vt 0.945946 0.594595 +vt 0.945946 0.918919 +vt 0.918919 0.756757 +vt 0.918919 0.918919 +vt 0.162162 0.918919 +vt 0.135135 0.810811 +vt 0.135135 0.918919 +vt 0.351351 0.513513 +vt 0.324324 0.675676 +vt 0.027027 0.756757 +vt 0.054054 0.486486 +vt 0.027027 0.486486 +vt 0.297297 0.810811 +vt 0.270270 0.837838 +vt 0.270270 0.810811 +vt 0.027027 0.162162 +vt 0.486486 0.810811 +vt 0.513513 0.810811 +vt 0.513513 0.648649 +vt 0.756757 0.810811 +vt 0.756757 0.648649 +vt 0.783784 0.648649 +vt 0.675676 0.648649 +vt 0.594595 0.648649 +vt 0.621622 0.675676 +vt 0.270270 0.162162 +vt 0.405405 0.324324 +vt 0.405405 0.162162 +vt 0.837838 0.135135 +vt 0.810811 0.135135 +vt 0.270270 0.459459 +vt 0.054054 0.459459 +vt 0.324324 0.324324 +vt 0.918919 0.432432 +vt 0.918919 0.594595 +vt 0.891892 0.594595 +vt 0.648649 0.378378 +vt 0.648649 0.351351 +vt 0.513514 0.783784 +vt 0.540541 0.513513 +vt 0.540541 0.783784 +vt 0.756757 0.270270 +vt 0.783784 0.000000 +vt 0.594595 0.837838 +vt 0.621622 0.837838 +vt 0.081081 0.918919 +vt 0.108108 0.810811 +vt 0.081081 0.810811 +vt 0.459459 0.513513 +vt 0.486486 0.513513 +vt 0.594595 0.324324 +vt 0.567567 0.162162 +vt 0.594595 0.162162 +vt 0.594595 0.810811 +vt 0.567567 0.837838 +vt 0.567567 0.810811 +vt 0.810811 0.756757 +vt 0.837838 0.864865 +vt 0.864865 0.891892 +vt 0.162162 0.864865 +vt 0.189189 0.837838 +vt 0.162162 0.837838 +vt 0.729730 0.486486 +vt 0.756757 0.324324 +vt 0.756757 0.594595 +vt 0.432432 0.675676 +vt 0.432432 0.513513 +vt 0.486486 0.513513 +vt 0.864865 0.594595 +vt 0.864865 0.891892 +vt 0.567567 0.513513 +vt 0.594595 0.648649 +vt 0.567567 0.810811 +vt 0.621622 0.405405 +vt 0.621622 0.378378 +vt 0.594595 0.513513 +vt 0.567568 0.351351 +vt 0.594595 0.351351 +vt 0.162162 0.486486 +vt 0.189189 0.486486 +vt 0.027027 0.945946 +vt 0.054054 0.810811 +vt 0.027027 0.810811 +vt 0.351351 0.810811 +vt 0.324324 0.837838 +vt 0.324324 0.810811 +vt 0.945946 0.000000 +vt 0.270270 0.486486 +vt 0.243243 0.486486 +vt 0.243243 0.648649 +vt 0.729730 0.648649 +vt 0.702703 0.621622 +vt 0.216216 0.810811 +vt 0.189189 0.837838 +vt 0.189189 0.810811 +vt 0.783784 0.324324 +vt 0.000000 0.810811 +vt 0.000000 0.648649 +vt 0.432432 0.810811 +vt 0.405405 0.837838 +vt 0.405405 0.810811 +vt 0.567568 0.675676 +vt 0.081081 0.918919 +vt 0.054054 0.810811 +vt 0.081081 0.810811 +vt 0.405405 0.513513 +vt 0.432432 0.351351 +vt 0.432432 0.513513 +vt 0.594595 0.000000 +vt 0.729730 0.000000 +vt 0.675676 0.027027 +vt 0.513514 0.810811 +vt 0.486486 0.837838 +vt 0.486486 0.810811 +vt 0.324324 0.621621 +vt 0.324324 0.486486 +vt 0.135135 0.918919 +vt 0.108108 0.810811 +vt 0.135135 0.810811 +vt 0.648649 0.432432 +vt 0.621622 0.459459 +vt 0.621622 0.432432 +vt 0.486487 0.810811 +vt 0.459459 0.837838 +vt 0.459459 0.810811 +vt 0.756757 0.000000 +vt 0.729730 0.162162 +vt 0.729730 0.837838 +vt 0.702703 0.837838 +vt 0.864865 0.297297 +vt 0.243243 0.837838 +vt 0.567568 0.162162 +vt 0.891892 0.324324 +vt 0.864865 0.324324 +vt 0.135135 0.783784 +vt 0.108108 0.783784 +vt 0.189189 0.837838 +vt 0.648649 0.621622 +vt 0.243243 0.027027 +vt 0.000000 0.810811 +vt 0.810811 0.459459 +vt 0.810811 0.324324 +vt 0.405405 0.162162 +vt 0.918919 0.297297 +vt 0.891892 0.297297 +vt 0.891892 0.000000 +vt 0.243243 0.648649 +vt 0.243243 0.621621 +vt 0.216216 0.486486 +vt 0.216216 0.756757 +vt 0.891892 0.594595 +vt 0.810811 0.000000 +vt 0.648649 0.675676 +vt 0.945946 0.594595 +vt 0.810811 0.594595 +vt 0.783784 0.702703 +vt 0.783784 0.675676 +vt 0.810811 0.648649 +vt 0.783784 0.648649 +vt 0.783784 0.756757 +vt 0.783784 0.864865 +vt 0.270270 0.000000 +vt 0.162162 0.027027 +vt 0.000000 0.027027 +vt 0.405405 0.837838 +vt 0.324324 0.351351 +vt 0.351351 0.351351 +vt 0.324324 0.324324 +vt 0.405405 0.351351 +vt 0.459459 0.351351 +vt 0.702703 0.405405 +vt 0.135135 0.648649 +vt 0.135135 0.486486 +vt 0.135135 0.162162 +vt 0.378378 0.837838 +vt 0.378378 0.810811 +vt 0.405405 0.810811 +vt 0.324324 0.837838 +vt 0.621622 0.567568 +vt 0.621622 0.540541 +vt 0.675676 0.513514 +vt 0.702703 0.513514 +vt 0.702703 0.567568 +vt 0.621622 0.486486 +vt 0.702703 0.432432 +vt 0.702703 0.486486 +vt 0.702703 0.351351 +vt 0.621622 0.351351 +vt 0.270270 0.837838 +vt 0.945946 0.162162 +vt 0.459459 0.837838 +vt 0.621622 0.513514 +vt 0.648649 0.459459 +vt 0.675676 0.432432 +vt 0.675676 0.675676 +vt 0.675676 0.648649 +vt 0.756757 0.675676 +vt 0.270270 0.000000 +vt 0.945946 0.297297 +vt 0.918919 0.297297 +vt 0.945946 0.756757 +vt 0.162162 0.810811 +vt 0.324324 0.513513 +vt 0.324324 0.783784 +vt 0.297297 0.837838 +vt 0.054054 0.162162 +vt 0.513513 0.513513 +vt 0.783784 0.918919 +vt 0.756757 0.918919 +vt 0.594595 0.675676 +vt 0.270270 0.324324 +vt 0.837838 0.162162 +vt 0.054054 0.486486 +vt 0.000000 0.486486 +vt 0.000000 0.324324 +vt 0.324324 0.486486 +vt 0.270270 0.486486 +vt 0.891892 0.297297 +vt 0.918919 0.297297 +vt 0.513514 0.513513 +vt 0.783784 0.324324 +vt 0.756757 0.324324 +vt 0.108108 0.918919 +vt 0.567567 0.324324 +vt 0.594595 0.837838 +vt 0.864865 0.594595 +vt 0.810811 0.594595 +vt 0.810811 0.864865 +vt 0.837838 0.891892 +vt 0.189189 0.864865 +vt 0.756757 0.648649 +vt 0.729730 0.648649 +vt 0.729730 0.324324 +vt 0.459459 0.810811 +vt 0.459459 0.783784 +vt 0.432432 0.783784 +vt 0.594595 0.513513 +vt 0.594595 0.810811 +vt 0.648649 0.405405 +vt 0.567568 0.513513 +vt 0.054054 0.945946 +vt 0.351351 0.837838 +vt 0.945946 0.216216 +vt 0.243243 0.810811 +vt 0.270270 0.810811 +vt 0.594595 0.648649 +vt 0.216216 0.837838 +vt 0.000000 0.486486 +vt 0.027027 0.810811 +vt 0.432432 0.837838 +vt 0.540541 0.837838 +vt 0.567568 0.513513 +vt 0.054054 0.918919 +vt 0.621622 0.189189 +vt 0.621622 0.216216 +vt 0.594595 0.324324 +vt 0.621622 0.243243 +vt 0.621622 0.162162 +vt 0.621622 0.270270 +vt 0.621622 0.297297 +vt 0.621622 0.135135 +vt 0.621622 0.081081 +vt 0.621622 0.108108 +vt 0.621622 0.027027 +vt 0.621622 0.054054 +vt 0.648649 0.027027 +vt 0.702703 0.027027 +vt 0.648649 0.297297 +vt 0.675676 0.297297 +vt 0.729730 0.324324 +vt 0.702703 0.297297 +vt 0.702703 0.270270 +vt 0.729730 0.270270 +vt 0.729730 0.054054 +vt 0.702703 0.054054 +vt 0.513514 0.837838 +vt 0.297297 0.783784 +vt 0.324324 0.783784 +vt 0.108108 0.918919 +vt 0.486487 0.837838 +vt 0.729730 0.000000 +vt 0.729730 0.270270 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +usemtl fries_Material +s off +f 125/1/1 74/2/1 40/3/1 +f 56/4/2 86/5/2 12/6/2 +f 17/7/1 110/8/1 63/9/1 +f 21/10/2 100/11/2 74/12/2 +f 74/2/3 100/13/3 115/14/3 +f 52/15/3 103/16/3 72/17/3 +f 59/18/2 61/19/2 60/20/2 +f 31/21/3 102/22/3 71/23/3 +f 73/24/2 42/25/2 98/26/2 +f 66/27/1 47/28/1 10/29/1 +f 129/30/3 37/31/3 54/32/3 +f 57/33/3 27/34/3 120/35/3 +f 57/36/4 119/37/4 118/38/4 +f 83/39/4 102/40/4 51/41/4 +f 44/42/4 92/43/4 45/44/4 +f 114/45/3 35/46/3 126/47/3 +f 50/48/4 103/49/4 52/50/4 +f 52/15/1 70/51/1 83/52/1 +f 78/53/5 79/54/5 117/55/5 +f 61/56/3 23/57/3 34/58/3 +f 127/59/5 35/60/5 114/61/5 +f 29/62/3 24/63/3 28/64/3 +f 115/65/4 66/66/4 10/67/4 +f 131/68/5 9/69/5 132/70/5 +f 38/71/6 20/72/6 18/73/6 +f 26/74/2 107/75/2 106/76/2 +f 94/77/3 18/78/3 19/79/3 +f 117/80/2 54/81/2 32/82/2 +f 97/83/1 65/84/1 4/85/1 +f 117/86/3 69/87/3 118/88/3 +f 94/89/2 69/90/2 22/91/2 +f 16/92/5 36/93/5 32/94/5 +f 27/95/1 39/96/1 6/97/1 +f 77/98/3 93/99/3 110/100/3 +f 37/101/2 17/102/2 63/103/2 +f 51/104/1 69/87/1 118/88/1 +f 51/105/2 52/106/2 83/107/2 +f 23/108/2 40/109/2 105/110/2 +f 92/111/6 5/112/6 90/113/6 +f 41/114/1 106/115/1 107/116/1 +f 57/117/2 13/118/2 119/119/2 +f 122/120/3 46/121/3 106/122/3 +f 61/123/2 124/124/2 123/125/2 +f 7/126/2 72/127/2 71/128/2 +f 18/129/4 90/130/4 89/131/4 +f 8/132/1 44/133/1 81/134/1 +f 80/135/5 121/136/5 33/137/5 +f 16/138/1 11/139/1 62/140/1 +f 85/141/1 111/142/1 55/143/1 +f 22/144/1 108/145/1 117/86/1 +f 32/146/1 68/147/1 101/148/1 +f 53/149/2 117/150/2 116/151/2 +f 79/152/1 19/79/1 94/77/1 +f 61/153/5 122/154/5 106/155/5 +f 28/156/4 24/157/4 105/158/4 +f 20/159/5 65/160/5 99/161/5 +f 8/162/5 30/163/5 75/164/5 +f 26/165/4 114/61/4 47/166/4 +f 26/167/3 25/168/3 75/169/3 +f 107/170/4 126/171/4 125/172/4 +f 90/113/2 101/173/2 89/174/2 +f 56/175/3 73/176/3 87/177/3 +f 87/178/4 74/179/4 127/59/4 +f 113/180/4 99/161/4 9/181/4 +f 12/182/1 112/183/1 28/184/1 +f 80/185/3 4/85/3 111/186/3 +f 128/187/4 11/188/4 76/189/4 +f 64/190/2 132/191/2 130/192/2 +f 29/193/5 88/194/5 34/195/5 +f 123/196/1 88/197/1 15/198/1 +f 110/199/4 68/200/4 54/201/4 +f 111/202/4 4/203/4 104/204/4 +f 61/56/1 7/205/1 60/206/1 +f 7/207/4 46/208/4 60/209/4 +f 101/173/2 93/210/2 67/211/2 +f 113/212/3 98/213/3 42/214/3 +f 117/55/4 101/215/4 22/216/4 +f 14/217/1 80/218/1 50/219/1 +f 69/220/2 70/221/2 68/222/2 +f 52/50/5 71/223/5 103/49/5 +f 70/224/5 2/225/5 82/226/5 +f 75/227/6 21/10/6 66/228/6 +f 126/229/2 127/230/2 125/231/2 +f 54/201/5 69/232/5 68/200/5 +f 32/146/3 128/233/3 76/234/3 +f 128/235/2 16/236/2 62/237/2 +f 9/238/1 73/176/1 87/177/1 +f 53/239/4 108/240/4 49/241/4 +f 82/242/3 95/243/3 50/244/3 +f 44/245/2 45/246/2 108/247/2 +f 58/248/2 121/249/2 14/250/2 +f 27/251/5 6/252/5 102/40/5 +f 84/253/3 49/254/3 78/255/3 +f 70/256/2 95/257/2 2/258/2 +f 15/259/2 85/260/2 55/261/2 +f 73/262/5 112/263/5 87/178/5 +f 108/264/5 89/131/5 76/265/5 +f 125/1/1 127/266/1 74/2/1 +f 56/4/2 87/267/2 86/5/2 +f 17/7/1 82/268/1 110/8/1 +f 21/10/2 66/228/2 100/11/2 +f 115/14/3 131/269/3 127/266/3 +f 131/269/3 64/270/3 127/266/3 +f 127/266/3 74/2/3 115/14/3 +f 72/17/3 33/271/3 52/15/3 +f 33/271/3 58/272/3 52/15/3 +f 59/18/2 122/273/2 61/19/2 +f 31/21/3 51/104/3 102/22/3 +f 73/24/2 99/274/2 42/25/2 +f 21/275/1 47/28/1 66/27/1 +f 47/28/1 114/45/1 10/29/1 +f 54/32/3 68/147/3 83/52/3 +f 68/147/3 70/51/3 83/52/3 +f 83/52/3 129/30/3 54/32/3 +f 57/33/3 43/276/3 27/34/3 +f 118/38/4 69/232/4 43/277/4 +f 69/232/4 19/278/4 43/277/4 +f 43/277/4 57/36/4 118/38/4 +f 83/39/4 70/224/4 102/40/4 +f 44/42/4 5/279/4 92/43/4 +f 126/47/3 107/116/3 114/45/3 +f 107/116/3 47/28/3 114/45/3 +f 58/280/4 14/281/4 52/50/4 +f 14/281/4 50/48/4 52/50/4 +f 50/48/4 95/282/4 103/49/4 +f 52/15/1 103/16/1 70/51/1 +f 78/53/5 109/283/5 25/284/5 +f 79/54/5 94/285/5 22/216/5 +f 78/53/5 25/284/5 79/54/5 +f 117/55/5 84/286/5 78/53/5 +f 79/54/5 22/216/5 117/55/5 +f 61/56/3 104/287/3 23/57/3 +f 114/61/5 47/166/5 127/59/5 +f 47/166/5 21/288/5 74/179/5 +f 127/59/5 47/166/5 74/179/5 +f 29/62/3 97/83/3 24/63/3 +f 115/65/4 100/289/4 66/66/4 +f 131/68/5 115/290/5 9/69/5 +f 38/71/6 65/291/6 20/72/6 +f 27/292/2 43/293/2 25/294/2 +f 43/293/2 79/295/2 25/294/2 +f 27/292/2 25/294/2 46/296/2 +f 25/294/2 26/74/2 46/296/2 +f 26/74/2 47/297/2 107/75/2 +f 106/76/2 46/296/2 26/74/2 +f 66/27/3 21/275/3 20/298/3 +f 21/275/3 41/114/3 20/298/3 +f 96/299/3 39/96/3 20/298/3 +f 39/96/3 6/97/3 18/78/3 +f 20/298/3 39/96/3 18/78/3 +f 6/97/3 19/79/3 18/78/3 +f 20/298/3 41/114/3 96/299/3 +f 91/300/3 18/78/3 94/77/3 +f 117/80/2 118/301/2 54/81/2 +f 1/302/1 67/303/1 38/304/1 +f 67/303/1 93/99/1 38/304/1 +f 2/305/1 95/243/1 38/304/1 +f 95/243/1 3/306/1 38/304/1 +f 3/306/1 4/85/1 65/84/1 +f 38/304/1 3/306/1 65/84/1 +f 38/304/1 93/99/1 2/305/1 +f 42/214/1 65/84/1 98/213/1 +f 98/213/1 65/84/1 24/63/1 +f 97/83/1 24/63/1 65/84/1 +f 117/86/3 22/144/3 69/87/3 +f 94/89/2 19/307/2 69/90/2 +f 32/94/5 101/215/5 77/308/5 +f 101/215/5 67/309/5 77/308/5 +f 77/308/5 16/92/5 32/94/5 +f 27/95/1 46/310/1 39/96/1 +f 77/98/3 67/303/3 93/99/3 +f 37/101/2 129/311/2 17/102/2 +f 119/312/1 13/313/1 118/88/1 +f 13/313/1 51/104/1 118/88/1 +f 51/104/1 102/22/1 69/87/1 +f 51/105/2 31/314/2 52/106/2 +f 24/315/2 97/316/2 105/110/2 +f 97/316/2 23/108/2 105/110/2 +f 23/108/2 104/317/2 96/318/2 +f 96/318/2 41/319/2 23/108/2 +f 41/319/2 40/109/2 23/108/2 +f 40/109/2 74/12/2 73/24/2 +f 40/109/2 73/24/2 105/110/2 +f 5/112/6 3/320/6 95/257/6 +f 2/258/6 93/210/6 5/112/6 +f 93/210/6 67/211/6 5/112/6 +f 5/112/6 95/257/6 2/258/6 +f 6/321/6 39/322/6 92/111/6 +f 91/323/6 94/89/6 92/111/6 +f 94/89/6 19/307/6 92/111/6 +f 19/307/6 6/321/6 92/111/6 +f 1/324/6 89/174/6 5/112/6 +f 89/174/6 90/113/6 5/112/6 +f 5/112/6 67/211/6 1/324/6 +f 90/113/6 91/323/6 92/111/6 +f 41/114/1 96/299/1 106/115/1 +f 57/117/2 120/325/2 13/118/2 +f 122/120/3 59/326/3 46/121/3 +f 61/123/2 34/327/2 124/124/2 +f 104/317/2 4/328/2 72/127/2 +f 4/328/2 3/320/2 72/127/2 +f 72/127/2 103/329/2 71/128/2 +f 6/321/2 39/322/2 71/128/2 +f 39/322/2 7/126/2 71/128/2 +f 7/126/2 104/317/2 72/127/2 +f 71/128/2 102/330/2 6/321/2 +f 1/331/4 38/332/4 89/131/4 +f 38/332/4 18/129/4 89/131/4 +f 18/129/4 91/333/4 90/130/4 +f 8/132/1 5/334/1 44/133/1 +f 33/137/5 72/335/5 80/135/5 +f 72/335/5 3/336/5 80/135/5 +f 16/138/1 77/337/1 11/139/1 +f 85/141/1 29/338/1 111/142/1 +f 90/339/1 108/145/1 22/144/1 +f 108/145/1 116/340/1 117/86/1 +f 32/146/1 54/32/1 68/147/1 +f 53/149/2 84/341/2 117/150/2 +f 79/152/1 43/342/1 19/79/1 +f 96/343/5 104/204/5 106/155/5 +f 104/204/5 61/153/5 106/155/5 +f 105/158/4 56/344/4 28/156/4 +f 56/344/4 12/345/4 28/156/4 +f 42/346/5 99/161/5 65/160/5 +f 99/161/5 100/289/5 20/159/5 +f 100/289/5 66/66/5 20/159/5 +f 8/162/5 81/347/5 30/163/5 +f 26/165/4 48/348/4 114/61/4 +f 25/168/3 109/349/3 45/350/3 +f 45/350/3 92/351/3 25/168/3 +f 92/351/3 75/169/3 25/168/3 +f 75/169/3 30/352/3 26/167/3 +f 30/352/3 48/353/3 26/167/3 +f 125/172/4 40/354/4 107/170/4 +f 40/354/4 41/355/4 107/170/4 +f 90/113/2 22/91/2 101/173/2 +f 56/175/3 105/356/3 73/176/3 +f 64/357/4 130/358/4 127/59/4 +f 130/358/4 87/178/4 127/59/4 +f 87/178/4 73/262/4 74/179/4 +f 113/180/4 42/346/4 99/161/4 +f 12/182/1 86/359/1 112/183/1 +f 80/185/3 3/306/3 4/85/3 +f 128/187/4 62/360/4 11/188/4 +f 64/190/2 131/361/2 132/191/2 +f 34/195/5 23/362/5 29/193/5 +f 23/362/5 97/363/5 29/193/5 +f 29/193/5 85/364/5 88/194/5 +f 88/194/5 124/365/5 34/195/5 +f 123/196/1 124/366/1 88/197/1 +f 37/367/4 63/368/4 54/201/4 +f 63/368/4 110/199/4 54/201/4 +f 110/199/4 93/369/4 68/200/4 +f 104/204/4 61/153/4 111/202/4 +f 61/153/4 123/370/4 15/371/4 +f 15/371/4 55/372/4 111/202/4 +f 61/153/4 15/371/4 111/202/4 +f 61/56/1 104/287/1 7/205/1 +f 39/373/4 46/208/4 7/207/4 +f 46/208/4 59/374/4 60/209/4 +f 101/173/2 68/375/2 93/210/2 +f 113/212/3 112/376/3 98/213/3 +f 117/55/4 32/94/4 101/215/4 +f 14/217/1 121/377/1 80/218/1 +f 69/220/2 102/378/2 70/221/2 +f 52/50/5 31/379/5 71/223/5 +f 82/226/5 17/380/5 83/39/5 +f 17/380/5 129/381/5 83/39/5 +f 83/39/5 70/224/5 82/226/5 +f 42/25/6 98/26/6 8/382/6 +f 98/26/6 24/315/6 8/382/6 +f 97/316/6 4/328/6 8/382/6 +f 4/328/6 3/320/6 8/382/6 +f 8/382/6 3/320/6 5/112/6 +f 24/315/6 97/316/6 8/382/6 +f 75/227/6 92/111/6 39/322/6 +f 96/318/6 41/319/6 75/227/6 +f 41/319/6 21/10/6 75/227/6 +f 75/227/6 39/322/6 96/318/6 +f 100/11/6 99/274/6 75/227/6 +f 99/274/6 42/25/6 8/382/6 +f 75/227/6 99/274/6 8/382/6 +f 66/228/6 100/11/6 75/227/6 +f 126/229/2 35/383/2 127/230/2 +f 54/201/5 118/38/5 69/232/5 +f 89/384/3 101/148/3 76/234/3 +f 101/148/3 32/146/3 76/234/3 +f 32/146/3 36/385/3 128/233/3 +f 128/235/2 36/386/2 16/236/2 +f 130/387/1 132/191/1 87/177/1 +f 132/191/1 9/238/1 87/177/1 +f 9/238/1 99/388/1 73/176/1 +f 53/239/4 116/389/4 108/240/4 +f 82/242/3 2/305/3 95/243/3 +f 111/390/2 29/391/2 81/392/2 +f 29/391/2 28/393/2 81/392/2 +f 111/390/2 81/392/2 80/394/2 +f 28/393/2 112/395/2 81/392/2 +f 112/395/2 113/396/2 81/392/2 +f 50/397/2 80/394/2 44/245/2 +f 44/245/2 80/394/2 81/392/2 +f 110/398/2 82/399/2 44/245/2 +f 82/399/2 50/397/2 44/245/2 +f 11/400/2 77/401/2 44/245/2 +f 77/401/2 110/398/2 44/245/2 +f 108/247/2 76/402/2 44/245/2 +f 76/402/2 11/400/2 44/245/2 +f 49/403/2 108/247/2 45/246/2 +f 113/396/2 9/404/2 81/392/2 +f 9/404/2 115/405/2 30/406/2 +f 9/404/2 30/406/2 81/392/2 +f 115/405/2 10/407/2 30/406/2 +f 10/407/2 114/408/2 48/409/2 +f 45/246/2 109/410/2 49/403/2 +f 109/410/2 78/411/2 49/403/2 +f 10/407/2 48/409/2 30/406/2 +f 58/248/2 33/412/2 121/249/2 +f 102/40/5 51/41/5 27/251/5 +f 51/41/5 13/413/5 120/414/5 +f 27/251/5 51/41/5 120/414/5 +f 84/253/3 53/415/3 49/254/3 +f 70/256/2 103/329/2 95/257/2 +f 15/259/2 88/416/2 85/260/2 +f 98/417/5 112/263/5 73/262/5 +f 112/263/5 86/418/5 87/178/5 +f 108/264/5 90/130/5 89/131/5 diff --git a/mods/x_farming/models/x_farming_honey.obj b/mods/x_farming/models/x_farming_honey.obj new file mode 100644 index 00000000..69f5b360 --- /dev/null +++ b/mods/x_farming/models/x_farming_honey.obj @@ -0,0 +1,81 @@ +# Blender v2.83.20 OBJ File: 'x_farming_honey_block.blend' +# www.blender.org +mtllib x_farming_honey.mtl +o Cube +v 0.499000 0.499000 -0.499000 +v 0.499000 -0.499000 -0.499000 +v 0.499000 0.499000 0.499000 +v 0.499000 -0.499000 0.499000 +v -0.499000 0.499000 -0.499000 +v -0.499000 -0.499000 -0.499000 +v -0.499000 0.499000 0.499000 +v -0.499000 -0.499000 0.499000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.500000 +vt 1.000000 1.000000 +vt 1.000000 0.500000 +vt -0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.500000 +vt -0.000000 1.000000 +vt -0.000000 0.500000 +vt -0.000000 0.500000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl Material +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/8/3 7/7/3 5/9/3 6/10/3 +f 6/11/4 2/12/4 4/5/4 8/8/4 +f 2/13/5 1/1/5 3/14/5 4/15/5 +f 6/16/6 5/2/6 1/1/6 2/13/6 +o Cube.001 +v 0.400000 0.400000 -0.400000 +v 0.400000 -0.400000 -0.400000 +v 0.400000 0.400000 0.400000 +v 0.400000 -0.400000 0.400000 +v -0.400000 0.400000 -0.400000 +v -0.400000 -0.400000 -0.400000 +v -0.400000 0.400000 0.400000 +v -0.400000 -0.400000 0.400000 +vt 0.937500 0.468750 +vt 0.062500 0.468750 +vt 0.062500 0.031250 +vt 0.937500 0.031250 +vt 0.937500 0.031250 +vt 0.937500 0.468750 +vt 0.062500 0.468750 +vt 0.062500 0.031250 +vt 0.937500 0.468750 +vt 0.937500 0.031250 +vt 0.062500 0.468750 +vt 0.937500 0.468750 +vt 0.937500 0.031250 +vt 0.062500 0.468750 +vt 0.062500 0.031250 +vt 0.062500 0.031250 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl Material +s off +f 9/17/7 13/18/7 15/19/7 11/20/7 +f 12/21/8 11/22/8 15/23/8 16/24/8 +f 16/24/9 15/23/9 13/25/9 14/26/9 +f 14/27/10 10/28/10 12/21/10 16/24/10 +f 10/29/11 9/17/11 11/30/11 12/31/11 +f 14/32/12 13/18/12 9/17/12 10/29/12 diff --git a/mods/x_farming/models/x_farming_kiwi_fruit.obj b/mods/x_farming/models/x_farming_kiwi_fruit.obj new file mode 100644 index 00000000..4f10b8ea --- /dev/null +++ b/mods/x_farming/models/x_farming_kiwi_fruit.obj @@ -0,0 +1,2635 @@ +# Blender v3.3.0 OBJ File: 'kiwi.blend' +# www.blender.org +mtllib kiwi.mtl +o kiwi +v -0.020000 -0.499000 0.060000 +v -0.040000 -0.499000 0.040000 +v -0.040000 -0.499000 0.020000 +v -0.060000 -0.499000 0.020000 +v -0.020000 -0.459000 0.080000 +v -0.100000 -0.459000 -0.020000 +v -0.100000 -0.479000 -0.020000 +v -0.080000 -0.459000 -0.060000 +v -0.060000 -0.479000 -0.060000 +v -0.060000 -0.459000 -0.060000 +v -0.060000 -0.479000 -0.080000 +v -0.020000 -0.459000 -0.080000 +v -0.020000 -0.479000 -0.100000 +v -0.040000 -0.459000 0.100000 +v -0.080000 -0.439000 0.080000 +v -0.100000 -0.459000 0.080000 +v -0.120000 -0.459000 0.040000 +v -0.120000 -0.439000 0.020000 +v -0.120000 -0.439000 -0.020000 +v -0.120000 -0.459000 -0.040000 +v -0.100000 -0.459000 -0.040000 +v -0.100000 -0.439000 -0.080000 +v -0.100000 -0.459000 -0.080000 +v -0.040000 -0.459000 -0.120000 +v -0.020000 -0.439000 0.140000 +v -0.020000 -0.419000 0.120000 +v -0.080000 -0.439000 0.120000 +v -0.080000 -0.439000 0.100000 +v -0.120000 -0.439000 -0.040000 +v -0.120000 -0.419000 -0.060000 +v -0.120000 -0.419000 -0.080000 +v -0.100000 -0.439000 -0.100000 +v -0.080000 -0.419000 -0.100000 +v -0.060000 -0.419000 0.140000 +v -0.060000 -0.419000 0.120000 +v -0.120000 -0.399000 0.080000 +v -0.120000 -0.399000 0.060000 +v -0.120000 -0.419000 0.060000 +v -0.140000 -0.419000 0.060000 +v -0.140000 -0.419000 0.020000 +v -0.140000 -0.419000 -0.020000 +v -0.140000 -0.419000 -0.060000 +v -0.060000 -0.419000 -0.120000 +v -0.020000 -0.399000 0.160000 +v -0.140000 -0.399000 0.020000 +v -0.160000 -0.399000 0.020000 +v -0.120000 -0.379000 -0.100000 +v -0.100000 -0.379000 -0.100000 +v -0.040000 -0.359000 0.140000 +v -0.120000 -0.379000 0.120000 +v -0.120000 -0.379000 0.100000 +v -0.160000 -0.379000 0.040000 +v -0.160000 -0.379000 0.020000 +v -0.160000 -0.359000 -0.040000 +v -0.140000 -0.379000 -0.040000 +v -0.140000 -0.359000 -0.040000 +v -0.140000 -0.359000 -0.060000 +v -0.120000 -0.359000 -0.080000 +v -0.040000 -0.359000 -0.140000 +v -0.060000 -0.339000 0.160000 +v -0.100000 -0.359000 0.140000 +v -0.120000 -0.359000 0.100000 +v -0.140000 -0.359000 0.080000 +v -0.140000 -0.359000 0.060000 +v -0.160000 -0.359000 0.060000 +v -0.160000 -0.339000 0.060000 +v -0.160000 -0.339000 -0.060000 +v -0.140000 -0.359000 -0.080000 +v -0.140000 -0.339000 -0.100000 +v -0.140000 -0.359000 -0.100000 +v -0.120000 -0.359000 -0.100000 +v -0.120000 -0.339000 -0.100000 +v -0.100000 -0.359000 -0.140000 +v -0.060000 -0.339000 -0.160000 +v 0.020000 -0.499000 0.060000 +v 0.020000 -0.479000 0.040000 +v 0.040000 -0.499000 0.040000 +v 0.040000 -0.499000 -0.040000 +v 0.020000 -0.479000 0.080000 +v 0.020000 -0.459000 0.080000 +v 0.060000 -0.479000 0.080000 +v 0.060000 -0.459000 0.060000 +v 0.060000 -0.459000 0.080000 +v 0.080000 -0.479000 0.060000 +v 0.100000 -0.479000 -0.020000 +v 0.080000 -0.459000 -0.020000 +v 0.080000 -0.479000 -0.060000 +v 0.080000 -0.459000 -0.060000 +v 0.020000 -0.479000 -0.100000 +v 0.040000 -0.459000 0.120000 +v 0.040000 -0.439000 0.100000 +v 0.040000 -0.439000 0.120000 +v 0.100000 -0.459000 0.080000 +v 0.100000 -0.459000 0.040000 +v 0.120000 -0.459000 0.040000 +v 0.120000 -0.459000 -0.040000 +v 0.080000 -0.459000 -0.100000 +v 0.080000 -0.439000 -0.080000 +v 0.020000 -0.439000 0.140000 +v 0.080000 -0.419000 0.120000 +v 0.100000 -0.439000 0.100000 +v 0.100000 -0.439000 0.080000 +v 0.120000 -0.419000 0.080000 +v 0.120000 -0.419000 0.020000 +v 0.120000 -0.439000 -0.040000 +v 0.100000 -0.419000 -0.080000 +v 0.080000 -0.439000 -0.100000 +v 0.080000 -0.439000 -0.120000 +v 0.080000 -0.419000 -0.100000 +v 0.060000 -0.419000 0.120000 +v 0.100000 -0.419000 0.120000 +v 0.100000 -0.419000 0.100000 +v 0.140000 -0.419000 0.060000 +v 0.140000 -0.419000 0.020000 +v 0.140000 -0.399000 0.020000 +v 0.140000 -0.399000 -0.020000 +v 0.120000 -0.419000 -0.080000 +v 0.120000 -0.399000 -0.060000 +v 0.060000 -0.419000 -0.120000 +v 0.060000 -0.419000 -0.140000 +v 0.060000 -0.399000 -0.120000 +v 0.020000 -0.399000 0.160000 +v 0.100000 -0.379000 0.100000 +v 0.140000 -0.379000 0.040000 +v 0.160000 -0.399000 0.020000 +v 0.140000 -0.399000 -0.080000 +v 0.020000 -0.399000 -0.140000 +v 0.020000 -0.379000 -0.140000 +v 0.040000 -0.379000 0.140000 +v 0.040000 -0.359000 0.140000 +v 0.120000 -0.379000 0.100000 +v 0.120000 -0.359000 0.100000 +v 0.140000 -0.359000 0.060000 +v 0.160000 -0.379000 0.040000 +v 0.160000 -0.379000 0.020000 +v 0.160000 -0.379000 -0.020000 +v 0.140000 -0.359000 -0.060000 +v 0.120000 -0.359000 -0.080000 +v 0.120000 -0.359000 -0.100000 +v 0.100000 -0.359000 0.140000 +v 0.100000 -0.359000 0.120000 +v 0.100000 -0.339000 0.140000 +v 0.120000 -0.339000 0.120000 +v 0.140000 -0.339000 0.100000 +v 0.160000 -0.359000 0.040000 +v 0.160000 -0.339000 0.060000 +v 0.160000 -0.359000 -0.040000 +v 0.160000 -0.359000 -0.060000 +v 0.140000 -0.339000 -0.100000 +v 0.120000 -0.339000 -0.120000 +v 0.100000 -0.359000 -0.120000 +v 0.100000 -0.359000 -0.140000 +v 0.040000 -0.479000 0.040000 +v 0.040000 -0.499000 0.020000 +v 0.060000 -0.499000 0.020000 +v 0.040000 -0.479000 0.020000 +v 0.020000 -0.479000 0.100000 +v -0.060000 -0.479000 0.080000 +v -0.060000 -0.459000 0.080000 +v -0.080000 -0.479000 0.060000 +v -0.060000 -0.479000 0.060000 +v -0.100000 -0.479000 0.020000 +v -0.100000 -0.459000 0.020000 +v -0.040000 -0.459000 0.120000 +v 0.020000 -0.439000 0.120000 +v -0.040000 -0.439000 0.100000 +v 0.040000 -0.459000 0.100000 +v 0.080000 -0.459000 0.100000 +v 0.080000 -0.459000 0.080000 +v 0.080000 -0.439000 0.080000 +v -0.120000 -0.439000 0.040000 +v 0.120000 -0.439000 0.040000 +v 0.100000 -0.439000 0.040000 +v -0.080000 -0.419000 0.120000 +v -0.040000 -0.439000 0.120000 +v 0.020000 -0.419000 0.120000 +v 0.080000 -0.439000 0.120000 +v -0.080000 -0.419000 0.100000 +v -0.100000 -0.439000 0.080000 +v -0.100000 -0.419000 0.080000 +v -0.120000 -0.419000 0.080000 +v -0.140000 -0.439000 0.020000 +v -0.120000 -0.419000 0.020000 +v 0.120000 -0.439000 0.020000 +v 0.140000 -0.439000 0.020000 +v -0.020000 -0.399000 0.140000 +v 0.060000 -0.399000 0.120000 +v 0.120000 -0.419000 0.100000 +v 0.120000 -0.419000 0.060000 +v 0.140000 -0.399000 0.060000 +v 0.120000 -0.399000 0.060000 +v 0.020000 -0.379000 0.160000 +v 0.020000 -0.379000 0.140000 +v 0.060000 -0.399000 0.140000 +v 0.080000 -0.399000 0.140000 +v -0.140000 -0.399000 0.080000 +v 0.120000 -0.399000 0.080000 +v 0.140000 -0.399000 0.080000 +v -0.020000 -0.379000 0.160000 +v -0.040000 -0.379000 0.140000 +v -0.060000 -0.359000 0.140000 +v -0.100000 -0.379000 0.120000 +v 0.120000 -0.379000 0.120000 +v 0.140000 -0.359000 0.080000 +v -0.140000 -0.379000 0.040000 +v -0.160000 -0.359000 0.040000 +v -0.060000 -0.359000 0.160000 +v 0.040000 -0.359000 0.160000 +v 0.060000 -0.339000 0.160000 +v 0.060000 -0.359000 0.140000 +v 0.060000 -0.339000 0.140000 +v -0.140000 -0.359000 0.100000 +v -0.140000 -0.339000 0.060000 +v 0.140000 -0.339000 0.060000 +v 0.040000 -0.479000 -0.020000 +v 0.060000 -0.479000 -0.020000 +v -0.020000 -0.499000 -0.040000 +v 0.020000 -0.479000 -0.040000 +v -0.080000 -0.479000 -0.060000 +v 0.060000 -0.479000 -0.060000 +v 0.020000 -0.479000 -0.080000 +v 0.020000 -0.459000 -0.080000 +v -0.080000 -0.439000 -0.080000 +v 0.100000 -0.439000 -0.080000 +v 0.100000 -0.459000 -0.080000 +v -0.040000 -0.439000 -0.100000 +v -0.040000 -0.459000 -0.100000 +v -0.020000 -0.439000 -0.120000 +v 0.020000 -0.439000 -0.120000 +v 0.040000 -0.459000 -0.120000 +v -0.140000 -0.439000 -0.020000 +v -0.120000 -0.419000 -0.020000 +v 0.120000 -0.419000 -0.020000 +v 0.140000 -0.419000 -0.020000 +v -0.100000 -0.419000 -0.080000 +v 0.120000 -0.439000 -0.080000 +v -0.100000 -0.419000 -0.100000 +v 0.100000 -0.419000 -0.100000 +v 0.100000 -0.439000 -0.100000 +v -0.080000 -0.439000 -0.120000 +v -0.020000 -0.419000 -0.120000 +v 0.020000 -0.419000 -0.120000 +v 0.040000 -0.439000 -0.120000 +v -0.020000 -0.419000 -0.140000 +v 0.020000 -0.439000 -0.140000 +v 0.120000 -0.419000 -0.060000 +v 0.140000 -0.399000 -0.060000 +v 0.140000 -0.419000 -0.060000 +v -0.120000 -0.419000 -0.100000 +v 0.120000 -0.419000 -0.100000 +v -0.080000 -0.419000 -0.120000 +v -0.060000 -0.399000 -0.120000 +v 0.080000 -0.419000 -0.120000 +v 0.100000 -0.419000 -0.120000 +v -0.060000 -0.399000 -0.140000 +v -0.020000 -0.399000 -0.140000 +v -0.140000 -0.399000 -0.020000 +v 0.160000 -0.399000 -0.020000 +v -0.120000 -0.399000 -0.080000 +v 0.120000 -0.379000 -0.100000 +v -0.080000 -0.399000 -0.120000 +v 0.100000 -0.379000 -0.120000 +v -0.080000 -0.399000 -0.140000 +v -0.040000 -0.379000 -0.140000 +v -0.020000 -0.379000 -0.140000 +v 0.040000 -0.379000 -0.140000 +v 0.080000 -0.399000 -0.140000 +v -0.020000 -0.399000 -0.160000 +v -0.020000 -0.379000 -0.160000 +v 0.020000 -0.399000 -0.160000 +v 0.160000 -0.379000 -0.040000 +v -0.120000 -0.379000 -0.120000 +v -0.080000 -0.359000 -0.120000 +v 0.080000 -0.359000 -0.120000 +v -0.080000 -0.359000 -0.140000 +v -0.060000 -0.359000 -0.140000 +v -0.040000 -0.379000 -0.160000 +v -0.040000 -0.359000 -0.160000 +v 0.020000 -0.379000 -0.160000 +v 0.140000 -0.339000 -0.060000 +v 0.140000 -0.359000 -0.100000 +v -0.100000 -0.359000 -0.120000 +v 0.100000 -0.339000 -0.120000 +v -0.100000 -0.339000 -0.140000 +v 0.080000 -0.359000 -0.140000 +v 0.100000 -0.339000 -0.140000 +v -0.060000 -0.359000 -0.160000 +v -0.020000 -0.499000 0.040000 +v 0.020000 -0.499000 0.040000 +v -0.060000 -0.499000 -0.020000 +v 0.060000 -0.499000 -0.020000 +v -0.040000 -0.499000 -0.020000 +v -0.040000 -0.499000 -0.040000 +v 0.020000 -0.499000 -0.040000 +v 0.040000 -0.499000 -0.020000 +v -0.020000 -0.499000 -0.060000 +v 0.020000 -0.499000 -0.060000 +v -0.020000 -0.479000 0.100000 +v -0.020000 -0.479000 0.080000 +v -0.020000 -0.479000 0.060000 +v 0.060000 -0.479000 0.060000 +v -0.040000 -0.479000 0.040000 +v -0.020000 -0.479000 0.040000 +v 0.020000 -0.479000 0.060000 +v -0.060000 -0.479000 0.020000 +v -0.040000 -0.479000 0.020000 +v 0.060000 -0.479000 0.020000 +v -0.080000 -0.479000 0.020000 +v 0.080000 -0.479000 0.020000 +v 0.100000 -0.479000 0.020000 +v -0.080000 -0.479000 -0.020000 +v 0.080000 -0.479000 -0.020000 +v -0.060000 -0.479000 -0.020000 +v -0.040000 -0.479000 -0.020000 +v -0.040000 -0.479000 -0.040000 +v -0.020000 -0.479000 -0.060000 +v -0.020000 -0.479000 -0.040000 +v 0.040000 -0.479000 -0.040000 +v -0.020000 -0.479000 -0.080000 +v 0.020000 -0.479000 -0.060000 +v 0.060000 -0.479000 -0.080000 +v -0.020000 -0.459000 0.100000 +v 0.020000 -0.459000 0.100000 +v -0.080000 -0.459000 0.100000 +v -0.080000 -0.459000 0.080000 +v -0.080000 -0.459000 0.060000 +v -0.060000 -0.459000 0.060000 +v 0.080000 -0.459000 0.060000 +v -0.100000 -0.459000 0.040000 +v -0.080000 -0.459000 0.020000 +v 0.080000 -0.459000 0.020000 +v 0.100000 -0.459000 0.020000 +v 0.100000 -0.459000 -0.020000 +v -0.080000 -0.459000 -0.020000 +v 0.100000 -0.459000 -0.040000 +v -0.080000 -0.459000 -0.080000 +v -0.060000 -0.459000 -0.080000 +v 0.060000 -0.459000 -0.060000 +v 0.060000 -0.459000 -0.080000 +v 0.080000 -0.459000 -0.080000 +v -0.080000 -0.459000 -0.100000 +v 0.040000 -0.459000 -0.100000 +v -0.020000 -0.459000 -0.100000 +v 0.020000 -0.459000 -0.100000 +v -0.020000 -0.439000 0.120000 +v -0.100000 -0.439000 0.100000 +v 0.080000 -0.439000 0.100000 +v -0.120000 -0.439000 0.080000 +v 0.120000 -0.439000 0.080000 +v -0.100000 -0.439000 0.040000 +v 0.120000 -0.439000 -0.020000 +v 0.140000 -0.439000 -0.020000 +v -0.100000 -0.439000 -0.040000 +v 0.100000 -0.439000 -0.040000 +v -0.120000 -0.439000 -0.080000 +v -0.080000 -0.439000 -0.100000 +v -0.040000 -0.439000 -0.120000 +v 0.040000 -0.439000 -0.100000 +v -0.020000 -0.439000 -0.140000 +v -0.020000 -0.419000 0.140000 +v 0.020000 -0.419000 0.140000 +v 0.060000 -0.419000 0.140000 +v -0.100000 -0.419000 0.120000 +v 0.080000 -0.419000 0.100000 +v -0.120000 -0.419000 0.100000 +v -0.100000 -0.419000 0.100000 +v 0.100000 -0.419000 0.080000 +v -0.100000 -0.419000 -0.120000 +v -0.060000 -0.419000 -0.140000 +v 0.020000 -0.419000 -0.140000 +v 0.020000 -0.399000 0.140000 +v -0.080000 -0.399000 0.140000 +v -0.080000 -0.399000 0.120000 +v -0.060000 -0.399000 0.120000 +v -0.060000 -0.399000 0.140000 +v 0.080000 -0.399000 0.120000 +v -0.140000 -0.399000 0.060000 +v -0.160000 -0.399000 -0.020000 +v -0.140000 -0.399000 -0.060000 +v -0.140000 -0.399000 -0.080000 +v -0.120000 -0.399000 -0.060000 +v 0.120000 -0.399000 -0.080000 +v 0.060000 -0.399000 -0.140000 +v 0.080000 -0.399000 -0.120000 +v -0.040000 -0.379000 0.160000 +v -0.020000 -0.379000 0.140000 +v 0.040000 -0.379000 0.160000 +v -0.100000 -0.379000 0.100000 +v 0.100000 -0.379000 0.120000 +v -0.140000 -0.379000 0.020000 +v 0.140000 -0.379000 0.020000 +v -0.160000 -0.379000 -0.020000 +v -0.160000 -0.379000 -0.040000 +v -0.140000 -0.379000 -0.020000 +v 0.140000 -0.379000 -0.020000 +v 0.140000 -0.379000 -0.040000 +v -0.100000 -0.379000 -0.120000 +v 0.100000 -0.379000 -0.100000 +v 0.120000 -0.379000 -0.120000 +v 0.040000 -0.379000 -0.160000 +v -0.040000 -0.359000 0.160000 +v 0.060000 -0.359000 0.160000 +v -0.100000 -0.359000 0.120000 +v -0.080000 -0.359000 0.120000 +v -0.080000 -0.359000 0.140000 +v 0.080000 -0.359000 0.140000 +v 0.080000 -0.359000 0.120000 +v -0.120000 -0.359000 0.080000 +v 0.120000 -0.359000 0.080000 +v 0.140000 -0.359000 0.100000 +v -0.140000 -0.359000 0.040000 +v 0.140000 -0.359000 0.040000 +v 0.160000 -0.359000 0.060000 +v -0.160000 -0.359000 -0.060000 +v 0.140000 -0.359000 -0.040000 +v 0.140000 -0.359000 -0.080000 +v 0.040000 -0.359000 -0.140000 +v 0.040000 -0.359000 -0.160000 +v 0.060000 -0.359000 -0.160000 +v 0.060000 -0.359000 -0.140000 +v -0.100000 -0.339000 0.140000 +v -0.100000 -0.339000 0.120000 +v -0.060000 -0.339000 0.140000 +v -0.120000 -0.339000 0.120000 +v -0.120000 -0.339000 0.100000 +v 0.100000 -0.339000 0.120000 +v -0.140000 -0.339000 0.100000 +v 0.120000 -0.339000 0.100000 +v -0.140000 -0.339000 -0.060000 +v 0.160000 -0.339000 -0.060000 +v 0.120000 -0.339000 -0.100000 +v -0.100000 -0.339000 -0.120000 +v -0.120000 -0.339000 -0.120000 +v -0.060000 -0.339000 -0.140000 +v 0.060000 -0.339000 -0.140000 +v 0.060000 -0.339000 -0.160000 +vt 0.891892 0.405405 +vt 0.918919 0.378378 +vt 0.891892 0.378378 +vt 0.783784 0.324324 +vt 0.756757 0.270270 +vt 0.783784 0.270270 +vt 0.918919 0.594594 +vt 0.945946 0.567567 +vt 0.918919 0.567567 +vt 0.486486 0.945946 +vt 0.513513 0.918919 +vt 0.486486 0.918919 +vt 0.945946 0.864865 +vt 0.918919 0.891892 +vt 0.918919 0.864865 +vt 0.891892 0.108108 +vt 0.864865 0.054054 +vt 0.864865 0.108108 +vt 0.891892 0.729730 +vt 0.918919 0.702703 +vt 0.891892 0.702703 +vt 0.891892 0.351351 +vt 0.837838 0.378378 +vt 0.891892 0.378378 +vt 0.162162 0.837838 +vt 0.108108 0.864865 +vt 0.162162 0.864865 +vt 0.837838 0.270270 +vt 0.783784 0.297297 +vt 0.837838 0.297297 +vt 0.567567 0.297297 +vt 0.540540 0.297297 +vt 0.540540 0.270270 +vt 0.891892 0.459459 +vt 0.918919 0.432432 +vt 0.891892 0.432432 +vt 0.270270 0.864865 +vt 0.216216 0.891892 +vt 0.270270 0.891892 +vt 0.783783 0.918919 +vt 0.810811 0.891892 +vt 0.783783 0.891892 +vt 0.378378 0.945946 +vt 0.405405 0.918919 +vt 0.378378 0.918919 +vt 0.918919 0.864865 +vt 0.891892 0.891892 +vt 0.891892 0.864865 +vt 0.837838 0.243243 +vt 0.810811 0.270270 +vt 0.810811 0.243243 +vt 0.054054 0.945946 +vt 0.081081 0.918919 +vt 0.054054 0.918919 +vt 0.432432 0.432432 +vt 0.459459 0.459459 +vt 0.513513 0.459459 +vt 0.891892 0.243243 +vt 0.918919 0.216216 +vt 0.891892 0.216216 +vt 0.486486 0.054054 +vt 0.513513 0.081081 +vt 0.540540 0.054054 +vt 0.918919 0.486486 +vt 0.945946 0.459459 +vt 0.918919 0.459459 +vt 0.540541 0.432432 +vt 0.513513 0.459459 +vt 0.459459 0.459459 +vt 0.945946 0.513513 +vt 0.918919 0.540540 +vt 0.918919 0.513513 +vt 0.729730 0.864865 +vt 0.702703 0.891892 +vt 0.702703 0.864865 +vt 0.567568 0.918919 +vt 0.540541 0.945946 +vt 0.540541 0.918919 +vt 0.918919 0.027027 +vt 0.945946 0.000000 +vt 0.918919 0.000000 +vt 0.486486 0.162162 +vt 0.486486 0.108108 +vt 0.459459 0.108108 +vt 0.594595 0.918919 +vt 0.567568 0.945946 +vt 0.567568 0.918919 +vt 0.864865 0.756757 +vt 0.891892 0.702703 +vt 0.864865 0.702703 +vt 0.891892 0.324324 +vt 0.918919 0.297297 +vt 0.891892 0.297297 +vt 0.810811 0.405405 +vt 0.783784 0.351351 +vt 0.783784 0.405405 +vt 0.675676 0.864865 +vt 0.648649 0.891892 +vt 0.648649 0.864865 +vt 0.945946 0.810811 +vt 0.918919 0.837838 +vt 0.918919 0.810811 +vt 0.378378 0.918919 +vt 0.405405 0.891892 +vt 0.378378 0.891892 +vt 0.054054 0.513513 +vt 0.081081 0.486486 +vt 0.054054 0.486486 +vt 0.945946 0.324324 +vt 0.918919 0.351351 +vt 0.918919 0.324324 +vt 0.027027 0.945946 +vt 0.000000 0.972973 +vt 0.000000 0.945946 +vt 0.864865 0.702703 +vt 0.891892 0.648649 +vt 0.864865 0.648649 +vt 0.918919 0.054054 +vt 0.945946 0.027027 +vt 0.918919 0.027027 +vt 0.675676 0.918919 +vt 0.702703 0.891892 +vt 0.675676 0.891892 +vt 0.918919 0.081081 +vt 0.891892 0.108108 +vt 0.891892 0.081081 +vt 0.540541 0.918919 +vt 0.567568 0.891892 +vt 0.540541 0.891892 +vt 0.108108 0.891892 +vt 0.054054 0.864865 +vt 0.108108 0.864865 +vt 0.675676 0.945946 +vt 0.702703 0.918919 +vt 0.675676 0.918919 +vt 0.891892 0.783784 +vt 0.918919 0.756757 +vt 0.891892 0.756757 +vt 0.891892 0.918919 +vt 0.918919 0.891892 +vt 0.891892 0.891892 +vt 0.918919 0.702703 +vt 0.432432 0.945946 +vt 0.459459 0.918919 +vt 0.432432 0.918919 +vt 0.756757 0.864865 +vt 0.729730 0.891892 +vt 0.729730 0.864865 +vt 0.891892 0.486486 +vt 0.864865 0.432432 +vt 0.864865 0.486486 +vt 0.918919 0.783783 +vt 0.945946 0.756757 +vt 0.918919 0.756757 +vt 0.351351 0.702703 +vt 0.378378 0.648648 +vt 0.378378 0.702703 +vt 0.324324 0.837838 +vt 0.270270 0.864865 +vt 0.324324 0.864865 +vt 0.864865 0.918919 +vt 0.837838 0.945946 +vt 0.837838 0.918919 +vt 0.891892 0.297297 +vt 0.918919 0.270270 +vt 0.891892 0.270270 +vt 0.135135 0.891892 +vt 0.108108 0.918919 +vt 0.108108 0.891892 +vt 0.864865 0.567567 +vt 0.810811 0.594594 +vt 0.810811 0.567567 +vt 0.027027 0.945946 +vt 0.054054 0.918919 +vt 0.027027 0.918919 +vt 0.972973 0.027027 +vt 0.945946 0.054054 +vt 0.945946 0.027027 +vt 0.675676 0.486486 +vt 0.702703 0.567567 +vt 0.756757 0.567567 +vt 0.864865 0.918919 +vt 0.891892 0.891892 +vt 0.864865 0.891892 +vt 0.945946 0.108108 +vt 0.918919 0.135135 +vt 0.918919 0.108108 +vt 0.918919 0.648649 +vt 0.945946 0.621622 +vt 0.918919 0.621622 +vt 0.918919 0.837838 +vt 0.891892 0.864865 +vt 0.891892 0.837838 +vt 0.594595 0.891892 +vt 0.540540 0.864865 +vt 0.540540 0.891892 +vt 0.081081 0.891892 +vt 0.054054 0.918919 +vt 0.054054 0.891892 +vt 0.918919 0.378378 +vt 0.945946 0.351351 +vt 0.918919 0.351351 +vt 0.027027 0.972973 +vt 0.054054 0.945946 +vt 0.027027 0.945946 +vt 0.297297 0.810811 +vt 0.189189 0.810811 +vt 0.162162 0.837838 +vt 0.675676 0.918919 +vt 0.648649 0.945946 +vt 0.648649 0.918919 +vt 0.891892 0.675676 +vt 0.918919 0.648649 +vt 0.891892 0.648649 +vt 0.891892 0.432432 +vt 0.918919 0.405405 +vt 0.891892 0.405405 +vt 0.918919 0.000000 +vt 0.891892 0.027027 +vt 0.891892 0.000000 +vt 0.729730 0.891892 +vt 0.702703 0.918919 +vt 0.702703 0.891892 +vt 0.810811 0.243243 +vt 0.783784 0.270270 +vt 0.783784 0.243243 +vt 0.729730 0.945946 +vt 0.756757 0.918919 +vt 0.729730 0.918919 +vt 0.918919 0.135135 +vt 0.891892 0.162162 +vt 0.891892 0.135135 +vt 0.837838 0.864865 +vt 0.810811 0.891892 +vt 0.810811 0.864865 +vt 0.297297 0.945946 +vt 0.324324 0.918919 +vt 0.297297 0.918919 +vt 0.756757 0.108108 +vt 0.756757 0.081081 +vt 0.810811 0.108108 +vt 0.783784 0.432432 +vt 0.756757 0.378378 +vt 0.756757 0.432432 +vt 0.783784 0.324324 +vt 0.756757 0.324324 +vt 0.891892 0.621622 +vt 0.918919 0.594595 +vt 0.891892 0.594595 +vt 0.081081 0.945946 +vt 0.108108 0.918919 +vt 0.081081 0.918919 +vt 0.945946 0.675676 +vt 0.918919 0.702703 +vt 0.918919 0.675676 +vt 0.864865 0.540540 +vt 0.891892 0.486486 +vt 0.864865 0.486486 +vt 0.432432 0.918919 +vt 0.459459 0.891892 +vt 0.432432 0.891892 +vt 0.756757 0.891892 +vt 0.783784 0.864865 +vt 0.756757 0.864865 +vt 0.216216 0.891892 +vt 0.189189 0.918919 +vt 0.189189 0.891892 +vt 0.189189 0.891892 +vt 0.162162 0.918919 +vt 0.162162 0.891892 +vt 0.405405 0.945946 +vt 0.432432 0.918919 +vt 0.405405 0.918919 +vt 0.621622 0.918919 +vt 0.594595 0.945946 +vt 0.594595 0.918919 +vt 0.486486 0.918919 +vt 0.459459 0.945946 +vt 0.459459 0.918919 +vt 0.837838 0.405405 +vt 0.810811 0.351351 +vt 0.810811 0.405405 +vt 0.918919 0.108108 +vt 0.891892 0.135135 +vt 0.891892 0.108108 +vt 0.135135 0.810811 +vt 0.054054 0.783784 +vt 0.108108 0.783784 +vt 0.000000 0.918919 +vt 0.027027 0.891892 +vt 0.000000 0.891892 +vt 0.864865 0.486486 +vt 0.837838 0.432432 +vt 0.837838 0.486486 +vt 0.783783 0.891892 +vt 0.810811 0.864865 +vt 0.783783 0.864865 +vt 0.054054 0.837838 +vt 0.000000 0.864865 +vt 0.054054 0.864865 +vt 0.864865 0.945946 +vt 0.891892 0.918919 +vt 0.864865 0.918919 +vt 0.945946 0.729730 +vt 0.918919 0.756757 +vt 0.918919 0.729730 +vt 0.891892 0.054054 +vt 0.918919 0.027027 +vt 0.891892 0.027027 +vt 0.648649 0.864865 +vt 0.594595 0.891892 +vt 0.648649 0.891892 +vt 0.891892 0.810811 +vt 0.864865 0.756757 +vt 0.891892 0.756757 +vt 0.918919 0.108108 +vt 0.945946 0.081081 +vt 0.918919 0.081081 +vt 0.324324 0.918919 +vt 0.351351 0.891892 +vt 0.324324 0.891892 +vt 0.864865 0.567567 +vt 0.810811 0.540540 +vt 0.864865 0.540540 +vt 0.324324 0.540540 +vt 0.297297 0.567567 +vt 0.297297 0.621621 +vt 0.918919 0.783783 +vt 0.891892 0.810811 +vt 0.891892 0.783783 +vt 0.891892 0.837838 +vt 0.918919 0.810811 +vt 0.891892 0.810811 +vt 0.162162 0.891892 +vt 0.135135 0.918919 +vt 0.135135 0.891892 +vt 0.054054 0.864865 +vt 0.000000 0.891892 +vt 0.000000 0.864865 +vt 0.918919 0.621622 +vt 0.945946 0.594595 +vt 0.918919 0.594595 +vt 0.405405 0.297297 +vt 0.378378 0.351351 +vt 0.297297 0.405405 +vt 0.891892 0.567567 +vt 0.918919 0.540540 +vt 0.891892 0.540540 +vt 0.918919 0.432432 +vt 0.945946 0.405405 +vt 0.918919 0.405405 +vt 0.162162 0.891892 +vt 0.108108 0.864865 +vt 0.162162 0.864865 +vt 0.837838 0.351351 +vt 0.783784 0.324324 +vt 0.783784 0.351351 +vt 0.783784 0.243243 +vt 0.756757 0.270270 +vt 0.756757 0.243243 +vt 0.918919 0.324324 +vt 0.945946 0.297297 +vt 0.918919 0.297297 +vt 0.891892 0.378378 +vt 0.918919 0.351351 +vt 0.891892 0.351351 +vt 0.783783 0.945946 +vt 0.810811 0.918919 +vt 0.783783 0.918919 +vt 0.135135 0.945946 +vt 0.162162 0.918919 +vt 0.135135 0.918919 +vt 0.351351 0.918919 +vt 0.378378 0.891892 +vt 0.351351 0.891892 +vt 0.918919 0.918919 +vt 0.945946 0.891892 +vt 0.918919 0.891892 +vt 0.945946 0.324324 +vt 0.108108 0.891892 +vt 0.081081 0.918919 +vt 0.081081 0.891892 +vt 0.918919 0.081081 +vt 0.945946 0.054054 +vt 0.918919 0.054054 +vt 0.243243 0.918919 +vt 0.270270 0.891892 +vt 0.243243 0.891892 +vt 0.918919 0.270270 +vt 0.945946 0.243243 +vt 0.918919 0.243243 +vt 0.756757 0.216216 +vt 0.783784 0.162162 +vt 0.756757 0.162162 +vt 0.864865 0.270270 +vt 0.891892 0.216216 +vt 0.891892 0.270270 +vt 0.918919 0.459459 +vt 0.945946 0.432432 +vt 0.918919 0.189189 +vt 0.891892 0.216216 +vt 0.891892 0.189189 +vt 0.486486 0.783784 +vt 0.432432 0.783784 +vt 0.432432 0.756757 +vt 0.810811 0.027027 +vt 0.756757 0.027027 +vt 0.729730 0.054054 +vt 0.891892 0.162162 +vt 0.864865 0.108108 +vt 0.891892 0.108108 +vt 0.891892 0.945946 +vt 0.918919 0.918919 +vt 0.891892 0.918919 +vt 0.243243 0.891892 +vt 0.216216 0.918919 +vt 0.216216 0.891892 +vt 0.864865 0.513513 +vt 0.810811 0.486486 +vt 0.864865 0.486486 +vt 0.891892 0.783784 +vt 0.891892 0.756757 +vt 0.810811 0.216216 +vt 0.837838 0.162162 +vt 0.810811 0.162162 +vt 0.918919 0.297297 +vt 0.945946 0.270270 +vt 0.918919 0.270270 +vt 0.918919 0.945946 +vt 0.945946 0.918919 +vt 0.918919 0.918919 +vt 0.270270 0.918919 +vt 0.243243 0.945946 +vt 0.243243 0.918919 +vt 0.756757 0.216216 +vt 0.729730 0.162162 +vt 0.729730 0.216216 +vt 0.918919 0.810811 +vt 0.945946 0.783783 +vt 0.918919 0.783783 +vt 0.756757 0.270270 +vt 0.702703 0.243243 +vt 0.702703 0.270270 +vt 0.054054 0.891892 +vt 0.027027 0.918919 +vt 0.027027 0.891892 +vt 0.837838 0.918919 +vt 0.864865 0.891892 +vt 0.837838 0.891892 +vt 0.486486 0.891892 +vt 0.432432 0.864865 +vt 0.432432 0.891892 +vt 0.891892 0.648649 +vt 0.864865 0.594595 +vt 0.891892 0.594595 +vt 0.918919 0.054054 +vt 0.891892 0.081081 +vt 0.891892 0.054054 +vt 0.918919 0.162162 +vt 0.891892 0.189189 +vt 0.891892 0.162162 +vt 0.621622 0.702703 +vt 0.648649 0.702703 +vt 0.648649 0.648648 +vt 0.270270 0.945946 +vt 0.297297 0.918919 +vt 0.270270 0.918919 +vt 0.891892 0.189189 +vt 0.837838 0.216216 +vt 0.837838 0.189189 +vt 0.594595 0.918919 +vt 0.621622 0.891892 +vt 0.594595 0.891892 +vt 0.891892 0.756757 +vt 0.918919 0.729730 +vt 0.891892 0.729730 +vt 0.918919 0.189189 +vt 0.945946 0.162162 +vt 0.918919 0.162162 +vt 0.864865 0.324324 +vt 0.837838 0.270270 +vt 0.837838 0.324324 +vt 0.783784 0.918919 +vt 0.756757 0.945946 +vt 0.756757 0.918919 +vt 0.891892 0.351351 +vt 0.918919 0.324324 +vt 0.891892 0.324324 +vt 0.918919 0.162162 +vt 0.945946 0.135135 +vt 0.918919 0.135135 +vt 0.837838 0.324324 +vt 0.783784 0.297297 +vt 0.783784 0.324324 +vt 0.918919 0.243243 +vt 0.891892 0.270270 +vt 0.891892 0.243243 +vt 0.891892 0.594594 +vt 0.918919 0.567567 +vt 0.891892 0.567567 +vt 0.918919 0.243243 +vt 0.945946 0.216216 +vt 0.918919 0.216216 +vt 0.945946 0.027027 +vt 0.972973 0.000000 +vt 0.945946 0.000000 +vt 0.783784 0.891892 +vt 0.756757 0.918919 +vt 0.756757 0.891892 +vt 0.216216 0.891892 +vt 0.162162 0.864865 +vt 0.162162 0.891892 +vt 0.351351 0.945946 +vt 0.378378 0.918919 +vt 0.351351 0.918919 +vt 0.378378 0.891892 +vt 0.324324 0.864865 +vt 0.324324 0.891892 +vt 0.621622 0.837838 +vt 0.648649 0.837838 +vt 0.648649 0.783784 +vt 0.891892 0.513513 +vt 0.918919 0.486486 +vt 0.891892 0.486486 +vt 0.702703 0.945946 +vt 0.729730 0.918919 +vt 0.702703 0.918919 +vt 0.405405 0.918919 +vt 0.432432 0.891892 +vt 0.405405 0.891892 +vt 0.891892 0.540540 +vt 0.918919 0.513513 +vt 0.891892 0.513513 +vt 0.918919 0.783783 +vt 0.918919 0.756757 +vt 0.945946 0.810811 +vt 0.270270 0.918919 +vt 0.297297 0.891892 +vt 0.270270 0.891892 +vt 0.702703 0.216216 +vt 0.729730 0.162162 +vt 0.729730 0.216216 +vt 0.864865 0.513513 +vt 0.810811 0.540540 +vt 0.810811 0.513513 +vt 0.837838 0.891892 +vt 0.864865 0.864865 +vt 0.837838 0.864865 +vt 0.891892 0.864865 +vt 0.864865 0.891892 +vt 0.864865 0.864865 +vt 0.864865 0.216216 +vt 0.810811 0.243243 +vt 0.864865 0.243243 +vt 0.756757 0.378378 +vt 0.783784 0.324324 +vt 0.783784 0.378378 +vt 0.567568 0.918919 +vt 0.594595 0.891892 +vt 0.567568 0.891892 +vt 0.108108 0.891892 +vt 0.270270 0.837838 +vt 0.216216 0.864865 +vt 0.270270 0.864865 +vt 0.891892 0.351351 +vt 0.837838 0.324324 +vt 0.891892 0.324324 +vt 0.432432 0.891892 +vt 0.378378 0.864865 +vt 0.378378 0.891892 +vt 0.135135 0.918919 +vt 0.108108 0.945946 +vt 0.108108 0.918919 +vt 0.918919 0.675676 +vt 0.945946 0.648649 +vt 0.918919 0.648649 +vt 0.918919 0.216216 +vt 0.945946 0.189189 +vt 0.918919 0.189189 +vt 0.891892 0.405405 +vt 0.837838 0.378378 +vt 0.837838 0.405405 +vt 0.945946 0.540540 +vt 0.918919 0.567567 +vt 0.918919 0.540540 +vt 0.864865 0.054054 +vt 0.891892 0.000000 +vt 0.864865 0.000000 +vt 0.297297 0.918919 +vt 0.324324 0.891892 +vt 0.297297 0.891892 +vt 0.459459 0.918919 +vt 0.486486 0.891892 +vt 0.459459 0.891892 +vt 0.648649 0.918919 +vt 0.675676 0.891892 +vt 0.648649 0.891892 +vt 0.810811 0.918919 +vt 0.837838 0.891892 +vt 0.810811 0.891892 +vt 0.891892 0.594595 +vt 0.864865 0.540540 +vt 0.864865 0.594595 +vt 0.513513 0.918919 +vt 0.540541 0.891892 +vt 0.513513 0.891892 +vt 0.837838 0.432432 +vt 0.783784 0.405405 +vt 0.783784 0.432432 +vt 0.891892 0.324324 +vt 0.864865 0.270270 +vt 0.864865 0.324324 +vt 0.945946 0.837838 +vt 0.918919 0.864865 +vt 0.918919 0.837838 +vt 0.837838 0.486486 +vt 0.810811 0.432432 +vt 0.810811 0.486486 +vt 0.918919 0.405405 +vt 0.945946 0.378378 +vt 0.918919 0.378378 +vt 0.189189 0.945946 +vt 0.216216 0.918919 +vt 0.189189 0.918919 +vt 0.729730 0.918919 +vt 0.756757 0.891892 +vt 0.729730 0.891892 +vt 0.000000 0.945946 +vt 0.027027 0.918919 +vt 0.000000 0.918919 +vt 0.918919 0.729730 +vt 0.945946 0.702703 +vt 0.918919 0.702703 +vt 0.918919 0.513513 +vt 0.945946 0.486486 +vt 0.918919 0.486486 +vt 0.810811 0.243243 +vt 0.756757 0.216216 +vt 0.756757 0.243243 +vt 0.243243 0.918919 +vt 0.216216 0.945946 +vt 0.216216 0.918919 +vt 0.810811 0.945946 +vt 0.837838 0.918919 +vt 0.810811 0.918919 +vt 0.810811 0.216216 +vt 0.783784 0.162162 +vt 0.783784 0.216216 +vt 0.108108 0.864865 +vt 0.054054 0.837838 +vt 0.054054 0.864865 +vt 0.621622 0.918919 +vt 0.648649 0.891892 +vt 0.621622 0.891892 +vt 0.162162 0.945946 +vt 0.189189 0.918919 +vt 0.162162 0.918919 +vt 0.756757 0.216216 +vt 0.702703 0.243243 +vt 0.756757 0.243243 +vt 0.756757 0.216216 +vt 0.783784 0.216216 +vt 0.891892 0.648649 +vt 0.918919 0.621622 +vt 0.891892 0.621622 +vt 0.864865 0.243243 +vt 0.837838 0.270270 +vt 0.837838 0.243243 +vt 0.540540 0.270270 +vt 0.567567 0.297297 +vt 0.621621 0.297297 +vt 0.000000 0.945946 +vt 0.000000 0.918919 +vt 0.486486 0.918919 +vt 0.513513 0.891892 +vt 0.486486 0.891892 +vt 0.324324 0.891892 +vt 0.270270 0.864865 +vt 0.324324 0.864865 +vt 0.216216 0.837838 +vt 0.162162 0.864865 +vt 0.216216 0.864865 +vt 0.891892 0.702703 +vt 0.918919 0.675676 +vt 0.891892 0.675676 +vt 0.513513 0.945946 +vt 0.540541 0.918919 +vt 0.513513 0.918919 +vt 0.648649 0.918919 +vt 0.621622 0.945946 +vt 0.621622 0.918919 +vt 0.324324 0.945946 +vt 0.351351 0.918919 +vt 0.324324 0.918919 +vt 0.675676 0.891892 +vt 0.702703 0.864865 +vt 0.675676 0.864865 +vt 0.540540 0.864865 +vt 0.486486 0.891892 +vt 0.540540 0.891892 +vt 0.891892 0.405405 +vt 0.837838 0.432432 +vt 0.837838 0.405405 +vt 0.864865 0.864865 +vt 0.891892 0.810811 +vt 0.864865 0.810811 +vt 0.891892 0.486486 +vt 0.918919 0.459459 +vt 0.891892 0.459459 +vt 0.891892 0.189189 +vt 0.837838 0.162162 +vt 0.891892 0.162162 +vt 0.918919 0.405405 +vt 0.945946 0.594594 +vt 0.513513 0.945946 +vt 0.945946 0.891892 +vt 0.891892 0.054054 +vt 0.918919 0.729730 +vt 0.837838 0.351351 +vt 0.108108 0.837838 +vt 0.783784 0.270270 +vt 0.459459 0.432432 +vt 0.432432 0.432432 +vt 0.459459 0.405405 +vt 0.432432 0.378378 +vt 0.459459 0.378378 +vt 0.459459 0.324324 +vt 0.486486 0.351351 +vt 0.486486 0.324324 +vt 0.486486 0.405405 +vt 0.513513 0.324324 +vt 0.513513 0.351351 +vt 0.567567 0.324324 +vt 0.675676 0.324324 +vt 0.621621 0.324324 +vt 0.648648 0.297297 +vt 0.621621 0.297297 +vt 0.702703 0.351351 +vt 0.675676 0.351351 +vt 0.729730 0.405405 +vt 0.702703 0.405405 +vt 0.729730 0.378378 +vt 0.756757 0.432432 +vt 0.729730 0.432432 +vt 0.756757 0.378378 +vt 0.702703 0.324324 +vt 0.729730 0.324324 +vt 0.702703 0.297297 +vt 0.648648 0.270270 +vt 0.486486 0.297297 +vt 0.918919 0.459459 +vt 0.216216 0.864865 +vt 0.810811 0.918919 +vt 0.405405 0.945946 +vt 0.918919 0.891892 +vt 0.837838 0.270270 +vt 0.081081 0.945946 +vt 0.594595 0.486486 +vt 0.594595 0.459459 +vt 0.567567 0.486486 +vt 0.540540 0.459459 +vt 0.540540 0.432432 +vt 0.432432 0.459459 +vt 0.378378 0.459459 +vt 0.405405 0.486486 +vt 0.378378 0.486486 +vt 0.621622 0.540540 +vt 0.621622 0.486486 +vt 0.594595 0.513513 +vt 0.648649 0.594595 +vt 0.648649 0.540540 +vt 0.621622 0.567567 +vt 0.621622 0.594595 +vt 0.594595 0.567567 +vt 0.567567 0.513513 +vt 0.513513 0.486486 +vt 0.459459 0.486486 +vt 0.378378 0.513513 +vt 0.405405 0.513513 +vt 0.351351 0.567567 +vt 0.378378 0.567567 +vt 0.351351 0.540540 +vt 0.324324 0.594595 +vt 0.351351 0.594595 +vt 0.324324 0.540540 +vt 0.351351 0.486486 +vt 0.918919 0.243243 +vt 0.540540 0.081081 +vt 0.540540 0.027027 +vt 0.486486 0.027027 +vt 0.945946 0.486486 +vt 0.378378 0.486486 +vt 0.378378 0.459459 +vt 0.405405 0.486486 +vt 0.432432 0.459459 +vt 0.432432 0.432432 +vt 0.540541 0.459459 +vt 0.594595 0.459459 +vt 0.567567 0.486486 +vt 0.594595 0.486486 +vt 0.351351 0.540540 +vt 0.351351 0.486486 +vt 0.378378 0.513513 +vt 0.324324 0.594595 +vt 0.324324 0.540540 +vt 0.351351 0.567567 +vt 0.351351 0.594595 +vt 0.378378 0.567567 +vt 0.405405 0.513513 +vt 0.459459 0.486486 +vt 0.513513 0.486486 +vt 0.594595 0.513513 +vt 0.567567 0.513513 +vt 0.621622 0.567567 +vt 0.594595 0.567567 +vt 0.621622 0.540540 +vt 0.621622 0.594595 +vt 0.621622 0.486486 +vt 0.945946 0.540540 +vt 0.729730 0.891892 +vt 0.567568 0.945946 +vt 0.945946 0.027027 +vt 0.621621 0.081081 +vt 0.621621 0.108108 +vt 0.648649 0.108108 +vt 0.648649 0.162162 +vt 0.621621 0.162162 +vt 0.621621 0.189189 +vt 0.594595 0.189189 +vt 0.594595 0.216216 +vt 0.540540 0.216216 +vt 0.540540 0.189189 +vt 0.513513 0.189189 +vt 0.648649 0.216216 +vt 0.594595 0.054054 +vt 0.594595 0.081081 +vt 0.594595 0.000000 +vt 0.540540 0.000000 +vt 0.648649 0.054054 +vt 0.648649 0.027027 +vt 0.594595 0.027027 +vt 0.675676 0.108108 +vt 0.675676 0.054054 +vt 0.702703 0.162162 +vt 0.702703 0.108108 +vt 0.675676 0.162162 +vt 0.675676 0.216216 +vt 0.594595 0.243243 +vt 0.648649 0.243243 +vt 0.540540 0.270270 +vt 0.594595 0.270270 +vt 0.486486 0.216216 +vt 0.486486 0.243243 +vt 0.540540 0.243243 +vt 0.459459 0.162162 +vt 0.459459 0.216216 +vt 0.432432 0.108108 +vt 0.432432 0.162162 +vt 0.459459 0.054054 +vt 0.513513 0.108108 +vt 0.513513 0.162162 +vt 0.594595 0.945946 +vt 0.891892 0.756757 +vt 0.918919 0.324324 +vt 0.810811 0.351351 +vt 0.675676 0.891892 +vt 0.945946 0.837838 +vt 0.405405 0.918919 +vt 0.270270 0.621621 +vt 0.297297 0.648649 +vt 0.270270 0.675676 +vt 0.243243 0.675676 +vt 0.243243 0.702703 +vt 0.189189 0.702703 +vt 0.216216 0.729730 +vt 0.189189 0.729730 +vt 0.135135 0.729730 +vt 0.135135 0.702703 +vt 0.108108 0.729730 +vt 0.081081 0.702703 +vt 0.081081 0.675676 +vt 0.054054 0.675676 +vt 0.054054 0.621621 +vt 0.027027 0.648649 +vt 0.027027 0.621621 +vt 0.027027 0.567567 +vt 0.054054 0.567567 +vt 0.027027 0.540540 +vt 0.081081 0.513513 +vt 0.135135 0.486486 +vt 0.108108 0.459459 +vt 0.135135 0.459459 +vt 0.189189 0.459459 +vt 0.189189 0.486486 +vt 0.216216 0.459459 +vt 0.243243 0.486486 +vt 0.243243 0.513513 +vt 0.270270 0.513513 +vt 0.270270 0.567567 +vt 0.297297 0.540540 +vt 0.297297 0.486486 +vt 0.270270 0.486486 +vt 0.270270 0.459459 +vt 0.216216 0.432432 +vt 0.108108 0.432432 +vt 0.054054 0.459459 +vt 0.027027 0.486486 +vt 0.000000 0.540540 +vt 0.000000 0.648649 +vt 0.027027 0.702703 +vt 0.054054 0.702703 +vt 0.054054 0.729730 +vt 0.108108 0.756757 +vt 0.216216 0.756757 +vt 0.270270 0.729730 +vt 0.270270 0.702703 +vt 0.297297 0.702703 +vt 0.945946 0.351351 +vt 0.027027 0.972973 +vt 0.891892 0.702703 +vt 0.945946 0.054054 +vt 0.702703 0.918919 +vt 0.918919 0.108108 +vt 0.567568 0.918919 +vt 0.054054 0.891892 +vt 0.702703 0.945946 +vt 0.918919 0.783784 +vt 0.918919 0.918919 +vt 0.918919 0.729730 +vt 0.459459 0.945946 +vt 0.756757 0.891892 +vt 0.891892 0.432432 +vt 0.945946 0.783783 +vt 0.540540 0.648648 +vt 0.567567 0.648648 +vt 0.567567 0.702703 +vt 0.594595 0.702703 +vt 0.594595 0.729730 +vt 0.540540 0.729730 +vt 0.540540 0.702703 +vt 0.513513 0.702703 +vt 0.513513 0.675676 +vt 0.486486 0.675676 +vt 0.486486 0.648648 +vt 0.432432 0.648648 +vt 0.432432 0.675676 +vt 0.405405 0.675676 +vt 0.486486 0.621621 +vt 0.540540 0.621621 +vt 0.432432 0.594594 +vt 0.486486 0.594594 +vt 0.378378 0.621621 +vt 0.432432 0.621621 +vt 0.351351 0.648648 +vt 0.324324 0.729730 +vt 0.324324 0.702703 +vt 0.378378 0.729730 +vt 0.405405 0.702703 +vt 0.270270 0.837838 +vt 0.864865 0.945946 +vt 0.918919 0.297297 +vt 0.135135 0.918919 +vt 0.864865 0.594594 +vt 0.054054 0.945946 +vt 0.972973 0.054054 +vt 0.810811 0.540540 +vt 0.783784 0.486486 +vt 0.783784 0.459459 +vt 0.756757 0.459459 +vt 0.756757 0.432432 +vt 0.702703 0.432432 +vt 0.702703 0.459459 +vt 0.675676 0.459459 +vt 0.783784 0.540540 +vt 0.783784 0.567567 +vt 0.648649 0.486486 +vt 0.648649 0.540540 +vt 0.675676 0.540540 +vt 0.675676 0.567567 +vt 0.702703 0.594595 +vt 0.756757 0.594595 +vt 0.891892 0.918919 +vt 0.945946 0.135135 +vt 0.945946 0.648649 +vt 0.918919 0.864865 +vt 0.594595 0.864865 +vt 0.081081 0.918919 +vt 0.945946 0.378378 +vt 0.054054 0.972973 +vt 0.297297 0.783784 +vt 0.270270 0.783784 +vt 0.270270 0.756757 +vt 0.216216 0.756757 +vt 0.216216 0.783784 +vt 0.189189 0.783784 +vt 0.324324 0.837838 +vt 0.324324 0.810811 +vt 0.162162 0.810811 +vt 0.675676 0.945946 +vt 0.918919 0.675676 +vt 0.918919 0.432432 +vt 0.918919 0.027027 +vt 0.729730 0.918919 +vt 0.810811 0.270270 +vt 0.756757 0.945946 +vt 0.918919 0.162162 +vt 0.837838 0.891892 +vt 0.324324 0.945946 +vt 0.810811 0.081081 +vt 0.837838 0.108108 +vt 0.837838 0.135135 +vt 0.864865 0.135135 +vt 0.864865 0.162162 +vt 0.702703 0.162162 +vt 0.729730 0.135135 +vt 0.702703 0.135135 +vt 0.729730 0.108108 +vt 0.783784 0.378378 +vt 0.783784 0.270270 +vt 0.918919 0.621622 +vt 0.108108 0.945946 +vt 0.945946 0.702703 +vt 0.891892 0.540540 +vt 0.459459 0.918919 +vt 0.783784 0.891892 +vt 0.216216 0.918919 +vt 0.189189 0.918919 +vt 0.432432 0.945946 +vt 0.621622 0.945946 +vt 0.486486 0.945946 +vt 0.837838 0.351351 +vt 0.918919 0.135135 +vt 0.162162 0.810811 +vt 0.162162 0.837838 +vt 0.000000 0.837838 +vt 0.027027 0.810811 +vt 0.000000 0.810811 +vt 0.027027 0.783784 +vt 0.135135 0.783784 +vt 0.054054 0.756757 +vt 0.108108 0.756757 +vt 0.027027 0.918919 +vt 0.864865 0.432432 +vt 0.810811 0.891892 +vt 0.000000 0.837838 +vt 0.891892 0.945946 +vt 0.945946 0.756757 +vt 0.918919 0.054054 +vt 0.594595 0.864865 +vt 0.864865 0.810811 +vt 0.945946 0.108108 +vt 0.351351 0.918919 +vt 0.810811 0.567567 +vt 0.324324 0.648649 +vt 0.918919 0.810811 +vt 0.918919 0.837838 +vt 0.162162 0.918919 +vt 0.054054 0.891892 +vt 0.945946 0.621622 +vt 0.081081 0.054054 +vt 0.081081 0.027027 +vt 0.135135 0.027027 +vt 0.135135 0.000000 +vt 0.297297 0.000000 +vt 0.297297 0.027027 +vt 0.351351 0.027027 +vt 0.351351 0.054054 +vt 0.054054 0.081081 +vt 0.054054 0.054054 +vt 0.027027 0.135135 +vt 0.378378 0.054054 +vt 0.378378 0.081081 +vt 0.027027 0.081081 +vt 0.405405 0.081081 +vt 0.405405 0.135135 +vt 0.000000 0.297297 +vt 0.000000 0.135135 +vt 0.432432 0.135135 +vt 0.432432 0.297297 +vt 0.027027 0.297297 +vt 0.054054 0.351351 +vt 0.027027 0.351351 +vt 0.081081 0.378378 +vt 0.054054 0.378378 +vt 0.135135 0.405405 +vt 0.081081 0.405405 +vt 0.297297 0.432432 +vt 0.135135 0.432432 +vt 0.351351 0.378378 +vt 0.351351 0.405405 +vt 0.405405 0.351351 +vt 0.378378 0.378378 +vt 0.918919 0.567567 +vt 0.108108 0.891892 +vt 0.837838 0.324324 +vt 0.783784 0.270270 +vt 0.945946 0.324324 +vt 0.918919 0.378378 +vt 0.810811 0.945946 +vt 0.162162 0.945946 +vt 0.378378 0.918919 +vt 0.945946 0.918919 +vt 0.945946 0.351351 +vt 0.108108 0.918919 +vt 0.945946 0.081081 +vt 0.270270 0.918919 +vt 0.945946 0.270270 +vt 0.864865 0.216216 +vt 0.945946 0.459459 +vt 0.918919 0.216216 +vt 0.378378 0.837838 +vt 0.378378 0.864865 +vt 0.351351 0.837838 +vt 0.324324 0.864865 +vt 0.324324 0.837838 +vt 0.351351 0.783784 +vt 0.378378 0.783784 +vt 0.378378 0.756757 +vt 0.432432 0.729730 +vt 0.486486 0.729730 +vt 0.486486 0.756757 +vt 0.540540 0.756757 +vt 0.540540 0.783784 +vt 0.405405 0.810811 +vt 0.405405 0.837838 +vt 0.432432 0.810811 +vt 0.513513 0.810811 +vt 0.486486 0.810811 +vt 0.567567 0.783784 +vt 0.567567 0.837838 +vt 0.594595 0.837838 +vt 0.594595 0.864865 +vt 0.540540 0.864865 +vt 0.540540 0.837838 +vt 0.513513 0.837838 +vt 0.702703 0.054054 +vt 0.702703 0.081081 +vt 0.864865 0.081081 +vt 0.864865 0.054054 +vt 0.837838 0.054054 +vt 0.837838 0.027027 +vt 0.810811 0.000000 +vt 0.756757 0.000000 +vt 0.729730 0.027027 +vt 0.864865 0.162162 +vt 0.918919 0.945946 +vt 0.243243 0.918919 +vt 0.810811 0.513513 +vt 0.837838 0.216216 +vt 0.945946 0.297297 +vt 0.945946 0.945946 +vt 0.270270 0.945946 +vt 0.756757 0.162162 +vt 0.945946 0.810811 +vt 0.756757 0.243243 +vt 0.054054 0.918919 +vt 0.864865 0.918919 +vt 0.486486 0.864865 +vt 0.864865 0.648649 +vt 0.918919 0.081081 +vt 0.918919 0.189189 +vt 0.756757 0.648648 +vt 0.756757 0.675676 +vt 0.783784 0.675676 +vt 0.783784 0.702703 +vt 0.810811 0.702703 +vt 0.810811 0.729730 +vt 0.837838 0.702703 +vt 0.864865 0.729730 +vt 0.864865 0.702703 +vt 0.837838 0.648648 +vt 0.810811 0.648648 +vt 0.810811 0.621621 +vt 0.756757 0.621621 +vt 0.756757 0.594594 +vt 0.702703 0.594594 +vt 0.702703 0.621621 +vt 0.648649 0.621621 +vt 0.675676 0.675676 +vt 0.702703 0.675676 +vt 0.702703 0.648648 +vt 0.621622 0.648648 +vt 0.594595 0.702703 +vt 0.594595 0.729730 +vt 0.648649 0.729730 +vt 0.675676 0.702703 +vt 0.297297 0.945946 +vt 0.891892 0.216216 +vt 0.621622 0.918919 +vt 0.918919 0.756757 +vt 0.945946 0.189189 +vt 0.864865 0.270270 +vt 0.783784 0.945946 +vt 0.918919 0.351351 +vt 0.945946 0.162162 +vt 0.837838 0.297297 +vt 0.918919 0.270270 +vt 0.918919 0.594594 +vt 0.945946 0.243243 +vt 0.972973 0.027027 +vt 0.783784 0.918919 +vt 0.216216 0.864865 +vt 0.378378 0.945946 +vt 0.378378 0.864865 +vt 0.756757 0.783784 +vt 0.756757 0.810811 +vt 0.783784 0.810811 +vt 0.783784 0.837838 +vt 0.810811 0.837838 +vt 0.810811 0.864865 +vt 0.837838 0.837838 +vt 0.864865 0.864865 +vt 0.864865 0.837838 +vt 0.837838 0.783784 +vt 0.810811 0.783784 +vt 0.810811 0.756757 +vt 0.756757 0.756757 +vt 0.756757 0.729730 +vt 0.702703 0.729730 +vt 0.702703 0.756757 +vt 0.648649 0.756757 +vt 0.675676 0.810811 +vt 0.702703 0.810811 +vt 0.702703 0.783784 +vt 0.621622 0.783784 +vt 0.594595 0.837838 +vt 0.594595 0.864865 +vt 0.648649 0.864865 +vt 0.675676 0.837838 +vt 0.918919 0.513513 +vt 0.729730 0.945946 +vt 0.432432 0.918919 +vt 0.918919 0.540540 +vt 0.945946 0.837838 +vt 0.297297 0.918919 +vt 0.702703 0.162162 +vt 0.864865 0.540540 +vt 0.864865 0.891892 +vt 0.891892 0.891892 +vt 0.810811 0.216216 +vt 0.756757 0.324324 +vt 0.594595 0.918919 +vt 0.108108 0.918919 +vt 0.216216 0.837838 +vt 0.837838 0.351351 +vt 0.432432 0.864865 +vt 0.135135 0.945946 +vt 0.945946 0.675676 +vt 0.945946 0.216216 +vt 0.891892 0.378378 +vt 0.945946 0.567567 +vt 0.891892 0.054054 +vt 0.324324 0.918919 +vt 0.486486 0.918919 +vt 0.675676 0.918919 +vt 0.837838 0.918919 +vt 0.891892 0.540540 +vt 0.540541 0.918919 +vt 0.837838 0.405405 +vt 0.891892 0.270270 +vt 0.945946 0.864865 +vt 0.837838 0.432432 +vt 0.945946 0.405405 +vt 0.216216 0.945946 +vt 0.756757 0.918919 +vt 0.027027 0.945946 +vt 0.945946 0.729730 +vt 0.945946 0.513513 +vt 0.810811 0.216216 +vt 0.243243 0.945946 +vt 0.837838 0.945946 +vt 0.810811 0.162162 +vt 0.108108 0.837838 +vt 0.648649 0.918919 +vt 0.189189 0.945946 +vt 0.702703 0.216216 +vt 0.756757 0.162162 +vt 0.918919 0.648649 +vt 0.864865 0.270270 +vt 0.702703 0.351351 +vt 0.702703 0.405405 +vt 0.729730 0.378378 +vt 0.729730 0.405405 +vt 0.729730 0.432432 +vt 0.756757 0.432432 +vt 0.756757 0.378378 +vt 0.729730 0.324324 +vt 0.702703 0.324324 +vt 0.702703 0.297297 +vt 0.675676 0.324324 +vt 0.648649 0.297297 +vt 0.648649 0.270270 +vt 0.540540 0.297297 +vt 0.486486 0.297297 +vt 0.513513 0.324324 +vt 0.486486 0.324324 +vt 0.459459 0.324324 +vt 0.486486 0.351351 +vt 0.459459 0.378378 +vt 0.459459 0.405405 +vt 0.459459 0.432432 +vt 0.486486 0.405405 +vt 0.513513 0.351351 +vt 0.567567 0.324324 +vt 0.621621 0.324324 +vt 0.675676 0.351351 +vt 0.513513 0.918919 +vt 0.270270 0.891892 +vt 0.162162 0.837838 +vt 0.918919 0.702703 +vt 0.540541 0.945946 +vt 0.648649 0.945946 +vt 0.351351 0.945946 +vt 0.702703 0.891892 +vt 0.486486 0.864865 +vt 0.891892 0.432432 +vt 0.891892 0.864865 +vt 0.918919 0.486486 +vt 0.837838 0.189189 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 -0.0000 +usemtl kiwi_Material +s off +f 226/1/1 24/2/1 227/3/1 +f 262/4/2 238/5/2 254/6/2 +f 380/7/3 381/8/3 379/9/3 +f 412/10/3 413/11/3 133/12/3 +f 18/13/4 40/14/4 182/15/4 +f 275/16/1 261/17/1 273/18/1 +f 302/19/1 3/20/1 2/21/1 +f 219/22/1 334/23/1 8/24/1 +f 175/25/3 28/26/3 166/27/3 +f 122/28/3 186/29/3 371/30/3 +f 345/31/4 175/32/4 164/33/4 +f 175/34/1 14/35/1 164/36/1 +f 321/37/5 222/38/5 339/39/5 +f 200/40/3 199/41/3 385/42/3 +f 63/43/3 62/44/3 212/45/3 +f 79/46/2 323/47/2 157/48/2 +f 371/49/2 192/50/2 122/51/2 +f 170/52/3 101/53/3 347/54/3 +f 24/55/5 228/56/5 229/57/5 +f 215/58/5 291/59/5 295/60/5 +f 161/61/3 302/62/3 300/63/3 +f 106/64/5 236/65/5 224/66/5 +f 96/67/2 351/68/2 184/69/2 +f 125/70/4 391/71/4 115/72/4 +f 210/73/2 209/74/2 402/75/2 +f 205/76/4 206/77/4 52/78/4 +f 53/79/3 205/80/3 52/81/3 +f 313/82/3 305/83/3 308/84/3 +f 349/85/4 367/86/4 102/87/4 +f 68/88/5 259/89/5 380/90/5 +f 118/91/5 248/92/5 246/93/5 +f 114/94/3 189/95/3 104/96/3 +f 64/97/4 66/98/4 65/99/4 +f 28/100/4 366/101/4 346/102/4 +f 199/103/1 186/104/1 44/105/1 +f 326/106/3 159/107/3 325/108/3 +f 321/109/2 338/110/2 220/111/2 +f 134/112/4 412/113/4 124/114/4 +f 405/115/1 373/116/1 372/117/1 +f 322/118/1 299/119/1 298/120/1 +f 181/121/3 366/122/3 365/123/3 +f 167/124/2 92/125/2 90/126/2 +f 51/127/3 202/128/3 50/129/3 +f 173/130/2 93/131/2 94/132/2 +f 265/133/1 268/134/1 256/135/1 +f 28/136/1 325/137/1 324/138/1 +f 191/139/3 198/140/3 197/141/3 +f 288/142/4 302/19/4 2/21/4 +f 187/143/3 195/144/3 194/145/3 +f 152/146/2 283/147/2 151/148/2 +f 19/149/3 182/150/3 231/151/3 +f 109/152/5 239/153/5 107/154/5 +f 204/155/2 190/156/2 133/157/2 +f 297/158/5 316/159/5 320/160/5 +f 165/161/2 361/162/2 99/163/2 +f 29/164/5 21/165/5 20/166/5 +f 89/167/2 222/168/2 221/169/2 +f 14/170/4 28/171/4 324/172/4 +f 409/173/3 410/174/3 132/175/3 +f 400/176/2 417/177/2 266/178/2 +f 3/179/3 217/180/3 294/181/3 +f 315/182/5 217/183/5 293/184/5 +f 77/185/4 76/186/4 289/187/4 +f 31/188/5 22/189/5 355/190/5 +f 154/191/2 153/192/2 77/193/2 +f 165/194/3 25/195/3 345/196/3 +f 155/197/4 156/198/4 154/199/4 +f 241/200/1 359/201/1 228/202/1 +f 415/203/5 271/204/5 396/205/5 +f 418/206/5 278/207/5 74/208/5 +f 245/209/2 242/210/2 229/211/2 +f 139/212/3 416/213/3 138/214/3 +f 300/215/1 288/216/1 1/217/1 +f 141/218/2 142/219/2 140/220/2 +f 308/221/4 163/222/4 162/223/4 +f 120/224/2 121/225/2 119/226/2 +f 401/227/1 200/228/1 385/229/1 +f 93/230/4 170/231/4 169/232/4 +f 410/233/4 428/234/4 132/235/4 +f 377/236/3 36/237/3 196/238/3 +f 135/239/2 125/240/2 136/241/2 +f 48/242/5 249/243/5 47/244/5 +f 260/245/5 238/5/5 398/246/5 +f 201/247/3 401/248/3 207/249/3 +f 367/250/3 188/251/3 112/252/3 +f 270/253/2 128/254/2 127/255/2 +f 40/256/3 38/257/3 39/258/3 +f 223/259/1 341/260/1 336/261/1 +f 432/262/1 73/263/1 282/264/1 +f 45/265/4 53/266/4 46/267/4 +f 95/268/4 173/269/4 94/270/4 +f 403/271/3 405/272/3 61/273/3 +f 101/274/4 364/275/4 347/276/4 +f 185/277/4 104/278/4 184/279/4 +f 172/280/3 102/281/3 173/282/3 +f 310/283/4 331/284/4 309/285/4 +f 208/286/4 199/287/4 192/288/4 +f 421/289/1 403/290/1 61/291/1 +f 22/292/3 29/293/3 355/294/3 +f 431/295/5 281/296/5 139/297/5 +f 329/298/1 179/299/1 350/300/1 +f 137/301/3 147/302/3 415/303/3 +f 108/304/2 109/305/2 107/306/2 +f 69/307/5 71/308/5 70/309/5 +f 362/310/3 176/311/3 110/312/3 +f 408/313/4 196/314/4 36/315/4 +f 368/316/3 33/317/3 237/318/3 +f 354/319/5 96/320/5 335/321/5 +f 333/322/2 310/323/2 85/324/2 +f 95/325/3 332/326/3 333/327/3 +f 301/328/2 83/329/2 81/330/2 +f 8/331/5 9/332/5 219/333/5 +f 329/334/4 171/335/4 17/336/4 +f 299/337/4 159/338/4 158/339/4 +f 233/340/5 352/341/5 351/342/5 +f 280/343/6 431/344/6 435/345/6 +f 393/346/3 394/347/3 392/348/3 +f 395/349/5 258/350/5 116/351/5 +f 323/352/4 298/353/4 157/354/4 +f 330/355/1 160/356/1 326/357/1 +f 78/358/2 215/359/2 295/360/2 +f 193/361/3 387/362/3 192/363/3 +f 252/364/1 369/365/1 43/366/1 +f 237/367/5 356/368/5 32/369/5 +f 414/370/3 56/371/3 54/372/3 +f 392/373/5 257/374/5 378/375/5 +f 41/376/5 19/377/5 231/378/5 +f 338/110/5 87/379/5 220/111/5 +f 97/380/2 98/381/2 340/382/2 +f 22/383/5 336/384/5 23/385/5 +f 313/386/5 292/387/5 290/388/5 +f 382/389/3 247/390/3 118/391/3 +f 202/392/1 366/393/1 363/394/1 +f 409/395/4 198/396/4 204/397/4 +f 396/398/3 136/399/3 395/349/3 +f 110/400/2 194/401/2 362/402/2 +f 371/403/4 186/404/4 360/405/4 +f 392/406/1 53/407/1 206/408/1 +f 285/409/2 384/410/2 267/411/2 +f 360/412/1 345/413/1 25/414/1 +f 413/415/4 214/416/4 133/417/4 +f 216/418/2 155/419/2 291/420/2 +f 325/137/4 179/421/4 16/422/4 +f 351/423/3 185/424/3 184/425/3 +f 218/426/5 78/427/5 294/428/5 +f 279/429/3 266/430/3 128/431/3 +f 38/432/4 377/433/4 39/434/4 +f 397/435/1 237/436/1 48/437/1 +f 277/438/3 265/439/3 264/440/3 +f 270/441/3 256/442/3 268/443/3 +f 419/444/2 435/445/2 420/446/2 +f 263/447/3 252/448/3 261/449/3 +f 22/450/1 21/451/1 353/452/1 +f 407/453/2 195/454/2 376/455/2 +f 3/456/4 305/457/4 4/458/4 +f 113/459/4 191/460/4 189/461/4 +f 63/462/1 64/463/1 377/464/1 +f 317/465/1 296/466/1 217/467/1 +f 81/468/4 80/469/4 79/470/4 +f 272/471/3 48/472/3 47/473/3 +f 32/474/3 223/475/3 22/476/3 +f 179/477/3 28/478/3 346/479/3 +f 248/480/3 233/481/3 246/482/3 +f 347/483/2 100/484/2 177/485/2 +f 280/486/5 148/487/5 137/488/5 +f 379/489/5 30/490/5 42/491/5 +f 244/492/3 43/493/3 369/494/3 +f 289/495/2 304/496/2 75/497/2 +f 262/498/3 260/499/3 398/500/3 +f 407/501/3 140/502/3 406/503/3 +f 59/504/1 277/505/1 264/506/1 +f 169/507/2 347/508/2 168/509/2 +f 107/510/5 342/511/5 358/512/5 +f 373/513/3 375/514/3 372/515/3 +f 108/516/3 358/517/3 243/518/3 +f 275/519/5 276/520/5 255/521/5 +f 253/522/3 238/523/3 109/524/3 +f 418/525/3 420/526/3 417/527/3 +f 107/528/3 224/529/3 98/530/3 +f 314/531/1 293/532/1 292/533/1 +f 239/153/2 106/534/2 224/535/2 +f 366/101/1 179/536/1 346/102/1 +f 86/537/5 85/538/5 312/539/5 +f 389/540/2 112/541/2 123/542/2 +f 309/543/2 328/544/2 84/545/2 +f 67/546/5 57/547/5 414/548/5 +f 62/549/4 427/550/4 212/551/4 +f 319/552/5 337/553/5 12/554/5 +f 123/555/4 188/556/4 131/557/4 +f 123/558/3 203/559/3 389/560/3 +f 98/381/5 225/561/5 340/382/5 +f 89/562/5 343/563/5 344/564/5 +f 88/565/2 312/566/2 87/567/2 +f 120/568/3 242/569/3 370/570/3 +f 84/571/4 82/572/4 301/573/4 +f 54/574/5 55/575/5 393/576/5 +f 70/577/3 58/578/3 68/579/3 +f 347/580/3 92/581/3 91/582/3 +f 179/583/4 181/584/4 348/585/4 +f 138/586/5 126/587/5 382/588/5 +f 434/589/1 287/590/1 276/591/1 +f 364/592/3 111/593/3 100/594/3 +f 366/595/3 174/596/3 363/597/3 +f 6/598/5 311/599/5 7/600/5 +f 30/601/3 41/602/3 42/603/3 +f 238/604/3 117/605/3 106/606/3 +f 245/607/3 228/608/3 359/609/3 +f 236/610/3 354/611/3 224/612/3 +f 102/613/2 112/614/2 101/615/2 +f 350/616/3 348/617/3 171/618/3 +f 287/619/3 59/620/3 276/621/3 +f 10/622/1 11/623/1 9/624/1 +f 73/625/3 273/626/3 282/627/3 +f 159/628/1 161/629/1 158/630/1 +f 174/631/1 28/632/1 27/633/1 +f 33/634/1 240/635/1 356/636/1 +f 313/637/1 4/638/1 305/639/1 +f 297/640/2 218/641/2 294/642/2 +f 391/643/3 134/644/3 124/645/3 +f 257/646/3 46/647/3 378/648/3 +f 357/649/3 356/650/3 240/651/3 +f 130/652/3 402/653/3 208/654/3 +f 375/655/1 35/656/1 34/657/1 +f 7/658/1 163/659/1 6/660/1 +f 51/661/4 366/393/4 388/662/4 +f 206/663/3 64/664/3 65/665/3 +f 230/666/2 358/667/2 342/668/2 +f 17/669/1 18/670/1 19/671/1 +f 161/629/4 326/672/4 160/673/4 +f 249/674/3 235/675/3 31/676/3 +f 347/677/4 167/678/4 168/679/4 +f 227/680/5 356/681/5 226/682/5 +f 285/683/3 151/684/3 274/685/3 +f 235/686/1 32/687/1 22/688/1 +f 129/689/2 208/690/2 387/691/2 +f 383/692/3 384/693/3 121/694/3 +f 60/695/1 201/696/1 207/697/1 +f 360/698/3 35/699/3 26/700/3 +f 225/701/2 354/702/2 335/703/2 +f 116/704/3 125/705/3 115/706/3 +f 12/707/1 13/708/1 319/709/1 +f 304/710/4 1/711/4 75/712/4 +f 226/1/1 357/713/1 24/2/1 +f 262/4/2 398/246/2 238/5/2 +f 380/7/3 259/714/3 381/8/3 +f 412/10/3 145/715/3 413/11/3 +f 18/13/4 183/716/4 40/14/4 +f 275/16/1 263/717/1 261/17/1 +f 302/19/1 306/718/1 3/20/1 +f 219/22/1 311/719/1 334/23/1 +f 175/25/3 27/720/3 28/26/3 +f 122/28/3 44/721/3 186/29/3 +f 422/722/4 424/723/4 403/724/4 +f 424/723/4 50/725/4 403/724/4 +f 202/726/4 363/727/4 373/728/4 +f 363/727/4 174/729/4 373/728/4 +f 373/728/4 404/730/4 202/726/4 +f 404/730/4 403/724/4 202/726/4 +f 35/731/4 374/732/4 373/728/4 +f 345/31/4 26/733/4 175/32/4 +f 26/733/4 35/731/4 175/32/4 +f 110/734/4 176/735/4 92/736/4 +f 176/735/4 165/737/4 92/736/4 +f 376/738/4 187/739/4 110/734/4 +f 141/740/4 407/741/4 389/742/4 +f 407/741/4 376/738/4 389/742/4 +f 143/743/4 426/744/4 141/740/4 +f 389/742/4 203/745/4 141/740/4 +f 203/745/4 143/743/4 141/740/4 +f 100/746/4 111/747/4 376/738/4 +f 111/747/4 389/742/4 376/738/4 +f 92/736/4 177/748/4 110/734/4 +f 177/748/4 100/746/4 110/734/4 +f 164/33/4 90/749/4 165/737/4 +f 90/749/4 92/736/4 165/737/4 +f 174/729/4 27/750/4 35/731/4 +f 27/750/4 175/32/4 35/731/4 +f 403/724/4 50/725/4 202/726/4 +f 35/731/4 373/728/4 174/729/4 +f 100/746/4 376/738/4 110/734/4 +f 165/737/4 345/31/4 164/33/4 +f 175/34/1 166/751/1 14/35/1 +f 321/37/5 221/752/5 222/38/5 +f 200/40/3 386/753/3 199/41/3 +f 63/43/3 408/754/3 62/44/3 +f 79/46/2 80/755/2 323/47/2 +f 371/49/2 193/756/2 192/50/2 +f 170/52/3 102/757/3 101/53/3 +f 253/758/5 108/759/5 119/760/5 +f 108/759/5 243/761/5 119/760/5 +f 243/761/5 230/762/5 229/57/5 +f 230/762/5 24/55/5 229/57/5 +f 357/763/5 240/764/5 43/765/5 +f 240/764/5 251/766/5 43/765/5 +f 262/767/5 254/768/5 384/769/5 +f 254/768/5 253/758/5 384/769/5 +f 150/770/5 399/771/5 151/772/5 +f 399/771/5 262/767/5 151/772/5 +f 151/772/5 283/773/5 150/770/5 +f 384/769/5 274/774/5 262/767/5 +f 274/774/5 151/772/5 262/767/5 +f 119/760/5 121/775/5 384/769/5 +f 229/57/5 242/776/5 243/761/5 +f 242/776/5 119/760/5 243/761/5 +f 43/765/5 241/777/5 357/763/5 +f 241/777/5 228/56/5 357/763/5 +f 261/778/5 252/779/5 43/765/5 +f 282/780/5 273/781/5 397/782/5 +f 273/781/5 261/778/5 397/782/5 +f 433/783/5 432/784/5 282/780/5 +f 397/782/5 272/785/5 282/780/5 +f 272/785/5 433/783/5 282/780/5 +f 251/766/5 368/786/5 261/778/5 +f 368/786/5 397/782/5 261/778/5 +f 251/766/5 261/778/5 43/765/5 +f 119/760/5 384/769/5 253/758/5 +f 24/55/5 357/763/5 228/56/5 +f 215/58/5 216/787/5 291/59/5 +f 303/788/3 300/63/3 302/62/3 +f 300/63/3 299/789/3 161/61/3 +f 299/789/3 158/790/3 161/61/3 +f 106/64/5 117/791/5 236/65/5 +f 103/792/2 349/793/2 189/794/2 +f 349/793/2 172/795/2 189/794/2 +f 172/795/2 95/796/2 184/69/2 +f 95/796/2 96/67/2 184/69/2 +f 105/797/2 236/798/2 246/799/2 +f 236/798/2 117/800/2 246/799/2 +f 131/801/2 188/802/2 197/803/2 +f 188/802/2 103/792/2 197/803/2 +f 143/804/2 203/805/2 132/806/2 +f 203/805/2 131/801/2 132/806/2 +f 132/806/2 428/807/2 143/804/2 +f 197/803/2 409/808/2 131/801/2 +f 409/808/2 132/806/2 131/801/2 +f 189/794/2 191/809/2 197/803/2 +f 184/69/2 104/810/2 172/795/2 +f 104/810/2 189/794/2 172/795/2 +f 246/799/2 233/811/2 105/797/2 +f 233/811/2 351/68/2 105/797/2 +f 382/812/2 118/813/2 246/799/2 +f 139/814/2 138/815/2 260/816/2 +f 138/815/2 382/812/2 260/816/2 +f 150/770/2 431/817/2 139/814/2 +f 260/816/2 399/771/2 139/814/2 +f 399/771/2 150/770/2 139/814/2 +f 117/800/2 250/818/2 382/812/2 +f 250/818/2 260/816/2 382/812/2 +f 117/800/2 382/812/2 246/799/2 +f 189/794/2 197/803/2 103/792/2 +f 96/67/2 105/797/2 351/68/2 +f 125/70/4 135/819/4 391/71/4 +f 210/73/2 211/820/2 209/74/2 +f 205/76/4 411/821/4 206/77/4 +f 53/79/3 390/822/3 205/80/3 +f 153/823/3 156/824/3 307/825/3 +f 216/826/3 215/827/3 318/828/3 +f 318/828/3 218/829/3 320/830/3 +f 316/831/3 317/832/3 315/833/3 +f 216/826/3 318/828/3 220/834/3 +f 318/828/3 320/830/3 220/834/3 +f 304/835/3 76/836/3 153/823/3 +f 299/789/3 300/63/3 304/835/3 +f 157/837/3 298/838/3 299/789/3 +f 301/839/3 81/840/3 79/841/3 +f 79/841/3 157/837/3 299/789/3 +f 304/835/3 153/823/3 301/839/3 +f 153/823/3 307/825/3 301/839/3 +f 79/841/3 299/789/3 304/835/3 +f 309/842/3 84/843/3 301/839/3 +f 301/839/3 79/841/3 304/835/3 +f 85/844/3 310/845/3 309/842/3 +f 309/842/3 301/839/3 307/825/3 +f 309/842/3 307/825/3 216/826/3 +f 312/846/3 85/844/3 309/842/3 +f 220/834/3 87/847/3 312/846/3 +f 221/848/3 321/849/3 220/834/3 +f 13/850/3 89/851/3 221/848/3 +f 9/852/3 11/853/3 319/854/3 +f 319/854/3 13/850/3 221/848/3 +f 221/848/3 220/834/3 320/830/3 +f 220/834/3 312/846/3 216/826/3 +f 312/846/3 309/842/3 216/826/3 +f 9/852/3 319/854/3 316/831/3 +f 319/854/3 221/848/3 316/831/3 +f 311/855/3 219/856/3 9/852/3 +f 162/857/3 7/858/3 311/855/3 +f 161/61/3 160/859/3 308/84/3 +f 308/84/3 162/857/3 311/855/3 +f 221/848/3 320/830/3 316/831/3 +f 308/84/3 311/855/3 313/82/3 +f 311/855/3 9/852/3 313/82/3 +f 302/62/3 161/61/3 305/83/3 +f 161/61/3 308/84/3 305/83/3 +f 305/83/3 306/860/3 302/62/3 +f 315/833/3 314/861/3 313/82/3 +f 316/831/3 315/833/3 9/852/3 +f 315/833/3 313/82/3 9/852/3 +f 349/85/4 103/862/4 367/86/4 +f 68/88/5 58/863/5 259/89/5 +f 118/91/5 247/864/5 248/92/5 +f 114/94/3 113/865/3 189/95/3 +f 64/97/4 213/866/4 66/98/4 +f 28/100/4 178/867/4 366/101/4 +f 199/103/1 386/868/1 186/104/1 +f 333/327/3 86/869/3 335/870/3 +f 86/869/3 88/871/3 335/870/3 +f 88/871/3 338/872/3 339/873/3 +f 339/873/3 222/874/3 342/875/3 +f 222/874/3 344/876/3 342/875/3 +f 343/877/3 12/878/3 227/879/3 +f 12/878/3 337/880/3 227/879/3 +f 337/880/3 10/881/3 8/882/3 +f 8/882/3 334/883/3 21/884/3 +f 334/883/3 6/885/3 21/884/3 +f 163/886/3 330/887/3 329/888/3 +f 330/887/3 326/106/3 329/888/3 +f 326/106/3 327/889/3 159/107/3 +f 159/107/3 5/890/3 14/891/3 +f 5/890/3 322/892/3 14/891/3 +f 323/893/3 80/894/3 167/895/3 +f 80/894/3 83/896/3 167/895/3 +f 83/896/3 82/897/3 328/898/3 +f 328/898/3 331/899/3 94/900/3 +f 331/899/3 332/326/3 94/900/3 +f 332/326/3 95/325/3 94/900/3 +f 94/900/3 93/901/3 328/898/3 +f 93/901/3 169/902/3 328/898/3 +f 169/902/3 168/903/3 83/896/3 +f 168/903/3 167/895/3 83/896/3 +f 167/895/3 90/904/3 323/893/3 +f 90/904/3 164/905/3 323/893/3 +f 14/891/3 324/906/3 159/107/3 +f 324/906/3 325/108/3 159/107/3 +f 325/108/3 16/907/3 326/106/3 +f 16/907/3 329/888/3 326/106/3 +f 329/888/3 17/908/3 163/886/3 +f 17/908/3 20/909/3 163/886/3 +f 21/884/3 23/910/3 8/882/3 +f 23/910/3 336/911/3 8/882/3 +f 336/911/3 341/912/3 337/880/3 +f 341/912/3 227/879/3 337/880/3 +f 227/879/3 24/913/3 343/877/3 +f 24/913/3 230/914/3 343/877/3 +f 342/875/3 97/915/3 339/873/3 +f 97/915/3 340/916/3 339/873/3 +f 340/916/3 225/917/3 88/871/3 +f 225/917/3 335/870/3 88/871/3 +f 340/916/3 88/871/3 339/873/3 +f 342/875/3 344/876/3 230/914/3 +f 344/876/3 343/877/3 230/914/3 +f 83/896/3 328/898/3 169/902/3 +f 336/911/3 337/880/3 8/882/3 +f 322/892/3 323/893/3 164/905/3 +f 322/892/3 164/905/3 14/891/3 +f 20/909/3 21/884/3 6/885/3 +f 20/909/3 6/885/3 163/886/3 +f 321/109/2 339/918/2 338/110/2 +f 134/112/4 145/919/4 412/113/4 +f 405/115/1 404/920/1 373/116/1 +f 322/118/1 5/921/1 299/119/1 +f 181/121/3 180/922/3 366/122/3 +f 167/124/2 91/923/2 92/125/2 +f 51/127/3 388/924/3 202/128/3 +f 173/130/2 102/925/2 93/131/2 +f 265/133/1 269/926/1 268/134/1 +f 28/136/1 15/927/1 325/137/1 +f 191/139/3 190/928/3 198/140/3 +f 288/142/4 303/929/4 302/19/4 +f 187/143/3 376/930/3 195/144/3 +f 152/146/2 286/931/2 283/147/2 +f 19/149/3 18/932/3 182/150/3 +f 109/152/5 238/933/5 239/153/5 +f 247/934/2 126/935/2 416/936/2 +f 416/936/2 281/937/2 149/938/2 +f 149/938/2 280/939/2 416/936/2 +f 280/939/2 137/940/2 416/936/2 +f 137/940/2 415/941/2 396/942/2 +f 396/942/2 395/943/2 116/944/2 +f 115/945/2 391/946/2 124/947/2 +f 137/940/2 396/942/2 247/934/2 +f 396/942/2 116/944/2 247/934/2 +f 416/936/2 137/940/2 247/934/2 +f 234/948/2 248/949/2 247/934/2 +f 185/950/2 352/951/2 234/948/2 +f 190/156/2 113/952/2 114/953/2 +f 114/953/2 185/950/2 234/948/2 +f 234/948/2 247/934/2 116/944/2 +f 234/948/2 116/944/2 115/945/2 +f 190/156/2 114/953/2 115/945/2 +f 114/953/2 234/948/2 115/945/2 +f 204/155/2 198/954/2 190/156/2 +f 144/955/2 410/956/2 204/155/2 +f 133/157/2 214/957/2 204/155/2 +f 214/957/2 144/955/2 204/155/2 +f 124/947/2 412/958/2 133/157/2 +f 115/945/2 124/947/2 190/156/2 +f 124/947/2 133/157/2 190/156/2 +f 297/158/5 296/959/5 316/159/5 +f 165/161/2 176/960/2 361/162/2 +f 29/164/5 353/961/5 21/165/5 +f 89/167/2 344/962/2 222/168/2 +f 14/170/4 166/963/4 28/171/4 +f 409/173/3 204/964/3 410/174/3 +f 400/176/2 418/965/2 417/177/2 +f 291/966/3 155/419/3 154/967/3 +f 154/967/3 77/968/3 289/969/3 +f 289/969/3 75/970/3 1/971/3 +f 288/972/3 2/973/3 3/179/3 +f 289/969/3 1/971/3 288/972/3 +f 291/966/3 154/967/3 295/974/3 +f 154/967/3 289/969/3 295/974/3 +f 294/181/3 78/975/3 295/974/3 +f 289/969/3 288/972/3 3/179/3 +f 3/179/3 4/976/3 290/977/3 +f 292/978/3 293/979/3 217/180/3 +f 3/179/3 290/977/3 292/978/3 +f 295/974/3 289/969/3 294/181/3 +f 289/969/3 3/179/3 294/181/3 +f 296/980/3 297/981/3 294/181/3 +f 3/179/3 292/978/3 217/180/3 +f 217/180/3 296/980/3 294/181/3 +f 315/182/5 317/982/5 217/183/5 +f 77/185/4 153/983/4 76/186/4 +f 31/188/5 235/984/5 22/189/5 +f 154/191/2 156/985/2 153/192/2 +f 165/194/3 99/986/3 25/195/3 +f 155/197/4 307/987/4 156/198/4 +f 241/200/1 244/988/1 359/201/1 +f 415/203/5 147/989/5 271/204/5 +f 418/206/5 400/990/5 279/991/5 +f 279/991/5 270/992/5 268/993/5 +f 269/994/5 277/995/5 278/207/5 +f 279/991/5 268/993/5 269/994/5 +f 436/996/5 419/997/5 418/206/5 +f 418/206/5 279/991/5 269/994/5 +f 278/207/5 287/998/5 74/208/5 +f 418/206/5 269/994/5 278/207/5 +f 74/208/5 436/996/5 418/206/5 +f 245/209/2 370/999/2 242/210/2 +f 139/212/3 281/1000/3 416/213/3 +f 300/215/1 303/1001/1 288/216/1 +f 141/218/2 426/1002/2 142/219/2 +f 308/221/4 330/1003/4 163/222/4 +f 120/224/2 383/1004/2 121/225/2 +f 401/227/1 49/1005/1 200/228/1 +f 93/230/4 102/1006/4 170/231/4 +f 410/233/4 144/1007/4 428/234/4 +f 377/236/3 37/1008/3 36/237/3 +f 125/240/2 258/1009/2 136/241/2 +f 136/241/2 271/1010/2 147/1011/2 +f 147/1011/2 148/1012/2 430/1013/2 +f 430/1013/2 146/1014/2 145/1015/2 +f 146/1014/2 413/1016/2 145/1015/2 +f 145/1015/2 134/1017/2 135/239/2 +f 136/241/2 147/1011/2 135/239/2 +f 147/1011/2 430/1013/2 145/1015/2 +f 135/239/2 147/1011/2 145/1015/2 +f 48/242/5 237/1018/5 249/243/5 +f 260/245/5 250/1019/5 238/5/5 +f 201/247/3 49/1020/3 401/248/3 +f 367/250/3 103/1021/3 188/251/3 +f 270/253/2 279/1022/2 128/254/2 +f 40/256/3 183/1023/3 38/257/3 +f 223/259/1 356/1024/1 341/260/1 +f 432/262/1 284/1025/1 73/263/1 +f 45/265/4 390/1026/4 53/266/4 +f 95/268/4 172/1027/4 173/269/4 +f 403/271/3 404/1028/3 405/272/3 +f 101/274/4 112/1029/4 364/275/4 +f 185/277/4 114/1030/4 104/278/4 +f 172/280/3 349/1031/3 102/281/3 +f 310/283/4 332/1032/4 331/284/4 +f 208/286/4 402/1033/4 209/1034/4 +f 209/1034/4 60/1035/4 401/1036/4 +f 60/1035/4 207/1037/4 401/1036/4 +f 401/1036/4 385/1038/4 199/287/4 +f 192/288/4 387/1039/4 208/286/4 +f 208/286/4 209/1034/4 401/1036/4 +f 199/287/4 44/1040/4 122/1041/4 +f 208/286/4 401/1036/4 199/287/4 +f 199/287/4 122/1041/4 192/288/4 +f 421/289/1 422/1042/1 403/290/1 +f 22/292/3 353/1043/3 29/293/3 +f 431/295/5 149/1044/5 281/296/5 +f 329/298/1 16/1045/1 179/299/1 +f 137/301/3 148/1046/3 147/302/3 +f 108/304/2 253/1047/2 109/305/2 +f 69/307/5 72/1048/5 71/308/5 +f 362/310/3 361/1049/3 176/311/3 +f 408/313/4 63/1050/4 196/314/4 +f 368/316/3 251/1051/3 33/317/3 +f 354/319/5 105/1052/5 96/320/5 +f 333/322/2 332/1053/2 310/323/2 +f 335/870/3 96/1054/3 333/327/3 +f 96/1054/3 95/325/3 333/327/3 +f 301/328/2 82/1055/2 83/329/2 +f 8/331/5 10/1056/5 9/332/5 +f 329/334/4 350/1057/4 171/335/4 +f 299/337/4 5/1058/4 159/338/4 +f 233/340/5 234/1059/5 352/341/5 +f 422/1060/6 421/1061/6 423/1062/6 +f 423/1062/6 60/1063/6 209/1064/6 +f 211/1065/6 142/1066/6 426/1067/6 +f 423/1062/6 209/1064/6 211/1065/6 +f 425/1068/6 424/1069/6 422/1060/6 +f 422/1060/6 423/1062/6 425/1068/6 +f 423/1062/6 211/1065/6 213/1070/6 +f 425/1068/6 423/1062/6 213/1070/6 +f 426/1067/6 143/1071/6 428/1072/6 +f 211/1065/6 426/1067/6 428/1072/6 +f 213/1070/6 427/1073/6 425/1068/6 +f 428/1072/6 144/1074/6 214/1075/6 +f 211/1065/6 428/1072/6 214/1075/6 +f 213/1070/6 211/1065/6 214/1075/6 +f 67/1076/6 66/1077/6 213/1070/6 +f 214/1075/6 146/1078/6 430/1079/6 +f 429/1080/6 67/1076/6 213/1070/6 +f 72/1081/6 69/1082/6 429/1080/6 +f 432/1083/6 433/1084/6 72/1081/6 +f 434/1085/6 284/1086/6 432/1083/6 +f 436/1087/6 74/1088/6 434/1085/6 +f 283/1089/6 286/1090/6 435/345/6 +f 435/345/6 436/1087/6 434/1085/6 +f 434/1085/6 432/1083/6 72/1081/6 +f 72/1081/6 429/1080/6 434/1085/6 +f 429/1080/6 213/1070/6 434/1085/6 +f 213/1070/6 214/1075/6 280/343/6 +f 214/1075/6 430/1079/6 280/343/6 +f 280/343/6 149/1091/6 431/344/6 +f 283/1089/6 435/345/6 431/344/6 +f 435/345/6 434/1085/6 213/1070/6 +f 431/344/6 150/1092/6 283/1089/6 +f 213/1070/6 280/343/6 435/345/6 +f 393/346/3 55/1093/3 394/347/3 +f 395/349/5 136/399/5 258/350/5 +f 323/352/4 322/1094/4 298/353/4 +f 330/355/1 308/1095/1 160/356/1 +f 78/358/2 318/1096/2 215/359/2 +f 193/361/3 129/1097/3 387/362/3 +f 252/364/1 255/1098/1 369/365/1 +f 237/367/5 33/1099/5 356/368/5 +f 414/370/3 57/1100/3 56/371/3 +f 392/373/5 394/1101/5 257/374/5 +f 41/376/5 232/1102/5 19/377/5 +f 338/110/5 88/1103/5 87/379/5 +f 97/380/2 107/1104/2 98/381/2 +f 22/383/5 223/1105/5 336/384/5 +f 313/386/5 314/1106/5 292/387/5 +f 382/389/3 126/1107/3 247/390/3 +f 202/392/1 388/662/1 366/393/1 +f 409/395/4 197/1108/4 198/396/4 +f 396/398/3 271/1109/3 136/399/3 +f 110/400/2 187/1110/2 194/401/2 +f 201/1111/4 423/1112/4 405/1113/4 +f 423/1112/4 421/1114/4 405/1113/4 +f 421/1114/4 61/1115/4 405/1113/4 +f 405/1113/4 372/1116/4 375/1117/4 +f 375/1117/4 34/1118/4 360/405/4 +f 360/405/4 25/1119/4 99/1120/4 +f 361/1121/4 362/1122/4 194/1123/4 +f 360/405/4 99/1120/4 361/1121/4 +f 405/1113/4 375/1117/4 201/1111/4 +f 375/1117/4 360/405/4 186/404/4 +f 200/1124/4 49/1125/4 201/1111/4 +f 186/404/4 386/1126/4 200/1124/4 +f 129/1127/4 193/1128/4 371/403/4 +f 186/404/4 200/1124/4 375/1117/4 +f 200/1124/4 201/1111/4 375/1117/4 +f 360/405/4 361/1121/4 371/403/4 +f 361/1121/4 194/1123/4 371/403/4 +f 194/1123/4 195/1129/4 406/1130/4 +f 406/1130/4 140/1131/4 142/1132/4 +f 142/1132/4 211/1133/4 406/1130/4 +f 211/1133/4 210/1134/4 406/1130/4 +f 210/1134/4 130/1135/4 129/1127/4 +f 210/1134/4 129/1127/4 194/1123/4 +f 129/1127/4 371/403/4 194/1123/4 +f 406/1130/4 210/1134/4 194/1123/4 +f 65/1136/1 66/1137/1 206/408/1 +f 66/1137/1 67/1138/1 206/408/1 +f 67/1138/1 414/1139/1 54/1140/1 +f 54/1140/1 393/1141/1 392/406/1 +f 392/406/1 378/1142/1 46/1143/1 +f 53/407/1 52/1144/1 206/408/1 +f 392/406/1 46/1143/1 53/407/1 +f 67/1138/1 54/1140/1 206/408/1 +f 54/1140/1 392/406/1 206/408/1 +f 285/409/2 274/1145/2 384/410/2 +f 360/412/1 26/1146/1 345/413/1 +f 413/415/4 146/1147/4 214/416/4 +f 216/418/2 307/1148/2 155/419/2 +f 325/137/4 15/927/4 179/421/4 +f 351/423/3 352/1149/3 185/424/3 +f 218/426/5 318/1150/5 78/427/5 +f 279/429/3 400/1151/3 266/430/3 +f 38/432/4 37/1152/4 377/433/4 +f 397/435/1 368/1153/1 237/436/1 +f 277/438/3 269/1154/3 265/439/3 +f 270/441/3 127/1155/3 256/442/3 +f 419/444/2 436/1156/2 435/445/2 +f 263/447/3 255/1157/3 252/448/3 +f 22/450/1 23/1158/1 21/451/1 +f 407/453/2 406/1159/2 195/454/2 +f 3/456/4 306/1160/4 305/457/4 +f 113/459/4 190/1161/4 191/460/4 +f 257/1162/1 394/1163/1 55/1164/1 +f 55/1164/1 56/1165/1 57/1166/1 +f 57/1166/1 429/1167/1 68/1168/1 +f 429/1167/1 69/1169/1 68/1168/1 +f 69/1169/1 70/1170/1 68/1168/1 +f 68/1168/1 380/1171/1 379/1172/1 +f 379/1172/1 42/1173/1 41/1174/1 +f 41/1174/1 231/1175/1 182/1176/1 +f 40/1177/1 39/1178/1 377/464/1 +f 41/1174/1 182/1176/1 40/1177/1 +f 68/1168/1 379/1172/1 57/1166/1 +f 379/1172/1 41/1174/1 257/1162/1 +f 257/1162/1 55/1164/1 379/1172/1 +f 55/1164/1 57/1166/1 379/1172/1 +f 205/1179/1 390/1180/1 45/1181/1 +f 41/1174/1 40/1177/1 45/1181/1 +f 40/1177/1 377/464/1 45/1181/1 +f 377/464/1 196/1182/1 63/462/1 +f 63/462/1 212/1183/1 427/1184/1 +f 427/1184/1 213/1185/1 63/462/1 +f 213/1185/1 64/463/1 63/462/1 +f 64/463/1 411/1186/1 205/1179/1 +f 45/1181/1 257/1162/1 41/1174/1 +f 64/463/1 205/1179/1 377/464/1 +f 205/1179/1 45/1181/1 377/464/1 +f 317/465/1 316/1187/1 296/466/1 +f 81/468/4 83/1188/4 80/469/4 +f 272/471/3 397/1189/3 48/472/3 +f 32/474/3 356/1190/3 223/475/3 +f 179/477/3 15/1191/3 28/478/3 +f 248/480/3 234/1192/3 233/481/3 +f 347/483/2 364/1193/2 100/484/2 +f 280/486/5 430/1194/5 148/487/5 +f 379/489/5 381/1195/5 30/490/5 +f 244/492/3 241/1196/3 43/493/3 +f 289/495/2 76/1197/2 304/496/2 +f 262/498/3 399/1198/3 260/499/3 +f 407/501/3 141/1199/3 140/502/3 +f 59/504/1 278/1200/1 277/505/1 +f 169/507/2 170/1201/2 347/508/2 +f 107/510/5 97/1202/5 342/511/5 +f 373/513/3 374/1203/3 375/514/3 +f 108/516/3 107/1204/3 358/517/3 +f 127/1205/5 128/1206/5 266/1207/5 +f 266/1207/5 417/1208/5 420/1209/5 +f 420/1209/5 435/1210/5 285/1211/5 +f 435/1210/5 286/1212/5 285/1211/5 +f 286/1212/5 152/1213/5 285/1211/5 +f 285/1211/5 267/1214/5 383/1215/5 +f 383/1215/5 120/1216/5 370/1217/5 +f 370/1217/5 245/1218/5 359/1219/5 +f 244/1220/5 369/1221/5 255/521/5 +f 370/1217/5 359/1219/5 244/1220/5 +f 285/1211/5 383/1215/5 420/1209/5 +f 383/1215/5 370/1217/5 127/1205/5 +f 127/1205/5 266/1207/5 383/1215/5 +f 266/1207/5 420/1209/5 383/1215/5 +f 264/1222/5 265/1223/5 256/1224/5 +f 370/1217/5 244/1220/5 256/1224/5 +f 244/1220/5 255/521/5 256/1224/5 +f 255/521/5 263/1225/5 275/519/5 +f 275/519/5 73/1226/5 284/1227/5 +f 284/1227/5 434/1228/5 275/519/5 +f 434/1228/5 276/520/5 275/519/5 +f 276/520/5 59/1229/5 264/1222/5 +f 256/1224/5 127/1205/5 370/1217/5 +f 276/520/5 264/1222/5 255/521/5 +f 264/1222/5 256/1224/5 255/521/5 +f 253/522/3 254/1230/3 238/523/3 +f 418/525/3 419/1231/3 420/526/3 +f 107/528/3 239/1232/3 224/529/3 +f 314/531/1 315/1233/1 293/532/1 +f 239/153/2 238/933/2 106/534/2 +f 366/101/1 180/1234/1 179/536/1 +f 86/537/5 333/1235/5 85/538/5 +f 389/540/2 111/1236/2 112/541/2 +f 309/543/2 331/1237/2 328/544/2 +f 67/546/5 429/1238/5 57/547/5 +f 62/549/4 425/1239/4 427/550/4 +f 319/552/5 11/1240/5 337/553/5 +f 123/555/4 112/1241/4 188/556/4 +f 123/558/3 131/1242/3 203/559/3 +f 98/381/5 224/1243/5 225/561/5 +f 89/562/5 13/1244/5 343/563/5 +f 88/565/2 86/1245/2 312/566/2 +f 120/568/3 119/1246/3 242/569/3 +f 84/571/4 328/1247/4 82/572/4 +f 54/574/5 56/1248/5 55/575/5 +f 70/577/3 71/1249/3 58/578/3 +f 347/580/3 177/1250/3 92/581/3 +f 179/583/4 180/1251/4 181/584/4 +f 138/586/5 416/1252/5 126/587/5 +f 434/589/1 74/1253/1 287/590/1 +f 364/592/3 112/1254/3 111/593/3 +f 366/595/3 178/1255/3 174/596/3 +f 6/598/5 334/1256/5 311/599/5 +f 30/601/3 232/1257/3 41/602/3 +f 238/604/3 250/1258/3 117/605/3 +f 245/607/3 229/1259/3 228/608/3 +f 236/610/3 105/1260/3 354/611/3 +f 102/613/2 367/1261/2 112/614/2 +f 350/616/3 179/1262/3 348/617/3 +f 287/619/3 278/1263/3 59/620/3 +f 10/622/1 337/1264/1 11/623/1 +f 73/625/3 275/1265/3 273/626/3 +f 159/628/1 327/1266/1 161/629/1 +f 174/631/1 178/1267/1 28/632/1 +f 33/634/1 251/1268/1 240/635/1 +f 313/637/1 290/1269/1 4/638/1 +f 297/640/2 320/1270/2 218/641/2 +f 391/643/3 135/1271/3 134/644/3 +f 257/646/3 45/1272/3 46/647/3 +f 357/649/3 226/1273/3 356/650/3 +f 130/652/3 210/1274/3 402/653/3 +f 375/655/1 374/1275/1 35/656/1 +f 7/658/1 162/1276/1 163/659/1 +f 51/661/4 365/1277/4 366/393/4 +f 206/663/3 411/1278/3 64/664/3 +f 230/666/2 243/1279/2 358/667/2 +f 259/1280/1 58/1281/1 47/1282/1 +f 58/1281/1 71/1283/1 47/1282/1 +f 71/1283/1 72/1284/1 433/1285/1 +f 433/1285/1 272/1286/1 71/1283/1 +f 272/1286/1 47/1282/1 71/1283/1 +f 47/1282/1 249/1287/1 259/1280/1 +f 249/1287/1 31/1288/1 259/1280/1 +f 31/1288/1 355/1289/1 30/1290/1 +f 355/1289/1 29/1291/1 30/1290/1 +f 29/1291/1 20/1292/1 19/671/1 +f 20/1292/1 17/669/1 19/671/1 +f 171/1293/1 348/1294/1 38/1295/1 +f 348/1294/1 181/1296/1 38/1295/1 +f 181/1296/1 365/1297/1 36/1298/1 +f 365/1297/1 51/1299/1 36/1298/1 +f 51/1299/1 50/725/1 62/1300/1 +f 50/725/1 424/723/1 62/1300/1 +f 424/723/1 425/1301/1 62/1300/1 +f 62/1300/1 408/1302/1 51/1299/1 +f 408/1302/1 36/1298/1 51/1299/1 +f 36/1298/1 37/1303/1 38/1295/1 +f 38/1295/1 183/1304/1 171/1293/1 +f 183/1304/1 18/670/1 171/1293/1 +f 19/671/1 232/1305/1 29/1291/1 +f 232/1305/1 30/1290/1 29/1291/1 +f 30/1290/1 381/1306/1 259/1280/1 +f 30/1290/1 259/1280/1 31/1288/1 +f 181/1296/1 36/1298/1 38/1295/1 +f 17/669/1 171/1293/1 18/670/1 +f 161/629/4 327/1266/4 326/672/4 +f 249/674/3 237/1307/3 235/675/3 +f 347/677/4 91/1308/4 167/678/4 +f 227/680/5 341/1309/5 356/681/5 +f 285/683/3 152/1310/3 151/684/3 +f 235/686/1 237/1311/1 32/687/1 +f 129/689/2 130/1312/2 208/690/2 +f 383/692/3 267/1313/3 384/693/3 +f 60/695/1 423/1314/1 201/696/1 +f 360/698/3 34/1315/3 35/699/3 +f 225/701/2 224/1316/2 354/702/2 +f 116/704/3 258/1317/3 125/705/3 +f 12/707/1 343/1318/1 13/708/1 +f 304/710/4 300/1319/4 1/711/4 diff --git a/mods/x_farming/models/x_farming_melon_slush.obj b/mods/x_farming/models/x_farming_melon_slush.obj new file mode 100644 index 00000000..1ada2dc3 --- /dev/null +++ b/mods/x_farming/models/x_farming_melon_slush.obj @@ -0,0 +1,278 @@ +# Blender v2.83.20 OBJ File: 'x_farming_melon_slush.blend' +# www.blender.org +mtllib x_farming_melon_slush.mtl +o jar_x_farming_melon_slush.vox.003 +v -0.390000 -0.499000 0.390000 +v -0.390000 -0.499000 -0.390000 +v 0.390000 0.151000 0.390000 +v 0.390000 -0.499000 0.390000 +v 0.390000 -0.499000 -0.390000 +v -0.390000 0.151000 -0.390000 +v 0.260000 -0.369000 0.260000 +v -0.260000 -0.369000 0.260000 +v -0.260000 -0.369000 -0.260000 +v 0.260000 -0.369000 -0.260000 +v 0.260000 0.151000 -0.260000 +v -0.260000 0.151000 -0.260000 +v 0.390000 0.151000 -0.390000 +v 0.260000 0.151000 0.260000 +v -0.260000 0.151000 0.260000 +v -0.390000 0.151000 0.390000 +v 0.390000 0.151000 -0.260000 +v -0.260000 0.151000 0.390000 +v -0.257400 0.281650 -0.257400 +v -0.257400 0.281650 0.257400 +v 0.257400 0.281650 0.257400 +v 0.257400 0.281650 -0.257400 +v -0.257400 -0.368350 0.257400 +v -0.257400 -0.368350 -0.257400 +v 0.257400 -0.368350 -0.257400 +v 0.257400 -0.368350 0.257400 +v 0.057082 -0.365285 -0.065000 +v 0.172156 -0.305188 -0.065000 +v 0.172156 -0.305188 0.065000 +v 0.057082 -0.365285 0.065000 +v -0.300270 0.376413 0.065000 +v -0.185196 0.436511 0.065000 +v -0.300270 0.376413 -0.065000 +v -0.185196 0.436511 -0.065000 +v 0.257400 0.151650 -0.257400 +v 0.257400 -0.043350 -0.257400 +v 0.257400 -0.173350 -0.257400 +v 0.257400 -0.173350 0.257400 +v 0.257400 -0.043350 0.257400 +v 0.257400 0.151650 0.257400 +v -0.257400 -0.173350 0.257400 +v -0.257400 -0.043350 0.257400 +v -0.257400 0.151650 0.257400 +v -0.257400 -0.173350 -0.257400 +v -0.257400 -0.043350 -0.257400 +v -0.257400 0.151650 -0.257400 +vt 0.375000 1.000000 +vt 0.750000 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.531250 +vt 0.000000 0.375000 +vt 0.000000 0.531250 +vt 0.000000 0.843750 +vt 0.375000 0.687500 +vt 0.375000 0.843750 +vt 0.375000 0.687500 +vt 0.000000 0.531250 +vt 0.375000 0.531250 +vt 0.000000 1.000000 +vt 0.375000 0.843750 +vt 0.000000 0.843750 +vt 0.875000 0.500000 +vt 0.625000 0.375000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.625000 0.500000 +vt 0.375000 0.500000 +vt 0.625000 0.625000 +vt 0.875000 0.500000 +vt 0.875000 0.625000 +vt 0.375000 0.500000 +vt 0.625000 0.375000 +vt 0.625000 0.500000 +vt 0.750000 0.781250 +vt 0.687500 0.781250 +vt 0.687500 0.656250 +vt 0.437500 0.781250 +vt 0.375000 0.812500 +vt 0.625000 0.375000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.062500 0.125000 +vt 0.000000 0.375000 +vt 0.062500 0.375000 +vt 0.250000 0.125000 +vt 0.187500 0.375000 +vt 0.250000 0.375000 +vt 0.062500 0.375000 +vt 0.125000 0.125000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.250000 0.343750 +vt 0.312500 0.375000 +vt 0.250000 0.343750 +vt 0.312500 0.312500 +vt 0.250000 0.312500 +vt 0.750000 1.000000 +vt 0.375000 0.375000 +vt 0.000000 0.687500 +vt 0.000000 0.687500 +vt 0.375000 1.000000 +vt 0.875000 0.375000 +vt 0.625000 0.625000 +vt 0.625000 0.500000 +vt 0.375000 0.375000 +vt 0.437500 0.656250 +vt 0.437500 0.625000 +vt 0.750000 0.625000 +vt 0.375000 0.625000 +vt 0.750000 0.812500 +vt 0.375000 0.375000 +vt 0.000000 0.125000 +vt 0.187500 0.125000 +vt 0.062500 0.125000 +vt 0.187500 0.125000 +vt 0.312500 0.343750 +vt 0.312500 0.343750 +vt 0.500000 0.375000 +vt 0.250000 0.625000 +vt 0.250000 0.375000 +vt 0.500000 0.375000 +vt 0.750000 0.625000 +vt 0.500000 0.625000 +vt 0.250000 0.875000 +vt 0.500000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.531250 +vt 0.000000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.468750 +vt 0.000000 0.531250 +vt 0.000000 0.375000 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.000000 0.375000 +vt 0.250000 0.375000 +vt 0.250000 0.218750 +vt 0.000000 0.312500 +vt 0.250000 0.156250 +vt 0.000000 0.218750 +vt 0.000000 0.062500 +vt 0.250000 0.062500 +vt 0.250000 0.312500 +vt 0.250000 0.218750 +vt 0.500000 0.312500 +vt 0.250000 0.156250 +vt 0.500000 0.218750 +vt 0.500000 0.062500 +vt 0.250000 0.062500 +vt 0.000000 0.937500 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.843750 +vt 0.250000 0.937500 +vt 0.000000 0.781250 +vt 0.250000 0.843750 +vt 0.250000 0.687500 +vt 0.000000 0.687500 +vt 0.500000 0.625000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.125000 +vt 0.750000 0.375000 +vt 0.500000 0.375000 +vt 0.000000 0.687500 +vt 0.250000 0.687500 +vt 0.500000 0.625000 +vt 0.750000 0.375000 +vt 0.500000 0.875000 +vt 0.000000 0.468750 +vt 0.000000 0.156250 +vt 0.500000 0.156250 +vt 0.250000 0.781250 +vt 0.750000 0.625000 +vt 0.750000 0.125000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.9009 -0.4341 0.0000 +vn 0.9009 0.4341 0.0000 +vn -0.4629 0.8864 0.0000 +vn 0.4629 -0.8864 0.0000 +g jar_x_farming_melon_slush.vox.003_glass_with_straw +usemtl glass_with_straw +s off +f 2/1/1 4/2/1 1/3/1 +f 13/4/2 2/5/2 6/6/2 +f 16/7/3 4/8/3 3/9/3 +f 13/10/4 4/11/4 5/12/4 +f 16/13/5 2/14/5 1/15/5 +f 14/16/2 8/17/2 15/18/2 +f 14/19/5 10/20/5 7/21/5 +f 12/22/3 10/23/3 11/24/3 +f 15/25/4 9/26/4 12/27/4 +f 17/28/6 11/29/6 14/30/6 +f 12/31/6 11/29/6 6/32/6 +f 10/33/6 8/34/6 7/35/6 +f 28/36/2 33/37/2 34/38/2 +f 27/39/7 31/40/7 33/41/7 +f 31/42/3 29/43/3 32/44/3 +f 29/43/8 34/45/8 32/44/8 +f 31/46/9 34/47/9 33/41/9 +f 27/48/10 29/49/10 30/50/10 +f 2/1/1 5/51/1 4/2/1 +f 13/4/2 5/52/2 2/5/2 +f 16/7/3 1/53/3 4/8/3 +f 13/10/4 3/54/4 4/11/4 +f 16/13/5 6/55/5 2/14/5 +f 14/16/2 7/56/2 8/17/2 +f 14/19/5 11/57/5 10/20/5 +f 12/22/3 9/58/3 10/23/3 +f 15/25/4 8/59/4 9/26/4 +f 15/60/6 18/61/6 14/30/6 +f 18/61/6 3/62/6 14/30/6 +f 3/62/6 17/28/6 14/30/6 +f 6/32/6 16/63/6 15/60/6 +f 16/63/6 18/61/6 15/60/6 +f 15/60/6 12/31/6 6/32/6 +f 17/28/6 13/64/6 11/29/6 +f 13/64/6 6/32/6 11/29/6 +f 10/33/6 9/65/6 8/34/6 +f 28/36/2 27/66/2 33/37/2 +f 27/39/7 30/67/7 31/40/7 +f 31/42/3 30/68/3 29/43/3 +f 29/43/8 28/69/8 34/45/8 +f 31/46/9 32/70/9 34/47/9 +f 27/48/10 28/71/10 29/49/10 +g jar_x_farming_melon_slush.vox.003_bites +usemtl bites +f 21/72/6 19/73/6 20/74/6 +f 36/75/6 42/76/6 39/77/6 +f 24/78/1 26/79/1 23/80/1 +f 36/81/2 46/82/2 35/83/2 +f 37/84/2 45/85/2 36/81/2 +f 24/86/2 37/84/2 25/87/2 +f 46/88/5 20/89/5 19/90/5 +f 45/91/5 43/92/5 46/88/5 +f 44/93/5 42/94/5 45/91/5 +f 23/95/5 44/93/5 24/96/5 +f 43/97/3 21/72/3 20/74/3 +f 42/98/3 40/99/3 43/97/3 +f 41/100/3 39/101/3 42/98/3 +f 26/102/3 41/100/3 23/103/3 +f 40/104/4 22/105/4 21/106/4 +f 39/107/4 35/108/4 40/104/4 +f 38/109/4 36/110/4 39/107/4 +f 25/111/4 38/109/4 26/112/4 +f 35/113/6 43/114/6 40/115/6 +f 37/116/6 41/117/6 38/118/6 +f 35/83/2 19/119/2 22/120/2 +f 21/72/6 22/121/6 19/73/6 +f 36/75/6 45/122/6 42/76/6 +f 24/78/1 25/123/1 26/79/1 +f 36/81/2 45/85/2 46/82/2 +f 37/84/2 44/124/2 45/85/2 +f 24/86/2 44/124/2 37/84/2 +f 46/88/5 43/92/5 20/89/5 +f 45/91/5 42/94/5 43/92/5 +f 44/93/5 41/125/5 42/94/5 +f 23/95/5 41/125/5 44/93/5 +f 43/97/3 40/99/3 21/72/3 +f 42/98/3 39/101/3 40/99/3 +f 41/100/3 38/126/3 39/101/3 +f 26/102/3 38/126/3 41/100/3 +f 40/104/4 35/108/4 22/105/4 +f 39/107/4 36/110/4 35/108/4 +f 38/109/4 37/127/4 36/110/4 +f 25/111/4 37/127/4 38/109/4 +f 35/113/6 46/128/6 43/114/6 +f 37/116/6 44/129/6 41/117/6 +f 35/83/2 46/82/2 19/119/2 diff --git a/mods/x_farming/models/x_farming_pie.obj b/mods/x_farming/models/x_farming_pie.obj new file mode 100644 index 00000000..1fb212f1 --- /dev/null +++ b/mods/x_farming/models/x_farming_pie.obj @@ -0,0 +1,299 @@ +# Blender v2.83.20 OBJ File: 'x_farming_cake.blend' +# www.blender.org +mtllib x_farming_pie.mtl +o x_farming_pie +v -0.375000 -0.500000 0.375000 +v -0.375000 -0.250000 -0.375000 +v -0.125000 -0.250000 0.125000 +v -0.125000 -0.187500 0.000000 +v -0.125000 -0.187500 -0.125000 +v 0.375000 -0.500000 -0.375000 +v 0.375000 -0.250000 0.000000 +v 0.375000 -0.250000 -0.375000 +v 0.125000 -0.187500 0.125000 +v 0.125000 -0.250000 0.000000 +v 0.125000 -0.187500 0.000000 +v 0.375000 -0.500000 0.375000 +v -0.375000 -0.250000 0.375000 +v 0.000000 -0.250000 0.375000 +v -0.125000 -0.187500 0.125000 +v 0.125000 -0.250000 0.125000 +v -0.125000 -0.250000 -0.125000 +v 0.000000 -0.187500 -0.125000 +v 0.000000 -0.250000 -0.125000 +v 0.125000 -0.187500 -0.125000 +v -0.375000 -0.500000 -0.375000 +v 0.000000 -0.500000 -0.375000 +v 0.375000 -0.250000 0.375000 +v 0.000000 -0.250000 0.125000 +v -0.125000 -0.250000 0.000000 +v -0.375000 -0.250000 0.000000 +v 0.125000 -0.250000 -0.125000 +v 0.000000 -0.250000 -0.375000 +v 0.000000 -0.187500 0.125000 +v 0.125000 -0.250000 0.000000 +v 0.125000 -0.250000 0.000000 +v 0.125000 -0.250000 0.000000 +v 0.125000 -0.187500 0.000000 +v 0.125000 -0.187500 0.000000 +v 0.125000 -0.187500 0.000000 +v 0.000000 -0.187500 -0.125000 +v 0.000000 -0.187500 -0.125000 +v 0.000000 -0.187500 -0.125000 +v 0.000000 -0.250000 -0.125000 +v 0.000000 -0.250000 -0.125000 +v 0.000000 -0.250000 -0.125000 +v 0.000000 -0.250000 -0.125000 +v -0.375000 -0.500000 0.375000 +v -0.375000 -0.500000 0.375000 +v -0.375000 -0.500000 0.000000 +v -0.375000 -0.500000 0.000000 +v -0.375000 -0.500000 -0.375000 +v -0.375000 -0.500000 -0.375000 +v -0.375000 -0.250000 -0.375000 +v -0.375000 -0.250000 -0.375000 +v -0.375000 -0.250000 0.375000 +v -0.375000 -0.250000 0.375000 +v -0.375000 -0.250000 0.000000 +v -0.375000 -0.250000 0.000000 +v -0.125000 -0.250000 0.125000 +v -0.125000 -0.250000 0.125000 +v -0.125000 -0.250000 0.125000 +v -0.125000 -0.187500 0.125000 +v -0.125000 -0.187500 0.125000 +v -0.125000 -0.187500 0.000000 +v -0.125000 -0.187500 0.000000 +v -0.125000 -0.187500 0.000000 +v -0.125000 -0.250000 0.000000 +v -0.125000 -0.250000 0.000000 +v -0.125000 -0.250000 0.000000 +v -0.125000 -0.250000 -0.125000 +v -0.125000 -0.250000 -0.125000 +v -0.125000 -0.250000 -0.125000 +v -0.125000 -0.187500 -0.125000 +v -0.125000 -0.187500 -0.125000 +v 0.375000 -0.500000 0.375000 +v 0.375000 -0.500000 0.375000 +v 0.375000 -0.500000 0.000000 +v 0.375000 -0.500000 0.000000 +v 0.375000 -0.500000 -0.375000 +v 0.375000 -0.500000 -0.375000 +v 0.375000 -0.250000 -0.375000 +v 0.375000 -0.250000 -0.375000 +v 0.375000 -0.250000 0.375000 +v 0.375000 -0.250000 0.375000 +v 0.375000 -0.250000 0.000000 +v 0.375000 -0.250000 0.000000 +v 0.125000 -0.250000 0.125000 +v 0.125000 -0.250000 0.125000 +v 0.125000 -0.250000 0.125000 +v 0.125000 -0.187500 0.125000 +v 0.125000 -0.187500 0.125000 +v 0.125000 -0.250000 -0.125000 +v 0.125000 -0.250000 -0.125000 +v 0.125000 -0.250000 -0.125000 +v 0.125000 -0.187500 -0.125000 +v 0.125000 -0.187500 -0.125000 +v 0.000000 -0.500000 0.375000 +v 0.000000 -0.500000 0.375000 +v 0.000000 -0.250000 0.375000 +v 0.000000 -0.250000 0.375000 +v 0.000000 -0.250000 0.375000 +v 0.000000 -0.187500 0.125000 +v 0.000000 -0.187500 0.125000 +v 0.000000 -0.187500 0.125000 +v 0.000000 -0.250000 0.125000 +v 0.000000 -0.250000 0.125000 +v 0.000000 -0.250000 0.125000 +v 0.000000 -0.250000 0.125000 +v 0.000000 -0.500000 -0.375000 +v 0.000000 -0.250000 -0.375000 +v 0.000000 -0.250000 -0.375000 +v 0.000000 -0.250000 -0.375000 +vt -0.000000 0.187500 +vt 0.062500 0.156250 +vt 0.062500 0.187500 +vt 0.062500 0.218750 +vt -0.000000 0.250000 +vt 0.062500 0.250000 +vt 0.562500 1.000000 +vt 0.750000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.750000 +vt 0.062500 0.218750 +vt 0.125000 0.187500 +vt 0.125000 0.218750 +vt 0.125000 0.125000 +vt 0.062500 0.156250 +vt 0.125000 0.156250 +vt 0.562500 0.625000 +vt 0.750000 0.750000 +vt 0.562500 0.750000 +vt 0.062500 0.187500 +vt 0.125000 0.156250 +vt 0.125000 0.187500 +vt -0.000000 0.218750 +vt 0.062500 0.187500 +vt 0.062500 0.218750 +vt 0.062500 0.000000 +vt 0.125000 0.062500 +vt 0.062500 0.125000 +vt 0.375000 0.250000 +vt 0.000000 0.625000 +vt 0.375000 0.625000 +vt 0.062500 0.125000 +vt -0.000000 0.156250 +vt 0.062500 0.156250 +vt 0.562500 0.625000 +vt 0.750000 0.500000 +vt 0.562500 0.500000 +vt 0.187500 1.000000 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.125000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.125000 0.218750 +vt 0.062500 0.250000 +vt 0.125000 0.250000 +vt 0.375000 0.187500 +vt 0.500000 0.312500 +vt 0.625000 0.312500 +vt 0.375000 0.343750 +vt 0.500000 0.468750 +vt 0.625000 0.468750 +vt 0.125000 0.750000 +vt 0.250000 0.875000 +vt 0.125000 0.875000 +vt -0.000000 0.156250 +vt -0.000000 0.218750 +vt 0.375000 0.875000 +vt 0.375000 1.000000 +vt 0.750000 1.000000 +vt 0.562500 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.875000 +vt 0.062500 0.187500 +vt 0.062500 0.125000 +vt 0.375000 0.750000 +vt 0.375000 0.625000 +vt 0.750000 0.625000 +vt 0.062500 0.156250 +vt -0.000000 0.187500 +vt -0.000000 0.125000 +vt -0.000000 0.062500 +vt -0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.125000 +vt 0.000000 0.250000 +vt -0.000000 0.125000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.750000 0.625000 +vt 0.250000 0.812500 +vt 0.375000 0.812500 +vt 0.250000 0.750000 +vt 0.187500 0.750000 +vt 0.187500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.812500 +vt -0.000000 0.625000 +vt 0.125000 0.750000 +vt 0.187500 0.625000 +vt 0.187500 0.750000 +vt 0.125000 0.812500 +vt 0.062500 0.218750 +vt 0.750000 0.312500 +vt 0.750000 0.187500 +vt 0.375000 0.312500 +vt 0.500000 0.343750 +vt 0.625000 0.343750 +vt 0.750000 0.468750 +vt 0.750000 0.343750 +vt 0.375000 0.468750 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.250000 0.750000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +g x_farming_pie_x_farming_pie_pie +usemtl pie +s off +f 101/1/1 58/2/1 55/3/1 +f 59/4/2 63/5/2 56/6/2 +f 53/7/2 47/8/2 45/9/2 +f 95/10/1 52/11/1 44/12/1 +f 88/13/3 34/14/3 31/15/3 +f 38/16/4 89/17/4 40/18/4 +f 73/19/3 77/20/3 81/21/3 +f 83/22/1 99/23/1 102/24/1 +f 30/25/3 87/26/3 84/27/3 +f 37/28/5 62/29/5 29/30/5 +f 48/31/6 12/32/6 1/33/6 +f 70/34/4 39/35/4 67/36/4 +f 106/37/4 6/38/4 22/39/4 +f 14/40/5 104/41/5 3/42/5 +f 16/43/5 103/44/5 96/45/5 +f 61/46/2 17/47/2 64/48/2 +f 46/49/4 25/50/4 32/51/4 +f 94/52/2 24/53/2 42/54/2 +f 90/55/5 57/56/5 85/57/5 +f 101/1/1 98/58/1 58/2/1 +f 59/4/2 60/59/2 63/5/2 +f 45/9/2 43/60/2 51/61/2 +f 53/7/2 49/62/2 47/8/2 +f 45/9/2 51/61/2 53/7/2 +f 44/12/1 93/63/1 95/10/1 +f 93/63/1 72/64/1 95/10/1 +f 72/64/1 79/65/1 95/10/1 +f 88/13/3 91/66/3 34/14/3 +f 38/16/4 92/67/4 89/17/4 +f 80/68/3 71/69/3 73/19/3 +f 73/19/3 75/70/3 77/20/3 +f 81/21/3 80/68/3 73/19/3 +f 83/22/1 86/71/1 99/23/1 +f 30/25/3 33/72/3 87/26/3 +f 9/73/5 11/74/5 29/30/5 +f 11/74/5 20/75/5 37/28/5 +f 37/28/5 69/76/5 62/29/5 +f 11/74/5 37/28/5 29/30/5 +f 62/29/5 15/77/5 29/30/5 +f 48/31/6 76/78/6 12/32/6 +f 70/34/4 36/79/4 39/35/4 +f 22/39/4 21/80/4 50/81/4 +f 106/37/4 78/82/4 6/38/4 +f 22/39/4 50/81/4 106/37/4 +f 3/42/5 65/83/5 26/84/5 +f 65/83/5 66/85/5 26/84/5 +f 66/85/5 19/86/5 28/87/5 +f 28/87/5 2/88/5 66/85/5 +f 2/88/5 26/84/5 66/85/5 +f 26/84/5 13/89/5 3/42/5 +f 13/89/5 14/40/5 3/42/5 +f 23/90/5 7/91/5 16/43/5 +f 7/91/5 8/92/5 27/93/5 +f 23/90/5 16/43/5 96/45/5 +f 8/92/5 107/94/5 27/93/5 +f 107/94/5 41/95/5 27/93/5 +f 27/93/5 10/96/5 7/91/5 +f 10/96/5 16/43/5 7/91/5 +f 61/46/2 5/97/2 17/47/2 +f 82/98/4 74/99/4 32/51/4 +f 74/99/4 46/49/4 32/51/4 +f 46/49/4 54/100/4 25/50/4 +f 25/50/4 4/101/4 35/102/4 +f 25/50/4 35/102/4 32/51/4 +f 108/103/2 105/104/2 42/54/2 +f 105/104/2 94/52/2 42/54/2 +f 94/52/2 97/105/2 24/53/2 +f 24/53/2 100/106/2 18/107/2 +f 24/53/2 18/107/2 42/54/2 +f 90/55/5 68/108/5 57/56/5 diff --git a/mods/x_farming/models/x_farming_pumpkin_pie.obj b/mods/x_farming/models/x_farming_pumpkin_pie.obj new file mode 100644 index 00000000..5c43e02f --- /dev/null +++ b/mods/x_farming/models/x_farming_pumpkin_pie.obj @@ -0,0 +1,416 @@ +# Blender v3.3.0 OBJ File: 'pumpkin_pie.blend' +# www.blender.org +mtllib punpkin_pie.mtl +o punpkin_pie +v -0.015000 -0.499000 0.195000 +v -0.045000 -0.499000 0.165000 +v -0.105000 -0.499000 0.075000 +v -0.105000 -0.499000 0.015000 +v -0.135000 -0.499000 -0.045000 +v -0.165000 -0.499000 -0.045000 +v -0.195000 -0.499000 -0.105000 +v -0.045000 -0.319000 0.105000 +v -0.075000 -0.319000 0.105000 +v -0.105000 -0.319000 0.075000 +v -0.135000 -0.319000 -0.045000 +v -0.165000 -0.319000 -0.045000 +v -0.195000 -0.319000 -0.105000 +v -0.225000 -0.289000 -0.195000 +v 0.045000 -0.499000 0.165000 +v 0.075000 -0.499000 0.105000 +v 0.105000 -0.499000 0.075000 +v 0.135000 -0.499000 0.015000 +v 0.195000 -0.499000 -0.105000 +v 0.105000 -0.319000 0.015000 +v 0.195000 -0.319000 -0.165000 +v 0.195000 -0.289000 -0.165000 +v -0.015000 -0.499000 0.165000 +v -0.045000 -0.499000 0.105000 +v 0.135000 -0.499000 -0.045000 +v 0.165000 -0.499000 -0.045000 +v -0.165000 -0.499000 -0.105000 +v 0.015000 -0.319000 0.195000 +v -0.045000 -0.319000 0.165000 +v 0.015000 -0.319000 0.165000 +v 0.075000 -0.319000 0.105000 +v 0.045000 -0.319000 0.105000 +v 0.105000 -0.319000 0.075000 +v 0.075000 -0.319000 0.075000 +v -0.135000 -0.319000 0.015000 +v 0.135000 -0.319000 0.015000 +v 0.165000 -0.319000 -0.045000 +v 0.135000 -0.319000 -0.045000 +v 0.195000 -0.319000 -0.105000 +v 0.165000 -0.319000 -0.105000 +v 0.225000 -0.289000 -0.195000 +v 0.195000 -0.289000 -0.195000 +v -0.225000 -0.499000 -0.225000 +v 0.015000 -0.499000 0.195000 +v 0.015000 -0.499000 0.165000 +v -0.075000 -0.499000 0.105000 +v 0.045000 -0.499000 0.105000 +v -0.075000 -0.499000 0.075000 +v 0.075000 -0.499000 0.075000 +v -0.135000 -0.499000 0.015000 +v 0.105000 -0.499000 0.015000 +v 0.165000 -0.499000 -0.105000 +v 0.195000 -0.499000 -0.195000 +v -0.225000 -0.499000 -0.195000 +v -0.195000 -0.499000 -0.195000 +v 0.225000 -0.499000 -0.225000 +v 0.225000 -0.499000 -0.195000 +v -0.015000 -0.319000 0.195000 +v -0.015000 -0.319000 0.165000 +v 0.045000 -0.319000 0.165000 +v -0.075000 -0.319000 0.075000 +v -0.105000 -0.319000 0.015000 +v -0.165000 -0.319000 -0.105000 +v -0.195000 -0.319000 -0.165000 +v -0.195000 -0.289000 -0.165000 +v -0.225000 -0.289000 -0.225000 +v -0.195000 -0.289000 -0.195000 +v 0.225000 -0.289000 -0.225000 +vt 0.200000 0.500000 +vt 0.233333 0.500000 +vt 0.266667 0.566667 +vt 0.733333 0.933333 +vt 0.766667 0.733333 +vt 0.766667 0.933333 +vt 0.900000 0.233333 +vt 0.933333 0.000000 +vt 0.933333 0.233333 +vt 0.600000 0.233333 +vt 0.566667 0.233333 +vt 0.566667 0.200000 +vt 0.666667 0.200000 +vt 0.733333 0.400000 +vt 0.666667 0.400000 +vt 0.500000 0.933333 +vt 0.533333 0.733333 +vt 0.533333 0.933333 +vt 0.800000 0.200000 +vt 0.866667 0.400000 +vt 0.866667 0.200000 +vt 0.866667 0.466667 +vt 0.900000 0.233333 +vt 0.866667 0.233333 +vt 0.866667 0.733333 +vt 0.433333 0.700000 +vt 0.866667 0.700000 +vt 0.933333 0.800000 +vt 0.966667 0.600000 +vt 0.966667 0.800000 +vt 0.866667 0.933333 +vt 0.833333 0.733333 +vt 0.866667 0.733333 +vt 0.600000 0.233333 +vt 0.666667 0.433333 +vt 0.600000 0.433333 +vt 0.633333 0.933333 +vt 0.666667 0.733333 +vt 0.666667 0.933333 +vt 0.566667 0.433333 +vt 0.600000 0.466667 +vt 0.600000 0.233333 +vt 0.900000 0.466667 +vt 0.933333 0.233333 +vt 0.933333 0.466667 +vt 0.500000 0.466667 +vt 0.466667 0.433333 +vt 0.033333 0.433333 +vt 0.766667 0.933333 +vt 0.800000 0.733333 +vt 0.800000 0.933333 +vt 0.733333 0.200000 +vt 0.800000 0.000000 +vt 0.800000 0.200000 +vt 0.733333 0.200000 +vt 0.666667 0.000000 +vt 0.666667 0.200000 +vt 0.666667 0.933333 +vt 0.700000 0.733333 +vt 0.700000 0.933333 +vt 0.000000 0.933333 +vt 0.033333 0.900000 +vt 0.466667 0.900000 +vt 0.900000 0.900000 +vt 0.866667 0.700000 +vt 0.900000 0.700000 +vt 0.933333 0.466667 +vt 0.433333 0.700000 +vt 0.933333 0.700000 +vt 0.566667 0.933333 +vt 0.600000 0.733333 +vt 0.600000 0.933333 +vt 0.933333 0.400000 +vt 0.966667 0.200000 +vt 0.966667 0.400000 +vt 0.566667 0.933333 +vt 0.533333 0.733333 +vt 0.533333 0.933333 +vt 0.600000 0.933333 +vt 0.633333 0.733333 +vt 0.633333 0.933333 +vt 0.700000 0.933333 +vt 0.733333 0.733333 +vt 0.733333 0.933333 +vt 0.800000 0.400000 +vt 0.733333 0.200000 +vt 0.733333 0.400000 +vt 0.833333 0.933333 +vt 0.800000 0.733333 +vt 0.833333 0.733333 +vt 0.900000 0.900000 +vt 0.933333 0.700000 +vt 0.933333 0.900000 +vt 0.900000 0.233333 +vt 0.866667 0.000000 +vt 0.900000 0.000000 +vt 0.933333 0.200000 +vt 0.966667 0.000000 +vt 0.966667 0.200000 +vt 0.800000 0.200000 +vt 0.866667 0.000000 +vt 0.866667 0.200000 +vt 0.600000 0.200000 +vt 0.666667 0.000000 +vt 0.600000 0.000000 +vt 0.933333 0.600000 +vt 0.966667 0.400000 +vt 0.933333 0.400000 +vt 0.366667 0.733333 +vt 0.400000 0.733333 +vt 0.400000 0.800000 +vt 0.433333 0.800000 +vt 0.433333 0.866667 +vt 0.000000 0.866667 +vt 0.033333 0.800000 +vt 0.000000 0.800000 +vt 0.033333 0.733333 +vt 0.066667 0.733333 +vt 0.066667 0.666667 +vt 0.100000 0.666667 +vt 0.333333 0.666667 +vt 0.366667 0.666667 +vt 0.100000 0.600000 +vt 0.133333 0.600000 +vt 0.300000 0.600000 +vt 0.333333 0.600000 +vt 0.133333 0.566667 +vt 0.166667 0.566667 +vt 0.300000 0.566667 +vt 0.166667 0.500000 +vt 0.266667 0.500000 +vt 0.200000 0.466667 +vt 0.233333 0.466667 +vt 0.733333 0.733333 +vt 0.900000 0.000000 +vt 0.500000 0.200000 +vt 0.500000 0.000000 +vt 0.600000 0.000000 +vt 0.733333 0.200000 +vt 0.500000 0.733333 +vt 0.800000 0.400000 +vt 0.900000 0.466667 +vt 0.433333 0.733333 +vt 0.933333 0.600000 +vt 0.833333 0.933333 +vt 0.666667 0.233333 +vt 0.633333 0.733333 +vt 0.500000 0.233333 +vt 0.500000 0.433333 +vt 0.566667 0.466667 +vt 0.900000 0.233333 +vt 0.300000 0.100000 +vt 0.300000 0.033333 +vt 0.266667 0.033333 +vt 0.266667 0.000000 +vt 0.233333 0.000000 +vt 0.233333 0.033333 +vt 0.200000 0.033333 +vt 0.200000 0.100000 +vt 0.333333 0.133333 +vt 0.333333 0.100000 +vt 0.166667 0.100000 +vt 0.166667 0.133333 +vt 0.366667 0.200000 +vt 0.366667 0.133333 +vt 0.133333 0.133333 +vt 0.133333 0.200000 +vt 0.400000 0.266667 +vt 0.400000 0.200000 +vt 0.100000 0.200000 +vt 0.100000 0.266667 +vt 0.433333 0.333333 +vt 0.433333 0.266667 +vt 0.066667 0.266667 +vt 0.066667 0.333333 +vt 0.466667 0.333333 +vt 0.033333 0.333333 +vt 0.500000 0.433333 +vt 0.000000 0.433333 +vt 0.000000 0.466667 +vt 0.766667 0.733333 +vt 0.733333 0.000000 +vt 0.733333 0.000000 +vt 0.666667 0.733333 +vt 0.500000 0.900000 +vt 0.500000 0.933333 +vt 0.000000 0.900000 +vt 0.033333 0.866667 +vt 0.466667 0.866667 +vt 0.866667 0.900000 +vt 0.433333 0.466667 +vt 0.566667 0.733333 +vt 0.933333 0.200000 +vt 0.566667 0.733333 +vt 0.600000 0.733333 +vt 0.700000 0.733333 +vt 0.800000 0.200000 +vt 0.800000 0.933333 +vt 0.900000 0.700000 +vt 0.866667 0.233333 +vt 0.933333 0.000000 +vt 0.800000 0.000000 +vt 0.666667 0.200000 +vt 0.966667 0.600000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl punpkin_pie_Material +s off +f 59/1/1 30/2/1 32/3/1 +f 32/4/2 16/5/2 31/6/2 +f 14/7/2 55/8/2 67/9/2 +f 42/10/3 22/11/3 21/12/3 +f 26/13/3 40/14/3 37/15/3 +f 58/16/2 44/17/2 28/18/2 +f 50/19/4 11/20/4 5/21/4 +f 14/22/4 43/23/4 54/24/4 +f 22/25/2 64/26/2 21/27/2 +f 28/28/3 45/29/3 30/30/3 +f 11/31/2 6/32/2 5/33/2 +f 15/34/3 32/35/3 60/36/3 +f 10/37/2 48/38/2 61/39/2 +f 64/40/4 67/41/4 55/42/4 +f 42/43/2 57/44/2 41/45/2 +f 56/46/5 53/47/5 55/48/5 +f 34/49/2 17/50/2 33/51/2 +f 33/52/3 51/53/3 20/54/3 +f 8/55/4 2/56/4 29/57/4 +f 29/58/2 23/59/2 59/60/2 +f 66/61/1 67/62/1 42/63/1 +f 39/64/2 52/65/2 19/66/2 +f 56/67/6 66/68/6 68/69/6 +f 31/70/3 49/71/3 34/72/3 +f 38/73/2 26/74/2 37/75/2 +f 61/76/4 46/77/4 9/78/4 +f 35/79/2 4/80/2 62/81/2 +f 20/82/2 18/83/2 36/84/2 +f 62/85/4 3/86/4 10/87/4 +f 8/88/2 46/89/2 24/90/2 +f 30/91/2 15/92/2 60/93/2 +f 68/94/3 57/95/3 56/96/3 +f 13/97/2 27/98/2 63/99/2 +f 36/100/3 25/101/3 38/102/3 +f 12/103/4 27/104/4 6/105/4 +f 58/106/4 23/107/4 1/108/4 +f 38/109/1 37/110/1 40/111/1 +f 40/111/1 39/112/1 21/113/1 +f 21/113/1 64/114/1 63/115/1 +f 64/114/1 13/116/1 63/115/1 +f 63/115/1 12/117/1 11/118/1 +f 40/111/1 21/113/1 63/115/1 +f 11/118/1 35/119/1 62/120/1 +f 40/111/1 63/115/1 11/118/1 +f 20/121/1 36/122/1 38/109/1 +f 38/109/1 40/111/1 11/118/1 +f 62/120/1 10/123/1 61/124/1 +f 38/109/1 11/118/1 62/120/1 +f 34/125/1 33/126/1 20/121/1 +f 20/121/1 38/109/1 62/120/1 +f 61/124/1 9/127/1 8/128/1 +f 20/121/1 62/120/1 61/124/1 +f 32/3/1 31/129/1 34/125/1 +f 34/125/1 20/121/1 61/124/1 +f 8/128/1 29/130/1 59/1/1 +f 34/125/1 61/124/1 8/128/1 +f 30/2/1 60/131/1 32/3/1 +f 32/3/1 34/125/1 8/128/1 +f 59/1/1 58/132/1 28/133/1 +f 32/3/1 8/128/1 59/1/1 +f 59/1/1 28/133/1 30/2/1 +f 32/4/2 47/134/2 16/5/2 +f 14/7/2 54/135/2 55/8/2 +f 39/136/3 19/137/3 21/12/3 +f 19/137/3 53/138/3 21/12/3 +f 53/138/3 42/10/3 21/12/3 +f 26/13/3 52/139/3 40/14/3 +f 58/16/2 1/140/2 44/17/2 +f 50/19/4 35/141/4 11/20/4 +f 14/22/4 66/142/4 43/23/4 +f 22/25/2 65/143/2 64/26/2 +f 28/28/3 44/144/3 45/29/3 +f 11/31/2 12/145/2 6/32/2 +f 15/34/3 47/146/3 32/35/3 +f 10/37/2 3/147/2 48/38/2 +f 55/42/4 7/148/4 64/40/4 +f 7/148/4 13/149/4 64/40/4 +f 64/40/4 65/150/4 67/41/4 +f 42/43/2 53/151/2 57/44/2 +f 47/152/5 15/153/5 45/154/5 +f 45/154/5 44/155/5 1/156/5 +f 23/157/5 2/158/5 24/159/5 +f 45/154/5 1/156/5 23/157/5 +f 49/160/5 16/161/5 47/152/5 +f 47/152/5 45/154/5 23/157/5 +f 24/159/5 46/162/5 48/163/5 +f 47/152/5 23/157/5 24/159/5 +f 51/164/5 17/165/5 49/160/5 +f 49/160/5 47/152/5 24/159/5 +f 48/163/5 3/166/5 4/167/5 +f 49/160/5 24/159/5 48/163/5 +f 25/168/5 18/169/5 51/164/5 +f 51/164/5 49/160/5 48/163/5 +f 4/167/5 50/170/5 5/171/5 +f 51/164/5 48/163/5 4/167/5 +f 52/172/5 26/173/5 25/168/5 +f 25/168/5 51/164/5 4/167/5 +f 5/171/5 6/174/5 27/175/5 +f 25/168/5 4/167/5 5/171/5 +f 53/47/5 19/176/5 52/172/5 +f 52/172/5 25/168/5 5/171/5 +f 27/175/5 7/177/5 55/48/5 +f 52/172/5 5/171/5 27/175/5 +f 56/46/5 57/178/5 53/47/5 +f 53/47/5 52/172/5 27/175/5 +f 55/48/5 54/179/5 43/180/5 +f 53/47/5 27/175/5 55/48/5 +f 43/180/5 56/46/5 55/48/5 +f 34/49/2 49/181/2 17/50/2 +f 33/52/3 17/182/3 51/53/3 +f 8/55/4 24/183/4 2/56/4 +f 29/58/2 2/184/2 23/59/2 +f 41/185/1 68/186/1 42/63/1 +f 68/186/1 66/61/1 42/63/1 +f 66/61/1 14/187/1 67/62/1 +f 67/62/1 65/188/1 22/189/1 +f 67/62/1 22/189/1 42/63/1 +f 39/64/2 40/190/2 52/65/2 +f 56/67/6 43/191/6 66/68/6 +f 31/70/3 16/192/3 49/71/3 +f 38/73/2 25/193/2 26/74/2 +f 61/76/4 48/194/4 46/77/4 +f 35/79/2 50/195/2 4/80/2 +f 20/82/2 51/196/2 18/83/2 +f 62/85/4 4/197/4 3/86/4 +f 8/88/2 9/198/2 46/89/2 +f 30/91/2 45/199/2 15/92/2 +f 68/94/3 41/200/3 57/95/3 +f 13/97/2 7/201/2 27/98/2 +f 36/100/3 18/202/3 25/101/3 +f 12/103/4 63/203/4 27/104/4 +f 58/106/4 59/204/4 23/107/4 diff --git a/mods/x_farming/models/x_farming_scarecrow.obj b/mods/x_farming/models/x_farming_scarecrow.obj new file mode 100644 index 00000000..0e93fd76 --- /dev/null +++ b/mods/x_farming/models/x_farming_scarecrow.obj @@ -0,0 +1,474 @@ +# Blender v2.83.20 OBJ File: 'x_farming_scarecrow.blend' +# www.blender.org +mtllib x_farming_scarecrow.mtl +o Player_Cube +v -0.262500 0.299939 0.130750 +v -0.262500 0.277061 -0.130751 +v -0.262500 1.084442 0.062115 +v -0.262500 1.061564 -0.199386 +v -0.227059 1.107274 -0.227333 +v -0.227059 1.079820 0.086468 +v -0.262500 1.140186 0.180629 +v -0.262500 1.004306 -0.326482 +v -0.262500 1.647297 0.044749 +v -0.262500 1.511417 -0.462362 +v 0.262500 0.277061 -0.130751 +v 0.262500 0.299939 0.130750 +v 0.262500 1.038276 -0.199704 +v 0.262500 1.106216 0.053851 +v 0.226889 1.112990 -0.228590 +v 0.226889 1.085536 0.085212 +v 0.522892 1.192862 0.094601 +v 0.522892 1.220316 -0.219200 +v 0.262500 1.004306 -0.326482 +v 0.262500 1.140186 0.180629 +v 0.262500 1.511417 -0.462362 +v 0.262500 1.647297 0.044749 +v -0.287500 1.122509 0.211247 +v -0.287500 0.973688 -0.344160 +v -0.287500 1.677916 0.062426 +v -0.287500 1.529095 -0.492981 +v 0.287500 0.973688 -0.344160 +v 0.287500 1.122509 0.211247 +v 0.287500 1.529095 -0.492981 +v 0.287500 1.677916 0.062426 +v 0.262500 1.061564 -0.199386 +v 0.262500 1.061564 -0.199386 +v 0.262500 1.084442 0.062115 +v 0.262500 1.084442 0.062115 +v 0.262500 0.299939 0.130750 +v 0.262500 0.299939 0.130750 +v 0.262500 0.277061 -0.130751 +v 0.262500 0.277061 -0.130751 +v -0.262500 1.084442 0.062115 +v -0.262500 1.106216 0.053851 +v -0.262500 0.299939 0.130750 +v -0.262500 0.299939 0.130750 +v -0.262500 1.061564 -0.199386 +v -0.262500 1.038276 -0.199704 +v -0.262500 0.277061 -0.130751 +v -0.262500 0.277061 -0.130751 +v -0.523063 1.187146 0.095858 +v -0.523063 1.214600 -0.217943 +v -0.227059 1.107274 -0.227333 +v -0.227059 1.079820 0.086468 +v -0.523063 1.214600 -0.217943 +v -0.523063 1.187146 0.095858 +v -0.523063 1.214600 -0.217943 +v -0.227059 1.107274 -0.227333 +v 0.262500 1.511417 -0.462362 +v 0.262500 1.511417 -0.462362 +v 0.262500 1.647297 0.044749 +v 0.262500 1.647297 0.044749 +v 0.262500 1.140186 0.180629 +v 0.262500 1.140186 0.180629 +v 0.262500 1.004306 -0.326482 +v 0.262500 1.004306 -0.326482 +v -0.262500 1.647297 0.044749 +v -0.262500 1.647297 0.044749 +v -0.262500 1.140186 0.180629 +v -0.262500 1.140186 0.180629 +v -0.262500 1.511417 -0.462362 +v -0.262500 1.511417 -0.462362 +v -0.262500 1.004306 -0.326482 +v -0.262500 1.004306 -0.326482 +v 0.226889 1.112990 -0.228590 +v 0.226889 1.085536 0.085212 +v 0.522892 1.192862 0.094601 +v 0.522892 1.220316 -0.219200 +v 0.287500 1.529095 -0.492981 +v 0.287500 1.529095 -0.492981 +v 0.287500 1.677916 0.062426 +v 0.287500 1.677916 0.062426 +v 0.287500 1.122509 0.211247 +v 0.287500 1.122509 0.211247 +v 0.287500 0.973688 -0.344160 +v 0.287500 0.973688 -0.344160 +v -0.287500 1.677916 0.062426 +v -0.287500 1.677916 0.062426 +v -0.287500 1.122509 0.211247 +v -0.287500 1.122509 0.211247 +v -0.287500 1.529095 -0.492981 +v -0.287500 1.529095 -0.492981 +v -0.287500 0.973688 -0.344160 +v -0.287500 0.973688 -0.344160 +v -0.396111 0.450058 0.031371 +v -0.799911 0.596470 0.044181 +v -0.799911 0.623923 -0.269621 +v 0.667453 0.796893 0.060015 +v 0.667300 0.824767 -0.253750 +v 0.371576 0.716676 -0.263206 +v 0.371729 0.688802 0.050558 +v -0.450010 0.502053 -0.337860 +v -0.667566 0.819091 -0.252546 +v -0.667566 0.791637 0.061255 +v -0.371563 0.684311 0.051866 +v -0.371563 0.711765 -0.261936 +v -0.062500 0.293947 0.062262 +v 0.062500 0.293947 0.062262 +v -0.062500 0.283053 -0.062262 +v 0.062500 0.283053 -0.062262 +v -0.062500 -0.499000 -0.062500 +v -0.062500 -0.499000 0.062500 +v 0.062500 -0.499000 0.062500 +v 0.062500 -0.499000 -0.062500 +v 0.262500 0.136500 0.270527 +v 0.262500 0.091832 -0.240023 +v -0.262500 0.136500 0.270527 +v -0.387500 0.102727 -0.115498 +v 0.262500 0.299939 0.130750 +v 0.262500 0.299939 0.130750 +v 0.262500 0.277061 -0.130751 +v 0.262500 0.277061 -0.130751 +v -0.262500 0.299939 0.130750 +v -0.262500 0.299939 0.130750 +v -0.262500 0.277061 -0.130751 +v -0.262500 0.277061 -0.130751 +v 0.387500 0.125605 0.146003 +v 0.387500 0.102727 -0.115498 +v -0.387500 0.125605 0.146003 +v -0.262500 0.091832 -0.240023 +v 0.107423 1.575702 -0.319040 +v 0.107423 1.631309 -0.111514 +v -0.107423 1.631309 -0.111514 +v -0.107423 1.575702 -0.319040 +v 0.107423 1.684369 -0.348157 +v 0.107423 1.739976 -0.140631 +v -0.107423 1.739976 -0.140631 +v -0.107423 1.684369 -0.348157 +v -0.667566 0.791637 0.061255 +v -0.613668 0.799548 -0.254256 +v -0.371563 0.711765 -0.261936 +v -0.667566 0.814092 -0.195406 +v -0.667566 0.819091 -0.252546 +v -0.613668 0.772094 0.059546 +v -0.667566 0.796636 0.004116 +v -0.425461 0.703853 0.053575 +v -0.371563 0.689310 -0.005274 +v -0.371563 0.711765 -0.261936 +v -0.667566 0.819091 -0.252546 +v -0.425461 0.731308 -0.260226 +v -0.371563 0.706766 -0.204796 +v -0.371563 0.684311 0.051866 +v -0.450010 0.464601 0.090220 +v -0.746013 0.609380 -0.328470 +v -0.746013 0.571928 0.099610 +v -0.396111 0.477512 -0.282430 +v 0.799852 0.601431 0.044615 +v 0.396051 0.455019 0.031805 +v 0.396052 0.482473 -0.281996 +v 0.745953 0.614341 -0.328036 +v 0.425402 0.736269 -0.259792 +v 0.371503 0.711727 -0.204362 +v 0.425402 0.708815 0.054010 +v 0.371503 0.694271 -0.004840 +v 0.613608 0.777056 0.059980 +v 0.667507 0.801598 0.004550 +v 0.613608 0.804510 -0.253821 +v 0.667507 0.819054 -0.194972 +v 0.745953 0.576889 0.100044 +v 0.449950 0.507015 -0.337426 +v 0.449950 0.469563 0.090654 +v 0.799852 0.628885 -0.269187 +v -0.227059 1.079820 0.086468 +v -0.523063 1.187146 0.095858 +v -0.371563 0.684311 0.051866 +v -0.667566 0.791637 0.061255 +vt 0.625000 0.375000 +vt 0.500000 0.375000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.437500 0.375000 +vt 0.312500 0.375000 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.531250 0.406250 +vt 0.437500 0.406250 +vt 0.437500 0.500000 +vt 0.531250 0.500000 +vt 0.437500 0.375000 +vt 0.437500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.375000 +vt 0.500000 0.750000 +vt 0.375000 0.750000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.375000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.250000 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.750000 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.750000 +vt 0.687500 0.500000 +vt 0.687500 0.375000 +vt 0.750000 0.375000 +vt 0.750000 0.500000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.375000 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt 0.687500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.687500 0.375000 +vt 1.000000 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.500000 +vt 1.000000 0.500000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.500000 +vt 0.875000 0.500000 +vt 0.750000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.750000 0.500000 +vt 0.875000 0.750000 +vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.750000 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.500000 0.750000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.375000 +vt 0.687500 0.375000 +vt 0.687500 0.187500 +vt 0.625000 0.187500 +vt 0.687500 0.375000 +vt 0.750000 0.375000 +vt 0.750000 0.187500 +vt 0.687500 0.187500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.187500 +vt 0.750000 0.187500 +vt 0.687500 0.375000 +vt 0.687500 0.187500 +vt 0.750000 0.187500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.187500 +vt 0.843750 0.093750 +vt 0.789062 0.093750 +vt 0.789062 0.015625 +vt 0.843750 0.015625 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.789062 0.093750 +vt 0.734375 0.093750 +vt 0.734375 0.015625 +vt 0.789062 0.015625 +vt 0.734375 0.093750 +vt 0.679688 0.093750 +vt 0.679688 0.015625 +vt 0.734375 0.015625 +vt 0.062500 0.171875 +vt 0.062500 0.203125 +vt 0.078125 0.203125 +vt 0.078125 0.171875 +vt 0.078125 0.203125 +vt 0.062500 0.203125 +vt 0.062500 0.171875 +vt 0.078125 0.171875 +vt 0.046875 -0.000000 +vt 0.062500 -0.000000 +vt 0.062500 0.203125 +vt 0.046875 0.203125 +vt 0.015625 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 0.203125 +vt 0.015625 0.203125 +vt -0.000000 -0.000000 +vt 0.000000 0.203125 +vt 0.234375 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.296875 +vt 0.234375 0.296875 +vt 0.187500 0.375000 +vt 0.093750 0.375000 +vt 0.093750 0.296875 +vt 0.187500 0.296875 +vt 0.234375 0.281250 +vt 0.187500 0.281250 +vt 0.187500 0.203125 +vt 0.234375 0.203125 +vt 0.187500 0.281250 +vt 0.093750 0.281250 +vt 0.093750 0.203125 +vt 0.187500 0.203125 +vt 0.664147 0.828294 +vt 0.664147 0.921706 +vt 0.625000 1.000000 +vt 0.625000 0.750000 +vt 0.710853 0.921706 +vt 0.750000 1.000000 +vt 0.710853 0.828294 +vt 0.750000 0.750000 +vt 0.046875 0.750000 +vt 0.046875 0.843750 +vt 0.000000 0.843750 +vt 0.000000 0.750000 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.679688 0.093750 +vt 0.625000 0.093750 +vt 0.625000 0.015625 +vt 0.679688 0.015625 +vt 0.843750 0.187500 +vt 0.789062 0.187500 +vt 0.789062 0.109375 +vt 0.843750 0.109375 +vt 0.789062 0.187500 +vt 0.734375 0.187500 +vt 0.734375 0.109375 +vt 0.789062 0.109375 +vt 0.734375 0.187500 +vt 0.679688 0.187500 +vt 0.679688 0.109375 +vt 0.734375 0.109375 +vt 0.679688 0.187500 +vt 0.625000 0.187500 +vt 0.625000 0.109375 +vt 0.679688 0.109375 +vt 0.812500 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.187500 +vt 0.812500 0.187500 +vn -0.0000 0.0872 0.9962 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0872 -0.9962 +vn 0.0000 0.9962 -0.0872 +vn 0.0000 0.9659 -0.2588 +vn 0.0000 0.2588 0.9659 +vn 0.0000 -0.2588 -0.9659 +vn 0.0000 -0.9659 0.2588 +vn -0.3420 0.9361 0.0819 +vn 1.0000 0.0000 0.0000 +vn 0.3420 0.9361 0.0819 +vn 0.9397 -0.3407 -0.0298 +vn 0.0000 -0.0872 0.9962 +vn -0.9397 0.3407 0.0298 +vn 0.0000 0.0870 -0.9962 +vn -0.0000 -0.0870 0.9962 +vn 0.9398 0.3405 0.0298 +vn -0.9398 -0.3405 -0.0298 +vn 0.1530 0.4967 -0.8543 +vn 0.3445 -0.9351 -0.0832 +vn 0.1530 0.3408 0.9276 +vn 0.9934 0.1140 0.0100 +vn 0.0000 -0.9962 0.0872 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.0003 1.0000 +vn 0.0000 -0.0003 -1.0000 +vn 0.8137 0.5790 -0.0507 +vn 0.0000 0.5081 -0.8613 +vn -0.8137 0.5790 -0.0507 +vn -0.0000 0.6499 0.7600 +vn -0.6874 0.7235 0.0633 +vn -0.1530 0.4967 -0.8543 +vn -0.1530 0.3408 0.9276 +vn 0.6874 0.7235 0.0633 +vn -0.9934 0.1140 0.0100 +vn -0.0000 0.0872 -0.9962 +usemtl Character +s off +f 33/1/1 3/2/1 1/3/1 12/4/1 +f 39/5/2 4/6/2 2/7/2 41/8/2 +f 43/9/3 31/10/3 37/11/3 45/12/3 +f 117/13/4 121/14/4 119/15/4 115/16/4 +f 44/17/5 40/18/5 14/19/5 13/20/5 +f 57/21/6 9/22/6 7/23/6 20/24/6 +f 63/25/2 10/26/2 8/27/2 65/28/2 +f 67/29/7 55/30/7 61/31/7 69/32/7 +f 19/33/8 59/34/8 66/35/8 70/36/8 +f 68/37/5 64/38/5 22/39/5 21/40/5 +f 18/41/9 15/42/9 16/43/9 17/44/9 +f 34/45/10 36/46/10 38/47/10 32/48/10 +f 58/49/10 60/50/10 62/51/10 56/52/10 +f 48/53/11 52/54/11 50/55/11 54/56/11 +f 77/57/6 25/58/6 23/59/6 28/60/6 +f 83/61/2 26/62/2 24/63/2 85/64/2 +f 87/65/7 75/66/7 81/67/7 89/68/7 +f 27/69/8 79/70/8 86/71/8 90/72/8 +f 130/73/2 129/74/2 133/75/2 134/76/2 +f 78/77/10 80/78/10 82/79/10 76/80/10 +f 51/81/12 47/82/12 135/83/12 139/84/12 +f 5/85/13 53/86/13 145/87/13 137/88/13 +f 6/89/14 49/90/14 144/91/14 148/92/14 +f 74/93/15 95/94/15 96/95/15 71/96/15 +f 72/97/16 97/98/16 94/99/16 73/100/16 +f 73/101/17 94/102/17 95/94/17 74/93/17 +f 71/96/18 96/95/18 97/98/18 72/97/18 +f 138/103/19 147/104/19 98/105/19 150/106/19 +f 95/107/20 94/108/20 97/109/20 96/110/20 +f 102/111/11 99/112/11 100/113/11 101/114/11 +f 143/115/21 141/116/21 151/117/21 149/118/21 +f 146/119/22 142/120/22 91/121/22 152/122/22 +f 103/123/23 105/124/23 106/125/23 104/126/23 +f 108/127/24 109/128/24 110/129/24 107/130/24 +f 104/131/2 106/132/2 110/133/2 109/134/2 +f 105/135/10 103/136/10 108/137/10 107/138/10 +f 106/139/25 105/135/25 107/138/25 110/140/25 +f 103/136/26 104/131/26 109/134/26 108/137/26 +f 118/141/27 116/142/27 123/143/27 124/144/27 +f 122/145/28 11/146/28 112/147/28 126/148/28 +f 120/149/29 46/150/29 114/151/29 125/152/29 +f 35/153/30 42/154/30 113/155/30 111/156/30 +f 127/157/5 128/158/5 30/159/5 29/160/5 +f 128/158/5 129/161/5 84/162/5 30/159/5 +f 129/161/5 130/163/5 88/164/5 84/162/5 +f 130/163/5 127/157/5 29/160/5 88/164/5 +f 134/165/5 133/166/5 132/167/5 131/168/5 +f 128/169/10 127/170/10 131/171/10 132/172/10 +f 127/173/7 130/174/7 134/175/7 131/176/7 +f 129/177/6 128/178/6 132/179/6 133/180/6 +f 140/181/31 136/182/31 93/183/31 92/184/31 +f 158/185/32 164/186/32 156/187/32 166/188/32 +f 162/189/33 160/190/33 167/191/33 165/192/33 +f 163/193/34 161/194/34 153/195/34 168/196/34 +f 159/197/35 157/198/35 155/199/35 154/200/35 +f 170/201/36 169/202/36 171/203/36 172/204/36 diff --git a/mods/x_farming/models/x_farming_scarecrow_2.obj b/mods/x_farming/models/x_farming_scarecrow_2.obj new file mode 100644 index 00000000..fa7b4178 --- /dev/null +++ b/mods/x_farming/models/x_farming_scarecrow_2.obj @@ -0,0 +1,473 @@ +# Blender v2.83.20 OBJ File: 'x_farming_scarecrow_2.blend' +# www.blender.org +mtllib x_farming_scarecrow_2.mtl +o Player_Cube +v -0.262500 0.279731 0.130165 +v -0.262500 0.302609 -0.131336 +v -0.262500 1.064234 0.198800 +v -0.262500 1.087112 -0.062701 +v -0.227059 1.271579 0.014867 +v -0.227059 0.964867 0.086650 +v -0.262500 1.098551 0.325193 +v -0.262500 1.052794 -0.197810 +v -0.262500 1.621554 0.279436 +v -0.262500 1.575797 -0.243566 +v 0.262500 0.302609 -0.131336 +v 0.262500 0.279731 0.130165 +v 0.262500 1.064234 -0.067059 +v 0.262500 1.087112 0.194442 +v 0.226889 1.274556 0.019906 +v 0.226889 0.967844 0.091689 +v 0.522892 0.992395 0.196590 +v 0.522892 1.299107 0.124807 +v 0.262500 1.052794 -0.197810 +v 0.262500 1.098551 0.325193 +v 0.262500 1.575797 -0.243566 +v 0.262500 1.621554 0.279436 +v -0.287500 1.075826 0.352276 +v -0.287500 1.025711 -0.220535 +v -0.287500 1.648638 0.302162 +v -0.287500 1.598523 -0.270650 +v 0.287500 1.025711 -0.220535 +v 0.287500 1.075826 0.352276 +v 0.287500 1.598523 -0.270650 +v 0.287500 1.648638 0.302162 +v 0.262500 1.087112 -0.062701 +v 0.262500 1.087112 -0.062701 +v 0.262500 1.064234 0.198800 +v 0.262500 1.064234 0.198800 +v 0.262500 0.279731 0.130165 +v 0.262500 0.279731 0.130165 +v 0.262500 0.302609 -0.131336 +v 0.262500 0.302609 -0.131336 +v -0.262500 1.064234 0.198800 +v -0.262500 1.087112 0.194442 +v -0.262500 0.279731 0.130165 +v -0.262500 0.279731 0.130165 +v -0.262500 1.087112 -0.062701 +v -0.262500 1.064234 -0.067059 +v -0.262500 0.302609 -0.131336 +v -0.262500 0.302609 -0.131336 +v -0.523063 0.989419 0.191551 +v -0.523063 1.296130 0.119768 +v -0.227060 1.271579 0.014867 +v -0.227059 0.964867 0.086650 +v -0.523063 1.296130 0.119768 +v -0.523063 0.989419 0.191551 +v -0.523063 1.296130 0.119768 +v -0.227059 1.271579 0.014867 +v 0.262500 1.575797 -0.243566 +v 0.262500 1.575797 -0.243566 +v 0.262500 1.621554 0.279436 +v 0.262500 1.621554 0.279436 +v 0.262500 1.098551 0.325193 +v 0.262500 1.098551 0.325193 +v 0.262500 1.052794 -0.197810 +v 0.262500 1.052794 -0.197810 +v -0.262500 1.621554 0.279436 +v -0.262500 1.621554 0.279436 +v -0.262500 1.098551 0.325193 +v -0.262500 1.098551 0.325193 +v -0.262500 1.575797 -0.243566 +v -0.262500 1.575797 -0.243566 +v -0.262500 1.052794 -0.197810 +v -0.262500 1.052794 -0.197810 +v 0.226889 1.274556 0.019906 +v 0.226889 0.967844 0.091689 +v 0.522892 0.992395 0.196590 +v 0.522892 1.299107 0.124807 +v 0.287500 1.598523 -0.270650 +v 0.287500 1.598523 -0.270650 +v 0.287500 1.648638 0.302162 +v 0.287500 1.648638 0.302162 +v 0.287500 1.075826 0.352276 +v 0.287500 1.075826 0.352276 +v 0.287500 1.025711 -0.220535 +v 0.287500 1.025711 -0.220535 +v -0.287500 1.648638 0.302162 +v -0.287500 1.648638 0.302162 +v -0.287500 1.075826 0.352276 +v -0.287500 1.075826 0.352276 +v -0.287500 1.598523 -0.270650 +v -0.287500 1.598523 -0.270650 +v -0.287500 1.025711 -0.220535 +v -0.287500 1.025711 -0.220535 +v -0.396111 0.820807 -0.528885 +v -0.799911 0.854299 -0.385781 +v -0.799911 1.161011 -0.457564 +v 0.667453 0.901763 -0.190415 +v 0.667300 1.208570 -0.261788 +v 0.371576 1.183844 -0.367437 +v 0.371729 0.877036 -0.296064 +v -0.450009 1.187837 -0.594638 +v -0.667566 1.205656 -0.266806 +v -0.667566 0.898944 -0.195022 +v -0.371563 0.874393 -0.299924 +v -0.371563 1.181105 -0.371707 +v -0.062500 0.293947 0.062262 +v 0.062500 0.293947 0.062262 +v -0.062500 0.283053 -0.062262 +v 0.062500 0.283053 -0.062262 +v -0.062500 -0.499000 -0.062500 +v -0.062500 -0.499000 0.062500 +v 0.062500 -0.499000 0.062500 +v 0.062500 -0.499000 -0.062500 +v 0.262500 0.094502 0.239437 +v 0.262500 0.139170 -0.271113 +v -0.262500 0.094502 0.239437 +v -0.387500 0.128275 -0.146589 +v 0.262500 0.279731 0.130165 +v 0.262500 0.279731 0.130165 +v 0.262500 0.302609 -0.131336 +v 0.262500 0.302609 -0.131336 +v -0.262500 0.279731 0.130165 +v -0.262500 0.279731 0.130165 +v -0.262500 0.302609 -0.131336 +v -0.262500 0.302609 -0.131336 +v 0.387500 0.105397 0.114913 +v 0.387500 0.128275 -0.146589 +v -0.387500 0.105397 0.114912 +v -0.262500 0.139170 -0.271113 +v 0.107423 1.614218 -0.091259 +v 0.107423 1.632943 0.122770 +v -0.107423 1.632943 0.122770 +v -0.107423 1.614218 -0.091259 +v 0.107423 1.726290 -0.101064 +v 0.107423 1.745015 0.112965 +v -0.107423 1.745015 0.112965 +v -0.107423 1.726290 -0.101064 +v -0.667566 0.898944 -0.195022 +v -0.613667 1.201186 -0.285907 +v -0.371563 1.181105 -0.371707 +v -0.667566 1.149808 -0.253735 +v -0.667566 1.205656 -0.266806 +v -0.613667 0.894474 -0.214124 +v -0.667566 0.954793 -0.208093 +v -0.425461 0.878864 -0.280823 +v -0.371563 0.930241 -0.312995 +v -0.371563 1.181105 -0.371707 +v -0.667566 1.205656 -0.266806 +v -0.425461 1.185575 -0.352606 +v -0.371563 1.125256 -0.358636 +v -0.371563 0.874393 -0.299924 +v -0.450009 0.769429 -0.496713 +v -0.746013 1.212389 -0.489736 +v -0.746012 0.793980 -0.391811 +v -0.396111 1.127518 -0.600668 +v 0.799852 0.855434 -0.380931 +v 0.396051 0.821942 -0.524035 +v 0.396051 1.128654 -0.595819 +v 0.745953 1.213524 -0.484887 +v 0.425402 1.186710 -0.347756 +v 0.371503 1.126391 -0.353787 +v 0.425402 0.879999 -0.275973 +v 0.371503 0.931377 -0.308145 +v 0.613608 0.895609 -0.209274 +v 0.667507 0.955928 -0.203244 +v 0.613608 1.202321 -0.281057 +v 0.667507 1.150943 -0.248885 +v 0.745953 0.795115 -0.386962 +v 0.449950 1.188972 -0.589788 +v 0.449950 0.770564 -0.491863 +v 0.799852 1.162146 -0.452714 +v -0.227059 0.964867 0.086650 +v -0.523063 0.989419 0.191551 +v -0.371563 0.874393 -0.299924 +v -0.667566 0.898944 -0.195022 +vt 0.625000 0.375000 +vt 0.500000 0.375000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.437500 0.375000 +vt 0.312500 0.375000 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.531250 0.406250 +vt 0.437500 0.406250 +vt 0.437500 0.500000 +vt 0.531250 0.500000 +vt 0.437500 0.375000 +vt 0.437500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.375000 +vt 0.500000 0.750000 +vt 0.375000 0.750000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.375000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.250000 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.750000 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.750000 +vt 0.687500 0.500000 +vt 0.687500 0.375000 +vt 0.750000 0.375000 +vt 0.750000 0.500000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.375000 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt 0.687500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.687500 0.375000 +vt 1.000000 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.500000 +vt 1.000000 0.500000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.500000 +vt 0.875000 0.500000 +vt 0.750000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.750000 0.500000 +vt 0.875000 0.750000 +vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.750000 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.500000 0.750000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.375000 +vt 0.687500 0.375000 +vt 0.687500 0.187500 +vt 0.625000 0.187500 +vt 0.687500 0.375000 +vt 0.750000 0.375000 +vt 0.750000 0.187500 +vt 0.687500 0.187500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.187500 +vt 0.750000 0.187500 +vt 0.687500 0.375000 +vt 0.687500 0.187500 +vt 0.750000 0.187500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.187500 +vt 0.843750 0.093750 +vt 0.789062 0.093750 +vt 0.789062 0.015625 +vt 0.843750 0.015625 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.789062 0.093750 +vt 0.734375 0.093750 +vt 0.734375 0.015625 +vt 0.789062 0.015625 +vt 0.734375 0.093750 +vt 0.679688 0.093750 +vt 0.679688 0.015625 +vt 0.734375 0.015625 +vt 0.062500 0.171875 +vt 0.062500 0.203125 +vt 0.078125 0.203125 +vt 0.078125 0.171875 +vt 0.078125 0.203125 +vt 0.062500 0.203125 +vt 0.062500 0.171875 +vt 0.078125 0.171875 +vt 0.046875 -0.000000 +vt 0.062500 -0.000000 +vt 0.062500 0.203125 +vt 0.046875 0.203125 +vt 0.015625 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 0.203125 +vt 0.015625 0.203125 +vt -0.000000 -0.000000 +vt 0.000000 0.203125 +vt 0.234375 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.296875 +vt 0.234375 0.296875 +vt 0.187500 0.375000 +vt 0.093750 0.375000 +vt 0.093750 0.296875 +vt 0.187500 0.296875 +vt 0.234375 0.281250 +vt 0.187500 0.281250 +vt 0.187500 0.203125 +vt 0.234375 0.203125 +vt 0.187500 0.281250 +vt 0.093750 0.281250 +vt 0.093750 0.203125 +vt 0.187500 0.203125 +vt 0.664147 0.828294 +vt 0.664147 0.921706 +vt 0.625000 1.000000 +vt 0.625000 0.750000 +vt 0.710853 0.921706 +vt 0.750000 1.000000 +vt 0.710853 0.828294 +vt 0.750000 0.750000 +vt 0.046875 0.750000 +vt 0.046875 0.843750 +vt 0.000000 0.843750 +vt 0.000000 0.750000 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.046875 0.750000 +vt 0.109375 0.750000 +vt 0.109375 0.812500 +vt 0.046875 0.812500 +vt 0.679688 0.093750 +vt 0.625000 0.093750 +vt 0.625000 0.015625 +vt 0.679688 0.015625 +vt 0.843750 0.187500 +vt 0.789062 0.187500 +vt 0.789062 0.109375 +vt 0.843750 0.109375 +vt 0.789062 0.187500 +vt 0.734375 0.187500 +vt 0.734375 0.109375 +vt 0.789062 0.109375 +vt 0.734375 0.187500 +vt 0.679688 0.187500 +vt 0.679688 0.109375 +vt 0.734375 0.109375 +vt 0.679688 0.187500 +vt 0.625000 0.187500 +vt 0.625000 0.109375 +vt 0.679688 0.109375 +vt 0.812500 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.187500 +vt 0.812500 0.187500 +vn -0.0000 -0.0872 0.9962 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0872 -0.9962 +vn 0.0000 0.9962 0.0872 +vn 0.0000 0.9962 -0.0872 +vn 0.0000 0.0872 0.9962 +vn 0.0000 -0.0872 -0.9962 +vn 0.0000 -0.9962 0.0872 +vn -0.3420 0.2141 0.9150 +vn 1.0000 0.0000 0.0000 +vn 0.3420 0.2141 0.9150 +vn 0.9397 -0.0779 -0.3330 +vn -0.0000 -0.9737 0.2279 +vn -0.9397 0.0779 0.3330 +vn 0.0000 0.9737 -0.2280 +vn -0.0000 -0.9737 0.2280 +vn 0.9398 0.0779 0.3328 +vn -0.9398 -0.0779 -0.3328 +vn 0.1530 0.9666 0.2055 +vn 0.3445 -0.2126 -0.9144 +vn 0.1530 -0.7751 0.6131 +vn 0.9934 0.0261 0.1114 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.0003 1.0000 +vn 0.0000 -0.0003 -1.0000 +vn 0.8137 0.5790 0.0507 +vn 0.0000 0.6499 -0.7600 +vn -0.8137 0.5790 0.0507 +vn 0.0000 0.5081 0.8613 +vn -0.6874 0.1655 0.7071 +vn -0.1530 0.9666 0.2055 +vn -0.1530 -0.7751 0.6131 +vn 0.6874 0.1655 0.7071 +vn -0.9934 0.0261 0.1114 +vn 0.0000 0.9737 -0.2279 +usemtl Character +s off +f 33/1/1 3/2/1 1/3/1 12/4/1 +f 39/5/2 4/6/2 2/7/2 41/8/2 +f 43/9/3 31/10/3 37/11/3 45/12/3 +f 117/13/4 121/14/4 119/15/4 115/16/4 +f 44/17/5 40/18/5 14/19/5 13/20/5 +f 57/21/6 9/22/6 7/23/6 20/24/6 +f 63/25/2 10/26/2 8/27/2 65/28/2 +f 67/29/7 55/30/7 61/31/7 69/32/7 +f 19/33/8 59/34/8 66/35/8 70/36/8 +f 68/37/5 64/38/5 22/39/5 21/40/5 +f 18/41/9 15/42/9 16/43/9 17/44/9 +f 34/45/10 36/46/10 38/47/10 32/48/10 +f 58/49/10 60/50/10 62/51/10 56/52/10 +f 48/53/11 52/54/11 50/55/11 54/56/11 +f 77/57/6 25/58/6 23/59/6 28/60/6 +f 83/61/2 26/62/2 24/63/2 85/64/2 +f 87/65/7 75/66/7 81/67/7 89/68/7 +f 27/69/8 79/70/8 86/71/8 90/72/8 +f 130/73/2 129/74/2 133/75/2 134/76/2 +f 78/77/10 80/78/10 82/79/10 76/80/10 +f 51/81/12 47/82/12 135/83/12 139/84/12 +f 5/85/13 53/86/13 145/87/13 137/88/13 +f 6/89/14 49/90/14 144/91/14 148/92/14 +f 74/93/15 95/94/15 96/95/15 71/96/15 +f 72/97/16 97/98/16 94/99/16 73/100/16 +f 73/101/17 94/102/17 95/94/17 74/93/17 +f 71/96/18 96/95/18 97/98/18 72/97/18 +f 138/103/19 147/104/19 98/105/19 150/106/19 +f 95/107/20 94/108/20 97/109/20 96/110/20 +f 102/111/11 99/112/11 100/113/11 101/114/11 +f 143/115/21 141/116/21 151/117/21 149/118/21 +f 146/119/22 142/120/22 91/121/22 152/122/22 +f 103/123/8 105/124/8 106/125/8 104/126/8 +f 108/127/23 109/128/23 110/129/23 107/130/23 +f 104/131/2 106/132/2 110/133/2 109/134/2 +f 105/135/10 103/136/10 108/137/10 107/138/10 +f 106/139/24 105/135/24 107/138/24 110/140/24 +f 103/136/25 104/131/25 109/134/25 108/137/25 +f 118/141/26 116/142/26 123/143/26 124/144/26 +f 122/145/27 11/146/27 112/147/27 126/148/27 +f 120/149/28 46/150/28 114/151/28 125/152/28 +f 35/153/29 42/154/29 113/155/29 111/156/29 +f 127/157/5 128/158/5 30/159/5 29/160/5 +f 128/158/5 129/161/5 84/162/5 30/159/5 +f 129/161/5 130/163/5 88/164/5 84/162/5 +f 130/163/5 127/157/5 29/160/5 88/164/5 +f 134/165/5 133/166/5 132/167/5 131/168/5 +f 128/169/10 127/170/10 131/171/10 132/172/10 +f 127/173/7 130/174/7 134/175/7 131/176/7 +f 129/177/6 128/178/6 132/179/6 133/180/6 +f 140/181/30 136/182/30 93/183/30 92/184/30 +f 158/185/31 164/186/31 156/187/31 166/188/31 +f 162/189/32 160/190/32 167/191/32 165/192/32 +f 163/193/33 161/194/33 153/195/33 168/196/33 +f 159/197/34 157/198/34 155/199/34 154/200/34 +f 170/201/35 169/202/35 171/203/35 172/204/35 diff --git a/mods/x_farming/models/x_farming_snowman.b3d b/mods/x_farming/models/x_farming_snowman.b3d new file mode 100644 index 00000000..4cc5a590 Binary files /dev/null and b/mods/x_farming/models/x_farming_snowman.b3d differ diff --git a/mods/x_farming/nodes.lua b/mods/x_farming/nodes.lua new file mode 100644 index 00000000..d00d9d3b --- /dev/null +++ b/mods/x_farming/nodes.lua @@ -0,0 +1,1474 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Donuts +local donut_def = { + description = S('Donut') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 3'), + short_description = S('Donut'), + drawtype = 'mesh', + mesh = 'x_farming_donut.obj', + tiles = { 'x_farming_donut_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_donut.png', + wield_image = 'x_farming_donut.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, -0.35, 0.25 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, -0.35, 0.25 } + }, + groups = { + -- MTG + dig_immediate = 3, + compost = 85, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 85, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + on_use = minetest.item_eat(3), + sunlight_propagates = true +} + +if minetest.get_modpath('mcl_farming') then + donut_def.on_secondary_use = minetest.item_eat(3) +end + +minetest.register_node('x_farming:donut', donut_def) + +local donut_chocolate_def = { + description = S('Chocolate Donut') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 4'), + short_description = S('Chocolate Donut'), + drawtype = 'mesh', + mesh = 'x_farming_donut.obj', + tiles = { 'x_farming_donut_chocolate_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_donut_chocolate.png', + wield_image = 'x_farming_donut_chocolate.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, -0.35, 0.25 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, -0.35, 0.25 } + }, + groups = { + -- MTG + dig_immediate = 3, + compost = 85, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 85, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + on_use = minetest.item_eat(4), + sunlight_propagates = true +} + +if minetest.get_modpath('mcl_farming') then + donut_chocolate_def.on_secondary_use = minetest.item_eat(4) +end + +minetest.register_node('x_farming:donut_chocolate', donut_chocolate_def) + +-- Fries +local fries_def = { + description = S('Fries') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + short_description = S('Fries'), + drawtype = 'mesh', + mesh = 'x_farming_fries.obj', + tiles = { 'x_farming_fries_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_fries.png', + wield_image = 'x_farming_fries.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.1, 0.25, 0.05, 0.1 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.1, 0.25, -0.2, 0.1 } + }, + groups = { + -- MTG + dig_immediate = 3, + compost = 85, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 85, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + on_use = minetest.item_eat(6), + sunlight_propagates = true +} + +if minetest.get_modpath('mcl_farming') then + fries_def.on_secondary_use = minetest.item_eat(6) +end + +minetest.register_node('x_farming:fries', fries_def) + +-- Pumpkin pie +local pumpkin_pie_def = { + description = S('Pumpkin Pie') .. '\n' .. S('Compost chance') .. ': 100%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + short_description = S('Pumpkin Pie'), + drawtype = 'mesh', + mesh = 'x_farming_pumpkin_pie.obj', + tiles = { 'x_farming_pumpkin_pie_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_pumpkin_pie.png', + wield_image = 'x_farming_pumpkin_pie.png^[transformFXFYR180', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, -0.2, 0.3 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, -0.3, 0.3 } + }, + groups = { + -- MTG + dig_immediate = 3, + compost = 100, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 100, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + on_use = minetest.item_eat(6), + sunlight_propagates = true +} + +if minetest.get_modpath('mcl_farming') then + pumpkin_pie_def.on_secondary_use = minetest.item_eat(6) +end + +minetest.register_node('x_farming:pumpkin_pie', pumpkin_pie_def) + +-- Beetroot soup +local beetroot_soup_def = { + description = S('Beetroot Soup') .. '\n' .. S('Compost chance') .. ': 100%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + short_description = S('Beetroot Soup'), + drawtype = 'mesh', + mesh = 'x_farming_beetroot_soup.obj', + tiles = { 'x_farming_beetroot_soup_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_beetroot_soup.png', + wield_image = 'x_farming_beetroot_soup.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.1, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -0.1, 0.5 } + }, + groups = { + -- MTG + vessel = 1, + dig_immediate = 3, + attached_node = 1, + -- X Farming + compost = 100, + -- MCL + food = 3, + eatable = 6, + compostability = 100, + handy = 1, + deco_block = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + }, + sounds = x_farming.node_sound_wood_defaults(), + sunlight_propagates = true, + on_use = minetest.item_eat(6, 'x_farming:bowl'), + -- MCL + _mcl_saturation = 0.6, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, +} + +if minetest.get_modpath('mcl_farming') then + beetroot_soup_def.on_secondary_use = minetest.item_eat(6, 'x_farming:bowl') +end + +minetest.register_node('x_farming:beetroot_soup', beetroot_soup_def) + +-- Fish Stew +local fish_stew_def = { + description = S('Fish Stew') .. '\n' .. S('Compost chance') .. ': 100%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 8'), + short_description = S('Fish Stew'), + drawtype = 'mesh', + mesh = 'x_farming_fish_stew.obj', + tiles = { 'x_farming_fish_stew_mesh.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_fish_stew.png', + wield_image = 'x_farming_fish_stew.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.1, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -0.1, 0.5 } + }, + groups = { + -- MTG + vessel = 1, + dig_immediate = 3, + attached_node = 1, + -- X Farming + compost = 100, + -- MCL + food = 3, + eatable = 6, + compostability = 100, + handy = 1, + deco_block = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + }, + -- MCL + _mcl_saturation = 0.6, + on_use = minetest.item_eat(8, 'x_farming:bowl'), + sounds = x_farming.node_sound_wood_defaults(), + sunlight_propagates = true +} + +if minetest.get_modpath('mcl_farming') then + fish_stew_def.on_secondary_use = minetest.item_eat(8, 'x_farming:bowl') +end + +minetest.register_node('x_farming:fish_stew', fish_stew_def) + +-- Cactus brick +minetest.register_node('x_farming:cactus_brick', { + description = S('Cactus Brick'), + short_description = S('Cactus Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'x_farming_cactus_brick.png^[transformFX', + 'x_farming_cactus_brick.png', + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = x_farming.node_sound_stone_defaults() +}) + +if minetest.global_exists('stairs') and minetest.get_modpath('stairs') then + stairs.register_stair_and_slab( + 'cactus_brick', + 'x_farming:cactus_brick', + { cracky = 3 }, + { 'x_farming_cactus_brick.png' }, + S('Cactus Brick Stair'), + S('Cactus Brick Slab'), + x_farming.node_sound_stone_defaults(), + false + ) +end + +if minetest.get_modpath('mcl_stairs') then + mcl_stairs.register_stair_and_slab( + 'cactus_brick', + 'x_farming:cactus_brick', + { pickaxey = 1 }, + { 'x_farming_cactus_brick.png' }, + S('Cactus Brick Stair'), + S('Cactus Brick Slab'), + x_farming.node_sound_stone_defaults(), + 6, + 2, + S('Double Cactus Brick Slab'), + nil + ) +end + +local function tick_scarecrow(pos) + -- minetest.get_node_timer(pos):start(math.random(1, 2)) + minetest.get_node_timer(pos):start(math.random(83, 143)) +end + +-- Scarecrow +minetest.register_node('x_farming:scarecrow', { + description = S('Scarecrow'), + short_description = S('Scarecrow'), + drawtype = 'mesh', + mesh = 'x_farming_scarecrow.obj', + tiles = { 'x_farming_scarecrow_1.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_scarecrow_1_item.png', + wield_image = 'x_farming_scarecrow_1_item.png', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.4, -0.5, -0.4, 0.4, 1.5, 0.4 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.4, -0.5, -0.4, 0.4, 1.5, 0.4 } + }, + groups = { + -- MTG + choppy = 1, + oddly_breakable_by_hand = 1, + flammable = 2, + -- MCL + handy = 1, + axey = 1, + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + sounds = x_farming.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('x_farming_scarecrow_state', 'inactive') + meta:set_string('infotext', 'Scarecrow - Activate with bonemeal.') + meta:set_string('owner', '') + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if not placer then + return + end + + local meta = minetest.get_meta(pos) + + meta:set_string('owner', placer:get_player_name() or '') + meta:set_string('infotext', S('Scarecrow (owned by @1) - Activate with bonemeal.', meta:get_string('owner'))) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local player_name = clicker:get_player_name() + + if minetest.is_protected(pos, player_name) + and not minetest.check_player_privs(player_name, 'protection_bypass') + then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + if itemstack:get_name() ~= 'x_farming:bonemeal' then + return itemstack + end + + local meta = minetest.get_meta(pos) + local state = meta:get_string('x_farming_scarecrow_state') + + if state == 'inactive' then + meta:set_string('x_farming_scarecrow_state', 'active') + meta:set_string('infotext', S('Scarecrow (owned by @1) - Active', meta:get_string('owner'))) + minetest.swap_node(pos, { name = 'x_farming:scarecrow_2', param2 = node.param2 }) + meta:set_int('x_farming_scarecrow_fails', 0) + tick_scarecrow(pos) + itemstack:take_item() + end + + return itemstack + end, +}) + +minetest.register_node('x_farming:scarecrow_2', { + description = S('Scarecrow 2'), + short_description = S('Scarecrow 2'), + drawtype = 'mesh', + mesh = 'x_farming_scarecrow_2.obj', + tiles = { 'x_farming_scarecrow_2.png' }, + use_texture_alpha = 'clip', + inventory_image = 'x_farming_scarecrow_1_item.png', + wield_image = 'x_farming_scarecrow_1_item.png', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + drop = 'x_farming:scarecrow', + selection_box = { + type = 'fixed', + fixed = { -0.4, -0.5, -0.4, 0.4, 1.5, 0.4 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.4, -0.5, -0.4, 0.4, 1.5, 0.4 } + }, + groups = { + -- MTG + choppy = 1, + oddly_breakable_by_hand = 1, + flammable = 2, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + sounds = x_farming.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('x_farming_scarecrow_state', 'active') + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local player_name = clicker:get_player_name() + + if minetest.is_protected(pos, player_name) + and not minetest.check_player_privs(player_name, 'protection_bypass') + then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + local meta = minetest.get_meta(pos) + local state = meta:get_string('x_farming_scarecrow_state') + + if state == 'active' then + meta:set_string('x_farming_scarecrow_state', 'inactive') + meta:set_string('infotext', S('Scarecrow (owned by @1) - Activate with bonemeal.', meta:get_string('owner'))) + minetest.swap_node(pos, { name = 'x_farming:scarecrow', param2 = node.param2 }) + end + + return itemstack + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local state = meta:get_string('x_farming_scarecrow_state') + local fails = meta:get_int('x_farming_scarecrow_fails') + local player_name = meta:get_string('owner') + local player = minetest.get_player_by_name(player_name) + local node = minetest.get_node(pos) + + if not player then + return true + end + + if minetest.is_protected(pos, player_name) + and not minetest.check_player_privs(player_name, 'protection_bypass') + then + return true + end + + if state ~= 'active' then + return false + end + + -- bonemeal it + local positions_raw = minetest.find_nodes_in_area( + vector.subtract(vector.new(pos), 5), + vector.add(vector.new(pos), 5), + { + 'group:sand', + 'group:soil', + 'group:seed', + 'group:plant' + } + ) + + local positions = {} + + for _, p in ipairs(positions_raw) do + local n = minetest.get_node(p) + if minetest.get_item_group(n.name, 'field') == 0 then + local n_above = minetest.get_node(vector.new(p.x, p.y + 1, p.z)) + + if minetest.get_item_group(n.name, 'seed') > 0 or minetest.get_item_group(n.name, 'plant') > 0 then + local ndef = minetest.registered_nodes[n.name] + + if ndef.next_plant + and ndef.next_plant ~= 'x_farming:pumpkin_fruit' + and ndef.next_plant ~= 'x_farming:melon_fruit' + then + table.insert(positions, p) + end + elseif n_above.name == 'air' then + table.insert(positions, p) + end + end + end + + if #positions == 0 then + meta:set_string('x_farming_scarecrow_state', 'inactive') + meta:set_string('infotext', S('Scarecrow (owned by @1) - Activate with bonemeal.', meta:get_string('owner'))) + minetest.swap_node(pos, { name = 'x_farming:scarecrow', param2 = node.param2 }) + + return false + end + + local pos_rand = positions[math.random(1, #positions)] + + local pointed_thing = { + type = 'node', + under = pos_rand, + above = vector.new(pos_rand.x, pos_rand.y + 1, pos_rand.z), + } + + local result = x_farming.x_bonemeal:on_use(ItemStack({ name = 'x_farming:bonemeal' }), player, pointed_thing) + + if not result.success then + fails = fails + 1 + meta:set_int('x_farming_scarecrow_fails', fails) + end + + if fails < 7 then + tick_scarecrow(pos) + else + meta:set_string('x_farming_scarecrow_state', 'inactive') + meta:set_string('infotext', S('Scarecrow (owned by @1) - Activate with bonemeal.', meta:get_string('owner'))) + minetest.swap_node(pos, { name = 'x_farming:scarecrow', param2 = node.param2 }) + + return false + end + end, +}) + +-- Honey +minetest.register_node('x_farming:honey_block', { + description = S('Honey Block'), + short_description = S('Honey Block'), + drawtype = 'mesh', + mesh = 'x_farming_honey.obj', + tiles = { 'x_farming_honey_block_mesh.png' }, + use_texture_alpha = 'blend', + paramtype = 'light', + sunlight_propagates = true, + wield_image = 'x_farming_honey_block_item.png', + inventory_image = '[inventorycube{x_farming_honey_block_item.png{x_farming_honey_block_item.png{x_farming_honey_block_item.png', + groups = { + -- MTG + snappy = 3, + disable_jump = 1, + -- MCL + handy = 1, + hoey = 1, + swordy = 1, + deco_block = 1, + -- ALL + fall_damage_add_percent = -80, + }, + collision_box = { + type = 'fixed', + fixed = { -0.3, -0.3, -0.3, 0.3, 0.3, 0.3 } + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_slime_defaults(), + move_resistance = 7, +}) + +minetest.register_node('x_farming:honeycomb_block', { + description = S('Honeycomb Block'), + short_description = S('Honeeycomb Block'), + tiles = { 'x_farming_honeycomb_block.png' }, + paramtype = 'light', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + deco_block = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = x_farming.node_sound_dirt_defaults() +}) + +-- Candles +for i = 1, 4 do + -- OFF + minetest.register_node('x_farming:candle_off_' .. i, { + description = S('Candle'), + short_description = S('Candle'), + drawtype = 'mesh', + mesh = 'x_farming_candle_' .. i .. '.obj', + tiles = { + { name = 'x_farming_candle_mesh.png' }, + { + name = 'x_farming_candle_no_flame.png', + backface_culling = false + } + }, + paramtype2 = 'facedir', + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + floodable = true, + inventory_image = 'x_farming_candle_item.png', + wield_image = 'x_farming_candle_item.png', + drop = { + max_items = i, + items = { + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + } + }, + }, + groups = { + -- MTG + snappy = 3, + candle = i == 1 and 1 or nil, + candle_x_farming = i == 1 and 1 or nil, + attached_node = 1, + not_in_creative_inventory = i == 1 and 0 or 1, + -- MCL + handy = 1, + hoey = 1, + swordy = 1, + deco_block = 1 + }, + selection_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, 0.4, 0.3 } + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_wood_defaults(), + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local stack_name = itemstack:get_name() + + if minetest.get_item_group(stack_name, 'candle') > 0 and i < 4 then + minetest.swap_node(pos, { name = 'x_farming:candle_off_' .. i + 1, param2 = node.param2 }) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + itemstack:take_item() + end + elseif minetest.get_item_group(stack_name, 'torch') > 0 + or stack_name == 'fire:flint_and_steel' + or stack_name == 'mcl_fire:flint_and_steel' + then + minetest.swap_node(pos, { name = 'x_farming:candle_on_' .. i, param2 = node.param2 }) + end + + return itemstack + end, + on_flood = x_farming.on_flood_candle + }) + + -- ON + minetest.register_node('x_farming:candle_on_' .. i, { + description = S('Candle'), + short_description = S('Candle'), + drawtype = 'mesh', + mesh = 'x_farming_candle_' .. i .. '.obj', + tiles = { + { name = 'x_farming_candle_mesh.png' }, + { + name = 'x_farming_candle_flame_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1 + }, + } + }, + paramtype2 = 'facedir', + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + floodable = true, + inventory_image = 'x_farming_candle_item.png', + wield_image = 'x_farming_candle_item.png', + drop = { + max_items = i, + items = { + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_off_1' }, + } + }, + }, + groups = { + -- MTG + snappy = 3, + attached_node = 1, + candle_on = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + hoey = 1, + swordy = 1, + deco_block = 1 + }, + selection_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, 0.4, 0.3 } + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_wood_defaults(), + light_source = i * 3, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local stack_name = itemstack:get_name() + + if minetest.get_item_group(stack_name, 'candle') > 0 and i < 4 then + minetest.swap_node(pos, { name = 'x_farming:candle_on_' .. i + 1, param2 = node.param2 }) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + itemstack:take_item() + end + else + minetest.swap_node(pos, { name = 'x_farming:candle_off_' .. i, param2 = node.param2 }) + end + + return itemstack + end, + on_flood = x_farming.on_flood_candle + }) +end + +-- Colored Candles +for color_id, color_def in pairs(x_farming.candle_colors) do + local color_group = 'color_' .. color_id + + for i = 1, 4 do + -- OFF + minetest.register_node('x_farming:candle_' .. color_id .. '_off_' .. i, { + description = color_def.name .. ' ' .. S('Candle'), + short_description = color_def.name .. ' ' .. S('Candle'), + drawtype = 'mesh', + mesh = 'x_farming_candle_' .. i .. '.obj', + tiles = { + { name = 'x_farming_candle_mesh.png^[multiply:' .. color_def.hex .. ':255' }, + { + name = 'x_farming_candle_no_flame.png', + backface_culling = false + } + }, + paramtype2 = 'facedir', + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + floodable = true, + inventory_image = 'x_farming_candle_item.png^[multiply:' .. color_def.hex .. ':255', + wield_image = 'x_farming_candle_item.png^[multiply:' .. color_def.hex .. ':255', + drop = { + max_items = i, + items = { + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + } + }, + }, + groups = { + -- MTG + snappy = 3, + candle = i == 1 and 1 or nil, + attached_node = 1, + not_in_creative_inventory = i == 1 and 0 or 1, + ['candle_' .. '_' .. color_group] = 1, + -- MCL + handy = 1, + hoey = 1, + swordy = 1, + deco_block = 1, + }, + selection_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, 0.4, 0.3 } + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_wood_defaults(), + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local stack_name = itemstack:get_name() + + if minetest.get_item_group(stack_name, 'candle') > 0 + and minetest.get_item_group(stack_name, 'candle_' .. '_' .. color_group) > 0 + and i < 4 + then + minetest.swap_node(pos, { name = 'x_farming:candle_' .. color_id .. '_off_' .. i + 1, param2 = node.param2 }) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + itemstack:take_item() + end + elseif minetest.get_item_group(stack_name, 'torch') > 0 + or stack_name == 'fire:flint_and_steel' + or stack_name == 'mcl_fire:flint_and_steel' + then + minetest.swap_node(pos, { name = 'x_farming:candle_' .. color_id .. '_on_' .. i, param2 = node.param2 }) + end + + return itemstack + end, + on_flood = x_farming.on_flood_candle + }) + + -- ON + minetest.register_node('x_farming:candle_' .. color_id .. '_on_' .. i, { + description = color_def.name .. ' ' .. S('Candle'), + short_description = color_def.name .. ' ' .. S('Candle'), + drawtype = 'mesh', + mesh = 'x_farming_candle_' .. i .. '.obj', + tiles = { + { name = 'x_farming_candle_mesh.png^[multiply:' .. color_def.hex .. ':255' }, + { + name = 'x_farming_candle_flame_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1 + }, + } + }, + paramtype2 = 'facedir', + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + floodable = true, + inventory_image = 'x_farming_candle_item.png^[multiply:' .. color_def.hex .. ':255', + wield_image = 'x_farming_candle_item.png^[multiply:' .. color_def.hex .. ':255', + drop = { + max_items = i, + items = { + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + }, + { + rarity = 1, + items = { 'x_farming:candle_' .. color_id .. '_off_1' }, + } + }, + }, + groups = { + -- MTG + snappy = 3, + attached_node = 1, + candle_on = 1, + -- ['candle_' .. '_' .. color_group] = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + hoey = 1, + swordy = 1, + deco_block = 1 + }, + selection_box = { + type = 'fixed', + fixed = { -0.3, -0.5, -0.3, 0.3, 0.4, 0.3 } + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_wood_defaults(), + light_source = i * 3, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local stack_name = itemstack:get_name() + + if minetest.get_item_group(stack_name, 'candle') > 0 and i < 4 then + minetest.swap_node(pos, { name = 'x_farming:candle_' .. color_id .. '_on_' .. i + 1, param2 = node.param2 }) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + itemstack:take_item() + end + else + minetest.swap_node(pos, { name = 'x_farming:candle_' .. color_id .. '_off_' .. i, param2 = node.param2 }) + end + + return itemstack + end, + on_flood = x_farming.on_flood_candle + }) + end + + local craft_dye = 'group:dye,' .. color_group + + if color_def.craft_dye then + craft_dye = color_def.craft_dye + end + + -- Crafting + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:candle_' .. color_id .. '_off_1', + recipe = { 'group:candle_x_farming', craft_dye }, + }) + + if minetest.get_modpath('mcl_dye') then + local mcl_groups = {} + + for key, value in pairs(color_def.mcl_groups) do + table.insert(mcl_groups, key) + end + + local mcl_craft_dye = 'group:dye,' .. table.concat(mcl_groups, ',') + + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:candle_' .. color_id .. '_off_1', + recipe = { 'group:candle_x_farming', mcl_craft_dye }, + }) + end +end + +-- Pillow + +local pillow_colors = { + { + name = 'white', + description = S('White'), + mcl_group = { 'unicolor_white' } + }, + { + name = 'grey', + description = S('Grey'), + mcl_group = { 'unicolor_grey' } + }, + { + name = 'dark_grey', + description = S('Dark Grey'), + mcl_group = { 'unicolor_darkgrey' } + }, + { + name = 'black', + description = S('Black'), + mcl_group = { 'unicolor_black' } + }, + { + name = 'violet', + description = S('Violet'), + mcl_group = { 'unicolor_red_violet' } + }, + { + name = 'blue', + description = S('Blue'), + mcl_group = { 'unicolor_blue' } + }, + { + name = 'light_blue', + description = S('Light Blue'), + mcl_group = { 'unicolor_light_blue' } + }, + { + name = 'cyan', + description = S('Cyan'), + mcl_group = { 'unicolor_cyan' } + }, + { + name = 'dark_green', + description = S('Dark Green'), + mcl_group = { 'unicolor_dark_green' } + }, + { + name = 'green', + description = S('Green'), + mcl_group = { 'unicolor_green' } + }, + { + name = 'yellow', + description = S('Yellow'), + mcl_group = { 'unicolor_yellow' } + }, + { + name = 'brown', + description = S('Brown'), + mcl_group = { 'unicolor_dark_orange' } + }, + { + name = 'orange', + description = S('Orange'), + mcl_group = { 'unicolor_orange' } + }, + { + name = 'red', + description = S('Red'), + mcl_group = { 'unicolor_red' } + }, + { + name = 'magenta', + description = S('Magenta'), + mcl_group = { 'unicolor_red_violet' } + }, + { + name = 'pink', + description = S('Pink'), + mcl_group = { 'unicolor_light_red' } + }, +} + +if not minetest.get_modpath('x_clay') then + minetest.register_craftitem('x_farming:dye_light_blue', { + inventory_image = 'x_farming_dye_light_blue.png', + description = S('Light Blue Dye'), + short_description = S('Light Blue Dye'), + groups = { dye = 1, color_light_blue = 1 } + }) + + minetest.register_craft({ + type = 'shapeless', + output = 'x_clay:dye_light_blue 2', + recipe = { 'group:dye,color_white', 'group:dye,color_blue' }, + }) +end + +for _, def in ipairs(pillow_colors) do + local color_group = 'color_' .. def.name + + if minetest.registered_nodes["wool:" .. def.name] then + minetest.register_alias("x_farming:pillow_" .. def.name,"wool:" .. def.name) + minetest.override_item("wool:" .. def.name,{ + groups = { + -- MTG + snappy = 2, + choppy = 2, + oddly_breakable_by_hand = 3, + flammable = 3, + wool = 1, + pillow = 1, + [color_group] = 1, + }, + }) + else + minetest.register_node('x_farming:pillow_' .. def.name, { + description = S('Pillow') .. ' ' .. def.description, + short_description = S('Pillow') .. ' ' .. def.description, + tiles = { 'x_farming_pillow_' .. def.name .. '.png' }, + is_ground_content = false, + groups = { + -- MTG + snappy = 2, + choppy = 2, + oddly_breakable_by_hand = 3, + flammable = 3, + pillow = 1, + [color_group] = 1, + -- MCL + handy = 1, + shearsy_wool = 1, + fire_encouragement = 30, + fire_flammability = 60, + building_block = 1, + [def.mcl_group[1]] = 1, + }, + _mcl_hardness = 0.8, + _mcl_blast_resistance = 0.8, + sounds = x_farming.node_sound_pillow_defaults(), + }) + + if minetest.get_modpath('mcl_dye') and x_farming.candle_colors[def.name] then + local mcl_groups = {} + local color_def = x_farming.candle_colors[def.name] + + for key, value in pairs(color_def.mcl_groups) do + table.insert(mcl_groups, key) + end + + local mcl_craft_dye = 'group:dye,' .. table.concat(mcl_groups, ',') + + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:pillow_' .. def.name, + recipe = { mcl_craft_dye, 'group:pillow' }, + }) + end + + if minetest.get_modpath('dye') then + minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:pillow_' .. def.name, + recipe = { 'group:dye,' .. color_group, 'group:pillow' }, + }) + end + end +end + +minetest.register_node('x_farming:silt_loam_soil', { + description = S('Silt Loam Soil. Used for farming rice.'), + short_description = S('Silt Loam Soil'), + tiles = { 'x_farming_silt_loam_soil.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = x_farming.node_sound_dirt_defaults(), +}) + +-- barley stack +minetest.register_node('x_farming:barley_stack', { + description = S('Barley Stack'), + tiles = { + 'x_farming_barley_stack_top.png', + 'x_farming_barley_stack_top.png', + 'x_farming_barley_stack_side.png', + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + -- MCL + handy = 1, + hoey = 1, + building_block = 1, + fire_encouragement = 60, + fire_flammability = 20, + compostability = 85, + -- ALL + flammable = 4, + fall_damage_add_percent = -30, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = x_farming.node_sound_leaves_defaults(), + on_place = minetest.rotate_node +}) + +-- rice stack +minetest.register_node('x_farming:rice_stack', { + description = S('Rice Stack'), + tiles = { + 'x_farming_rice_stack_top.png', + 'x_farming_rice_stack_bottom.png', + 'x_farming_rice_stack_side.png', + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + -- MCL + handy = 1, + hoey = 1, + building_block = 1, + fire_encouragement = 60, + fire_flammability = 20, + compostability = 85, + -- ALL + flammable = 4, + fall_damage_add_percent = -30, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = x_farming.node_sound_leaves_defaults(), + on_place = minetest.rotate_node +}) + +minetest.register_node('x_farming:silt_loam_brick_block', { + description = S('Silt Loam Brick Block'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'x_farming_silt_loam_brick_block.png^[transformFX', + 'x_farming_silt_loam_brick_block.png', + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = x_farming.node_sound_stone_defaults(), +}) + +-- French Potatoes +x_farming.register_feast('french_potatoes', { + description = S('French Potatoes') .. '\n' .. S('Compost chance') .. ': 100%', + short_description = S('French Potatoes'), + mesh = 'x_farming_french_potatoes.obj', + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -7 / 16, 8 / 16, -1 / 16, 7 / 16 } + }, + steps = 5 +}) + +-- Baked Fish +x_farming.register_feast('baked_fish', { + description = S('Baked Fish') .. '\n' .. S('Compost chance') .. ': 100%', + short_description = S('Baked Fish'), + mesh = 'x_farming_baked_fish.obj', + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -7 / 16, 8 / 16, -1 / 16, 7 / 16 } + }, + steps = 5 +}) + +-- Melon Slush +x_farming.register_feast('melon_slush', { + description = S('Melon Slush') .. '\n' .. S('Compost chance') .. ': 100%', + short_description = S('Melon Slush'), + mesh = 'x_farming_melon_slush.obj', + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -8 / 16, -7 / 16, 7 / 16, 3 / 16, 7 / 16 } + }, + use_texture_alpha = 'blend', + last_drop = 'default:glass', + sounds = x_farming.node_sound_thin_glass_defaults(), + steps = 5 +}) + +-- Strawberry Pie +x_farming.register_pie('strawberry_pie', { + description = S('Strawberry Pie') .. '\n' .. S('Compost chance') .. ': 100%', + short_description = S('Strawberry Pie'), + mesh = 'x_farming_pie.obj', + steps = 4 +}) + +-- Chocolate Pie +x_farming.register_pie('chocolate_pie', { + description = S('Chocolade Pie') .. '\n' .. S('Compost chance') .. ': 100%', + short_description = S('Chocolade Pie'), + mesh = 'x_farming_pie.obj', + steps = 4 +}) + +-- Honey Glazed Kiwi Pie +x_farming.register_pie('honey_kiwi_pie', { + description = S('Honey Glazed Kiwi') .. '\n' .. S('Compost chance') .. ': 100%', + short_description = S('Honey Glazed Kiwi'), + mesh = 'x_farming_pie.obj', + steps = 4 +}) + +-- +-- Convert farming soils - copy from MTG +-- +if not minetest.get_modpath('farming') then + minetest.register_abm({ + label = 'X Farming soil', + nodenames = { 'group:field' }, + interval = 15, + chance = 4, + action = function(pos, node) + local n_def = minetest.registered_nodes[node.name] or nil + local wet = n_def.soil.wet or nil + local base = n_def.soil.base or nil + local dry = n_def.soil.dry or nil + if not n_def or not n_def.soil or not wet or not base or not dry then + return + end + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + if not nn or not nn.name then + return + end + local nn_def = minetest.registered_nodes[nn.name] or nil + pos.y = pos.y - 1 + + if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, 'plant') == 0 then + minetest.set_node(pos, { name = base }) + return + end + -- check if there is water nearby + local wet_lvl = minetest.get_item_group(node.name, 'wet') + if minetest.find_node_near(pos, 3, { 'group:water' }) then + -- if it is dry soil and not base node, turn it into wet soil + if wet_lvl == 0 then + minetest.set_node(pos, { name = wet }) + end + else + -- only turn back if there are no unloaded blocks (and therefore + -- possible water sources) nearby + if not minetest.find_node_near(pos, 3, { 'ignore' }) then + -- turn it back into base if it is already dry + if wet_lvl == 0 then + -- only turn it back if there is no plant/seed on top of it + if minetest.get_item_group(nn.name, 'plant') == 0 and minetest.get_item_group(nn.name, 'seed') == 0 then + minetest.set_node(pos, { name = base }) + end + elseif wet_lvl == 1 then + -- if its wet turn it back into dry soil + minetest.set_node(pos, { name = dry }) + end + end + end + end, + }) +end diff --git a/mods/x_farming/obsidian_wart.lua b/mods/x_farming/obsidian_wart.lua new file mode 100644 index 00000000..4e22c676 --- /dev/null +++ b/mods/x_farming/obsidian_wart.lua @@ -0,0 +1,465 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local minlight = 0 +local maxlight = 14 + +-- OBSIDIAN WART +x_farming.register_plant('x_farming:obsidian_wart', { + description = S('Obsidian Wart Seed') .. '\n' .. S('Plant on Obsidian') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Obsidian Wart Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_obsidian_wart_seed.png', + steps = 6, + minlight = minlight, + maxlight = maxlight, + fertility = { 'underground' }, + groups = { flammable = 4 }, + place_param2 = 3 +}) + +-- needed +minetest.override_item('x_farming:obsidian_wart', { + description = S('Obsidian Wart') .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Obsidian Wart'), + groups = { + -- X Farming + compost = 65, + -- MCL + compostability = 65 + }, +}) + +if minetest.get_modpath('default') then + -- default obsidian + minetest.override_item('default:obsidian', { + groups = { + -- MTG + cracky = 1, + level = 2, + soil = 1, + underground = 1 + }, + soil = { + base = 'default:obsidian', + dry = 'x_farming:obsidian_soil', + wet = 'x_farming:obsidian_soil_wet' + }, + }) + + -- obsidian - soil + minetest.register_node('x_farming:obsidian_soil', { + description = S('Obsidian Soil'), + short_description = S('Obsidian Soil'), + drop = 'default:obsidian', + tiles = { 'x_farming_obsidian_soil.png', 'default_obsidian.png' }, + groups = { cracky = 1, level = 2, soil = 2, underground = 1, field = 1, not_in_creative_inventory = 1 }, + sounds = x_farming.node_sound_stone_defaults(), + soil = { + base = 'default:obsidian', + dry = 'x_farming:obsidian_soil', + wet = 'x_farming:obsidian_soil_wet' + } + }) + + -- obsidian - soil - wet + minetest.register_node('x_farming:obsidian_soil_wet', { + description = S('Wet Obsidian Soil'), + short_description = S('Wet Obsidian Soil'), + drop = 'default:obsidian', + tiles = { 'x_farming_obsidian_soil_wet.png', 'default_obsidian.png^x_farming_soil_wet_side.png' }, + groups = { cracky = 1, level = 2, soil = 3, wet = 1, underground = 1, field = 1, not_in_creative_inventory = 1 }, + sounds = x_farming.node_sound_stone_defaults(), + soil = { + base = 'default:obsidian', + dry = 'x_farming:obsidian_soil', + wet = 'x_farming:obsidian_soil_wet' + } + }) +elseif minetest.get_modpath('mcl_core') then + -- mcl_core obsidian + minetest.override_item('mcl_core:obsidian', { + groups = { + pickaxey = 5, + building_block = 1, + material_stone = 1, + soil = 1, + underground = 1, + }, + soil = { + base = 'default:obsidian', + dry = 'x_farming:mcl_obsidian_soil', + wet = 'x_farming:mcl_obsidian_soil_wet' + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + }) + + -- mcl_core obsidian - soil + minetest.register_node('x_farming:mcl_obsidian_soil', { + description = S('Obsidian Soil'), + short_description = S('Obsidian Soil'), + drop = 'mcl_core:obsidian', + tiles = { 'x_farming_obsidian_soil.png', 'default_obsidian.png' }, + groups = { + pickaxey = 5, + building_block = 1, + material_stone = 1, + soil = 2, + field = 1, + not_in_creative_inventory = 1, + underground = 1 + }, + sounds = x_farming.node_sound_stone_defaults(), + soil = { + base = 'mcl_core:obsidian', + dry = 'x_farming:mcl_obsidian_soil', + wet = 'x_farming:mcl_obsidian_soil_wet' + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + }) + + -- mcl_core obsidian - soil - wet + minetest.register_node('x_farming:mcl_obsidian_soil_wet', { + description = S('Wet Obsidian Soil'), + short_description = S('Wet Obsidian Soil'), + drop = 'mcl_core:obsidian', + tiles = { 'x_farming_obsidian_soil_wet.png', 'default_obsidian.png^x_farming_soil_wet_side.png' }, + groups = { + pickaxey = 5, + building_block = 1, + material_stone = 1, + soil = 3, + wet = 1, + field = 1, + not_in_creative_inventory = 1, + underground = 1 + }, + sounds = x_farming.node_sound_stone_defaults(), + soil = { + base = 'mcl_core:obsidian', + dry = 'x_farming:mcl_obsidian_soil', + wet = 'x_farming:mcl_obsidian_soil_wet' + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + }) +end + +-- +-- Nodes +-- +minetest.register_node('x_farming:wart_block', { + description = S('Wart Block') .. '\n' .. S('Compost chance') .. ': 85%', + short_description = S('Wart Block'), + tiles = { 'x_farming_wart_block.png' }, + groups = { + -- MTG + cracky = 3, + compost = 85, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + sounds = x_farming.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) + +minetest.register_node('x_farming:wartrack', { + description = S('Wartrack'), + short_description = S('Wartrack'), + tiles = { 'x_farming_wartrack.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = x_farming.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) + +minetest.register_node('x_farming:wart_brick_block', { + description = S('Wart Brick Block'), + short_description = S('Wart Brick Block'), + tiles = { 'x_farming_wart_brick_block.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = x_farming.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) + +minetest.register_node('x_farming:wart_red_brick_block', { + description = S('Wart Red Brick Block'), + short_description = S('Wart Red Brick Block'), + tiles = { 'x_farming_wart_red_brick_block.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = x_farming.node_sound_stone_defaults(), + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, +}) + +-- +-- Register Wart stairs and slabs +-- +if minetest.get_modpath('stairs') then + stairs.register_stair_and_slab( + 'wart_block', + 'x_farming:wart_block', + { cracky = 3 }, + { 'x_farming_wart_block.png' }, + S('Wart Block Stair'), + S('Wart Block Slab'), + x_farming.node_sound_stone_defaults() + ) + + stairs.register_stair_and_slab( + 'wart_brick_block', + 'x_farming:wart_brick_block', + { cracky = 2 }, + { 'x_farming_wart_brick_block.png' }, + S('Wart Brick Stair'), + S('Wart Brick Slab'), + x_farming.node_sound_stone_defaults() + ) + + stairs.register_stair_and_slab( + 'wart_red_brick_block', + 'x_farming:wart_red_brick_block', + { cracky = 2 }, + { 'x_farming_wart_red_brick_block.png' }, + S('Wart Red Brick Stair'), + S('Wart Red Brick Slab'), + x_farming.node_sound_stone_defaults() + ) + + stairs.register_stair_and_slab( + 'wartrack', + 'x_farming:wartrack', + { cracky = 3 }, + { 'x_farming_wartrack.png' }, + S('Wartrack Stair'), + S('Wartrack Slab'), + x_farming.node_sound_stone_defaults() + ) +end + +if minetest.get_modpath('mcl_stairs') then + mcl_stairs.register_stair_and_slab( + 'x_farming_wart_block', + 'x_farming:wart_block', + { + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + { 'x_farming_wart_block.png' }, + S('Wart Block Stair'), + S('Wart Block Slab'), + x_farming.node_sound_stone_defaults(), + 6, + 2, + S('Double Wart Block Slab'), + nil + ) + + mcl_stairs.register_stair_and_slab( + 'x_farming_wart_brick_block', + 'x_farming:wart_brick_block', + { + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + { 'x_farming_wart_brick_block.png' }, + S('Wart Brick Stair'), + S('Wart Brick Slab'), + x_farming.node_sound_stone_defaults(), + 6, + 2, + S('Double Wart Brick Slab'), + nil + ) + + mcl_stairs.register_stair_and_slab( + 'x_farming_wart_red_brick_block', + 'x_farming:wart_red_brick_block', + { + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + { 'x_farming_wart_red_brick_block.png' }, + S('Wart Red Brick Stair'), + S('Wart Red Brick Slab'), + x_farming.node_sound_stone_defaults(), + 6, + 2, + S('Double Wart Red Brick Slab'), + nil + ) + + mcl_stairs.register_stair_and_slab( + 'x_farming_wartrack', + 'x_farming:wartrack', + { + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + { 'x_farming_wartrack.png' }, + S('Wartrack Stair'), + S('Wartrack Slab'), + x_farming.node_sound_stone_defaults(), + 6, + 2, + S('Double Wartrack Slab'), + nil + ) +end + +minetest.register_craftitem('x_farming:wart_brick', { + description = S('Wart Brick'), + inventory_image = 'x_farming_wart_brick.png', + groups = { craftitem = 1 }, +}) + +minetest.register_node('x_farming:obsidian_wart_decor', { + description = S('Obsidian Wart'), + short_description = S('Obsidian Wart'), + drawtype = 'plantlike_rooted', + paramtype = 'light', + tiles = { 'default_obsidian.png' }, + special_tiles = { { name = 'x_farming_obsidian_wart_6.png', tileable_vertical = true } }, + inventory_image = 'x_farming_obsidian_wart_6.png', + groups = { + -- MTG + snappy = 3, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + light_source = 4, + glow = 0, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'default:obsidian', + node_placement_prediction = '', + -- MCL + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_stone_defaults({ + dig = { name = 'default_dig_snappy', gain = 0.2 }, + dug = { name = 'default_grass_footstep', gain = 0.25 }, + }), + drop = { + items = { + { items = { 'x_farming:obsidian_wart' }, rarity = 1 }, + { items = { 'x_farming:obsidian_wart' }, rarity = 2 }, + { items = { 'x_farming:seed_obsidian_wart' }, rarity = 1 }, + { items = { 'x_farming:seed_obsidian_wart' }, rarity = 2 } + } + }, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, { name = 'default:obsidian' }) + end, +}) + +---crate +x_farming.register_crate('crate_obsidian_wart_3', { + description = S('Obsidian Wart Crate'), + short_description = S('Obsidian Wart Crate'), + tiles = { 'x_farming_crate_obsidian_wart_3.png' }, + _custom = { + crate_item = 'x_farming:obsidian_wart' + } +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:obsidian"}, + biomes = {"fiery","fiery_below"}, + sidelen = 8, + fill_ratio = 0.1, + y_max = 31000, + y_min = -31000, + place_offset_y = -1, + flags = "force_placement", + decoration = "x_farming:obsidian_wart_decor", +}) diff --git a/mods/x_farming/pine_nut.lua b/mods/x_farming/pine_nut.lua new file mode 100644 index 00000000..00c1314d --- /dev/null +++ b/mods/x_farming/pine_nut.lua @@ -0,0 +1,495 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Minetest Game compatibility +if minetest.get_modpath("default") then + -- Aliases + minetest.register_alias("x_farming:pine_nut_tree","default:pine_tree") + minetest.register_alias("x_farming:pine_nut_leaves","default:pine_needles") + minetest.register_alias("x_farming:pine_nut_sapling","default:pine_sapling") + minetest.register_alias("x_farming:pine_nut_wood","default:pine_wood") + minetest.register_alias("stairs:stair_pine_nut_wood","stairs:stair_pine_wood") + minetest.register_alias("stairs:stair_inner_pine_nut_wood","stairs:stair_inner_pine_wood") + minetest.register_alias("stairs:stair_outer_pine_nut_wood","stairs:stair_outer_pine_wood") + minetest.register_alias("stairs:slab_pine_nut_wood","slab:stair_pine_wood") +else + -- trunk + minetest.register_node('x_farming:pine_nut_tree', { + description = S('Pine Nut Tree'), + short_description = S('Pine Nut Tree'), + tiles = { 'x_farming_pine_nut_tree_top.png', 'x_farming_pine_nut_tree_top.png', 'x_farming_pine_nut_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + on_place = minetest.rotate_node + }) + + -- leaves + minetest.register_node('x_farming:pine_nut_leaves', { + description = S('Pine Nut Needles') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Pine Nut Needles'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'x_farming_pine_nut_leaves.png' }, + special_tiles = { 'x_farming_pine_nut_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'x_farming:pine_nut_sapling' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'x_farming:pine_nut_leaves' }, + } + } + }, + sounds = x_farming.node_sound_leaves_defaults(), + after_place_node = x_farming.after_place_leaves, + }) + + -- sapling + minetest.register_node('x_farming:pine_nut_sapling', { + description = S('Pine Nut Sapling') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Pine Nut Sapling'), + drawtype = 'plantlike', + tiles = { 'x_farming_pine_nut_sapling.png' }, + inventory_image = 'x_farming_pine_nut_sapling.png', + wield_image = 'x_farming_pine_nut_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = x_farming.grow_pine_nut_tree, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = x_farming.sapling_on_place(itemstack, placer, pointed_thing, + 'x_farming:pine_nut_sapling', + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + { x = -2, y = 1, z = -2 }, + { x = 2, y = 8, z = 2 }, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + if minetest.global_exists('stairs') and minetest.get_modpath('stairs') then + stairs.register_stair_and_slab( + 'pine_nut_wood', + 'x_farming:pine_nut_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'x_farming_pine_nut_wood.png' }, + S('Pine Nut Wooden Stair'), + S('Pine Nut Wooden Slab'), + x_farming.node_sound_wood_defaults(), + false + ) + end + + if minetest.get_modpath('mcl_stairs') then + mcl_stairs.register_stair_and_slab( + 'pine_nut_wood', + 'x_farming:pine_nut_wood', + { handy = 1, axey = 1, building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, flammable = 3, wood = 1, }, + { 'x_farming_pine_nut_wood.png' }, + S('Pine Nut Wooden Stair'), + S('Pine Nut Wooden Slab'), + x_farming.node_sound_wood_defaults(), + 6, + 2, + S('Double Pine Nut Wooden Slab'), + nil + ) + end + + -- planks + minetest.register_node('x_farming:pine_nut_wood', { + description = S('Pine Nut Wood Planks'), + short_description = S('Pine Nut Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'x_farming_pine_nut_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = x_farming.node_sound_wood_defaults(), + }) +end + +-- Ethereal compatibility +if minetest.get_modpath("ethereal") then + minetest.override_item("default:pine_needles",{ + drop = { + max_items = 1, + items = { + {items = {"default:pine_sapling"}, rarity = 20}, + {items = {"default:pine_needles"}} + } + }, + }) + minetest.register_alias_force("ethereal:pine_nuts","x_farming:pine_nut") +end + +-- fruit +local pine_nut_def = { + description = S('Pine Nut') .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Pine Nut'), + drawtype = 'plantlike', + tiles = { 'x_farming_pine_nut.png' }, + inventory_image = 'x_farming_pine_nut_item.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = 'fixed', + fixed = { + -4 / 16, + -5 / 16, + -4 / 16, + 4 / 16, + 7 / 16, + 4 / 16 + } + }, + groups = { + -- MTG + fleshy = 3, + dig_immediate = 3, + leafdecay = 3, + leafdecay_drop = 1, + compost = 65, + -- MCL + handy = 1, + shearsy = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 65, + -- ALL + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.set_node(pos, { name = 'x_farming:pine_nut', param2 = 1 }) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, { name = 'x_farming:pine_nut_mark' }) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +} + +minetest.register_node('x_farming:pine_nut', pine_nut_def) + +local pine_nut_roasted_def = { + description = S('Pine Nut Roasted') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + short_description = S('Pine Nut Roasted'), + inventory_image = 'x_farming_pine_nut_roasted.png', + groups = { + -- MTG + fleshy = 3, + dig_immediate = 3, + compost = 85, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 85, + food = 2, + eatable = 1, + -- ALL + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, +} + +if minetest.get_modpath('farming') then + pine_nut_roasted_def.on_use = minetest.item_eat(2) +end + +if minetest.get_modpath('mcl_farming') then + pine_nut_roasted_def.on_place = minetest.item_eat(2) + pine_nut_roasted_def.on_secondary_use = minetest.item_eat(2) +end + +minetest.register_craftitem('x_farming:pine_nut_roasted', pine_nut_roasted_def) + +minetest.register_node('x_farming:pine_nut_mark', { + description = S('Pine Nut Marker'), + short_description = S('Pine Nut Marker'), + inventory_image = 'x_farming:pine_nut.png^x_farming_invisible_node_overlay.png', + wield_image = 'x_farming:pine_nut.png^x_farming_invisible_node_overlay.png', + drawtype = 'airlike', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = '', + groups = { not_in_creative_inventory = 1 }, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, {'x_farming:pine_nut_leaves',"default:pine_needles"}) then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, { name = 'x_farming:pine_nut' }) + end + end +}) + +-- leafdecay +-- this doesnt do anything since christmas tree is loaded adterwards +-- and is overriding it due to the same trunk + +-- x_farming.register_leafdecay({ +-- trunks = { 'x_farming:pine_nut_tree' }, +-- leaves = { +-- 'x_farming:pine_nut', +-- 'x_farming:pine_nut_leaves' +-- }, +-- radius = 3, +-- }) + +---crate +x_farming.register_crate('crate_pine_nut_3', { + description = S('Pine Nut Crate'), + short_description = S('Pine Nut Crate'), + tiles = { 'x_farming_crate_pine_nut_3.png' }, + _custom = { + crate_item = 'x_farming:pine_nut' + } +}) + +--[[minetest.register_decoration(asuna.features.crops.pine_nut.inject_decoration({ + deco_type = "schematic", + sidelen = 16, + noise_params = { + offset = -0.010, + scale = 0.005, + spread = { x = 100, y = 100, z = 100 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("x_farming") .. '/schematics/x_farming_pine_nut_tree.mts', + flags = 'place_center_x, place_center_z' +}))]] + +-- Mapgen +local c_pine_nut = minetest.get_content_id("x_farming:pine_nut") + +local c_pine_tree = {} +for _,tree in ipairs({ + "default:pine_tree", + "naturalbiomes:alppine1_trunk", + "naturalbiomes:alppine2_trunk", +}) do + c_pine_tree[minetest.get_content_id(tree)] = true +end + +local c_pine_needles = {} +for _,needles in ipairs({ + "default:pine_needles", + "naturalbiomes:alppine1_leaves", + "naturalbiomes:alppine2_leaves", +}) do + c_pine_needles[minetest.get_content_id(needles)] = true +end + +abdecor.register_advanced_decoration("x_farming_pine_nut",{ + target = { + place_on = { + "default:dirt_with_coniferous_litter", + "default:dirt_with_snow", + "naturalbiomes:alpine_litter", + }, + spawn_by = { + "default:pine_tree", + "naturalbiomes:alppine1_trunk", + "naturalbiomes:alppine2_trunk", + }, + num_spawn_by = 1, + fill_ratio = 0.0275, + biomes = asuna.features.crops.pine_nut, + y_min = 5, + y_max = 31000, + sidelen = 80, + }, + fn = function(mapgen) + -- Get provided values + local pos = mapgen.pos + local va = mapgen.voxelarea + local vdata = mapgen.data + + -- Get stride values and adjust position + local ystride = va.ystride + local zstride = va.zstride + pos = va:index(pos.x,pos.y + 1,pos.z) + + -- Align pos with center of tree if possible + local tpos + for x = -1, 1, 1 do + for z = -zstride, zstride, zstride do + tpos = pos + x + z + if c_pine_tree[vdata[tpos]] then + pos = tpos + break + end + end + end + + -- Scan nodes for pine nut placement + local pnpos + local place = {} + for x = -2, 2, 1 do + for z = -2 * zstride, 2 * zstride, zstride do + for y = 0, 11 * ystride, ystride do + pnpos = pos + x + z + y + if vdata[pnpos] == minetest.CONTENT_AIR and c_pine_needles[vdata[pnpos + ystride]] then + table.insert(place,pnpos) + y = y + ystride + end + end + end + end + + -- Ensure that placement locations exist + local p = #place + if p == 0 then + return + end + + -- Place pine nuts at random placement locations + local pcgr = PcgRandom(mapgen.seed) + for i = 1, pcgr:next(1,math.ceil(p / 7)) do + vdata[place[pcgr:next(1,p)]] = c_pine_nut + end + end, +}) \ No newline at end of file diff --git a/mods/x_farming/potato.lua b/mods/x_farming/potato.lua new file mode 100644 index 00000000..1b8bb5eb --- /dev/null +++ b/mods/x_farming/potato.lua @@ -0,0 +1,170 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) +local minlight = 13 +local maxlight = 14 + +-- POTATO +x_farming.register_plant('x_farming:potato', { + description = S('Planting Potato') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Planting Potato'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_potato_seed.png', + steps = 8, + minlight = minlight, + maxlight = maxlight, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 3 +}) + +-- needed +local potato_def = { + description = S('Potato') .. '\n' .. S('Compost chance') .. ': 65%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + short_description = S('Potato'), + groups = { + -- X Farming + compost = 65, + -- MCL + food = 2, + eatable = 1, + compostability = 65, + smoker_cookable = 1 + }, + _mcl_saturation = 0.6 +} + +if minetest.get_modpath('farming') then + potato_def.on_use = minetest.item_eat(2) +end + +if minetest.get_modpath('mcl_farming') then + potato_def.on_place = minetest.item_eat(2) + potato_def.on_secondary_use = minetest.item_eat(2) +end + +minetest.override_item('x_farming:potato', potato_def) + +-- add poisonous potato to drops +minetest.override_item('x_farming:potato_8', { + drop = { + items = { + { items = { 'x_farming:potato' }, rarity = 1 }, + { items = { 'x_farming:potato' }, rarity = 2 }, + { items = { 'x_farming:poisonouspotato' }, rarity = 5 }, + { items = { 'x_farming:seed_potato' }, rarity = 1 }, + { items = { 'x_farming:seed_potato' }, rarity = 2 }, + } + } +}) + +-- Baked Potato +local baked_potato_def = { + description = S('Baked Potato') .. '\n' .. S('Compost chance') .. ': 85%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 6'), + short_description = S('Baked Potato'), + groups = { + -- X Farming + compost = 85, + -- MCL + food = 2, + eatable = 5, + compostability = 85 + }, + inventory_image = 'x_farming_potato_baked.png', + _mcl_saturation = 6.0, +} + +if minetest.get_modpath('farming') then + baked_potato_def.on_use = minetest.item_eat(6) +end + +if minetest.get_modpath('mcl_farming') then + baked_potato_def.on_place = minetest.item_eat(6) + baked_potato_def.on_secondary_use = minetest.item_eat(6) +end + +minetest.register_craftitem('x_farming:bakedpotato', baked_potato_def) + +-- Poisonouos Potato +local poisonouspotato_def = { + description = S('Poisonous Potato') .. '\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': -6'), + inventory_image = 'x_farming_potato_poisonous.png', + groups = { food = 2, eatable = 2 }, + _mcl_saturation = 1.2, +} + +if x_farming.hbhunger ~= nil or x_farming.hunger_ng ~= nil then + poisonouspotato_def.description = poisonouspotato_def.description .. '\n' + .. minetest.colorize(x_farming.colors.green, S('Poison') .. ': 5') +end + +if minetest.get_modpath('farming') then + poisonouspotato_def.on_use = minetest.item_eat(-6) +end + +if minetest.get_modpath('mcl_farming') then + poisonouspotato_def.on_place = minetest.item_eat(-6) + poisonouspotato_def.on_secondary_use = minetest.item_eat(-6) + + minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) + -- 60% chance of poisoning with poisonous potato + if itemstack:get_name() == 'x_farming:poisonouspotato' then + if math.random(1, 10) >= 6 then + mcl_potions.poison_func(user, 1, 5) + end + end + end) +end + +minetest.register_craftitem('x_farming:poisonouspotato', poisonouspotato_def) + +---crate +x_farming.register_crate('crate_potato_3', { + description = S('Potato Crate'), + short_description = S('Potato Crate'), + tiles = { 'x_farming_crate_potato_3.png' }, + _custom = { + crate_item = 'x_farming:potato' + } +}) + +minetest.register_decoration(asuna.features.crops.potato.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1109, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:potato_5", + "x_farming:potato_6", + "x_farming:potato_7", + "x_farming:potato_8", + }, +})) diff --git a/mods/x_farming/pumpkin.lua b/mods/x_farming/pumpkin.lua new file mode 100644 index 00000000..75ff83f9 --- /dev/null +++ b/mods/x_farming/pumpkin.lua @@ -0,0 +1,216 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- PUMPKIN +x_farming.register_plant('x_farming:pumpkin', { + description = S('Pumpkin Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Pumpkin Seed'), + inventory_image = 'x_farming_pumpkin_seed.png', + steps = 8, + minlight = 13, + maxlight = 14, + fertility = { 'grassland', 'desert' }, + groups = { flammable = 4 }, + place_param2 = 3, +}) + +-- PUMPKIN FRUIT - HARVEST +local pumpkin_fruit_def = { + description = S('Pumpkin'), + short_description = S('Pumpkin'), + tiles = { + 'x_farming_pumpkin_fruit_top.png', + 'x_farming_pumpkin_fruit_bottom.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png' + }, + paramtype2 = 'facedir', + sounds = x_farming.node_sound_wood_defaults(), + is_ground_content = false, + groups = { + -- X Farming + pumpkin = 1, + -- MTG + snappy = 3, + flammable = 4, + fall_damage_add_percent = -30, + -- MCL + handy = 1, + axey = 1, + plant = 1, + dig_by_piston = 1, + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + drop = { + max_items = 4, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'x_farming:pumpkin' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + }, + { + items = { 'x_farming:pumpkin' }, -- Items to drop. + rarity = 2, -- Probability of dropping is 1 / rarity. + } + }, + }, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local parent = oldmetadata.fields.parent + local parent_pos_from_child = minetest.string_to_pos(parent) + local parent_node = nil + + -- make sure we have position + if parent_pos_from_child + and parent_pos_from_child ~= nil then + + parent_node = minetest.get_node(parent_pos_from_child) + end + + -- tick parent if parent stem still exists + if parent_node + and parent_node ~= nil + and parent_node.name == 'x_farming:pumpkin_8' then + + x_farming.tick_block(parent_pos_from_child) + end + end +} + +minetest.register_node('x_farming:pumpkin_fruit', pumpkin_fruit_def) + +-- PUMPKIN BLOCK - HARVEST from crops +minetest.register_node('x_farming:pumpkin_block', { + description = S('Pumpkin Block') .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Pumpkin Block'), + tiles = { + 'x_farming_pumpkin_fruit_top.png', + 'x_farming_pumpkin_fruit_bottom.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side_off.png' + }, + paramtype2 = 'facedir', + sounds = x_farming.node_sound_wood_defaults(), + is_ground_content = false, + groups = { + -- X Farming + pumpkin = 1, + -- MTG + snappy = 3, + flammable = 4, + fall_damage_add_percent = -30, + compost = 65, + -- MCL + handy = 1, + axey = 1, + plant = 1, + dig_by_piston = 1, + building_block = 1, + enderman_takable = 1, + compostability = 65 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) + +-- PUMPKIN LANTERN -- from recipe +minetest.register_node('x_farming:pumpkin_lantern', { + description = S('Pumpkin Lantern'), + short_description = S('Pumpkin Lantern'), + tiles = { + 'x_farming_pumpkin_fruit_top.png', + 'x_farming_pumpkin_fruit_bottom.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side.png', + 'x_farming_pumpkin_fruit_side_on.png' + }, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = x_farming.node_sound_wood_defaults(), + is_ground_content = false, + light_source = 12, + drop = 'x_farming:pumpkin_lantern', + groups = { + -- MTG + snappy = 3, + flammable = 4, + fall_damage_add_percent = -30, + -- MCL + handy = 1, + axey = 1, + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) + +-- drop blocks instead of items +minetest.register_alias_force('x_farming:pumpkin', 'x_farming:pumpkin_fruit') + +-- take over the growth from minetest_game farming from here +minetest.override_item('x_farming:pumpkin_8', { + next_plant = 'x_farming:pumpkin_fruit', + on_timer = x_farming.grow_block +}) + +-- replacement LBM for pre-nodetimer plants +minetest.register_lbm({ + name = 'x_farming:start_nodetimer_pumpkin', + nodenames = { 'x_farming:pumpkin_8' }, + action = function(pos, node) + x_farming.tick_block_short(pos) + end, +}) + +---crate +x_farming.register_crate('crate_pumpkin_block_3', { + description = S('Pumpkin Crate'), + short_description = S('Pumpkin Crate'), + tiles = { 'x_farming_crate_pumpkin_block_3.png' }, + _custom = { + crate_item = 'x_farming:pumpkin_block' + } +}) + +minetest.register_decoration(asuna.features.crops.pumpkin.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1110, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:pumpkin_5", + "x_farming:pumpkin_6", + "x_farming:pumpkin_7", + "x_farming:pumpkin_fruit", + }, +})) diff --git a/mods/x_farming/rice.lua b/mods/x_farming/rice.lua new file mode 100644 index 00000000..eef28efc --- /dev/null +++ b/mods/x_farming/rice.lua @@ -0,0 +1,273 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +x_farming.register_plant('x_farming:rice', { + description = S('Rice Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Rice Seed'), + tiles = { 'x_farming_silt_loam_soil.png' }, + inventory_image = 'x_farming_rice_seed_inv.png', + steps = 8, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + drawtype = 'plantlike_rooted', + paramtype2 = 'none', + visual_scale = 3.0, + special_tiles = 'x_farming_rice_seed.png', + node_dig_prediction = 'x_farming:silt_loam_soil', + groups = { attached_node = 0 }, + node_placement_prediction = '', + buildable_to = false, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + selection_box_1 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + selection_box_2 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + selection_box_3 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 2, 4 / 16 }, + }, + }, + selection_box_4 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 2.5, 4 / 16 }, + }, + }, + selection_box_5 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 2.5, 4 / 16 }, + }, + }, + selection_box_6 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 3, 4 / 16 }, + }, + }, + selection_box_7 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 3, 4 / 16 }, + }, + }, + selection_box_8 = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 3, 4 / 16 }, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= 'node' or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + local node_under = minetest.get_node(pos_under) + local def_under = minetest.registered_nodes[node_under.name] + + if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then + return def_under.on_rightclick(pos_under, node_under, placer, itemstack, pointed_thing) or itemstack + end + + local water_above = minetest.find_nodes_in_area( + vector.new(pos_above), + vector.new(pos_above.x, pos_above.y + 2, pos_above.z), + { 'default:water_source' } + ) + + if node_under.name ~= 'x_farming:silt_loam_soil' + or minetest.get_node(pos_above).name ~= 'default:water_source' + or #water_above ~= 1 + then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) + or minetest.is_protected(pos_above, player_name) + then + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + node_under.name = itemstack:get_name() + minetest.set_node(pos_under, node_under) + x_farming.tick(pos_under) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack + end, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, { name = 'x_farming:silt_loam_soil' }) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + -- disable timer for fully grown plant + return + end + + -- grow seed + if minetest.get_item_group(node.name, 'seed') and def.fertility then + local water_above = minetest.find_nodes_in_area( + vector.new(pos), + vector.new(pos.x, pos.y + 2, pos.z), + { 'default:water_source' } + ) + + if #water_above ~= 1 then + x_farming.tick_again(pos) + return + end + -- omitted is a check for light, we assume seeds can germinate in the dark. + local placenode = { name = def.next_plant } + + if def.place_param2 then + placenode.param2 = def.place_param2 + end + + minetest.swap_node(pos, placenode) + + if minetest.registered_nodes[def.next_plant].next_plant then + x_farming.tick(pos) + return + end + + return + end + + -- check if emerged in water + local water_above = minetest.find_nodes_in_area( + vector.new(pos), + vector.new(pos.x, pos.y + 2, pos.z), + { 'default:water_source' } + ) + + local air_above = minetest.find_nodes_in_area( + vector.new(pos), + vector.new(pos.x, pos.y + 3, pos.z), + { 'air' } + ) + + if #water_above ~= 1 or #air_above ~= 2 then + x_farming.tick_again(pos) + return + end + + -- check light + local light = minetest.get_node_light(pos) + + if not light or light < def.minlight or light > def.maxlight then + x_farming.tick_again(pos) + return + end + + -- grow + local placenode = { name = def.next_plant } + + if def.place_param2 then + placenode.param2 = def.place_param2 + end + + minetest.swap_node(pos, placenode) + + -- new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + x_farming.tick(pos) + end + end +}) + +-- Registered before the stairs so the stairs get fuel recipes. +minetest.register_craft({ + type = 'fuel', + recipe = 'x_farming:rice_stack', + burntime = 3, +}) + +if minetest.get_modpath('stairs') then + do + local recipe = 'x_farming:rice' + local groups = { snappy = 3, flammable = 4 } + local images = { 'x_farming_rice_stack_side.png' } + local sounds = x_farming.node_sound_leaves_defaults() + + stairs.register_stair('rice_stack', recipe, groups, images, S('Rice Stack Stair'), + sounds, true) + stairs.register_stair_inner('rice_stack', recipe, groups, images, '', + sounds, true, S('Inner Rice Stack Stair')) + stairs.register_stair_outer('rice_stack', recipe, groups, images, '', + sounds, true, S('Outer Rice Stack Stair')) + stairs.register_slab('rice_stack', recipe, groups, images, S('Rice Stack Slab'), + sounds, true) + end +end + +-- crate +x_farming.register_crate('crate_rice_3', { + description = S('Rice Crate'), + short_description = S('Rice Crate'), + tiles = { 'x_farming_crate_rice_3.png' }, + _custom = { + crate_item = 'x_farming:rice' + } +}) + +-- bag +x_farming.register_bag('bag_rice_grains', { + description = S('Rice Grain') .. ' Bag', + short_description = S('Rice Grain') .. ' Bag', + tiles = { 'x_farming_bag_rice_grains.png' }, + _custom = { + bag_item = 'x_farming:rice_grains' + } +}) \ No newline at end of file diff --git a/mods/x_farming/ropes.lua b/mods/x_farming/ropes.lua new file mode 100644 index 00000000..a2962360 --- /dev/null +++ b/mods/x_farming/ropes.lua @@ -0,0 +1,259 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local function place_rope(pos, itemstack) + local next_node = minetest.get_node(pos) + local stack_name = itemstack:get_name() + + while next_node.name == 'air' and not itemstack:is_empty() do + minetest.set_node(pos, { name = stack_name, param1 = 0 }) + itemstack:take_item() + pos.y = pos.y - 1 + next_node = minetest.get_node(pos) + end + + return itemstack +end + +minetest.register_node('x_farming:rope', { + description = S('Rope\n') .. '. ' .. minetest.colorize('#d0ffd0',S('Place on rope to extend down')), + drawtype = 'plantlike', + walkable = false, + paramtype = 'light', + sunlight_propagates = true, + climbable = true, + wield_scale = { x = 2, y = 2, z = 1 }, + groups = { + -- MTG + snappy = 3, + flammable = 3, + rope = 1, + }, + tiles = { 'x_farming_rope.png' }, + inventory_image = 'x_farming_rope_item.png', + wield_image = 'x_farming_rope_item.png', + selection_box = { + type = 'fixed', + fixed = { -2 / 16, -0.5, -2 / 16, 2 / 16, 0.5, 2 / 16 } + }, + sounds = x_farming.node_sound_rope_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local control = placer:get_player_control() + local pt_pos = minetest.get_pointed_thing_position(pointed_thing) + + if pt_pos and pointed_thing.type == 'node' then + local pt_node = minetest.get_node(pt_pos) + + if minetest.is_protected(pt_pos, placer:get_player_name()) then + return itemstack + end + + local pt_node_def = minetest.registered_nodes[pt_node.name] + + -- check if we have to use default on_place first + if pt_node_def.on_rightclick then + return pt_node_def.on_rightclick(pt_pos, pt_node, placer, itemstack, pointed_thing) + end + end + + -- placing rope on rope + if pt_pos and not control.sneak then + local pt_node = minetest.get_node(pt_pos) + + if minetest.get_item_group(pt_node.name, 'rope') > 0 then + -- add to rope + local _pos = vector.new(pt_pos) + local next_node = minetest.get_node(_pos) + + while minetest.get_item_group(next_node.name, 'rope') > 0 do + _pos.y = _pos.y - 1 + next_node = minetest.get_node(_pos) + end + + return place_rope(_pos, itemstack) + end + end + + if pointed_thing.type == 'node' then + local pos = pointed_thing.above + + if minetest.is_protected(pos, placer:get_player_name()) then + return itemstack + end + + return place_rope(pos, itemstack) + end + + return itemstack + end, + on_punch = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + + local count = 0 + local below = vector.new(pos) + local node_below = minetest.get_node(below) + + while minetest.get_item_group(node_below.name, 'rope') > 0 do + minetest.remove_node(below) + below.y = below.y - 1 + count = count + 1 + node_below = minetest.get_node(below) + end + + if count == 0 then + return + end + + local stacks = {} + local node_stack = ItemStack({ name = node.name }) + local stack_max = node_stack:get_stack_max() + local stack_count = count + + if stack_count > stack_max then + while stack_count > 0 do + if stack_count > stack_max then + stack_count = stack_count - stack_max + table.insert(stacks, ItemStack({ name = node.name, count = stack_max })) + else + table.insert(stacks, ItemStack({ name = node.name, count = stack_count })) + stack_count = 0 + end + end + else + table.insert(stacks, ItemStack({ name = node.name, count = count })) + end + + local inv = puncher:get_inventory() + + for _, stack in ipairs(stacks) do + if inv and inv:room_for_item('main', stack) then + inv:add_item('main', stack) + else + -- drop on the ground + minetest.add_item(puncher:get_pos(), stack) + end + end + + return true + end, +}) + +minetest.register_node('x_farming:safety_net', { + description = S('Safety Net. No fall damage when landing on this net.'), + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -7 / 16, 8 / 16 }, + }, + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -6 / 16, 8 / 16 } + }, + tiles = { + 'x_farming_safety_net.png', + 'x_farming_safety_net.png', + 'x_farming_safety_net_side.png', + }, + use_texture_alpha = 'clip', + wield_image = 'x_farming_safety_net.png', + inventory_image = 'x_farming_safety_net.png', + paramtype = 'light', + sunlight_propagates = true, + wield_scale = { x = 2, y = 2, z = 1 }, + groups = { + -- MTG + snappy = 3, + flammable = 3, + bouncy = 33, + fall_damage_add_percent = -100, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1 + }, + _mcl_hardness = 0.2, + sounds = x_farming.node_sound_rope_defaults() +}) + +minetest.register_node('x_farming:rope_fence', { + description = S('Rope') .. ' ' .. S('Fence'), + drawtype = 'nodebox', + paramtype = 'light', + climbable = true, + wield_scale = { x = 2, y = 2, z = 1 }, + node_box = { + type = 'connected', + fixed = { -1 / 16, -1 / 2, -1 / 16, 1 / 16, 1 / 2, 1 / 16 }, + -- connect_top = + -- connect_bottom = + connect_front = { + { 0, -8 / 16, -8 / 16, 0, 7 / 16, -1 / 16 } + }, + connect_left = { + { -1 / 2, -1 / 2, 0, -1 / 16, 7 / 16, 0 } + }, + connect_back = { + { 0, -8 / 16, 1 / 16, 0, 7 / 16, 1 / 2 } + }, + connect_right = { + { 1 / 16, -1 / 2, 0, 1 / 2, 7 / 16, 0 } + } + }, + collision_box = { + type = 'connected', + fixed = { -1 / 8, -1 / 2, -1 / 8, 1 / 8, 1 / 2, 1 / 8 }, + -- connect_top = + -- connect_bottom = + connect_front = { -1 / 8, -1 / 2, -1 / 2, 1 / 8, 1 / 2, -1 / 8 }, + connect_left = { -1 / 2, -1 / 2, -1 / 8, -1 / 8, 1 / 2, 1 / 8 }, + connect_back = { -1 / 8, -1 / 2, 1 / 8, 1 / 8, 1 / 2, 1 / 2 }, + connect_right = { 1 / 8, -1 / 2, -1 / 8, 1 / 2, 1 / 2, 1 / 8 } + }, + connects_to = { + -- MTG + 'group:fence', + 'group:wood', + 'group:tree', + 'group:wall', + 'group:stone', + }, + inventory_image = 'x_farming_rope_fence_item.png', + wield_image = 'x_farming_rope_fence_item.png', + tiles = { 'x_farming_rope_fence.png' }, + use_texture_alpha = 'clip', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + fence = 1, + snappy = 3, + flammable = 2, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1 + }, + _mcl_hardness = 0.2, + sounds = x_farming.node_sound_rope_defaults() +}) diff --git a/mods/x_farming/salt.lua b/mods/x_farming/salt.lua new file mode 100644 index 00000000..35da3036 --- /dev/null +++ b/mods/x_farming/salt.lua @@ -0,0 +1,741 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- how often a growth failure tick is retried (e.g. too dark) +local function tick_again(pos) + minetest.get_node_timer(pos):start(math.random(80, 160)) +end + +-- SALT +minetest.register_craftitem('x_farming:salt', { + description = S('Salt'), + short_description = S('Salt'), + tiles = { 'x_farming_salt.png' }, + inventory_image = 'x_farming_salt.png', + wield_image = 'x_farming_salt.png' +}) + +minetest.register_node('x_farming:seed_salt', { + description = S('Salty Water (plant soil)'), + short_description = S('Salty Water (plant soil)'), + inventory_image = 'x_farming_salt_water.png', + wield_image = 'x_farming_salt_water.png', + fertility = { 'grassland' }, + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_1_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png' + }, + use_texture_alpha = 'clip', + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + seed = 1, + snappy = 3, + flammable = 2, + plant = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_1', + on_timer = x_farming.grow_plant, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick + and not (placer and placer:is_player() + and placer:get_player_control().sneak) + then + return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack + end + + return x_farming.place_seed(itemstack, placer, pointed_thing, 'x_farming:seed_salt') + end, +}) + +-- 1 +minetest.register_node('x_farming:salt_1', { + description = S('Salt') .. ' 1', + short_description = S('Salt') .. ' 1', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_1_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 8 }, + { items = { 'x_farming:seed_salt' }, rarity = 8 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_2', + on_timer = x_farming.grow_plant, + minlight = 13, + maxlight = 15 +}) + +-- 2 +minetest.register_node('x_farming:salt_2', { + description = S('Salt') .. ' 2', + short_description = S('Salt') .. ' 2', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_2_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png', + 'x_farming_salt_1_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 7 }, + { items = { 'x_farming:seed_salt' }, rarity = 7 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_3', + on_timer = x_farming.grow_plant, + minlight = 13, + maxlight = 15 +}) + +-- 3 +minetest.register_node('x_farming:salt_3', { + description = S('Salt') .. ' 3', + short_description = S('Salt') .. ' 3', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_2_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_2_side.png', + 'x_farming_salt_2_side.png', + 'x_farming_salt_2_side.png', + 'x_farming_salt_2_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 6 }, + { items = { 'x_farming:seed_salt' }, rarity = 6 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.0625, -0.5, -0.0625, 0.0625, -0.25, 0.0625 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_4', + on_timer = x_farming.grow_plant, + minlight = 13, + maxlight = 15 +}) + +-- 4 +minetest.register_node('x_farming:salt_4', { + description = S('Salt') .. ' 4', + short_description = S('Salt') .. ' 4', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_3_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_2_side.png', + 'x_farming_salt_2_side.png', + 'x_farming_salt_2_side.png', + 'x_farming_salt_2_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 5 }, + { items = { 'x_farming:seed_salt' }, rarity = 5 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.0625, -0.5, -0.0625, 0.0625, -0.25, 0.0625 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_5', + on_timer = x_farming.grow_plant, + minlight = 13, + maxlight = 15 +}) + +-- 5 +minetest.register_node('x_farming:salt_5', { + description = S('Salt') .. ' 5', + short_description = S('Salt') .. ' 5', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_3_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_3_side.png', + 'x_farming_salt_3_side.png', + 'x_farming_salt_3_side.png', + 'x_farming_salt_3_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 4 }, + { items = { 'x_farming:seed_salt' }, rarity = 4 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.1875, -0.375, -0.1875, 0.1875, -0.25, 0.1875 }, + { -0.0625, -0.25, -0.0625, 0.0625, -0.125, 0.0625 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_6', + on_timer = x_farming.grow_plant, + minlight = 13, + maxlight = 15 +}) + +-- 6 +minetest.register_node('x_farming:salt_6', { + description = S('Salt') .. ' 6', + short_description = S('Salt') .. ' 6', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_4_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_3_side.png', + 'x_farming_salt_3_side.png', + 'x_farming_salt_3_side.png', + 'x_farming_salt_3_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 3 }, + { items = { 'x_farming:seed_salt' }, rarity = 3 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.1875, -0.375, -0.1875, 0.1875, -0.25, 0.1875 }, + { -0.0625, -0.25, -0.0625, 0.0625, -0.125, 0.0625 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + next_plant = 'x_farming:salt_7', + on_timer = x_farming.grow_plant, + minlight = 13, + maxlight = 15 +}) + +-- 7 +minetest.register_node('x_farming:salt_7', { + description = S('Salt') .. ' 7', + short_description = S('Salt') .. ' 7', + drawtype = 'nodebox', + tiles = { + { + name = "x_farming_salt_4_top.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + 'x_farming_salt_1_bottom.png', + 'x_farming_salt_4_side.png', + 'x_farming_salt_4_side.png', + 'x_farming_salt_4_side.png', + 'x_farming_salt_4_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + on_rotate = function(pos, node, user, mode, new_param2) + return false + end, + is_ground_content = false, + walkable = false, + buildable_to = true, + drop = { + items = { + { items = { 'x_farming:salt' }, rarity = 1 }, + { items = { 'x_farming:salt' }, rarity = 2 }, + { items = { 'x_farming:seed_salt' }, rarity = 1 }, + { items = { 'x_farming:seed_salt' }, rarity = 2 }, + } + }, + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.3125, -0.5, -0.3125, 0.3125, -0.25, 0.3125 }, + { -0.1875, -0.5, -0.1875, 0.1875, -0.125, 0.1875 }, + { -0.0625, -0.5, -0.0625, 0.0625, 0, 0.0625 }, + } + }, + collision_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + }, + }, + groups = { + -- MTG + snappy = 3, + flammable = 2, + plant = 1, + not_in_creative_inventory = 1, + attached_node = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = x_farming.node_sound_leaves_defaults(), + minlight = 13, + maxlight = 15 +}) + +-- replacement LBM for pre-nodetimer plants +minetest.register_lbm({ + name = 'x_farming:start_nodetimer_salt', + nodenames = { + 'x_farming:seed_salt', + 'x_farming:salt_1', + 'x_farming:salt_2', + 'x_farming:salt_3', + 'x_farming:salt_4', + 'x_farming:salt_5', + 'x_farming:salt_6', + }, + action = function(pos, node) + tick_again(pos) + end, +}) + +---bag +x_farming.register_bag('bag_salt', { + description = S('Salt') .. ' Bag', + short_description = S('Salt') .. ' Bag', + tiles = { 'x_farming_bag_salt.png' }, + _custom = { + bag_item = 'x_farming:salt' + } +}) + +minetest.register_on_mods_loaded(function() + local deco_place_on = {} + local deco_biomes = {} + + -- MTG + if minetest.get_modpath('default') then + table.insert(deco_place_on, 'default:dirt') + table.insert(deco_place_on, 'default:dry_dirt') + table.insert(deco_biomes, 'rainforest_swamp') + table.insert(deco_biomes, 'savanna_shore') + end + + -- MCL + if minetest.get_modpath('mcl_core') then + table.insert(deco_place_on, 'mcl_core:sand') + table.insert(deco_biomes, 'Savanna_beach') + end + + if next(deco_place_on) and next(deco_biomes) then + minetest.register_decoration({ + name = 'x_farming:salt', + deco_type = 'schematic', + place_on = deco_place_on, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = { x = 200, y = 200, z = 200 }, + seed = 354, + octaves = 3, + persist = 0.7 + }, + biomes = deco_biomes, + y_max = 0, + y_min = 0, + schematic = minetest.get_modpath('x_farming') .. '/schematics/x_farming_salt_decor.mts', + }) + end +end) diff --git a/mods/x_farming/schematics/x_farming_christmas_tree.mts b/mods/x_farming/schematics/x_farming_christmas_tree.mts new file mode 100644 index 00000000..d328a33a Binary files /dev/null and b/mods/x_farming/schematics/x_farming_christmas_tree.mts differ diff --git a/mods/x_farming/schematics/x_farming_christmas_tree_large.mts b/mods/x_farming/schematics/x_farming_christmas_tree_large.mts new file mode 100644 index 00000000..b11d37d1 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_christmas_tree_large.mts differ diff --git a/mods/x_farming/schematics/x_farming_icefishing.mts b/mods/x_farming/schematics/x_farming_icefishing.mts new file mode 100644 index 00000000..0bfc4bb7 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_icefishing.mts differ diff --git a/mods/x_farming/schematics/x_farming_jungle_tree_with_cocoa.mts b/mods/x_farming/schematics/x_farming_jungle_tree_with_cocoa.mts new file mode 100644 index 00000000..c2ce7e4e Binary files /dev/null and b/mods/x_farming/schematics/x_farming_jungle_tree_with_cocoa.mts differ diff --git a/mods/x_farming/schematics/x_farming_jungle_tree_with_cocoa_from_sapling.mts b/mods/x_farming/schematics/x_farming_jungle_tree_with_cocoa_from_sapling.mts new file mode 100644 index 00000000..73bee9a9 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_jungle_tree_with_cocoa_from_sapling.mts differ diff --git a/mods/x_farming/schematics/x_farming_kiwi_tree.mts b/mods/x_farming/schematics/x_farming_kiwi_tree.mts new file mode 100644 index 00000000..26baab3f Binary files /dev/null and b/mods/x_farming/schematics/x_farming_kiwi_tree.mts differ diff --git a/mods/x_farming/schematics/x_farming_kiwi_tree_from_sapling.mts b/mods/x_farming/schematics/x_farming_kiwi_tree_from_sapling.mts new file mode 100644 index 00000000..1ffee690 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_kiwi_tree_from_sapling.mts differ diff --git a/mods/x_farming/schematics/x_farming_large_cactus.mts b/mods/x_farming/schematics/x_farming_large_cactus.mts new file mode 100644 index 00000000..99dc6434 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_large_cactus.mts differ diff --git a/mods/x_farming/schematics/x_farming_large_cactus_from_seedling.mts b/mods/x_farming/schematics/x_farming_large_cactus_from_seedling.mts new file mode 100644 index 00000000..165e1bc8 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_large_cactus_from_seedling.mts differ diff --git a/mods/x_farming/schematics/x_farming_pine_nut_tree.mts b/mods/x_farming/schematics/x_farming_pine_nut_tree.mts new file mode 100644 index 00000000..ce4af49a Binary files /dev/null and b/mods/x_farming/schematics/x_farming_pine_nut_tree.mts differ diff --git a/mods/x_farming/schematics/x_farming_pine_nut_tree_from_sapling.mts b/mods/x_farming/schematics/x_farming_pine_nut_tree_from_sapling.mts new file mode 100644 index 00000000..98717853 Binary files /dev/null and b/mods/x_farming/schematics/x_farming_pine_nut_tree_from_sapling.mts differ diff --git a/mods/x_farming/schematics/x_farming_salt_decor.mts b/mods/x_farming/schematics/x_farming_salt_decor.mts new file mode 100644 index 00000000..a0c380bb Binary files /dev/null and b/mods/x_farming/schematics/x_farming_salt_decor.mts differ diff --git a/mods/x_farming/seeds.lua b/mods/x_farming/seeds.lua new file mode 100644 index 00000000..184734bf --- /dev/null +++ b/mods/x_farming/seeds.lua @@ -0,0 +1,35 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- Register farming items as dungeon loot +if minetest.global_exists('dungeon_loot') then + dungeon_loot.register({ + { name = 'x_farming:seed_obsidian_wart', chance = 0.3, count = { 1, 2 } }, + { name = 'x_farming:seed_pumpkin', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:seed_beetroot', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:seed_carrot', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:seed_potato', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:seed_coffee', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:seed_corn', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:seed_melon', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:cocoa_bean', chance = 0.4, count = { 1, 4 } }, + { name = 'x_farming:large_cactus_with_fruit_seedling', chance = 0.4, count = { 1, 1 } }, + { name = 'x_farming:kiwi_sapling', chance = 0.4, count = { 1, 1 } }, + { name = 'x_farming:seed_strawberry', chance = 0.4, count = { 1, 4 } }, + }) +end diff --git a/mods/x_farming/sounds/x_farming_bee.1.ogg b/mods/x_farming/sounds/x_farming_bee.1.ogg new file mode 100644 index 00000000..3bd495ca Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_bee.2.ogg b/mods/x_farming/sounds/x_farming_bee.2.ogg new file mode 100644 index 00000000..bbc7ab87 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_bee.3.ogg b/mods/x_farming/sounds/x_farming_bee.3.ogg new file mode 100644 index 00000000..5e2f7568 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_bee.4.ogg b/mods/x_farming/sounds/x_farming_bee.4.ogg new file mode 100644 index 00000000..e391d5dd Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_bee.5.ogg b/mods/x_farming/sounds/x_farming_bee.5.ogg new file mode 100644 index 00000000..9688509d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.5.ogg differ diff --git a/mods/x_farming/sounds/x_farming_bee.6.ogg b/mods/x_farming/sounds/x_farming_bee.6.ogg new file mode 100644 index 00000000..9fefbfb0 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.6.ogg differ diff --git a/mods/x_farming/sounds/x_farming_bee.7.ogg b/mods/x_farming/sounds/x_farming_bee.7.ogg new file mode 100644 index 00000000..c51b71f9 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_bee.7.ogg differ diff --git a/mods/x_farming/sounds/x_farming_break_thin_glass.1.ogg b/mods/x_farming/sounds/x_farming_break_thin_glass.1.ogg new file mode 100644 index 00000000..b1ccc5fa Binary files /dev/null and b/mods/x_farming/sounds/x_farming_break_thin_glass.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_break_thin_glass.2.ogg b/mods/x_farming/sounds/x_farming_break_thin_glass.2.ogg new file mode 100644 index 00000000..b6cc9e85 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_break_thin_glass.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_break_thin_glass.3.ogg b/mods/x_farming/sounds/x_farming_break_thin_glass.3.ogg new file mode 100644 index 00000000..ae6a6bfc Binary files /dev/null and b/mods/x_farming/sounds/x_farming_break_thin_glass.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_footstep.1.ogg b/mods/x_farming/sounds/x_farming_dirt_footstep.1.ogg new file mode 100644 index 00000000..86c0822e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_footstep.2.ogg b/mods/x_farming/sounds/x_farming_dirt_footstep.2.ogg new file mode 100644 index 00000000..d505aa75 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_footstep.3.ogg b/mods/x_farming/sounds/x_farming_dirt_footstep.3.ogg new file mode 100644 index 00000000..98d60c1f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_footstep.4.ogg b/mods/x_farming/sounds/x_farming_dirt_footstep.4.ogg new file mode 100644 index 00000000..ec507f41 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_hit.1.ogg b/mods/x_farming/sounds/x_farming_dirt_hit.1.ogg new file mode 100644 index 00000000..4ef4f291 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_hit.2.ogg b/mods/x_farming/sounds/x_farming_dirt_hit.2.ogg new file mode 100644 index 00000000..2ee8f6b5 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_dirt_hit.3.ogg b/mods/x_farming/sounds/x_farming_dirt_hit.3.ogg new file mode 100644 index 00000000..34fff6ba Binary files /dev/null and b/mods/x_farming/sounds/x_farming_dirt_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_extinguish_candle.ogg b/mods/x_farming/sounds/x_farming_extinguish_candle.ogg new file mode 100644 index 00000000..070e7e18 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_extinguish_candle.ogg differ diff --git a/mods/x_farming/sounds/x_farming_glass_place.1.ogg b/mods/x_farming/sounds/x_farming_glass_place.1.ogg new file mode 100644 index 00000000..14ae30de Binary files /dev/null and b/mods/x_farming/sounds/x_farming_glass_place.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_glass_place.2.ogg b/mods/x_farming/sounds/x_farming_glass_place.2.ogg new file mode 100644 index 00000000..7e3b2186 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_glass_place.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_glass_place.3.ogg b/mods/x_farming/sounds/x_farming_glass_place.3.ogg new file mode 100644 index 00000000..6cbafbf1 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_glass_place.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_grass_footstep.1.ogg b/mods/x_farming/sounds/x_farming_grass_footstep.1.ogg new file mode 100644 index 00000000..e38cbd3e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_grass_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_grass_footstep.2.ogg b/mods/x_farming/sounds/x_farming_grass_footstep.2.ogg new file mode 100644 index 00000000..4a5f2998 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_grass_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_grass_footstep.3.ogg b/mods/x_farming/sounds/x_farming_grass_footstep.3.ogg new file mode 100644 index 00000000..d4ff286f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_grass_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_grass_hit.1.ogg b/mods/x_farming/sounds/x_farming_grass_hit.1.ogg new file mode 100644 index 00000000..b26df594 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_grass_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_grass_hit.2.ogg b/mods/x_farming/sounds/x_farming_grass_hit.2.ogg new file mode 100644 index 00000000..31ffa28c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_grass_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_grass_hit.3.ogg b/mods/x_farming/sounds/x_farming_grass_hit.3.ogg new file mode 100644 index 00000000..d52bca1d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_grass_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_dug.ogg b/mods/x_farming/sounds/x_farming_ice_dug.ogg new file mode 100644 index 00000000..ae37673e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_dug.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_footstep.1.ogg b/mods/x_farming/sounds/x_farming_ice_footstep.1.ogg new file mode 100644 index 00000000..5445c0b9 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_footstep.2.ogg b/mods/x_farming/sounds/x_farming_ice_footstep.2.ogg new file mode 100644 index 00000000..d49fa7bb Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_footstep.3.ogg b/mods/x_farming/sounds/x_farming_ice_footstep.3.ogg new file mode 100644 index 00000000..5c1feb9f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_footstep.4.ogg b/mods/x_farming/sounds/x_farming_ice_footstep.4.ogg new file mode 100644 index 00000000..78994f58 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_hit.1.ogg b/mods/x_farming/sounds/x_farming_ice_hit.1.ogg new file mode 100644 index 00000000..448328a0 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_hit.2.ogg b/mods/x_farming/sounds/x_farming_ice_hit.2.ogg new file mode 100644 index 00000000..97e6ad66 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_hit.3.ogg b/mods/x_farming/sounds/x_farming_ice_hit.3.ogg new file mode 100644 index 00000000..5416bd00 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_ice_hit.4.ogg b/mods/x_farming/sounds/x_farming_ice_hit.4.ogg new file mode 100644 index 00000000..a57fdc63 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_ice_hit.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_dug.1.ogg b/mods/x_farming/sounds/x_farming_leaves_dug.1.ogg new file mode 100644 index 00000000..61ff7352 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_dug.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_dug.2.ogg b/mods/x_farming/sounds/x_farming_leaves_dug.2.ogg new file mode 100644 index 00000000..03fbc87c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_dug.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_footstep.1.ogg b/mods/x_farming/sounds/x_farming_leaves_footstep.1.ogg new file mode 100644 index 00000000..4479f8d8 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_footstep.2.ogg b/mods/x_farming/sounds/x_farming_leaves_footstep.2.ogg new file mode 100644 index 00000000..bda1195b Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_footstep.3.ogg b/mods/x_farming/sounds/x_farming_leaves_footstep.3.ogg new file mode 100644 index 00000000..ddc0dc27 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_footstep.4.ogg b/mods/x_farming/sounds/x_farming_leaves_footstep.4.ogg new file mode 100644 index 00000000..eb7a6096 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_hit.1.ogg b/mods/x_farming/sounds/x_farming_leaves_hit.1.ogg new file mode 100644 index 00000000..3160d1d3 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_hit.2.ogg b/mods/x_farming/sounds/x_farming_leaves_hit.2.ogg new file mode 100644 index 00000000..ccc9475b Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_place.1.ogg b/mods/x_farming/sounds/x_farming_leaves_place.1.ogg new file mode 100644 index 00000000..7fd7b645 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_place.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_leaves_place.2.ogg b/mods/x_farming/sounds/x_farming_leaves_place.2.ogg new file mode 100644 index 00000000..00b7c224 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_leaves_place.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_dug.1.ogg b/mods/x_farming/sounds/x_farming_pillow_dug.1.ogg new file mode 100644 index 00000000..d375dcf9 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_dug.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_dug.2.ogg b/mods/x_farming/sounds/x_farming_pillow_dug.2.ogg new file mode 100644 index 00000000..bd078ccd Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_dug.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_dug.3.ogg b/mods/x_farming/sounds/x_farming_pillow_dug.3.ogg new file mode 100644 index 00000000..03784a1f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_dug.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_footstep.1.ogg b/mods/x_farming/sounds/x_farming_pillow_footstep.1.ogg new file mode 100644 index 00000000..41321632 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_footstep.2.ogg b/mods/x_farming/sounds/x_farming_pillow_footstep.2.ogg new file mode 100644 index 00000000..20670f61 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_footstep.3.ogg b/mods/x_farming/sounds/x_farming_pillow_footstep.3.ogg new file mode 100644 index 00000000..4e1b32ab Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_footstep.4.ogg b/mods/x_farming/sounds/x_farming_pillow_footstep.4.ogg new file mode 100644 index 00000000..20513fdd Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_hit.1.ogg b/mods/x_farming/sounds/x_farming_pillow_hit.1.ogg new file mode 100644 index 00000000..c87e3d59 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_hit.2.ogg b/mods/x_farming/sounds/x_farming_pillow_hit.2.ogg new file mode 100644 index 00000000..ad374b2d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_hit.3.ogg b/mods/x_farming/sounds/x_farming_pillow_hit.3.ogg new file mode 100644 index 00000000..2dd4f08a Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_pillow_hit.4.ogg b/mods/x_farming/sounds/x_farming_pillow_hit.4.ogg new file mode 100644 index 00000000..b1ca5e12 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_pillow_hit.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_dug.1.ogg b/mods/x_farming/sounds/x_farming_rope_dug.1.ogg new file mode 100644 index 00000000..1537dd53 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_dug.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_dug.2.ogg b/mods/x_farming/sounds/x_farming_rope_dug.2.ogg new file mode 100644 index 00000000..cdc248c5 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_dug.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_dug.3.ogg b/mods/x_farming/sounds/x_farming_rope_dug.3.ogg new file mode 100644 index 00000000..c6d13cba Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_dug.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_footstep.1.ogg b/mods/x_farming/sounds/x_farming_rope_footstep.1.ogg new file mode 100644 index 00000000..1ae5f0ac Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_footstep.2.ogg b/mods/x_farming/sounds/x_farming_rope_footstep.2.ogg new file mode 100644 index 00000000..6a8686b2 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_footstep.3.ogg b/mods/x_farming/sounds/x_farming_rope_footstep.3.ogg new file mode 100644 index 00000000..d362f3fe Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_footstep.4.ogg b/mods/x_farming/sounds/x_farming_rope_footstep.4.ogg new file mode 100644 index 00000000..d8574747 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_hit.1.ogg b/mods/x_farming/sounds/x_farming_rope_hit.1.ogg new file mode 100644 index 00000000..b6181160 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_hit.2.ogg b/mods/x_farming/sounds/x_farming_rope_hit.2.ogg new file mode 100644 index 00000000..9514145e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_hit.3.ogg b/mods/x_farming/sounds/x_farming_rope_hit.3.ogg new file mode 100644 index 00000000..c10f0efc Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_rope_hit.4.ogg b/mods/x_farming/sounds/x_farming_rope_hit.4.ogg new file mode 100644 index 00000000..c0a8982a Binary files /dev/null and b/mods/x_farming/sounds/x_farming_rope_hit.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_dug.1.ogg b/mods/x_farming/sounds/x_farming_sand_dug.1.ogg new file mode 100644 index 00000000..648b998e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_dug.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_dug.2.ogg b/mods/x_farming/sounds/x_farming_sand_dug.2.ogg new file mode 100644 index 00000000..bfb6a386 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_dug.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_dug.3.ogg b/mods/x_farming/sounds/x_farming_sand_dug.3.ogg new file mode 100644 index 00000000..4cdfc821 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_dug.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_footstep.1.ogg b/mods/x_farming/sounds/x_farming_sand_footstep.1.ogg new file mode 100644 index 00000000..c5331b38 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_footstep.2.ogg b/mods/x_farming/sounds/x_farming_sand_footstep.2.ogg new file mode 100644 index 00000000..e6e019d7 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_footstep.3.ogg b/mods/x_farming/sounds/x_farming_sand_footstep.3.ogg new file mode 100644 index 00000000..9da9245c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_hit.1.ogg b/mods/x_farming/sounds/x_farming_sand_hit.1.ogg new file mode 100644 index 00000000..2175d5a0 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_hit.2.ogg b/mods/x_farming/sounds/x_farming_sand_hit.2.ogg new file mode 100644 index 00000000..9393691b Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_hit.3.ogg b/mods/x_farming/sounds/x_farming_sand_hit.3.ogg new file mode 100644 index 00000000..05f4863a Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_place.1.ogg b/mods/x_farming/sounds/x_farming_sand_place.1.ogg new file mode 100644 index 00000000..4101051d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_place.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_place.2.ogg b/mods/x_farming/sounds/x_farming_sand_place.2.ogg new file mode 100644 index 00000000..5aef765e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_place.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_place.3.ogg b/mods/x_farming/sounds/x_farming_sand_place.3.ogg new file mode 100644 index 00000000..15f139ac Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_place.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_place.4.ogg b/mods/x_farming/sounds/x_farming_sand_place.4.ogg new file mode 100644 index 00000000..e307eafc Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_place.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_sand_place.5.ogg b/mods/x_farming/sounds/x_farming_sand_place.5.ogg new file mode 100644 index 00000000..0f17bd07 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_sand_place.5.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_dig.1.ogg b/mods/x_farming/sounds/x_farming_slime_dig.1.ogg new file mode 100644 index 00000000..799155ed Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_dig.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_dig.2.ogg b/mods/x_farming/sounds/x_farming_slime_dig.2.ogg new file mode 100644 index 00000000..f123d32e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_dig.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_dig.3.ogg b/mods/x_farming/sounds/x_farming_slime_dig.3.ogg new file mode 100644 index 00000000..01c704fb Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_dig.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_dug.1.ogg b/mods/x_farming/sounds/x_farming_slime_dug.1.ogg new file mode 100644 index 00000000..d27dbf71 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_dug.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_dug.2.ogg b/mods/x_farming/sounds/x_farming_slime_dug.2.ogg new file mode 100644 index 00000000..603b3e87 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_dug.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_dug.3.ogg b/mods/x_farming/sounds/x_farming_slime_dug.3.ogg new file mode 100644 index 00000000..2b6ccfa1 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_dug.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_footstep.1.ogg b/mods/x_farming/sounds/x_farming_slime_footstep.1.ogg new file mode 100644 index 00000000..7d2835cc Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_footstep.2.ogg b/mods/x_farming/sounds/x_farming_slime_footstep.2.ogg new file mode 100644 index 00000000..229482a7 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_footstep.3.ogg b/mods/x_farming/sounds/x_farming_slime_footstep.3.ogg new file mode 100644 index 00000000..4fed4c3c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_slime_footstep.4.ogg b/mods/x_farming/sounds/x_farming_slime_footstep.4.ogg new file mode 100644 index 00000000..a0f3d810 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_slime_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_dug.1.ogg b/mods/x_farming/sounds/x_farming_stone_dug.1.ogg new file mode 100644 index 00000000..b34e0f5a Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_dug.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_dug.2.ogg b/mods/x_farming/sounds/x_farming_stone_dug.2.ogg new file mode 100644 index 00000000..d4eaf15c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_dug.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_dug.3.ogg b/mods/x_farming/sounds/x_farming_stone_dug.3.ogg new file mode 100644 index 00000000..b19b449f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_dug.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_footstep.1.ogg b/mods/x_farming/sounds/x_farming_stone_footstep.1.ogg new file mode 100644 index 00000000..6ecd9a23 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_footstep.2.ogg b/mods/x_farming/sounds/x_farming_stone_footstep.2.ogg new file mode 100644 index 00000000..d3f9ebf5 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_footstep.3.ogg b/mods/x_farming/sounds/x_farming_stone_footstep.3.ogg new file mode 100644 index 00000000..abafae2f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_footstep.4.ogg b/mods/x_farming/sounds/x_farming_stone_footstep.4.ogg new file mode 100644 index 00000000..653e236f Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_footstep.5.ogg b/mods/x_farming/sounds/x_farming_stone_footstep.5.ogg new file mode 100644 index 00000000..07b1b74c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_footstep.5.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_hit.1.ogg b/mods/x_farming/sounds/x_farming_stone_hit.1.ogg new file mode 100644 index 00000000..5cfbbecd Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_hit.2.ogg b/mods/x_farming/sounds/x_farming_stone_hit.2.ogg new file mode 100644 index 00000000..414a35ee Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_hit.3.ogg b/mods/x_farming/sounds/x_farming_stone_hit.3.ogg new file mode 100644 index 00000000..4116ce10 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_place.1.ogg b/mods/x_farming/sounds/x_farming_stone_place.1.ogg new file mode 100644 index 00000000..726c5141 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_place.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_place.2.ogg b/mods/x_farming/sounds/x_farming_stone_place.2.ogg new file mode 100644 index 00000000..237cf37d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_place.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_place.3.ogg b/mods/x_farming/sounds/x_farming_stone_place.3.ogg new file mode 100644 index 00000000..848ea5f2 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_place.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stone_place.4.ogg b/mods/x_farming/sounds/x_farming_stone_place.4.ogg new file mode 100644 index 00000000..1c235690 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stone_place.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_active.ogg b/mods/x_farming/sounds/x_farming_stove_active.ogg new file mode 100644 index 00000000..5ce74b2e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_active.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_sizzle.1.ogg b/mods/x_farming/sounds/x_farming_stove_sizzle.1.ogg new file mode 100644 index 00000000..b8dc5bd9 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_sizzle.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_sizzle.2.ogg b/mods/x_farming/sounds/x_farming_stove_sizzle.2.ogg new file mode 100644 index 00000000..26362248 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_sizzle.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_sizzle.3.ogg b/mods/x_farming/sounds/x_farming_stove_sizzle.3.ogg new file mode 100644 index 00000000..2a83774d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_sizzle.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_sizzle_put.1.ogg b/mods/x_farming/sounds/x_farming_stove_sizzle_put.1.ogg new file mode 100644 index 00000000..a0925a45 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_sizzle_put.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_sizzle_put.2.ogg b/mods/x_farming/sounds/x_farming_stove_sizzle_put.2.ogg new file mode 100644 index 00000000..4636d1ef Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_sizzle_put.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_stove_sizzle_put.3.ogg b/mods/x_farming/sounds/x_farming_stove_sizzle_put.3.ogg new file mode 100644 index 00000000..1e01034b Binary files /dev/null and b/mods/x_farming/sounds/x_farming_stove_sizzle_put.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_thin_glass_footstep.ogg b/mods/x_farming/sounds/x_farming_thin_glass_footstep.ogg new file mode 100644 index 00000000..191287a3 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_thin_glass_footstep.ogg differ diff --git a/mods/x_farming/sounds/x_farming_tool_breaks.1.ogg b/mods/x_farming/sounds/x_farming_tool_breaks.1.ogg new file mode 100644 index 00000000..2a571ae2 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_tool_breaks.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_tool_breaks.2.ogg b/mods/x_farming/sounds/x_farming_tool_breaks.2.ogg new file mode 100644 index 00000000..17893520 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_tool_breaks.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_tool_breaks.3.ogg b/mods/x_farming/sounds/x_farming_tool_breaks.3.ogg new file mode 100644 index 00000000..a99c4b7e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_tool_breaks.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_footstep.1.ogg b/mods/x_farming/sounds/x_farming_wood_footstep.1.ogg new file mode 100644 index 00000000..0ed642bc Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_footstep.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_footstep.2.ogg b/mods/x_farming/sounds/x_farming_wood_footstep.2.ogg new file mode 100644 index 00000000..f1ad2e60 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_footstep.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_footstep.3.ogg b/mods/x_farming/sounds/x_farming_wood_footstep.3.ogg new file mode 100644 index 00000000..17a89a3b Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_footstep.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_footstep.4.ogg b/mods/x_farming/sounds/x_farming_wood_footstep.4.ogg new file mode 100644 index 00000000..8ced7cbe Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_footstep.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_footstep.5.ogg b/mods/x_farming/sounds/x_farming_wood_footstep.5.ogg new file mode 100644 index 00000000..bee6a53a Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_footstep.5.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_footstep.6.ogg b/mods/x_farming/sounds/x_farming_wood_footstep.6.ogg new file mode 100644 index 00000000..f317c984 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_footstep.6.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_hit.1.ogg b/mods/x_farming/sounds/x_farming_wood_hit.1.ogg new file mode 100644 index 00000000..74531896 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_hit.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_hit.2.ogg b/mods/x_farming/sounds/x_farming_wood_hit.2.ogg new file mode 100644 index 00000000..76fa8207 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_hit.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_hit.3.ogg b/mods/x_farming/sounds/x_farming_wood_hit.3.ogg new file mode 100644 index 00000000..b67f8491 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_hit.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_hit.4.ogg b/mods/x_farming/sounds/x_farming_wood_hit.4.ogg new file mode 100644 index 00000000..da52bb6e Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_hit.4.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_hit.5.ogg b/mods/x_farming/sounds/x_farming_wood_hit.5.ogg new file mode 100644 index 00000000..1b7d83d5 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_hit.5.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_hit.6.ogg b/mods/x_farming/sounds/x_farming_wood_hit.6.ogg new file mode 100644 index 00000000..21dfefc5 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_hit.6.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_place.1.ogg b/mods/x_farming/sounds/x_farming_wood_place.1.ogg new file mode 100644 index 00000000..f3a5f351 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_place.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_place.2.ogg b/mods/x_farming/sounds/x_farming_wood_place.2.ogg new file mode 100644 index 00000000..eab96e13 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_place.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wood_place.3.ogg b/mods/x_farming/sounds/x_farming_wood_place.3.ogg new file mode 100644 index 00000000..9f62083c Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wood_place.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wooden_bowl.1.ogg b/mods/x_farming/sounds/x_farming_wooden_bowl.1.ogg new file mode 100644 index 00000000..8afdc863 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wooden_bowl.1.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wooden_bowl.2.ogg b/mods/x_farming/sounds/x_farming_wooden_bowl.2.ogg new file mode 100644 index 00000000..0456f18d Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wooden_bowl.2.ogg differ diff --git a/mods/x_farming/sounds/x_farming_wooden_bowl.3.ogg b/mods/x_farming/sounds/x_farming_wooden_bowl.3.ogg new file mode 100644 index 00000000..27e1a4cc Binary files /dev/null and b/mods/x_farming/sounds/x_farming_wooden_bowl.3.ogg differ diff --git a/mods/x_farming/sounds/x_farming_x_bonemeal_grow.ogg b/mods/x_farming/sounds/x_farming_x_bonemeal_grow.ogg new file mode 100644 index 00000000..73119647 Binary files /dev/null and b/mods/x_farming/sounds/x_farming_x_bonemeal_grow.ogg differ diff --git a/mods/x_farming/soybean.lua b/mods/x_farming/soybean.lua new file mode 100644 index 00000000..0635333b --- /dev/null +++ b/mods/x_farming/soybean.lua @@ -0,0 +1,108 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- SOYBEAN +x_farming.register_plant('x_farming:soybean', { + description = S('Soybean Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Soybean Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_soybean_seed.png', + steps = 7, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 3, +}) + +-- needed +minetest.override_item('x_farming:soybean', { + description = S('Soybean') .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Soybean'), + groups = { + -- X Farming + compost = 65, + -- MCL + compostability = 65 + }, +}) + +minetest.register_craftitem('x_farming:bottle_soymilk', { + description = S('Soymilk Bottle'), + short_description = S('Soymilk Bottle'), + tiles = { 'x_farming_bottle_soymilk.png' }, + inventory_image = 'x_farming_bottle_soymilk.png', + wield_image = 'x_farming_bottle_soymilk.png', + groups = { vessel = 1 }, + sounds = x_farming.node_sound_thin_glass_defaults(), +}) + +minetest.register_craftitem('x_farming:bottle_soymilk_raw', { + description = S('Raw Soymilk Bottle'), + short_description = S('Raw Soymilk Bottle'), + tiles = { 'x_farming_bottle_soymilk_raw.png' }, + inventory_image = 'x_farming_bottle_soymilk_raw.png', + wield_image = 'x_farming_bottle_soymilk_raw.png', + groups = { vessel = 1, dig_immediate = 3, attached_node = 1 }, +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'x_farming:bottle_soymilk_raw', + recipe = { + 'x_farming:soybean', + 'x_farming:soybean', + 'x_farming:soybean', + 'x_farming:soybean', + 'x_farming:soybean', + 'x_farming:bottle_water' + } +}) + +---crate +x_farming.register_crate('crate_soybean_3', { + description = S('Soybean Crate'), + short_description = S('Soybean Crate'), + tiles = { 'x_farming_crate_soybean_3.png' }, + _custom = { + crate_item = 'x_farming:soybean' + } +}) + +minetest.register_decoration(asuna.features.crops.soybean.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1112, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:soybean_5", + "x_farming:soybean_6", + "x_farming:soybean_7", + }, +})) diff --git a/mods/x_farming/stevia.lua b/mods/x_farming/stevia.lua new file mode 100644 index 00000000..e4e033d9 --- /dev/null +++ b/mods/x_farming/stevia.lua @@ -0,0 +1,84 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- STEVIA +x_farming.register_plant('x_farming:stevia', { + description = S('Stevia Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Stevia Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_stevia_seed.png', + steps = 8, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 4, +}) + +-- needed +minetest.override_item('x_farming:stevia', { + description = S('Stevia') .. '\n' .. S('Compost chance') .. ': 65%', + short_description = S('Stevia'), + groups = { + -- X Farming + compost = 65, + -- MCL + compostability = 65 + }, +}) + +minetest.register_craftitem('x_farming:sugar', { + description = S('Sugar'), + short_description = S('Sugar'), + inventory_image = 'x_farming_sugar.png', + groups = { flammable = 1 }, +}) + +---crate +x_farming.register_crate('crate_stevia_3', { + description = S('Stevia Crate'), + short_description = S('Stevia Crate'), + tiles = { 'x_farming_crate_stevia_3.png' }, + _custom = { + crate_item = 'x_farming:stevia' + } +}) + +minetest.register_decoration(asuna.features.crops.stevia.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1113, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:stevia_5", + "x_farming:stevia_6", + "x_farming:stevia_7", + "x_farming:stevia_8", + }, +})) diff --git a/mods/x_farming/stove.lua b/mods/x_farming/stove.lua new file mode 100644 index 00000000..c40042ba --- /dev/null +++ b/mods/x_farming/stove.lua @@ -0,0 +1,729 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local stove_fire_sounds = {} + +local function get_grid_matrix_items(grid) + local grid_matrix = table.copy(grid) + local _items = {} + + for row, items in ipairs(grid_matrix) do + for item_pos, item in pairs(items) do + if item.itemstring ~= '' then + -- add entity position to item table + item.ent_pos = item_pos + table.insert(_items, item) + end + end + end + + return _items +end + +local function add_item_to_grid_matrix(grid_matrix, item) + local result = {} + + for row, items in ipairs(grid_matrix) do + local found = false + + for item_pos, _item in pairs(items) do + if _item.itemstring == '' then + grid_matrix[row][item_pos] = item + result.added_to_row = row + result.added_to_pos = item_pos + found = true + break + end + end + + if found then + break + end + end + + return result +end + +local function stop_stove_sound(pos, fadeout_step) + local hash = minetest.hash_node_position(pos) + local sound_ids = stove_fire_sounds[hash] + + if sound_ids then + for _, sound_id in ipairs(sound_ids) do + minetest.sound_fade(sound_id, -1, 0) + end + + stove_fire_sounds[hash] = nil + end +end + +local function remove_item_from_grid_matrix(grid_matrix, item) + local result = {} + + for row, items in ipairs(grid_matrix) do + local found = false + + for item_pos, _item in pairs(items) do + if _item.itemstring == item.itemstring then + grid_matrix[row][item_pos] = { + itemstring = '', + output = {} + } + result.removed_from_row = row + result.removed_from_pos = item_pos + found = true + break + end + end + + if found then + break + end + end + + return result +end + +local function add_item_smoke_particles(pos) + local particlespawner_def = { + amount = 5, + time = 1, + minpos = vector.new(pos.x - 0.1, pos.y, pos.z - 0.1), + maxpos = vector.new(pos.x + 0.1, pos.y, pos.z + 0.1), + minvel = vector.new(-0.1, 0.2, -0.1), + maxvel = vector.new(0.1, 0.4, 0.1), + minacc = vector.new(0, 0.1, 0), + maxacc = vector.new(0, 0.2, 0), + minexptime = 1, + maxexptime = 3, + minsize = 1, + maxsize = 1.5, + texture = 'x_farming_stove_item_smoke_particle.png', + collisiondetection = true + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 5, + time = 1, + pos = { + min = vector.new(pos.x - 0.1, pos.y, pos.z - 0.1), + max = vector.new(pos.x + 0.1, pos.y, pos.z + 0.1) + }, + size = { + min = 1, + max = 1.5, + }, + vel = { + min = vector.new(-0.1, 0.2, -0.1), + max = vector.new(0.1, 0.4, 0.1) + }, + acc = { + min = vector.new(0, 0.1, 0), + max = vector.new(0, 0.2, 0) + }, + exptime = { + min = 1, + max = 3 + }, + texture = { + name = 'x_farming_stove_item_smoke_particle.png', + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + }, + scale_tween = { + { x = 1, y = 1 }, + { x = 0.5, y = 0.5 }, + } + }, + collisiondetection = true + } + end + + minetest.add_particlespawner(particlespawner_def) +end + +-- Entity + +minetest.register_entity('x_farming:stove_food', { + initial_properties = { + visual = 'wielditem', + visual_size = { x = 0.2, y = 0.2, z = 0.2 }, + physical = false, + collide_with_objects = false, + collisionbox = { 0, 0, 0, 0, 0, 0 }, + -- collisionbox = { -0.15, -0.05, -0.15, 0.15, 0.05, 0.15 }, + selectionbox = { 0, 0, 0, 0, 0, 0 }, + -- selectionbox = { -0.15, -0.05, -0.15, 0.15, 0.05, 0.15 }, + pointable = false, + makes_footstep_sound = false, + static_save = true, + shaded = true, + glow = 4 + }, + on_activate = function(self, staticdata, dtime_s) + if not self or not staticdata or staticdata == '' then + self.object:remove() + return + end + + local _staticdata = minetest.deserialize(staticdata) + + for key, value in pairs(_staticdata) do + self[key] = value + end + + self._nodechecktimer = 2 + + self.object:set_armor_groups({ immortal = 1, stove_food = 1, fleshy = 100 }) + + self.object:set_properties({ + wield_item = _staticdata.itemname, + infotext = _staticdata.itemname, + }) + end, + on_step = function(self, dtime, moveresult) + self._nodechecktimer = self._nodechecktimer - dtime + + if self._nodechecktimer <= 0 then + self._nodechecktimer = 2 + local pos = self.object:get_pos() + local node_above = minetest.get_node(vector.new(pos.x, pos.y + 0.5, pos.z)) + local node_under = minetest.get_node(vector.new(pos.x, pos.y - 0.5, pos.z)) + + -- drop items if above is obstructed or no heat_source below + if node_above.name ~= 'air' + or minetest.get_item_group(node_under.name, 'heat_source') < 1 + then + local meta = minetest.get_meta(vector.new(pos.x, pos.y - 0.5, pos.z)) + local grid_matrix = minetest.deserialize(meta:get_string('grid_matrix')) + + if not grid_matrix then + return + end + + local grid_items = get_grid_matrix_items(grid_matrix) + + -- remove item from stove meta + for i, value in ipairs(grid_items) do + remove_item_from_grid_matrix(grid_matrix, value) + end + + meta:set_string('grid_matrix', minetest.serialize(grid_matrix)) + + -- remove entity and drop item + minetest.add_item(pos, ItemStack({ name = self.itemname })) + self.object:remove() + return + end + end + end, + get_staticdata = function(self) + local staticdata = { + itemname = self.itemname + } + return minetest.serialize(staticdata) + end, +}) + +-- Nodes +minetest.register_node('x_farming:stove', { + description = S('Stove inactive)'), + tiles = { + 'x_farming_stove_top.png', + 'x_farming_stove_side.png', + 'x_farming_stove_side.png', + 'x_farming_stove_side.png', + 'x_farming_stove_side.png', + 'x_farming_stove_front.png', + }, + paramtype2 = '4dir', + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + container = 4, + deco_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + sounds = x_farming.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local infotext = S('Stove inactive.') .. ' ' .. S('Activate by torch or flint and steel.') + local node = minetest.get_node(pos) + + local x_shift = -0.6 + local m_pos = vector.new(pos.x - 0.6, pos.y + 0.5, pos.z) + -- param2 = 0 or 2 + local initial_grid_matrix = { + [1] = { + [vector.to_string(vector.new(m_pos.x + (1 * 0.3), m_pos.y, m_pos.z + 0.2))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x + (2 * 0.3), m_pos.y, m_pos.z + 0.2))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x + (3 * 0.3), m_pos.y, m_pos.z + 0.2))] = { + itemstring = '', + output = {}, + cooked_time = 0 + } + }, + [2] = { + [vector.to_string(vector.new(m_pos.x + (1 * 0.3), m_pos.y, m_pos.z - 0.2))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x + (2 * 0.3), m_pos.y, m_pos.z - 0.2))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x + (3 * 0.3), m_pos.y, m_pos.z - 0.2))] = { + itemstring = '', + output = {}, + cooked_time = 0 + } + }, + } + + if node.param2 == 1 or node.param2 == 3 then + m_pos = vector.new(pos.x, pos.y + 0.5, pos.z + x_shift) + + initial_grid_matrix = { + [1] = { + [vector.to_string(vector.new(m_pos.x + 0.2, m_pos.y, m_pos.z + (1 * 0.3)))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x + 0.2, m_pos.y, m_pos.z + (2 * 0.3)))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x + 0.2, m_pos.y, m_pos.z + (3 * 0.3)))] = { + itemstring = '', + output = {}, + cooked_time = 0 + } + }, + [2] = { + [vector.to_string(vector.new(m_pos.x - 0.2, m_pos.y, m_pos.z + (1 * 0.3)))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x - 0.2, m_pos.y, m_pos.z + (2 * 0.3)))] = { + itemstring = '', + output = {}, + cooked_time = 0 + }, + [vector.to_string(vector.new(m_pos.x - 0.2, m_pos.y, m_pos.z + (3 * 0.3)))] = { + itemstring = '', + output = {}, + cooked_time = 0 + } + }, + } + end + + meta:set_string('grid_matrix', minetest.serialize(initial_grid_matrix)) + meta:set_string('infotext', infotext) + end, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local stack = player:get_wielded_item() + local stack_name = stack:get_name() + + if minetest.get_item_group(stack_name, 'torch') > 0 + or stack_name == 'fire:flint_and_steel' + or stack_name == 'mcl_fire:flint_and_steel' + then + local infotext = S('Stove active.') .. ' ' .. S('De-activate with shovel. Stove will de-activate by its self after a while if there are no items to cook.') + meta:set_string('infotext', infotext) + minetest.swap_node(pos, { name = 'x_farming:stove_active', param2 = node.param2 }) + minetest.get_node_timer(pos):start(1) + end + + return itemstack + end, + on_rotate = function() + return false + end +}) + +-- Active stove +minetest.register_node('x_farming:stove_active', { + description = S('Stove active'), + tiles = { + { + name = 'x_farming_stove_top_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 5 + }, + }, + 'x_farming_stove_side.png', + 'x_farming_stove_side.png', + 'x_farming_stove_side.png', + 'x_farming_stove_side.png', + { + name = 'x_farming_stove_front_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 2 + }, + }, + }, + paramtype2 = '4dir', + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + heat_source = 1, + not_in_creative_inventory = 1, + -- MCL + pickaxey = 1, + container = 4, + deco_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + sounds = x_farming.node_sound_stone_defaults(), + light_source = 8, + drop = 'x_farming:stove', + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local infotext = S('Stove active.') .. ' ' .. S('De-activate with shovel. Stove will de-activate by its self after a while if there are no items to cook.') + + meta:set_string('infotext', infotext) + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local grid_matrix = minetest.deserialize(meta:get_string('grid_matrix')) + + if not grid_matrix then + return + end + + local timer_elapsed = meta:get_int('timer_elapsed') or 0 + meta:set_int('timer_elapsed', timer_elapsed + 1) + + -- total running time without items to cook + local total_running_time = meta:get_float('total_running_time') or 0 + local grid_items = get_grid_matrix_items(grid_matrix) + + if #grid_items == 0 then + total_running_time = total_running_time + elapsed + elseif total_running_time > 0 then + -- reset time when added another item to cook + total_running_time = 0 + end + + if total_running_time > 180 then + -- extinguish stove + total_running_time = 0 + meta:set_float('total_running_time', total_running_time) + + local node = minetest.get_node(pos) + minetest.swap_node(pos, { name = 'x_farming:stove', param2 = node.param2 }) + meta:set_int('timer_elapsed', 0) + local infotext = S('Stove inactive.') .. ' ' .. S('Activate by torch or flint and steel.') + meta:set_string('infotext', infotext) + stop_stove_sound(pos) + + return false + end + + -- play sound + if timer_elapsed == 0 or (timer_elapsed + 1) % 5 == 0 then + local sound_id = minetest.sound_play('x_farming_stove_active', { pos = pos, max_hear_distance = 16, gain = 0.25 }) + local hash = minetest.hash_node_position(pos) + + stove_fire_sounds[hash] = stove_fire_sounds[hash] or {} + table.insert(stove_fire_sounds[hash], sound_id) + + -- Only remember the 3 last sound handles + if #stove_fire_sounds[hash] > 3 then + table.remove(stove_fire_sounds[hash], 1) + end + + -- Remove the sound ID automatically from table after 11 seconds + minetest.after(11, function() + if not stove_fire_sounds[hash] then + return + end + + for f = #stove_fire_sounds[hash], 1, -1 do + if stove_fire_sounds[hash][f] == sound_id then + table.remove(stove_fire_sounds[hash], f) + end + end + + if #stove_fire_sounds[hash] == 0 then + stove_fire_sounds[hash] = nil + end + end) + end + + -- cook items, update cooked times + -- if cooked drop items and remove from meta + for row, items in ipairs(grid_matrix) do + for item_pos, item in pairs(items) do + if item.itemstring ~= '' then + grid_matrix[row][item_pos].cooked_time = (grid_matrix[row][item_pos].cooked_time or 0) + elapsed + + -- drop cooked item and remove from meta + if grid_matrix[row][item_pos].cooked_time > item.output.time then + -- drop cooked item + minetest.add_item(vector.from_string(item_pos), ItemStack(item.output.item)) + + -- drop recipe replacements + for _, replacement in ipairs(item.output.replacements) do + minetest.add_item(vector.from_string(item_pos), ItemStack(replacement)) + end + + -- remove from metadata + local removed_items_result = remove_item_from_grid_matrix(grid_matrix, item) + + if removed_items_result.removed_from_pos then + -- remove entity + for _, o in ipairs(minetest.get_objects_inside_radius(pos, 0.7)) do + local armor_groups = o:get_armor_groups() or {} + + if armor_groups.stove_food and armor_groups.stove_food > 0 then + if o:get_pos() and vector.to_string(vector.new(o:get_pos())) == removed_items_result.removed_from_pos then + o:remove() + break + end + end + end + end + + -- Play cooling sound + minetest.sound_play('x_farming_stove_sizzle', { + pos = vector.from_string(item_pos), + max_hear_distance = 16, + gain = 0.07 + }, true) + else + add_item_smoke_particles(vector.from_string(item_pos)) + end + + -- restore entity items after `clearobjects` + local missing_items = table.copy(items) + + for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 0.7)) do + local armor_groups = obj:get_armor_groups() or {} + + if armor_groups.stove_food and armor_groups.stove_food > 0 then + local lua_ent = obj:get_luaentity() + + if lua_ent and obj:get_pos() then + -- match entity with metadata + -- removing the one we found and leaving + -- only the ones what needs to be restored + for ent_pos, value in pairs(missing_items) do + local obj_pos = vector.to_string(vector.new(obj:get_pos())) + + if obj_pos == ent_pos then + missing_items[obj_pos] = nil + break + end + end + end + end + end + + for ent_pos, value in pairs(missing_items) do + if value.itemstring ~= '' then + local staticdata = { + itemname = value.itemstring + } + + local obj = minetest.add_entity( + vector.from_string(ent_pos), + 'x_farming:stove_food', + minetest.serialize(staticdata) + ) + + if obj then + obj:set_rotation(vector.from_string(value.ent_rot)) + end + end + end + end + end + end + + -- set meta + meta:set_string('grid_matrix', minetest.serialize(grid_matrix)) + meta:set_float('total_running_time', total_running_time) + + return true + end, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local wield_stack = player:get_wielded_item() + local wield_stack_name = wield_stack:get_name() + + -- de-activate stove + if minetest.get_item_group(wield_stack_name, 'shovel') > 0 then + minetest.swap_node(pos, { name = 'x_farming:stove', param2 = node.param2 }) + meta:set_int('timer_elapsed', 0) + local infotext = S('Stove inactive.') .. ' ' .. S('Activate by torch or flint and steel.') + meta:set_string('infotext', infotext) + stop_stove_sound(pos) + end + + -- check if item is cook-able + local output = minetest.get_craft_result({ + method = 'cooking', + width = 1, + items = { itemstack } + }) + + if output.item:is_empty() then + -- item is not cook-able + return itemstack + end + + -- check if space above + if minetest.get_node(vector.new(pos.x, pos.y + 1, pos.z)).name ~= 'air' then + return itemstack + end + + local grid_matrix = minetest.deserialize(meta:get_string('grid_matrix')) + local grid_items = get_grid_matrix_items(grid_matrix) + + if #grid_items >= 6 then + -- stove is full + return itemstack + end + + local _output = { + time = output.time, + replacements = {}, + item = output.item:to_table() + } + + for _, value in ipairs(output.replacements) do + table.insert(_output.replacements, value:to_table()) + end + + -- degrees to radians + local pitch = -90 * (math.pi / 180) + local roll = math.pi * 2 + node.param2 * math.pi / 2 + + -- x = pitch (elevation), y = yaw (heading), z = roll (bank) + local ent_rot = vector.new(pitch, 0, roll) + local added_item_result = add_item_to_grid_matrix(grid_matrix, { + itemstring = wield_stack_name, + output = _output, + ent_rot = vector.to_string(ent_rot), + cooked_time = 0 + }) + + if not (added_item_result.added_to_row and added_item_result.added_to_pos) then + return itemstack + end + + local ent_pos = vector.from_string(added_item_result.added_to_pos) + + if not ent_pos then + return itemstack + end + + -- Add Entity + local staticdata = { + itemname = wield_stack_name + } + + local obj = minetest.add_entity( + ent_pos, + 'x_farming:stove_food', + minetest.serialize(staticdata) + ) + + if obj then + -- 90 degress to radians + obj:set_rotation(ent_rot) + end + + -- Play cooling sound + minetest.sound_play('x_farming_stove_sizzle_put', { + pos = ent_pos, + max_hear_distance = 16, + gain = 0.1 + }, true) + + meta:set_string('grid_matrix', minetest.serialize(grid_matrix)) + itemstack:take_item() + + return itemstack + end, + on_destruct = function(pos) + stop_stove_sound(pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if not oldmetadata.fields.grid_matrix then + return + end + + local objs = minetest.get_objects_inside_radius(pos, 0.7) + local grid_matrix = minetest.deserialize(oldmetadata.fields.grid_matrix) + local grid_items = get_grid_matrix_items(grid_matrix) + + -- remove entitites + for _, obj in ipairs(objs) do + local armor_groups = obj:get_armor_groups() or {} + + if armor_groups.stove_food and armor_groups.stove_food > 0 then + obj:remove() + end + end + + -- drop items + for _, item in ipairs(grid_items) do + minetest.add_item(vector.new(pos.x, pos.y + 0.7, pos.z), ItemStack(item.itemstring)) + end + end, + on_rotate = function() + return false + end +}) diff --git a/mods/x_farming/strawberry.lua b/mods/x_farming/strawberry.lua new file mode 100644 index 00000000..66d47319 --- /dev/null +++ b/mods/x_farming/strawberry.lua @@ -0,0 +1,89 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- STRAWBERRY +x_farming.register_plant('x_farming:strawberry', { + description = S('Strawberry Seed') .. '\n' .. S('Compost chance') .. ': 30%', + short_description = S('Strawberry Seed'), + paramtype2 = 'meshoptions', + inventory_image = 'x_farming_strawberry_seed.png', + steps = 4, + minlight = 13, + maxlight = 14, + fertility = { 'grassland' }, + groups = { flammable = 4 }, + place_param2 = 0 +}) + +-- needed +local strawberry_def = { + description = S('Strawberry') .. '\n' .. S('Compost chance') .. ': 30%\n' + .. minetest.colorize(x_farming.colors.brown, S('Hunger') .. ': 2'), + groups = { + -- X Farming + compost = 30, + -- MCL + compostability = 30 + }, + short_description = S('Strawberry'), +} + +if minetest.get_modpath('farming') then + strawberry_def.on_use = minetest.item_eat(2) +end + +if minetest.get_modpath('mcl_farming') then + strawberry_def.on_place = minetest.item_eat(2) + strawberry_def.on_secondary_use = minetest.item_eat(2) +end + +minetest.override_item('x_farming:strawberry', strawberry_def) + +---crate +x_farming.register_crate('crate_strawberry_3', { + description = S('Strawberry Crate'), + short_description = S('Strawberry Crate'), + tiles = { 'x_farming_crate_strawberry_3.png' }, + _custom = { + crate_item = 'x_farming:strawberry' + } +}) + +minetest.register_decoration(asuna.features.crops.strawberry.inject_decoration({ + deco_type = "simple", + sidelen = 8, + noise_params = { + offset = -0.4125, + scale = 0.3575, + spread = {x = 14, y = 14, z = 14}, + seed = 1114, + octaves = 2, + persist = 0.62, + lacunarity = 0.675, + }, + y_max = 31000, + y_min = 5, + decoration = { + "x_farming:strawberry_1", + "x_farming:strawberry_2", + "x_farming:strawberry_3", + "x_farming:strawberry_4", + }, + })) diff --git a/mods/x_farming/textures/x_farming_bag_empty.png b/mods/x_farming/textures/x_farming_bag_empty.png new file mode 100644 index 00000000..56f48b3a Binary files /dev/null and b/mods/x_farming/textures/x_farming_bag_empty.png differ diff --git a/mods/x_farming/textures/x_farming_bag_rice_grains.png b/mods/x_farming/textures/x_farming_bag_rice_grains.png new file mode 100644 index 00000000..91b59239 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bag_rice_grains.png differ diff --git a/mods/x_farming/textures/x_farming_bag_salt.png b/mods/x_farming/textures/x_farming_bag_salt.png new file mode 100644 index 00000000..5b746038 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bag_salt.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_item.png b/mods/x_farming/textures/x_farming_baked_fish_item.png new file mode 100644 index 00000000..440701ec Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_item.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_mesh.png b/mods/x_farming/textures/x_farming_baked_fish_mesh.png new file mode 100644 index 00000000..bd3fbcf0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_mesh_1.png b/mods/x_farming/textures/x_farming_baked_fish_mesh_1.png new file mode 100644 index 00000000..33bca1a7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_mesh_1.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_mesh_2.png b/mods/x_farming/textures/x_farming_baked_fish_mesh_2.png new file mode 100644 index 00000000..e4cbb2fc Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_mesh_2.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_mesh_3.png b/mods/x_farming/textures/x_farming_baked_fish_mesh_3.png new file mode 100644 index 00000000..b8efdbed Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_mesh_3.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_mesh_4.png b/mods/x_farming/textures/x_farming_baked_fish_mesh_4.png new file mode 100644 index 00000000..16405078 Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_mesh_4.png differ diff --git a/mods/x_farming/textures/x_farming_baked_fish_mesh_5.png b/mods/x_farming/textures/x_farming_baked_fish_mesh_5.png new file mode 100644 index 00000000..5a30c18b Binary files /dev/null and b/mods/x_farming/textures/x_farming_baked_fish_mesh_5.png differ diff --git a/mods/x_farming/textures/x_farming_barley.png b/mods/x_farming/textures/x_farming_barley.png new file mode 100644 index 00000000..a2111be9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley.png differ diff --git a/mods/x_farming/textures/x_farming_barley_1.png b/mods/x_farming/textures/x_farming_barley_1.png new file mode 100644 index 00000000..2a661bb5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_1.png differ diff --git a/mods/x_farming/textures/x_farming_barley_2.png b/mods/x_farming/textures/x_farming_barley_2.png new file mode 100644 index 00000000..f70d3d42 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_2.png differ diff --git a/mods/x_farming/textures/x_farming_barley_3.png b/mods/x_farming/textures/x_farming_barley_3.png new file mode 100644 index 00000000..5f8b0663 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_3.png differ diff --git a/mods/x_farming/textures/x_farming_barley_4.png b/mods/x_farming/textures/x_farming_barley_4.png new file mode 100644 index 00000000..73ba5e89 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_4.png differ diff --git a/mods/x_farming/textures/x_farming_barley_5.png b/mods/x_farming/textures/x_farming_barley_5.png new file mode 100644 index 00000000..dc37a114 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_5.png differ diff --git a/mods/x_farming/textures/x_farming_barley_6.png b/mods/x_farming/textures/x_farming_barley_6.png new file mode 100644 index 00000000..7f9523ba Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_6.png differ diff --git a/mods/x_farming/textures/x_farming_barley_7.png b/mods/x_farming/textures/x_farming_barley_7.png new file mode 100644 index 00000000..36a238c0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_7.png differ diff --git a/mods/x_farming/textures/x_farming_barley_8.png b/mods/x_farming/textures/x_farming_barley_8.png new file mode 100644 index 00000000..243c0f01 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_8.png differ diff --git a/mods/x_farming/textures/x_farming_barley_seed.png b/mods/x_farming/textures/x_farming_barley_seed.png new file mode 100644 index 00000000..7d65a4e7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_seed.png differ diff --git a/mods/x_farming/textures/x_farming_barley_stack_side.png b/mods/x_farming/textures/x_farming_barley_stack_side.png new file mode 100644 index 00000000..a3633026 Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_stack_side.png differ diff --git a/mods/x_farming/textures/x_farming_barley_stack_top.png b/mods/x_farming/textures/x_farming_barley_stack_top.png new file mode 100644 index 00000000..1086e7ce Binary files /dev/null and b/mods/x_farming/textures/x_farming_barley_stack_top.png differ diff --git a/mods/x_farming/textures/x_farming_bee_hive_bottom.png b/mods/x_farming/textures/x_farming_bee_hive_bottom.png new file mode 100644 index 00000000..554015d9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bee_hive_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_bee_hive_front.png b/mods/x_farming/textures/x_farming_bee_hive_front.png new file mode 100644 index 00000000..37635987 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bee_hive_front.png differ diff --git a/mods/x_farming/textures/x_farming_bee_hive_saturated_overlay.png b/mods/x_farming/textures/x_farming_bee_hive_saturated_overlay.png new file mode 100644 index 00000000..88d41a9a Binary files /dev/null and b/mods/x_farming/textures/x_farming_bee_hive_saturated_overlay.png differ diff --git a/mods/x_farming/textures/x_farming_bee_hive_side.png b/mods/x_farming/textures/x_farming_bee_hive_side.png new file mode 100644 index 00000000..a30835aa Binary files /dev/null and b/mods/x_farming/textures/x_farming_bee_hive_side.png differ diff --git a/mods/x_farming/textures/x_farming_bee_hive_top.png b/mods/x_farming/textures/x_farming_bee_hive_top.png new file mode 100644 index 00000000..f2357ed5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bee_hive_top.png differ diff --git a/mods/x_farming/textures/x_farming_bee_mesh_animated.png b/mods/x_farming/textures/x_farming_bee_mesh_animated.png new file mode 100644 index 00000000..59b1bcfd Binary files /dev/null and b/mods/x_farming/textures/x_farming_bee_mesh_animated.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot.png b/mods/x_farming/textures/x_farming_beetroot.png new file mode 100644 index 00000000..472f5ad5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_1.png b/mods/x_farming/textures/x_farming_beetroot_1.png new file mode 100644 index 00000000..d1fccefa Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_1.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_2.png b/mods/x_farming/textures/x_farming_beetroot_2.png new file mode 100644 index 00000000..9f2f9652 Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_2.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_3.png b/mods/x_farming/textures/x_farming_beetroot_3.png new file mode 100644 index 00000000..1ed66b6e Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_3.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_4.png b/mods/x_farming/textures/x_farming_beetroot_4.png new file mode 100644 index 00000000..774ea40e Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_4.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_5.png b/mods/x_farming/textures/x_farming_beetroot_5.png new file mode 100644 index 00000000..4192e1bc Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_5.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_6.png b/mods/x_farming/textures/x_farming_beetroot_6.png new file mode 100644 index 00000000..f9b74904 Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_6.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_7.png b/mods/x_farming/textures/x_farming_beetroot_7.png new file mode 100644 index 00000000..3c96722d Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_7.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_8.png b/mods/x_farming/textures/x_farming_beetroot_8.png new file mode 100644 index 00000000..9cdee330 Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_8.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_seed.png b/mods/x_farming/textures/x_farming_beetroot_seed.png new file mode 100644 index 00000000..d04f0d1e Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_seed.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_soup.png b/mods/x_farming/textures/x_farming_beetroot_soup.png new file mode 100644 index 00000000..a7e28658 Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_soup.png differ diff --git a/mods/x_farming/textures/x_farming_beetroot_soup_mesh.png b/mods/x_farming/textures/x_farming_beetroot_soup_mesh.png new file mode 100644 index 00000000..6f1fabd5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_beetroot_soup_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_bottle_coffee.png b/mods/x_farming/textures/x_farming_bottle_coffee.png new file mode 100644 index 00000000..f56561fe Binary files /dev/null and b/mods/x_farming/textures/x_farming_bottle_coffee.png differ diff --git a/mods/x_farming/textures/x_farming_bottle_honey.png b/mods/x_farming/textures/x_farming_bottle_honey.png new file mode 100644 index 00000000..d6dce920 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bottle_honey.png differ diff --git a/mods/x_farming/textures/x_farming_bottle_soymilk.png b/mods/x_farming/textures/x_farming_bottle_soymilk.png new file mode 100644 index 00000000..a92990ec Binary files /dev/null and b/mods/x_farming/textures/x_farming_bottle_soymilk.png differ diff --git a/mods/x_farming/textures/x_farming_bottle_soymilk_raw.png b/mods/x_farming/textures/x_farming_bottle_soymilk_raw.png new file mode 100644 index 00000000..cb0b3684 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bottle_soymilk_raw.png differ diff --git a/mods/x_farming/textures/x_farming_bottle_water.png b/mods/x_farming/textures/x_farming_bottle_water.png new file mode 100644 index 00000000..293b1094 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bottle_water.png differ diff --git a/mods/x_farming/textures/x_farming_bowl.png b/mods/x_farming/textures/x_farming_bowl.png new file mode 100644 index 00000000..2c35cdc9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bowl.png differ diff --git a/mods/x_farming/textures/x_farming_bowl_baked_fish.png b/mods/x_farming/textures/x_farming_bowl_baked_fish.png new file mode 100644 index 00000000..c050b4aa Binary files /dev/null and b/mods/x_farming/textures/x_farming_bowl_baked_fish.png differ diff --git a/mods/x_farming/textures/x_farming_bowl_french_potatoes.png b/mods/x_farming/textures/x_farming_bowl_french_potatoes.png new file mode 100644 index 00000000..30616e85 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bowl_french_potatoes.png differ diff --git a/mods/x_farming/textures/x_farming_bowl_melon_slush.png b/mods/x_farming/textures/x_farming_bowl_melon_slush.png new file mode 100644 index 00000000..9e63b494 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bowl_melon_slush.png differ diff --git a/mods/x_farming/textures/x_farming_bread.png b/mods/x_farming/textures/x_farming_bread.png new file mode 100644 index 00000000..3a5cc2e6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_bread.png differ diff --git a/mods/x_farming/textures/x_farming_cactus.png b/mods/x_farming/textures/x_farming_cactus.png new file mode 100644 index 00000000..0f725e8e Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus.png differ diff --git a/mods/x_farming/textures/x_farming_cactus_brick.png b/mods/x_farming/textures/x_farming_cactus_brick.png new file mode 100644 index 00000000..c573fe67 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus_brick.png differ diff --git a/mods/x_farming/textures/x_farming_cactus_fruit_bottom.png b/mods/x_farming/textures/x_farming_cactus_fruit_bottom.png new file mode 100644 index 00000000..92a19873 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus_fruit_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_cactus_fruit_item.png b/mods/x_farming/textures/x_farming_cactus_fruit_item.png new file mode 100644 index 00000000..316522d2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus_fruit_item.png differ diff --git a/mods/x_farming/textures/x_farming_cactus_fruit_sides.png b/mods/x_farming/textures/x_farming_cactus_fruit_sides.png new file mode 100644 index 00000000..22d43fb0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus_fruit_sides.png differ diff --git a/mods/x_farming/textures/x_farming_cactus_fruit_top.png b/mods/x_farming/textures/x_farming_cactus_fruit_top.png new file mode 100644 index 00000000..7bcfdd5a Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus_fruit_top.png differ diff --git a/mods/x_farming/textures/x_farming_cactus_top.png b/mods/x_farming/textures/x_farming_cactus_top.png new file mode 100644 index 00000000..03210930 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cactus_top.png differ diff --git a/mods/x_farming/textures/x_farming_candle_flame_animated.png b/mods/x_farming/textures/x_farming_candle_flame_animated.png new file mode 100644 index 00000000..e2d66a7d Binary files /dev/null and b/mods/x_farming/textures/x_farming_candle_flame_animated.png differ diff --git a/mods/x_farming/textures/x_farming_candle_item.png b/mods/x_farming/textures/x_farming_candle_item.png new file mode 100644 index 00000000..34645b0d Binary files /dev/null and b/mods/x_farming/textures/x_farming_candle_item.png differ diff --git a/mods/x_farming/textures/x_farming_candle_mesh.png b/mods/x_farming/textures/x_farming_candle_mesh.png new file mode 100644 index 00000000..2d07c3ba Binary files /dev/null and b/mods/x_farming/textures/x_farming_candle_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_candle_no_flame.png b/mods/x_farming/textures/x_farming_candle_no_flame.png new file mode 100644 index 00000000..ca6d709f Binary files /dev/null and b/mods/x_farming/textures/x_farming_candle_no_flame.png differ diff --git a/mods/x_farming/textures/x_farming_carrot.png b/mods/x_farming/textures/x_farming_carrot.png new file mode 100644 index 00000000..35c5cc48 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_1.png b/mods/x_farming/textures/x_farming_carrot_1.png new file mode 100644 index 00000000..ab6584c8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_1.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_2.png b/mods/x_farming/textures/x_farming_carrot_2.png new file mode 100644 index 00000000..ab6584c8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_2.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_3.png b/mods/x_farming/textures/x_farming_carrot_3.png new file mode 100644 index 00000000..af66a234 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_3.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_4.png b/mods/x_farming/textures/x_farming_carrot_4.png new file mode 100644 index 00000000..af66a234 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_4.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_5.png b/mods/x_farming/textures/x_farming_carrot_5.png new file mode 100644 index 00000000..5e932600 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_5.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_6.png b/mods/x_farming/textures/x_farming_carrot_6.png new file mode 100644 index 00000000..5e932600 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_6.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_7.png b/mods/x_farming/textures/x_farming_carrot_7.png new file mode 100644 index 00000000..5e932600 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_7.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_8.png b/mods/x_farming/textures/x_farming_carrot_8.png new file mode 100644 index 00000000..4bf271ab Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_8.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_golden.png b/mods/x_farming/textures/x_farming_carrot_golden.png new file mode 100644 index 00000000..c9c564b0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_golden.png differ diff --git a/mods/x_farming/textures/x_farming_carrot_seed.png b/mods/x_farming/textures/x_farming_carrot_seed.png new file mode 100644 index 00000000..433d4a3e Binary files /dev/null and b/mods/x_farming/textures/x_farming_carrot_seed.png differ diff --git a/mods/x_farming/textures/x_farming_chocolate.png b/mods/x_farming/textures/x_farming_chocolate.png new file mode 100644 index 00000000..540134d7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_chocolate.png differ diff --git a/mods/x_farming/textures/x_farming_chocolate_pie_item.png b/mods/x_farming/textures/x_farming_chocolate_pie_item.png new file mode 100644 index 00000000..e28b8b46 Binary files /dev/null and b/mods/x_farming/textures/x_farming_chocolate_pie_item.png differ diff --git a/mods/x_farming/textures/x_farming_chocolate_pie_mesh_1.png b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_1.png new file mode 100644 index 00000000..46225b4f Binary files /dev/null and b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_1.png differ diff --git a/mods/x_farming/textures/x_farming_chocolate_pie_mesh_2.png b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_2.png new file mode 100644 index 00000000..daa14097 Binary files /dev/null and b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_2.png differ diff --git a/mods/x_farming/textures/x_farming_chocolate_pie_mesh_3.png b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_3.png new file mode 100644 index 00000000..951ba312 Binary files /dev/null and b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_3.png differ diff --git a/mods/x_farming/textures/x_farming_chocolate_pie_mesh_4.png b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_4.png new file mode 100644 index 00000000..0fc87dcc Binary files /dev/null and b/mods/x_farming/textures/x_farming_chocolate_pie_mesh_4.png differ diff --git a/mods/x_farming/textures/x_farming_christmas_tree_leaves_animated.png b/mods/x_farming/textures/x_farming_christmas_tree_leaves_animated.png new file mode 100644 index 00000000..8a6cbe8f Binary files /dev/null and b/mods/x_farming/textures/x_farming_christmas_tree_leaves_animated.png differ diff --git a/mods/x_farming/textures/x_farming_christmas_tree_leaves_decorated.png b/mods/x_farming/textures/x_farming_christmas_tree_leaves_decorated.png new file mode 100644 index 00000000..d936599b Binary files /dev/null and b/mods/x_farming/textures/x_farming_christmas_tree_leaves_decorated.png differ diff --git a/mods/x_farming/textures/x_farming_christmas_tree_sapling.png b/mods/x_farming/textures/x_farming_christmas_tree_sapling.png new file mode 100644 index 00000000..b42d5155 Binary files /dev/null and b/mods/x_farming/textures/x_farming_christmas_tree_sapling.png differ diff --git a/mods/x_farming/textures/x_farming_christmas_tree_star.png b/mods/x_farming/textures/x_farming_christmas_tree_star.png new file mode 100644 index 00000000..425f0711 Binary files /dev/null and b/mods/x_farming/textures/x_farming_christmas_tree_star.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_bean.png b/mods/x_farming/textures/x_farming_cocoa_bean.png new file mode 100644 index 00000000..88b12dc9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_bean.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_bottom_1.png b/mods/x_farming/textures/x_farming_cocoa_bottom_1.png new file mode 100644 index 00000000..1bb7f5bc Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_bottom_1.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_bottom_2.png b/mods/x_farming/textures/x_farming_cocoa_bottom_2.png new file mode 100644 index 00000000..abe0bb04 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_bottom_2.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_bottom_3.png b/mods/x_farming/textures/x_farming_cocoa_bottom_3.png new file mode 100644 index 00000000..50db038b Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_bottom_3.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_front_1.png b/mods/x_farming/textures/x_farming_cocoa_front_1.png new file mode 100644 index 00000000..62506e4d Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_front_1.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_front_2.png b/mods/x_farming/textures/x_farming_cocoa_front_2.png new file mode 100644 index 00000000..98a4a786 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_front_2.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_front_3.png b/mods/x_farming/textures/x_farming_cocoa_front_3.png new file mode 100644 index 00000000..20b1d48e Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_front_3.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_left_1.png b/mods/x_farming/textures/x_farming_cocoa_left_1.png new file mode 100644 index 00000000..d580c680 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_left_1.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_left_2.png b/mods/x_farming/textures/x_farming_cocoa_left_2.png new file mode 100644 index 00000000..37206ffe Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_left_2.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_left_3.png b/mods/x_farming/textures/x_farming_cocoa_left_3.png new file mode 100644 index 00000000..932e615d Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_left_3.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_right_1.png b/mods/x_farming/textures/x_farming_cocoa_right_1.png new file mode 100644 index 00000000..445f8532 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_right_1.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_right_2.png b/mods/x_farming/textures/x_farming_cocoa_right_2.png new file mode 100644 index 00000000..92074b14 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_right_2.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_right_3.png b/mods/x_farming/textures/x_farming_cocoa_right_3.png new file mode 100644 index 00000000..641c18bf Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_right_3.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_top_1.png b/mods/x_farming/textures/x_farming_cocoa_top_1.png new file mode 100644 index 00000000..3f28ab73 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_top_1.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_top_2.png b/mods/x_farming/textures/x_farming_cocoa_top_2.png new file mode 100644 index 00000000..93f88017 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_top_2.png differ diff --git a/mods/x_farming/textures/x_farming_cocoa_top_3.png b/mods/x_farming/textures/x_farming_cocoa_top_3.png new file mode 100644 index 00000000..95a60ff6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cocoa_top_3.png differ diff --git a/mods/x_farming/textures/x_farming_coffee.png b/mods/x_farming/textures/x_farming_coffee.png new file mode 100644 index 00000000..88e9438c Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_1.png b/mods/x_farming/textures/x_farming_coffee_1.png new file mode 100644 index 00000000..48d1b7ff Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_1.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_2.png b/mods/x_farming/textures/x_farming_coffee_2.png new file mode 100644 index 00000000..e80d7bef Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_2.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_3.png b/mods/x_farming/textures/x_farming_coffee_3.png new file mode 100644 index 00000000..a057d04c Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_3.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_4.png b/mods/x_farming/textures/x_farming_coffee_4.png new file mode 100644 index 00000000..912c5f0d Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_4.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_5.png b/mods/x_farming/textures/x_farming_coffee_5.png new file mode 100644 index 00000000..47b11f22 Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_5.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_cup_hot.png b/mods/x_farming/textures/x_farming_coffee_cup_hot.png new file mode 100644 index 00000000..070817c8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_cup_hot.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_cup_hot_mesh.png b/mods/x_farming/textures/x_farming_coffee_cup_hot_mesh.png new file mode 100644 index 00000000..8e2442f4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_cup_hot_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_coffee_seed.png b/mods/x_farming/textures/x_farming_coffee_seed.png new file mode 100644 index 00000000..d15f67ff Binary files /dev/null and b/mods/x_farming/textures/x_farming_coffee_seed.png differ diff --git a/mods/x_farming/textures/x_farming_composter_1.png b/mods/x_farming/textures/x_farming_composter_1.png new file mode 100644 index 00000000..d0ae0d97 Binary files /dev/null and b/mods/x_farming/textures/x_farming_composter_1.png differ diff --git a/mods/x_farming/textures/x_farming_composter_2.png b/mods/x_farming/textures/x_farming_composter_2.png new file mode 100644 index 00000000..5f29bd4f Binary files /dev/null and b/mods/x_farming/textures/x_farming_composter_2.png differ diff --git a/mods/x_farming/textures/x_farming_composter_3.png b/mods/x_farming/textures/x_farming_composter_3.png new file mode 100644 index 00000000..4b772962 Binary files /dev/null and b/mods/x_farming/textures/x_farming_composter_3.png differ diff --git a/mods/x_farming/textures/x_farming_composter_4.png b/mods/x_farming/textures/x_farming_composter_4.png new file mode 100644 index 00000000..7105b518 Binary files /dev/null and b/mods/x_farming/textures/x_farming_composter_4.png differ diff --git a/mods/x_farming/textures/x_farming_composter_5.png b/mods/x_farming/textures/x_farming_composter_5.png new file mode 100644 index 00000000..b561d093 Binary files /dev/null and b/mods/x_farming/textures/x_farming_composter_5.png differ diff --git a/mods/x_farming/textures/x_farming_cooked_mask.png b/mods/x_farming/textures/x_farming_cooked_mask.png new file mode 100644 index 00000000..9764cea0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cooked_mask.png differ diff --git a/mods/x_farming/textures/x_farming_cookie.png b/mods/x_farming/textures/x_farming_cookie.png new file mode 100644 index 00000000..e050c9fa Binary files /dev/null and b/mods/x_farming/textures/x_farming_cookie.png differ diff --git a/mods/x_farming/textures/x_farming_corn.png b/mods/x_farming/textures/x_farming_corn.png new file mode 100644 index 00000000..0064698f Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn.png differ diff --git a/mods/x_farming/textures/x_farming_corn_1.png b/mods/x_farming/textures/x_farming_corn_1.png new file mode 100644 index 00000000..a3170dcd Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_1.png differ diff --git a/mods/x_farming/textures/x_farming_corn_10.png b/mods/x_farming/textures/x_farming_corn_10.png new file mode 100644 index 00000000..7af873b3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_10.png differ diff --git a/mods/x_farming/textures/x_farming_corn_2.png b/mods/x_farming/textures/x_farming_corn_2.png new file mode 100644 index 00000000..f280bce9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_2.png differ diff --git a/mods/x_farming/textures/x_farming_corn_3.png b/mods/x_farming/textures/x_farming_corn_3.png new file mode 100644 index 00000000..df0dc888 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_3.png differ diff --git a/mods/x_farming/textures/x_farming_corn_4.png b/mods/x_farming/textures/x_farming_corn_4.png new file mode 100644 index 00000000..2ec8efba Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_4.png differ diff --git a/mods/x_farming/textures/x_farming_corn_5.png b/mods/x_farming/textures/x_farming_corn_5.png new file mode 100644 index 00000000..dae8c215 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_5.png differ diff --git a/mods/x_farming/textures/x_farming_corn_6.png b/mods/x_farming/textures/x_farming_corn_6.png new file mode 100644 index 00000000..3fdccaf5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_6.png differ diff --git a/mods/x_farming/textures/x_farming_corn_7.png b/mods/x_farming/textures/x_farming_corn_7.png new file mode 100644 index 00000000..534812cb Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_7.png differ diff --git a/mods/x_farming/textures/x_farming_corn_8.png b/mods/x_farming/textures/x_farming_corn_8.png new file mode 100644 index 00000000..8243d28a Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_8.png differ diff --git a/mods/x_farming/textures/x_farming_corn_9.png b/mods/x_farming/textures/x_farming_corn_9.png new file mode 100644 index 00000000..b16e01d2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_9.png differ diff --git a/mods/x_farming/textures/x_farming_corn_pop.png b/mods/x_farming/textures/x_farming_corn_pop.png new file mode 100644 index 00000000..7c550bae Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_pop.png differ diff --git a/mods/x_farming/textures/x_farming_corn_popcorn.png b/mods/x_farming/textures/x_farming_corn_popcorn.png new file mode 100644 index 00000000..37326725 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_popcorn.png differ diff --git a/mods/x_farming/textures/x_farming_corn_popcorn_mesh.png b/mods/x_farming/textures/x_farming_corn_popcorn_mesh.png new file mode 100644 index 00000000..c72546f8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_popcorn_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_corn_seed.png b/mods/x_farming/textures/x_farming_corn_seed.png new file mode 100644 index 00000000..e6d46da7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_corn_seed.png differ diff --git a/mods/x_farming/textures/x_farming_cotton.png b/mods/x_farming/textures/x_farming_cotton.png new file mode 100644 index 00000000..98e34ad5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_1.png b/mods/x_farming/textures/x_farming_cotton_1.png new file mode 100644 index 00000000..46740dae Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_1.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_2.png b/mods/x_farming/textures/x_farming_cotton_2.png new file mode 100644 index 00000000..8a561e29 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_2.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_3.png b/mods/x_farming/textures/x_farming_cotton_3.png new file mode 100644 index 00000000..7c471146 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_3.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_4.png b/mods/x_farming/textures/x_farming_cotton_4.png new file mode 100644 index 00000000..bc118ba7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_4.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_5.png b/mods/x_farming/textures/x_farming_cotton_5.png new file mode 100644 index 00000000..e1c1d166 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_5.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_6.png b/mods/x_farming/textures/x_farming_cotton_6.png new file mode 100644 index 00000000..d039ab48 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_6.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_7.png b/mods/x_farming/textures/x_farming_cotton_7.png new file mode 100644 index 00000000..85cf0849 Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_7.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_8.png b/mods/x_farming/textures/x_farming_cotton_8.png new file mode 100644 index 00000000..56f9250c Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_8.png differ diff --git a/mods/x_farming/textures/x_farming_cotton_seed.png b/mods/x_farming/textures/x_farming_cotton_seed.png new file mode 100644 index 00000000..7dd6608c Binary files /dev/null and b/mods/x_farming/textures/x_farming_cotton_seed.png differ diff --git a/mods/x_farming/textures/x_farming_crate_artichoke_3.png b/mods/x_farming/textures/x_farming_crate_artichoke_3.png new file mode 100644 index 00000000..bf39beca Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_artichoke_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_asparagus_3.png b/mods/x_farming/textures/x_farming_crate_asparagus_3.png new file mode 100644 index 00000000..53545419 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_asparagus_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_barley_3.png b/mods/x_farming/textures/x_farming_crate_barley_3.png new file mode 100644 index 00000000..1edbd84e Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_barley_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_beans_3.png b/mods/x_farming/textures/x_farming_crate_beans_3.png new file mode 100644 index 00000000..593f3443 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_beans_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_beetroot_3.png b/mods/x_farming/textures/x_farming_crate_beetroot_3.png new file mode 100644 index 00000000..56b7d656 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_beetroot_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_blackberry_3.png b/mods/x_farming/textures/x_farming_crate_blackberry_3.png new file mode 100644 index 00000000..4261de49 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_blackberry_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_blueberry_3.png b/mods/x_farming/textures/x_farming_crate_blueberry_3.png new file mode 100644 index 00000000..1d05e1ac Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_blueberry_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_cabbage_3.png b/mods/x_farming/textures/x_farming_crate_cabbage_3.png new file mode 100644 index 00000000..b12a3068 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_cabbage_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_cactus_fruit_item_3.png b/mods/x_farming/textures/x_farming_crate_cactus_fruit_item_3.png new file mode 100644 index 00000000..bd4a9acb Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_cactus_fruit_item_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_carrot_3.png b/mods/x_farming/textures/x_farming_crate_carrot_3.png new file mode 100644 index 00000000..5c996b7a Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_carrot_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_chili_pepper_3.png b/mods/x_farming/textures/x_farming_crate_chili_pepper_3.png new file mode 100644 index 00000000..d840b458 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_chili_pepper_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_cocoa_bean_3.png b/mods/x_farming/textures/x_farming_crate_cocoa_bean_3.png new file mode 100644 index 00000000..3c355b85 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_cocoa_bean_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_coffee_3.png b/mods/x_farming/textures/x_farming_crate_coffee_3.png new file mode 100644 index 00000000..74b79438 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_coffee_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_corn_3.png b/mods/x_farming/textures/x_farming_crate_corn_3.png new file mode 100644 index 00000000..e8ef3f4b Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_corn_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_cotton2_3.png b/mods/x_farming/textures/x_farming_crate_cotton2_3.png new file mode 100644 index 00000000..be5e698d Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_cotton2_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_cotton_3.png b/mods/x_farming/textures/x_farming_crate_cotton_3.png new file mode 100644 index 00000000..005ccb0d Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_cotton_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_cucumber_3.png b/mods/x_farming/textures/x_farming_crate_cucumber_3.png new file mode 100644 index 00000000..81e0f2cf Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_cucumber_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_eggplant_3.png b/mods/x_farming/textures/x_farming_crate_eggplant_3.png new file mode 100644 index 00000000..4b222fa1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_eggplant_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_empty.png b/mods/x_farming/textures/x_farming_crate_empty.png new file mode 100644 index 00000000..008a6807 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_empty.png differ diff --git a/mods/x_farming/textures/x_farming_crate_fish_3.png b/mods/x_farming/textures/x_farming_crate_fish_3.png new file mode 100644 index 00000000..ea6f86af Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_fish_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_garlic_3.png b/mods/x_farming/textures/x_farming_crate_garlic_3.png new file mode 100644 index 00000000..96fae65d Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_garlic_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_ginger_3.png b/mods/x_farming/textures/x_farming_crate_ginger_3.png new file mode 100644 index 00000000..6913d3cd Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_ginger_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_grapes_3.png b/mods/x_farming/textures/x_farming_crate_grapes_3.png new file mode 100644 index 00000000..d01f00cb Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_grapes_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_hemp_leaf_3.png b/mods/x_farming/textures/x_farming_crate_hemp_leaf_3.png new file mode 100644 index 00000000..2226e95b Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_hemp_leaf_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_kiwi_fruit_3.png b/mods/x_farming/textures/x_farming_crate_kiwi_fruit_3.png new file mode 100644 index 00000000..03dc9ff4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_kiwi_fruit_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_lettuce_3.png b/mods/x_farming/textures/x_farming_crate_lettuce_3.png new file mode 100644 index 00000000..a46997ef Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_lettuce_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_melon_3.png b/mods/x_farming/textures/x_farming_crate_melon_3.png new file mode 100644 index 00000000..4d9f11e6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_melon_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_mint_leaf_3.png b/mods/x_farming/textures/x_farming_crate_mint_leaf_3.png new file mode 100644 index 00000000..ea0f9d8c Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_mint_leaf_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_oat_3.png b/mods/x_farming/textures/x_farming_crate_oat_3.png new file mode 100644 index 00000000..3622dde1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_oat_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_obsidian_wart_3.png b/mods/x_farming/textures/x_farming_crate_obsidian_wart_3.png new file mode 100644 index 00000000..aa635de0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_obsidian_wart_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_onion_3.png b/mods/x_farming/textures/x_farming_crate_onion_3.png new file mode 100644 index 00000000..1781a657 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_onion_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_parsley_3.png b/mods/x_farming/textures/x_farming_crate_parsley_3.png new file mode 100644 index 00000000..d8f48910 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_parsley_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pea_pod_3.png b/mods/x_farming/textures/x_farming_crate_pea_pod_3.png new file mode 100644 index 00000000..060583b2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pea_pod_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pepper_3.png b/mods/x_farming/textures/x_farming_crate_pepper_3.png new file mode 100644 index 00000000..cf84a635 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pepper_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pepper_red_3.png b/mods/x_farming/textures/x_farming_crate_pepper_red_3.png new file mode 100644 index 00000000..ba1647ac Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pepper_red_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pepper_yellow_3.png b/mods/x_farming/textures/x_farming_crate_pepper_yellow_3.png new file mode 100644 index 00000000..6fdab268 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pepper_yellow_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pine_nut_3.png b/mods/x_farming/textures/x_farming_crate_pine_nut_3.png new file mode 100644 index 00000000..02923c95 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pine_nut_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pineapple_3.png b/mods/x_farming/textures/x_farming_crate_pineapple_3.png new file mode 100644 index 00000000..7b66049f Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pineapple_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_potato_3.png b/mods/x_farming/textures/x_farming_crate_potato_3.png new file mode 100644 index 00000000..3611a658 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_potato_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_pumpkin_block_3.png b/mods/x_farming/textures/x_farming_crate_pumpkin_block_3.png new file mode 100644 index 00000000..b7d72d99 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_pumpkin_block_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_rhubarb_3.png b/mods/x_farming/textures/x_farming_crate_rhubarb_3.png new file mode 100644 index 00000000..970807c1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_rhubarb_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_rice_3.png b/mods/x_farming/textures/x_farming_crate_rice_3.png new file mode 100644 index 00000000..d6bd7e3d Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_rice_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_rye_3.png b/mods/x_farming/textures/x_farming_crate_rye_3.png new file mode 100644 index 00000000..eb1fba8c Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_rye_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_soybean_3.png b/mods/x_farming/textures/x_farming_crate_soybean_3.png new file mode 100644 index 00000000..345ec062 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_soybean_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_spinach_3.png b/mods/x_farming/textures/x_farming_crate_spinach_3.png new file mode 100644 index 00000000..90754eac Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_spinach_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_stevia_3.png b/mods/x_farming/textures/x_farming_crate_stevia_3.png new file mode 100644 index 00000000..7a552ae2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_stevia_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_strawberry_3.png b/mods/x_farming/textures/x_farming_crate_strawberry_3.png new file mode 100644 index 00000000..08fe35f4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_strawberry_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_sunflower_3.png b/mods/x_farming/textures/x_farming_crate_sunflower_3.png new file mode 100644 index 00000000..11e490e4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_sunflower_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_tomato_3.png b/mods/x_farming/textures/x_farming_crate_tomato_3.png new file mode 100644 index 00000000..f3722197 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_tomato_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_ui_bg.png b/mods/x_farming/textures/x_farming_crate_ui_bg.png new file mode 100644 index 00000000..3804e18a Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_ui_bg.png differ diff --git a/mods/x_farming/textures/x_farming_crate_ui_bg_hb_slot.png b/mods/x_farming/textures/x_farming_crate_ui_bg_hb_slot.png new file mode 100644 index 00000000..3449a7c8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_ui_bg_hb_slot.png differ diff --git a/mods/x_farming/textures/x_farming_crate_ui_bg_slot.png b/mods/x_farming/textures/x_farming_crate_ui_bg_slot.png new file mode 100644 index 00000000..a3e2f36f Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_ui_bg_slot.png differ diff --git a/mods/x_farming/textures/x_farming_crate_vanilla_3.png b/mods/x_farming/textures/x_farming_crate_vanilla_3.png new file mode 100644 index 00000000..87942939 Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_vanilla_3.png differ diff --git a/mods/x_farming/textures/x_farming_crate_wheat_3.png b/mods/x_farming/textures/x_farming_crate_wheat_3.png new file mode 100644 index 00000000..0448922d Binary files /dev/null and b/mods/x_farming/textures/x_farming_crate_wheat_3.png differ diff --git a/mods/x_farming/textures/x_farming_default_particle.png b/mods/x_farming/textures/x_farming_default_particle.png new file mode 100644 index 00000000..2d624938 Binary files /dev/null and b/mods/x_farming/textures/x_farming_default_particle.png differ diff --git a/mods/x_farming/textures/x_farming_donut.png b/mods/x_farming/textures/x_farming_donut.png new file mode 100644 index 00000000..aef78a92 Binary files /dev/null and b/mods/x_farming/textures/x_farming_donut.png differ diff --git a/mods/x_farming/textures/x_farming_donut_chocolate.png b/mods/x_farming/textures/x_farming_donut_chocolate.png new file mode 100644 index 00000000..ecb37f7f Binary files /dev/null and b/mods/x_farming/textures/x_farming_donut_chocolate.png differ diff --git a/mods/x_farming/textures/x_farming_donut_chocolate_mesh.png b/mods/x_farming/textures/x_farming_donut_chocolate_mesh.png new file mode 100644 index 00000000..a76c8c13 Binary files /dev/null and b/mods/x_farming/textures/x_farming_donut_chocolate_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_donut_mesh.png b/mods/x_farming/textures/x_farming_donut_mesh.png new file mode 100644 index 00000000..a3f48eff Binary files /dev/null and b/mods/x_farming/textures/x_farming_donut_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_drilled_ice.png b/mods/x_farming/textures/x_farming_drilled_ice.png new file mode 100644 index 00000000..50e7d4ab Binary files /dev/null and b/mods/x_farming/textures/x_farming_drilled_ice.png differ diff --git a/mods/x_farming/textures/x_farming_dye_light_blue.png b/mods/x_farming/textures/x_farming_dye_light_blue.png new file mode 100644 index 00000000..7b86a641 Binary files /dev/null and b/mods/x_farming/textures/x_farming_dye_light_blue.png differ diff --git a/mods/x_farming/textures/x_farming_fish_albacore.png b/mods/x_farming/textures/x_farming_fish_albacore.png new file mode 100644 index 00000000..8bc42675 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_albacore.png differ diff --git a/mods/x_farming/textures/x_farming_fish_anchovy.png b/mods/x_farming/textures/x_farming_fish_anchovy.png new file mode 100644 index 00000000..12c3b6eb Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_anchovy.png differ diff --git a/mods/x_farming/textures/x_farming_fish_angelfish.png b/mods/x_farming/textures/x_farming_fish_angelfish.png new file mode 100644 index 00000000..f103e1db Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_angelfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_angler.png b/mods/x_farming/textures/x_farming_fish_angler.png new file mode 100644 index 00000000..64742f60 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_angler.png differ diff --git a/mods/x_farming/textures/x_farming_fish_armored_catfish.png b/mods/x_farming/textures/x_farming_fish_armored_catfish.png new file mode 100644 index 00000000..2013baf9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_armored_catfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_arrow_squid.png b/mods/x_farming/textures/x_farming_fish_arrow_squid.png new file mode 100644 index 00000000..0d89ddbe Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_arrow_squid.png differ diff --git a/mods/x_farming/textures/x_farming_fish_barracuda.png b/mods/x_farming/textures/x_farming_fish_barracuda.png new file mode 100644 index 00000000..e8bbc418 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_barracuda.png differ diff --git a/mods/x_farming/textures/x_farming_fish_black_seashroom.png b/mods/x_farming/textures/x_farming_fish_black_seashroom.png new file mode 100644 index 00000000..4a3658cf Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_black_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_blobfish.png b/mods/x_farming/textures/x_farming_fish_blobfish.png new file mode 100644 index 00000000..4b834c1c Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_blobfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_blue_seashroom.png b/mods/x_farming/textures/x_farming_fish_blue_seashroom.png new file mode 100644 index 00000000..5f11fee9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_blue_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_bream.png b/mods/x_farming/textures/x_farming_fish_bream.png new file mode 100644 index 00000000..a5d46d23 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_bream.png differ diff --git a/mods/x_farming/textures/x_farming_fish_brown_seashroom.png b/mods/x_farming/textures/x_farming_fish_brown_seashroom.png new file mode 100644 index 00000000..d2b5ab44 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_brown_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_burbot.png b/mods/x_farming/textures/x_farming_fish_burbot.png new file mode 100644 index 00000000..38e9db4b Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_burbot.png differ diff --git a/mods/x_farming/textures/x_farming_fish_carp.png b/mods/x_farming/textures/x_farming_fish_carp.png new file mode 100644 index 00000000..5bba0f45 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_carp.png differ diff --git a/mods/x_farming/textures/x_farming_fish_catfish.png b/mods/x_farming/textures/x_farming_fish_catfish.png new file mode 100644 index 00000000..590313b1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_catfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_catla.png b/mods/x_farming/textures/x_farming_fish_catla.png new file mode 100644 index 00000000..77e88d37 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_catla.png differ diff --git a/mods/x_farming/textures/x_farming_fish_chorus_snail.png b/mods/x_farming/textures/x_farming_fish_chorus_snail.png new file mode 100644 index 00000000..a2900494 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_chorus_snail.png differ diff --git a/mods/x_farming/textures/x_farming_fish_chub.png b/mods/x_farming/textures/x_farming_fish_chub.png new file mode 100644 index 00000000..00e3724d Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_chub.png differ diff --git a/mods/x_farming/textures/x_farming_fish_clam.png b/mods/x_farming/textures/x_farming_fish_clam.png new file mode 100644 index 00000000..ae4f45d9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_clam.png differ diff --git a/mods/x_farming/textures/x_farming_fish_cold_ocean_hermit_crab.png b/mods/x_farming/textures/x_farming_fish_cold_ocean_hermit_crab.png new file mode 100644 index 00000000..bdb8f646 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_cold_ocean_hermit_crab.png differ diff --git a/mods/x_farming/textures/x_farming_fish_conger.png b/mods/x_farming/textures/x_farming_fish_conger.png new file mode 100644 index 00000000..5391005f Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_conger.png differ diff --git a/mods/x_farming/textures/x_farming_fish_congo_tiger_fish.png b/mods/x_farming/textures/x_farming_fish_congo_tiger_fish.png new file mode 100644 index 00000000..792c57a4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_congo_tiger_fish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_convict_cichlid.png b/mods/x_farming/textures/x_farming_fish_convict_cichlid.png new file mode 100644 index 00000000..d135c0f6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_convict_cichlid.png differ diff --git a/mods/x_farming/textures/x_farming_fish_crab.png b/mods/x_farming/textures/x_farming_fish_crab.png new file mode 100644 index 00000000..7201ea26 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_crab.png differ diff --git a/mods/x_farming/textures/x_farming_fish_crayfish.png b/mods/x_farming/textures/x_farming_fish_crayfish.png new file mode 100644 index 00000000..3f1b941c Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_crayfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_cyan_seashroom.png b/mods/x_farming/textures/x_farming_fish_cyan_seashroom.png new file mode 100644 index 00000000..fed920dd Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_cyan_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_damselfish.png b/mods/x_farming/textures/x_farming_fish_damselfish.png new file mode 100644 index 00000000..a6d68d30 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_damselfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_danios.png b/mods/x_farming/textures/x_farming_fish_danios.png new file mode 100644 index 00000000..38773cfb Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_danios.png differ diff --git a/mods/x_farming/textures/x_farming_fish_desert_frog.png b/mods/x_farming/textures/x_farming_fish_desert_frog.png new file mode 100644 index 00000000..a137a453 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_desert_frog.png differ diff --git a/mods/x_farming/textures/x_farming_fish_desert_sunfish.png b/mods/x_farming/textures/x_farming_fish_desert_sunfish.png new file mode 100644 index 00000000..6de509f2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_desert_sunfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_diamond_angler.png b/mods/x_farming/textures/x_farming_fish_diamond_angler.png new file mode 100644 index 00000000..5883f498 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_diamond_angler.png differ diff --git a/mods/x_farming/textures/x_farming_fish_dwarf_caiman.png b/mods/x_farming/textures/x_farming_fish_dwarf_caiman.png new file mode 100644 index 00000000..08d97b5b Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_dwarf_caiman.png differ diff --git a/mods/x_farming/textures/x_farming_fish_eel.png b/mods/x_farming/textures/x_farming_fish_eel.png new file mode 100644 index 00000000..41f5cf7e Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_eel.png differ diff --git a/mods/x_farming/textures/x_farming_fish_electric_eel.png b/mods/x_farming/textures/x_farming_fish_electric_eel.png new file mode 100644 index 00000000..ee2809bb Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_electric_eel.png differ diff --git a/mods/x_farming/textures/x_farming_fish_endray.png b/mods/x_farming/textures/x_farming_fish_endray.png new file mode 100644 index 00000000..fbdb0174 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_endray.png differ diff --git a/mods/x_farming/textures/x_farming_fish_father_sun.png b/mods/x_farming/textures/x_farming_fish_father_sun.png new file mode 100644 index 00000000..e8a34856 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_father_sun.png differ diff --git a/mods/x_farming/textures/x_farming_fish_flier.png b/mods/x_farming/textures/x_farming_fish_flier.png new file mode 100644 index 00000000..1d3e467e Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_flier.png differ diff --git a/mods/x_farming/textures/x_farming_fish_floral_faefish.png b/mods/x_farming/textures/x_farming_fish_floral_faefish.png new file mode 100644 index 00000000..738781d0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_floral_faefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_flounder.png b/mods/x_farming/textures/x_farming_fish_flounder.png new file mode 100644 index 00000000..0663a34a Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_flounder.png differ diff --git a/mods/x_farming/textures/x_farming_fish_fourhorn_sculpin.png b/mods/x_farming/textures/x_farming_fish_fourhorn_sculpin.png new file mode 100644 index 00000000..b6d62763 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_fourhorn_sculpin.png differ diff --git a/mods/x_farming/textures/x_farming_fish_frozen_boneminnow.png b/mods/x_farming/textures/x_farming_fish_frozen_boneminnow.png new file mode 100644 index 00000000..4433a6a5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_frozen_boneminnow.png differ diff --git a/mods/x_farming/textures/x_farming_fish_frozen_ocean_hermit_crab.png b/mods/x_farming/textures/x_farming_fish_frozen_ocean_hermit_crab.png new file mode 100644 index 00000000..1e02ccb2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_frozen_ocean_hermit_crab.png differ diff --git a/mods/x_farming/textures/x_farming_fish_gar.png b/mods/x_farming/textures/x_farming_fish_gar.png new file mode 100644 index 00000000..2b6665a4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_gar.png differ diff --git a/mods/x_farming/textures/x_farming_fish_giant_moray.png b/mods/x_farming/textures/x_farming_fish_giant_moray.png new file mode 100644 index 00000000..647afd8c Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_giant_moray.png differ diff --git a/mods/x_farming/textures/x_farming_fish_goldeye.png b/mods/x_farming/textures/x_farming_fish_goldeye.png new file mode 100644 index 00000000..5831a651 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_goldeye.png differ diff --git a/mods/x_farming/textures/x_farming_fish_goldfish.png b/mods/x_farming/textures/x_farming_fish_goldfish.png new file mode 100644 index 00000000..9e54ccd0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_goldfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_grass_pickerel.png b/mods/x_farming/textures/x_farming_fish_grass_pickerel.png new file mode 100644 index 00000000..239d1121 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_grass_pickerel.png differ diff --git a/mods/x_farming/textures/x_farming_fish_gray_seashroom.png b/mods/x_farming/textures/x_farming_fish_gray_seashroom.png new file mode 100644 index 00000000..aca0d26f Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_gray_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_green_seashroom.png b/mods/x_farming/textures/x_farming_fish_green_seashroom.png new file mode 100644 index 00000000..f964db22 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_green_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_guppy.png b/mods/x_farming/textures/x_farming_fish_guppy.png new file mode 100644 index 00000000..c4d5e14e Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_guppy.png differ diff --git a/mods/x_farming/textures/x_farming_fish_hagfish.png b/mods/x_farming/textures/x_farming_fish_hagfish.png new file mode 100644 index 00000000..d432bc10 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_hagfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_halibut.png b/mods/x_farming/textures/x_farming_fish_halibut.png new file mode 100644 index 00000000..86ce8462 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_halibut.png differ diff --git a/mods/x_farming/textures/x_farming_fish_herring.png b/mods/x_farming/textures/x_farming_fish_herring.png new file mode 100644 index 00000000..58a77ef4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_herring.png differ diff --git a/mods/x_farming/textures/x_farming_fish_illager_ghostfish.png b/mods/x_farming/textures/x_farming_fish_illager_ghostfish.png new file mode 100644 index 00000000..ca2a2a2b Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_illager_ghostfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_ironfish.png b/mods/x_farming/textures/x_farming_fish_ironfish.png new file mode 100644 index 00000000..14597aef Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_ironfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_jungle_frog.png b/mods/x_farming/textures/x_farming_fish_jungle_frog.png new file mode 100644 index 00000000..4e0a67cd Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_jungle_frog.png differ diff --git a/mods/x_farming/textures/x_farming_fish_koi.png b/mods/x_farming/textures/x_farming_fish_koi.png new file mode 100644 index 00000000..9954caf4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_koi.png differ diff --git a/mods/x_farming/textures/x_farming_fish_lamprey.png b/mods/x_farming/textures/x_farming_fish_lamprey.png new file mode 100644 index 00000000..90c3527f Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_lamprey.png differ diff --git a/mods/x_farming/textures/x_farming_fish_largemouth_bass.png b/mods/x_farming/textures/x_farming_fish_largemouth_bass.png new file mode 100644 index 00000000..17e88e7d Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_largemouth_bass.png differ diff --git a/mods/x_farming/textures/x_farming_fish_lava_eel.png b/mods/x_farming/textures/x_farming_fish_lava_eel.png new file mode 100644 index 00000000..e8bf4ab0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_lava_eel.png differ diff --git a/mods/x_farming/textures/x_farming_fish_leech.png b/mods/x_farming/textures/x_farming_fish_leech.png new file mode 100644 index 00000000..f08b6869 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_leech.png differ diff --git a/mods/x_farming/textures/x_farming_fish_leerfish.png b/mods/x_farming/textures/x_farming_fish_leerfish.png new file mode 100644 index 00000000..328a2988 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_leerfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_light_gray_seashroom.png b/mods/x_farming/textures/x_farming_fish_light_gray_seashroom.png new file mode 100644 index 00000000..57bc99d4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_light_gray_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_lime_seashroom.png b/mods/x_farming/textures/x_farming_fish_lime_seashroom.png new file mode 100644 index 00000000..26ec6f97 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_lime_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_lingcod.png b/mods/x_farming/textures/x_farming_fish_lingcod.png new file mode 100644 index 00000000..6705d6fa Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_lingcod.png differ diff --git a/mods/x_farming/textures/x_farming_fish_lobster.png b/mods/x_farming/textures/x_farming_fish_lobster.png new file mode 100644 index 00000000..cbdc6f01 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_lobster.png differ diff --git a/mods/x_farming/textures/x_farming_fish_lukewarm_ocean_hermit_crab.png b/mods/x_farming/textures/x_farming_fish_lukewarm_ocean_hermit_crab.png new file mode 100644 index 00000000..5cd6a089 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_lukewarm_ocean_hermit_crab.png differ diff --git a/mods/x_farming/textures/x_farming_fish_magenta_seashroom.png b/mods/x_farming/textures/x_farming_fish_magenta_seashroom.png new file mode 100644 index 00000000..64038b27 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_magenta_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_magma_slimefish.png b/mods/x_farming/textures/x_farming_fish_magma_slimefish.png new file mode 100644 index 00000000..39e19235 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_magma_slimefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_manta_ray.png b/mods/x_farming/textures/x_farming_fish_manta_ray.png new file mode 100644 index 00000000..4f1cd055 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_manta_ray.png differ diff --git a/mods/x_farming/textures/x_farming_fish_minnow.png b/mods/x_farming/textures/x_farming_fish_minnow.png new file mode 100644 index 00000000..bf19b079 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_minnow.png differ diff --git a/mods/x_farming/textures/x_farming_fish_mother_moon.png b/mods/x_farming/textures/x_farming_fish_mother_moon.png new file mode 100644 index 00000000..9eeb5a63 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_mother_moon.png differ diff --git a/mods/x_farming/textures/x_farming_fish_mud_flounder.png b/mods/x_farming/textures/x_farming_fish_mud_flounder.png new file mode 100644 index 00000000..7b225f86 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_mud_flounder.png differ diff --git a/mods/x_farming/textures/x_farming_fish_neon_tetra.png b/mods/x_farming/textures/x_farming_fish_neon_tetra.png new file mode 100644 index 00000000..62cd8103 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_neon_tetra.png differ diff --git a/mods/x_farming/textures/x_farming_fish_obster.png b/mods/x_farming/textures/x_farming_fish_obster.png new file mode 100644 index 00000000..2b408f7a Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_obster.png differ diff --git a/mods/x_farming/textures/x_farming_fish_ocean_hermit_crab.png b/mods/x_farming/textures/x_farming_fish_ocean_hermit_crab.png new file mode 100644 index 00000000..d0c0910b Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_ocean_hermit_crab.png differ diff --git a/mods/x_farming/textures/x_farming_fish_octopus.png b/mods/x_farming/textures/x_farming_fish_octopus.png new file mode 100644 index 00000000..6f689a4f Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_octopus.png differ diff --git a/mods/x_farming/textures/x_farming_fish_orange_seashroom.png b/mods/x_farming/textures/x_farming_fish_orange_seashroom.png new file mode 100644 index 00000000..a5dc41b1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_orange_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_oscar.png b/mods/x_farming/textures/x_farming_fish_oscar.png new file mode 100644 index 00000000..0624e5bd Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_oscar.png differ diff --git a/mods/x_farming/textures/x_farming_fish_paddlefish.png b/mods/x_farming/textures/x_farming_fish_paddlefish.png new file mode 100644 index 00000000..49a30351 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_paddlefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_pearl_isopod.png b/mods/x_farming/textures/x_farming_fish_pearl_isopod.png new file mode 100644 index 00000000..6124c72d Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_pearl_isopod.png differ diff --git a/mods/x_farming/textures/x_farming_fish_pearlwog.png b/mods/x_farming/textures/x_farming_fish_pearlwog.png new file mode 100644 index 00000000..d8adb6df Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_pearlwog.png differ diff --git a/mods/x_farming/textures/x_farming_fish_perch.png b/mods/x_farming/textures/x_farming_fish_perch.png new file mode 100644 index 00000000..de05a576 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_perch.png differ diff --git a/mods/x_farming/textures/x_farming_fish_piglish.png b/mods/x_farming/textures/x_farming_fish_piglish.png new file mode 100644 index 00000000..ed84ec49 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_piglish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_pike.png b/mods/x_farming/textures/x_farming_fish_pike.png new file mode 100644 index 00000000..4045a786 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_pike.png differ diff --git a/mods/x_farming/textures/x_farming_fish_pink_seashroom.png b/mods/x_farming/textures/x_farming_fish_pink_seashroom.png new file mode 100644 index 00000000..dc004c8a Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_pink_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_piranha.png b/mods/x_farming/textures/x_farming_fish_piranha.png new file mode 100644 index 00000000..f07a4bc0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_piranha.png differ diff --git a/mods/x_farming/textures/x_farming_fish_prismfish.png b/mods/x_farming/textures/x_farming_fish_prismfish.png new file mode 100644 index 00000000..a7e2a4e6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_prismfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_pumpkinseed.png b/mods/x_farming/textures/x_farming_fish_pumpkinseed.png new file mode 100644 index 00000000..08487647 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_pumpkinseed.png differ diff --git a/mods/x_farming/textures/x_farming_fish_purple_seashroom.png b/mods/x_farming/textures/x_farming_fish_purple_seashroom.png new file mode 100644 index 00000000..96f3ea51 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_purple_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_rainbow_trout.png b/mods/x_farming/textures/x_farming_fish_rainbow_trout.png new file mode 100644 index 00000000..ed82238e Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_rainbow_trout.png differ diff --git a/mods/x_farming/textures/x_farming_fish_rainbowfish.png b/mods/x_farming/textures/x_farming_fish_rainbowfish.png new file mode 100644 index 00000000..2865c9c7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_rainbowfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_red_mullet.png b/mods/x_farming/textures/x_farming_fish_red_mullet.png new file mode 100644 index 00000000..265b2ba7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_red_mullet.png differ diff --git a/mods/x_farming/textures/x_farming_fish_red_seashroom.png b/mods/x_farming/textures/x_farming_fish_red_seashroom.png new file mode 100644 index 00000000..d07bfd9c Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_red_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_red_snapper.png b/mods/x_farming/textures/x_farming_fish_red_snapper.png new file mode 100644 index 00000000..8fe78909 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_red_snapper.png differ diff --git a/mods/x_farming/textures/x_farming_fish_redbreast_sunfish.png b/mods/x_farming/textures/x_farming_fish_redbreast_sunfish.png new file mode 100644 index 00000000..60b8f2b4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_redbreast_sunfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_rockfish.png b/mods/x_farming/textures/x_farming_fish_rockfish.png new file mode 100644 index 00000000..93202eba Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_rockfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_rohu.png b/mods/x_farming/textures/x_farming_fish_rohu.png new file mode 100644 index 00000000..42035242 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_rohu.png differ diff --git a/mods/x_farming/textures/x_farming_fish_rosefish.png b/mods/x_farming/textures/x_farming_fish_rosefish.png new file mode 100644 index 00000000..14b1f9e1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_rosefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_rusty_skullfin.png b/mods/x_farming/textures/x_farming_fish_rusty_skullfin.png new file mode 100644 index 00000000..eec441ea Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_rusty_skullfin.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sablefish.png b/mods/x_farming/textures/x_farming_fish_sablefish.png new file mode 100644 index 00000000..79821491 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sablefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sardine.png b/mods/x_farming/textures/x_farming_fish_sardine.png new file mode 100644 index 00000000..4344cee4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sardine.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sawfish.png b/mods/x_farming/textures/x_farming_fish_sawfish.png new file mode 100644 index 00000000..252bd710 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sawfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sea_cucumber.png b/mods/x_farming/textures/x_farming_fish_sea_cucumber.png new file mode 100644 index 00000000..59e80a71 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sea_cucumber.png differ diff --git a/mods/x_farming/textures/x_farming_fish_shrimp.png b/mods/x_farming/textures/x_farming_fish_shrimp.png new file mode 100644 index 00000000..900ad605 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_shrimp.png differ diff --git a/mods/x_farming/textures/x_farming_fish_skate.png b/mods/x_farming/textures/x_farming_fish_skate.png new file mode 100644 index 00000000..ee325492 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_skate.png differ diff --git a/mods/x_farming/textures/x_farming_fish_skullfin.png b/mods/x_farming/textures/x_farming_fish_skullfin.png new file mode 100644 index 00000000..8425cb61 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_skullfin.png differ diff --git a/mods/x_farming/textures/x_farming_fish_skykoi.png b/mods/x_farming/textures/x_farming_fish_skykoi.png new file mode 100644 index 00000000..9a43ee7f Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_skykoi.png differ diff --git a/mods/x_farming/textures/x_farming_fish_slimefish.png b/mods/x_farming/textures/x_farming_fish_slimefish.png new file mode 100644 index 00000000..38d99531 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_slimefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_smallmouth_bass.png b/mods/x_farming/textures/x_farming_fish_smallmouth_bass.png new file mode 100644 index 00000000..ddbc1c23 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_smallmouth_bass.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sterlet.png b/mods/x_farming/textures/x_farming_fish_sterlet.png new file mode 100644 index 00000000..65c19e8c Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sterlet.png differ diff --git a/mods/x_farming/textures/x_farming_fish_stew.png b/mods/x_farming/textures/x_farming_fish_stew.png new file mode 100644 index 00000000..18d630f2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_stew.png differ diff --git a/mods/x_farming/textures/x_farming_fish_stew_mesh.png b/mods/x_farming/textures/x_farming_fish_stew_mesh.png new file mode 100644 index 00000000..55ffce90 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_stew_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_fish_stingray.png b/mods/x_farming/textures/x_farming_fish_stingray.png new file mode 100644 index 00000000..ad0fed3b Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_stingray.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sturgeon.png b/mods/x_farming/textures/x_farming_fish_sturgeon.png new file mode 100644 index 00000000..7d632c47 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sturgeon.png differ diff --git a/mods/x_farming/textures/x_farming_fish_sunfish.png b/mods/x_farming/textures/x_farming_fish_sunfish.png new file mode 100644 index 00000000..6306e422 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_sunfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_swamp_darter.png b/mods/x_farming/textures/x_farming_fish_swamp_darter.png new file mode 100644 index 00000000..13d944e3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_swamp_darter.png differ diff --git a/mods/x_farming/textures/x_farming_fish_swamp_frog.png b/mods/x_farming/textures/x_farming_fish_swamp_frog.png new file mode 100644 index 00000000..8c7ae81d Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_swamp_frog.png differ diff --git a/mods/x_farming/textures/x_farming_fish_swordfish.png b/mods/x_farming/textures/x_farming_fish_swordfish.png new file mode 100644 index 00000000..3a1ca73a Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_swordfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_tancho_koi.png b/mods/x_farming/textures/x_farming_fish_tancho_koi.png new file mode 100644 index 00000000..01d17248 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_tancho_koi.png differ diff --git a/mods/x_farming/textures/x_farming_fish_tench.png b/mods/x_farming/textures/x_farming_fish_tench.png new file mode 100644 index 00000000..6d599d51 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_tench.png differ diff --git a/mods/x_farming/textures/x_farming_fish_tilapia.png b/mods/x_farming/textures/x_farming_fish_tilapia.png new file mode 100644 index 00000000..2e215962 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_tilapia.png differ diff --git a/mods/x_farming/textures/x_farming_fish_totemfish.png b/mods/x_farming/textures/x_farming_fish_totemfish.png new file mode 100644 index 00000000..dd159136 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_totemfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_true_goldfish.png b/mods/x_farming/textures/x_farming_fish_true_goldfish.png new file mode 100644 index 00000000..b324f7ba Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_true_goldfish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_vampire_squid.png b/mods/x_farming/textures/x_farming_fish_vampire_squid.png new file mode 100644 index 00000000..ce3fc366 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_vampire_squid.png differ diff --git a/mods/x_farming/textures/x_farming_fish_walleye.png b/mods/x_farming/textures/x_farming_fish_walleye.png new file mode 100644 index 00000000..ce5df803 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_walleye.png differ diff --git a/mods/x_farming/textures/x_farming_fish_warm_ocean_hermit_crab.png b/mods/x_farming/textures/x_farming_fish_warm_ocean_hermit_crab.png new file mode 100644 index 00000000..dda80a76 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_warm_ocean_hermit_crab.png differ diff --git a/mods/x_farming/textures/x_farming_fish_white_bullhead.png b/mods/x_farming/textures/x_farming_fish_white_bullhead.png new file mode 100644 index 00000000..0047252e Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_white_bullhead.png differ diff --git a/mods/x_farming/textures/x_farming_fish_white_seashroom.png b/mods/x_farming/textures/x_farming_fish_white_seashroom.png new file mode 100644 index 00000000..8524cc62 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_white_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_fish_whitefish.png b/mods/x_farming/textures/x_farming_fish_whitefish.png new file mode 100644 index 00000000..4e17afac Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_whitefish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_wolffish.png b/mods/x_farming/textures/x_farming_fish_wolffish.png new file mode 100644 index 00000000..3d62c817 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_wolffish.png differ diff --git a/mods/x_farming/textures/x_farming_fish_woodskip.png b/mods/x_farming/textures/x_farming_fish_woodskip.png new file mode 100644 index 00000000..c86b29d0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_woodskip.png differ diff --git a/mods/x_farming/textures/x_farming_fish_yellow_seashroom.png b/mods/x_farming/textures/x_farming_fish_yellow_seashroom.png new file mode 100644 index 00000000..0325e105 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fish_yellow_seashroom.png differ diff --git a/mods/x_farming/textures/x_farming_flour.png b/mods/x_farming/textures/x_farming_flour.png new file mode 100644 index 00000000..3f453cff Binary files /dev/null and b/mods/x_farming/textures/x_farming_flour.png differ diff --git a/mods/x_farming/textures/x_farming_fly.png b/mods/x_farming/textures/x_farming_fly.png new file mode 100644 index 00000000..4e37add1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fly.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_item.png b/mods/x_farming/textures/x_farming_french_potatoes_item.png new file mode 100644 index 00000000..39ebb242 Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_item.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_mesh.png b/mods/x_farming/textures/x_farming_french_potatoes_mesh.png new file mode 100644 index 00000000..a3d6828f Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_mesh_1.png b/mods/x_farming/textures/x_farming_french_potatoes_mesh_1.png new file mode 100644 index 00000000..6de2adda Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_mesh_1.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_mesh_2.png b/mods/x_farming/textures/x_farming_french_potatoes_mesh_2.png new file mode 100644 index 00000000..083ea809 Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_mesh_2.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_mesh_3.png b/mods/x_farming/textures/x_farming_french_potatoes_mesh_3.png new file mode 100644 index 00000000..abd52716 Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_mesh_3.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_mesh_4.png b/mods/x_farming/textures/x_farming_french_potatoes_mesh_4.png new file mode 100644 index 00000000..2f66c174 Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_mesh_4.png differ diff --git a/mods/x_farming/textures/x_farming_french_potatoes_mesh_5.png b/mods/x_farming/textures/x_farming_french_potatoes_mesh_5.png new file mode 100644 index 00000000..b2f9b742 Binary files /dev/null and b/mods/x_farming/textures/x_farming_french_potatoes_mesh_5.png differ diff --git a/mods/x_farming/textures/x_farming_fries.png b/mods/x_farming/textures/x_farming_fries.png new file mode 100644 index 00000000..93a73df2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fries.png differ diff --git a/mods/x_farming/textures/x_farming_fries_mesh.png b/mods/x_farming/textures/x_farming_fries_mesh.png new file mode 100644 index 00000000..1e888444 Binary files /dev/null and b/mods/x_farming/textures/x_farming_fries_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_golden_melon.png b/mods/x_farming/textures/x_farming_golden_melon.png new file mode 100644 index 00000000..7f9997ce Binary files /dev/null and b/mods/x_farming/textures/x_farming_golden_melon.png differ diff --git a/mods/x_farming/textures/x_farming_gui_hb_bg.png b/mods/x_farming/textures/x_farming_gui_hb_bg.png new file mode 100644 index 00000000..99248e17 Binary files /dev/null and b/mods/x_farming/textures/x_farming_gui_hb_bg.png differ diff --git a/mods/x_farming/textures/x_farming_honey_block_item.png b/mods/x_farming/textures/x_farming_honey_block_item.png new file mode 100644 index 00000000..c951d2eb Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_block_item.png differ diff --git a/mods/x_farming/textures/x_farming_honey_block_mesh.png b/mods/x_farming/textures/x_farming_honey_block_mesh.png new file mode 100644 index 00000000..021f8f41 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_block_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_honey_kiwi_pie_item.png b/mods/x_farming/textures/x_farming_honey_kiwi_pie_item.png new file mode 100644 index 00000000..9631accd Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_kiwi_pie_item.png differ diff --git a/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_1.png b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_1.png new file mode 100644 index 00000000..8fddaf12 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_1.png differ diff --git a/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_2.png b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_2.png new file mode 100644 index 00000000..e6396b52 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_2.png differ diff --git a/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_3.png b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_3.png new file mode 100644 index 00000000..ccdd3e37 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_3.png differ diff --git a/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_4.png b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_4.png new file mode 100644 index 00000000..d58ab551 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honey_kiwi_pie_mesh_4.png differ diff --git a/mods/x_farming/textures/x_farming_honeycomb.png b/mods/x_farming/textures/x_farming_honeycomb.png new file mode 100644 index 00000000..aab75a47 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honeycomb.png differ diff --git a/mods/x_farming/textures/x_farming_honeycomb_block.png b/mods/x_farming/textures/x_farming_honeycomb_block.png new file mode 100644 index 00000000..869aab1f Binary files /dev/null and b/mods/x_farming/textures/x_farming_honeycomb_block.png differ diff --git a/mods/x_farming/textures/x_farming_honeycomb_saw.png b/mods/x_farming/textures/x_farming_honeycomb_saw.png new file mode 100644 index 00000000..fd324617 Binary files /dev/null and b/mods/x_farming/textures/x_farming_honeycomb_saw.png differ diff --git a/mods/x_farming/textures/x_farming_ice.png b/mods/x_farming/textures/x_farming_ice.png new file mode 100644 index 00000000..53979078 Binary files /dev/null and b/mods/x_farming/textures/x_farming_ice.png differ diff --git a/mods/x_farming/textures/x_farming_ice_auger.png b/mods/x_farming/textures/x_farming_ice_auger.png new file mode 100644 index 00000000..2e601c30 Binary files /dev/null and b/mods/x_farming/textures/x_farming_ice_auger.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_0.png b/mods/x_farming/textures/x_farming_icefishing_back_0.png new file mode 100644 index 00000000..a3be0ff5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_0.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_1.png b/mods/x_farming/textures/x_farming_icefishing_back_1.png new file mode 100644 index 00000000..f918d9c1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_1.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_2.png b/mods/x_farming/textures/x_farming_icefishing_back_2.png new file mode 100644 index 00000000..97538bab Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_2.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_3.png b/mods/x_farming/textures/x_farming_icefishing_back_3.png new file mode 100644 index 00000000..04a32761 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_3.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_4.png b/mods/x_farming/textures/x_farming_icefishing_back_4.png new file mode 100644 index 00000000..bdf6ba0c Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_4.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_5.png b/mods/x_farming/textures/x_farming_icefishing_back_5.png new file mode 100644 index 00000000..4ad495ef Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_5.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_6.png b/mods/x_farming/textures/x_farming_icefishing_back_6.png new file mode 100644 index 00000000..e47aa2f9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_6.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_7.png b/mods/x_farming/textures/x_farming_icefishing_back_7.png new file mode 100644 index 00000000..b6fcdf54 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_7.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_8.png b/mods/x_farming/textures/x_farming_icefishing_back_8.png new file mode 100644 index 00000000..794a1c14 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_8.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_back_9.png b/mods/x_farming/textures/x_farming_icefishing_back_9.png new file mode 100644 index 00000000..b1d8c8c2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_back_9.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_bottom.png b/mods/x_farming/textures/x_farming_icefishing_bottom.png new file mode 100644 index 00000000..22ee05ff Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_0.png b/mods/x_farming/textures/x_farming_icefishing_front_0.png new file mode 100644 index 00000000..72d2b005 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_0.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_1.png b/mods/x_farming/textures/x_farming_icefishing_front_1.png new file mode 100644 index 00000000..7aad1593 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_1.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_2.png b/mods/x_farming/textures/x_farming_icefishing_front_2.png new file mode 100644 index 00000000..e5b1aa45 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_2.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_3.png b/mods/x_farming/textures/x_farming_icefishing_front_3.png new file mode 100644 index 00000000..6b093ee4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_3.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_4.png b/mods/x_farming/textures/x_farming_icefishing_front_4.png new file mode 100644 index 00000000..ada164be Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_4.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_5.png b/mods/x_farming/textures/x_farming_icefishing_front_5.png new file mode 100644 index 00000000..fdd7fb99 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_5.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_6.png b/mods/x_farming/textures/x_farming_icefishing_front_6.png new file mode 100644 index 00000000..04c82902 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_6.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_7.png b/mods/x_farming/textures/x_farming_icefishing_front_7.png new file mode 100644 index 00000000..7edf810d Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_7.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_8.png b/mods/x_farming/textures/x_farming_icefishing_front_8.png new file mode 100644 index 00000000..0dfc5cfc Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_8.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_front_9.png b/mods/x_farming/textures/x_farming_icefishing_front_9.png new file mode 100644 index 00000000..7c2adc81 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_front_9.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_inv.png b/mods/x_farming/textures/x_farming_icefishing_inv.png new file mode 100644 index 00000000..d2ff7bf8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_inv.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_left.png b/mods/x_farming/textures/x_farming_icefishing_left.png new file mode 100644 index 00000000..db9aa12f Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_left.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_right.png b/mods/x_farming/textures/x_farming_icefishing_right.png new file mode 100644 index 00000000..db9aa12f Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_right.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_top_animated.png b/mods/x_farming/textures/x_farming_icefishing_top_animated.png new file mode 100644 index 00000000..36528fd1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_top_animated.png differ diff --git a/mods/x_farming/textures/x_farming_icefishing_top_animated_9.png b/mods/x_farming/textures/x_farming_icefishing_top_animated_9.png new file mode 100644 index 00000000..e60f9ab0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_icefishing_top_animated_9.png differ diff --git a/mods/x_farming/textures/x_farming_invisible_node_overlay.png b/mods/x_farming/textures/x_farming_invisible_node_overlay.png new file mode 100644 index 00000000..7fc88061 Binary files /dev/null and b/mods/x_farming/textures/x_farming_invisible_node_overlay.png differ diff --git a/mods/x_farming/textures/x_farming_jar_empty.png b/mods/x_farming/textures/x_farming_jar_empty.png new file mode 100644 index 00000000..0d1126b1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_jar_empty.png differ diff --git a/mods/x_farming/textures/x_farming_jar_with_bee.png b/mods/x_farming/textures/x_farming_jar_with_bee.png new file mode 100644 index 00000000..76468da8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_jar_with_bee.png differ diff --git a/mods/x_farming/textures/x_farming_jungle_tree.png b/mods/x_farming/textures/x_farming_jungle_tree.png new file mode 100644 index 00000000..43552fae Binary files /dev/null and b/mods/x_farming/textures/x_farming_jungle_tree.png differ diff --git a/mods/x_farming/textures/x_farming_jungle_tree_top.png b/mods/x_farming/textures/x_farming_jungle_tree_top.png new file mode 100644 index 00000000..b32a2721 Binary files /dev/null and b/mods/x_farming/textures/x_farming_jungle_tree_top.png differ diff --git a/mods/x_farming/textures/x_farming_jungle_wood.png b/mods/x_farming/textures/x_farming_jungle_wood.png new file mode 100644 index 00000000..5d183324 Binary files /dev/null and b/mods/x_farming/textures/x_farming_jungle_wood.png differ diff --git a/mods/x_farming/textures/x_farming_jungleleaves.png b/mods/x_farming/textures/x_farming_jungleleaves.png new file mode 100644 index 00000000..4c3cf979 Binary files /dev/null and b/mods/x_farming/textures/x_farming_jungleleaves.png differ diff --git a/mods/x_farming/textures/x_farming_junglesapling.png b/mods/x_farming/textures/x_farming_junglesapling.png new file mode 100644 index 00000000..cb2f5ba9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_junglesapling.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi.png b/mods/x_farming/textures/x_farming_kiwi.png new file mode 100644 index 00000000..ff6cc18b Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_fruit.png b/mods/x_farming/textures/x_farming_kiwi_fruit.png new file mode 100644 index 00000000..e8af00e3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_fruit.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_fruit_mesh.png b/mods/x_farming/textures/x_farming_kiwi_fruit_mesh.png new file mode 100644 index 00000000..341360b2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_fruit_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_leaves.png b/mods/x_farming/textures/x_farming_kiwi_leaves.png new file mode 100644 index 00000000..1aa75986 Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_leaves.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_sapling.png b/mods/x_farming/textures/x_farming_kiwi_sapling.png new file mode 100644 index 00000000..e781313e Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_sapling.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_tree.png b/mods/x_farming/textures/x_farming_kiwi_tree.png new file mode 100644 index 00000000..0e60d4c7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_tree.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_tree_top.png b/mods/x_farming/textures/x_farming_kiwi_tree_top.png new file mode 100644 index 00000000..09cdbbfd Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_tree_top.png differ diff --git a/mods/x_farming/textures/x_farming_kiwi_wood.png b/mods/x_farming/textures/x_farming_kiwi_wood.png new file mode 100644 index 00000000..472e4ee2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_kiwi_wood.png differ diff --git a/mods/x_farming/textures/x_farming_large_cactus_with_fruit_seedling.png b/mods/x_farming/textures/x_farming_large_cactus_with_fruit_seedling.png new file mode 100644 index 00000000..9abcb043 Binary files /dev/null and b/mods/x_farming/textures/x_farming_large_cactus_with_fruit_seedling.png differ diff --git a/mods/x_farming/textures/x_farming_melon.png b/mods/x_farming/textures/x_farming_melon.png new file mode 100644 index 00000000..317b68f0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon.png differ diff --git a/mods/x_farming/textures/x_farming_melon_1.png b/mods/x_farming/textures/x_farming_melon_1.png new file mode 100644 index 00000000..532314e0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_1.png differ diff --git a/mods/x_farming/textures/x_farming_melon_2.png b/mods/x_farming/textures/x_farming_melon_2.png new file mode 100644 index 00000000..e6836ddf Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_2.png differ diff --git a/mods/x_farming/textures/x_farming_melon_3.png b/mods/x_farming/textures/x_farming_melon_3.png new file mode 100644 index 00000000..4b4975d3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_3.png differ diff --git a/mods/x_farming/textures/x_farming_melon_4.png b/mods/x_farming/textures/x_farming_melon_4.png new file mode 100644 index 00000000..076a34cd Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_4.png differ diff --git a/mods/x_farming/textures/x_farming_melon_5.png b/mods/x_farming/textures/x_farming_melon_5.png new file mode 100644 index 00000000..4ea1f9cf Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_5.png differ diff --git a/mods/x_farming/textures/x_farming_melon_6.png b/mods/x_farming/textures/x_farming_melon_6.png new file mode 100644 index 00000000..e0587d03 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_6.png differ diff --git a/mods/x_farming/textures/x_farming_melon_7.png b/mods/x_farming/textures/x_farming_melon_7.png new file mode 100644 index 00000000..97559d4a Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_7.png differ diff --git a/mods/x_farming/textures/x_farming_melon_8.png b/mods/x_farming/textures/x_farming_melon_8.png new file mode 100644 index 00000000..6e65109c Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_8.png differ diff --git a/mods/x_farming/textures/x_farming_melon_fruit_bottom.png b/mods/x_farming/textures/x_farming_melon_fruit_bottom.png new file mode 100644 index 00000000..4972c59e Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_fruit_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_melon_fruit_side.png b/mods/x_farming/textures/x_farming_melon_fruit_side.png new file mode 100644 index 00000000..61080c26 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_fruit_side.png differ diff --git a/mods/x_farming/textures/x_farming_melon_fruit_top.png b/mods/x_farming/textures/x_farming_melon_fruit_top.png new file mode 100644 index 00000000..f6937733 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_fruit_top.png differ diff --git a/mods/x_farming/textures/x_farming_melon_seed.png b/mods/x_farming/textures/x_farming_melon_seed.png new file mode 100644 index 00000000..6925becc Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_seed.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_item.png b/mods/x_farming/textures/x_farming_melon_slush_item.png new file mode 100644 index 00000000..0c799f56 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_item.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_mesh.png b/mods/x_farming/textures/x_farming_melon_slush_mesh.png new file mode 100644 index 00000000..3bacb738 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_mesh_1.png b/mods/x_farming/textures/x_farming_melon_slush_mesh_1.png new file mode 100644 index 00000000..f5a1e249 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_mesh_1.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_mesh_2.png b/mods/x_farming/textures/x_farming_melon_slush_mesh_2.png new file mode 100644 index 00000000..a1afba1f Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_mesh_2.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_mesh_3.png b/mods/x_farming/textures/x_farming_melon_slush_mesh_3.png new file mode 100644 index 00000000..ce4fd1e3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_mesh_3.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_mesh_4.png b/mods/x_farming/textures/x_farming_melon_slush_mesh_4.png new file mode 100644 index 00000000..cb23d304 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_mesh_4.png differ diff --git a/mods/x_farming/textures/x_farming_melon_slush_mesh_5.png b/mods/x_farming/textures/x_farming_melon_slush_mesh_5.png new file mode 100644 index 00000000..a8ff3484 Binary files /dev/null and b/mods/x_farming/textures/x_farming_melon_slush_mesh_5.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_soil.png b/mods/x_farming/textures/x_farming_obsidian_soil.png new file mode 100644 index 00000000..abd4979d Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_soil.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_soil_wet.png b/mods/x_farming/textures/x_farming_obsidian_soil_wet.png new file mode 100644 index 00000000..14e8d249 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_soil_wet.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart.png b/mods/x_farming/textures/x_farming_obsidian_wart.png new file mode 100644 index 00000000..c98d2132 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_1.png b/mods/x_farming/textures/x_farming_obsidian_wart_1.png new file mode 100644 index 00000000..d1809161 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_1.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_2.png b/mods/x_farming/textures/x_farming_obsidian_wart_2.png new file mode 100644 index 00000000..16e4b116 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_2.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_3.png b/mods/x_farming/textures/x_farming_obsidian_wart_3.png new file mode 100644 index 00000000..16e4b116 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_3.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_4.png b/mods/x_farming/textures/x_farming_obsidian_wart_4.png new file mode 100644 index 00000000..8389ca0d Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_4.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_5.png b/mods/x_farming/textures/x_farming_obsidian_wart_5.png new file mode 100644 index 00000000..8389ca0d Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_5.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_6.png b/mods/x_farming/textures/x_farming_obsidian_wart_6.png new file mode 100644 index 00000000..c85156e1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_6.png differ diff --git a/mods/x_farming/textures/x_farming_obsidian_wart_seed.png b/mods/x_farming/textures/x_farming_obsidian_wart_seed.png new file mode 100644 index 00000000..e8719b55 Binary files /dev/null and b/mods/x_farming/textures/x_farming_obsidian_wart_seed.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_black.png b/mods/x_farming/textures/x_farming_pillow_black.png new file mode 100644 index 00000000..64273af7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_black.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_blue.png b/mods/x_farming/textures/x_farming_pillow_blue.png new file mode 100644 index 00000000..77eccf32 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_blue.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_brown.png b/mods/x_farming/textures/x_farming_pillow_brown.png new file mode 100644 index 00000000..fb1d4e55 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_brown.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_cyan.png b/mods/x_farming/textures/x_farming_pillow_cyan.png new file mode 100644 index 00000000..0c90b8d7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_cyan.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_dark_green.png b/mods/x_farming/textures/x_farming_pillow_dark_green.png new file mode 100644 index 00000000..62ebd8af Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_dark_green.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_dark_grey.png b/mods/x_farming/textures/x_farming_pillow_dark_grey.png new file mode 100644 index 00000000..519b32a9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_dark_grey.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_green.png b/mods/x_farming/textures/x_farming_pillow_green.png new file mode 100644 index 00000000..ac557007 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_green.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_grey.png b/mods/x_farming/textures/x_farming_pillow_grey.png new file mode 100644 index 00000000..cdd8fa25 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_grey.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_light_blue.png b/mods/x_farming/textures/x_farming_pillow_light_blue.png new file mode 100644 index 00000000..a2d5337f Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_light_blue.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_magenta.png b/mods/x_farming/textures/x_farming_pillow_magenta.png new file mode 100644 index 00000000..4166191c Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_magenta.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_orange.png b/mods/x_farming/textures/x_farming_pillow_orange.png new file mode 100644 index 00000000..cda0791c Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_orange.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_pink.png b/mods/x_farming/textures/x_farming_pillow_pink.png new file mode 100644 index 00000000..fa79944c Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_pink.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_red.png b/mods/x_farming/textures/x_farming_pillow_red.png new file mode 100644 index 00000000..6976cc5b Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_red.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_violet.png b/mods/x_farming/textures/x_farming_pillow_violet.png new file mode 100644 index 00000000..99340581 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_violet.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_white.png b/mods/x_farming/textures/x_farming_pillow_white.png new file mode 100644 index 00000000..efa18479 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_white.png differ diff --git a/mods/x_farming/textures/x_farming_pillow_yellow.png b/mods/x_farming/textures/x_farming_pillow_yellow.png new file mode 100644 index 00000000..b0b5c18b Binary files /dev/null and b/mods/x_farming/textures/x_farming_pillow_yellow.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut.png b/mods/x_farming/textures/x_farming_pine_nut.png new file mode 100644 index 00000000..4a72acb3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_item.png b/mods/x_farming/textures/x_farming_pine_nut_item.png new file mode 100644 index 00000000..7dd217d7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_item.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_leaves.png b/mods/x_farming/textures/x_farming_pine_nut_leaves.png new file mode 100644 index 00000000..885ca5c9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_leaves.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_roasted.png b/mods/x_farming/textures/x_farming_pine_nut_roasted.png new file mode 100644 index 00000000..24c1d29f Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_roasted.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_sapling.png b/mods/x_farming/textures/x_farming_pine_nut_sapling.png new file mode 100644 index 00000000..db90cb9f Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_sapling.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_tree.png b/mods/x_farming/textures/x_farming_pine_nut_tree.png new file mode 100644 index 00000000..3b054d07 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_tree.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_tree_top.png b/mods/x_farming/textures/x_farming_pine_nut_tree_top.png new file mode 100644 index 00000000..8140c7e8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_tree_top.png differ diff --git a/mods/x_farming/textures/x_farming_pine_nut_wood.png b/mods/x_farming/textures/x_farming_pine_nut_wood.png new file mode 100644 index 00000000..d3e49683 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pine_nut_wood.png differ diff --git a/mods/x_farming/textures/x_farming_potato.png b/mods/x_farming/textures/x_farming_potato.png new file mode 100644 index 00000000..70625a99 Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato.png differ diff --git a/mods/x_farming/textures/x_farming_potato_1.png b/mods/x_farming/textures/x_farming_potato_1.png new file mode 100644 index 00000000..c45e10eb Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_1.png differ diff --git a/mods/x_farming/textures/x_farming_potato_2.png b/mods/x_farming/textures/x_farming_potato_2.png new file mode 100644 index 00000000..c45e10eb Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_2.png differ diff --git a/mods/x_farming/textures/x_farming_potato_3.png b/mods/x_farming/textures/x_farming_potato_3.png new file mode 100644 index 00000000..c45e10eb Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_3.png differ diff --git a/mods/x_farming/textures/x_farming_potato_4.png b/mods/x_farming/textures/x_farming_potato_4.png new file mode 100644 index 00000000..7be1b24a Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_4.png differ diff --git a/mods/x_farming/textures/x_farming_potato_5.png b/mods/x_farming/textures/x_farming_potato_5.png new file mode 100644 index 00000000..7be1b24a Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_5.png differ diff --git a/mods/x_farming/textures/x_farming_potato_6.png b/mods/x_farming/textures/x_farming_potato_6.png new file mode 100644 index 00000000..7be1b24a Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_6.png differ diff --git a/mods/x_farming/textures/x_farming_potato_7.png b/mods/x_farming/textures/x_farming_potato_7.png new file mode 100644 index 00000000..41cea6c9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_7.png differ diff --git a/mods/x_farming/textures/x_farming_potato_8.png b/mods/x_farming/textures/x_farming_potato_8.png new file mode 100644 index 00000000..a82b959d Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_8.png differ diff --git a/mods/x_farming/textures/x_farming_potato_baked.png b/mods/x_farming/textures/x_farming_potato_baked.png new file mode 100644 index 00000000..dc99ed43 Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_baked.png differ diff --git a/mods/x_farming/textures/x_farming_potato_poisonous.png b/mods/x_farming/textures/x_farming_potato_poisonous.png new file mode 100644 index 00000000..ff299235 Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_poisonous.png differ diff --git a/mods/x_farming/textures/x_farming_potato_seed.png b/mods/x_farming/textures/x_farming_potato_seed.png new file mode 100644 index 00000000..f40e290c Binary files /dev/null and b/mods/x_farming/textures/x_farming_potato_seed.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_1.png b/mods/x_farming/textures/x_farming_pumpkin_1.png new file mode 100644 index 00000000..6d3d5698 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_1.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_2.png b/mods/x_farming/textures/x_farming_pumpkin_2.png new file mode 100644 index 00000000..9c6573dd Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_2.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_3.png b/mods/x_farming/textures/x_farming_pumpkin_3.png new file mode 100644 index 00000000..7ec7771f Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_3.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_4.png b/mods/x_farming/textures/x_farming_pumpkin_4.png new file mode 100644 index 00000000..fc91bab1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_4.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_5.png b/mods/x_farming/textures/x_farming_pumpkin_5.png new file mode 100644 index 00000000..c1f50974 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_5.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_6.png b/mods/x_farming/textures/x_farming_pumpkin_6.png new file mode 100644 index 00000000..699cf467 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_6.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_7.png b/mods/x_farming/textures/x_farming_pumpkin_7.png new file mode 100644 index 00000000..f2fe8a25 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_7.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_8.png b/mods/x_farming/textures/x_farming_pumpkin_8.png new file mode 100644 index 00000000..e344193d Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_8.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_fruit_bottom.png b/mods/x_farming/textures/x_farming_pumpkin_fruit_bottom.png new file mode 100644 index 00000000..907bee98 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_fruit_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_fruit_side.png b/mods/x_farming/textures/x_farming_pumpkin_fruit_side.png new file mode 100644 index 00000000..03fcf48d Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_fruit_side.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_fruit_side_off.png b/mods/x_farming/textures/x_farming_pumpkin_fruit_side_off.png new file mode 100644 index 00000000..559f29b6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_fruit_side_off.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_fruit_side_on.png b/mods/x_farming/textures/x_farming_pumpkin_fruit_side_on.png new file mode 100644 index 00000000..ccaf60cd Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_fruit_side_on.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_fruit_top.png b/mods/x_farming/textures/x_farming_pumpkin_fruit_top.png new file mode 100644 index 00000000..70c8fab8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_fruit_top.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_pie.png b/mods/x_farming/textures/x_farming_pumpkin_pie.png new file mode 100644 index 00000000..b473b0dc Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_pie.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_pie_mesh.png b/mods/x_farming/textures/x_farming_pumpkin_pie_mesh.png new file mode 100644 index 00000000..67a5509a Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_pie_mesh.png differ diff --git a/mods/x_farming/textures/x_farming_pumpkin_seed.png b/mods/x_farming/textures/x_farming_pumpkin_seed.png new file mode 100644 index 00000000..5adb3086 Binary files /dev/null and b/mods/x_farming/textures/x_farming_pumpkin_seed.png differ diff --git a/mods/x_farming/textures/x_farming_rice.png b/mods/x_farming/textures/x_farming_rice.png new file mode 100644 index 00000000..3b883f9c Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice.png differ diff --git a/mods/x_farming/textures/x_farming_rice_1.png b/mods/x_farming/textures/x_farming_rice_1.png new file mode 100644 index 00000000..05c7d620 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_1.png differ diff --git a/mods/x_farming/textures/x_farming_rice_2.png b/mods/x_farming/textures/x_farming_rice_2.png new file mode 100644 index 00000000..59c8eecd Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_2.png differ diff --git a/mods/x_farming/textures/x_farming_rice_3.png b/mods/x_farming/textures/x_farming_rice_3.png new file mode 100644 index 00000000..622eb2c1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_3.png differ diff --git a/mods/x_farming/textures/x_farming_rice_4.png b/mods/x_farming/textures/x_farming_rice_4.png new file mode 100644 index 00000000..028df40d Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_4.png differ diff --git a/mods/x_farming/textures/x_farming_rice_5.png b/mods/x_farming/textures/x_farming_rice_5.png new file mode 100644 index 00000000..3129ed9f Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_5.png differ diff --git a/mods/x_farming/textures/x_farming_rice_6.png b/mods/x_farming/textures/x_farming_rice_6.png new file mode 100644 index 00000000..867af89d Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_6.png differ diff --git a/mods/x_farming/textures/x_farming_rice_7.png b/mods/x_farming/textures/x_farming_rice_7.png new file mode 100644 index 00000000..44d7c084 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_7.png differ diff --git a/mods/x_farming/textures/x_farming_rice_8.png b/mods/x_farming/textures/x_farming_rice_8.png new file mode 100644 index 00000000..83ed193e Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_8.png differ diff --git a/mods/x_farming/textures/x_farming_rice_grains.png b/mods/x_farming/textures/x_farming_rice_grains.png new file mode 100644 index 00000000..5c16ac54 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_grains.png differ diff --git a/mods/x_farming/textures/x_farming_rice_seed.png b/mods/x_farming/textures/x_farming_rice_seed.png new file mode 100644 index 00000000..05c7d620 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_seed.png differ diff --git a/mods/x_farming/textures/x_farming_rice_seed_inv.png b/mods/x_farming/textures/x_farming_rice_seed_inv.png new file mode 100644 index 00000000..441dacc8 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_seed_inv.png differ diff --git a/mods/x_farming/textures/x_farming_rice_stack_bottom.png b/mods/x_farming/textures/x_farming_rice_stack_bottom.png new file mode 100644 index 00000000..eb9e9ed5 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_stack_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_rice_stack_side.png b/mods/x_farming/textures/x_farming_rice_stack_side.png new file mode 100644 index 00000000..2b58d585 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_stack_side.png differ diff --git a/mods/x_farming/textures/x_farming_rice_stack_top.png b/mods/x_farming/textures/x_farming_rice_stack_top.png new file mode 100644 index 00000000..079af0c3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rice_stack_top.png differ diff --git a/mods/x_farming/textures/x_farming_rope.png b/mods/x_farming/textures/x_farming_rope.png new file mode 100644 index 00000000..ca3c9001 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rope.png differ diff --git a/mods/x_farming/textures/x_farming_rope_fence.png b/mods/x_farming/textures/x_farming_rope_fence.png new file mode 100644 index 00000000..1faba872 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rope_fence.png differ diff --git a/mods/x_farming/textures/x_farming_rope_fence_item.png b/mods/x_farming/textures/x_farming_rope_fence_item.png new file mode 100644 index 00000000..733faeb0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_rope_fence_item.png differ diff --git a/mods/x_farming/textures/x_farming_rope_item.png b/mods/x_farming/textures/x_farming_rope_item.png new file mode 100644 index 00000000..3377f1ab Binary files /dev/null and b/mods/x_farming/textures/x_farming_rope_item.png differ diff --git a/mods/x_farming/textures/x_farming_safety_net.png b/mods/x_farming/textures/x_farming_safety_net.png new file mode 100644 index 00000000..2e7cc14a Binary files /dev/null and b/mods/x_farming/textures/x_farming_safety_net.png differ diff --git a/mods/x_farming/textures/x_farming_safety_net_side.png b/mods/x_farming/textures/x_farming_safety_net_side.png new file mode 100644 index 00000000..a237a1b0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_safety_net_side.png differ diff --git a/mods/x_farming/textures/x_farming_salt.png b/mods/x_farming/textures/x_farming_salt.png new file mode 100644 index 00000000..92ed0b54 Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt.png differ diff --git a/mods/x_farming/textures/x_farming_salt_1_bottom.png b/mods/x_farming/textures/x_farming_salt_1_bottom.png new file mode 100644 index 00000000..df1cc5f3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_1_bottom.png differ diff --git a/mods/x_farming/textures/x_farming_salt_1_side.png b/mods/x_farming/textures/x_farming_salt_1_side.png new file mode 100644 index 00000000..ea19b0ba Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_1_side.png differ diff --git a/mods/x_farming/textures/x_farming_salt_1_top.png b/mods/x_farming/textures/x_farming_salt_1_top.png new file mode 100644 index 00000000..fcee5b5c Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_1_top.png differ diff --git a/mods/x_farming/textures/x_farming_salt_2_side.png b/mods/x_farming/textures/x_farming_salt_2_side.png new file mode 100644 index 00000000..f3a361fb Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_2_side.png differ diff --git a/mods/x_farming/textures/x_farming_salt_2_top.png b/mods/x_farming/textures/x_farming_salt_2_top.png new file mode 100644 index 00000000..29e88d22 Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_2_top.png differ diff --git a/mods/x_farming/textures/x_farming_salt_3_side.png b/mods/x_farming/textures/x_farming_salt_3_side.png new file mode 100644 index 00000000..9dd3afdd Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_3_side.png differ diff --git a/mods/x_farming/textures/x_farming_salt_3_top.png b/mods/x_farming/textures/x_farming_salt_3_top.png new file mode 100644 index 00000000..1a21c6ba Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_3_top.png differ diff --git a/mods/x_farming/textures/x_farming_salt_4_side.png b/mods/x_farming/textures/x_farming_salt_4_side.png new file mode 100644 index 00000000..6fb6dfe9 Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_4_side.png differ diff --git a/mods/x_farming/textures/x_farming_salt_4_top.png b/mods/x_farming/textures/x_farming_salt_4_top.png new file mode 100644 index 00000000..d568731f Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_4_top.png differ diff --git a/mods/x_farming/textures/x_farming_salt_water.png b/mods/x_farming/textures/x_farming_salt_water.png new file mode 100644 index 00000000..87a0e3d1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_salt_water.png differ diff --git a/mods/x_farming/textures/x_farming_scarecrow_1.png b/mods/x_farming/textures/x_farming_scarecrow_1.png new file mode 100644 index 00000000..9ed2cf15 Binary files /dev/null and b/mods/x_farming/textures/x_farming_scarecrow_1.png differ diff --git a/mods/x_farming/textures/x_farming_scarecrow_1_item.png b/mods/x_farming/textures/x_farming_scarecrow_1_item.png new file mode 100644 index 00000000..0c8e0f31 Binary files /dev/null and b/mods/x_farming/textures/x_farming_scarecrow_1_item.png differ diff --git a/mods/x_farming/textures/x_farming_scarecrow_2.png b/mods/x_farming/textures/x_farming_scarecrow_2.png new file mode 100644 index 00000000..c589fee2 Binary files /dev/null and b/mods/x_farming/textures/x_farming_scarecrow_2.png differ diff --git a/mods/x_farming/textures/x_farming_silt_loam_brick.png b/mods/x_farming/textures/x_farming_silt_loam_brick.png new file mode 100644 index 00000000..8129db5f Binary files /dev/null and b/mods/x_farming/textures/x_farming_silt_loam_brick.png differ diff --git a/mods/x_farming/textures/x_farming_silt_loam_brick_block.png b/mods/x_farming/textures/x_farming_silt_loam_brick_block.png new file mode 100644 index 00000000..25c090dd Binary files /dev/null and b/mods/x_farming/textures/x_farming_silt_loam_brick_block.png differ diff --git a/mods/x_farming/textures/x_farming_silt_loam_soil.png b/mods/x_farming/textures/x_farming_silt_loam_soil.png new file mode 100644 index 00000000..86ff9585 Binary files /dev/null and b/mods/x_farming/textures/x_farming_silt_loam_soil.png differ diff --git a/mods/x_farming/textures/x_farming_slice_chocolate_pie.png b/mods/x_farming/textures/x_farming_slice_chocolate_pie.png new file mode 100644 index 00000000..02e6a939 Binary files /dev/null and b/mods/x_farming/textures/x_farming_slice_chocolate_pie.png differ diff --git a/mods/x_farming/textures/x_farming_slice_honey_kiwi_pie.png b/mods/x_farming/textures/x_farming_slice_honey_kiwi_pie.png new file mode 100644 index 00000000..d070efb6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_slice_honey_kiwi_pie.png differ diff --git a/mods/x_farming/textures/x_farming_slice_strawberry_pie.png b/mods/x_farming/textures/x_farming_slice_strawberry_pie.png new file mode 100644 index 00000000..7fa4e44d Binary files /dev/null and b/mods/x_farming/textures/x_farming_slice_strawberry_pie.png differ diff --git a/mods/x_farming/textures/x_farming_soil_wet_side.png b/mods/x_farming/textures/x_farming_soil_wet_side.png new file mode 100644 index 00000000..f0b1bd45 Binary files /dev/null and b/mods/x_farming/textures/x_farming_soil_wet_side.png differ diff --git a/mods/x_farming/textures/x_farming_soybean.png b/mods/x_farming/textures/x_farming_soybean.png new file mode 100644 index 00000000..f528168f Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_1.png b/mods/x_farming/textures/x_farming_soybean_1.png new file mode 100644 index 00000000..cf8871bd Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_1.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_2.png b/mods/x_farming/textures/x_farming_soybean_2.png new file mode 100644 index 00000000..1b0b6c19 Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_2.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_3.png b/mods/x_farming/textures/x_farming_soybean_3.png new file mode 100644 index 00000000..54ca323e Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_3.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_4.png b/mods/x_farming/textures/x_farming_soybean_4.png new file mode 100644 index 00000000..33bf32a6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_4.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_5.png b/mods/x_farming/textures/x_farming_soybean_5.png new file mode 100644 index 00000000..63fba992 Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_5.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_6.png b/mods/x_farming/textures/x_farming_soybean_6.png new file mode 100644 index 00000000..15eb2ee4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_6.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_7.png b/mods/x_farming/textures/x_farming_soybean_7.png new file mode 100644 index 00000000..63ec3ec7 Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_7.png differ diff --git a/mods/x_farming/textures/x_farming_soybean_seed.png b/mods/x_farming/textures/x_farming_soybean_seed.png new file mode 100644 index 00000000..dd66cfeb Binary files /dev/null and b/mods/x_farming/textures/x_farming_soybean_seed.png differ diff --git a/mods/x_farming/textures/x_farming_stevia.png b/mods/x_farming/textures/x_farming_stevia.png new file mode 100644 index 00000000..b3f94fe6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_1.png b/mods/x_farming/textures/x_farming_stevia_1.png new file mode 100644 index 00000000..09f82e95 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_1.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_2.png b/mods/x_farming/textures/x_farming_stevia_2.png new file mode 100644 index 00000000..e4f786d6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_2.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_3.png b/mods/x_farming/textures/x_farming_stevia_3.png new file mode 100644 index 00000000..dd044c9f Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_3.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_4.png b/mods/x_farming/textures/x_farming_stevia_4.png new file mode 100644 index 00000000..d7d29ace Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_4.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_5.png b/mods/x_farming/textures/x_farming_stevia_5.png new file mode 100644 index 00000000..611bcc45 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_5.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_6.png b/mods/x_farming/textures/x_farming_stevia_6.png new file mode 100644 index 00000000..8bc264f6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_6.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_7.png b/mods/x_farming/textures/x_farming_stevia_7.png new file mode 100644 index 00000000..4a8b351c Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_7.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_8.png b/mods/x_farming/textures/x_farming_stevia_8.png new file mode 100644 index 00000000..9cf88a11 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_8.png differ diff --git a/mods/x_farming/textures/x_farming_stevia_seed.png b/mods/x_farming/textures/x_farming_stevia_seed.png new file mode 100644 index 00000000..234daf80 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stevia_seed.png differ diff --git a/mods/x_farming/textures/x_farming_stove_front.png b/mods/x_farming/textures/x_farming_stove_front.png new file mode 100644 index 00000000..661d5f41 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stove_front.png differ diff --git a/mods/x_farming/textures/x_farming_stove_front_animated.png b/mods/x_farming/textures/x_farming_stove_front_animated.png new file mode 100644 index 00000000..577d649d Binary files /dev/null and b/mods/x_farming/textures/x_farming_stove_front_animated.png differ diff --git a/mods/x_farming/textures/x_farming_stove_item_smoke_particle.png b/mods/x_farming/textures/x_farming_stove_item_smoke_particle.png new file mode 100644 index 00000000..1f206d00 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stove_item_smoke_particle.png differ diff --git a/mods/x_farming/textures/x_farming_stove_side.png b/mods/x_farming/textures/x_farming_stove_side.png new file mode 100644 index 00000000..25c090dd Binary files /dev/null and b/mods/x_farming/textures/x_farming_stove_side.png differ diff --git a/mods/x_farming/textures/x_farming_stove_top.png b/mods/x_farming/textures/x_farming_stove_top.png new file mode 100644 index 00000000..42a86194 Binary files /dev/null and b/mods/x_farming/textures/x_farming_stove_top.png differ diff --git a/mods/x_farming/textures/x_farming_stove_top_animated.png b/mods/x_farming/textures/x_farming_stove_top_animated.png new file mode 100644 index 00000000..f58ef7ba Binary files /dev/null and b/mods/x_farming/textures/x_farming_stove_top_animated.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry.png b/mods/x_farming/textures/x_farming_strawberry.png new file mode 100644 index 00000000..6d4daf81 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_1.png b/mods/x_farming/textures/x_farming_strawberry_1.png new file mode 100644 index 00000000..1ac51fbb Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_1.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_2.png b/mods/x_farming/textures/x_farming_strawberry_2.png new file mode 100644 index 00000000..d38c21fe Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_2.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_3.png b/mods/x_farming/textures/x_farming_strawberry_3.png new file mode 100644 index 00000000..bd69865a Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_3.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_4.png b/mods/x_farming/textures/x_farming_strawberry_4.png new file mode 100644 index 00000000..7f62d226 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_4.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_pie_item.png b/mods/x_farming/textures/x_farming_strawberry_pie_item.png new file mode 100644 index 00000000..2a010778 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_pie_item.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_pie_mesh_1.png b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_1.png new file mode 100644 index 00000000..d644bb44 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_1.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_pie_mesh_2.png b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_2.png new file mode 100644 index 00000000..0e4422a4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_2.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_pie_mesh_3.png b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_3.png new file mode 100644 index 00000000..5ff6c191 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_3.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_pie_mesh_4.png b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_4.png new file mode 100644 index 00000000..4d03e5e3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_pie_mesh_4.png differ diff --git a/mods/x_farming/textures/x_farming_strawberry_seed.png b/mods/x_farming/textures/x_farming_strawberry_seed.png new file mode 100644 index 00000000..c6bdd209 Binary files /dev/null and b/mods/x_farming/textures/x_farming_strawberry_seed.png differ diff --git a/mods/x_farming/textures/x_farming_string.png b/mods/x_farming/textures/x_farming_string.png new file mode 100644 index 00000000..47dc59f1 Binary files /dev/null and b/mods/x_farming/textures/x_farming_string.png differ diff --git a/mods/x_farming/textures/x_farming_sugar.png b/mods/x_farming/textures/x_farming_sugar.png new file mode 100644 index 00000000..1eb83aff Binary files /dev/null and b/mods/x_farming/textures/x_farming_sugar.png differ diff --git a/mods/x_farming/textures/x_farming_sushi_maki.png b/mods/x_farming/textures/x_farming_sushi_maki.png new file mode 100644 index 00000000..63c921a0 Binary files /dev/null and b/mods/x_farming/textures/x_farming_sushi_maki.png differ diff --git a/mods/x_farming/textures/x_farming_sushi_nigiri.png b/mods/x_farming/textures/x_farming_sushi_nigiri.png new file mode 100644 index 00000000..3374b3f4 Binary files /dev/null and b/mods/x_farming/textures/x_farming_sushi_nigiri.png differ diff --git a/mods/x_farming/textures/x_farming_tool_steelhoe.png b/mods/x_farming/textures/x_farming_tool_steelhoe.png new file mode 100644 index 00000000..bcee23fe Binary files /dev/null and b/mods/x_farming/textures/x_farming_tool_steelhoe.png differ diff --git a/mods/x_farming/textures/x_farming_tool_stonehoe.png b/mods/x_farming/textures/x_farming_tool_stonehoe.png new file mode 100644 index 00000000..affe4504 Binary files /dev/null and b/mods/x_farming/textures/x_farming_tool_stonehoe.png differ diff --git a/mods/x_farming/textures/x_farming_tool_woodhoe.png b/mods/x_farming/textures/x_farming_tool_woodhoe.png new file mode 100644 index 00000000..2f859789 Binary files /dev/null and b/mods/x_farming/textures/x_farming_tool_woodhoe.png differ diff --git a/mods/x_farming/textures/x_farming_unknown_item.png b/mods/x_farming/textures/x_farming_unknown_item.png new file mode 100644 index 00000000..c8cf616a Binary files /dev/null and b/mods/x_farming/textures/x_farming_unknown_item.png differ diff --git a/mods/x_farming/textures/x_farming_vessels_glass_bottle.png b/mods/x_farming/textures/x_farming_vessels_glass_bottle.png new file mode 100644 index 00000000..8abe02ae Binary files /dev/null and b/mods/x_farming/textures/x_farming_vessels_glass_bottle.png differ diff --git a/mods/x_farming/textures/x_farming_wart_block.png b/mods/x_farming/textures/x_farming_wart_block.png new file mode 100644 index 00000000..15ec16de Binary files /dev/null and b/mods/x_farming/textures/x_farming_wart_block.png differ diff --git a/mods/x_farming/textures/x_farming_wart_brick.png b/mods/x_farming/textures/x_farming_wart_brick.png new file mode 100644 index 00000000..c57ce0d3 Binary files /dev/null and b/mods/x_farming/textures/x_farming_wart_brick.png differ diff --git a/mods/x_farming/textures/x_farming_wart_brick_block.png b/mods/x_farming/textures/x_farming_wart_brick_block.png new file mode 100644 index 00000000..43210882 Binary files /dev/null and b/mods/x_farming/textures/x_farming_wart_brick_block.png differ diff --git a/mods/x_farming/textures/x_farming_wart_red_brick_block.png b/mods/x_farming/textures/x_farming_wart_red_brick_block.png new file mode 100644 index 00000000..bbd93c6f Binary files /dev/null and b/mods/x_farming/textures/x_farming_wart_red_brick_block.png differ diff --git a/mods/x_farming/textures/x_farming_wartrack.png b/mods/x_farming/textures/x_farming_wartrack.png new file mode 100644 index 00000000..47b889de Binary files /dev/null and b/mods/x_farming/textures/x_farming_wartrack.png differ diff --git a/mods/x_farming/textures/x_farming_x_bonemeal_bonemeal.png b/mods/x_farming/textures/x_farming_x_bonemeal_bonemeal.png new file mode 100644 index 00000000..234c14f6 Binary files /dev/null and b/mods/x_farming/textures/x_farming_x_bonemeal_bonemeal.png differ diff --git a/mods/x_farming/textures/x_farming_x_bonemeal_particles.png b/mods/x_farming/textures/x_farming_x_bonemeal_particles.png new file mode 100644 index 00000000..cb7c0d69 Binary files /dev/null and b/mods/x_farming/textures/x_farming_x_bonemeal_particles.png differ diff --git a/mods/x_farming/tools.lua b/mods/x_farming/tools.lua new file mode 100644 index 00000000..469d35bf --- /dev/null +++ b/mods/x_farming/tools.lua @@ -0,0 +1,39 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_tool('x_farming:honeycomb_saw', { + description = S('Honeycomb Saw'), + inventory_image = 'x_farming_honeycomb_saw.png', + wield_image = 'x_farming_honeycomb_saw.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = { times = { [2] = 3.00,[3] = 0.70 }, uses = 0, maxlevel = 1 }, + snappy = { times = { [3] = 0.40 }, uses = 0, maxlevel = 1 }, + oddly_breakable_by_hand = { times = { [1] = 3.50,[2] = 2.00,[3] = 0.70 }, uses = 0 } + }, + damage_groups = { fleshy = 1 }, + }, + sound = { breaks = 'x_farming_tool_breaks' }, + -- MCL + _mcl_toollike_wield = true, +}) diff --git a/mods/x_farming/vessels.lua b/mods/x_farming/vessels.lua new file mode 100644 index 00000000..b21cf91c --- /dev/null +++ b/mods/x_farming/vessels.lua @@ -0,0 +1,60 @@ +--[[ + X Farming. Extends Minetest farming mod with new plants, crops and ice fishing. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to juraj.vajda@gmail.com +--]] + +-- Authors of source code +-- ---------------------- +-- Originally by Vanessa Ezekowitz (LGPLv2.1+) +-- Modified by Perttu Ahola (LGPLv2.1+) +-- Various Minetest developers and contributors (LGPLv2.1+) + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node('x_farming:glass_bottle', { + description = S('Empty Glass Bottle'), + drawtype = 'plantlike', + tiles = { 'x_farming_vessels_glass_bottle.png' }, + inventory_image = 'x_farming_vessels_glass_bottle.png', + wield_image = 'x_farming_vessels_glass_bottle.png', + paramtype = 'light', + is_ground_content = false, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 0.3, 0.25 } + }, + groups = { vessel = 1, dig_immediate = 3, attached_node = 1 }, + sounds = x_farming.node_sound_thin_glass_defaults(), +}) + +minetest.register_craft({ + output = 'x_farming:glass_bottle 10', + recipe = { + { 'default:glass', '', 'default:glass' }, + { 'default:glass', '', 'default:glass' }, + { '', 'default:glass', '' } + } +}) + +minetest.register_craft({ + output = 'x_farming:glass_bottle 10', + recipe = { + { 'group:glass', '', 'group:glass' }, + { 'group:glass', '', 'group:glass' }, + { '', 'group:glass', '' } + } +}) diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 00000000..e1f7bd9d Binary files /dev/null and b/screenshot.png differ diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 00000000..6606ed44 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,165 @@ +# This file contains settings for Asuna + +[Content Pack: Nutrition] + +# Grants players movement speed, sprinting, healing over time, and poison +# resistance when they have eaten enough food. The effects of not eating food +# cannot harm players and cannot cause starvation unless specifically enabled +# by the starvation setting. +asuna.content.nutrition.enabled (Enable Nutrition?) bool true + +# The amount of exhaustion points that a player must accumulate before their +# food nutrition is reduced by one point. Higher values cause players to +# remain satiated for longer while lower values cause players to become +# hungry more quickly. +# +# Requires: asuna.content.nutrition.enabled +asuna.content.nutrition.exhaustion_level (Exhaustion Level) float 160 + +# Enabling this setting will cause players to lose health over time when +# their food meter is empty. Disabling this setting will prevent players +# from suffering health loss due to hunger. +# +# Requires: asuna.content.nutrition.enabled +asuna.content.nutrition.starvation (Starvation) bool false + +[Content Pack: Wayfarer] + +# Provides a rich variety of special resources in your world such as loot +# chests and teleportation gates. +asuna.content.wayfarer.enabled (Enable Wayfarer?) bool true + +# Provides an array of awards that can be unlocked by fulfilling certain +# conditions. Awards exist for various types of crafting, collecting, and +# exploring. +# +# Requires: asuna.content.wayfarer.enabled +asuna.content.wayfarer.awards (Awards) bool true + +# Enable loot chests which causes chests and other loot containers to +# generate randomly throughout the world. These chests contain many useful +# items and materials. +# +# Requires: asuna.content.wayfarer.enabled +asuna.content.wayfarer.loot_chests (Loot Chests) bool true + +# Enable Worldgate, a randomly generated teleportation network that spawns +# linked teleportation beacons throughout your world. +# +# Requires: asuna.content.wayfarer.enabled +asuna.content.wayfarer.worldgate (Worldgates) bool true + +[Content Pack: Menagerie] + +# Provides a variety of mobs and monsters in your world. +asuna.content.menagerie.enabled (Enable Menagerie?) bool true + +# Spawns animals such as birds, sheep, cows, and other familiar animals in +# the wild. Animals can be tamed, and many animals will drop useful resources +# such as meat and bones. +# +# Requires: asuna.content.menagerie.enabled +asuna.content.menagerie.animals (Animals) bool true + +# Spawns living slimes throughout the world. Some slimes are docile while +# others are aggressive. Their slime can be used to create slime blocks. +# +# Requires: asuna.content.menagerie.enabled +asuna.content.menagerie.slimes (Slimes) bool true + +[Content Pack: Research] + +# Enables an earned creative mode for your world whereby items can be +# permanently destroyed in order to earn infinite duplication of those items. +asuna.content.research.enabled (Enable Research?) bool true + +[General Settings] + +# The amount of decorative particles to show. These particles are only a +# visual feature; this setting not affect gameplay. More particles may cause +# performance issues. +asuna.settings.particles.amount (Particles amount) enum less maximum,more,less,none + +# Installed mods that Asuna already bundles will override Asuna's version of +# those mods, and because this can cause issues, Asuna will generate warnings +# when this happens. These warnings can be disabled if you're absolutely sure +# that you want to override Asuna's mods. +asuna.settings.mod_override_warnings.enabled (Enable mod override warnings) bool true + +# In creative mode players are able to dig all kind of blocks nearly +# instantly, and have access to unlimited resources. +# Some of the functionality is only available if this setting is present +# at startup. +creative_mode (Creative mode) bool false + +# Flammable nodes will be ignited by nearby igniters. Spreading fire may +# cause severe destruction. +# Spreading fire nodes will disappear when fire is disabled, but +# 'permanent_flame' nodes are unaffected. +enable_fire (Fire) bool true + +# Enable flame sound. +flame_sound (Flame sound) bool true + +# Enable lavacooling. +enable_lavacooling (Lavacooling) bool true + +# If enabled, steel tools, torches and cobblestone will be given to new +# players. +give_initial_stuff (Give initial items) bool false + +# If enabled, players respawn at the bed they last lay on instead of normal +# spawn. +# This setting is only read at startup. +enable_bed_respawn (Respawn at bed) bool true + +# If enabled, the night can be skipped if more than half of the players are +# in beds. +enable_bed_night_skip (Skip night when sleeping) bool true + +# If enabled, fences and walls cannot be jumped over. +enable_fence_tall (Tall fences and walls) bool false + +# When TNT explodes, it destroys nearby nodes and damages nearby players. +# This setting is disabled by default on servers. +enable_tnt (TNT) bool true + +# The radius in which nodes will be destroyed by a TNT explosion. +tnt_radius (TNT radius) int 3 0 + +# Sets the behaviour of the inventory items when a player dies. +# bones: Store items in a bone node but drop items if inside protected area. +# drop: Drop items on the ground. +# keep: Player keeps items. +bones_mode (Bones mode) enum bones bones,drop,keep + +# The time in seconds after which the bones of a dead player can be looted +# by everyone. +# Setting this to 0 will disable sharing of bones completely. +share_bones_time (Bones share time) int 1200 0 + +# How much earlier the bones of a dead player can be looted by +# everyone if the player dies in a protected area they don't own. +# 0 to disable. By default it is "share_bones_time" divide by four. +share_bones_time_early (Earlier bones share time) int 300 0 + +# Inform player of condition and location of new bones. +bones_position_message (Inform player about bones) bool false + +# Replaces old stairs with new ones. Only required for older worlds. +enable_stairs_replace_abm (Replace old stairs) bool false + +# If enabled, use the engine's spawn search which does not check for a +# suitable starting biome. +engine_spawn (Use engine spawn search) bool false + +# Whether river water source nodes create flowing sounds. +# Helps rivers create more sound, especially on level sections. +river_source_sounds (River source node sounds) bool false + +# Enable cloud and shadow intensity variation by the 'weather' mod. +# Non-functional in V6 or Singlenode mapgens. +enable_weather (Enable weather) bool true + +# If enabled, non-player actions are logged +log_non_player_actions (Log non-player action) bool false